ssc_codegen 0.13.2__tar.gz → 0.13.4__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 (63) hide show
  1. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/PKG-INFO +1 -2
  2. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/pyproject.toml +1 -2
  3. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/__init__.py +1 -1
  4. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/cli/ast_grep.py +3 -1
  5. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/cli/main.py +18 -8
  6. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/converters/py_lxml.py +37 -6
  7. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/.gitignore +0 -0
  8. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/LICENSE +0 -0
  9. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/README.md +0 -0
  10. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/_compat.py +0 -0
  11. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/ast_/__init__.py +0 -0
  12. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/ast_/base.py +0 -0
  13. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/ast_/nodes_array.py +0 -0
  14. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/ast_/nodes_cast.py +0 -0
  15. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/ast_/nodes_core.py +0 -0
  16. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/ast_/nodes_filter.py +0 -0
  17. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/ast_/nodes_selectors.py +0 -0
  18. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/ast_/nodes_string.py +0 -0
  19. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/ast_/nodes_validate.py +0 -0
  20. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/ast_build/__init__.py +0 -0
  21. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/ast_build/builder.py +0 -0
  22. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/ast_build/main.py +0 -0
  23. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/ast_build/utils.py +0 -0
  24. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/ast_grep_rules/js_rules.yml +0 -0
  25. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/ast_grep_rules/py_drop_prefix_suffix_backport.yml +0 -0
  26. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/ast_grep_rules/py_rules.yml +0 -0
  27. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/cli/__init__.py +0 -0
  28. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/cli/cli_callbacks.py +0 -0
  29. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/cli/cli_utils.py +0 -0
  30. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/cli/code_callbacks.py +0 -0
  31. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/cli/consts.py +0 -0
  32. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/cli/runtime_parse_runners.py +0 -0
  33. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/compiler.py +0 -0
  34. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/converters/__init__.py +0 -0
  35. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/converters/base.py +0 -0
  36. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/converters/go_goquery.py +0 -0
  37. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/converters/helpers.py +0 -0
  38. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/converters/js_pure.py +0 -0
  39. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/converters/lua_htmlparser.py +0 -0
  40. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/converters/py_base.py +0 -0
  41. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/converters/py_bs4.py +0 -0
  42. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/converters/py_parsel.py +0 -0
  43. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/converters/py_selectolax.py +0 -0
  44. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/converters/templates/__init__.py +0 -0
  45. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/converters/templates/go_goquery.py +0 -0
  46. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/converters/templates/js_pure.py +0 -0
  47. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/converters/templates/lua_base.py +0 -0
  48. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/converters/templates/lua_css_compat.py +0 -0
  49. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/converters/templates/lua_re_compat.py +0 -0
  50. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/converters/templates/py_base.py +0 -0
  51. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/document.py +0 -0
  52. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/document_utlis.py +0 -0
  53. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/json_struct.py +0 -0
  54. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/json_to_scc.py +0 -0
  55. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/logs.py +0 -0
  56. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/pseudo_selectors.py +0 -0
  57. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/schema.py +0 -0
  58. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/selector_utils.py +0 -0
  59. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/static_checker/__init__.py +0 -0
  60. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/static_checker/base.py +0 -0
  61. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/static_checker/callbacks.py +0 -0
  62. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/str_utils.py +0 -0
  63. {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/tokens.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ssc_codegen
3
- Version: 0.13.2
3
+ Version: 0.13.4
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
@@ -27,7 +27,6 @@ Requires-Dist: cssselect>=1.2.0
27
27
  Requires-Dist: httpx>=0.28.1
28
28
  Requires-Dist: ichrome>=4.0.4
29
29
  Requires-Dist: lxml>=5.3.0
30
- Requires-Dist: parsel>=1.10.0
31
30
  Requires-Dist: soupsieve>=2.6
32
31
  Requires-Dist: tinycss2>=1.4.0
33
32
  Requires-Dist: typer>=0.15.1
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "ssc_codegen"
3
- version = "0.13.2"
3
+ version = "0.13.4"
4
4
  description = "Python-dsl code converter to html parser for web scraping "
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
@@ -11,7 +11,6 @@ dependencies = [
11
11
  "httpx>=0.28.1",
12
12
  "ichrome>=4.0.4",
13
13
  "lxml>=5.3.0",
14
- "parsel>=1.10.0",
15
14
  "soupsieve>=2.6",
16
15
  "typer>=0.15.1",
17
16
  "typing_extensions;python_version<'3.11'",
@@ -7,7 +7,7 @@ from ssc_codegen.schema import ItemSchema, DictSchema, ListSchema, FlatListSchem
7
7
 
8
8
  setup_logger()
9
9
 
10
- VERSION = "0.13.2"
10
+ VERSION = "0.13.4"
11
11
 
12
12
 
13
13
  class __MISSING(object):
@@ -4,5 +4,7 @@ from importlib import resources
4
4
  RULES_PATH = resources.files("ssc_codegen.ast_grep_rules")
5
5
 
6
6
  PY_RULES = str(RULES_PATH.joinpath("py_rules.yml"))
7
- PY_NEW_RM_PREFIX_SUFFIX_SYNTAX = str(RULES_PATH.joinpath("py_drop_prefix_suffix_backport.yml"))
7
+ PY_NEW_RM_PREFIX_SUFFIX_SYNTAX = str(
8
+ RULES_PATH.joinpath("py_drop_prefix_suffix_backport.yml")
9
+ )
8
10
  JS_RULES = str(RULES_PATH.joinpath("js_rules.yml"))
@@ -11,7 +11,11 @@ from ichrome.exceptions import ChromeRuntimeError
11
11
  from typer import Argument, BadParameter, Option, Typer
12
12
 
13
13
  from ssc_codegen.ast_build import build_ast_module_parser
14
- from ssc_codegen.cli.ast_grep import JS_RULES, PY_RULES, PY_NEW_RM_PREFIX_SUFFIX_SYNTAX
14
+ from ssc_codegen.cli.ast_grep import (
15
+ JS_RULES,
16
+ PY_RULES,
17
+ PY_NEW_RM_PREFIX_SUFFIX_SYNTAX,
18
+ )
15
19
  from ssc_codegen.cli.cli_callbacks import cb_check_ssc_files, cb_folder_out
16
20
  from ssc_codegen.cli.cli_utils import (
17
21
  ConverterLike,
@@ -169,8 +173,13 @@ def gen_py(
169
173
  bool, Option(help=HELP_DOCSTRING, is_flag=True)
170
174
  ] = True,
171
175
  fmt_prefix_suffix_backport: Annotated[
172
- bool, Option("-frps", '--fmt-remove-prefix-suffix',
173
- help="[PY39+]: replace backport funcs to str.removeprefix(...) and str.removesuffix(...)")] = False
176
+ bool,
177
+ Option(
178
+ "-frps",
179
+ "--fmt-remove-prefix-suffix",
180
+ help="[PY39+]: replace backport funcs to str.removeprefix(...) and str.removesuffix(...)",
181
+ ),
182
+ ] = False,
174
183
  ) -> None:
175
184
  converter = import_converter(f"py_{lib.value}")
176
185
  if fmt:
@@ -180,13 +189,14 @@ def gen_py(
180
189
  f"ast-grep scan --rule {PY_RULES} -U " + "{}",
181
190
  ]
182
191
  if fmt_prefix_suffix_backport:
183
- commands.append(f"ast-grep scan --rule {PY_NEW_RM_PREFIX_SUFFIX_SYNTAX} -U " + "{}")
192
+ commands.append(
193
+ f"ast-grep scan --rule {PY_NEW_RM_PREFIX_SUFFIX_SYNTAX} -U "
194
+ + "{}"
195
+ )
184
196
  fmt_cmd = create_fmt_cmd(ssc_files, prefix, suffix, out, commands)
185
197
  else:
186
198
  fmt_cmd = []
187
199
 
188
-
189
-
190
200
  generate_code(
191
201
  converter=converter,
192
202
  out=out,
@@ -429,7 +439,7 @@ def parse_from_file(
429
439
  ] = None,
430
440
  ) -> None:
431
441
  from ssc_codegen.compiler import Compiler
432
- from ssc_codegen.converters.py_parsel import CONVERTER
442
+ from ssc_codegen.converters.py_lxml import CONVERTER
433
443
 
434
444
  cls_target, schema_config = _validate_parser_target(cls_target)
435
445
 
@@ -553,7 +563,7 @@ def parse_from_chrome_(
553
563
  from ssc_codegen.converters.js_pure import CONVERTER as JS_CONVERTER
554
564
  import asyncio
555
565
  from ssc_codegen.compiler import Compiler
556
- from ssc_codegen.converters.py_parsel import CONVERTER
566
+ from ssc_codegen.converters.py_lxml import CONVERTER
557
567
 
558
568
  cls_target, schema_config = _validate_parser_target(cls_target)
559
569
 
@@ -62,15 +62,38 @@ from ssc_codegen.converters.templates.py_base import IMPORTS_MIN
62
62
 
63
63
  CONVERTER = BasePyCodeConverter()
64
64
 
65
+ """
66
+ # HtmlElement → сразу принимаем
67
+ if isinstance(document, html.HtmlElement):
68
+ self._document = document
69
+ return
70
+
71
+ # Строка → пробуем парсить
72
+ if isinstance(document, str):
73
+ try:
74
+ self._document = html.fromstring(document.strip() or self.FALLBACK_HTML)
75
+ return
76
+ except (ParserError, ValueError):
77
+ pass
78
+
79
+ # Всё остальное или ошибка → заглушка
80
+ self._document = html.fromstring(self.FALLBACK_HTML)
81
+ """
82
+
65
83
 
66
84
  @CONVERTER(StructInitMethod.kind)
67
85
  def pre_init(_node: StructInitMethod) -> str:
68
- return (
86
+ parts = [
69
87
  INDENT_METHOD
70
- + "def __init__(self, document: Union[str, html.HtmlElement]) -> None:\n"
71
- + INDENT_METHOD_BODY
72
- + "self._document = html.fromstring(document) if isinstance(document, str) else document"
73
- )
88
+ + "def __init__(self, document: Union[str, html.HtmlElement]) -> None:",
89
+ INDENT_METHOD * 2 + "if isinstance(document, html.HtmlElement):",
90
+ INDENT_METHOD * 3 + "self._document = document",
91
+ INDENT_METHOD * 2 + "elif isinstance(document, str):",
92
+ INDENT_METHOD * 3
93
+ + "self._document = html.fromstring(document.strip() or FALLBACK_HTML_STR)",
94
+ # in codegen, passed only str or html.HtmlElement objects
95
+ ]
96
+ return "\n".join(parts)
74
97
 
75
98
 
76
99
  @CONVERTER(StructPreValidateMethod.kind)
@@ -101,7 +124,15 @@ def pre_struct_field_method(node: StructFieldMethod) -> str:
101
124
 
102
125
  @CONVERTER(ModuleImports.kind)
103
126
  def pre_imports(_: ModuleImports) -> str:
104
- return IMPORTS_MIN + """from lxml import html, etree"""
127
+ # lxml throw parse error if passed empty string
128
+ # most mainsteram html parser libs use `FALLBACK_HTML_STR` stub value
129
+ return (
130
+ IMPORTS_MIN
131
+ + """from lxml import html, etree
132
+
133
+ FALLBACK_HTML_STR = "<html><body></body></html>"
134
+ """
135
+ )
105
136
 
106
137
 
107
138
  @CONVERTER(ExprCss.kind)
File without changes
File without changes
File without changes