omlish 0.0.0.dev434__py3-none-any.whl → 0.0.0.dev435__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
omlish/__about__.py CHANGED
@@ -1,5 +1,5 @@
1
- __version__ = '0.0.0.dev434'
2
- __revision__ = '17585e1a0390e30925b0e2c5e65944f8f99a9dc3'
1
+ __version__ = '0.0.0.dev435'
2
+ __revision__ = 'deaaa1ce6258184eff437ebf09b0eea7fc2ca758'
3
3
 
4
4
 
5
5
  #
@@ -1,17 +0,0 @@
1
- from .. import lang as _lang
2
-
3
-
4
- with _lang.auto_proxy_init(globals()):
5
- ##
6
-
7
- from .executors import ( # noqa
8
- ImmediateExecutor,
9
- new_executor,
10
- )
11
-
12
- from .futures import ( # noqa
13
- FutureError,
14
- FutureTimeoutError,
15
- wait_futures,
16
- wait_dependent_futures,
17
- )
@@ -0,0 +1,17 @@
1
+ from .. import lang as _lang
2
+
3
+
4
+ with _lang.auto_proxy_init(globals()):
5
+ ##
6
+
7
+ from .executors import ( # noqa
8
+ ImmediateExecutor,
9
+ new_executor,
10
+ )
11
+
12
+ from .futures import ( # noqa
13
+ FutureError,
14
+ FutureTimeoutError,
15
+ wait_futures,
16
+ wait_dependent_futures,
17
+ )
omlish/configs/types.py CHANGED
@@ -3,7 +3,7 @@
3
3
  import typing as ta
4
4
 
5
5
 
6
- ConfigMap = ta.Mapping[str, ta.Any]
6
+ ConfigMap = ta.Mapping[str, ta.Any] # ta.TypeAlias
7
7
 
8
8
 
9
9
  ##
@@ -0,0 +1,70 @@
1
+ from .. import lang as _lang # noqa
2
+
3
+
4
+ with _lang.auto_proxy_init(globals()):
5
+ ##
6
+
7
+ from .daemon import ( # noqa
8
+ Daemon,
9
+ )
10
+
11
+ from .launching import ( # noqa
12
+ Launcher,
13
+ )
14
+
15
+ from .services import ( # noqa
16
+ Service,
17
+
18
+ ServiceTarget,
19
+ ServiceTargetRunner,
20
+
21
+ ServiceConfigTarget,
22
+ ServiceConfigTargetRunner,
23
+ )
24
+
25
+ from .spawning import ( # noqa
26
+ Spawning,
27
+ Spawn,
28
+ Spawner,
29
+ InProcessSpawner,
30
+ spawner_for,
31
+
32
+ MultiprocessingSpawning,
33
+ MultiprocessingSpawner,
34
+
35
+ ForkSpawning,
36
+ ForkSpawner,
37
+
38
+ ThreadSpawning,
39
+ ThreadSpawner,
40
+ )
41
+
42
+ from .targets import ( # noqa
43
+ Target,
44
+ TargetRunner,
45
+ target_runner_for,
46
+
47
+ FnTarget,
48
+ FnTargetRunner,
49
+
50
+ NameTarget,
51
+ NameTargetRunner,
52
+
53
+ ExecTarget,
54
+ ExecTargetRunner,
55
+ )
56
+
57
+ from .waiting import ( # noqa
58
+ Wait,
59
+ Waiter,
60
+ waiter_for,
61
+
62
+ SequentialWait,
63
+ SequentialWaiter,
64
+
65
+ FnWait,
66
+ FnWaiter,
67
+
68
+ ConnectWait,
69
+ ConnectWaiter,
70
+ )
@@ -6,7 +6,7 @@ import typing as ta
6
6
 
7
7
 
8
8
  def _hands_off_repr(obj: ta.Any) -> str:
9
- return f'{obj.__class__.__qualname__}@{hex(id(obj))[2:]}'
9
+ return f'{obj.__class__.__qualname__}@{id(obj):x}'
10
10
 
11
11
 
12
12
  def _fn_repr(fn: ta.Callable) -> str:
@@ -122,11 +122,17 @@ class JsonStreamLexer(GenMachine[str, Token]):
122
122
  include_space: bool = False,
123
123
  allow_comments: bool = False,
124
124
  include_comments: bool = False,
125
+ allow_single_quotes: bool = False,
126
+ string_literal_parser: ta.Callable[[str], str] | None = None,
125
127
  ) -> None:
126
128
  self._include_raw = include_raw
127
129
  self._include_space = include_space
128
130
  self._allow_comments = allow_comments
129
131
  self._include_comments = include_comments
132
+ self._allow_single_quotes = allow_single_quotes
133
+ if string_literal_parser is None:
134
+ string_literal_parser = json.loads
135
+ self._string_literal_parser = string_literal_parser
130
136
 
131
137
  self._ofs = 0
132
138
  self._line = 1
@@ -202,8 +208,8 @@ class JsonStreamLexer(GenMachine[str, Token]):
202
208
  yield self._make_tok(CONTROL_TOKENS[c], c, c, self.pos)
203
209
  continue
204
210
 
205
- if c == '"':
206
- return self._do_string()
211
+ if c == '"' or (self._allow_single_quotes and c == "'"):
212
+ return self._do_string(c)
207
213
 
208
214
  if c.isdigit() or c == '-':
209
215
  return self._do_number(c)
@@ -217,9 +223,9 @@ class JsonStreamLexer(GenMachine[str, Token]):
217
223
 
218
224
  self._raise(f'Unexpected character: {c}')
219
225
 
220
- def _do_string(self):
226
+ def _do_string(self, q: str):
221
227
  check.state(self._buf.tell() == 0)
222
- self._buf.write('"')
228
+ self._buf.write(q)
223
229
 
224
230
  pos = self.pos
225
231
 
@@ -234,13 +240,13 @@ class JsonStreamLexer(GenMachine[str, Token]):
234
240
  self._raise(f'Unterminated string literal: {self._buf.getvalue()}')
235
241
 
236
242
  self._buf.write(c)
237
- if c == '"' and last != '\\':
243
+ if c == q and last != '\\':
238
244
  break
239
245
  last = c
240
246
 
241
247
  raw = self._flip_buf()
242
248
  try:
243
- sv = json.loads(raw)
249
+ sv = self._string_literal_parser(raw)
244
250
  except json.JSONDecodeError as e:
245
251
  self._raise(f'Invalid string literal: {raw!r}', e)
246
252
 
@@ -1,3 +1,28 @@
1
+ r"""
2
+ TODO:
3
+ - gson switches
4
+ - Strictness.LEGACY_STRICT
5
+ - JsonReader allows the literals true, false and null to have any capitalization, for example fAlSe or NULL
6
+ - JsonReader supports the escape sequence \', representing a ' (single-quote)
7
+ - JsonReader supports the escape sequence \LF (with LF being the Unicode character U+000A), resulting in a LF within
8
+ the read JSON string
9
+ - JsonReader allows unescaped control characters (U+0000 through U+001F)
10
+ - Strictness.LENIENT
11
+ - In lenient mode, all input that is accepted in legacy strict mode is accepted in addition to the following
12
+ departures from RFC 8259:
13
+ - Streams that start with the non-execute prefix, ")]'\n"}
14
+ - Streams that include multiple top-level values. With legacy strict or strict parsing, each stream must contain
15
+ exactly one top-level value.
16
+ - Numbers may be NaNs or infinities represented by NaN and (-)Infinity respectively.
17
+ - End of line comments starting with // or # and ending with a newline character.
18
+ - C-style comments starting with /* and ending with */. Such comments may not be nested.
19
+ - Names that are unquoted or 'single quoted'.
20
+ - Strings that are unquoted or 'single quoted'.
21
+ - Array elements separated by ; instead of ,.
22
+ - Unnecessary array separators. These are interpreted as if null was the omitted value.
23
+ - Names and values separated by = or => instead of :.
24
+ - Name/value pairs separated by ; instead of ,.
25
+ """
1
26
  import dataclasses as dc
2
27
  import typing as ta
3
28
 
@@ -15,7 +40,7 @@ class JsonStreamValueParser(lang.ExitStacked):
15
40
  include_raw: bool = False
16
41
  yield_object_lists: bool = False
17
42
 
18
- allow_comments: bool = False
43
+ json5: bool = False
19
44
 
20
45
  #
21
46
 
@@ -26,7 +51,8 @@ class JsonStreamValueParser(lang.ExitStacked):
26
51
  def _enter_contexts(self) -> None:
27
52
  self._lex = JsonStreamLexer(
28
53
  include_raw=self.include_raw,
29
- allow_comments=self.allow_comments,
54
+ allow_comments=self.json5,
55
+ allow_single_quotes=self.json5,
30
56
  )
31
57
 
32
58
  self._parse = JsonStreamParser()
@@ -0,0 +1,82 @@
1
+ """
2
+ TODO:
3
+
4
+ Objects:
5
+ - Object keys may be an ECMAScript 5.1 IdentifierName.
6
+ - Objects may have a single trailing comma.
7
+ Arrays:
8
+ - Arrays may have a single trailing comma.
9
+ Strings:
10
+ - Strings may be single quoted.
11
+ - Strings may span multiple lines by escaping new line characters.
12
+ - Strings may include character escapes.
13
+ Numbers:
14
+ - Numbers may be hexadecimal.
15
+ - Numbers may have a leading or trailing decimal point.
16
+ - Numbers may be IEEE 754 positive infinity, negative infinity, and NaN.
17
+ - Numbers may begin with an explicit plus sign.
18
+ Comments:
19
+ + Single and multi-line comments are allowed.
20
+ White Space:
21
+ - Additional white space characters are allowed.
22
+ """
23
+ import dataclasses as dc
24
+ import typing as ta
25
+
26
+ from ... import lang
27
+ from ..json.stream.building import JsonValueBuilder
28
+ from ..json.stream.lexing import JsonStreamLexer
29
+ from ..json.stream.parsing import JsonStreamParser
30
+ from .literals import parse_string_literal
31
+
32
+
33
+ ##
34
+
35
+
36
+ @dc.dataclass(kw_only=True)
37
+ class JsonStreamValueParser(lang.ExitStacked):
38
+ include_raw: bool = False
39
+ yield_object_lists: bool = False
40
+
41
+ #
42
+
43
+ _lex: JsonStreamLexer = dc.field(init=False)
44
+ _parse: JsonStreamParser = dc.field(init=False)
45
+ _build: JsonValueBuilder = dc.field(init=False)
46
+
47
+ def _enter_contexts(self) -> None:
48
+ self._lex = JsonStreamLexer(
49
+ include_raw=self.include_raw,
50
+ allow_comments=True,
51
+ allow_single_quotes=True,
52
+ string_literal_parser=parse_string_literal,
53
+ )
54
+
55
+ self._parse = JsonStreamParser()
56
+
57
+ self._build = JsonValueBuilder(
58
+ yield_object_lists=self.yield_object_lists,
59
+ )
60
+
61
+ def feed(self, i: ta.Iterable[str]) -> ta.Iterator[ta.Any]:
62
+ for c in i:
63
+ for t in self._lex(c):
64
+ for e in self._parse(t):
65
+ for v in self._build(e): # noqa
66
+ yield v
67
+
68
+
69
+ def stream_parse_values(
70
+ i: ta.Iterable[str],
71
+ **kwargs: ta.Any,
72
+ ) -> ta.Generator[ta.Any]:
73
+ with JsonStreamValueParser(**kwargs) as p:
74
+ yield from p.feed(i)
75
+
76
+
77
+ def stream_parse_one_value(
78
+ i: ta.Iterable[str],
79
+ **kwargs: ta.Any,
80
+ ) -> ta.Any:
81
+ with JsonStreamValueParser(**kwargs) as p:
82
+ return next(p.feed(i))
@@ -45,7 +45,7 @@ class GenMachine(ta.Generic[I, O]):
45
45
  _gen: MachineGen | None
46
46
 
47
47
  def __repr__(self) -> str:
48
- return f'{self.__class__.__name__}@{hex(id(self))[2:]}<{self.state}>'
48
+ return f'{self.__class__.__name__}@{id(self):x}<{self.state}>'
49
49
 
50
50
  #
51
51
 
@@ -77,7 +77,7 @@ from ...versions import HttpProtocolVersion
77
77
  from ...versions import HttpProtocolVersions
78
78
 
79
79
 
80
- CoroHttpServerFactory = ta.Callable[[SocketAddress], 'CoroHttpServer']
80
+ CoroHttpServerFactory = ta.Callable[[SocketAddress], 'CoroHttpServer'] # ta.TypeAlias
81
81
 
82
82
 
83
83
  ##
omlish/lite/attrops.py CHANGED
@@ -212,7 +212,7 @@ class AttrOps(ta.Generic[T]):
212
212
  return (
213
213
  f'{o.__class__.__module__ + "." if self._with_module else ""}'
214
214
  f'{o.__class__.__qualname__ if self._use_qualname else o.__class__.__name__}'
215
- f'{("@" + hex(id(o))[2:]) if self._with_id else ""}'
215
+ f'{("@" + hex(id(o))[2:]) if self._with_id else ""}' # noqa
216
216
  f'({vs})'
217
217
  )
218
218
 
omlish/lite/inject.py CHANGED
@@ -21,12 +21,12 @@ T = ta.TypeVar('T')
21
21
  U = ta.TypeVar('U')
22
22
 
23
23
 
24
- InjectorKeyCls = ta.Union[type, ta.NewType]
24
+ InjectorKeyCls = ta.Union[type, ta.NewType] # ta.TypeAlias
25
25
 
26
- InjectorProviderFn = ta.Callable[['Injector'], ta.Any]
27
- InjectorProviderFnMap = ta.Mapping['InjectorKey', 'InjectorProviderFn']
26
+ InjectorProviderFn = ta.Callable[['Injector'], ta.Any] # ta.TypeAlias
27
+ InjectorProviderFnMap = ta.Mapping['InjectorKey', 'InjectorProviderFn'] # ta.TypeAlias
28
28
 
29
- InjectorBindingOrBindings = ta.Union['InjectorBinding', 'InjectorBindings']
29
+ InjectorBindingOrBindings = ta.Union['InjectorBinding', 'InjectorBindings'] # ta.TypeAlias
30
30
 
31
31
 
32
32
  ###
@@ -1,14 +1,24 @@
1
1
  # ruff: noqa: I001
2
2
  """
3
3
  TODO:
4
- - redacted
5
- - strongly typed MarshalerFactory base class?
6
- - strongly typed Composite/Cached Marshaler/Unmarshaler factories - footgun
7
- - streaming? Start/EndObject, etc..
8
- - lang.Marker - class name, handle type[Foo]
9
- - can't disambiguate from str - can't coexist in bare union
10
- - factories being free MatchFns does more harm than good - in practice these are such big guns you want to write a
11
- class body if only ceremonially
4
+ - streaming?
5
+ - datatypes
6
+ - redacted
7
+ - lang.Marker - class name, handle type[Foo]
8
+ - pathlib.Path
9
+ - decimal.Decimal
10
+ - datetime.date, datetime.time
11
+ - ipaddress
12
+ - numpy types
13
+ - jackson switches
14
+ - accept_case_insensitive_enums
15
+ - accept_case_insensitive_properties
16
+ - accept_case_insensitive_values
17
+ - allow_coercion_of_scalars
18
+ - use_base_type_as_default_impl
19
+ - codegen
20
+ - context-local switches
21
+ - mutable_collections
12
22
  - simple lite interop like inj - alt ObjMarshalerManager impl for Context
13
23
 
14
24
  See:
@@ -16,6 +26,8 @@ See:
16
26
  - https://github.com/jcrist/msgspec
17
27
  - https://github.com/Fatal1ty/mashumaro
18
28
  - https://github.com/Kotlin/kotlinx.serialization/blob/master/docs/serializers.md#custom-serializers
29
+ - https://github.com/yukinarit/pyserde
30
+ - https://github.com/FasterXML/jackson
19
31
  """
20
32
  from .. import dataclasses as _dc # noqa
21
33
 
omlish/os/atomics.py CHANGED
@@ -11,7 +11,7 @@ from ..lite.attrops import attr_repr
11
11
  from ..lite.check import check
12
12
 
13
13
 
14
- AtomicPathSwapKind = ta.Literal['dir', 'file']
14
+ AtomicPathSwapKind = ta.Literal['dir', 'file'] # ta.TypeAlias
15
15
  AtomicPathSwapState = ta.Literal['open', 'committed', 'aborted'] # ta.TypeAlias
16
16
 
17
17
 
omlish/reflect/ops.py CHANGED
@@ -1,3 +1,12 @@
1
+ """
2
+ TODO:
3
+ - visitor / transformer
4
+ - gson had an ObjectNavigator:
5
+ - https://github.com/google/gson/blob/f291c4d33ea5fcc52afcfa5713e519e663378bda/gson/src/main/java/com/google/gson/ObjectNavigator.java
6
+ - removed in 25c6ae177b1ca56db7f3c29eb574bdd032a06165
7
+ - uniform collection isinstance - items() for mappings, iter() for other
8
+ - also check instance type in isinstance not just items lol
9
+ """ # noqa
1
10
  import dataclasses as dc
2
11
  import typing as ta
3
12
 
omlish/reflect/types.py CHANGED
@@ -9,12 +9,8 @@ give it some guiding North Star to make all of its decisions for it, and to add
9
9
  meet, join, solve, ...), but it's quite a bit of work and not a priority at the moment.
10
10
 
11
11
  TODO:
12
- - visitor / transformer
13
- - uniform collection isinstance - items() for mappings, iter() for other
14
- - also check instance type in isinstance not just items lol
15
- - ta.Generic in mro causing trouble - omit? no longer 1:1
16
- - cache this shit, esp generic_mro shit
17
- - cache __hash__ in Generic/Union
12
+ - !! cache this shit !!
13
+ - especially generic_mro shit
18
14
  """
19
15
  import dataclasses as dc
20
16
  import threading
@@ -22,6 +18,7 @@ import types
22
18
  import typing as ta
23
19
 
24
20
  from ..lite.abstract import Abstract
21
+ from ..lite.dataclasses import dataclass_cache_hash
25
22
 
26
23
 
27
24
  _NoneType = types.NoneType # type: ignore
@@ -51,6 +48,7 @@ if not isinstance(_Protocol, type) or not issubclass(_Protocol, _Generic):
51
48
  ##
52
49
 
53
50
 
51
+ @dataclass_cache_hash()
54
52
  @dc.dataclass(frozen=True)
55
53
  class _Special:
56
54
  name: str
@@ -68,6 +66,7 @@ class _Special:
68
66
  )
69
67
 
70
68
 
69
+ @dataclass_cache_hash()
71
70
  @dc.dataclass(frozen=True)
72
71
  class _LazySpecial:
73
72
  name: str
@@ -297,6 +296,7 @@ TYPES: tuple[type, ...] = (
297
296
  ##
298
297
 
299
298
 
299
+ @dataclass_cache_hash()
300
300
  @dc.dataclass(frozen=True)
301
301
  class Union(TypeInfo):
302
302
  args: frozenset[Type]
@@ -320,6 +320,7 @@ class Union(TypeInfo):
320
320
  GenericLikeCls = ta.TypeVar('GenericLikeCls')
321
321
 
322
322
 
323
+ @dataclass_cache_hash()
323
324
  @dc.dataclass(frozen=True)
324
325
  class GenericLike(TypeInfo, Abstract, ta.Generic[GenericLikeCls]):
325
326
  cls: GenericLikeCls
@@ -363,6 +364,7 @@ class Protocol(GenericLike[ta.Any]):
363
364
  #
364
365
 
365
366
 
367
+ @dataclass_cache_hash()
366
368
  @dc.dataclass(frozen=True)
367
369
  class NewType(TypeInfo):
368
370
  obj: ta.Any
@@ -372,6 +374,7 @@ class NewType(TypeInfo):
372
374
  #
373
375
 
374
376
 
377
+ @dataclass_cache_hash()
375
378
  @dc.dataclass(frozen=True)
376
379
  class Annotated(TypeInfo):
377
380
  ty: Type
@@ -383,6 +386,7 @@ class Annotated(TypeInfo):
383
386
  #
384
387
 
385
388
 
389
+ @dataclass_cache_hash()
386
390
  @dc.dataclass(frozen=True)
387
391
  class Literal(TypeInfo):
388
392
  args: tuple[ta.Any, ...]
@@ -417,6 +421,15 @@ _TRIVIAL_TYPES: set[ta.Any] = {
417
421
  }
418
422
 
419
423
 
424
+ # TODO: speed up is_type: `if obj.__class__ in _NOT_SUBCLASSED_SPECIAL_TYPES: return True`
425
+ # _NOT_SUBCLASSED_SPECIAL_TYPES: set[type] = {
426
+ # type(ta.Any),
427
+ # _UnionGenericAlias,
428
+ # ta.NewType,
429
+ # }
430
+ # TODO: static_init(for t in _NOT_SUBCLASSED_SPECIAL_TYPES: if (sts := t.__subclasses__()): raise TypeError)
431
+
432
+
420
433
  class Reflector:
421
434
  def __init__(
422
435
  self,
@@ -9,7 +9,7 @@ import socket as socket_
9
9
  import typing as ta
10
10
 
11
11
 
12
- SocketAddress = ta.Any
12
+ SocketAddress = ta.Any # ta.TypeAlias
13
13
 
14
14
 
15
15
  ##
@@ -16,7 +16,7 @@ class Param(lang.Final):
16
16
  if self.n is not None:
17
17
  return f'{self.__class__.__name__}({self.n!r})'
18
18
  else:
19
- return f'{self.__class__.__name__}(@{hex(id(self))[2:]})'
19
+ return f'{self.__class__.__name__}(@{id(self):x})'
20
20
 
21
21
  def __eq__(self, other):
22
22
  if not isinstance(other, Param):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omlish
3
- Version: 0.0.0.dev434
3
+ Version: 0.0.0.dev435
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License-Expression: BSD-3-Clause
@@ -1,5 +1,5 @@
1
1
  omlish/.omlish-manifests.json,sha256=FLw7xkPiSXuImZgqSP8BwrEib2R1doSzUPLUkc-QUIA,8410
2
- omlish/__about__.py,sha256=m7yiLBUWx0CVlaZfQTSqMs9tncfitfDQ8RfhF4ieLow,3575
2
+ omlish/__about__.py,sha256=bsbnbJ01mORwCaxsJTuma7CmtQSocvxRTopPlqs2yhw,3575
3
3
  omlish/__init__.py,sha256=SsyiITTuK0v74XpKV8dqNaCmjOlan1JZKrHQv5rWKPA,253
4
4
  omlish/c3.py,sha256=ZNIMl1kwg3qdei4DiUrJPQe5M81S1e76N-GuNSwLBAE,8683
5
5
  omlish/cached.py,sha256=MLap_p0rdGoDIMVhXVHm1tsbcWobJF0OanoodV03Ju8,542
@@ -103,7 +103,8 @@ omlish/collections/persistent/treapmap.py,sha256=O4rh3x6p6tQ0EC2wiz80ZzGNb37-mQR
103
103
  omlish/collections/sorted/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
104
104
  omlish/collections/sorted/skiplist.py,sha256=bcTO1hZvV5EnYxBZ3YBhdewXP_2aCTZra7tJ0pA7jjo,6194
105
105
  omlish/collections/sorted/sorted.py,sha256=sWMRdwdiKmByeWY0nwOq_nxLL5_sjHYfJVu95xmaxc8,3969
106
- omlish/concurrent/__init__.py,sha256=OCr6LUTXq95sG97dsFvSrFm-V0vy1vDjUf5pO5PzGrY,315
106
+ omlish/concurrent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
107
+ omlish/concurrent/all.py,sha256=OCr6LUTXq95sG97dsFvSrFm-V0vy1vDjUf5pO5PzGrY,315
107
108
  omlish/concurrent/executors.py,sha256=j2V8f4UW3sJJG_qn7ldi1R2yY2QmUQA3UCuNQvLj1Wk,1285
108
109
  omlish/concurrent/futures.py,sha256=870tx8ELI8THvMnTrQoYIlEFKO9hM4KUrlehckJqKBU,4238
109
110
  omlish/concurrent/threadlets.py,sha256=Z1pCSWt7U8VBMhPFNzd850BfbDMiGQxhYCC7X7KjYyU,2435
@@ -113,7 +114,7 @@ omlish/configs/classes.py,sha256=sWBL1K90Ix5E-N_A6Uz7s-djpkS2rKEzOLFYB8pHk9k,117
113
114
  omlish/configs/formats.py,sha256=iqaenbKsHV2DTHwabwqA4X6WOp5hBZLfkzOXprVHx6w,5370
114
115
  omlish/configs/nginx.py,sha256=b4fMI8dIZBUgOjmveRINrmmwSt8DO3y7nfvd-__YxDo,2062
115
116
  omlish/configs/shadow.py,sha256=mIPXMpEWg0rTKYh0yKskN8NhhCBw6d83peiVS_p8PKQ,2273
116
- omlish/configs/types.py,sha256=vANNURlIos3fR3fgcL2EMW5t6RevzSHU-BnVZgwIDOM,110
117
+ omlish/configs/types.py,sha256=DXMfusdmj7jrE1R1kQxbtI36Keo6re4xn_oLy3SqzMk,126
117
118
  omlish/configs/processing/__init__.py,sha256=eUBm0L6oZuwwM4vEuYx0pcCNdSTXaF7luur7jQz1qoc,210
118
119
  omlish/configs/processing/all.py,sha256=BCoWKxywH5mViWQrKmLHry8faS45ZW9jItaypPK197c,967
119
120
  omlish/configs/processing/flattening.py,sha256=q2b9L4R_GbeAi94NInycxpZ96KRnY1KFnOV7NVrwxUc,5066
@@ -123,7 +124,7 @@ omlish/configs/processing/merging.py,sha256=ZGc-8QA9tjqgXnQ80ItfOMdmAKAEAOxtWEGF
123
124
  omlish/configs/processing/names.py,sha256=9nRVBhZ0uY-J4591QcgUHla4MZAEux0-TWxGO1qaTrA,1099
124
125
  omlish/configs/processing/rewriting.py,sha256=ofPYub5ftZ6A_bkAW71w2wDmSbZ5ULI3Ip190fzBl4Q,4252
125
126
  omlish/configs/processing/strings.py,sha256=Iw85H_AE2TG8vdpbgwhye-aqz5Hkn4J9mM32FdXEiGo,832
126
- omlish/daemons/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
127
+ omlish/daemons/__init__.py,sha256=C9zRzJQa8DOw5mlnp1W-JMetbuxCPQFGlIdBY_CPUco,1147
127
128
  omlish/daemons/daemon.py,sha256=rgSozDUOEE56KyT2rCRxZJEt9zJ-wkKk6R_fwjm2D-4,3501
128
129
  omlish/daemons/launching.py,sha256=uLRfuWpW19H_lP_QcqfHOZBaJDa1WvDNfJgVx4i4c9g,3771
129
130
  omlish/daemons/reparent.py,sha256=uEs7pjzQkL8zhM8xADJhedmXXA7eDsu28639F5HkmpU,590
@@ -134,7 +135,7 @@ omlish/daemons/waiting.py,sha256=fuR51IHdBDRVtfdewcw_0qw8itoXqmtdR_qtkoBChuE,170
134
135
  omlish/dataclasses/__init__.py,sha256=Jsb8i9cm_ZSkHL5qIPftYeRt9wNK7Cp2HRtZa9vxhus,3604
135
136
  omlish/dataclasses/_internals.py,sha256=_THiziiIslUyYC98Y_tZd5aZgvEF3FAGkDSwzRfcDuo,3247
136
137
  omlish/dataclasses/debug.py,sha256=giBiv6aXvX0IagwNCW64qBzNjfOFr3-VmgDy_KYlb-k,29
137
- omlish/dataclasses/errors.py,sha256=tyv3WR6az66uGGiq9FIuCHvy1Ef-G7zeMY7mMG6hy2Y,2527
138
+ omlish/dataclasses/errors.py,sha256=QeJVRmrZQer3m66jSDiuAyfAngCBtocMxfnsoSxzOVw,2520
138
139
  omlish/dataclasses/inspect.py,sha256=EpVb50CsEUWpn70gkjBa-hI1mr5_VubHTERsofgE-Lw,4600
139
140
  omlish/dataclasses/reflection.py,sha256=6BD2FUiOEtpi_2JREWyVzemjbBJdBMUm8XxQ9SVIKGs,2799
140
141
  omlish/dataclasses/specs.py,sha256=VOY2uCjxLhemBuLd1VXz5KJXmZ48NL3sMJxzOhXmau8,6191
@@ -275,10 +276,10 @@ omlish/formats/json/backends/ujson.py,sha256=U3iOlAURfiCdXbiNlXfIjDdtJDbDaLZsSuZ
275
276
  omlish/formats/json/stream/__init__.py,sha256=LOQvJGUEqvm1exve1hnWoO3mlMadShaO2Cy7XjCiWbA,829
276
277
  omlish/formats/json/stream/building.py,sha256=dyrOms7Yskayi0-MG4e5-5ilN08HIekNEogJh5C4hhs,2549
277
278
  omlish/formats/json/stream/errors.py,sha256=c8M8UAYmIZ-vWZLeKD2jMj4EDCJbr9QR8Jq_DyHjujQ,43
278
- omlish/formats/json/stream/lexing.py,sha256=YVpB_MF_lzYovMmKvfu3HNpuvGk_ZTVPQICHmfQa7BA,9004
279
+ omlish/formats/json/stream/lexing.py,sha256=E4j99qfCp2xIGk9CrwhPNVk0_ltLKvpw9G0K2xp1AAg,9396
279
280
  omlish/formats/json/stream/parsing.py,sha256=c7958eYT5-KO8VFIVGBM-MowuaJ6UNTt7l2tTlRKHek,6468
280
281
  omlish/formats/json/stream/rendering.py,sha256=U0MyVoYRDv7JLI8e7ItwmxyKnqYhKvfJY4-ZBQ5lHzA,3694
281
- omlish/formats/json/stream/utils.py,sha256=qub586Z-dsIg3kvMMtBQfvAa_B6IL-xuDj2dA3Mcql0,1458
282
+ omlish/formats/json/stream/utils.py,sha256=_lqksQtoIgWjQWY4r-V2liJ7Dkz5rRAUnzwWyzKe8jc,2950
282
283
  omlish/formats/json5/Json5.g4,sha256=2V3IB8W1R45mFax5Qy4laAwcHJ9oFPWHc-r8qy9-YE4,2381
283
284
  omlish/formats/json5/__init__.py,sha256=3rwU5w5N_-dYME5kwMvXgexl-Vvo4BAmOg1N-I9Wf0M,194
284
285
  omlish/formats/json5/codec.py,sha256=mywk74R7F77z7xprQd19qoJZ8sNPUEkiBD9jNCKTh0c,1603
@@ -286,7 +287,7 @@ omlish/formats/json5/errors.py,sha256=AHkR9ySjAoQdUrizpqgL8fg0M5oe5mHZkml3KZHEvC
286
287
  omlish/formats/json5/literals.py,sha256=rj4-9KFXfgdq5oK_eUkp57cgoMQ8T0gRaG9ga430he4,2429
287
288
  omlish/formats/json5/parsing.py,sha256=_M-DrXHz4izZcMp4QPCafMIgK6pzySHmksKDIhKW4lQ,2789
288
289
  omlish/formats/json5/rendering.py,sha256=V1XdLzawd-0qu7dVNorxUMiT4LRd5GCS8876-lDLF-c,4583
289
- omlish/formats/json5/streams.py,sha256=k0rvpwbNqpnSUSMCLYv8tmkfVxPxAVkS7GSIO_Ta-xE,669
290
+ omlish/formats/json5/stream.py,sha256=QNVWgejaimNkFmOtYtjV9E71L6zBxW7QdvVL_IdMquI,2253
290
291
  omlish/formats/json5/_antlr/Json5Lexer.py,sha256=8sT04wjBTDpyHpLo6a5byREBwfNnFtLPZp7Wx3KfbkY,23259
291
292
  omlish/formats/json5/_antlr/Json5Listener.py,sha256=wIqOwp4r-cOHxy6sxQbNmlYczqh2C3-H-74o_hr7WrA,2117
292
293
  omlish/formats/json5/_antlr/Json5Parser.py,sha256=psacqZWRzPNEZq70XKpOnelZXHuXjkULq1r-owaPs6g,19699
@@ -298,7 +299,7 @@ omlish/formats/toml/parser.py,sha256=aaZlEEPk0IQhfux_kjCY2K5mYYYDPNQ-4wWgZXskoAM
298
299
  omlish/formats/toml/writer.py,sha256=9NT8sRy3I9KubxFx56Qbislvrdtbd23rEuBT-GSdUYA,3232
299
300
  omlish/funcs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
300
301
  omlish/funcs/builders.py,sha256=ZSBQS2xqriXp5x0t074EEZvuTmMp4Yue2YGBoTLAioo,4044
301
- omlish/funcs/genmachine.py,sha256=YRRW5FwhUgtGhi482tdlZbgz0aLGXtLB4Y0gOZGcP2w,2578
302
+ omlish/funcs/genmachine.py,sha256=BOxO1OTjxZ7ewv_WpqYkY8bwlGQIJIjwjvYMflEFa_M,2571
302
303
  omlish/funcs/match.py,sha256=AD0sQs_GIRq--fIQzL5gFYzlvXHplIljvlx7hbhNSEk,6213
303
304
  omlish/funcs/pairs.py,sha256=XhYTJdqooAJKeoGZmEaiKYeFRq5-Dj2_y92IdBl_C20,4371
304
305
  omlish/funcs/pipes.py,sha256=E1dQZMBmgT2qautG1vEqy5v3QBsO2Nzryv33j4YAngA,2520
@@ -345,7 +346,7 @@ omlish/http/coro/client/status.py,sha256=EdiScV6lcbVHWNUTyXp7qOBJKh5QYO2TNUCNADi
345
346
  omlish/http/coro/client/validation.py,sha256=Hhy_CLN3Z7ZTVGEtPaHzqzDR50ReHKopHKukl8spLYU,5185
346
347
  omlish/http/coro/server/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
347
348
  omlish/http/coro/server/fdio.py,sha256=qZE4g5y4XESsTObSKyVggI-yzig57gSGJb4Z0rcHvgo,4157
348
- omlish/http/coro/server/server.py,sha256=lkpcx4cb0mwDFYpP3MvW6mX0_1fKXUI8snm_bycyUwo,18681
349
+ omlish/http/coro/server/server.py,sha256=1B98Jj8TeZpnLVA8W-VJDHIRfxeFx2EvVbEFyEq1n7o,18697
349
350
  omlish/http/coro/server/simple.py,sha256=j1RZ3niKrgGM2qFnjdYWn_eniZzay5j49Ca4L3u8vO4,3296
350
351
  omlish/http/coro/server/sockets.py,sha256=24gU6wpIZuzYWKQD8UsHyYfTZlbcUFvkqXq5KVgWpQo,2261
351
352
  omlish/inject/__init__.py,sha256=1s_2338tLi2VWKy8HijBSkAlkanVY1uZ8iZec8SOEws,2929
@@ -477,14 +478,14 @@ omlish/lite/__init__.py,sha256=cyZEpGob7XjU8DohyNxVe5CQRk4CQ5vrHL42OdhQb8w,148
477
478
  omlish/lite/abstract.py,sha256=Z3kLviPNGLkmA8m8BZILzWxez_sP18OyzgMP3-c2-RI,4068
478
479
  omlish/lite/args.py,sha256=ILJXAiN3KjIoJwY42aKpYPngUdxHIy9ssVIExFVz3fE,978
479
480
  omlish/lite/asyncs.py,sha256=sTXTUTTVI8m1a1P6NxObQKk-NFKlmpcnNbucr4Fg-NU,937
480
- omlish/lite/attrops.py,sha256=bUa2ILC4Z89-B1IWSac9XV_VvjKDnQXKDR0mZ6e9SMk,8764
481
+ omlish/lite/attrops.py,sha256=ytH2uv_oocyhhlU3T7kHh3UEkdgUnDiGqeyXe3uxPY4,8772
481
482
  omlish/lite/cached.py,sha256=ocQcppTwGdSnKPYMz75VoH526UUT8YtDJeRczBX0-wI,1306
482
483
  omlish/lite/check.py,sha256=ytCkwZoKfOlJqylL-AGm8C2WfsWJd2q3kFbnZCzX3_M,13844
483
484
  omlish/lite/configs.py,sha256=4-1uVxo-aNV7vMKa7PVNhM610eejG1WepB42-Dw2xQI,914
484
485
  omlish/lite/contextmanagers.py,sha256=usDzBoNqJi98AccVlwgZoMvoBXOe9wyx2MreZtWhJy4,5863
485
486
  omlish/lite/dataclasses.py,sha256=aRSCZz1jN_UI-CWJhN0SJeKxa-79vXNUZ6YOMgG31SE,3610
486
487
  omlish/lite/imports.py,sha256=GyEDKL-WuHtdOKIL-cc8aFd0-bHwZFDEjAB52ItabX0,1341
487
- omlish/lite/inject.py,sha256=Z0d3dnjxt9czMFwWk_y-Yl7yItCUa5Nf1YRu4GkMA5k,29045
488
+ omlish/lite/inject.py,sha256=3DB2IcAo1G8dau2tw_XkffQmKqQucY0XXWHebhD2TZs,29109
488
489
  omlish/lite/json.py,sha256=m0Ce9eqUZG23-H7-oOp8n1sf4fzno5vtK4AK_4Vc-Mg,706
489
490
  omlish/lite/marshal.py,sha256=J0VNr9_LjGLjxKW0wlZtIFnh_US7zwstCmtpe9Pk_D0,22969
490
491
  omlish/lite/maybes.py,sha256=NusCpK0FVqkIutw6_Wldn69G5VyKYhat7SegBIQmGpk,4412
@@ -534,7 +535,7 @@ omlish/manifests/globals.py,sha256=kVqQ-fT4kc7xWzLHoI731GviitFPv2v2yqw-p7t7Exs,2
534
535
  omlish/manifests/loading.py,sha256=s6KnhdFQCsI2i0Rus1sMU0so2v8dUBnk59BJkSnxGt8,17514
535
536
  omlish/manifests/static.py,sha256=9BaPBLkuzxHmg5A-5k9BjjBFINCdmFOIu06dMFgCfz4,497
536
537
  omlish/manifests/types.py,sha256=NeOGuIVrcbqjCDbQ3MnCxxHAgHnw0CkWJsBzo230PWE,453
537
- omlish/marshal/__init__.py,sha256=_QPYoxtmqfd2szwSuPtbIU8RwTIh_5gTJm--yvVWMcY,5969
538
+ omlish/marshal/__init__.py,sha256=Ov1AECji4Z-lkSObFVeccMM3SvH2APBarybTQov03lA,6057
538
539
  omlish/marshal/globals.py,sha256=Q6G18hcUwUDDNnpyRPnR5Tn_XZpZCSIEXo09nYSOaNU,2236
539
540
  omlish/marshal/naming.py,sha256=Mk5YrbES836_KflNNRoc5Ajd96iMYLQIMERKx1KpT4g,865
540
541
  omlish/marshal/standard.py,sha256=6L4FK7QVgVFAf2jkTQlCvN-15DWK49VCNlNwCBea3-8,6674
@@ -603,7 +604,7 @@ omlish/multiprocessing/__init__.py,sha256=jwlWGOaSGcX8DkzyZwJ49nfkHocWWeKgKb7kMp
603
604
  omlish/multiprocessing/proxies.py,sha256=Jdl__dmerJwMhFw6FzcaEfFXTpZuB2cdAXwVjAv7rqc,489
604
605
  omlish/multiprocessing/spawn.py,sha256=3KkaZ5wBiJzw0qsC-pKsECqIGTFG2fSgzAjV12dT8Es,1883
605
606
  omlish/os/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
606
- omlish/os/atomics.py,sha256=sw-DCHh_l-Rw3KAJN8uU7Ktct_k2HdKDmmabfhulAJw,5291
607
+ omlish/os/atomics.py,sha256=1mFgOD_NpKo4HfVNYo74D-KsxnLKkT8Mx-3M40OYGBc,5307
607
608
  omlish/os/deathsig.py,sha256=k4Sa9nXQvn43k5DTPDzpX9q_Nfc2045dMEGh__rn__s,646
608
609
  omlish/os/environ.py,sha256=fDjnSO2Qz6lpvICx54JZpdPF-BxL4zKAWU3x_6UTxCI,3681
609
610
  omlish/os/fcntl.py,sha256=EUa4TkeqdKix-uIweRitIZsgT9ohY7OQ5QiIhUW9S0c,1512
@@ -629,9 +630,9 @@ omlish/os/pidfiles/pidfile.py,sha256=KlqrW7I-lYVDNJspFHE89i_A0HTTteT5B99b7vpTfNs
629
630
  omlish/os/pidfiles/pinning.py,sha256=WGK0kmMBhH1isGSdpm9fKJQqjaL7kxCuT-aAaaYCyn4,6666
630
631
  omlish/reflect/__init__.py,sha256=omD3VLFQtYTwPxrTH6gLATQIax9sTGGKc-7ps96-q0g,1202
631
632
  omlish/reflect/inspect.py,sha256=dUrVz8VfAdLVFtFpW416DxzVC17D80cvFb_g2Odzgq8,1823
632
- omlish/reflect/ops.py,sha256=F77OTaw0Uw020cJCWX_Q4kL3wvxlJ8jV8wz7BctGL_k,2619
633
+ omlish/reflect/ops.py,sha256=4mGvFMw5D6XGbhDhdCqZ1dZsiqezUTenDv63FIDohpY,3029
633
634
  omlish/reflect/subst.py,sha256=_lfNS2m2UiJgqARQtmGLTGo7CrSm9OMvVzt6GWOEX6M,4590
634
- omlish/reflect/types.py,sha256=IqqcM9vsIsEzEMZKwuoSKDfTuAXIxIo96sJ-PHLQ2r4,15800
635
+ omlish/reflect/types.py,sha256=CalJ1gvu4eTsgL6Z4xM06pVamjRmJL8IgjPpZlI8l8U,16098
635
636
  omlish/secrets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
636
637
  omlish/secrets/all.py,sha256=qBxUFIqxCExADL71taNH_W6FYT9QvOrdcaMeUUPO3aw,298
637
638
  omlish/secrets/crypto.py,sha256=q0Hca5oMwvh39r0hrupN_ewxhlllbdDgAgVoloYFmDg,3714
@@ -644,7 +645,7 @@ omlish/secrets/ssl.py,sha256=HnH5MS31X9Uid7Iw1CWqviaVwMLF1Ha8RxZiiE-_iF8,158
644
645
  omlish/secrets/subprocesses.py,sha256=ZdShw4jrGDdyQW8mRMgl106-9qpCEq2J6w_x7ruz1wk,1217
645
646
  omlish/secrets/tempssl.py,sha256=KbNKGwiKw95Ly2b1OtNL2jhPa25aO0t_tvyNB5trUcU,1885
646
647
  omlish/sockets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
647
- omlish/sockets/addresses.py,sha256=yrS9NXPFiT_qBZ4C747PswzbdE2bwt83lZVOZYjYwA0,1875
648
+ omlish/sockets/addresses.py,sha256=FX-ym7MsolxJyX0UPgL_73ANiGgUMYBuUTpXWIPLoAU,1891
648
649
  omlish/sockets/bind.py,sha256=yJWZOC8ZRkD5_DTPO0JVixf5_wuzuh8w3-I7wBxUzEU,8047
649
650
  omlish/sockets/handlers.py,sha256=RRhv4zJ0vBFO70DWZUQffYNB8ZvS0cNUC9y7YFUZhTE,498
650
651
  omlish/sockets/io.py,sha256=YdrtrpqXAUJgQRqeAdTxH3m06DE5xRt08tqdRaRn5bY,1414
@@ -734,7 +735,7 @@ omlish/sql/queries/inserts.py,sha256=pSQXDSR1oDUmxjeIYuSbxpAZXvYQ-EJF6a62ON5Un-k
734
735
  omlish/sql/queries/multi.py,sha256=7x6x-4jnPzxA6ZasBjnjFuhHFpWt5rGCua3UvuTMIJ0,837
735
736
  omlish/sql/queries/names.py,sha256=25kPRYse_ivI17lMD9st04k7QQMOGf5plb4b8yZFpUI,2208
736
737
  omlish/sql/queries/ops.py,sha256=pDZ_2Jo_Fa8DDbtYkc6-9eehkWsZPI-jh-KFlubcY6Y,134
737
- omlish/sql/queries/params.py,sha256=_4Cg2MWfcU0EGcVkyOfbyJ5MA4PDUexNlaGEiqmt8Ls,1268
738
+ omlish/sql/queries/params.py,sha256=ocjaJbhv_5LWgxdjoZg8vyAWDZxsij4cKH8Lx4hXMT0,1261
738
739
  omlish/sql/queries/relations.py,sha256=P0qBqNICyeig9sEZAYLZcTXcI1YFiBe6REm6jNhpHUI,2630
739
740
  omlish/sql/queries/rendering.py,sha256=3Ocw52DDDsUavEmb8xH-2Mhp-3pZCXsJVXFuVTOUBqk,7779
740
741
  omlish/sql/queries/selects.py,sha256=XNisb2draHURYhbZsTFw7DJQaN1Zfo2Znm-Ty0lHNTo,1773
@@ -897,9 +898,9 @@ omlish/typedvalues/marshal.py,sha256=AtBz7Jq-BfW8vwM7HSxSpR85JAXmxK2T0xDblmm1HI0
897
898
  omlish/typedvalues/of_.py,sha256=UXkxSj504WI2UrFlqdZJbu2hyDwBhL7XVrc2qdR02GQ,1309
898
899
  omlish/typedvalues/reflect.py,sha256=PAvKW6T4cW7u--iX80w3HWwZUS3SmIZ2_lQjT65uAyk,1026
899
900
  omlish/typedvalues/values.py,sha256=ym46I-q2QJ_6l4UlERqv3yj87R-kp8nCKMRph0xQ3UA,1307
900
- omlish-0.0.0.dev434.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
901
- omlish-0.0.0.dev434.dist-info/METADATA,sha256=fQJYAY6N-2PAgl3mzD4PjfFG_SymockqND184l4ForI,19005
902
- omlish-0.0.0.dev434.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
903
- omlish-0.0.0.dev434.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
904
- omlish-0.0.0.dev434.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
905
- omlish-0.0.0.dev434.dist-info/RECORD,,
901
+ omlish-0.0.0.dev435.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
902
+ omlish-0.0.0.dev435.dist-info/METADATA,sha256=MvlZuQmg8ZerAEHakqjyuqeNhwGBvxMrojbeWG5Ryr4,19005
903
+ omlish-0.0.0.dev435.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
904
+ omlish-0.0.0.dev435.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
905
+ omlish-0.0.0.dev435.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
906
+ omlish-0.0.0.dev435.dist-info/RECORD,,
@@ -1,22 +0,0 @@
1
- """
2
- TODO:
3
-
4
- Objects:
5
- - Object keys may be an ECMAScript 5.1 IdentifierName.
6
- - Objects may have a single trailing comma.
7
- Arrays:
8
- - Arrays may have a single trailing comma.
9
- Strings:
10
- - Strings may be single quoted.
11
- - Strings may span multiple lines by escaping new line characters.
12
- - Strings may include character escapes.
13
- Numbers:
14
- - Numbers may be hexadecimal.
15
- - Numbers may have a leading or trailing decimal point.
16
- - Numbers may be IEEE 754 positive infinity, negative infinity, and NaN.
17
- - Numbers may begin with an explicit plus sign.
18
- Comments:
19
- - Single and multi-line comments are allowed.
20
- White Space:
21
- - Additional white space characters are allowed.
22
- """