omlish 0.0.0.dev303__py3-none-any.whl → 0.0.0.dev304__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.dev303'
2
- __revision__ = '8c675f0f9a5c459eddf54867184cd1da05cff6ac'
1
+ __version__ = '0.0.0.dev304'
2
+ __revision__ = '0ecc67df99993947b491b2d6d6163fd00b00202e'
3
3
 
4
4
 
5
5
  #
omlish/lang/casing.py CHANGED
@@ -78,7 +78,7 @@ class LowCamelCase(StringCasing):
78
78
  """fooBarBaz"""
79
79
 
80
80
  _MATCH_PAT: ta.ClassVar[re.Pattern] = re.compile(r'[a-z][a-z0-9]*(?:[A-Z][a-z0-9]*)*')
81
- _SPLIT_PAT: ta.ClassVar[re.Pattern] = re.compile(r'^[a-z0-9]+')
81
+ _FIRST_PAT: ta.ClassVar[re.Pattern] = re.compile(r'^[a-z0-9]+')
82
82
  _UPPER_PAT: ta.ClassVar[re.Pattern] = re.compile(r'[A-Z][a-z0-9]*')
83
83
 
84
84
  def match(self, s: str) -> bool:
@@ -88,7 +88,7 @@ class LowCamelCase(StringCasing):
88
88
  if not self.match(s):
89
89
  raise ImproperStringCasingError(f'Not valid lowCamelCase: {s!r}')
90
90
  parts: list[str] = []
91
- m0 = self._SPLIT_PAT.match(s)
91
+ m0 = self._FIRST_PAT.match(s)
92
92
  if m0:
93
93
  parts.append(m0.group(0))
94
94
  start = m0.end()
@@ -44,6 +44,10 @@ from .keywords.unknown import ( # noqa
44
44
  )
45
45
 
46
46
  from .keywords.validation import ( # noqa
47
+ AdditionalProperties,
48
+ AnyOf,
49
+ Const,
50
+ Enum,
47
51
  ExclusiveMaximum,
48
52
  ExclusiveMinimum,
49
53
  Items,
@@ -51,6 +55,7 @@ from .keywords.validation import ( # noqa
51
55
  Maximum,
52
56
  MinItems,
53
57
  Minimum,
58
+ OneOf,
54
59
  Properties,
55
60
  Required,
56
61
  Type,
@@ -75,6 +75,16 @@ class Keywords(lang.Final):
75
75
  ##
76
76
 
77
77
 
78
+ @dc.dataclass(frozen=True)
79
+ class AnyKeyword(Keyword, lang.Abstract):
80
+ v: ta.Any
81
+
82
+
83
+ @dc.dataclass(frozen=True)
84
+ class AnyArrayKeyword(Keyword, lang.Abstract):
85
+ vs: ta.Sequence[ta.Any]
86
+
87
+
78
88
  @dc.dataclass(frozen=True)
79
89
  class BooleanKeyword(Keyword, lang.Abstract):
80
90
  b: bool
@@ -91,7 +101,7 @@ class StrKeyword(Keyword, lang.Abstract):
91
101
 
92
102
 
93
103
  @dc.dataclass(frozen=True)
94
- class StrOrStrsKeyword(Keyword, lang.Abstract):
104
+ class StrOrStrArrayKeyword(Keyword, lang.Abstract):
95
105
  ss: str | ta.Sequence[str]
96
106
 
97
107
 
@@ -100,6 +110,16 @@ class KeywordsKeyword(Keyword, lang.Abstract):
100
110
  kw: Keywords
101
111
 
102
112
 
113
+ @dc.dataclass(frozen=True)
114
+ class KeywordsArrayKeyword(Keyword, lang.Abstract):
115
+ kws: ta.Sequence[Keywords]
116
+
117
+
103
118
  @dc.dataclass(frozen=True)
104
119
  class StrToKeywordsKeyword(Keyword, lang.Abstract):
105
120
  m: ta.Mapping[str, Keywords]
121
+
122
+
123
+ @dc.dataclass(frozen=True)
124
+ class BooleanOrKeywordsKeyword(Keyword, lang.Abstract):
125
+ bk: bool | Keywords
@@ -3,14 +3,18 @@ import typing as ta
3
3
  from .... import check
4
4
  from .... import collections as col
5
5
  from .... import lang
6
+ from .base import AnyArrayKeyword
7
+ from .base import AnyKeyword
6
8
  from .base import BooleanKeyword
9
+ from .base import BooleanOrKeywordsKeyword
7
10
  from .base import Keyword
8
11
  from .base import Keywords
12
+ from .base import KeywordsArrayKeyword
9
13
  from .base import KeywordsKeyword
10
14
  from .base import KnownKeyword
11
15
  from .base import NumberKeyword
12
16
  from .base import StrKeyword
13
- from .base import StrOrStrsKeyword
17
+ from .base import StrOrStrArrayKeyword
14
18
  from .base import StrToKeywordsKeyword
15
19
  from .core import CoreKeyword
16
20
  from .format import FormatKeyword
@@ -69,16 +73,28 @@ class KeywordParser:
69
73
  self._allow_unknown = allow_unknown
70
74
 
71
75
  def parse_keyword(self, cls: type[KeywordT], v: ta.Any) -> KeywordT:
72
- if issubclass(cls, BooleanKeyword):
76
+ if issubclass(cls, AnyKeyword):
77
+ return cls(v) # type: ignore
78
+
79
+ elif issubclass(cls, AnyArrayKeyword):
80
+ return cls(tuple(check.isinstance(v, ta.Sequence))) # type: ignore
81
+
82
+ elif issubclass(cls, BooleanKeyword):
73
83
  return cls(check.isinstance(v, bool)) # type: ignore
74
84
 
85
+ elif issubclass(cls, BooleanOrKeywordsKeyword):
86
+ if isinstance(v, bool):
87
+ return cls(v) # type: ignore
88
+ else:
89
+ return cls(self.parse_keywords(v)) # type: ignore
90
+
75
91
  elif issubclass(cls, NumberKeyword):
76
92
  return cls(check.isinstance(v, (int, float))) # type: ignore
77
93
 
78
94
  elif issubclass(cls, StrKeyword):
79
95
  return cls(check.isinstance(v, str)) # type: ignore
80
96
 
81
- elif issubclass(cls, StrOrStrsKeyword):
97
+ elif issubclass(cls, StrOrStrArrayKeyword):
82
98
  ss: str | ta.Sequence[str]
83
99
  if isinstance(v, str):
84
100
  ss = v
@@ -91,6 +107,9 @@ class KeywordParser:
91
107
  elif issubclass(cls, KeywordsKeyword):
92
108
  return cls(self.parse_keywords(v)) # type: ignore
93
109
 
110
+ elif issubclass(cls, KeywordsArrayKeyword):
111
+ return cls(tuple(self.parse_keywords(e) for e in v)) # type: ignore
112
+
94
113
  elif issubclass(cls, StrToKeywordsKeyword):
95
114
  return cls({k: self.parse_keywords(mv) for k, mv in v.items()}) # type: ignore
96
115
 
@@ -1,12 +1,16 @@
1
1
  import typing as ta
2
2
 
3
+ from .base import AnyArrayKeyword
4
+ from .base import AnyKeyword
3
5
  from .base import BooleanKeyword
6
+ from .base import BooleanOrKeywordsKeyword
4
7
  from .base import Keyword
5
8
  from .base import Keywords
9
+ from .base import KeywordsArrayKeyword
6
10
  from .base import KeywordsKeyword
7
11
  from .base import NumberKeyword
8
12
  from .base import StrKeyword
9
- from .base import StrOrStrsKeyword
13
+ from .base import StrOrStrArrayKeyword
10
14
  from .base import StrToKeywordsKeyword
11
15
  from .unknown import UnknownKeyword
12
16
 
@@ -15,16 +19,28 @@ from .unknown import UnknownKeyword
15
19
 
16
20
 
17
21
  def render_keyword(kw: Keyword) -> dict[str, ta.Any]:
18
- if isinstance(kw, BooleanKeyword):
22
+ if isinstance(kw, AnyKeyword):
23
+ return {kw.tag: kw.v}
24
+
25
+ elif isinstance(kw, AnyArrayKeyword):
26
+ return {kw.tag: kw.vs}
27
+
28
+ elif isinstance(kw, BooleanKeyword):
19
29
  return {kw.tag: kw.b}
20
30
 
31
+ elif isinstance(kw, BooleanOrKeywordsKeyword):
32
+ if isinstance(kw.bk, bool):
33
+ return {kw.tag: kw.bk}
34
+ else:
35
+ return {kw.tag: render_keywords(kw.bk)}
36
+
21
37
  elif isinstance(kw, NumberKeyword):
22
38
  return {kw.tag: kw.n}
23
39
 
24
40
  elif isinstance(kw, StrKeyword):
25
41
  return {kw.tag: kw.s}
26
42
 
27
- elif isinstance(kw, StrOrStrsKeyword):
43
+ elif isinstance(kw, StrOrStrArrayKeyword):
28
44
  if isinstance(kw.ss, str):
29
45
  return {kw.tag: kw.ss}
30
46
  else:
@@ -33,6 +49,9 @@ def render_keyword(kw: Keyword) -> dict[str, ta.Any]:
33
49
  elif isinstance(kw, KeywordsKeyword):
34
50
  return {kw.tag: render_keywords(kw.kw)}
35
51
 
52
+ elif isinstance(kw, KeywordsArrayKeyword):
53
+ return {kw.tag: [render_keywords(c) for c in kw.kws]}
54
+
36
55
  elif isinstance(kw, StrToKeywordsKeyword):
37
56
  return {kw.tag: {k: render_keywords(v) for k, v in kw.m.items()}}
38
57
 
@@ -1,9 +1,13 @@
1
1
  from .... import lang
2
+ from .base import AnyArrayKeyword
3
+ from .base import AnyKeyword
2
4
  from .base import BooleanKeyword
5
+ from .base import BooleanOrKeywordsKeyword
6
+ from .base import KeywordsArrayKeyword
3
7
  from .base import KeywordsKeyword
4
8
  from .base import KnownKeyword
5
9
  from .base import NumberKeyword
6
- from .base import StrOrStrsKeyword
10
+ from .base import StrOrStrArrayKeyword
7
11
  from .base import StrToKeywordsKeyword
8
12
 
9
13
 
@@ -17,7 +21,15 @@ class ValidationKeyword(KnownKeyword, lang.Abstract, lang.Sealed):
17
21
  ##
18
22
 
19
23
 
20
- class Type(StrOrStrsKeyword, ValidationKeyword, lang.Final, tag='type'):
24
+ class Type(StrOrStrArrayKeyword, ValidationKeyword, lang.Final, tag='type'):
25
+ pass
26
+
27
+
28
+ class Const(AnyKeyword, ValidationKeyword, lang.Final, tag='const'):
29
+ pass
30
+
31
+
32
+ class Enum(AnyArrayKeyword, ValidationKeyword, lang.Final, tag='enum'):
21
33
  pass
22
34
 
23
35
 
@@ -25,7 +37,7 @@ class Items(KeywordsKeyword, ValidationKeyword, lang.Final, tag='items'):
25
37
  pass
26
38
 
27
39
 
28
- class Required(StrOrStrsKeyword, ValidationKeyword, lang.Final, tag='required'):
40
+ class Required(StrOrStrArrayKeyword, ValidationKeyword, lang.Final, tag='required'):
29
41
  pass
30
42
 
31
43
 
@@ -33,6 +45,10 @@ class Properties(StrToKeywordsKeyword, ValidationKeyword, lang.Final, tag='prope
33
45
  pass
34
46
 
35
47
 
48
+ class AdditionalProperties(BooleanOrKeywordsKeyword, ValidationKeyword, lang.Final, tag='additionalProperties'):
49
+ pass
50
+
51
+
36
52
  ##
37
53
 
38
54
 
@@ -65,3 +81,14 @@ class Minimum(NumberKeyword, ValidationKeyword, lang.Final, tag='minimum'):
65
81
 
66
82
  class ExclusiveMinimum(NumberKeyword, ValidationKeyword, lang.Final, tag='exclusiveMinimum'):
67
83
  pass
84
+
85
+
86
+ #
87
+
88
+
89
+ class AnyOf(KeywordsArrayKeyword, ValidationKeyword, lang.Final, tag='anyOf'):
90
+ pass
91
+
92
+
93
+ class OneOf(KeywordsArrayKeyword, ValidationKeyword, lang.Final, tag='oneOf'):
94
+ pass
@@ -0,0 +1,21 @@
1
+ Copyright (c) 2022 JSON Schema Specification Authors
2
+
3
+ Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
4
+ following conditions are met:
5
+
6
+ 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following
7
+ disclaimer.
8
+
9
+ 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
10
+ disclaimer in the documentation and/or other materials provided with the distribution.
11
+
12
+ 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products
13
+ derived from this software without specific prior written permission.
14
+
15
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
16
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
18
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
19
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
20
+ WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
21
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omlish
3
- Version: 0.0.0.dev303
3
+ Version: 0.0.0.dev304
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -1,5 +1,5 @@
1
1
  omlish/.manifests.json,sha256=pjGUyLHaoWpPqRP3jz2u1fC1qoRc2lvrEcpU_Ax2tdg,8253
2
- omlish/__about__.py,sha256=ZtA9R7gsXvmQ5vqquGdnyiA7g3hwkTA_jGG19gRDrkI,3478
2
+ omlish/__about__.py,sha256=F6X4fib8qJRwj4c8ttKlheoGULweTMxejclgu8k0w64,3478
3
3
  omlish/__init__.py,sha256=SsyiITTuK0v74XpKV8dqNaCmjOlan1JZKrHQv5rWKPA,253
4
4
  omlish/c3.py,sha256=rer-TPOFDU6fYq_AWio_AmA-ckZ8JDY5shIzQ_yXfzA,8414
5
5
  omlish/cached.py,sha256=MLap_p0rdGoDIMVhXVHm1tsbcWobJF0OanoodV03Ju8,542
@@ -466,7 +466,7 @@ omlish/iterators/tools.py,sha256=c4hArZEVV8y9_dFfmRwakusv1cWJLT4MkTkGRjnGN5U,255
466
466
  omlish/iterators/unique.py,sha256=Nw0pSaNEcHAkve0ugfLPvJcirDOn9ECyC5wIL8JlJKI,1395
467
467
  omlish/lang/__init__.py,sha256=1m2Kc4CBk_C_B7ydPcGWTdCY00JRMrGtX_RlFvyVTo8,5729
468
468
  omlish/lang/attrs.py,sha256=i7euRF81uNF8QDmUVXSK_BtqLGshaMi4VVdUnMjiMwg,5050
469
- omlish/lang/casing.py,sha256=hMnWMBv-yP4tr8Rc9_An9IgcAsbtVcEb2D_7n8TaFgw,4636
469
+ omlish/lang/casing.py,sha256=cFUlbDdXLhwnWwcYx4qnM5c4zGX7hIRUfcjiZbxUD28,4636
470
470
  omlish/lang/clsdct.py,sha256=HAGIvBSbCefzRjXriwYSBLO7QHKRv2UsE78jixOb-fA,1828
471
471
  omlish/lang/collections.py,sha256=LVm0Sory60IXyFzYhhO8BZAWy_z_pjiA-meXNlSJP7o,2465
472
472
  omlish/lang/comparison.py,sha256=MOwEG0Yny-jBPHO9kQto9FSRyeNpQW24UABsghkrHxY,1356
@@ -685,17 +685,18 @@ omlish/specs/jsonrpc/__init__.py,sha256=QQwr-jkgvwr1ZMlNwl5W1TuHcxx8RuzQVFwWwNhp
685
685
  omlish/specs/jsonrpc/errors.py,sha256=-Zgmlo6bV6J8w5f8h9axQgLquIFBHDgIwcpufEH5NsE,707
686
686
  omlish/specs/jsonrpc/marshal.py,sha256=HM736piPGnBZrg8CMLDX-L5fZpegyF6l6JUjzLoSDtk,1852
687
687
  omlish/specs/jsonrpc/types.py,sha256=emEiTPWsjsYy0jCC3It1bUEcu9nHp5y7-j73U1D6vl4,2700
688
- omlish/specs/jsonschema/__init__.py,sha256=qmlpJJlB9TBwvE2qCjRHeecNhEYonpbncXfX0T2L-do,1060
688
+ omlish/specs/jsonschema/__init__.py,sha256=55P7Yg2MprqDyaifac2ExNzK6blTZuDP4ejrUXZWpt8,1129
689
689
  omlish/specs/jsonschema/types.py,sha256=_H7ma99hD3_Xu42BFGHOXRI5p79tY8WBX8QE36k7lbw,472
690
690
  omlish/specs/jsonschema/keywords/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
691
- omlish/specs/jsonschema/keywords/base.py,sha256=jbLzU5_MeLcVrsbPlF2HPt0X0MldyOQmofZxelNTwP4,2416
691
+ omlish/specs/jsonschema/keywords/base.py,sha256=KYxKDxZtJGykLcJPTPvDMPDbbmuUw6RLOGgpCNkFcww,2830
692
692
  omlish/specs/jsonschema/keywords/core.py,sha256=3Pbi8d-eocEAxEdemNa0ldp5lrLWNmH0Tye-5rglUoU,535
693
693
  omlish/specs/jsonschema/keywords/format.py,sha256=9trrxHe38FDx47I8UfvO4PD_IygRlkEyTUJ3XlxDM6Y,244
694
694
  omlish/specs/jsonschema/keywords/metadata.py,sha256=IVWQKWT9xi0R07pXc79ErT7RBu5b6Kzg4pWYIITIRbs,336
695
- omlish/specs/jsonschema/keywords/parse.py,sha256=zWSOhHHzXbj-Yn5owU_w0V5w8yhiW4qqc4c7lMvavk0,3690
696
- omlish/specs/jsonschema/keywords/render.py,sha256=kHlBwNjSvKtca0IXBP5DWDRW-H6MduO6PZjhkBFRImU,1353
695
+ omlish/specs/jsonschema/keywords/parse.py,sha256=8lx17ZoaMF0u0NyAIVM9EmZD6gYLANlw0-zr9DN2HTA,4414
696
+ omlish/specs/jsonschema/keywords/render.py,sha256=wZ9yvfscnW8fYlQTXzmJjMYTKhSTg9hjrtlAEwMRaMQ,1947
697
697
  omlish/specs/jsonschema/keywords/unknown.py,sha256=iYIQlBbLUqISvTvj_Kup4wVDRxcEwmnLTyAAWjlxsck,234
698
- omlish/specs/jsonschema/keywords/validation.py,sha256=RJdGAsl_FtUmw1Bin_mrJ5qhN06rBC3f_L-rCBYdIOc,1342
698
+ omlish/specs/jsonschema/keywords/validation.py,sha256=bKu1bDOms5zxg5Xme1ki_jb7TYDFEOv_JKOzeYbxuYQ,1970
699
+ omlish/specs/jsonschema/schemas/LICENSE,sha256=CU2AUO-rKNc9s9vngzyGxUMgaZ0Aevr8lgN2DFFFxKw,1491
699
700
  omlish/specs/jsonschema/schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
700
701
  omlish/specs/jsonschema/schemas/draft202012/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
701
702
  omlish/specs/jsonschema/schemas/draft202012/metaschema.json,sha256=Qdp29a-3zgYtJI92JGOpL3ykfk4PkFsiS6av7vkd7Q8,2452
@@ -844,9 +845,9 @@ omlish/typedvalues/holder.py,sha256=ZTnHiw-K38ciOBLEdwgrltr7Xp8jjEs_0Lp69DH-G-o,
844
845
  omlish/typedvalues/marshal.py,sha256=hWHRLcrGav7lvXJDtb9bNI0ickl4SKPQ6F4BbTpqw3A,4219
845
846
  omlish/typedvalues/reflect.py,sha256=Ih1YgU-srUjsvBn_P7C66f73_VCvcwqE3ffeBnZBgt4,674
846
847
  omlish/typedvalues/values.py,sha256=ym46I-q2QJ_6l4UlERqv3yj87R-kp8nCKMRph0xQ3UA,1307
847
- omlish-0.0.0.dev303.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
848
- omlish-0.0.0.dev303.dist-info/METADATA,sha256=Oe8ylkuWV_TTJtgQkuyG97boKvpRe_Z0O8At2xQ97SU,4416
849
- omlish-0.0.0.dev303.dist-info/WHEEL,sha256=ck4Vq1_RXyvS4Jt6SI0Vz6fyVs4GWg7AINwpsaGEgPE,91
850
- omlish-0.0.0.dev303.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
851
- omlish-0.0.0.dev303.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
852
- omlish-0.0.0.dev303.dist-info/RECORD,,
848
+ omlish-0.0.0.dev304.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
849
+ omlish-0.0.0.dev304.dist-info/METADATA,sha256=pBvxWE8MwSuga9H9NPi6L6YuxZ-EuSu4jYXGAn36N0Q,4416
850
+ omlish-0.0.0.dev304.dist-info/WHEEL,sha256=wXxTzcEDnjrTwFYjLPcsW_7_XihufBwmpiBeiXNBGEA,91
851
+ omlish-0.0.0.dev304.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
852
+ omlish-0.0.0.dev304.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
853
+ omlish-0.0.0.dev304.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.0.0)
2
+ Generator: setuptools (80.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5