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.
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/PKG-INFO +1 -2
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/pyproject.toml +1 -2
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/__init__.py +1 -1
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/cli/ast_grep.py +3 -1
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/cli/main.py +18 -8
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/converters/py_lxml.py +37 -6
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/.gitignore +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/LICENSE +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/README.md +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/_compat.py +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/ast_/__init__.py +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/ast_/base.py +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/ast_/nodes_array.py +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/ast_/nodes_cast.py +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/ast_/nodes_core.py +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/ast_/nodes_filter.py +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/ast_/nodes_selectors.py +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/ast_/nodes_string.py +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/ast_/nodes_validate.py +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/ast_build/__init__.py +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/ast_build/builder.py +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/ast_build/main.py +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/ast_build/utils.py +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/ast_grep_rules/js_rules.yml +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/ast_grep_rules/py_drop_prefix_suffix_backport.yml +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/ast_grep_rules/py_rules.yml +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/cli/__init__.py +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/cli/cli_callbacks.py +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/cli/cli_utils.py +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/cli/code_callbacks.py +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/cli/consts.py +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/cli/runtime_parse_runners.py +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/compiler.py +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/converters/__init__.py +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/converters/base.py +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/converters/go_goquery.py +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/converters/helpers.py +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/converters/js_pure.py +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/converters/lua_htmlparser.py +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/converters/py_base.py +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/converters/py_bs4.py +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/converters/py_parsel.py +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/converters/py_selectolax.py +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/converters/templates/__init__.py +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/converters/templates/go_goquery.py +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/converters/templates/js_pure.py +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/converters/templates/lua_base.py +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/converters/templates/lua_css_compat.py +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/converters/templates/lua_re_compat.py +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/converters/templates/py_base.py +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/document.py +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/document_utlis.py +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/json_struct.py +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/json_to_scc.py +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/logs.py +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/pseudo_selectors.py +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/schema.py +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/selector_utils.py +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/static_checker/__init__.py +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/static_checker/base.py +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/static_checker/callbacks.py +0 -0
- {ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/str_utils.py +0 -0
- {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.
|
|
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.
|
|
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'",
|
|
@@ -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(
|
|
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
|
|
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,
|
|
173
|
-
|
|
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(
|
|
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.
|
|
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.
|
|
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
|
-
|
|
86
|
+
parts = [
|
|
69
87
|
INDENT_METHOD
|
|
70
|
-
+ "def __init__(self, document: Union[str, html.HtmlElement]) -> None
|
|
71
|
-
+
|
|
72
|
-
+ "self._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
|
-
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ssc_codegen-0.13.2 → ssc_codegen-0.13.4}/ssc_codegen/converters/templates/lua_css_compat.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|