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,42 @@
|
|
|
1
|
+
class Jets::Resource::ApiGateway::RestApi
|
|
2
|
+
class ChangeDetection
|
|
3
|
+
extend Memoist
|
|
4
|
+
include Jets::AwsServices
|
|
5
|
+
|
|
6
|
+
def changed?
|
|
7
|
+
return false unless parent_stack_exists?
|
|
8
|
+
current_binary_media_types != new_binary_media_types ||
|
|
9
|
+
Routes.changed?
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def new_binary_media_types
|
|
13
|
+
rest_api = Jets::Resource::ApiGateway::RestApi.new
|
|
14
|
+
rest_api.binary_media_types
|
|
15
|
+
end
|
|
16
|
+
memoize :new_binary_media_types
|
|
17
|
+
|
|
18
|
+
# Duplicated in rest_api/change_detection.rb, base_path/role.rb, rest_api/routes.rb
|
|
19
|
+
def current_binary_media_types
|
|
20
|
+
return nil unless parent_stack_exists?
|
|
21
|
+
|
|
22
|
+
stack = cfn.describe_stacks(stack_name: parent_stack_name).stacks.first
|
|
23
|
+
|
|
24
|
+
api_gateway_stack_arn = lookup(stack[:outputs], "ApiGateway")
|
|
25
|
+
|
|
26
|
+
stack = cfn.describe_stacks(stack_name: api_gateway_stack_arn).stacks.first
|
|
27
|
+
rest_api_id = lookup(stack[:outputs], "RestApi")
|
|
28
|
+
|
|
29
|
+
resp = apigateway.get_rest_api(rest_api_id: rest_api_id)
|
|
30
|
+
resp.binary_media_types
|
|
31
|
+
end
|
|
32
|
+
memoize :current_binary_media_types
|
|
33
|
+
|
|
34
|
+
def parent_stack_exists?
|
|
35
|
+
stack_exists?(parent_stack_name)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def parent_stack_name
|
|
39
|
+
Jets::Naming.parent_stack_name
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
class Jets::Resource::ApiGateway::RestApi
|
|
2
|
+
class LogicalId
|
|
3
|
+
extend Memoist
|
|
4
|
+
include Jets::AwsServices
|
|
5
|
+
|
|
6
|
+
def get
|
|
7
|
+
return default unless stack_exists?(parent_stack_name) && api_gateway_exists?
|
|
8
|
+
|
|
9
|
+
if changed?
|
|
10
|
+
new_id
|
|
11
|
+
else
|
|
12
|
+
current
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def changed?
|
|
17
|
+
change_detection = ChangeDetection.new
|
|
18
|
+
change_detection.changed?
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# Takes current logical id and increments the number that is appended to it.
|
|
22
|
+
#
|
|
23
|
+
# Examples:
|
|
24
|
+
#
|
|
25
|
+
# RestApi => RestApi1
|
|
26
|
+
# RestApi1 => RestApi2
|
|
27
|
+
# RestApi2 => RestApi3
|
|
28
|
+
# RestApi7 => RestApi8
|
|
29
|
+
def new_id
|
|
30
|
+
regexp = /(\d+)/
|
|
31
|
+
md = current.match(regexp)
|
|
32
|
+
if md
|
|
33
|
+
current.gsub(regexp,'') + (md[1].to_i + 1).to_s
|
|
34
|
+
else
|
|
35
|
+
current + "1"
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def current
|
|
40
|
+
resources = cfn.describe_stack_resources(stack_name: api_gateway_stack_arn).stack_resources
|
|
41
|
+
rest_api = resources.find { |r| r.resource_type == 'AWS::ApiGateway::RestApi' }
|
|
42
|
+
rest_api.logical_resource_id
|
|
43
|
+
end
|
|
44
|
+
memoize :current
|
|
45
|
+
|
|
46
|
+
def api_gateway_stack_arn
|
|
47
|
+
stack = cfn.describe_stacks(stack_name: parent_stack_name).stacks.first
|
|
48
|
+
lookup(stack[:outputs], "ApiGateway") # api_gateway_stack_arn
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def api_gateway_exists?
|
|
52
|
+
!!api_gateway_stack_arn
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def parent_stack_name
|
|
56
|
+
Jets::Naming.parent_stack_name
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def default
|
|
60
|
+
"RestApi"
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
class Jets::Resource::ApiGateway::RestApi::Routes::Change
|
|
2
|
+
class Base
|
|
3
|
+
extend Memoist
|
|
4
|
+
include Jets::AwsServices
|
|
5
|
+
|
|
6
|
+
# Build up deployed routes from the existing CloudFormation resources.
|
|
7
|
+
def deployed_routes
|
|
8
|
+
routes = []
|
|
9
|
+
|
|
10
|
+
resources, position = [], true
|
|
11
|
+
while position
|
|
12
|
+
position = nil if position == true # start of loop
|
|
13
|
+
resp = apigateway.get_resources(
|
|
14
|
+
rest_api_id: rest_api_id,
|
|
15
|
+
position: position,
|
|
16
|
+
)
|
|
17
|
+
resources += resp.items
|
|
18
|
+
position = resp.position
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
resources.each do |resource|
|
|
22
|
+
resource_methods = resource.resource_methods
|
|
23
|
+
next if resource_methods.nil?
|
|
24
|
+
|
|
25
|
+
resource_methods.each do |http_verb, resource_method|
|
|
26
|
+
# puts "#{http_verb} #{resource.path} | resource.id #{resource.id}"
|
|
27
|
+
# puts to(resource.id, http_verb)
|
|
28
|
+
|
|
29
|
+
# Test changing config.cors and CloudFormation does an in-place update
|
|
30
|
+
# on the resource. So no need to do bluegreen deployments for OPTIONS.
|
|
31
|
+
next if http_verb == "OPTIONS"
|
|
32
|
+
|
|
33
|
+
path = recreate_path(resource.path)
|
|
34
|
+
method = http_verb.downcase.to_sym
|
|
35
|
+
to = to(resource.id, http_verb)
|
|
36
|
+
route = Jets::Route.new(path: path, method: method, to: to)
|
|
37
|
+
routes << route
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
routes
|
|
41
|
+
end
|
|
42
|
+
memoize :deployed_routes
|
|
43
|
+
|
|
44
|
+
def recreate_path(path)
|
|
45
|
+
path = path.gsub(%r{^/},'')
|
|
46
|
+
path = path.gsub(/{([^}]*)\+}/, '*\1')
|
|
47
|
+
path.gsub(/{([^}]*)}/, ':\1')
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def to(resource_id, http_method)
|
|
51
|
+
uri = method_uri(resource_id, http_method)
|
|
52
|
+
recreate_to(uri) unless uri.nil?
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def method_uri(resource_id, http_method)
|
|
56
|
+
resp = apigateway.get_method(
|
|
57
|
+
rest_api_id: rest_api_id,
|
|
58
|
+
resource_id: resource_id,
|
|
59
|
+
http_method: http_method
|
|
60
|
+
)
|
|
61
|
+
resp.method_integration.uri
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Parses method uri and recreates a Route to argument.
|
|
65
|
+
# So:
|
|
66
|
+
# "arn:aws:apigateway:us-west-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-west-2:112233445566:function:demo-test-posts_controller-new/invocations"
|
|
67
|
+
# Returns:
|
|
68
|
+
# posts#new
|
|
69
|
+
def recreate_to(method_uri)
|
|
70
|
+
md = method_uri.match(/function:(.*)\//)
|
|
71
|
+
function_arn = md[1] # IE: demo-dev-posts_controller-new
|
|
72
|
+
controller, action = get_controller_action(function_arn)
|
|
73
|
+
"#{controller}##{action}" # IE: posts#new
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def get_controller_action(function_arn)
|
|
77
|
+
if function_arn.include?('_controller-')
|
|
78
|
+
controller_action_from_string(function_arn)
|
|
79
|
+
else
|
|
80
|
+
controller_action_from_api(function_arn)
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# TODO: If this hits the Lambda Rate limit, then list_functions also contains the Lambda
|
|
85
|
+
# function description. So we can paginate through list_functions results and store
|
|
86
|
+
# description from there if needed.
|
|
87
|
+
# Dont think this will be needed though because controller_action_from_string gets called
|
|
88
|
+
# most of the time. Also, user might be able to request their Lambda limit to be increased.
|
|
89
|
+
def controller_action_from_api(function_arn)
|
|
90
|
+
desc = lambda_function_description(function_arn)
|
|
91
|
+
controller, action = desc.split('#')
|
|
92
|
+
controller = controller.underscore.sub(/_controller$/,'')
|
|
93
|
+
[controller, action]
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def controller_action_from_string(function_arn)
|
|
97
|
+
controller_action = function_arn.sub("#{Jets.project_namespace}-", '')
|
|
98
|
+
md = controller_action.match(/(.*)_controller-(.*)/)
|
|
99
|
+
controller = md[1]
|
|
100
|
+
controller = controller.gsub('-','/')
|
|
101
|
+
action = md[2]
|
|
102
|
+
[controller, action]
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def lambda_function_description(function_arn)
|
|
106
|
+
resp = aws_lambda.get_function(function_name: function_arn)
|
|
107
|
+
resp.configuration.description # contains full info: PostsController#index
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
# Duplicated in rest_api/change_detection.rb, base_path/role.rb, rest_api/routes.rb
|
|
111
|
+
def rest_api_id
|
|
112
|
+
stack_name = Jets::Naming.parent_stack_name
|
|
113
|
+
return "RestApi" unless stack_exists?(stack_name)
|
|
114
|
+
|
|
115
|
+
stack = cfn.describe_stacks(stack_name: stack_name).stacks.first
|
|
116
|
+
|
|
117
|
+
api_gateway_stack_arn = lookup(stack[:outputs], "ApiGateway")
|
|
118
|
+
|
|
119
|
+
# resources = cfn.describe_stack_resources(stack_name: api_gateway_stack_arn).stack_resources
|
|
120
|
+
stack = cfn.describe_stacks(stack_name: api_gateway_stack_arn).stacks.first
|
|
121
|
+
lookup(stack[:outputs], "RestApi") # rest_api_id
|
|
122
|
+
end
|
|
123
|
+
memoize :rest_api_id
|
|
124
|
+
|
|
125
|
+
def new_routes
|
|
126
|
+
Jets::Router.routes
|
|
127
|
+
end
|
|
128
|
+
memoize :new_routes
|
|
129
|
+
end
|
|
130
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Detects route to changes
|
|
2
|
+
class Jets::Resource::ApiGateway::RestApi::Routes::Change
|
|
3
|
+
class To < Base
|
|
4
|
+
def self.changed?
|
|
5
|
+
new.changed?
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def changed?
|
|
9
|
+
deployed_routes.each do |deployed_route|
|
|
10
|
+
new_route = find_comparable_route(deployed_route)
|
|
11
|
+
if new_route && new_route.to != deployed_route.to
|
|
12
|
+
# change in already deployed route has been detected, requires bluegreen deploy
|
|
13
|
+
return true
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
false # Reaching here means no routes have been changed in a way that requires a bluegreen deploy
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# Find a route that has the same path and method. This is a comparable route
|
|
20
|
+
# Then we will compare the to or controller action to see if an already
|
|
21
|
+
# deployed route has been changed.
|
|
22
|
+
def find_comparable_route(deployed_route)
|
|
23
|
+
new_routes.find do |new_route|
|
|
24
|
+
new_route.path == deployed_route.path &&
|
|
25
|
+
new_route.method == deployed_route.method
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Detects route variable changes
|
|
2
|
+
class Jets::Resource::ApiGateway::RestApi::Routes::Change
|
|
3
|
+
class Variable < Base
|
|
4
|
+
def self.changed?
|
|
5
|
+
new.changed?
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def changed?
|
|
9
|
+
changed = false
|
|
10
|
+
deployed_routes.each do |deployed_route|
|
|
11
|
+
parent = collision.variable_parent(deployed_route.path)
|
|
12
|
+
parent_variables = collision.parent_variables(parent, [deployed_route.path])
|
|
13
|
+
new_parent_variables = collision.parent_variables(parent, new_paths)
|
|
14
|
+
|
|
15
|
+
changed = parent_variables.size > 0 && new_parent_variables.size > 0 &&
|
|
16
|
+
parent_variables != new_parent_variables
|
|
17
|
+
break if changed
|
|
18
|
+
end
|
|
19
|
+
changed
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Only consider paths with variables
|
|
23
|
+
def new_paths
|
|
24
|
+
new_routes.map(&:path).select {|p| p.include?(':')}.uniq
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Only consider deployed routes with variables
|
|
28
|
+
def deployed_routes
|
|
29
|
+
deployed_routes = super
|
|
30
|
+
deployed_routes.select do |route|
|
|
31
|
+
route.path.include?(':')
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def collision
|
|
36
|
+
@collision ||= Jets::Resource::ApiGateway::RestApi::Routes::Collision.new
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# Detects path variable collisions
|
|
2
|
+
class Jets::Resource::ApiGateway::RestApi::Routes
|
|
3
|
+
class Collision
|
|
4
|
+
attr_reader :collisions
|
|
5
|
+
def initialize
|
|
6
|
+
@collisions = []
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def collision?(paths)
|
|
10
|
+
paths = paths_with_variables(paths)
|
|
11
|
+
parents = variable_parents(paths)
|
|
12
|
+
|
|
13
|
+
collide = false
|
|
14
|
+
parents.each do |parent|
|
|
15
|
+
collide ||= variable_collision_exists?(parent, paths)
|
|
16
|
+
end
|
|
17
|
+
collide
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def exception
|
|
21
|
+
VariableException.new(collision_message)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def collision_message
|
|
25
|
+
<<~EOL
|
|
26
|
+
There are routes with sibling variables under the same parent that collide.
|
|
27
|
+
|
|
28
|
+
Collisions:
|
|
29
|
+
#{@collisions.join("\n ")}
|
|
30
|
+
|
|
31
|
+
API Gateway only allows one unique variable path You must use the same variable name within
|
|
32
|
+
the same parent route path.
|
|
33
|
+
Example: /posts/:id and /posts/:post_id/reveal should both be /posts/:id and /posts/:id/reveal.
|
|
34
|
+
|
|
35
|
+
Please check your `config/routes.rb` and remove the colliding routes.
|
|
36
|
+
More info: http://rubyonjets.com/docs/considerations/api-gateway/
|
|
37
|
+
EOL
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def variable_collision_exists?(parent, paths)
|
|
41
|
+
paths = paths_with_variables(paths)
|
|
42
|
+
variables = parent_variables(parent, paths)
|
|
43
|
+
collide = variables.uniq.size > 1
|
|
44
|
+
register_collision(parent, variables) if collide
|
|
45
|
+
collide
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# register collision for later display
|
|
49
|
+
# We don't register the full path but this might be more helpful.
|
|
50
|
+
def register_collision(parent, variables)
|
|
51
|
+
return unless variables.uniq.size # check again just in case
|
|
52
|
+
|
|
53
|
+
variables.each do |v|
|
|
54
|
+
@collisions << "#{parent}/#{v}"
|
|
55
|
+
end
|
|
56
|
+
@collisions.uniq!
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def parent_variables(parent, paths)
|
|
60
|
+
paths = paths.select do |path|
|
|
61
|
+
parent?(parent, path)
|
|
62
|
+
end
|
|
63
|
+
paths.map do |path|
|
|
64
|
+
path.sub("#{parent}/",'').gsub(%r{/.*},'')
|
|
65
|
+
end.uniq.sort
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def parent?(parent, path)
|
|
69
|
+
return false if parent == path
|
|
70
|
+
|
|
71
|
+
parent_parts = parent.split('/')
|
|
72
|
+
path_parts = path.split('/')
|
|
73
|
+
|
|
74
|
+
n = parent_parts.size-1
|
|
75
|
+
parent_parts[0..n] == path_parts[0..n]
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def direct_parent?(parent, path)
|
|
79
|
+
leaf = variable_leaf(path)
|
|
80
|
+
leaf_parent = leaf.split('/')[0..-2].join('/')
|
|
81
|
+
parent == leaf_parent
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def variable_parents(paths)
|
|
85
|
+
parents = []
|
|
86
|
+
paths = paths_with_variables(paths)
|
|
87
|
+
paths.each do |path|
|
|
88
|
+
parents << variable_parent(path)
|
|
89
|
+
end
|
|
90
|
+
parents.uniq.sort
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
# Strips the path down until only the leaf node part is a variable
|
|
94
|
+
# Example: users/:user_id/posts/:post_id/edit
|
|
95
|
+
# Returns: users/:user_id/posts
|
|
96
|
+
def variable_parent(path)
|
|
97
|
+
path = variable_leaf(path)
|
|
98
|
+
# drop last variable to leave behind the parent
|
|
99
|
+
path.split('/')[0..-2].join('/')
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
# Strips the path down until only the leaf node part is a variable
|
|
103
|
+
# Example: users/:user_id/posts/:post_id/edit
|
|
104
|
+
# Returns: users/:user_id/posts
|
|
105
|
+
def variable_leaf(path)
|
|
106
|
+
return '' unless path.include?(':')
|
|
107
|
+
|
|
108
|
+
parts = path.split('/')
|
|
109
|
+
is_variable = parts.last.include?(':')
|
|
110
|
+
until is_variable
|
|
111
|
+
parts.pop
|
|
112
|
+
is_variable = parts.last.include?(':')
|
|
113
|
+
end
|
|
114
|
+
parts[0..-1].join('/') # parent
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def paths_with_variables(paths)
|
|
118
|
+
paths.select { |p| p.include?(':') }.uniq
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
end
|