diff --git a/.travis.yml b/.travis.yml index e7e9e55e..886e39d2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,9 +1,8 @@ language: python python: - - "3.6" - "3.5" - - "2.7" - - "pypy" + - "3.6" + - "3.7" - "pypy3" install: "pip install -e .[test]" diff --git a/gpiozero/__init__.py b/gpiozero/__init__.py index 1dd875a3..286c9a3f 100644 --- a/gpiozero/__init__.py +++ b/gpiozero/__init__.py @@ -37,12 +37,6 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -from __future__ import ( - unicode_literals, - print_function, - absolute_import, - division, -) from .pins import ( Factory, diff --git a/gpiozero/boards.py b/gpiozero/boards.py index 2ca5ebb2..456d6291 100644 --- a/gpiozero/boards.py +++ b/gpiozero/boards.py @@ -37,17 +37,6 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -from __future__ import ( - unicode_literals, - print_function, - absolute_import, - division, - ) -try: - from itertools import izip as zip -except ImportError: - pass - from time import sleep from itertools import repeat, cycle, chain from threading import Lock diff --git a/gpiozero/compat.py b/gpiozero/compat.py index 41486221..95b04650 100644 --- a/gpiozero/compat.py +++ b/gpiozero/compat.py @@ -32,22 +32,11 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -from __future__ import ( - unicode_literals, - absolute_import, - print_function, - division, - ) - import operator import functools - from collections.abc import Mapping -str = type('') - - # Copied from the MIT-licensed https://github.com/slezica/python-frozendict class frozendict(Mapping): def __init__(self, *args, **kwargs): diff --git a/gpiozero/devices.py b/gpiozero/devices.py index 927a951d..386f4dca 100644 --- a/gpiozero/devices.py +++ b/gpiozero/devices.py @@ -29,14 +29,6 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -from __future__ import ( - unicode_literals, - print_function, - absolute_import, - division, - ) -nstr = str -str = type('') import os import atexit @@ -49,7 +41,7 @@ from .mixins import ( ValuesMixin, SharedMixin, - ) +) from .exc import ( BadPinFactory, DeviceClosed, @@ -57,17 +49,17 @@ CompositeDeviceBadOrder, CompositeDeviceBadDevice, GPIOPinMissing, - GPIOPinInUse, GPIODeviceClosed, NativePinFactoryFallback, PinFactoryFallback, - ) +) + from .compat import frozendict native_fallback_message = ( -'Falling back to the experimental pin factory NativeFactory because no other ' -'pin factory could be loaded. For best results, install RPi.GPIO or pigpio. ' -'See https://gpiozero.readthedocs.io/en/stable/api_pins.html for more information.' + 'Falling back to the experimental pin factory NativeFactory because no other ' + 'pin factory could be loaded. For best results, install RPi.GPIO or pigpio. ' + 'See https://gpiozero.readthedocs.io/en/stable/api_pins.html for more information.' ) @@ -108,6 +100,7 @@ def __call__(cls, *args, **kwargs): # the refs counter and calls the original close method when # it reaches zero old_close = self.close + def close(): self._refs = max(0, self._refs - 1) if not self._refs: @@ -121,6 +114,7 @@ def close(): # just ignore the resulting KeyError here - # it's already gone pass + self.close = close cls._instances[key] = weakref.proxy(self) else: @@ -137,7 +131,7 @@ def close(): # Cross-version compatible method of using a metaclass -class GPIOBase(GPIOMeta(nstr('GPIOBase'), (), {})): +class GPIOBase(GPIOMeta(str('GPIOBase'), (), {})): def __setattr__(self, name, value): # This overridden __setattr__ simply ensures that additional attributes # cannot be set on the class after construction (it manages this in @@ -148,7 +142,7 @@ def __setattr__(self, name, value): if hasattr(self, '__attrs__') and name not in self.__attrs__: raise AttributeError( "'%s' object has no attribute '%s'" % ( - self.__class__.__name__, name)) + self.__class__.__name__, name)) return super(GPIOBase, self).__setattr__(name, value) def __del__(self): @@ -237,7 +231,7 @@ class Device(ValuesMixin, GPIOBase): allocating pins, providing low level interfaces (e.g. SPI), and clock facilities (querying and calculating elapsed times). """ - pin_factory = None # instance of a Factory sub-class + pin_factory = None # instance of a Factory sub-class def __init__(self, **kwargs): # Force pin_factory to be keyword-only, even in Python 2 @@ -263,9 +257,9 @@ def _default_pin_factory(): # updated along with the entry-points in setup.py. default_factories = OrderedDict(( ('rpigpio', 'gpiozero.pins.rpigpio:RPiGPIOFactory'), - ('rpio', 'gpiozero.pins.rpio:RPIOFactory'), - ('pigpio', 'gpiozero.pins.pigpio:PiGPIOFactory'), - ('native', 'gpiozero.pins.native:NativeFactory'), + ('rpio', 'gpiozero.pins.rpio:RPIOFactory'), + ('pigpio', 'gpiozero.pins.pigpio:PiGPIOFactory'), + ('native', 'gpiozero.pins.native:NativeFactory'), )) name = os.environ.get('GPIOZERO_PIN_FACTORY') if name is None: @@ -390,6 +384,7 @@ class CompositeDevice(Device): their :attr:`value` attributes will be accessible as named elements of the composite device's tuple :attr:`value`. """ + def __init__(self, *args, **kwargs): self._all = () self._named = frozendict({}) @@ -445,21 +440,21 @@ def __repr__(self): unnamed = len(self) - len(self._named) if named > 0 and unnamed > 0: return "" % ( - self.__class__.__name__, - len(self), ', '.join(self._order), - len(self) - len(self._named) - ) + self.__class__.__name__, + len(self), ', '.join(self._order), + len(self) - len(self._named) + ) elif named > 0: return "" % ( - self.__class__.__name__, - len(self), - ', '.join(self._order) - ) + self.__class__.__name__, + len(self), + ', '.join(self._order) + ) else: return "" % ( - self.__class__.__name__, - len(self) - ) + self.__class__.__name__, + len(self) + ) except DeviceClosed: return "" % (self.__class__.__name__) @@ -529,6 +524,7 @@ class GPIODevice(Device): will be raised. If the pin is already in use by another device, :exc:`GPIOPinInUse` will be raised. """ + def __init__(self, pin=None, **kwargs): super(GPIODevice, self).__init__(**kwargs) # self._pin must be set before any possible exceptions can be raised @@ -615,4 +611,5 @@ def _shutdown(): _threads_shutdown() _devices_shutdown() + atexit.register(_shutdown) diff --git a/gpiozero/exc.py b/gpiozero/exc.py index e31f592e..6b36caec 100644 --- a/gpiozero/exc.py +++ b/gpiozero/exc.py @@ -30,14 +30,6 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -from __future__ import ( - unicode_literals, - print_function, - absolute_import, - division, -) -str = type('') - class GPIOZeroError(Exception): "Base class for all exceptions in GPIO Zero" diff --git a/gpiozero/input_devices.py b/gpiozero/input_devices.py index f916d564..f4d48c7b 100644 --- a/gpiozero/input_devices.py +++ b/gpiozero/input_devices.py @@ -34,15 +34,8 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -from __future__ import ( - unicode_literals, - print_function, - absolute_import, - division, -) - import warnings -from time import sleep, time +from time import sleep from threading import Event, Lock from statistics import median @@ -55,6 +48,7 @@ except ImportError: PiGPIOFactory = None + class InputDevice(GPIODevice): """ Represents a generic GPIO input device. diff --git a/gpiozero/internal_devices.py b/gpiozero/internal_devices.py index 8b9e8c59..2d39afdd 100644 --- a/gpiozero/internal_devices.py +++ b/gpiozero/internal_devices.py @@ -32,15 +32,6 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -from __future__ import ( - unicode_literals, - print_function, - absolute_import, - division, -) -str = type('') - - import os import io import subprocess diff --git a/gpiozero/mixins.py b/gpiozero/mixins.py index 8af6f309..f558cd14 100644 --- a/gpiozero/mixins.py +++ b/gpiozero/mixins.py @@ -29,15 +29,6 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -from __future__ import ( - unicode_literals, - print_function, - absolute_import, - division, - ) -nstr = str -str = type('') - import inspect import weakref from functools import wraps, partial @@ -60,6 +51,7 @@ 'e.g. btn.when_pressed = pressed() instead of btn.when_pressed = pressed' ) + class ValuesMixin(object): """ Adds a :attr:`values` property to the class which returns an infinite diff --git a/gpiozero/output_devices.py b/gpiozero/output_devices.py index fee405b3..2bb0b518 100644 --- a/gpiozero/output_devices.py +++ b/gpiozero/output_devices.py @@ -34,13 +34,6 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -from __future__ import ( - unicode_literals, - print_function, - absolute_import, - division, -) -str = type('') from threading import Lock from itertools import repeat, cycle, chain @@ -59,6 +52,7 @@ except ImportError: PiGPIOFactory = None + class OutputDevice(SourceMixin, GPIODevice): """ Represents a generic GPIO output device. diff --git a/gpiozero/pins/__init__.py b/gpiozero/pins/__init__.py index 15a5463d..beba275e 100644 --- a/gpiozero/pins/__init__.py +++ b/gpiozero/pins/__init__.py @@ -31,14 +31,6 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -from __future__ import ( - unicode_literals, - absolute_import, - print_function, - division, - ) -str = type('') - from weakref import ref from collections import defaultdict from threading import Lock diff --git a/gpiozero/pins/data.py b/gpiozero/pins/data.py index 3ecc7e7b..09fe57c8 100644 --- a/gpiozero/pins/data.py +++ b/gpiozero/pins/data.py @@ -29,14 +29,6 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -from __future__ import ( - unicode_literals, - absolute_import, - print_function, - division, - ) -str = type('') - import os import sys from textwrap import dedent diff --git a/gpiozero/pins/local.py b/gpiozero/pins/local.py index 29e9e086..faf89fcd 100644 --- a/gpiozero/pins/local.py +++ b/gpiozero/pins/local.py @@ -29,24 +29,12 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -from __future__ import ( - unicode_literals, - absolute_import, - print_function, - division, - ) -nstr = str -str = type('') - import io import errno import struct from collections import defaultdict from threading import Lock -try: - from time import monotonic -except ImportError: - from time import time as monotonic +from time import monotonic try: from spidev import SpiDev @@ -93,7 +81,7 @@ def _get_revision(self): revision = None try: with io.open('/proc/device-tree/system/linux,revision', 'rb') as f: - revision = hex(struct.unpack(nstr('>L'), f.read(4))[0])[2:] + revision = hex(struct.unpack(str('>L'), f.read(4))[0])[2:] except IOError as e: if e.errno != errno.ENOENT: raise e diff --git a/gpiozero/pins/mock.py b/gpiozero/pins/mock.py index a0ae08ce..f5cc54fa 100644 --- a/gpiozero/pins/mock.py +++ b/gpiozero/pins/mock.py @@ -28,15 +28,6 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -from __future__ import ( - unicode_literals, - absolute_import, - print_function, - division, - ) -str = type('') - - import os from collections import namedtuple from time import time, sleep @@ -59,6 +50,7 @@ PinState = namedtuple('PinState', ('timestamp', 'state')) + class MockPin(LocalPiPin): """ A mock pin used primarily for testing. This class does *not* support PWM. diff --git a/gpiozero/pins/native.py b/gpiozero/pins/native.py index 0f3e4e1a..4ab564ab 100644 --- a/gpiozero/pins/native.py +++ b/gpiozero/pins/native.py @@ -28,15 +28,6 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -from __future__ import ( - unicode_literals, - absolute_import, - print_function, - division, - ) -nstr = str -str = type('') - import io import os import mmap @@ -45,10 +36,7 @@ import select from time import sleep from threading import Thread, Event, RLock -try: - from queue import Queue, Empty -except ImportError: - from Queue import Queue, Empty +from queue import Queue, Empty from .local import LocalPiPin, LocalPiFactory from ..exc import ( @@ -109,7 +97,7 @@ def peripheral_base(self, soc): with io.open('/proc/device-tree/soc/ranges', 'rb') as f: f.seek(4) # This is deliberately a big-endian read - return struct.unpack(nstr('>L'), f.read(4))[0] + return struct.unpack(str('>L'), f.read(4))[0] except IOError: try: return self.PERI_BASE_OFFSET[soc] @@ -118,10 +106,10 @@ def peripheral_base(self, soc): raise IOError('unable to determine peripheral base') def __getitem__(self, index): - return struct.unpack_from(nstr('= (2, 7): - raise ValueError('This package requires Python 2.7 or above') -elif sys.version_info[0] == 3: - if not sys.version_info >= (3, 5): - raise ValueError('This package requires Python 3.5 or above') -else: - raise ValueError('Unrecognized major version of Python') +if not sys.version_info >= (3, 5): + raise ValueError('This package requires Python 3.5 or above') HERE = os.path.abspath(os.path.dirname(__file__)) @@ -37,8 +31,6 @@ "Topic :: Education", "Topic :: System :: Hardware", "License :: OSI Approved :: BSD License", - "Programming Language :: Python :: 2", - "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", diff --git a/tests/cli/test_pinout.py b/tests/cli/test_pinout.py index 7fcae0e3..1432900a 100644 --- a/tests/cli/test_pinout.py +++ b/tests/cli/test_pinout.py @@ -28,15 +28,6 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -from __future__ import ( - unicode_literals, - absolute_import, - print_function, - division, - ) -str = type('') - - import os import pytest diff --git a/tests/conftest.py b/tests/conftest.py index e226be58..a87bce98 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -27,15 +27,6 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -from __future__ import ( - unicode_literals, - print_function, - absolute_import, - division, - ) -str = type('') - - import sys import pytest import warnings diff --git a/tests/test_boards.py b/tests/test_boards.py index e7139767..8ffcaac3 100644 --- a/tests/test_boards.py +++ b/tests/test_boards.py @@ -33,15 +33,6 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -from __future__ import ( - unicode_literals, - absolute_import, - print_function, - division, - ) -str = type('') - - import sys import pytest from time import sleep diff --git a/tests/test_compat.py b/tests/test_compat.py index d9f2c42e..abf27683 100644 --- a/tests/test_compat.py +++ b/tests/test_compat.py @@ -28,14 +28,6 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -from __future__ import ( - unicode_literals, - absolute_import, - print_function, - division, - ) -str = type('') - import pytest from gpiozero.compat import frozendict diff --git a/tests/test_devices.py b/tests/test_devices.py index 0ce8fa79..0acdd1e5 100644 --- a/tests/test_devices.py +++ b/tests/test_devices.py @@ -29,15 +29,6 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -from __future__ import ( - unicode_literals, - absolute_import, - print_function, - division, - ) -str = type('') - -import os import warnings from mock import patch import pytest diff --git a/tests/test_inputs.py b/tests/test_inputs.py index 78bdf762..8b8f6940 100644 --- a/tests/test_inputs.py +++ b/tests/test_inputs.py @@ -30,15 +30,6 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -from __future__ import ( - unicode_literals, - absolute_import, - print_function, - division, - ) -str = type('') - - import sys import pytest import warnings diff --git a/tests/test_internal_devices.py b/tests/test_internal_devices.py index faff7d52..99d8daaa 100644 --- a/tests/test_internal_devices.py +++ b/tests/test_internal_devices.py @@ -30,15 +30,6 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -from __future__ import ( - unicode_literals, - absolute_import, - print_function, - division, - ) -str = type('') - -import io import errno import warnings from posix import statvfs_result diff --git a/tests/test_mixins.py b/tests/test_mixins.py index 804ce872..c26200ed 100644 --- a/tests/test_mixins.py +++ b/tests/test_mixins.py @@ -27,15 +27,6 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -from __future__ import ( - unicode_literals, - absolute_import, - print_function, - division, - ) -str = type('') - - import gc import sys from time import sleep diff --git a/tests/test_mock_pin.py b/tests/test_mock_pin.py index 1c50643e..271cd590 100644 --- a/tests/test_mock_pin.py +++ b/tests/test_mock_pin.py @@ -28,15 +28,6 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -from __future__ import ( - unicode_literals, - absolute_import, - print_function, - division, - ) -str = type('') - - from threading import Event import pytest diff --git a/tests/test_outputs.py b/tests/test_outputs.py index 8e0c145e..fb49416a 100644 --- a/tests/test_outputs.py +++ b/tests/test_outputs.py @@ -29,15 +29,6 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -from __future__ import ( - unicode_literals, - absolute_import, - print_function, - division, - ) -str = type('') - - import sys from time import sleep, time from math import isclose diff --git a/tests/test_pins_data.py b/tests/test_pins_data.py index 05dd91f9..5c990782 100644 --- a/tests/test_pins_data.py +++ b/tests/test_pins_data.py @@ -29,15 +29,6 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -from __future__ import ( - unicode_literals, - absolute_import, - print_function, - division, - ) -str = type('') - - import io import re import errno diff --git a/tests/test_real_pins.py b/tests/test_real_pins.py index 6795b612..1251b95f 100644 --- a/tests/test_real_pins.py +++ b/tests/test_real_pins.py @@ -27,19 +27,6 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -from __future__ import ( - unicode_literals, - absolute_import, - print_function, - division, - ) -str = type('') -try: - range = xrange -except NameError: - pass - -import io import os import errno from time import time, sleep diff --git a/tests/test_spi.py b/tests/test_spi.py index 9d1cba03..1a4d840d 100644 --- a/tests/test_spi.py +++ b/tests/test_spi.py @@ -28,16 +28,6 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -from __future__ import ( - unicode_literals, - absolute_import, - print_function, - division, - ) -nstr = str -str = type('') - - import io import pytest from array import array @@ -56,7 +46,7 @@ def test_spi_hardware_params(mock_factory): with patch('os.open'), patch('mmap.mmap') as mmap_mmap, patch('io.open') as io_open: - mmap_mmap.return_value = array(nstr('B'), (0,) * 4096) + mmap_mmap.return_value = array(str('B'), (0,) * 4096) io_open.return_value.__enter__.return_value = io.BytesIO(b'\x00\xa2\x10\x42') factory = NativeFactory() with patch('gpiozero.pins.local.SpiDev'): @@ -87,7 +77,7 @@ def test_spi_hardware_params(mock_factory): def test_spi_software_params(mock_factory): with patch('os.open'), patch('mmap.mmap') as mmap_mmap, patch('io.open') as io_open: - mmap_mmap.return_value = array(nstr('B'), (0,) * 4096) + mmap_mmap.return_value = array(str('B'), (0,) * 4096) io_open.return_value.__enter__.return_value = io.BytesIO(b'\x00\xa2\x10\x42') factory = NativeFactory() with patch('gpiozero.pins.local.SpiDev'): diff --git a/tests/test_spi_devices.py b/tests/test_spi_devices.py index dc142335..53dc56cd 100644 --- a/tests/test_spi_devices.py +++ b/tests/test_spi_devices.py @@ -29,16 +29,6 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -from __future__ import ( - unicode_literals, - absolute_import, - print_function, - division, - ) -str = type('') - - -import sys import pytest from mock import patch from collections import namedtuple diff --git a/tests/test_tools.py b/tests/test_tools.py index 6a8e14f8..21456475 100644 --- a/tests/test_tools.py +++ b/tests/test_tools.py @@ -29,15 +29,6 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -from __future__ import ( - unicode_literals, - absolute_import, - print_function, - division, - ) -str = type('') - - import pytest from math import sin, cos, radians, isclose from statistics import mean, median diff --git a/tox.ini b/tox.ini index 9a314f19..7e9b6b52 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist = {py27,py35,py36,py37} +envlist = {y35,py36,py37} [testenv] deps = .[test]