ssc_codegen 0.25.1__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.1 → ssc_codegen-0.26.0}/PKG-INFO +1 -1
  2. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/pyproject.toml +1 -1
  3. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/converters/request_spec.py +1 -1
  4. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/core/expressions.py +2 -2
  5. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/core/linting.py +12 -0
  6. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/main.py +10 -4
  7. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/.gitignore +0 -0
  8. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/LICENSE +0 -0
  9. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/README.md +0 -0
  10. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/__init__.py +0 -0
  11. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/_logging.py +0 -0
  12. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/ast/__init__.py +0 -0
  13. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/ast/array.py +0 -0
  14. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/ast/base.py +0 -0
  15. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/ast/cast.py +0 -0
  16. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/ast/control.py +0 -0
  17. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/ast/extract.py +0 -0
  18. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/ast/helpers.py +0 -0
  19. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/ast/jsondef.py +0 -0
  20. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/ast/module.py +0 -0
  21. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/ast/predicate_containers.py +0 -0
  22. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/ast/predicate_ops.py +0 -0
  23. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/ast/regex.py +0 -0
  24. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/ast/selectors.py +0 -0
  25. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/ast/string.py +0 -0
  26. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/ast/struct.py +0 -0
  27. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/ast/transform.py +0 -0
  28. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/ast/typedef.py +0 -0
  29. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/ast/types.py +0 -0
  30. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/converters/base.py +0 -0
  31. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/converters/helpers.py +0 -0
  32. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/converters/js_pure.py +0 -0
  33. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/converters/py_bs4.py +0 -0
  34. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/converters/py_helpers.py +0 -0
  35. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/converters/py_lxml.py +0 -0
  36. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/converters/py_parsel.py +0 -0
  37. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/converters/py_render.py +0 -0
  38. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/converters/py_slax.py +0 -0
  39. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/core/__init__.py +0 -0
  40. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/core/adapter.py +0 -0
  41. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/core/contexts.py +0 -0
  42. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/core/format.py +0 -0
  43. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/core/module_handler.py +0 -0
  44. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/core/predicates.py +0 -0
  45. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/core/reader.py +0 -0
  46. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/core/struct_parser.py +0 -0
  47. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/core/type_checking.py +0 -0
  48. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/document_utils.py +0 -0
  49. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/exceptions.py +0 -0
  50. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/health.py +0 -0
  51. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/kdl/__init__.py +0 -0
  52. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/kdl/dict_reader.py +0 -0
  53. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/kdl/parser.py +0 -0
  54. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/kdl/reader.py +0 -0
  55. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/parsers/__init__.py +0 -0
  56. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/parsers/curl.py +0 -0
  57. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/parsers/http.py +0 -0
  58. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/pseudo_selectors.py +0 -0
  59. {ssc_codegen-0.25.1 → ssc_codegen-0.26.0}/ssc_codegen/regex_utils.py +0 -0
  60. {ssc_codegen-0.25.1 → 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.1
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.1"
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(
@@ -264,7 +264,9 @@ def generate(
264
264
  out_file = output / kdl_file.with_suffix(ext).name
265
265
  logger.debug("processing: %s -> %s", kdl_file, out_file)
266
266
  try:
267
- ast, err = parse_module(kdl_file.read_text(), source_path=kdl_file)
267
+ ast, err = parse_module(
268
+ kdl_file.read_text(encoding="utf-8"), source_path=kdl_file
269
+ )
268
270
  if skip_lint:
269
271
  pass
270
272
  else:
@@ -368,7 +370,9 @@ def check(
368
370
  total_errors = 0
369
371
 
370
372
  for kdl_file in kdl_files:
371
- _, errs = parse_module(kdl_file.read_text(), source_path=kdl_file)
373
+ _, errs = parse_module(
374
+ kdl_file.read_text(encoding="utf-8"), source_path=kdl_file
375
+ )
372
376
  all_results.extend(errs)
373
377
 
374
378
  if errs:
@@ -488,7 +492,7 @@ def run(
488
492
  # Build AST
489
493
  try:
490
494
  module_ast, errs = parse_module(
491
- kdl_path.read_text(), source_path=kdl_path
495
+ kdl_path.read_text(encoding="utf-8"), source_path=kdl_path
492
496
  )
493
497
  if errs:
494
498
  for e in format_diagnostics(errs, fmt=fmt.value):
@@ -649,7 +653,9 @@ def health(
649
653
 
650
654
  # Build AST
651
655
  try:
652
- module_ast, _ = parse_module(kdl_path.read_text(), source_path=kdl_path)
656
+ module_ast, _ = parse_module(
657
+ kdl_path.read_text(encoding="utf-8"), source_path=kdl_path
658
+ )
653
659
  if css_to_xpath:
654
660
  from ssc_codegen.document_utils import convert_css_to_xpath_module
655
661
 
File without changes
File without changes
File without changes