-
-
Notifications
You must be signed in to change notification settings - Fork 267
Add isort third party detection from requirements.txt #629
Conversation
79df308
to
3f4d743
Compare
@yajo thanks for your review, I pushed a fixup with the updates. |
The current setup used in the OCA for isort is done by using 2 pre-commit hooks: 1. seed-isort-config: find third-party libs and updates the '.isort.cfg' file's "known_third_party" option with the list 2. isort: runs isort, which will use the list of third party libs provided by 'seed-isort-config' in the "known_third_party" option. This is an issue [0] with the workflow adopted by many contributors of the OCA: as the pull requests may need some time to be merged, we use temporary branches where we aggregate the various PRs. If several pull requests add a third party library, we'll have a conflict, and when the process of merging these pull requests is automated (e.g. with git-aggregator [1]), it becomes tedious. The list of libs in the "known_third_party" variable is not even editable manually, as "seed-isort-config" overwrite the value on every commit: it doesn't really make sense to actually store this. As pointed out by @sbidoul [2], isort mentions in their changelog: > Support for using requirements files to auto determine third-paty > section if pipreqs & requirementslib are installed. Which is the goal of this change, details: * Remove 'seed-isort-config' from pre-commit as the list of libs will be provided by requirements.txt * Replace the isort pre-commit repo by the official repo (the mirror says it is been deprecated in favor of the official repo) * Adds pipreqs and pip-api in additional dependencies to activate isort's feature to read requirements.txt [3] * Adds types: [python] in the pre-commit config: the mirror had it and the official repo doesn't. Without it, some files such as .pot are modified (different EOF). (it can be removed after the next isort release) * Add an union merge driver on 'requirements.txt' to resolve conflicts on this file (on conflicts, both lines are kept, which works in most cases on this file, in the rare case it's an issue because we have 2 requirements for different versions, we'll have to fix manually) Note: it is now important to have the Python libraries declared in "requirements.txt" to have them ordered in the proper place. At some point, this file could be automatically generated: [4]. Alternatively, we could have tried 'reorder-python-imports' in place of 'isort' [5]. This setup has been tested successfully on OCA/stock-logistics-warehouse#828 [0] OCA#625 [1] https://github.com/acsone/git-aggregator [2] OCA#625 (comment) [3] https://github.com/timothycrosley/isort/blob/500bafabbd51a6005c11a00c4738a2438990e48a/pyproject.toml#L42 [4] OCA/oca-github-bot#98 [5] https://github.com/asottile/reorder_python_imports Closes OCA#625
dcad340
to
7c98c8b
Compare
Squashed |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
👍
@guewen One issue I detected with this is that the usual Odoo dependencies (e.g. lxml, dateutil) are usually not declared in Ah well... nothing is simple. |
Do you have an example? |
For example, any addon that imports Putting dateutil in the manifest external deps does not help, because what lands in One way to mitigate this is to have the list of common dependencies in That would not automate it fully, as when a third party package has an import name different than it's distribution name, it would need to be added manually to I'm experimenting with that in OCA/mis-builder#260. BTW, I also wrote a small tool to generate |
OK I have another idea. If we know the isort docs say:
So if we add to default_section=THIRDPARTY We should be able to use isort exactly the same way without needing to seed it. No conflicts, same behavior. Could this be our missing silver bullet? |
This is a test implementation of the hypothesis explained in OCA/maintainer-quality-tools#629 (comment), which aims to avoid unnecessary and constant git conflicts in `.isort.cfg` file.
My hypothesis is confirmed, that's the path to go. See a real world scenario: OCA/product-attribute#582 |
Yes! Nice find @yajo |
So are we deploying this config in all repos together with the prettier-xml thing? |
@pedrobaeza That is what I intend to do yes, when #632 and #636 are cleared. |
OK, thanks. @yajo can you help in finishing both? |
hooks: | ||
- id: isort | ||
name: isort except __init__.py | ||
exclude: /__init__\.py$ | ||
# TODO, the next time we upgrade isort's rev, we should remove 'types' | ||
types: [python] | ||
additional_dependencies: ["pipreqs==0.4.10", "pip-api==0.0.13"] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is possibly not needed now.
@@ -9,4 +9,3 @@ line_length=88 | |||
known_odoo=odoo | |||
known_odoo_addons=odoo.addons | |||
sections=FUTURE,STDLIB,THIRDPARTY,ODOO,ODOO_ADDONS,FIRSTPARTY,LOCALFOLDER | |||
known_third_party= |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Missing the default section, see #629 (comment).
Yes, thanks folks! |
This is a test implementation of the hypothesis explained in OCA/maintainer-quality-tools#629 (comment), which aims to avoid unnecessary and constant git conflicts in `.isort.cfg` file.
This is a test implementation of the hypothesis explained in OCA/maintainer-quality-tools#629 (comment), which aims to avoid unnecessary and constant git conflicts in `.isort.cfg` file.
Hi, by looking around seem that now we use THIRDPARTY in stead of define own known_thirdparty, right? We got travis error in this PR OCA/server-tools#1684 as it need Where can I add it? Thanks! |
@kittiu the issue you are having in that PR is not related to this. |
The current setup used in the OCA for isort is done by using 2
pre-commit hooks:
'.isort.cfg' file's "known_third_party" option with the list
libs provided by 'seed-isort-config' in the "known_third_party" option.
This is an issue [0] with the workflow adopted by many contributors of
the OCA: as the pull requests may need some time to be merged, we use
temporary branches where we aggregate the various PRs.
If several pull requests add a third party library, we'll have a
conflict, and when the process of merging these pull requests is
automated (e.g. with git-aggregator [1]), it becomes tedious.
The list of libs in the "known_third_party" variable is not even
editable manually, as "seed-isort-config" overwrite the value on every
commit: it doesn't really make sense to actually store this.
As pointed out by @sbidoul [2], isort mentions in their changelog:
Which is the goal of this change, details:
provided by requirements.txt
it is been deprecated in favor of the official repo)
isort's feature to read requirements.txt [3]
the official repo doesn't. Without it, some files such as .pot are
modified (different EOF). (it can be removed after the next isort
release)
on this file (on conflicts, both lines are kept, which works in most
cases on this file, in the rare case it's an issue because we have
2 requirements for different versions, we'll have to fix manually)
Note: it is now important to have the Python libraries declared in
"requirements.txt" to have them ordered in the proper place.
Alternatively, we could have tried 'reorder-python-imports' in place of 'isort' [4].
This setup has been tested successfully on OCA/stock-logistics-warehouse#828
[0] #625
[1] https://github.com/acsone/git-aggregator
[2] #625 (comment)
[3] https://github.com/timothycrosley/isort/blob/500bafabbd51a6005c11a00c4738a2438990e48a/pyproject.toml#L42
[4] https://github.com/asottile/reorder_python_imports
Closes #625