@azure-tools/typespec-python 0.29.0 → 0.30.0

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 (74) hide show
  1. package/dist/scripts/eng/format.d.ts +2 -0
  2. package/dist/scripts/eng/format.d.ts.map +1 -0
  3. package/dist/scripts/eng/format.js +4 -0
  4. package/dist/scripts/eng/format.js.map +1 -0
  5. package/dist/scripts/eng/lint.d.ts +5 -0
  6. package/dist/scripts/eng/lint.d.ts.map +1 -0
  7. package/dist/scripts/eng/lint.js +66 -0
  8. package/dist/scripts/eng/lint.js.map +1 -0
  9. package/dist/scripts/{regenerate.d.ts.map → eng/regenerate.d.ts.map} +1 -1
  10. package/dist/scripts/{regenerate.js → eng/regenerate.js} +27 -23
  11. package/dist/scripts/eng/regenerate.js.map +1 -0
  12. package/dist/scripts/{run-tests.d.ts.map → eng/run-tests.d.ts.map} +1 -1
  13. package/dist/scripts/{run-tests.js → eng/run-tests.js} +26 -5
  14. package/dist/scripts/eng/run-tests.js.map +1 -0
  15. package/dist/scripts/eng/utils.d.ts +3 -0
  16. package/dist/scripts/eng/utils.d.ts.map +1 -0
  17. package/dist/scripts/eng/utils.js +39 -0
  18. package/dist/scripts/eng/utils.js.map +1 -0
  19. package/dist/src/code-model.d.ts.map +1 -1
  20. package/dist/src/code-model.js +4 -1
  21. package/dist/src/code-model.js.map +1 -1
  22. package/dist/src/emitter.d.ts.map +1 -1
  23. package/dist/src/emitter.js +14 -3
  24. package/dist/src/emitter.js.map +1 -1
  25. package/dist/src/http.js +14 -8
  26. package/dist/src/http.js.map +1 -1
  27. package/dist/src/lib.d.ts +1 -0
  28. package/dist/src/lib.d.ts.map +1 -1
  29. package/dist/src/lib.js +1 -0
  30. package/dist/src/lib.js.map +1 -1
  31. package/dist/src/types.d.ts +1 -1
  32. package/dist/src/types.d.ts.map +1 -1
  33. package/dist/src/types.js +5 -5
  34. package/dist/src/types.js.map +1 -1
  35. package/dist/src/utils.d.ts +2 -2
  36. package/dist/src/utils.d.ts.map +1 -1
  37. package/dist/src/utils.js +5 -5
  38. package/dist/src/utils.js.map +1 -1
  39. package/generator/pygen/black.py +2 -3
  40. package/generator/pygen/codegen/models/combined_type.py +1 -1
  41. package/generator/pygen/codegen/models/credential_types.py +7 -14
  42. package/generator/pygen/codegen/models/enum_type.py +1 -1
  43. package/generator/pygen/codegen/models/lro_operation.py +0 -1
  44. package/generator/pygen/codegen/models/lro_paging_operation.py +1 -1
  45. package/generator/pygen/codegen/models/model_type.py +5 -7
  46. package/generator/pygen/codegen/models/paging_operation.py +0 -1
  47. package/generator/pygen/codegen/models/parameter_list.py +2 -5
  48. package/generator/pygen/codegen/models/primitive_types.py +9 -3
  49. package/generator/pygen/codegen/serializers/__init__.py +1 -1
  50. package/generator/pygen/codegen/serializers/builder_serializer.py +10 -11
  51. package/generator/pygen/codegen/serializers/general_serializer.py +2 -1
  52. package/generator/pygen/codegen/serializers/sample_serializer.py +1 -3
  53. package/generator/pygen/codegen/templates/model_base.py.jinja2 +6 -0
  54. package/generator/pygen/m2r.py +1 -1
  55. package/generator/pygen/postprocess/__init__.py +2 -2
  56. package/generator/pygen/postprocess/venvtools.py +1 -3
  57. package/generator/pygen/preprocess/__init__.py +1 -1
  58. package/generator/pygen/utils.py +1 -3
  59. package/generator/setup.py +1 -1
  60. package/package.json +10 -8
  61. package/scripts/__pycache__/venvtools.cpython-310.pyc +0 -0
  62. package/scripts/eng/format.ts +5 -0
  63. package/scripts/eng/lint.ts +75 -0
  64. package/scripts/eng/mypy.ini +38 -0
  65. package/scripts/eng/pylintrc +58 -0
  66. package/scripts/eng/pyrightconfig.json +6 -0
  67. package/scripts/{regenerate.ts → eng/regenerate.ts} +40 -27
  68. package/scripts/{run-tests.ts → eng/run-tests.ts} +29 -6
  69. package/scripts/eng/utils.ts +38 -0
  70. package/scripts/run_tsp.py +7 -5
  71. package/dist/scripts/regenerate.js.map +0 -1
  72. package/dist/scripts/run-tests.js.map +0 -1
  73. /package/dist/scripts/{regenerate.d.ts → eng/regenerate.d.ts} +0 -0
  74. /package/dist/scripts/{run-tests.d.ts → eng/run-tests.d.ts} +0 -0
@@ -163,7 +163,7 @@ def has_multi_part_content_type(yaml_data: Dict[str, Any]) -> bool:
163
163
  return any(ct for ct in yaml_data.get("contentTypes", []) if ct == "multipart/form-data")
164
164
 
165
165
 
166
- class PreProcessPlugin(YamlUpdatePlugin): # pylint: disable=abstract-method
166
+ class PreProcessPlugin(YamlUpdatePlugin):
167
167
  """Add Python naming information."""
168
168
 
169
169
  @property
@@ -82,9 +82,7 @@ def parse_args(
82
82
  return value
83
83
 
84
84
  unknown_args_ret = {
85
- ua.strip("--").split("=", maxsplit=1)[0]: _get_value( # pylint: disable=bad-str-strip-call
86
- ua.strip("--").split("=", maxsplit=1)[1] # pylint: disable=bad-str-strip-call
87
- )
85
+ ua.strip("--").split("=", maxsplit=1)[0]: _get_value(ua.strip("--").split("=", maxsplit=1)[1])
88
86
  for ua in unknown_args
89
87
  }
90
88
  return args, unknown_args_ret
@@ -15,7 +15,7 @@ from setuptools import setup, find_packages
15
15
 
16
16
  # Version extraction inspired from 'requests'
17
17
  with open(os.path.join("pygen", "_version.py"), "r") as fd:
18
- version = re.search(r'^VERSION\s*=\s*[\'"]([^\'"]*)[\'"]', fd.read(), re.MULTILINE).group(1)
18
+ version = re.search(r'^VERSION\s*=\s*[\'"]([^\'"]*)[\'"]', fd.read(), re.MULTILINE).group(1) # type: ignore
19
19
 
20
20
  if not version:
21
21
  raise RuntimeError("Cannot find version information")
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@azure-tools/typespec-python",
3
- "version": "0.29.0",
3
+ "version": "0.30.0",
4
4
  "author": "Microsoft Corporation",
5
5
  "description": "TypeSpec emitter for Python SDKs",
6
6
  "homepage": "https://github.com/Azure/autorest.python",
@@ -36,7 +36,7 @@
36
36
  "@azure-tools/typespec-azure-core": ">=0.45.0 <1.0.0",
37
37
  "@azure-tools/typespec-azure-resource-manager": ">=0.45.0 <1.0.0",
38
38
  "@azure-tools/typespec-autorest": ">=0.45.0 <1.0.0",
39
- "@azure-tools/typespec-client-generator-core": ">=0.45.1 <1.0.0",
39
+ "@azure-tools/typespec-client-generator-core": ">=0.45.4 <1.0.0",
40
40
  "@azure-tools/typespec-azure-rulesets": ">=0.45.0 <3.0.0",
41
41
  "@typespec/compiler": ">=0.59.1 <1.0.0",
42
42
  "@typespec/http": ">=0.59.0 <1.0.0",
@@ -54,7 +54,7 @@
54
54
  "@azure-tools/typespec-azure-resource-manager": "~0.45.0",
55
55
  "@azure-tools/typespec-autorest": "~0.45.0",
56
56
  "@azure-tools/cadl-ranch-expect": "~0.15.1",
57
- "@azure-tools/cadl-ranch-specs": "~0.35.4",
57
+ "@azure-tools/cadl-ranch-specs": "~0.36.1",
58
58
  "@types/js-yaml": "~4.0.5",
59
59
  "@types/node": "^18.16.3",
60
60
  "@types/yargs": "17.0.32",
@@ -65,22 +65,24 @@
65
65
  "rimraf": "~5.0.0",
66
66
  "typescript": "~5.1.3",
67
67
  "@azure-tools/typespec-azure-core": "~0.45.0",
68
- "@azure-tools/typespec-client-generator-core": "0.45.1",
68
+ "@azure-tools/typespec-client-generator-core": "0.45.4",
69
69
  "@typespec/compiler": "~0.59.1",
70
70
  "@typespec/http": "~0.59.0",
71
71
  "@typespec/rest": "~0.59.0",
72
72
  "@typespec/versioning": "~0.59.0",
73
73
  "@azure-tools/typespec-azure-rulesets": "0.45.0",
74
- "yargs": "~17.2.1"
74
+ "yargs": "~17.2.1",
75
+ "chalk": "5.3.0"
75
76
  },
76
77
  "scripts": {
77
78
  "clean": "rimraf ./dist ./temp ./venv ./node_modules",
78
79
  "build": "tsc -p .",
79
80
  "watch": "tsc -p . --watch",
80
- "lint": "eslint . --ext .ts --max-warnings=0",
81
+ "lint": "tsx ./scripts/eng/lint.ts",
81
82
  "lint:fix": "eslint . --fix --ext .ts",
83
+ "format": "npx prettier **/*.ts --write && tsx ./scripts/eng/format.ts",
82
84
  "install": "tsx ./scripts/run-python3.ts ./scripts/install.py",
83
- "regenerate": "tsx ./scripts/regenerate.ts",
84
- "test": "tsx ./scripts/run-tests.ts"
85
+ "regenerate": "tsx ./scripts/eng/regenerate.ts",
86
+ "test": "tsx ./scripts/eng/run-tests.ts"
85
87
  }
86
88
  }
@@ -0,0 +1,5 @@
1
+ /* eslint-disable no-console */
2
+
3
+ import { runCommand } from "./utils.js";
4
+
5
+ runCommand("black .", "black");
@@ -0,0 +1,75 @@
1
+ /* eslint-disable no-console */
2
+ import yargs from "yargs";
3
+ import { hideBin } from "yargs/helpers";
4
+ import { runCommand, executeCommand } from "./utils.js";
5
+
6
+ interface Arguments {
7
+ folderName: string;
8
+ command?: "pylint" | "mypy" | "pyright" | "eslint";
9
+ skipWarning?: boolean;
10
+ skipEslint?: boolean;
11
+ }
12
+
13
+ const validCommands = ["pylint", "mypy", "pyright", "eslint"];
14
+
15
+ // PARSE INPUT ARGUMENTS
16
+ const argv = yargs(hideBin(process.argv))
17
+ .option("folderName", {
18
+ type: "string",
19
+ choices: ["generator", "autorest"],
20
+ description: "Specify the flavor",
21
+ default: "generator",
22
+ })
23
+ .option("command", {
24
+ alias: "c",
25
+ type: "string",
26
+ choices: validCommands,
27
+ description: "Specify the command to run",
28
+ })
29
+ .option("skipWarning", {
30
+ alias: "s",
31
+ type: "boolean",
32
+ description: "Skip to check warnings",
33
+ })
34
+ .option("skipEslint", {
35
+ alias: "e",
36
+ type: "boolean",
37
+ description: "Skip to check eslint",
38
+ }).argv as Arguments;
39
+
40
+ export function pylint() {
41
+ runCommand(`pylint ${argv.folderName}/ --rcfile ./scripts/eng/pylintrc`, "pylint");
42
+ }
43
+
44
+ export function mypy() {
45
+ runCommand(`mypy ${argv.folderName}/ --config-file ./scripts/eng/mypy.ini`, "mypy");
46
+ }
47
+
48
+ export function pyright() {
49
+ runCommand(`pyright ${argv.folderName}/ -p ./scripts/eng/pyrightconfig.json`, "pyright");
50
+ }
51
+
52
+ export function eslint() {
53
+ // const checkWarning = argv.skipWarning ? "" : "--max-warnings=0";
54
+ const checkWarning = "";
55
+ executeCommand(`npx eslint . --ext .ts ${checkWarning} `, "eslint");
56
+ }
57
+
58
+ if (argv.command === "pylint") {
59
+ pylint();
60
+ } else if (argv.command === "mypy") {
61
+ mypy();
62
+ } else if (argv.command === "pyright") {
63
+ pyright();
64
+ } else if (argv.command === "eslint") {
65
+ if (!argv.skipEslint) {
66
+ eslint();
67
+ }
68
+ } else {
69
+ pylint();
70
+ mypy();
71
+ pyright();
72
+ if (!argv.skipEslint) {
73
+ eslint();
74
+ }
75
+ }
@@ -0,0 +1,38 @@
1
+ # global configurations
2
+ [mypy]
3
+ python_version = 3.8
4
+
5
+
6
+ # module level configuratiohns
7
+ [mypy-jsonrpc.*]
8
+ ignore_missing_imports = True
9
+
10
+ [mypy-ptvsd.*]
11
+ ignore_missing_imports = True
12
+
13
+ [mypy-debugpy.*]
14
+ ignore_missing_imports = True
15
+
16
+ [mypy-m2r2.*]
17
+ ignore_missing_imports = True
18
+
19
+ [mypy-autorest.common.utils.*]
20
+ ignore_missing_imports = True
21
+
22
+ [mypy-autorest.common.python_mappings.*]
23
+ ignore_missing_imports = True
24
+
25
+ [mypy-pygen.codegen.models.*]
26
+ ignore_missing_imports = True
27
+
28
+ [mypy-setuptools]
29
+ ignore_missing_imports = True
30
+
31
+ [mypy-*._patch]
32
+ ignore_missing_imports = True
33
+
34
+ [mypy-pygen.*]
35
+ ignore_missing_imports = True
36
+
37
+ [mypy-yaml.*]
38
+ ignore_missing_imports = True
@@ -0,0 +1,58 @@
1
+ [MASTER]
2
+ py-version=3.8
3
+ ignore-patterns=test_*,conftest,setup
4
+ reports=no
5
+
6
+ # PYLINT DIRECTORY BLACKLIST.
7
+ ignore=_generated,samples,examples,test,tests,doc,.tox,generated_samples
8
+
9
+ [MESSAGES CONTROL]
10
+
11
+ # Add enable for useless disables
12
+ enable=useless-suppression
13
+
14
+ # For all codes, run 'pylint --list-msgs' or go to 'https://pylint.readthedocs.io/en/latest/reference_guide/features.html'
15
+ # locally-disabled: Warning locally suppressed using disable-msg
16
+ # cyclic-import: because of https://github.com/PyCQA/pylint/issues/850
17
+ # too-many-arguments: Due to the nature of the CLI many commands have large arguments set which reflect in large arguments set in corresponding methods.
18
+ # Let's black deal with bad-continuation
19
+ disable=useless-object-inheritance,missing-docstring,locally-disabled,fixme,cyclic-import,too-many-arguments,invalid-name,duplicate-code,too-few-public-methods,consider-using-f-string,super-with-arguments,redefined-builtin,import-outside-toplevel,client-suffix-needed,unnecessary-dunder-call,unnecessary-ellipsis,disallowed-name,consider-using-max-builtin
20
+
21
+ [FORMAT]
22
+ max-line-length=120
23
+
24
+ [VARIABLES]
25
+ # Tells whether we should check for unused import in __init__ files.
26
+ init-import=yes
27
+
28
+ [DESIGN]
29
+ # Maximum number of locals for function / method body
30
+ max-locals=25
31
+ # Maximum number of branch for function / method body
32
+ max-branches=20
33
+ # Maximum number of instance attributes for class
34
+ max-attributes=10
35
+ # Maximum number of ancestors
36
+ max-parents=15
37
+
38
+ [SIMILARITIES]
39
+ min-similarity-lines=10
40
+
41
+ [BASIC]
42
+ # Naming hints based on PEP 8 (https://www.python.org/dev/peps/pep-0008/#naming-conventions).
43
+ # Consider these guidelines and not hard rules. Read PEP 8 for more details.
44
+
45
+ # The invalid-name checker must be **enabled** for these hints to be used.
46
+ include-naming-hint=yes
47
+
48
+ # keep short; underscores are discouraged
49
+ module-naming-style=snake_case
50
+ const-naming-style=UPPER_CASE
51
+ class-naming-style=PascalCase
52
+ class-attribute-naming-style=snake_case
53
+ attr-naming-style=snake_case
54
+ method-naming-style=snake_case
55
+ function-naming-style=snake_case
56
+ argument-naming-style=snake_case
57
+ variable-naming-style=snake_case
58
+ inlinevar-naming-style=snake_case
@@ -0,0 +1,6 @@
1
+ {
2
+ "reportUnnecessaryCast": "warning",
3
+ "reportTypeCommentUsage": true,
4
+ "reportMissingImports": false,
5
+ "pythonVersion": "3.8"
6
+ }
@@ -4,15 +4,19 @@ import { promisify } from "util";
4
4
  import yargs from "yargs";
5
5
  import { hideBin } from "yargs/helpers";
6
6
  import { dirname, join, relative, resolve } from "path";
7
- import { promises } from "fs";
7
+ import { promises, rmSync } from "fs";
8
8
  import { fileURLToPath } from "url";
9
9
 
10
10
  // Promisify the exec function
11
11
  const exec = promisify(execCallback);
12
12
 
13
13
  // Get the directory of the current file
14
- const PLUGIN_DIR = resolve(fileURLToPath(import.meta.url), "../../");
14
+ const PLUGIN_DIR = resolve(fileURLToPath(import.meta.url), "../../../");
15
15
  const CADL_RANCH_DIR = resolve(PLUGIN_DIR, "node_modules/@azure-tools/cadl-ranch-specs/http");
16
+ interface TspCommand {
17
+ outputDir: string;
18
+ command: string;
19
+ }
16
20
 
17
21
  const EMITTER_OPTIONS: Record<string, Record<string, string> | Record<string, string>[]> = {
18
22
  "resiliency/srv-driven/old.tsp": {
@@ -117,9 +121,15 @@ function getEmitterOption(spec: string): Record<string, string>[] {
117
121
  }
118
122
 
119
123
  // Function to execute CLI commands asynchronously
120
- async function executeCommand(command: string): Promise<void> {
124
+ async function executeCommand(tspCommand: TspCommand): Promise<void> {
121
125
  try {
122
- const { stdout, stderr } = await exec(command);
126
+ rmSync(tspCommand.outputDir, { recursive: true, force: true });
127
+ } catch (error) {
128
+ console.error(`rm error: ${error}`);
129
+ }
130
+ try {
131
+ console.log(`exec: ${tspCommand.command}`);
132
+ const { stdout, stderr } = await exec(tspCommand.command);
123
133
  if (stdout) console.log(`stdout: ${stdout}`);
124
134
  if (stderr) console.error(`stderr: ${stderr}`);
125
135
  } catch (error) {
@@ -206,8 +216,13 @@ function defaultPackageName(spec: string): string {
206
216
  .toLowerCase();
207
217
  }
208
218
 
209
- function addOptions(spec: string, generatedFolder: string, flags: RegenerateFlags): string[] {
210
- const emitterConfigs: string[] = [];
219
+ interface EmitterConfig {
220
+ optionsStr: string;
221
+ outputDir: string;
222
+ }
223
+
224
+ function addOptions(spec: string, generatedFolder: string, flags: RegenerateFlags): EmitterConfig[] {
225
+ const emitterConfigs: EmitterConfig[] = [];
211
226
  for (const config of getEmitterOption(spec)) {
212
227
  const options: Record<string, string> = { ...config };
213
228
  options["flavor"] = flags.flavor;
@@ -224,41 +239,39 @@ function addOptions(spec: string, generatedFolder: string, flags: RegenerateFlag
224
239
  if (flags.flavor === "unbranded") {
225
240
  options["company-name"] = "Unbranded";
226
241
  }
227
- options["examples-directory"] = toPosix(join(dirname(spec), "examples"));
242
+ options["examples-dir"] = toPosix(join(dirname(spec), "examples"));
228
243
  const configs = Object.entries(options).flatMap(([k, v]) => {
229
244
  return `--option @azure-tools/typespec-python.${k}=${v}`;
230
245
  });
231
- emitterConfigs.push(configs.join(" "));
246
+ emitterConfigs.push({
247
+ optionsStr: configs.join(" "),
248
+ outputDir: options["emitter-output-dir"],
249
+ });
232
250
  }
233
251
  return emitterConfigs;
234
252
  }
235
-
236
- async function _regenerateSingle(spec: string, flags: RegenerateFlags): Promise<void> {
237
- // Perform some asynchronous operation here
238
- const options = addOptions(spec, PLUGIN_DIR, flags);
239
- const commandPromises = options.map((option) => {
240
- const command = `tsp compile ${spec} --emit=${toPosix(PLUGIN_DIR)} ${option}`;
241
- console.log(command);
242
- return executeCommand(command);
253
+ function _getCmdList(spec: string, flags: RegenerateFlags): TspCommand[] {
254
+ return addOptions(spec, PLUGIN_DIR, flags).map((option) => {
255
+ return {
256
+ outputDir: option.outputDir,
257
+ command: `tsp compile ${spec} --emit=${toPosix(PLUGIN_DIR)} ${option.optionsStr}`,
258
+ };
243
259
  });
244
- await Promise.all(commandPromises);
245
260
  }
246
261
 
247
- async function regenerate(flags: RegenerateFlagsInput): Promise<boolean> {
262
+ async function regenerate(flags: RegenerateFlagsInput): Promise<void> {
248
263
  if (flags.flavor === undefined) {
249
- const azureGeneration = await regenerate({ ...flags, flavor: "azure" });
250
- const unbrandedGeneration = await regenerate({ ...flags, flavor: "unbranded" });
251
- return azureGeneration && unbrandedGeneration;
264
+ await regenerate({ ...flags, flavor: "azure" });
265
+ await regenerate({ ...flags, flavor: "unbranded" });
252
266
  } else {
253
267
  const flagsResolved = { debug: false, flavor: flags.flavor, ...flags };
254
268
  const CADL_RANCH_DIR = resolve(PLUGIN_DIR, "node_modules/@azure-tools/cadl-ranch-specs/http");
255
269
  const subdirectories = await getSubdirectories(CADL_RANCH_DIR, flagsResolved);
256
- const promises = subdirectories.map(async (subdirectory) => {
257
- // Perform additional asynchronous operations on each subdirectory here
258
- await _regenerateSingle(subdirectory, flagsResolved);
259
- });
260
- await Promise.all(promises);
261
- return true;
270
+ const cmdList: TspCommand[] = subdirectories.flatMap((subdirectory) =>
271
+ _getCmdList(subdirectory, flagsResolved),
272
+ );
273
+ const PromiseCommands = cmdList.map((tspCommand) => executeCommand(tspCommand));
274
+ await Promise.all(PromiseCommands);
262
275
  }
263
276
  }
264
277
 
@@ -1,23 +1,30 @@
1
1
  /* eslint-disable no-console */
2
2
  import { execSync } from "child_process";
3
+ import { readFileSync } from "fs";
4
+ import { join } from "path";
3
5
  import yargs from "yargs";
4
6
  import { hideBin } from "yargs/helpers";
7
+ import { fileURLToPath } from "url";
5
8
 
6
9
  interface Arguments {
10
+ validFolders: string[];
7
11
  folder?: string;
8
12
  command?: string;
9
13
  }
10
14
 
11
- const validFolders = ["azure", "unbranded"];
12
-
13
15
  const validCommands = ["ci", "lint", "mypy", "pyright", "apiview"];
14
16
 
15
17
  // Parse command-line arguments using yargs
16
18
  const argv = yargs(hideBin(process.argv))
19
+ .option("validFolders", {
20
+ alias: "vf",
21
+ describe: "Specify the valid folders",
22
+ type: "array",
23
+ default: ["azure", "unbranded"],
24
+ })
17
25
  .option("folder", {
18
26
  alias: "f",
19
27
  describe: "Specify the folder to use",
20
- choices: validFolders,
21
28
  type: "string",
22
29
  })
23
30
  .option("command", {
@@ -27,7 +34,7 @@ const argv = yargs(hideBin(process.argv))
27
34
  type: "string",
28
35
  }).argv as Arguments;
29
36
 
30
- const foldersToProcess = argv.folder ? [argv.folder] : validFolders;
37
+ const foldersToProcess = argv.folder ? [argv.folder] : argv.validFolders;
31
38
 
32
39
  const commandToRun = argv.command || "all";
33
40
 
@@ -36,21 +43,37 @@ function getCommand(command: string, folder: string) {
36
43
  return `FOLDER=${folder} tox -c ./test/${folder}/tox.ini -e ${command}`;
37
44
  }
38
45
 
46
+ function sectionExistsInToxIni(command: string, folder: string): boolean {
47
+ const toxIniPath = join(fileURLToPath(import.meta.url), `../../../test/${folder}/tox.ini`);
48
+ const toxIniContent = readFileSync(toxIniPath, "utf-8");
49
+ const sectionHeader = `[testenv:${command}]`;
50
+ return toxIniContent.includes(sectionHeader);
51
+ }
52
+
53
+ function myExecSync(command: string, folder: string): void {
54
+ if (!sectionExistsInToxIni(command, folder)) {
55
+ console.log(`No section for ${command} in tox.ini for folder ${folder}. Skipping...`);
56
+ return;
57
+ }
58
+ execSync(getCommand(command, folder), { stdio: "inherit" });
59
+ }
60
+
39
61
  foldersToProcess.forEach((folder) => {
40
62
  try {
41
63
  if (commandToRun === "all") {
42
64
  for (const key of validCommands) {
43
65
  console.log(`Running ${key} for folder ${folder}...`);
44
- execSync(getCommand(key, folder), { stdio: "inherit" });
66
+ myExecSync(key, folder);
45
67
  }
46
68
  } else if (getCommand(commandToRun, folder)) {
47
69
  console.log(`Running ${commandToRun} for folder ${folder}...`);
48
- execSync(getCommand(commandToRun, folder), { stdio: "inherit" });
70
+ myExecSync(commandToRun, folder);
49
71
  } else {
50
72
  console.error(`Error: Unknown command '${commandToRun}'.`);
51
73
  process.exit(1);
52
74
  }
53
75
  } catch (error) {
76
+ console.error((error as Error).message);
54
77
  console.error(`Error executing command for folder ${folder}: ${(error as Error).message}`);
55
78
  process.exit(1);
56
79
  }
@@ -0,0 +1,38 @@
1
+ /* eslint-disable no-console */
2
+ import { exec } from "child_process";
3
+ import process from "process";
4
+ import { existsSync } from "fs";
5
+ import { dirname, join } from "path";
6
+ import { fileURLToPath } from "url";
7
+ import chalk from "chalk";
8
+
9
+ // execute the command
10
+ export function executeCommand(command: string, prettyName: string) {
11
+ exec(command, (error, stdout, stderr) => {
12
+ if (error) {
13
+ console.error(chalk.red(`Error executing ${command}(stdout): ${stdout}`));
14
+ console.error(chalk.red(`Error executing ${command}{stderr}: ${stderr}`));
15
+ process.exit(1);
16
+ }
17
+ if (stderr) {
18
+ // Process stderr output
19
+ console.log(chalk.yellow(`${command}:\n${stderr}`));
20
+ return;
21
+ }
22
+ console.log(chalk.green(`${prettyName} passed`));
23
+ });
24
+ }
25
+
26
+ // Function to run a command and log the output
27
+ export function runCommand(command: string, prettyName: string) {
28
+ let pythonPath = join(dirname(fileURLToPath(import.meta.url)), "..", "..", "venv/");
29
+ if (existsSync(join(pythonPath, "bin"))) {
30
+ pythonPath = join(pythonPath, "bin", "python");
31
+ } else if (existsSync(join(pythonPath, "Scripts"))) {
32
+ pythonPath = join(pythonPath, "Scripts", "python");
33
+ } else {
34
+ throw new Error(pythonPath);
35
+ }
36
+ command = `${pythonPath} -m ${command}`;
37
+ executeCommand(command, prettyName);
38
+ }
@@ -7,7 +7,8 @@ import sys
7
7
  import venv
8
8
  import logging
9
9
  from pathlib import Path
10
- from venvtools import python_run
10
+ from pygen import m2r, preprocess, codegen, black
11
+ from pygen.utils import parse_args
11
12
 
12
13
  _ROOT_DIR = Path(__file__).parent.parent
13
14
 
@@ -34,7 +35,8 @@ if __name__ == "__main__":
34
35
  breakpoint() # pylint: disable=undefined-variable
35
36
 
36
37
  # run m2r
37
- python_run(venv_context, "generator.pygen.m2r", command=sys.argv[1:])
38
- python_run(venv_context, "generator.pygen.preprocess.__init__", command=sys.argv[1:])
39
- python_run(venv_context, "generator.pygen.codegen.__init__", command=sys.argv[1:])
40
- python_run(venv_context, "generator.pygen.black", command=sys.argv[1:])
38
+ args, unknown_args = parse_args()
39
+ m2r.M2R(output_folder=args.output_folder, cadl_file=args.cadl_file, **unknown_args).process()
40
+ preprocess.PreProcessPlugin(output_folder=args.output_folder, cadl_file=args.cadl_file, **unknown_args).process()
41
+ codegen.CodeGenerator(output_folder=args.output_folder, cadl_file=args.cadl_file, **unknown_args).process()
42
+ black.BlackScriptPlugin(output_folder=args.output_folder, **unknown_args).process()
@@ -1 +0,0 @@
1
- {"version":3,"file":"regenerate.js","sourceRoot":"","sources":["../../scripts/regenerate.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"run-tests.js","sourceRoot":"","sources":["../../scripts/run-tests.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAOxC,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;AAE5C,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AAEnE,2CAA2C;AAC3C,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;KACpC,MAAM,CAAC,QAAQ,EAAE;IACd,KAAK,EAAE,GAAG;IACV,QAAQ,EAAE,2BAA2B;IACrC,OAAO,EAAE,YAAY;IACrB,IAAI,EAAE,QAAQ;CACjB,CAAC;KACD,MAAM,CAAC,SAAS,EAAE;IACf,KAAK,EAAE,GAAG;IACV,QAAQ,EAAE,4BAA4B;IACtC,OAAO,EAAE,aAAa;IACtB,IAAI,EAAE,QAAQ;CACjB,CAAC,CAAC,IAAiB,CAAC;AAEzB,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;AAEpE,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC;AAE3C,SAAS,UAAU,CAAC,OAAe,EAAE,MAAc;IAC/C,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,IAAI,CAAC,CAAC;IACvF,OAAO,UAAU,MAAM,kBAAkB,MAAM,eAAe,OAAO,EAAE,CAAC;AAC5E,CAAC;AAED,gBAAgB,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;IAChC,IAAI;QACA,IAAI,YAAY,KAAK,KAAK,EAAE;YACxB,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE;gBAC7B,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,eAAe,MAAM,KAAK,CAAC,CAAC;gBACtD,QAAQ,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;aAC3D;SACJ;aAAM,IAAI,UAAU,CAAC,YAAY,EAAE,MAAM,CAAC,EAAE;YACzC,OAAO,CAAC,GAAG,CAAC,WAAW,YAAY,eAAe,MAAM,KAAK,CAAC,CAAC;YAC/D,QAAQ,CAAC,UAAU,CAAC,YAAY,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;SACpE;aAAM;YACH,OAAO,CAAC,KAAK,CAAC,2BAA2B,YAAY,IAAI,CAAC,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SACnB;KACJ;IAAC,OAAO,KAAK,EAAE;QACZ,OAAO,CAAC,KAAK,CAAC,sCAAsC,MAAM,KAAM,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;KACnB;AACL,CAAC,CAAC,CAAC"}