UNPKG

projen

Version:

CDK for software projects

124 lines • 13.9 kB
"use strict"; 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 { static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.awscdk.AwsCdkPythonApp", version: "0.103.12" }; /** * Common CDK tasks. */ cdkTasks; /** * cdk.json configuration. */ cdkConfig; cdkDeps; /** * The CDK app entrypoint */ appEntrypoint; /** * The directory in which the python sample tests reside. */ sampleTestdir; /** * 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.sampleTestdir = options.sampleTestdir ?? "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); new MyStackCode(this, this.moduleName); } 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; class AppCode extends __1.Component { constructor(project, fileName) { super(project); const 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) { super(project); let appFile = []; appFile.push("import os"); 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzY2RrLWFwcC1weS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hd3NjZGsvYXdzY2RrLWFwcC1weS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBS0Esd0JBQXdDO0FBQ3hDLDBCQUFzRTtBQUN0RSxxREFBZ0Q7QUFDaEQsaUVBQTREO0FBQzVELDZDQUEwQztBQUUxQyw2REFBeUQ7QUFtQnpEOzs7O0dBSUc7QUFDSCxNQUFhLGVBQWdCLFNBQVEsOEJBQWE7O0lBQ2hEOztPQUVHO0lBQ2EsUUFBUSxDQUFXO0lBRW5DOztPQUVHO0lBQ2EsU0FBUyxDQUFZO0lBRXJCLE9BQU8sQ0FBYTtJQUVwQzs7T0FFRztJQUNhLGFBQWEsQ0FBUztJQUV0Qzs7T0FFRztJQUNhLGFBQWEsQ0FBUztJQUV0Qzs7T0FFRztJQUNILElBQVcsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO0lBQ2pDLENBQUM7SUFFRCxZQUFZLE9BQStCO1FBQ3pDLEtBQUssQ0FBQyxFQUFFLEdBQUcsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFFcEQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLDZCQUFZLENBQUMsSUFBSSxFQUFFO1lBQ3BDLGNBQWMsRUFBRSxrQkFBYyxDQUFDLE9BQU87WUFDdEMsR0FBRyxPQUFPO1NBQ1gsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUMsYUFBYSxJQUFJLFFBQVEsQ0FBQztRQUN2RCxJQUFJLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQyxhQUFhLElBQUksT0FBTyxDQUFDO1FBRXRELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxXQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENB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RSxFQUFFO2dCQUNqQixTQUFTLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7YUFDOUI7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7XG4gIEF3c0Nka0RlcHMsXG4gIEF3c0Nka0RlcHNDb21tb25PcHRpb25zLFxuICBDZGtDb25maWdDb21tb25PcHRpb25zLFxufSBmcm9tIFwiLlwiO1xuaW1wb3J0IHsgQ2RrQ29uZmlnLCBDZGtUYXNrcyB9IGZyb20gXCIuXCI7XG5pbXBvcnQgeyBDb21wb25lbnQsIERlcGVuZGVuY3lUeXBlLCBTYW1wbGVEaXIsIFNhbXBsZUZpbGUgfSBmcm9tIFwiLi5cIjtcbmltcG9ydCB7IEF3c0Nka0RlcHNQeSB9IGZyb20gXCIuL2F3c2Nkay1kZXBzLXB5XCI7XG5pbXBvcnQgeyBBd3NDZGtQeXRlc3RTYW1wbGUgfSBmcm9tIFwiLi9hd3NjZGstcHl0ZXN0LXNhbXBsZVwiO1xuaW1wb3J0IHsgUHl0ZXN0IH0gZnJvbSBcIi4uL3B5dGhvbi9weXRlc3RcIjtcbmltcG9ydCB0eXBlIHsgUHl0aG9uUHJvamVjdE9wdGlvbnMgfSBmcm9tIFwiLi4vcHl0aG9uL3B5dGhvbi1wcm9qZWN0XCI7XG5pbXBvcnQgeyBQeXRob25Qcm9qZWN0IH0gZnJvbSBcIi4uL3B5dGhvbi9weXRob24tcHJvamVjdFwiO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGBBd3NDZGtQeXRob25BcHBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXdzQ2RrUHl0aG9uQXBwT3B0aW9uc1xuICBleHRlbmRzXG4gICAgUHl0aG9uUHJvamVjdE9wdGlvbnMsXG4gICAgQ2RrQ29uZmlnQ29tbW9uT3B0aW9ucyxcbiAgICBBd3NDZGtEZXBzQ29tbW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgQ0RLIGFwcCdzIGVudHJ5cG9pbnQgKHJlbGF0aXZlIHRvIHRoZSBzb3VyY2UgZGlyZWN0b3J5LCB3aGljaCBpc1xuICAgKiBcInNyY1wiIGJ5IGRlZmF1bHQpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBcImFwcC5weVwiXG4gICAqL1xuICByZWFkb25seSBhcHBFbnRyeXBvaW50Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEFXUyBDREsgYXBwIGluIFB5dGhvblxuICpcbiAqIEBwamlkIGF3c2Nkay1hcHAtcHlcbiAqL1xuZXhwb3J0IGNsYXNzIEF3c0Nka1B5dGhvbkFwcCBleHRlbmRzIFB5dGhvblByb2plY3Qge1xuICAvKipcbiAgICogQ29tbW9uIENESyB0YXNrcy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjZGtUYXNrczogQ2RrVGFza3M7XG5cbiAgLyoqXG4gICAqIGNkay5qc29uIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY2RrQ29uZmlnOiBDZGtDb25maWc7XG5cbiAgcHVibGljIHJlYWRvbmx5IGNka0RlcHM6IEF3c0Nka0RlcHM7XG5cbiAgLyoqXG4gICAqIFRoZSBDREsgYXBwIGVudHJ5cG9pbnRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhcHBFbnRyeXBvaW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlIHB5dGhvbiBzYW1wbGUgdGVzdHMgcmVzaWRlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNhbXBsZVRlc3RkaXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIENESyB2ZXJzaW9uIHRoaXMgYXBwIGlzIHVzaW5nLlxuICAgKi9cbiAgcHVibGljIGdldCBjZGtWZXJzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLmNka0RlcHMuY2RrVmVyc2lvbjtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEF3c0Nka1B5dGhvbkFwcE9wdGlvbnMpIHtcbiAgICBzdXBlcih7IC4uLm9wdGlvbnMsIHB5dGVzdDogZmFsc2UsIHNhbXBsZTogZmFsc2UgfSk7XG5cbiAgICB0aGlzLmNka0RlcHMgPSBuZXcgQXdzQ2RrRGVwc1B5KHRoaXMsIHtcbiAgICAgIGRlcGVuZGVuY3lUeXBlOiBEZXBlbmRlbmN5VHlwZS5SVU5USU1FLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcbiAgICB0aGlzLmFwcEVudHJ5cG9pbnQgPSBvcHRpb25zLmFwcEVudHJ5cG9pbnQgPz8gXCJhcHAucHlcIjtcbiAgICB0aGlzLnNhbXBsZVRlc3RkaXIgPSBvcHRpb25zLnNhbXBsZVRlc3RkaXIgPz8gXCJ0ZXN0c1wiO1xuXG4gICAgdGhpcy5jZGtUYXNrcyA9IG5ldyBDZGtUYXNrcyh0aGlzKTtcbiAgICB0aGlzLnBvc3RDb21waWxlVGFzay5zcGF3bih0aGlzLmNka1Rhc2tzLnN5bnRoU2lsZW50KTtcblxuICAgIHRoaXMuY2RrQ29uZmlnID0gbmV3IENka0NvbmZpZyh0aGlzLCB7XG4gICAgICBhcHA6IGBweXRob24gJHt0aGlzLmFwcEVudHJ5cG9pbnR9YCxcbiAgICAgIHdhdGNoSW5jbHVkZXM6IFtcIioqXCJdLFxuICAgICAgd2F0Y2hFeGNsdWRlczogW1xuICAgICAgICBcIlJFQURNRS5tZFwiLFxuICAgICAgICBcImNkayouanNvblwiLFxuICAgICAgICBcInJlcXVpcmVtZW50cyoudHh0XCIsXG4gICAgICAgIFwic291cmNlLmJhdFwiLFxuICAgICAgICBcIioqL19faW5pdF9fLnB5XCIsXG4gICAgICAgIFwicHl0aG9uL19fcHljYWNoZV9fXCIsXG4gICAgICAgIFwidGVzdHNcIixcbiAgICAgIF0sXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuXG4gICAgaWYgKG9wdGlvbnMuc2FtcGxlID8/IHRydWUpIHtcbiAgICAgIG5ldyBBcHBDb2RlKHRoaXMsIHRoaXMuYXBwRW50cnlwb2ludCk7XG4gICAgICBuZXcgTXlTdGFja0NvZGUodGhpcywgdGhpcy5tb2R1bGVOYW1lKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5weXRlc3QgPz8gdHJ1ZSkge1xuICAgICAgdGhpcy5weXRlc3QgPSBuZXcgUHl0ZXN0KHRoaXMsIG9wdGlvbnMucHl0ZXN0T3B0aW9ucyk7XG4gICAgICBuZXcgQXdzQ2RrUHl0ZXN0U2FtcGxlKHRoaXMsIHRoaXMuc2FtcGxlVGVzdGRpcik7XG4gICAgfVxuICB9XG59XG5cbmNsYXNzIEFwcENvZGUgZXh0ZW5kcyBDb21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBBd3NDZGtQeXRob25BcHAsIGZpbGVOYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihwcm9qZWN0KTtcblxuICAgIGNvbnN0IHZlcnNpb25JbXBvcnQgPSBcImZyb20gYXdzX2NkayBpbXBvcnQgQXBwLCBFbnZpcm9ubWVudFwiO1xuXG4gICAgbmV3IFNhbXBsZUZpbGUocHJvamVjdCwgZmlsZU5hbWUsIHtcbiAgICAgIGNvbnRlbnRzOiBbXG4gICAgICAgIFwiaW1wb3J0IG9zXCIsXG4gICAgICAgIHZlcnNpb25JbXBvcnQsXG4gICAgICAgIGBmcm9tICR7cHJvamVjdC5tb2R1bGVOYW1lfS5tYWluIGltcG9ydCBNeVN0YWNrYCxcbiAgICAgICAgXCJcIixcbiAgICAgICAgXCIjIGZvciBkZXZlbG9wbWVudCwgdXNlIGFjY291bnQvcmVnaW9uIGZyb20gY2RrIGNsaVwiLFxuICAgICAgICBcImRldl9lbnYgPSBFbnZpcm9ubWVudChcIixcbiAgICAgICAgXCIgIGFjY291bnQ9b3MuZ2V0ZW52KCdDREtfREVGQVVMVF9BQ0NPVU5UJyksXCIsXG4gICAgICAgIFwiICByZWdpb249b3MuZ2V0ZW52KCdDREtfREVGQVVMVF9SRUdJT04nKVwiLFxuICAgICAgICBcIilcIixcbiAgICAgICAgXCJcIixcbiAgICAgICAgXCJhcHAgPSBBcHAoKVwiLFxuICAgICAgICBgTXlTdGFjayhhcHAsIFwiJHt0aGlzLnByb2plY3QubmFtZX0tZGV2XCIsIGVudj1kZXZfZW52KWAsXG4gICAgICAgIGAjIE15U3RhY2soYXBwLCBcIiR7dGhpcy5wcm9qZWN0Lm5hbWV9LXByb2RcIiwgZW52PXByb2RfZW52KWAsXG4gICAgICAgIFwiXCIsXG4gICAgICAgIFwiYXBwLnN5bnRoKClcIixcbiAgICAgIF0uam9pbihcIlxcblwiKSxcbiAgICB9KTtcbiAgfVxufVxuXG5jbGFzcyBNeVN0YWNrQ29kZSBleHRlbmRzIENvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb2plY3Q6IEF3c0Nka1B5dGhvbkFwcCwgZGlyOiBzdHJpbmcpIHtcbiAgICBzdXBlcihwcm9qZWN0KTtcblxuICAgIGxldCBhcHBGaWxlOiBzdHJpbmdbXSA9IFtdO1xuICAgIGFwcEZpbGUucHVzaChcImltcG9ydCBvc1wiKTtcbiAgICBhcHBGaWxlLnB1c2goXCJmcm9tIGF3c19jZGsgaW1wb3J0IFN0YWNrXCIpO1xuICAgIGFwcEZpbGUucHVzaChcImZyb20gY29uc3RydWN0cyBpbXBvcnQgQ29uc3RydWN0XCIpO1xuICAgIGFwcEZpbGUucHVzaChcIlwiKTtcbiAgICBhcHBGaWxlLnB1c2goXCJcIik7XG4gICAgYXBwRmlsZS5wdXNoKFwiY2xhc3MgTXlTdGFjayhTdGFjayk6XCIpO1xuICAgIGFwcEZpbGUucHVzaChcbiAgICAgIFwiICBkZWYgX19pbml0X18oc2VsZiwgc2NvcGU6IENvbnN0cnVjdCwgY29uc3RydWN0X2lkOiBzdHIsICoqa3dhcmdzKSAtPiBOb25lOlwiLFxuICAgICk7XG4gICAgYXBwRmlsZS5wdXNoKFwiICAgIHN1cGVyKCkuX19pbml0X18oc2NvcGUsIGNvbnN0cnVjdF9pZCwgKiprd2FyZ3MpXCIpO1xuICAgIGFwcEZpbGUucHVzaChcIlwiKTtcbiAgICBhcHBGaWxlLnB1c2goXCIgICAgIyBUaGUgY29kZSB0aGF0IGRlZmluZXMgeW91ciBzdGFjayBnb2VzIGhlcmVcIik7XG4gICAgYXBwRmlsZS5wdXNoKFwiXCIpO1xuXG4gICAgbmV3IFNhbXBsZURpcihwcm9qZWN0LCBkaXIsIHtcbiAgICAgIGZpbGVzOiB7XG4gICAgICAgIFwiX19pbml0X18ucHlcIjogXCJcIixcbiAgICAgICAgXCJtYWluLnB5XCI6IGFwcEZpbGUuam9pbihcIlxcblwiKSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==