jets.benforeva 3.0.17.pre.mount.pre.fix
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/config.yml +92 -0
- data/.cody/README.md +13 -0
- data/.cody/docs/bin/build.sh +7 -0
- data/.cody/docs/bin/bundler_setup.sh +8 -0
- data/.cody/docs/bin/cli_docs.sh +6 -0
- data/.cody/docs/bin/git_commit.sh +27 -0
- data/.cody/docs/bin/git_setup.sh +12 -0
- data/.cody/docs/bin/subnav.sh +14 -0
- data/.cody/docs/buildspec.yml +10 -0
- data/.cody/docs/project.rb +10 -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 +14 -0
- data/.github/ISSUE_TEMPLATE.md +7 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +50 -0
- data/.gitignore +24 -0
- data/.gitmodules +0 -0
- data/.python-version +1 -0
- data/.rspec +4 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +1035 -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 +212 -0
- data/Rakefile +24 -0
- data/backers.md +20 -0
- data/bin/release +9 -0
- data/exe/jets.benforeva +14 -0
- data/jets.benforeva.gemspec +71 -0
- data/lib/jets/application/defaults.rb +200 -0
- data/lib/jets/application.rb +240 -0
- data/lib/jets/authorizer/base.rb +36 -0
- data/lib/jets/authorizer/dsl.rb +69 -0
- data/lib/jets/authorizer/helpers/iam_helper.rb +47 -0
- data/lib/jets/autoloaders.rb +112 -0
- data/lib/jets/aws_info.rb +111 -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 +64 -0
- data/lib/jets/aws_services.rb +95 -0
- data/lib/jets/booter.rb +167 -0
- data/lib/jets/builders/code_builder.rb +410 -0
- data/lib/jets/builders/code_size.rb +57 -0
- data/lib/jets/builders/gem_replacer.rb +89 -0
- data/lib/jets/builders/handler_generator.rb +186 -0
- data/lib/jets/builders/lambda_layer.rb +68 -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/config/initializers/jets.rb +16 -0
- data/lib/jets/builders/reconfigure_rails.rb +114 -0
- data/lib/jets/builders/ruby_packager.rb +235 -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 +88 -0
- data/lib/jets/camelizer.rb +4 -0
- data/lib/jets/cfn/builders/api_deployment_builder.rb +56 -0
- data/lib/jets/cfn/builders/api_gateway_builder.rb +123 -0
- data/lib/jets/cfn/builders/api_resources_builder.rb +44 -0
- data/lib/jets/cfn/builders/authorizer_builder.rb +67 -0
- data/lib/jets/cfn/builders/base_child_builder.rb +69 -0
- data/lib/jets/cfn/builders/controller_builder.rb +50 -0
- data/lib/jets/cfn/builders/function_builder.rb +14 -0
- data/lib/jets/cfn/builders/interface.rb +133 -0
- data/lib/jets/cfn/builders/job_builder.rb +14 -0
- data/lib/jets/cfn/builders/parent_builder/stagger.rb +34 -0
- data/lib/jets/cfn/builders/parent_builder.rb +130 -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/builders/util/source.rb +21 -0
- data/lib/jets/cfn/built_template.rb +15 -0
- data/lib/jets/cfn/ship.rb +188 -0
- data/lib/jets/cfn/status.rb +10 -0
- data/lib/jets/cfn/template_source.rb +61 -0
- data/lib/jets/cfn/upload.rb +157 -0
- data/lib/jets/cli.rb +208 -0
- data/lib/jets/commands/base.rb +145 -0
- data/lib/jets/commands/build.rb +252 -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 +62 -0
- data/lib/jets/commands/call/guesser.rb +48 -0
- data/lib/jets/commands/call.rb +182 -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 +111 -0
- data/lib/jets/commands/clean.rb +19 -0
- data/lib/jets/commands/configure.rb +51 -0
- data/lib/jets/commands/console.rb +12 -0
- data/lib/jets/commands/db/environment-task.rake +3 -0
- data/lib/jets/commands/db/tasks/dummy/app.rb +25 -0
- data/lib/jets/commands/db/tasks/dummy/config.rb +14 -0
- data/lib/jets/commands/db/tasks.rb +34 -0
- data/lib/jets/commands/db.rb +13 -0
- data/lib/jets/commands/dbconsole.rb +134 -0
- data/lib/jets/commands/delete.rb +136 -0
- data/lib/jets/commands/deploy.rb +137 -0
- data/lib/jets/commands/dotenv.rb +9 -0
- data/lib/jets/commands/dynamodb/migrate.rb +9 -0
- data/lib/jets/commands/dynamodb/migrator.rb +36 -0
- data/lib/jets/commands/dynamodb.rb +19 -0
- data/lib/jets/commands/gems.rb +13 -0
- data/lib/jets/commands/help/build.md +6 -0
- data/lib/jets/commands/help/call.md +69 -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/degenerate.md +16 -0
- data/lib/jets/commands/help/delete.md +22 -0
- data/lib/jets/commands/help/deploy.md +32 -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 +6 -0
- data/lib/jets/commands/help/generate.md +28 -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 +7 -0
- data/lib/jets/commands/help/url.md +6 -0
- data/lib/jets/commands/help.rb +9 -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 +30 -0
- data/lib/jets/commands/import/templates/submodules-cheatsheet.md +89 -0
- data/lib/jets/commands/import.rb +12 -0
- data/lib/jets/commands/main.rb +166 -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 +173 -0
- data/lib/jets/commands/rake_command.rb +61 -0
- data/lib/jets/commands/rake_tasks.rb +50 -0
- data/lib/jets/commands/runner.rb +16 -0
- data/lib/jets/commands/sequence.rb +105 -0
- data/lib/jets/commands/stack_info.rb +30 -0
- data/lib/jets/commands/templates/skeleton/.env.development.tt +3 -0
- data/lib/jets/commands/templates/skeleton/.env.test +3 -0
- data/lib/jets/commands/templates/skeleton/.env.tt +3 -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 +39 -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 +26 -0
- data/lib/jets/commands/templates/skeleton/config/application.rb.tt +71 -0
- data/lib/jets/commands/templates/skeleton/config/database.yml.tt +27 -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/config.ru +5 -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 +23 -0
- data/lib/jets/commands/templates/webpacker/app/javascript/packs/theme.scss.tt +24 -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/upgrade/version1.rb +136 -0
- data/lib/jets/commands/upgrade.rb +105 -0
- data/lib/jets/commands/url.rb +69 -0
- data/lib/jets/commands/webpacker_template.rb +18 -0
- data/lib/jets/controller/authorization.rb +91 -0
- data/lib/jets/controller/base.rb +175 -0
- data/lib/jets/controller/callbacks.rb +73 -0
- data/lib/jets/controller/cookies/jar.rb +269 -0
- data/lib/jets/controller/cookies.rb +38 -0
- data/lib/jets/controller/error/invalid_authenticity_token.rb +6 -0
- data/lib/jets/controller/error.rb +4 -0
- data/lib/jets/controller/forgery_protection.rb +43 -0
- data/lib/jets/controller/layout.rb +17 -0
- data/lib/jets/controller/middleware/cors.rb +60 -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 +22 -0
- data/lib/jets/controller/middleware/local.rb +120 -0
- data/lib/jets/controller/middleware/main.rb +53 -0
- data/lib/jets/controller/middleware/reloader.rb +15 -0
- data/lib/jets/controller/middleware/webpacker_setup.rb +6 -0
- data/lib/jets/controller/parameters_filter.rb +29 -0
- data/lib/jets/controller/params.rb +117 -0
- data/lib/jets/controller/rack/adapter.rb +94 -0
- data/lib/jets/controller/rack/env.rb +122 -0
- data/lib/jets/controller/redirection.rb +51 -0
- data/lib/jets/controller/rendering/rack_renderer.rb +267 -0
- data/lib/jets/controller/rendering.rb +96 -0
- data/lib/jets/controller/request.rb +29 -0
- data/lib/jets/controller/response.rb +61 -0
- data/lib/jets/controller/stage.rb +34 -0
- data/lib/jets/controller.rb +3 -0
- data/lib/jets/core.rb +157 -0
- data/lib/jets/core_ext/bundler.rb +7 -0
- data/lib/jets/core_ext/kernel.rb +13 -0
- data/lib/jets/db.rb +15 -0
- data/lib/jets/dotenv/show.rb +11 -0
- data/lib/jets/dotenv/ssm.rb +64 -0
- data/lib/jets/dotenv.rb +48 -0
- data/lib/jets/erb.rb +51 -0
- data/lib/jets/generator/templates/active_job/job/templates/application_job.rb.tt +6 -0
- data/lib/jets/generator/templates/active_job/job/templates/job.rb.tt +8 -0
- data/lib/jets/generator/templates/erb/controller/view.html.erb +2 -0
- data/lib/jets/generator/templates/erb/scaffold/_form.html.erb +34 -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/generator.rb +112 -0
- data/lib/jets/inflections.rb +32 -0
- data/lib/jets/internal/app/controllers/jets/bare_controller.rb +16 -0
- data/lib/jets/internal/app/controllers/jets/mailers_controller.rb +97 -0
- data/lib/jets/internal/app/controllers/jets/mount_controller.rb +63 -0
- data/lib/jets/internal/app/controllers/jets/public_controller.rb +31 -0
- data/lib/jets/internal/app/controllers/jets/rack_controller.rb +12 -0
- data/lib/jets/internal/app/functions/jets/base_path.rb +18 -0
- data/lib/jets/internal/app/functions/jets/base_path_mapping.rb +100 -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 +33 -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 +52 -0
- data/lib/jets/job/base.rb +49 -0
- data/lib/jets/job/dsl/dynamodb_event.rb +67 -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/dsl.rb +40 -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 +404 -0
- data/lib/jets/lambda/function.rb +29 -0
- data/lib/jets/lambda/function_constructor.rb +55 -0
- data/lib/jets/lambda/functions.rb +39 -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/source.rb +21 -0
- data/lib/jets/mega/request.rb +163 -0
- data/lib/jets/middleware/configurator.rb +84 -0
- data/lib/jets/middleware/default_stack.rb +53 -0
- data/lib/jets/middleware/layer.rb +34 -0
- data/lib/jets/middleware/stack.rb +77 -0
- data/lib/jets/middleware.rb +33 -0
- data/lib/jets/naming.rb +63 -0
- data/lib/jets/overrides/lambda/marshaller.rb +31 -0
- data/lib/jets/overrides/lambda.rb +1 -0
- data/lib/jets/overrides/rails/action_controller.rb +13 -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/migration_checker.rb +34 -0
- data/lib/jets/overrides/rails/rendering_helper.rb +27 -0
- data/lib/jets/overrides/rails/url_helper.rb +88 -0
- data/lib/jets/overrides/rails.rb +6 -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/poly_fun.rb +73 -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/api_gateway/authorizer.rb +82 -0
- data/lib/jets/resource/api_gateway/base_path/function.rb +49 -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 +80 -0
- data/lib/jets/resource/api_gateway/domain_name.rb +65 -0
- data/lib/jets/resource/api_gateway/method/authorization.rb +41 -0
- data/lib/jets/resource/api_gateway/method.rb +102 -0
- data/lib/jets/resource/api_gateway/resource.rb +82 -0
- data/lib/jets/resource/api_gateway/rest_api/change_detection.rb +10 -0
- data/lib/jets/resource/api_gateway/rest_api/logical_id/message.rb +49 -0
- data/lib/jets/resource/api_gateway/rest_api/logical_id.rb +98 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/change/base.rb +136 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/change/media_types.rb +36 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/change/page.rb +93 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/change/to.rb +25 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/change/variable.rb +35 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/change.rb +16 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/collision/variable_exception.rb +7 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/collision.rb +121 -0
- data/lib/jets/resource/api_gateway/rest_api/routes.rb +7 -0
- data/lib/jets/resource/api_gateway/rest_api.rb +64 -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 +58 -0
- data/lib/jets/resource/child_stack/api_gateway.rb +23 -0
- data/lib/jets/resource/child_stack/api_resource/page.rb +20 -0
- data/lib/jets/resource/child_stack/api_resource.rb +54 -0
- data/lib/jets/resource/child_stack/app_class.rb +149 -0
- data/lib/jets/resource/child_stack/authorizer.rb +40 -0
- data/lib/jets/resource/child_stack/base.rb +24 -0
- data/lib/jets/resource/child_stack/common_parameters.rb +14 -0
- data/lib/jets/resource/child_stack/shared.rb +85 -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/environment.rb +62 -0
- data/lib/jets/resource/lambda/function.rb +221 -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 +98 -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/resource.rb +71 -0
- data/lib/jets/router/dsl/mount.rb +13 -0
- data/lib/jets/router/dsl.rb +144 -0
- data/lib/jets/router/error.rb +4 -0
- data/lib/jets/router/finder.rb +47 -0
- data/lib/jets/router/helpers/core_helper.rb +27 -0
- data/lib/jets/router/helpers/named_routes_helper.rb +8 -0
- data/lib/jets/router/helpers.rb +4 -0
- data/lib/jets/router/matcher.rb +81 -0
- data/lib/jets/router/method_creator/code.rb +99 -0
- data/lib/jets/router/method_creator/edit.rb +12 -0
- data/lib/jets/router/method_creator/generic.rb +11 -0
- data/lib/jets/router/method_creator/index.rb +48 -0
- data/lib/jets/router/method_creator/new.rb +12 -0
- data/lib/jets/router/method_creator/root.rb +15 -0
- data/lib/jets/router/method_creator/show.rb +12 -0
- data/lib/jets/router/method_creator.rb +50 -0
- data/lib/jets/router/resources/base.rb +7 -0
- data/lib/jets/router/resources/filter.rb +15 -0
- data/lib/jets/router/resources/options.rb +13 -0
- data/lib/jets/router/route/authorizer.rb +57 -0
- data/lib/jets/router/route.rb +230 -0
- data/lib/jets/router/scope.rb +95 -0
- data/lib/jets/router/util.rb +38 -0
- data/lib/jets/router.rb +180 -0
- data/lib/jets/rule/base.rb +19 -0
- data/lib/jets/rule/dsl.rb +109 -0
- data/lib/jets/spec_helpers/controllers/params.rb +8 -0
- data/lib/jets/spec_helpers/controllers/request.rb +101 -0
- data/lib/jets/spec_helpers/controllers/response.rb +10 -0
- data/lib/jets/spec_helpers/controllers.rb +47 -0
- data/lib/jets/spec_helpers/fixtures.rb +11 -0
- data/lib/jets/spec_helpers.rb +21 -0
- data/lib/jets/stack/builder.rb +43 -0
- data/lib/jets/stack/definition.rb +50 -0
- data/lib/jets/stack/depends/item.rb +26 -0
- data/lib/jets/stack/depends.rb +34 -0
- data/lib/jets/stack/function.rb +69 -0
- data/lib/jets/stack/main/dsl/base.rb +63 -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/kinesis.rb +15 -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/main/dsl.rb +17 -0
- data/lib/jets/stack/main.rb +4 -0
- data/lib/jets/stack/output/dsl.rb +19 -0
- data/lib/jets/stack/output/lookup.rb +36 -0
- data/lib/jets/stack/output.rb +35 -0
- data/lib/jets/stack/parameter/dsl.rb +42 -0
- data/lib/jets/stack/parameter.rb +37 -0
- data/lib/jets/stack/resource/dsl.rb +19 -0
- data/lib/jets/stack/resource.rb +31 -0
- data/lib/jets/stack/s3_event.rb +87 -0
- data/lib/jets/stack.rb +88 -0
- data/lib/jets/tmp_loader.rb +53 -0
- data/lib/jets/turbine.rb +41 -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/application.rb +5 -0
- data/lib/jets/turbo/project/config/routes.rb +4 -0
- data/lib/jets/turbo/project/config.ru +5 -0
- data/lib/jets/turbo/rails.rb +127 -0
- data/lib/jets/turbo/templates/config/database.yml +30 -0
- data/lib/jets/turbo.rb +56 -0
- data/lib/jets/util.rb +40 -0
- data/lib/jets/version.rb +3 -0
- data/lib/jets.rb +31 -0
- data/readme/prerelease.md +6 -0
- data/readme/testing.md +60 -0
- metadata +1105 -0
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
|
|
2
|
+
module Jets
|
|
3
|
+
class AwsInfo
|
|
4
|
+
extend Memoist
|
|
5
|
+
include AwsServices
|
|
6
|
+
|
|
7
|
+
def region
|
|
8
|
+
return 'us-east-1' if Jets.env.test?
|
|
9
|
+
|
|
10
|
+
return ENV['JETS_AWS_REGION'] if ENV['JETS_AWS_REGION'] # highest precedence
|
|
11
|
+
return ENV['AWS_REGION'] if ENV['AWS_REGION']
|
|
12
|
+
|
|
13
|
+
region = nil
|
|
14
|
+
|
|
15
|
+
# First if aws binary is available
|
|
16
|
+
# try to get it from the ~/.aws/config
|
|
17
|
+
if which('aws')
|
|
18
|
+
region = `aws configure get region 2>&1`.strip rescue nil
|
|
19
|
+
exit_code = $?.exitstatus
|
|
20
|
+
if exit_code != 0
|
|
21
|
+
exception_message = region.split("\n").grep(/botocore\.exceptions/).first
|
|
22
|
+
if exception_message
|
|
23
|
+
puts "WARN: #{exception_message}".color(:yellow)
|
|
24
|
+
else
|
|
25
|
+
# show full message as warning
|
|
26
|
+
puts region.color(:yellow)
|
|
27
|
+
end
|
|
28
|
+
puts "You can also get rid of this message by setting AWS_REGION or configuring ~/.aws/config with the region"
|
|
29
|
+
region = nil
|
|
30
|
+
end
|
|
31
|
+
region = nil if region == ''
|
|
32
|
+
return region if region
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Second try the metadata endpoint, should be available on AWS Lambda environment
|
|
36
|
+
# https://stackoverflow.com/questions/4249488/find-region-from-within-an-ec2-instance
|
|
37
|
+
begin
|
|
38
|
+
az = `curl -s --max-time 3 --connect-timeout 5 http://169.254.169.254/latest/meta-data/placement/availability-zone`
|
|
39
|
+
region = az.strip.chop # remove last char
|
|
40
|
+
region = nil if region == ''
|
|
41
|
+
rescue
|
|
42
|
+
end
|
|
43
|
+
return region if region
|
|
44
|
+
|
|
45
|
+
'us-east-1' # default if all else fails
|
|
46
|
+
end
|
|
47
|
+
memoize :region
|
|
48
|
+
|
|
49
|
+
# aws sts get-caller-identity
|
|
50
|
+
def account
|
|
51
|
+
return '123456789' if Jets.env.test?
|
|
52
|
+
return ENV['JETS_AWS_ACCOUNT'] if ENV['JETS_AWS_ACCOUNT']
|
|
53
|
+
|
|
54
|
+
# ensure region set, required for sts.get_caller_identity.account to work
|
|
55
|
+
ENV['AWS_REGION'] ||= region
|
|
56
|
+
begin
|
|
57
|
+
sts.get_caller_identity.account
|
|
58
|
+
rescue Aws::Errors::MissingCredentialsError, Aws::Errors::NoSuchEndpointError, Aws::STS::Errors::InvalidClientTokenId
|
|
59
|
+
puts "INFO: You're missing AWS credentials. Only local services are currently available"
|
|
60
|
+
rescue Seahorse::Client::NetworkingError
|
|
61
|
+
puts "INFO: No internet connection available. Only local services are currently available"
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
memoize :account
|
|
65
|
+
|
|
66
|
+
# If bucket does not exist, do not use the cache value and check for the bucket again.
|
|
67
|
+
# This is because we can build the app before deploying it for the first time.
|
|
68
|
+
# The deploy sequence ensure an minimal stack exists and will return a s3 bucket
|
|
69
|
+
# value for real deployments though, just not for the `jets build` only command.
|
|
70
|
+
BUCKET_DOES_NOT_YET_EXIST = "bucket-does-not-yet-exist" # use const to save from misspellings
|
|
71
|
+
@@s3_bucket = BUCKET_DOES_NOT_YET_EXIST
|
|
72
|
+
def s3_bucket
|
|
73
|
+
return "fake-test-s3-bucket" if Jets.env.test?
|
|
74
|
+
return @@s3_bucket unless @@s3_bucket == BUCKET_DOES_NOT_YET_EXIST
|
|
75
|
+
|
|
76
|
+
resp = cfn.describe_stacks(stack_name: Jets::Naming.parent_stack_name)
|
|
77
|
+
stack = resp.stacks.first
|
|
78
|
+
output = stack["outputs"].find { |o| o["output_key"] == "S3Bucket" }
|
|
79
|
+
@@s3_bucket = output["output_value"] # s3_bucket
|
|
80
|
+
rescue Exception => e
|
|
81
|
+
# When user uses Jets::Application.default_iam_policy in their config/application.rb
|
|
82
|
+
# it looks up the s3 bucket for the iam policy, but the project name has
|
|
83
|
+
# not been loaded in the config yet. We do some trickery with loading
|
|
84
|
+
# the config twice in Application#load_app_config
|
|
85
|
+
# The first load will result in a Aws::CloudFormation::Errors::ValidationError
|
|
86
|
+
# since the Jets::Naming.parent_stack_name has not been properly set yet.
|
|
87
|
+
#
|
|
88
|
+
# Rescuing all exceptions in case there are other exceptions dont know about yet
|
|
89
|
+
# Here are the known ones: Aws::CloudFormation::Errors::ValidationError, Aws::CloudFormation::Errors::InvalidClientTokenId
|
|
90
|
+
BUCKET_DOES_NOT_YET_EXIST
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
private
|
|
94
|
+
|
|
95
|
+
# Cross-platform way of finding an executable in the $PATH.
|
|
96
|
+
#
|
|
97
|
+
# which('ruby') #=> /usr/bin/ruby
|
|
98
|
+
#
|
|
99
|
+
# source: https://stackoverflow.com/questions/2108727/which-in-ruby-checking-if-program-exists-in-path-from-ruby
|
|
100
|
+
def which(cmd)
|
|
101
|
+
exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
|
|
102
|
+
ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
|
|
103
|
+
exts.each { |ext|
|
|
104
|
+
exe = File.join(path, "#{cmd}#{ext}")
|
|
105
|
+
return exe if File.executable?(exe) && !File.directory?(exe)
|
|
106
|
+
}
|
|
107
|
+
end
|
|
108
|
+
return nil
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
end
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# We cache the clients globally to avoid re-instantiating them again after the initial Lambda cold start.
|
|
2
|
+
#
|
|
3
|
+
# Based on: https://hashrocket.com/blog/posts/implementing-a-macro-in-ruby-for-memoization
|
|
4
|
+
# Except we use a global variable for the cache. So we'll use the same client across
|
|
5
|
+
# all instances as well as across Lambda executions after the cold-start. Example:
|
|
6
|
+
#
|
|
7
|
+
# class Foo
|
|
8
|
+
# def s3
|
|
9
|
+
# Aws::S3::Client.new
|
|
10
|
+
# end
|
|
11
|
+
# global_memoize :s3
|
|
12
|
+
# end
|
|
13
|
+
#
|
|
14
|
+
# foo1 = Foo.new
|
|
15
|
+
# foo2 = Foo.new
|
|
16
|
+
# foo1.s3
|
|
17
|
+
# foo2.s3 # same client as foo1
|
|
18
|
+
#
|
|
19
|
+
# A prewarmed request after a cold-start will still use the same s3 client instance since it uses the
|
|
20
|
+
# global variable $__memo_methods as the cache.
|
|
21
|
+
#
|
|
22
|
+
module Jets::AwsServices
|
|
23
|
+
module GlobalMemoist
|
|
24
|
+
def self.included(klass)
|
|
25
|
+
klass.extend(Macros)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
module Macros
|
|
29
|
+
def global_memoize(*methods)
|
|
30
|
+
const_defined?(:"GlobalMemoist#{self.object_id}") ?
|
|
31
|
+
const_get(:"GlobalMemoist#{self.object_id}") : const_set(:"GlobalMemoist#{self.object_id}", Module.new)
|
|
32
|
+
mod = const_get(:"GlobalMemoist#{self.object_id}")
|
|
33
|
+
|
|
34
|
+
mod.class_eval do
|
|
35
|
+
methods.each do |method|
|
|
36
|
+
define_method(method) do |skip_cache = false|
|
|
37
|
+
$__memo_methods ||= {}
|
|
38
|
+
if $__memo_methods.include?(method) && !skip_cache
|
|
39
|
+
$__memo_methods[method]
|
|
40
|
+
else
|
|
41
|
+
$__memo_methods[method] = super()
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
prepend mod
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def global_memoize_class_method(*methods)
|
|
50
|
+
singleton_class.class_eval do
|
|
51
|
+
include GlobalMemoist
|
|
52
|
+
global_memoize(*methods)
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
module Jets::AwsServices
|
|
2
|
+
class S3Bucket
|
|
3
|
+
include Jets::AwsServices
|
|
4
|
+
|
|
5
|
+
def self.ensure_exists(bucket_name)
|
|
6
|
+
new(bucket_name).ensure_exists
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def initialize(name)
|
|
10
|
+
@name = name
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def ensure_exists
|
|
14
|
+
s3.create_bucket(bucket: @name) unless exists?
|
|
15
|
+
rescue Aws::S3::Errors::BucketAlreadyExists => e
|
|
16
|
+
puts "ERROR #{e.class}: #{e.message}".color(:red)
|
|
17
|
+
puts "Bucket name: #{@name}"
|
|
18
|
+
exit 1
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def exists?
|
|
22
|
+
begin
|
|
23
|
+
s3.head_bucket(bucket: @name)
|
|
24
|
+
true
|
|
25
|
+
rescue Aws::S3::Errors::BucketAlreadyOwnedByYou, Aws::S3::Errors::Http301Error => e
|
|
26
|
+
# These exceptions indicate bucket already exists
|
|
27
|
+
# Aws::S3::Errors::Http301Error could be inaccurate but compromising for simplicity
|
|
28
|
+
true
|
|
29
|
+
rescue
|
|
30
|
+
false
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
module Jets::AwsServices
|
|
2
|
+
module StackStatus
|
|
3
|
+
# Only cache if it is true because the initial deploy checks live status until a stack exists.
|
|
4
|
+
@@stack_exists_cache = [] # helps with CloudFormation rate limit
|
|
5
|
+
def stack_exists?(stack_name)
|
|
6
|
+
return false if Jets.env.test?
|
|
7
|
+
return true if ENV['JETS_BUILD_NO_INTERNET']
|
|
8
|
+
return true if @@stack_exists_cache.include?(stack_name)
|
|
9
|
+
|
|
10
|
+
exist = nil
|
|
11
|
+
begin
|
|
12
|
+
# When the stack does not exist an exception is raised. Example:
|
|
13
|
+
# Aws::CloudFormation::Errors::ValidationError: Stack with id blah does not exist
|
|
14
|
+
cfn.describe_stacks(stack_name: stack_name)
|
|
15
|
+
@@stack_exists_cache << stack_name
|
|
16
|
+
exist = true
|
|
17
|
+
rescue Aws::CloudFormation::Errors::ValidationError => e
|
|
18
|
+
if e.message =~ /does not exist/
|
|
19
|
+
exist = false
|
|
20
|
+
elsif e.message.include?("'stackName' failed to satisfy constraint")
|
|
21
|
+
# Example of e.message when describe_stack with invalid stack name
|
|
22
|
+
# "1 validation error detected: Value 'instance_and_route53' at 'stackName' failed to satisfy constraint: Member must satisfy regular expression pattern: [a-zA-Z][-a-zA-Z0-9]*|arn:[-a-zA-Z0-9:/._+]*"
|
|
23
|
+
puts "Invalid stack name: #{stack_name}"
|
|
24
|
+
puts "Full error message: #{e.message}"
|
|
25
|
+
exit 1
|
|
26
|
+
else
|
|
27
|
+
raise # re-raise exception because unsure what other errors can happen
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
exist
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# All CloudFormation states listed here: http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-describing-stacks.html
|
|
34
|
+
#
|
|
35
|
+
# Returns resp so we can use it to grab data about the stack without calling api again.
|
|
36
|
+
def stack_in_progress?(stack_name)
|
|
37
|
+
return true if !stack_exists?(stack_name)
|
|
38
|
+
|
|
39
|
+
# Assumes stack exists
|
|
40
|
+
resp = cfn.describe_stacks(stack_name: stack_name)
|
|
41
|
+
status = resp.stacks[0].stack_status
|
|
42
|
+
if status =~ /_IN_PROGRESS$/
|
|
43
|
+
puts "The '#{stack_name}' stack status is #{status}. " \
|
|
44
|
+
"Please wait until the stack is ready and try again.".color(:red)
|
|
45
|
+
exit 0
|
|
46
|
+
elsif resp.stacks[0].outputs.empty? && status != 'ROLLBACK_COMPLETE'
|
|
47
|
+
# This Happens when the miminal stack fails at the very beginning.
|
|
48
|
+
# There is no s3 bucket at all. User should delete the stack.
|
|
49
|
+
puts "The minimal stack failed to create. Please delete the stack first and try again. " \
|
|
50
|
+
"You can delete the CloudFormation stack or use the `jets delete` command"
|
|
51
|
+
exit 0
|
|
52
|
+
else
|
|
53
|
+
true
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Lookup output value.
|
|
58
|
+
# Used in Jets::Resource::ApiGateway::RestApi::* andJets::Commands::Url
|
|
59
|
+
def lookup(outputs, key)
|
|
60
|
+
out = outputs.find { |o| o.output_key == key }
|
|
61
|
+
out&.output_value
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
require "aws-sdk-apigateway"
|
|
2
|
+
require "aws-sdk-cloudformation"
|
|
3
|
+
require "aws-sdk-cloudwatchlogs"
|
|
4
|
+
require "aws-sdk-dynamodb"
|
|
5
|
+
require "aws-sdk-lambda"
|
|
6
|
+
require "aws-sdk-s3"
|
|
7
|
+
require "aws-sdk-sts"
|
|
8
|
+
# Not used in Jets internally but convenient for shared resources
|
|
9
|
+
require "aws-sdk-sns"
|
|
10
|
+
require "aws-sdk-sqs"
|
|
11
|
+
|
|
12
|
+
require "aws_mfa_secure/ext/aws" # add MFA support
|
|
13
|
+
|
|
14
|
+
module Jets::AwsServices
|
|
15
|
+
include GlobalMemoist
|
|
16
|
+
include StackStatus
|
|
17
|
+
|
|
18
|
+
def apigateway
|
|
19
|
+
Aws::APIGateway::Client.new(aws_options)
|
|
20
|
+
end
|
|
21
|
+
global_memoize :apigateway
|
|
22
|
+
|
|
23
|
+
def cfn
|
|
24
|
+
Aws::CloudFormation::Client.new(aws_options)
|
|
25
|
+
end
|
|
26
|
+
global_memoize :cfn
|
|
27
|
+
|
|
28
|
+
def dynamodb
|
|
29
|
+
Aws::DynamoDB::Client.new(aws_options)
|
|
30
|
+
end
|
|
31
|
+
global_memoize :dynamodb
|
|
32
|
+
|
|
33
|
+
def aws_lambda
|
|
34
|
+
Aws::Lambda::Client.new(aws_options)
|
|
35
|
+
end
|
|
36
|
+
global_memoize :aws_lambda
|
|
37
|
+
|
|
38
|
+
def logs
|
|
39
|
+
Aws::CloudWatchLogs::Client.new(aws_options)
|
|
40
|
+
end
|
|
41
|
+
global_memoize :logs
|
|
42
|
+
|
|
43
|
+
def s3
|
|
44
|
+
Aws::S3::Client.new(aws_options)
|
|
45
|
+
end
|
|
46
|
+
global_memoize :s3
|
|
47
|
+
|
|
48
|
+
def s3_resource
|
|
49
|
+
Aws::S3::Resource.new(aws_options)
|
|
50
|
+
end
|
|
51
|
+
global_memoize :s3_resource
|
|
52
|
+
|
|
53
|
+
def sns
|
|
54
|
+
Aws::SNS::Client.new(aws_options)
|
|
55
|
+
end
|
|
56
|
+
global_memoize :sns
|
|
57
|
+
|
|
58
|
+
def sqs
|
|
59
|
+
Aws::SQS::Client.new(aws_options)
|
|
60
|
+
end
|
|
61
|
+
global_memoize :sqs
|
|
62
|
+
|
|
63
|
+
def sts
|
|
64
|
+
Aws::STS::Client.new(aws_options)
|
|
65
|
+
end
|
|
66
|
+
global_memoize :sts
|
|
67
|
+
|
|
68
|
+
# Override the AWS retry settings with Jets AWS clients.
|
|
69
|
+
#
|
|
70
|
+
# The aws-sdk-core has exponential backup with this formula:
|
|
71
|
+
#
|
|
72
|
+
# 2 ** c.retries * c.config.retry_base_delay
|
|
73
|
+
#
|
|
74
|
+
# So the max delay will be 2 ** 7 * 0.6 = 76.8s
|
|
75
|
+
#
|
|
76
|
+
# Only scoping this to deploy because dont want to affect people's application that use the aws sdk.
|
|
77
|
+
#
|
|
78
|
+
# There is also additional rate backoff logic elsewhere, since this is only scoped to deploys.
|
|
79
|
+
#
|
|
80
|
+
# Useful links:
|
|
81
|
+
# https://github.com/aws/aws-sdk-ruby/blob/master/gems/aws-sdk-core/lib/aws-sdk-core/plugins/retry_errors.rb
|
|
82
|
+
# https://docs.aws.amazon.com/apigateway/latest/developerguide/limits.html
|
|
83
|
+
#
|
|
84
|
+
def aws_options
|
|
85
|
+
options = {
|
|
86
|
+
retry_limit: 7, # default: 3
|
|
87
|
+
retry_base_delay: 0.6, # default: 0.3
|
|
88
|
+
}
|
|
89
|
+
options.merge!(
|
|
90
|
+
log_level: :debug,
|
|
91
|
+
logger: Logger.new($stdout),
|
|
92
|
+
) if ENV['JETS_DEBUG_AWS_SDK']
|
|
93
|
+
options
|
|
94
|
+
end
|
|
95
|
+
end
|
data/lib/jets/booter.rb
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
require "jets/core_ext/kernel" # Hack prevents Rails const from being defined
|
|
2
|
+
|
|
3
|
+
class Jets::Booter
|
|
4
|
+
class << self
|
|
5
|
+
@booted = false
|
|
6
|
+
def boot!
|
|
7
|
+
return if @booted
|
|
8
|
+
|
|
9
|
+
confirm_jets_project!
|
|
10
|
+
Jets::Bundle.require
|
|
11
|
+
|
|
12
|
+
Jets.application.setup!
|
|
13
|
+
|
|
14
|
+
# Turbines are loaded after setup_autoload_paths in Jets.application.setup! Some Turbine options are defined
|
|
15
|
+
# in the project so setup must happen before internal Turbines are loaded.
|
|
16
|
+
load_internal_turbines
|
|
17
|
+
|
|
18
|
+
run_turbines(:initializers)
|
|
19
|
+
# Load configs after Turbine initializers so Turbines can defined some config options and they are available in
|
|
20
|
+
# user's project environment configs.
|
|
21
|
+
Jets.application.configs!
|
|
22
|
+
app_initializers
|
|
23
|
+
run_turbines(:after_initializers)
|
|
24
|
+
Jets.application.finish!
|
|
25
|
+
|
|
26
|
+
setup_db # establish db connections in Lambda Execution Context.
|
|
27
|
+
# The eager load calls connects_to in models and establish those connections in Lambda Execution Context also.
|
|
28
|
+
internal_finisher
|
|
29
|
+
eager_load
|
|
30
|
+
|
|
31
|
+
# TODO: Figure out how to build middleware during Jets.boot without breaking jets new and webpacker:install
|
|
32
|
+
# build_middleware_stack
|
|
33
|
+
|
|
34
|
+
@booted = true
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Runs right before eager_load
|
|
38
|
+
def internal_finisher
|
|
39
|
+
load_shared_extensions
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Shared extensions are added near the end because they require the Jets app load paths to first.
|
|
43
|
+
# We eager load the extensions and then use the loaded modules to extend Jets::Stack directly.
|
|
44
|
+
# Originally used an included hook but thats too early before app/shared/extensions is in the load_path.
|
|
45
|
+
def load_shared_extensions
|
|
46
|
+
Jets::Autoloaders.once.preload("#{Jets.root}/app/shared/extensions")
|
|
47
|
+
base_path = "#{Jets.root}/app/shared/extensions"
|
|
48
|
+
Dir.glob("#{base_path}/**/*.rb").each do |path|
|
|
49
|
+
next unless File.file?(path)
|
|
50
|
+
|
|
51
|
+
class_name = path.sub("#{base_path}/", '').sub(/\.rb/,'').camelize
|
|
52
|
+
mod = class_name.constantize # autoload
|
|
53
|
+
Jets::Stack.extend(mod)
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def eager_load
|
|
58
|
+
preload_extensions
|
|
59
|
+
Jets::Autoloaders.main.eager_load # Eager load project code. Rather have user find out early than later on AWS Lambda.
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def preload_extensions
|
|
63
|
+
base_path = "#{Jets.root}/app/extensions"
|
|
64
|
+
Dir.glob("#{base_path}/**/*.rb").each do |path|
|
|
65
|
+
next unless File.file?(path)
|
|
66
|
+
|
|
67
|
+
class_name = path.sub("#{base_path}/", '').sub(/\.rb/,'').camelize
|
|
68
|
+
klass = class_name.constantize # autoload
|
|
69
|
+
Jets::Lambda::Functions.extend(klass)
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# Using ActiveRecord outside of Rails, so we need to set up the db connection ourself.
|
|
74
|
+
#
|
|
75
|
+
# Only connects to database for ActiveRecord and when config/database.yml exists.
|
|
76
|
+
# Dynomite handles connecting to the clients lazily.
|
|
77
|
+
def setup_db
|
|
78
|
+
return unless File.exist?("#{Jets.root}/config/database.yml")
|
|
79
|
+
|
|
80
|
+
db_configs = Jets.application.config.database
|
|
81
|
+
# DatabaseTasks.database_configuration for db:create db:migrate tasks
|
|
82
|
+
# Documented in DatabaseTasks that this is the right way to set it when
|
|
83
|
+
# using ActiveRecord rake tasks outside of Rails.
|
|
84
|
+
ActiveRecord::Tasks::DatabaseTasks.database_configuration = db_configs
|
|
85
|
+
|
|
86
|
+
if db_configs.configs_for(env_name: Jets.env).blank?
|
|
87
|
+
abort("ERROR: config/database.yml exists but no environment section configured for #{Jets.env}")
|
|
88
|
+
end
|
|
89
|
+
ActiveRecord::Base.configurations = db_configs
|
|
90
|
+
connect_db
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
# Eager connect to database, so connections are established in the Lambda Execution Context and get reused.
|
|
94
|
+
# Interestingly, the connections info is stored in the shared state but the connection doesnt show up on
|
|
95
|
+
# `show processlist` until after a query. Have confirmed that the connection is reused and the connection count stays
|
|
96
|
+
# the same.
|
|
97
|
+
def connect_db
|
|
98
|
+
primary_hash_config = ActiveRecord::Base.configurations.configs_for(env_name: Jets.env).find { |hash_config|
|
|
99
|
+
hash_config.name == "primary"
|
|
100
|
+
}
|
|
101
|
+
primary_config = primary_hash_config.configuration_hash # configuration_hash is a normal Ruby Hash
|
|
102
|
+
ActiveRecord::Base.establish_connection(primary_config)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def load_internal_turbines
|
|
106
|
+
Dir.glob("#{__dir__}/internal/turbines/**/*.rb").each do |path|
|
|
107
|
+
Jets::Autoloaders.once.preload(path)
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# All Turbines
|
|
112
|
+
def turbine_initializers
|
|
113
|
+
Jets::Turbine.subclasses.each do |subclass|
|
|
114
|
+
initializers = subclass.initializers || []
|
|
115
|
+
initializers.each do |label, block|
|
|
116
|
+
block.call(Jets.application)
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
# All Turbines
|
|
122
|
+
def app_initializers
|
|
123
|
+
Dir.glob("#{Jets.root}/config/initializers/**/*").sort.each do |path|
|
|
124
|
+
load path
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
# run_turbines(:initializers)
|
|
129
|
+
# run_turbines(:after_initializers)
|
|
130
|
+
def run_turbines(name)
|
|
131
|
+
Jets::Turbine.subclasses.each do |subclass|
|
|
132
|
+
hooks = subclass.send(name) || []
|
|
133
|
+
hooks.each do |label, block|
|
|
134
|
+
block.call(Jets.application)
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
# Builds and memoize stack so it only gets built on bootup
|
|
140
|
+
def build_middleware_stack
|
|
141
|
+
Jets.application.build_stack
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
# Cannot call this for the jets new
|
|
145
|
+
def confirm_jets_project!
|
|
146
|
+
unless File.exist?("#{Jets.root}/config/application.rb")
|
|
147
|
+
puts "It does not look like you are running this command within a jets project. Please confirm that you are in a jets project and try again.".color(:red)
|
|
148
|
+
exit 1
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def message
|
|
153
|
+
"Jets booting up in #{Jets.env.color(:green)} mode!"
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def check_config_ru!
|
|
157
|
+
config_ru = File.read("#{Jets.root}/config.ru")
|
|
158
|
+
unless config_ru.include?("Jets.boot")
|
|
159
|
+
puts 'The config.ru file is missing Jets.boot. Please add Jets.boot after require "jets"'.color(:red)
|
|
160
|
+
puts "This was changed as made in Jets v1.1.0."
|
|
161
|
+
puts "To have Jets update the config.fu file for you, you can run:\n\n"
|
|
162
|
+
puts " jets upgrade"
|
|
163
|
+
exit 1
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
end
|