ssc_codegen 0.22.0__tar.gz → 0.24.0__tar.gz
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.
- {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/PKG-INFO +4 -7
- {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/README.md +3 -3
- {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/pyproject.toml +8 -14
- ssc_codegen-0.24.0/ssc_codegen/__init__.py +1 -0
- {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/ast/__init__.py +1 -0
- {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/ast/base.py +1 -1
- {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/ast/jsondef.py +1 -1
- {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/ast/struct.py +4 -1
- {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/ast/typedef.py +1 -1
- {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/converters/base.py +2 -2
- {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/converters/js_pure.py +347 -490
- {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/converters/py_bs4.py +398 -514
- {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/converters/py_helpers.py +223 -66
- {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/converters/py_lxml.py +132 -190
- {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/converters/py_parsel.py +97 -134
- ssc_codegen-0.24.0/ssc_codegen/converters/py_render.py +231 -0
- {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/converters/py_slax.py +99 -136
- ssc_codegen-0.22.0/ssc_codegen/parsers/spec.py → ssc_codegen-0.24.0/ssc_codegen/converters/request_spec.py +296 -513
- ssc_codegen-0.24.0/ssc_codegen/core/__init__.py +10 -0
- ssc_codegen-0.24.0/ssc_codegen/core/adapter.py +25 -0
- ssc_codegen-0.24.0/ssc_codegen/core/contexts.py +235 -0
- ssc_codegen-0.24.0/ssc_codegen/core/expressions.py +1038 -0
- ssc_codegen-0.24.0/ssc_codegen/core/format.py +361 -0
- ssc_codegen-0.24.0/ssc_codegen/core/linting.py +1121 -0
- ssc_codegen-0.24.0/ssc_codegen/core/module_handler.py +290 -0
- ssc_codegen-0.24.0/ssc_codegen/core/predicates.py +610 -0
- ssc_codegen-0.24.0/ssc_codegen/core/reader.py +133 -0
- ssc_codegen-0.24.0/ssc_codegen/core/struct_parser.py +278 -0
- ssc_codegen-0.24.0/ssc_codegen/core/type_checking.py +401 -0
- {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/document_utils.py +13 -6
- {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/kdl/__init__.py +23 -0
- ssc_codegen-0.24.0/ssc_codegen/kdl/dict_reader.py +56 -0
- {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/kdl/parser.py +9 -7
- ssc_codegen-0.24.0/ssc_codegen/kdl/reader.py +419 -0
- {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/main.py +95 -280
- ssc_codegen-0.24.0/ssc_codegen/parsers/__init__.py +7 -0
- {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/parsers/curl.py +11 -11
- {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/parsers/http.py +15 -13
- ssc_codegen-0.22.0/ssc_codegen/__init__.py +0 -27
- ssc_codegen-0.22.0/ssc_codegen/converters/go_goquery.py +0 -1885
- ssc_codegen-0.22.0/ssc_codegen/linter/__init__.py +0 -26
- ssc_codegen-0.22.0/ssc_codegen/linter/_kdl_lang.py +0 -435
- ssc_codegen-0.22.0/ssc_codegen/linter/base.py +0 -822
- ssc_codegen-0.22.0/ssc_codegen/linter/errors.py +0 -78
- ssc_codegen-0.22.0/ssc_codegen/linter/format_errors.py +0 -285
- ssc_codegen-0.22.0/ssc_codegen/linter/metadata.py +0 -18
- ssc_codegen-0.22.0/ssc_codegen/linter/navigation.py +0 -262
- ssc_codegen-0.22.0/ssc_codegen/linter/path.py +0 -36
- ssc_codegen-0.22.0/ssc_codegen/linter/rule_keywords.py +0 -321
- ssc_codegen-0.22.0/ssc_codegen/linter/rules.py +0 -848
- ssc_codegen-0.22.0/ssc_codegen/linter/rules_struct.py +0 -972
- ssc_codegen-0.22.0/ssc_codegen/linter/type_rules.py +0 -523
- ssc_codegen-0.22.0/ssc_codegen/linter/types.py +0 -188
- ssc_codegen-0.22.0/ssc_codegen/openapi/__init__.py +0 -87
- ssc_codegen-0.22.0/ssc_codegen/openapi/converter.py +0 -684
- ssc_codegen-0.22.0/ssc_codegen/openapi/emitter.py +0 -128
- ssc_codegen-0.22.0/ssc_codegen/openapi/parser.py +0 -143
- ssc_codegen-0.22.0/ssc_codegen/parser.py +0 -2467
- ssc_codegen-0.22.0/ssc_codegen/parsers/__init__.py +0 -27
- ssc_codegen-0.22.0/ssc_codegen/repl.py +0 -778
- {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/.gitignore +0 -0
- {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/LICENSE +0 -0
- {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/_logging.py +0 -0
- {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/ast/array.py +0 -0
- {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/ast/cast.py +0 -0
- {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/ast/control.py +0 -0
- {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/ast/extract.py +0 -0
- {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/ast/helpers.py +0 -0
- {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/ast/module.py +0 -0
- {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/ast/predicate_containers.py +0 -0
- {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/ast/predicate_ops.py +0 -0
- {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/ast/regex.py +0 -0
- {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/ast/selectors.py +0 -0
- {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/ast/string.py +0 -0
- {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/ast/transform.py +0 -0
- {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/ast/types.py +0 -0
- {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/converters/helpers.py +0 -0
- {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/exceptions.py +0 -0
- {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/health.py +0 -0
- {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/pseudo_selectors.py +0 -0
- {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/regex_utils.py +0 -0
- {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/selector_utils.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ssc_codegen
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.24.0
|
|
4
4
|
Summary: Python-dsl code converter to html parser for web scraping
|
|
5
5
|
Project-URL: Documentation, https://github.com/vypivshiy/selector_schema_codegen#readme
|
|
6
6
|
Project-URL: Issues, https://github.com/vypivshiy/selector_schema_codegen/issues
|
|
@@ -28,9 +28,6 @@ Requires-Dist: pyyaml>=6.0
|
|
|
28
28
|
Requires-Dist: soupsieve>=2.6
|
|
29
29
|
Requires-Dist: typer>=0.15.1
|
|
30
30
|
Requires-Dist: typing-extensions; python_version < '3.11'
|
|
31
|
-
Provides-Extra: repl
|
|
32
|
-
Requires-Dist: httpx>=0.28.1; extra == 'repl'
|
|
33
|
-
Requires-Dist: ipython>=8.39.0; extra == 'repl'
|
|
34
31
|
Description-Content-Type: text/markdown
|
|
35
32
|
|
|
36
33
|
# ssc-codegen
|
|
@@ -86,11 +83,11 @@ ssc-gen generate schema.kdl -t py-bs4 -o ./output
|
|
|
86
83
|
# all .kdl files in a directory
|
|
87
84
|
ssc-gen generate examples/ -t js-pure -o ./output
|
|
88
85
|
|
|
89
|
-
# with custom package name
|
|
90
|
-
ssc-gen generate schema.kdl -t
|
|
86
|
+
# with custom package name
|
|
87
|
+
ssc-gen generate schema.kdl -t py-bs4 -o ./parsers --package scraper
|
|
91
88
|
```
|
|
92
89
|
|
|
93
|
-
Targets: `py-bs4`, `py-lxml`, `py-parsel`, `py-slax`, `js-pure
|
|
90
|
+
Targets: `py-bs4`, `py-lxml`, `py-parsel`, `py-slax`, `js-pure`
|
|
94
91
|
|
|
95
92
|
### Lint schemas
|
|
96
93
|
|
|
@@ -51,11 +51,11 @@ ssc-gen generate schema.kdl -t py-bs4 -o ./output
|
|
|
51
51
|
# all .kdl files in a directory
|
|
52
52
|
ssc-gen generate examples/ -t js-pure -o ./output
|
|
53
53
|
|
|
54
|
-
# with custom package name
|
|
55
|
-
ssc-gen generate schema.kdl -t
|
|
54
|
+
# with custom package name
|
|
55
|
+
ssc-gen generate schema.kdl -t py-bs4 -o ./parsers --package scraper
|
|
56
56
|
```
|
|
57
57
|
|
|
58
|
-
Targets: `py-bs4`, `py-lxml`, `py-parsel`, `py-slax`, `js-pure
|
|
58
|
+
Targets: `py-bs4`, `py-lxml`, `py-parsel`, `py-slax`, `js-pure`
|
|
59
59
|
|
|
60
60
|
### Lint schemas
|
|
61
61
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "ssc_codegen"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.24.0"
|
|
4
4
|
description = "Python-dsl code converter to html parser for web scraping "
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.10"
|
|
@@ -42,12 +42,6 @@ Examples = "https://github.com/vypivshiy/selector_schema_codegen/examples"
|
|
|
42
42
|
[project.scripts]
|
|
43
43
|
ssc-gen = 'ssc_codegen.main:main'
|
|
44
44
|
|
|
45
|
-
[project.optional-dependencies]
|
|
46
|
-
repl = [
|
|
47
|
-
"httpx>=0.28.1",
|
|
48
|
-
"ipython>=8.39.0",
|
|
49
|
-
]
|
|
50
|
-
|
|
51
45
|
[build-system]
|
|
52
46
|
requires = ["hatchling"]
|
|
53
47
|
build-backend = "hatchling.build"
|
|
@@ -81,21 +75,21 @@ exclude = ["__init__.py"]
|
|
|
81
75
|
|
|
82
76
|
[tool.mypy]
|
|
83
77
|
python_version = "3.10"
|
|
84
|
-
pretty = true
|
|
85
|
-
ignore_missing_imports = true
|
|
86
|
-
disallow_untyped_defs = true
|
|
87
78
|
show_error_codes = true
|
|
88
|
-
no_implicit_optional = true
|
|
89
|
-
mypy_path = 'ssc_codegen'
|
|
90
79
|
exclude = [
|
|
91
|
-
"
|
|
92
|
-
|
|
80
|
+
"ssc_codegen/ast" # ignore built-in ast and project ast
|
|
81
|
+
|
|
93
82
|
]
|
|
94
83
|
[[tool.mypy.overrides]]
|
|
95
84
|
module="tests.*"
|
|
96
85
|
disallow_untyped_defs = false
|
|
97
86
|
|
|
98
87
|
|
|
88
|
+
[[tool.mypy.overrides]]
|
|
89
|
+
module = ["colorama", "lxml", "lxml.*"]
|
|
90
|
+
ignore_missing_imports = true
|
|
91
|
+
|
|
92
|
+
|
|
99
93
|
[tool.coverage.report]
|
|
100
94
|
exclude_also = [
|
|
101
95
|
'def __repr__',
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from ssc_codegen.core.reader import parse_module
|
|
@@ -10,7 +10,7 @@ class JsonDefField(Node):
|
|
|
10
10
|
Single field in a JSON mapping definition.
|
|
11
11
|
|
|
12
12
|
type_name — primitive ("str", "int", "float", "bool") or ref name.
|
|
13
|
-
is_optional — True when field declared with ? suffix
|
|
13
|
+
is_optional — True when field declared with ? suffix.
|
|
14
14
|
is_array — True when field declared with (array) prefix.
|
|
15
15
|
ref_name — set when type_name references another JsonDef.
|
|
16
16
|
alias — original JSON key when it differs from name.
|
|
@@ -291,10 +291,12 @@ class RequestConfig(Node):
|
|
|
291
291
|
class ErrorResponse(Node):
|
|
292
292
|
"""
|
|
293
293
|
Error response mapping for type=rest struct.
|
|
294
|
-
DSL: @error <status> <SchemaName> [field=value ...]
|
|
294
|
+
DSL: @error <status> <SchemaName> [keys...] [field=value ...]
|
|
295
295
|
|
|
296
296
|
status: HTTP status code [100..599].
|
|
297
297
|
schema_name: json schema reference for deserialised error body.
|
|
298
|
+
required_keys: key names that must exist in the JSON body (positional args).
|
|
299
|
+
Error triggers on matching status + all keys present.
|
|
298
300
|
conditions: field=value pairs checked against the parsed JSON body.
|
|
299
301
|
Keys are dot-paths (e.g. "response.success", "data.0.type").
|
|
300
302
|
When non-empty, the error triggers on matching status + all conditions.
|
|
@@ -302,6 +304,7 @@ class ErrorResponse(Node):
|
|
|
302
304
|
|
|
303
305
|
status: int = 0
|
|
304
306
|
schema_name: str = ""
|
|
307
|
+
required_keys: list[str] = field(default_factory=list)
|
|
305
308
|
conditions: dict[str, Any] = field(default_factory=dict)
|
|
306
309
|
|
|
307
310
|
|
|
@@ -102,8 +102,8 @@ class BaseConverter:
|
|
|
102
102
|
self._pre_callbacks[node_type] = fn
|
|
103
103
|
if post_callback:
|
|
104
104
|
if isinstance(post_callback, str):
|
|
105
|
-
self._post_callbacks[node_type] = (
|
|
106
|
-
|
|
105
|
+
self._post_callbacks[node_type] = lambda _, _2: (
|
|
106
|
+
post_callback
|
|
107
107
|
) # type: ignore
|
|
108
108
|
else:
|
|
109
109
|
self._post_callbacks[node_type] = post_callback
|