-
-
Notifications
You must be signed in to change notification settings - Fork 1.9k
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
Simplify testing for new contributors #2568
Changes from all commits
f7ee076
dd4b4be
3a25846
aaac6c6
74de4d6
c30cacc
55ab8c4
b8dbe78
f711678
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1 @@ | ||
HELLO=WORLD | ||
PYPI_VENDOR_DIR="./tests/pypi/" |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,4 @@ | ||
[pytest] | ||
addopts = -n auto | ||
norecursedirs = vendor patched | ||
; Add vendor and patched in addition to the default list of ignored dirs | ||
norecursedirs = .* build dist CVS _darcs {arch} *.egg vendor patched |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4,9 +4,6 @@ | |
|
||
set -eo pipefail | ||
|
||
# Set the PYPI vendor URL for pytest-pypi. | ||
PYPI_VENDOR_DIR="$(pwd)/tests/pypi/" | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Same rules apply. Please leave this setting alone. |
||
export PYPI_VENDOR_DIR | ||
export PYTHONIOENCODING="utf-8" | ||
export LANG=C.UTF-8 | ||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -9,6 +9,7 @@ | |
from pipenv.vendor import requests | ||
from pipenv.vendor import six | ||
from pipenv.vendor import toml | ||
from pytest_pypi.app import prepare_packages as prepare_pypi_packages | ||
|
||
if six.PY2: | ||
class ResourceWarning(Warning): | ||
|
@@ -30,6 +31,8 @@ def check_internet(): | |
WE_HAVE_INTERNET = check_internet() | ||
|
||
TESTS_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) | ||
PYPI_VENDOR_DIR = os.path.join(TESTS_ROOT, 'pypi') | ||
prepare_pypi_packages(PYPI_VENDOR_DIR) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This change makes a lot of sense to me. |
||
|
||
|
||
def pytest_runtest_setup(item): | ||
|
@@ -68,7 +71,6 @@ def __enter__(self): | |
os.environ['PIPENV_DONT_USE_PYENV'] = '1' | ||
os.environ['PIPENV_IGNORE_VIRTUALENVS'] = '1' | ||
os.environ['PIPENV_VENV_IN_PROJECT'] = '1' | ||
os.environ['PYPI_VENDOR_DIR'] = os.path.join(TESTS_ROOT, 'pypi') | ||
if self.chdir: | ||
os.chdir(self.path) | ||
return self | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4,51 +4,54 @@ | |
import requests | ||
from flask import Flask, redirect, abort, render_template, send_file, jsonify | ||
|
||
PYPI_VENDOR_DIR = os.environ.get('PYPI_VENDOR_DIR', './pypi') | ||
PYPI_VENDOR_DIR = os.path.abspath(PYPI_VENDOR_DIR) | ||
|
||
app = Flask(__name__) | ||
session = requests.Session() | ||
|
||
packages = {} | ||
|
||
|
||
class Package(object): | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The main differences here are:
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This will allow us to build out testing infrastructure which actually includes testing of the json api, which seems like it might be helpful.... There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yeah, I was surprised I didn't have any tests to fix for the |
||
"""docstring for Package""" | ||
"""Package represents a collection of releases from one or more directories""" | ||
|
||
def __init__(self, name): | ||
super(Package, self).__init__() | ||
self.name = name | ||
self._releases = [] | ||
self.releases = {} | ||
self._package_dirs = set() | ||
|
||
@property | ||
def releases(self): | ||
r = [] | ||
for release in self._releases: | ||
release = release[len(PYPI_VENDOR_DIR):].replace('\\', '/') | ||
r.append(release) | ||
return r | ||
def json(self): | ||
for path in self._package_dirs: | ||
try: | ||
with open(os.path.join(path, 'api.json')) as f: | ||
return json.load(f) | ||
except FileNotFoundError: | ||
pass | ||
|
||
def __repr__(self): | ||
return "<Package name={0!r} releases={1!r}".format(self.name, len(self.releases)) | ||
|
||
def add_release(self, path_to_binary): | ||
self._releases.append(path_to_binary) | ||
|
||
|
||
def prepare_packages(): | ||
for root, dirs, files in os.walk(os.path.abspath(PYPI_VENDOR_DIR)): | ||
path_to_binary = os.path.abspath(path_to_binary) | ||
path, release = os.path.split(path_to_binary) | ||
self.releases[release] = path_to_binary | ||
self._package_dirs.add(path) | ||
|
||
|
||
def prepare_packages(path): | ||
"""Add packages in path to the registry.""" | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. These changes are so straightforward and so much more readable. I've looked at tackling a lot of this before, basically spent about 5 minutes on it and ducked out because I broke everything... Thank you for the cleanup, this is very easy to follow and the changes are both logical and clear. |
||
path = os.path.abspath(path) | ||
if not (os.path.exists(path) and os.path.isdir(path)): | ||
raise ValueError("{} is not a directory!".format(path)) | ||
for root, dirs, files in os.walk(path): | ||
for file in files: | ||
if not file.startswith('.') and not file.endswith('.json'): | ||
package_name = root.split(os.path.sep)[-1] | ||
package_name = os.path.basename(root) | ||
|
||
if package_name not in packages: | ||
packages[package_name] = Package(package_name) | ||
|
||
packages[package_name].add_release(os.path.sep.join([root, file])) | ||
|
||
|
||
prepare_packages() | ||
packages[package_name].add_release(os.path.join(root, file)) | ||
|
||
|
||
@app.route('/') | ||
|
@@ -74,22 +77,26 @@ def serve_package(package, release): | |
if package in packages: | ||
package = packages[package] | ||
|
||
for _release in package.releases: | ||
if _release.endswith(release): | ||
return send_file(os.path.sep.join([PYPI_VENDOR_DIR, _release])) | ||
if release in package.releases: | ||
return send_file(package.releases[release]) | ||
|
||
abort(404) | ||
|
||
|
||
@app.route('/pypi/<package>/json') | ||
def json_for_package(package): | ||
try: | ||
with open(os.path.sep.join([PYPI_VENDOR_DIR, package, 'api.json'])) as f: | ||
return jsonify(json.load(f)) | ||
return jsonify(packages[package].json) | ||
except Exception: | ||
pass | ||
|
||
r = session.get('https://pypi.org/pypi/{0}/json'.format(package)) | ||
return jsonify(r.json()) | ||
|
||
|
||
if __name__ == '__main__': | ||
PYPI_VENDOR_DIR = os.environ.get('PYPI_VENDOR_DIR', './pypi') | ||
PYPI_VENDOR_DIR = os.path.abspath(PYPI_VENDOR_DIR) | ||
prepare_packages(PYPI_VENDOR_DIR) | ||
|
||
app.run() |
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.
The
PYPI_VENDOR_DIR
setting is 100% necessary if you want your tests to pass, I'm not sure why you're removing it??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 line handles it when running with just
pytest
. https://github.com/pypa/pipenv/blob/master/tests/integration/conftest.py#L71There 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.
I'm pretty confident that line doesn't actually do anything. Buildkite failures are due to the removal of this setting in the other script
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.
Ah, indeed haha, I must've been running it from the
test
directory and the implicit./pypa
inapp.py
worked. I had a different version with more explicitly loaded packages that I must've been thinking of. I'll double test that locally and push.