mirror of
https://github.com/kennethreitz/pipenv.git
synced 2026-06-05 22:50:18 +00:00
Merge branch 'master' into unused-vendor-shutilwhich
This commit is contained in:
@@ -0,0 +1 @@
|
||||
Removed unused vendored package blindspin
|
||||
@@ -0,0 +1 @@
|
||||
Allow KeyboardInterrupt to cancel test suite checks for working internet and ssh
|
||||
@@ -0,0 +1 @@
|
||||
Normalize the package names to lowercase when comparing used and in-Pipfile packages.
|
||||
+5
-3
@@ -242,7 +242,9 @@ def import_from_code(path="."):
|
||||
|
||||
rs = []
|
||||
try:
|
||||
for r in pipreqs.get_all_imports(path):
|
||||
for r in pipreqs.get_all_imports(
|
||||
path, encoding="utf-8", extra_ignore_dirs=[".venv"]
|
||||
):
|
||||
if r not in BAD_PACKAGES:
|
||||
rs.append(r)
|
||||
pkg_names = pipreqs.get_pkg_names(rs)
|
||||
@@ -2537,8 +2539,8 @@ def do_check(
|
||||
if not args:
|
||||
args = []
|
||||
if unused:
|
||||
deps_required = [k for k in project.packages.keys()]
|
||||
deps_needed = import_from_code(unused)
|
||||
deps_required = [k.lower() for k in project.packages.keys()]
|
||||
deps_needed = [k.lower() for k in import_from_code(unused)]
|
||||
for dep in deps_needed:
|
||||
try:
|
||||
deps_required.remove(dep)
|
||||
|
||||
Vendored
-21
@@ -1,21 +0,0 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright 2018 Kenneth Reitz
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
Vendored
-73
@@ -1,73 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import sys
|
||||
import threading
|
||||
import time
|
||||
import itertools
|
||||
|
||||
|
||||
class Spinner(object):
|
||||
spinner_cycle = itertools.cycle(u'⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏')
|
||||
|
||||
def __init__(self, beep=False, force=False):
|
||||
self.beep = beep
|
||||
self.force = force
|
||||
self.stop_running = None
|
||||
self.spin_thread = None
|
||||
|
||||
def start(self):
|
||||
if sys.stdout.isatty() or self.force:
|
||||
self.stop_running = threading.Event()
|
||||
self.spin_thread = threading.Thread(target=self.init_spin)
|
||||
self.spin_thread.start()
|
||||
|
||||
def stop(self):
|
||||
if self.spin_thread:
|
||||
self.stop_running.set()
|
||||
self.spin_thread.join()
|
||||
|
||||
def init_spin(self):
|
||||
while not self.stop_running.is_set():
|
||||
next_val = next(self.spinner_cycle)
|
||||
if sys.version_info[0] == 2:
|
||||
next_val = next_val.encode('utf-8')
|
||||
sys.stdout.write(next_val)
|
||||
sys.stdout.flush()
|
||||
time.sleep(0.07)
|
||||
sys.stdout.write('\b')
|
||||
|
||||
def __enter__(self):
|
||||
self.start()
|
||||
return self
|
||||
|
||||
def __exit__(self, exc_type, exc_val, exc_tb):
|
||||
self.stop()
|
||||
if self.beep:
|
||||
sys.stdout.write('\7')
|
||||
sys.stdout.flush()
|
||||
return False
|
||||
|
||||
|
||||
def spinner(beep=False, force=False):
|
||||
"""This function creates a context manager that is used to display a
|
||||
spinner on stdout as long as the context has not exited.
|
||||
|
||||
The spinner is created only if stdout is not redirected, or if the spinner
|
||||
is forced using the `force` parameter.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
beep : bool
|
||||
Beep when spinner finishes.
|
||||
force : bool
|
||||
Force creation of spinner even when stdout is redirected.
|
||||
|
||||
Example
|
||||
-------
|
||||
|
||||
with spinner():
|
||||
do_something()
|
||||
do_something_else()
|
||||
|
||||
"""
|
||||
return Spinner(beep, force)
|
||||
Vendored
-1
@@ -1,7 +1,6 @@
|
||||
appdirs==1.4.3
|
||||
backports.shutil_get_terminal_size==1.0.0
|
||||
backports.weakref==1.0.post1
|
||||
blindspin==2.0.1
|
||||
click==7.0
|
||||
click-completion==0.5.1
|
||||
click-didyoumean==0.0.3
|
||||
|
||||
@@ -50,7 +50,6 @@ HARDCODED_LICENSE_URLS = {
|
||||
'delegator.py': 'https://raw.githubusercontent.com/kennethreitz/delegator.py/master/LICENSE',
|
||||
'click-didyoumean': 'https://raw.githubusercontent.com/click-contrib/click-didyoumean/master/LICENSE',
|
||||
'click-completion': 'https://raw.githubusercontent.com/click-contrib/click-completion/master/LICENSE',
|
||||
'blindspin': 'https://raw.githubusercontent.com/kennethreitz/delegator.py/master/LICENSE',
|
||||
'parse': 'https://raw.githubusercontent.com/techalchemy/parse/master/LICENSE',
|
||||
'semver': 'https://raw.githubusercontent.com/k-bx/python-semver/master/LICENSE.txt',
|
||||
'crayons': 'https://raw.githubusercontent.com/kennethreitz/crayons/master/LICENSE',
|
||||
|
||||
@@ -39,6 +39,10 @@ def check_internet():
|
||||
for url in ("http://httpbin.org/ip", "http://clients3.google.com/generate_204"):
|
||||
try:
|
||||
try_internet(url)
|
||||
except KeyboardInterrupt:
|
||||
warnings.warn(
|
||||
"Skipped connecting to internet: {0}".format(url), RuntimeWarning
|
||||
)
|
||||
except Exception:
|
||||
warnings.warn(
|
||||
"Failed connecting to internet: {0}".format(url), RuntimeWarning
|
||||
@@ -59,6 +63,10 @@ def check_github_ssh():
|
||||
# return_code=255 and say 'Permission denied (publickey).'
|
||||
c = delegator.run('ssh -T git@github.com')
|
||||
res = True if c.return_code == 1 else False
|
||||
except KeyboardInterrupt:
|
||||
warnings.warn(
|
||||
"KeyboardInterrupt while checking GitHub ssh access", RuntimeWarning
|
||||
)
|
||||
except Exception:
|
||||
pass
|
||||
global HAS_WARNED_GITHUB
|
||||
|
||||
@@ -217,20 +217,20 @@ def test_install_parse_error(PipenvInstance, pypi):
|
||||
@pytest.mark.code
|
||||
@pytest.mark.check
|
||||
@pytest.mark.unused
|
||||
@pytest.mark.skip(reason="non-deterministic")
|
||||
@pytest.mark.needs_internet(reason='required by check')
|
||||
def test_check_unused(PipenvInstance, pypi):
|
||||
with PipenvInstance(chdir=True, pypi=pypi) as p:
|
||||
with open('__init__.py', 'w') as f:
|
||||
contents = """
|
||||
import tablib
|
||||
import records
|
||||
import flask
|
||||
""".strip()
|
||||
f.write(contents)
|
||||
p.pipenv('install requests')
|
||||
p.pipenv('install tablib')
|
||||
p.pipenv('install records')
|
||||
p.pipenv('install requests tablib flask')
|
||||
|
||||
assert all(pkg in p.pipfile['packages'] for pkg in ['requests', 'tablib', 'records'])
|
||||
assert all(pkg in p.pipfile['packages'] for pkg in ['requests', 'tablib', 'flask'])
|
||||
|
||||
c = p.pipenv('check --unused .')
|
||||
assert 'tablib' not in c.out
|
||||
assert 'flask' not in c.out
|
||||
|
||||
Reference in New Issue
Block a user