msra-codegen 0.1.0__tar.gz → 0.1.1__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 (88) hide show
  1. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/MANIFEST.in +1 -0
  2. {msra_codegen-0.1.0/msra_codegen.egg-info → msra_codegen-0.1.1}/PKG-INFO +1 -1
  3. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/__init__.py +1 -1
  4. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/codegen_context.py +8 -7
  5. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/node_export.js +3 -3
  6. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/python_render.py +21 -16
  7. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/function.py.tpl +6 -1
  8. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/group.py.tpl +2 -0
  9. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/tests/api_test.py.tpl +8 -2
  10. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/tests_generator.py +2 -0
  11. {msra_codegen-0.1.0 → msra_codegen-0.1.1/msra_codegen.egg-info}/PKG-INFO +1 -1
  12. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen.egg-info/SOURCES.txt +15 -1
  13. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/pyproject.toml +1 -0
  14. msra_codegen-0.1.1/setup.py +42 -0
  15. msra_codegen-0.1.1/vscode-extension/lsp/analysis.js +456 -0
  16. msra_codegen-0.1.1/vscode-extension/lsp/assignment-relations.js +1256 -0
  17. msra_codegen-0.1.1/vscode-extension/lsp/assignment-schema.js +1580 -0
  18. msra_codegen-0.1.1/vscode-extension/lsp/cli.js +161 -0
  19. msra_codegen-0.1.1/vscode-extension/lsp/group-relations.js +96 -0
  20. msra_codegen-0.1.1/vscode-extension/lsp/model.js +376 -0
  21. msra_codegen-0.1.1/vscode-extension/lsp/parser.js +1223 -0
  22. msra_codegen-0.1.1/vscode-extension/lsp/path-schema.js +583 -0
  23. msra_codegen-0.1.1/vscode-extension/lsp/project-loader.js +282 -0
  24. msra_codegen-0.1.1/vscode-extension/lsp/reference-context.js +189 -0
  25. msra_codegen-0.1.1/vscode-extension/lsp/semantic-tokens.js +459 -0
  26. msra_codegen-0.1.1/vscode-extension/lsp/server.js +1290 -0
  27. msra_codegen-0.1.1/vscode-extension/lsp/table-relations.js +116 -0
  28. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/LICENSE +0 -0
  29. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/README.md +0 -0
  30. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/README.md +0 -0
  31. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/__main__.py +0 -0
  32. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/bridge.py +0 -0
  33. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/cli.py +0 -0
  34. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/config.toml +0 -0
  35. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/core_naming.py +0 -0
  36. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/docs_generator.py +0 -0
  37. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/file_utils.py +0 -0
  38. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/funcresult.py +0 -0
  39. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/generator.py +0 -0
  40. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/generator_config.py +0 -0
  41. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/github_workflows.py +0 -0
  42. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/gitignore.py +0 -0
  43. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/issue_templates.py +0 -0
  44. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/logo_assets.py +0 -0
  45. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/msra_serializer.py +0 -0
  46. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/package_metadata.py +0 -0
  47. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/package_writer.py +0 -0
  48. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/project_model.py +0 -0
  49. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/python_formatting.py +0 -0
  50. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/readme_pipeline.py +0 -0
  51. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/requirements.txt +0 -0
  52. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/template_engine.py +0 -0
  53. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/Makefile.tpl +0 -0
  54. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/README.md.tpl +0 -0
  55. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/abstraction/__init__.py.tpl +0 -0
  56. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/abstraction/regexes.py.tpl +0 -0
  57. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/docs/requirements.txt.tpl +0 -0
  58. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/docs/source/Makefile.tpl +0 -0
  59. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/docs/source/api.rst.tpl +0 -0
  60. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/docs/source/conf.py.tpl +0 -0
  61. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/docs/source/index.rst.tpl +0 -0
  62. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/docs/source/module.rst.tpl +0 -0
  63. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/docs/source/quick_start.rst.tpl +0 -0
  64. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/endpoints_init.py.tpl +0 -0
  65. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/example.py.tpl +0 -0
  66. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/github/issue_templates/bug_report.yml.tpl +0 -0
  67. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/github/issue_templates/config.yml.tpl +0 -0
  68. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/github/issue_templates/documentation_issue.yml.tpl +0 -0
  69. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/github/issue_templates/feature_request.yml.tpl +0 -0
  70. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/github/workflows/publish.yml.tpl +0 -0
  71. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/github/workflows/source-sync.yml.tpl +0 -0
  72. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/github/workflows/tests.yml.tpl +0 -0
  73. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/gitignore.tpl +0 -0
  74. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/group_init.py.tpl +0 -0
  75. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/init.py.tpl +0 -0
  76. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/licenses/GPL-3.0-or-later.txt.tpl +0 -0
  77. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/licenses/MIT.txt.tpl +0 -0
  78. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/manager.py.tpl +0 -0
  79. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/pyproject.toml.tpl +0 -0
  80. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/tests/conftest.py.tpl +0 -0
  81. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/variable.py.tpl +0 -0
  82. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/typespec.py +0 -0
  83. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/validation.py +0 -0
  84. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen.egg-info/dependency_links.txt +0 -0
  85. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen.egg-info/entry_points.txt +0 -0
  86. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen.egg-info/requires.txt +0 -0
  87. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen.egg-info/top_level.txt +0 -0
  88. {msra_codegen-0.1.0 → msra_codegen-0.1.1}/setup.cfg +0 -0
@@ -4,4 +4,5 @@ include msra_codegen/README.md
4
4
  include msra_codegen/requirements.txt
5
5
  include msra_codegen/config.toml
6
6
  include msra_codegen/node_export.js
7
+ recursive-include vscode-extension/lsp *.js
7
8
  recursive-include msra_codegen/templates *.tpl
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: msra-codegen
3
- Version: 0.1.0
3
+ Version: 0.1.1
4
4
  Summary: MSRA to async Python client generator
5
5
  License-Expression: GPL-3.0-or-later
6
6
  Project-URL: Homepage, https://github.com/Open-Inflation/engine-reverse-ide
@@ -3,4 +3,4 @@
3
3
  from .package_writer import generate_project
4
4
 
5
5
  __all__ = ["generate_project"]
6
- __version__ = "0.1.0"
6
+ __version__ = "0.1.1"
@@ -1106,10 +1106,10 @@ def build_function_context(
1106
1106
  "overload_specialization_code": overload_specialization_code,
1107
1107
  "overload_validation_code": overload_validation_code,
1108
1108
  "request": {
1109
- "referrer_expr": render_request_referrer(headers_spec),
1109
+ "referrer_expr": render_request_referrer(headers_spec, self_ref="self._parent"),
1110
1110
  "cors_mode_expr": render_request_cors_mode(headers_spec, default_if_missing=False),
1111
1111
  "credentials_expr": render_request_credentials(headers_spec, default_if_missing=False),
1112
- "headers_expr": render_request_headers(headers_spec, default_if_missing=False),
1112
+ "headers_expr": render_request_headers(headers_spec, default_if_missing=False, self_ref="self._parent"),
1113
1113
  },
1114
1114
  "body_expr": render_expr(body.get("from"), self_ref="self._parent") if body else None,
1115
1115
  "body_type": body.get("type") if body else None,
@@ -1206,6 +1206,7 @@ def build_query_param_context(func: dict[str, Any]) -> list[dict[str, Any]]:
1206
1206
  "list_style_indexed": bool(list_style.get("indexed", False)),
1207
1207
  "temp_name": f"_{normalize_name(param_name)}_value",
1208
1208
  "temp_list_name": f"_{normalize_name(param_name)}_values",
1209
+ "temp_list_annotation": None,
1209
1210
  }
1210
1211
  if const_expr is not None:
1211
1212
  item["kind"] = "literal"
@@ -1222,6 +1223,8 @@ def build_query_param_context(func: dict[str, Any]) -> list[dict[str, Any]]:
1222
1223
  default_entries = [entry for entry in values if entry.get("default")]
1223
1224
  if selectable_entries:
1224
1225
  item["has_value_map"] = True
1226
+ if item["is_list"]:
1227
+ item["temp_list_annotation"] = "list[str] | None"
1225
1228
  item["selectable_values_expr"] = render_simple_value([entry["value"] for entry in selectable_entries])
1226
1229
  item["value_map_expr"] = render_simple_value(
1227
1230
  {entry["value"]: entry["value_in_url"] for entry in selectable_entries}
@@ -1410,10 +1413,10 @@ def build_manager_context(
1410
1413
  "script_function": warmup_script.get("function") if warmup_script else None,
1411
1414
  },
1412
1415
  "request": {
1413
- "referrer_expr": render_request_referrer(headers_spec),
1416
+ "referrer_expr": render_request_referrer(headers_spec, self_ref="self"),
1414
1417
  "cors_mode_expr": render_request_cors_mode(headers_spec, default_if_missing=True),
1415
1418
  "credentials_expr": render_request_credentials(headers_spec, default_if_missing=True),
1416
- "headers_expr": render_request_headers(headers_spec, default_if_missing=True),
1419
+ "headers_expr": render_request_headers(headers_spec, default_if_missing=True, self_ref="self"),
1417
1420
  },
1418
1421
  }
1419
1422
 
@@ -1669,9 +1672,7 @@ def render_input_annotation(input_spec: dict[str, Any]) -> str:
1669
1672
  values = selectable_values_from_plain_values(values)
1670
1673
  if input_spec.get("match") is None and values:
1671
1674
  literal_values = ", ".join(render_simple_value(item) for item in values)
1672
- if base.startswith("list[") and base.endswith("]"):
1673
- base = f"list[Literal[{literal_values}]]"
1674
- else:
1675
+ if not (base.startswith("list[") and base.endswith("]")):
1675
1676
  base = f"Literal[{literal_values}]"
1676
1677
  default_expr = input_spec.get("default")
1677
1678
  has_explicit_default = default_expr is not None and get_plain_value(default_expr) is not None
@@ -18,9 +18,9 @@ const {
18
18
  RefSegment,
19
19
  SequenceExpr,
20
20
  StringExpr,
21
- } = require(path.resolve(__dirname, "..", "vscode-extension", "lsp", "model"));
22
- const { analyzeDocument } = require(path.resolve(__dirname, "..", "vscode-extension", "lsp", "analysis"));
23
- const { loadProject } = require(path.resolve(__dirname, "..", "vscode-extension", "lsp", "project-loader"));
21
+ } = require(path.resolve(__dirname, "vscode-extension", "lsp", "model"));
22
+ const { analyzeDocument } = require(path.resolve(__dirname, "vscode-extension", "lsp", "analysis"));
23
+ const { loadProject } = require(path.resolve(__dirname, "vscode-extension", "lsp", "project-loader"));
24
24
 
25
25
  function serializePosition(position) {
26
26
  if (!position) {
@@ -30,10 +30,10 @@ def escape_regex_literal(text: str) -> str:
30
30
  return text.replace("\\", "\\\\").replace('"', '\\"')
31
31
 
32
32
 
33
- def render_request_referrer(headers_spec: dict[str, Any] | None) -> str | None:
33
+ def render_request_referrer(headers_spec: dict[str, Any] | None, *, self_ref: str = "self") -> str | None:
34
34
  if not headers_spec or headers_spec.get("referrer") is None:
35
35
  return None
36
- return render_ref_value(headers_spec.get("referrer"), self_ref="self")
36
+ return render_ref_value(headers_spec.get("referrer"), self_ref=self_ref)
37
37
 
38
38
 
39
39
  def render_request_cors_mode(headers_spec: dict[str, Any] | None, *, default_if_missing: bool) -> str | None:
@@ -48,11 +48,16 @@ def render_request_credentials(headers_spec: dict[str, Any] | None, *, default_i
48
48
  return render_simple_value(get_plain_value(headers_spec.get("credentials")))
49
49
 
50
50
 
51
- def render_request_headers(headers_spec: dict[str, Any] | None, *, default_if_missing: bool) -> str | None:
51
+ def render_request_headers(
52
+ headers_spec: dict[str, Any] | None,
53
+ *,
54
+ default_if_missing: bool,
55
+ self_ref: str = "self",
56
+ ) -> str | None:
52
57
  base = '{"Accept": "application/json, text/plain, */*"}'
53
58
  if not headers_spec or headers_spec.get("headers") is None:
54
59
  return base if default_if_missing else None
55
- return render_headers_expr(headers_spec.get("headers"))
60
+ return render_headers_expr(headers_spec.get("headers"), self_ref=self_ref)
56
61
 
57
62
 
58
63
  def wait_source_expr(source: Any) -> str:
@@ -175,29 +180,29 @@ def render_text_expr(expr: dict[str, Any] | None, self_ref: str = "self._parent"
175
180
  return render_expr(expr, self_ref=self_ref)
176
181
 
177
182
 
178
- def render_headers_expr(expr: dict[str, Any] | None) -> str:
183
+ def render_headers_expr(expr: dict[str, Any] | None, *, self_ref: str = "self") -> str:
179
184
  if expr is None:
180
185
  return "None"
181
186
  if not isinstance(expr, dict):
182
187
  return render_simple_value(expr)
183
188
  kind = expr.get("kind")
184
189
  if kind == "merge":
185
- return " | ".join(render_headers_expr(part) for part in expr.get("parts", []))
190
+ return " | ".join(render_headers_expr(part, self_ref=self_ref) for part in expr.get("parts", []))
186
191
  if kind == "inline_table":
187
192
  return "{" + ", ".join(
188
- f"{render_simple_value(item['key'])}: {render_headers_value(item['value'])}"
193
+ f"{render_simple_value(item['key'])}: {render_headers_value(item['value'], self_ref=self_ref)}"
189
194
  for item in expr.get("items", [])
190
195
  ) + "}"
191
196
  if kind == "ref":
192
197
  parts = [part["value"] for part in expr.get("parts", []) if part.get("kind") == "name"]
193
198
  if parts and parts[0] == "UNSTANDARD_HEADERS":
194
199
  if len(parts) >= 3 and parts[1] == "REQUEST":
195
- return f"self.unstandard_headers.get({render_simple_value(parts[2])})"
196
- return "self.unstandard_headers"
197
- return render_headers_value(expr)
200
+ return f"{self_ref}.unstandard_headers.get({render_simple_value(parts[2])})"
201
+ return f"{self_ref}.unstandard_headers"
202
+ return render_headers_value(expr, self_ref=self_ref)
198
203
 
199
204
 
200
- def render_headers_value(expr: dict[str, Any] | None) -> str:
205
+ def render_headers_value(expr: dict[str, Any] | None, *, self_ref: str = "self") -> str:
201
206
  if expr is None:
202
207
  return "None"
203
208
  if not isinstance(expr, dict):
@@ -207,12 +212,12 @@ def render_headers_value(expr: dict[str, Any] | None) -> str:
207
212
  parts = [part["value"] for part in expr.get("parts", []) if part.get("kind") == "name"]
208
213
  if parts and parts[0] == "UNSTANDARD_HEADERS":
209
214
  if len(parts) >= 3 and parts[1] == "REQUEST":
210
- return f"str(self.unstandard_headers.get({render_simple_value(parts[2])}))"
211
- return "str(self.unstandard_headers)"
212
- return render_text_expr(expr, self_ref="self")
215
+ return f"str({self_ref}.unstandard_headers.get({render_simple_value(parts[2])}))"
216
+ return f"str({self_ref}.unstandard_headers)"
217
+ return render_text_expr(expr, self_ref=self_ref)
213
218
  if kind in {"string", "number", "bool", "null"}:
214
- return render_text_expr(expr, self_ref="self")
215
- return render_text_expr(expr, self_ref="self")
219
+ return render_text_expr(expr, self_ref=self_ref)
220
+ return render_text_expr(expr, self_ref=self_ref)
216
221
 
217
222
 
218
223
  def get_plain_value(expr: dict[str, Any] | None) -> Any:
@@ -172,7 +172,12 @@
172
172
  {% for param in query_params %}
173
173
  {% if param.kind == "from" and param.has_value_map %}
174
174
  {% if param.is_list %}
175
+ {% if param.temp_list_annotation %}
176
+ {{ param.temp_name }} = {{ param.source_expr }}
177
+ {{ param.temp_list_name }}: {{ param.temp_list_annotation }} = [str(__item) for __item in {{ param.temp_name }}] if {{ param.temp_name }} is not None else None
178
+ {% else %}
175
179
  {{ param.temp_list_name }} = {{ param.source_expr }}
180
+ {% endif %}
176
181
  if {{ param.temp_list_name }} in (None, []):
177
182
  {{ param.temp_list_name }} = {{ param.default_values_expr if param.default_values_expr is not none else "[]" }}
178
183
  elif not isinstance({{ param.temp_list_name }}, list):
@@ -181,7 +186,7 @@
181
186
  for __item in {{ param.temp_list_name }}:
182
187
  if __item not in {{ param.selectable_values_expr }}:
183
188
  raise ValueError("`{{ param.source_name }}` must be one of {{ param.selectable_values_expr }}")
184
- {{ param.temp_list_name }} = [{{ param.value_map_expr }}[__item] for __item in {{ param.temp_list_name }}]
189
+ {{ param.temp_list_name }} = [str({{ param.value_map_expr }}[__item]) for __item in {{ param.temp_list_name }}]
185
190
  if {{ param.temp_list_name }}:
186
191
  {% if param.list_style_style == "repeat" %}
187
192
  query_params.append(({{ param.name_expr }}, {{ param.temp_list_name }}))
@@ -30,7 +30,9 @@ from human_requests.abstraction import HttpMethod
30
30
  from human_requests.abstraction import MethodPipelineError
31
31
  {% endif %}
32
32
 
33
+ {% if functions %}
33
34
  from {{ root_import_prefix }} import abstraction
35
+ {% endif %}
34
36
  {% for child in child_imports %}
35
37
  from .{{ child.package_name }} import {{ child.class_name }}
36
38
  {% endfor %}
@@ -7,8 +7,14 @@ from typing import TYPE_CHECKING
7
7
  {% if providers %}
8
8
  import pytest
9
9
  {% endif %}
10
- {% if hooks or providers %}
11
- from human_requests import autotest_depends_on, autotest_hook, autotest_params
10
+ {% if hooks %}
11
+ from human_requests import autotest_hook
12
+ {% endif %}
13
+ {% if providers %}
14
+ from human_requests import autotest_params
15
+ {% endif %}
16
+ {% if has_provider_dependencies %}
17
+ from human_requests import autotest_depends_on
12
18
  {% endif %}
13
19
  {% if data_cases %}
14
20
  from human_requests import autotest_data
@@ -95,6 +95,7 @@ def build_tests_project_context(project: dict[str, Any], package_name: str) -> d
95
95
  "imports": build_test_import_map(autotest_cases),
96
96
  "hooks": [case for case in autotest_cases if case["hook_code"]],
97
97
  "providers": autotest_cases,
98
+ "has_provider_dependencies": any(case["dependencies"] for case in autotest_cases),
98
99
  "data_cases": data_cases,
99
100
  "manual_tests": manual_cases,
100
101
  },
@@ -290,6 +291,7 @@ def build_autotest_cases(
290
291
  "class_name": class_name_for_group(group_path_for_function(func)),
291
292
  "hook_code": hook_code,
292
293
  "provider_code": provider_code,
294
+ "dependencies": dependency_targets,
293
295
  }
294
296
  )
295
297
  return cases
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: msra-codegen
3
- Version: 0.1.0
3
+ Version: 0.1.1
4
4
  Summary: MSRA to async Python client generator
5
5
  License-Expression: GPL-3.0-or-later
6
6
  Project-URL: Homepage, https://github.com/Open-Inflation/engine-reverse-ide
@@ -2,6 +2,7 @@ LICENSE
2
2
  MANIFEST.in
3
3
  README.md
4
4
  pyproject.toml
5
+ setup.py
5
6
  msra_codegen/README.md
6
7
  msra_codegen/__init__.py
7
8
  msra_codegen/__main__.py
@@ -69,4 +70,17 @@ msra_codegen/templates/github/workflows/tests.yml.tpl
69
70
  msra_codegen/templates/licenses/GPL-3.0-or-later.txt.tpl
70
71
  msra_codegen/templates/licenses/MIT.txt.tpl
71
72
  msra_codegen/templates/tests/api_test.py.tpl
72
- msra_codegen/templates/tests/conftest.py.tpl
73
+ msra_codegen/templates/tests/conftest.py.tpl
74
+ vscode-extension/lsp/analysis.js
75
+ vscode-extension/lsp/assignment-relations.js
76
+ vscode-extension/lsp/assignment-schema.js
77
+ vscode-extension/lsp/cli.js
78
+ vscode-extension/lsp/group-relations.js
79
+ vscode-extension/lsp/model.js
80
+ vscode-extension/lsp/parser.js
81
+ vscode-extension/lsp/path-schema.js
82
+ vscode-extension/lsp/project-loader.js
83
+ vscode-extension/lsp/reference-context.js
84
+ vscode-extension/lsp/semantic-tokens.js
85
+ vscode-extension/lsp/server.js
86
+ vscode-extension/lsp/table-relations.js
@@ -41,6 +41,7 @@ dependencies = { file = ["msra_codegen/requirements.txt"] }
41
41
  msra_codegen = [
42
42
  "config.toml",
43
43
  "node_export.js",
44
+ "vscode-extension/lsp/*.js",
44
45
  "templates/*.tpl",
45
46
  "templates/*/*.tpl",
46
47
  "templates/*/*/*.tpl",
@@ -0,0 +1,42 @@
1
+ from __future__ import annotations
2
+
3
+ import shutil
4
+ from pathlib import Path
5
+
6
+ from setuptools import setup
7
+ from setuptools.command.build_py import build_py as _build_py
8
+
9
+
10
+ class build_py(_build_py):
11
+ def run(self) -> None:
12
+ self._vscode_lsp_output_files: list[str] = []
13
+ self._vscode_lsp_output_mapping: dict[str, str] = {}
14
+ super().run()
15
+ self._copy_vscode_lsp_assets()
16
+
17
+ def get_outputs(self): # type: ignore[override]
18
+ outputs = list(super().get_outputs())
19
+ outputs.extend(getattr(self, "_vscode_lsp_output_files", []))
20
+ return outputs
21
+
22
+ def get_output_mapping(self): # type: ignore[override]
23
+ mapping = dict(super().get_output_mapping())
24
+ mapping.update(getattr(self, "_vscode_lsp_output_mapping", {}))
25
+ return mapping
26
+
27
+ def _copy_vscode_lsp_assets(self) -> None:
28
+ source_root = Path(__file__).resolve().parent / "vscode-extension" / "lsp"
29
+ if not source_root.exists():
30
+ raise FileNotFoundError(source_root)
31
+
32
+ target_root = Path(self.build_lib) / "msra_codegen" / "vscode-extension" / "lsp"
33
+ self.mkpath(str(target_root))
34
+ for source_file in source_root.glob("*.js"):
35
+ target_file = target_root / source_file.name
36
+ shutil.copy2(source_file, target_file)
37
+ target_output = str(target_file)
38
+ self._vscode_lsp_output_files.append(target_output)
39
+ self._vscode_lsp_output_mapping[target_output] = str(source_file)
40
+
41
+
42
+ setup(cmdclass={"build_py": build_py})