diff --git a/conda/dataclasses/allow-py37-ge-environments.patch b/conda/dataclasses/allow-py37-ge-environments.patch new file mode 100644 index 0000000000000000000000000000000000000000..fdeac6c98ed0f9d5542698946c21d791fd7f5418 --- /dev/null +++ b/conda/dataclasses/allow-py37-ge-environments.patch @@ -0,0 +1,108 @@ +From 178831f257a0d7d1b112b77067890ba5fd44f9a4 Mon Sep 17 00:00:00 2001 +From: Jon Dufresne <jon.dufresne@gmail.com> +Date: Thu, 3 Sep 2020 17:43:45 -0700 +Subject: [PATCH] Allow installing on Python 3.7+ environments + +On Python 3.7+ environments, use the builtin dataclasses module instead +of shadowing it. This is handled in the dataclasses/__init__.py which +sets the module in sys.modules. + +This allows projects to pin dependencies that are then run in both +Python 3.6 and 3.7+ environments using tools such as pip-tools. + +Previously, if dependencies were pinned for Python 3.6, the dataclasses +would be used, but fail to install on Python 3.7+ environments. On the +other hand, if dependencies were pinned for Python 3.7+, dataclasses +would not be available in Python 3.6 environments. + +Projects typically pin dependencies using the oldest supported Python. + +dataclasses has recently become a dependency of the popular tool Black, +which is how this issue was discovered. + +Fixes #153 +--- + dataclasses/__init__.py | 17 +++++++++++++++++ + dataclasses.py => dataclasses/dataclasses.py | 0 + setup.py | 9 +++++++-- + test/test_dataclasses.py | 11 +++++++++++ + 4 files changed, 35 insertions(+), 2 deletions(-) + create mode 100644 dataclasses/__init__.py + rename dataclasses.py => dataclasses/dataclasses.py (100%) + +diff --git a/dataclasses/__init__.py b/dataclasses/__init__.py +new file mode 100644 +index 0000000..7818f17 +--- /dev/null ++++ b/dataclasses/__init__.py +@@ -0,0 +1,17 @@ ++import importlib.util ++import os ++import sys ++ ++for path in sys.path: ++ file_path = os.path.join(path, 'dataclasses.py') ++ if os.path.exists(file_path): ++ # Load the builtin module instead. ++ break ++else: ++ file_path = os.path.join(os.path.dirname(__file__), 'dataclasses.py') ++ ++module_name = 'dataclasses' ++spec = importlib.util.spec_from_file_location(module_name, file_path) ++module = importlib.util.module_from_spec(spec) ++sys.modules[module_name] = module ++spec.loader.exec_module(module) +diff --git a/dataclasses.py b/dataclasses/dataclasses.py +similarity index 100% +rename from dataclasses.py +rename to dataclasses/dataclasses.py +diff --git a/setup.py b/setup.py +index e623a2a..84f1f68 100644 +--- a/setup.py ++++ b/setup.py +@@ -17,8 +17,13 @@ + "Intended Audience :: Developers", + "Topic :: Software Development :: Libraries :: Python Modules", + "License :: OSI Approved :: Apache Software License", ++ "Programming Language :: Python", ++ "Programming Language :: Python :: 3", ++ "Programming Language :: Python :: 3 :: Only", + "Programming Language :: Python :: 3.6", ++ "Programming Language :: Python :: 3.7", ++ "Programming Language :: Python :: 3.8", + ], +- py_modules=["dataclasses"], +- python_requires=">=3.6, <3.7", ++ packages=["dataclasses"], ++ python_requires=">=3.6", + ) +diff --git a/test/test_dataclasses.py b/test/test_dataclasses.py +index 741d0d6..5667f34 100644 +--- a/test/test_dataclasses.py ++++ b/test/test_dataclasses.py +@@ -6,6 +6,8 @@ + + import pickle + import inspect ++import os ++import sys + import unittest + from unittest.mock import Mock + from typing import ClassVar, Any, List, Union, Tuple, Dict, Generic, TypeVar, Optional +@@ -3056,6 +3058,15 @@ def __post_init__(self, y): + + ## replace(c, x=5) + ++ def test_import_shadows_builtin(self): ++ mod_path = dataclasses.__file__ ++ self.assertTrue(mod_path.endswith('dataclasses.py')) ++ py36_suffix = os.path.join('dataclasses', 'dataclasses.py') ++ if sys.version_info < (3, 7): ++ self.assertTrue(mod_path.endswith(py36_suffix)) ++ else: ++ self.assertFalse(mod_path.endswith(py36_suffix)) ++ + + if __name__ == '__main__': + unittest.main() diff --git a/conda/dataclasses/meta.yaml b/conda/dataclasses/meta.yaml index b1d3073f12a5d2b8d98e00a7b7d94276b8808e0b..8610bb1764b85edc3511739cf58c390717f04184 100644 --- a/conda/dataclasses/meta.yaml +++ b/conda/dataclasses/meta.yaml @@ -8,10 +8,10 @@ source: url: https://pypi.io/packages/source/d/dataclasses/dataclasses-{{ version }}.tar.gz sha256: 8479067f342acf957dc82ec415d355ab5edb7e7646b90dc6e2fd1d96ad084c97 patches: - - relax-python-pin.patch + - allow-py37-ge-environments.patch build: - number: 0 + number: 1 script: {{ PYTHON }} -m pip install --no-deps --ignore-installed . requirements: diff --git a/conda/dataclasses/relax-python-pin.patch b/conda/dataclasses/relax-python-pin.patch deleted file mode 100644 index 9f956457ffa0ea5837848c2b24e8b92554d1aa3f..0000000000000000000000000000000000000000 --- a/conda/dataclasses/relax-python-pin.patch +++ /dev/null @@ -1,15 +0,0 @@ -diff --git a/setup.py b/setup.py -index 897b8d3..75a7aad 100644 ---- a/setup.py -+++ b/setup.py -@@ -17,8 +17,8 @@ setup( - "Intended Audience :: Developers", - "Topic :: Software Development :: Libraries :: Python Modules", - "License :: OSI Approved :: Apache Software License", -- "Programming Language :: Python :: 3.6", -+ #"Programming Language :: Python :: 3.6", - ], - py_modules=["dataclasses"], -- python_requires=">=3.6, <3.7", -+ #python_requires=">=3.6, <3.7", - )