diff options
author | Marcel Bargull <marcel.bargull@udo.edu> | 2018-03-16 19:51:00 +0100 |
---|---|---|
committer | Marcel Bargull <marcel.bargull@udo.edu> | 2018-03-16 19:51:00 +0100 |
commit | 9ece6742b14cc7773c048bef35711b5e060d80f6 (patch) | |
tree | 60f739c5f05b24b3e6efa50ca6ba14fe1c26e14a | |
parent | 0bda7fa8499b6c802d6246435524b839e9a8ba4c (diff) | |
download | ruamel.yaml-9ece6742b14cc7773c048bef35711b5e060d80f6.tar.gz |
evaluate re.compile lazily
-rw-r--r-- | constructor.py | 3 | ||||
-rw-r--r-- | reader.py | 15 | ||||
-rw-r--r-- | resolver.py | 39 | ||||
-rw-r--r-- | serializer.py | 5 | ||||
-rw-r--r-- | util.py | 23 |
5 files changed, 56 insertions, 29 deletions
diff --git a/constructor.py b/constructor.py index 9706bbe..7769874 100644 --- a/constructor.py +++ b/constructor.py @@ -26,6 +26,7 @@ from ruamel.yaml.scalarstring import (PreservedScalarString, SingleQuotedScalarS from ruamel.yaml.scalarint import ScalarInt, BinaryInt, OctalInt, HexInt, HexCapsInt from ruamel.yaml.scalarfloat import ScalarFloat from ruamel.yaml.timestamp import TimeStamp +from ruamel.yaml.util import RegExp if False: # MYPY from typing import Any, Dict, List, Set, Generator # NOQA @@ -471,7 +472,7 @@ class SafeConstructor(BaseConstructor): None, None, "failed to decode base64 data: %s" % exc, node.start_mark) - timestamp_regexp = re.compile( + timestamp_regexp = RegExp( u'''^(?P<year>[0-9][0-9][0-9][0-9]) -(?P<month>[0-9][0-9]?) -(?P<day>[0-9][0-9]?) @@ -25,6 +25,7 @@ import re from ruamel.yaml.error import YAMLError, FileMark, StringMark, YAMLStreamError from ruamel.yaml.compat import text_type, binary_type, PY3 +from ruamel.yaml.util import RegExp if False: # MYPY from typing import Any, Dict, Optional, List, Union, Text # NOQA @@ -181,22 +182,24 @@ class Reader(object): # 4 if 32 bit unicode supported, 2 e.g. on MacOS (issue 56) try: - NON_PRINTABLE = re.compile( + re.compile(u'[^\U00010000]') + except: + NON_PRINTABLE = RegExp( u'[^\x09\x0A\x0D\x20-\x7E\x85' u'\xA0-\uD7FF' u'\uE000-\uFFFD' - u'\U00010000-\U0010FFFF' u']' ) - UNICODE_SIZE = 4 - except: - NON_PRINTABLE = re.compile( + UNICODE_SIZE = 2 + else: + NON_PRINTABLE = RegExp( u'[^\x09\x0A\x0D\x20-\x7E\x85' u'\xA0-\uD7FF' u'\uE000-\uFFFD' + u'\U00010000-\U0010FFFF' u']' ) - UNICODE_SIZE = 2 + UNICODE_SIZE = 4 def check_printable(self, data): # type: (Any) -> None diff --git a/resolver.py b/resolver.py index 85e640d..9e5d320 100644 --- a/resolver.py +++ b/resolver.py @@ -11,6 +11,7 @@ if False: # MYPY from ruamel.yaml.compat import string_types, _DEFAULT_YAML_VERSION # NOQA from ruamel.yaml.error import * # NOQA from ruamel.yaml.nodes import * # NOQA +from ruamel.yaml.util import RegExp # NOQA __all__ = ['BaseResolver', 'Resolver', 'VersionedResolver'] @@ -23,17 +24,17 @@ __all__ = ['BaseResolver', 'Resolver', 'VersionedResolver'] implicit_resolvers = [ ([(1, 2)], u'tag:yaml.org,2002:bool', - re.compile(u'''^(?:true|True|TRUE|false|False|FALSE)$''', re.X), + RegExp(u'''^(?:true|True|TRUE|false|False|FALSE)$''', re.X), list(u'tTfF')), ([(1, 1)], u'tag:yaml.org,2002:bool', - re.compile(u'''^(?:yes|Yes|YES|no|No|NO + RegExp(u'''^(?:yes|Yes|YES|no|No|NO |true|True|TRUE|false|False|FALSE |on|On|ON|off|Off|OFF)$''', re.X), list(u'yYnNtTfFoO')), ([(1, 2)], u'tag:yaml.org,2002:float', - re.compile(u'''^(?: + RegExp(u'''^(?: [-+]?(?:[0-9][0-9_]*)\\.[0-9_]*(?:[eE][-+]?[0-9]+)? |[-+]?(?:[0-9][0-9_]*)(?:[eE][-+]?[0-9]+) |\\.[0-9_]+(?:[eE][-+][0-9]+)? @@ -42,7 +43,7 @@ implicit_resolvers = [ list(u'-+0123456789.')), ([(1, 1)], u'tag:yaml.org,2002:float', - re.compile(u'''^(?: + RegExp(u'''^(?: [-+]?(?:[0-9][0-9_]*)\\.[0-9_]*(?:[eE][-+]?[0-9]+)? |[-+]?(?:[0-9][0-9_]*)(?:[eE][-+]?[0-9]+) |\\.[0-9_]+(?:[eE][-+][0-9]+)? @@ -52,14 +53,14 @@ implicit_resolvers = [ list(u'-+0123456789.')), ([(1, 2)], u'tag:yaml.org,2002:int', - re.compile(u'''^(?:[-+]?0b[0-1_]+ + RegExp(u'''^(?:[-+]?0b[0-1_]+ |[-+]?0o?[0-7_]+ |[-+]?(?:0|[1-9][0-9_]*) |[-+]?0x[0-9a-fA-F_]+)$''', re.X), list(u'-+0123456789')), ([(1, 1)], u'tag:yaml.org,2002:int', - re.compile(u'''^(?:[-+]?0b[0-1_]+ + RegExp(u'''^(?:[-+]?0b[0-1_]+ |[-+]?0?[0-7_]+ |[-+]?(?:0|[1-9][0-9_]*) |[-+]?0x[0-9a-fA-F_]+ @@ -67,17 +68,17 @@ implicit_resolvers = [ list(u'-+0123456789')), ([(1, 2), (1, 1)], u'tag:yaml.org,2002:merge', - re.compile(u'^(?:<<)$'), + RegExp(u'^(?:<<)$'), [u'<']), ([(1, 2), (1, 1)], u'tag:yaml.org,2002:null', - re.compile(u'''^(?: ~ + RegExp(u'''^(?: ~ |null|Null|NULL | )$''', re.X), [u'~', u'n', u'N', u'']), ([(1, 2), (1, 1)], u'tag:yaml.org,2002:timestamp', - re.compile(u'''^(?:[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] + RegExp(u'''^(?:[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] |[0-9][0-9][0-9][0-9] -[0-9][0-9]? -[0-9][0-9]? (?:[Tt]|[ \\t]+)[0-9][0-9]? :[0-9][0-9] :[0-9][0-9] (?:\\.[0-9]*)? @@ -85,13 +86,13 @@ implicit_resolvers = [ list(u'0123456789')), ([(1, 2), (1, 1)], u'tag:yaml.org,2002:value', - re.compile(u'^(?:=)$'), + RegExp(u'^(?:=)$'), [u'=']), # The following resolver is only for documentation purposes. It cannot work # because plain scalars cannot start with '!', '&', or '*'. ([(1, 2), (1, 1)], u'tag:yaml.org,2002:yaml', - re.compile(u'^(?:!|&|\\*)$'), + RegExp(u'^(?:!|&|\\*)$'), list(u'!&*')), ] @@ -308,14 +309,14 @@ class Resolver(BaseResolver): Resolver.add_implicit_resolver_base( u'tag:yaml.org,2002:bool', - re.compile(u'''^(?:yes|Yes|YES|no|No|NO + RegExp(u'''^(?:yes|Yes|YES|no|No|NO |true|True|TRUE|false|False|FALSE |on|On|ON|off|Off|OFF)$''', re.X), list(u'yYnNtTfFoO')) Resolver.add_implicit_resolver_base( u'tag:yaml.org,2002:float', - re.compile(u'''^(?: + RegExp(u'''^(?: [-+]?(?:[0-9][0-9_]*)\\.[0-9_]*(?:[eE][-+]?[0-9]+)? |[-+]?(?:[0-9][0-9_]*)(?:[eE][-+]?[0-9]+) |\\.[0-9_]+(?:[eE][-+][0-9]+)? @@ -326,7 +327,7 @@ Resolver.add_implicit_resolver_base( Resolver.add_implicit_resolver_base( u'tag:yaml.org,2002:int', - re.compile(u'''^(?:[-+]?0b[0-1_]+ + RegExp(u'''^(?:[-+]?0b[0-1_]+ |[-+]?0o?[0-7_]+ |[-+]?(?:0|[1-9][0-9_]*) |[-+]?0x[0-9a-fA-F_]+ @@ -335,19 +336,19 @@ Resolver.add_implicit_resolver_base( Resolver.add_implicit_resolver_base( u'tag:yaml.org,2002:merge', - re.compile(u'^(?:<<)$'), + RegExp(u'^(?:<<)$'), [u'<']) Resolver.add_implicit_resolver_base( u'tag:yaml.org,2002:null', - re.compile(u'''^(?: ~ + RegExp(u'''^(?: ~ |null|Null|NULL | )$''', re.X), [u'~', u'n', u'N', u'']) Resolver.add_implicit_resolver_base( u'tag:yaml.org,2002:timestamp', - re.compile(u'''^(?:[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] + RegExp(u'''^(?:[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] |[0-9][0-9][0-9][0-9] -[0-9][0-9]? -[0-9][0-9]? (?:[Tt]|[ \\t]+)[0-9][0-9]? :[0-9][0-9] :[0-9][0-9] (?:\\.[0-9]*)? @@ -356,14 +357,14 @@ Resolver.add_implicit_resolver_base( Resolver.add_implicit_resolver_base( u'tag:yaml.org,2002:value', - re.compile(u'^(?:=)$'), + RegExp(u'^(?:=)$'), [u'=']) # The following resolver is only for documentation purposes. It cannot work # because plain scalars cannot start with '!', '&', or '*'. Resolver.add_implicit_resolver_base( u'tag:yaml.org,2002:yaml', - re.compile(u'^(?:!|&|\\*)$'), + RegExp(u'^(?:!|&|\\*)$'), list(u'!&*')) diff --git a/serializer.py b/serializer.py index 46884b5..d6012db 100644 --- a/serializer.py +++ b/serializer.py @@ -2,10 +2,9 @@ from __future__ import absolute_import -import re - from ruamel.yaml.error import YAMLError from ruamel.yaml.compat import nprint, DBG_NODE, dbg, string_types +from ruamel.yaml.util import RegExp from ruamel.yaml.events import ( StreamStartEvent, StreamEndEvent, MappingStartEvent, MappingEndEvent, @@ -31,7 +30,7 @@ class Serializer(object): # 'id' and 3+ numbers, but not 000 ANCHOR_TEMPLATE = u'id%03d' - ANCHOR_RE = re.compile(u'id(?!000$)\\d{3,}') + ANCHOR_RE = RegExp(u'id(?!000$)\\d{3,}') def __init__(self, encoding=None, explicit_start=None, explicit_end=None, version=None, tags=None, dumper=None): @@ -6,6 +6,9 @@ some helper functions that might be generally useful from __future__ import absolute_import, print_function +from functools import partial +import re + from .compat import text_type, binary_type if False: # MYPY @@ -13,6 +16,26 @@ if False: # MYPY from .compat import StreamTextType # NOQA +class LazyEval(object): + def __init__(self, func, *args, **kwargs): + def lazy_self(): + return_value = func(*args, **kwargs) + object.__setattr__(self, "lazy_self", lambda: return_value) + return return_value + object.__setattr__(self, "lazy_self", lazy_self) + + def __getattribute__(self, name): + lazy_self = object.__getattribute__(self, "lazy_self") + if name == "lazy_self": + return lazy_self + return getattr(lazy_self(), name) + + def __setattr__(self, name, value): + setattr(self.lazy_self(), name, value) + + +RegExp = partial(LazyEval, re.compile) + # originally as comment # https://github.com/pre-commit/pre-commit/pull/211#issuecomment-186466605 # if you use this in your code, I suggest adding a test in your test suite |