Skip to content

Migrate to file based interface #193

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 73 commits into from
Feb 23, 2025
Merged

Migrate to file based interface #193

merged 73 commits into from
Feb 23, 2025

Conversation

jan-janssen
Copy link
Member

@jan-janssen jan-janssen commented Feb 23, 2025

Summary by CodeRabbit

  • New Features

    • Enhanced simulation controls with improved methods for minimization, molecular dynamics, and advanced simulation techniques.
    • Added robust output processing, structure management, and unit conversion to streamline simulation workflows.
  • CI/CD & Environment

    • Introduced a new CI/CD pipeline featuring formatting checks, tests, and coverage analysis.
    • Consolidated environment setups and updated dependency management.
  • Tests

    • Added targeted tests for the new simulation controls while deprecating legacy elastic constant tests.
  • Documentation

    • Simplified the primary documentation and removed outdated citation metadata.

jan-janssen and others added 30 commits August 21, 2019 11:34
Black: The Uncompromising Code Formatter
* Move hydrostatic test into function

* Add setup to control tests

* Break apart for readability

* Better variable names
* Add an interface to the lammps move fix.

* Add tests

* Sam-improved docstring

* Sam-safe group ids

* Update tests

* Abstract out control to allow either move linear or set force

* Add Tobias' warning

* Rename method

* Extend warning.

* Add coordinate warning to forces fix too

* Force int arange

* Fix URL

* Docstring warnigns to warnings warnings

* Update pyiron/lammps/control.py

Co-authored-by: Jan Janssen <[email protected]>

Co-authored-by: Jan Janssen <[email protected]>
Fix notebooks for pyiron_atomistic
Fix notebooks for pyiron_atomistic
Update copyright to 2021
Update copyright to 2021
reordering of input items in Lammps
* Bump numpy from 1.19.5 to 1.20.0

Bumps [numpy](https://github.com/numpy/numpy) from 1.19.5 to 1.20.0.
- [Release notes](https://github.com/numpy/numpy/releases)
- [Changelog](https://github.com/numpy/numpy/blob/master/doc/HOWTO_RELEASE.rst.txt)
- [Commits](numpy/numpy@v1.19.5...v1.20.0)

Signed-off-by: dependabot-preview[bot] <[email protected]>

* Update environment.yml

* Numpy debug (#61)

* Try fix numpy bug

* If parent does not exist return None

* next try

* revert

* extened

* Update type comparisons

* numpy float type updates

* Debug warnings

* more debugging

* Increase number of allowed warnings

* Update environment.yml

* Update setup.py

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
Co-authored-by: Jan Janssen <[email protected]>
automatic triclinic when potentially triclinic
automatic triclinic when potentially triclinic
Document energy_pot_per_atom
Only force skew when tensions are applied
Lammps style full - fix numpy warnings
Adjust n_print to be at most max_iter in calc_minimize
Modify where number of bond types is chosen from
Copy link

coderabbitai bot commented Feb 23, 2025

Warning

Rate limit exceeded

@jan-janssen has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 16 minutes and 39 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

📥 Commits

Reviewing files that changed from the base of the PR and between 3f99fa7 and 5961127.

📒 Files selected for processing (4)
  • .ci_support/check.py (1 hunks)
  • .github/workflows/pipeline.yml (1 hunks)
  • README.md (1 hunks)
  • pyproject.toml (2 hunks)

Walkthrough

The changes introduce new files and update existing configurations and workflows across the repository. A new Python script in the CI support handles dependency modifications in the pyproject.toml. Several Conda environment files and GitHub workflows have been removed or replaced, with a new pipeline workflow now managing CI/CD. Dependencies in the pyproject.toml and pre-commit configuration have been updated. The pyiron_lammps package sees major refactoring: the public interface is removed from __init__.py while new modules—control, output, structure, and units—are added for LAMMPS simulation control, output parsing, structure handling, and unit conversions. Multiple test files have also been added or removed.

Changes

File(s) Change Summary
.ci_support/check.py, .ci_support/environment.yml, .ci_support/environment-old.yml Added a dependency-modifying script and new environment config; updated existing environment file dependencies.
.ci_support/environment-mpich.yml, .ci_support/environment-openmpi.yml, .coveralls.yml Removed legacy Conda environment configurations and Coveralls integration file.
.github/workflows/pipeline.yml Added a new CI/CD pipeline workflow with multiple jobs (formatting, testing, coverage, pip check, autobot).
.github/workflows/black.yml, .github/workflows/format_black.yml, .github/workflows/pypicheck.yml, .github/workflows/unittests-mpich.yml, .github/workflows/unittests-old.yml, .github/workflows/unittests-openmpi.yml Removed several GitHub Actions workflows that have been replaced by the pipeline workflow.
.pre-commit-config.yaml Updated repository version for ruff-pre-commit from v0.6.2 to v0.9.6.
CITATION.cff, README.md Removed citation metadata and reduced README content to a minimal description.
pyiron_lammps/__init__.py, pyiron_lammps/parallel.py Removed public API and parallel execution functionality.
pyiron_lammps/control.py, pyiron_lammps/output.py, pyiron_lammps/structure.py, pyiron_lammps/units.py Added new modules for simulation control (LammpsControl), LAMMPS output parsing, structure handling, and unit conversion.
pyproject.toml Updated dependency lists in both the build-system and project sections; removed deprecated packages and added new ones.
tests/test_control.py Added comprehensive tests for the new LammpsControl class.
Multiple test files (e.g., tests/test_elastic_base.py, tests/test_evcurve_base.py, etc.) Removed several obsolete test files related to elastic constants, parallel execution, and energy-volume curve calculations.

Sequence Diagram(s)

sequenceDiagram
    participant Dev as Developer
    participant Repo as Repository
    participant CI as CI/CD Pipeline
    participant Bot as Auto-merge Bot

    Dev->>Repo: Push changes / Create PR
    Repo->>CI: Trigger pipeline workflow
    CI->>CI: Run code formatting (black)
    alt Formatting Fails
        CI->>CI: Run auto-fix job (black_fix)
    end
    CI->>CI: Execute tests (coverage, minimal, pip_check, unit tests)
    CI->>Bot: Identify bot-generated PRs (Dependabot/Pre-commit)
    Bot->>Repo: Auto-merge PR (if conditions met)
Loading
sequenceDiagram
    participant User as User
    participant LC as LammpsControl
    participant LAMMPS as LAMMPS Engine

    User->>LC: Initialize simulation parameters
    LC->>LC: Load default configuration and process inputs
    User->>LC: Request simulation type (minimization/MD/VC-SGC)
    LC->>LC: Convert pressure and set up simulation commands
    LC->>LAMMPS: Execute simulation
    LAMMPS-->>LC: Return simulation results
    LC-->>User: Output processed simulation data
Loading

Poem

I'm a bunny in the code groove, hopping along,
New scripts and workflows make the system strong.
Old files are gone, a fresh path in sight,
With LAMPS control soaring like a kite.
Unit conversions and tests in line—so neat,
Each change a hop, a joyful beat! 🐇✨
CodeRabbit celebrates with a happy leap!


Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR. (Beta)
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (24)
pyiron_atomistics/lammps/output.py (3)

69-69: Use dictionary membership test without .keys().
Replace if "computes" in dump_dict.keys(): with a direct membership test, e.g. if "computes" in dump_dict: for cleaner and more Pythonic code.

- if "computes" in dump_dict.keys():
+ if "computes" in dump_dict:
🧰 Tools
🪛 Ruff (0.8.2)

69-69: Use key in dict instead of key in dict.keys()

Remove .keys()

(SIM118)


96-96: Add stacklevel to warnings.
When emitting a warning, consider adding stacklevel=2 (or appropriate) to produce more informative file/line references.

- warnings.warn("LAMMPS warning: No log.lammps output file found.")
+ warnings.warn("LAMMPS warning: No log.lammps output file found.", stacklevel=2)
🧰 Tools
🪛 Ruff (0.8.2)

96-96: No explicit stacklevel keyword argument found

(B028)


281-281: Use not in dump.computes directly.
Remove the explicit call to .keys() in if kk not in dump.computes.keys():.

- if kk not in dump.computes.keys():
+ if kk not in dump.computes:
🧰 Tools
🪛 Ruff (0.8.2)

281-281: Use key not in dict instead of key not in dict.keys()

Remove .keys()

(SIM118)

pyiron_atomistics/lammps/structure.py (6)

114-115: Combine nested conditions.
You can merge the two if statements into one to simplify logic:

if np.abs(d_a) < self.acc and d_a < 0:
    ...
🧰 Tools
🪛 Ruff (0.8.2)

114-115: Use a single if statement instead of nested if statements

Combine if statements using and

(SIM102)


123-124: Add stacklevel argument to warnings.
In warnings.warn(...), include stacklevel to help track the source of the warning.

- warnings.warn(
+ warnings.warn(
   "Skewed lammps cells should have PBC == True in all directions!",
+  stacklevel=2
 )
🧰 Tools
🪛 Ruff (0.8.2)

123-123: No explicit stacklevel keyword argument found

(B028)


427-427: Rename unused loop variable.
i_shell is not used within the loop. Rename it to _ or remove if unneeded.

- for i_shell, ib_shell_lst in enumerate(b_lst):
+ for _, ib_shell_lst in enumerate(b_lst):
🧰 Tools
🪛 Ruff (0.8.2)

427-427: Loop control variable i_shell not used within loop body

Rename unused i_shell to _i_shell

(B007)


491-492: Combine nested conditions.
Use a single if statement to check both conditions.

if el_1_list is not None and len(el_1_list) > 0:
    ...
🧰 Tools
🪛 Ruff (0.8.2)

491-492: Use a single if statement instead of nested if statements

(SIM102)


529-532: Use a ternary operator for brevity.
You can replace the if-else block with a one-liner:

num_bond_types = 0 if len(bond_type_lst) == 0 else int(np.max(bond_type_lst))
🧰 Tools
🪛 Ruff (0.8.2)

529-532: Use ternary operator num_bond_types = 0 if len(bond_type_lst) == 0 else int(np.max(bond_type_lst)) instead of if-else-block

Replace if-else-block with num_bond_types = 0 if len(bond_type_lst) == 0 else int(np.max(bond_type_lst))

(SIM108)


533-536: Use a ternary operator for num_angle_types.
Similarly, replace the if-else block with a concise expression:

num_angle_types = 0 if len(angle_type_lst) == 0 else int(np.max(angle_type_lst))
🧰 Tools
🪛 Ruff (0.8.2)

533-536: Use ternary operator num_angle_types = 0 if len(angle_type_lst) == 0 else int(np.max(angle_type_lst)) instead of if-else-block

Replace if-else-block with num_angle_types = 0 if len(angle_type_lst) == 0 else int(np.max(angle_type_lst))

(SIM108)

pyiron_atomistics/lammps/control.py (10)

241-241: Use direct membership checks.
Replace the usage of .keys() in if self["units"] not in LAMMPS_UNIT_CONVERSIONS.keys(): with a simpler membership check.

- if self["units"] not in LAMMPS_UNIT_CONVERSIONS.keys():
+ if self["units"] not in LAMMPS_UNIT_CONVERSIONS:
🧰 Tools
🪛 Ruff (0.8.2)

241-241: Use key not in dict instead of key not in dict.keys()

Remove .keys()

(SIM118)


411-411: Use direct membership checks.
Same improvement for membership testing:

- if self["units"] not in LAMMPS_UNIT_CONVERSIONS.keys():
+ if self["units"] not in LAMMPS_UNIT_CONVERSIONS:
🧰 Tools
🪛 Ruff (0.8.2)

411-411: Use key not in dict instead of key not in dict.keys()

Remove .keys()

(SIM118)


421-421: Attach original exception cause.
When re-raising inside an except, consider using raise ... from ... for cleaner exception chaining.

except KeyError as e:
    raise NotImplementedError() from e
🧰 Tools
🪛 Ruff (0.8.2)

421-421: Within an except clause, raise exceptions with raise ... from err or raise ... from None to distinguish them from errors in exception handling

(B904)


425-425: Add stacklevel to warnings.
Including stacklevel=2 (or a suitable value) helps identify the source.

- warnings.warn(
+ warnings.warn(
   "WARNING: `delta_temp` is deprecated, please use `temperature_damping_timescale`.",
+  stacklevel=2
 )
🧰 Tools
🪛 Ruff (0.8.2)

425-425: No explicit stacklevel keyword argument found

(B028)


434-434: Add stacklevel to warnings.
Likewise, specify stacklevel in this warnings.warn(...) call.

🧰 Tools
🪛 Ruff (0.8.2)

434-434: No explicit stacklevel keyword argument found

(B028)


532-532: Add stacklevel to warnings.
Help locate the code path that triggered the message:

- warnings.warn("Temperature not set; Langevin ignored.")
+ warnings.warn("Temperature not set; Langevin ignored.", stacklevel=2)
🧰 Tools
🪛 Ruff (0.8.2)

532-532: No explicit stacklevel keyword argument found

(B028)


633-633: Use direct membership checks.
Remove the overhead of .keys():

- if self["units"] not in LAMMPS_UNIT_CONVERSIONS.keys():
+ if self["units"] not in LAMMPS_UNIT_CONVERSIONS:
🧰 Tools
🪛 Ruff (0.8.2)

633-633: Use key not in dict instead of key not in dict.keys()

Remove .keys()

(SIM118)


760-760: Add stacklevel to warnings.
Include a stacklevel argument in the warnings.warn call to help trace the origin.

🧰 Tools
🪛 Ruff (0.8.2)

760-760: No explicit stacklevel keyword argument found

(B028)


839-839: Add stacklevel to warnings.
Again, clarifying the source callsite of the warning is recommended.

🧰 Tools
🪛 Ruff (0.8.2)

839-839: No explicit stacklevel keyword argument found

(B028)


861-861: Add stacklevel to warnings.
Similar improvement to aid debugging.

🧰 Tools
🪛 Ruff (0.8.2)

861-861: No explicit stacklevel keyword argument found

(B028)

tests/lammps/test_structure.py (2)

42-45: Investigate and document the project coupling issue.

The comment indicates a workaround for project coupling issues that are not well understood. This should be investigated and properly documented to prevent future maintenance challenges.


54-76: Enhance test coverage for velocity handling.

While the test covers basic scenarios, consider adding test cases for:

  • Zero velocities
  • Very large/small velocities
  • Random velocities
  • Velocity scaling

Would you like me to generate additional test cases to improve coverage?

pyiron_atomistics/lammps/units.py (1)

231-240: Optimize dictionary lookup and warning.

Consider these improvements:

  1. Use label in quantity_dict instead of label in quantity_dict.keys() for better performance
  2. Add stacklevel parameter to the warning for better error tracking

Apply this diff:

-        if label in quantity_dict.keys():
+        if label in quantity_dict:
             return np.array(
                 array * self.lammps_to_pyiron(quantity_dict[label]), dtype_dict[label]
             )
         else:
             warnings.warn(
                 message="Warning: Couldn't determine the LAMMPS to pyiron unit conversion type of quantity "
-                "{}. Returning un-normalized quantity".format(label)
+                "{}. Returning un-normalized quantity".format(label),
+                stacklevel=2
             )
🧰 Tools
🪛 Ruff (0.8.2)

231-231: Use key in dict instead of key in dict.keys()

Remove .keys()

(SIM118)


236-236: No explicit stacklevel keyword argument found

(B028)

tests/lammps/test_control.py (2)

98-98: Use is None for None comparisons.

Replace == None with is None for more idiomatic Python code.

Apply this diff:

-            and tmp[3] == tmp[4] == tmp[5] == None
+            and tmp[3] is None and tmp[4] is None and tmp[5] is None

Also applies to: 103-103

🧰 Tools
🪛 Ruff (0.8.2)

98-98: Comparison to None should be cond is None

Replace with cond is None

(E711)


156-175: Add positive test assertions.

While error cases are well-covered, consider adding assertions to verify the correct behavior when valid inputs are provided.

Add assertions after line 160 to verify that the fix was correctly applied with the given IDs and velocities.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between fd1ecfe and 61b2ae2.

📒 Files selected for processing (6)
  • pyiron_atomistics/lammps/control.py (1 hunks)
  • pyiron_atomistics/lammps/output.py (1 hunks)
  • pyiron_atomistics/lammps/structure.py (1 hunks)
  • pyiron_atomistics/lammps/units.py (1 hunks)
  • tests/lammps/test_control.py (1 hunks)
  • tests/lammps/test_structure.py (1 hunks)
🧰 Additional context used
🪛 Ruff (0.8.2)
tests/lammps/test_control.py

98-98: Comparison to None should be cond is None

Replace with cond is None

(E711)


103-103: Comparison to None should be cond is None

Replace with cond is None

(E711)

pyiron_atomistics/lammps/units.py

231-231: Use key in dict instead of key in dict.keys()

Remove .keys()

(SIM118)


236-236: No explicit stacklevel keyword argument found

(B028)

pyiron_atomistics/lammps/output.py

69-69: Use key in dict instead of key in dict.keys()

Remove .keys()

(SIM118)


96-96: No explicit stacklevel keyword argument found

(B028)


178-178: Using .strip() with multi-character strings is misleading

(B005)


281-281: Use key not in dict instead of key not in dict.keys()

Remove .keys()

(SIM118)


328-328: Ambiguous variable name: l

(E741)


329-329: Ambiguous variable name: l

(E741)


415-415: No explicit stacklevel keyword argument found

(B028)


456-456: No explicit stacklevel keyword argument found

(B028)

pyiron_atomistics/lammps/control.py

241-241: Use key not in dict instead of key not in dict.keys()

Remove .keys()

(SIM118)


411-411: Use key not in dict instead of key not in dict.keys()

Remove .keys()

(SIM118)


421-421: Within an except clause, raise exceptions with raise ... from err or raise ... from None to distinguish them from errors in exception handling

(B904)


425-425: No explicit stacklevel keyword argument found

(B028)


434-434: No explicit stacklevel keyword argument found

(B028)


532-532: No explicit stacklevel keyword argument found

(B028)


633-633: Use key not in dict instead of key not in dict.keys()

Remove .keys()

(SIM118)


760-760: No explicit stacklevel keyword argument found

(B028)


839-839: No explicit stacklevel keyword argument found

(B028)


861-861: No explicit stacklevel keyword argument found

(B028)

pyiron_atomistics/lammps/structure.py

114-115: Use a single if statement instead of nested if statements

Combine if statements using and

(SIM102)


123-123: No explicit stacklevel keyword argument found

(B028)


427-427: Loop control variable i_shell not used within loop body

Rename unused i_shell to _i_shell

(B007)


491-492: Use a single if statement instead of nested if statements

(SIM102)


529-532: Use ternary operator num_bond_types = 0 if len(bond_type_lst) == 0 else int(np.max(bond_type_lst)) instead of if-else-block

Replace if-else-block with num_bond_types = 0 if len(bond_type_lst) == 0 else int(np.max(bond_type_lst))

(SIM108)


533-536: Use ternary operator num_angle_types = 0 if len(angle_type_lst) == 0 else int(np.max(angle_type_lst)) instead of if-else-block

Replace if-else-block with num_angle_types = 0 if len(angle_type_lst) == 0 else int(np.max(angle_type_lst))

(SIM108)

⏰ Context from checks skipped due to timeout of 90000ms (3)
  • GitHub Check: build (macos-latest, 3.12)
  • GitHub Check: build
  • GitHub Check: build (macos-latest, 3.12, osx-64-py-3-12, /Users/runner/miniconda3/envs/my-env)
🔇 Additional comments (2)
pyiron_atomistics/lammps/output.py (1)

178-178: Re-assess .lstrip() with a multi-character string.
line.lstrip("ITEM: ATOMS") may inadvertently remove characters in an order-insensitive manner if they appear in any sequence. To avoid any unintended truncation, consider explicitly handling the prefix.

🧰 Tools
🪛 Ruff (0.8.2)

178-178: Using .strip() with multi-character strings is misleading

(B005)

pyiron_atomistics/lammps/units.py (1)

19-47: LGTM! Well-defined conversion factors.

The conversion factors are accurately defined using scipy.constants, ensuring precision and maintainability.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🔭 Outside diff range comments (1)
pyproject.toml (1)

45-47: ⚠️ Potential issue

Version Attribute Issue
The dynamic version configuration attempts to read pyiron_lammps.__version__, yet the pipeline failure indicates that this attribute is missing. Please ensure that the __version__ attribute is defined (for example, in the package’s __init__.py or in a designated version module) so that Versioneer can correctly retrieve it.

🧹 Nitpick comments (26)
pyiron_lammps/output.py (7)

67-68: Prefer using direct membership check on dictionaries.

Instead of if "computes" in dump_dict.keys(): prefer if "computes" in dump_dict: to comply with Python best practices and avoid unnecessary method calls.

-    if "computes" in dump_dict.keys():
+    if "computes" in dump_dict:
🧰 Tools
🪛 Ruff (0.8.2)

67-67: Use key in dict instead of key in dict.keys()

Remove .keys()

(SIM118)


94-95: Provide a stacklevel argument for warnings.

To improve tracebacks and help developers locate the source of warnings, supply stacklevel=2 (or higher) to indicate which line triggered the warning.

-        warnings.warn("LAMMPS warning: No log.lammps output file found.")
+        warnings.warn("LAMMPS warning: No log.lammps output file found.", stacklevel=2)
🧰 Tools
🪛 Ruff (0.8.2)

94-94: No explicit stacklevel keyword argument found

(B028)


161-177: Avoid using lstrip with multi-character strings.

Using line.lstrip("ITEM: ATOMS") is potentially ambiguous. It strips any character in the provided string, not the entire substring in one sweep. Prefer a more explicit approach, e.g.:

-    columns = line.lstrip("ITEM: ATOMS").split()
+    columns = line.removeprefix("ITEM: ATOMS").split()
🧰 Tools
🪛 Ruff (0.8.2)

176-176: Using .strip() with multi-character strings is misleading

(B005)


279-280: Remove redundant .keys() check.

if kk not in dump.computes.keys():” can be replaced with “if kk not in dump.computes:”. This is more concise and Pythonic.

-        if kk not in dump.computes.keys():
+        if kk not in dump.computes:
🧰 Tools
🪛 Ruff (0.8.2)

279-279: Use key not in dict instead of key not in dict.keys()

Remove .keys()

(SIM118)


326-327: Rename ambiguous loop variable "l".

Variable names such as l can hinder readability. Consider renaming it to line_data or similar to avoid confusion and meet style recommendations.

🧰 Tools
🪛 Ruff (0.8.2)

326-326: Ambiguous variable name: l

(E741)


327-327: Ambiguous variable name: l

(E741)


413-414: Include a stacklevel argument in warnings.

When using warnings.warn, specifying stacklevel clarifies which caller triggered the warning, improving debuggability.

-        warnings.warn(
+        warnings.warn(
             "LAMMPS warning: log.lammps does not contain the required pressure values.",
+            stacklevel=2
         )
🧰 Tools
🪛 Ruff (0.8.2)

413-413: No explicit stacklevel keyword argument found

(B028)


454-454: Add stacklevel for runtime warning.

Similarly, consider adding stacklevel=2 (or appropriate) for more accurate traceback.

🧰 Tools
🪛 Ruff (0.8.2)

454-454: No explicit stacklevel keyword argument found

(B028)

pyiron_lammps/structure.py (6)

114-115: Combine nested if statements.

Use a single conditional with an and to simplify flow. This is more readable and avoids excessive nesting.

-        if np.abs(d_a) < self.acc:
-            if d_a < 0:
+        if np.abs(d_a) < self.acc and d_a < 0:
             print("debug: apply shift")
             apre[1, 0] += 2 * d_a
             apre[2, 0] += 2 * d_a
🧰 Tools
🪛 Ruff (0.8.2)

114-115: Use a single if statement instead of nested if statements

Combine if statements using and

(SIM102)


123-123: Use stacklevel in warnings.warn.

Adding a stacklevel argument makes the warning more traceable.

🧰 Tools
🪛 Ruff (0.8.2)

123-123: No explicit stacklevel keyword argument found

(B028)


427-427: Rename unused loop variable i_shell.

The variable i_shell is unused. Rename it to _ or remove it to avoid confusion and adhere to Pythonic style.

🧰 Tools
🪛 Ruff (0.8.2)

427-427: Loop control variable i_shell not used within loop body

Rename unused i_shell to _i_shell

(B007)


491-492: Combine nested if conditions into one.

If el_1_list is not None and len(el_1_list) > 0, merge them. This ensures concise code.

🧰 Tools
🪛 Ruff (0.8.2)

491-492: Use a single if statement instead of nested if statements

(SIM102)


529-536: Use ternary instead of if-else.

For short assignments, a single-line expression can be clearer:

-        if len(bond_type_lst) == 0:
-            num_bond_types = 0
-        else:
-            num_bond_types = int(np.max(bond_type_lst))
+        num_bond_types = 0 if len(bond_type_lst) == 0 else int(np.max(bond_type_lst))
🧰 Tools
🪛 Ruff (0.8.2)

529-532: Use ternary operator num_bond_types = 0 if len(bond_type_lst) == 0 else int(np.max(bond_type_lst)) instead of if-else-block

Replace if-else-block with num_bond_types = 0 if len(bond_type_lst) == 0 else int(np.max(bond_type_lst))

(SIM108)


533-536: Use ternary operator num_angle_types = 0 if len(angle_type_lst) == 0 else int(np.max(angle_type_lst)) instead of if-else-block

Replace if-else-block with num_angle_types = 0 if len(angle_type_lst) == 0 else int(np.max(angle_type_lst))

(SIM108)


533-536: Apply the ternary operator for angle_type_lst.

Same approach as with bond types:

-        if len(angle_type_lst) == 0:
-            num_angle_types = 0
-        else:
-            num_angle_types = int(np.max(angle_type_lst))
+        num_angle_types = 0 if len(angle_type_lst) == 0 else int(np.max(angle_type_lst))
🧰 Tools
🪛 Ruff (0.8.2)

533-536: Use ternary operator num_angle_types = 0 if len(angle_type_lst) == 0 else int(np.max(angle_type_lst)) instead of if-else-block

Replace if-else-block with num_angle_types = 0 if len(angle_type_lst) == 0 else int(np.max(angle_type_lst))

(SIM108)

pyiron_lammps/control.py (11)

236-237: Include stacklevel in warnings.

When adjusting n_print to max_iter, use stacklevel=2 for clarity in debugging.

-            warnings.warn("n_print larger than max_iter, adjusting to n_print=max_iter")
+            warnings.warn("n_print larger than max_iter, adjusting to n_print=max_iter", stacklevel=2)
🧰 Tools
🪛 Ruff (0.8.2)

236-236: No explicit stacklevel keyword argument found

(B028)


239-239: Use membership test without .keys().

Change if self["units"] not in LAMMPS_UNIT_CONVERSIONS.keys(): to if self["units"] not in LAMMPS_UNIT_CONVERSIONS:.

🧰 Tools
🪛 Ruff (0.8.2)

239-239: Use key not in dict instead of key not in dict.keys()

Remove .keys()

(SIM118)


409-409: Remove redundant .keys().

Replace if self["units"] not in LAMMPS_UNIT_CONVERSIONS.keys(): with a direct membership check.

🧰 Tools
🪛 Ruff (0.8.2)

409-409: Use key not in dict instead of key not in dict.keys()

Remove .keys()

(SIM118)


419-419: Use exception chaining.

When re-raising an exception within an except block, attach the original error context for clarity:

-                raise NotImplementedError()
+                raise NotImplementedError() from None
🧰 Tools
🪛 Ruff (0.8.2)

419-419: Within an except clause, raise exceptions with raise ... from err or raise ... from None to distinguish them from errors in exception handling

(B904)


423-423: Add stacklevel for the deprecation warning.

Enhance traceability:

🧰 Tools
🪛 Ruff (0.8.2)

423-423: No explicit stacklevel keyword argument found

(B028)


432-432: Likewise, specify stacklevel=2 here.

🧰 Tools
🪛 Ruff (0.8.2)

432-432: No explicit stacklevel keyword argument found

(B028)


530-530: Set a stacklevel in warnings.warn.

Clarify the call site for ignored Langevin usage.

🧰 Tools
🪛 Ruff (0.8.2)

530-530: No explicit stacklevel keyword argument found

(B028)


631-631: Check membership with no .keys().

Use if self["units"] not in LAMMPS_UNIT_CONVERSIONS: instead of checking .keys().

🧰 Tools
🪛 Ruff (0.8.2)

631-631: Use key not in dict instead of key not in dict.keys()

Remove .keys()

(SIM118)


758-759: Add a stacklevel to this warning.

Helps users quickly identify the invocation site of the "replaced exponent" warning.

🧰 Tools
🪛 Ruff (0.8.2)

758-758: No explicit stacklevel keyword argument found

(B028)


837-837: Provide stacklevel for warnings.

Adding a stacklevel is beneficial to trace the origin of this method-level notification.

🧰 Tools
🪛 Ruff (0.8.2)

837-837: No explicit stacklevel keyword argument found

(B028)


859-859: Specify stacklevel in the silent malfunction warning.

Same reasoning: it improves developer awareness of the warning’s source.

🧰 Tools
🪛 Ruff (0.8.2)

859-859: No explicit stacklevel keyword argument found

(B028)

pyiron_lammps/units.py (1)

231-240: Optimize dictionary lookup and warning usage.

A few optimizations can be made to improve the code:

  1. Use in operator directly with dictionary
  2. Add stacklevel to warning
-        if label in quantity_dict.keys():
+        if label in quantity_dict:
             return np.array(
                 array * self.lammps_to_pyiron(quantity_dict[label]), dtype_dict[label]
             )
         else:
             warnings.warn(
                 message="Warning: Couldn't determine the LAMMPS to pyiron unit conversion type of quantity "
-                "{}. Returning un-normalized quantity".format(label)
-            )
+                "{}. Returning un-normalized quantity".format(label),
+                stacklevel=2
+            )
             return array
🧰 Tools
🪛 Ruff (0.8.2)

231-231: Use key in dict instead of key in dict.keys()

Remove .keys()

(SIM118)


236-236: No explicit stacklevel keyword argument found

(B028)

tests/test_control.py (1)

98-98: Use is operator for None comparison.

When comparing with None, use the is operator instead of == for identity comparison.

-            and tmp[3] == tmp[4] == tmp[5] == None
+            and tmp[3] is None and tmp[4] is None and tmp[5] is None
-            and tmp[3] == tmp[4] == tmp[5] == None
+            and tmp[3] is None and tmp[4] is None and tmp[5] is None

Also applies to: 103-103

🧰 Tools
🪛 Ruff (0.8.2)

98-98: Comparison to None should be cond is None

Replace with cond is None

(E711)

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 61b2ae2 and 6776eaf.

⛔ Files ignored due to path filters (1)
  • tests/static/potentials_lammps.csv is excluded by !**/*.csv
📒 Files selected for processing (31)
  • .ci_support/check.py (1 hunks)
  • .ci_support/environment-mpich.yml (0 hunks)
  • .ci_support/environment-old.yml (1 hunks)
  • .ci_support/environment-openmpi.yml (0 hunks)
  • .ci_support/environment.yml (1 hunks)
  • .coveralls.yml (0 hunks)
  • .github/workflows/black.yml (0 hunks)
  • .github/workflows/format_black.yml (0 hunks)
  • .github/workflows/pipeline.yml (1 hunks)
  • .github/workflows/pypicheck.yml (0 hunks)
  • .github/workflows/unittests-mpich.yml (0 hunks)
  • .github/workflows/unittests-old.yml (0 hunks)
  • .github/workflows/unittests-openmpi.yml (0 hunks)
  • .pre-commit-config.yaml (1 hunks)
  • CITATION.cff (0 hunks)
  • README.md (1 hunks)
  • pyiron_lammps/__init__.py (0 hunks)
  • pyiron_lammps/control.py (1 hunks)
  • pyiron_lammps/output.py (1 hunks)
  • pyiron_lammps/parallel.py (0 hunks)
  • pyiron_lammps/structure.py (1 hunks)
  • pyiron_lammps/units.py (1 hunks)
  • pyproject.toml (2 hunks)
  • tests/test_control.py (1 hunks)
  • tests/test_elastic_base.py (0 hunks)
  • tests/test_elastic_parallel_single_core.py (0 hunks)
  • tests/test_elastic_parallel_two_cores.py (0 hunks)
  • tests/test_error_messages.py (0 hunks)
  • tests/test_evcurve_base.py (0 hunks)
  • tests/test_evcurve_parallel_single_core.py (0 hunks)
  • tests/test_evcurve_parallel_two_cores.py (0 hunks)
💤 Files with no reviewable changes (19)
  • .github/workflows/black.yml
  • .coveralls.yml
  • .ci_support/environment-openmpi.yml
  • .ci_support/environment-mpich.yml
  • pyiron_lammps/init.py
  • tests/test_error_messages.py
  • tests/test_elastic_base.py
  • tests/test_evcurve_base.py
  • .github/workflows/format_black.yml
  • .github/workflows/unittests-mpich.yml
  • .github/workflows/pypicheck.yml
  • tests/test_evcurve_parallel_two_cores.py
  • tests/test_elastic_parallel_single_core.py
  • .github/workflows/unittests-openmpi.yml
  • tests/test_evcurve_parallel_single_core.py
  • .github/workflows/unittests-old.yml
  • tests/test_elastic_parallel_two_cores.py
  • pyiron_lammps/parallel.py
  • CITATION.cff
✅ Files skipped from review due to trivial changes (3)
  • .ci_support/environment.yml
  • README.md
  • .pre-commit-config.yaml
🧰 Additional context used
🪛 GitHub Actions: Pipeline
.ci_support/check.py

[error] 9-9: Key 'optional-dependencies' does not exist in the TOML file.

pyproject.toml

[error] 1-1: Preparing metadata (pyproject.toml) did not run successfully. AttributeError: module 'pyiron_lammps' has no attribute 'version'.

🪛 Ruff (0.8.2)
pyiron_lammps/structure.py

114-115: Use a single if statement instead of nested if statements

Combine if statements using and

(SIM102)


123-123: No explicit stacklevel keyword argument found

(B028)


427-427: Loop control variable i_shell not used within loop body

Rename unused i_shell to _i_shell

(B007)


491-492: Use a single if statement instead of nested if statements

(SIM102)


529-532: Use ternary operator num_bond_types = 0 if len(bond_type_lst) == 0 else int(np.max(bond_type_lst)) instead of if-else-block

Replace if-else-block with num_bond_types = 0 if len(bond_type_lst) == 0 else int(np.max(bond_type_lst))

(SIM108)


533-536: Use ternary operator num_angle_types = 0 if len(angle_type_lst) == 0 else int(np.max(angle_type_lst)) instead of if-else-block

Replace if-else-block with num_angle_types = 0 if len(angle_type_lst) == 0 else int(np.max(angle_type_lst))

(SIM108)

pyiron_lammps/units.py

231-231: Use key in dict instead of key in dict.keys()

Remove .keys()

(SIM118)


236-236: No explicit stacklevel keyword argument found

(B028)

tests/test_control.py

98-98: Comparison to None should be cond is None

Replace with cond is None

(E711)


103-103: Comparison to None should be cond is None

Replace with cond is None

(E711)

pyiron_lammps/output.py

67-67: Use key in dict instead of key in dict.keys()

Remove .keys()

(SIM118)


94-94: No explicit stacklevel keyword argument found

(B028)


176-176: Using .strip() with multi-character strings is misleading

(B005)


279-279: Use key not in dict instead of key not in dict.keys()

Remove .keys()

(SIM118)


326-326: Ambiguous variable name: l

(E741)


327-327: Ambiguous variable name: l

(E741)


413-413: No explicit stacklevel keyword argument found

(B028)


454-454: No explicit stacklevel keyword argument found

(B028)

pyiron_lammps/control.py

236-236: No explicit stacklevel keyword argument found

(B028)


239-239: Use key not in dict instead of key not in dict.keys()

Remove .keys()

(SIM118)


409-409: Use key not in dict instead of key not in dict.keys()

Remove .keys()

(SIM118)


419-419: Within an except clause, raise exceptions with raise ... from err or raise ... from None to distinguish them from errors in exception handling

(B904)


423-423: No explicit stacklevel keyword argument found

(B028)


432-432: No explicit stacklevel keyword argument found

(B028)


530-530: No explicit stacklevel keyword argument found

(B028)


631-631: Use key not in dict instead of key not in dict.keys()

Remove .keys()

(SIM118)


758-758: No explicit stacklevel keyword argument found

(B028)


837-837: No explicit stacklevel keyword argument found

(B028)


859-859: No explicit stacklevel keyword argument found

(B028)

🪛 YAMLlint (1.35.1)
.github/workflows/pipeline.yml

[warning] 191-191: wrong indentation: expected 4 but found 6

(indentation)


[error] 195-195: no new line character at the end of file

(new-line-at-end-of-file)

🔇 Additional comments (13)
pyiron_lammps/output.py (1)

122-126: Validate logic when checking for orthogonality.

The _check_ortho_prism() function returns True if the prism is effectively orthorhombic. Raising a RuntimeError in this case could be confusing. Verify this logic to confirm that the correct scenario triggers the error.

.ci_support/environment-old.yml (1)

10-10:

❓ Verification inconclusive

Verify scipy version.

The specified version scipy =1.15.0 appears to be incorrect as it's higher than the latest available version.


🌐 Web query:

What is the latest version of scipy?

💡 Result:

The latest version of SciPy is 1.15.2, released on February 16, 2025[1][4]. This is a bug-fix release with no new features compared to version 1.15.1 but includes free-threaded Python 3.13 wheels for Linux ARM platforms[1][2].

Key details:

  • Release type: Maintenance/bug-fix update
  • Supported Python versions: 3.10-3.13[2]
  • Key addition: First release with Python 3.13-compatible ARM Linux wheels[2]

Earlier versions in the 1.15.x series include:

  • 1.15.1: Fixed critical scipy.optimize import issues[2]
  • 1.15.0: Major release introducing sparse array improvements and new numerical integration tools[2]

The development team has shifted focus to maintaining the 1.15.x branch while adding new features to the main branch[2].

Citations:


Action: Verify and Update the SciPy Version Specification

  • The file .ci_support/environment-old.yml currently pins SciPy at version 1.15.0.
  • According to the latest information, SciPy’s most recent release is 1.15.2 (February 16, 2025).
  • Please confirm if the older version is intentional for compatibility or legacy reasons; otherwise, consider updating the dependency to 1.15.2.
pyproject.toml (2)

2-2: Updated Build-System Dependencies
The [build-system] section now requires additional packages such as h5py, scipy, pyiron_base, and pyiron_snippets. Verify that these changes are aligned with the new file-based interface requirements.


28-33: Updated Project Dependencies
The dependencies list in the [project] section now includes pyiron_base==0.11.5, pyiron_snippets==0.1.4, h5py==3.13.0, numpy==2.2.3, and scipy==1.15.2. Please confirm that these versions are compatible with the rest of the project components.

.github/workflows/pipeline.yml (9)

1-7: Pipeline Workflow Triggers
The workflow is triggered on pushes to the main branch and on pull requests. This configuration appears sound for CI/CD needs.


8-17: Job "black" Configuration
The job for checking code formatting with Black is properly set up using the stable action. Verify that the source path (./${{ github.event.repository.name }}) correctly resolves to the repository content.


18-43: Job "black_fix" Configuration
The fallback job for formatting (triggered upon failure of the Black check) is correctly defined. The checkout with a token and use of fetch-depth: 0 are good practices for ensuring a successful commit push.


44-72: Job "coverage" Setup
The coverage job sets up the environment using Mambaforge and runs tests with coverage enabled. Confirm that the provided environment file (.ci_support/environment.yml) includes all necessary dependencies for accurate test execution.


73-94: Job "minimal" Configuration
The minimal test job correctly installs the project without extras and runs unit tests. This is helpful for quickly validating core functionality.


95-118: Job "pip_check" for Dependency Validation
The pip_check job runs a custom check script followed by a pip dependency verification. Ensure that the custom script (.ci_support/check.py) is updated to reflect the dependency changes in the project.


119-160: Job "unittest_matrix" – Cross-Platform Testing
The matrix strategy to run tests across different operating systems and Python versions is well implemented. Verify that the shared environment file (.ci_support/environment.yml) supports all target configurations.


161-182: Job "unittest_old" for Legacy Testing
This job verifies behavior on Python 3.9 using a separate environment file (.ci_support/environment-old.yml). Confirm that this file is kept in sync with any dependency changes from the project.


183-195: Job "autobot" for Automated Merging
The autobot job is configured to automatically merge PRs from Dependabot and pre-commit CI bots. Ensure that the conditional check and environment variables (e.g., GH_TOKEN) are correctly configured for secure operation. Also, double-check that the indentation adheres to YAML standards (see specific comments below).

🧰 Tools
🪛 YAMLlint (1.35.1)

[warning] 191-191: wrong indentation: expected 4 but found 6

(indentation)


[error] 195-195: no new line character at the end of file

(new-line-at-end-of-file)

Comment on lines 8 to 15
lst = []
for sub_lst in data["project"]["optional-dependencies"].values():
for el in sub_lst:
lst.append(el)

data["project"]["dependencies"] += [
el for el in set(lst) if not el.startswith("pwtools")
]
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Add error handling for missing 'optional-dependencies' key.

The script fails when the 'optional-dependencies' key doesn't exist in pyproject.toml. Add proper error handling and validation.

 if __name__ == "__main__":
     with open("pyproject.toml", "r") as f:
         data = tomlkit.load(f)
+    
+    # Validate TOML structure
+    if "project" not in data or "dependencies" not in data["project"]:
+        raise KeyError("Invalid pyproject.toml: missing 'project.dependencies' section")
 
+    # Create backup
+    with open("pyproject.toml.bak", "w") as f:
+        f.writelines(tomlkit.dumps(data))
+
     lst = []
-    for sub_lst in data["project"]["optional-dependencies"].values():
-        for el in sub_lst:
-            lst.append(el)
+    if "optional-dependencies" in data["project"]:
+        for sub_lst in data["project"]["optional-dependencies"].values():
+            for el in sub_lst:
+                lst.append(el)
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
lst = []
for sub_lst in data["project"]["optional-dependencies"].values():
for el in sub_lst:
lst.append(el)
data["project"]["dependencies"] += [
el for el in set(lst) if not el.startswith("pwtools")
]
if __name__ == "__main__":
with open("pyproject.toml", "r") as f:
data = tomlkit.load(f)
# Validate TOML structure
if "project" not in data or "dependencies" not in data["project"]:
raise KeyError("Invalid pyproject.toml: missing 'project.dependencies' section")
# Create backup
with open("pyproject.toml.bak", "w") as f:
f.writelines(tomlkit.dumps(data))
lst = []
if "optional-dependencies" in data["project"]:
for sub_lst in data["project"]["optional-dependencies"].values():
for el in sub_lst:
lst.append(el)
data["project"]["dependencies"] += [
el for el in set(lst) if not el.startswith("pwtools")
]
🧰 Tools
🪛 GitHub Actions: Pipeline

[error] 9-9: Key 'optional-dependencies' does not exist in the TOML file.

run: gh pr merge --auto --squash "$PR_URL"
env:
PR_URL: ${{github.event.pull_request.html_url}}
GH_TOKEN: ${{secrets.GITHUB_TOKEN}}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Append Newline at End of File
Ensure that the file ends with a newline character to satisfy YAML style guidelines and prevent linting errors.

🧰 Tools
🪛 YAMLlint (1.35.1)

[error] 195-195: no new line character at the end of file

(new-line-at-end-of-file)

runs-on: ubuntu-latest
if: (github.event.pull_request.user.login == 'dependabot[bot]' || github.event.pull_request.user.login == 'pre-commit-ci[bot]')
steps:
- name: Enable auto-merge for bot PRs
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

⚠️ Potential issue

Correct YAML Indentation
Static analysis detected that line 191 has an indentation issue (expected 4 spaces but found 6). Please adjust the indentation to conform to YAML linting guidelines. For example, change:

-      - name: Enable auto-merge for bot PRs
+    - name: Enable auto-merge for bot PRs
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- name: Enable auto-merge for bot PRs
- name: Enable auto-merge for bot PRs
🧰 Tools
🪛 YAMLlint (1.35.1)

[warning] 191-191: wrong indentation: expected 4 but found 6

(indentation)

Copy link

codecov bot commented Feb 23, 2025

Welcome to Codecov 🎉

Once you merge this PR into your default branch, you're all set! Codecov will compare coverage reports and display results in all future pull requests.

Thanks for integrating Codecov - We've got you covered ☂️

@jan-janssen jan-janssen merged commit 29a2925 into main Feb 23, 2025
19 checks passed
@jan-janssen jan-janssen deleted the file branch February 23, 2025 17:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants