ssc_codegen 0.9.7__tar.gz → 0.9.9__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 (56) hide show
  1. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/PKG-INFO +1 -1
  2. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/pyproject.toml +1 -1
  3. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/__init__.py +1 -1
  4. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/ast_build/utils.py +46 -7
  5. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/converters/js_pure.py +3 -9
  6. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/.gitignore +0 -0
  7. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/LICENSE +0 -0
  8. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/README.md +0 -0
  9. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/_compat.py +0 -0
  10. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/ast_/__init__.py +0 -0
  11. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/ast_/base.py +0 -0
  12. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/ast_/nodes_array.py +0 -0
  13. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/ast_/nodes_cast.py +0 -0
  14. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/ast_/nodes_core.py +0 -0
  15. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/ast_/nodes_filter.py +0 -0
  16. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/ast_/nodes_selectors.py +0 -0
  17. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/ast_/nodes_string.py +0 -0
  18. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/ast_/nodes_validate.py +0 -0
  19. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/ast_build/__init__.py +0 -0
  20. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/ast_build/main.py +0 -0
  21. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/ast_grep_rules/js_rules.yml +0 -0
  22. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/ast_grep_rules/py_rules.yml +0 -0
  23. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/cli/__init__.py +0 -0
  24. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/cli/ast_grep.py +0 -0
  25. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/cli/cli_callbacks.py +0 -0
  26. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/cli/cli_utils.py +0 -0
  27. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/cli/code_callbacks.py +0 -0
  28. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/cli/consts.py +0 -0
  29. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/cli/main.py +0 -0
  30. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/cli/runtime_parse_runners.py +0 -0
  31. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/compiler.py +0 -0
  32. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/consts.py +0 -0
  33. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/converters/__init__.py +0 -0
  34. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/converters/base.py +0 -0
  35. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/converters/go_goquery.py +0 -0
  36. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/converters/helpers.py +0 -0
  37. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/converters/py_base.py +0 -0
  38. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/converters/py_bs4.py +0 -0
  39. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/converters/py_parsel.py +0 -0
  40. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/converters/py_selectolax.py +0 -0
  41. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/converters/templates/__init__.py +0 -0
  42. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/converters/templates/go_goquery.py +0 -0
  43. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/converters/templates/js_pure.py +0 -0
  44. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/document.py +0 -0
  45. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/document_utlis.py +0 -0
  46. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/json_struct.py +0 -0
  47. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/json_to_scc.py +0 -0
  48. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/logs.py +0 -0
  49. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/pseudo_selectors.py +0 -0
  50. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/schema.py +0 -0
  51. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/selector_utils.py +0 -0
  52. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/static_checker/__init__.py +0 -0
  53. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/static_checker/base.py +0 -0
  54. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/static_checker/callbacks.py +0 -0
  55. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/str_utils.py +0 -0
  56. {ssc_codegen-0.9.7 → ssc_codegen-0.9.9}/ssc_codegen/tokens.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ssc_codegen
3
- Version: 0.9.7
3
+ Version: 0.9.9
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.9.7"
3
+ version = "0.9.9"
4
4
  description = "Python-dsl code converter to html parser for web scraping "
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
@@ -7,7 +7,7 @@ from ssc_codegen.schema import ItemSchema, DictSchema, ListSchema, FlatListSchem
7
7
 
8
8
  setup_logger()
9
9
 
10
- VERSION = "0.9.7"
10
+ VERSION = "0.9.9"
11
11
 
12
12
 
13
13
  class __MISSING(object):
@@ -90,20 +90,59 @@ def extract_json_structs_from_module(module: ModuleType) -> list[Type[Json]]:
90
90
  ]
91
91
 
92
92
 
93
+ def _add_sys_path(abs_path: Path) -> None:
94
+ # required for correct imports (eg: constants)
95
+ # TODO: calculate configs dirs depth
96
+ pathes = str(abs_path.parent), str(abs_path.parent.parent)
97
+ for p in pathes:
98
+ if p not in sys.path:
99
+ sys.path.append(p)
100
+
101
+
102
+ def _is_not_dunder_obj(name: str) -> bool:
103
+ return not name.startswith("__") and not name.endswith("___")
104
+
105
+
106
+ def _is_ssc_cls(name: str, cls: type) -> bool:
107
+ return (
108
+ _is_not_dunder_obj(name)
109
+ and hasattr(cls, "__mro__")
110
+ and BaseSchema in cls.__mro__
111
+ and not is_template_schema_cls(cls)
112
+ )
113
+
114
+
93
115
  def exec_module_code(path: str | Path, add_sys_path: bool = True) -> ModuleType:
94
116
  # apologize, input - real python file
95
117
  if isinstance(path, str):
96
118
  path = Path(path)
97
- module = ModuleType("_")
98
119
  abs_path = path.resolve()
99
- # required for correct imports (eg: constants)
100
- # TODO: calculate configs dirs depth
101
- if add_sys_path and str(abs_path.parent) not in sys.path:
102
- sys.path.append(str(abs_path.parent))
120
+ module = ModuleType("_")
103
121
 
104
- if add_sys_path and str(abs_path.parent.parent) not in sys.path:
105
- sys.path.append(str(abs_path.parent.parent))
122
+ if add_sys_path:
123
+ _add_sys_path(abs_path)
106
124
 
107
125
  code = Path(abs_path).read_text()
108
126
  exec(code, module.__dict__)
127
+
128
+ tmp_module = module.__dict__.copy()
129
+ main_entypoint_schemas = {}
130
+ for k, v in tmp_module.items():
131
+ # move first schemas to end for correct order import and code generate
132
+ if _is_ssc_cls(k, v):
133
+ main_entypoint_schemas[k] = v
134
+ module.__dict__.pop(k)
135
+ # scan and import sub_schemas
136
+ # NOTE: context will be overrided by BaseSchema-like names
137
+ elif _is_not_dunder_obj(k) and isinstance(v, ModuleType):
138
+ for sc in extract_schemas_from_module(v):
139
+ if module.__dict__.get(sc.__name__):
140
+ LOGGER.warning(
141
+ "Schema `%s` already defined. `%s.%s` override it",
142
+ sc.__name__,
143
+ f"{v.__name__}.{sc.__name__}",
144
+ )
145
+ module.__dict__[sc.__name__] = sc
146
+
147
+ module.__dict__.update(main_entypoint_schemas)
109
148
  return module
@@ -105,7 +105,6 @@ from ssc_codegen.ast_ import (
105
105
  ExprStringMapReplace,
106
106
  ExprListStringMapReplace,
107
107
  )
108
- from ssc_codegen.ast_.nodes_core import ModuleImports
109
108
  from ssc_codegen.ast_.nodes_selectors import ExprMapAttrs, ExprMapAttrsAll
110
109
  from ssc_codegen.ast_.nodes_string import (
111
110
  ExprListStringUnescape,
@@ -162,8 +161,9 @@ def to_js_regexp(
162
161
  pattern: str, ignore_case: bool = False, is_global: bool = True
163
162
  ) -> str:
164
163
  """helper function for convert string pattern to js"""
165
- pattern = pattern.replace("<\\/", "</")
166
- pattern = pattern.replace("/", "\\/")
164
+ # fix backslashes translate
165
+ pattern = pattern.replace("/", r"\/").replace(r"\\/", r"\/")
166
+
167
167
  pattern = f"/{pattern}/"
168
168
  if is_global:
169
169
  pattern += "g"
@@ -187,12 +187,6 @@ def py_sequence_to_js_array(values: tuple[str, ...] | list[str]) -> str:
187
187
  return "[" + val_arr[1:-1] + "]"
188
188
 
189
189
 
190
- @CONVERTER(ModuleImports.kind)
191
- def pre_imports(_node: ModuleImports) -> str:
192
- # HACK: used imports node for provide helpers scripts
193
- pass
194
-
195
-
196
190
  @CONVERTER(Docstring.kind)
197
191
  def pre_docstring(node: Docstring) -> str:
198
192
  value = node.kwargs["value"]
File without changes
File without changes
File without changes