Revert all commits since last release

By reverting all commits done since release v0.4.10 we will have the
master branch synchronized with the latest release available in pipy.

All commits done since the latest release will be moved to another
branch called `next` where we will centralize development. Once we are ready
for a new release of pipreqs, the `next` branch will be merged back on to
master and a new release will be made.

This change will make development more organized and will avoid new
issues from users complaining about features only present in master not working
on their installation of pipreqs.

I would also like to thank @pedroteosousa for his help on reverting and
squashing all commits
This commit is contained in:
alan-barzilay 2021-05-04 20:39:47 -03:00
parent 2a299cc7bc
commit 90102acdbb
11 changed files with 62 additions and 300 deletions

View File

@ -12,8 +12,8 @@ matrix:
env: TOX_ENV=py34 env: TOX_ENV=py34
- python: 2.7 - python: 2.7
env: TOX_ENV=py27 env: TOX_ENV=py27
- python: pypy3 - python: pypy
env: TOX_ENV=pypy3 env: TOX_ENV=pypy
- python: 3.6 - python: 3.6
env: TOX_ENV=flake8 env: TOX_ENV=flake8

View File

@ -10,5 +10,4 @@ Development Lead
Contributors Contributors
------------ ------------
* Jake Teo <mapattacker@gmail.com> None yet. Why not be the first?
* Jerome Chan <cjerome94@gmail.com>

View File

@ -3,11 +3,6 @@
History History
------- -------
0.4.11 (2020-03-29)
--------------------
* Implement '--mode' (Jake Teo, Jerome Chan)
0.4.8 (2017-06-30) 0.4.8 (2017-06-30)
-------------------- --------------------

View File

@ -49,10 +49,7 @@ Usage
--force Overwrite existing requirements.txt --force Overwrite existing requirements.txt
--diff <file> Compare modules in requirements.txt to project imports. --diff <file> Compare modules in requirements.txt to project imports.
--clean <file> Clean up requirements.txt by removing modules that are not imported in project. --clean <file> Clean up requirements.txt by removing modules that are not imported in project.
--mode <scheme> Enables dynamic versioning with <compat>, <gt> or <non-pin> schemes. --no-pin Omit version of output packages.
<compat> | e.g. Flask~=1.1.2
<gt> | e.g. Flask>=1.1.2
<no-pin> | e.g. Flask
Example Example
------- -------
@ -73,5 +70,5 @@ Why not pip freeze?
------------------- -------------------
- ``pip freeze`` only saves the packages that are installed with ``pip install`` in your environment. - ``pip freeze`` only saves the packages that are installed with ``pip install`` in your environment.
- ``pip freeze`` saves all packages in the environment including those that you don't use in your current project (if you don't have ``virtualenv``). - ``pip freeze`` saves all packages in the environment including those that you don't use in your current project. (if you don't have virtualenv)
- and sometimes you just need to create ``requirements.txt`` for a new project without installing modules. - and sometimes you just need to create requirements.txt for a new project without installing modules.

View File

@ -1,4 +1,3 @@
AFQ:pyAFQ
AG_fft_tools:agpy AG_fft_tools:agpy
ANSI:pexpect ANSI:pexpect
Adafruit:Adafruit_Libraries Adafruit:Adafruit_Libraries
@ -14,7 +13,6 @@ Crypto:pycryptodome
Cryptodome:pycryptodomex Cryptodome:pycryptodomex
FSM:pexpect FSM:pexpect
FiftyOneDegrees:51degrees_mobile_detector_v3_wrapper FiftyOneDegrees:51degrees_mobile_detector_v3_wrapper
functional:pyfunctional
GeoBaseMain:GeoBasesDev GeoBaseMain:GeoBasesDev
GeoBases:GeoBasesDev GeoBases:GeoBasesDev
Globals:Zope2 Globals:Zope2
@ -24,7 +22,6 @@ Kittens:astro_kittens
Levenshtein:python_Levenshtein Levenshtein:python_Levenshtein
Lifetime:Zope2 Lifetime:Zope2
MethodObject:ExtensionClass MethodObject:ExtensionClass
MySQLdb:MySQL-python
OFS:Zope2 OFS:Zope2
OpenGL:PyOpenGL OpenGL:PyOpenGL
OpenSSL:pyOpenSSL OpenSSL:pyOpenSSL
@ -595,7 +592,6 @@ devtools:tg.devtools
dgis:2gis dgis:2gis
dhtmlparser:pyDHTMLParser dhtmlparser:pyDHTMLParser
digitalocean:python_digitalocean digitalocean:python_digitalocean
discord:discord.py
distribute_setup:ez_setup distribute_setup:ez_setup
distutils2:Distutils2 distutils2:Distutils2
django:Django django:Django
@ -679,7 +675,6 @@ geventwebsocket:gevent_websocket
gflags:python_gflags gflags:python_gflags
git:GitPython git:GitPython
github:PyGithub github:PyGithub
github3:github3.py
gitpy:git_py gitpy:git_py
globusonline:globusonline_transfer_api_client globusonline:globusonline_transfer_api_client
google:protobuf google:protobuf
@ -706,7 +701,7 @@ html:pies2overrides
htmloutput:nosehtmloutput htmloutput:nosehtmloutput
http:pies2overrides http:pies2overrides
hvad:django_hvad hvad:django_hvad
hydra:hydra-core krbV:krbv
i99fix:199Fix i99fix:199Fix
igraph:python_igraph igraph:python_igraph
imdb:IMDbPY imdb:IMDbPY
@ -732,7 +727,6 @@ keyczar:python_keyczar
keyedcache:django_keyedcache keyedcache:django_keyedcache
keystoneclient:python_keystoneclient keystoneclient:python_keystoneclient
kickstarter:kickstart kickstarter:kickstart
krbv:krbV
kss:kss.core kss:kss.core
kuyruk:Kuyruk kuyruk:Kuyruk
langconv:AdvancedLangConv langconv:AdvancedLangConv
@ -804,6 +798,7 @@ msgpack:msgpack_python
mutations:aino_mutations mutations:aino_mutations
mws:amazon_mws mws:amazon_mws
mysql:mysql_connector_repackaged mysql:mysql_connector_repackaged
MySQL-python:MySQLdb
native_tags:django_native_tags native_tags:django_native_tags
ndg:ndg_httpsclient ndg:ndg_httpsclient
nereid:trytond_nereid nereid:trytond_nereid
@ -1004,7 +999,6 @@ ruamel:ruamel.base
s2repoze:pysaml2 s2repoze:pysaml2
saga:saga_python saga:saga_python
saml2:pysaml2 saml2:pysaml2
samtranslator:aws-sam-translator
sass:libsass sass:libsass
sassc:libsass sassc:libsass
sasstests:libsass sasstests:libsass

54
pipreqs/pipreqs.py Normal file → Executable file
View File

@ -31,11 +31,7 @@ Options:
imports. imports.
--clean <file> Clean up requirements.txt by removing modules --clean <file> Clean up requirements.txt by removing modules
that are not imported in project. that are not imported in project.
--mode <scheme> Enables dynamic versioning with <compat>, --no-pin Omit version of output packages.
<gt> or <non-pin> schemes.
<compat> | e.g. Flask~=1.1.2
<gt> | e.g. Flask>=1.1.2
<no-pin> | e.g. Flask
""" """
from __future__ import print_function, absolute_import from __future__ import print_function, absolute_import
from contextlib import contextmanager from contextlib import contextmanager
@ -161,25 +157,25 @@ def get_all_imports(
return list(packages - data) return list(packages - data)
def filter_line(line): def filter_line(l):
return len(line) > 0 and line[0] != "#" return len(l) > 0 and l[0] != "#"
def generate_requirements_file(path, imports, symbol): def generate_requirements_file(path, imports):
with _open(path, "w") as out_file: with _open(path, "w") as out_file:
logging.debug('Writing {num} requirements: {imports} to {file}'.format( logging.debug('Writing {num} requirements: {imports} to {file}'.format(
num=len(imports), num=len(imports),
file=path, file=path,
imports=", ".join([x['name'] for x in imports]) imports=", ".join([x['name'] for x in imports])
)) ))
fmt = '{name}' + symbol + '{version}' fmt = '{name}=={version}'
out_file.write('\n'.join( out_file.write('\n'.join(
fmt.format(**item) if item['version'] else '{name}'.format(**item) fmt.format(**item) if item['version'] else '{name}'.format(**item)
for item in imports) + '\n') for item in imports) + '\n')
def output_requirements(imports, symbol): def output_requirements(imports):
generate_requirements_file('-', imports, symbol) generate_requirements_file('-', imports)
def get_imports_info( def get_imports_info(
@ -372,11 +368,6 @@ def diff(file_, imports):
def clean(file_, imports): def clean(file_, imports):
"""Remove modules that aren't imported in project from file.""" """Remove modules that aren't imported in project from file."""
modules_not_imported = compare_modules(file_, imports) modules_not_imported = compare_modules(file_, imports)
if len(modules_not_imported) == 0:
logging.info("Nothing to clean in " + file_)
return
re_remove = re.compile("|".join(modules_not_imported)) re_remove = re.compile("|".join(modules_not_imported))
to_write = [] to_write = []
@ -401,18 +392,6 @@ def clean(file_, imports):
logging.info("Successfully cleaned up requirements in " + file_) logging.info("Successfully cleaned up requirements in " + file_)
def dynamic_versioning(scheme, imports):
"""Enables dynamic versioning with <compat>, <gt> or <non-pin> schemes."""
if scheme == "no-pin":
imports = [{"name": item["name"], "version": ""} for item in imports]
symbol = ""
elif scheme == "gt":
symbol = ">="
elif scheme == "compat":
symbol = "~="
return imports, symbol
def init(args): def init(args):
encoding = args.get('--encoding') encoding = args.get('--encoding')
extra_ignore_dirs = args.get('--ignore') extra_ignore_dirs = args.get('--ignore')
@ -451,8 +430,6 @@ def init(args):
imports = local + get_imports_info(difference, imports = local + get_imports_info(difference,
proxy=proxy, proxy=proxy,
pypi_server=pypi_server) pypi_server=pypi_server)
# sort imports based on lowercase name of package, similar to `pip freeze`.
imports = sorted(imports, key=lambda x: x['name'].lower())
path = (args["--savepath"] if args["--savepath"] else path = (args["--savepath"] if args["--savepath"] else
os.path.join(input_path, "requirements.txt")) os.path.join(input_path, "requirements.txt"))
@ -469,25 +446,18 @@ def init(args):
and not args["--savepath"] and not args["--savepath"]
and not args["--force"] and not args["--force"]
and os.path.exists(path)): and os.path.exists(path)):
logging.warning("requirements.txt already exists, " logging.warning("Requirements.txt already exists, "
"use --force to overwrite it") "use --force to overwrite it")
return return
if args["--mode"]: if args.get('--no-pin'):
scheme = args.get("--mode") imports = [{'name': item["name"], 'version': ''} for item in imports]
if scheme in ["compat", "gt", "no-pin"]:
imports, symbol = dynamic_versioning(scheme, imports)
else:
raise ValueError("Invalid argument for mode flag, "
"use 'compat', 'gt' or 'no-pin' instead")
else:
symbol = "=="
if args["--print"]: if args["--print"]:
output_requirements(imports, symbol) output_requirements(imports)
logging.info("Successfully output requirements") logging.info("Successfully output requirements")
else: else:
generate_requirements_file(path, imports, symbol) generate_requirements_file(path, imports)
logging.info("Successfully saved requirements file in " + path) logging.info("Successfully saved requirements file in " + path)

View File

@ -133,7 +133,6 @@ curses
curses.ascii curses.ascii
curses.panel curses.panel
curses.textpad curses.textpad
dataclasses
datetime datetime
dbhash dbhash
dbm dbm
@ -371,7 +370,6 @@ robotparser
runpy runpy
sched sched
ScrolledText ScrolledText
secrets
select select
selectors selectors
sets sets

View File

@ -31,10 +31,6 @@ from pyflakes.test.test_imports import Test as TestImports
# Nose # Nose
from nose.importer import Importer, add_path, remove_path # loader.py from nose.importer import Importer, add_path, remove_path # loader.py
# see issue #88
import analytics
import flask_seasurf
import atexit import atexit
from __future__ import print_function from __future__ import print_function
from docopt import docopt from docopt import docopt

View File

@ -1,65 +0,0 @@
"""unused import"""
# pylint: disable=undefined-all-variable, import-error, no-absolute-import, too-few-public-methods, missing-docstring
import xml.etree # [unused-import]
import xml.sax # [unused-import]
import os.path as test # [unused-import]
from sys import argv as test2 # [unused-import]
from sys import flags # [unused-import]
# +1:[unused-import,unused-import]
from collections import deque, OrderedDict, Counter
# All imports above should be ignored
import requests # [unused-import]
# setuptools
import zipimport # command/easy_install.py
# twisted
from importlib import invalidate_caches # python/test/test_deprecate.py
# astroid
import zipimport # manager.py
# IPython
from importlib.machinery import all_suffixes # core/completerlib.py
import importlib # html/notebookapp.py
from IPython.utils.importstring import import_item # Many files
# pyflakes
# test/test_doctests.py
from pyflakes.test.test_imports import Test as TestImports
# Nose
from nose.importer import Importer, add_path, remove_path # loader.py
# see issue #88
import analytics
import flask_seasurf
import atexit
from __future__ import print_function
from docopt import docopt
import curses, logging, sqlite3
import logging
import os
import sqlite3
import time
import sys
import signal
import bs4
import nonexistendmodule
import boto as b, peewee as p
# import django
import flask.ext.somext # # #
# from sqlalchemy import model
try:
import ujson as json
except ImportError:
import json
import models
def main():
pass
import after_method_is_valid_even_if_not_pep8

202
tests/test_pipreqs.py Normal file → Executable file
View File

@ -18,40 +18,22 @@ from pipreqs import pipreqs
class TestPipreqs(unittest.TestCase): class TestPipreqs(unittest.TestCase):
def setUp(self): def setUp(self):
self.modules = [ self.modules = ['flask', 'requests', 'sqlalchemy',
'flask', 'requests', 'sqlalchemy', 'docopt', 'boto', 'ipython', 'docopt', 'boto', 'ipython', 'pyflakes', 'nose',
'pyflakes', 'nose', 'analytics', 'flask_seasurf', 'peewee', 'peewee', 'ujson', 'nonexistendmodule', 'bs4', 'after_method_is_valid_even_if_not_pep8' ]
'ujson', 'nonexistendmodule', 'bs4',
'after_method_is_valid_even_if_not_pep8'
]
self.modules2 = ['beautifulsoup4'] self.modules2 = ['beautifulsoup4']
self.local = ["docopt", "requests", "nose", 'pyflakes'] self.local = ["docopt", "requests", "nose", 'pyflakes']
self.project = os.path.join(os.path.dirname(__file__), "_data") self.project = os.path.join(os.path.dirname(__file__), "_data")
self.project_clean = os.path.join( self.project_invalid = os.path.join(os.path.dirname(__file__), "_invalid_data")
os.path.dirname(__file__), self.project_with_ignore_directory = os.path.join(os.path.dirname(__file__), "_data_ignore")
"_data_clean" self.project_with_duplicated_deps = os.path.join(os.path.dirname(__file__), "_data_duplicated_deps")
)
self.project_invalid = os.path.join(
os.path.dirname(__file__),
"_invalid_data"
)
self.project_with_ignore_directory = os.path.join(
os.path.dirname(__file__),
"_data_ignore"
)
self.project_with_duplicated_deps = os.path.join(
os.path.dirname(__file__),
"_data_duplicated_deps"
)
self.requirements_path = os.path.join(self.project, "requirements.txt") self.requirements_path = os.path.join(self.project, "requirements.txt")
self.alt_requirement_path = os.path.join( self.alt_requirement_path = os.path.join(
self.project, self.project, "requirements2.txt")
"requirements2.txt"
)
def test_get_all_imports(self): def test_get_all_imports(self):
imports = pipreqs.get_all_imports(self.project) imports = pipreqs.get_all_imports(self.project)
self.assertEqual(len(imports), 15) self.assertEqual(len(imports), 13)
for item in imports: for item in imports:
self.assertTrue( self.assertTrue(
item.lower() in self.modules, "Import is missing: " + item) item.lower() in self.modules, "Import is missing: " + item)
@ -72,8 +54,7 @@ class TestPipreqs(unittest.TestCase):
""" """
Test that invalid python files cannot be imported. Test that invalid python files cannot be imported.
""" """
self.assertRaises( self.assertRaises(SyntaxError, pipreqs.get_all_imports, self.project_invalid)
SyntaxError, pipreqs.get_all_imports, self.project_invalid)
def test_get_imports_info(self): def test_get_imports_info(self):
""" """
@ -81,9 +62,8 @@ class TestPipreqs(unittest.TestCase):
""" """
imports = pipreqs.get_all_imports(self.project) imports = pipreqs.get_all_imports(self.project)
with_info = pipreqs.get_imports_info(imports) with_info = pipreqs.get_imports_info(imports)
# Should contain 10 items without the "nonexistendmodule" and # Should contain 10 items without the "nonexistendmodule" and "after_method_is_valid_even_if_not_pep8"
# "after_method_is_valid_even_if_not_pep8" self.assertEqual(len(with_info), 11)
self.assertEqual(len(with_info), 13)
for item in with_info: for item in with_info:
self.assertTrue( self.assertTrue(
item['name'].lower() in self.modules, item['name'].lower() in self.modules,
@ -97,12 +77,10 @@ class TestPipreqs(unittest.TestCase):
def test_get_use_local_only(self): def test_get_use_local_only(self):
""" """
Test without checking PyPI, check to see if names of local Test without checking PyPI, check to see if names of local imports matches what we expect
imports matches what we expect
- Note even though pyflakes isn't in requirements.txt, - Note even though pyflakes isn't in requirements.txt,
It's added to locals since it is a development dependency It's added to locals since it is a development dependency for testing
for testing
""" """
# should find only docopt and requests # should find only docopt and requests
imports_with_info = pipreqs.get_import_local(self.modules) imports_with_info = pipreqs.get_import_local(self.modules)
@ -111,28 +89,24 @@ class TestPipreqs(unittest.TestCase):
def test_init(self): def test_init(self):
""" """
Test that all modules we will test upon are in requirements file Test that all modules we will test upon, are in requirements file
""" """
pipreqs.init({'<path>': self.project, '--savepath': None, '--print': False, pipreqs.init({'<path>': self.project, '--savepath': None, '--print': False,
'--use-local': None, '--force': True, '--proxy':None, '--pypi-server':None, '--use-local': None, '--force': True, '--proxy':None, '--pypi-server':None,
'--diff': None, '--clean': None, '--mode': None}) '--diff': None, '--clean': None})
assert os.path.exists(self.requirements_path) == 1 assert os.path.exists(self.requirements_path) == 1
with open(self.requirements_path, "r") as f: with open(self.requirements_path, "r") as f:
data = f.read().lower() data = f.read().lower()
for item in self.modules[:-3]: for item in self.modules[:-3]:
self.assertTrue(item.lower() in data) self.assertTrue(item.lower() in data)
# It should be sorted based on names.
data = data.strip().split('\n')
self.assertEqual(data, sorted(data))
def test_init_local_only(self): def test_init_local_only(self):
""" """
Test that items listed in requirements.text are the same Test that items listed in requirements.text are the same as locals expected
as locals expected
""" """
pipreqs.init({'<path>': self.project, '--savepath': None, '--print': False, pipreqs.init({'<path>': self.project, '--savepath': None, '--print': False,
'--use-local': True, '--force': True, '--proxy':None, '--pypi-server':None, '--use-local': True, '--force': True, '--proxy':None, '--pypi-server':None,
'--diff': None, '--clean': None, '--mode': None}) '--diff': None, '--clean': None})
assert os.path.exists(self.requirements_path) == 1 assert os.path.exists(self.requirements_path) == 1
with open(self.requirements_path, "r") as f: with open(self.requirements_path, "r") as f:
data = f.readlines() data = f.readlines()
@ -142,12 +116,11 @@ class TestPipreqs(unittest.TestCase):
def test_init_savepath(self): def test_init_savepath(self):
""" """
Test that we can save requirements.txt correctly Test that we can save requiremnts.tt correctly to a different path
to a different path
""" """
pipreqs.init({'<path>': self.project, '--savepath': self.alt_requirement_path, pipreqs.init({'<path>': self.project, '--savepath':
'--use-local': None, '--proxy':None, '--pypi-server':None, '--print': False, self.alt_requirement_path, '--use-local': None, '--proxy':None, '--pypi-server':None, '--print': False,
'--diff': None, '--clean': None, '--mode': None}) "--diff": None, "--clean": None})
assert os.path.exists(self.alt_requirement_path) == 1 assert os.path.exists(self.alt_requirement_path) == 1
with open(self.alt_requirement_path, "r") as f: with open(self.alt_requirement_path, "r") as f:
data = f.read().lower() data = f.read().lower()
@ -158,14 +131,13 @@ class TestPipreqs(unittest.TestCase):
def test_init_overwrite(self): def test_init_overwrite(self):
""" """
Test that if requiremnts.txt exists, it will not be Test that if requiremnts.txt exists, it will not automatically be overwritten
automatically overwritten
""" """
with open(self.requirements_path, "w") as f: with open(self.requirements_path, "w") as f:
f.write("should_not_be_overwritten") f.write("should_not_be_overwritten")
pipreqs.init({'<path>': self.project, '--savepath': None, '--use-local': None, pipreqs.init({'<path>': self.project, '--savepath': None,
'--force': None, '--proxy':None, '--pypi-server':None, '--print': False, '--use-local': None, '--force': None, '--proxy':None, '--pypi-server':None, '--print': False,
'--diff': None, '--clean': None, '--mode': None}) "--diff": None, "--clean": None})
assert os.path.exists(self.requirements_path) == 1 assert os.path.exists(self.requirements_path) == 1
with open(self.requirements_path, "r") as f: with open(self.requirements_path, "r") as f:
data = f.read().lower() data = f.read().lower()
@ -173,43 +145,35 @@ class TestPipreqs(unittest.TestCase):
def test_get_import_name_without_alias(self): def test_get_import_name_without_alias(self):
""" """
Test that function get_name_without_alias() Test that function get_name_without_alias() will work on a string.
will work on a string. - Note: This isn't truly needed when pipreqs is walking the AST to find imports
- Note: This isn't truly needed when pipreqs is walking
the AST to find imports
""" """
import_name_with_alias = "requests as R" import_name_with_alias = "requests as R"
expected_import_name_without_alias = "requests" expected_import_name_without_alias = "requests"
import_name_without_aliases = pipreqs.get_name_without_alias( import_name_without_aliases = pipreqs.get_name_without_alias(
import_name_with_alias) import_name_with_alias)
self.assertEqual( self.assertEqual(
import_name_without_aliases, import_name_without_aliases, expected_import_name_without_alias)
expected_import_name_without_alias
)
def test_custom_pypi_server(self): def test_custom_pypi_server(self):
""" """
Test that trying to get a custom pypi sever fails correctly Test that trying to get a custom pypi sever fails correctly
""" """
self.assertRaises( self.assertRaises(requests.exceptions.MissingSchema, pipreqs.init, {'<path>': self.project, '--savepath': None, '--print': False,
requests.exceptions.MissingSchema, pipreqs.init, '--use-local': None, '--force': True, '--proxy': None, '--pypi-server': 'nonexistent'})
{'<path>': self.project, '--savepath': None, '--print': False,
'--use-local': None, '--force': True, '--proxy': None,
'--pypi-server': 'nonexistent'}
)
def test_ignored_directory(self): def test_ignored_directory(self):
""" """
Test --ignore parameter Test --ignore parameter
""" """
pipreqs.init( pipreqs.init(
{'<path>': self.project_with_ignore_directory, '--savepath': None, {'<path>': self.project_with_ignore_directory, '--savepath': None, '--print': False,
'--print': False, '--use-local': None, '--force': True, '--use-local': None, '--force': True,
'--proxy':None, '--pypi-server':None, '--proxy':None,
'--pypi-server':None,
'--ignore':'.ignored_dir,.ignore_second', '--ignore':'.ignored_dir,.ignore_second',
'--diff': None, '--diff': None,
'--clean': None, '--clean': None
'--mode': None
} }
) )
with open(os.path.join(self.project_with_ignore_directory, "requirements.txt"), "r") as f: with open(os.path.join(self.project_with_ignore_directory, "requirements.txt"), "r") as f:
@ -217,27 +181,9 @@ class TestPipreqs(unittest.TestCase):
for item in ['click', 'getpass']: for item in ['click', 'getpass']:
self.assertFalse(item.lower() in data) self.assertFalse(item.lower() in data)
def test_dynamic_version_no_pin_scheme(self): def test_omit_version(self):
""" """
Test --mode=no-pin Test --no-pin parameter
"""
pipreqs.init(
{'<path>': self.project_with_ignore_directory, '--savepath': None,
'--print': False, '--use-local': None, '--force': True,
'--proxy': None, '--pypi-server': None,
'--diff': None,
'--clean': None,
'--mode': 'no-pin'
}
)
with open(os.path.join(self.project_with_ignore_directory, "requirements.txt"), "r") as f:
data = f.read().lower()
for item in ['beautifulsoup4', 'boto']:
self.assertTrue(item.lower() in data)
def test_dynamic_version_gt_scheme(self):
"""
Test --mode=gt
""" """
pipreqs.init( pipreqs.init(
{'<path>': self.project_with_ignore_directory, '--savepath': None, '--print': False, {'<path>': self.project_with_ignore_directory, '--savepath': None, '--print': False,
@ -246,81 +192,13 @@ class TestPipreqs(unittest.TestCase):
'--pypi-server': None, '--pypi-server': None,
'--diff': None, '--diff': None,
'--clean': None, '--clean': None,
'--mode': 'gt' '--no-pin': True
} }
) )
with open(os.path.join(self.project_with_ignore_directory, "requirements.txt"), "r") as f: with open(os.path.join(self.project_with_ignore_directory, "requirements.txt"), "r") as f:
data = f.readlines()
for item in data:
symbol = '>='
message = 'symbol is not in item'
self.assertIn(symbol, item, message)
def test_dynamic_version_compat_scheme(self):
"""
Test --mode=compat
"""
pipreqs.init(
{'<path>': self.project_with_ignore_directory, '--savepath': None, '--print': False,
'--use-local': None, '--force': True,
'--proxy': None,
'--pypi-server': None,
'--diff': None,
'--clean': None,
'--mode': 'compat'
}
)
with open(os.path.join(self.project_with_ignore_directory, "requirements.txt"), "r") as f:
data = f.readlines()
for item in data:
symbol = '~='
message = 'symbol is not in item'
self.assertIn(symbol, item, message)
def test_clean(self):
"""
Test --clean parameter
"""
pipreqs.init(
{'<path>': self.project, '--savepath': None, '--print': False,
'--use-local': None, '--force': True, '--proxy': None,
'--pypi-server': None, '--diff': None, '--clean': None,
'--mode': None}
)
assert os.path.exists(self.requirements_path) == 1
pipreqs.init(
{'<path>': self.project, '--savepath': None, '--print': False,
'--use-local': None, '--force': None, '--proxy': None,
'--pypi-server': None, '--diff': None,
'--clean': self.requirements_path, '--mode': 'non-pin'}
)
with open(self.requirements_path, "r") as f:
data = f.read().lower() data = f.read().lower()
for item in self.modules[:-3]: for item in ['beautifulsoup4==4.8.1', 'boto==2.49.0']:
self.assertTrue(item.lower() in data) self.assertFalse(item.lower() in data)
def test_clean_with_imports_to_clean(self):
"""
Test --clean parameter when there are imports to clean
"""
cleaned_module = 'sqlalchemy'
pipreqs.init(
{'<path>': self.project, '--savepath': None, '--print': False,
'--use-local': None, '--force': True, '--proxy': None,
'--pypi-server': None, '--diff': None, '--clean': None,
'--mode': None}
)
assert os.path.exists(self.requirements_path) == 1
modules_clean = [m for m in self.modules if m != cleaned_module]
pipreqs.init(
{'<path>': self.project_clean, '--savepath': None,
'--print': False, '--use-local': None, '--force': None,
'--proxy': None, '--pypi-server': None, '--diff': None,
'--clean': self.requirements_path, '--mode': 'non-pin'}
)
with open(self.requirements_path, "r") as f:
data = f.read().lower()
self.assertTrue(cleaned_module not in data)
def tearDown(self): def tearDown(self):
""" """

View File

@ -1,5 +1,5 @@
[tox] [tox]
envlist = py27, py34, py35, py36, pypy3, flake8 envlist = py27, py34, py35, py36, pypy, flake8
[testenv] [testenv]
setenv = setenv =