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,87 @@
|
|
|
1
|
+
require "action_controller/metal/strong_parameters"
|
|
2
|
+
require "action_dispatch"
|
|
3
|
+
require "rack"
|
|
4
|
+
|
|
5
|
+
class Jets::Controller
|
|
6
|
+
module Params
|
|
7
|
+
extend Memoist
|
|
8
|
+
|
|
9
|
+
# Merge all the parameters together for convenience. Users still have
|
|
10
|
+
# access via events.
|
|
11
|
+
#
|
|
12
|
+
# Precedence:
|
|
13
|
+
# 1. path parameters have highest precdence
|
|
14
|
+
# 2. query string parameters
|
|
15
|
+
# 3. body parameters
|
|
16
|
+
def params(raw: false, path_parameters: true, body_parameters: true)
|
|
17
|
+
path_params = event["pathParameters"] || {}
|
|
18
|
+
|
|
19
|
+
params = {}
|
|
20
|
+
params = params.deep_merge(body_params) if body_parameters
|
|
21
|
+
params = params.deep_merge(query_parameters) # always
|
|
22
|
+
params = params.deep_merge(path_params) if path_parameters
|
|
23
|
+
|
|
24
|
+
if raw
|
|
25
|
+
params
|
|
26
|
+
else
|
|
27
|
+
params = ActionDispatch::Request::Utils.normalize_encode_params(params) # for file uploads
|
|
28
|
+
ActionController::Parameters.new(params)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def query_parameters
|
|
33
|
+
event["queryStringParameters"] || {}
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def body_params
|
|
37
|
+
body = event['isBase64Encoded'] ? base64_decode(event["body"]) : event["body"]
|
|
38
|
+
return {} if body.nil?
|
|
39
|
+
|
|
40
|
+
parsed_json = parse_json(body)
|
|
41
|
+
return parsed_json if parsed_json
|
|
42
|
+
|
|
43
|
+
headers = event["headers"] || {}
|
|
44
|
+
# API Gateway seems to use either: content-type or Content-Type
|
|
45
|
+
headers = headers.transform_keys { |key| key.downcase }
|
|
46
|
+
content_type = headers["content-type"]
|
|
47
|
+
|
|
48
|
+
if content_type.to_s.include?("application/x-www-form-urlencoded")
|
|
49
|
+
return ::Rack::Utils.parse_nested_query(body)
|
|
50
|
+
elsif content_type.to_s.include?("multipart/form-data")
|
|
51
|
+
return parse_multipart(body)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
{} # fallback to empty Hash
|
|
55
|
+
end
|
|
56
|
+
memoize :body_params
|
|
57
|
+
|
|
58
|
+
private
|
|
59
|
+
|
|
60
|
+
def parse_multipart(body)
|
|
61
|
+
boundary = ::Rack::Multipart::Parser.parse_boundary(headers["content-type"])
|
|
62
|
+
options = multipart_options(body, boundary)
|
|
63
|
+
env = ::Rack::MockRequest.env_for("/", options)
|
|
64
|
+
::Rack::Multipart.parse_multipart(env) # params Hash
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def multipart_options(data, boundary = "AaB03x")
|
|
68
|
+
type = %(multipart/form-data; boundary=#{boundary})
|
|
69
|
+
length = data.bytesize
|
|
70
|
+
|
|
71
|
+
{ "CONTENT_TYPE" => type,
|
|
72
|
+
"CONTENT_LENGTH" => length.to_s,
|
|
73
|
+
:input => StringIO.new(data) }
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def parse_json(text)
|
|
77
|
+
JSON.parse(text)
|
|
78
|
+
rescue JSON::ParserError
|
|
79
|
+
nil
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def base64_decode(body)
|
|
83
|
+
return nil if body.nil?
|
|
84
|
+
Base64.decode64(body)
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
require 'base64'
|
|
2
|
+
|
|
3
|
+
module Jets::Controller::Rack
|
|
4
|
+
class Adapter
|
|
5
|
+
extend Memoist
|
|
6
|
+
|
|
7
|
+
# Returns back API Gateway response hash structure
|
|
8
|
+
def self.process(event, context, meth)
|
|
9
|
+
adapter = new(event, context, meth)
|
|
10
|
+
adapter.process
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def initialize(event, context, meth)
|
|
14
|
+
@event, @context, @meth = event, context, meth
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# 1. Convert API Gateway event event to Rack env
|
|
18
|
+
# 2. Process using full Rack middleware stack
|
|
19
|
+
# 3. Convert back to API gateway response structure payload
|
|
20
|
+
def process
|
|
21
|
+
status, headers, body = Jets.application.call(env)
|
|
22
|
+
convert_to_api_gateway(status, headers, body)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def env
|
|
26
|
+
Env.new(@event, @context, adapter: true).convert # convert to Rack env
|
|
27
|
+
end
|
|
28
|
+
memoize :env
|
|
29
|
+
|
|
30
|
+
# Transform the structure to AWS_PROXY compatible structure
|
|
31
|
+
# http://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-output-format
|
|
32
|
+
def convert_to_api_gateway(status, headers, body)
|
|
33
|
+
base64 = headers["x-jets-base64"] == 'yes'
|
|
34
|
+
body = body.respond_to?(:read) ? body.read : body
|
|
35
|
+
body = Base64.encode64(body) if base64
|
|
36
|
+
|
|
37
|
+
resp = {
|
|
38
|
+
"statusCode" => status,
|
|
39
|
+
"headers" => headers,
|
|
40
|
+
"body" => body,
|
|
41
|
+
"isBase64Encoded" => base64,
|
|
42
|
+
}
|
|
43
|
+
adjust_for_elb(resp)
|
|
44
|
+
resp
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Note: ELB is not officially support. This is just in case users wish to manually
|
|
48
|
+
# connect ELBs to the functions created by Jets.
|
|
49
|
+
def adjust_for_elb(resp)
|
|
50
|
+
return resp unless from_elb?
|
|
51
|
+
|
|
52
|
+
# ELB requires statusCode to be an Integer whereas API Gateway requires statusCode to be a String
|
|
53
|
+
status = resp["statusCode"] = resp["statusCode"].to_i
|
|
54
|
+
|
|
55
|
+
# ELB also requires statusDescription attribute
|
|
56
|
+
status_desc = Rack::Utils::HTTP_STATUS_CODES[status]
|
|
57
|
+
status_desc = status_desc.nil? ? status.to_s : "#{status} #{status_desc}"
|
|
58
|
+
resp["statusDescription"] = status_desc
|
|
59
|
+
|
|
60
|
+
resp
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def from_elb?
|
|
64
|
+
# NOTE: @event["requestContext"]["elb"] is set when the request is coming from an elb
|
|
65
|
+
# Can set JETS_ELB=1 for local testing
|
|
66
|
+
@event["requestContext"] && @event["requestContext"]["elb"] || ENV['JETS_ELB']
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Called from Jets::Controller::Base.process. Example:
|
|
70
|
+
#
|
|
71
|
+
# adapter.rack_vars(
|
|
72
|
+
# 'jets.controller' => self,
|
|
73
|
+
# 'lambda.context' => context,
|
|
74
|
+
# 'lambda.event' => event,
|
|
75
|
+
# 'lambda.meth' => meth,
|
|
76
|
+
# )
|
|
77
|
+
#
|
|
78
|
+
# Passes a these special variables so we have access to them in the middleware.
|
|
79
|
+
# The controller instance is called in the Main middleware.
|
|
80
|
+
# The lambda.* info is used by the Rack::Local middleware to create a mimicked
|
|
81
|
+
# controller for the local server.
|
|
82
|
+
#
|
|
83
|
+
def rack_vars(vars)
|
|
84
|
+
env.merge!(vars)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
end
|
|
88
|
+
end
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
require 'rack'
|
|
2
|
+
require 'base64'
|
|
3
|
+
|
|
4
|
+
# Takes an ApiGateway event and converts it to an Rack env that can be used for
|
|
5
|
+
# rack.call(env).
|
|
6
|
+
module Jets::Controller::Rack
|
|
7
|
+
class Env
|
|
8
|
+
def initialize(event, context, options={})
|
|
9
|
+
@event, @context, @options = event, context, options
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def convert
|
|
13
|
+
options = {}
|
|
14
|
+
options = add_top_level(options)
|
|
15
|
+
options = add_http_headers(options)
|
|
16
|
+
path = @event['path'] || '/' # always set by API Gateway but might not be when testing shim, so setting it to make testing easier
|
|
17
|
+
env = Rack::MockRequest.env_for(path, options)
|
|
18
|
+
if @options[:adapter]
|
|
19
|
+
env['adapter.event'] = @event
|
|
20
|
+
env['adapter.context'] = @context
|
|
21
|
+
end
|
|
22
|
+
env
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
private
|
|
26
|
+
def add_top_level(options)
|
|
27
|
+
map = {
|
|
28
|
+
'CONTENT_TYPE' => content_type,
|
|
29
|
+
'QUERY_STRING' => query_string,
|
|
30
|
+
'REMOTE_ADDR' => headers['X-Forwarded-For'],
|
|
31
|
+
'REMOTE_HOST' => headers['Host'],
|
|
32
|
+
'REQUEST_METHOD' => @event['httpMethod'],
|
|
33
|
+
'REQUEST_PATH' => @event['path'],
|
|
34
|
+
'REQUEST_URI' => request_uri,
|
|
35
|
+
'SCRIPT_NAME' => "",
|
|
36
|
+
'SERVER_NAME' => headers['Host'],
|
|
37
|
+
'SERVER_PORT' => headers['X-Forwarded-Port'],
|
|
38
|
+
'SERVER_PROTOCOL' => "HTTP/1.1", # unsure if this should be set
|
|
39
|
+
'SERVER_SOFTWARE' => "WEBrick/1.3.1 (Ruby/2.2.2/2015-04-13)",
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
map['CONTENT_LENGTH'] = content_length if content_length
|
|
43
|
+
# Even if not set, Rack always assigns an StringIO to "rack.input"
|
|
44
|
+
map['rack.input'] = StringIO.new(body) if body
|
|
45
|
+
|
|
46
|
+
options.merge(map)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def content_type
|
|
50
|
+
headers['Content-Type'] || Jets::Controller::DEFAULT_CONTENT_TYPE
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def content_length
|
|
54
|
+
bytesize = body.bytesize.to_s if body
|
|
55
|
+
headers['Content-Length'] || bytesize
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Decoding base64 from API Gateaway if necessary
|
|
59
|
+
# Rack will be none the wiser
|
|
60
|
+
def body
|
|
61
|
+
if @event['isBase64Encoded']
|
|
62
|
+
Base64.decode64(@event['body'])
|
|
63
|
+
else
|
|
64
|
+
@event['body']
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def add_http_headers(options)
|
|
69
|
+
headers.each do |k,v|
|
|
70
|
+
# content-type => HTTP_CONTENT_TYPE
|
|
71
|
+
key = k.gsub('-','_').upcase
|
|
72
|
+
key = "HTTP_#{key}"
|
|
73
|
+
options[key] = v
|
|
74
|
+
end
|
|
75
|
+
options
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def request_uri
|
|
79
|
+
# IE: "http://localhost:8888/posts/tung/edit?foo=bar"
|
|
80
|
+
proto = headers['X-Forwarded-Proto']
|
|
81
|
+
host = headers['Host']
|
|
82
|
+
port = headers['X-Forwarded-Port']
|
|
83
|
+
|
|
84
|
+
# Add port if needed
|
|
85
|
+
if proto == 'https' && port != '443' or
|
|
86
|
+
proto == 'http' && port != '80'
|
|
87
|
+
host = "#{host}:#{port}"
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
path = @event['path']
|
|
91
|
+
qs = "?#{query_string}" unless query_string.empty?
|
|
92
|
+
"#{proto}://#{host}#{path}#{qs}"
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def query_string
|
|
96
|
+
qs_params = @event["queryStringParameters"] || {} # always set with API Gateway but when testing node shim might not be
|
|
97
|
+
hash = Jets::Mega::HashConverter.encode(qs_params)
|
|
98
|
+
hash.to_query
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def headers
|
|
102
|
+
@event['headers'] || {}
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
class Jets::Controller
|
|
2
|
+
module Redirection
|
|
3
|
+
# redirect_to "/posts", :status => 301
|
|
4
|
+
# redirect_to :action=>'atom', :status => 302
|
|
5
|
+
def redirect_to(url, options={})
|
|
6
|
+
unless url.is_a?(String)
|
|
7
|
+
raise "redirect_to url parameter must be a String. Please pass in a string"
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
uri = URI.parse(url)
|
|
11
|
+
# if no location.host, we been provided a relative host
|
|
12
|
+
if !uri.host && actual_host
|
|
13
|
+
url = "/#{url}" unless url.starts_with?('/')
|
|
14
|
+
url = add_stage_name(url)
|
|
15
|
+
redirect_url = actual_host + url
|
|
16
|
+
else
|
|
17
|
+
redirect_url = url
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
redirect_url = ensure_protocol(redirect_url)
|
|
21
|
+
|
|
22
|
+
aws_proxy = Rendering::RackRenderer.new(self,
|
|
23
|
+
status: options[:status] || 302,
|
|
24
|
+
headers: { "Location" => redirect_url },
|
|
25
|
+
body: "",
|
|
26
|
+
isBase64Encoded: false,
|
|
27
|
+
)
|
|
28
|
+
resp = aws_proxy.render
|
|
29
|
+
# redirect is a type of rendering
|
|
30
|
+
@rendered = true
|
|
31
|
+
@rendered_data = resp
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def ensure_protocol(url)
|
|
35
|
+
return url if url.starts_with?('http')
|
|
36
|
+
|
|
37
|
+
# annoying but the request payload is different with localhost/rack vs
|
|
38
|
+
# api gateway
|
|
39
|
+
# check out:
|
|
40
|
+
# spec/fixtures/dumps/api_gateway/posts/create.json
|
|
41
|
+
# spec/fixtures/dumps/rack/posts/create.json
|
|
42
|
+
protocol = if headers["x-forwarded-proto"] # API Gateway
|
|
43
|
+
headers["x-forwarded-proto"]
|
|
44
|
+
elsif headers["origin"] # Rack / localhost
|
|
45
|
+
URI.parse(headers["origin"]).scheme
|
|
46
|
+
else
|
|
47
|
+
"http" # fallback. Capybara / Selenium tests
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
raise "Invalid protocol #{protocol}" unless protocol.starts_with?('http')
|
|
51
|
+
|
|
52
|
+
"#{protocol}://#{url}"
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
class Jets::Controller
|
|
2
|
+
module Rendering
|
|
3
|
+
include Redirection
|
|
4
|
+
|
|
5
|
+
def ensure_render
|
|
6
|
+
return @rendered_data if @rendered
|
|
7
|
+
|
|
8
|
+
# defaults to rendering templates
|
|
9
|
+
RackRenderer.new(self, managed_options).render
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# Many different ways to render:
|
|
13
|
+
#
|
|
14
|
+
# render "articles/index", layout: "application"
|
|
15
|
+
# render :new
|
|
16
|
+
# render template: "articles/index", layout: "application"
|
|
17
|
+
# render json: {my: "data"}
|
|
18
|
+
# render text: "plain text"
|
|
19
|
+
def render(options={}, rest={})
|
|
20
|
+
raise "DoubleRenderError" if @rendered
|
|
21
|
+
|
|
22
|
+
if options.is_a?(Symbol) or options.is_a?(String)
|
|
23
|
+
options = normalize_options(options, rest)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
options.reverse_merge!(managed_options)
|
|
27
|
+
adjust_content_type!(options)
|
|
28
|
+
|
|
29
|
+
@rendered_data = RackRenderer.new(self, options).render
|
|
30
|
+
|
|
31
|
+
@rendered = true
|
|
32
|
+
@rendered_data
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def adjust_content_type!(options)
|
|
36
|
+
if options.key?(:json)
|
|
37
|
+
options[:content_type] = "application/json"
|
|
38
|
+
elsif options.key?(:xml)
|
|
39
|
+
options[:content_type] = "application/xml"
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def managed_options
|
|
44
|
+
layout = self.class.layout.nil? ? default_layout : self.class.layout
|
|
45
|
+
options = { layout: layout }
|
|
46
|
+
options[:headers] = response.headers unless response.headers.empty?
|
|
47
|
+
options
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def default_layout
|
|
51
|
+
application_layout_exist = !Dir.glob("#{Jets.root}/app/views/layouts/application*").empty?
|
|
52
|
+
"application" if application_layout_exist
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Can normalize the options when it is a String or a Symbol
|
|
56
|
+
# Also set defaults here like the layout.
|
|
57
|
+
# Ensure options is a Hash, not a String or Symbol.
|
|
58
|
+
def normalize_options(options, rest)
|
|
59
|
+
template = options.to_s
|
|
60
|
+
rest.merge(template: template)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# Add API Gateway Stage Name
|
|
64
|
+
def add_stage_name(url)
|
|
65
|
+
return url unless actual_host
|
|
66
|
+
|
|
67
|
+
Jets::Controller::Stage.add(actual_host, url)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def url_for(url)
|
|
71
|
+
add_stage_name(url)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def actual_host
|
|
75
|
+
headers["host"]
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
end
|
|
79
|
+
end
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
require "rack/utils"
|
|
2
|
+
|
|
3
|
+
# Special renderer. All the other renderers lead here
|
|
4
|
+
module Jets::Controller::Rendering
|
|
5
|
+
class RackRenderer
|
|
6
|
+
delegate :request, :event, :headers, to: :controller
|
|
7
|
+
attr_reader :controller
|
|
8
|
+
def initialize(controller, options={})
|
|
9
|
+
@controller = controller
|
|
10
|
+
@options = options
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# Example response:
|
|
14
|
+
#
|
|
15
|
+
# [200, {"my-header" = > "value" }, "my body" ]
|
|
16
|
+
#
|
|
17
|
+
# Returns rack triplet
|
|
18
|
+
def render
|
|
19
|
+
# we do some normalization here
|
|
20
|
+
status = normalize_status_code(@options[:status])
|
|
21
|
+
|
|
22
|
+
base64 = normalized_base64_option(@options)
|
|
23
|
+
|
|
24
|
+
headers = @options[:headers] || {}
|
|
25
|
+
set_content_type!(status, headers)
|
|
26
|
+
# x-jets-base64 to convert this Rack triplet to a API Gateway hash structure later
|
|
27
|
+
headers["x-jets-base64"] = base64 ? 'yes' : 'no' # headers values must be Strings
|
|
28
|
+
|
|
29
|
+
# Rails rendering does heavy lifting
|
|
30
|
+
if drop_content_info?(status)
|
|
31
|
+
body = StringIO.new
|
|
32
|
+
else
|
|
33
|
+
|
|
34
|
+
renderer = ActionController::Base.renderer.new(renderer_options)
|
|
35
|
+
body = renderer.render(render_options)
|
|
36
|
+
body = StringIO.new(body)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
[status, headers, body] # triplet
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Example: posts/index
|
|
43
|
+
def default_template_name
|
|
44
|
+
"#{template_namespace}/#{@controller.meth}"
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# PostsController => "posts" is the namespace
|
|
48
|
+
def template_namespace
|
|
49
|
+
@controller.class.to_s.sub('Controller','').underscore.pluralize
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# default options:
|
|
53
|
+
# https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/renderer.rb#L41-L47
|
|
54
|
+
def renderer_options
|
|
55
|
+
options = {
|
|
56
|
+
# script_name: "", # unfortunately doesnt seem to effect relative_url_root like desired
|
|
57
|
+
# input: ""
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
origin = headers["origin"]
|
|
61
|
+
if origin
|
|
62
|
+
uri = URI.parse(origin)
|
|
63
|
+
options[:https] = uri.scheme == "https"
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Important to not use rack_headers as local variable instead of headers.
|
|
67
|
+
# headers is a method that gets deleted to controller.headers and using it
|
|
68
|
+
# seems to cause issues.
|
|
69
|
+
rack_headers = rackify_headers(headers)
|
|
70
|
+
options.merge!(rack_headers)
|
|
71
|
+
|
|
72
|
+
# Note @options[:method] uses @options vs options on purpose
|
|
73
|
+
@options[:method] = event["httpMethod"].downcase if event["httpMethod"]
|
|
74
|
+
options
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Takes headers and adds HTTP_ to front of the keys because that is what rack
|
|
78
|
+
# does to the headers passed from a request. This seems to be the standard
|
|
79
|
+
# when testing with curl and inspecting the headers in a Rack app. Example:
|
|
80
|
+
# https://gist.github.com/tongueroo/94f22f6c261c8999e4f4f776547e2ee3
|
|
81
|
+
#
|
|
82
|
+
# This is useful for:
|
|
83
|
+
#
|
|
84
|
+
# ActionController::Base.renderer.new(renderer_options)
|
|
85
|
+
#
|
|
86
|
+
# renderer_options are rack normalized headers.
|
|
87
|
+
#
|
|
88
|
+
# Example input (from api gateway)
|
|
89
|
+
#
|
|
90
|
+
# {"host"=>"localhost:8888",
|
|
91
|
+
# "user-agent"=>"curl/7.53.1",
|
|
92
|
+
# "accept"=>"*/*",
|
|
93
|
+
# "version"=>"HTTP/1.1",
|
|
94
|
+
# "x-amzn-trace-id"=>"Root=1-5bde5b19-61d0d4ab4659144f8f69e38f"}
|
|
95
|
+
#
|
|
96
|
+
# Example output:
|
|
97
|
+
#
|
|
98
|
+
# {"HTTP_HOST"=>"localhost:8888",
|
|
99
|
+
# "HTTP_USER_AGENT"=>"curl/7.53.1",
|
|
100
|
+
# "HTTP_ACCEPT"=>"*/*",
|
|
101
|
+
# "HTTP_VERSION"=>"HTTP/1.1",
|
|
102
|
+
# "HTTP_X_AMZN_TRACE_ID"=>"Root=1-5bde5b19-61d0d4ab4659144f8f69e38f"}
|
|
103
|
+
#
|
|
104
|
+
def rackify_headers(headers)
|
|
105
|
+
results = {}
|
|
106
|
+
headers.each do |k,v|
|
|
107
|
+
rack_key = 'HTTP_' + k.gsub('-','_').upcase
|
|
108
|
+
results[rack_key] = v
|
|
109
|
+
end
|
|
110
|
+
results
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def render_options
|
|
114
|
+
# nomralize the template option
|
|
115
|
+
template = @options[:template]
|
|
116
|
+
if template and !template.include?('/')
|
|
117
|
+
template = "#{template_namespace}/#{template}"
|
|
118
|
+
end
|
|
119
|
+
template ||= default_template_name
|
|
120
|
+
# ready to override @options[:template]
|
|
121
|
+
@options[:template] = template if @options[:template]
|
|
122
|
+
|
|
123
|
+
render_options = {
|
|
124
|
+
template: template, # weird: template needs to be set no matter because it
|
|
125
|
+
# sets the name which is used in lookup_context.rb:209:in `normalize_name'
|
|
126
|
+
layout: @options[:layout],
|
|
127
|
+
assigns: controller_instance_variables,
|
|
128
|
+
}
|
|
129
|
+
types = %w[json inline plain file xml body action].map(&:to_sym)
|
|
130
|
+
types.each do |type|
|
|
131
|
+
render_options[type] = @options[type] if @options[type]
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
render_options
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def controller_instance_variables
|
|
138
|
+
instance_vars = @controller.instance_variables.inject({}) do |vars, v|
|
|
139
|
+
k = v.to_s.sub(/^@/,'') # @var => var
|
|
140
|
+
vars[k] = @controller.instance_variable_get(v)
|
|
141
|
+
vars
|
|
142
|
+
end
|
|
143
|
+
instance_vars[:event] = event
|
|
144
|
+
instance_vars
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
private
|
|
148
|
+
# From jets/controller/response.rb
|
|
149
|
+
def drop_content_info?(status)
|
|
150
|
+
status.to_i / 100 == 1 or drop_body?(status)
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
DROP_BODY_RESPONSES = [204, 304]
|
|
154
|
+
def drop_body?(status)
|
|
155
|
+
DROP_BODY_RESPONSES.include?(status.to_i)
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
# maps:
|
|
159
|
+
# :continue => 100
|
|
160
|
+
# :success => 200
|
|
161
|
+
# etc
|
|
162
|
+
def normalize_status_code(code)
|
|
163
|
+
status_code = if code.is_a?(Symbol)
|
|
164
|
+
Rack::Utils::SYMBOL_TO_STATUS_CODE[code]
|
|
165
|
+
else
|
|
166
|
+
code
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
# API Gateway requires status to be String but local rack is okay with either
|
|
170
|
+
# Note, ELB though requires status to be an Integer. We'll later in rack/adapter.rb
|
|
171
|
+
# adjust status to an Integer if request is coming from an ELB.
|
|
172
|
+
(status_code || 200).to_s
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
def set_content_type!(status, headers)
|
|
176
|
+
if drop_content_info?(status)
|
|
177
|
+
headers.delete "Content-Length"
|
|
178
|
+
headers.delete "Content-Type"
|
|
179
|
+
else
|
|
180
|
+
headers["Content-Type"] = @options[:content_type] ||
|
|
181
|
+
headers['content-type'] || # Mega Mode (Rails)
|
|
182
|
+
headers['Content-Type'] || # Just in case
|
|
183
|
+
Jets::Controller::DEFAULT_CONTENT_TYPE
|
|
184
|
+
end
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
def normalized_base64_option(options)
|
|
188
|
+
base64 = @options[:base64] if options.key?(:base64)
|
|
189
|
+
base64 = @options[:isBase64Encoded] if options.key?(:isBase64Encoded)
|
|
190
|
+
base64
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
class << self
|
|
194
|
+
def setup!
|
|
195
|
+
require "action_controller"
|
|
196
|
+
require "jets/overrides/rails"
|
|
197
|
+
|
|
198
|
+
# Load helpers
|
|
199
|
+
# Assign local variable because scope in the `:action_view do` block changes
|
|
200
|
+
app_helper_classes = find_app_helper_classes
|
|
201
|
+
ActiveSupport.on_load :action_view do
|
|
202
|
+
include ApplicationHelper # include first
|
|
203
|
+
app_helper_classes.each do |helper_class|
|
|
204
|
+
include helper_class
|
|
205
|
+
end
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
ActionController::Base.append_view_path("#{Jets.root}/app/views")
|
|
209
|
+
ActionView::Resolver.caching = !Jets.env.development?
|
|
210
|
+
|
|
211
|
+
setup_webpacker if Jets.webpacker?
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
# Does not include ApplicationHelper, will include ApplicationHelper explicitly first.
|
|
215
|
+
def find_app_helper_classes
|
|
216
|
+
internal_path = File.expand_path("../../internal", File.dirname(__FILE__))
|
|
217
|
+
internal_classes = find_app_helper_classes_from(internal_path)
|
|
218
|
+
app_classes = find_app_helper_classes_from(Jets.root)
|
|
219
|
+
(internal_classes + app_classes).uniq
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
def find_app_helper_classes_from(project_root)
|
|
223
|
+
klasses = []
|
|
224
|
+
expression = "#{project_root}/app/helpers/**/*"
|
|
225
|
+
Dir.glob(expression).each do |path|
|
|
226
|
+
next unless File.file?(path)
|
|
227
|
+
class_name = path.sub("#{project_root}/app/helpers/","").sub(/\.rb/,'')
|
|
228
|
+
|
|
229
|
+
unless class_name == "application_helper"
|
|
230
|
+
klasses << class_name.camelize.constantize # autoload
|
|
231
|
+
end
|
|
232
|
+
end
|
|
233
|
+
klasses
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
def setup_webpacker
|
|
237
|
+
require 'webpacker'
|
|
238
|
+
require 'webpacker/helper'
|
|
239
|
+
|
|
240
|
+
ActiveSupport.on_load :action_controller do
|
|
241
|
+
ActionController::Base.helper Webpacker::Helper
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
ActiveSupport.on_load :action_view do
|
|
245
|
+
include Webpacker::Helper
|
|
246
|
+
end
|
|
247
|
+
end
|
|
248
|
+
end
|
|
249
|
+
end
|
|
250
|
+
end
|