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

pip_compile: remove external/workspace_name prefix from generated requirements.txt #690

Merged
merged 5 commits into from
Jun 21, 2022

Conversation

BoleynSu
Copy link
Contributor

@BoleynSu BoleynSu commented Apr 16, 2022

Fixes #689

PR Checklist

Please check if your PR fulfills the following requirements:

  • Tests for the changes have been added (for bug fixes / features)
  • Docs have been added / updated (for bug fixes / features)

PR Type

What kind of change does this PR introduce?

  • Bugfix
  • Feature (please, look at the "Scope of the project" section in the README.md file)
  • Code style update (formatting, local variables)
  • Refactoring (no functional changes, no api changes)
  • Build related changes
  • CI related changes
  • Documentation content changes
  • Other... Please describe:

What is the current behavior?

Issue Number: #689

What is the new behavior?

In the generated file via -r filename will be replaced with via -r -.

Does this PR introduce a breaking change?

  • Yes
  • No

The existing generated tests will fail and a regeneration is required.

Other information

@BoleynSu
Copy link
Contributor Author

The test is not added yet and I am expecting to break some existing ones.
I will fix them and add a new one once the PR is SGTMed.

@BoleynSu
Copy link
Contributor Author

Friendly ping.

@alexeagle
Copy link
Collaborator

I don't think this is really an improvement - these from lines are useful documentation to say where a requirement came from, and the user doesn't understand what stdin is in this case, it's hidden by Bazel.

Can we just fixup the external pathing before writing the file instead?

@alexeagle alexeagle self-assigned this Apr 22, 2022
@BoleynSu
Copy link
Contributor Author

BoleynSu commented Apr 23, 2022 via email

@BoleynSu BoleynSu force-pushed the fix689 branch 2 times, most recently from 7d86772 to 34fb449 Compare April 23, 2022 08:41
@BoleynSu BoleynSu changed the title pip_compile: use stdin instead of a filename pip_compile: remove external/workspace_name prefix from generated requirements.txt Apr 23, 2022
@BoleynSu
Copy link
Contributor Author

As a byproduct, this also allows |compile_pip_requirements| to comsume a generated requirements.in.
@alexeagle PTAL. I can add some tests after you think the PR is OK.

@BoleynSu BoleynSu marked this pull request as ready for review April 24, 2022 16:55
@f0rmiga
Copy link
Collaborator

f0rmiga commented May 3, 2022

@alexeagle Seems valid to me with proper tests. Anything else you want @BoleynSu to change?

@alexeagle
Copy link
Collaborator

Yup, seems like a targeted fix. Even a simple test by checking in a requirements file that currently has an external/ segment would help.

@BoleynSu
Copy link
Contributor Author

BoleynSu commented May 3, 2022

Cool. I will add some tests later. I have implemented something simliar to @unpinned_maven//:pin which depend on this fix. Maybe I can use that as a test here.

@BoleynSu
Copy link
Contributor Author

BoleynSu commented May 4, 2022

Hi @alexeagle and @f0rmiga, I have added the tests PTAL. Also I implemented something simliar to @unpinned_maven//:pin in the test. Would you mind also check if that can be part of the contributed repository rules?

@BoleynSu BoleynSu force-pushed the fix689 branch 3 times, most recently from e1549e9 to fc806a9 Compare May 4, 2022 20:07

PIP_PACKAGES = {"sphinx": "4.5.0"}

pip_deps(
Copy link
Collaborator

Choose a reason for hiding this comment

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

this was the intent of the pip_parse_vendored example introduced in 12662b6

could you just update that example instead of introducing another e2e test? They are kinda slow so it would be better not to accumulate more.

Also this doc 12662b6#diff-b92f94a67df862cde9714ff224afa676e39fe02da4fd4c6993daf684fbbc7cbdR182-R186 should maybe be updated?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

this was the intent of the pip_parse_vendored example introduced in 12662b6

The major issue with pip_parse_vendored and the approach used for golang is that the meta data is unknown to Bazel. With pip_deps, one can save all the metadata in a .bzl file so that the downstream can consume it, e.g., use it to resolve diamond dependency.

I did something similar with golang dependencies at https://github.com/BoleynSu-Org/monorepo/blob/main/configs/deps/go_deps.bzl.

could you just update that example instead of introducing another e2e test? They are kinda slow so it would be better not to accumulate more.

Sure, I think I can merge it into another e2e test.

Also this doc 12662b6#diff-b92f94a67df862cde9714ff224afa676e39fe02da4fd4c6993daf684fbbc7cbdR182-R186 should maybe be updated?

@@ -36,5 +36,6 @@ platforms:
- "-//gazelle/..."
# The dependencies needed for this test are not cross-platform: https://github.com/bazelbuild/rules_python/issues/260
- "-//tests:pip_repository_entry_points_example"
- "-//tests:pip_deps_example"
Copy link
Collaborator

Choose a reason for hiding this comment

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

why doesn't it work on Windows?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I am not sure. I guessed it was because bazel_integration_test did not work well on Windows, which is likely wrong.

The error is caused by os.chdir("external\\unpinned_pip") reporting no such directory. I do not have a Windows machine to debug it at the moment. Would you mind take a look if possible?

python/pip_install/pip_compile.py Show resolved Hide resolved
python_interpreter_target = None,
**kwargs):
_requirements_in(
name = "unpinned_" + name,
Copy link
Collaborator

Choose a reason for hiding this comment

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

I think the term "unpinned" may be inaccurate here. I'm not sure how it compares with rules_jvm_external, but here, the existing locked requirements file is still an input to pip-compile, so any already-pinned transitive dependencies will remain pinned to the same version. Only versions which no longer satisfy the constraints in requirements.in will actually change.

If the behavior is different from rules_jvm_external, then maybe another name would be better?

Copy link
Contributor Author

@BoleynSu BoleynSu May 5, 2022

Choose a reason for hiding this comment

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

I think the term "unpinned" may be inaccurate here. I'm not sure how it compares with rules_jvm_external, but here, the existing locked requirements file is still an input to pip-compile, so any already-pinned transitive dependencies will remain pinned to the same version. Only versions which no longer satisfy the constraints in requirements.in will actually change.

The input to _requirements_in is packages and output is a requirements.in file. None of them have anything to do with the locked requirements file.

If the behavior is different from rules_jvm_external, then maybe another name would be better?

Copy link
Collaborator

Choose a reason for hiding this comment

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

There's a requirements_lock attribute here that gets passed to pip_compile. Am I missing something?

Copy link
Contributor Author

@BoleynSu BoleynSu May 5, 2022

Choose a reason for hiding this comment

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

I see. Yes, the locked requirements file is also part of the input.

It seems that [1] we can pass --upgrade to achive this. It only read the locked file when there is no --upgrade. I am also wondering why --upgrade is not passed already? I think people are expecting this. We would better document it somewhere.

Also, in my usecase the requirements.txt is always generated so I did not ever notice it.

[1] https://github.com/jazzband/pip-tools/blob/master/piptools/scripts/compile.py#L352

tests/pip_deps/pip_deps.bzl Show resolved Hide resolved
@BoleynSu
Copy link
Contributor Author

BoleynSu commented May 5, 2022

Hi @alexeagle, I will remove pip_deps for now and add the test to existing an e2e test. I will propose another PR regarding pip_deps if you think it is worth the effort. If so, maybe we can first decide a better name for it.

@BoleynSu
Copy link
Contributor Author

BoleynSu commented May 8, 2022

Copy link
Collaborator

@alexeagle alexeagle left a comment

Choose a reason for hiding this comment

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

Thanks! sorry this got stalled for so long.

@alexeagle
Copy link
Collaborator

I'll get this in so that #689 can be fixed.

@alexeagle alexeagle merged commit aef17ad into bazelbuild:main Jun 21, 2022
mattem pushed a commit to mattem/rules_python that referenced this pull request Jul 7, 2022
…uirements.txt (bazelbuild#690)

* pip_compile: remove external/workspace_name prefix from generated requirements.txt

* add some tests and a demo impl of pip_deps

* update pinned requirement

Co-authored-by: Alex Eagle <alex@aspect.dev>
alexeagle added a commit that referenced this pull request Aug 17, 2022
alexeagle added a commit that referenced this pull request Aug 17, 2022
alexeagle added a commit that referenced this pull request Aug 17, 2022
alexeagle added a commit that referenced this pull request Aug 17, 2022
alexeagle added a commit that referenced this pull request Aug 18, 2022
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.

the test created by compile_pip_requirements will fail when run as an external dependency
3 participants