UNPKG

projen

Version:

CDK for software projects

121 lines 15.2 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.AwsCdkPythonApp = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const _1 = require("."); const __1 = require(".."); const awscdk_deps_py_1 = require("./awscdk-deps-py"); const awscdk_pytest_sample_1 = require("./awscdk-pytest-sample"); const pytest_1 = require("../python/pytest"); const python_project_1 = require("../python/python-project"); /** * AWS CDK app in Python * * @pjid awscdk-app-py */ class AwsCdkPythonApp extends python_project_1.PythonProject { /** * The CDK version this app is using. */ get cdkVersion() { return this.cdkDeps.cdkVersion; } constructor(options) { super({ ...options, pytest: false, sample: false }); this.cdkDeps = new awscdk_deps_py_1.AwsCdkDepsPy(this, { dependencyType: __1.DependencyType.RUNTIME, ...options, }); this.appEntrypoint = options.appEntrypoint ?? "app.py"; this.testdir = this.sampleTestdir = options.sampleTestdir ?? options.testdir ?? "tests"; this.cdkTasks = new _1.CdkTasks(this); this.postCompileTask.spawn(this.cdkTasks.synthSilent); this.cdkConfig = new _1.CdkConfig(this, { app: `python ${this.appEntrypoint}`, watchIncludes: ["**"], watchExcludes: [ "README.md", "cdk*.json", "requirements*.txt", "source.bat", "**/__init__.py", "python/__pycache__", "tests", ], ...options, }); if (options.sample ?? true) { new AppCode(this, this.appEntrypoint, this.cdkDeps.cdkMajorVersion); new MyStackCode(this, this.moduleName, this.cdkDeps.cdkMajorVersion); } if (options.pytest ?? true) { this.pytest = new pytest_1.Pytest(this, options.pytestOptions); new awscdk_pytest_sample_1.AwsCdkPytestSample(this, this.sampleTestdir); } } } exports.AwsCdkPythonApp = AwsCdkPythonApp; _a = JSII_RTTI_SYMBOL_1; AwsCdkPythonApp[_a] = { fqn: "projen.awscdk.AwsCdkPythonApp", version: "0.99.34" }; class AppCode extends __1.Component { constructor(project, fileName, cdkVersion) { super(project); let versionImport; if (cdkVersion < 2) { versionImport = "from aws_cdk.core import App, Environment"; } else { versionImport = "from aws_cdk import App, Environment"; } new __1.SampleFile(project, fileName, { contents: [ "import os", versionImport, `from ${project.moduleName}.main import MyStack`, "", "# for development, use account/region from cdk cli", "dev_env = Environment(", " account=os.getenv('CDK_DEFAULT_ACCOUNT'),", " region=os.getenv('CDK_DEFAULT_REGION')", ")", "", "app = App()", `MyStack(app, "${this.project.name}-dev", env=dev_env)`, `# MyStack(app, "${this.project.name}-prod", env=prod_env)`, "", "app.synth()", ].join("\n"), }); } } class MyStackCode extends __1.Component { constructor(project, dir, cdkMajorVersion) { super(project); let appFile = []; appFile.push("import os"); if (cdkMajorVersion < 2) { appFile.push("from aws_cdk.core import Construct, Stack"); } else { appFile.push("from aws_cdk import Stack"); appFile.push("from constructs import Construct"); } appFile.push(""); appFile.push(""); appFile.push("class MyStack(Stack):"); appFile.push(" def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:"); appFile.push(" super().__init__(scope, construct_id, **kwargs)"); appFile.push(""); appFile.push(" # The code that defines your stack goes here"); appFile.push(""); new __1.SampleDir(project, dir, { files: { "__init__.py": "", "main.py": appFile.join("\n"), }, }); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzY2RrLWFwcC1weS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hd3NjZGsvYXdzY2RrLWFwcC1weS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHdCQU1XO0FBQ1gsMEJBQXNFO0FBQ3RFLHFEQUFnRDtBQUNoRCxpRUFBNEQ7QUFDNUQsNkNBQTBDO0FBQzFDLDZEQUErRTtBQTBCL0U7Ozs7R0FJRztBQUNILE1BQWEsZUFBZ0IsU0FBUSw4QkFBYTtJQTZCaEQ7O09BRUc7SUFDSCxJQUFXLFVBQVU7UUFDbkIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztJQUNqQyxDQUFDO0lBRUQsWUFBWSxPQUErQjtRQUN6QyxLQUFLLENBQUMsRUFBRSxHQUFHLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBRXBELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSw2QkFBWSxDQUFDLElBQUksRUFBRTtZQUNwQyxjQUFjLEVBQUUsa0JBQWMsQ0FBQyxPQUFPO1lBQ3RDLEdBQUcsT0FBTztTQUNYLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDLGFBQWEsSUFBSSxRQUFRLENBQUM7UUFDdkQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYTtZQUMvQixPQUFPLENBQUMsYUFBYSxJQUFJLE9BQU8sQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDO1FBRXRELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxXQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUV0RCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksWUFBUyxDQUFDLElBQUksRUFBRTtZQUNuQyxHQUFHLEVBQUUsVUFBVSxJQUFJ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SSxDQUFDLHFEQUFxRCxDQUFDLENBQUM7UUFDcEUsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNqQixPQUFPLENBQUMsSUFBSSxDQUFDLGtEQUFrRCxDQUFDLENBQUM7UUFDakUsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLGFBQVMsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFO1lBQzFCLEtBQUssRUFBRTtnQkFDTCxhQUFhLEVBQUUsRUFBRTtnQkFDakIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO2FBQzlCO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQXdzQ2RrRGVwcyxcbiAgQXdzQ2RrRGVwc0NvbW1vbk9wdGlvbnMsXG4gIENka0NvbmZpZyxcbiAgQ2RrQ29uZmlnQ29tbW9uT3B0aW9ucyxcbiAgQ2RrVGFza3MsXG59IGZyb20gXCIuXCI7XG5pbXBvcnQgeyBDb21wb25lbnQsIERlcGVuZGVuY3lUeXBlLCBTYW1wbGVEaXIsIFNhbXBsZUZpbGUgfSBmcm9tIFwiLi5cIjtcbmltcG9ydCB7IEF3c0Nka0RlcHNQeSB9IGZyb20gXCIuL2F3c2Nkay1kZXBzLXB5XCI7XG5pbXBvcnQgeyBBd3NDZGtQeXRlc3RTYW1wbGUgfSBmcm9tIFwiLi9hd3NjZGstcHl0ZXN0LXNhbXBsZVwiO1xuaW1wb3J0IHsgUHl0ZXN0IH0gZnJvbSBcIi4uL3B5dGhvbi9weXRlc3RcIjtcbmltcG9ydCB7IFB5dGhvblByb2plY3QsIFB5dGhvblByb2plY3RPcHRpb25zIH0gZnJvbSBcIi4uL3B5dGhvbi9weXRob24tcHJvamVjdFwiO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGBBd3NDZGtQeXRob25BcHBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXdzQ2RrUHl0aG9uQXBwT3B0aW9uc1xuICBleHRlbmRzXG4gICAgUHl0aG9uUHJvamVjdE9wdGlvbnMsXG4gICAgQ2RrQ29uZmlnQ29tbW9uT3B0aW9ucyxcbiAgICBBd3NDZGtEZXBzQ29tbW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgQ0RLIGFwcCdzIGVudHJ5cG9pbnQgKHJlbGF0aXZlIHRvIHRoZSBzb3VyY2UgZGlyZWN0b3J5LCB3aGljaCBpc1xuICAgKiBcInNyY1wiIGJ5IGRlZmF1bHQpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBcImFwcC5weVwiXG4gICAqL1xuICByZWFkb25seSBhcHBFbnRyeXBvaW50Pzogc3RyaW5nO1xuICAvKipcbiAgICogUHl0aG9uIHNvdXJjZXMgZGlyZWN0b3J5LlxuICAgKlxuICAgKiBAZGVmYXVsdCBcInRlc3RzXCJcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGBzYW1wbGVUZXN0ZGlyYCBpbnN0ZWFkLlxuICAgKi9cbiAgcmVhZG9ubHkgdGVzdGRpcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBV1MgQ0RLIGFwcCBpbiBQeXRob25cbiAqXG4gKiBAcGppZCBhd3NjZGstYXBwLXB5XG4gKi9cbmV4cG9ydCBjbGFzcyBBd3NDZGtQeXRob25BcHAgZXh0ZW5kcyBQeXRob25Qcm9qZWN0IHtcbiAgLyoqXG4gICAqIENvbW1vbiBDREsgdGFza3MuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY2RrVGFza3M6IENka1Rhc2tzO1xuXG4gIC8qKlxuICAgKiBjZGsuanNvbiBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNka0NvbmZpZzogQ2RrQ29uZmlnO1xuXG4gIHB1YmxpYyByZWFkb25seSBjZGtEZXBzOiBBd3NDZGtEZXBzO1xuXG4gIC8qKlxuICAgKiBUaGUgQ0RLIGFwcCBlbnRyeXBvaW50XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYXBwRW50cnlwb2ludDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlyZWN0b3J5IGluIHdoaWNoIHRoZSBweXRob24gdGVzdHMgcmVzaWRlLlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgYHNhbXBsZVRlc3RkaXJgIGluc3RlYWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdGVzdGRpcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlyZWN0b3J5IGluIHdoaWNoIHRoZSBweXRob24gc2FtcGxlIHRlc3RzIHJlc2lkZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzYW1wbGVUZXN0ZGlyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBDREsgdmVyc2lvbiB0aGlzIGFwcCBpcyB1c2luZy5cbiAgICovXG4gIHB1YmxpYyBnZXQgY2RrVmVyc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy5jZGtEZXBzLmNka1ZlcnNpb247XG4gIH1cblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBBd3NDZGtQeXRob25BcHBPcHRpb25zKSB7XG4gICAgc3VwZXIoeyAuLi5vcHRpb25zLCBweXRlc3Q6IGZhbHNlLCBzYW1wbGU6IGZhbHNlIH0pO1xuXG4gICAgdGhpcy5jZGtEZXBzID0gbmV3IEF3c0Nka0RlcHNQeSh0aGlzLCB7XG4gICAgICBkZXBlbmRlbmN5VHlwZTogRGVwZW5kZW5jeVR5cGUuUlVOVElNRSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSk7XG4gICAgdGhpcy5hcHBFbnRyeXBvaW50ID0gb3B0aW9ucy5hcHBFbnRyeXBvaW50ID8/IFwiYXBwLnB5XCI7XG4gICAgdGhpcy50ZXN0ZGlyID0gdGhpcy5zYW1wbGVUZXN0ZGlyID1cbiAgICAgIG9wdGlvbnMuc2FtcGxlVGVzdGRpciA/PyBvcHRpb25zLnRlc3RkaXIgPz8gXCJ0ZXN0c1wiO1xuXG4gICAgdGhpcy5jZGtUYXNrcyA9IG5ldyBDZGtUYXNrcyh0aGlzKTtcbiAgICB0aGlzLnBvc3RDb21waWxlVGFzay5zcGF3bih0aGlzLmNka1Rhc2tzLnN5bnRoU2lsZW50KTtcblxuICAgIHRoaXMuY2RrQ29uZmlnID0gbmV3IENka0NvbmZpZyh0aGlzLCB7XG4gICAgICBhcHA6IGBweXRob24gJHt0aGlzLmFwcEVudHJ5cG9pbnR9YCxcbiAgICAgIHdhdGNoSW5jbHVkZXM6IFtcIioqXCJdLFxuICAgICAgd2F0Y2hFeGNsdWRlczogW1xuICAgICAgICBcIlJFQURNRS5tZFwiLFxuICAgICAgICBcImNkayouanNvblwiLFxuICAgICAgICBcInJlcXVpcmVtZW50cyoudHh0XCIsXG4gICAgICAgIFwic291cmNlLmJhdFwiLFxuICAgICAgICBcIioqL19faW5pdF9fLnB5XCIsXG4gICAgICAgIFwicHl0aG9uL19fcHljYWNoZV9fXCIsXG4gICAgICAgIFwidGVzdHNcIixcbiAgICAgIF0sXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuXG4gICAgaWYgKG9wdGlvbnMuc2FtcGxlID8/IHRydWUpIHtcbiAgICAgIG5ldyBBcHBDb2RlKHRoaXMsIHRoaXMuYXBwRW50cnlwb2ludCwgdGhpcy5jZGtEZXBzLmNka01ham9yVmVyc2lvbik7XG4gICAgICBuZXcgTXlTdGFja0NvZGUodGhpcywgdGhpcy5tb2R1bGVOYW1lLCB0aGlzLmNka0RlcHMuY2RrTWFqb3JWZXJzaW9uKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5weXRlc3QgPz8gdHJ1ZSkge1xuICAgICAgdGhpcy5weXRlc3QgPSBuZXcgUHl0ZXN0KHRoaXMsIG9wdGlvbnMucHl0ZXN0T3B0aW9ucyk7XG4gICAgICBuZXcgQXdzQ2RrUHl0ZXN0U2FtcGxlKHRoaXMsIHRoaXMuc2FtcGxlVGVzdGRpcik7XG4gICAgfVxuICB9XG59XG5cbmNsYXNzIEFwcENvZGUgZXh0ZW5kcyBDb21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBBd3NDZGtQeXRob25BcHAsIGZpbGVOYW1lOiBzdHJpbmcsIGNka1ZlcnNpb246IG51bWJlcikge1xuICAgIHN1cGVyKHByb2plY3QpO1xuXG4gICAgbGV0IHZlcnNpb25JbXBvcnQ6IHN0cmluZztcbiAgICBpZiAoY2RrVmVyc2lvbiA8IDIpIHtcbiAgICAgIHZlcnNpb25JbXBvcnQgPSBcImZyb20gYXdzX2Nkay5jb3JlIGltcG9ydCBBcHAsIEVudmlyb25tZW50XCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZlcnNpb25JbXBvcnQgPSBcImZyb20gYXdzX2NkayBpbXBvcnQgQXBwLCBFbnZpcm9ubWVudFwiO1xuICAgIH1cblxuICAgIG5ldyBTYW1wbGVGaWxlKHByb2plY3QsIGZpbGVOYW1lLCB7XG4gICAgICBjb250ZW50czogW1xuICAgICAgICBcImltcG9ydCBvc1wiLFxuICAgICAgICB2ZXJzaW9uSW1wb3J0LFxuICAgICAgICBgZnJvbSAke3Byb2plY3QubW9kdWxlTmFtZX0ubWFpbiBpbXBvcnQgTXlTdGFja2AsXG4gICAgICAgIFwiXCIsXG4gICAgICAgIFwiIyBmb3IgZGV2ZWxvcG1lbnQsIHVzZSBhY2NvdW50L3JlZ2lvbiBmcm9tIGNkayBjbGlcIixcbiAgICAgICAgXCJkZXZfZW52ID0gRW52aXJvbm1lbnQoXCIsXG4gICAgICAgIFwiICBhY2NvdW50PW9zLmdldGVudignQ0RLX0RFRkFVTFRfQUNDT1VOVCcpLFwiLFxuICAgICAgICBcIiAgcmVnaW9uPW9zLmdldGVudignQ0RLX0RFRkFVTFRfUkVHSU9OJylcIixcbiAgICAgICAgXCIpXCIsXG4gICAgICAgIFwiXCIsXG4gICAgICAgIFwiYXBwID0gQXBwKClcIixcbiAgICAgICAgYE15U3RhY2soYXBwLCBcIiR7dGhpcy5wcm9qZWN0Lm5hbWV9LWRldlwiLCBlbnY9ZGV2X2VudilgLFxuICAgICAgICBgIyBNeVN0YWNrKGFwcCwgXCIke3RoaXMucHJvamVjdC5uYW1lfS1wcm9kXCIsIGVudj1wcm9kX2VudilgLFxuICAgICAgICBcIlwiLFxuICAgICAgICBcImFwcC5zeW50aCgpXCIsXG4gICAgICBdLmpvaW4oXCJcXG5cIiksXG4gICAgfSk7XG4gIH1cbn1cblxuY2xhc3MgTXlTdGFja0NvZGUgZXh0ZW5kcyBDb21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBBd3NDZGtQeXRob25BcHAsIGRpcjogc3RyaW5nLCBjZGtNYWpvclZlcnNpb246IG51bWJlcikge1xuICAgIHN1cGVyKHByb2plY3QpO1xuXG4gICAgbGV0IGFwcEZpbGU6IHN0cmluZ1tdID0gW107XG4gICAgYXBwRmlsZS5wdXNoKFwiaW1wb3J0IG9zXCIpO1xuICAgIGlmIChjZGtNYWpvclZlcnNpb24gPCAyKSB7XG4gICAgICBhcHBGaWxlLnB1c2goXCJmcm9tIGF3c19jZGsuY29yZSBpbXBvcnQgQ29uc3RydWN0LCBTdGFja1wiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwRmlsZS5wdXNoKFwiZnJvbSBhd3NfY2RrIGltcG9ydCBTdGFja1wiKTtcbiAgICAgIGFwcEZpbGUucHVzaChcImZyb20gY29uc3RydWN0cyBpbXBvcnQgQ29uc3RydWN0XCIpO1xuICAgIH1cbiAgICBhcHBGaWxlLnB1c2goXCJcIik7XG4gICAgYXBwRmlsZS5wdXNoKFwiXCIpO1xuICAgIGFwcEZpbGUucHVzaChcImNsYXNzIE15U3RhY2soU3RhY2spOlwiKTtcbiAgICBhcHBGaWxlLnB1c2goXG4gICAgICBcIiAgZGVmIF9faW5pdF9fKHNlbGYsIHNjb3BlOiBDb25zdHJ1Y3QsIGNvbnN0cnVjdF9pZDogc3RyLCAqKmt3YXJncykgLT4gTm9uZTpcIixcbiAgICApO1xuICAgIGFwcEZpbGUucHVzaChcIiAgICBzdXBlcigpLl9faW5pdF9fKHNjb3BlLCBjb25zdHJ1Y3RfaWQsICoqa3dhcmdzKVwiKTtcbiAgICBhcHBGaWxlLnB1c2goXCJcIik7XG4gICAgYXBwRmlsZS5wdXNoKFwiICAgICMgVGhlIGNvZGUgdGhhdCBkZWZpbmVzIHlvdXIgc3RhY2sgZ29lcyBoZXJlXCIpO1xuICAgIGFwcEZpbGUucHVzaChcIlwiKTtcblxuICAgIG5ldyBTYW1wbGVEaXIocHJvamVjdCwgZGlyLCB7XG4gICAgICBmaWxlczoge1xuICAgICAgICBcIl9faW5pdF9fLnB5XCI6IFwiXCIsXG4gICAgICAgIFwibWFpbi5weVwiOiBhcHBGaWxlLmpvaW4oXCJcXG5cIiksXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59XG4iXX0=