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,29 @@
|
|
|
1
|
+
module Jets::Lambda
|
|
2
|
+
class Function < Functions
|
|
3
|
+
# Override and change the signature so we do not have to provide info at
|
|
4
|
+
# initialization. So:
|
|
5
|
+
#
|
|
6
|
+
# hello_function = HelloFunction.new
|
|
7
|
+
# hello_function.lambda_handler(event, context)
|
|
8
|
+
#
|
|
9
|
+
# Normally controller and job functions initialize like this:
|
|
10
|
+
#
|
|
11
|
+
# controller = PostController.new(event, context, "handler_handler")
|
|
12
|
+
def initialize
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def self.handler
|
|
16
|
+
handler_task.meth
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def self.handler_task
|
|
20
|
+
tasks.first
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Used by main_processor.rb. Same interface as controllers and jobs.
|
|
24
|
+
def self.process(event, context, meth)
|
|
25
|
+
function = new
|
|
26
|
+
function.send(handler, event, context)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# Builds an anonymous class that represents a single Lambda function from code
|
|
2
|
+
# in app/functions.
|
|
3
|
+
#
|
|
4
|
+
# The build method returns an anonymous class using Class.new that contains
|
|
5
|
+
# the methods defined in the app/functions/hello.rb code.
|
|
6
|
+
#
|
|
7
|
+
# Ruby Class.new docs:
|
|
8
|
+
#
|
|
9
|
+
# Creates a new anonymous (unnamed) class with the given superclass (or
|
|
10
|
+
# Object if no parameter is given). You can give a class a name by
|
|
11
|
+
# assigning the class object to a constant.
|
|
12
|
+
# http://ruby-doc.org/core-2.1.1/Class.html#method-c-new
|
|
13
|
+
#
|
|
14
|
+
# So assigning the result of build to a constant makes for a prettier
|
|
15
|
+
# class name. Example:
|
|
16
|
+
#
|
|
17
|
+
# constructor = FunctionConstructor.new(code_path)
|
|
18
|
+
# HelloFunction = constructor.build
|
|
19
|
+
#
|
|
20
|
+
# The class name will be HelloFunction instead of (anonymous). Then usage would
|
|
21
|
+
# be:
|
|
22
|
+
#
|
|
23
|
+
# hello_function = HelloFunction.new
|
|
24
|
+
# hello_function(hello_function.handler, event, context)
|
|
25
|
+
#
|
|
26
|
+
# Or call with the process class method:
|
|
27
|
+
#
|
|
28
|
+
# HelloFunction.process(event, context, "world")
|
|
29
|
+
module Jets::Lambda
|
|
30
|
+
class FunctionConstructor
|
|
31
|
+
def initialize(code_path)
|
|
32
|
+
@code_path = "#{Jets.root}/#{code_path}"
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def build
|
|
36
|
+
code = IO.read(@code_path)
|
|
37
|
+
function_klass = Class.new(Jets::Lambda::Function)
|
|
38
|
+
function_klass.module_eval(code)
|
|
39
|
+
adjust_tasks(function_klass)
|
|
40
|
+
function_klass # assign this to a Constant for a pretty class name
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# For anonymous classes method_added during task registration contains ""
|
|
44
|
+
# for the class name. We adjust it here.
|
|
45
|
+
def adjust_tasks(klass)
|
|
46
|
+
class_name = @code_path.to_s.sub(/.*\/functions\//,'').sub(/\.rb$/, '')
|
|
47
|
+
class_name = class_name.camelize
|
|
48
|
+
klass.tasks.each do |task|
|
|
49
|
+
task.class_name = class_name
|
|
50
|
+
task.type = "function"
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
require 'json'
|
|
2
|
+
|
|
3
|
+
# Jets::Lambda::Functions represents a collection of Lambda functions.
|
|
4
|
+
#
|
|
5
|
+
# Jets::Lambda::Functions is the superclass of:
|
|
6
|
+
# Jets::Controller::Base
|
|
7
|
+
# Jets::Job::Base
|
|
8
|
+
module Jets::Lambda
|
|
9
|
+
class Functions
|
|
10
|
+
attr_reader :event, :context, :meth
|
|
11
|
+
def initialize(event, context, meth)
|
|
12
|
+
@event = event # Hash, JSON.parse(event) ran BaseProcessor
|
|
13
|
+
@context = context # Hash. JSON.parse(context) ran in BaseProcessor
|
|
14
|
+
@meth = meth
|
|
15
|
+
# store meth because it is useful to for identifying the which template
|
|
16
|
+
# to use later.
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
include Dsl # At the end so methods like event, context and method
|
|
20
|
+
# do not trigger method_added
|
|
21
|
+
|
|
22
|
+
class << self
|
|
23
|
+
# Tracking subclasses because it helps with Lambda::Dsl#find_all_tasks
|
|
24
|
+
def subclasses
|
|
25
|
+
@subclasses ||= []
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def inherited(base)
|
|
29
|
+
super
|
|
30
|
+
self.subclasses << base if base.name
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
class Jets::Lambda::Task
|
|
2
|
+
attr_accessor :class_name, :type
|
|
3
|
+
attr_reader :meth, :properties, :iam_policy, :managed_iam_policy, :lang, :associated_resources
|
|
4
|
+
def initialize(class_name, meth, options={})
|
|
5
|
+
@class_name = class_name.to_s
|
|
6
|
+
@meth = meth
|
|
7
|
+
@options = options
|
|
8
|
+
@type = options[:type] || get_type # controller, job, or function
|
|
9
|
+
@properties = options[:properties] || {}
|
|
10
|
+
@iam_policy = options[:iam_policy]
|
|
11
|
+
@managed_iam_policy = options[:managed_iam_policy]
|
|
12
|
+
@lang = options[:lang] || :ruby
|
|
13
|
+
@associated_resources = options[:associated_resources] || {}
|
|
14
|
+
@replacements = options[:replacements] || {} # added to baseline replacements
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def name
|
|
18
|
+
@meth
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def public_meth?
|
|
22
|
+
# For anonymous classes (app/functions/hello.rb) the class name will be blank.
|
|
23
|
+
# These types of classes are treated specially and has only one handler method
|
|
24
|
+
# that is registered. So we know it is public.
|
|
25
|
+
return true if @class_name.nil? || @class_name == ''
|
|
26
|
+
|
|
27
|
+
# Consider all polymorphic methods public for now
|
|
28
|
+
return true if @lang != :ruby
|
|
29
|
+
|
|
30
|
+
klass = @class_name.constantize
|
|
31
|
+
public_methods = klass.public_instance_methods
|
|
32
|
+
public_methods.include?(meth.to_sym)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def build_function_iam?
|
|
36
|
+
!!(@iam_policy || @managed_iam_policy)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
@@lang_exts = {
|
|
40
|
+
ruby: '.rb',
|
|
41
|
+
python: '.py',
|
|
42
|
+
node: '.js',
|
|
43
|
+
}
|
|
44
|
+
def lang_ext
|
|
45
|
+
@@lang_exts[@lang]
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# The get_type method works for controller and job classes.
|
|
49
|
+
#
|
|
50
|
+
# Usually able to get the type from the class name. Examples:
|
|
51
|
+
#
|
|
52
|
+
# PostsController => controller
|
|
53
|
+
# HardJob => job
|
|
54
|
+
#
|
|
55
|
+
# However, for function types, we are not able to get the type for multiple of
|
|
56
|
+
# reasons. First, function types are allowed to be named with or without
|
|
57
|
+
# _function. Examples:
|
|
58
|
+
#
|
|
59
|
+
# path => class => type
|
|
60
|
+
# app/functions/hello.rb => Hello => function
|
|
61
|
+
# app/functions/hello_function.rb => HelloFunction => function
|
|
62
|
+
#
|
|
63
|
+
# The second reason is that functions are not regular ruby classes. Instead they
|
|
64
|
+
# are anonymous classes created with Class.new. When classes are created with
|
|
65
|
+
# Class.new the method_added hook has "" (blank string) as the self class name.
|
|
66
|
+
# We add the class_type to the task later on as we are constructing the class
|
|
67
|
+
# as part of the Class.new logic.
|
|
68
|
+
#
|
|
69
|
+
# For controller and job standard ruby classes though it can easily be
|
|
70
|
+
# determinated as part of initialization. So we get the type for convenience then.
|
|
71
|
+
#
|
|
72
|
+
# For anonymous function classes, we just set to nil and will later fix in
|
|
73
|
+
# FunctionConstructor.
|
|
74
|
+
#
|
|
75
|
+
# Returns: "controller", "job" or nil
|
|
76
|
+
def get_type
|
|
77
|
+
unless @class_name.empty? # when anonymous class is created with Class.new
|
|
78
|
+
@class_name.underscore.split('_').last # controller, job or rule
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def full_handler(handler_function)
|
|
83
|
+
"#{handler_base}.#{handler_function}"
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def handler_path
|
|
87
|
+
"#{handler_base}#{lang_ext}"
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def handler_base
|
|
91
|
+
base = "handlers/#{@type.pluralize}/#{@class_name.underscore}"
|
|
92
|
+
base += "/#{@lang}" if @lang != :ruby
|
|
93
|
+
base += "/#{@meth}"
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def poly_src_path
|
|
97
|
+
handler_path.sub("handlers/", "app/")
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def replacements
|
|
101
|
+
# Merge in the custom replacements specific to each app class: ConfigRule, Job, etc.
|
|
102
|
+
baseline_replacements.merge(@replacements)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def baseline_replacements
|
|
106
|
+
{
|
|
107
|
+
# camelized because used in not just keys but common used in values
|
|
108
|
+
namespace: @meth.to_s.camelize,
|
|
109
|
+
}
|
|
110
|
+
end
|
|
111
|
+
end
|
data/lib/jets/logger.rb
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
require 'logger'
|
|
2
|
+
|
|
3
|
+
module Jets
|
|
4
|
+
class Logger < ::Logger
|
|
5
|
+
# Only need to override the add method as the other calls all lead to it.
|
|
6
|
+
def add(severity, message = nil, progname = nil)
|
|
7
|
+
# Taken from Logger#add source
|
|
8
|
+
# https://ruby-doc.org/stdlib-2.5.1/libdoc/logger/rdoc/Logger.html#method-i-add
|
|
9
|
+
if message.nil?
|
|
10
|
+
if block_given?
|
|
11
|
+
message = yield
|
|
12
|
+
else
|
|
13
|
+
message = progname
|
|
14
|
+
progname = @progname
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
super # original logical
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Thanks https://mensfeld.pl/2012/01/converting-nested-hash-into-http-url-params-hash-version-in-ruby/
|
|
2
|
+
module Jets::Mega
|
|
3
|
+
module HashConverter
|
|
4
|
+
def self.encode(value, key = nil, out_hash = {})
|
|
5
|
+
case value
|
|
6
|
+
when Hash then
|
|
7
|
+
value.each { |k,v| encode(v, append_key(key,k), out_hash) }
|
|
8
|
+
out_hash
|
|
9
|
+
when Array then
|
|
10
|
+
value.each { |v| encode(v, "#{key}[]", out_hash) }
|
|
11
|
+
out_hash
|
|
12
|
+
when nil then ''
|
|
13
|
+
else
|
|
14
|
+
out_hash[key] = value
|
|
15
|
+
out_hash
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
private
|
|
20
|
+
|
|
21
|
+
def self.append_key(root_key, key)
|
|
22
|
+
root_key.nil? ? :"#{key}" : :"#{root_key}[#{key.to_s}]"
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
require 'net/http'
|
|
2
|
+
require 'rack'
|
|
3
|
+
|
|
4
|
+
module Jets::Mega
|
|
5
|
+
class Request
|
|
6
|
+
JETS_OUTPUT = "/tmp/jets-output.log"
|
|
7
|
+
|
|
8
|
+
extend Memoist
|
|
9
|
+
|
|
10
|
+
def initialize(event, controller)
|
|
11
|
+
@event = event
|
|
12
|
+
@controller = controller # Jets::Controller instance
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def proxy
|
|
16
|
+
http_method = @event['httpMethod'] # GET, POST, PUT, DELETE, etc
|
|
17
|
+
params = @controller.params(raw: true, path_parameters: false)
|
|
18
|
+
|
|
19
|
+
uri = get_uri
|
|
20
|
+
|
|
21
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
|
22
|
+
http.open_timeout = http.read_timeout = 60
|
|
23
|
+
|
|
24
|
+
# Rails sets _method=patch or _method=put as workaround
|
|
25
|
+
# Falls back to GET when testing in lambda console
|
|
26
|
+
http_class = params['_method'] || http_method || 'GET'
|
|
27
|
+
http_class.capitalize!
|
|
28
|
+
|
|
29
|
+
request_class = "Net::HTTP::#{http_class}".constantize # IE: Net::HTTP::Get
|
|
30
|
+
request = request_class.new(uri)
|
|
31
|
+
|
|
32
|
+
# Set form data
|
|
33
|
+
if %w[Post Patch Put].include?(http_class)
|
|
34
|
+
params = HashConverter.encode(params)
|
|
35
|
+
request.set_form_data(params)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Set body info
|
|
39
|
+
request.body = source.body
|
|
40
|
+
request.content_length = source.content_length
|
|
41
|
+
|
|
42
|
+
# Need to set headers after body and form_data for some reason
|
|
43
|
+
request = set_headers!(request)
|
|
44
|
+
|
|
45
|
+
# Make request
|
|
46
|
+
response = http.request(request)
|
|
47
|
+
|
|
48
|
+
puts_rack_output
|
|
49
|
+
|
|
50
|
+
status = response.code.to_i
|
|
51
|
+
headers = response.each_header.to_h
|
|
52
|
+
encoding = get_encoding(headers['content-type'])
|
|
53
|
+
body = response.body&.force_encoding(encoding)
|
|
54
|
+
{
|
|
55
|
+
status: status,
|
|
56
|
+
headers: headers,
|
|
57
|
+
body: body,
|
|
58
|
+
}
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def get_encoding(content_type)
|
|
62
|
+
default = Jets.config.encoding.default
|
|
63
|
+
return default unless content_type
|
|
64
|
+
|
|
65
|
+
md = content_type.match(/charset=(.+)/)
|
|
66
|
+
return default unless md
|
|
67
|
+
|
|
68
|
+
md[1]
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# Grab the rack output from the /tmp/jets-output.log and puts it back in the
|
|
72
|
+
# main process' stdout
|
|
73
|
+
def puts_rack_output
|
|
74
|
+
return unless File.exist?(JETS_OUTPUT)
|
|
75
|
+
puts IO.readlines(JETS_OUTPUT)
|
|
76
|
+
File.truncate(JETS_OUTPUT, 0)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def get_uri
|
|
80
|
+
url = "http://localhost:9292#{@controller.request.path}" # local rack server
|
|
81
|
+
unless @controller.query_parameters.empty?
|
|
82
|
+
# Thanks: https://stackoverflow.com/questions/798710/ruby-how-to-turn-a-hash-into-http-parameters
|
|
83
|
+
query_string = Rack::Utils.build_nested_query(@controller.query_parameters)
|
|
84
|
+
url += "?#{query_string}"
|
|
85
|
+
end
|
|
86
|
+
URI(url)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def source
|
|
90
|
+
Source.new(@event)
|
|
91
|
+
end
|
|
92
|
+
memoize :source
|
|
93
|
+
|
|
94
|
+
# Rails sets _method=patch or _method=put as workaround
|
|
95
|
+
# Falls back to GET when testing in lambda console
|
|
96
|
+
# @event['httpMethod'] is GET, POST, PUT, DELETE, etc
|
|
97
|
+
def http_class
|
|
98
|
+
http_class = params['_method'] || @event['httpMethod'] || 'GET'
|
|
99
|
+
http_class.capitalize!
|
|
100
|
+
http_class
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def params
|
|
104
|
+
@controller.params(raw: true, path_parameters: false, body_parameters: true)
|
|
105
|
+
end
|
|
106
|
+
memoize :params
|
|
107
|
+
|
|
108
|
+
# Set request headers. Forwards original request info from remote API gateway.
|
|
109
|
+
# By this time, the server/api_gateway.rb middleware.
|
|
110
|
+
def set_headers!(request)
|
|
111
|
+
headers = @event['headers'] # from api gateway
|
|
112
|
+
if headers # remote API Gateway
|
|
113
|
+
# Forward headers from API Gateway over to the sub http request.
|
|
114
|
+
# It's important to forward the headers. Here are some examples:
|
|
115
|
+
#
|
|
116
|
+
# "Turbolinks-Referrer"=>"http://localhost:8888/posts/122",
|
|
117
|
+
# "Referer"=>"http://localhost:8888/posts/122",
|
|
118
|
+
# "Accept-Encoding"=>"gzip, deflate",
|
|
119
|
+
# "Accept-Language"=>"en-US,en;q=0.9,pt;q=0.8",
|
|
120
|
+
# "Cookie"=>"_demo_session=...",
|
|
121
|
+
# "If-None-Match"=>"W/\"9fa479205fc6d24ca826d46f1f6cf461\"",
|
|
122
|
+
headers.each do |k,v|
|
|
123
|
+
request[k] = v
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
# Note by the time headers get to rack later in the they get changed to:
|
|
127
|
+
#
|
|
128
|
+
# request['X-Forwarded-Host'] vs env['HTTP_X_FORWARDED_HOST']
|
|
129
|
+
#
|
|
130
|
+
request['X-Forwarded-For'] = headers['X-Forwarded-For'] # "1.1.1.1, 2.2.2.2" # can be comma separated list
|
|
131
|
+
request['X-Forwarded-Host'] = headers['Host'] # uhghn8z6t1.execute-api.us-east-1.amazonaws.com
|
|
132
|
+
request['X-Forwarded-Port'] = headers['X-Forwarded-Port'] # 443
|
|
133
|
+
request['X-Forwarded-Proto'] = headers['X-Forwarded-Proto'] # https # scheme
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
request
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
class Jets::Mega::Request
|
|
2
|
+
class Source
|
|
3
|
+
def initialize(event)
|
|
4
|
+
@event = event
|
|
5
|
+
env = Jets::Controller::Rack::Env.new(@event, {}).convert # convert to Rack env
|
|
6
|
+
@source_request = Rack::Request.new(env)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def body
|
|
10
|
+
if @source_request.body.respond_to?(:read)
|
|
11
|
+
body = @source_request.body.read
|
|
12
|
+
@source_request.body.rewind
|
|
13
|
+
end
|
|
14
|
+
body
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def content_length
|
|
18
|
+
@source_request.content_length.to_i
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
module Jets
|
|
2
|
+
module Middleware
|
|
3
|
+
extend Memoist
|
|
4
|
+
|
|
5
|
+
def call(env)
|
|
6
|
+
stack = middlewares.build(endpoint)
|
|
7
|
+
stack.call(env)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
# Final middleware in the stack
|
|
11
|
+
def endpoint
|
|
12
|
+
Jets::Controller::Middleware::Main
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Called in Jets::Booter to build middleware stack only once during bootup
|
|
16
|
+
def build_stack
|
|
17
|
+
middlewares
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def middlewares
|
|
21
|
+
config_middleware.merge_into(default_stack) # returns Jets::Middleware::Stack
|
|
22
|
+
end
|
|
23
|
+
memoize :middlewares
|
|
24
|
+
|
|
25
|
+
def default_stack
|
|
26
|
+
Jets::Middleware::DefaultStack.new(Jets.config, Jets.application).build_stack # returns Jets::Middleware::Stack
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def config_middleware
|
|
30
|
+
Jets.config.middleware # returns Jets::Middleware::Configurator
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|