jets_bb_fork 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.circleci/bin/commit_docs.sh +26 -0
- data/.circleci/config.yml +126 -0
- data/.codebuild/README.md +68 -0
- data/.codebuild/bin/jets +3 -0
- data/.codebuild/buildspec-base.yml +14 -0
- data/.codebuild/integration.sh +72 -0
- data/.codebuild/jets.postman_collection.json +323 -0
- data/.codebuild/scripts/install-docker.sh +12 -0
- data/.codebuild/scripts/install-dynamodb-local.sh +22 -0
- data/.codebuild/scripts/install-java.sh +22 -0
- data/.codebuild/scripts/install-node.sh +4 -0
- data/.github/ISSUE_TEMPLATE.md +7 -0
- data/.github/ISSUE_TEMPLATE/bug_report.md +84 -0
- data/.github/ISSUE_TEMPLATE/documentation.md +27 -0
- data/.github/ISSUE_TEMPLATE/feature_request.md +64 -0
- data/.github/ISSUE_TEMPLATE/question.md +16 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +42 -0
- data/.gitignore +24 -0
- data/.gitmodules +0 -0
- data/.python-version +1 -0
- data/.rspec +4 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +734 -0
- data/CONDUCT.md +1 -0
- data/CONTRIBUTING.md +1 -0
- data/Dockerfile +16 -0
- data/Dockerfile.base +53 -0
- data/Gemfile +14 -0
- data/Guardfile +22 -0
- data/LICENSE.txt +22 -0
- data/Procfile +2 -0
- data/README.md +203 -0
- data/Rakefile +24 -0
- data/backers.md +16 -0
- data/bin/release +9 -0
- data/buildspec.yml +18 -0
- data/exe/jets_bb_fork +14 -0
- data/jets.gemspec +68 -0
- data/lib/jets.rb +27 -0
- data/lib/jets/application.rb +216 -0
- data/lib/jets/application/defaults.rb +172 -0
- data/lib/jets/autoloaders.rb +97 -0
- data/lib/jets/aws_info.rb +113 -0
- data/lib/jets/aws_services.rb +65 -0
- data/lib/jets/aws_services/global_memoist.rb +57 -0
- data/lib/jets/aws_services/s3_bucket.rb +34 -0
- data/lib/jets/aws_services/stack_status.rb +59 -0
- data/lib/jets/booter.rb +119 -0
- data/lib/jets/builders/code_builder.rb +399 -0
- data/lib/jets/builders/code_size.rb +57 -0
- data/lib/jets/builders/gem_replacer.rb +76 -0
- data/lib/jets/builders/handler_generator.rb +186 -0
- data/lib/jets/builders/lambda_layer.rb +69 -0
- data/lib/jets/builders/md5.rb +60 -0
- data/lib/jets/builders/md5_zip.rb +61 -0
- data/lib/jets/builders/purger.rb +35 -0
- data/lib/jets/builders/rack_packager.rb +51 -0
- data/lib/jets/builders/rackup_wrappers/rackup +19 -0
- data/lib/jets/builders/rackup_wrappers/rackup.rb +7 -0
- data/lib/jets/builders/reconfigure_rails.rb +114 -0
- data/lib/jets/builders/reconfigure_rails/config/initializers/jets.rb +16 -0
- data/lib/jets/builders/ruby_packager.rb +207 -0
- data/lib/jets/builders/shim_vars/app.rb +78 -0
- data/lib/jets/builders/shim_vars/base.rb +25 -0
- data/lib/jets/builders/shim_vars/shared.rb +37 -0
- data/lib/jets/builders/templates/handler.rb +12 -0
- data/lib/jets/builders/tidy.rb +107 -0
- data/lib/jets/builders/util.rb +31 -0
- data/lib/jets/bundle.rb +82 -0
- data/lib/jets/camelizer.rb +71 -0
- data/lib/jets/cfn/builders/api_deployment_builder.rb +63 -0
- data/lib/jets/cfn/builders/api_gateway_builder.rb +157 -0
- data/lib/jets/cfn/builders/base_child_builder.rb +75 -0
- data/lib/jets/cfn/builders/controller_builder.rb +42 -0
- data/lib/jets/cfn/builders/function_builder.rb +14 -0
- data/lib/jets/cfn/builders/interface.rb +137 -0
- data/lib/jets/cfn/builders/job_builder.rb +14 -0
- data/lib/jets/cfn/builders/paged.rb +37 -0
- data/lib/jets/cfn/builders/parent_builder.rb +100 -0
- data/lib/jets/cfn/builders/rule_builder.rb +24 -0
- data/lib/jets/cfn/builders/shared_builder.rb +14 -0
- data/lib/jets/cfn/ship.rb +185 -0
- data/lib/jets/cfn/status.rb +212 -0
- data/lib/jets/cfn/upload.rb +139 -0
- data/lib/jets/cli.rb +194 -0
- data/lib/jets/commands/base.rb +146 -0
- data/lib/jets/commands/build.rb +234 -0
- data/lib/jets/commands/call.rb +169 -0
- data/lib/jets/commands/call/anonymous_guesser.rb +96 -0
- data/lib/jets/commands/call/autoload_guesser.rb +136 -0
- data/lib/jets/commands/call/base_guesser.rb +60 -0
- data/lib/jets/commands/call/guesser.rb +48 -0
- data/lib/jets/commands/clean.rb +19 -0
- data/lib/jets/commands/clean/base.rb +24 -0
- data/lib/jets/commands/clean/build.rb +13 -0
- data/lib/jets/commands/clean/log.rb +107 -0
- data/lib/jets/commands/console.rb +12 -0
- data/lib/jets/commands/db.rb +13 -0
- data/lib/jets/commands/db/environment-task.rake +3 -0
- data/lib/jets/commands/db/tasks.rb +44 -0
- data/lib/jets/commands/dbconsole.rb +131 -0
- data/lib/jets/commands/delete.rb +143 -0
- data/lib/jets/commands/deploy.rb +141 -0
- data/lib/jets/commands/dynamodb.rb +19 -0
- data/lib/jets/commands/dynamodb/migrate.rb +9 -0
- data/lib/jets/commands/dynamodb/migrator.rb +36 -0
- data/lib/jets/commands/gems.rb +21 -0
- data/lib/jets/commands/help.rb +9 -0
- data/lib/jets/commands/help/build.md +6 -0
- data/lib/jets/commands/help/call.md +61 -0
- data/lib/jets/commands/help/clean/build.md +5 -0
- data/lib/jets/commands/help/clean/log.md +5 -0
- data/lib/jets/commands/help/console.md +18 -0
- data/lib/jets/commands/help/db/generate.md +8 -0
- data/lib/jets/commands/help/dbconsole.md +9 -0
- data/lib/jets/commands/help/delete.md +22 -0
- data/lib/jets/commands/help/deploy.md +32 -0
- data/lib/jets/commands/help/destroy.md +16 -0
- data/lib/jets/commands/help/dynamodb/generate.md +52 -0
- data/lib/jets/commands/help/dynamodb/migrate.md +4 -0
- data/lib/jets/commands/help/gems/check.md +8 -0
- data/lib/jets/commands/help/generate.md +22 -0
- data/lib/jets/commands/help/import/rack.md +13 -0
- data/lib/jets/commands/help/import/rails.md +11 -0
- data/lib/jets/commands/help/new.md +42 -0
- data/lib/jets/commands/help/routes.md +16 -0
- data/lib/jets/commands/help/runner.md +17 -0
- data/lib/jets/commands/help/server.md +15 -0
- data/lib/jets/commands/help/status.md +14 -0
- data/lib/jets/commands/help/upgrade.md +5 -0
- data/lib/jets/commands/help/url.md +6 -0
- data/lib/jets/commands/import.rb +12 -0
- data/lib/jets/commands/import/base.rb +49 -0
- data/lib/jets/commands/import/cheatsheet.rb +35 -0
- data/lib/jets/commands/import/rack.rb +16 -0
- data/lib/jets/commands/import/rails.rb +74 -0
- data/lib/jets/commands/import/sequence.rb +90 -0
- data/lib/jets/commands/import/templates/config/database.yml +26 -0
- data/lib/jets/commands/import/templates/submodules-cheatsheet.md +89 -0
- data/lib/jets/commands/main.rb +157 -0
- data/lib/jets/commands/markdown/creator.rb +58 -0
- data/lib/jets/commands/markdown/index.rb +27 -0
- data/lib/jets/commands/markdown/page.rb +125 -0
- data/lib/jets/commands/markdown/shell.rb +11 -0
- data/lib/jets/commands/new.rb +157 -0
- data/lib/jets/commands/rake_command.rb +61 -0
- data/lib/jets/commands/rake_tasks.rb +46 -0
- data/lib/jets/commands/runner.rb +16 -0
- data/lib/jets/commands/sequence.rb +99 -0
- data/lib/jets/commands/stack_info.rb +30 -0
- data/lib/jets/commands/templates/skeleton/.gitignore +12 -0
- data/lib/jets/commands/templates/skeleton/.jetskeep +1 -0
- data/lib/jets/commands/templates/skeleton/.rspec +3 -0
- data/lib/jets/commands/templates/skeleton/Gemfile.tt +38 -0
- data/lib/jets/commands/templates/skeleton/Procfile +7 -0
- data/lib/jets/commands/templates/skeleton/README.md +11 -0
- data/lib/jets/commands/templates/skeleton/Rakefile +2 -0
- data/lib/jets/commands/templates/skeleton/app/controllers/application_controller.rb +2 -0
- data/lib/jets/commands/templates/skeleton/app/helpers/application_helper.rb +2 -0
- data/lib/jets/commands/templates/skeleton/app/jobs/application_job.rb +4 -0
- data/lib/jets/commands/templates/skeleton/app/models/application_item.rb +2 -0
- data/lib/jets/commands/templates/skeleton/app/models/application_record.rb +3 -0
- data/lib/jets/commands/templates/skeleton/app/views/layouts/application.html.erb.tt +25 -0
- data/lib/jets/commands/templates/skeleton/config.ru +5 -0
- data/lib/jets/commands/templates/skeleton/config/application.rb.tt +67 -0
- data/lib/jets/commands/templates/skeleton/config/database.yml.tt +26 -0
- data/lib/jets/commands/templates/skeleton/config/dynamodb.yml +22 -0
- data/lib/jets/commands/templates/skeleton/config/environments/development.rb +7 -0
- data/lib/jets/commands/templates/skeleton/config/environments/production.rb +9 -0
- data/lib/jets/commands/templates/skeleton/config/environments/test.rb +7 -0
- data/lib/jets/commands/templates/skeleton/config/routes.rb +9 -0
- data/lib/jets/commands/templates/skeleton/db/.gitkeep +0 -0
- data/lib/jets/commands/templates/skeleton/public/404.html +67 -0
- data/lib/jets/commands/templates/skeleton/public/422.html +67 -0
- data/lib/jets/commands/templates/skeleton/public/500.html +66 -0
- data/lib/jets/commands/templates/skeleton/public/favicon.ico +0 -0
- data/lib/jets/commands/templates/skeleton/public/index.html.tt +91 -0
- data/lib/jets/commands/templates/skeleton/spec/controllers/posts_controller_spec.rb +15 -0
- data/lib/jets/commands/templates/skeleton/spec/fixtures/payloads/posts-index.json +51 -0
- data/lib/jets/commands/templates/skeleton/spec/fixtures/payloads/posts-show.json +53 -0
- data/lib/jets/commands/templates/skeleton/spec/spec_helper.rb.tt +30 -0
- data/lib/jets/commands/templates/webpacker/app/javascript/packs/application.js.tt +14 -0
- data/lib/jets/commands/templates/webpacker/app/javascript/packs/theme.scss.tt +24 -0
- data/lib/jets/commands/templates/webpacker/app/javascript/src/jets/crud.js +87 -0
- data/lib/jets/commands/upgrade.rb +145 -0
- data/lib/jets/commands/upgrade/templates/bin/webpack +19 -0
- data/lib/jets/commands/upgrade/templates/bin/webpack-dev-server +19 -0
- data/lib/jets/commands/url.rb +68 -0
- data/lib/jets/commands/webpacker_template.rb +18 -0
- data/lib/jets/controller.rb +3 -0
- data/lib/jets/controller/base.rb +108 -0
- data/lib/jets/controller/callbacks.rb +68 -0
- data/lib/jets/controller/cookies.rb +38 -0
- data/lib/jets/controller/cookies/jar.rb +269 -0
- data/lib/jets/controller/layout.rb +17 -0
- data/lib/jets/controller/middleware/cors.rb +60 -0
- data/lib/jets/controller/middleware/local.rb +116 -0
- data/lib/jets/controller/middleware/local/api_gateway.rb +93 -0
- data/lib/jets/controller/middleware/local/mimic_aws_call.rb +38 -0
- data/lib/jets/controller/middleware/local/route_matcher.rb +106 -0
- data/lib/jets/controller/middleware/main.rb +46 -0
- data/lib/jets/controller/middleware/reloader.rb +15 -0
- data/lib/jets/controller/middleware/webpacker_setup.rb +6 -0
- data/lib/jets/controller/params.rb +87 -0
- data/lib/jets/controller/rack/adapter.rb +88 -0
- data/lib/jets/controller/rack/env.rb +105 -0
- data/lib/jets/controller/redirection.rb +55 -0
- data/lib/jets/controller/rendering.rb +79 -0
- data/lib/jets/controller/rendering/rack_renderer.rb +250 -0
- data/lib/jets/controller/request.rb +29 -0
- data/lib/jets/controller/response.rb +61 -0
- data/lib/jets/controller/stage.rb +33 -0
- data/lib/jets/core.rb +149 -0
- data/lib/jets/core_ext/kernel.rb +13 -0
- data/lib/jets/db.rb +15 -0
- data/lib/jets/dotenv.rb +48 -0
- data/lib/jets/dotenv/ssm.rb +48 -0
- data/lib/jets/erb.rb +51 -0
- data/lib/jets/generator.rb +48 -0
- data/lib/jets/generator/templates/erb/controller/view.html.erb +2 -0
- data/lib/jets/generator/templates/erb/scaffold/_form.html.erb +39 -0
- data/lib/jets/generator/templates/erb/scaffold/edit.html.erb +6 -0
- data/lib/jets/generator/templates/erb/scaffold/index.html.erb +29 -0
- data/lib/jets/generator/templates/erb/scaffold/new.html.erb +5 -0
- data/lib/jets/generator/templates/erb/scaffold/show.html.erb +9 -0
- data/lib/jets/generator/templates/rails/assets/javascript.js +2 -0
- data/lib/jets/generator/templates/rails/assets/stylesheet.css +4 -0
- data/lib/jets/generator/templates/rails/controller/controller.rb +13 -0
- data/lib/jets/generator/templates/rails/helper/helper.rb +4 -0
- data/lib/jets/generator/templates/rails/scaffold/scaffold.css +80 -0
- data/lib/jets/generator/templates/rails/scaffold_controller/api_controller.rb +62 -0
- data/lib/jets/generator/templates/rails/scaffold_controller/controller.rb +79 -0
- data/lib/jets/inflections.rb +32 -0
- data/lib/jets/internal/app/controllers/jets/mailers_controller.rb +97 -0
- data/lib/jets/internal/app/controllers/jets/public_controller.rb +31 -0
- data/lib/jets/internal/app/controllers/jets/rack_controller.rb +25 -0
- data/lib/jets/internal/app/functions/jets/base_path.rb +157 -0
- data/lib/jets/internal/app/helpers/jets/mailers_helper.rb +9 -0
- data/lib/jets/internal/app/jobs/jets/preheat_job.rb +70 -0
- data/lib/jets/internal/app/shared/functions/jets/s3_bucket_config.rb +43 -0
- data/lib/jets/internal/app/views/jets/mailers/email.html.erb +145 -0
- data/lib/jets/internal/app/views/jets/mailers/index.html.erb +8 -0
- data/lib/jets/internal/app/views/jets/mailers/mailer.html.erb +6 -0
- data/lib/jets/internal/turbines/jets/mailer.rb +51 -0
- data/lib/jets/job/base.rb +39 -0
- data/lib/jets/job/dsl.rb +40 -0
- data/lib/jets/job/dsl/dynamodb_event.rb +65 -0
- data/lib/jets/job/dsl/event_source_mapping.rb +11 -0
- data/lib/jets/job/dsl/iot_event.rb +24 -0
- data/lib/jets/job/dsl/kinesis_event.rb +46 -0
- data/lib/jets/job/dsl/log_event.rb +15 -0
- data/lib/jets/job/dsl/rule_event.rb +75 -0
- data/lib/jets/job/dsl/s3_event.rb +36 -0
- data/lib/jets/job/dsl/sns_event.rb +54 -0
- data/lib/jets/job/dsl/sqs_event.rb +96 -0
- data/lib/jets/job/helpers/kinesis_event_helper.rb +13 -0
- data/lib/jets/job/helpers/log_event_helper.rb +17 -0
- data/lib/jets/job/helpers/s3_event_helper.rb +13 -0
- data/lib/jets/klass.rb +109 -0
- data/lib/jets/lambda/dsl.rb +419 -0
- data/lib/jets/lambda/function.rb +29 -0
- data/lib/jets/lambda/function_constructor.rb +55 -0
- data/lib/jets/lambda/functions.rb +34 -0
- data/lib/jets/lambda/task.rb +111 -0
- data/lib/jets/logger.rb +21 -0
- data/lib/jets/mega/hash_converter.rb +25 -0
- data/lib/jets/mega/request.rb +139 -0
- data/lib/jets/mega/request/source.rb +21 -0
- data/lib/jets/middleware.rb +33 -0
- data/lib/jets/middleware/configurator.rb +84 -0
- data/lib/jets/middleware/default_stack.rb +51 -0
- data/lib/jets/middleware/layer.rb +34 -0
- data/lib/jets/middleware/stack.rb +77 -0
- data/lib/jets/naming.rb +49 -0
- data/lib/jets/overrides/lambda.rb +1 -0
- data/lib/jets/overrides/lambda/marshaller.rb +31 -0
- data/lib/jets/overrides/rails.rb +4 -0
- data/lib/jets/overrides/rails/asset_tag_helper.rb +114 -0
- data/lib/jets/overrides/rails/common_methods.rb +13 -0
- data/lib/jets/overrides/rails/rendering_helper.rb +26 -0
- data/lib/jets/overrides/rails/url_helper.rb +25 -0
- data/lib/jets/poly_fun.rb +73 -0
- data/lib/jets/poly_fun/base_executor.rb +125 -0
- data/lib/jets/poly_fun/lambda_executor.rb +16 -0
- data/lib/jets/poly_fun/node_error.rb +8 -0
- data/lib/jets/poly_fun/node_executor.rb +54 -0
- data/lib/jets/poly_fun/python_error.rb +8 -0
- data/lib/jets/poly_fun/python_executor.rb +23 -0
- data/lib/jets/preheat.rb +117 -0
- data/lib/jets/processors/deducer.rb +65 -0
- data/lib/jets/processors/main_processor.rb +61 -0
- data/lib/jets/rack_server.rb +86 -0
- data/lib/jets/rdoc.rb +30 -0
- data/lib/jets/resource.rb +71 -0
- data/lib/jets/resource/api_gateway/base_path/function.rb +42 -0
- data/lib/jets/resource/api_gateway/base_path/mapping.rb +44 -0
- data/lib/jets/resource/api_gateway/base_path/role.rb +76 -0
- data/lib/jets/resource/api_gateway/cors.rb +61 -0
- data/lib/jets/resource/api_gateway/deployment.rb +78 -0
- data/lib/jets/resource/api_gateway/domain_name.rb +59 -0
- data/lib/jets/resource/api_gateway/method.rb +98 -0
- data/lib/jets/resource/api_gateway/resource.rb +101 -0
- data/lib/jets/resource/api_gateway/rest_api.rb +56 -0
- data/lib/jets/resource/api_gateway/rest_api/change_detection.rb +42 -0
- data/lib/jets/resource/api_gateway/rest_api/logical_id.rb +63 -0
- data/lib/jets/resource/api_gateway/rest_api/routes.rb +7 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/change.rb +8 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/change/base.rb +130 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/change/to.rb +29 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/change/variable.rb +39 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/collision.rb +121 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/collision/variable_exception.rb +7 -0
- data/lib/jets/resource/associated.rb +37 -0
- data/lib/jets/resource/base.rb +28 -0
- data/lib/jets/resource/child_stack/api_deployment.rb +56 -0
- data/lib/jets/resource/child_stack/api_gateway.rb +53 -0
- data/lib/jets/resource/child_stack/app_class.rb +107 -0
- data/lib/jets/resource/child_stack/base.rb +24 -0
- data/lib/jets/resource/child_stack/shared.rb +92 -0
- data/lib/jets/resource/config/config_rule.rb +74 -0
- data/lib/jets/resource/config/managed_rule.rb +15 -0
- data/lib/jets/resource/events/rule.rb +31 -0
- data/lib/jets/resource/iam/application_role.rb +27 -0
- data/lib/jets/resource/iam/base_role_definition.rb +47 -0
- data/lib/jets/resource/iam/class_role.rb +74 -0
- data/lib/jets/resource/iam/function_role.rb +54 -0
- data/lib/jets/resource/iam/managed_policy.rb +22 -0
- data/lib/jets/resource/iam/policy_document.rb +41 -0
- data/lib/jets/resource/iot/topic_rule.rb +34 -0
- data/lib/jets/resource/lambda/event_source_mapping.rb +31 -0
- data/lib/jets/resource/lambda/function.rb +214 -0
- data/lib/jets/resource/lambda/function/environment.rb +62 -0
- data/lib/jets/resource/lambda/gem_layer.rb +17 -0
- data/lib/jets/resource/lambda/layer_version.rb +44 -0
- data/lib/jets/resource/logs/subscription_filter.rb +31 -0
- data/lib/jets/resource/permission.rb +45 -0
- data/lib/jets/resource/replacer.rb +85 -0
- data/lib/jets/resource/route53/record_set.rb +70 -0
- data/lib/jets/resource/s3/bucket.rb +24 -0
- data/lib/jets/resource/sns/subscription.rb +29 -0
- data/lib/jets/resource/sns/topic.rb +35 -0
- data/lib/jets/resource/sns/topic_policy.rb +40 -0
- data/lib/jets/resource/sqs/queue.rb +21 -0
- data/lib/jets/resource/standardizer.rb +42 -0
- data/lib/jets/route.rb +166 -0
- data/lib/jets/router.rb +177 -0
- data/lib/jets/router/scope.rb +30 -0
- data/lib/jets/rule/base.rb +19 -0
- data/lib/jets/rule/dsl.rb +110 -0
- data/lib/jets/spec_helpers.rb +54 -0
- data/lib/jets/spec_helpers/params.rb +10 -0
- data/lib/jets/spec_helpers/request.rb +78 -0
- data/lib/jets/spec_helpers/response.rb +5 -0
- data/lib/jets/stack.rb +88 -0
- data/lib/jets/stack/builder.rb +43 -0
- data/lib/jets/stack/definition.rb +50 -0
- data/lib/jets/stack/depends.rb +34 -0
- data/lib/jets/stack/depends/item.rb +9 -0
- data/lib/jets/stack/function.rb +69 -0
- data/lib/jets/stack/main.rb +4 -0
- data/lib/jets/stack/main/dsl.rb +28 -0
- data/lib/jets/stack/main/dsl/base.rb +49 -0
- data/lib/jets/stack/main/dsl/cloudwatch.rb +19 -0
- data/lib/jets/stack/main/dsl/iam.rb +8 -0
- data/lib/jets/stack/main/dsl/lambda.rb +83 -0
- data/lib/jets/stack/main/dsl/s3.rb +12 -0
- data/lib/jets/stack/main/dsl/sns.rb +16 -0
- data/lib/jets/stack/main/dsl/sqs.rb +10 -0
- data/lib/jets/stack/output.rb +35 -0
- data/lib/jets/stack/output/dsl.rb +19 -0
- data/lib/jets/stack/output/lookup.rb +36 -0
- data/lib/jets/stack/parameter.rb +37 -0
- data/lib/jets/stack/parameter/dsl.rb +42 -0
- data/lib/jets/stack/resource.rb +31 -0
- data/lib/jets/stack/resource/dsl.rb +19 -0
- data/lib/jets/stack/s3_event.rb +87 -0
- data/lib/jets/tmp_loader.rb +52 -0
- data/lib/jets/turbine.rb +41 -0
- data/lib/jets/turbo.rb +55 -0
- data/lib/jets/turbo/database_yaml.rb +41 -0
- data/lib/jets/turbo/project/.gitignore +12 -0
- data/lib/jets/turbo/project/.jetskeep +1 -0
- data/lib/jets/turbo/project/Gemfile +16 -0
- data/lib/jets/turbo/project/Rakefile +2 -0
- data/lib/jets/turbo/project/app/controllers/application_controller.rb +2 -0
- data/lib/jets/turbo/project/app/helpers/application_helper.rb +2 -0
- data/lib/jets/turbo/project/app/jobs/application_job.rb +4 -0
- data/lib/jets/turbo/project/config.ru +5 -0
- data/lib/jets/turbo/project/config/application.rb +4 -0
- data/lib/jets/turbo/project/config/routes.rb +4 -0
- data/lib/jets/turbo/rails.rb +127 -0
- data/lib/jets/turbo/templates/config/database.yml +26 -0
- data/lib/jets/util.rb +38 -0
- data/lib/jets/version.rb +3 -0
- data/readme/prerelease.md +6 -0
- data/readme/testing.md +60 -0
- metadata +1004 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
|
|
2
|
+
module Jets
|
|
3
|
+
class AwsInfo
|
|
4
|
+
extend Memoist
|
|
5
|
+
include AwsServices
|
|
6
|
+
|
|
7
|
+
def region
|
|
8
|
+
return 'us-east-1' if 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 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
|
|
59
|
+
puts "INFO: You're missing AWS credentials. Only local services are currently available"
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
memoize :account
|
|
63
|
+
|
|
64
|
+
# If bucket does not exist, do not use the cache value and check for the bucket again.
|
|
65
|
+
# This is because we can build the app before deploying it for the first time.
|
|
66
|
+
# The deploy sequence ensure an minimal stack exists and will return a s3 bucket
|
|
67
|
+
# value for real deployments though, just not for the `jets build` only command.
|
|
68
|
+
BUCKET_DOES_NOT_YET_EXIST = "bucket-does-not-yet-exist" # use const to save from misspellings
|
|
69
|
+
@@s3_bucket = BUCKET_DOES_NOT_YET_EXIST
|
|
70
|
+
def s3_bucket
|
|
71
|
+
return "fake-test-s3-bucket" if ENV['TEST']
|
|
72
|
+
return @@s3_bucket unless @@s3_bucket == BUCKET_DOES_NOT_YET_EXIST
|
|
73
|
+
|
|
74
|
+
resp = cfn.describe_stacks(stack_name: Jets::Naming.parent_stack_name)
|
|
75
|
+
stack = resp.stacks.first
|
|
76
|
+
output = stack["outputs"].find { |o| o["output_key"] == "S3Bucket" }
|
|
77
|
+
@@s3_bucket = output["output_value"] # s3_bucket
|
|
78
|
+
rescue Exception => e
|
|
79
|
+
# When user uses Jets::Application.default_iam_policy in their config/application.rb
|
|
80
|
+
# it looks up the s3 bucket for the iam policy, but the project name has
|
|
81
|
+
# not been loaded in the config yet. We do some trickery with loading
|
|
82
|
+
# the config twice in Application#load_app_config
|
|
83
|
+
# The first load will result in a Aws::CloudFormation::Errors::ValidationError
|
|
84
|
+
# since the Jets::Naming.parent_stack_name has not been properly set yet.
|
|
85
|
+
#
|
|
86
|
+
# Rescuing all exceptions in case there are other exceptions dont know about yet
|
|
87
|
+
# Here are the known ones: Aws::CloudFormation::Errors::ValidationError, Aws::CloudFormation::Errors::InvalidClientTokenId
|
|
88
|
+
BUCKET_DOES_NOT_YET_EXIST
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def test?
|
|
92
|
+
ENV['TEST']
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
private
|
|
96
|
+
|
|
97
|
+
# Cross-platform way of finding an executable in the $PATH.
|
|
98
|
+
#
|
|
99
|
+
# which('ruby') #=> /usr/bin/ruby
|
|
100
|
+
#
|
|
101
|
+
# source: https://stackoverflow.com/questions/2108727/which-in-ruby-checking-if-program-exists-in-path-from-ruby
|
|
102
|
+
def which(cmd)
|
|
103
|
+
exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
|
|
104
|
+
ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
|
|
105
|
+
exts.each { |ext|
|
|
106
|
+
exe = File.join(path, "#{cmd}#{ext}")
|
|
107
|
+
return exe if File.executable?(exe) && !File.directory?(exe)
|
|
108
|
+
}
|
|
109
|
+
end
|
|
110
|
+
return nil
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
@@ -0,0 +1,65 @@
|
|
|
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
|
+
module Jets::AwsServices
|
|
13
|
+
include GlobalMemoist
|
|
14
|
+
include StackStatus
|
|
15
|
+
|
|
16
|
+
def apigateway
|
|
17
|
+
Aws::APIGateway::Client.new
|
|
18
|
+
end
|
|
19
|
+
global_memoize :apigateway
|
|
20
|
+
|
|
21
|
+
def cfn
|
|
22
|
+
Aws::CloudFormation::Client.new
|
|
23
|
+
end
|
|
24
|
+
global_memoize :cfn
|
|
25
|
+
|
|
26
|
+
def dynamodb
|
|
27
|
+
Aws::DynamoDB::Client.new
|
|
28
|
+
end
|
|
29
|
+
global_memoize :dynamodb
|
|
30
|
+
|
|
31
|
+
def aws_lambda
|
|
32
|
+
Aws::Lambda::Client.new
|
|
33
|
+
end
|
|
34
|
+
global_memoize :aws_lambda
|
|
35
|
+
|
|
36
|
+
def logs
|
|
37
|
+
Aws::CloudWatchLogs::Client.new
|
|
38
|
+
end
|
|
39
|
+
global_memoize :logs
|
|
40
|
+
|
|
41
|
+
def s3
|
|
42
|
+
Aws::S3::Client.new
|
|
43
|
+
end
|
|
44
|
+
global_memoize :s3
|
|
45
|
+
|
|
46
|
+
def s3_resource
|
|
47
|
+
Aws::S3::Resource.new
|
|
48
|
+
end
|
|
49
|
+
global_memoize :s3_resource
|
|
50
|
+
|
|
51
|
+
def sns
|
|
52
|
+
Aws::SNS::Client.new
|
|
53
|
+
end
|
|
54
|
+
global_memoize :sns
|
|
55
|
+
|
|
56
|
+
def sqs
|
|
57
|
+
Aws::SQS::Client.new
|
|
58
|
+
end
|
|
59
|
+
global_memoize :sqs
|
|
60
|
+
|
|
61
|
+
def sts
|
|
62
|
+
Aws::STS::Client.new
|
|
63
|
+
end
|
|
64
|
+
global_memoize :sts
|
|
65
|
+
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,59 @@
|
|
|
1
|
+
module Jets::AwsServices
|
|
2
|
+
module StackStatus
|
|
3
|
+
def stack_exists?(stack_name)
|
|
4
|
+
return false if ENV['TEST']
|
|
5
|
+
|
|
6
|
+
exist = nil
|
|
7
|
+
begin
|
|
8
|
+
# When the stack does not exist an exception is raised. Example:
|
|
9
|
+
# Aws::CloudFormation::Errors::ValidationError: Stack with id blah does not exist
|
|
10
|
+
resp = cfn.describe_stacks(stack_name: stack_name)
|
|
11
|
+
exist = true
|
|
12
|
+
rescue Aws::CloudFormation::Errors::ValidationError => e
|
|
13
|
+
if e.message =~ /does not exist/
|
|
14
|
+
exist = false
|
|
15
|
+
elsif e.message.include?("'stackName' failed to satisfy constraint")
|
|
16
|
+
# Example of e.message when describe_stack with invalid stack name
|
|
17
|
+
# "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:/._+]*"
|
|
18
|
+
puts "Invalid stack name: #{stack_name}"
|
|
19
|
+
puts "Full error message: #{e.message}"
|
|
20
|
+
exit 1
|
|
21
|
+
else
|
|
22
|
+
raise # re-raise exception because unsure what other errors can happen
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
exist
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# All CloudFormation states listed here: http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-describing-stacks.html
|
|
29
|
+
#
|
|
30
|
+
# Returns resp so we can use it to grab data about the stack without calling api again.
|
|
31
|
+
def stack_in_progress?(stack_name)
|
|
32
|
+
return true if !stack_exists?(stack_name)
|
|
33
|
+
|
|
34
|
+
# Assumes stack exists
|
|
35
|
+
resp = cfn.describe_stacks(stack_name: stack_name)
|
|
36
|
+
status = resp.stacks[0].stack_status
|
|
37
|
+
if status =~ /_IN_PROGRESS$/
|
|
38
|
+
puts "The '#{stack_name}' stack status is #{status}. " \
|
|
39
|
+
"Please wait until the stack is ready and try again.".color(:red)
|
|
40
|
+
exit 0
|
|
41
|
+
elsif resp.stacks[0].outputs.empty? && status != 'ROLLBACK_COMPLETE'
|
|
42
|
+
# This Happens when the miminal stack fails at the very beginning.
|
|
43
|
+
# There is no s3 bucket at all. User should delete the stack.
|
|
44
|
+
puts "The minimal stack failed to create. Please delete the stack first and try again. " \
|
|
45
|
+
"You can delete the CloudFormation stack or use the `jets delete` command"
|
|
46
|
+
exit 0
|
|
47
|
+
else
|
|
48
|
+
true
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Lookup output value.
|
|
53
|
+
# Used in Jets::Resource::ApiGateway::RestApi::* andJets::Commands::Url
|
|
54
|
+
def lookup(outputs, key)
|
|
55
|
+
out = outputs.find { |o| o.output_key == key }
|
|
56
|
+
out&.output_value
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
data/lib/jets/booter.rb
ADDED
|
@@ -0,0 +1,119 @@
|
|
|
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_auto_load_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
|
+
# Eager load project code. Rather have user find out early than later on AWS Lambda.
|
|
27
|
+
Jets::Autoloaders.main.eager_load
|
|
28
|
+
|
|
29
|
+
setup_db
|
|
30
|
+
# TODO: Figure out how to build middleware during Jets.boot without breaking jets new and webpacker:install
|
|
31
|
+
# build_middleware_stack
|
|
32
|
+
|
|
33
|
+
@booted = true
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def load_internal_turbines
|
|
37
|
+
Dir.glob("#{__dir__}/internal/turbines/**/*.rb").each do |path|
|
|
38
|
+
Jets::Autoloaders.once.preload(path)
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# All Turbines
|
|
43
|
+
def turbine_initializers
|
|
44
|
+
Jets::Turbine.subclasses.each do |subclass|
|
|
45
|
+
initializers = subclass.initializers || []
|
|
46
|
+
initializers.each do |label, block|
|
|
47
|
+
block.call(Jets.application)
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# All Turbines
|
|
53
|
+
def app_initializers
|
|
54
|
+
Dir.glob("#{Jets.root}/config/initializers/**/*").each do |path|
|
|
55
|
+
load path
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# run_turbines(:initializers)
|
|
60
|
+
# run_turbines(:after_initializers)
|
|
61
|
+
def run_turbines(name)
|
|
62
|
+
Jets::Turbine.subclasses.each do |subclass|
|
|
63
|
+
hooks = subclass.send(name) || []
|
|
64
|
+
hooks.each do |label, block|
|
|
65
|
+
block.call(Jets.application)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Builds and memoize stack so it only gets built on bootup
|
|
71
|
+
def build_middleware_stack
|
|
72
|
+
Jets.application.build_stack
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Only connects connect to database for ActiveRecord and when
|
|
76
|
+
# config/database.yml exists.
|
|
77
|
+
# Dynomite handles connecting to the clients lazily.
|
|
78
|
+
def setup_db
|
|
79
|
+
return unless File.exist?("#{Jets.root}/config/database.yml")
|
|
80
|
+
|
|
81
|
+
db_configs = Jets.application.config.database
|
|
82
|
+
# DatabaseTasks.database_configuration for db:create db:migrate tasks
|
|
83
|
+
# Documented in DatabaseTasks that this is the right way to set it when
|
|
84
|
+
# using ActiveRecord rake tasks outside of Rails.
|
|
85
|
+
ActiveRecord::Tasks::DatabaseTasks.database_configuration = db_configs
|
|
86
|
+
|
|
87
|
+
current_config = db_configs[Jets.env]
|
|
88
|
+
if current_config.blank?
|
|
89
|
+
abort("ERROR: config/database.yml exists but no environment section configured for #{Jets.env}")
|
|
90
|
+
end
|
|
91
|
+
# Using ActiveRecord rake tasks outside of Rails, so we need to set up the
|
|
92
|
+
# db connection ourselves
|
|
93
|
+
ActiveRecord::Base.establish_connection(current_config)
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# Cannot call this for the jets new
|
|
97
|
+
def confirm_jets_project!
|
|
98
|
+
unless File.exist?("#{Jets.root}/config/application.rb")
|
|
99
|
+
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)
|
|
100
|
+
exit 1
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def message
|
|
105
|
+
"Jets booting up in #{Jets.env.color(:green)} mode!"
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def check_config_ru!
|
|
109
|
+
config_ru = File.read("#{Jets.root}/config.ru")
|
|
110
|
+
unless config_ru.include?("Jets.boot")
|
|
111
|
+
puts 'The config.ru file is missing Jets.boot. Please add Jets.boot after require "jets"'.color(:red)
|
|
112
|
+
puts "This was changed as made in Jets v1.1.0."
|
|
113
|
+
puts "To have Jets update the config.fu file for you, you can run:\n\n"
|
|
114
|
+
puts " jets upgrade"
|
|
115
|
+
exit 1
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
end
|