From 725e2a8da8c915aa902e32884b01aaa1625ceafa Mon Sep 17 00:00:00 2001 From: chrysle Date: Wed, 29 Nov 2023 16:07:14 +0100 Subject: [PATCH 1/5] Migrate examples to `src-layout` --- native/pkg_a/setup.py | 5 +++-- native/pkg_a/{ => src}/example_pkg/a/__init__.py | 0 native/pkg_b/setup.py | 5 +++-- native/pkg_b/{ => src}/example_pkg/b/__init__.py | 0 pkg_resources/pkg_a/setup.py | 3 ++- pkg_resources/pkg_a/{ => src}/example_pkg/__init__.py | 0 pkg_resources/pkg_a/{ => src}/example_pkg/a/__init__.py | 0 pkg_resources/pkg_b/setup.py | 3 ++- pkg_resources/pkg_b/{ => src}/example_pkg/__init__.py | 0 pkg_resources/pkg_b/{ => src}/example_pkg/b/__init__.py | 0 pkgutil/pkg_a/setup.py | 3 ++- pkgutil/pkg_a/{ => src}/example_pkg/__init__.py | 0 pkgutil/pkg_a/{ => src}/example_pkg/a/__init__.py | 0 pkgutil/pkg_b/setup.py | 3 ++- pkgutil/pkg_b/{ => src}/example_pkg/__init__.py | 0 pkgutil/pkg_b/{ => src}/example_pkg/b/__init__.py | 0 16 files changed, 14 insertions(+), 8 deletions(-) rename native/pkg_a/{ => src}/example_pkg/a/__init__.py (100%) rename native/pkg_b/{ => src}/example_pkg/b/__init__.py (100%) rename pkg_resources/pkg_a/{ => src}/example_pkg/__init__.py (100%) rename pkg_resources/pkg_a/{ => src}/example_pkg/a/__init__.py (100%) rename pkg_resources/pkg_b/{ => src}/example_pkg/__init__.py (100%) rename pkg_resources/pkg_b/{ => src}/example_pkg/b/__init__.py (100%) rename pkgutil/pkg_a/{ => src}/example_pkg/__init__.py (100%) rename pkgutil/pkg_a/{ => src}/example_pkg/a/__init__.py (100%) rename pkgutil/pkg_b/{ => src}/example_pkg/__init__.py (100%) rename pkgutil/pkg_b/{ => src}/example_pkg/b/__init__.py (100%) diff --git a/native/pkg_a/setup.py b/native/pkg_a/setup.py index 8021a7a..ed4090f 100644 --- a/native/pkg_a/setup.py +++ b/native/pkg_a/setup.py @@ -27,7 +27,8 @@ author_email='jonwayne@google.com', license='Apache Software License', - - packages=['example_pkg.a'], + # This example uses automatic discovery. You can also implement custom discovery like this: + # packages=find_namespace_packages(where='src', include=['example_pkg.a']), + # package_dir={'': 'src'}, zip_safe=False, ) diff --git a/native/pkg_a/example_pkg/a/__init__.py b/native/pkg_a/src/example_pkg/a/__init__.py similarity index 100% rename from native/pkg_a/example_pkg/a/__init__.py rename to native/pkg_a/src/example_pkg/a/__init__.py diff --git a/native/pkg_b/setup.py b/native/pkg_b/setup.py index 872122a..5072cff 100644 --- a/native/pkg_b/setup.py +++ b/native/pkg_b/setup.py @@ -27,7 +27,8 @@ author_email='jonwayne@google.com', license='Apache Software License', - - packages=['example_pkg.b'], + # This example uses automatic discovery. You can also implement custom discovery like this: + # packages=find_namespace_packages(where='src', include=['example_pkg.b']), + # package_dir={'': 'src'}, zip_safe=False, ) diff --git a/native/pkg_b/example_pkg/b/__init__.py b/native/pkg_b/src/example_pkg/b/__init__.py similarity index 100% rename from native/pkg_b/example_pkg/b/__init__.py rename to native/pkg_b/src/example_pkg/b/__init__.py diff --git a/pkg_resources/pkg_a/setup.py b/pkg_resources/pkg_a/setup.py index 1cd580c..b7c68a5 100644 --- a/pkg_resources/pkg_a/setup.py +++ b/pkg_resources/pkg_a/setup.py @@ -28,7 +28,8 @@ license='Apache Software License', - packages=find_packages(), + packages=find_packages(where='src'), namespace_packages=['example_pkg'], + package_dir={'': 'src'}, zip_safe=False, ) diff --git a/pkg_resources/pkg_a/example_pkg/__init__.py b/pkg_resources/pkg_a/src/example_pkg/__init__.py similarity index 100% rename from pkg_resources/pkg_a/example_pkg/__init__.py rename to pkg_resources/pkg_a/src/example_pkg/__init__.py diff --git a/pkg_resources/pkg_a/example_pkg/a/__init__.py b/pkg_resources/pkg_a/src/example_pkg/a/__init__.py similarity index 100% rename from pkg_resources/pkg_a/example_pkg/a/__init__.py rename to pkg_resources/pkg_a/src/example_pkg/a/__init__.py diff --git a/pkg_resources/pkg_b/setup.py b/pkg_resources/pkg_b/setup.py index 03444e1..c163459 100644 --- a/pkg_resources/pkg_b/setup.py +++ b/pkg_resources/pkg_b/setup.py @@ -28,7 +28,8 @@ license='Apache Software License', - packages=find_packages(), + packages=find_packages(where='src'), namespace_packages=['example_pkg'], + package_dir={'': 'src'}, zip_safe=False, ) diff --git a/pkg_resources/pkg_b/example_pkg/__init__.py b/pkg_resources/pkg_b/src/example_pkg/__init__.py similarity index 100% rename from pkg_resources/pkg_b/example_pkg/__init__.py rename to pkg_resources/pkg_b/src/example_pkg/__init__.py diff --git a/pkg_resources/pkg_b/example_pkg/b/__init__.py b/pkg_resources/pkg_b/src/example_pkg/b/__init__.py similarity index 100% rename from pkg_resources/pkg_b/example_pkg/b/__init__.py rename to pkg_resources/pkg_b/src/example_pkg/b/__init__.py diff --git a/pkgutil/pkg_a/setup.py b/pkgutil/pkg_a/setup.py index 27b9352..e846c84 100644 --- a/pkgutil/pkg_a/setup.py +++ b/pkgutil/pkg_a/setup.py @@ -28,6 +28,7 @@ license='Apache Software License', - packages=find_packages(), + packages=find_packages(where='src'), + package_dir={'': 'src'}, zip_safe=False, ) diff --git a/pkgutil/pkg_a/example_pkg/__init__.py b/pkgutil/pkg_a/src/example_pkg/__init__.py similarity index 100% rename from pkgutil/pkg_a/example_pkg/__init__.py rename to pkgutil/pkg_a/src/example_pkg/__init__.py diff --git a/pkgutil/pkg_a/example_pkg/a/__init__.py b/pkgutil/pkg_a/src/example_pkg/a/__init__.py similarity index 100% rename from pkgutil/pkg_a/example_pkg/a/__init__.py rename to pkgutil/pkg_a/src/example_pkg/a/__init__.py diff --git a/pkgutil/pkg_b/setup.py b/pkgutil/pkg_b/setup.py index 88d3397..3340df5 100644 --- a/pkgutil/pkg_b/setup.py +++ b/pkgutil/pkg_b/setup.py @@ -28,6 +28,7 @@ license='Apache Software License', - packages=find_packages(), + packages=find_packages(where='src'), + package_dir={'': 'src'}, zip_safe=False, ) diff --git a/pkgutil/pkg_b/example_pkg/__init__.py b/pkgutil/pkg_b/src/example_pkg/__init__.py similarity index 100% rename from pkgutil/pkg_b/example_pkg/__init__.py rename to pkgutil/pkg_b/src/example_pkg/__init__.py diff --git a/pkgutil/pkg_b/example_pkg/b/__init__.py b/pkgutil/pkg_b/src/example_pkg/b/__init__.py similarity index 100% rename from pkgutil/pkg_b/example_pkg/b/__init__.py rename to pkgutil/pkg_b/src/example_pkg/b/__init__.py From a86090aad02985d9b00d66ef05464ad74c8afddb Mon Sep 17 00:00:00 2001 From: chrysle Date: Thu, 18 Apr 2024 18:37:19 +0200 Subject: [PATCH 2/5] Add .gitattributes --- .gitattributes | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..65ff28f --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +**/**/**/**/setup.py merge=ours +table.md merge=ours From 47d2410800cf2e7439ae2a0f7480b327f1ed2e36 Mon Sep 17 00:00:00 2001 From: chrysle Date: Wed, 29 Nov 2023 17:24:08 +0100 Subject: [PATCH 3/5] Amendments to the testing workflow --- noxfile.py | 6 ++++-- requirements.txt | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/noxfile.py b/noxfile.py index 5163b8d..1d094b8 100644 --- a/noxfile.py +++ b/noxfile.py @@ -25,8 +25,10 @@ USE_PYTHON_VERSIONS = USE_PYTHON_VERSIONS_DEFAULT -install_commands = (("pip", "install", "."), ("pip", "install", "-e", ".")) - +install_commands = ( + ('pip', 'install', '.'), + ('pip', 'install', '-e', '.') +) def install_packages(session, package_a, package_b, command_a, command_b): env = {**os.environ, "PIP_CONSTRAINT": f"{HERE}/constraints.txt"} diff --git a/requirements.txt b/requirements.txt index 0aa810d..426c1ca 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,5 @@ # -- PYTHON PACKAGE REQUIREMENTS: # USE: pip install -r +setuptools >= 68.2.2 nox >= 2023.04.22 From b042b0b1d7c879418ab9a3aa4a7716e293abd207 Mon Sep 17 00:00:00 2001 From: chrysle Date: Thu, 18 Apr 2024 20:05:13 +0200 Subject: [PATCH 4/5] Update `table.md` --- noxfile.py | 4 ++-- table.md | 24 ++++++++++++------------ 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/noxfile.py b/noxfile.py index 1d094b8..b4ec5ec 100644 --- a/noxfile.py +++ b/noxfile.py @@ -34,11 +34,11 @@ def install_packages(session, package_a, package_b, command_a, command_b): env = {**os.environ, "PIP_CONSTRAINT": f"{HERE}/constraints.txt"} session.install("--upgrade", "pip", env=env) session.chdir(package_a) - session.run("rm", "-rf", "dist", "build", "*.egg-info") + session.run("rm", "-rf", "dist", "build", "*.egg-info", external=True) session.run(*command_a, env=env) session.chdir(HERE) session.chdir(package_b) - session.run("rm", "-rf", "dist", "build", "*.egg-info") + session.run("rm", "-rf", "dist", "build", "*.egg-info", external=True) session.run(*command_b, env=env) session.chdir(HERE) diff --git a/table.md b/table.md index 0804c45..4bac6c5 100644 --- a/table.md +++ b/table.md @@ -37,17 +37,17 @@ | pep420 | python3.12 | pip install -e . | pip install . | ✅ | | pep420 | python3.12 | pip install -e . | pip install -e . | ✅ | | cross_pkg_resources_pkgutil | python3.8 | pip install . | pip install . | ✅ | -| cross_pkg_resources_pkgutil | python3.8 | pip install . | pip install -e . | ✅ | +| cross_pkg_resources_pkgutil | python3.8 | pip install . | pip install -e . | ❌ | | cross_pkg_resources_pkgutil | python3.8 | pip install -e . | pip install . | ❌ | -| cross_pkg_resources_pkgutil | python3.8 | pip install -e . | pip install -e . | ✅ | +| cross_pkg_resources_pkgutil | python3.8 | pip install -e . | pip install -e . | ❌ | | cross_pkg_resources_pkgutil | python3.10 | pip install . | pip install . | ✅ | -| cross_pkg_resources_pkgutil | python3.10 | pip install . | pip install -e . | ✅ | +| cross_pkg_resources_pkgutil | python3.10 | pip install . | pip install -e . | ❌ | | cross_pkg_resources_pkgutil | python3.10 | pip install -e . | pip install . | ❌ | -| cross_pkg_resources_pkgutil | python3.10 | pip install -e . | pip install -e . | ✅ | +| cross_pkg_resources_pkgutil | python3.10 | pip install -e . | pip install -e . | ❌ | | cross_pkg_resources_pkgutil | python3.12 | pip install . | pip install . | ✅ | -| cross_pkg_resources_pkgutil | python3.12 | pip install . | pip install -e . | ✅ | +| cross_pkg_resources_pkgutil | python3.12 | pip install . | pip install -e . | ❌ | | cross_pkg_resources_pkgutil | python3.12 | pip install -e . | pip install . | ❌ | -| cross_pkg_resources_pkgutil | python3.12 | pip install -e . | pip install -e . | ✅ | +| cross_pkg_resources_pkgutil | python3.12 | pip install -e . | pip install -e . | ❌ | | cross_pep420_pkgutil | python3.8 | pip install . | pip install . | ✅ | | cross_pep420_pkgutil | python3.8 | pip install . | pip install -e . | ✅ | | cross_pep420_pkgutil | python3.8 | pip install -e . | pip install . | ✅ | @@ -63,24 +63,24 @@ | cross_pep420_pkg_resources | python3.8 | pip install . | pip install . | ✅ | | cross_pep420_pkg_resources | python3.8 | pip install . | pip install -e . | ❌ | | cross_pep420_pkg_resources | python3.8 | pip install -e . | pip install . | ✅ | -| cross_pep420_pkg_resources | python3.8 | pip install -e . | pip install -e . | ✅ | +| cross_pep420_pkg_resources | python3.8 | pip install -e . | pip install -e . | ❌ | | cross_pep420_pkg_resources | python3.10 | pip install . | pip install . | ✅ | | cross_pep420_pkg_resources | python3.10 | pip install . | pip install -e . | ❌ | | cross_pep420_pkg_resources | python3.10 | pip install -e . | pip install . | ✅ | -| cross_pep420_pkg_resources | python3.10 | pip install -e . | pip install -e . | ✅ | +| cross_pep420_pkg_resources | python3.10 | pip install -e . | pip install -e . | ❌ | | cross_pep420_pkg_resources | python3.12 | pip install . | pip install . | ✅ | | cross_pep420_pkg_resources | python3.12 | pip install . | pip install -e . | ❌ | | cross_pep420_pkg_resources | python3.12 | pip install -e . | pip install . | ✅ | -| cross_pep420_pkg_resources | python3.12 | pip install -e . | pip install -e . | ✅ | +| cross_pep420_pkg_resources | python3.12 | pip install -e . | pip install -e . | ❌ | | cross_pkg_resources_pep420 | python3.8 | pip install . | pip install . | ✅ | | cross_pkg_resources_pep420 | python3.8 | pip install . | pip install -e . | ✅ | | cross_pkg_resources_pep420 | python3.8 | pip install -e . | pip install . | ❌ | -| cross_pkg_resources_pep420 | python3.8 | pip install -e . | pip install -e . | ✅ | +| cross_pkg_resources_pep420 | python3.8 | pip install -e . | pip install -e . | ❌ | | cross_pkg_resources_pep420 | python3.10 | pip install . | pip install . | ✅ | | cross_pkg_resources_pep420 | python3.10 | pip install . | pip install -e . | ✅ | | cross_pkg_resources_pep420 | python3.10 | pip install -e . | pip install . | ❌ | -| cross_pkg_resources_pep420 | python3.10 | pip install -e . | pip install -e . | ✅ | +| cross_pkg_resources_pep420 | python3.10 | pip install -e . | pip install -e . | ❌ | | cross_pkg_resources_pep420 | python3.12 | pip install . | pip install . | ✅ | | cross_pkg_resources_pep420 | python3.12 | pip install . | pip install -e . | ✅ | | cross_pkg_resources_pep420 | python3.12 | pip install -e . | pip install . | ❌ | -| cross_pkg_resources_pep420 | python3.12 | pip install -e . | pip install -e . | ✅ | +| cross_pkg_resources_pep420 | python3.12 | pip install -e . | pip install -e . | ❌ | From 8bfa3730b5fb8e8de2b12fccb82091ffe1407c2d Mon Sep 17 00:00:00 2001 From: chrysle Date: Thu, 18 Apr 2024 22:05:55 +0200 Subject: [PATCH 5/5] Remove `legacy_table.md` and fix .gitattributes --- .gitattributes | 3 +- README.md | 6 +- legacy_table.md | 162 ------------------------------------------------ 3 files changed, 5 insertions(+), 166 deletions(-) delete mode 100644 legacy_table.md diff --git a/.gitattributes b/.gitattributes index 65ff28f..11c7862 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1,3 @@ -**/**/**/**/setup.py merge=ours +**/**/setup.py merge=ours +**/**/pyproject.toml merge=ours table.md merge=ours diff --git a/README.md b/README.md index 4ffda8f..3cc07d3 100644 --- a/README.md +++ b/README.md @@ -44,8 +44,8 @@ However, developers might be interested in carrying out a *staggered migration* to mitigate the migration effort and spread the work load in time. Based on the results for the scenarios mixing `pkg_resources` and other namespace methods reported in -[table.md](table.md) and [legacy_table.md](legacy_table.md), -we can see that (in principle) a staggered migration plan can be successful, +[table.md](table.md) and [legacy_table.md](https://github.com/pypa/sample-namespace-packages/blob/master/legacy_table.md) +(only available for flat layout), we can see that (in principle) a staggered migration plan can be successful, as long as the developers are willing to accept some limitations: - Deprecated installation methods will not be supported (e.g. `python setup.py install`), @@ -57,4 +57,4 @@ specific use cases they are interested in supporting. [^1]: If you would like to know about deprecated installation methods (e.g. via - `python setup.py install`) or Python 2.7, please have a look at [legacy_table.md](legacy_table.md). + `python setup.py install`) or Python 2.7 for the flat layout, please have a look at [legacy_table.md](https://github.com/pypa/sample-namespace-packages/blob/master/legacy_table.md). diff --git a/legacy_table.md b/legacy_table.md deleted file mode 100644 index ba466ae..0000000 --- a/legacy_table.md +++ /dev/null @@ -1,162 +0,0 @@ -| Type | Interpreter | Package A command | Package B command | Status | -| --- | --- | --- | --- | --- | -| pkgutil | python2.7 | pip install . | pip install . | ✅ | -| pkgutil | python2.7 | pip install . | pip install -e . | ✅ | -| pkgutil | python2.7 | pip install . | python setup.py install | ✅ | -| pkgutil | python2.7 | pip install . | python setup.py develop | ✅ | -| pkgutil | python2.7 | pip install -e . | pip install . | ✅ | -| pkgutil | python2.7 | pip install -e . | pip install -e . | ✅ | -| pkgutil | python2.7 | pip install -e . | python setup.py install | ✅ | -| pkgutil | python2.7 | pip install -e . | python setup.py develop | ✅ | -| pkgutil | python2.7 | python setup.py install | pip install . | ✅ | -| pkgutil | python2.7 | python setup.py install | pip install -e . | ✅ | -| pkgutil | python2.7 | python setup.py install | python setup.py install | ✅ | -| pkgutil | python2.7 | python setup.py install | python setup.py develop | ✅ | -| pkgutil | python2.7 | python setup.py develop | pip install . | ✅ | -| pkgutil | python2.7 | python setup.py develop | pip install -e . | ✅ | -| pkgutil | python2.7 | python setup.py develop | python setup.py install | ✅ | -| pkgutil | python2.7 | python setup.py develop | python setup.py develop | ✅ | -| pkgutil | python3.7 | pip install . | pip install . | ✅ | -| pkgutil | python3.7 | pip install . | pip install -e . | ✅ | -| pkgutil | python3.7 | pip install . | python setup.py install | ✅ | -| pkgutil | python3.7 | pip install . | python setup.py develop | ✅ | -| pkgutil | python3.7 | pip install -e . | pip install . | ✅ | -| pkgutil | python3.7 | pip install -e . | pip install -e . | ✅ | -| pkgutil | python3.7 | pip install -e . | python setup.py install | ✅ | -| pkgutil | python3.7 | pip install -e . | python setup.py develop | ✅ | -| pkgutil | python3.7 | python setup.py install | pip install . | ✅ | -| pkgutil | python3.7 | python setup.py install | pip install -e . | ✅ | -| pkgutil | python3.7 | python setup.py install | python setup.py install | ✅ | -| pkgutil | python3.7 | python setup.py install | python setup.py develop | ✅ | -| pkgutil | python3.7 | python setup.py develop | pip install . | ✅ | -| pkgutil | python3.7 | python setup.py develop | pip install -e . | ✅ | -| pkgutil | python3.7 | python setup.py develop | python setup.py install | ✅ | -| pkgutil | python3.7 | python setup.py develop | python setup.py develop | ✅ | -| pkg_resources | python2.7 | pip install . | pip install . | ✅ | -| pkg_resources | python2.7 | pip install . | pip install -e . | ✅ | -| pkg_resources | python2.7 | pip install . | python setup.py install | ❌ | -| pkg_resources | python2.7 | pip install . | python setup.py develop | ✅ | -| pkg_resources | python2.7 | pip install -e . | pip install . | ✅ | -| pkg_resources | python2.7 | pip install -e . | pip install -e . | ✅ | -| pkg_resources | python2.7 | pip install -e . | python setup.py install | ❌ | -| pkg_resources | python2.7 | pip install -e . | python setup.py develop | ✅ | -| pkg_resources | python2.7 | python setup.py install | pip install . | ❌ | -| pkg_resources | python2.7 | python setup.py install | pip install -e . | ❌ | -| pkg_resources | python2.7 | python setup.py install | python setup.py install | ✅ | -| pkg_resources | python2.7 | python setup.py install | python setup.py develop | ❌ | -| pkg_resources | python2.7 | python setup.py develop | pip install . | ✅ | -| pkg_resources | python2.7 | python setup.py develop | pip install -e . | ✅ | -| pkg_resources | python2.7 | python setup.py develop | python setup.py install | ❌ | -| pkg_resources | python2.7 | python setup.py develop | python setup.py develop | ✅ | -| pkg_resources | python3.7 | pip install . | pip install . | ✅ | -| pkg_resources | python3.7 | pip install . | pip install -e . | ✅ | -| pkg_resources | python3.7 | pip install . | python setup.py install | ❌ | -| pkg_resources | python3.7 | pip install . | python setup.py develop | ✅ | -| pkg_resources | python3.7 | pip install -e . | pip install . | ✅ | -| pkg_resources | python3.7 | pip install -e . | pip install -e . | ✅ | -| pkg_resources | python3.7 | pip install -e . | python setup.py install | ❌ | -| pkg_resources | python3.7 | pip install -e . | python setup.py develop | ✅ | -| pkg_resources | python3.7 | python setup.py install | pip install . | ❌ | -| pkg_resources | python3.7 | python setup.py install | pip install -e . | ❌ | -| pkg_resources | python3.7 | python setup.py install | python setup.py install | ✅ | -| pkg_resources | python3.7 | python setup.py install | python setup.py develop | ❌ | -| pkg_resources | python3.7 | python setup.py develop | pip install . | ✅ | -| pkg_resources | python3.7 | python setup.py develop | pip install -e . | ✅ | -| pkg_resources | python3.7 | python setup.py develop | python setup.py install | ❌ | -| pkg_resources | python3.7 | python setup.py develop | python setup.py develop | ✅ | -| pep420 | python2.7 | pip install . | pip install . | ❌ | -| pep420 | python2.7 | pip install . | pip install -e . | ❌ | -| pep420 | python2.7 | pip install . | python setup.py install | ❌ | -| pep420 | python2.7 | pip install . | python setup.py develop | ❌ | -| pep420 | python2.7 | pip install -e . | pip install . | ❌ | -| pep420 | python2.7 | pip install -e . | pip install -e . | ❌ | -| pep420 | python2.7 | pip install -e . | python setup.py install | ❌ | -| pep420 | python2.7 | pip install -e . | python setup.py develop | ❌ | -| pep420 | python2.7 | python setup.py install | pip install . | ❌ | -| pep420 | python2.7 | python setup.py install | pip install -e . | ❌ | -| pep420 | python2.7 | python setup.py install | python setup.py install | ❌ | -| pep420 | python2.7 | python setup.py install | python setup.py develop | ❌ | -| pep420 | python2.7 | python setup.py develop | pip install . | ❌ | -| pep420 | python2.7 | python setup.py develop | pip install -e . | ❌ | -| pep420 | python2.7 | python setup.py develop | python setup.py install | ❌ | -| pep420 | python2.7 | python setup.py develop | python setup.py develop | ❌ | -| pep420 | python3.7 | pip install . | pip install . | ✅ | -| pep420 | python3.7 | pip install . | pip install -e . | ✅ | -| pep420 | python3.7 | pip install . | python setup.py install | ✅ | -| pep420 | python3.7 | pip install . | python setup.py develop | ✅ | -| pep420 | python3.7 | pip install -e . | pip install . | ✅ | -| pep420 | python3.7 | pip install -e . | pip install -e . | ✅ | -| pep420 | python3.7 | pip install -e . | python setup.py install | ✅ | -| pep420 | python3.7 | pip install -e . | python setup.py develop | ✅ | -| pep420 | python3.7 | python setup.py install | pip install . | ✅ | -| pep420 | python3.7 | python setup.py install | pip install -e . | ✅ | -| pep420 | python3.7 | python setup.py install | python setup.py install | ✅ | -| pep420 | python3.7 | python setup.py install | python setup.py develop | ✅ | -| pep420 | python3.7 | python setup.py develop | pip install . | ✅ | -| pep420 | python3.7 | python setup.py develop | pip install -e . | ✅ | -| pep420 | python3.7 | python setup.py develop | python setup.py install | ✅ | -| pep420 | python3.7 | python setup.py develop | python setup.py develop | ✅ | -| cross_pkg_resources_pkgutil | python2.7 | pip install . | pip install . | ✅ | -| cross_pkg_resources_pkgutil | python2.7 | pip install . | pip install -e . | ❌ | -| cross_pkg_resources_pkgutil | python2.7 | pip install . | python setup.py install | ❌ | -| cross_pkg_resources_pkgutil | python2.7 | pip install . | python setup.py develop | ❌ | -| cross_pkg_resources_pkgutil | python2.7 | pip install -e . | pip install . | ❌ | -| cross_pkg_resources_pkgutil | python2.7 | pip install -e . | pip install -e . | ❌ | -| cross_pkg_resources_pkgutil | python2.7 | pip install -e . | python setup.py install | ❌ | -| cross_pkg_resources_pkgutil | python2.7 | pip install -e . | python setup.py develop | ❌ | -| cross_pkg_resources_pkgutil | python2.7 | python setup.py install | pip install . | ✅ | -| cross_pkg_resources_pkgutil | python2.7 | python setup.py install | pip install -e . | ✅ | -| cross_pkg_resources_pkgutil | python2.7 | python setup.py install | python setup.py install | ✅ | -| cross_pkg_resources_pkgutil | python2.7 | python setup.py install | python setup.py develop | ✅ | -| cross_pkg_resources_pkgutil | python2.7 | python setup.py develop | pip install . | ❌ | -| cross_pkg_resources_pkgutil | python2.7 | python setup.py develop | pip install -e . | ❌ | -| cross_pkg_resources_pkgutil | python2.7 | python setup.py develop | python setup.py install | ❌ | -| cross_pkg_resources_pkgutil | python2.7 | python setup.py develop | python setup.py develop | ❌ | -| cross_pkg_resources_pkgutil | python3.7 | pip install . | pip install . | ✅ | -| cross_pkg_resources_pkgutil | python3.7 | pip install . | pip install -e . | ❌ | -| cross_pkg_resources_pkgutil | python3.7 | pip install . | python setup.py install | ❌ | -| cross_pkg_resources_pkgutil | python3.7 | pip install . | python setup.py develop | ❌ | -| cross_pkg_resources_pkgutil | python3.7 | pip install -e . | pip install . | ❌ | -| cross_pkg_resources_pkgutil | python3.7 | pip install -e . | pip install -e . | ❌ | -| cross_pkg_resources_pkgutil | python3.7 | pip install -e . | python setup.py install | ❌ | -| cross_pkg_resources_pkgutil | python3.7 | pip install -e . | python setup.py develop | ❌ | -| cross_pkg_resources_pkgutil | python3.7 | python setup.py install | pip install . | ✅ | -| cross_pkg_resources_pkgutil | python3.7 | python setup.py install | pip install -e . | ✅ | -| cross_pkg_resources_pkgutil | python3.7 | python setup.py install | python setup.py install | ✅ | -| cross_pkg_resources_pkgutil | python3.7 | python setup.py install | python setup.py develop | ✅ | -| cross_pkg_resources_pkgutil | python3.7 | python setup.py develop | pip install . | ❌ | -| cross_pkg_resources_pkgutil | python3.7 | python setup.py develop | pip install -e . | ❌ | -| cross_pkg_resources_pkgutil | python3.7 | python setup.py develop | python setup.py install | ❌ | -| cross_pkg_resources_pkgutil | python3.7 | python setup.py develop | python setup.py develop | ❌ | -| cross_pep420_pkgutil | python2.7 | pip install . | pip install . | ✅ | -| cross_pep420_pkgutil | python2.7 | pip install . | pip install -e . | ❌ | -| cross_pep420_pkgutil | python2.7 | pip install . | python setup.py install | ❌ | -| cross_pep420_pkgutil | python2.7 | pip install . | python setup.py develop | ❌ | -| cross_pep420_pkgutil | python2.7 | pip install -e . | pip install . | ❌ | -| cross_pep420_pkgutil | python2.7 | pip install -e . | pip install -e . | ❌ | -| cross_pep420_pkgutil | python2.7 | pip install -e . | python setup.py install | ❌ | -| cross_pep420_pkgutil | python2.7 | pip install -e . | python setup.py develop | ❌ | -| cross_pep420_pkgutil | python2.7 | python setup.py install | pip install . | ❌ | -| cross_pep420_pkgutil | python2.7 | python setup.py install | pip install -e . | ❌ | -| cross_pep420_pkgutil | python2.7 | python setup.py install | python setup.py install | ❌ | -| cross_pep420_pkgutil | python2.7 | python setup.py install | python setup.py develop | ❌ | -| cross_pep420_pkgutil | python2.7 | python setup.py develop | pip install . | ❌ | -| cross_pep420_pkgutil | python2.7 | python setup.py develop | pip install -e . | ❌ | -| cross_pep420_pkgutil | python2.7 | python setup.py develop | python setup.py install | ❌ | -| cross_pep420_pkgutil | python2.7 | python setup.py develop | python setup.py develop | ❌ | -| cross_pep420_pkgutil | python3.7 | pip install . | pip install . | ✅ | -| cross_pep420_pkgutil | python3.7 | pip install . | pip install -e . | ✅ | -| cross_pep420_pkgutil | python3.7 | pip install . | python setup.py install | ✅ | -| cross_pep420_pkgutil | python3.7 | pip install . | python setup.py develop | ✅ | -| cross_pep420_pkgutil | python3.7 | pip install -e . | pip install . | ✅ | -| cross_pep420_pkgutil | python3.7 | pip install -e . | pip install -e . | ✅ | -| cross_pep420_pkgutil | python3.7 | pip install -e . | python setup.py install | ✅ | -| cross_pep420_pkgutil | python3.7 | pip install -e . | python setup.py develop | ✅ | -| cross_pep420_pkgutil | python3.7 | python setup.py install | pip install . | ✅ | -| cross_pep420_pkgutil | python3.7 | python setup.py install | pip install -e . | ✅ | -| cross_pep420_pkgutil | python3.7 | python setup.py install | python setup.py install | ✅ | -| cross_pep420_pkgutil | python3.7 | python setup.py install | python setup.py develop | ✅ | -| cross_pep420_pkgutil | python3.7 | python setup.py develop | pip install . | ✅ | -| cross_pep420_pkgutil | python3.7 | python setup.py develop | pip install -e . | ✅ | -| cross_pep420_pkgutil | python3.7 | python setup.py develop | python setup.py install | ✅ | -| cross_pep420_pkgutil | python3.7 | python setup.py develop | python setup.py develop | ✅ |