diff --git a/.travis.yml b/.travis.yml index 8f0c875..957f37f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,15 +1,9 @@ language: python python: -- 3.6 -- 3.5 -- 3.4 -- 2.7 -matrix: - include: - - python: 2.7 - env: TOXENV=quality + - 3.5 + - 3.8 install: -- pip install -U tox-travis +- pip install -r requirements/travis.txt script: - tox after_success: @@ -22,4 +16,4 @@ deploy: secure: jIYzuroblLNT6jdpfhL4+U01fKGTzuXmO68aNuCH+0+Ijyma/wndnk7k1vcD/5CpPua7xw2c5irRhqEVIIKthkot48Jfk25vKPp9Mn89GYGH2lfJnrGTxUnILRU0XgFPSNpNBGQ3EnuH7PfAzjxMTiwxOk+snaAVcz2nyxP3/rHR6wOx7bNqZh79ImzD4UT5TefeZzPdB92MFj1nXGR22F7qoYfKJJsa/2RjqY6XdL+mMrK4u4ZopeBm89SAB8PTDAd+BF52dp0ZufoNwOQGcfkXHPeEV0JWlSvBB/aiB4NijmGmTVniGxWwV4i5HC44O7jhYTvAtrMJE5jjdJYUzOUpwJ4+OXvuaALJGMLc1uMXNvs+4cDZXF2iTg2Cf73cm5zvDMVJn0J7BwUPxOmonMBidpTZaiC2pEokyXXEU+99fL/IvKPtB3FJZIWpOGngWMfPOBRHwxOdwjOrEawUQ8VYIFYFRtEK541q60JDJs7Qfle69b5UpzgtxDDbLVTKNedia9uQ0yxC1VKMQslEmQrp7chG0cLw1sxM45D63P9BePItosnT0dMxY2n3DGo7z68Y4T8gpt+8ZFzfxtwgD4AUyENjwkdr3g791tsE70HJAi7GyexwX2EtMAkxhc6QBtLZq0LVnTG7E110Pcsf8zvI+qaSzZOjamFL261Tvfs= on: tags: true - python: 3.6 + python: 3.5 diff --git a/HISTORY.rst b/HISTORY.rst index 477330d..5b5f407 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -2,6 +2,11 @@ History ======= +0.2 (2020-05-02) +------------------ + +* Drop support to python 2.7 and add support to python 3.8 + 0.1.5 (2018-08-08) ------------------ diff --git a/MANIFEST.in b/MANIFEST.in index 965b2dd..7059750 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -3,6 +3,7 @@ include CONTRIBUTING.rst include HISTORY.rst include LICENSE include README.rst +include requirements/base.in recursive-include tests * recursive-exclude * __pycache__ diff --git a/Makefile b/Makefile index 4184765..ce9ae39 100644 --- a/Makefile +++ b/Makefile @@ -85,3 +85,13 @@ dist: clean ## builds source and wheel package install: clean ## install the package to the active Python's site-packages python setup.py install + +upgrade: export CUSTOM_COMPILE_COMMAND=make upgrade +upgrade: ## update the requirements/*.txt files with the latest packages satisfying requirements/*.in + pip install -q -r requirements/pip_tools.txt + pip-compile --upgrade -o requirements/pip_tools.txt requirements/pip_tools.in + pip-compile --upgrade -o requirements/base.txt requirements/base.in + pip-compile --upgrade -o requirements/doc.txt requirements/doc.in + pip-compile --upgrade -o requirements/test.txt requirements/test.in + pip-compile --upgrade -o requirements/tox.txt requirements/tox.in + pip-compile --upgrade -o requirements/travis.txt requirements/travis.in diff --git a/openedx.yaml b/openedx.yaml index 16da1cd..d1cf1e6 100644 --- a/openedx.yaml +++ b/openedx.yaml @@ -1,6 +1,6 @@ oeps: oep-7: true - oep-18: false + oep-18: true tags: - library diff --git a/requirements/base.in b/requirements/base.in new file mode 100644 index 0000000..111b5db --- /dev/null +++ b/requirements/base.in @@ -0,0 +1,4 @@ +# Core requirements for using this package +-c constraints.txt + +Click diff --git a/requirements/base.txt b/requirements/base.txt new file mode 100644 index 0000000..08ea6ab --- /dev/null +++ b/requirements/base.txt @@ -0,0 +1,7 @@ +# +# This file is autogenerated by pip-compile +# To update, run: +# +# make upgrade +# +click==7.1.2 # via -r requirements/base.in diff --git a/requirements/constraints.txt b/requirements/constraints.txt new file mode 100644 index 0000000..bb6d02b --- /dev/null +++ b/requirements/constraints.txt @@ -0,0 +1,17 @@ +# Version constraints for pip-installation. +# +# This file doesn't install any packages. It specifies version constraints +# that will be applied if a package is needed. +# +# When pinning something here, please provide an explanation of why. Ideally, +# link to other information that will help people in the future to remove the +# pin when possible. Writing an issue against the offending project and +# linking to it here is good. + +# TODO: Many pinned dependencies should be unpinned and/or moved to this constraints file. + +# Use latest Django LTS version +Django<2.3.0 + +# mock version 4.0.0 drops support for python 3.5 +mock<4.0.0 diff --git a/requirements/doc.in b/requirements/doc.in new file mode 100644 index 0000000..d8cd989 --- /dev/null +++ b/requirements/doc.in @@ -0,0 +1,5 @@ +# Dependencies for building documentation + +-r base.in # Core dependencies + +Sphinx diff --git a/requirements/doc.txt b/requirements/doc.txt new file mode 100644 index 0000000..84daf27 --- /dev/null +++ b/requirements/doc.txt @@ -0,0 +1,34 @@ +# +# This file is autogenerated by pip-compile +# To update, run: +# +# make upgrade +# +alabaster==0.7.12 # via sphinx +babel==2.8.0 # via sphinx +certifi==2020.4.5.1 # via requests +chardet==3.0.4 # via requests +click==7.1.2 # via -r requirements/base.in +docutils==0.16 # via sphinx +idna==2.9 # via requests +imagesize==1.2.0 # via sphinx +jinja2==2.11.2 # via sphinx +markupsafe==1.1.1 # via jinja2 +packaging==20.3 # via sphinx +pygments==2.6.1 # via sphinx +pyparsing==2.4.7 # via packaging +pytz==2020.1 # via babel +requests==2.23.0 # via sphinx +six==1.14.0 # via packaging +snowballstemmer==2.0.0 # via sphinx +sphinx==3.0.3 # via -r requirements/doc.in +sphinxcontrib-applehelp==1.0.2 # via sphinx +sphinxcontrib-devhelp==1.0.2 # via sphinx +sphinxcontrib-htmlhelp==1.0.3 # via sphinx +sphinxcontrib-jsmath==1.0.1 # via sphinx +sphinxcontrib-qthelp==1.0.3 # via sphinx +sphinxcontrib-serializinghtml==1.1.4 # via sphinx +urllib3==1.25.9 # via requests + +# The following packages are considered to be unsafe in a requirements file: +# setuptools diff --git a/requirements/pip_tools.in b/requirements/pip_tools.in new file mode 100644 index 0000000..caf45a9 --- /dev/null +++ b/requirements/pip_tools.in @@ -0,0 +1,4 @@ + # Dependencies to run compile tools +-c constraints.txt + +pip-tools # Contains pip-compile, used to generate pip requirements files diff --git a/requirements/pip_tools.txt b/requirements/pip_tools.txt new file mode 100644 index 0000000..937f1d6 --- /dev/null +++ b/requirements/pip_tools.txt @@ -0,0 +1,12 @@ +# +# This file is autogenerated by pip-compile +# To update, run: +# +# make upgrade +# +click==7.1.2 # via pip-tools +pip-tools==5.1.2 # via -r requirements/pip_tools.in +six==1.14.0 # via pip-tools + +# The following packages are considered to be unsafe in a requirements file: +# pip diff --git a/requirements/test.in b/requirements/test.in new file mode 100644 index 0000000..446d47b --- /dev/null +++ b/requirements/test.in @@ -0,0 +1,14 @@ +# Requirements for test runs +-c constraints.txt + +-r base.txt # Core dependencies for the cookiecutter + +bumpversion +wheel +watchdog +flake8 +coverage +twine + +pytest +pytest-runner diff --git a/requirements/test.txt b/requirements/test.txt new file mode 100644 index 0000000..442ba7d --- /dev/null +++ b/requirements/test.txt @@ -0,0 +1,47 @@ +# +# This file is autogenerated by pip-compile +# To update, run: +# +# make upgrade +# +attrs==19.3.0 # via pytest +bleach==3.1.5 # via readme-renderer +bumpversion==0.5.3 # via -r requirements/test.in +certifi==2020.4.5.1 # via requests +chardet==3.0.4 # via requests +click==7.1.2 # via -r requirements/base.txt +coverage==5.1 # via -r requirements/test.in +docutils==0.16 # via readme-renderer +entrypoints==0.3 # via flake8 +flake8==3.7.9 # via -r requirements/test.in +idna==2.9 # via requests +importlib-metadata==1.6.0 # via pluggy, pytest +mccabe==0.6.1 # via flake8 +more-itertools==8.2.0 # via pytest +packaging==20.3 # via bleach, pytest +pathlib2==2.3.5 # via pytest +pathtools==0.1.2 # via watchdog +pkginfo==1.5.0.1 # via twine +pluggy==0.13.1 # via pytest +py==1.8.1 # via pytest +pycodestyle==2.5.0 # via flake8 +pyflakes==2.1.1 # via flake8 +pygments==2.6.1 # via readme-renderer +pyparsing==2.4.7 # via packaging +pytest-runner==5.2 # via -r requirements/test.in +pytest==5.4.1 # via -r requirements/test.in +readme-renderer==26.0 # via twine +requests-toolbelt==0.9.1 # via twine +requests==2.23.0 # via requests-toolbelt, twine +six==1.14.0 # via bleach, packaging, pathlib2, readme-renderer +tqdm==4.46.0 # via twine +twine==1.15.0 # via -r requirements/test.in +urllib3==1.25.9 # via requests +watchdog==0.10.2 # via -r requirements/test.in +wcwidth==0.1.9 # via pytest +webencodings==0.5.1 # via bleach +wheel==0.34.2 # via -r requirements/test.in +zipp==1.2.0 # via importlib-metadata + +# The following packages are considered to be unsafe in a requirements file: +# setuptools diff --git a/requirements/tox.in b/requirements/tox.in new file mode 100644 index 0000000..9a28694 --- /dev/null +++ b/requirements/tox.in @@ -0,0 +1,4 @@ +# Used for tests +-c constraints.txt + +tox diff --git a/requirements/tox.txt b/requirements/tox.txt new file mode 100644 index 0000000..7d38c58 --- /dev/null +++ b/requirements/tox.txt @@ -0,0 +1,20 @@ +# +# This file is autogenerated by pip-compile +# To update, run: +# +# make upgrade +# +appdirs==1.4.3 # via virtualenv +distlib==0.3.0 # via virtualenv +filelock==3.0.12 # via tox, virtualenv +importlib-metadata==1.6.0 # via importlib-resources, pluggy, tox, virtualenv +importlib-resources==1.5.0 # via virtualenv +packaging==20.3 # via tox +pluggy==0.13.1 # via tox +py==1.8.1 # via tox +pyparsing==2.4.7 # via packaging +six==1.14.0 # via packaging, tox, virtualenv +toml==0.10.0 # via tox +tox==3.15.0 # via -r requirements/tox.in +virtualenv==20.0.20 # via tox +zipp==1.2.0 # via importlib-metadata, importlib-resources diff --git a/requirements/travis.in b/requirements/travis.in new file mode 100644 index 0000000..90c7a80 --- /dev/null +++ b/requirements/travis.in @@ -0,0 +1,6 @@ +# Requirements for running tests in Travis +-c constraints.txt + +-r tox.txt + +tox-travis diff --git a/requirements/travis.txt b/requirements/travis.txt new file mode 100644 index 0000000..dcc8eb7 --- /dev/null +++ b/requirements/travis.txt @@ -0,0 +1,21 @@ +# +# This file is autogenerated by pip-compile +# To update, run: +# +# make upgrade +# +appdirs==1.4.3 # via -r requirements/tox.txt, virtualenv +distlib==0.3.0 # via -r requirements/tox.txt, virtualenv +filelock==3.0.12 # via -r requirements/tox.txt, tox, virtualenv +importlib-metadata==1.6.0 # via -r requirements/tox.txt, importlib-resources, pluggy, tox, virtualenv +importlib-resources==1.5.0 # via -r requirements/tox.txt, virtualenv +packaging==20.3 # via -r requirements/tox.txt, tox +pluggy==0.13.1 # via -r requirements/tox.txt, tox +py==1.8.1 # via -r requirements/tox.txt, tox +pyparsing==2.4.7 # via -r requirements/tox.txt, packaging +six==1.14.0 # via -r requirements/tox.txt, packaging, tox, virtualenv +toml==0.10.0 # via -r requirements/tox.txt, tox +tox-travis==0.12 # via -r requirements/travis.in +tox==3.15.0 # via -r requirements/tox.txt, tox-travis +virtualenv==20.0.20 # via -r requirements/tox.txt, tox +zipp==1.2.0 # via -r requirements/tox.txt, importlib-metadata, importlib-resources diff --git a/requirements_dev.txt b/requirements_dev.txt deleted file mode 100644 index 1ba26e1..0000000 --- a/requirements_dev.txt +++ /dev/null @@ -1,12 +0,0 @@ -pip==9.0.1 -bumpversion==0.5.3 -wheel==0.30.0 -watchdog==0.8.3 -flake8==3.5.0 -tox==2.9.1 -coverage==4.5.1 -Sphinx==1.7.1 -twine==1.10.0 - -pytest==3.4.2 -pytest-runner==2.11.1 diff --git a/setup.py b/setup.py index 8b425e9..2f3078e 100644 --- a/setup.py +++ b/setup.py @@ -17,6 +17,28 @@ test_requirements = ['pytest', ] +def load_requirements(*requirements_paths): + """ + Load all requirements from the specified requirements files. + Returns a list of requirement strings. + """ + requirements = set() + for path in requirements_paths: + with open(path) as reqs: + requirements.update( + line.split('#')[0].strip() for line in reqs + if is_requirement(line.strip()) + ) + return list(requirements) + + +def is_requirement(line): + """ + Return True if the requirement line is a package requirement; + that is, it is not blank, a comment, a URL, or an included file. + """ + return line and not line.startswith(('-r', '#', '-e', 'git+', '-c')) + setup( author="edX", author_email='oscm@edx.org', @@ -25,12 +47,9 @@ 'Intended Audience :: Developers', 'License :: OSI Approved :: GNU General Public License v3 (GPLv3)', 'Natural Language :: English', - "Programming Language :: Python :: 2", - 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.5', - 'Programming Language :: Python :: 3.6', + 'Programming Language :: Python :: 3.8', ], description="User utilities for the Open edX platform", entry_points={ @@ -38,7 +57,7 @@ 'user_util=user_util.cli:retire_user', ], }, - install_requires=requirements, + install_requires=load_requirements('requirements/base.in'), license="GNU General Public License v3", long_description=readme + '\n\n' + history, include_package_data=True, @@ -49,6 +68,6 @@ test_suite='tests', tests_require=test_requirements, url='https://github.com/edx/user-util', - version='0.1.5', + version='0.2', zip_safe=False, ) diff --git a/tests/test_user_util.py b/tests/test_user_util.py index ccafd74..233e21a 100644 --- a/tests/test_user_util.py +++ b/tests/test_user_util.py @@ -43,7 +43,7 @@ def test_cli_with_no_options(): runner = CliRunner() result_w_no_options = runner.invoke(cli.retire_user) - assert result_w_no_options.exit_code == -1 + assert result_w_no_options.exit_code != 0 def test_cli_help(): @@ -70,7 +70,7 @@ def test_cli_email(): def test_cli_bad_salt(): runner = CliRunner() cmd_result = runner.invoke(cli.retire_user, ['-u', 'a_learner', '-e', 'me@you.com', '-s', '[]']) - assert cmd_result.exit_code == -1 + assert cmd_result.exit_code != 0 # # Username retirement tests diff --git a/tox.ini b/tox.ini index 1cea9d6..9624cce 100644 --- a/tox.ini +++ b/tox.ini @@ -1,12 +1,10 @@ [tox] -envlist = py27, py34, py35, py36, flake8 +envlist = py{35}-django{22},py{38}-django{22,30},quality [travis] python = - 3.6: py36 3.5: py35 - 3.4: py34 - 2.7: py27 + 3.8: py38 quality: flake8 [testenv:quality] @@ -18,10 +16,8 @@ commands = flake8 user_util setenv = PYTHONPATH = {toxinidir} deps = - -r{toxinidir}/requirements_dev.txt + -r requirements/test.txt commands = pip install -U pip python setup.py develop py.test --basetemp={envtmpdir} - -