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.
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/MANIFEST.in +1 -0
- {msra_codegen-0.1.0/msra_codegen.egg-info → msra_codegen-0.1.1}/PKG-INFO +1 -1
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/__init__.py +1 -1
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/codegen_context.py +8 -7
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/node_export.js +3 -3
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/python_render.py +21 -16
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/function.py.tpl +6 -1
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/group.py.tpl +2 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/tests/api_test.py.tpl +8 -2
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/tests_generator.py +2 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1/msra_codegen.egg-info}/PKG-INFO +1 -1
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen.egg-info/SOURCES.txt +15 -1
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/pyproject.toml +1 -0
- msra_codegen-0.1.1/setup.py +42 -0
- msra_codegen-0.1.1/vscode-extension/lsp/analysis.js +456 -0
- msra_codegen-0.1.1/vscode-extension/lsp/assignment-relations.js +1256 -0
- msra_codegen-0.1.1/vscode-extension/lsp/assignment-schema.js +1580 -0
- msra_codegen-0.1.1/vscode-extension/lsp/cli.js +161 -0
- msra_codegen-0.1.1/vscode-extension/lsp/group-relations.js +96 -0
- msra_codegen-0.1.1/vscode-extension/lsp/model.js +376 -0
- msra_codegen-0.1.1/vscode-extension/lsp/parser.js +1223 -0
- msra_codegen-0.1.1/vscode-extension/lsp/path-schema.js +583 -0
- msra_codegen-0.1.1/vscode-extension/lsp/project-loader.js +282 -0
- msra_codegen-0.1.1/vscode-extension/lsp/reference-context.js +189 -0
- msra_codegen-0.1.1/vscode-extension/lsp/semantic-tokens.js +459 -0
- msra_codegen-0.1.1/vscode-extension/lsp/server.js +1290 -0
- msra_codegen-0.1.1/vscode-extension/lsp/table-relations.js +116 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/LICENSE +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/README.md +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/README.md +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/__main__.py +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/bridge.py +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/cli.py +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/config.toml +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/core_naming.py +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/docs_generator.py +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/file_utils.py +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/funcresult.py +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/generator.py +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/generator_config.py +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/github_workflows.py +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/gitignore.py +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/issue_templates.py +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/logo_assets.py +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/msra_serializer.py +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/package_metadata.py +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/package_writer.py +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/project_model.py +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/python_formatting.py +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/readme_pipeline.py +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/requirements.txt +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/template_engine.py +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/Makefile.tpl +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/README.md.tpl +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/abstraction/__init__.py.tpl +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/abstraction/regexes.py.tpl +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/docs/requirements.txt.tpl +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/docs/source/Makefile.tpl +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/docs/source/api.rst.tpl +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/docs/source/conf.py.tpl +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/docs/source/index.rst.tpl +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/docs/source/module.rst.tpl +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/docs/source/quick_start.rst.tpl +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/endpoints_init.py.tpl +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/example.py.tpl +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/github/issue_templates/bug_report.yml.tpl +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/github/issue_templates/config.yml.tpl +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/github/issue_templates/documentation_issue.yml.tpl +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/github/issue_templates/feature_request.yml.tpl +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/github/workflows/publish.yml.tpl +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/github/workflows/source-sync.yml.tpl +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/github/workflows/tests.yml.tpl +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/gitignore.tpl +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/group_init.py.tpl +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/init.py.tpl +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/licenses/GPL-3.0-or-later.txt.tpl +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/licenses/MIT.txt.tpl +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/manager.py.tpl +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/pyproject.toml.tpl +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/tests/conftest.py.tpl +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/templates/variable.py.tpl +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/typespec.py +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen/validation.py +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen.egg-info/dependency_links.txt +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen.egg-info/entry_points.txt +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen.egg-info/requires.txt +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/msra_codegen.egg-info/top_level.txt +0 -0
- {msra_codegen-0.1.0 → msra_codegen-0.1.1}/setup.cfg +0 -0
|
@@ -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, "
|
|
22
|
-
const { analyzeDocument } = require(path.resolve(__dirname, "
|
|
23
|
-
const { loadProject } = require(path.resolve(__dirname, "
|
|
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=
|
|
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(
|
|
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"
|
|
196
|
-
return "
|
|
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(
|
|
211
|
-
return "str(
|
|
212
|
-
return render_text_expr(expr, self_ref=
|
|
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=
|
|
215
|
-
return render_text_expr(expr, self_ref=
|
|
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
|
|
11
|
-
from human_requests import
|
|
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
|
|
@@ -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
|
|
@@ -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})
|