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.
Files changed (82) hide show
  1. {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/PKG-INFO +4 -7
  2. {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/README.md +3 -3
  3. {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/pyproject.toml +8 -14
  4. ssc_codegen-0.24.0/ssc_codegen/__init__.py +1 -0
  5. {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/ast/__init__.py +1 -0
  6. {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/ast/base.py +1 -1
  7. {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/ast/jsondef.py +1 -1
  8. {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/ast/struct.py +4 -1
  9. {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/ast/typedef.py +1 -1
  10. {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/converters/base.py +2 -2
  11. {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/converters/js_pure.py +347 -490
  12. {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/converters/py_bs4.py +398 -514
  13. {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/converters/py_helpers.py +223 -66
  14. {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/converters/py_lxml.py +132 -190
  15. {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/converters/py_parsel.py +97 -134
  16. ssc_codegen-0.24.0/ssc_codegen/converters/py_render.py +231 -0
  17. {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/converters/py_slax.py +99 -136
  18. ssc_codegen-0.22.0/ssc_codegen/parsers/spec.py → ssc_codegen-0.24.0/ssc_codegen/converters/request_spec.py +296 -513
  19. ssc_codegen-0.24.0/ssc_codegen/core/__init__.py +10 -0
  20. ssc_codegen-0.24.0/ssc_codegen/core/adapter.py +25 -0
  21. ssc_codegen-0.24.0/ssc_codegen/core/contexts.py +235 -0
  22. ssc_codegen-0.24.0/ssc_codegen/core/expressions.py +1038 -0
  23. ssc_codegen-0.24.0/ssc_codegen/core/format.py +361 -0
  24. ssc_codegen-0.24.0/ssc_codegen/core/linting.py +1121 -0
  25. ssc_codegen-0.24.0/ssc_codegen/core/module_handler.py +290 -0
  26. ssc_codegen-0.24.0/ssc_codegen/core/predicates.py +610 -0
  27. ssc_codegen-0.24.0/ssc_codegen/core/reader.py +133 -0
  28. ssc_codegen-0.24.0/ssc_codegen/core/struct_parser.py +278 -0
  29. ssc_codegen-0.24.0/ssc_codegen/core/type_checking.py +401 -0
  30. {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/document_utils.py +13 -6
  31. {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/kdl/__init__.py +23 -0
  32. ssc_codegen-0.24.0/ssc_codegen/kdl/dict_reader.py +56 -0
  33. {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/kdl/parser.py +9 -7
  34. ssc_codegen-0.24.0/ssc_codegen/kdl/reader.py +419 -0
  35. {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/main.py +95 -280
  36. ssc_codegen-0.24.0/ssc_codegen/parsers/__init__.py +7 -0
  37. {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/parsers/curl.py +11 -11
  38. {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/parsers/http.py +15 -13
  39. ssc_codegen-0.22.0/ssc_codegen/__init__.py +0 -27
  40. ssc_codegen-0.22.0/ssc_codegen/converters/go_goquery.py +0 -1885
  41. ssc_codegen-0.22.0/ssc_codegen/linter/__init__.py +0 -26
  42. ssc_codegen-0.22.0/ssc_codegen/linter/_kdl_lang.py +0 -435
  43. ssc_codegen-0.22.0/ssc_codegen/linter/base.py +0 -822
  44. ssc_codegen-0.22.0/ssc_codegen/linter/errors.py +0 -78
  45. ssc_codegen-0.22.0/ssc_codegen/linter/format_errors.py +0 -285
  46. ssc_codegen-0.22.0/ssc_codegen/linter/metadata.py +0 -18
  47. ssc_codegen-0.22.0/ssc_codegen/linter/navigation.py +0 -262
  48. ssc_codegen-0.22.0/ssc_codegen/linter/path.py +0 -36
  49. ssc_codegen-0.22.0/ssc_codegen/linter/rule_keywords.py +0 -321
  50. ssc_codegen-0.22.0/ssc_codegen/linter/rules.py +0 -848
  51. ssc_codegen-0.22.0/ssc_codegen/linter/rules_struct.py +0 -972
  52. ssc_codegen-0.22.0/ssc_codegen/linter/type_rules.py +0 -523
  53. ssc_codegen-0.22.0/ssc_codegen/linter/types.py +0 -188
  54. ssc_codegen-0.22.0/ssc_codegen/openapi/__init__.py +0 -87
  55. ssc_codegen-0.22.0/ssc_codegen/openapi/converter.py +0 -684
  56. ssc_codegen-0.22.0/ssc_codegen/openapi/emitter.py +0 -128
  57. ssc_codegen-0.22.0/ssc_codegen/openapi/parser.py +0 -143
  58. ssc_codegen-0.22.0/ssc_codegen/parser.py +0 -2467
  59. ssc_codegen-0.22.0/ssc_codegen/parsers/__init__.py +0 -27
  60. ssc_codegen-0.22.0/ssc_codegen/repl.py +0 -778
  61. {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/.gitignore +0 -0
  62. {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/LICENSE +0 -0
  63. {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/_logging.py +0 -0
  64. {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/ast/array.py +0 -0
  65. {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/ast/cast.py +0 -0
  66. {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/ast/control.py +0 -0
  67. {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/ast/extract.py +0 -0
  68. {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/ast/helpers.py +0 -0
  69. {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/ast/module.py +0 -0
  70. {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/ast/predicate_containers.py +0 -0
  71. {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/ast/predicate_ops.py +0 -0
  72. {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/ast/regex.py +0 -0
  73. {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/ast/selectors.py +0 -0
  74. {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/ast/string.py +0 -0
  75. {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/ast/transform.py +0 -0
  76. {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/ast/types.py +0 -0
  77. {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/converters/helpers.py +0 -0
  78. {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/exceptions.py +0 -0
  79. {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/health.py +0 -0
  80. {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/pseudo_selectors.py +0 -0
  81. {ssc_codegen-0.22.0 → ssc_codegen-0.24.0}/ssc_codegen/regex_utils.py +0 -0
  82. {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.22.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 (for Go and other targets)
90
- ssc-gen generate schema.kdl -t go-goquery -o ./parsers --package scraper
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`, `go-goquery`
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 (for Go and other targets)
55
- ssc-gen generate schema.kdl -t go-goquery -o ./parsers --package scraper
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`, `go-goquery`
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.22.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
- "converters/.*\\.py$", # to tired typing
92
- "examples/.*\\.py$"
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
@@ -1,3 +1,4 @@
1
+ # mypy: ignore-errors
1
2
  """
2
3
  AST nodes for the KDL Schema DSL.
3
4
 
@@ -1,5 +1,5 @@
1
1
  from __future__ import annotations
2
- from dataclasses import dataclass, field, fields
2
+ from dataclasses import dataclass, field
3
3
  from typing import TYPE_CHECKING
4
4
 
5
5
  from .types import VariableType
@@ -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 or @optional arg.
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
 
@@ -37,5 +37,5 @@ class TypeDef(Node):
37
37
  struct_type: StructType = StructType.ITEM
38
38
 
39
39
  @property
40
- def fields(self) -> List[TypeDefField]:
40
+ def fields(self) -> list[TypeDefField]:
41
41
  return self.body
@@ -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
- lambda _, _2: post_callback
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