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,24 @@
|
|
|
1
|
+
# Implements:
|
|
2
|
+
#
|
|
3
|
+
# compose
|
|
4
|
+
# template_path
|
|
5
|
+
#
|
|
6
|
+
module Jets::Cfn::Builders
|
|
7
|
+
class RuleBuilder < BaseChildBuilder
|
|
8
|
+
def compose
|
|
9
|
+
add_common_parameters
|
|
10
|
+
add_functions
|
|
11
|
+
add_resources
|
|
12
|
+
add_managed_rules
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Handle config_rules associated with aws managed rules.
|
|
16
|
+
# List of AWS Config Managed Rules: https://amzn.to/2BOt9KN
|
|
17
|
+
def add_managed_rules
|
|
18
|
+
@app_class.managed_rules.each do |rule|
|
|
19
|
+
resource = Jets::Resource.new(rule[:definition], rule[:replacements])
|
|
20
|
+
add_resource(resource)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
module Jets::Cfn::Builders
|
|
2
|
+
class SharedBuilder < BaseChildBuilder
|
|
3
|
+
def compose
|
|
4
|
+
stack = @app_class.new # @app_class is subclass. IE: Alarm < Jets::Stack
|
|
5
|
+
builder = Jets::Stack::Builder.new(stack)
|
|
6
|
+
@template = builder.template # overwrite entire @template
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
# template_path is an interface method for Interface module
|
|
10
|
+
def template_path
|
|
11
|
+
Jets::Naming.shared_template_path(@app_class)
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module Jets::Cfn::Builders::Util
|
|
2
|
+
class Source
|
|
3
|
+
class << self
|
|
4
|
+
def version
|
|
5
|
+
return '' unless git_installed?
|
|
6
|
+
sha = sh "git rev-parse HEAD 2>/dev/null"
|
|
7
|
+
return '' if sha == '' # if its not a git repo, it'll be an empty string
|
|
8
|
+
sha[0..7]
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
private
|
|
12
|
+
def git_installed?
|
|
13
|
+
system("type git > /dev/null 2>&1")
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def sh(command)
|
|
17
|
+
`#{command}`.strip
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module Jets::Cfn
|
|
2
|
+
# Caches the built template to reduce filesystem IO calls.
|
|
3
|
+
class BuiltTemplate
|
|
4
|
+
class << self
|
|
5
|
+
@@cache = {}
|
|
6
|
+
def get(path)
|
|
7
|
+
if @@cache[path]
|
|
8
|
+
@@cache[path] # using cache
|
|
9
|
+
else
|
|
10
|
+
@@cache[path] = YAML.load_file(path) # setting and using cache
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
module Jets::Cfn
|
|
2
|
+
class Ship
|
|
3
|
+
extend Memoist
|
|
4
|
+
include Jets::AwsServices
|
|
5
|
+
|
|
6
|
+
def initialize(options)
|
|
7
|
+
@options = options
|
|
8
|
+
@parent_stack_name = Jets::Naming.parent_stack_name
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def run
|
|
12
|
+
# s3 bucket is available only when stack_type is full
|
|
13
|
+
upload_to_s3 if @options[:stack_type] == :full
|
|
14
|
+
|
|
15
|
+
stack_in_progress?(@parent_stack_name)
|
|
16
|
+
|
|
17
|
+
puts "Deploying CloudFormation stack with jets app!"
|
|
18
|
+
begin
|
|
19
|
+
save_stack
|
|
20
|
+
rescue Aws::CloudFormation::Errors::InsufficientCapabilitiesException => e
|
|
21
|
+
capabilities = e.message.match(/\[(.*)\]/)[1]
|
|
22
|
+
confirm = prompt_for_iam(capabilities)
|
|
23
|
+
if confirm =~ /^y/
|
|
24
|
+
@options.merge!(capabilities: [capabilities])
|
|
25
|
+
puts "Re-running: #{command_with_iam(capabilities).color(:green)}"
|
|
26
|
+
retry
|
|
27
|
+
else
|
|
28
|
+
puts "Exited"
|
|
29
|
+
exit 1
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
success = wait_for_stack
|
|
34
|
+
unless success
|
|
35
|
+
puts <<~EOL
|
|
36
|
+
The Jets application failed to deploy. Jets creates a few CloudFormation stacks to deploy your application.
|
|
37
|
+
The logs above show the CloudFormation parent stack events and points to the stack with the error.
|
|
38
|
+
Please go to the CloudFormation console and look for the specific stack with the error.
|
|
39
|
+
The specific child stack usually shows more detailed information and can be used to resolve the issue.
|
|
40
|
+
Example of checking the CloudFormation console: https://rubyonjets.com/docs/debugging/cloudformation/
|
|
41
|
+
EOL
|
|
42
|
+
exit 1
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
prewarm
|
|
46
|
+
clean_deploy_logs
|
|
47
|
+
show_api_endpoint
|
|
48
|
+
show_custom_domain
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def save_stack
|
|
52
|
+
if stack_exists?(@parent_stack_name)
|
|
53
|
+
update_stack
|
|
54
|
+
else
|
|
55
|
+
create_stack
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def create_stack
|
|
60
|
+
# parent stack template is on filesystem and child stacks templates is on s3
|
|
61
|
+
cfn.create_stack(stack_options)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def update_stack
|
|
65
|
+
begin
|
|
66
|
+
cfn.update_stack(stack_options)
|
|
67
|
+
rescue Aws::CloudFormation::Errors::ValidationError => e
|
|
68
|
+
puts "ERROR: #{e.message}".color(:red)
|
|
69
|
+
true # error
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# options common to both create_stack and update_stack
|
|
74
|
+
def stack_options
|
|
75
|
+
{
|
|
76
|
+
stack_name: @parent_stack_name,
|
|
77
|
+
capabilities: capabilities, # ["CAPABILITY_IAM", "CAPABILITY_NAMED_IAM"]
|
|
78
|
+
# disable_rollback: !@options[:rollback],
|
|
79
|
+
}.merge!(template.to_h)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def template
|
|
83
|
+
@template ||= TemplateSource.new(Jets::Naming.parent_template_path, @options)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# check for /(_COMPLETE|_FAILED)$/ status
|
|
87
|
+
def wait_for_stack
|
|
88
|
+
Jets::Cfn::Status.new(@options).wait
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def prewarm
|
|
92
|
+
if ENV['SKIP_PREWARMING']
|
|
93
|
+
puts "Skipping prewarming" # useful for testing
|
|
94
|
+
return
|
|
95
|
+
end
|
|
96
|
+
return unless @options[:stack_type] == :full # s3 bucket is available
|
|
97
|
+
return unless Jets.config.prewarm.enable
|
|
98
|
+
return if Jets.poly_only?
|
|
99
|
+
|
|
100
|
+
puts "Prewarming application."
|
|
101
|
+
Jets::PreheatJob.prewarm!
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def clean_deploy_logs
|
|
105
|
+
Jets::Commands::Clean::Log.new(@options).clean_deploys
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def endpoint_unavailable?
|
|
109
|
+
return true unless @options[:stack_type] == :full # s3 bucket is available
|
|
110
|
+
return true if Jets::Router.routes.empty?
|
|
111
|
+
_, status = stack_status
|
|
112
|
+
return true if status.include?("ROLLBACK")
|
|
113
|
+
return true unless api_gateway
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# Do not memoize this because on first stack run it will be nil
|
|
117
|
+
# It only gets called one more time so just let it get called.
|
|
118
|
+
def api_gateway
|
|
119
|
+
resp = cfn.describe_stack_resources(stack_name: @parent_stack_name)
|
|
120
|
+
resources = resp.stack_resources
|
|
121
|
+
resources.find { |resource| resource.logical_resource_id == "ApiGateway" }
|
|
122
|
+
end
|
|
123
|
+
memoize :api_gateway
|
|
124
|
+
|
|
125
|
+
def endpoint_available?
|
|
126
|
+
!endpoint_unavailable?
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def show_api_endpoint
|
|
130
|
+
return unless endpoint_available?
|
|
131
|
+
|
|
132
|
+
stack_id = api_gateway["physical_resource_id"]
|
|
133
|
+
|
|
134
|
+
resp = cfn.describe_stacks(stack_name: stack_id)
|
|
135
|
+
stack = resp["stacks"].first
|
|
136
|
+
output = stack["outputs"].find { |o| o["output_key"] == "RestApiUrl" }
|
|
137
|
+
endpoint = output["output_value"]
|
|
138
|
+
puts "API Gateway Endpoint: #{endpoint}"
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def show_custom_domain
|
|
142
|
+
return unless endpoint_available? && Jets.custom_domain? && Jets.config.domain.route53
|
|
143
|
+
|
|
144
|
+
domain_name = Jets::Resource::ApiGateway::DomainName.new
|
|
145
|
+
# Looks funny but its right.
|
|
146
|
+
# domain_name is a method on the Jets::Resource::ApiGateway::Domain instance
|
|
147
|
+
url = "https://#{domain_name.domain_name}"
|
|
148
|
+
puts "Custom Domain: #{url}"
|
|
149
|
+
puts "App Domain: #{Jets.config.app.domain}" if Jets.config.app.domain
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
# All CloudFormation states listed here:
|
|
153
|
+
# http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-describing-stacks.html
|
|
154
|
+
def stack_status
|
|
155
|
+
resp = cfn.describe_stacks(stack_name: @parent_stack_name)
|
|
156
|
+
status = resp.stacks[0].stack_status
|
|
157
|
+
[resp, status]
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def prompt_for_iam(capabilities)
|
|
161
|
+
puts "This stack will create IAM resources. Please approve to run the command again with #{capabilities} capabilities."
|
|
162
|
+
puts " #{command_with_iam(capabilities)}"
|
|
163
|
+
|
|
164
|
+
puts "Please confirm (y/n)"
|
|
165
|
+
$stdin.gets # confirm
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
def command_with_iam(capabilities)
|
|
169
|
+
"#{File.basename($0)} #{ARGV.join(' ')} --capabilities #{capabilities}"
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
def capabilities
|
|
173
|
+
["CAPABILITY_IAM", "CAPABILITY_NAMED_IAM"] # TODO: remove capabilities hardcode
|
|
174
|
+
# return @options[:capabilities] if @options[:capabilities]
|
|
175
|
+
# if @options[:iam]
|
|
176
|
+
# ["CAPABILITY_IAM", "CAPABILITY_NAMED_IAM"]
|
|
177
|
+
# end
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
# Upload both code and child templates to s3
|
|
181
|
+
def upload_to_s3
|
|
182
|
+
raise "Did not specify @options[:s3_bucket] #{@options[:s3_bucket].inspect}" unless @options[:s3_bucket]
|
|
183
|
+
|
|
184
|
+
uploader = Upload.new(@options[:s3_bucket])
|
|
185
|
+
uploader.upload
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
module Jets::Cfn
|
|
2
|
+
class TemplateSource
|
|
3
|
+
include Jets::AwsServices
|
|
4
|
+
|
|
5
|
+
attr_reader :path
|
|
6
|
+
|
|
7
|
+
def initialize(path, options)
|
|
8
|
+
@path = path
|
|
9
|
+
@options = options
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def body
|
|
13
|
+
@body ||= IO.read(path)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def url
|
|
17
|
+
@url ||= upload_file_to_s3
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def to_h
|
|
21
|
+
if upload_to_s3?
|
|
22
|
+
from_s3
|
|
23
|
+
else
|
|
24
|
+
from_path
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
private
|
|
29
|
+
|
|
30
|
+
def upload_to_s3?
|
|
31
|
+
bucket_name.present?
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def from_s3
|
|
35
|
+
{
|
|
36
|
+
template_url: url
|
|
37
|
+
}
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def from_path
|
|
41
|
+
{
|
|
42
|
+
template_body: body
|
|
43
|
+
}
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def upload_file_to_s3
|
|
47
|
+
obj = s3_resource.bucket(bucket_name).object(s3_key)
|
|
48
|
+
obj.upload_file(path)
|
|
49
|
+
|
|
50
|
+
"https://s3.amazonaws.com/#{bucket_name}/#{s3_key}"
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def bucket_name
|
|
54
|
+
@options[:s3_bucket]
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def s3_key
|
|
58
|
+
@s3_key ||= "jets/cfn-templates/#{File.basename(path)}"
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
require 'action_view'
|
|
2
|
+
require 'digest'
|
|
3
|
+
require 'rack/mime'
|
|
4
|
+
|
|
5
|
+
module Jets::Cfn
|
|
6
|
+
class Upload
|
|
7
|
+
include Jets::AwsServices
|
|
8
|
+
include ActionView::Helpers::NumberHelper # number_to_human_size
|
|
9
|
+
|
|
10
|
+
attr_reader :bucket_name
|
|
11
|
+
|
|
12
|
+
def initialize(bucket_name)
|
|
13
|
+
@bucket_name = bucket_name
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def upload
|
|
17
|
+
upload_cfn_templates
|
|
18
|
+
upload_zip_files
|
|
19
|
+
upload_assets
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def upload_cfn_templates
|
|
23
|
+
puts "Uploading CloudFormation templates to S3."
|
|
24
|
+
expression = "#{Jets::Naming.template_path_prefix}-*"
|
|
25
|
+
Dir.glob(expression).each do |path|
|
|
26
|
+
next unless File.file?(path)
|
|
27
|
+
|
|
28
|
+
key = "jets/cfn-templates/#{File.basename(path)}"
|
|
29
|
+
obj = s3_resource.bucket(bucket_name).object(key)
|
|
30
|
+
obj.upload_file(path)
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def upload_zip_files
|
|
35
|
+
puts "Uploading code zip files to S3."
|
|
36
|
+
zip_area = "#{Jets.build_root}/stage/zips"
|
|
37
|
+
Dir.glob("#{zip_area}/*").each do |file|
|
|
38
|
+
upload_zip_file(file)
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def upload_zip_file(path)
|
|
43
|
+
file_size = number_to_human_size(File.size(path))
|
|
44
|
+
|
|
45
|
+
puts "Uploading #{path} (#{file_size}) to S3"
|
|
46
|
+
start_time = Time.now
|
|
47
|
+
s3_key = "jets/code/#{File.basename(path)}"
|
|
48
|
+
obj = s3_resource.bucket(bucket_name).object(s3_key)
|
|
49
|
+
obj.upload_file(path)
|
|
50
|
+
puts "Uploaded to s3://#{bucket_name}/#{s3_key}".color(:green)
|
|
51
|
+
puts "Time to upload code to s3: #{pretty_time(Time.now-start_time).color(:green)}"
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def upload_assets
|
|
55
|
+
puts "Checking for modified public assets and uploading to S3."
|
|
56
|
+
start_time = Time.now
|
|
57
|
+
upload_public_assets
|
|
58
|
+
puts "Time for public assets to s3: #{pretty_time(Time.now-start_time).color(:green)}"
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def upload_public_assets
|
|
62
|
+
public_folders = %w[public]
|
|
63
|
+
public_folders = add_rack_assets(public_folders)
|
|
64
|
+
public_folders.each do |folder|
|
|
65
|
+
upload_asset_folder(folder)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def add_rack_assets(public_folders)
|
|
70
|
+
return public_folders unless Jets.rack?
|
|
71
|
+
public_folders + %w[rack/public]
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def upload_asset_folder(folder)
|
|
75
|
+
expression = "#{Jets.root}/#{folder}/**/*"
|
|
76
|
+
group_size = 10
|
|
77
|
+
Dir.glob(expression).each_slice(group_size) do |paths|
|
|
78
|
+
threads = []
|
|
79
|
+
paths.each do |full_path|
|
|
80
|
+
next unless File.file?(full_path)
|
|
81
|
+
|
|
82
|
+
threads << Thread.new do
|
|
83
|
+
upload_to_s3(full_path)
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
threads.each(&:join)
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def upload_to_s3(full_path)
|
|
91
|
+
return if identical_on_s3?(full_path) && !ENV['JETS_ASSET_UPLOAD_FORCE']
|
|
92
|
+
|
|
93
|
+
key = s3_key(full_path)
|
|
94
|
+
obj = s3_resource.bucket(bucket_name).object(key)
|
|
95
|
+
content_type = content_type_headers(full_path)
|
|
96
|
+
puts "Uploading and setting content type for s3://#{bucket_name}/#{key} content_type #{content_type[:content_type].inspect}"
|
|
97
|
+
obj.upload_file(full_path, { acl: "public-read", cache_control: cache_control }.merge(content_type))
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
CONTENT_TYPES_BY_EXTENSION = {
|
|
101
|
+
'.css' => 'text/css',
|
|
102
|
+
'.html' => 'text/html',
|
|
103
|
+
'.js' => 'application/javascript',
|
|
104
|
+
}
|
|
105
|
+
def content_type_headers(full_path)
|
|
106
|
+
ext = File.extname(full_path)
|
|
107
|
+
content_type = CONTENT_TYPES_BY_EXTENSION[ext] || Rack::Mime.mime_type(ext)
|
|
108
|
+
if content_type
|
|
109
|
+
{ content_type: content_type }
|
|
110
|
+
else
|
|
111
|
+
{}
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def s3_key(full_path)
|
|
116
|
+
relative_path = full_path.sub("#{Jets.root}/", '')
|
|
117
|
+
"jets/#{relative_path}"
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def identical_on_s3?(full_path)
|
|
121
|
+
local_md5 = ::Digest::MD5.file(full_path)
|
|
122
|
+
key = s3_key(full_path)
|
|
123
|
+
begin
|
|
124
|
+
resp = s3.head_object(bucket: bucket_name, key: key)
|
|
125
|
+
rescue Aws::S3::Errors::NotFound
|
|
126
|
+
return false
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
remote_md5 = resp.etag.delete_prefix('"').delete_suffix('"')
|
|
130
|
+
local_md5 == remote_md5
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
# If cache_control is provided, then it will set the entire cache-control header.
|
|
134
|
+
# If only max_age is provided, then we'll generate a cache_control header.
|
|
135
|
+
# Using max_age is the shorter and simply way of setting the cache_control header.
|
|
136
|
+
def cache_control
|
|
137
|
+
cache_control = Jets.config.assets.cache_control
|
|
138
|
+
unless cache_control
|
|
139
|
+
max_age = Jets.config.assets.max_age # defaults to 3600 in jets/application.rb
|
|
140
|
+
cache_control = "public, max-age=#{max_age}"
|
|
141
|
+
end
|
|
142
|
+
cache_control
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
# http://stackoverflow.com/questions/4175733/convert-duration-to-hoursminutesseconds-or-similar-in-rails-3-or-ruby
|
|
146
|
+
def pretty_time(total_seconds)
|
|
147
|
+
minutes = (total_seconds / 60) % 60
|
|
148
|
+
seconds = total_seconds % 60
|
|
149
|
+
if total_seconds < 60
|
|
150
|
+
"#{seconds.to_i}s"
|
|
151
|
+
else
|
|
152
|
+
"#{minutes.to_i}m #{seconds.to_i}s"
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
end
|
|
157
|
+
end
|
data/lib/jets/cli.rb
ADDED
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
require "thor"
|
|
2
|
+
|
|
3
|
+
class Jets::CLI
|
|
4
|
+
def self.start(given_args=ARGV)
|
|
5
|
+
new(given_args).start
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def self.thor_tasks
|
|
9
|
+
Jets::Commands::Base.namespaced_commands
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def initialize(given_args=ARGV, **config)
|
|
13
|
+
@given_args = given_args.dup
|
|
14
|
+
@config = config
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def start
|
|
18
|
+
# Needs to be at the beginning to avoid boot_jets which causes some load errors
|
|
19
|
+
if version_requested?
|
|
20
|
+
puts Jets.version
|
|
21
|
+
return
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Need to boot jets at this point for commands like: jets routes, deploy, console, etc to work
|
|
25
|
+
boot_jets
|
|
26
|
+
command_class = lookup(full_command)
|
|
27
|
+
if command_class
|
|
28
|
+
command_class.perform(full_command, thor_args)
|
|
29
|
+
else
|
|
30
|
+
main_help
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# The commands new and help do not call Jets.boot. Main reason is that Jets.boot should be run in a Jets project.
|
|
35
|
+
#
|
|
36
|
+
# * jets new - need to generate a project outside a project folder.
|
|
37
|
+
# * jets help - don't need to be in a project folder general help.
|
|
38
|
+
#
|
|
39
|
+
# When you are inside a project folder though, more help commands are available and displayed.
|
|
40
|
+
#
|
|
41
|
+
def boot_jets
|
|
42
|
+
set_jets_env_from_cli_arg!
|
|
43
|
+
command = thor_args.first
|
|
44
|
+
unless %w[new help].include?(command)
|
|
45
|
+
Jets::Turbo.new.charge # handles Afterburner mode
|
|
46
|
+
Jets.boot
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def version_requested?
|
|
51
|
+
# jets --version
|
|
52
|
+
# jets -v
|
|
53
|
+
version_flags = ["--version", "-v"]
|
|
54
|
+
@given_args.length == 1 && !(@given_args & version_flags).empty?
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Adjust JETS_ENV before boot_jets is called for the `jets deploy` command. Must do this early in the process
|
|
58
|
+
# before Jets.boot because because `bundler_require` is called as part of the bootup process. It sets the Jets.env
|
|
59
|
+
# to whatever the JETS_ENV is at the time to require the right bundler group.
|
|
60
|
+
#
|
|
61
|
+
# Defaults to development when not set.
|
|
62
|
+
def set_jets_env_from_cli_arg!
|
|
63
|
+
# Pretty tricky, we need to use the raw @given_args as thor_args eventually calls Commands::Base#eager_load!
|
|
64
|
+
# which uses Jets.env before we get a chance to override ENV['JETS_ENV']
|
|
65
|
+
command, env = @given_args[0..1]
|
|
66
|
+
return unless %w[deploy delete].include?(command)
|
|
67
|
+
env = nil if env&.starts_with?('-')
|
|
68
|
+
return unless env
|
|
69
|
+
ENV['JETS_ENV'] = env ? env : 'development'
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# thor_args normalized the args Array to work with our Thor command
|
|
73
|
+
# subclasses.
|
|
74
|
+
# 1. The namespace is stripe
|
|
75
|
+
# 2. Help is shifted in front if a help flag is detected
|
|
76
|
+
def thor_args
|
|
77
|
+
args = @given_args.clone
|
|
78
|
+
|
|
79
|
+
# jets generate is a special command requires doesn't puts out the help menu automatically when
|
|
80
|
+
# `jets generate` is called without additional args. We'll take it over early and fix it here.
|
|
81
|
+
generate = full_command == "generate"
|
|
82
|
+
|
|
83
|
+
if generate && ((args.size == 1 || help_flags.include?(args.last)) || args.size == 2)
|
|
84
|
+
puts Jets::Generator.help
|
|
85
|
+
exit
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
help_args = args & help_flags
|
|
89
|
+
unless help_args.empty?
|
|
90
|
+
# Allow using help flags at the end of the command to trigger help menu
|
|
91
|
+
args -= help_flags # remove "help" and help flags from args
|
|
92
|
+
args[0] = meth # first command will always be the meth now since
|
|
93
|
+
# we removed the help flags
|
|
94
|
+
args.unshift("help")
|
|
95
|
+
args.compact!
|
|
96
|
+
return args
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
# reassigns the command without the namespace if reached here
|
|
100
|
+
args[0] = meth
|
|
101
|
+
args.compact
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def meth
|
|
105
|
+
return nil unless full_command
|
|
106
|
+
|
|
107
|
+
if full_command.include?(':')
|
|
108
|
+
full_command.split(':').pop
|
|
109
|
+
else
|
|
110
|
+
full_command
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
ALIASES = {
|
|
115
|
+
"g" => "generate",
|
|
116
|
+
"c" => "console",
|
|
117
|
+
"s" => "server",
|
|
118
|
+
"db" => "dbconsole",
|
|
119
|
+
}
|
|
120
|
+
def full_command
|
|
121
|
+
# Removes any args that starts with -, those are option args.
|
|
122
|
+
# Also remove "help" flag.
|
|
123
|
+
args = @given_args.reject {|o| o =~ /^-/ } - help_flags
|
|
124
|
+
command = args[0] # first argument should always be the command
|
|
125
|
+
command = ALIASES[command] || command
|
|
126
|
+
Jets::Commands::Base.autocomplete(command)
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
# 1. look up Thor tasks
|
|
130
|
+
# 2. look up Rake tasks
|
|
131
|
+
# 3. help menu with all commands when both Thor and Rake tasks are not found
|
|
132
|
+
def lookup(full_command)
|
|
133
|
+
thor_task_found = Jets::Commands::Base.namespaced_commands.include?(full_command)
|
|
134
|
+
if thor_task_found
|
|
135
|
+
return Jets::Commands::Base.klass_from_namespace(namespace)
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
return unless jets_project?
|
|
139
|
+
rake_task_found = Jets::Commands::RakeCommand.namespaced_commands.include?(full_command)
|
|
140
|
+
if rake_task_found
|
|
141
|
+
return Jets::Commands::RakeCommand
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
def jets_project?
|
|
146
|
+
File.exist?("config/application.rb")
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
# ["-h", "-?", "--help", "-D", "help"]
|
|
150
|
+
def help_flags
|
|
151
|
+
Thor::HELP_MAPPINGS + ["help"]
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
def namespace
|
|
155
|
+
return nil unless full_command
|
|
156
|
+
|
|
157
|
+
if full_command.include?(':')
|
|
158
|
+
words = full_command.split(':')
|
|
159
|
+
words.pop
|
|
160
|
+
words.join(':')
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
def main_help
|
|
165
|
+
shell = Thor::Shell::Basic.new
|
|
166
|
+
shell.say "Commands:"
|
|
167
|
+
shell.print_table(thor_list, :indent => 2, :truncate => true)
|
|
168
|
+
|
|
169
|
+
if jets_project? && !rake_list.empty?
|
|
170
|
+
shell.say "\nCommands via rake:"
|
|
171
|
+
shell.print_table(rake_list, :indent => 2, :truncate => true)
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
shell.say "\n"
|
|
175
|
+
shell.say main_help_body
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
def thor_list
|
|
179
|
+
Jets::Commands::Base.help_list(show_all_tasks)
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
def rake_list
|
|
183
|
+
list = Jets::Commands::RakeCommand.formatted_rake_tasks(show_all_tasks)
|
|
184
|
+
list.map do |array|
|
|
185
|
+
array[0] = "jets #{array[0]}"
|
|
186
|
+
array
|
|
187
|
+
end
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
def show_all_tasks
|
|
191
|
+
@given_args.include?("--all") || @given_args.include?("-A")
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
def main_help_body
|
|
195
|
+
<<-EOL
|
|
196
|
+
Add -h to any of the commands for more help. Examples:
|
|
197
|
+
|
|
198
|
+
jets call -h
|
|
199
|
+
jets routes -h
|
|
200
|
+
jets deploy -h
|
|
201
|
+
jets status -h
|
|
202
|
+
jets dynamodb:create -h
|
|
203
|
+
jets db:create -h
|
|
204
|
+
|
|
205
|
+
EOL
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
end
|