8000 JP-3769: Style rules example case by emolter · Pull Request #9081 · spacetelescope/jwst · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

JP-3769: Style rules example case #9081

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 39 commits into from
Jan 29, 2025
Merged

Conversation

emolter
Copy link
Collaborator
@emolter emolter commented Jan 16, 2025

Resolves JP-3769

Closes #8841

Overview

This PR adds many more style rules to the repository, and applies them to the AMI module to show what the new rules would do to our code style.

The style is checked by two tools, ruff and numpydoc. Ruff was already part of our pre-commit CI, and this PR simply turns on many more style rules. Numpydoc, maintained by the numpy project, enforces numpy-like documentation style much more rigorously than ruff does. This PR adds numpydoc validation to the pre-commit job.

This PR adds numpydoc, ruff, and pre-commit to the optional testing dependencies, meaning that they will all be installed with pip install jwst[test].

Request for feedback

Don't be shy: NOW is the time to bring up any potential concerns, BEFORE we make these requirements global. It'll be a lot easier if we can avoid making global-scale edits after the fact. We need to come up with a final list of style rules. I've explained my logic for the first draft below, but I would love to hear your opinion:

  • If there's a ruleset I ignored/rejected that you want included
  • If there's a ruleset I included that you want to reject
  • If there are specific rules that you hate following and think don't actually help the code
  • If you have strong opinions on how the docstrings should look

How to use the new tools

pre-commit

If you install pre-commit locally, all of the checks that the pre-commit CI does will be run automatically when git commit is executed, including the ruff and numpydoc checks added in this PR.

  1. pip install -U pre-commit to install
  2. From the top-level repository directory (jwst/), pre-commit install. This will put a pre-commit hook inside jwst/.git/hooks.
  3. Test it by making a change and running git commit. This will run all the checks on any file that was modified in the commit, but not on other files. The commit will NOT occur unless all the checks pass.

note: This was all possible prior to this PR, and nothing has changed about it except the details of the pre-commit job. But it 8000 may be more helpful now that there are multiple meaningful validations to run.

Ruff

  1. pip install -U ruff to install
  2. Inside .ruff.toml, search for [tool.ruff.lint.per-file-ignores], find the module you'd like to modify, and comment out the relevant ignore line. Ruff reads the config from .ruff.toml so it won't work unless the files are un-ignored.
  3. ruff check . or ruff check path/to/file.py to report issues
  4. ruff check . --fix to fix issues Ruff deems "safe" fixes and report the rest
  5. ruff format . to apply auto-formatting. IMPORTANT: please ONLY apply this to modules you are editing! This does NOT respect the ignore rules and will apply formatting to the entire repository globally if you call it from the top-level jwst/ directory. I suggest applying this formatting in its own, clean commit, so if it gets messed up you can just revert it.

numpydoc

  • pip install -U numpydoc to install
  • Inside .pre-commit-config.yaml, scroll down to the bottom, find the module you'd like to modify, and remove the relevant line in the numpydoc-validation exclude list.
  • numpydoc lint /path/to/file.py to report issues. Unlike ruff, this does not support pointing to directories.
  • Fix the issues, re-run, do this until there are no more issues.

Notes:

  • Unfortunately, numpydoc does not support any automatic fixes. Every tool I've found that attempts to automatically make docstrings adhere to numpy format is third-party and also out-of-date.
  • For writing new code, there is a VSCode plugin called autoDocstring that will make a numpy-style docstring skeleton for you. I haven't tested this but it might be helpful for VSCode users.
  • Numpydoc reads its configuration from pyproject.toml, but its ignore list is in pre-commit-config.yaml

How to apply the rules to your favorite module

  1. Clone a local copy of this branch.
  2. Inside the .pre-commit-config.yaml file, scroll down to the bottom, find the module you'd like to modify, and remove the relevant line in the numpydoc-validation exclude list.
  3. Inside the .ruff.toml file under the heading [lint.per-file-ignores], find the big list of every subfolder in the repository. COMMENT OUT the one you want to look at / fix.
  4. Run ruff format . from the module you are working on. This will auto-apply the formatting rules.
  5. Run ruff check . from the top-level JWST repository, or from the module you are working on. The output should show you style issues from whatever module(s) you commented out.
  6. Apply the fixes, and test them! Note that these fixes are not all "safe" and can and will change behaviors if you are not careful, especially e.g. renaming variables and removing unused variables!

Tips and tricks

  • If you're getting "missing docstring" issues, in many cases it would be good to add the docstring. However, you also have the option to make the function "private". There are other differences between "public" and "private" functions/methods/attributes besides their interaction with ruff, so it would be good to be familiar with those if you go this route.
  • If you're unsure what a Ruff rule is saying, each of them has a little webpage. These are usually searchable with ruff CODE000 on Google
  • Numpydoc will often show multiple problems when only a single change is required. For example, it sometimes says a parameter is unrecognized when really there's just a whitespace issue, e.g., missing whitespace between parameter name and :. Fix the issues that you can see easily, then rerun, and sometimes the harder-to-understand error messages resolve themselves.
  • Feel free to add your own here!

List of rules included and ignored

Numpydoc rules ignored (as of 1/23/2025)

  • "EX01", # No examples section found
  • "SA01", # See Also section not found
  • "ES01", # No extended summary found
  • "GL08", # Object does not have a docstring. Ruff catches these, and allows more granular ignores.
  • "PR01", # Parameters not documented. Already caught by ruff.
  • "PR09", # Parameter description should finish with a period
  • "RT02", # First line of return should contain only the type
  • "RT05", # Return value description should finish with a period

Ruff rules included (as of 1/23/2025)

In coming up with the rule list, I turned various rulesets on and off globally for the repository and scanned the ruff check output, just to see if there were unexpected results or specific rules that we should definitely ignore. The draft list is included below (see also .ruff.toml) along with some comments on my decision-making. edit: this list is now up-to-date with what I feel is the consensus so far, but please feel free to chime in!

  • D: pydocstyle. This is mostly, but not entirely, superseded by numpydoc. In particular, ruff allows some automatic fixes for some of the simple (e.g. whitespace) issues it's able to catch, and it allows us to be more granular when selecting certain rules.
  • A: prevent naming variables the same as Python built-in names, e.g. input, id, match.
  • ARG: enforce no unused arguments to methods.
  • B: checks for miscellaneous constructions that often introduce bugs. In practice I've found these easy to fix and good for improving my own coding.
  • C4: remove unnecessary list and dict comprehensions, unnecessary re-casts from list to tuple, etc. In practice I've found these easy to fix and good for improving my own coding.
  • ICN: ensures imports use conventional aliases, e.g., import numpy as np. There was only one failure of this type in the whole repository.
  • INP001: ensures there’s an __init__.py in all namespaces.
  • ISC: some conventions for how to represent strings over multiple lines. These are small nits but easy to fix and generally I've found they improve readability of the code.
  • LOG: avoid some bad logger-related style things. There was only one failure of this type in the whole repository.
  • NPY: numpy-specific rules. Every single one of the failures from these rules is a request to replace legacy np.random.rand with np.random.Generator, which I do think is worthwhile.
  • PGH: make sure type: ignore and noqa: are specific, not global.
  • PTH: replace os with Pathlib in many cases. I kept this in, but possibly it's unnecessarily annoying?
  • SLF: prevent direct access to underscore-protected class members outside the class.
  • SLOT: subclasses of str and tuple should define __slots__. There was only one failure of this type in the whole repository.
  • T20: enforce no print() statements in code.
  • TRY: best practices related to raising exceptions. In practice I've found these make code less bug-prone.
  • UP: update/simplify syntax that is no longer necessary with more recent Python versions. In practice I've found these easy to fix and good for improving my own coding. I'm suggesting ignoring two specific rules:
    • UP008: use super()instead of super(class, self). I feel there's no harm being explicit.
    • UP015: unnecessary open(file, "r") instead of just open(file). I feel there's no harm being explicit.
  • YTT: prevent some specific gotchas from sys.version and sys.version_info. There was only one failure of this type in the whole repository.
  • N: pep8-compliant naming conventions.

Ruff rules rejected

  • SIM: flake8-simplify. These seem to me to often make things less readable, for example turning if...else statements into one-liners. Some might be useful, maybe revisit later? But this would be very low-priority
  • PT: pytest style. These just don’t seem particularly useful, e.g. replacing @pytest.fixture(scope="function") with simply @pytest.fixture... yes, it's more compact, but the former is easier to understand without necessarily knowing the default by heart.
  • Q: enforce double quotes in almost all cases. These are mostly handled by the auto-formatter, and Ruff suggests turning the main ones off if using the formatter.

Ruff rules I didn't consider

If you read the ruff docs yourself, you'll notice some rulesets are not on this list. That's because I read the description and assumed they weren't particularly useful or relevant. But I could be convinced otherwise.

Tasks

  • request a review from someone specific, to avoid making the maintainers review every PR
  • add a build milestone, i.e. Build 11.3 (use the latest build if not sure)
  • Does this PR change user-facing code / API? (if not, label with no-changelog-entry-needed)
    • write news fragment(s) in changes/: echo "changed something" > changes/<PR#>.<changetype>.rst (see below for change types)
    • update or add relevant tests
    • update relevant docstrings and / or docs/ page
    • start a regression test and include a link to the running job (click here for instructions)
      • Do truth files need to be updated ("okified")?
        • after the reviewer has approved these changes, run okify_regtests to update the truth files
  • if a JIRA ticket exists, make sure it is resolved properly
news fragment change types...
  • changes/<PR#>.general.rst: infrastructure or miscellaneous change
  • changes/<PR#>.docs.rst
  • changes/<PR#>.stpipe.rst
  • changes/<PR#>.datamodels.rst
  • changes/<PR#>.scripts.rst
  • changes/<PR#>.fits_generator.rst
  • changes/<PR#>.set_telescope_pointing.rst
  • changes/<PR#>.pipeline.rst

stage 1

  • changes/<PR#>.group_scale.rst
  • changes/<PR#>.dq_init.rst
  • changes/<PR#>.emicorr.rst
  • changes/<PR#>.saturation.rst
  • changes/<PR#>.ipc.rst
  • changes/<PR#>.firstframe.rst
  • changes/<PR#>.lastframe.rst
  • changes/<PR#>.reset.rst
  • changes/<PR#>.superbias.rst
  • changes/<PR#>.refpix.rst
  • changes/<PR#>.linearity.rst
  • changes/<PR#>.rscd.rst
  • changes/<PR#>.persistence.rst
  • changes/<PR#>.dark_current.rst
  • changes/<PR#>.charge_migration.rst
  • changes/<PR#>.jump.rst
  • changes/<PR#>.clean_flicker_noise.rst
  • changes/<PR#>.ramp_fitting.rst
  • changes/<PR#>.gain_scale.rst

stage 2

  • changes/<PR#>.assign_wcs.rst
  • changes/<PR#>.badpix_selfcal.rst
  • changes/<PR#>.msaflagopen.rst
  • changes/<PR#>.nsclean.rst
  • changes/<PR#>.imprint.rst
  • changes/<PR#>.background.rst
  • changes/<PR#>.extract_2d.rst
  • changes/<PR#>.master_background.rst
  • changes/<PR#>.wavecorr.rst
  • changes/<PR#>.srctype.rst
  • changes/<PR#>.straylight.rst
  • changes/<PR#>.wfss_contam.rst
  • changes/<PR#>.flatfield.rst
  • changes/<PR#>.fringe.rst
  • changes/<PR#>.pathloss.rst
  • changes/<PR#>.barshadow.rst
  • changes/<PR#>.photom.rst
  • changes/<PR#>.pixel_replace.rst
  • changes/<PR#>.resample_spec.rst
  • changes/<PR#>.residual_fringe.rst
  • changes/<PR#>.cube_build.rst
  • changes/<PR#>.extract_1d.rst
  • changes/<PR#>.resample.rst

stage 3

  • changes/<PR#>.assign_mtwcs.rst
  • changes/<PR#>.mrs_imatch.rst
  • changes/<PR#>.tweakreg.rst
  • changes/<PR#>.skymatch.rst
  • changes/<PR#>.exp_to_source.rst
  • changes/<PR#>.outlier_detection.rst
  • changes/<PR#>.tso_photometry.rst
  • changes/<PR#>.stack_refs.rst
  • changes/<PR#>.align_refs.rst
  • changes/<PR#>.klip.rst
  • changes/<PR#>.spectral_leak.rst
  • changes/<PR#>.source_catalog.rst
  • changes/<PR#>.combine_1d.rst
  • changes/<PR#>.ami.rst

other

  • changes/<PR#>.wfs_combine.rst
  • changes/<PR#>.white_light.rst
  • changes/<PR#>.cube_skymatch.rst
  • changes/<PR#>.engdb_tools.rst
  • changes/<PR#>.guider_cds.rst

@emolter emolter marked this pull request as ready for review January 16, 2025 23:16
@emolter emolter requested review from a team as code owners January 16, 2025 23:16
@emolter emolter changed the title JP-3769: Updated style rules example case JP-3769: Style rules example case Jan 17, 2025
Copy link
Collaborator
@melanieclarke melanieclarke left a comment

Choose a reason for hiding this comment

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

I have opinions!

  • I'd like to include D400, D401, and D404 -- these are important components of the numpydoc style.
  • I'd also like to include the N ruleset. We can make exceptions for files with important math variables that are clearer if they are capitalized.
  • I think 130 characters is too long for the line-length. I'd prefer the standard 88.
  • I don't think unit tests need docstings - we should blanket exclude tests/* from that requirement.

As configured, does this check for standard numpydocs section headers?

@emolter
Copy link
Collaborator Author
emolter commented Jan 17, 2025

I'd like to include D400, D401, and D404 -- these are important components of the numpydoc style.

Sounds good, the current rules as you say are a bit more permissive than Numpy style. Let's see what others think.

As configured, does this check for standard numpydocs section headers?
No, and I'm not sure whether there's a standard rule set for that. I'll look into how Numpy enforces it.

I'd also like to include the N ruleset. We can make exceptions for files with important math variables that are clearer if they are capitalized.

Thanks for the input, let's see what other people think. I agree we could ignore these in certain places, but it's better to agree on the rules and be consistent than to have some rules that are only followed half the time and marked for ignoring later.

I think 130 characters is too long for the line-length. I'd prefer the standard 88.

I prefer a longer line limit but let's see what the consensus is.

I don't think unit tests need docstings - we should blanket exclude tests/* from that requirement.

Test files are already excluded by the line "**/tests/test_*.py", in [tool.ruff.exclude]. My logic for only excluding files that start with test_ is that, in my opinion, it's nice to have docstrings and nice style for testing configurations. I've come across situations where I'm unsure what a conftest function is doing more than once. It's possible we would want to include (some of) the other style rules for all tests though, are you suggesting we should include all of them except the docs rules?

@melanieclarke
Copy link
Collaborator

I prefer a longer line limit but let's see what the consensus is.

Agreed, but I'd like to add one more comment here for consideration - shorter lines are much more readable for me when I need to make the font bigger for vision reasons.

Test files are already excluded by the line "**/tests/test_*.py", in [tool.ruff.exclude]. My logic for only excluding files that start with test_ is that, in my opinion, it's nice to have docstrings and nice style for testing configurations. I've come across situations where I'm unsure what a conftest function is doing more than once. It's possible we would want to include (some of) the other style rules for all tests though, are you suggesting we should include all of them except the docs rules?

Ah, I missed that! I just saw some reported issues with conftest files and assumed it was checking test_* files too. I'm not super concerned about code style in unit tests, but it might be nice to have the basic checks apply - it might help catch code errors in the tests themselves.

@emolter
8000
Copy link
Collaborator Author
emolter commented Jan 21, 2025

a5bff5c has the first draft of this, with no N rules, relatively permissive D rules, and a max line length of 130 characters.

5925a28 adds Melanie's suggestions of changing the doc rules to comply with Numpy style as well as to add the naming (N) rules. I only added noqa: ignore to N rules where the variable was very clearly a matrix, e.g. having a numpy or scipy matrix type, and changed the rest. The change in the D rules was pretty minimal in practice. @melanieclarke Numpy does not use ruff to ensure standard section names; still not sure how exactly they do that, but I think it's beyond the scope here as it may require additional/custom CI checks.

8d4884a changes (in addition to the above) the line length to 88 for the formatter, i.e., ruff format will auto-fix lines to 88 chars, and sets ruff check to complain if the line is over 100 characters (the latter is primarily relevant in docstrings).

d385721 adds numpydoc checks.

Hopefully these give y'all some options to look at. Let me know your thoughts.

Copy link
codecov bot commented Jan 21, 2025

Codecov Report

Attention: Patch coverage is 71.57464% with 139 lines in your changes missing coverage. Please review.

Project coverage is 78.14%. Comparing base (6d513e1) to head (812d455).
Report is 936 commits behind head on main.

Files with missing lines Patch % Lines
jwst/ami/ami_analyze_step.py 40.00% 30 Missing ⚠️
jwst/ami/matrix_dft.py 57.62% 25 Missing ⚠️
jwst/ami/ami_average.py 4.54% 21 Missing ⚠️
jwst/ami/utils.py 72.72% 15 Missing ⚠️
jwst/ami/analyticnrm2.py 81.96% 11 Missing ⚠️
jwst/ami/find_affine2d_parameters.py 14.28% 6 Missing ⚠️
jwst/ami/ami_analyze.py 64.28% 5 Missing ⚠️
jwst/ami/leastsqnrm.py 73.68% 5 Missing ⚠️
jwst/ami/lg_model.py 61.53% 5 Missing ⚠️
jwst/ami/hexee.py 88.23% 4 Missing ⚠️
... and 6 more
Additional details and impacted files
@@            Coverage Diff             @@
##             main    #9081      +/-   ##
==========================================
+ Coverage   77.74%   78.14%   +0.40%     
==========================================
  Files         507      505       -2     
  Lines       46570    46243     -327     
==========================================
- Hits        36207    36138      -69     
+ Misses      10363    10105     -258     
Flag Coverage Δ *Carryforward flag
nightly 77.77% <ø> (-0.02%) ⬇️ Carriedforward from ade1522

*This pull request uses carry forward flags. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@emolter
Copy link
Collaborator Author
emolter commented Jan 21, 2025

started regression tests here, just to see if there are any more failures caused by renaming stuff

Copy link
Contributor
@kmacdonald-stsci kmacdonald-stsci left a comment

Choose a reason for hiding this comment

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

I gave my thoughts on the formatting I liked and didn't like. I didn't note this every time I saw various things. Most of the formatting stuff is just my preference, which are mostly weak preferences, so if others prefer something different that's fine. I did, though, see many places with unnecessarily complicated and convoluted computations that could be simplified to be made easier to read, as well as more computationally efficient. This is something I do feel strongly about.

@emolter
Copy link
Collaborator Author
emolter commented Jan 22, 2025

I gave my thoughts on the formatting I liked and didn't like. I didn't note this every time I saw various things. Most of the formatting stuff is just my preference, which are mostly weak preferences, so if others prefer something different that's fine.

Thanks for these comments @kmacdonald-stsci, it's really helpful to have that feedback. I noticed that many of the style things you suggested are related to the auto-formatter, which I haven't played much with. So many of those can hopefully be accommodated. I will respond individually about those, if I just give it a "thumbs-up" emoji that means I read/understood/will take into account.

I did, though, see many places with unnecessarily complicated and convoluted computations that could be simplified to be made easier to read, as well as more computationally efficient. This is something I do feel strongly about.

I completely agree; however, I don't think this PR is necessarily the place to change those. I'd like to keep the changes here restricted to those specifically required by the rules themselves, so that people can see what the rules themselves are going to do to the rest of the repository. Perhaps I can put in these changes after everyone has had a chance to comment about the rules. Otherwise, there is at least one AMI-related clean-up ticket where those changes may be appropriate.

@emolter emolter mentioned this pull request Jan 27, 2025
10 tasks
@emolter
Copy link
Collaborator Author
emolter commented Jan 27, 2025

Codespell PR is here: #9097

With the line length and spell checker questions answered, this PR is as finished as I think I can make it

Copy link
Collaborator
@melanieclarke melanieclarke left a comment

Choose a reason for hiding this comment

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

I think we're ready to get this merged and start trying it out.

Thanks for taking the lead and gathering everyone's input!

Copy link
Contributor
@tapastro tapastro left a comment

Choose a reason for hiding this comment

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

A couple more configuration questions!

Comment on lines +259 to +269
F438
[tool.numpydoc_validation]
checks = [
"all",
"EX01", # No examples section found
"SA01", # See Also section not found
"ES01", # No extended summary found
"GL08", # Object does not have a docstring. Ruff catches these, and allows more granular ignores.
"PR01", # Parameters not documented. Already caught by ruff.
"PR09", # Parameter description should finish with a period
"RT02", # First line of return should contain only the type
"RT05", # Return value description should finish with a period
Copy link
Contributor

Choose a reason for hiding this comment

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

Shoud this remain, or can we manage the numpydoc settings through the pre-commit config file?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Yes, I believe they should remain. The numpydoc-validation call in pre-commit-config.yaml will still read pyproject.toml (and .ruff.toml), and plus having them here would allow them to still be picked up if calling numpydoc outside of the pre-commit.

Copy link
Contributor

Choose a reason for hiding this comment

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

Having the pre-commit config set the numpydoc version and the pyproject set the validation checks makes my nose wrinkle a bit; similarly with the mypy configuration (and ruff configuration in the pre-commit config and .ruff.toml...)- if we're going to use pre-commit to manage our linters, can we set our configuration there? If the primary benefit of keeping these in the pyproject file is to have the settings picked up by non-pre-commit calls to the linters, didn't we already punt on that by dropping the versioning here?

It just seems a bit disorganized in how the configuration for various linters has been placed in the (three?) different configuration files.

"PR01", # Parameters not documented. Already caught by ruff.
"PR09", # Parameter description should finish with a period
"RT02", # First line of return should contain only the type
"RT05", # Return value description should finish with a period
]

[tool.mypy]
Copy link
Contributor

Choose a reason for hiding this comment

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

Are the mypy sections are useful if someone elects to install and run mypy separately from the listed requirements, or can these sections be removed?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Yes, they are still useful as mypy will still pick up the config in pyproject.toml if you're running it from within the repository.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Also, I'm pretty sure the mypy CI check also reads from here

@emolter
Copy link
Collaborator Author
emolter commented Jan 28, 2025

@braingram @tapastro This is now ready for you to look again at the pre-commit-config.yaml, pyproject.toml, and .ruff.toml files. In addition to what we talked about in our Slack huddles, I had to uncomment ruff-format inside pre-commit-config.yaml and add a separate per-module ignore list for ruff-format. Without uncommenting it, it wasn't possible to call the formatter via pre-commit run ruff-format. Without adding the ignores list, running the command would apply formatting to the whole codebase at once. Hope this is ok with everyone - I think it makes the contribution guidelines more straightforward.

Also starting a final regtest run just in case https://github.com/spacetelescope/RegressionTests/actions/runs/13017040289

@emolter emolter requested review from braingram and tapastro January 28, 2025 18:38
Copy link
Collaborator
@braingram braingram left a comment

Choose a reason for hiding this comment

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

Configuration LGTM. The CI seems to have had a hiccup perhaps due to a network issue. Approved pending passing CI and regtests.

@emolter
Copy link
Collaborator Author
emolter commented Jan 28, 2025

@tapastro After some engdb hiccup, the unit and regression tests are all passing. Should I take your thumbs-up emotes as approval of my responses to your two remaining questions? If you approve this I'll go ahead and merge it now.

Copy link
Contributor
@tapastro tapastro left a comment

Choose a reason for hiding this comment

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

👍

Time to start the cleanup!

@tapastro tapastro merged commit d95188f into spacetelescope:main Jan 29, 2025
28 of 31 checks passed
@emolter emolter deleted the JP-3769-ami branch January 29, 2025 17:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Add more code style rules
5 participants
0