jets 4.0.10 → 5.0.0
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 +4 -4
- data/.gitignore +5 -1
- data/CHANGELOG.md +53 -0
- data/Gemfile +1 -5
- data/LICENSE.txt +1 -1
- data/README.md +20 -36
- data/Rakefile +3 -3
- data/engines/internal/app/controllers/jets/application_controller.rb +28 -0
- data/engines/internal/app/controllers/jets/bare_controller.rb +6 -0
- data/engines/internal/app/controllers/jets/health_controller.rb +55 -0
- data/engines/internal/app/controllers/jets/info_controller.rb +45 -0
- data/{lib/jets → engines}/internal/app/controllers/jets/mailers_controller.rb +12 -14
- data/{lib/jets → engines}/internal/app/controllers/jets/mount_controller.rb +6 -10
- data/{lib/jets → engines}/internal/app/controllers/jets/public_controller.rb +6 -2
- data/engines/internal/app/controllers/jets/welcome_controller.rb +9 -0
- data/{lib/jets → engines}/internal/app/functions/jets/base_path.rb +2 -1
- data/{lib/jets → engines}/internal/app/functions/jets/base_path_mapping.rb +26 -6
- data/engines/internal/app/jobs/jets/preheat_job.rb +67 -0
- data/engines/internal/app/views/jets/info/properties.html.erb +1 -0
- data/engines/internal/app/views/jets/info/routes.html.erb +10 -0
- data/{lib/jets → engines}/internal/app/views/jets/mailers/email.html.erb +37 -17
- data/engines/internal/app/views/jets/mailers/index.html.erb +8 -0
- data/engines/internal/app/views/jets/mailers/mailer.html.erb +6 -0
- data/{lib/jets/commands/templates/skeleton/public/index.html.tt → engines/internal/app/views/jets/welcome/index.html.erb} +8 -4
- data/engines/internal/app/views/layouts/application.html.erb +51 -0
- data/engines/internal/lib/internal/actiondispatch.rb +39 -0
- data/engines/internal/lib/internal/actionmailer.rb +51 -0
- data/engines/internal/lib/internal/actionview.rb +152 -0
- data/engines/internal/lib/internal/activerecord.rb +37 -0
- data/engines/internal/lib/internal/activesupport.rb +47 -0
- data/engines/internal/lib/internal/engine.rb +13 -0
- data/engines/internal/lib/internal/i18n_engine.rb +19 -0
- data/engines/internal/lib/internal/jets_controller.rb +46 -0
- data/engines/internal/lib/internal/overrides/debug_exceptions.rb +40 -0
- data/engines/internal/lib/internal/templates/rescues/_trace.html.erb +62 -0
- data/engines/internal/lib/internal/templates/rescues/_trace.text.erb +9 -0
- data/engines/internal/lib/internal/turbines/asset_tag_helper.rb +70 -0
- data/engines/internal/lib/internal/turbines/helpers.rb +18 -0
- data/engines/internal/lib/internal/turbines/routes_helpers.rb +42 -0
- data/exe/jets +1 -10
- data/jets.gemspec +14 -11
- data/lib/jets/app_loader.rb +77 -0
- data/lib/jets/application/bootstrap.rb +100 -0
- data/lib/jets/application/configuration/defaults.rb +256 -0
- data/lib/jets/application/configuration.rb +494 -0
- data/lib/jets/application/default_middleware_stack.rb +140 -0
- data/lib/jets/application/dummy_erb_compiler.rb +18 -0
- data/lib/jets/application/finisher.rb +266 -0
- data/lib/jets/application/routes_reloader.rb +80 -0
- data/lib/jets/application.rb +515 -198
- data/lib/jets/authorizer/base.rb +1 -0
- data/lib/jets/authorizer/dsl.rb +15 -11
- data/lib/jets/authorizer/helpers/iam_helper.rb +13 -11
- data/lib/jets/autoloaders/gem.rb +70 -0
- data/lib/jets/autoloaders/inflector.rb +21 -0
- data/lib/jets/autoloaders.rb +38 -101
- data/lib/jets/aws_services/stack_status.rb +1 -1
- data/lib/jets/backtrace_cleaner.rb +27 -0
- data/lib/jets/booter.rb +29 -176
- data/lib/jets/builders/code_builder.rb +45 -117
- data/lib/jets/builders/code_size.rb +1 -0
- data/lib/jets/builders/gem_replacer.rb +5 -6
- data/lib/jets/builders/handler_generator.rb +34 -14
- data/lib/jets/builders/lambda_layer.rb +2 -7
- data/lib/jets/builders/purger.rb +1 -1
- data/lib/jets/builders/rack_packager.rb +1 -1
- data/lib/jets/builders/ruby_packager.rb +17 -6
- data/lib/jets/builders/shim_vars/app.rb +10 -6
- data/lib/jets/builders/templates/handlers/one_lambda_for_all_controllers.rb +33 -0
- data/lib/jets/builders/templates/handlers/one_lambda_per_controller.rb +20 -0
- data/lib/jets/builders/templates/{handler.rb → handlers/one_lambda_per_method.rb} +6 -0
- data/lib/jets/bundle.rb +2 -9
- data/lib/jets/cfn/base.rb +82 -0
- data/lib/jets/cfn/builder/api/base.rb +12 -0
- data/lib/jets/cfn/{builders/api_deployment_builder.rb → builder/api/deployment.rb} +10 -20
- data/lib/jets/cfn/{builders/api_gateway_builder.rb → builder/api/gateway.rb} +14 -37
- data/lib/jets/cfn/builder/api/mapping.rb +54 -0
- data/lib/jets/cfn/builder/api/methods.rb +72 -0
- data/lib/jets/cfn/builder/api/paged.rb +30 -0
- data/lib/jets/cfn/builder/api/pages/base.rb +105 -0
- data/lib/jets/cfn/builder/api/pages/methods.rb +17 -0
- data/lib/jets/cfn/builder/api/pages/page.rb +19 -0
- data/lib/jets/cfn/builder/api/pages/resources.rb +21 -0
- data/lib/jets/cfn/builder/api/resources.rb +40 -0
- data/lib/jets/cfn/{builders/authorizer_builder.rb → builder/authorizer.rb} +16 -19
- data/lib/jets/cfn/builder/controller.rb +28 -0
- data/lib/jets/cfn/builder/function.rb +9 -0
- data/lib/jets/cfn/{builders → builder}/interface.rb +45 -51
- data/lib/jets/cfn/builder/job.rb +10 -0
- data/lib/jets/cfn/builder/nested.rb +130 -0
- data/lib/jets/cfn/builder/one_controller.rb +53 -0
- data/lib/jets/cfn/{builders/parent_builder → builder/parent}/stagger.rb +1 -1
- data/lib/jets/cfn/{builders/parent_builder.rb → builder/parent.rb} +54 -54
- data/lib/jets/cfn/builder/post_process.rb +25 -0
- data/lib/jets/cfn/{builders/rule_builder.rb → builder/rule.rb} +4 -8
- data/lib/jets/cfn/{builders/shared_builder.rb → builder/shared.rb} +4 -3
- data/lib/jets/cfn/{builders → builder}/util/source.rb +1 -1
- data/lib/jets/{commands/build.rb → cfn/builder.rb} +50 -78
- data/lib/jets/cfn/deployment.rb +45 -0
- data/lib/jets/cfn/download.rb +39 -0
- data/lib/jets/cfn/params/api/base.rb +39 -0
- data/lib/jets/cfn/params/api/cors.rb +10 -0
- data/lib/jets/cfn/params/api/methods.rb +69 -0
- data/lib/jets/cfn/params/api/resources.rb +28 -0
- data/lib/jets/{resource/child_stack/common_parameters.rb → cfn/params/common.rb} +3 -3
- data/lib/jets/{resource → cfn/resource}/api_gateway/authorizer.rb +21 -21
- data/lib/jets/cfn/resource/api_gateway/base_path/function.rb +57 -0
- data/lib/jets/{resource → cfn/resource}/api_gateway/base_path/mapping.rb +13 -12
- data/lib/jets/cfn/resource/api_gateway/base_path/role.rb +70 -0
- data/lib/jets/{resource → cfn/resource}/api_gateway/deployment.rb +13 -20
- data/lib/jets/{resource → cfn/resource}/api_gateway/domain_name.rb +11 -11
- data/lib/jets/{resource → cfn/resource}/api_gateway/method/authorization.rb +1 -1
- data/lib/jets/cfn/resource/api_gateway/method.rb +92 -0
- data/lib/jets/{resource → cfn/resource}/api_gateway/resource.rb +14 -10
- data/lib/jets/cfn/resource/api_gateway/resource_id.rb +25 -0
- data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/change_detection.rb +1 -1
- data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/logical_id/message.rb +1 -1
- data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/logical_id.rb +1 -1
- data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes/change/base.rb +5 -3
- data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes/change/media_types.rb +2 -2
- data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes/change/page.rb +5 -5
- data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes/change/to.rb +8 -3
- data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes/change/variable.rb +2 -2
- data/lib/jets/cfn/resource/api_gateway/rest_api/routes/change.rb +27 -0
- data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes/collision/variable_exception.rb +1 -1
- data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes/collision.rb +1 -1
- data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes.rb +1 -1
- data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api.rb +12 -12
- data/lib/jets/{resource → cfn/resource}/associated.rb +1 -1
- data/lib/jets/{resource → cfn/resource}/config/config_rule.rb +18 -18
- data/lib/jets/{resource → cfn/resource}/config/managed_rule.rb +5 -5
- data/lib/jets/{resource → cfn/resource}/events/rule.rb +10 -10
- data/lib/jets/{resource → cfn/resource}/iam/application_role.rb +4 -4
- data/lib/jets/{resource → cfn/resource}/iam/base_role_definition.rb +15 -15
- data/lib/jets/{resource → cfn/resource}/iam/class_role.rb +5 -5
- data/lib/jets/{resource → cfn/resource}/iam/function_role.rb +6 -6
- data/lib/jets/{resource → cfn/resource}/iam/managed_policy.rb +1 -1
- data/lib/jets/{resource → cfn/resource}/iam/policy.rb +8 -8
- data/lib/jets/{resource → cfn/resource}/iam/policy_document.rb +10 -9
- data/lib/jets/{resource → cfn/resource}/iot/topic_rule.rb +10 -10
- data/lib/jets/{resource → cfn/resource}/lambda/event_source_mapping.rb +9 -9
- data/lib/jets/cfn/resource/lambda/function/controller.rb +21 -0
- data/lib/jets/{resource → cfn/resource}/lambda/function/environment.rb +4 -5
- data/lib/jets/cfn/resource/lambda/function.rb +266 -0
- data/lib/jets/{resource → cfn/resource}/lambda/gem_layer.rb +2 -2
- data/lib/jets/{resource → cfn/resource}/lambda/layer_version.rb +10 -10
- data/lib/jets/cfn/resource/lambda/permission.rb +51 -0
- data/lib/jets/cfn/resource/logs/subscription_filter.rb +31 -0
- data/lib/jets/cfn/resource/nested/api/base.rb +4 -0
- data/lib/jets/cfn/resource/nested/api/deployment.rb +53 -0
- data/lib/jets/cfn/resource/nested/api/gateway.rb +15 -0
- data/lib/jets/cfn/resource/nested/api/mapping.rb +33 -0
- data/lib/jets/cfn/resource/nested/api/methods.rb +30 -0
- data/lib/jets/cfn/resource/nested/api/page.rb +8 -0
- data/lib/jets/cfn/resource/nested/api/resources.rb +22 -0
- data/lib/jets/{resource/child_stack → cfn/resource/nested}/app_class.rb +15 -48
- data/lib/jets/{resource/child_stack → cfn/resource/nested}/authorizer.rb +8 -14
- data/lib/jets/cfn/resource/nested/base.rb +38 -0
- data/lib/jets/cfn/resource/nested/one_controller.rb +48 -0
- data/lib/jets/{resource/child_stack → cfn/resource/nested}/shared.rb +10 -16
- data/lib/jets/cfn/resource/one/function.rb +66 -0
- data/lib/jets/cfn/resource/one/permission.rb +17 -0
- data/lib/jets/{resource → cfn/resource}/replacer.rb +26 -27
- data/lib/jets/{resource → cfn/resource}/route53/record_set.rb +18 -18
- data/lib/jets/{resource → cfn/resource}/s3/bucket.rb +4 -4
- data/lib/jets/cfn/resource/s3/jets_bucket.rb +68 -0
- data/lib/jets/{resource → cfn/resource}/sns/subscription.rb +8 -8
- data/lib/jets/{resource → cfn/resource}/sns/topic.rb +10 -10
- data/lib/jets/{resource → cfn/resource}/sns/topic_policy.rb +13 -13
- data/lib/jets/{resource → cfn/resource}/sqs/queue.rb +5 -5
- data/lib/jets/{resource → cfn/resource}/standardizer.rb +8 -9
- data/lib/jets/cfn/resource.rb +8 -0
- data/lib/jets/cfn/ship.rb +20 -19
- data/lib/jets/cfn/template.rb +89 -0
- data/lib/jets/cfn/upload.rb +26 -23
- data/lib/jets/cli.rb +28 -210
- data/lib/jets/command/actions.rb +49 -0
- data/lib/jets/command/api_helpers.rb +41 -0
- data/lib/jets/command/aws_helpers.rb +26 -0
- data/lib/jets/command/base.rb +204 -0
- data/lib/jets/command/behavior.rb +83 -0
- data/lib/jets/command/environment_argument.rb +42 -0
- data/lib/jets/command/help/call.md +48 -0
- data/lib/jets/{commands → command}/help/deploy.md +1 -1
- data/lib/jets/command/help/logs.md +21 -0
- data/lib/jets/{commands → command}/help/new.md +3 -4
- data/lib/jets/command/help/projects.md +6 -0
- data/lib/jets/command/help/releases.md +37 -0
- data/lib/jets/command/help/rollback.md +5 -0
- data/lib/jets/command/help/routes.md +15 -0
- data/lib/jets/command/help/stacks.md +6 -0
- data/lib/jets/command/help.rb +17 -0
- data/lib/jets/command/helpers/editor.rb +35 -0
- data/lib/jets/command.rb +133 -0
- data/lib/jets/commands/application/application_command.rb +40 -0
- data/lib/jets/commands/build/build_command.rb +33 -0
- data/lib/jets/commands/call/anonymous_guesser.rb +1 -1
- data/lib/jets/commands/call/autoload_guesser.rb +2 -2
- data/lib/jets/commands/call/base_guesser.rb +4 -4
- data/lib/jets/commands/call/call_command.rb +27 -0
- data/lib/jets/commands/call/caller.rb +184 -0
- data/lib/jets/commands/call/guesser.rb +1 -1
- data/lib/jets/commands/clean/base.rb +1 -1
- data/lib/jets/commands/clean/build.rb +1 -1
- data/lib/jets/commands/clean/clean_command.rb +15 -0
- data/lib/jets/commands/clean/log.rb +1 -1
- data/lib/jets/commands/configure/configure_command.rb +9 -0
- data/lib/jets/commands/console/console_command.rb +38 -0
- data/lib/jets/commands/credentials/USAGE +103 -0
- data/lib/jets/commands/credentials/credentials_command/diffing.rb +51 -0
- data/lib/jets/commands/credentials/credentials_command.rb +139 -0
- data/lib/jets/commands/db/system/change/change_command.rb +24 -0
- data/lib/jets/commands/dbconsole/dbconsole_command.rb +184 -0
- data/lib/jets/commands/degenerate/degenerate_command.rb +21 -0
- data/lib/jets/commands/delete/delete_command.rb +155 -0
- data/lib/jets/commands/{deploy.rb → deploy/deploy_command.rb} +28 -47
- data/lib/jets/commands/dev/dev_command.rb +19 -0
- data/lib/jets/commands/{dotenv.rb → dotenv/dotenv_command.rb} +2 -2
- data/lib/jets/commands/encrypted/USAGE +46 -0
- data/lib/jets/commands/encrypted/encrypted_command.rb +87 -0
- data/lib/jets/commands/gems/gems_command.rb +14 -0
- data/lib/jets/commands/generate/generate_command.rb +95 -0
- data/lib/jets/commands/help/USAGE +20 -0
- data/lib/jets/commands/help/help_command.rb +15 -0
- data/lib/jets/commands/initializers/initializers_command.rb +19 -0
- data/lib/jets/commands/logs/logs_command.rb +45 -0
- data/lib/jets/commands/new/new_command.rb +19 -0
- data/lib/jets/commands/notes/notes_command.rb +30 -0
- data/lib/jets/commands/plugin/plugin_command.rb +45 -0
- data/lib/jets/commands/projects/projects_command.rb +30 -0
- data/lib/jets/commands/rake/rake_command.rb +59 -0
- data/lib/jets/commands/releases/releases_command.rb +72 -0
- data/lib/jets/commands/rollback/rollback_command.rb +41 -0
- data/lib/jets/commands/routes/routes_command.rb +19 -0
- data/lib/jets/commands/runner/runner_command.rb +60 -0
- data/lib/jets/commands/server/server_command.rb +291 -0
- data/lib/jets/commands/stacks/stacks_command.rb +39 -0
- data/lib/jets/commands/status/status_command.rb +9 -0
- data/lib/jets/commands/{url.rb → url/url_command.rb} +37 -14
- data/lib/jets/commands/version/version_command.rb +11 -0
- data/lib/jets/commands.rb +17 -0
- data/lib/jets/configuration.rb +166 -0
- data/lib/jets/controller/base.rb +105 -183
- data/lib/jets/controller/compat/abstract_controller/base.rb +126 -0
- data/lib/jets/controller/compat/action_controller/metal.rb +99 -0
- data/lib/jets/controller/compat/caching.rb +13 -0
- data/lib/jets/controller/compat/future.rb +13 -0
- data/lib/jets/controller/compat/route_set.rb +47 -0
- data/lib/jets/controller/decorate/apigw_stage.rb +39 -0
- data/lib/jets/controller/{authorization.rb → decorate/authorization.rb} +1 -1
- data/lib/jets/controller/decorate/logging.rb +90 -0
- data/lib/jets/controller/decorate/redirecting.rb +16 -0
- data/lib/jets/controller/decorate/url_for.rb +10 -0
- data/lib/jets/controller/{rack/adapter.rb → handler/apigw.rb} +36 -37
- data/lib/jets/controller/handler.rb +41 -0
- data/lib/jets/controller/middleware/main.rb +16 -8
- data/lib/jets/controller/middleware/{local/api_gateway.rb → mimic/apigw.rb} +40 -15
- data/lib/jets/controller/middleware/mimic/lambda_context.rb +44 -0
- data/lib/jets/controller/middleware/{local.rb → mimic.rb} +36 -51
- data/lib/jets/controller/rack_adapter/action.rb +35 -0
- data/lib/jets/controller/{rack → rack_adapter}/env.rb +39 -24
- data/lib/jets/controller/request/compat/params.rb +144 -0
- data/lib/jets/controller/request/compat/request.rb +125 -0
- data/lib/jets/controller/request.rb +35 -18
- data/lib/jets/controller/response/compat/response.rb +67 -0
- data/lib/jets/controller/response.rb +91 -8
- data/lib/jets/core.rb +142 -51
- data/lib/jets/core_ext/kernel.rb +2 -2
- data/lib/jets/core_ext/symbol.rb +5 -0
- data/lib/jets/core_ext.rb +4 -0
- data/lib/jets/dev_caching.rb +44 -0
- data/lib/jets/dotenv/ssm.rb +5 -2
- data/lib/jets/dotenv.rb +2 -1
- data/lib/jets/engine/configuration.rb +96 -0
- data/lib/jets/engine/turbines.rb +23 -0
- data/lib/jets/engine.rb +380 -0
- data/lib/jets/exception_reporting.rb +43 -0
- data/lib/jets/generators/job/job_generator.rb +41 -0
- data/lib/jets/generators/job/templates/event_types/dynamodb.rb.tt +8 -0
- data/lib/jets/generators/job/templates/event_types/iot.rb.tt +8 -0
- data/lib/jets/generators/job/templates/event_types/kinesis.rb.tt +9 -0
- data/lib/jets/generators/job/templates/event_types/log.rb.tt +9 -0
- data/lib/jets/generators/job/templates/event_types/rule.rb.tt +23 -0
- data/lib/jets/generators/job/templates/event_types/s3.rb.tt +11 -0
- data/lib/jets/{generator/templates/active_job/job/templates/job.rb.tt → generators/job/templates/event_types/scheduled.rb.tt} +3 -3
- data/lib/jets/generators/job/templates/event_types/sns.rb.tt +9 -0
- data/lib/jets/generators/job/templates/event_types/sqs.rb.tt +9 -0
- data/lib/jets/generators/overrides/app/USAGE +38 -0
- data/lib/jets/generators/overrides/app/app_generator.rb +148 -0
- data/lib/jets/generators/overrides/app/helpers.rb +139 -0
- data/lib/jets/generators/overrides/app/templates/.env +10 -0
- data/lib/jets/{commands/templates/skeleton/.gitignore → generators/overrides/app/templates/.gitignore.tt} +2 -1
- data/lib/jets/generators/overrides/app/templates/Gemfile.tt +25 -0
- data/lib/jets/generators/overrides/app/templates/Rakefile +2 -0
- data/lib/jets/generators/overrides/app/templates/app/assets/config/manifest.js +3 -0
- data/lib/jets/generators/overrides/app/templates/app/assets/stylesheets/application.css +15 -0
- data/lib/jets/generators/overrides/app/templates/app/javascript/application.js +5 -0
- data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/app/models/application_record.rb +1 -1
- data/lib/jets/generators/overrides/app/templates/app/views/layouts/application.html.erb.tt +30 -0
- data/lib/jets/generators/overrides/app/templates/bin/jets +3 -0
- data/lib/jets/generators/overrides/app/templates/config/application.rb.tt +15 -0
- data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/config/database.yml.tt +1 -1
- data/lib/jets/generators/overrides/app/templates/config/environments/development.rb.tt +29 -0
- data/lib/jets/generators/overrides/app/templates/config/environments/production.rb.tt +19 -0
- data/lib/jets/generators/overrides/app/templates/config/environments/test.rb.tt +23 -0
- data/lib/jets/generators/overrides/app/templates/config/initializers/content_security_policy.rb +31 -0
- data/lib/jets/generators/overrides/app/templates/config/initializers/filter_parameter_logging.rb +8 -0
- data/lib/jets/generators/overrides/app/templates/config/initializers/permissions_policy.rb +11 -0
- data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/config/routes.rb +5 -1
- data/lib/jets/generators/overrides/app/templates/db/.gitkeep +0 -0
- data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/public/404.html +6 -6
- data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/public/422.html +6 -6
- data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/public/500.html +6 -6
- data/lib/jets/generators/overrides/templates/erb/scaffold/index.html.erb +22 -0
- data/lib/jets/generators/overrides/templates/erb/scaffold/partial.html.erb +8 -0
- data/lib/jets/{generator/templates/rails/scaffold_controller/api_controller.rb → generators/overrides/templates/rails/scaffold_controller/api_controller.rb.tt} +5 -9
- data/lib/jets/generators/overrides/templates/rails/scaffold_controller/controller.rb.tt +67 -0
- data/lib/jets/generators.rb +112 -0
- data/lib/jets/info.rb +116 -0
- data/lib/jets/initializable.rb +95 -0
- data/lib/jets/job/base.rb +3 -2
- data/lib/jets/job/dsl/dynamodb_event.rb +19 -9
- data/lib/jets/job/dsl/event_source_mapping.rb +1 -1
- data/lib/jets/job/dsl/iot_event.rb +6 -6
- data/lib/jets/job/dsl/kinesis_event.rb +5 -5
- data/lib/jets/job/dsl/log_event.rb +2 -2
- data/lib/jets/job/dsl/rule_event.rb +7 -4
- data/lib/jets/job/dsl/s3_event.rb +1 -1
- data/lib/jets/job/dsl/sns_event.rb +6 -6
- data/lib/jets/job/dsl/sqs_event.rb +11 -11
- data/lib/jets/klass.rb +5 -6
- data/lib/jets/lambda/definition.rb +118 -0
- data/lib/jets/lambda/dsl/warnings.rb +57 -0
- data/lib/jets/lambda/dsl.rb +64 -53
- data/lib/jets/lambda/function.rb +3 -3
- data/lib/jets/lambda/function_constructor.rb +6 -6
- data/lib/jets/lambda/functions.rb +36 -1
- data/lib/jets/mega/request/source.rb +1 -2
- data/lib/jets/mega/request.rb +4 -4
- data/lib/jets/names.rb +31 -15
- data/lib/jets/overrides/dummy/rails.rb +11 -0
- data/lib/jets/overrides/lambda/marshaller.rb +10 -0
- data/lib/jets/overrides/puma.rb +10 -0
- data/lib/jets/paths.rb +243 -0
- data/lib/jets/{poly_fun → poly}/base_executor.rb +13 -13
- data/lib/jets/{poly_fun → poly}/lambda_executor.rb +2 -2
- data/lib/jets/{poly_fun → poly}/node_error.rb +1 -1
- data/lib/jets/{poly_fun → poly}/node_executor.rb +4 -4
- data/lib/jets/{poly_fun → poly}/python_error.rb +1 -1
- data/lib/jets/{poly_fun → poly}/python_executor.rb +2 -2
- data/lib/jets/{poly_fun.rb → poly.rb} +12 -12
- data/lib/jets/preheat.rb +12 -25
- data/lib/jets/processors/deducer.rb +2 -2
- data/lib/jets/processors/main_processor.rb +6 -13
- data/lib/jets/rack/logger.rb +77 -0
- data/lib/jets/router/compat/route_set.rb +177 -0
- data/lib/jets/router/dsl/mount.rb +40 -6
- data/lib/jets/router/dsl.rb +125 -105
- data/lib/jets/router/engine_mount.rb +36 -0
- data/lib/jets/router/help.rb +130 -0
- data/lib/jets/router/helpers/named_routes/add_full_url.rb +13 -0
- data/lib/jets/router/helpers/named_routes/generated.rb +197 -0
- data/lib/jets/router/helpers/named_routes/proxy.rb +66 -0
- data/lib/jets/router/matcher.rb +140 -17
- data/lib/jets/router/resources/options.rb +6 -4
- data/lib/jets/router/route/after_initialize.rb +64 -0
- data/lib/jets/router/route/as.rb +93 -0
- data/lib/jets/router/route/authorizer.rb +1 -0
- data/lib/jets/router/route/compat.rb +45 -0
- data/lib/jets/router/route/info.rb +74 -0
- data/lib/jets/router/route/node.rb +137 -0
- data/lib/jets/router/route/path.rb +93 -0
- data/lib/jets/router/route.rb +109 -106
- data/lib/jets/router/route_set.rb +214 -0
- data/lib/jets/router/scope.rb +204 -69
- data/lib/jets/router/state.rb +36 -16
- data/lib/jets/router/util.rb +1 -31
- data/lib/jets/router.rb +64 -162
- data/lib/jets/ruby_version_check.rb +15 -0
- data/lib/jets/rule/base.rb +1 -0
- data/lib/jets/rule/dsl.rb +7 -7
- data/lib/jets/secrets.rb +110 -0
- data/lib/jets/spec_helpers/controllers/request.rb +22 -16
- data/lib/jets/spec_helpers/controllers.rb +32 -24
- data/lib/jets/spec_helpers.rb +0 -6
- data/lib/jets/stack/builder.rb +3 -2
- data/lib/jets/stack/definition.rb +1 -4
- data/lib/jets/stack/function.rb +2 -2
- data/lib/jets/stack/main/dsl/cloudwatch.rb +4 -4
- data/lib/jets/stack/main/dsl/kinesis.rb +2 -2
- data/lib/jets/stack/main/dsl/lambda.rb +26 -20
- data/lib/jets/stack/main/dsl/sqs.rb +2 -2
- data/lib/jets/stack/output/lookup.rb +1 -1
- data/lib/jets/stack/output.rb +2 -2
- data/lib/jets/stack/parameter.rb +2 -2
- data/lib/jets/stack/resource.rb +3 -3
- data/lib/jets/stack/s3_event.rb +51 -37
- data/lib/jets/stack.rb +1 -1
- data/lib/jets/tasks/engine.rake +85 -0
- data/lib/jets/tasks/framework.rake +66 -0
- data/lib/jets/tasks/log.rake +41 -0
- data/lib/jets/tasks/middleware.rake +9 -0
- data/lib/jets/tasks/misc.rake +81 -0
- data/lib/jets/tasks/statistics.rake +37 -0
- data/lib/jets/tasks/tmp.rake +51 -0
- data/lib/jets/tasks/yarn.rake +29 -0
- data/lib/jets/tasks/zeitwerk.rake +61 -0
- data/lib/jets/tasks.rb +18 -0
- data/lib/jets/turbine/configurable.rb +36 -0
- data/lib/jets/turbine/configuration.rb +101 -0
- data/lib/jets/turbine.rb +164 -20
- data/lib/jets/util/camelize.rb +24 -0
- data/lib/jets/version.rb +1 -1
- data/lib/jets.rb +7 -15
- metadata +427 -336
- data/bin/release +0 -9
- data/lib/jets/application/defaults.rb +0 -230
- data/lib/jets/builders/reconfigure_rails/config/initializers/jets.rb +0 -16
- data/lib/jets/builders/reconfigure_rails.rb +0 -114
- data/lib/jets/cfn/builders/api_resources_builder.rb +0 -44
- data/lib/jets/cfn/builders/base_child_builder.rb +0 -88
- data/lib/jets/cfn/builders/controller_builder.rb +0 -50
- data/lib/jets/cfn/builders/function_builder.rb +0 -14
- data/lib/jets/cfn/builders/job_builder.rb +0 -14
- data/lib/jets/cfn/builders/page_builder.rb +0 -80
- data/lib/jets/cfn/built_template.rb +0 -15
- data/lib/jets/cfn/template_source.rb +0 -61
- data/lib/jets/commands/base.rb +0 -145
- data/lib/jets/commands/call.rb +0 -184
- data/lib/jets/commands/clean.rb +0 -19
- data/lib/jets/commands/configure.rb +0 -51
- data/lib/jets/commands/console.rb +0 -18
- data/lib/jets/commands/db/environment-task.rake +0 -3
- data/lib/jets/commands/db/tasks/dummy/app.rb +0 -25
- data/lib/jets/commands/db/tasks/dummy/config.rb +0 -14
- data/lib/jets/commands/db/tasks.rb +0 -34
- data/lib/jets/commands/db.rb +0 -13
- data/lib/jets/commands/dbconsole.rb +0 -134
- data/lib/jets/commands/delete.rb +0 -136
- data/lib/jets/commands/dynamodb/migrate.rb +0 -9
- data/lib/jets/commands/dynamodb/migrator.rb +0 -36
- data/lib/jets/commands/dynamodb.rb +0 -19
- data/lib/jets/commands/gems.rb +0 -13
- data/lib/jets/commands/help/call.md +0 -69
- data/lib/jets/commands/help/dynamodb/generate.md +0 -52
- data/lib/jets/commands/help/dynamodb/migrate.md +0 -4
- data/lib/jets/commands/help/routes.md +0 -16
- data/lib/jets/commands/help.rb +0 -9
- data/lib/jets/commands/import/base.rb +0 -49
- data/lib/jets/commands/import/cheatsheet.rb +0 -35
- data/lib/jets/commands/import/rack.rb +0 -16
- data/lib/jets/commands/import/rails.rb +0 -74
- data/lib/jets/commands/import/sequence.rb +0 -90
- data/lib/jets/commands/import/templates/config/database.yml +0 -30
- data/lib/jets/commands/import/templates/submodules-cheatsheet.md +0 -89
- data/lib/jets/commands/import.rb +0 -12
- data/lib/jets/commands/main.rb +0 -169
- data/lib/jets/commands/markdown/creator.rb +0 -58
- data/lib/jets/commands/markdown/index.rb +0 -27
- data/lib/jets/commands/markdown/page.rb +0 -125
- data/lib/jets/commands/markdown/shell.rb +0 -11
- data/lib/jets/commands/new.rb +0 -173
- data/lib/jets/commands/rake_command.rb +0 -61
- data/lib/jets/commands/rake_tasks.rb +0 -50
- data/lib/jets/commands/runner.rb +0 -16
- data/lib/jets/commands/sequence.rb +0 -104
- data/lib/jets/commands/stack_info.rb +0 -30
- data/lib/jets/commands/templates/skeleton/.env.development.tt +0 -3
- data/lib/jets/commands/templates/skeleton/.env.test +0 -3
- data/lib/jets/commands/templates/skeleton/.env.tt +0 -3
- data/lib/jets/commands/templates/skeleton/.jetskeep +0 -1
- data/lib/jets/commands/templates/skeleton/Gemfile.tt +0 -40
- data/lib/jets/commands/templates/skeleton/Procfile +0 -7
- data/lib/jets/commands/templates/skeleton/Rakefile +0 -2
- data/lib/jets/commands/templates/skeleton/app/models/application_item.rb +0 -2
- data/lib/jets/commands/templates/skeleton/app/views/layouts/application.html.erb.tt +0 -26
- data/lib/jets/commands/templates/skeleton/config/application.rb.tt +0 -72
- data/lib/jets/commands/templates/skeleton/config/dynamodb.yml +0 -22
- data/lib/jets/commands/templates/skeleton/config/environments/development.rb +0 -7
- data/lib/jets/commands/templates/skeleton/config/environments/production.rb +0 -9
- data/lib/jets/commands/templates/skeleton/config/environments/test.rb +0 -7
- data/lib/jets/commands/templates/webpacker/app/javascript/packs/application.js.tt +0 -23
- data/lib/jets/commands/templates/webpacker/app/javascript/packs/theme.scss.tt +0 -24
- data/lib/jets/commands/upgrade/templates/bin/webpack +0 -19
- data/lib/jets/commands/upgrade/templates/bin/webpack-dev-server +0 -19
- data/lib/jets/commands/upgrade/version1.rb +0 -136
- data/lib/jets/commands/upgrade.rb +0 -105
- data/lib/jets/commands/webpacker_template.rb +0 -18
- data/lib/jets/controller/callbacks.rb +0 -73
- data/lib/jets/controller/cookies/jar.rb +0 -269
- data/lib/jets/controller/cookies.rb +0 -38
- data/lib/jets/controller/error/invalid_authenticity_token.rb +0 -6
- data/lib/jets/controller/error.rb +0 -4
- data/lib/jets/controller/forgery_protection.rb +0 -43
- data/lib/jets/controller/layout.rb +0 -17
- data/lib/jets/controller/middleware/cors.rb +0 -60
- data/lib/jets/controller/middleware/local/mimic_aws_call.rb +0 -38
- data/lib/jets/controller/middleware/local/route_matcher.rb +0 -22
- data/lib/jets/controller/middleware/reloader.rb +0 -15
- data/lib/jets/controller/parameters_filter.rb +0 -29
- data/lib/jets/controller/params.rb +0 -117
- data/lib/jets/controller/redirection.rb +0 -61
- data/lib/jets/controller/rendering/rack_renderer.rb +0 -267
- data/lib/jets/controller/rendering.rb +0 -96
- data/lib/jets/controller/stage.rb +0 -34
- data/lib/jets/controller.rb +0 -3
- data/lib/jets/db.rb +0 -15
- data/lib/jets/generator/templates/erb/controller/view.html.erb +0 -2
- data/lib/jets/generator/templates/erb/scaffold/index.html.erb +0 -29
- data/lib/jets/generator/templates/rails/controller/controller.rb +0 -13
- data/lib/jets/generator/templates/rails/helper/helper.rb +0 -4
- data/lib/jets/generator/templates/rails/scaffold_controller/controller.rb +0 -67
- data/lib/jets/generator.rb +0 -112
- data/lib/jets/internal/app/controllers/jets/bare_controller.rb +0 -16
- data/lib/jets/internal/app/controllers/jets/rack_controller.rb +0 -12
- data/lib/jets/internal/app/helpers/jets/mailers_helper.rb +0 -9
- data/lib/jets/internal/app/jobs/jets/preheat_job.rb +0 -57
- data/lib/jets/internal/app/views/jets/mailers/index.html.erb +0 -8
- data/lib/jets/internal/app/views/jets/mailers/mailer.html.erb +0 -6
- data/lib/jets/internal/turbines/jets/mailer.rb +0 -52
- data/lib/jets/lambda/task.rb +0 -111
- data/lib/jets/logger.rb +0 -21
- data/lib/jets/middleware/configurator.rb +0 -84
- data/lib/jets/middleware/default_stack.rb +0 -53
- data/lib/jets/middleware/layer.rb +0 -34
- data/lib/jets/middleware/stack.rb +0 -77
- data/lib/jets/middleware.rb +0 -33
- data/lib/jets/overrides/rails/action_controller.rb +0 -13
- data/lib/jets/overrides/rails/asset_tag_helper.rb +0 -114
- data/lib/jets/overrides/rails/common_methods.rb +0 -13
- data/lib/jets/overrides/rails/migration_checker.rb +0 -34
- data/lib/jets/overrides/rails/rendering_helper.rb +0 -27
- data/lib/jets/overrides/rails/url_helper.rb +0 -88
- data/lib/jets/overrides/rails.rb +0 -6
- data/lib/jets/rack_server.rb +0 -86
- data/lib/jets/resource/api_gateway/base_path/function.rb +0 -49
- data/lib/jets/resource/api_gateway/base_path/role.rb +0 -76
- data/lib/jets/resource/api_gateway/cors.rb +0 -61
- data/lib/jets/resource/api_gateway/method.rb +0 -102
- data/lib/jets/resource/api_gateway/rest_api/routes/change.rb +0 -16
- data/lib/jets/resource/base.rb +0 -28
- data/lib/jets/resource/child_stack/api_deployment.rb +0 -58
- data/lib/jets/resource/child_stack/api_gateway.rb +0 -23
- data/lib/jets/resource/child_stack/api_resource/page.rb +0 -20
- data/lib/jets/resource/child_stack/api_resource.rb +0 -54
- data/lib/jets/resource/child_stack/base.rb +0 -24
- data/lib/jets/resource/lambda/function.rb +0 -221
- data/lib/jets/resource/logs/subscription_filter.rb +0 -31
- data/lib/jets/resource/permission.rb +0 -45
- data/lib/jets/resource.rb +0 -71
- data/lib/jets/router/error.rb +0 -4
- data/lib/jets/router/finder.rb +0 -47
- data/lib/jets/router/helpers/core_helper.rb +0 -27
- data/lib/jets/router/helpers/named_routes_helper.rb +0 -8
- data/lib/jets/router/helpers.rb +0 -4
- data/lib/jets/router/method_creator/code.rb +0 -99
- data/lib/jets/router/method_creator/edit.rb +0 -12
- data/lib/jets/router/method_creator/generic.rb +0 -11
- data/lib/jets/router/method_creator/index.rb +0 -48
- data/lib/jets/router/method_creator/new.rb +0 -12
- data/lib/jets/router/method_creator/root.rb +0 -15
- data/lib/jets/router/method_creator/show.rb +0 -12
- data/lib/jets/router/method_creator.rb +0 -50
- data/lib/jets/turbo/database_yaml.rb +0 -41
- data/lib/jets/turbo/project/.gitignore +0 -12
- data/lib/jets/turbo/project/.jetskeep +0 -1
- data/lib/jets/turbo/project/Gemfile +0 -16
- data/lib/jets/turbo/project/Rakefile +0 -2
- data/lib/jets/turbo/project/app/controllers/application_controller.rb +0 -2
- data/lib/jets/turbo/project/app/helpers/application_helper.rb +0 -2
- data/lib/jets/turbo/project/app/jobs/application_job.rb +0 -4
- data/lib/jets/turbo/project/config/application.rb +0 -5
- data/lib/jets/turbo/project/config/routes.rb +0 -4
- data/lib/jets/turbo/project/config.ru +0 -5
- data/lib/jets/turbo/rails.rb +0 -127
- data/lib/jets/turbo/templates/config/database.yml +0 -30
- data/lib/jets/turbo.rb +0 -56
- data/readme/prerelease.md +0 -6
- data/readme/testing.md +0 -60
- /data/{lib/jets → engines}/internal/app/shared/functions/jets/s3_bucket_config.rb +0 -0
- /data/lib/jets/{commands → command}/help/build.md +0 -0
- /data/lib/jets/{commands → command}/help/clean/build.md +0 -0
- /data/lib/jets/{commands → command}/help/clean/log.md +0 -0
- /data/lib/jets/{commands → command}/help/console.md +0 -0
- /data/lib/jets/{commands → command}/help/db/generate.md +0 -0
- /data/lib/jets/{commands → command}/help/dbconsole.md +0 -0
- /data/lib/jets/{commands → command}/help/degenerate.md +0 -0
- /data/lib/jets/{commands → command}/help/delete.md +0 -0
- /data/lib/jets/{commands → command}/help/gems/check.md +0 -0
- /data/lib/jets/{commands → command}/help/generate.md +0 -0
- /data/lib/jets/{commands → command}/help/import/rack.md +0 -0
- /data/lib/jets/{commands → command}/help/import/rails.md +0 -0
- /data/lib/jets/{commands → command}/help/runner.md +0 -0
- /data/lib/jets/{commands → command}/help/server.md +0 -0
- /data/lib/jets/{commands → command}/help/status.md +0 -0
- /data/lib/jets/{commands → command}/help/upgrade.md +0 -0
- /data/lib/jets/{commands → command}/help/url.md +0 -0
- /data/lib/jets/{generator/templates/active_job → generators}/job/templates/application_job.rb.tt +0 -0
- /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/.rspec +0 -0
- /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/README.md +0 -0
- /data/{.gitmodules → lib/jets/generators/overrides/app/templates/app/assets/images/.keep} +0 -0
- /data/lib/jets/{commands/templates/skeleton/db/.gitkeep → generators/overrides/app/templates/app/assets/javascripts/.keep} +0 -0
- /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/app/controllers/application_controller.rb +0 -0
- /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/app/helpers/application_helper.rb +0 -0
- /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/app/jobs/application_job.rb +0 -0
- /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/config.ru +0 -0
- /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/public/favicon.ico +0 -0
- /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/spec/controllers/posts_controller_spec.rb +0 -0
- /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/spec/fixtures/payloads/posts-index.json +0 -0
- /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/spec/fixtures/payloads/posts-show.json +0 -0
- /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/spec/spec_helper.rb.tt +0 -0
- /data/lib/jets/{generator → generators/overrides}/templates/erb/scaffold/_form.html.erb +0 -0
- /data/lib/jets/{generator → generators/overrides}/templates/erb/scaffold/edit.html.erb +0 -0
- /data/lib/jets/{generator → generators/overrides}/templates/erb/scaffold/new.html.erb +0 -0
- /data/lib/jets/{generator → generators/overrides}/templates/erb/scaffold/show.html.erb +0 -0
- /data/lib/jets/{generator → generators/overrides}/templates/rails/assets/javascript.js +0 -0
- /data/lib/jets/{generator → generators/overrides}/templates/rails/assets/stylesheet.css +0 -0
- /data/lib/jets/{generator → generators/overrides}/templates/rails/scaffold/scaffold.css +0 -0
data/lib/jets/command.rb
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "active_support"
|
|
4
|
+
require "active_support/core_ext/enumerable"
|
|
5
|
+
require "active_support/core_ext/object/blank"
|
|
6
|
+
|
|
7
|
+
require "thor"
|
|
8
|
+
|
|
9
|
+
module Jets
|
|
10
|
+
module Command
|
|
11
|
+
extend ActiveSupport::Autoload
|
|
12
|
+
|
|
13
|
+
autoload :Behavior
|
|
14
|
+
autoload :Base
|
|
15
|
+
|
|
16
|
+
include Behavior
|
|
17
|
+
|
|
18
|
+
HELP_MAPPINGS = %w(-h -? --help)
|
|
19
|
+
|
|
20
|
+
class << self
|
|
21
|
+
def hidden_commands # :nodoc:
|
|
22
|
+
@hidden_commands ||= []
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def environment # :nodoc:
|
|
26
|
+
ENV["JETS_ENV"].presence || ENV["RACK_ENV"].presence || "development"
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Receives a namespace, arguments, and the behavior to invoke the command.
|
|
30
|
+
def invoke(full_namespace, args = [], **config)
|
|
31
|
+
namespace = full_namespace = full_namespace.to_s
|
|
32
|
+
|
|
33
|
+
if char = namespace =~ /:(\w+)$/
|
|
34
|
+
command_name, namespace = $1, namespace.slice(0, char)
|
|
35
|
+
else
|
|
36
|
+
command_name = namespace
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
command_name, namespace = "help", "help" if command_name.blank? || HELP_MAPPINGS.include?(command_name)
|
|
40
|
+
command_name, namespace, args = "application", "application", ["--help"] if jets_new_with_no_path?(args)
|
|
41
|
+
command_name, namespace = "version", "version" if %w( -v --version ).include?(command_name)
|
|
42
|
+
|
|
43
|
+
original_argv = ARGV.dup
|
|
44
|
+
ARGV.replace(args)
|
|
45
|
+
|
|
46
|
+
command = find_by_namespace(namespace, command_name)
|
|
47
|
+
if command && command.all_commands[command_name]
|
|
48
|
+
command.perform(full_namespace, command_name, args, config)
|
|
49
|
+
else
|
|
50
|
+
args = ["--describe", full_namespace] if HELP_MAPPINGS.include?(args[0])
|
|
51
|
+
find_by_namespace("rake").perform(full_namespace, args, config)
|
|
52
|
+
end
|
|
53
|
+
ensure
|
|
54
|
+
ARGV.replace(original_argv)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Jets finds namespaces similar to Thor, it only adds one rule:
|
|
58
|
+
#
|
|
59
|
+
# Command names must end with "_command.rb". This is required because Jets
|
|
60
|
+
# looks in load paths and loads the command just before it's going to be used.
|
|
61
|
+
#
|
|
62
|
+
# find_by_namespace :webrat, :integration
|
|
63
|
+
#
|
|
64
|
+
# Will search for the following commands:
|
|
65
|
+
#
|
|
66
|
+
# "webrat", "webrat:integration", "jets:webrat", "jets:webrat:integration"
|
|
67
|
+
#
|
|
68
|
+
def find_by_namespace(namespace, command_name = nil) # :nodoc:
|
|
69
|
+
lookups = [ namespace ]
|
|
70
|
+
lookups << "#{namespace}:#{command_name}" if command_name
|
|
71
|
+
lookups.concat lookups.map { |lookup| "jets:#{lookup}" }
|
|
72
|
+
|
|
73
|
+
lookup(lookups)
|
|
74
|
+
|
|
75
|
+
namespaces = subclasses.index_by(&:namespace)
|
|
76
|
+
namespaces[(lookups & namespaces.keys).first]
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# Returns the root of the Jets engine or app running the command.
|
|
80
|
+
def root
|
|
81
|
+
if defined?(ENGINE_ROOT)
|
|
82
|
+
Pathname.new(ENGINE_ROOT)
|
|
83
|
+
elsif defined?(APP_PATH)
|
|
84
|
+
Pathname.new(File.expand_path("../..", APP_PATH))
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def print_commands # :nodoc:
|
|
89
|
+
commands.each { |command| puts(" #{command}") }
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
private
|
|
93
|
+
COMMANDS_IN_USAGE = %w(
|
|
94
|
+
generate
|
|
95
|
+
console
|
|
96
|
+
server
|
|
97
|
+
deploy
|
|
98
|
+
logs
|
|
99
|
+
new
|
|
100
|
+
)
|
|
101
|
+
private_constant :COMMANDS_IN_USAGE
|
|
102
|
+
|
|
103
|
+
PRO_COMMANDS = %w(
|
|
104
|
+
projects
|
|
105
|
+
stacks
|
|
106
|
+
releases
|
|
107
|
+
rollback
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
def jets_new_with_no_path?(args)
|
|
111
|
+
args == ["new"]
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def commands
|
|
115
|
+
lookup!
|
|
116
|
+
visible_commands = (subclasses - hidden_commands).flat_map(&:printing_commands)
|
|
117
|
+
(visible_commands - COMMANDS_IN_USAGE - PRO_COMMANDS).sort
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def command_type # :doc:
|
|
121
|
+
@command_type ||= "command"
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def lookup_paths # :doc:
|
|
125
|
+
@lookup_paths ||= %w( jets/commands commands )
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def file_lookup_paths # :doc:
|
|
129
|
+
@file_lookup_paths ||= [ "{#{lookup_paths.join(',')}}", "**", "*_command.rb" ]
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Jets
|
|
4
|
+
module Command
|
|
5
|
+
class ApplicationCommand < Base # :nodoc:
|
|
6
|
+
hide_command!
|
|
7
|
+
|
|
8
|
+
self.bin = "jets" if respond_to?(:bin=) # Rails 7.1
|
|
9
|
+
|
|
10
|
+
def help
|
|
11
|
+
perform # Punt help output to the generator.
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# This is:
|
|
15
|
+
#
|
|
16
|
+
# bundle exec jets application:help => jets new --help
|
|
17
|
+
# bundle exec jets application => jets new --help
|
|
18
|
+
#
|
|
19
|
+
def perform(*args)
|
|
20
|
+
# require lazily so that Rails constant is only defined within generators
|
|
21
|
+
require "jets/generators/overrides/app/app_generator"
|
|
22
|
+
override_exit_on_failure?
|
|
23
|
+
argv = Rails::Generators::ARGVScrubber.new(args).prepare!
|
|
24
|
+
Jets::Generators::AppGenerator.start argv
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
private
|
|
28
|
+
# We override this way because Jets require generators lazily
|
|
29
|
+
def override_exit_on_failure?
|
|
30
|
+
Jets::Generators::AppGenerator.class_eval do
|
|
31
|
+
# We want to exit on failure to be kind to other libraries
|
|
32
|
+
# This is only when accessing via CLI
|
|
33
|
+
def self.exit_on_failure?
|
|
34
|
+
true
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
module Jets::Command
|
|
2
|
+
class BuildCommand < Base # :nodoc:
|
|
3
|
+
include EnvironmentArgument
|
|
4
|
+
|
|
5
|
+
option :templates, type: :boolean, desc: "Build CloudFormation templates only"
|
|
6
|
+
|
|
7
|
+
desc "build", "Builds and packages project for AWS Lambda"
|
|
8
|
+
long_desc Help.text(:build)
|
|
9
|
+
def perform
|
|
10
|
+
ENV['JETS_TEMPLATES'] = '1' if options[:templates]
|
|
11
|
+
|
|
12
|
+
extract_environment_option_from_argument
|
|
13
|
+
require_application_and_environment!
|
|
14
|
+
|
|
15
|
+
puts "Building project for Lambda..."
|
|
16
|
+
# run gets called from the CLI and does not have all the stack_options yet.
|
|
17
|
+
# We compute it and change the options early here.
|
|
18
|
+
@options.merge!(stack_type: stack_type, s3_bucket: Jets.s3_bucket)
|
|
19
|
+
do_build
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
private
|
|
23
|
+
# Note: build is picked up as a command so naming it do_build
|
|
24
|
+
def do_build
|
|
25
|
+
Jets::Builders::CodeBuilder.new.build unless ENV['JETS_TEMPLATES']
|
|
26
|
+
Jets::Cfn::Builder.new(@options).build
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def stack_type
|
|
30
|
+
first_run? ? :minimal : :full
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
module Jets::Commands::Call
|
|
2
2
|
class AutoloadGuesser < BaseGuesser
|
|
3
3
|
def detect_class_name
|
|
4
4
|
# First guess the class name assuming simple
|
|
@@ -53,7 +53,7 @@ class Jets::Commands::Call
|
|
|
53
53
|
meth = underscored_function_name.sub(underscored_class_name, '')
|
|
54
54
|
meth = meth.sub(/^[-_]/,'') # remove leading _ or -
|
|
55
55
|
|
|
56
|
-
if class_name.constantize.
|
|
56
|
+
if class_name.constantize.definitions.map(&:meth).include?(meth.to_sym)
|
|
57
57
|
@method_name = meth
|
|
58
58
|
else
|
|
59
59
|
@method_name_error ="#{class_name} class found but #{meth} method not found"
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
# method_name
|
|
4
4
|
# error_message
|
|
5
5
|
#
|
|
6
|
-
|
|
6
|
+
module Jets::Commands::Call
|
|
7
7
|
class BaseGuesser
|
|
8
8
|
include Jets::AwsServices
|
|
9
9
|
|
|
@@ -26,15 +26,15 @@ class Jets::Commands::Call
|
|
|
26
26
|
# Strip the project namespace if the user has accidentally added it
|
|
27
27
|
# Since we're going to automatically add it no matter what at the end
|
|
28
28
|
# and dont want the namespace to be included twice
|
|
29
|
-
@provided_function_name = @provided_function_name.sub("#{Jets.
|
|
29
|
+
@provided_function_name = @provided_function_name.sub("#{Jets.project_namespace}-", "")
|
|
30
30
|
|
|
31
31
|
code_path = class_name.underscore.gsub('/','-')
|
|
32
|
-
function_name = [Jets.
|
|
32
|
+
function_name = [Jets.project_namespace, code_path, method_name].join('-')
|
|
33
33
|
generated_function_name(function_name)
|
|
34
34
|
end
|
|
35
35
|
|
|
36
36
|
def generated_function_name(function_name)
|
|
37
|
-
if function_name.size > Jets::MAX_FUNCTION_NAME_SIZE # name generated by CloudFormation
|
|
37
|
+
if function_name.size > Jets::Cfn::Resource::Lambda::Function::MAX_FUNCTION_NAME_SIZE # name generated by CloudFormation
|
|
38
38
|
logical_id = @class_name.gsub('::','')
|
|
39
39
|
|
|
40
40
|
parent_resources = stack_resources(parent_stack.stack_id)
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
require "base64"
|
|
2
|
+
require "json"
|
|
3
|
+
|
|
4
|
+
module Jets::Command
|
|
5
|
+
class CallCommand < Base # :nodoc:
|
|
6
|
+
include Jets::AwsServices
|
|
7
|
+
|
|
8
|
+
desc "call [function] [event]", "Call a lambda function on AWS or locally"
|
|
9
|
+
long_desc Help.text(:call)
|
|
10
|
+
option :invocation_type, default: "RequestResponse", desc: "RequestResponse, Event, or DryRun"
|
|
11
|
+
option :log_type, default: "Tail", desc: "Works if invocation_type set to RequestResponse"
|
|
12
|
+
option :qualifier, desc: "Lambda function version or alias name"
|
|
13
|
+
option :show_log, type: :boolean, desc: "Shows last 4KB of log in the x-amz-log-result header"
|
|
14
|
+
option :show_logs, type: :boolean, desc: "Shows last 4KB of log in the x-amz-log-result header"
|
|
15
|
+
option :lambda_proxy, type: :boolean, default: true, desc: "Enables automatic Lambda proxy transformation of the event payload"
|
|
16
|
+
option :guess, type: :boolean, default: true, desc: "Enables guess mode. Uses inference to allows use of all dashes to specify functions. Guess mode verifies that the function exists in the code base."
|
|
17
|
+
option :local, type: :boolean, desc: "Enables local mode. Instead of invoke the AWS Lambda function, the method gets called locally with current app code. With local mode guess mode is always used."
|
|
18
|
+
option :retry_limit, type: :numeric, default: nil, desc: "Retry count of invoking function. It work with remote call"
|
|
19
|
+
option :read_timeout, type: :numeric, default: nil, desc: " The number of seconds to wait for response data. It work with remote call"
|
|
20
|
+
def perform(function_name, payload='')
|
|
21
|
+
$stdout.sync = true
|
|
22
|
+
$stderr.sync = true
|
|
23
|
+
$stdout = $stderr # jets call operation
|
|
24
|
+
Jets::Commands::Call::Caller.new(function_name, payload, options).run
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
module Jets::Commands::Call
|
|
2
|
+
class Caller
|
|
3
|
+
include Jets::AwsServices
|
|
4
|
+
|
|
5
|
+
def initialize(provided_function_name, event, options={})
|
|
6
|
+
@options = options
|
|
7
|
+
@guess = @options[:guess].nil? ? true : @options[:guess]
|
|
8
|
+
|
|
9
|
+
@provided_function_name = provided_function_name
|
|
10
|
+
@event = event
|
|
11
|
+
|
|
12
|
+
@invocation_type = options[:invocation_type] || "RequestResponse"
|
|
13
|
+
@log_type = options[:log_type] || "Tail"
|
|
14
|
+
@qualifier = @qualifier
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def function_name
|
|
18
|
+
if @provided_function_name == 'controller'
|
|
19
|
+
"#{Jets.project_namespace}-controller"
|
|
20
|
+
elsif @provided_function_name.starts_with?(Jets.project_namespace)
|
|
21
|
+
@provided_function_name # fully qualified function name
|
|
22
|
+
elsif @guess
|
|
23
|
+
ensure_guesses_found! # possibly exits here
|
|
24
|
+
guesser.function_name # guesser adds namespace already
|
|
25
|
+
else
|
|
26
|
+
[Jets.project_namespace, @provided_function_name].join('-')
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def run
|
|
31
|
+
@options[:local] ? local_run : remote_run
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# With local mode there is no way to bypass the guesser
|
|
35
|
+
def local_run
|
|
36
|
+
puts "Local mode enabled!"
|
|
37
|
+
ensure_guesses_found! # possibly exits here
|
|
38
|
+
klass = guesser.class_name.constantize
|
|
39
|
+
# Example:
|
|
40
|
+
# PostsController.process(event, context, meth)
|
|
41
|
+
event = JSON.load(transformed_event) || {} # transformed_event is JSON text String
|
|
42
|
+
|
|
43
|
+
fun = Jets::Poly.new(klass, guesser.method_name)
|
|
44
|
+
result = fun.run(event) # check the logs for polymorphic function errors
|
|
45
|
+
# Note: even though data might not always be json, the JSON.dump does a
|
|
46
|
+
# good job of not bombing, so always calling it to simplify code.
|
|
47
|
+
|
|
48
|
+
text = Jets::Util.normalize_result(result)
|
|
49
|
+
STDOUT.puts text
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def remote_run
|
|
53
|
+
puts "Calling lambda function #{function_name} on AWS" unless @options[:mute]
|
|
54
|
+
return if @options[:noop]
|
|
55
|
+
|
|
56
|
+
options = {
|
|
57
|
+
# client_context: client_context,
|
|
58
|
+
function_name: function_name,
|
|
59
|
+
invocation_type: @invocation_type, # "Event", # RequestResponse
|
|
60
|
+
log_type: @log_type, # pretty sweet
|
|
61
|
+
payload: transformed_event, # "fileb://file-path/input.json", <= JSON
|
|
62
|
+
qualifier: @qualifier, # "1",
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
begin
|
|
66
|
+
resp = lambda_client.invoke(options)
|
|
67
|
+
rescue Aws::Lambda::Errors::ResourceNotFoundException
|
|
68
|
+
puts "The function #{function_name} was not found. Maybe check the spelling or the AWS_PROFILE?".color(:red)
|
|
69
|
+
return
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
if @options[:show_logs] || @options[:show_log]
|
|
73
|
+
puts "Last 4KB of log in the x-amz-log-result header:".color(:green)
|
|
74
|
+
puts Base64.decode64(resp.log_result)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
add_console_link_to_clipboard
|
|
78
|
+
result = resp.payload.read # already been normalized/JSON.dump by AWS
|
|
79
|
+
unless @options[:mute_output]
|
|
80
|
+
STDOUT.puts result # only thing that goes to stdout
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def guesser
|
|
85
|
+
@guesser ||= Guesser.new(@provided_function_name)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def ensure_guesses_found!
|
|
89
|
+
unless guesser.class_name and guesser.method_name
|
|
90
|
+
puts guesser.error_message
|
|
91
|
+
exit
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# @event is String because it can be the file:// notation
|
|
96
|
+
# Returns text String for the lambda.invoke payload.
|
|
97
|
+
def transformed_event
|
|
98
|
+
text = @event
|
|
99
|
+
if text && text.include?("file://")
|
|
100
|
+
text = load_event_from_file(text)
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
check_valid_json!(text)
|
|
104
|
+
|
|
105
|
+
puts "Function name: #{function_name.color(:green)}" unless @options[:mute]
|
|
106
|
+
return text unless function_name.include?("_controller-")
|
|
107
|
+
return text if @options[:lambda_proxy] == false
|
|
108
|
+
|
|
109
|
+
event = JSON.load(text)
|
|
110
|
+
lambda_proxy = {"queryStringParameters" => event}
|
|
111
|
+
JSON.dump(lambda_proxy)
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def load_event_from_file(text)
|
|
115
|
+
path = text.gsub('file://','')
|
|
116
|
+
path = "#{Jets.root}/#{path}" unless path[0..0] == '/'
|
|
117
|
+
unless File.exist?(path)
|
|
118
|
+
puts "File #{path} does not exist. Are you sure the file exists?".color(:red)
|
|
119
|
+
exit
|
|
120
|
+
end
|
|
121
|
+
text = IO.read(path)
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
# Exits with friendly error message when user provides bad just
|
|
125
|
+
def check_valid_json!(text)
|
|
126
|
+
JSON.load(text)
|
|
127
|
+
rescue JSON::ParserError => e
|
|
128
|
+
puts "Invalid json provided:\n '#{text}'"
|
|
129
|
+
puts "Exiting... Please try again and provide valid json."
|
|
130
|
+
exit 1
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
# So use can quickly paste this into their browser if they want to see the function
|
|
134
|
+
# via the Lambda console
|
|
135
|
+
def add_console_link_to_clipboard
|
|
136
|
+
return unless RUBY_PLATFORM =~ /darwin/
|
|
137
|
+
return unless system("type pbcopy > /dev/null")
|
|
138
|
+
|
|
139
|
+
# TODO: for add_console_link_to_clipboard get the region from the ~/.aws/config and AWS_PROFILE setting
|
|
140
|
+
region = Aws::S3::Client.new.config.region || ENV["AWS_REGION"] ||'us-east-1'
|
|
141
|
+
link = "https://console.aws.amazon.com/lambda/home?region=#{region}#/functions/#{function_name}?tab=configuration"
|
|
142
|
+
system("echo #{link} | pbcopy")
|
|
143
|
+
puts "Pro tip: The Lambda Console Link to the #{function_name} function has been added to your clipboard." unless @options[:mute]
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
# TODO: Hook client_context up and make sure it works. Think I've figure out how to sign client_context below.
|
|
147
|
+
# Client context must be a valid Base64-encoded JSON object
|
|
148
|
+
# Example: http://docs.aws.amazon.com/mobileanalytics/latest/ug/PutEvents.html
|
|
149
|
+
def client_context
|
|
150
|
+
context = {
|
|
151
|
+
"client" => {
|
|
152
|
+
"client_id" => "Jets",
|
|
153
|
+
"app_title" => "jets call cli",
|
|
154
|
+
"app_version_name" => Jets::VERSION,
|
|
155
|
+
},
|
|
156
|
+
"custom" => {},
|
|
157
|
+
"env" =>{
|
|
158
|
+
"platform" => RUBY_PLATFORM,
|
|
159
|
+
"platform_version" => RUBY_VERSION,
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
Base64.encode64(JSON.dump(context))
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
# For this class redirect puts to stderr so user can pipe output to tools like
|
|
166
|
+
# jq. Example:
|
|
167
|
+
# jets call posts_controller-index '{"test":1}' | jq .
|
|
168
|
+
def puts(text)
|
|
169
|
+
$stderr.puts(text)
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
def lambda_client
|
|
173
|
+
opt = {}
|
|
174
|
+
opt = opt.merge({retry_limit: @options[:retry_limit]}) if @options[:retry_limit].present?
|
|
175
|
+
opt = opt.merge({http_read_timeout: @options[:read_timeout]}) if @options[:read_timeout].present?
|
|
176
|
+
|
|
177
|
+
if opt.empty?
|
|
178
|
+
aws_lambda
|
|
179
|
+
else
|
|
180
|
+
Aws::Lambda::Client.new(opt)
|
|
181
|
+
end
|
|
182
|
+
end
|
|
183
|
+
end
|
|
184
|
+
end
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
#
|
|
26
26
|
# Now we're at a point where we can start guessing
|
|
27
27
|
# function_name = detect_function_name(function_name)
|
|
28
|
-
|
|
28
|
+
module Jets::Commands::Call
|
|
29
29
|
class Guesser
|
|
30
30
|
delegate :class_name, :method_name, :error_message, :function_name,
|
|
31
31
|
to: :delegate_guesser
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module Jets::Command
|
|
2
|
+
class CleanCommand < Base # :nodoc:
|
|
3
|
+
desc "log", "Cleans CloudWatch log groups assocated with app"
|
|
4
|
+
long_desc Help.text("clean/log")
|
|
5
|
+
def log
|
|
6
|
+
Jets::Commands::Clean::Log.new(options).clean
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
desc "build", "Cleans jets build"
|
|
10
|
+
long_desc Help.text("clean/build")
|
|
11
|
+
def build
|
|
12
|
+
Jets::Commands::Clean::Build.new(options).clean
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
# log groups and we don't want to overly-aggressively delete them.
|
|
9
9
|
#
|
|
10
10
|
# The `keep_prefixes(log_group_names)` method calcuates the log groups to keep.
|
|
11
|
-
|
|
11
|
+
module Jets::Commands::Clean
|
|
12
12
|
class Log < Base
|
|
13
13
|
extend Memoist
|
|
14
14
|
include Jets::AwsServices
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
module Jets::Command
|
|
2
|
+
class ConfigureCommand < Base # :nodoc:
|
|
3
|
+
desc "configure [TOKEN]", "configure token and updates ~/.jets/config.yml"
|
|
4
|
+
long_desc Help.text(:configure)
|
|
5
|
+
def perform(token=nil)
|
|
6
|
+
Jets::Api::Config.instance.update_token(token)
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "irb"
|
|
4
|
+
require "irb/completion"
|
|
5
|
+
|
|
6
|
+
module Jets::Command
|
|
7
|
+
class ConsoleCommand < Base # :nodoc:
|
|
8
|
+
include EnvironmentArgument
|
|
9
|
+
|
|
10
|
+
desc "console", "REPL console with Jets environment loaded"
|
|
11
|
+
long_desc Help.text(:console)
|
|
12
|
+
def perform
|
|
13
|
+
extract_environment_option_from_argument
|
|
14
|
+
require_application_and_environment!
|
|
15
|
+
Console.new(options).run
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
class Console
|
|
20
|
+
attr_reader :environment
|
|
21
|
+
|
|
22
|
+
def initialize(environment)
|
|
23
|
+
@environment = environment
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def run
|
|
27
|
+
puts Jets::Booter.message
|
|
28
|
+
|
|
29
|
+
# Thanks: https://mutelight.org/bin-console
|
|
30
|
+
require "irb"
|
|
31
|
+
require "irb/completion"
|
|
32
|
+
|
|
33
|
+
ARGV.clear # https://stackoverflow.com/questions/33070092/irb-start-not-starting/33136762
|
|
34
|
+
IRB.start
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
end
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
## Storing Encrypted Credentials in Source Control
|
|
2
|
+
|
|
3
|
+
The Jets `credentials` commands provide access to encrypted credentials,
|
|
4
|
+
so you can safely store access tokens, database passwords, and the like
|
|
5
|
+
safely inside the app without relying on a mess of ENVs.
|
|
6
|
+
|
|
7
|
+
This also allows for atomic deploys: no need to coordinate key changes
|
|
8
|
+
to get everything working as the keys are shipped with the code.
|
|
9
|
+
|
|
10
|
+
## Setup
|
|
11
|
+
|
|
12
|
+
Applications after Jets 5 automatically have a basic credentials file generated
|
|
13
|
+
that just contains the secret_key_base used by MessageVerifiers/MessageEncryptors, like the ones
|
|
14
|
+
signing and encrypting cookies.
|
|
15
|
+
|
|
16
|
+
For applications created prior to Jets 5, we'll automatically generate a new
|
|
17
|
+
credentials file in `config/credentials.yml.enc` the first time you run `bin/jets credentials:edit`.
|
|
18
|
+
If you didn't have a master key saved in `config/master.key`, that'll be created too.
|
|
19
|
+
|
|
20
|
+
Don't lose this master key! Put it in a password manager your team can access.
|
|
21
|
+
Should you lose it no one, including you, will be able to access any encrypted
|
|
22
|
+
credentials.
|
|
23
|
+
|
|
24
|
+
Don't commit the key! Add `config/master.key` to your source control's
|
|
25
|
+
ignore file. If you use Git, Jets handles this for you.
|
|
26
|
+
|
|
27
|
+
Jets also looks for the master key in `ENV["JETS_MASTER_KEY"]`, if that's easier to manage.
|
|
28
|
+
|
|
29
|
+
You could prepend that to your server's start command like this:
|
|
30
|
+
|
|
31
|
+
JETS_MASTER_KEY="very-secret-and-secure" server.start
|
|
32
|
+
|
|
33
|
+
## Set up Git to Diff Credentials
|
|
34
|
+
|
|
35
|
+
Jets provides `bin/jets credentials:diff --enroll` to instruct Git to call
|
|
36
|
+
`bin/jets credentials:diff` when `git diff` is run on a credentials file.
|
|
37
|
+
|
|
38
|
+
Running the command enrolls the project such that all credentials files use the
|
|
39
|
+
"jets_credentials" diff driver in .gitattributes.
|
|
40
|
+
|
|
41
|
+
Additionally since Git requires the driver itself to be set up in a config file
|
|
42
|
+
that isn't tracked Jets automatically ensures it's configured when running
|
|
43
|
+
`credentials:edit`.
|
|
44
|
+
|
|
45
|
+
Otherwise each co-worker would have to run enable manually, including on each new
|
|
46
|
+
repo clone.
|
|
47
|
+
|
|
48
|
+
To disenroll from this feature, run `bin/jets credentials:diff --disenroll`.
|
|
49
|
+
|
|
50
|
+
## Editing Credentials
|
|
51
|
+
|
|
52
|
+
This will open a temporary file in `$EDITOR` with the decrypted contents to edit
|
|
53
|
+
the encrypted credentials.
|
|
54
|
+
|
|
55
|
+
When the temporary file is next saved the contents are encrypted and written to
|
|
56
|
+
`config/credentials.yml.enc` while the file itself is destroyed to prevent credentials
|
|
57
|
+
from leaking.
|
|
58
|
+
|
|
59
|
+
## Environment Specific Credentials
|
|
60
|
+
|
|
61
|
+
The `credentials` command supports passing an `--environment` option to create an
|
|
62
|
+
environment specific override. That override will take precedence over the
|
|
63
|
+
global `config/credentials.yml.enc` file when running in that environment. So:
|
|
64
|
+
|
|
65
|
+
bin/jets credentials:edit --environment development
|
|
66
|
+
|
|
67
|
+
will create `config/credentials/development.yml.enc` with the corresponding
|
|
68
|
+
encryption key in `config/credentials/development.key` if the credentials file
|
|
69
|
+
doesn't exist.
|
|
70
|
+
|
|
71
|
+
The encryption key can also be put in `ENV["JETS_MASTER_KEY"]`, which takes
|
|
72
|
+
precedence over the file encryption key.
|
|
73
|
+
|
|
74
|
+
In addition to that, the default credentials lookup paths can be overridden through
|
|
75
|
+
`config.credentials.content_path` and `config.credentials.key_path`.
|
|
76
|
+
|
|
77
|
+
## Editor wait
|
|
78
|
+
|
|
79
|
+
For editors that fork and exit immediately, it's important to pass a wait flag,
|
|
80
|
+
otherwise the credentials will be saved immediately with no chance to edit.
|
|
81
|
+
|
|
82
|
+
EDITOR="code --wait" jets credentials:edit
|
|
83
|
+
|
|
84
|
+
## Accessing in App
|
|
85
|
+
|
|
86
|
+
Let's say you have credentials like so:
|
|
87
|
+
|
|
88
|
+
❯ jets credentials:show
|
|
89
|
+
secret_key_base: somesecretvalue
|
|
90
|
+
foo: bar
|
|
91
|
+
|
|
92
|
+
You can access them in the app like so:
|
|
93
|
+
|
|
94
|
+
❯ jets console
|
|
95
|
+
> Jets.application.credentials.secret_key_base
|
|
96
|
+
=> "somesecretvalue"
|
|
97
|
+
> Jets.application.credentials.foo
|
|
98
|
+
=> "bar"
|
|
99
|
+
> Jets.application.credentials.does_not_exist
|
|
100
|
+
=> nil
|
|
101
|
+
|
|
102
|
+
Remember, when you deploy this to Lambda you should set the `JETS_MASTER_KEY`. You set it with [Env Files](https://rubyonjets.com/docs/env-files/). Otherwise the `Jets.application.credentials.xx` values will return `nil`.
|
|
103
|
+
|