--- .github/workflows/validate.yml | 2 - appveyor.yml | 1 azure-pipelines.yml | 2 - docs/conf.py | 2 - pyproject.toml | 2 - requirements-dev.txt | 2 - requirements/3.3/constraints.txt | 1 setup.cfg | 1 src/dateutil/parser/_parser.py | 15 ++++------ src/dateutil/parser/isoparser.py | 5 +-- src/dateutil/relativedelta.py | 3 -- src/dateutil/rrule.py | 43 +++++++++++++----------------- src/dateutil/tz/_common.py | 15 ---------- src/dateutil/tz/_factories.py | 4 -- src/dateutil/tz/tz.py | 19 ++++--------- src/dateutil/tz/win.py | 8 ++--- src/python_dateutil.egg-info/requires.txt | 1 tests/property/test_tz_prop.py | 6 ---- tests/test_imports.py | 9 +----- tests/test_isoparser.py | 17 ++--------- tests/test_parser.py | 14 ++------- tests/test_rrule.py | 40 --------------------------- tests/test_tz.py | 6 ---- updatezinfo.py | 4 +- 24 files changed, 56 insertions(+), 166 deletions(-) --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -60,7 +60,7 @@ jobs: with: python-version: ${{ matrix.python-version }} - name: Install dependencies - run: python -m pip install -U tox six + run: python -m pip install -U tox - name: Install zic (Windows) run: | curl https://get.enterprisedb.com/postgresql/postgresql-9.5.21-2-windows-x64-binaries.zip --output $env:GITHUB_WORKSPACE\postgresql9.5.21.zip --- a/appveyor.yml +++ b/appveyor.yml @@ -24,7 +24,6 @@ install: # This frequently fails with network errors, so we'll retry it up to 5 times # with a 1 minute rate limit. - - "%PYTHON% -m pip install six" - "ci_tools/retry.bat %PYTHON% updatezinfo.py" # This environment variable tells the test suite it's OK to mess with the time zone. - set DATEUTIL_MAY_CHANGE_TZ=1 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -49,7 +49,7 @@ steps: versionSpec: $(python.version) - bash: | - python -m pip install -U six && python -m pip install -U 'tox < 3.8.0' + python -m pip install -U 'tox < 3.8.0' if [[ $PYTHON_VERSION == "3.3" ]]; then pip install 'virtualenv<16.0'; fi if [[ $PYTHON_VERSION == "3.3" ]]; then pip install 'setuptools<40.0'; fi displayName: Ensure prereqs --- a/docs/conf.py +++ b/docs/conf.py @@ -188,7 +188,7 @@ htmlhelp_basename = 'dateutildoc' # -- Options for autodoc ------------------------------------------------- -autodoc_mock_imports = ['ctypes.wintypes', 'six.moves.winreg'] +autodoc_mock_imports = ['ctypes.wintypes', 'winreg'] # Need to mock this out specifically to avoid errors import ctypes --- a/pyproject.toml +++ b/pyproject.toml @@ -57,9 +57,7 @@ known_first_party = ["dateutil"] known_third_party=[ "pytest", "hypothesis", - "six", "freezegun", - "mock", ] multi_line_output=3 use_parentheses=true --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,9 +1,7 @@ -six pytest >= 3.0; python_version != '3.3' pytest-cov >= 2.0.0 freezegun ; python_version != '3.3' hypothesis >= 3.30 coverage -mock ; python_version < '3.0' build >= 0.3.0 ; python_version >= '3.6' attrs!=21.1.0 --- a/requirements/3.3/constraints.txt +++ b/requirements/3.3/constraints.txt @@ -10,6 +10,5 @@ py==1.4.34 pytest==3.2.5 pytest-cov==2.5.1 setuptools==39.2.0 -six==1.12.0 tox==2.9.1 virtualenv==15.2.0 --- a/setup.cfg +++ b/setup.cfg @@ -39,7 +39,6 @@ classifiers = [options] zip_safe = True setup_requires = setuptools_scm -install_requires = six >= 1.5 package_dir = =src python_requires = >=2.7, !=3.0.*, !=3.1.*, !=3.2.* --- a/src/dateutil/parser/_parser.py +++ b/src/dateutil/parser/_parser.py @@ -39,9 +39,6 @@ import warnings from calendar import monthrange from io import StringIO -import six -from six import integer_types, text_type - from decimal import Decimal from warnings import warn @@ -63,7 +60,7 @@ class _timelex(object): if isinstance(instream, (bytes, bytearray)): instream = instream.decode() - if isinstance(instream, text_type): + if isinstance(instream, str): instream = StringIO(instream) elif getattr(instream, 'read', None) is None: raise TypeError('Parser must be a string or character stream, not ' @@ -648,7 +645,7 @@ class parser(object): try: ret = self._build_naive(res, default) except ValueError as e: - six.raise_from(ParserError(str(e) + ": %s", timestr), e) + raise ParserError(str(e) + ": %s", timestr) from e if not ignoretz: ret = self._build_tzaware(ret, res, tzinfos) @@ -878,7 +875,7 @@ class parser(object): try: value = self._to_decimal(value_repr) except Exception as e: - six.raise_from(ValueError('Unknown numeric token'), e) + raise ValueError('Unknown numeric token') from e len_li = len(value_repr) @@ -1147,7 +1144,7 @@ class parser(object): raise ValueError("Converted decimal value is infinite or NaN") except Exception as e: msg = "Could not convert %s to decimal" % val - six.raise_from(ValueError(msg), e) + raise ValueError(msg) from e else: return decimal_value @@ -1165,9 +1162,9 @@ class parser(object): # eg tzinfos = {'BRST' : None} if isinstance(tzdata, datetime.tzinfo) or tzdata is None: tzinfo = tzdata - elif isinstance(tzdata, text_type): + elif isinstance(tzdata, str): tzinfo = tz.tzstr(tzdata) - elif isinstance(tzdata, integer_types): + elif isinstance(tzdata, int): tzinfo = tz.tzoffset(tzname, tzdata) else: raise TypeError("Offset must be tzinfo subclass, tz string, " --- a/src/dateutil/parser/isoparser.py +++ b/src/dateutil/parser/isoparser.py @@ -14,7 +14,6 @@ from dateutil import tz from functools import wraps import re -import six __all__ = ["isoparse", "isoparser"] @@ -26,13 +25,13 @@ def _takes_ascii(f): str_in = getattr(str_in, 'read', lambda: str_in)() # If it's unicode, turn it into bytes, since ISO-8601 only covers ASCII - if isinstance(str_in, six.text_type): + if isinstance(str_in, str): # ASCII is the same in UTF-8 try: str_in = str_in.encode('ascii') except UnicodeEncodeError as e: msg = 'ISO-8601 strings should contain only ASCII characters' - six.raise_from(ValueError(msg), e) + raise ValueError(msg) from e return f(self, str_in, *args, **kwargs) --- a/src/dateutil/relativedelta.py +++ b/src/dateutil/relativedelta.py @@ -5,7 +5,6 @@ import calendar import operator from math import copysign -from six import integer_types from warnings import warn from ._common import weekday @@ -200,7 +199,7 @@ class relativedelta(object): "This is not a well-defined condition and will raise " + "errors in future versions.", DeprecationWarning) - if isinstance(weekday, integer_types): + if isinstance(weekday, int): self.weekday = weekdays[weekday] else: self.weekday = weekday --- a/src/dateutil/rrule.py +++ b/src/dateutil/rrule.py @@ -11,14 +11,11 @@ import heapq import itertools import re import sys +import _thread from functools import wraps # For warning about deprecation of until and count from warnings import warn -from six import advance_iterator, integer_types - -from six.moves import _thread, range - from ._common import weekday as weekdaybase try: @@ -134,7 +131,7 @@ class rrulebase(object): break try: for j in range(10): - cache.append(advance_iterator(gen)) + cache.append(next(gen)) except StopIteration: self._cache_gen = gen = None self._cache_complete = True @@ -161,7 +158,7 @@ class rrulebase(object): gen = iter(self) try: for i in range(item+1): - res = advance_iterator(gen) + res = next(gen) except StopIteration: raise IndexError return res @@ -479,14 +476,14 @@ class rrule(rrulebase): if wkst is None: self._wkst = calendar.firstweekday() - elif isinstance(wkst, integer_types): + elif isinstance(wkst, int): self._wkst = wkst else: self._wkst = wkst.weekday if bysetpos is None: self._bysetpos = None - elif isinstance(bysetpos, integer_types): + elif isinstance(bysetpos, int): if bysetpos == 0 or not (-366 <= bysetpos <= 366): raise ValueError("bysetpos must be between 1 and 366, " "or between -366 and -1") @@ -520,7 +517,7 @@ class rrule(rrulebase): if bymonth is None: self._bymonth = None else: - if isinstance(bymonth, integer_types): + if isinstance(bymonth, int): bymonth = (bymonth,) self._bymonth = tuple(sorted(set(bymonth))) @@ -532,7 +529,7 @@ class rrule(rrulebase): if byyearday is None: self._byyearday = None else: - if isinstance(byyearday, integer_types): + if isinstance(byyearday, int): byyearday = (byyearday,) self._byyearday = tuple(sorted(set(byyearday))) @@ -542,7 +539,7 @@ class rrule(rrulebase): if byeaster is not None: if not easter: from dateutil import easter - if isinstance(byeaster, integer_types): + if isinstance(byeaster, int): self._byeaster = (byeaster,) else: self._byeaster = tuple(sorted(byeaster)) @@ -556,7 +553,7 @@ class rrule(rrulebase): self._bymonthday = () self._bynmonthday = () else: - if isinstance(bymonthday, integer_types): + if isinstance(bymonthday, int): bymonthday = (bymonthday,) bymonthday = set(bymonthday) # Ensure it's unique @@ -573,7 +570,7 @@ class rrule(rrulebase): if byweekno is None: self._byweekno = None else: - if isinstance(byweekno, integer_types): + if isinstance(byweekno, int): byweekno = (byweekno,) self._byweekno = tuple(sorted(set(byweekno))) @@ -588,13 +585,13 @@ class rrule(rrulebase): # If it's one of the valid non-sequence types, convert to a # single-element sequence before the iterator that builds the # byweekday set. - if isinstance(byweekday, integer_types) or hasattr(byweekday, "n"): + if isinstance(byweekday, int) or hasattr(byweekday, "n"): byweekday = (byweekday,) self._byweekday = set() self._bynweekday = set() for wday in byweekday: - if isinstance(wday, integer_types): + if isinstance(wday, int): self._byweekday.add(wday) elif not wday.n or freq > MONTHLY: self._byweekday.add(wday.weekday) @@ -629,7 +626,7 @@ class rrule(rrulebase): else: self._byhour = None else: - if isinstance(byhour, integer_types): + if isinstance(byhour, int): byhour = (byhour,) if freq == HOURLY: @@ -649,7 +646,7 @@ class rrule(rrulebase): else: self._byminute = None else: - if isinstance(byminute, integer_types): + if isinstance(byminute, int): byminute = (byminute,) if freq == MINUTELY: @@ -669,7 +666,7 @@ class rrule(rrulebase): else: self._bysecond = None else: - if isinstance(bysecond, integer_types): + if isinstance(bysecond, int): bysecond = (bysecond,) self._bysecond = set(bysecond) @@ -1062,7 +1059,7 @@ class rrule(rrulebase): cset = set() # Support a single byxxx value. - if isinstance(byxxx, integer_types): + if isinstance(byxxx, int): byxxx = (byxxx, ) for num in byxxx: @@ -1315,7 +1312,7 @@ class rruleset(rrulebase): class _genitem(object): def __init__(self, genlist, gen): try: - self.dt = advance_iterator(gen) + self.dt = next(gen) genlist.append(self) except StopIteration: pass @@ -1324,7 +1321,7 @@ class rruleset(rrulebase): def __next__(self): try: - self.dt = advance_iterator(self.gen) + self.dt = next(self.gen) except StopIteration: if self.genlist[0] is self: heapq.heappop(self.genlist) @@ -1400,14 +1397,14 @@ class rruleset(rrulebase): if not lastdt or lastdt != ritem.dt: while exlist and exlist[0] < ritem: exitem = exlist[0] - advance_iterator(exitem) + next(exitem) if exlist and exlist[0] is exitem: heapq.heapreplace(exlist, exitem) if not exlist or ritem != exlist[0]: total += 1 yield ritem.dt lastdt = ritem.dt - advance_iterator(ritem) + next(ritem) if rlist and rlist[0] is ritem: heapq.heapreplace(rlist, ritem) self._len = total --- a/src/dateutil/tz/_common.py +++ b/src/dateutil/tz/_common.py @@ -1,5 +1,3 @@ -from six import PY2 - from functools import wraps from datetime import datetime, timedelta, tzinfo @@ -16,18 +14,7 @@ def tzname_in_python2(namefunc): tzname() API changed in Python 3. It used to return bytes, but was changed to unicode strings """ - if PY2: - @wraps(namefunc) - def adjust_encoding(*args, **kwargs): - name = namefunc(*args, **kwargs) - if name is not None: - name = name.encode() - - return name - - return adjust_encoding - else: - return namefunc + return namefunc # The following is adapted from Alexander Belopolsky's tz library --- a/src/dateutil/tz/_factories.py +++ b/src/dateutil/tz/_factories.py @@ -1,10 +1,8 @@ from datetime import timedelta +import _thread import weakref from collections import OrderedDict -from six.moves import _thread - - class _TzSingleton(type): def __init__(cls, *args, **kwargs): cls.__instance = None --- a/src/dateutil/tz/tz.py +++ b/src/dateutil/tz/tz.py @@ -13,12 +13,10 @@ import time import sys import os import bisect +import _thread import weakref from collections import OrderedDict -import six -from six import string_types -from six.moves import _thread from ._common import tzname_in_python2, _tzinfo from ._common import tzrangebase, enfold from ._common import _validate_fromutc_inputs @@ -38,8 +36,7 @@ EPOCH = datetime.datetime(1970, 1, 1, 0, EPOCHORDINAL = EPOCH.toordinal() -@six.add_metaclass(_TzSingleton) -class tzutc(datetime.tzinfo): +class tzutc(datetime.tzinfo, metaclass=_TzSingleton): """ This is a tzinfo object that represents the UTC time zone. @@ -129,8 +126,7 @@ class tzutc(datetime.tzinfo): UTC = tzutc() -@six.add_metaclass(_TzOffsetFactory) -class tzoffset(datetime.tzinfo): +class tzoffset(datetime.tzinfo, metaclass=_TzOffsetFactory): """ A simple class for representing a fixed offset from UTC. @@ -459,7 +455,7 @@ class tzfile(_tzinfo): super(tzfile, self).__init__() file_opened_here = False - if isinstance(fileobj, string_types): + if isinstance(fileobj, str): self._filename = fileobj fileobj = open(fileobj, 'rb') file_opened_here = True @@ -1033,8 +1029,7 @@ class tzrange(tzrangebase): return self._dst_base_offset_ -@six.add_metaclass(_TzStrFactory) -class tzstr(tzrange): +class tzstr(tzrange, metaclass=_TzStrFactory): """ ``tzstr`` objects are time zone objects specified by a time-zone string as it would be passed to a ``TZ`` variable on POSIX-style systems (see @@ -1265,7 +1260,7 @@ class tzical(object): global rrule from dateutil import rrule - if isinstance(fileobj, string_types): + if isinstance(fileobj, str): self._s = fileobj # ical should be encoded in UTF-8 with CRLF fileobj = open(fileobj, 'r') @@ -1621,7 +1616,7 @@ def __get_gettz(): except TypeError as e: if isinstance(name, bytes): new_msg = "gettz argument should be str, not bytes" - six.raise_from(TypeError(new_msg), e) + raise TypeError(new_msg) from e else: raise if os.path.isabs(name): --- a/src/dateutil/tz/win.py +++ b/src/dateutil/tz/win.py @@ -9,9 +9,7 @@ Attempting to import this module on a no # This code was originally contributed by Jeffrey Harris. import datetime import struct - -from six.moves import winreg -from six import text_type +import winreg try: import ctypes @@ -216,7 +214,7 @@ class tzwin(tzwinbase): self._name = name with winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) as handle: - tzkeyname = text_type("{kn}\\{name}").format(kn=TZKEYNAME, name=name) + tzkeyname = str("{kn}\\{name}").format(kn=TZKEYNAME, name=name) with winreg.OpenKey(handle, tzkeyname) as tzkey: keydict = valuestodict(tzkey) @@ -282,7 +280,7 @@ class tzwinlocal(tzwinbase): self._dst_abbr = keydict["DaylightName"] try: - tzkeyname = text_type('{kn}\\{sn}').format(kn=TZKEYNAME, + tzkeyname = str('{kn}\\{sn}').format(kn=TZKEYNAME, sn=self._std_abbr) with winreg.OpenKey(handle, tzkeyname) as tzkey: _keydict = valuestodict(tzkey) --- a/src/python_dateutil.egg-info/requires.txt +++ b/src/python_dateutil.egg-info/requires.txt @@ -1 +0,0 @@ -six>=1.5 --- a/tests/property/test_tz_prop.py +++ b/tests/property/test_tz_prop.py @@ -1,7 +1,6 @@ from datetime import datetime, timedelta import pytest -import six from hypothesis import assume, given from hypothesis import strategies as st @@ -25,10 +24,7 @@ def test_gettz_returns_local(gettz_arg, return dt_act = dt.astimezone(tz.gettz(gettz_arg)) - if six.PY2: - dt_exp = dt.astimezone(tz.tzlocal()) - else: - dt_exp = dt.astimezone() + dt_exp = dt.astimezone() assert dt_act == dt_exp assert dt_act.tzname() == dt_exp.tzname() --- a/tests/test_imports.py +++ b/tests/test_imports.py @@ -1,7 +1,6 @@ import sys import unittest import pytest -import six MODULE_TYPE = type(sys) @@ -10,12 +9,8 @@ MODULE_TYPE = type(sys) # But since we expect lazy imports tests to fail for Python < 3.7 we'll ignore those # warnings with this filter. -if six.PY2: - filter_import_warning = pytest.mark.filterwarnings("ignore::RuntimeWarning") -else: - - def filter_import_warning(f): - return f +def filter_import_warning(f): + return f @pytest.fixture(scope="function") --- a/tests/test_isoparser.py +++ b/tests/test_isoparser.py @@ -9,7 +9,6 @@ from dateutil.tz import UTC from dateutil.parser import isoparser, isoparse import pytest -import six def _generate_tzoffsets(limited): @@ -296,8 +295,7 @@ def test_isoparser_invalid_sep(sep): isoparser(sep=sep) -# This only fails on Python 3 -@pytest.mark.xfail(not six.PY2, reason="Fails on Python 3 only") +@pytest.mark.xfail(reason="Fails on Python 3 only") def test_isoparser_byte_sep(): dt = datetime(2017, 12, 6, 12, 30, 45) dt_str = dt.isoformat(sep=str('T')) @@ -347,10 +345,6 @@ def __make_date_examples(): date(2016, 2, 1) ] - if not six.PY2: - # strftime does not support dates before 1900 in Python 2 - dates_no_day.append(date(1000, 11, 1)) - # Only one supported format for dates with no day o = zip(dates_no_day, it.repeat('%Y-%m')) @@ -371,7 +365,7 @@ def __make_date_examples(): @pytest.mark.parametrize('as_bytes', [True, False]) def test_parse_isodate(d, dt_fmt, as_bytes): d_str = d.strftime(dt_fmt) - if isinstance(d_str, six.text_type) and as_bytes: + if isinstance(d_str, str) and as_bytes: d_str = d_str.encode('ascii') elif isinstance(d_str, bytes) and not as_bytes: d_str = d_str.decode('ascii') @@ -400,10 +394,7 @@ def test_parse_isodate_error_text(): isoparser().parse_isodate('2014-0423') # ensure the error message does not contain b' prefixes - if six.PY2: - expected_error = "String contains unknown ISO components: u'2014-0423'" - else: - expected_error = "String contains unknown ISO components: '2014-0423'" + expected_error = "String contains unknown ISO components: '2014-0423'" assert expected_error == str(excinfo.value) @@ -458,7 +449,7 @@ def __make_time_examples(): @pytest.mark.parametrize('as_bytes', [True, False]) def test_isotime(time_val, time_fmt, as_bytes): tstr = time_val.strftime(time_fmt) - if isinstance(tstr, six.text_type) and as_bytes: + if isinstance(tstr, str) and as_bytes: tstr = tstr.encode('ascii') elif isinstance(tstr, bytes) and not as_bytes: tstr = tstr.decode('ascii') --- a/tests/test_parser.py +++ b/tests/test_parser.py @@ -14,7 +14,6 @@ from dateutil.parser import UnknownTimez from ._common import TZEnvContext -from six import assertRaisesRegex, PY2 from io import StringIO import pytest @@ -462,13 +461,6 @@ class ParserTest(unittest.TestCase): datetime(2003, 9, 25, 10, 36, 28, tzinfo=self.brsttz)) - def testDateCommandFormatWithLong(self): - if PY2: - self.assertEqual(parse("Thu Sep 25 10:36:28 BRST 2003", - tzinfos={"BRST": long(-10800)}), - datetime(2003, 9, 25, 10, 36, 28, - tzinfo=self.brsttz)) - def testISOFormatStrip2(self): self.assertEqual(parse("2003-09-25T10:49:41+03:00"), datetime(2003, 9, 25, 10, 49, 41, @@ -570,11 +562,11 @@ class ParserTest(unittest.TestCase): parse('shouldfail') def testCorrectErrorOnFuzzyWithTokens(self): - assertRaisesRegex(self, ParserError, 'Unknown string format', + self.assertRaisesRegex(ParserError, 'Unknown string format', parse, '04/04/32/423', fuzzy_with_tokens=True) - assertRaisesRegex(self, ParserError, 'Unknown string format', + self.assertRaisesRegex(ParserError, 'Unknown string format', parse, '04/04/04 +32423', fuzzy_with_tokens=True) - assertRaisesRegex(self, ParserError, 'Unknown string format', + self.assertRaisesRegex(ParserError, 'Unknown string format', parse, '04/04/0d4', fuzzy_with_tokens=True) def testIncreasingCTime(self): --- a/tests/test_rrule.py +++ b/tests/test_rrule.py @@ -3,7 +3,6 @@ from __future__ import unicode_literals from datetime import datetime, date import unittest -from six import PY2 from dateutil import tz from dateutil.rrule import ( @@ -2282,27 +2281,6 @@ class RRuleTest(unittest.TestCase): datetime(2010, 3, 22, 13, 1), datetime(2010, 3, 22, 14, 1)]) - def testLongIntegers(self): - if PY2: # There are no longs in python3 - self.assertEqual(list(rrule(MINUTELY, - count=long(2), - interval=long(2), - bymonth=long(2), - byweekday=long(3), - byhour=long(6), - byminute=long(6), - bysecond=long(6), - dtstart=datetime(1997, 9, 2, 9, 0))), - [datetime(1998, 2, 5, 6, 6, 6), - datetime(1998, 2, 12, 6, 6, 6)]) - self.assertEqual(list(rrule(YEARLY, - count=long(2), - bymonthday=long(5), - byweekno=long(2), - dtstart=datetime(1997, 9, 2, 9, 0))), - [datetime(1998, 1, 5, 9, 0), - datetime(2004, 1, 5, 9, 0)]) - def testHourlyBadRRule(self): """ When `byhour` is specified with `freq=HOURLY`, there are certain @@ -4577,24 +4555,6 @@ class RRuleTest(unittest.TestCase): wkst=SU, dtstart=datetime(1997, 9, 2, 9, 0))) - def testToStrLongIntegers(self): - if PY2: # There are no longs in python3 - self._rrulestr_reverse_test(rrule(MINUTELY, - count=long(2), - interval=long(2), - bymonth=long(2), - byweekday=long(3), - byhour=long(6), - byminute=long(6), - bysecond=long(6), - dtstart=datetime(1997, 9, 2, 9, 0))) - - self._rrulestr_reverse_test(rrule(YEARLY, - count=long(2), - bymonthday=long(5), - byweekno=long(2), - dtstart=datetime(1997, 9, 2, 9, 0))) - def testReplaceIfSet(self): rr = rrule(YEARLY, count=1, --- a/tests/test_tz.py +++ b/tests/test_tz.py @@ -7,7 +7,6 @@ from ._common import ComparesEqual from datetime import datetime, timedelta from datetime import time as dt_time from datetime import tzinfo -from six import PY2 from io import BytesIO, StringIO import unittest @@ -1114,11 +1113,6 @@ def test_gettz_badzone_unicode(): b"America/New_York", ".*should be str, not bytes.*", id="bytes on Python 3", - marks=[ - pytest.mark.skipif( - PY2, reason="bytes arguments accepted in Python 2" - ) - ], ), pytest.param( object(), --- a/updatezinfo.py +++ b/updatezinfo.py @@ -4,8 +4,8 @@ import hashlib import json import io -from six.moves.urllib import request -from six.moves.urllib import error as urllib_error +from urllib import request +from urllib import error as urllib_error try: import dateutil