Currently job artifacts in CI/CD pipelines on LRZ GitLab never expire. Starting from Wed 26.1.2022 the default expiration time will be 30 days (GitLab default). Currently existing artifacts in already completed jobs will not be affected by the change. The latest artifacts for all jobs in the latest successful pipelines will be kept. More information: https://gitlab.lrz.de/help/user/admin_area/settings/continuous_integration.html#default-artifacts-expiration

Commit d008de94 authored by eckhart's avatar eckhart
Browse files

- move issubtype and isgenerictype from transform.py to toolkit.py

parent ac43cdc4
......@@ -24,6 +24,7 @@ so that they are best defined in a toolkit-module.
import codecs
import hashlib
import inspect
import io
import parser
......@@ -45,6 +46,8 @@ __all__ = ('escape_re',
'escape_control_characters',
'is_filename',
'lstrip_docstring',
'issubtype',
'isgenerictype',
'load_if_file',
'is_python_code',
'md5',
......@@ -101,6 +104,34 @@ def is_filename(strg: str) -> bool:
# and strg.select('*') < 0 and strg.select('?') < 0
#######################################################################
#
# type system support
#
#######################################################################
def issubtype(sub_type, base_type):
if sys.version_info.major <= 3 and sys.version_info.minor <= 6:
return issubclass(sub_type, base_type)
try:
base_type = base_type.__origin__
except AttributeError:
pass
try:
mro = inspect.getmro(sub_type)
except AttributeError:
mro = []
for t in sub_type.__mro_entries__([sub_type]):
mro.extend(inspect.getmro(t))
# print(" " if base_type in mro else "!", base_type, sub_type, mro)
return base_type in mro
def isgenerictype(t):
return str(t).endswith(']')
#######################################################################
#
# loading and compiling
......
......@@ -33,7 +33,7 @@ from functools import partial, reduce, singledispatch
from DHParser.error import Error
from DHParser.syntaxtree import Node, WHITESPACE_PTYPE, TOKEN_PTYPE, MockParser, ZOMBIE_NODE
from DHParser.toolkit import expand_table, smart_list, re, typing
from DHParser.toolkit import issubtype, isgenerictype, expand_table, smart_list, re, typing
from typing import AbstractSet, Any, ByteString, Callable, cast, Container, Dict, \
Tuple, List, Sequence, Union, Text, Generic
......@@ -150,29 +150,6 @@ def transformation_factory(t1=None, t2=None, t3=None, t4=None, t5=None):
does not have type annotations.
"""
def issubtype(sub_type, base_type):
# Because of changes in thy typing system, the following doesn't
# work any more in Python 3.7:
#
# return base_type in inspect.getmro(subtype)
#
# Therefore it has all gotten a bit more complicated...
try:
base_type = base_type.__origin__
except AttributeError:
pass
try:
mro = inspect.getmro(sub_type)
except AttributeError:
mro = []
for t in sub_type.__mro_entries__([sub_type]):
mro.extend(inspect.getmro(t))
print(" " if base_type in mro else "!", base_type, sub_type, mro)
return base_type in mro
def isgenerictype(t):
return str(t).endswith(']')
def type_guard(t):
"""Raises an error if type `t` is a generic type or could be mistaken
for the type of the canonical first parameter "List[Node] of
......
......@@ -21,13 +21,14 @@ limitations under the License.
"""
import concurrent.futures
import collections.abc
import os
import sys
sys.path.extend(['../', './'])
from DHParser.toolkit import has_fenced_code, load_if_file, re, \
lstrip_docstring
lstrip_docstring, issubtype, isgenerictype, typing
from DHParser.log import log_dir, logging, is_logging
......@@ -150,6 +151,12 @@ class TestStringHelpers:
'indented line'
class TestTypeSystemSupport:
def test_issubtype(self):
assert issubtype(typing.List, typing.List)
if __name__ == "__main__":
from DHParser.testing import runner
runner("", globals())
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment