From 6973a94498e1a3bc98926275fa3c4e5f83efbd21 Mon Sep 17 00:00:00 2001 From: shaikh-ma Date: Fri, 19 Jan 2024 20:54:50 +0530 Subject: [PATCH] Making scrunch compatible with Python 3.11 --- scrunch/datasets.py | 9 +++++++-- scrunch/expressions.py | 13 ++++++++++--- scrunch/order.py | 8 +++++++- tox.ini | 3 ++- 4 files changed, 26 insertions(+), 7 deletions(-) diff --git a/scrunch/datasets.py b/scrunch/datasets.py index 8231c2a3..7818fb1c 100644 --- a/scrunch/datasets.py +++ b/scrunch/datasets.py @@ -14,6 +14,12 @@ # ... unless you have to worry about pandas pd = None + +if sys.version_info.major == 3: + from collections.abc import Mapping +else: + from collections import Mapping + import six import pycrunch @@ -702,7 +708,7 @@ def __readonly__(self, *args, **kwargs): del __readonly__ -class DatasetVariablesMixin(collections.Mapping): +class DatasetVariablesMixin(Mapping): """ Handles dataset variable iteration in a dict-like way """ @@ -3411,4 +3417,3 @@ def execute(self, csv_file): # Always delete the tmp dataset no matter what tmp_ds.delete() - diff --git a/scrunch/expressions.py b/scrunch/expressions.py index c7c7a7e8..32f06d6b 100644 --- a/scrunch/expressions.py +++ b/scrunch/expressions.py @@ -48,6 +48,9 @@ import scrunch from scrunch.variables import validate_variable_url +import sys + +PY311 = sys.version_info[:2] == (3, 11) if six.PY2: from urllib import urlencode @@ -280,9 +283,13 @@ def _parse(node, parent=None): # We will take the subvariable alias bit from the subscript # and return an object with the array and subvariable alias array_alias = dict(ast.iter_fields(fields[0][1]))["id"] - name_node = dict(ast.iter_fields(fields[1][1]))["value"] - subscript_fields = dict(ast.iter_fields(name_node)) - subvariable_alias = subscript_fields["id"] + if PY311: + name_node = dict(ast.iter_fields(fields[1][1])) + subvariable_alias = name_node["id"] + else: + name_node = dict(ast.iter_fields(fields[1][1]))["value"] + subscript_fields = dict(ast.iter_fields(name_node)) + subvariable_alias = subscript_fields["id"] return {"variable": {"array": array_alias, "subvariable": subvariable_alias}} # "Non-terminal" nodes. else: diff --git a/scrunch/order.py b/scrunch/order.py index 7c5cd84e..f41ff9c2 100644 --- a/scrunch/order.py +++ b/scrunch/order.py @@ -3,6 +3,12 @@ import re import six +import sys + +if sys.version_info.major == 3: + from collections.abc import Iterable +else: + from collections import Iterable import pycrunch import scrunch.datasets @@ -181,7 +187,7 @@ def is_root(self): def _validate_alias_arg(alias): if isinstance(alias, six.string_types): alias = [alias] - if not isinstance(alias, collections.Iterable): + if not isinstance(alias, Iterable): raise ValueError( 'Invalid list of aliases/ids/groups to be inserted' ' into the Group.' diff --git a/tox.ini b/tox.ini index ae983bd7..f82e7248 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist = py27,py36,py37,py38,py39,{py27,py36,py37,py38,py39}-pandas +envlist = py27,py36,py37,py38,py39,py311{py27,py36,py37,py38,py39,py311}-pandas minversion = 2.4 skip_missing_interpreters = true @@ -10,6 +10,7 @@ python = 3.7: py37,py37-pandas 3.8: py38,py38-pandas 3.9: py39,py39-pandas + 3.11: py311,py311-pandas [testenv] deps =