ssc_codegen 0.25.2__tar.gz → 0.26.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 (60) hide show
  1. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/PKG-INFO +1 -1
  2. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/pyproject.toml +1 -1
  3. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/converters/request_spec.py +1 -1
  4. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/core/expressions.py +2 -2
  5. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/core/linting.py +12 -0
  6. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/.gitignore +0 -0
  7. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/LICENSE +0 -0
  8. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/README.md +0 -0
  9. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/__init__.py +0 -0
  10. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/_logging.py +0 -0
  11. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/ast/__init__.py +0 -0
  12. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/ast/array.py +0 -0
  13. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/ast/base.py +0 -0
  14. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/ast/cast.py +0 -0
  15. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/ast/control.py +0 -0
  16. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/ast/extract.py +0 -0
  17. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/ast/helpers.py +0 -0
  18. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/ast/jsondef.py +0 -0
  19. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/ast/module.py +0 -0
  20. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/ast/predicate_containers.py +0 -0
  21. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/ast/predicate_ops.py +0 -0
  22. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/ast/regex.py +0 -0
  23. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/ast/selectors.py +0 -0
  24. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/ast/string.py +0 -0
  25. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/ast/struct.py +0 -0
  26. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/ast/transform.py +0 -0
  27. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/ast/typedef.py +0 -0
  28. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/ast/types.py +0 -0
  29. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/converters/base.py +0 -0
  30. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/converters/helpers.py +0 -0
  31. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/converters/js_pure.py +0 -0
  32. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/converters/py_bs4.py +0 -0
  33. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/converters/py_helpers.py +0 -0
  34. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/converters/py_lxml.py +0 -0
  35. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/converters/py_parsel.py +0 -0
  36. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/converters/py_render.py +0 -0
  37. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/converters/py_slax.py +0 -0
  38. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/core/__init__.py +0 -0
  39. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/core/adapter.py +0 -0
  40. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/core/contexts.py +0 -0
  41. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/core/format.py +0 -0
  42. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/core/module_handler.py +0 -0
  43. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/core/predicates.py +0 -0
  44. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/core/reader.py +0 -0
  45. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/core/struct_parser.py +0 -0
  46. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/core/type_checking.py +0 -0
  47. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/document_utils.py +0 -0
  48. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/exceptions.py +0 -0
  49. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/health.py +0 -0
  50. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/kdl/__init__.py +0 -0
  51. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/kdl/dict_reader.py +0 -0
  52. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/kdl/parser.py +0 -0
  53. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/kdl/reader.py +0 -0
  54. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/main.py +0 -0
  55. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/parsers/__init__.py +0 -0
  56. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/parsers/curl.py +0 -0
  57. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/parsers/http.py +0 -0
  58. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/pseudo_selectors.py +0 -0
  59. {ssc_codegen-0.25.2 → ssc_codegen-0.26.0}/ssc_codegen/regex_utils.py +0 -0
  60. {ssc_codegen-0.25.2 → ssc_codegen-0.26.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.25.2
3
+ Version: 0.26.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
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "ssc_codegen"
3
- version = "0.25.2"
3
+ version = "0.26.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"
@@ -20,7 +20,7 @@ from ssc_codegen.parsers.http import parse_http_request
20
20
  # Groups: 1=NAME, 2=PRIM, 3="[]", 4="?", 5=STYLE.
21
21
  _PH = re.compile(
22
22
  r"\{\{"
23
- r"([A-Za-z][A-Za-z0-9_-]*)"
23
+ r"([a-z][a-z0-9_-]*)"
24
24
  r"(?::(str|int|float|bool))?"
25
25
  r"(\[\])?"
26
26
  r"(\?)?"
@@ -167,7 +167,7 @@ _FLOAT_RE = _re.compile(
167
167
  r"[+-]?(?:\d(?:[\d_])*\.\d(?:[\d_])*|\d(?:[\d_])*[eE][+-]?\d(?:[\d_])*|\d(?:[\d_]*)\.\d(?:[\d_]*)[eE][+-]?\d(?:[\d_])*)\Z"
168
168
  )
169
169
 
170
- _DEFINE_REF_RE = _re.compile(r"\{\{([A-Za-z][A-Za-z0-9_-]*)\}\}")
170
+ _DEFINE_REF_RE = _re.compile(r"\{\{([A-Z_][A-Z0-9_-]*)\}\}")
171
171
 
172
172
 
173
173
  def _resolve_define_references(value: str, ctx: ParseContext) -> str:
@@ -175,7 +175,7 @@ def _resolve_define_references(value: str, ctx: ParseContext) -> str:
175
175
  name = m.group(1)
176
176
  resolved = ctx.property_defines.get(name)
177
177
  if resolved is None:
178
- raise ParseError(f"define references undefined name {name!r}")
178
+ return m.group(0)
179
179
  return str(resolved)
180
180
 
181
181
  return _DEFINE_REF_RE.sub(_replacer, value)
@@ -1111,12 +1111,24 @@ def lint_rest_cross_refs(ctx: ParseContext, lint: LintContext) -> None:
1111
1111
  )
1112
1112
 
1113
1113
 
1114
+ _DEFINE_NAME_RE = _re.compile(r"^[A-Z_][A-Z0-9_-]*\Z")
1115
+
1116
+
1114
1117
  def lint_define_node(
1115
1118
  node: KdlNode, ctx: ParseContext, lint: LintContext
1116
1119
  ) -> None:
1117
1120
  """Validate module-level define."""
1118
1121
  children = lint.get_children_nodes(node)
1119
1122
  args = lint.get_args(node)
1123
+ if args:
1124
+ name = args[0]
1125
+ if not _DEFINE_NAME_RE.match(name):
1126
+ lint.error(
1127
+ node,
1128
+ message=f"define name '{name}' must be UPPER_CASE ([A-Z_][A-Z0-9_-]*)",
1129
+ code="E002",
1130
+ hint="use UPPER_CASE: define MY-VAR=... or define MY_BLOCK { ... }",
1131
+ )
1120
1132
  if children:
1121
1133
  if not args:
1122
1134
  lint.error(
File without changes
File without changes
File without changes