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,17 @@
|
|
|
1
|
+
class Jets::Controller
|
|
2
|
+
module Layout
|
|
3
|
+
extend ActiveSupport::Concern
|
|
4
|
+
included do
|
|
5
|
+
class_attribute :layout_name
|
|
6
|
+
|
|
7
|
+
def self.layout(name=nil)
|
|
8
|
+
if !name.nil?
|
|
9
|
+
name = name.to_s if name.is_a?(Symbol)
|
|
10
|
+
self.layout_name = name
|
|
11
|
+
else
|
|
12
|
+
self.layout_name
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end # included
|
|
16
|
+
end # Layout
|
|
17
|
+
end
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# The rack cors middleware handles all types of requests locally, this includes the OPTIONS request.
|
|
2
|
+
# Remotely on lambda, the rack cors middleware handles all requests except the OPTIONS request.
|
|
3
|
+
# The options request is handled by a OPTIONS API Gateway Method Mock. This is to allow it to bypass
|
|
4
|
+
# API Gateway authorizers.
|
|
5
|
+
module Jets::Controller::Middleware
|
|
6
|
+
class Cors
|
|
7
|
+
extend Memoist
|
|
8
|
+
|
|
9
|
+
def initialize(app)
|
|
10
|
+
@app = app
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def call(env)
|
|
14
|
+
if env['REQUEST_METHOD'] == 'OPTIONS'
|
|
15
|
+
return [200, cors_headers(true), StringIO.new]
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
status, headers, body = @app.call(env)
|
|
19
|
+
cors_headers.each do |k,v|
|
|
20
|
+
headers[k] ||= v
|
|
21
|
+
end
|
|
22
|
+
[status, headers, body]
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def cors_headers(preflight=false)
|
|
26
|
+
headers = case Jets.config.cors
|
|
27
|
+
when true
|
|
28
|
+
{
|
|
29
|
+
"access-control-allow-origin" => "*", # Required for CORS support to work
|
|
30
|
+
"access-control-allow-credentials" => "true" # Required for cookies, authorization headers with HTTPS
|
|
31
|
+
}
|
|
32
|
+
when String
|
|
33
|
+
{
|
|
34
|
+
"access-control-allow-origin" => Jets.config.cors, # contains Hash with Access-Control-Allow-* values
|
|
35
|
+
"access-control-allow-credentials" => "true" # Required for cookies, authorization headers with HTTPS
|
|
36
|
+
}
|
|
37
|
+
when Hash
|
|
38
|
+
Jets.config.cors # contains Hash with Access-Control-Allow-* values
|
|
39
|
+
else
|
|
40
|
+
{}
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
headers.merge!(preflight_headers) if preflight
|
|
44
|
+
headers
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
private
|
|
48
|
+
# Preflight OPTIONS request has extra headers.
|
|
49
|
+
# This is only used locally. Remotely on AWS Lambda, OPTIONS requests are handled by an API Gateway Method.
|
|
50
|
+
def preflight_headers
|
|
51
|
+
# FYI: Jets as part of the rack processing normalizes the casing of these headers eventually.
|
|
52
|
+
# IE: Access-Control-Allow-Methods
|
|
53
|
+
default = {
|
|
54
|
+
"access-control-allow-methods" => "DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT",
|
|
55
|
+
"access-control-allow-headers" => "Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent",
|
|
56
|
+
}
|
|
57
|
+
Jets.config.cors_preflight || default
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
require 'kramdown'
|
|
2
|
+
|
|
3
|
+
# Handles mimicking of API Gateway to Lambda function call locally
|
|
4
|
+
module Jets::Controller::Middleware
|
|
5
|
+
class Local
|
|
6
|
+
extend Memoist
|
|
7
|
+
|
|
8
|
+
def initialize(app)
|
|
9
|
+
@app = app
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def call(env)
|
|
13
|
+
route = RouteMatcher.new(env).find_route
|
|
14
|
+
unless route
|
|
15
|
+
return [404, {'Content-Type' => 'text/html'}, not_found(env)]
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
mimic = MimicAwsCall.new(route, env)
|
|
19
|
+
# Make @controller and @meth instance available so we dont not have to pass it around.
|
|
20
|
+
@controller, @meth, @event = mimic.controller, mimic.meth, mimic.event
|
|
21
|
+
|
|
22
|
+
if route.to == 'jets/rack#process' # megamode
|
|
23
|
+
# Bypass the Jets middlewares since it could interfere with the Rack
|
|
24
|
+
# application's middleware stack.
|
|
25
|
+
#
|
|
26
|
+
# Rails sends back a transfer-encoding=chunked. Curling Rails directly works,
|
|
27
|
+
# but passing the Rails response back through this middleware results in errors.
|
|
28
|
+
# Disable chunking responses by deleting the transfer-encoding response header.
|
|
29
|
+
# Would like to understand why this happens this better, if someone can explain please let me know.
|
|
30
|
+
status, headers, body = @controller.dispatch! # jets/rack_controller
|
|
31
|
+
headers.delete "transfer-encoding"
|
|
32
|
+
[status, headers, body]
|
|
33
|
+
elsif polymorphic_function?
|
|
34
|
+
# Will never hit when calling polymorphic function on AWS Lambda.
|
|
35
|
+
# This can only really get called with the local server.
|
|
36
|
+
run_polymophic_function
|
|
37
|
+
else # Normal Jets request
|
|
38
|
+
mimick_aws_lambda!(env, mimic.vars) unless on_aws?(env)
|
|
39
|
+
@app.call(env)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def polymorphic_function?
|
|
44
|
+
polymorphic_function.task.lang != :ruby
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def polymorphic_function
|
|
48
|
+
# Abusing PolyFun to run polymorphic code, should call LambdaExecutor directly
|
|
49
|
+
# after reworking LambdaExecutor so it has a better interface.
|
|
50
|
+
Jets::PolyFun.new(@controller.class, @meth)
|
|
51
|
+
end
|
|
52
|
+
memoize :polymorphic_function
|
|
53
|
+
|
|
54
|
+
def run_polymophic_function
|
|
55
|
+
resp = polymorphic_function.run(@event, @meth) # polymorphic code
|
|
56
|
+
status = resp['statusCode']
|
|
57
|
+
headers = resp['headers']
|
|
58
|
+
body = StringIO.new(resp['body'])
|
|
59
|
+
[status, headers, body] # triplet
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# Modifies env the in the same way real call from AWS lambda would modify env
|
|
63
|
+
def mimick_aws_lambda!(env, vars)
|
|
64
|
+
env.merge!(vars)
|
|
65
|
+
env
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def on_aws?(env)
|
|
69
|
+
return false if ENV['TEST'] # usually with test we're passing in full API Gateway fixtures with the HTTP_X_AMZN_TRACE_ID
|
|
70
|
+
on_cloud9 = !!(env['HTTP_HOST'] =~ /cloud9\..*\.amazonaws\.com/)
|
|
71
|
+
!!env['HTTP_X_AMZN_TRACE_ID'] && !on_cloud9
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def routes_error_message(env)
|
|
75
|
+
message = "<h2>404 Error: Route #{env['PATH_INFO'].sub('/','')} not found</h2>"
|
|
76
|
+
if Jets.env != "production"
|
|
77
|
+
message << "<p>Here are the routes defined in your application:</p>"
|
|
78
|
+
message << "#{routes_table}"
|
|
79
|
+
end
|
|
80
|
+
message
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def not_found(env)
|
|
84
|
+
message = routes_error_message(env)
|
|
85
|
+
body = <<~HTML
|
|
86
|
+
<!DOCTYPE html>
|
|
87
|
+
<html>
|
|
88
|
+
<head>
|
|
89
|
+
<meta charset="utf-8">
|
|
90
|
+
<title>Route not found</title>
|
|
91
|
+
</head>
|
|
92
|
+
<body>
|
|
93
|
+
#{message}
|
|
94
|
+
</body>
|
|
95
|
+
</html>
|
|
96
|
+
HTML
|
|
97
|
+
StringIO.new(body)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# Show pretty route table for user to help with debugging in non-production mode
|
|
101
|
+
def routes_table
|
|
102
|
+
routes = Jets::Router.routes
|
|
103
|
+
|
|
104
|
+
return "Your routes table is empty." if routes.empty?
|
|
105
|
+
|
|
106
|
+
text = "Verb | Path | Controller#action\n"
|
|
107
|
+
text << "--- | --- | ---\n"
|
|
108
|
+
routes.each do |route|
|
|
109
|
+
text << "#{route.method} | #{route.path} | #{route.to}\n"
|
|
110
|
+
end
|
|
111
|
+
html = Kramdown::Document.new(text).to_html
|
|
112
|
+
puts html
|
|
113
|
+
html
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# Takes a Rack env and converts to ApiGateway event
|
|
2
|
+
class Jets::Controller::Middleware::Local
|
|
3
|
+
class ApiGateway
|
|
4
|
+
extend Memoist
|
|
5
|
+
|
|
6
|
+
def initialize(route, env)
|
|
7
|
+
@route, @env = route, env
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def event
|
|
11
|
+
resource = @route.path(:api_gateway) # posts/{id}/edit
|
|
12
|
+
path = @env['PATH_INFO'].sub('/','') # remove beginning slash
|
|
13
|
+
{
|
|
14
|
+
"resource" => "/#{resource}", # "/posts/{id}/edit"
|
|
15
|
+
"path" => @env['PATH_INFO'], # /posts/tung/edit
|
|
16
|
+
"httpMethod" => @env['REQUEST_METHOD'], # GET
|
|
17
|
+
"headers" => request_headers,
|
|
18
|
+
"queryStringParameters" => query_string_parameters,
|
|
19
|
+
"pathParameters" => @route.extract_parameters(path),
|
|
20
|
+
"stageVariables" => nil,
|
|
21
|
+
"requestContext" => {},
|
|
22
|
+
"body" => get_body,
|
|
23
|
+
"isBase64Encoded" => false,
|
|
24
|
+
}
|
|
25
|
+
end
|
|
26
|
+
memoize :event
|
|
27
|
+
|
|
28
|
+
# Annoying. The headers part of the AWS Lambda proxy structure
|
|
29
|
+
# does not consisently use the same casing scheme for the header keys.
|
|
30
|
+
# Sometimes it looks like this:
|
|
31
|
+
# Accept-Encoding
|
|
32
|
+
# and sometimes it looks like this:
|
|
33
|
+
# cache-control
|
|
34
|
+
# Map for special cases when the casing doesn't match.
|
|
35
|
+
CASING_MAP = {
|
|
36
|
+
"Cache-Control" => "cache-control",
|
|
37
|
+
"Content-Type" => "content-type",
|
|
38
|
+
"Origin" => "origin",
|
|
39
|
+
"Upgrade-Insecure-Requests" => "upgrade-insecure-requests",
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
# Map rack env headers to Api Gateway event headers. Most rack env headers are
|
|
43
|
+
# prepended by HTTP_.
|
|
44
|
+
#
|
|
45
|
+
# Some API Gateway Lambda Proxy are also in the rack env headers. Example:
|
|
46
|
+
#
|
|
47
|
+
# "X-Amz-Cf-Id": "W8DF6J-lx1bkV00eCiBwIq5dldTSGGiG4BinJlxvN_4o8fCZtbsVjw==",
|
|
48
|
+
# "X-Amzn-Trace-Id": "Root=1-5a0dc1ac-58a7db712a57d6aa4186c2ac",
|
|
49
|
+
# "X-Forwarded-For": "88.88.88.88, 54.239.203.117",
|
|
50
|
+
# "X-Forwarded-Port": "443",
|
|
51
|
+
# "X-Forwarded-Proto": "https",
|
|
52
|
+
#
|
|
53
|
+
# For sample dump of the event headers, check out:
|
|
54
|
+
# spec/fixtures/samples/event-headers-form-post.json
|
|
55
|
+
#
|
|
56
|
+
# We generally do add those API Gateway Lambda specific headers because
|
|
57
|
+
# they would be fake anyway and by not adding them we can distinguish a
|
|
58
|
+
# local request from a remote request on API Gateway.
|
|
59
|
+
def request_headers
|
|
60
|
+
headers = @env.select { |k,v| k =~ /^HTTP_/ }.inject({}) do |h,(k,v)|
|
|
61
|
+
# map things like HTTP_USER_AGENT to "User-Agent"
|
|
62
|
+
key = k.sub('HTTP_','').split('_').map(&:capitalize).join('-')
|
|
63
|
+
h[key] = v
|
|
64
|
+
h
|
|
65
|
+
end
|
|
66
|
+
# Content type is not prepended with HTTP_
|
|
67
|
+
headers["Content-Type"] = @env["CONTENT_TYPE"] if @env["CONTENT_TYPE"]
|
|
68
|
+
|
|
69
|
+
# Adjust the casing so it matches the Lambda AWS Proxy structure
|
|
70
|
+
CASING_MAP.each do |nice_casing, bad_casing|
|
|
71
|
+
if headers.key?(nice_casing)
|
|
72
|
+
headers[bad_casing] = headers.delete(nice_casing)
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
headers
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def query_string_parameters
|
|
80
|
+
Rack::Utils.parse_nested_query(@env['QUERY_STRING'])
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# To get the post body:
|
|
84
|
+
# rack.input: #<StringIO:0x007f8ccf8db9a0>
|
|
85
|
+
def get_body
|
|
86
|
+
input = @env["rack.input"] || StringIO.new
|
|
87
|
+
body = input.read
|
|
88
|
+
input.rewind # IMPORTANT or else it screws up other middlewares that use the body
|
|
89
|
+
# return nil for blank string, because Lambda AWS_PROXY does this
|
|
90
|
+
body unless body.empty?
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
class Jets::Controller::Middleware::Local
|
|
2
|
+
class MimicAwsCall
|
|
3
|
+
extend Memoist
|
|
4
|
+
|
|
5
|
+
def initialize(route, env)
|
|
6
|
+
@route, @env = route, env
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def vars
|
|
10
|
+
{
|
|
11
|
+
'jets.controller' => controller,
|
|
12
|
+
'lambda.context' => context,
|
|
13
|
+
'lambda.event' => event,
|
|
14
|
+
'lambda.meth' => meth,
|
|
15
|
+
}
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Actual controller instance
|
|
19
|
+
def controller
|
|
20
|
+
controller_class = @route.controller_name.constantize
|
|
21
|
+
meth = @route.action_name
|
|
22
|
+
controller_class.new(event, context, meth)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def meth
|
|
26
|
+
@route.action_name
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def event
|
|
30
|
+
@env['adapter.event'] || ApiGateway.new(@route, @env).event
|
|
31
|
+
end
|
|
32
|
+
memoize :event
|
|
33
|
+
|
|
34
|
+
def context
|
|
35
|
+
@env['adapter.context'] || {"fake" => "context in mimic_aws_call.rb"}
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
class Jets::Controller::Middleware::Local
|
|
2
|
+
class RouteMatcher
|
|
3
|
+
def initialize(env)
|
|
4
|
+
@env = env
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def find_route
|
|
8
|
+
reset_routes!
|
|
9
|
+
# Precedence:
|
|
10
|
+
# 1. Routes with no captures get highest precedence: posts/new
|
|
11
|
+
# 2. Then we consider the routes with captures: post/:id
|
|
12
|
+
#
|
|
13
|
+
# Within these 2 groups we consider the routes with the longest path first
|
|
14
|
+
# since posts/:id and posts/:id/edit can both match.
|
|
15
|
+
routes = router.ordered_routes
|
|
16
|
+
route = routes.find do |r|
|
|
17
|
+
route_found?(r)
|
|
18
|
+
end
|
|
19
|
+
route
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# "hot reload" for development
|
|
23
|
+
def reset_routes!
|
|
24
|
+
return unless Jets.env.development?
|
|
25
|
+
|
|
26
|
+
Jets::Router.clear!
|
|
27
|
+
Jets.application.load_routes(refresh: true)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def route_found?(route)
|
|
31
|
+
request_method = @env["REQUEST_METHOD"] || "GET"
|
|
32
|
+
actual_path = @env["PATH_INFO"].sub(/^\//,'') # remove beginning slash
|
|
33
|
+
|
|
34
|
+
# Immediately stop checking when the request method: GET, POST, ANY, etc
|
|
35
|
+
# doesnt match.
|
|
36
|
+
return false if request_method != route.method and route.method != "ANY"
|
|
37
|
+
|
|
38
|
+
path = route.path
|
|
39
|
+
|
|
40
|
+
if actual_path == path
|
|
41
|
+
# regular string match detection
|
|
42
|
+
return true # exact route matches are highest precedence
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Check path for route capture and wildcard matches:
|
|
46
|
+
# A colon (:) means the variable has a variable
|
|
47
|
+
if path.include?(':') # 2nd highest precedence
|
|
48
|
+
capture_detection(path, actual_path) # early return true or false
|
|
49
|
+
# A star (*) means the variable has a glob
|
|
50
|
+
elsif path.include?('*') # lowest precedence
|
|
51
|
+
proxy_detection(path, actual_path) # early return true or false
|
|
52
|
+
else
|
|
53
|
+
false # reach here, means no route matched
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# catchall/globbing/wildcard/proxy routes. Examples:
|
|
58
|
+
#
|
|
59
|
+
# get "files/*path", to: "files#show"
|
|
60
|
+
# get "others/*rest", to: "others#show"
|
|
61
|
+
# get "*catchall", to: "public_files#show" # last catchall route for Jets
|
|
62
|
+
#
|
|
63
|
+
def proxy_detection(route_path, actual_path)
|
|
64
|
+
# drop the proxy_segment
|
|
65
|
+
leading_path = route_path.split('/')[0..-2].join('/')
|
|
66
|
+
|
|
67
|
+
# get "*catchall", to: "public_files#show"
|
|
68
|
+
if leading_path.empty? # This is the last catchall route "*catchall"
|
|
69
|
+
return true # always return true here because the entire path
|
|
70
|
+
# will always match
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# Other types of wildcard route:
|
|
74
|
+
#
|
|
75
|
+
# get "files/*path", to: "files#show"
|
|
76
|
+
# get "others/*rest", to: "others#show"
|
|
77
|
+
unless leading_path.ends_with?('/')
|
|
78
|
+
# Ensure trailing slash to make pattern matching stricter
|
|
79
|
+
leading_path = "#{leading_path}/"
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
pattern = "^#{leading_path}"
|
|
83
|
+
regexp = Regexp.new(pattern)
|
|
84
|
+
!!regexp.match(actual_path) # could be true or false
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def capture_detection(route_path, actual_path)
|
|
88
|
+
# changes path to a string used for a regexp
|
|
89
|
+
# posts/:id/edit => posts\/(.*)\/edit
|
|
90
|
+
|
|
91
|
+
regexp_string = route_path.split('/').map do |s|
|
|
92
|
+
s.include?(':') ? Jets::Route::CAPTURE_REGEX : s
|
|
93
|
+
end.join('\/')
|
|
94
|
+
# make sure beginning and end of the string matches
|
|
95
|
+
regexp_string = "^#{regexp_string}$"
|
|
96
|
+
|
|
97
|
+
regexp = Regexp.new(regexp_string)
|
|
98
|
+
!!regexp.match(actual_path) # could be true or false
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def router
|
|
102
|
+
return @router if @router
|
|
103
|
+
@router = Jets.application.routes
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# All roads lead here
|
|
2
|
+
#
|
|
3
|
+
# 1. AWS Lambda: PostsController - Rack::Adapter - Jets.application.call
|
|
4
|
+
# 2. Local server: config.ru - run Jet.application - Jets.application.call
|
|
5
|
+
#
|
|
6
|
+
# Then eventually:
|
|
7
|
+
#
|
|
8
|
+
# Jets.application.call - Middleware stack - Jets::Controller::Middleware::Main
|
|
9
|
+
#
|
|
10
|
+
module Jets::Controller::Middleware
|
|
11
|
+
class Main
|
|
12
|
+
def initialize(env)
|
|
13
|
+
@env = env
|
|
14
|
+
@controller = env['jets.controller']
|
|
15
|
+
@event = env['lambda.event']
|
|
16
|
+
@context = env['lambda.context']
|
|
17
|
+
@meth = env['lambda.meth']
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def call
|
|
21
|
+
dup.call!
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def call!
|
|
25
|
+
setup
|
|
26
|
+
@controller.dispatch! # Returns triplet
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Common setup logical at this point of middleware processing right before
|
|
30
|
+
# calling any controller actions.
|
|
31
|
+
def setup
|
|
32
|
+
# We already recreated a mimicke rack env earlier as part of the very first
|
|
33
|
+
# middleware layer. However, by the time the rack env reaches the main middleware
|
|
34
|
+
# it could had been updated by other middlewares. We update the env here again.
|
|
35
|
+
@controller.request.set_env!(@env)
|
|
36
|
+
# This allows sesison helpers to work. Sessions are managed by
|
|
37
|
+
# the Rack::Session::Cookie middleware by default.
|
|
38
|
+
@controller.session = @env['rack.session'] || {}
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def self.call(env)
|
|
42
|
+
instance = new(env)
|
|
43
|
+
instance.call
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|