From 7d6e0635f92c350709b9ad469da18dacf8bac035 Mon Sep 17 00:00:00 2001 From: Eugenio Lacuesta Date: Wed, 9 Mar 2022 12:34:52 -0300 Subject: [PATCH 01/16] Python 3.10 compatibility --- .github/workflows/main.yml | 12 +++++++++--- scrapinghub/hubstorage/resourcetype.py | 11 +++++++---- setup.py | 3 +++ 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 84ee2faf..9e39ee3c 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -12,7 +12,7 @@ jobs: strategy: fail-fast: false matrix: - include: + include: - python-version: "2.7" env: TOXENV: "msgpack" @@ -50,7 +50,13 @@ jobs: - python-version: "3.9" env: TOXENV: "json" - + - python-version: "3.10" + env: + TOXENV: "msgpack" + - python-version: "3.10" + env: + TOXENV: "json" + steps: - uses: actions/checkout@v2 - name: Set up Python ${{ matrix.python-version }} @@ -65,4 +71,4 @@ jobs: tox - name: Upload to codecov - uses: codecov/codecov-action@v2 \ No newline at end of file + uses: codecov/codecov-action@v2 diff --git a/scrapinghub/hubstorage/resourcetype.py b/scrapinghub/hubstorage/resourcetype.py index 22ef4287..9ee9c603 100644 --- a/scrapinghub/hubstorage/resourcetype.py +++ b/scrapinghub/hubstorage/resourcetype.py @@ -1,12 +1,15 @@ -import time import json -import socket import logging -from collections import MutableMapping +import socket +import time +try: + from collections.abc import MutableMapping +except ImportError: + from collections import MutableMapping import six -from six.moves import range import requests.exceptions as rexc +from six.moves import range from .utils import urlpathjoin, xauth from .serialization import jlencode, jldecode, mpdecode diff --git a/setup.py b/setup.py index 392d7e08..bf3e3f26 100644 --- a/setup.py +++ b/setup.py @@ -40,6 +40,9 @@ '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 :: 3.10', 'Programming Language :: Python :: Implementation :: CPython', 'Programming Language :: Python :: Implementation :: PyPy', 'Topic :: Internet :: WWW/HTTP', From e432838d3f864e16e5d0299fd20c2383d4aac782 Mon Sep 17 00:00:00 2001 From: Eugenio Lacuesta Date: Wed, 9 Mar 2022 12:58:01 -0300 Subject: [PATCH 02/16] Adjust min py version and requirements --- .gitignore | 1 + requirements-test.txt | 8 +++----- setup.py | 5 +---- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/.gitignore b/.gitignore index 90cc1e43..82b21c48 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ docs/_build .DS_Store pytestdebug.log .idea +coverage.xml diff --git a/requirements-test.txt b/requirements-test.txt index 94ae69f0..dc00d045 100644 --- a/requirements-test.txt +++ b/requirements-test.txt @@ -1,8 +1,6 @@ mock -vcrpy==1.10.3 -# FIXME remove the constraint after resolving -# https://github.com/pytest-dev/pytest/issues/2966 -pytest<3.3.0 -pytest-cov<2.6.0 +vcrpy +pytest +pytest-cov pytest-catchlog responses==0.10.6 diff --git a/setup.py b/setup.py index bf3e3f26..4ace731c 100644 --- a/setup.py +++ b/setup.py @@ -28,16 +28,13 @@ package_data={'scrapinghub': ['VERSION']}, install_requires=['requests>=1.0', 'retrying>=1.3.3', 'six>=1.10.0'], extras_require={'msgpack': mpack_required}, + python_requires='>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*', classifiers=[ 'Development Status :: 5 - Production/Stable', 'License :: OSI Approved :: BSD License', 'Operating System :: OS Independent', 'Programming Language :: Python', - 'Programming Language :: Python :: 2', 'Programming Language :: Python :: 2.7', - 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.3', - 'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', From 1f6f39a47adbdc343fad24eae61e563c67a1be67 Mon Sep 17 00:00:00 2001 From: Eugenio Lacuesta Date: Wed, 9 Mar 2022 13:13:08 -0300 Subject: [PATCH 03/16] six.moves.collections_abc --- scrapinghub/hubstorage/resourcetype.py | 8 ++------ tests/client/test_frontiers.py | 6 +++--- tests/client/test_job.py | 5 ++--- tests/client/test_projects.py | 6 +++--- 4 files changed, 10 insertions(+), 15 deletions(-) diff --git a/scrapinghub/hubstorage/resourcetype.py b/scrapinghub/hubstorage/resourcetype.py index 9ee9c603..3ad8f545 100644 --- a/scrapinghub/hubstorage/resourcetype.py +++ b/scrapinghub/hubstorage/resourcetype.py @@ -2,14 +2,10 @@ import logging import socket import time -try: - from collections.abc import MutableMapping -except ImportError: - from collections import MutableMapping import six import requests.exceptions as rexc -from six.moves import range +from six.moves import range, collections_abc from .utils import urlpathjoin, xauth from .serialization import jlencode, jldecode, mpdecode @@ -233,7 +229,7 @@ def stats(self): return next(self.apiget('stats', chunk_size=STATS_CHUNK_SIZE)) -class MappingResourceType(ResourceType, MutableMapping): +class MappingResourceType(ResourceType, collections_abc.MutableMapping): _cached = None ignore_fields = () diff --git a/tests/client/test_frontiers.py b/tests/client/test_frontiers.py index 1dbcb827..b20cffb7 100644 --- a/tests/client/test_frontiers.py +++ b/tests/client/test_frontiers.py @@ -1,8 +1,8 @@ import time from types import GeneratorType -from collections import Iterable from six import string_types +from six.moves import collections_abc from scrapinghub.client.frontiers import Frontiers, Frontier, FrontierSlot from ..conftest import TEST_FRONTIER_SLOT @@ -36,7 +36,7 @@ def test_frontiers(project, frontier, frontier_name): # test for iter() method frontiers_names = frontiers.iter() - assert isinstance(frontiers_names, Iterable) + assert isinstance(frontiers_names, collections_abc.Iterable) assert frontier_name in list(frontiers_names) # test for list() method @@ -58,7 +58,7 @@ def test_frontier(project, frontier): _add_test_requests_to_frontier(frontier) slots = frontier.iter() - assert isinstance(slots, Iterable) + assert isinstance(slots, collections_abc.Iterable) assert TEST_FRONTIER_SLOT in list(slots) slots = frontier.list() diff --git a/tests/client/test_job.py b/tests/client/test_job.py index 2f31f680..7c36d12a 100644 --- a/tests/client/test_job.py +++ b/tests/client/test_job.py @@ -1,6 +1,5 @@ -from collections import Iterator - import pytest +from six.moves import collections_abc from scrapinghub.client.items import Items from scrapinghub.client.jobs import Job @@ -224,7 +223,7 @@ def test_metadata_delete(spider): def test_metadata_iter_list(spider): job = spider.jobs.run(meta={'meta1': 'data1', 'meta2': 'data2'}) meta_iter = job.metadata.iter() - assert isinstance(meta_iter, Iterator) + assert isinstance(meta_iter, collections_abc.Iterator) meta_list = job.metadata.list() assert ('meta1', 'data1') in meta_list assert ('meta2', 'data2') in meta_list diff --git a/tests/client/test_projects.py b/tests/client/test_projects.py index 1d2299bd..65eb831e 100644 --- a/tests/client/test_projects.py +++ b/tests/client/test_projects.py @@ -1,10 +1,10 @@ import types -from collections import defaultdict, Iterator +from collections import defaultdict import pytest import responses -from six.moves import range from requests.compat import urljoin +from six.moves import range, collections_abc from scrapinghub import ScrapinghubClient from scrapinghub.client.activity import Activity @@ -288,7 +288,7 @@ def test_settings_delete(project): def test_settings_iter_list(project): project.settings.set('job_runtime_limit', 24) settings_iter = project.settings.iter() - assert isinstance(settings_iter, Iterator) + assert isinstance(settings_iter, collections_abc.Iterator) settings_list = project.settings.list() assert ('job_runtime_limit', 24) in settings_list assert settings_list == list(settings_iter) From 1652331d44c36bd5221cfebaac9d271443a68d8f Mon Sep 17 00:00:00 2001 From: Eugenio Lacuesta Date: Wed, 9 Mar 2022 13:39:58 -0300 Subject: [PATCH 04/16] Restore requirements --- requirements-test.txt | 8 +++++--- tox.ini | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/requirements-test.txt b/requirements-test.txt index dc00d045..94ae69f0 100644 --- a/requirements-test.txt +++ b/requirements-test.txt @@ -1,6 +1,8 @@ mock -vcrpy -pytest -pytest-cov +vcrpy==1.10.3 +# FIXME remove the constraint after resolving +# https://github.com/pytest-dev/pytest/issues/2966 +pytest<3.3.0 +pytest-cov<2.6.0 pytest-catchlog responses==0.10.6 diff --git a/tox.ini b/tox.ini index 950b849c..e002e0fc 100644 --- a/tox.ini +++ b/tox.ini @@ -12,4 +12,4 @@ deps = -r{toxinidir}/requirements-test.txt msgpack: -r{toxinidir}/requirements.txt pypy-msgpack: -r{toxinidir}/requirements-pypy.txt -commands = py.test --cov=scrapinghub --cov-report=xml \ No newline at end of file +commands = py.test --cov=scrapinghub --cov-report=xml {posargs: scrapinghub tests} From e3544a913532c31238886b940c77e768c44466f6 Mon Sep 17 00:00:00 2001 From: Eugenio Lacuesta Date: Wed, 9 Mar 2022 14:21:36 -0300 Subject: [PATCH 05/16] Unpin test requirements --- requirements-test.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements-test.txt b/requirements-test.txt index 94ae69f0..2683bc77 100644 --- a/requirements-test.txt +++ b/requirements-test.txt @@ -1,8 +1,8 @@ mock -vcrpy==1.10.3 +vcrpy # FIXME remove the constraint after resolving # https://github.com/pytest-dev/pytest/issues/2966 pytest<3.3.0 -pytest-cov<2.6.0 +pytest-cov pytest-catchlog responses==0.10.6 From b09bb084215157879e5df2cba61cc38edd23614f Mon Sep 17 00:00:00 2001 From: Eugenio Lacuesta Date: Wed, 9 Mar 2022 14:36:46 -0300 Subject: [PATCH 06/16] Update test requirements, remove py27 --- .github/workflows/main.yml | 6 ------ requirements-test.txt | 2 +- setup.py | 3 +-- 3 files changed, 2 insertions(+), 9 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 9e39ee3c..fee77d57 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -13,12 +13,6 @@ jobs: fail-fast: false matrix: include: - - python-version: "2.7" - env: - TOXENV: "msgpack" - - python-version: "2.7" - env: - TOXENV: "json" - python-version: "pypy3" env: TOXENV: "msgpack" diff --git a/requirements-test.txt b/requirements-test.txt index 2683bc77..4a3de029 100644 --- a/requirements-test.txt +++ b/requirements-test.txt @@ -2,7 +2,7 @@ mock vcrpy # FIXME remove the constraint after resolving # https://github.com/pytest-dev/pytest/issues/2966 -pytest<3.3.0 +pytest<=3.7.0 pytest-cov pytest-catchlog responses==0.10.6 diff --git a/setup.py b/setup.py index 4ace731c..42c42c6b 100644 --- a/setup.py +++ b/setup.py @@ -28,13 +28,12 @@ package_data={'scrapinghub': ['VERSION']}, install_requires=['requests>=1.0', 'retrying>=1.3.3', 'six>=1.10.0'], extras_require={'msgpack': mpack_required}, - python_requires='>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*', + python_requires='>=3.6', classifiers=[ 'Development Status :: 5 - Production/Stable', 'License :: OSI Approved :: BSD License', 'Operating System :: OS Independent', 'Programming Language :: Python', - 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', From 68ecec493f0ec3884b50b92e9f90911bf3da4faf Mon Sep 17 00:00:00 2001 From: Eugenio Lacuesta Date: Wed, 9 Mar 2022 15:02:22 -0300 Subject: [PATCH 07/16] Remove/unpin more test requirements --- requirements-test.txt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/requirements-test.txt b/requirements-test.txt index 4a3de029..a0755ae6 100644 --- a/requirements-test.txt +++ b/requirements-test.txt @@ -1,8 +1,6 @@ mock vcrpy -# FIXME remove the constraint after resolving -# https://github.com/pytest-dev/pytest/issues/2966 +# FIXME vcrpy cassette fails after this version pytest<=3.7.0 pytest-cov -pytest-catchlog -responses==0.10.6 +responses From df4f7a3bb4bd5a46bfdb5aaa9af5c4bd91fd8bf3 Mon Sep 17 00:00:00 2001 From: Eugenio Lacuesta Date: Wed, 9 Mar 2022 15:20:23 -0300 Subject: [PATCH 08/16] Conditional requirements --- requirements-test.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/requirements-test.txt b/requirements-test.txt index a0755ae6..07b7ff81 100644 --- a/requirements-test.txt +++ b/requirements-test.txt @@ -1,6 +1,7 @@ mock vcrpy # FIXME vcrpy cassette fails after this version -pytest<=3.7.0 +pytest<=3.7.0; python_version < '3.10' +pytest; python_version >= '3.10' pytest-cov responses From a29a80f4af67eed450eb92f489f7036b15884c4f Mon Sep 17 00:00:00 2001 From: Eugenio Lacuesta Date: Wed, 9 Mar 2022 17:26:37 -0300 Subject: [PATCH 09/16] Update more collections module occurrences --- scrapinghub/client/collections.py | 12 ++++++------ scrapinghub/client/frontiers.py | 8 ++++---- scrapinghub/client/items.py | 2 +- scrapinghub/client/projects.py | 2 +- scrapinghub/client/proxy.py | 4 ++-- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/scrapinghub/client/collections.py b/scrapinghub/client/collections.py index b8462918..b88c04df 100644 --- a/scrapinghub/client/collections.py +++ b/scrapinghub/client/collections.py @@ -1,7 +1,7 @@ from __future__ import absolute_import -import collections from six import string_types +from six.moves import collections_abc from ..hubstorage.collectionsrt import Collection as _Collection @@ -82,7 +82,7 @@ def iter(self): :return: an iterator over collections list where each collection is represented by a dictionary with ('name','type') fields. - :rtype: :class:`collections.Iterable[dict]` + :rtype: :class:`collections.abc.Iterable[dict]` """ return self._origin.apiget('list') @@ -130,9 +130,9 @@ class Collection(object): >>> for elem in foo_store.iter(count=1)): ... print(elem) [{'_key': '002d050ee3ff6192dcbecc4e4b4457d7', 'value': '1447221694537'}] - + - get generator over item keys:: - + >>> keys = foo_store.iter(nodata=True, meta=["_key"])) >>> next(keys) {'_key': '002d050ee3ff6192dcbecc4e4b4457d7'} @@ -185,7 +185,7 @@ def delete(self, keys): The method returns ``None`` (original method returns an empty generator). """ if (not isinstance(keys, string_types) and - not isinstance(keys, collections.Iterable)): + not isinstance(keys, collections_abc.Iterable)): raise ValueError("You should provide string key or iterable " "object providing string keys") self._origin.delete(keys) @@ -219,7 +219,7 @@ def iter(self, key=None, prefix=None, prefixcount=None, startts=None, :param requests_params: (optional) a dict with optional requests params. :param \*\*params: (optional) additional query params for the request. :return: an iterator over items list. - :rtype: :class:`collections.Iterable[dict]` + :rtype: :class:`collections.abc.Iterable[dict]` """ update_kwargs(params, key=key, prefix=prefix, prefixcount=prefixcount, startts=startts, endts=endts, diff --git a/scrapinghub/client/frontiers.py b/scrapinghub/client/frontiers.py index 72f4edd4..3fd70c76 100644 --- a/scrapinghub/client/frontiers.py +++ b/scrapinghub/client/frontiers.py @@ -99,7 +99,7 @@ def iter(self): """Iterate through frontiers. :return: an iterator over frontiers names. - :rtype: :class:`collections.Iterable[str]` + :rtype: :class:`collections.abc.Iterable[str]` """ return iter(self.list()) @@ -174,7 +174,7 @@ def iter(self): """Iterate through slots. :return: an iterator over frontier slots names. - :rtype: :class:`collections.Iterable[str]` + :rtype: :class:`collections.abc.Iterable[str]` """ return iter(self.list()) @@ -321,7 +321,7 @@ def iter(self, **params): :param \*\*params: (optional) additional query params for the request. :return: an iterator over fingerprints. - :rtype: :class:`collections.Iterable[str]` + :rtype: :class:`collections.abc.Iterable[str]` """ origin = self._frontier._frontiers._origin path = (self._frontier.key, 's', self.key, 'f') @@ -358,7 +358,7 @@ def iter(self, mincount=None, **params): :param \*\*params: (optional) additional query params for the request. :return: an iterator over request batches in the queue where each batch is represented with a dict with ('id', 'requests') field. - :rtype: :class:`collections.Iterable[dict]` + :rtype: :class:`collections.abc.Iterable[dict]` """ origin = self._frontier._frontiers._origin path = (self._frontier.key, 's', self.key, 'q') diff --git a/scrapinghub/client/items.py b/scrapinghub/client/items.py index d22e2701..e9be38c0 100644 --- a/scrapinghub/client/items.py +++ b/scrapinghub/client/items.py @@ -107,7 +107,7 @@ def list_iter(self, chunksize=1000, *args, **kwargs): down by `chunksize`. :return: an iterator over items, yielding lists of items. - :rtype: :class:`collections.Iterable` + :rtype: :class:`collections.abc.Iterable` """ start = kwargs.pop("start", 0) diff --git a/scrapinghub/client/projects.py b/scrapinghub/client/projects.py index 35f93eae..a67f3266 100644 --- a/scrapinghub/client/projects.py +++ b/scrapinghub/client/projects.py @@ -63,7 +63,7 @@ def iter(self): Provided for the sake of API consistency. :return: an iterator over project ids list. - :rtype: :class:`collections.Iterable[int]` + :rtype: :class:`collections.abc.Iterable[int]` """ return iter(self.list()) diff --git a/scrapinghub/client/proxy.py b/scrapinghub/client/proxy.py index 6133b573..f7d10b4d 100644 --- a/scrapinghub/client/proxy.py +++ b/scrapinghub/client/proxy.py @@ -106,7 +106,7 @@ def iter(self, _path=None, count=None, requests_params=None, **apiparams): :param count: limit amount of elements. :return: an iterator over elements list. - :rtype: :class:`collections.Iterable` + :rtype: :class:`collections.abc.Iterable` """ update_kwargs(apiparams, count=count) apiparams = self._modify_iter_params(apiparams) @@ -165,7 +165,7 @@ def iter(self): """Iterate through key/value pairs. :return: an iterator over key/value pairs. - :rtype: :class:`collections.Iterable` + :rtype: :class:`collections.abc.Iterable` """ return six.iteritems(next(self._origin.apiget())) From 5cc3e1bcce770650af30114e0f051c0e8a5cd44b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A1n=20Chaves?= Date: Thu, 10 Mar 2022 11:50:49 +0100 Subject: [PATCH 10/16] Fix VCR fixtures --- tests/client/conftest.py | 2 +- tests/hubstorage/conftest.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/client/conftest.py b/tests/client/conftest.py index 1b62cafd..8d253c0d 100644 --- a/tests/client/conftest.py +++ b/tests/client/conftest.py @@ -66,8 +66,8 @@ def project(client): return client.get_project(TEST_PROJECT_ID) -@my_vcr.use_cassette() @pytest.fixture(scope='session') +@my_vcr.use_cassette() def spider(project, request): # on normal conditions you can't create a new spider this way: # it can only be created on project deploy as usual diff --git a/tests/hubstorage/conftest.py b/tests/hubstorage/conftest.py index ba2354fb..6ede3546 100644 --- a/tests/hubstorage/conftest.py +++ b/tests/hubstorage/conftest.py @@ -62,8 +62,8 @@ def hsproject(hsclient): return hsclient.get_project(TEST_PROJECT_ID) -@my_vcr.use_cassette() @pytest.fixture(scope='session') +@my_vcr.use_cassette() def hsspiderid(hsproject): return str(hsproject.ids.spider(TEST_SPIDER_NAME, create=1)) From 4d8983057e589871d01a0969381de82f684cfb42 Mon Sep 17 00:00:00 2001 From: Eugenio Lacuesta Date: Thu, 10 Mar 2022 08:23:02 -0300 Subject: [PATCH 11/16] Unpin pytest version --- requirements-test.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/requirements-test.txt b/requirements-test.txt index 07b7ff81..566f2b32 100644 --- a/requirements-test.txt +++ b/requirements-test.txt @@ -1,7 +1,6 @@ mock vcrpy # FIXME vcrpy cassette fails after this version -pytest<=3.7.0; python_version < '3.10' -pytest; python_version >= '3.10' +pytest pytest-cov responses From 03c3db49d95dda4c94ff3eea0d50a5f9284dc868 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A1n=20Chaves?= Date: Thu, 10 Mar 2022 12:34:37 +0100 Subject: [PATCH 12/16] Remove FIXME comment that is no longer relevant --- requirements-test.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/requirements-test.txt b/requirements-test.txt index 566f2b32..06032721 100644 --- a/requirements-test.txt +++ b/requirements-test.txt @@ -1,6 +1,5 @@ mock vcrpy -# FIXME vcrpy cassette fails after this version pytest pytest-cov responses From 9ee8b63988511faa4969d49283a2f3bc5a88c98f Mon Sep 17 00:00:00 2001 From: Eugenio Lacuesta Date: Thu, 10 Mar 2022 08:48:17 -0300 Subject: [PATCH 13/16] Update readme badges --- README.rst | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.rst b/README.rst index 5a49b86a..462f2a31 100644 --- a/README.rst +++ b/README.rst @@ -2,9 +2,18 @@ Client interface for Scrapinghub API ==================================== +.. image:: https://img.shields.io/pypi/v/scrapinghub.svg + :target: https://pypi.org/project/scrapinghub + +.. image:: https://img.shields.io/pypi/pyversions/scrapinghub.svg + :target: https://pypi.org/project/scrapinghub + .. image:: https://github.com/scrapinghub/python-scrapinghub/actions/workflows/main.yml/badge.svg :target: https://github.com/scrapinghub/python-scrapinghub/actions/workflows/main.yml +.. image:: https://codecov.io/gh/scrapinghub/python-scrapinghub/branch/master/graph/badge.svg + :target: https://app.codecov.io/gh/scrapinghub/python-scrapinghub + The ``scrapinghub`` is a Python library for communicating with the `Scrapinghub API`_. From 998a6460a200ecc5fc8ce52791d965edf6436486 Mon Sep 17 00:00:00 2001 From: Eugenio Lacuesta Date: Thu, 10 Mar 2022 08:49:11 -0300 Subject: [PATCH 14/16] Update minimum Python version in README --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 462f2a31..21475989 100644 --- a/README.rst +++ b/README.rst @@ -20,7 +20,7 @@ The ``scrapinghub`` is a Python library for communicating with the `Scrapinghub Requirements ============ -* Python 2.7 or above +* Python 3.6 or above Installation From 154f64ccec5a2c76f899e2def901bc3458151f00 Mon Sep 17 00:00:00 2001 From: Eugenio Lacuesta Date: Thu, 10 Mar 2022 09:06:09 -0300 Subject: [PATCH 15/16] Restore py27 support --- .github/workflows/main.yml | 12 ++++++++++++ setup.py | 4 +++- tox.ini | 2 +- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index fee77d57..b2f096ac 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -20,6 +20,18 @@ jobs: env: TOXENV: "json" + - python-version: "2.7" + env: + TOXENV: "msgpack" + - python-version: "2.7" + env: + TOXENV: "json" + - python-version: "3.5" + env: + TOXENV: "msgpack" + - python-version: "3.5" + env: + TOXENV: "json" - python-version: "3.6" env: TOXENV: "msgpack" diff --git a/setup.py b/setup.py index 42c42c6b..35a80c4e 100644 --- a/setup.py +++ b/setup.py @@ -28,12 +28,14 @@ package_data={'scrapinghub': ['VERSION']}, install_requires=['requests>=1.0', 'retrying>=1.3.3', 'six>=1.10.0'], extras_require={'msgpack': mpack_required}, - python_requires='>=3.6', + python_requires='>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*', classifiers=[ 'Development Status :: 5 - Production/Stable', 'License :: OSI Approved :: BSD License', 'Operating System :: OS Independent', 'Programming Language :: Python', + 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', diff --git a/tox.ini b/tox.ini index e002e0fc..f6d21d45 100644 --- a/tox.ini +++ b/tox.ini @@ -4,7 +4,7 @@ # and then run "tox" from this directory. [tox] -envlist = py{36,py3,37,38,39}-{json,msgpack} +envlist = py{27,35,36,py3,37,38,39}-{json,msgpack} [testenv] deps = From 5adfb9c99181bc72ebca577c98c0e1fc623fa217 Mon Sep 17 00:00:00 2001 From: Eugenio Lacuesta Date: Thu, 10 Mar 2022 09:07:04 -0300 Subject: [PATCH 16/16] Update Python version in readme --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 21475989..f3a17ace 100644 --- a/README.rst +++ b/README.rst @@ -20,7 +20,7 @@ The ``scrapinghub`` is a Python library for communicating with the `Scrapinghub Requirements ============ -* Python 3.6 or above +* Python 2.7 or Python 3.5+ Installation