ssc_codegen 0.5.3__tar.gz → 0.5.5__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.

Potentially problematic release.


This version of ssc_codegen might be problematic. Click here for more details.

Files changed (94) hide show
  1. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/.idea/workspace.xml +108 -89
  2. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/PKG-INFO +2 -2
  3. ssc_codegen-0.5.5/examples/a.py +7 -0
  4. {ssc_codegen-0.5.3/examples → ssc_codegen-0.5.5/examples/booksToScrape}/generate_code.sh +1 -0
  5. ssc_codegen-0.5.5/examples/manual_make.py +14 -0
  6. ssc_codegen-0.5.5/examples/testDoc/index.html +23 -0
  7. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/pyproject.toml +2 -2
  8. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/ssc_codegen/__init__.py +1 -1
  9. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/ssc_codegen/ast_builder.py +63 -28
  10. ssc_codegen-0.5.5/ssc_codegen/converters/__init__.py +0 -0
  11. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/ssc_codegen/converters/py_base.py +1 -1
  12. ssc_codegen-0.5.5/tests/schema/test_default_expr.py +25 -0
  13. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/tests/schema/test_sc_magic_methods.py +13 -0
  14. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/.gitignore +0 -0
  15. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/.idea/.gitignore +0 -0
  16. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/.idea/inspectionProfiles/Project_Default.xml +0 -0
  17. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/.idea/inspectionProfiles/profiles_settings.xml +0 -0
  18. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/.idea/libraries/Dart_Packages.xml +0 -0
  19. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/.idea/libraries/Dart_SDK.xml +0 -0
  20. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/.idea/misc.xml +0 -0
  21. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/.idea/modules.xml +0 -0
  22. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/.idea/selector_schema_codegen.iml +0 -0
  23. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/.idea/vcs.xml +0 -0
  24. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/LICENSE +0 -0
  25. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/README.md +0 -0
  26. {ssc_codegen-0.5.3/examples → ssc_codegen-0.5.5/examples/booksToScrape}/README.md +0 -0
  27. {ssc_codegen-0.5.3/examples → ssc_codegen-0.5.5/examples/booksToScrape}/booksToScrapePage.html +0 -0
  28. {ssc_codegen-0.5.3/examples → ssc_codegen-0.5.5/examples/booksToScrape}/booksToScrapePage50.html +0 -0
  29. {ssc_codegen-0.5.3/examples → ssc_codegen-0.5.5/examples/booksToScrape}/dart/booksToScrape.dart +0 -0
  30. {ssc_codegen-0.5.3/examples → ssc_codegen-0.5.5/examples/booksToScrape}/dart/main.dart +0 -0
  31. {ssc_codegen-0.5.3/examples → ssc_codegen-0.5.5/examples/booksToScrape}/ex_extended.py +0 -0
  32. {ssc_codegen-0.5.3/examples → ssc_codegen-0.5.5/examples/booksToScrape}/go/booksToScrape.go +0 -0
  33. {ssc_codegen-0.5.3/examples → ssc_codegen-0.5.5/examples/booksToScrape}/go/main.go +0 -0
  34. {ssc_codegen-0.5.3/examples → ssc_codegen-0.5.5/examples/booksToScrape}/js/booksToScrape.js +0 -0
  35. {ssc_codegen-0.5.3/examples → ssc_codegen-0.5.5/examples/booksToScrape}/js/booksToScrapeTests.js +0 -0
  36. {ssc_codegen-0.5.3/examples → ssc_codegen-0.5.5/examples/booksToScrape}/js/main.js +0 -0
  37. {ssc_codegen-0.5.3/examples → ssc_codegen-0.5.5/examples/booksToScrape}/manual_make.py +0 -0
  38. {ssc_codegen-0.5.3/examples → ssc_codegen-0.5.5/examples/booksToScrape}/python/booksToScrape.py +0 -0
  39. {ssc_codegen-0.5.3/examples → ssc_codegen-0.5.5/examples/booksToScrape}/python/main.py +0 -0
  40. {ssc_codegen-0.5.3/examples → ssc_codegen-0.5.5/examples/booksToScrape}/python/main2.py +0 -0
  41. {ssc_codegen-0.5.3/examples → ssc_codegen-0.5.5/examples/booksToScrape}/runtime_compile.py +0 -0
  42. {ssc_codegen-0.5.3/examples → ssc_codegen-0.5.5/examples/booksToScrape}/schemas/booksToScrape.py +0 -0
  43. {ssc_codegen-0.5.3/examples → ssc_codegen-0.5.5/examples/booksToScrape}/schemas/booksToScrapeTests.py +0 -0
  44. /ssc_codegen-0.5.3/ssc_codegen/converters/__init__.py → /ssc_codegen-0.5.5/examples/testDoc/schema.py +0 -0
  45. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/main.py +0 -0
  46. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/o.py +0 -0
  47. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/scripts/check.sh +0 -0
  48. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/scripts/fix.sh +0 -0
  49. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/scripts/ver_patch.sh +0 -0
  50. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/scripts/version.py +0 -0
  51. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/ssc_codegen/ast_ssc.py +0 -0
  52. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/ssc_codegen/cli.py +0 -0
  53. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/ssc_codegen/cli_utils.py +0 -0
  54. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/ssc_codegen/compiler.py +0 -0
  55. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/ssc_codegen/consts.py +0 -0
  56. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/ssc_codegen/converters/ast_utils.py +0 -0
  57. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/ssc_codegen/converters/base.py +0 -0
  58. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/ssc_codegen/converters/dart_universal_html.py +0 -0
  59. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/ssc_codegen/converters/go_goquery.py +0 -0
  60. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/ssc_codegen/converters/js_pure.py +0 -0
  61. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/ssc_codegen/converters/py_bs4.py +0 -0
  62. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/ssc_codegen/converters/py_parsel.py +0 -0
  63. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/ssc_codegen/converters/py_scrapy.py +0 -0
  64. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/ssc_codegen/converters/py_selectolax.py +0 -0
  65. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/ssc_codegen/converters/templates/dart.py +0 -0
  66. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/ssc_codegen/converters/templates/go.py +0 -0
  67. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/ssc_codegen/converters/templates/js.py +0 -0
  68. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/ssc_codegen/converters/templates/py.py +0 -0
  69. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/ssc_codegen/converters/templates/utils.py +0 -0
  70. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/ssc_codegen/converters/tools.py +0 -0
  71. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/ssc_codegen/converters/utils.py +0 -0
  72. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/ssc_codegen/document.py +0 -0
  73. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/ssc_codegen/document_utlis.py +0 -0
  74. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/ssc_codegen/schema.py +0 -0
  75. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/ssc_codegen/selector_utils.py +0 -0
  76. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/ssc_codegen/tokens.py +0 -0
  77. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/tests/converter_tools/test_str_utils.py +0 -0
  78. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/tests/converter_tools/test_variable.py +0 -0
  79. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/tests/converters/helpers_converters.py +0 -0
  80. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/tests/converters/test_buildin_converters.py +0 -0
  81. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/tests/document/test_document_array.py +0 -0
  82. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/tests/document/test_document_assert.py +0 -0
  83. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/tests/document/test_document_invalid_expr.py +0 -0
  84. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/tests/document/test_document_regex.py +0 -0
  85. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/tests/document/test_document_select.py +0 -0
  86. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/tests/document/test_document_text.py +0 -0
  87. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/tests/document/test_nested.py +0 -0
  88. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/tests/document/test_selector_converters.py +0 -0
  89. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/tests/schema/helpers.py +0 -0
  90. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/tests/schema/test_sc_mro.py +0 -0
  91. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/tests/utils/test_convert_query.py +0 -0
  92. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/tests/utils/test_go_unimport.py +0 -0
  93. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/tests/utils/test_validate_query.py +0 -0
  94. {ssc_codegen-0.5.3 → ssc_codegen-0.5.5}/uv.lock +0 -0
@@ -4,13 +4,29 @@
4
4
  <option name="autoReloadType" value="SELECTIVE" />
5
5
  </component>
6
6
  <component name="ChangeListManager">
7
- <list default="true" id="9c5efa3e-dda3-4c3a-8055-fa28924643ed" name="Changes" comment="add test converters implementation status">
8
- <change afterPath="$PROJECT_DIR$/examples/ex_extended.py" afterDir="false" />
9
- <change afterPath="$PROJECT_DIR$/examples/python/main2.py" afterDir="false" />
10
- <change afterPath="$PROJECT_DIR$/examples/schemas/booksToScrapeTests.py" afterDir="false" />
7
+ <list default="true" id="9c5efa3e-dda3-4c3a-8055-fa28924643ed" name="Changes" comment="bump">
8
+ <change afterPath="$PROJECT_DIR$/examples/booksToScrape/ex_extended.py" afterDir="false" />
9
+ <change afterPath="$PROJECT_DIR$/examples/booksToScrape/python/main2.py" afterDir="false" />
10
+ <change afterPath="$PROJECT_DIR$/examples/booksToScrape/schemas/booksToScrapeTests.py" afterDir="false" />
11
+ <change afterPath="$PROJECT_DIR$/examples/testDoc/index.html" afterDir="false" />
12
+ <change afterPath="$PROJECT_DIR$/examples/testDoc/schema.py" afterDir="false" />
13
+ <change afterPath="$PROJECT_DIR$/tests/schema/test_default_expr.py" afterDir="false" />
11
14
  <change beforePath="$PROJECT_DIR$/.gitignore" beforeDir="false" afterPath="$PROJECT_DIR$/.gitignore" afterDir="false" />
12
- <change beforePath="$PROJECT_DIR$/ssc_codegen/converters/js_pure.py" beforeDir="false" afterPath="$PROJECT_DIR$/ssc_codegen/converters/js_pure.py" afterDir="false" />
13
- <change beforePath="$PROJECT_DIR$/ssc_codegen/converters/templates/js.py" beforeDir="false" afterPath="$PROJECT_DIR$/ssc_codegen/converters/templates/js.py" afterDir="false" />
15
+ <change beforePath="$PROJECT_DIR$/examples/README.md" beforeDir="false" afterPath="$PROJECT_DIR$/examples/booksToScrape/README.md" afterDir="false" />
16
+ <change beforePath="$PROJECT_DIR$/examples/dart/booksToScrape.dart" beforeDir="false" afterPath="$PROJECT_DIR$/examples/booksToScrape/dart/booksToScrape.dart" afterDir="false" />
17
+ <change beforePath="$PROJECT_DIR$/examples/dart/main.dart" beforeDir="false" afterPath="$PROJECT_DIR$/examples/booksToScrape/dart/main.dart" afterDir="false" />
18
+ <change beforePath="$PROJECT_DIR$/examples/generate_code.sh" beforeDir="false" afterPath="$PROJECT_DIR$/examples/booksToScrape/generate_code.sh" afterDir="false" />
19
+ <change beforePath="$PROJECT_DIR$/examples/go/booksToScrape.go" beforeDir="false" afterPath="$PROJECT_DIR$/examples/booksToScrape/go/booksToScrape.go" afterDir="false" />
20
+ <change beforePath="$PROJECT_DIR$/examples/go/main.go" beforeDir="false" afterPath="$PROJECT_DIR$/examples/booksToScrape/go/main.go" afterDir="false" />
21
+ <change beforePath="$PROJECT_DIR$/examples/js/booksToScrape.js" beforeDir="false" afterPath="$PROJECT_DIR$/examples/booksToScrape/js/booksToScrape.js" afterDir="false" />
22
+ <change beforePath="$PROJECT_DIR$/examples/js/main.js" beforeDir="false" afterPath="$PROJECT_DIR$/examples/booksToScrape/js/main.js" afterDir="false" />
23
+ <change beforePath="$PROJECT_DIR$/examples/manual_make.py" beforeDir="false" afterPath="$PROJECT_DIR$/examples/booksToScrape/manual_make.py" afterDir="false" />
24
+ <change beforePath="$PROJECT_DIR$/examples/python/booksToScrape.py" beforeDir="false" afterPath="$PROJECT_DIR$/examples/booksToScrape/python/booksToScrape.py" afterDir="false" />
25
+ <change beforePath="$PROJECT_DIR$/examples/python/main.py" beforeDir="false" afterPath="$PROJECT_DIR$/examples/booksToScrape/python/main.py" afterDir="false" />
26
+ <change beforePath="$PROJECT_DIR$/examples/runtime_compile.py" beforeDir="false" afterPath="$PROJECT_DIR$/examples/booksToScrape/runtime_compile.py" afterDir="false" />
27
+ <change beforePath="$PROJECT_DIR$/examples/schemas/booksToScrape.py" beforeDir="false" afterPath="$PROJECT_DIR$/examples/booksToScrape/schemas/booksToScrape.py" afterDir="false" />
28
+ <change beforePath="$PROJECT_DIR$/ssc_codegen/ast_builder.py" beforeDir="false" afterPath="$PROJECT_DIR$/ssc_codegen/ast_builder.py" afterDir="false" />
29
+ <change beforePath="$PROJECT_DIR$/tests/schema/test_sc_magic_methods.py" beforeDir="false" afterPath="$PROJECT_DIR$/tests/schema/test_sc_magic_methods.py" afterDir="false" />
14
30
  </list>
15
31
  <option name="SHOW_DIALOG" value="false" />
16
32
  <option name="HIGHLIGHT_CONFLICTS" value="true" />
@@ -88,6 +104,8 @@
88
104
  "Python tests.Python tests for test_buildin_converters.test_converter_impl.executor": "Run",
89
105
  "Python tests.Python tests for test_convert_query.test_convert_css_to_xpath.executor": "Run",
90
106
  "Python tests.Python tests for test_convert_query.test_convert_xpath_to_css.executor": "Run",
107
+ "Python tests.Python tests for test_default.test_invalid_default.executor": "Run",
108
+ "Python tests.Python tests for test_default_expr.test_invalid_default.executor": "Run",
91
109
  "Python tests.Python tests for test_document.test_expr.executor": "Run",
92
110
  "Python tests.Python tests for test_document.test_fail_attr_expr.executor": "Run",
93
111
  "Python tests.Python tests for test_document.test_valid_html_expr.executor": "Run",
@@ -113,6 +131,7 @@
113
131
  "Python tests.Python tests for test_sc_magic_methods.test_fail_schema_dict_key.executor": "Run",
114
132
  "Python tests.Python tests for test_sc_magic_methods.test_fail_schema_magic.executor": "Run",
115
133
  "Python tests.Python tests for test_sc_magic_methods.test_fail_schema_split_doc_ret_type.executor": "Run",
134
+ "Python tests.Python tests for test_sc_magic_methods.test_valid_dict_schema_key.executor": "Run",
116
135
  "Python tests.Python tests for test_sc_mro.test_schema_mro.executor": "Run",
117
136
  "Python tests.Python tests for test_select_document.test_valid_html_expr.executor": "Run",
118
137
  "Python tests.Python tests for test_selector_converters.test_convert_css_to_xpath.executor": "Run",
@@ -179,7 +198,7 @@
179
198
  "WebServerToolWindowFactoryState": "false",
180
199
  "dart.analysis.tool.window.visible": "false",
181
200
  "git-widget-placeholder": "main",
182
- "last_opened_file_path": "/home/georgiy/PycharmProjects/selector_schema_codegen/ssc_codegen/converters/ast_utils.py",
201
+ "last_opened_file_path": "/home/georgiy/PycharmProjects/selector_schema_codegen/examples",
183
202
  "node.js.detected.package.eslint": "true",
184
203
  "node.js.detected.package.tslint": "true",
185
204
  "node.js.selected.package.eslint": "(autodetect)",
@@ -194,22 +213,22 @@
194
213
  </component>
195
214
  <component name="RecentsManager">
196
215
  <key name="CopyFile.RECENT_KEYS">
216
+ <recent name="$PROJECT_DIR$/examples" />
197
217
  <recent name="$PROJECT_DIR$" />
198
218
  <recent name="$PROJECT_DIR$/examples/schemas/a" />
199
219
  <recent name="$PROJECT_DIR$/examples/schemas" />
200
220
  <recent name="$PROJECT_DIR$/scs" />
201
- <recent name="$PROJECT_DIR$/ssc_codegen/converters/templates/dart/universal_html" />
202
221
  </key>
203
222
  <key name="MoveFile.RECENT_KEYS">
223
+ <recent name="$PROJECT_DIR$/examples/booksToScrape" />
204
224
  <recent name="$PROJECT_DIR$/tests/schema" />
205
225
  <recent name="$PROJECT_DIR$/ssc_codegen/converters" />
206
226
  <recent name="$PROJECT_DIR$/examples" />
207
227
  <recent name="$PROJECT_DIR$/examples/python" />
208
- <recent name="$PROJECT_DIR$/tests/document" />
209
228
  </key>
210
229
  </component>
211
- <component name="RunManager" selected="Python tests.Python tests for test_buildin_converters.test_converter_impl">
212
- <configuration name="ex_extended" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
230
+ <component name="RunManager" selected="Python tests.Python tests for test_default_expr.test_invalid_default">
231
+ <configuration name="manual_make" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
213
232
  <module name="selector_schema_codegen" />
214
233
  <option name="ENV_FILES" value="" />
215
234
  <option name="INTERPRETER_OPTIONS" value="" />
@@ -223,7 +242,7 @@
223
242
  <option name="ADD_CONTENT_ROOTS" value="true" />
224
243
  <option name="ADD_SOURCE_ROOTS" value="true" />
225
244
  <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
226
- <option name="SCRIPT_NAME" value="$PROJECT_DIR$/examples/ex_extended.py" />
245
+ <option name="SCRIPT_NAME" value="$PROJECT_DIR$/examples/manual_make.py" />
227
246
  <option name="PARAMETERS" value="" />
228
247
  <option name="SHOW_COMMAND_LINE" value="false" />
229
248
  <option name="EMULATE_TERMINAL" value="false" />
@@ -232,84 +251,77 @@
232
251
  <option name="INPUT_FILE" value="" />
233
252
  <method v="2" />
234
253
  </configuration>
235
- <configuration name="o" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
254
+ <configuration name="Python tests for test_buildin_converters.test_converter_impl" type="tests" factoryName="Autodetect" temporary="true" nameIsGenerated="true">
236
255
  <module name="selector_schema_codegen" />
237
256
  <option name="ENV_FILES" value="" />
238
257
  <option name="INTERPRETER_OPTIONS" value="" />
239
258
  <option name="PARENT_ENVS" value="true" />
240
- <envs>
241
- <env name="PYTHONUNBUFFERED" value="1" />
242
- </envs>
243
259
  <option name="SDK_HOME" value="" />
244
- <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
260
+ <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/tests/converters" />
245
261
  <option name="IS_MODULE_SDK" value="true" />
246
262
  <option name="ADD_CONTENT_ROOTS" value="true" />
247
263
  <option name="ADD_SOURCE_ROOTS" value="true" />
248
264
  <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
249
- <option name="SCRIPT_NAME" value="$PROJECT_DIR$/o.py" />
250
- <option name="PARAMETERS" value="" />
251
- <option name="SHOW_COMMAND_LINE" value="false" />
252
- <option name="EMULATE_TERMINAL" value="false" />
253
- <option name="MODULE_MODE" value="false" />
254
- <option name="REDIRECT_INPUT" value="false" />
255
- <option name="INPUT_FILE" value="" />
265
+ <option name="_new_additionalArguments" value="&quot;&quot;" />
266
+ <option name="_new_target" value="&quot;test_buildin_converters.test_converter_impl&quot;" />
267
+ <option name="_new_targetType" value="&quot;PYTHON&quot;" />
256
268
  <method v="2" />
257
269
  </configuration>
258
- <configuration name="Python tests for test_buildin_converters.test_converter_impl" type="tests" factoryName="Autodetect" temporary="true" nameIsGenerated="true">
270
+ <configuration name="Python tests for test_default_expr.test_invalid_default" type="tests" factoryName="Autodetect" temporary="true" nameIsGenerated="true">
259
271
  <module name="selector_schema_codegen" />
260
272
  <option name="ENV_FILES" value="" />
261
273
  <option name="INTERPRETER_OPTIONS" value="" />
262
274
  <option name="PARENT_ENVS" value="true" />
263
275
  <option name="SDK_HOME" value="" />
264
- <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/tests/converters" />
276
+ <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/tests/schema" />
265
277
  <option name="IS_MODULE_SDK" value="true" />
266
278
  <option name="ADD_CONTENT_ROOTS" value="true" />
267
279
  <option name="ADD_SOURCE_ROOTS" value="true" />
268
280
  <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
269
281
  <option name="_new_additionalArguments" value="&quot;&quot;" />
270
- <option name="_new_target" value="&quot;test_buildin_converters.test_converter_impl&quot;" />
282
+ <option name="_new_target" value="&quot;test_default_expr.test_invalid_default&quot;" />
271
283
  <option name="_new_targetType" value="&quot;PYTHON&quot;" />
272
284
  <method v="2" />
273
285
  </configuration>
274
- <configuration name="Python tests for test_selector_converters.test_convert_css_to_xpath_tokens" type="tests" factoryName="Autodetect" temporary="true" nameIsGenerated="true">
286
+ <configuration name="Python tests for test_sc_magic_methods.test_valid_dict_schema_key" type="tests" factoryName="Autodetect" temporary="true" nameIsGenerated="true">
275
287
  <module name="selector_schema_codegen" />
276
288
  <option name="ENV_FILES" value="" />
277
289
  <option name="INTERPRETER_OPTIONS" value="" />
278
290
  <option name="PARENT_ENVS" value="true" />
279
291
  <option name="SDK_HOME" value="" />
280
- <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/tests/document" />
292
+ <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/tests/schema" />
281
293
  <option name="IS_MODULE_SDK" value="true" />
282
294
  <option name="ADD_CONTENT_ROOTS" value="true" />
283
295
  <option name="ADD_SOURCE_ROOTS" value="true" />
284
296
  <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
285
297
  <option name="_new_additionalArguments" value="&quot;&quot;" />
286
- <option name="_new_target" value="&quot;test_selector_converters.test_convert_css_to_xpath_tokens&quot;" />
298
+ <option name="_new_target" value="&quot;test_sc_magic_methods.test_valid_dict_schema_key&quot;" />
287
299
  <option name="_new_targetType" value="&quot;PYTHON&quot;" />
288
300
  <method v="2" />
289
301
  </configuration>
290
- <configuration name="Python tests for test_selector_converters.test_convert_xpath_to_css_tokens" type="tests" factoryName="Autodetect" temporary="true" nameIsGenerated="true">
302
+ <configuration name="Python tests for tests.schema.test_default_expr.test_invalid_default" type="tests" factoryName="Autodetect" temporary="true" nameIsGenerated="true">
291
303
  <module name="selector_schema_codegen" />
292
304
  <option name="ENV_FILES" value="" />
293
305
  <option name="INTERPRETER_OPTIONS" value="" />
294
306
  <option name="PARENT_ENVS" value="true" />
295
307
  <option name="SDK_HOME" value="" />
296
- <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/tests/document" />
308
+ <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/tests/schema" />
297
309
  <option name="IS_MODULE_SDK" value="true" />
298
310
  <option name="ADD_CONTENT_ROOTS" value="true" />
299
311
  <option name="ADD_SOURCE_ROOTS" value="true" />
300
312
  <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
301
313
  <option name="_new_additionalArguments" value="&quot;&quot;" />
302
- <option name="_new_target" value="&quot;test_selector_converters.test_convert_xpath_to_css_tokens&quot;" />
314
+ <option name="_new_target" value="&quot;tests.schema.test_default_expr.test_invalid_default&quot;" />
303
315
  <option name="_new_targetType" value="&quot;PYTHON&quot;" />
304
316
  <method v="2" />
305
317
  </configuration>
306
318
  <recent_temporary>
307
319
  <list>
320
+ <item itemvalue="Python tests.Python tests for test_default_expr.test_invalid_default" />
321
+ <item itemvalue="Python tests.Python tests for tests.schema.test_default_expr.test_invalid_default" />
322
+ <item itemvalue="Python tests.Python tests for test_sc_magic_methods.test_valid_dict_schema_key" />
323
+ <item itemvalue="Python.manual_make" />
308
324
  <item itemvalue="Python tests.Python tests for test_buildin_converters.test_converter_impl" />
309
- <item itemvalue="Python.o" />
310
- <item itemvalue="Python.ex_extended" />
311
- <item itemvalue="Python tests.Python tests for test_selector_converters.test_convert_xpath_to_css_tokens" />
312
- <item itemvalue="Python tests.Python tests for test_selector_converters.test_convert_css_to_xpath_tokens" />
313
325
  </list>
314
326
  </recent_temporary>
315
327
  </component>
@@ -394,47 +406,9 @@
394
406
  <workItem from="1738301565437" duration="8521000" />
395
407
  <workItem from="1738575037148" duration="22388000" />
396
408
  <workItem from="1738684052578" duration="6332000" />
397
- <workItem from="1738746990365" duration="27715000" />
398
- </task>
399
- <task id="LOCAL-00132" summary="mypy fix">
400
- <option name="closed" value="true" />
401
- <created>1738055157052</created>
402
- <option name="number" value="00132" />
403
- <option name="presentableId" value="LOCAL-00132" />
404
- <option name="project" value="LOCAL" />
405
- <updated>1738055157052</updated>
406
- </task>
407
- <task id="LOCAL-00133" summary="fix dart codegen">
408
- <option name="closed" value="true" />
409
- <created>1738067544204</created>
410
- <option name="number" value="00133" />
411
- <option name="presentableId" value="LOCAL-00133" />
412
- <option name="project" value="LOCAL" />
413
- <updated>1738067544205</updated>
414
- </task>
415
- <task id="LOCAL-00134" summary="fix XPATH js">
416
- <option name="closed" value="true" />
417
- <created>1738094439436</created>
418
- <option name="number" value="00134" />
419
- <option name="presentableId" value="LOCAL-00134" />
420
- <option name="project" value="LOCAL" />
421
- <updated>1738094439436</updated>
422
- </task>
423
- <task id="LOCAL-00135" summary="add test for converter utils, fix lowerCamelCase func">
424
- <option name="closed" value="true" />
425
- <created>1738231018899</created>
426
- <option name="number" value="00135" />
427
- <option name="presentableId" value="LOCAL-00135" />
428
- <option name="project" value="LOCAL" />
429
- <updated>1738231018900</updated>
430
- </task>
431
- <task id="LOCAL-00136" summary="CallStructFunctionExpression: fix have_default_expr method, DefaultValueWrapper: change accept_type, ret_type to VariableType.DOCUMENT">
432
- <option name="closed" value="true" />
433
- <created>1738231131458</created>
434
- <option name="number" value="00136" />
435
- <option name="presentableId" value="LOCAL-00136" />
436
- <option name="project" value="LOCAL" />
437
- <updated>1738231131458</updated>
409
+ <workItem from="1738746990365" duration="28527000" />
410
+ <workItem from="1738827918820" duration="143000" />
411
+ <workItem from="1738830292119" duration="2627000" />
438
412
  </task>
439
413
  <task id="LOCAL-00137" summary="SIGNATURE_MAP: add ANY, OPTIONAL_INT, OPTIONAL_LIST_INT, OPTIONAL_FLOAT, OPTIONAL_LIST_FLOAT">
440
414
  <option name="closed" value="true" />
@@ -788,7 +762,47 @@
788
762
  <option name="project" value="LOCAL" />
789
763
  <updated>1738794557342</updated>
790
764
  </task>
791
- <option name="localTasksCounter" value="181" />
765
+ <task id="LOCAL-00181" summary="rename modules">
766
+ <option name="closed" value="true" />
767
+ <created>1738794901438</created>
768
+ <option name="number" value="00181" />
769
+ <option name="presentableId" value="LOCAL-00181" />
770
+ <option name="project" value="LOCAL" />
771
+ <updated>1738794901438</updated>
772
+ </task>
773
+ <task id="LOCAL-00182" summary="ruff fmt">
774
+ <option name="closed" value="true" />
775
+ <created>1738794911350</created>
776
+ <option name="number" value="00182" />
777
+ <option name="presentableId" value="LOCAL-00182" />
778
+ <option name="project" value="LOCAL" />
779
+ <updated>1738794911350</updated>
780
+ </task>
781
+ <task id="LOCAL-00183" summary="bump">
782
+ <option name="closed" value="true" />
783
+ <created>1738794935313</created>
784
+ <option name="number" value="00183" />
785
+ <option name="presentableId" value="LOCAL-00183" />
786
+ <option name="project" value="LOCAL" />
787
+ <updated>1738794935313</updated>
788
+ </task>
789
+ <task id="LOCAL-00184" summary="TokenType.EXPR_LIST_JOIN: fix syntax">
790
+ <option name="closed" value="true" />
791
+ <created>1738830468062</created>
792
+ <option name="number" value="00184" />
793
+ <option name="presentableId" value="LOCAL-00184" />
794
+ <option name="project" value="LOCAL" />
795
+ <updated>1738830468062</updated>
796
+ </task>
797
+ <task id="LOCAL-00185" summary="bump">
798
+ <option name="closed" value="true" />
799
+ <created>1738830485847</created>
800
+ <option name="number" value="00185" />
801
+ <option name="presentableId" value="LOCAL-00185" />
802
+ <option name="project" value="LOCAL" />
803
+ <updated>1738830485847</updated>
804
+ </task>
805
+ <option name="localTasksCounter" value="186" />
792
806
  <servers />
793
807
  </component>
794
808
  <component name="TypeScriptGeneratedFilesManager">
@@ -806,9 +820,6 @@
806
820
  </option>
807
821
  </component>
808
822
  <component name="VcsManagerConfiguration">
809
- <MESSAGE value="dev: add httpx dep" />
810
- <MESSAGE value="update readme" />
811
- <MESSAGE value="add schema tests" />
812
823
  <MESSAGE value="add check stacks expr len, extract_default_expr check stack len&#10;throw error if stack is empty" />
813
824
  <MESSAGE value="refactoring: ast utils to another module" />
814
825
  <MESSAGE value="gen_go: add unimport function. fix typo --debug flag" />
@@ -826,12 +837,15 @@
826
837
  <MESSAGE value="add new schema factories, add new tests" />
827
838
  <MESSAGE value="Document marks: add optional default_value argument" />
828
839
  <MESSAGE value="ruff fix" />
829
- <MESSAGE value="bump" />
830
840
  <MESSAGE value="check: add run pytest&#10;fix: add ruff fix" />
831
841
  <MESSAGE value="ruff, mypy fix" />
832
842
  <MESSAGE value="js_pure:&#10;TokenType.EXPR_CSS_ALL:&#10;convert nodes to array&#10;&#10;TokenType.EXPR_RAW,TokenType.EXPR_TEXT:&#10;add check variable type document and node" />
833
843
  <MESSAGE value="add test converters implementation status" />
834
- <option name="LAST_COMMIT_MESSAGE" value="add test converters implementation status" />
844
+ <MESSAGE value="rename modules" />
845
+ <MESSAGE value="ruff fmt" />
846
+ <MESSAGE value="TokenType.EXPR_LIST_JOIN: fix syntax" />
847
+ <MESSAGE value="bump" />
848
+ <option name="LAST_COMMIT_MESSAGE" value="bump" />
835
849
  </component>
836
850
  <component name="XDebuggerManager">
837
851
  <breakpoint-manager>
@@ -857,7 +871,7 @@
857
871
  <option name="timeStamp" value="121" />
858
872
  </line-breakpoint>
859
873
  <line-breakpoint enabled="true" suspend="THREAD" type="python-line">
860
- <url>file://$PROJECT_DIR$/examples/python/main2.py</url>
874
+ <url>file://$PROJECT_DIR$/examples/booksToScrape/python/main2.py</url>
861
875
  <line>6</line>
862
876
  <option name="timeStamp" value="125" />
863
877
  </line-breakpoint>
@@ -867,10 +881,15 @@
867
881
  <option name="timeStamp" value="132" />
868
882
  </line-breakpoint>
869
883
  <line-breakpoint enabled="true" suspend="THREAD" type="python-line">
870
- <url>file://$PROJECT_DIR$/examples/ex_extended.py</url>
884
+ <url>file://$PROJECT_DIR$/examples/booksToScrape/ex_extended.py</url>
871
885
  <line>14</line>
872
886
  <option name="timeStamp" value="134" />
873
887
  </line-breakpoint>
888
+ <line-breakpoint enabled="true" suspend="THREAD" type="python-line">
889
+ <url>file://$PROJECT_DIR$/ssc_codegen/ast_builder.py</url>
890
+ <line>155</line>
891
+ <option name="timeStamp" value="137" />
892
+ </line-breakpoint>
874
893
  <line-breakpoint enabled="true" type="Dart">
875
894
  <url>file://$PROJECT_DIR$/dart_sscgen/bin/dart_sscgen.dart</url>
876
895
  <line>16</line>
@@ -880,12 +899,12 @@
880
899
  </breakpoint-manager>
881
900
  </component>
882
901
  <component name="com.intellij.coverage.CoverageDataManagerImpl">
883
- <SUITE FILE_PATH="coverage/selector_schema_codegen$.coverage" NAME=" Coverage Results" MODIFIED="1738791063058" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/tests/converters" />
902
+ <SUITE FILE_PATH="coverage/selector_schema_codegen$.coverage" NAME=" Coverage Results" MODIFIED="1738832894654" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/tests/schema" />
884
903
  <SUITE FILE_PATH="coverage/selector_schema_codegen$cli.coverage" NAME="cli Coverage Results" MODIFIED="1717347870433" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
885
904
  <SUITE FILE_PATH="coverage/selector_schema_codegen$schemas.coverage" NAME="schemas Coverage Results" MODIFIED="1714992167313" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/ssc_codegen/v2" />
886
905
  <SUITE FILE_PATH="coverage/selector_schema_codegen$ex_extended.coverage" NAME="ex_extended Coverage Results" MODIFIED="1738777474650" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/examples" />
887
- <SUITE FILE_PATH="coverage/selector_schema_codegen$calc_hash.coverage" NAME="calc_hash Coverage Results" MODIFIED="1718171677863" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/ssc_codegen/utils" />
888
906
  <SUITE FILE_PATH="coverage/selector_schema_codegen$extract.coverage" NAME="validate Coverage Results" MODIFIED="1706819346637" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/ssc_codegen2" />
907
+ <SUITE FILE_PATH="coverage/selector_schema_codegen$calc_hash.coverage" NAME="calc_hash Coverage Results" MODIFIED="1718171677863" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/ssc_codegen/utils" />
889
908
  <SUITE FILE_PATH="coverage/selector_schema_codegen$ast_ssc.coverage" NAME="ast_ssc Coverage Results" MODIFIED="1735321217497" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/ssc_codegen" />
890
909
  <SUITE FILE_PATH="coverage/selector_schema_codegen$translator.coverage" NAME="translator Coverage Results" MODIFIED="1707045679760" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/ssc_codegen2" />
891
910
  <SUITE FILE_PATH="coverage/selector_schema_codegen$constants.coverage" NAME="constants Coverage Results" MODIFIED="1717348468280" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/ssc_codegen2/schema" />
@@ -901,7 +920,7 @@
901
920
  <SUITE FILE_PATH="coverage/selector_schema_codegen$tg_mini.coverage" NAME="tg_mini Coverage Results" MODIFIED="1717771734055" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
902
921
  <SUITE FILE_PATH="coverage/selector_schema_codegen$expression.coverage" NAME="expression Coverage Results" MODIFIED="1715360828778" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/ssc_codegen2" />
903
922
  <SUITE FILE_PATH="coverage/selector_schema_codegen$animego_pro.coverage" NAME="animego_pro Coverage Results" MODIFIED="1717401685023" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/libanime_schema/source_v2/src" />
904
- <SUITE FILE_PATH="coverage/selector_schema_codegen$manual_make.coverage" NAME="manual_make Coverage Results" MODIFIED="1738237757130" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/examples" />
923
+ <SUITE FILE_PATH="coverage/selector_schema_codegen$manual_make.coverage" NAME="manual_make Coverage Results" MODIFIED="1738832322479" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/examples" />
905
924
  <SUITE FILE_PATH="coverage/selector_schema_codegen$__init__.coverage" NAME="__init__ Coverage Results" MODIFIED="1715378131584" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/ssc_codegen2/document" />
906
925
  <SUITE FILE_PATH="coverage/selector_schema_codegen$o.coverage" NAME="o Coverage Results" MODIFIED="1738787607226" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
907
926
  <SUITE FILE_PATH="coverage/selector_schema_codegen$aaaa.coverage" NAME="aaaa Coverage Results" MODIFIED="1717773815300" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
@@ -1,13 +1,13 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ssc_codegen
3
- Version: 0.5.3
3
+ Version: 0.5.5
4
4
  Summary: Add your description here
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
7
7
  Project-URL: Source, https://github.com/vypivshiy/selector_schema_codegen
8
8
  Project-URL: Examples, https://github.com/vypivshiy/selector_schema_codegen/examples
9
9
  License-File: LICENSE
10
- Requires-Python: >=3.12
10
+ Requires-Python: >=3.10
11
11
  Requires-Dist: cssselect>=1.2.0
12
12
  Requires-Dist: lxml>=5.3.0
13
13
  Requires-Dist: typer>=0.15.1
@@ -0,0 +1,7 @@
1
+ from ssc_codegen import D, N, DictSchema, ItemSchema, ListSchema
2
+
3
+
4
+ class Foo(DictSchema):
5
+ __SPLIT_DOC__ = D().css_all('b')
6
+ __KEY__ = D().default("null").attr("a")
7
+ __VALUE__ = D().default(None).attr("b")
@@ -1,4 +1,5 @@
1
1
  ssc-gen go schemas/booksToScrape.py -o go --package main
2
+ # OPTIONAL chose parser backend lib
2
3
  ssc-gen py schemas/booksToScrape.py -i parsel -o python
3
4
  ssc-gen js schemas/booksToScrape.py -o js
4
5
  ssc-gen dart schemas/booksToScrape.py -o dart
@@ -0,0 +1,14 @@
1
+ """example usage API interface"""
2
+ if __name__ == '__main__':
3
+ # base ast builder
4
+ from ssc_codegen.ast_builder import build_ast_module
5
+ # build-in converter
6
+ from ssc_codegen.converters.py_parsel import converter
7
+ # runtime import module and parse
8
+ # WARNING: DO NOT PASS UNKNOWN MODULES FOR SECURITY REASONS
9
+ # IT COMPILE AND EXEC PYTHON CODE FROM FILE IN RUNTIME
10
+ ast = build_ast_module(
11
+ 'a.py',
12
+ )
13
+ code = converter.convert_program(ast)
14
+ print("\n".join(code))
@@ -0,0 +1,23 @@
1
+ <!--synthetic html page for demonstare write schemas examples and tests in several cases-->
2
+ <!DOCTYPE html>
3
+ <html lang="en">
4
+ <head>
5
+ <meta charset="UTF-8">
6
+ <title>Demo page 1</title>
7
+ </head>
8
+ <body>
9
+ <!--simple items element-->
10
+ <div class="item-sc">
11
+ <p>item sc</p>
12
+ <a href="example.com">example page</a>
13
+
14
+ </div>
15
+ 1. simple item-sc tags
16
+ 2. simple list-sc tags
17
+ 3. simple dict-sc tags
18
+ 4. simple flatlist-sc tags
19
+
20
+ 5. nested item-sc tags + 2-4
21
+ 5. multi layered page
22
+ </body>
23
+ </html>
@@ -1,9 +1,9 @@
1
1
  [project]
2
2
  name = "ssc_codegen"
3
- version = "0.5.3"
3
+ version = "0.5.5"
4
4
  description = "Add your description here"
5
5
  readme = "README.md"
6
- requires-python = ">=3.12"
6
+ requires-python = ">=3.10"
7
7
  dependencies = [
8
8
  "cssselect>=1.2.0",
9
9
  "lxml>=5.3.0",
@@ -2,7 +2,7 @@ from .document import HTMLDocument, StringDocument, ArrayDocument, AssertDocumen
2
2
  NumericDocument
3
3
  from .schema import ItemSchema, DictSchema, ListSchema, FlatListSchema
4
4
 
5
- VERSION = "0.5.3"
5
+ VERSION = "0.5.5"
6
6
 
7
7
  class __MISSING(object):
8
8
  pass
@@ -79,6 +79,9 @@ def check_field_expr(field: BaseDocument) -> None:
79
79
  elif expr.accept_type == VariableType.ANY:
80
80
  var_cursor = VariableType.DOCUMENT
81
81
  continue
82
+ # end token operation, ignore
83
+ elif expr.kind == TokenType.EXPR_DEFAULT_END:
84
+ continue
82
85
  elif var_cursor == VariableType.NESTED:
83
86
  raise TypeError("sub_parser not allowed next instructions")
84
87
 
@@ -151,30 +154,27 @@ def _fill_stack_variables(
151
154
  ret_type = tmp_stack[-2].ret_type
152
155
  # used for convert return type
153
156
  if first_expr.value is None: # type: ignore[attr-defined]
154
- match ret_type:
155
- case VariableType.STRING:
156
- ret_type = VariableType.OPTIONAL_STRING
157
- case VariableType.LIST_STRING:
158
- ret_type = VariableType.OPTIONAL_LIST_STRING
159
- case VariableType.INT:
160
- ret_type = VariableType.OPTIONAL_INT
161
- case VariableType.LIST_INT:
162
- ret_type = VariableType.OPTIONAL_LIST_INT
163
- case VariableType.FLOAT:
164
- ret_type = VariableType.OPTIONAL_FLOAT
165
- case VariableType.LIST_FLOAT:
166
- ret_type = VariableType.OPTIONAL_LIST_FLOAT
167
- # ignore cast
168
- case t if t in (
169
- VariableType.NULL,
170
- VariableType.ANY,
171
- VariableType.NESTED,
172
- ):
173
- pass
174
- case _:
175
- raise TypeError(
176
- f"Unknown variable return type: {ret_type.name} {ret_type.name}"
177
- )
157
+ ret_type = _cast_ret_type_optional(ret_type)
158
+ # set DefaultEnd ret_type as DefaultStartToken
159
+ tmp_stack[-1].ret_type = ret_type
160
+ elif isinstance(first_expr.value, str): # type: ignore[attr-defined]
161
+ tmp_stack[-1].ret_type = VariableType.STRING
162
+ assert ret_type == VariableType.STRING, (
163
+ "wrong default type passed (should be a STRING or NULL)"
164
+ )
165
+ elif isinstance(first_expr.value, float): # type: ignore[attr-defined]
166
+ tmp_stack[-1].ret_type = VariableType.FLOAT
167
+ assert ret_type == VariableType.FLOAT, (
168
+ "wrong default type passed (should be a FLOAT or NULL)"
169
+ )
170
+ elif isinstance(first_expr.value, int): # type: ignore[attr-defined]
171
+ tmp_stack[-1].ret_type = VariableType.INT
172
+ assert ret_type == VariableType.INT, (
173
+ "wrong default type passed (should be a INT or NULL)"
174
+ )
175
+ else:
176
+ msg = f"{first_expr.value!r}<{type(first_expr.value).__name__}> default operation not support this type"
177
+ raise TypeError(msg)
178
178
 
179
179
  expr_count = len(tmp_stack)
180
180
  for i, expr in enumerate(tmp_stack):
@@ -202,6 +202,34 @@ def _fill_stack_variables(
202
202
  return tmp_stack
203
203
 
204
204
 
205
+ def _cast_ret_type_optional(ret_type):
206
+ match ret_type:
207
+ case VariableType.STRING:
208
+ ret_type = VariableType.OPTIONAL_STRING
209
+ case VariableType.LIST_STRING:
210
+ ret_type = VariableType.OPTIONAL_LIST_STRING
211
+ case VariableType.INT:
212
+ ret_type = VariableType.OPTIONAL_INT
213
+ case VariableType.LIST_INT:
214
+ ret_type = VariableType.OPTIONAL_LIST_INT
215
+ case VariableType.FLOAT:
216
+ ret_type = VariableType.OPTIONAL_FLOAT
217
+ case VariableType.LIST_FLOAT:
218
+ ret_type = VariableType.OPTIONAL_LIST_FLOAT
219
+ # ignore cast
220
+ case t if t in (
221
+ VariableType.NULL,
222
+ VariableType.ANY,
223
+ VariableType.NESTED,
224
+ ):
225
+ pass
226
+ case _:
227
+ raise TypeError(
228
+ f"Unknown variable return type: {ret_type.name} {ret_type.name}"
229
+ )
230
+ return ret_type
231
+
232
+
205
233
  # TODO: better typing?
206
234
  def replace_enum_values(item: Any) -> dict[str, Any] | list[Any] | str:
207
235
  """
@@ -337,11 +365,18 @@ def _check_split_doc_type(
337
365
  def _check_dict_schema_key_type(
338
366
  field: "BaseDocument", name: str, schema: Type[BaseSchema]
339
367
  ) -> None:
368
+ if schema.__SCHEMA_TYPE__ != StructType.DICT:
369
+ return
370
+ # corner case: default value is string, last return value - string
340
371
  if (
341
- schema.__SCHEMA_TYPE__ == StructType.DICT
342
- and name == "__KEY__"
343
- and field.stack_last_ret != VariableType.STRING
344
- ): # type: ignore
372
+ field.stack[0].kind == TokenType.EXPR_DEFAULT_START
373
+ and isinstance(field.stack[0].value, str)
374
+ and field.stack[-2].ret_type == VariableType.STRING
375
+ ):
376
+ return
377
+
378
+ elif name == "__KEY__" and field.stack_last_ret != VariableType.STRING: # type: ignore
379
+ # case: default value as string
345
380
  msg = f"{schema.__name__}.__KEY__ should be STRING, not {field.stack_last_ret.name}" # type: ignore
346
381
  raise TypeError(msg)
347
382
 
File without changes
@@ -422,7 +422,7 @@ def tt_join(node: JoinExpression) -> str:
422
422
 
423
423
  prv, nxt = lr_var_names(variable=node.variable)
424
424
  sep = repr(node.sep)
425
- code = py.BINDINGS[nxt, sep, prv]
425
+ code = py.BINDINGS[node.kind, nxt, sep, prv]
426
426
  return indent + code
427
427
 
428
428
 
@@ -0,0 +1,25 @@
1
+ from typing import Type
2
+
3
+ import pytest
4
+ from helpers import schema_item_factory
5
+
6
+ from ssc_codegen import D
7
+ from ssc_codegen.ast_builder import build_ast_struct
8
+ from ssc_codegen.schema import BaseSchema
9
+
10
+
11
+ @pytest.mark.parametrize(
12
+ "schema",
13
+ [
14
+ schema_item_factory(f=D().default(0).raw()),
15
+ schema_item_factory(f=D().default(0.1).raw()),
16
+ schema_item_factory(f=D().default("a").raw().to_int()),
17
+ schema_item_factory(f=D().default("a").raw().to_float()),
18
+ schema_item_factory(f=D().default(1).raw().to_float()),
19
+ schema_item_factory(f=D().default(0.1).raw().to_int()),
20
+ ],
21
+ )
22
+ def test_invalid_default(schema: Type["BaseSchema"]) -> None:
23
+ # TODO: replace exception as TypeError
24
+ with pytest.raises(AssertionError):
25
+ build_ast_struct(schema)
@@ -159,3 +159,16 @@ def test_fail_schema_dict_key(schema: Type["BaseSchema"]) -> None:
159
159
  def test_fail_document_value_type(schema: Type["BaseSchema"]) -> None:
160
160
  with pytest.raises(TypeError):
161
161
  build_ast_struct(schema)
162
+
163
+
164
+ @pytest.mark.parametrize(
165
+ "schema",
166
+ [
167
+ schema_dict_factory(
168
+ __SPLIT_DOC__=D().css_all("a"),
169
+ __KEY__=D().default("ok").attr("a"),
170
+ __VALUE__=R()),
171
+ ]
172
+ )
173
+ def test_valid_dict_schema_key(schema: Type["BaseSchema"]) -> None:
174
+ assert build_ast_struct(schema)
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