Skip to content
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

Add isort.order-by-type boolean setting #1607

Merged
merged 2 commits into from Jan 3, 2023

Conversation

mattoberle
Copy link
Contributor

The default isort behavior is order-by-type = true. When imports are ordered by type:

  1. CONSTANT_VARIABLES are first.
  2. CamelCaseClasses are second.
  3. everything_else is third.

When order-by-type = false imports are ordered alphabetically (case-insensitive).

eg.

order-by-type = false

import BAR
import bar
import FOO
import foo
import StringIO
from module import Apple, BASIC, Class, CONSTANT, function

order-by-type = true

import BAR
import bar
import FOO
import foo
import StringIO
from module import BASIC, CONSTANT, Apple, Class, function

This PR is what I could hobble together with my limited rust.
In particular, I couldn't get a default option value of true without impl Default for Settings and wasn't sure the best way to get member_key aware of the setting without quite a bit of argument passing.

Open to feedback on anything in the PR and if this is an isort feature that would have a home in ruff!

Copy link
Member

@charliermarsh charliermarsh left a comment

Choose a reason for hiding this comment

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

Seems reasonable to me! You'll need to run cargo +nightly dev generate-all to update the JSON schema, README, etc.

Thanks for getting involved!

@@ -99,9 +111,23 @@ impl Settings {
force_wrap_aliases: options.force_wrap_aliases.unwrap_or_default(),
known_first_party: BTreeSet::from_iter(options.known_first_party.unwrap_or_default()),
known_third_party: BTreeSet::from_iter(options.known_third_party.unwrap_or_default()),
order_by_type: options.order_by_type.unwrap_or_default(),
Copy link
Member

Choose a reason for hiding this comment

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

I think this should be options.order_by_type.unwrap_or(true). As-is, it will default to false.

@@ -18,9 +18,12 @@ pub fn module_key<'a>(
pub fn member_key<'a>(
name: &'a str,
asname: Option<&'a String>,
order_by_type: bool,
) -> (Prefix, String, Option<&'a String>) {
Copy link
Member

Choose a reason for hiding this comment

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

Hmm, maybe return (Option<Prefix>, ...), and then if !order_by_type { None } else if name.len() > 1 && string::is_upper(name) { Some(Prefix::Constants) } else if ...?

Copy link
Contributor Author

@mattoberle mattoberle Jan 3, 2023

Choose a reason for hiding this comment

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

Oops, it looks like there my branch was out-of-date, sorry about that!
Just rebased- member_key is gone and the responsibilities are split between cmp_members and prefix.

Copy link
Member

Choose a reason for hiding this comment

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

All good, I should've noticed too, I wrote that newer code 😂

The default `isort` behavior is `order-by-type = true`.
When imports are ordered by type:

1. `CONSTANT_VARIABLES` are first.
2. `CamelCaseClasses` are second.
3. `everything_else` is third.

- https://pycqa.github.io/isort/docs/configuration/options.html#order-by-type

When `order-by-type = false` imports are ordered alphabetically (case-insensitive).

eg.

`order-by-type = false`

```py
import BAR
import bar
import FOO
import foo
import StringIO
from module import Apple, BASIC, Class, CONSTANT, function
```

`order-by-type = true`

```py
import BAR
import bar
import FOO
import foo
import StringIO
from module import BASIC, CONSTANT, Apple, Class, function
```
Comment on lines +40 to +47
pub fn cmp_members(alias1: &AliasData, alias2: &AliasData, order_by_type: bool) -> Ordering {
if order_by_type {
prefix(alias1.name)
.cmp(&prefix(alias2.name))
.then_with(|| cmp_modules(alias1, alias2))
} else {
cmp_modules(alias1, alias2)
}
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Maybe a bit weird that order_by_type essentially turns this into a different existing function.
Is it better to select which function is used somewhere in mod.rs?

Copy link
Member

Choose a reason for hiding this comment

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

I think this is ok. The current setup is a bit confusing as-is anyway (mostly just the nomenclature isn't that clear), but I like that this at least encapsulates the member sorting in one place.

@charliermarsh charliermarsh merged commit 03275c9 into astral-sh:main Jan 3, 2023
@charliermarsh
Copy link
Member

Thanks for this! It's much appreciated. Hope you'll consider sticking around :)

renovate bot added a commit to ixm-one/pytest-cmake-presets that referenced this pull request Jan 4, 2023
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [ruff](https://togithub.com/charliermarsh/ruff) | `^0.0.209` ->
`^0.0.210` |
[![age](https://badges.renovateapi.com/packages/pypi/ruff/0.0.210/age-slim)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://badges.renovateapi.com/packages/pypi/ruff/0.0.210/adoption-slim)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://badges.renovateapi.com/packages/pypi/ruff/0.0.210/compatibility-slim/0.0.209)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://badges.renovateapi.com/packages/pypi/ruff/0.0.210/confidence-slim/0.0.209)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>charliermarsh/ruff</summary>

###
[`v0.0.210`](https://togithub.com/charliermarsh/ruff/releases/tag/v0.0.210)

[Compare
Source](https://togithub.com/charliermarsh/ruff/compare/v0.0.209...v0.0.210)

#### What's Changed

- Do not Change Quotation Style for `PT006` Autofix by
[@&#8203;saadmk11](https://togithub.com/saadmk11) in
[astral-sh/ruff#1600
- Implement autofix for `PT022` by
[@&#8203;harupy](https://togithub.com/harupy) in
[astral-sh/ruff#1604
- Add isort.order-by-type boolean setting by
[@&#8203;mattoberle](https://togithub.com/mattoberle) in
[astral-sh/ruff#1607
- Fix \*arg and \*\*kwarg handling for Google docstrings by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#1608
- Associate inline comments with parenthesized `ImportFrom` statements
by [@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#1609
- Fix leftover whitespace when removing `pass` for `PIE790` by
[@&#8203;edgarrmondragon](https://togithub.com/edgarrmondragon) in
[astral-sh/ruff#1612
- Treat .pyi files as **future** annotations-enabled by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#1616
- Treat convention as setting ignore, rather than select by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#1611
- Avoid byte-string conversions by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#1618
- Implement missing fixes for `PT006` by
[@&#8203;edgarrmondragon](https://togithub.com/edgarrmondragon) in
[astral-sh/ruff#1622
- Implement `yield`-to-`yield from` conversion by
[@&#8203;colin99d](https://togithub.com/colin99d) in
[astral-sh/ruff#1544
- Add some more users to the README by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#1623
- Check `SIM118` in comprehension by
[@&#8203;harupy](https://togithub.com/harupy) in
[astral-sh/ruff#1627

#### New Contributors

- [@&#8203;mattoberle](https://togithub.com/mattoberle) made their first
contribution in
[astral-sh/ruff#1607

**Full Changelog**:
astral-sh/ruff@v0.0.209...v0.0.210

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://app.renovatebot.com/dashboard#github/ixm-one/pytest-cmake-presets).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNC44MS4wIiwidXBkYXRlZEluVmVyIjoiMzQuODEuMCJ9-->

Signed-off-by: Renovate Bot <bot@renovateapp.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
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.

None yet

2 participants