jets_bb_fork 0.0.4
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.
- checksums.yaml +7 -0
- data/.circleci/bin/commit_docs.sh +26 -0
- data/.circleci/config.yml +126 -0
- data/.codebuild/README.md +68 -0
- data/.codebuild/bin/jets +3 -0
- data/.codebuild/buildspec-base.yml +14 -0
- data/.codebuild/integration.sh +72 -0
- data/.codebuild/jets.postman_collection.json +323 -0
- data/.codebuild/scripts/install-docker.sh +12 -0
- data/.codebuild/scripts/install-dynamodb-local.sh +22 -0
- data/.codebuild/scripts/install-java.sh +22 -0
- data/.codebuild/scripts/install-node.sh +4 -0
- data/.github/ISSUE_TEMPLATE.md +7 -0
- data/.github/ISSUE_TEMPLATE/bug_report.md +84 -0
- data/.github/ISSUE_TEMPLATE/documentation.md +27 -0
- data/.github/ISSUE_TEMPLATE/feature_request.md +64 -0
- data/.github/ISSUE_TEMPLATE/question.md +16 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +42 -0
- data/.gitignore +24 -0
- data/.gitmodules +0 -0
- data/.python-version +1 -0
- data/.rspec +4 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +734 -0
- data/CONDUCT.md +1 -0
- data/CONTRIBUTING.md +1 -0
- data/Dockerfile +16 -0
- data/Dockerfile.base +53 -0
- data/Gemfile +14 -0
- data/Guardfile +22 -0
- data/LICENSE.txt +22 -0
- data/Procfile +2 -0
- data/README.md +203 -0
- data/Rakefile +24 -0
- data/backers.md +16 -0
- data/bin/release +9 -0
- data/buildspec.yml +18 -0
- data/exe/jets_bb_fork +14 -0
- data/jets.gemspec +68 -0
- data/lib/jets.rb +27 -0
- data/lib/jets/application.rb +216 -0
- data/lib/jets/application/defaults.rb +172 -0
- data/lib/jets/autoloaders.rb +97 -0
- data/lib/jets/aws_info.rb +113 -0
- data/lib/jets/aws_services.rb +65 -0
- data/lib/jets/aws_services/global_memoist.rb +57 -0
- data/lib/jets/aws_services/s3_bucket.rb +34 -0
- data/lib/jets/aws_services/stack_status.rb +59 -0
- data/lib/jets/booter.rb +119 -0
- data/lib/jets/builders/code_builder.rb +399 -0
- data/lib/jets/builders/code_size.rb +57 -0
- data/lib/jets/builders/gem_replacer.rb +76 -0
- data/lib/jets/builders/handler_generator.rb +186 -0
- data/lib/jets/builders/lambda_layer.rb +69 -0
- data/lib/jets/builders/md5.rb +60 -0
- data/lib/jets/builders/md5_zip.rb +61 -0
- data/lib/jets/builders/purger.rb +35 -0
- data/lib/jets/builders/rack_packager.rb +51 -0
- data/lib/jets/builders/rackup_wrappers/rackup +19 -0
- data/lib/jets/builders/rackup_wrappers/rackup.rb +7 -0
- data/lib/jets/builders/reconfigure_rails.rb +114 -0
- data/lib/jets/builders/reconfigure_rails/config/initializers/jets.rb +16 -0
- data/lib/jets/builders/ruby_packager.rb +207 -0
- data/lib/jets/builders/shim_vars/app.rb +78 -0
- data/lib/jets/builders/shim_vars/base.rb +25 -0
- data/lib/jets/builders/shim_vars/shared.rb +37 -0
- data/lib/jets/builders/templates/handler.rb +12 -0
- data/lib/jets/builders/tidy.rb +107 -0
- data/lib/jets/builders/util.rb +31 -0
- data/lib/jets/bundle.rb +82 -0
- data/lib/jets/camelizer.rb +71 -0
- data/lib/jets/cfn/builders/api_deployment_builder.rb +63 -0
- data/lib/jets/cfn/builders/api_gateway_builder.rb +157 -0
- data/lib/jets/cfn/builders/base_child_builder.rb +75 -0
- data/lib/jets/cfn/builders/controller_builder.rb +42 -0
- data/lib/jets/cfn/builders/function_builder.rb +14 -0
- data/lib/jets/cfn/builders/interface.rb +137 -0
- data/lib/jets/cfn/builders/job_builder.rb +14 -0
- data/lib/jets/cfn/builders/paged.rb +37 -0
- data/lib/jets/cfn/builders/parent_builder.rb +100 -0
- data/lib/jets/cfn/builders/rule_builder.rb +24 -0
- data/lib/jets/cfn/builders/shared_builder.rb +14 -0
- data/lib/jets/cfn/ship.rb +185 -0
- data/lib/jets/cfn/status.rb +212 -0
- data/lib/jets/cfn/upload.rb +139 -0
- data/lib/jets/cli.rb +194 -0
- data/lib/jets/commands/base.rb +146 -0
- data/lib/jets/commands/build.rb +234 -0
- data/lib/jets/commands/call.rb +169 -0
- data/lib/jets/commands/call/anonymous_guesser.rb +96 -0
- data/lib/jets/commands/call/autoload_guesser.rb +136 -0
- data/lib/jets/commands/call/base_guesser.rb +60 -0
- data/lib/jets/commands/call/guesser.rb +48 -0
- data/lib/jets/commands/clean.rb +19 -0
- data/lib/jets/commands/clean/base.rb +24 -0
- data/lib/jets/commands/clean/build.rb +13 -0
- data/lib/jets/commands/clean/log.rb +107 -0
- data/lib/jets/commands/console.rb +12 -0
- data/lib/jets/commands/db.rb +13 -0
- data/lib/jets/commands/db/environment-task.rake +3 -0
- data/lib/jets/commands/db/tasks.rb +44 -0
- data/lib/jets/commands/dbconsole.rb +131 -0
- data/lib/jets/commands/delete.rb +143 -0
- data/lib/jets/commands/deploy.rb +141 -0
- data/lib/jets/commands/dynamodb.rb +19 -0
- data/lib/jets/commands/dynamodb/migrate.rb +9 -0
- data/lib/jets/commands/dynamodb/migrator.rb +36 -0
- data/lib/jets/commands/gems.rb +21 -0
- data/lib/jets/commands/help.rb +9 -0
- data/lib/jets/commands/help/build.md +6 -0
- data/lib/jets/commands/help/call.md +61 -0
- data/lib/jets/commands/help/clean/build.md +5 -0
- data/lib/jets/commands/help/clean/log.md +5 -0
- data/lib/jets/commands/help/console.md +18 -0
- data/lib/jets/commands/help/db/generate.md +8 -0
- data/lib/jets/commands/help/dbconsole.md +9 -0
- data/lib/jets/commands/help/delete.md +22 -0
- data/lib/jets/commands/help/deploy.md +32 -0
- data/lib/jets/commands/help/destroy.md +16 -0
- data/lib/jets/commands/help/dynamodb/generate.md +52 -0
- data/lib/jets/commands/help/dynamodb/migrate.md +4 -0
- data/lib/jets/commands/help/gems/check.md +8 -0
- data/lib/jets/commands/help/generate.md +22 -0
- data/lib/jets/commands/help/import/rack.md +13 -0
- data/lib/jets/commands/help/import/rails.md +11 -0
- data/lib/jets/commands/help/new.md +42 -0
- data/lib/jets/commands/help/routes.md +16 -0
- data/lib/jets/commands/help/runner.md +17 -0
- data/lib/jets/commands/help/server.md +15 -0
- data/lib/jets/commands/help/status.md +14 -0
- data/lib/jets/commands/help/upgrade.md +5 -0
- data/lib/jets/commands/help/url.md +6 -0
- data/lib/jets/commands/import.rb +12 -0
- data/lib/jets/commands/import/base.rb +49 -0
- data/lib/jets/commands/import/cheatsheet.rb +35 -0
- data/lib/jets/commands/import/rack.rb +16 -0
- data/lib/jets/commands/import/rails.rb +74 -0
- data/lib/jets/commands/import/sequence.rb +90 -0
- data/lib/jets/commands/import/templates/config/database.yml +26 -0
- data/lib/jets/commands/import/templates/submodules-cheatsheet.md +89 -0
- data/lib/jets/commands/main.rb +157 -0
- data/lib/jets/commands/markdown/creator.rb +58 -0
- data/lib/jets/commands/markdown/index.rb +27 -0
- data/lib/jets/commands/markdown/page.rb +125 -0
- data/lib/jets/commands/markdown/shell.rb +11 -0
- data/lib/jets/commands/new.rb +157 -0
- data/lib/jets/commands/rake_command.rb +61 -0
- data/lib/jets/commands/rake_tasks.rb +46 -0
- data/lib/jets/commands/runner.rb +16 -0
- data/lib/jets/commands/sequence.rb +99 -0
- data/lib/jets/commands/stack_info.rb +30 -0
- data/lib/jets/commands/templates/skeleton/.gitignore +12 -0
- data/lib/jets/commands/templates/skeleton/.jetskeep +1 -0
- data/lib/jets/commands/templates/skeleton/.rspec +3 -0
- data/lib/jets/commands/templates/skeleton/Gemfile.tt +38 -0
- data/lib/jets/commands/templates/skeleton/Procfile +7 -0
- data/lib/jets/commands/templates/skeleton/README.md +11 -0
- data/lib/jets/commands/templates/skeleton/Rakefile +2 -0
- data/lib/jets/commands/templates/skeleton/app/controllers/application_controller.rb +2 -0
- data/lib/jets/commands/templates/skeleton/app/helpers/application_helper.rb +2 -0
- data/lib/jets/commands/templates/skeleton/app/jobs/application_job.rb +4 -0
- data/lib/jets/commands/templates/skeleton/app/models/application_item.rb +2 -0
- data/lib/jets/commands/templates/skeleton/app/models/application_record.rb +3 -0
- data/lib/jets/commands/templates/skeleton/app/views/layouts/application.html.erb.tt +25 -0
- data/lib/jets/commands/templates/skeleton/config.ru +5 -0
- data/lib/jets/commands/templates/skeleton/config/application.rb.tt +67 -0
- data/lib/jets/commands/templates/skeleton/config/database.yml.tt +26 -0
- data/lib/jets/commands/templates/skeleton/config/dynamodb.yml +22 -0
- data/lib/jets/commands/templates/skeleton/config/environments/development.rb +7 -0
- data/lib/jets/commands/templates/skeleton/config/environments/production.rb +9 -0
- data/lib/jets/commands/templates/skeleton/config/environments/test.rb +7 -0
- data/lib/jets/commands/templates/skeleton/config/routes.rb +9 -0
- data/lib/jets/commands/templates/skeleton/db/.gitkeep +0 -0
- data/lib/jets/commands/templates/skeleton/public/404.html +67 -0
- data/lib/jets/commands/templates/skeleton/public/422.html +67 -0
- data/lib/jets/commands/templates/skeleton/public/500.html +66 -0
- data/lib/jets/commands/templates/skeleton/public/favicon.ico +0 -0
- data/lib/jets/commands/templates/skeleton/public/index.html.tt +91 -0
- data/lib/jets/commands/templates/skeleton/spec/controllers/posts_controller_spec.rb +15 -0
- data/lib/jets/commands/templates/skeleton/spec/fixtures/payloads/posts-index.json +51 -0
- data/lib/jets/commands/templates/skeleton/spec/fixtures/payloads/posts-show.json +53 -0
- data/lib/jets/commands/templates/skeleton/spec/spec_helper.rb.tt +30 -0
- data/lib/jets/commands/templates/webpacker/app/javascript/packs/application.js.tt +14 -0
- data/lib/jets/commands/templates/webpacker/app/javascript/packs/theme.scss.tt +24 -0
- data/lib/jets/commands/templates/webpacker/app/javascript/src/jets/crud.js +87 -0
- data/lib/jets/commands/upgrade.rb +145 -0
- data/lib/jets/commands/upgrade/templates/bin/webpack +19 -0
- data/lib/jets/commands/upgrade/templates/bin/webpack-dev-server +19 -0
- data/lib/jets/commands/url.rb +68 -0
- data/lib/jets/commands/webpacker_template.rb +18 -0
- data/lib/jets/controller.rb +3 -0
- data/lib/jets/controller/base.rb +108 -0
- data/lib/jets/controller/callbacks.rb +68 -0
- data/lib/jets/controller/cookies.rb +38 -0
- data/lib/jets/controller/cookies/jar.rb +269 -0
- data/lib/jets/controller/layout.rb +17 -0
- data/lib/jets/controller/middleware/cors.rb +60 -0
- data/lib/jets/controller/middleware/local.rb +116 -0
- data/lib/jets/controller/middleware/local/api_gateway.rb +93 -0
- data/lib/jets/controller/middleware/local/mimic_aws_call.rb +38 -0
- data/lib/jets/controller/middleware/local/route_matcher.rb +106 -0
- data/lib/jets/controller/middleware/main.rb +46 -0
- data/lib/jets/controller/middleware/reloader.rb +15 -0
- data/lib/jets/controller/middleware/webpacker_setup.rb +6 -0
- data/lib/jets/controller/params.rb +87 -0
- data/lib/jets/controller/rack/adapter.rb +88 -0
- data/lib/jets/controller/rack/env.rb +105 -0
- data/lib/jets/controller/redirection.rb +55 -0
- data/lib/jets/controller/rendering.rb +79 -0
- data/lib/jets/controller/rendering/rack_renderer.rb +250 -0
- data/lib/jets/controller/request.rb +29 -0
- data/lib/jets/controller/response.rb +61 -0
- data/lib/jets/controller/stage.rb +33 -0
- data/lib/jets/core.rb +149 -0
- data/lib/jets/core_ext/kernel.rb +13 -0
- data/lib/jets/db.rb +15 -0
- data/lib/jets/dotenv.rb +48 -0
- data/lib/jets/dotenv/ssm.rb +48 -0
- data/lib/jets/erb.rb +51 -0
- data/lib/jets/generator.rb +48 -0
- data/lib/jets/generator/templates/erb/controller/view.html.erb +2 -0
- data/lib/jets/generator/templates/erb/scaffold/_form.html.erb +39 -0
- data/lib/jets/generator/templates/erb/scaffold/edit.html.erb +6 -0
- data/lib/jets/generator/templates/erb/scaffold/index.html.erb +29 -0
- data/lib/jets/generator/templates/erb/scaffold/new.html.erb +5 -0
- data/lib/jets/generator/templates/erb/scaffold/show.html.erb +9 -0
- data/lib/jets/generator/templates/rails/assets/javascript.js +2 -0
- data/lib/jets/generator/templates/rails/assets/stylesheet.css +4 -0
- data/lib/jets/generator/templates/rails/controller/controller.rb +13 -0
- data/lib/jets/generator/templates/rails/helper/helper.rb +4 -0
- data/lib/jets/generator/templates/rails/scaffold/scaffold.css +80 -0
- data/lib/jets/generator/templates/rails/scaffold_controller/api_controller.rb +62 -0
- data/lib/jets/generator/templates/rails/scaffold_controller/controller.rb +79 -0
- data/lib/jets/inflections.rb +32 -0
- data/lib/jets/internal/app/controllers/jets/mailers_controller.rb +97 -0
- data/lib/jets/internal/app/controllers/jets/public_controller.rb +31 -0
- data/lib/jets/internal/app/controllers/jets/rack_controller.rb +25 -0
- data/lib/jets/internal/app/functions/jets/base_path.rb +157 -0
- data/lib/jets/internal/app/helpers/jets/mailers_helper.rb +9 -0
- data/lib/jets/internal/app/jobs/jets/preheat_job.rb +70 -0
- data/lib/jets/internal/app/shared/functions/jets/s3_bucket_config.rb +43 -0
- data/lib/jets/internal/app/views/jets/mailers/email.html.erb +145 -0
- data/lib/jets/internal/app/views/jets/mailers/index.html.erb +8 -0
- data/lib/jets/internal/app/views/jets/mailers/mailer.html.erb +6 -0
- data/lib/jets/internal/turbines/jets/mailer.rb +51 -0
- data/lib/jets/job/base.rb +39 -0
- data/lib/jets/job/dsl.rb +40 -0
- data/lib/jets/job/dsl/dynamodb_event.rb +65 -0
- data/lib/jets/job/dsl/event_source_mapping.rb +11 -0
- data/lib/jets/job/dsl/iot_event.rb +24 -0
- data/lib/jets/job/dsl/kinesis_event.rb +46 -0
- data/lib/jets/job/dsl/log_event.rb +15 -0
- data/lib/jets/job/dsl/rule_event.rb +75 -0
- data/lib/jets/job/dsl/s3_event.rb +36 -0
- data/lib/jets/job/dsl/sns_event.rb +54 -0
- data/lib/jets/job/dsl/sqs_event.rb +96 -0
- data/lib/jets/job/helpers/kinesis_event_helper.rb +13 -0
- data/lib/jets/job/helpers/log_event_helper.rb +17 -0
- data/lib/jets/job/helpers/s3_event_helper.rb +13 -0
- data/lib/jets/klass.rb +109 -0
- data/lib/jets/lambda/dsl.rb +419 -0
- data/lib/jets/lambda/function.rb +29 -0
- data/lib/jets/lambda/function_constructor.rb +55 -0
- data/lib/jets/lambda/functions.rb +34 -0
- data/lib/jets/lambda/task.rb +111 -0
- data/lib/jets/logger.rb +21 -0
- data/lib/jets/mega/hash_converter.rb +25 -0
- data/lib/jets/mega/request.rb +139 -0
- data/lib/jets/mega/request/source.rb +21 -0
- data/lib/jets/middleware.rb +33 -0
- data/lib/jets/middleware/configurator.rb +84 -0
- data/lib/jets/middleware/default_stack.rb +51 -0
- data/lib/jets/middleware/layer.rb +34 -0
- data/lib/jets/middleware/stack.rb +77 -0
- data/lib/jets/naming.rb +49 -0
- data/lib/jets/overrides/lambda.rb +1 -0
- data/lib/jets/overrides/lambda/marshaller.rb +31 -0
- data/lib/jets/overrides/rails.rb +4 -0
- data/lib/jets/overrides/rails/asset_tag_helper.rb +114 -0
- data/lib/jets/overrides/rails/common_methods.rb +13 -0
- data/lib/jets/overrides/rails/rendering_helper.rb +26 -0
- data/lib/jets/overrides/rails/url_helper.rb +25 -0
- data/lib/jets/poly_fun.rb +73 -0
- data/lib/jets/poly_fun/base_executor.rb +125 -0
- data/lib/jets/poly_fun/lambda_executor.rb +16 -0
- data/lib/jets/poly_fun/node_error.rb +8 -0
- data/lib/jets/poly_fun/node_executor.rb +54 -0
- data/lib/jets/poly_fun/python_error.rb +8 -0
- data/lib/jets/poly_fun/python_executor.rb +23 -0
- data/lib/jets/preheat.rb +117 -0
- data/lib/jets/processors/deducer.rb +65 -0
- data/lib/jets/processors/main_processor.rb +61 -0
- data/lib/jets/rack_server.rb +86 -0
- data/lib/jets/rdoc.rb +30 -0
- data/lib/jets/resource.rb +71 -0
- data/lib/jets/resource/api_gateway/base_path/function.rb +42 -0
- data/lib/jets/resource/api_gateway/base_path/mapping.rb +44 -0
- data/lib/jets/resource/api_gateway/base_path/role.rb +76 -0
- data/lib/jets/resource/api_gateway/cors.rb +61 -0
- data/lib/jets/resource/api_gateway/deployment.rb +78 -0
- data/lib/jets/resource/api_gateway/domain_name.rb +59 -0
- data/lib/jets/resource/api_gateway/method.rb +98 -0
- data/lib/jets/resource/api_gateway/resource.rb +101 -0
- data/lib/jets/resource/api_gateway/rest_api.rb +56 -0
- data/lib/jets/resource/api_gateway/rest_api/change_detection.rb +42 -0
- data/lib/jets/resource/api_gateway/rest_api/logical_id.rb +63 -0
- data/lib/jets/resource/api_gateway/rest_api/routes.rb +7 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/change.rb +8 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/change/base.rb +130 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/change/to.rb +29 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/change/variable.rb +39 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/collision.rb +121 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/collision/variable_exception.rb +7 -0
- data/lib/jets/resource/associated.rb +37 -0
- data/lib/jets/resource/base.rb +28 -0
- data/lib/jets/resource/child_stack/api_deployment.rb +56 -0
- data/lib/jets/resource/child_stack/api_gateway.rb +53 -0
- data/lib/jets/resource/child_stack/app_class.rb +107 -0
- data/lib/jets/resource/child_stack/base.rb +24 -0
- data/lib/jets/resource/child_stack/shared.rb +92 -0
- data/lib/jets/resource/config/config_rule.rb +74 -0
- data/lib/jets/resource/config/managed_rule.rb +15 -0
- data/lib/jets/resource/events/rule.rb +31 -0
- data/lib/jets/resource/iam/application_role.rb +27 -0
- data/lib/jets/resource/iam/base_role_definition.rb +47 -0
- data/lib/jets/resource/iam/class_role.rb +74 -0
- data/lib/jets/resource/iam/function_role.rb +54 -0
- data/lib/jets/resource/iam/managed_policy.rb +22 -0
- data/lib/jets/resource/iam/policy_document.rb +41 -0
- data/lib/jets/resource/iot/topic_rule.rb +34 -0
- data/lib/jets/resource/lambda/event_source_mapping.rb +31 -0
- data/lib/jets/resource/lambda/function.rb +214 -0
- data/lib/jets/resource/lambda/function/environment.rb +62 -0
- data/lib/jets/resource/lambda/gem_layer.rb +17 -0
- data/lib/jets/resource/lambda/layer_version.rb +44 -0
- data/lib/jets/resource/logs/subscription_filter.rb +31 -0
- data/lib/jets/resource/permission.rb +45 -0
- data/lib/jets/resource/replacer.rb +85 -0
- data/lib/jets/resource/route53/record_set.rb +70 -0
- data/lib/jets/resource/s3/bucket.rb +24 -0
- data/lib/jets/resource/sns/subscription.rb +29 -0
- data/lib/jets/resource/sns/topic.rb +35 -0
- data/lib/jets/resource/sns/topic_policy.rb +40 -0
- data/lib/jets/resource/sqs/queue.rb +21 -0
- data/lib/jets/resource/standardizer.rb +42 -0
- data/lib/jets/route.rb +166 -0
- data/lib/jets/router.rb +177 -0
- data/lib/jets/router/scope.rb +30 -0
- data/lib/jets/rule/base.rb +19 -0
- data/lib/jets/rule/dsl.rb +110 -0
- data/lib/jets/spec_helpers.rb +54 -0
- data/lib/jets/spec_helpers/params.rb +10 -0
- data/lib/jets/spec_helpers/request.rb +78 -0
- data/lib/jets/spec_helpers/response.rb +5 -0
- data/lib/jets/stack.rb +88 -0
- data/lib/jets/stack/builder.rb +43 -0
- data/lib/jets/stack/definition.rb +50 -0
- data/lib/jets/stack/depends.rb +34 -0
- data/lib/jets/stack/depends/item.rb +9 -0
- data/lib/jets/stack/function.rb +69 -0
- data/lib/jets/stack/main.rb +4 -0
- data/lib/jets/stack/main/dsl.rb +28 -0
- data/lib/jets/stack/main/dsl/base.rb +49 -0
- data/lib/jets/stack/main/dsl/cloudwatch.rb +19 -0
- data/lib/jets/stack/main/dsl/iam.rb +8 -0
- data/lib/jets/stack/main/dsl/lambda.rb +83 -0
- data/lib/jets/stack/main/dsl/s3.rb +12 -0
- data/lib/jets/stack/main/dsl/sns.rb +16 -0
- data/lib/jets/stack/main/dsl/sqs.rb +10 -0
- data/lib/jets/stack/output.rb +35 -0
- data/lib/jets/stack/output/dsl.rb +19 -0
- data/lib/jets/stack/output/lookup.rb +36 -0
- data/lib/jets/stack/parameter.rb +37 -0
- data/lib/jets/stack/parameter/dsl.rb +42 -0
- data/lib/jets/stack/resource.rb +31 -0
- data/lib/jets/stack/resource/dsl.rb +19 -0
- data/lib/jets/stack/s3_event.rb +87 -0
- data/lib/jets/tmp_loader.rb +52 -0
- data/lib/jets/turbine.rb +41 -0
- data/lib/jets/turbo.rb +55 -0
- data/lib/jets/turbo/database_yaml.rb +41 -0
- data/lib/jets/turbo/project/.gitignore +12 -0
- data/lib/jets/turbo/project/.jetskeep +1 -0
- data/lib/jets/turbo/project/Gemfile +16 -0
- data/lib/jets/turbo/project/Rakefile +2 -0
- data/lib/jets/turbo/project/app/controllers/application_controller.rb +2 -0
- data/lib/jets/turbo/project/app/helpers/application_helper.rb +2 -0
- data/lib/jets/turbo/project/app/jobs/application_job.rb +4 -0
- data/lib/jets/turbo/project/config.ru +5 -0
- data/lib/jets/turbo/project/config/application.rb +4 -0
- data/lib/jets/turbo/project/config/routes.rb +4 -0
- data/lib/jets/turbo/rails.rb +127 -0
- data/lib/jets/turbo/templates/config/database.yml +26 -0
- data/lib/jets/util.rb +38 -0
- data/lib/jets/version.rb +3 -0
- data/readme/prerelease.md +6 -0
- data/readme/testing.md +60 -0
- metadata +1004 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
module Jets::Cfn::Builders
|
|
2
|
+
class ApiDeploymentBuilder
|
|
3
|
+
include Interface
|
|
4
|
+
include Jets::AwsServices
|
|
5
|
+
|
|
6
|
+
def initialize(options={})
|
|
7
|
+
@options = options
|
|
8
|
+
@template = ActiveSupport::HashWithIndifferentAccess.new(Resources: {})
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# template is an interface method
|
|
12
|
+
def template
|
|
13
|
+
@template
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# compose is an interface method
|
|
17
|
+
def compose
|
|
18
|
+
return unless @options[:templates] || @options[:stack_type] != :minimal
|
|
19
|
+
|
|
20
|
+
deployment = Jets::Resource::ApiGateway::Deployment.new
|
|
21
|
+
add_resource(deployment)
|
|
22
|
+
add_parameters(deployment.parameters)
|
|
23
|
+
add_outputs(deployment.outputs)
|
|
24
|
+
|
|
25
|
+
add_base_path_mapping
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Because Jets generates a new timestamped logical id for the API Deployment
|
|
29
|
+
# resource it also creates a new root base path mapping and fails. Additionally,
|
|
30
|
+
# the base path mapping depends on the API Deploy for the stage name.
|
|
31
|
+
#
|
|
32
|
+
# We resolve this by using a custom resource that does an in-place update.
|
|
33
|
+
#
|
|
34
|
+
# Note, also tried to change the domain name of to something like demo-dev-[random].mydomain.com
|
|
35
|
+
# but that does not work because the domain name has to match the route53 record exactly.
|
|
36
|
+
#
|
|
37
|
+
def add_base_path_mapping
|
|
38
|
+
return unless Jets.custom_domain?
|
|
39
|
+
|
|
40
|
+
function = Jets::Resource::ApiGateway::BasePath::Function.new
|
|
41
|
+
add_resource(function)
|
|
42
|
+
add_outputs(function.outputs)
|
|
43
|
+
|
|
44
|
+
mapping = Jets::Resource::ApiGateway::BasePath::Mapping.new
|
|
45
|
+
add_resource(mapping)
|
|
46
|
+
add_outputs(mapping.outputs)
|
|
47
|
+
|
|
48
|
+
iam_role = Jets::Resource::ApiGateway::BasePath::Role.new
|
|
49
|
+
add_resource(iam_role)
|
|
50
|
+
add_outputs(iam_role.outputs)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# template_path is an interface method
|
|
54
|
+
def template_path
|
|
55
|
+
Jets::Naming.api_deployment_template_path
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# do not bother writing a template if routes are empty
|
|
59
|
+
def write
|
|
60
|
+
super unless Jets::Router.routes.empty?
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
module Jets::Cfn::Builders
|
|
2
|
+
class ApiGatewayBuilder
|
|
3
|
+
extend Memoist
|
|
4
|
+
include Interface
|
|
5
|
+
include Paged
|
|
6
|
+
include Jets::AwsServices
|
|
7
|
+
|
|
8
|
+
AWS_OUTPUT_LIMIT = 60
|
|
9
|
+
|
|
10
|
+
def initialize(options={})
|
|
11
|
+
@options = options
|
|
12
|
+
push(ActiveSupport::HashWithIndifferentAccess.new(Resources: {}))
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# template is an interface method
|
|
16
|
+
def template
|
|
17
|
+
current_page
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# compose is an interface method
|
|
21
|
+
def compose
|
|
22
|
+
return unless @options[:templates] || @options[:stack_type] != :minimal
|
|
23
|
+
|
|
24
|
+
populate_base_template
|
|
25
|
+
add_gateway_routes
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# template_path is an interface method
|
|
29
|
+
def template_path
|
|
30
|
+
Jets::Naming.api_gateway_template_path("-#{current_page_number}")
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# do not bother writing a template if routes are empty
|
|
34
|
+
def write
|
|
35
|
+
super unless Jets::Router.routes.empty?
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# If the are routes in config/routes.rb add Gateway API in parent stack
|
|
39
|
+
def add_gateway_rest_api
|
|
40
|
+
rest_api = Jets::Resource::ApiGateway::RestApi.new
|
|
41
|
+
add_resource(rest_api)
|
|
42
|
+
add_outputs(rest_api.outputs)
|
|
43
|
+
|
|
44
|
+
deployment = Jets::Resource::ApiGateway::Deployment.new
|
|
45
|
+
outputs = deployment.outputs(true)
|
|
46
|
+
add_output("RestApiUrl", Value: outputs["RestApiUrl"])
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def add_custom_domain
|
|
50
|
+
return unless Jets.custom_domain?
|
|
51
|
+
add_domain_name
|
|
52
|
+
add_route53_dns if Jets.config.domain.route53
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def add_domain_name
|
|
56
|
+
domain_name = Jets::Resource::ApiGateway::DomainName.new
|
|
57
|
+
add_resource(domain_name)
|
|
58
|
+
add_outputs(domain_name.outputs)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def add_route53_dns
|
|
62
|
+
dns = Jets::Resource::Route53::RecordSet.new
|
|
63
|
+
add_resource(dns)
|
|
64
|
+
add_outputs(dns.outputs)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# The base template holds RestApi, DomainName, and DnsRecord
|
|
68
|
+
# The base template will be added to the parent template as "ApiGateway"
|
|
69
|
+
# Giving the original name will limit the number of changes required for
|
|
70
|
+
# the AWS 60 output limit change.
|
|
71
|
+
def populate_base_template
|
|
72
|
+
add_gateway_rest_api
|
|
73
|
+
add_custom_domain
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# Adds route related Resources and Outputs
|
|
77
|
+
def add_gateway_routes
|
|
78
|
+
# The routes required a Gateway Resource to contain them.
|
|
79
|
+
# TODO: Support more routes. Right now outputing all routes in 1 template will hit the 60 routes limit.
|
|
80
|
+
# Will have to either output them as a joined string or break this up to multiple templates.
|
|
81
|
+
# http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cloudformation-limits.html
|
|
82
|
+
# Outputs: Maximum number of outputs that you can declare in your AWS CloudFormation template. 60 outputs
|
|
83
|
+
# Output name: Maximum size of an output name. 255 characters.
|
|
84
|
+
#
|
|
85
|
+
# Note we must use .all_paths, not .routes here because we need to
|
|
86
|
+
# build the parent ApiGateway::Resource nodes also
|
|
87
|
+
indexed_paths.each do |path, page_number|
|
|
88
|
+
homepage = path == ''
|
|
89
|
+
next if homepage # handled by RootResourceId output already
|
|
90
|
+
turn_to_page(page_number)
|
|
91
|
+
resource = Jets::Resource::ApiGateway::Resource.new(path, internal: true, indexed_paths: indexed_paths)
|
|
92
|
+
add_resource(resource)
|
|
93
|
+
add_outputs_and_exports(resource.outputs)
|
|
94
|
+
add_gateway_routes_parameters(resource, page_number)
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# TODO : consider refactoring this to make intent more clear
|
|
99
|
+
def add_gateway_routes_parameters(resource, page_number)
|
|
100
|
+
add_parameter('RestApi', Description: 'RestApi')
|
|
101
|
+
add_parameter('RootResourceId', Description: 'RootResourceId')
|
|
102
|
+
resource.required_resources_from_parameters.each do |required_resource|
|
|
103
|
+
add_parameter(required_resource[:logical_id], Description: required_resource[:logical_id])
|
|
104
|
+
required_parameters_for_page = required_parameters[page_number] ||= []
|
|
105
|
+
required_parameters_for_page.push required_resource
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
# required_parameters will be used by the Parent Builder to know what parameters need to be passed
|
|
110
|
+
# to gateway template
|
|
111
|
+
def required_parameters
|
|
112
|
+
@required_parameters ||= []
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def add_outputs_and_exports(attributes)
|
|
116
|
+
attributes.each do |name,value|
|
|
117
|
+
camelized_name = name.to_s.camelize
|
|
118
|
+
add_output(camelized_name, value)
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# Gateway routes are split across multiple CloudFormation templates because of a 60 Output limit by AWS.
|
|
123
|
+
# Having a resource and its corresponding parent resource ( :ParentId ) in the same template is not guaranteed
|
|
124
|
+
# so routes are indexed up front to allow us to determine how to find :ParentId ( !Ref vs !ImportValue )
|
|
125
|
+
def indexed_paths
|
|
126
|
+
# indexed_paths is a Hash with key => path and value => page_number. Each page number represents a separate
|
|
127
|
+
# template for the routes contained in it.
|
|
128
|
+
# The reason for making the hash is we need to pass these indexed_paths to Jets::Resource::ApiGateway::Resource so it can
|
|
129
|
+
# easily determine what page a parent path is in.
|
|
130
|
+
# NOTE: that we are trying to keep Outputs to 60 and below, however, we are indexing "paths" here. Currently there
|
|
131
|
+
# is a one to one relationship to paths and outputs for Jets::Resource::ApiGateway::Resource. If that one to one changes
|
|
132
|
+
# this solution will not work
|
|
133
|
+
indexed_paths = Hash.new
|
|
134
|
+
# root path == RootResource which comes off RestApi and is in ApiGateway0
|
|
135
|
+
indexed_paths[''] = 0
|
|
136
|
+
starting_index = 0
|
|
137
|
+
page = 1
|
|
138
|
+
loop do
|
|
139
|
+
new_template # create new template here since we know we will need this page later
|
|
140
|
+
Jets::Router.all_paths[starting_index, AWS_OUTPUT_LIMIT].each do |path|
|
|
141
|
+
next if path.empty?
|
|
142
|
+
indexed_paths[path] = page
|
|
143
|
+
end
|
|
144
|
+
starting_index += AWS_OUTPUT_LIMIT
|
|
145
|
+
page += 1
|
|
146
|
+
break if starting_index >= Jets::Router.all_paths.length
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
indexed_paths
|
|
150
|
+
end
|
|
151
|
+
memoize :indexed_paths
|
|
152
|
+
|
|
153
|
+
def new_template
|
|
154
|
+
push(ActiveSupport::HashWithIndifferentAccess.new(Resources: {}))
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
end
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# Implements:
|
|
2
|
+
#
|
|
3
|
+
# * template_path
|
|
4
|
+
#
|
|
5
|
+
# FYI
|
|
6
|
+
#
|
|
7
|
+
# * compose implemented by the classes that include this
|
|
8
|
+
module Jets::Cfn::Builders
|
|
9
|
+
class BaseChildBuilder
|
|
10
|
+
include Interface
|
|
11
|
+
|
|
12
|
+
# The app_class is can be a controller, job or anonymous function class.
|
|
13
|
+
# IE: PostsController, HardJob
|
|
14
|
+
def initialize(app_class)
|
|
15
|
+
@app_class = app_class
|
|
16
|
+
@template = ActiveSupport::HashWithIndifferentAccess.new(Resources: {})
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# template is an interface method
|
|
20
|
+
def template
|
|
21
|
+
@template
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# template_path is an interface method for Interface module
|
|
25
|
+
def template_path
|
|
26
|
+
Jets::Naming.app_template_path(@app_class)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def add_common_parameters
|
|
30
|
+
common_parameters = Jets::Resource::ChildStack::AppClass.common_parameters
|
|
31
|
+
common_parameters.each do |k,_|
|
|
32
|
+
add_parameter(k, Description: k)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
depends_on_params.each do |output_key, output_value|
|
|
36
|
+
desc = output_value.gsub("!GetAtt ", "") # desc doesnt allow !GetAtt
|
|
37
|
+
add_parameter(output_key, Description: desc)
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def depends_on_params
|
|
42
|
+
return {} unless @app_class.depends_on
|
|
43
|
+
|
|
44
|
+
depends = Jets::Stack::Depends.new(@app_class.depends_on)
|
|
45
|
+
depends.params
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def add_functions
|
|
49
|
+
add_class_iam_policy
|
|
50
|
+
@app_class.tasks.each do |task|
|
|
51
|
+
add_function(task)
|
|
52
|
+
add_function_iam_policy(task)
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def add_function(task)
|
|
57
|
+
resource = Jets::Resource::Lambda::Function.new(task)
|
|
58
|
+
add_resource(resource)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def add_class_iam_policy
|
|
62
|
+
return unless @app_class.build_class_iam?
|
|
63
|
+
|
|
64
|
+
resource = Jets::Resource::Iam::ClassRole.new(@app_class)
|
|
65
|
+
add_resource(resource)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def add_function_iam_policy(task)
|
|
69
|
+
return unless task.build_function_iam?
|
|
70
|
+
|
|
71
|
+
resource = Jets::Resource::Iam::FunctionRole.new(task)
|
|
72
|
+
add_resource(resource)
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Implements:
|
|
2
|
+
#
|
|
3
|
+
# compose
|
|
4
|
+
# template_path
|
|
5
|
+
#
|
|
6
|
+
module Jets::Cfn::Builders
|
|
7
|
+
class ControllerBuilder < BaseChildBuilder
|
|
8
|
+
# compose is an interface method for Interface module
|
|
9
|
+
def compose
|
|
10
|
+
add_common_parameters
|
|
11
|
+
add_api_gateway_parameters
|
|
12
|
+
add_functions
|
|
13
|
+
add_routes
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def add_api_gateway_parameters
|
|
17
|
+
return if Jets::Router.routes.empty?
|
|
18
|
+
|
|
19
|
+
add_parameter("RestApi", Description: "RestApi")
|
|
20
|
+
scoped_routes.each do |route|
|
|
21
|
+
resource = Jets::Resource::ApiGateway::Resource.new(route.path)
|
|
22
|
+
add_parameter(resource.logical_id, Description: resource.desc)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def add_routes
|
|
27
|
+
scoped_routes.each_with_index do |route, i|
|
|
28
|
+
method = Jets::Resource::ApiGateway::Method.new(route)
|
|
29
|
+
add_resource(method)
|
|
30
|
+
add_resource(method.permission)
|
|
31
|
+
add_resource(method.cors) if Jets.config.cors
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# routes scoped to this controller template.
|
|
36
|
+
def scoped_routes
|
|
37
|
+
@routes ||= Jets::Router.routes.select do |route|
|
|
38
|
+
route.controller_name == @app_class.to_s
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Implements:
|
|
2
|
+
#
|
|
3
|
+
# compose
|
|
4
|
+
# template_path
|
|
5
|
+
#
|
|
6
|
+
module Jets::Cfn::Builders
|
|
7
|
+
class FunctionBuilder < BaseChildBuilder
|
|
8
|
+
# compose is an interface method for Interface module
|
|
9
|
+
def compose
|
|
10
|
+
add_common_parameters
|
|
11
|
+
add_functions
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# The class including this module should implement these methods:
|
|
2
|
+
#
|
|
3
|
+
# * compose
|
|
4
|
+
# * template_path
|
|
5
|
+
# * template
|
|
6
|
+
module Jets::Cfn::Builders
|
|
7
|
+
module Interface
|
|
8
|
+
extend Memoist
|
|
9
|
+
|
|
10
|
+
def build
|
|
11
|
+
# Do not bother building or writing the template unless there are functions defined
|
|
12
|
+
return if @app_class && !@app_class.build?
|
|
13
|
+
|
|
14
|
+
compose # must be implemented by subclass
|
|
15
|
+
write
|
|
16
|
+
self
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def write
|
|
20
|
+
if self.is_a? Paged
|
|
21
|
+
range.each do |page_num|
|
|
22
|
+
turn_to_page(page_num)
|
|
23
|
+
FileUtils.mkdir_p(File.dirname(template_path))
|
|
24
|
+
IO.write(template_path, text)
|
|
25
|
+
end
|
|
26
|
+
else
|
|
27
|
+
FileUtils.mkdir_p(File.dirname(template_path))
|
|
28
|
+
IO.write(template_path, text)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def cook_template
|
|
33
|
+
# need the to_hash or the YAML dump has
|
|
34
|
+
# !ruby/hash:ActiveSupport::HashWithIndifferentAccess
|
|
35
|
+
template.to_hash
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def text
|
|
39
|
+
text = YAML.dump(cook_template)
|
|
40
|
+
post_process_template(text)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# post process the text so that
|
|
44
|
+
# "!Ref IamRole" => !Ref IamRole
|
|
45
|
+
# We strip the surrounding quotes
|
|
46
|
+
def post_process_template(text)
|
|
47
|
+
results = text.split("\n").map do |line|
|
|
48
|
+
if line.include?(': "!') # IE: IamRole: "!Ref IamRole",
|
|
49
|
+
# IamRole: "!Ref IamRole" => IamRole: !Ref IamRole
|
|
50
|
+
line.sub(/: "(.*)"/, ': \1')
|
|
51
|
+
elsif line.include?('- "!') # IE: - "!GetAtt Foo.Arn"
|
|
52
|
+
# IamRole: - "!GetAtt Foo.Arn" => - !GetAtt Foo.Arn
|
|
53
|
+
line.sub(/- "(.*)"/, '- \1')
|
|
54
|
+
else
|
|
55
|
+
line
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
results.join("\n") + "\n"
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def add_parameters(attributes)
|
|
62
|
+
attributes.each do |name,value|
|
|
63
|
+
add_parameter(name.to_s.camelize, Description: value)
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def add_parameter(name, options={})
|
|
68
|
+
defaults = { Type: "String" }
|
|
69
|
+
options = defaults.merge(options)
|
|
70
|
+
template[:Parameters] ||= {}
|
|
71
|
+
template[:Parameters][name.to_s.camelize] = options
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def add_outputs(attributes)
|
|
75
|
+
attributes.each do |name,value|
|
|
76
|
+
add_output(name.to_s.camelize, Value: value)
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def add_output(name, options={})
|
|
81
|
+
template[:Outputs] ||= {}
|
|
82
|
+
template[:Outputs][name.camelize] = options
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def add_resources
|
|
86
|
+
@app_class.tasks.each do |task|
|
|
87
|
+
task.associated_resources.each do |associated|
|
|
88
|
+
resource = Jets::Resource.new(associated.definition, task.replacements)
|
|
89
|
+
add_resource(resource)
|
|
90
|
+
add_resource(resource.permission)
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def add_resource(resource)
|
|
96
|
+
add_template_resource(resource.logical_id, resource.type, resource.attributes)
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
# The add_resource method can take an options Hash with both with either
|
|
100
|
+
# top level attributes or properties.
|
|
101
|
+
#
|
|
102
|
+
# Example:
|
|
103
|
+
#
|
|
104
|
+
# Top level options:
|
|
105
|
+
#
|
|
106
|
+
# add_template_resource("MyId", "AWS::ApiGateway::RestApi",
|
|
107
|
+
# type: "AWS::ApiGateway::RestApi",
|
|
108
|
+
# properties: {
|
|
109
|
+
# name: "my-api"
|
|
110
|
+
# },
|
|
111
|
+
# depends_on: ["AnotherResource"]
|
|
112
|
+
# )
|
|
113
|
+
#
|
|
114
|
+
# Simple options with properties only:
|
|
115
|
+
#
|
|
116
|
+
# add_template_resource("MyId", "AWS::CloudFormationStack",
|
|
117
|
+
# template_url: "template_url",
|
|
118
|
+
# parameters: {},
|
|
119
|
+
# )
|
|
120
|
+
#
|
|
121
|
+
def add_template_resource(logical_id, type, options)
|
|
122
|
+
options = Jets::Camelizer.transform(options)
|
|
123
|
+
|
|
124
|
+
attributes = if options.include?('Type')
|
|
125
|
+
base = { 'Type' => type }
|
|
126
|
+
base.merge(options) # options are top-level attributes
|
|
127
|
+
else
|
|
128
|
+
{
|
|
129
|
+
'Type' => type,
|
|
130
|
+
'Properties' => options # options are properties
|
|
131
|
+
}
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
template['Resources'][logical_id] = attributes
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
end
|