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

Make __init__.py files creation optional #4470

Closed
wants to merge 2 commits into from

Conversation

mouadino
Copy link
Contributor

@mouadino mouadino commented Jan 17, 2018

Introduce a new attribute to py_binary and py_test to control whether to
create __init__.py or not.

Fixes bazelbuild/rules_python#55

TODO:

  • Sign CLA (waiting for my company input on how to proceed).
  • Test to see if my original reported issue is fixed with this change, especially how this works with https://github.com/bazelbuild/rules_python#importing-pip-dependencies.
  • Add automated tests, although I am not sure how to do it, any advice is much appreciated.
  • Understand why flipping the new flag doesn't create/delete __init__.py files, b/c currently running clean is required after flipping the flag.

@bazel-io
Copy link
Member

Can one of the admins verify this patch?

@googlebot
Copy link

Thanks for your pull request. It looks like this may be your first contribution to a Google open source project. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA).

📝 Please visit https://cla.developers.google.com/ to sign.

Once you've signed, please reply here (e.g. I signed it!) and we'll verify. Thanks.


  • If you've already signed a CLA, it's possible we don't have your GitHub username or you're using a different email address on your commit. Check your existing CLA data and verify that your email is set on your git commits.
  • If your company signed a CLA, they designated a Point of Contact who decides which employees are authorized to participate. You may need to contact the Point of Contact for your company and ask to be added to the group of authorized contributors. If you don't know who your Point of Contact is, direct the project maintainer to go/cla#troubleshoot. The email used to register you as an authorized contributor must be the email used for the Git commit.
  • In order to pass this check, please resolve this problem and have the pull request author add another comment and the bot will run again. If the bot doesn't comment, it means it doesn't think anything has changed.

@mouadino mouadino force-pushed the py-init-files-optional branch 2 times, most recently from 48cfa4b to ea3e8f7 Compare January 17, 2018 11:25
Controls whether to create __init__.py files in paths where they don't exists
or not, default is to true for backward compatibility and to support legacy behavior.
<!-- #END_BLAZE_RULE.ATTRIBUTE --> */
.add(attr("legacy_create_init", BOOLEAN).value(true))
Copy link
Contributor Author

@mouadino mouadino Jan 17, 2018

Choose a reason for hiding this comment

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

Please advise on the name of the attribute, I went with the legacy_ convention since I saw it used for some attributes but I am not sure if it's the right use case.

Copy link

Choose a reason for hiding this comment

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

I was wondering if this should be an enum or integer, in case we want more than two behaviors. But I can't think of any third thing we might do.

Can we call it legacy if we don't have a specific plan to switch everything to the new behavior? I'm ok with it, but if you wanted a different name, maybe implict_create_init_py?

You could expand the comment a bit to explain the legacy behavior:

Whether to implicitly create empty __init__.py files in the runfiles tree.
These are created in every directory containing Python source code or
shared libraries, and every parent directory of those directories.  
Default is true for backward compatibility.  If false, the user is responsible
for creating __init__.py files (empty or not) and adding them to `srcs` or `deps`
of Python targets as required.

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 like your description will adapt, concerning the attribute name IMHO we should drop the behavior in the future and that's how I understood it here bazelbuild/rules_python#55 (comment).

@mouadino
Copy link
Contributor Author

I signed it!

@googlebot
Copy link

CLAs look good, thanks!

@ulfjack
Copy link
Contributor

ulfjack commented Jan 26, 2018

Thanks for the patch! Code changes look good. Unfortunately, we haven't open sourced some of the py_* tests yet :-(, so it's not easy to write unit tests.

@lberki, what do you think?

@lberki
Copy link
Contributor

lberki commented Jan 26, 2018

/cc @scentini

(sorry for the late reply, this surfaced in my inbox after @ulfjack 's reply)

@ulfjack : do you think this is desirable functionality? There is clearly need for it, but our Python rules aren't very well shepherded at the moment and it's One More Knob. I'd say "anyways, here's Wonderwall^H the new attribute", but would like to have a second opinion.

@ulfjack
Copy link
Contributor

ulfjack commented Jan 26, 2018

See bazelbuild/rules_python#55 for context. This seems to be an issue for a number of users, and @duggelz said that the current behavior is legacy.

@lberki
Copy link
Contributor

lberki commented Jan 26, 2018

Let me just write an integration test which you can then extend....

@ulfjack
Copy link
Contributor

ulfjack commented Jan 26, 2018

How about open sourcing PyBinaryConfiguredTarget instead? Writing more integration tests will just make our presubmits run even more slowly. :-P

@lberki
Copy link
Contributor

lberki commented Jan 26, 2018

I looked at it and PyBinaryConfiguredTarget is mostly about testing Python/C++ interaction, which we don't have in the OSS version. Also, I'd much rather we have a test that actually tests how the runfiles tree looks like instead of checking some data structures that should result in a runfiles tree of a given shape.

I'm all for fast tests, but at the same time, we should have a few integration tests just to be sure.

@lberki
Copy link
Contributor

lberki commented Jan 26, 2018

FYI: Code review for the test sent out: https://bazel-review.googlesource.com/c/bazel/+/34750

Copy link

@duggelz duggelz left a comment

Choose a reason for hiding this comment

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

This is terrific.

Controls whether to create __init__.py files in paths where they don't exists
or not, default is to true for backward compatibility and to support legacy behavior.
<!-- #END_BLAZE_RULE.ATTRIBUTE --> */
.add(attr("legacy_create_init", BOOLEAN).value(true))
Copy link

Choose a reason for hiding this comment

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

I was wondering if this should be an enum or integer, in case we want more than two behaviors. But I can't think of any third thing we might do.

Can we call it legacy if we don't have a specific plan to switch everything to the new behavior? I'm ok with it, but if you wanted a different name, maybe implict_create_init_py?

You could expand the comment a bit to explain the legacy behavior:

Whether to implicitly create empty __init__.py files in the runfiles tree.
These are created in every directory containing Python source code or
shared libraries, and every parent directory of those directories.  
Default is true for backward compatibility.  If false, the user is responsible
for creating __init__.py files (empty or not) and adding them to `srcs` or `deps`
of Python targets as required.


if (ruleContext.attributes().get("legacy_create_init", Type.BOOLEAN)) {
builder.setEmptyFilesSupplier(PythonUtils.GET_INIT_PY_FILES);
}
Copy link

Choose a reason for hiding this comment

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

I'm a little dumbfounded that it's this simple. I guess that means the Bazel code is well structured.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Indeed it is, if I can do it then everyone can :)

@lberki
Copy link
Contributor

lberki commented Jan 30, 2018

Example integration test submitted: bb9f19d

@mouadino , can you add a test for this change in the spirit of said change?

@mouadino
Copy link
Contributor Author

@lberki Awesome, will try to adapt.

@mouadino
Copy link
Contributor Author

mouadino commented Feb 6, 2018

Just a small update, I didn't forget about this, it have been some busy two weeks with conferences and sickness, I will try to update it in the weekend, apologies for any issues that the delay may have caused.

@lberki
Copy link
Contributor

lberki commented Feb 7, 2018

No problem, looking forward to it!

mouadino and others added 2 commits February 10, 2018 19:09
Introduce a new attribute to py_binary and py_test to control whether to
create `__init__.py` or not.

Fixes bazelbuild/rules_python#55
Also address review comment concerning documentation.
@mouadino mouadino force-pushed the py-init-files-optional branch from ea3e8f7 to 1211395 Compare February 10, 2018 19:21
@mouadino
Copy link
Contributor Author

Automated tests added @lberki please have a look.

@lberki
Copy link
Contributor

lberki commented Feb 14, 2018

Erm, sorry for the late reply. Looks good, I'll merge this. Thanks for the patience!

@lberki
Copy link
Contributor

lberki commented Feb 14, 2018

/cc @scentini

Wait a moment... is it still the case that flipping the flag doesn't delete/add the __init__.py files? I'd be surprised if that was the case and it's not for you to fix in any case, but that sounds somewhat scary.

@mouadino
Copy link
Contributor Author

mouadino commented Feb 14, 2018 via email

@lberki
Copy link
Contributor

lberki commented Feb 14, 2018

The __init.py__ files in question are in the runfiles trees, which Bazel does know about. If those are not updated, that's a grave correctnes bug that should be looked into.

@bazel-io bazel-io closed this in 0f9c6ea Feb 14, 2018
@lberki
Copy link
Contributor

lberki commented Feb 14, 2018

Will be rolled back then resubmitted; this change breaks some tests.

bazel-io pushed a commit that referenced this pull request Feb 14, 2018
*** Reason for rollback ***

Breaks Kokoro and I accidentally submitted the change without presubmit checks.

*** Original change description ***

Make __init__.py files creation optional

Introduce a new attribute to py_binary and py_test to control whether to
create `__init__.py` or not.

Fixes bazelbuild/rules_python#55

Closes #4470.

PiperOrigin-RevId: 185676592
bazel-io pushed a commit that referenced this pull request Feb 15, 2018
*** Reason for rollback ***

Remove example changes; those need to build with the last Bazel release.

*** Original change description ***

Automated rollback of commit 0f9c6ea.

*** Reason for rollback ***

Breaks Kokoro and I accidentally submitted the change without presubmit checks.

*** Original change description ***

Make __init__.py files creation optional

Introduce a new attribute to py_binary and py_test to control whether to
create `__init__.py` or not.

Fixes bazelbuild/rules_python#55

Closes #4470.

PiperOrigin-RevId: 185806241
@mouadino
Copy link
Contributor Author

I am a bit lost, @lberki can you explain what's the status of the fix?

@lberki
Copy link
Contributor

lberki commented Feb 16, 2018

Erm, this is indeed confusing -- I merged your change, then had to roll it back, for it broke some tests and I accidentally submtited it without checking the tests, then rolled back the rollback after fixing the tests, so it should be now on HEAD. Its final version is e9c885a .

@brandjon
Copy link
Member

FTR I just tried to reproduce the incremental correctness issue where __init__.py is not being deleted after flipping the attribute value and rebuilding. It worked fine for me.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Bazel breaks python import with __init__.py
7 participants