diff --git a/setup.py b/setup.py index e9c0f587..06b1eeb0 100755 --- a/setup.py +++ b/setup.py @@ -18,7 +18,8 @@ def parse_version(fpath): def static_parse(varname, fpath): """ - Statically parse the a constant variable from a python file + Statically parse the a constant variable from a python file. + Raise an error if the variable is not a constant. """ import ast @@ -29,10 +30,13 @@ def static_parse(varname, fpath): pt = ast.parse(sourcecode) class StaticVisitor(ast.NodeVisitor): - def visit_Assign(self, node): + def visit_Assign(self, node: ast.Assign): for target in node.targets: if getattr(target, "id", None) == varname: - self.static_value = node.value.s + value: ast.expr = node.value + if not isinstance(value, ast.Constant): + raise ValueError("variable {!r} is not a constant".format(varname)) + self.static_value = value.value visitor = StaticVisitor() visitor.visit(pt) diff --git a/src/xdoctest/static_analysis.py b/src/xdoctest/static_analysis.py index d8171b2..cb1f798 100644 --- a/src/xdoctest/static_analysis.py +++ b/src/xdoctest/static_analysis.py @@ -21,8 +21,10 @@ import platform PLAT_IMPL = platform.python_implementation() -IS_PY_GE_308 = sys.version_info[0] >= 3 and sys.version_info[1] >= 8 -IS_PY_GE_312 = sys.version_info[0] >= 3 and sys.version_info[1] >= 12 +IS_PY_GE_312 = sys.version_info[0:2] >= (3, 12) +IS_PY_GE_308 = sys.version_info[0:2] >= (3, 8) # type: bool +IS_PY_LT_314 = sys.version_info[0:2] < (3, 14) # type: bool + if IS_PY_GE_312: from xdoctest import _tokenize as tokenize @@ -771,7 +773,9 @@ def _parse_static_node_value(node): values = map(_parse_static_node_value, node.values) value = OrderedDict(zip(keys, values)) # value = dict(zip(keys, values)) - elif isinstance(node, (ast.NameConstant)): + elif IS_PY_LT_314 and isinstance(node, (ast.NameConstant)): + value = node.value + elif isinstance(node, ast.Constant): value = node.value else: print(node.__dict__)