ssc_codegen 0.19.2__tar.gz → 0.19.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 (60) hide show
  1. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/PKG-INFO +1 -1
  2. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/pyproject.toml +1 -1
  3. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/parsers/curl.py +2 -2
  4. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/parsers/spec.py +23 -1
  5. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/.gitignore +0 -0
  6. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/LICENSE +0 -0
  7. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/README.md +0 -0
  8. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/__init__.py +0 -0
  9. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/_logging.py +0 -0
  10. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/ast/__init__.py +0 -0
  11. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/ast/array.py +0 -0
  12. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/ast/base.py +0 -0
  13. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/ast/cast.py +0 -0
  14. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/ast/control.py +0 -0
  15. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/ast/extract.py +0 -0
  16. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/ast/helpers.py +0 -0
  17. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/ast/jsondef.py +0 -0
  18. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/ast/module.py +0 -0
  19. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/ast/predicate_containers.py +0 -0
  20. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/ast/predicate_ops.py +0 -0
  21. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/ast/regex.py +0 -0
  22. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/ast/selectors.py +0 -0
  23. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/ast/string.py +0 -0
  24. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/ast/struct.py +0 -0
  25. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/ast/transform.py +0 -0
  26. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/ast/typedef.py +0 -0
  27. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/ast/types.py +0 -0
  28. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/converters/base.py +0 -0
  29. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/converters/go_goquery.py +0 -0
  30. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/converters/helpers.py +0 -0
  31. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/converters/js_pure.py +0 -0
  32. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/converters/py_bs4.py +0 -0
  33. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/converters/py_lxml.py +0 -0
  34. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/converters/py_parsel.py +0 -0
  35. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/converters/py_slax.py +0 -0
  36. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/document_utils.py +0 -0
  37. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/exceptions.py +0 -0
  38. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/health.py +0 -0
  39. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/kdl/__init__.py +0 -0
  40. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/kdl/parser.py +0 -0
  41. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/linter/__init__.py +0 -0
  42. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/linter/_kdl_lang.py +0 -0
  43. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/linter/base.py +0 -0
  44. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/linter/errors.py +0 -0
  45. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/linter/format_errors.py +0 -0
  46. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/linter/metadata.py +0 -0
  47. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/linter/navigation.py +0 -0
  48. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/linter/path.py +0 -0
  49. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/linter/rule_keywords.py +0 -0
  50. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/linter/rules.py +0 -0
  51. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/linter/rules_struct.py +0 -0
  52. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/linter/type_rules.py +0 -0
  53. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/linter/types.py +0 -0
  54. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/main.py +0 -0
  55. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/parser.py +0 -0
  56. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/parsers/__init__.py +0 -0
  57. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/parsers/http.py +0 -0
  58. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/pseudo_selectors.py +0 -0
  59. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/ssc_codegen/regex_utils.py +0 -0
  60. {ssc_codegen-0.19.2 → ssc_codegen-0.19.4}/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.19.2
3
+ Version: 0.19.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
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "ssc_codegen"
3
- version = "0.19.2"
3
+ version = "0.19.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"
@@ -97,10 +97,10 @@ def parse_curl_to_httpx_kwargs(
97
97
  raise ValueError(f"Invalid header format: {header}")
98
98
  key, value = header.split(":", 1)
99
99
  headers[key.strip()] = value.strip()
100
- elif part in ("-d", "--data"):
100
+ elif part in ("-d", "--data", "--data-raw"):
101
101
  i += 1
102
102
  if i >= len(parts):
103
- raise ValueError("Missing data after -d/--data")
103
+ raise ValueError("Missing data after -d/--data/--data-raw")
104
104
  data = parts[i]
105
105
  elif part == "--json":
106
106
  i += 1
@@ -146,6 +146,9 @@ def parse_to_spec(payload: str) -> RequestSpec:
146
146
  body = kwargs[
147
147
  "data"
148
148
  ] # dict with original values (may have placeholders)
149
+ elif "application/x-www-form-urlencoded" in content_type:
150
+ body_kind = "form"
151
+ body = _parse_urlencoded_body(raw_body)
149
152
  else:
150
153
  body_kind = "raw"
151
154
  body = raw_body
@@ -174,12 +177,31 @@ def _curl_raw_body(payload: str) -> str:
174
177
  parts = shlex.split(payload.strip())[1:] # drop "curl"
175
178
  i = 0
176
179
  while i < len(parts):
177
- if parts[i] in ("-d", "--data", "--json") and i + 1 < len(parts):
180
+ if parts[i] in ("-d", "--data", "--data-raw", "--json") and i + 1 < len(parts):
178
181
  return parts[i + 1]
179
182
  i += 1
180
183
  return ""
181
184
 
182
185
 
186
+ def _parse_urlencoded_body(raw: str) -> dict[str, str]:
187
+ """Split an application/x-www-form-urlencoded body into a dict.
188
+
189
+ Preserves ``{{placeholders}}`` intact; URL-decodes everything else so the
190
+ target HTTP client can re-encode without double-encoding.
191
+ """
192
+ from urllib.parse import unquote_plus
193
+
194
+ out: dict[str, str] = {}
195
+ if not raw:
196
+ return out
197
+ for pair in raw.split("&"):
198
+ if not pair:
199
+ continue
200
+ key, sep, value = pair.partition("=")
201
+ out[unquote_plus(key)] = unquote_plus(value) if sep else ""
202
+ return out
203
+
204
+
183
205
  def _http_raw_body(payload: str) -> str:
184
206
  lines = payload.strip().splitlines()
185
207
  i = 1
File without changes
File without changes
File without changes