commit python-sortedcollections for openSUSE:Factory
Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-sortedcollections for openSUSE:Factory checked in at 2021-01-31 16:52:04 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-sortedcollections (Old) and /work/SRC/openSUSE:Factory/.python-sortedcollections.new.28504 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Package is "python-sortedcollections" Sun Jan 31 16:52:04 2021 rev:6 rq:867972 version:2.1.0 Changes: -------- --- /work/SRC/openSUSE:Factory/python-sortedcollections/python-sortedcollections.changes 2020-07-24 10:04:07.509864287 +0200 +++ /work/SRC/openSUSE:Factory/.python-sortedcollections.new.28504/python-sortedcollections.changes 2021-01-31 16:52:05.908710155 +0100 @@ -1,0 +2,24 @@ +Sat Jan 30 05:20:31 UTC 2021 - John Vandenberg <jayvdb@gmail.com> + +- Update to v2.1.0 + * Add NearestDict + * Update for Python 3 + * Fixes for doctest support + * Add NearestDict implementation + * Update docs to reference NearestDict + * Use Python3 defaults for inheritance + * Use f-strings +- from v2.0.0 + * Remove shims for Python 2 + * Add support for mypy + * Drop need for "gj" from requirements + * Load version from __init__.py rather than by import + * Add __all__ to __init__.py for flake8 + * Small fixes/changes for linters/formatters/type-checkers +- from v1.2.3 + * Add support for "blue" formatter + * Fixes for doctest support +- from v1.2.2 + * Add pickle support for IndexableSet + +------------------------------------------------------------------- Old: ---- v1.2.1.tar.gz New: ---- v2.1.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-sortedcollections.spec ++++++ --- /var/tmp/diff_new_pack.9CoKD7/_old 2021-01-31 16:52:06.628711195 +0100 +++ /var/tmp/diff_new_pack.9CoKD7/_new 2021-01-31 16:52:06.628711195 +0100 @@ -1,7 +1,7 @@ # # spec file for package python-sortedcollections # -# Copyright (c) 2020 SUSE LLC +# Copyright (c) 2021 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -17,8 +17,9 @@ %{?!python_module:%define python_module() python-%{**} python3-%{**}} +%define skip_python2 1 Name: python-sortedcollections -Version: 1.2.1 +Version: 2.1.0 Release: 0 Summary: Python Sorted Collections License: Apache-2.0 @@ -53,7 +54,7 @@ %prep %setup -q -n python-sortedcollections-%{version} -%autopatch -p1 +rm tox.ini %build %python_build ++++++ v1.2.1.tar.gz -> v2.1.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-sortedcollections-1.2.1/.github/workflows/integration.yml new/python-sortedcollections-2.1.0/.github/workflows/integration.yml --- old/python-sortedcollections-1.2.1/.github/workflows/integration.yml 1970-01-01 01:00:00.000000000 +0100 +++ new/python-sortedcollections-2.1.0/.github/workflows/integration.yml 2021-01-18 23:01:45.000000000 +0100 @@ -0,0 +1,52 @@ +name: integration + +on: [push] + +jobs: + + checks: + runs-on: ubuntu-latest + strategy: + max-parallel: 8 + matrix: + check: [bluecheck, doc8, docs, flake8, isortcheck, mypy, pylint, rstcheck] + + steps: + - uses: actions/checkout@v2 + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: 3.9 + - name: Install dependencies + run: | + pip install --upgrade pip + pip install tox + - name: Run checks with tox + run: | + tox -e ${{ matrix.check }} + + tests: + needs: checks + runs-on: ${{ matrix.os }} + strategy: + max-parallel: 8 + matrix: + os: [ubuntu-latest, macos-latest, windows-latest, ubuntu-16.04] + python-version: [3.6, 3.7, 3.8, 3.9] + + steps: + - name: Set up Python ${{ matrix.python-version }} x64 + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + architecture: x64 + + - uses: actions/checkout@v2 + + - name: Install tox + run: | + pip install --upgrade pip + pip install tox + + - name: Test with tox + run: tox -e py diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-sortedcollections-1.2.1/.github/workflows/release.yml new/python-sortedcollections-2.1.0/.github/workflows/release.yml --- old/python-sortedcollections-1.2.1/.github/workflows/release.yml 1970-01-01 01:00:00.000000000 +0100 +++ new/python-sortedcollections-2.1.0/.github/workflows/release.yml 2021-01-18 23:01:45.000000000 +0100 @@ -0,0 +1,38 @@ +name: release + +on: + push: + tags: + - v* + +jobs: + + upload: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: 3.9 + + - name: Install dependencies + run: | + pip install --upgrade pip + pip install -r requirements.txt + + - name: Create source dist + run: python setup.py sdist + + - name: Create wheel dist + run: python setup.py bdist_wheel + + - name: Upload with twine + env: + TWINE_USERNAME: ${{ secrets.TWINE_USERNAME }} + TWINE_PASSWORD: ${{ secrets.TWINE_PASSWORD }} + run: | + ls -l dist/* + twine upload dist/* diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-sortedcollections-1.2.1/.gitignore new/python-sortedcollections-2.1.0/.gitignore --- old/python-sortedcollections-1.2.1/.gitignore 2020-06-07 21:53:14.000000000 +0200 +++ new/python-sortedcollections-2.1.0/.gitignore 2021-01-18 23:01:45.000000000 +0100 @@ -12,5 +12,6 @@ /build/ /dist/ /sortedcollections.egg-info/ +/docs/_build/ .DS_Store diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-sortedcollections-1.2.1/.pylintrc new/python-sortedcollections-2.1.0/.pylintrc --- old/python-sortedcollections-1.2.1/.pylintrc 2020-06-07 21:53:14.000000000 +0200 +++ new/python-sortedcollections-2.1.0/.pylintrc 2021-01-18 23:01:45.000000000 +0100 @@ -138,7 +138,9 @@ xreadlines-attribute, deprecated-sys-function, exception-escape, - comprehension-escape + comprehension-escape, + super-with-arguments, + raise-missing-from # Enable the message, report, category or checker with the given id(s). You can # either give multiple identifier separated by comma (,) or put this option diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-sortedcollections-1.2.1/.travis.yml new/python-sortedcollections-2.1.0/.travis.yml --- old/python-sortedcollections-1.2.1/.travis.yml 2020-06-07 21:53:14.000000000 +0200 +++ new/python-sortedcollections-2.1.0/.travis.yml 1970-01-01 01:00:00.000000000 +0100 @@ -1,24 +0,0 @@ -sudo: false -language: python -install: pip install tox -script: tox -matrix: - include: - - python: 2.7 - env: TOXENV=py27 - - python: 3.4 - env: TOXENV=py34 - - python: 3.5 - env: TOXENV=py35 - - python: 3.6 - env: TOXENV=py36 - - python: 3.7 - dist: xenial - env: TOXENV=py37 - - python: pypy - env: TOXENV=pypy - - python: pypy3 - env: TOXENV=pypy3 - - python: 3.7 - dist: xenial - env: TOXENV=lint diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-sortedcollections-1.2.1/LICENSE new/python-sortedcollections-2.1.0/LICENSE --- old/python-sortedcollections-1.2.1/LICENSE 2020-06-07 21:53:14.000000000 +0200 +++ new/python-sortedcollections-2.1.0/LICENSE 2021-01-18 23:01:45.000000000 +0100 @@ -1,4 +1,4 @@ -Copyright 2015-2019 Grant Jenks +Copyright 2015-2021 Grant Jenks Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-sortedcollections-1.2.1/README.rst new/python-sortedcollections-2.1.0/README.rst --- old/python-sortedcollections-1.2.1/README.rst 2020-06-07 21:53:14.000000000 +0200 +++ new/python-sortedcollections-2.1.0/README.rst 2021-01-18 23:01:45.000000000 +0100 @@ -11,20 +11,21 @@ <http://www.grantjenks.com/docs/sortedcontainers/>`_ module. - ValueSortedDict - Dictionary with (key, value) item pairs sorted by value. - ItemSortedDict - Dictionary with key-function support for item pairs. +- NearestDict - Dictionary with nearest-key lookup. - OrderedDict - Ordered dictionary with numeric indexing support. - OrderedSet - Ordered set with numeric indexing support. - IndexableDict - Dictionary with numeric indexing support. - IndexableSet - Set with numeric indexing support. - SegmentList - List with fast random access insertion and deletion. - 100% code coverage testing. -- Developed on Python 3.7 -- Tested on CPython 2.7, 3.4, 3.5, 3.6, 3.7 and PyPy, PyPy3 +- Developed on Python 3.9 +- Tested on CPython 3.6, 3.7, 3.8, and 3.9 -.. image:: https://api.travis-ci.org/grantjenks/python-sortedcollections.svg?branch=mas... - :target: http://www.grantjenks.com/docs/sortedcollections/ +.. image:: https://github.com/grantjenks/python-sortedcollections/workflows/integration... + :target: https://github.com/grantjenks/python-sortedcollections/actions?query=workflo... -.. image:: https://ci.appveyor.com/api/projects/status/github/grantjenks/python-sortedc... - :target: http://www.grantjenks.com/docs/sortedcollections/ +.. image:: https://github.com/grantjenks/python-sortedcollections/workflows/release/bad... + :target: https://github.com/grantjenks/python-sortedcollections/actions?query=workflo... Quickstart ---------- @@ -40,7 +41,7 @@ .. code-block:: python >>> from sortedcollections import ValueSortedDict - >>> help(ValueSortedDict) + >>> help(ValueSortedDict) # doctest: +SKIP .. _`Sorted Collections`: http://www.grantjenks.com/docs/sortedcollections/ @@ -49,6 +50,7 @@ - `Value Sorted Dictionary Recipe`_ - `Item Sorted Dictionary Recipe`_ +- `Nearest Dictionary Recipe`_ - `Ordered Dictionary Recipe`_ - `Ordered Set Recipe`_ - `Indexable Dictionary Recipe`_ @@ -57,6 +59,7 @@ .. _`Value Sorted Dictionary Recipe`: http://www.grantjenks.com/docs/sortedcollections/valuesorteddict.html .. _`Item Sorted Dictionary Recipe`: http://www.grantjenks.com/docs/sortedcollections/itemsorteddict.html +.. _`Nearest Dictionary Recipe`: http://www.grantjenks.com/docs/sortedcollections/nearestdict.html .. _`Ordered Dictionary Recipe`: http://www.grantjenks.com/docs/sortedcollections/ordereddict.html .. _`Ordered Set Recipe`: http://www.grantjenks.com/docs/sortedcollections/orderedset.html .. _`Indexable Dictionary Recipe`: http://www.grantjenks.com/docs/sortedcollections/indexabledict.html @@ -79,7 +82,7 @@ Sorted Collections License -------------------------- -Copyright 2015-2019 Grant Jenks +Copyright 2015-2021 Grant Jenks Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-sortedcollections-1.2.1/appveyor.yml new/python-sortedcollections-2.1.0/appveyor.yml --- old/python-sortedcollections-1.2.1/appveyor.yml 2020-06-07 21:53:14.000000000 +0200 +++ new/python-sortedcollections-2.1.0/appveyor.yml 1970-01-01 01:00:00.000000000 +0100 @@ -1,22 +0,0 @@ -environment: - - matrix: - - - PYTHON: "C:\\Python27" - - PYTHON: "C:\\Python35" - - PYTHON: "C:\\Python36" - - PYTHON: "C:\\Python37" - - PYTHON: "C:\\Python27-x64" - - PYTHON: "C:\\Python35-x64" - - PYTHON: "C:\\Python36-x64" - - PYTHON: "C:\\Python37-x64" - -install: - - - "%PYTHON%\\python.exe -m pip install tox" - -build: off - -test_script: - - - "%PYTHON%\\python.exe -m tox -e py" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-sortedcollections-1.2.1/docs/conf.py new/python-sortedcollections-2.1.0/docs/conf.py --- old/python-sortedcollections-1.2.1/docs/conf.py 2020-06-07 21:53:14.000000000 +0200 +++ new/python-sortedcollections-2.1.0/docs/conf.py 2021-01-18 23:01:45.000000000 +0100 @@ -21,8 +21,8 @@ # -- Project information ----------------------------------------------------- project = 'Sorted Collections' -copyright = sortedcollections.__copyright__ -author = sortedcollections.__author__ +copyright = 'Apache 2.0' +author = 'Grant Jenks' # The short X.Y version version = sortedcollections.__version__ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-sortedcollections-1.2.1/docs/index.rst new/python-sortedcollections-2.1.0/docs/index.rst --- old/python-sortedcollections-1.2.1/docs/index.rst 2020-06-07 21:53:14.000000000 +0200 +++ new/python-sortedcollections-2.1.0/docs/index.rst 2021-01-18 23:01:45.000000000 +0100 @@ -5,6 +5,7 @@ valuesorteddict itemsorteddict + nearestdict ordereddict orderedset indexabledict diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-sortedcollections-1.2.1/docs/nearestdict.rst new/python-sortedcollections-2.1.0/docs/nearestdict.rst --- old/python-sortedcollections-1.2.1/docs/nearestdict.rst 1970-01-01 01:00:00.000000000 +0100 +++ new/python-sortedcollections-2.1.0/docs/nearestdict.rst 2021-01-18 23:01:45.000000000 +0100 @@ -0,0 +1,6 @@ +Nearest Dictionary Recipe +========================= + +.. autoclass:: sortedcollections.NearestDict + :special-members: + :members: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-sortedcollections-1.2.1/mypy.ini new/python-sortedcollections-2.1.0/mypy.ini --- old/python-sortedcollections-1.2.1/mypy.ini 1970-01-01 01:00:00.000000000 +0100 +++ new/python-sortedcollections-2.1.0/mypy.ini 2021-01-18 23:01:45.000000000 +0100 @@ -0,0 +1,4 @@ +[mypy] + +[mypy-sortedcontainers.*] +ignore_missing_imports = True diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-sortedcollections-1.2.1/requirements.txt new/python-sortedcollections-2.1.0/requirements.txt --- old/python-sortedcollections-1.2.1/requirements.txt 2020-06-07 21:53:14.000000000 +0200 +++ new/python-sortedcollections-2.1.0/requirements.txt 2021-01-18 23:01:45.000000000 +0100 @@ -1,11 +1,12 @@ +-e . +blue coverage doc8 -gj +mypy pylint pytest pytest-cov rstcheck -sortedcontainers sphinx tox twine diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-sortedcollections-1.2.1/setup.py new/python-sortedcollections-2.1.0/setup.py --- old/python-sortedcollections-1.2.1/setup.py 2020-06-07 21:53:14.000000000 +0200 +++ new/python-sortedcollections-2.1.0/setup.py 2021-01-18 23:01:45.000000000 +0100 @@ -1,3 +1,6 @@ +import pathlib +import re + from setuptools import setup from setuptools.command.test import test as TestCommand @@ -7,8 +10,10 @@ TestCommand.finalize_options(self) self.test_args = [] self.test_suite = True + def run_tests(self): import tox + errno = tox.cmdline(self.test_args) exit(errno) @@ -16,9 +21,13 @@ with open('README.rst') as reader: readme = reader.read() +init_text = (pathlib.Path('sortedcollections') / '__init__.py').read_text() +match = re.search(r"^__version__ = '(.+)'$", init_text, re.MULTILINE) +version = match.group(1) + setup( name='sortedcollections', - version='1.2.1', + version=version, description='Python Sorted Collections', long_description=readme, author='Grant Jenks', @@ -35,15 +44,10 @@ 'License :: OSI Approved :: Apache Software License', 'Natural Language :: English', 'Programming Language :: Python', - 'Programming Language :: Python :: 2', - 'Programming Language :: Python :: 2.7', - 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.2', - 'Programming Language :: Python :: 3.3', - 'Programming Language :: Python :: 3.4', - 'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.7', + 'Programming Language :: Python :: 3.8', + 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: Implementation :: CPython', 'Programming Language :: Python :: Implementation :: PyPy', ), diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-sortedcollections-1.2.1/sortedcollections/__init__.py new/python-sortedcollections-2.1.0/sortedcollections/__init__.py --- old/python-sortedcollections-1.2.1/sortedcollections/__init__.py 2020-06-07 21:53:14.000000000 +0200 +++ new/python-sortedcollections-2.1.0/sortedcollections/__init__.py 2021-01-18 23:01:45.000000000 +0100 @@ -2,23 +2,47 @@ SortedCollections is an Apache2 licensed Python sorted collections library. -:copyright: (c) 2015-2018 by Grant Jenks. +>>> from sortedcollections import ValueSortedDict +>>> vsd = ValueSortedDict({'a': 2, 'b': 1, 'c': 3}) +>>> list(vsd.keys()) +['b', 'a', 'c'] + +:copyright: (c) 2015-2021 by Grant Jenks. :license: Apache 2.0, see LICENSE for more details. """ from sortedcontainers import ( - SortedList, SortedListWithKey, SortedDict, SortedSet + SortedDict, + SortedList, + SortedListWithKey, + SortedSet, ) -from .recipes import IndexableDict, IndexableSet -from .recipes import ItemSortedDict, ValueSortedDict -from .recipes import OrderedSet, SegmentList +from .nearestdict import NearestDict from .ordereddict import OrderedDict +from .recipes import ( + IndexableDict, + IndexableSet, + ItemSortedDict, + OrderedSet, + SegmentList, + ValueSortedDict, +) + +__all__ = [ + 'IndexableDict', + 'IndexableSet', + 'ItemSortedDict', + 'NearestDict', + 'OrderedDict', + 'OrderedSet', + 'SegmentList', + 'SortedDict', + 'SortedList', + 'SortedListWithKey', + 'SortedSet', + 'ValueSortedDict', +] -__title__ = 'sortedcollections' -__version__ = '1.2.1' -__build__ = 0x010201 -__author__ = 'Grant Jenks' -__license__ = 'Apache 2.0' -__copyright__ = 'Copyright 2015-2018 Grant Jenks' +__version__ = '2.1.0' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-sortedcollections-1.2.1/sortedcollections/nearestdict.py new/python-sortedcollections-2.1.0/sortedcollections/nearestdict.py --- old/python-sortedcollections-1.2.1/sortedcollections/nearestdict.py 1970-01-01 01:00:00.000000000 +0100 +++ new/python-sortedcollections-2.1.0/sortedcollections/nearestdict.py 2021-01-18 23:01:45.000000000 +0100 @@ -0,0 +1,123 @@ +"""NearestDict implementation. + +One primary use case for this data structure is storing data by a +`datetime.datetime` or `float` key. +""" + +from sortedcontainers import SortedDict + + +class NearestDict(SortedDict): + """A dict using nearest-key lookup. + + A :class:`SortedDict` subclass that uses nearest-key lookup instead of + exact-key lookup. Optionally, you can specify a rounding mode to return the + nearest key less than or equal to or greater than or equal to the provided + key. + + When using :attr:`NearestDict.NEAREST` the keys must support subtraction to + allow finding the nearest key (by find the key with the smallest difference + to the given one). + + Additional methods: + + * :meth:`NearestDict.nearest_key` + + Example usage: + + >>> d = NearestDict({1.0: 'foo'}) + >>> d[1.0] + 'foo' + >>> d[0.0] + 'foo' + >>> d[2.0] + 'foo' + """ + + NEAREST_PREV = -1 + NEAREST = 0 + NEAREST_NEXT = 1 + + def __init__(self, *args, **kwargs): + """Initialize a NearestDict instance. + + Optional `rounding` argument dictates how + :meth:`NearestDict.nearest_key` rounds. It must be one of + :attr:`NearestDict.NEAREST_NEXT`, :attr:`NearestDict.NEAREST`, or + :attr:`NearestDict.NEAREST_PREV`. (Default: + :attr:`NearestDict.NEAREST`) + + :params rounding: how to round on nearest-key lookup (optional) + :params args: positional arguments for :class:`SortedDict`. + :params kwargs: keyword arguments for :class:`SortedDict`. + """ + self.rounding = kwargs.pop('rounding', self.NEAREST) + super().__init__(*args, **kwargs) + + def nearest_key(self, request): + """Return nearest-key to `request`, respecting `self.rounding`. + + >>> d = NearestDict({1.0: 'foo'}) + >>> d.nearest_key(0.0) + 1.0 + >>> d.nearest_key(2.0) + 1.0 + + >>> d = NearestDict({1.0: 'foo'}, rounding=NearestDict.NEAREST_PREV) + >>> d.nearest_key(0.0) + Traceback (most recent call last): + ... + KeyError: 'No key below 0.0 found' + >>> d.nearest_key(2.0) + 1.0 + + :param request: nearest-key lookup value + :return: key nearest to `request`, respecting `rounding` + :raises KeyError: if no appropriate key can be found + """ + key_list = self.keys() + + if not key_list: + raise KeyError('NearestDict is empty') + + index = self.bisect_left(request) + + if index >= len(key_list): + if self.rounding == self.NEAREST_NEXT: + raise KeyError(f'No key above {request!r} found') + return key_list[index - 1] + if key_list[index] == request: + return key_list[index] + if index == 0 and self.rounding == self.NEAREST_PREV: + raise KeyError(f'No key below {request!r} found') + if self.rounding == self.NEAREST_PREV: + return key_list[index - 1] + if self.rounding == self.NEAREST_NEXT: + return key_list[index] + if abs(key_list[index - 1] - request) < abs(key_list[index] - request): + return key_list[index - 1] + return key_list[index] + + def __getitem__(self, request): + """Return item corresponding to :meth:`.nearest_key`. + + :param request: nearest-key lookup value + :return: item corresponding to key nearest `request` + :raises KeyError: if no appropriate item can be found + + >>> d = NearestDict({1.0: 'foo'}) + >>> d[0.0] + 'foo' + >>> d[2.0] + 'foo' + + >>> d = NearestDict({1.0: 'foo'}, rounding=NearestDict.NEAREST_NEXT) + >>> d[0.0] + 'foo' + >>> d[2.0] + Traceback (most recent call last): + ... + KeyError: 'No key above 2.0 found' + """ + key = self.nearest_key(request) + return super().__getitem__(key) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-sortedcollections-1.2.1/sortedcollections/ordereddict.py new/python-sortedcollections-2.1.0/sortedcollections/ordereddict.py --- old/python-sortedcollections-1.2.1/sortedcollections/ordereddict.py 2020-06-07 21:53:14.000000000 +0200 +++ new/python-sortedcollections-2.1.0/sortedcollections/ordereddict.py 2021-01-18 23:01:45.000000000 +0100 @@ -10,25 +10,12 @@ from .recipes import abc -############################################################################### -# BEGIN Python 2/3 Shims -############################################################################### - -from sys import hexversion # pylint: disable=wrong-import-order - -if hexversion < 0x03000000: - from itertools import imap as map # pylint: disable=no-name-in-module,redefined-builtin,ungrouped-imports - -############################################################################### -# END Python 2/3 Shims -############################################################################### - NONE = object() class KeysView(abc.KeysView, abc.Sequence): "Read-only view of mapping keys." - # pylint: disable=too-few-public-methods,protected-access,too-many-ancestors + # noqa pylint: disable=too-few-public-methods,protected-access,too-many-ancestors def __getitem__(self, index): "``keys_view[index]``" _nums = self._mapping._nums @@ -40,7 +27,7 @@ class ItemsView(abc.ItemsView, abc.Sequence): "Read-only view of mapping items." - # pylint: disable=too-few-public-methods,protected-access,too-many-ancestors + # noqa pylint: disable=too-few-public-methods,protected-access,too-many-ancestors def __getitem__(self, index): "``items_view[index]``" _mapping = self._mapping @@ -56,7 +43,7 @@ class ValuesView(abc.ValuesView, abc.Sequence): "Read-only view of mapping values." - # pylint: disable=too-few-public-methods,protected-access,too-many-ancestors + # noqa pylint: disable=too-few-public-methods,protected-access,too-many-ancestors def __getitem__(self, index): "``items_view[index]``" _mapping = self._mapping @@ -85,6 +72,7 @@ The dict views support the sequence abstract base class. """ + # pylint: disable=super-init-not-called def __init__(self, *args, **kwargs): self._keys = {} @@ -178,7 +166,7 @@ @recursive_repr() def __repr__(self): "Text representation of mapping." - return '%s(%r)' % (self.__class__.__name__, list(self.items())) + return f'{self.__class__.__name__}({list(self.items())!r})' __str__ = __repr__ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-sortedcollections-1.2.1/sortedcollections/recipes.py new/python-sortedcollections-2.1.0/sortedcollections/recipes.py --- old/python-sortedcollections-1.2.1/sortedcollections/recipes.py 2020-06-07 21:53:14.000000000 +0200 +++ new/python-sortedcollections-2.1.0/sortedcollections/recipes.py 2021-01-18 23:01:45.000000000 +0100 @@ -2,23 +2,12 @@ """ +from collections import abc from copy import deepcopy from itertools import count -from sortedcontainers import SortedKeyList, SortedDict, SortedSet -from sortedcontainers.sortedlist import recursive_repr -############################################################################### -# BEGIN Python 2/3 Shims -############################################################################### - -try: - from collections import abc -except ImportError: - import collections as abc - -############################################################################### -# END Python 2/3 Shims -############################################################################### +from sortedcontainers import SortedDict, SortedKeyList, SortedSet +from sortedcontainers.sortedlist import recursive_repr class IndexableDict(SortedDict): @@ -34,8 +23,9 @@ The dict views support the sequence abstract base class. """ + def __init__(self, *args, **kwargs): - super(IndexableDict, self).__init__(hash, *args, **kwargs) + super().__init__(hash, *args, **kwargs) class IndexableSet(SortedSet): @@ -50,9 +40,13 @@ `IndexableSet` implements the sequence abstract base class. """ + # pylint: disable=too-many-ancestors def __init__(self, *args, **kwargs): - super(IndexableSet, self).__init__(*args, key=hash, **kwargs) + super().__init__(*args, key=hash, **kwargs) + + def __reduce__(self): + return self.__class__, (set(self),) class ItemSortedDict(SortedDict): @@ -71,15 +65,18 @@ the callable given as the first argument. """ + def __init__(self, *args, **kwargs): assert args and callable(args[0]) args = list(args) func = self._func = args[0] + def key_func(key): "Apply key function to (key, value) item pair." return func(key, self[key]) + args[0] = key_func - super(ItemSortedDict, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) def __delitem__(self, key): "``del mapping[key]``" @@ -134,24 +131,29 @@ ``sorted`` function. """ + def __init__(self, *args, **kwargs): args = list(args) if args and callable(args[0]): func = self._func = args[0] + def key_func(key): "Apply key function to ``mapping[value]``." return func(self[key]) + args[0] = key_func else: self._func = None + def key_func(key): "Return mapping value for key." return self[key] + if args and args[0] is None: args[0] = key_func else: args.insert(0, key_func) - super(ValueSortedDict, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) def __delitem__(self, key): "``del mapping[key]``" @@ -183,14 +185,8 @@ @recursive_repr() def __repr__(self): - temp = '{0}({1}, {{{2}}})' - items = ', '.join('{0}: {1}'.format(repr(key), repr(self[key])) - for key in self._list) - return temp.format( - self.__class__.__name__, - repr(self._func), - items - ) + items = ', '.join(f'{key!r}: {self[key]!r}' for key in self._list) + return f'{self.__class__.__name__}({self._func!r}, {{{items}}})' class OrderedSet(abc.MutableSet, abc.Sequence): @@ -208,6 +204,7 @@ OrderedSet also implements the collections.Sequence interface. """ + # pylint: disable=too-many-ancestors def __init__(self, iterable=()): # pylint: disable=super-init-not-called @@ -248,7 +245,7 @@ try: return self._keys[value] except KeyError: - raise ValueError('%r is not in %s' % (value, type(self).__name__)) + raise ValueError(f'{value!r} is not in {type(self).__name__}') def add(self, value): "Add element, value, to set." @@ -265,7 +262,7 @@ def __repr__(self): "Text representation of set." - return '%s(%r)' % (type(self).__name__, list(self)) + return f'{type(self).__name__}({list(self)!r})' __str__ = __repr__ @@ -278,9 +275,10 @@ implemented for SegmentList. """ + # pylint: disable=too-many-ancestors def __init__(self, iterable=()): - super(SegmentList, self).__init__(iterable, self.zero) + super().__init__(iterable, self.zero) @staticmethod def zero(_): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-sortedcollections-1.2.1/tests/test_doctest.py new/python-sortedcollections-2.1.0/tests/test_doctest.py --- old/python-sortedcollections-1.2.1/tests/test_doctest.py 1970-01-01 01:00:00.000000000 +0100 +++ new/python-sortedcollections-2.1.0/tests/test_doctest.py 2021-01-18 23:01:45.000000000 +0100 @@ -0,0 +1,23 @@ +import doctest + +import sortedcollections +import sortedcollections.ordereddict +import sortedcollections.recipes + + +def test_sortedcollections(): + failed, attempted = doctest.testmod(sortedcollections) + assert attempted > 0 + assert failed == 0 + + +def test_sortedcollections_ordereddict(): + failed, attempted = doctest.testmod(sortedcollections.ordereddict) + assert attempted > 0 + assert failed == 0 + + +def test_sortedcollections_recipes(): + failed, attempted = doctest.testmod(sortedcollections.recipes) + assert attempted > 0 + assert failed == 0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-sortedcollections-1.2.1/tests/test_itemsorteddict.py new/python-sortedcollections-2.1.0/tests/test_itemsorteddict.py --- old/python-sortedcollections-1.2.1/tests/test_itemsorteddict.py 2020-06-07 21:53:14.000000000 +0200 +++ new/python-sortedcollections-2.1.0/tests/test_itemsorteddict.py 2021-01-18 23:01:45.000000000 +0100 @@ -1,21 +1,28 @@ "Test sortedcollections.ItemSortedDict" import copy + import pytest + from sortedcollections import ItemSortedDict + def key_func(key, value): return key + def value_func(key, value): return value + alphabet = 'abcdefghijklmnopqrstuvwxyz' + def test_init(): temp = ItemSortedDict(key_func) temp._check() + def test_init_args(): temp = ItemSortedDict(key_func, enumerate(alphabet)) assert len(temp) == 26 @@ -24,6 +31,7 @@ assert temp.keys()[4] == 4 temp._check() + def test_init_kwargs(): temp = ItemSortedDict(key_func, a=0, b=1, c=2) assert len(temp) == 3 @@ -31,22 +39,26 @@ assert temp.keys()[0] == 'a' temp._check() + def test_getitem(): temp = ItemSortedDict(value_func, enumerate(reversed(alphabet))) assert temp[0] == 'z' assert temp.keys()[0] == 25 assert list(temp) == list(reversed(range(26))) + def test_delitem(): temp = ItemSortedDict(value_func, enumerate(reversed(alphabet))) del temp[25] assert temp.keys()[0] == 24 + def test_delitem_error(): temp = ItemSortedDict(value_func, enumerate(reversed(alphabet))) with pytest.raises(KeyError): del temp[-1] + def test_setitem(): temp = ItemSortedDict(value_func, enumerate(reversed(alphabet))) temp[25] = '!' @@ -56,18 +68,21 @@ temp[25] = 'a' assert iloc[0] == 25 + def test_copy(): temp = ItemSortedDict(value_func, enumerate(reversed(alphabet))) that = temp.copy() assert temp == that assert temp._key != that._key + def test_deepcopy(): temp = ItemSortedDict(value_func, enumerate(reversed(alphabet))) that = copy.deepcopy(temp) assert temp == that assert temp._key != that._key + def test_update(): temp = ItemSortedDict(lambda key, value: value) for index, letter in enumerate(alphabet): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-sortedcollections-1.2.1/tests/test_nearestdict.py new/python-sortedcollections-2.1.0/tests/test_nearestdict.py --- old/python-sortedcollections-1.2.1/tests/test_nearestdict.py 1970-01-01 01:00:00.000000000 +0100 +++ new/python-sortedcollections-2.1.0/tests/test_nearestdict.py 2021-01-18 23:01:45.000000000 +0100 @@ -0,0 +1,72 @@ +import pytest + +from sortedcollections import NearestDict + + +def test_basic(): + d = NearestDict() + + with pytest.raises(KeyError): + d[0] + + d[0] = 'a' + assert d[0] == 'a' + d[0] = 'b' + assert d[0] == 'b' + + +def test_iteration(): + # In sorted order by key + exp_items = ( + (0, 'a'), + (1, 'b'), + (2, 'c'), + ) + + d = NearestDict() + for k, v in exp_items: + d[k] = v + + for act, exp in zip(d.items(), exp_items): + assert act == exp + + +def test_nearest(): + d = NearestDict(rounding=NearestDict.NEAREST) + + d[0] = 'a' + d[3] = 'b' + assert d[-1] == 'a' + assert d[0] == 'a' + assert d[1] == 'a' + assert d[2] == 'b' + assert d[3] == 'b' + assert d[4] == 'b' + + +def test_nearest_prev(): + d = NearestDict(rounding=NearestDict.NEAREST_PREV) + + d[0] = 'a' + d[3] = 'b' + with pytest.raises(KeyError): + d[-1] + assert d[0] == 'a' + assert d[1] == 'a' + assert d[2] == 'a' + assert d[3] == 'b' + assert d[4] == 'b' + + +def test_nearest_next(): + d = NearestDict(rounding=NearestDict.NEAREST_NEXT) + + d[0] = 'a' + d[3] = 'b' + assert d[-1] == 'a' + assert d[0] == 'a' + assert d[1] == 'b' + assert d[2] == 'b' + assert d[3] == 'b' + with pytest.raises(KeyError): + d[4] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-sortedcollections-1.2.1/tests/test_ordereddict.py new/python-sortedcollections-2.1.0/tests/test_ordereddict.py --- old/python-sortedcollections-1.2.1/tests/test_ordereddict.py 2020-06-07 21:53:14.000000000 +0200 +++ new/python-sortedcollections-2.1.0/tests/test_ordereddict.py 2021-01-18 23:01:45.000000000 +0100 @@ -1,11 +1,14 @@ "Test sortedcollections.OrderedDict" import pickle + import pytest + from sortedcollections import OrderedDict pairs = dict(enumerate(range(10))) + def test_init(): od = OrderedDict() assert len(od) == 0 @@ -20,14 +23,18 @@ assert len(od) == 10 od._check() + def test_setitem(): od = OrderedDict() od['alice'] = 0 od['bob'] = 1 od['carol'] = 2 assert len(od) == 3 + od['carol'] = 2 + assert len(od) == 3 od._check() + def test_delitem(): od = OrderedDict(pairs) assert len(od) == 10 @@ -36,12 +43,14 @@ assert len(od) == 0 od._check() + def test_iter_reversed(): od = OrderedDict([('b', 0), ('a', 1), ('c', 2)]) assert list(od) == ['b', 'a', 'c'] assert list(reversed(od)) == ['c', 'a', 'b'] od._check() + def test_clear(): od = OrderedDict(pairs) assert len(od) == 10 @@ -49,6 +58,7 @@ assert len(od) == 0 od._check() + def test_popitem(): od = OrderedDict(enumerate(range(10))) for num in reversed(range(10)): @@ -62,12 +72,14 @@ assert num == key == value od._check() + def test_keys(): od = OrderedDict(enumerate(range(10))) assert list(reversed(od.keys())) == list(reversed(range(10))) assert od.keys()[:3] == [0, 1, 2] od._check() + def test_items(): items = list(enumerate(range(10))) od = OrderedDict(enumerate(range(10))) @@ -75,12 +87,14 @@ assert od.items()[:3] == [(0, 0), (1, 1), (2, 2)] od._check() + def test_values(): od = OrderedDict(enumerate(range(10))) assert list(reversed(od.values())) == list(reversed(range(10))) assert od.values()[:3] == [0, 1, 2] od._check() + def test_iloc(): od = OrderedDict(enumerate(range(10))) iloc = od.keys() @@ -90,6 +104,7 @@ assert len(iloc) == 10 od._check() + def test_pop(): od = OrderedDict(enumerate(range(10))) for num in range(10): @@ -99,43 +114,50 @@ assert od.pop(1, default='thing') == 'thing' od._check() + def test_pop_error(): od = OrderedDict() with pytest.raises(KeyError): od.pop(0) + def test_setdefault(): od = OrderedDict() od.setdefault(0, False) - assert od[0] == False + assert od[0] is False od.setdefault(1, default=True) - assert od[1] == True + assert od[1] is True od.setdefault(2) - assert od[2] == None - assert od.setdefault(0) == False - assert od.setdefault(1) == True + assert od[2] is None + assert od.setdefault(0) is False + assert od.setdefault(1) is True + def test_repr(): od = OrderedDict() assert repr(od) == 'OrderedDict([])' assert str(od) == 'OrderedDict([])' + def test_reduce(): od = OrderedDict(enumerate(range(10))) data = pickle.dumps(od) copy = pickle.loads(data) assert od == copy + def test_copy(): od = OrderedDict(enumerate(range(10))) copy = od.copy() assert od == copy + def test_fromkeys(): od = OrderedDict.fromkeys('abc') assert od == {'a': None, 'b': None, 'c': None} od._check() + def test_equality(): od = OrderedDict.fromkeys('abc') assert od == {'a': None, 'b': None, 'c': None} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-sortedcollections-1.2.1/tests/test_orderedset.py new/python-sortedcollections-2.1.0/tests/test_orderedset.py --- old/python-sortedcollections-1.2.1/tests/test_orderedset.py 2020-06-07 21:53:14.000000000 +0200 +++ new/python-sortedcollections-2.1.0/tests/test_orderedset.py 2021-01-18 23:01:45.000000000 +0100 @@ -1,7 +1,9 @@ "Test sortedcollections.OrderedSet." -import pytest import random + +import pytest + from sortedcollections import OrderedSet @@ -9,6 +11,7 @@ os = OrderedSet() assert len(os) == 0 + def test_contains(): os = OrderedSet(range(100)) assert len(os) == 100 @@ -18,6 +21,7 @@ assert -1 not in os assert 100 not in os + def test_iter(): os = OrderedSet(range(100)) assert list(os) == list(range(100)) @@ -25,6 +29,7 @@ os = OrderedSet(names) assert list(os) == names + def test_reversed(): os = OrderedSet(range(100)) assert list(reversed(os)) == list(reversed(range(100))) @@ -32,6 +37,7 @@ os = OrderedSet(names) assert list(reversed(os)) == list(reversed(names)) + def test_getitem(): values = list(range(100)) random.shuffle(values) @@ -40,6 +46,7 @@ for index in range(len(os)): assert os[index] == values[index] + def test_index(): values = list(range(100)) random.shuffle(values) @@ -48,25 +55,31 @@ for value in values: assert values.index(value) == os.index(value) + def test_index_error(): os = OrderedSet(range(10)) with pytest.raises(ValueError): os.index(10) + def test_add(): os = OrderedSet() for value in range(100): os.add(value) assert len(os) == 100 + os.add(0) + assert len(os) == 100 for value in range(100): assert value in os + def test_discard(): os = OrderedSet(range(100)) for value in range(200): os.discard(value) assert len(os) == 0 + def test_repr(): os = OrderedSet() assert repr(os) == 'OrderedSet([])' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-sortedcollections-1.2.1/tests/test_recipes.py new/python-sortedcollections-2.1.0/tests/test_recipes.py --- old/python-sortedcollections-1.2.1/tests/test_recipes.py 2020-06-07 21:53:14.000000000 +0200 +++ new/python-sortedcollections-2.1.0/tests/test_recipes.py 2021-01-18 23:01:45.000000000 +0100 @@ -1,6 +1,9 @@ "Test sortedcollections.recipes" +import pickle + import pytest + from sortedcollections import IndexableDict, IndexableSet, SegmentList @@ -10,11 +13,20 @@ for value in range(10): assert iloc[value] == value + def test_index_set(): set_values = IndexableSet(range(10)) for index in range(10): assert set_values[index] == index + +def test_index_set_pickle(): + set_values1 = IndexableSet(range(10)) + data = pickle.dumps(set_values1) + set_values2 = pickle.loads(data) + assert set_values1 == set_values2 + + def test_segment_list(): values = [5, 1, 3, 2, 4, 8, 6, 7, 9, 0] sl = SegmentList(values) @@ -35,11 +47,13 @@ sl.insert(6, 'e') assert list(sl) == [0, 1, 'c', 'd', 3, 4, 'e'] + def test_segment_list_bisect(): sl = SegmentList() with pytest.raises(NotImplementedError): sl.bisect(0) + def test_segment_list_setitem_slice(): sl = SegmentList() with pytest.raises(NotImplementedError): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-sortedcollections-1.2.1/tests/test_valuesorteddict.py new/python-sortedcollections-2.1.0/tests/test_valuesorteddict.py --- old/python-sortedcollections-1.2.1/tests/test_valuesorteddict.py 2020-06-07 21:53:14.000000000 +0200 +++ new/python-sortedcollections-2.1.0/tests/test_valuesorteddict.py 2021-01-18 23:01:45.000000000 +0100 @@ -1,19 +1,24 @@ "Test sortedcollections.ValueSortedDict" -import copy import pickle + import pytest + from sortedcollections import ValueSortedDict + def identity(value): return value + alphabet = 'abcdefghijklmnopqrstuvwxyz' + def test_init(): temp = ValueSortedDict() temp._check() + def test_init_args(): temp = ValueSortedDict(enumerate(alphabet)) assert len(temp) == 26 @@ -22,6 +27,7 @@ assert temp.keys()[4] == 4 temp._check() + def test_init_kwargs(): temp = ValueSortedDict(None, a=0, b=1, c=2) assert len(temp) == 3 @@ -29,22 +35,26 @@ assert temp.keys()[0] == 'a' temp._check() + def test_getitem(): temp = ValueSortedDict(identity, enumerate(reversed(alphabet))) assert temp[0] == 'z' assert temp.keys()[0] == 25 assert list(temp) == list(reversed(range(26))) + def test_delitem(): temp = ValueSortedDict(identity, enumerate(reversed(alphabet))) del temp[25] assert temp.keys()[0] == 24 + def test_delitem_error(): temp = ValueSortedDict(identity, enumerate(reversed(alphabet))) with pytest.raises(KeyError): del temp[-1] + def test_setitem(): temp = ValueSortedDict(identity, enumerate(reversed(alphabet))) temp[25] = '!' @@ -53,28 +63,34 @@ temp[25] = 'a' assert temp.keys()[0] == 25 + def test_copy(): temp = ValueSortedDict(identity, enumerate(reversed(alphabet))) that = temp.copy() assert temp == that assert temp._key != that._key + def test_pickle(): original = ValueSortedDict(identity, enumerate(reversed(alphabet))) data = pickle.dumps(original) duplicate = pickle.loads(data) assert original == duplicate -class Negater(object): + +class Negater: def __call__(self, value): return -value + def __repr__(self): return 'negate' + def test_repr(): temp = ValueSortedDict(Negater()) assert repr(temp) == 'ValueSortedDict(negate, {})' + def test_update(): temp = ValueSortedDict() for index, letter in enumerate(alphabet): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-sortedcollections-1.2.1/tox.ini new/python-sortedcollections-2.1.0/tox.ini --- old/python-sortedcollections-1.2.1/tox.ini 2020-06-07 21:53:14.000000000 +0200 +++ new/python-sortedcollections-2.1.0/tox.ini 2021-01-18 23:01:45.000000000 +0100 @@ -1,17 +1,74 @@ [tox] -envlist=py27,py34,py35,py36,py37,pypy,pypy3,lint +envlist=bluecheck,doc8,docs,isortcheck,flake8,mypy,pylint,rstcheck,py36,py37,py38,py39 skip_missing_interpreters=True [testenv] -deps=pytest -commands=python -m pytest +commands=pytest +deps= + pytest + pytest-cov -[pytest] -addopts= - --doctest-modules - --doctest-glob "*.rst" -testpaths=docs sortedcollections tests +[testenv:blue] +commands=blue {toxinidir}/setup.py {toxinidir}/sortedcollections {toxinidir}/tests +deps=blue + +[testenv:bluecheck] +commands=blue --check {toxinidir}/setup.py {toxinidir}/sortedcollections {toxinidir}/tests +deps=blue + +[testenv:doc8] +deps=doc8 +commands=doc8 docs + +[testenv:docs] +allowlist_externals=make +changedir=docs +commands=make html +deps=sphinx + +[testenv:flake8] +commands=flake8 {toxinidir}/setup.py {toxinidir}/sortedcollections {toxinidir}/tests +deps=flake8 + +[testenv:isort] +commands=isort {toxinidir}/setup.py {toxinidir}/sortedcollections {toxinidir}/tests +deps=isort + +[testenv:isortcheck] +commands=isort --check {toxinidir}/setup.py {toxinidir}/sortedcollections {toxinidir}/tests +deps=isort -[testenv:lint] +[testenv:mypy] +commands=mypy {toxinidir}/sortedcollections +deps=mypy + +[testenv:pylint] +commands=pylint {toxinidir}/sortedcollections deps=pylint -commands=pylint sortedcollections + +[testenv:rstcheck] +commands=rstcheck {toxinidir}/README.rst +deps=rstcheck + +[testenv:uploaddocs] +allowlist_externals=rsync +changedir=docs +commands= + rsync -azP --stats --delete _build/html/ \ + grantjenks.com:/srv/www/www.grantjenks.com/public/docs/sortedcollections/ + +[isort] +multi_line_output = 3 +include_trailing_comma = True +force_grid_wrap = 0 +use_parentheses = True +ensure_newline_before_comments = True +line_length = 79 + +[pytest] +addopts= + --cov-branch + --cov-fail-under=100 + --cov-report=term-missing + --cov=sortedcollections + --doctest-glob="*.rst"
participants (1)
-
Source-Sync