jets.benforeva 3.0.17.pre.mount.pre.fix
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/config.yml +92 -0
- data/.cody/README.md +13 -0
- data/.cody/docs/bin/build.sh +7 -0
- data/.cody/docs/bin/bundler_setup.sh +8 -0
- data/.cody/docs/bin/cli_docs.sh +6 -0
- data/.cody/docs/bin/git_commit.sh +27 -0
- data/.cody/docs/bin/git_setup.sh +12 -0
- data/.cody/docs/bin/subnav.sh +14 -0
- data/.cody/docs/buildspec.yml +10 -0
- data/.cody/docs/project.rb +10 -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 +14 -0
- data/.github/ISSUE_TEMPLATE.md +7 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +50 -0
- data/.gitignore +24 -0
- data/.gitmodules +0 -0
- data/.python-version +1 -0
- data/.rspec +4 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +1035 -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 +212 -0
- data/Rakefile +24 -0
- data/backers.md +20 -0
- data/bin/release +9 -0
- data/exe/jets.benforeva +14 -0
- data/jets.benforeva.gemspec +71 -0
- data/lib/jets/application/defaults.rb +200 -0
- data/lib/jets/application.rb +240 -0
- data/lib/jets/authorizer/base.rb +36 -0
- data/lib/jets/authorizer/dsl.rb +69 -0
- data/lib/jets/authorizer/helpers/iam_helper.rb +47 -0
- data/lib/jets/autoloaders.rb +112 -0
- data/lib/jets/aws_info.rb +111 -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 +64 -0
- data/lib/jets/aws_services.rb +95 -0
- data/lib/jets/booter.rb +167 -0
- data/lib/jets/builders/code_builder.rb +410 -0
- data/lib/jets/builders/code_size.rb +57 -0
- data/lib/jets/builders/gem_replacer.rb +89 -0
- data/lib/jets/builders/handler_generator.rb +186 -0
- data/lib/jets/builders/lambda_layer.rb +68 -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/config/initializers/jets.rb +16 -0
- data/lib/jets/builders/reconfigure_rails.rb +114 -0
- data/lib/jets/builders/ruby_packager.rb +235 -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 +88 -0
- data/lib/jets/camelizer.rb +4 -0
- data/lib/jets/cfn/builders/api_deployment_builder.rb +56 -0
- data/lib/jets/cfn/builders/api_gateway_builder.rb +123 -0
- data/lib/jets/cfn/builders/api_resources_builder.rb +44 -0
- data/lib/jets/cfn/builders/authorizer_builder.rb +67 -0
- data/lib/jets/cfn/builders/base_child_builder.rb +69 -0
- data/lib/jets/cfn/builders/controller_builder.rb +50 -0
- data/lib/jets/cfn/builders/function_builder.rb +14 -0
- data/lib/jets/cfn/builders/interface.rb +133 -0
- data/lib/jets/cfn/builders/job_builder.rb +14 -0
- data/lib/jets/cfn/builders/parent_builder/stagger.rb +34 -0
- data/lib/jets/cfn/builders/parent_builder.rb +130 -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/builders/util/source.rb +21 -0
- data/lib/jets/cfn/built_template.rb +15 -0
- data/lib/jets/cfn/ship.rb +188 -0
- data/lib/jets/cfn/status.rb +10 -0
- data/lib/jets/cfn/template_source.rb +61 -0
- data/lib/jets/cfn/upload.rb +157 -0
- data/lib/jets/cli.rb +208 -0
- data/lib/jets/commands/base.rb +145 -0
- data/lib/jets/commands/build.rb +252 -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 +62 -0
- data/lib/jets/commands/call/guesser.rb +48 -0
- data/lib/jets/commands/call.rb +182 -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 +111 -0
- data/lib/jets/commands/clean.rb +19 -0
- data/lib/jets/commands/configure.rb +51 -0
- data/lib/jets/commands/console.rb +12 -0
- data/lib/jets/commands/db/environment-task.rake +3 -0
- data/lib/jets/commands/db/tasks/dummy/app.rb +25 -0
- data/lib/jets/commands/db/tasks/dummy/config.rb +14 -0
- data/lib/jets/commands/db/tasks.rb +34 -0
- data/lib/jets/commands/db.rb +13 -0
- data/lib/jets/commands/dbconsole.rb +134 -0
- data/lib/jets/commands/delete.rb +136 -0
- data/lib/jets/commands/deploy.rb +137 -0
- data/lib/jets/commands/dotenv.rb +9 -0
- data/lib/jets/commands/dynamodb/migrate.rb +9 -0
- data/lib/jets/commands/dynamodb/migrator.rb +36 -0
- data/lib/jets/commands/dynamodb.rb +19 -0
- data/lib/jets/commands/gems.rb +13 -0
- data/lib/jets/commands/help/build.md +6 -0
- data/lib/jets/commands/help/call.md +69 -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/degenerate.md +16 -0
- data/lib/jets/commands/help/delete.md +22 -0
- data/lib/jets/commands/help/deploy.md +32 -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 +6 -0
- data/lib/jets/commands/help/generate.md +28 -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 +7 -0
- data/lib/jets/commands/help/url.md +6 -0
- data/lib/jets/commands/help.rb +9 -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 +30 -0
- data/lib/jets/commands/import/templates/submodules-cheatsheet.md +89 -0
- data/lib/jets/commands/import.rb +12 -0
- data/lib/jets/commands/main.rb +166 -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 +173 -0
- data/lib/jets/commands/rake_command.rb +61 -0
- data/lib/jets/commands/rake_tasks.rb +50 -0
- data/lib/jets/commands/runner.rb +16 -0
- data/lib/jets/commands/sequence.rb +105 -0
- data/lib/jets/commands/stack_info.rb +30 -0
- data/lib/jets/commands/templates/skeleton/.env.development.tt +3 -0
- data/lib/jets/commands/templates/skeleton/.env.test +3 -0
- data/lib/jets/commands/templates/skeleton/.env.tt +3 -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 +39 -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 +26 -0
- data/lib/jets/commands/templates/skeleton/config/application.rb.tt +71 -0
- data/lib/jets/commands/templates/skeleton/config/database.yml.tt +27 -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/config.ru +5 -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 +23 -0
- data/lib/jets/commands/templates/webpacker/app/javascript/packs/theme.scss.tt +24 -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/upgrade/version1.rb +136 -0
- data/lib/jets/commands/upgrade.rb +105 -0
- data/lib/jets/commands/url.rb +69 -0
- data/lib/jets/commands/webpacker_template.rb +18 -0
- data/lib/jets/controller/authorization.rb +91 -0
- data/lib/jets/controller/base.rb +175 -0
- data/lib/jets/controller/callbacks.rb +73 -0
- data/lib/jets/controller/cookies/jar.rb +269 -0
- data/lib/jets/controller/cookies.rb +38 -0
- data/lib/jets/controller/error/invalid_authenticity_token.rb +6 -0
- data/lib/jets/controller/error.rb +4 -0
- data/lib/jets/controller/forgery_protection.rb +43 -0
- data/lib/jets/controller/layout.rb +17 -0
- data/lib/jets/controller/middleware/cors.rb +60 -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 +22 -0
- data/lib/jets/controller/middleware/local.rb +120 -0
- data/lib/jets/controller/middleware/main.rb +53 -0
- data/lib/jets/controller/middleware/reloader.rb +15 -0
- data/lib/jets/controller/middleware/webpacker_setup.rb +6 -0
- data/lib/jets/controller/parameters_filter.rb +29 -0
- data/lib/jets/controller/params.rb +117 -0
- data/lib/jets/controller/rack/adapter.rb +94 -0
- data/lib/jets/controller/rack/env.rb +122 -0
- data/lib/jets/controller/redirection.rb +51 -0
- data/lib/jets/controller/rendering/rack_renderer.rb +267 -0
- data/lib/jets/controller/rendering.rb +96 -0
- data/lib/jets/controller/request.rb +29 -0
- data/lib/jets/controller/response.rb +61 -0
- data/lib/jets/controller/stage.rb +34 -0
- data/lib/jets/controller.rb +3 -0
- data/lib/jets/core.rb +157 -0
- data/lib/jets/core_ext/bundler.rb +7 -0
- data/lib/jets/core_ext/kernel.rb +13 -0
- data/lib/jets/db.rb +15 -0
- data/lib/jets/dotenv/show.rb +11 -0
- data/lib/jets/dotenv/ssm.rb +64 -0
- data/lib/jets/dotenv.rb +48 -0
- data/lib/jets/erb.rb +51 -0
- data/lib/jets/generator/templates/active_job/job/templates/application_job.rb.tt +6 -0
- data/lib/jets/generator/templates/active_job/job/templates/job.rb.tt +8 -0
- data/lib/jets/generator/templates/erb/controller/view.html.erb +2 -0
- data/lib/jets/generator/templates/erb/scaffold/_form.html.erb +34 -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/generator.rb +112 -0
- data/lib/jets/inflections.rb +32 -0
- data/lib/jets/internal/app/controllers/jets/bare_controller.rb +16 -0
- data/lib/jets/internal/app/controllers/jets/mailers_controller.rb +97 -0
- data/lib/jets/internal/app/controllers/jets/mount_controller.rb +63 -0
- data/lib/jets/internal/app/controllers/jets/public_controller.rb +31 -0
- data/lib/jets/internal/app/controllers/jets/rack_controller.rb +12 -0
- data/lib/jets/internal/app/functions/jets/base_path.rb +18 -0
- data/lib/jets/internal/app/functions/jets/base_path_mapping.rb +100 -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 +33 -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 +52 -0
- data/lib/jets/job/base.rb +49 -0
- data/lib/jets/job/dsl/dynamodb_event.rb +67 -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/dsl.rb +40 -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 +404 -0
- data/lib/jets/lambda/function.rb +29 -0
- data/lib/jets/lambda/function_constructor.rb +55 -0
- data/lib/jets/lambda/functions.rb +39 -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/source.rb +21 -0
- data/lib/jets/mega/request.rb +163 -0
- data/lib/jets/middleware/configurator.rb +84 -0
- data/lib/jets/middleware/default_stack.rb +53 -0
- data/lib/jets/middleware/layer.rb +34 -0
- data/lib/jets/middleware/stack.rb +77 -0
- data/lib/jets/middleware.rb +33 -0
- data/lib/jets/naming.rb +63 -0
- data/lib/jets/overrides/lambda/marshaller.rb +31 -0
- data/lib/jets/overrides/lambda.rb +1 -0
- data/lib/jets/overrides/rails/action_controller.rb +13 -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/migration_checker.rb +34 -0
- data/lib/jets/overrides/rails/rendering_helper.rb +27 -0
- data/lib/jets/overrides/rails/url_helper.rb +88 -0
- data/lib/jets/overrides/rails.rb +6 -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/poly_fun.rb +73 -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/api_gateway/authorizer.rb +82 -0
- data/lib/jets/resource/api_gateway/base_path/function.rb +49 -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 +80 -0
- data/lib/jets/resource/api_gateway/domain_name.rb +65 -0
- data/lib/jets/resource/api_gateway/method/authorization.rb +41 -0
- data/lib/jets/resource/api_gateway/method.rb +102 -0
- data/lib/jets/resource/api_gateway/resource.rb +82 -0
- data/lib/jets/resource/api_gateway/rest_api/change_detection.rb +10 -0
- data/lib/jets/resource/api_gateway/rest_api/logical_id/message.rb +49 -0
- data/lib/jets/resource/api_gateway/rest_api/logical_id.rb +98 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/change/base.rb +136 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/change/media_types.rb +36 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/change/page.rb +93 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/change/to.rb +25 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/change/variable.rb +35 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/change.rb +16 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/collision/variable_exception.rb +7 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/collision.rb +121 -0
- data/lib/jets/resource/api_gateway/rest_api/routes.rb +7 -0
- data/lib/jets/resource/api_gateway/rest_api.rb +64 -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 +58 -0
- data/lib/jets/resource/child_stack/api_gateway.rb +23 -0
- data/lib/jets/resource/child_stack/api_resource/page.rb +20 -0
- data/lib/jets/resource/child_stack/api_resource.rb +54 -0
- data/lib/jets/resource/child_stack/app_class.rb +149 -0
- data/lib/jets/resource/child_stack/authorizer.rb +40 -0
- data/lib/jets/resource/child_stack/base.rb +24 -0
- data/lib/jets/resource/child_stack/common_parameters.rb +14 -0
- data/lib/jets/resource/child_stack/shared.rb +85 -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/environment.rb +62 -0
- data/lib/jets/resource/lambda/function.rb +221 -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 +98 -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/resource.rb +71 -0
- data/lib/jets/router/dsl/mount.rb +13 -0
- data/lib/jets/router/dsl.rb +144 -0
- data/lib/jets/router/error.rb +4 -0
- data/lib/jets/router/finder.rb +47 -0
- data/lib/jets/router/helpers/core_helper.rb +27 -0
- data/lib/jets/router/helpers/named_routes_helper.rb +8 -0
- data/lib/jets/router/helpers.rb +4 -0
- data/lib/jets/router/matcher.rb +81 -0
- data/lib/jets/router/method_creator/code.rb +99 -0
- data/lib/jets/router/method_creator/edit.rb +12 -0
- data/lib/jets/router/method_creator/generic.rb +11 -0
- data/lib/jets/router/method_creator/index.rb +48 -0
- data/lib/jets/router/method_creator/new.rb +12 -0
- data/lib/jets/router/method_creator/root.rb +15 -0
- data/lib/jets/router/method_creator/show.rb +12 -0
- data/lib/jets/router/method_creator.rb +50 -0
- data/lib/jets/router/resources/base.rb +7 -0
- data/lib/jets/router/resources/filter.rb +15 -0
- data/lib/jets/router/resources/options.rb +13 -0
- data/lib/jets/router/route/authorizer.rb +57 -0
- data/lib/jets/router/route.rb +230 -0
- data/lib/jets/router/scope.rb +95 -0
- data/lib/jets/router/util.rb +38 -0
- data/lib/jets/router.rb +180 -0
- data/lib/jets/rule/base.rb +19 -0
- data/lib/jets/rule/dsl.rb +109 -0
- data/lib/jets/spec_helpers/controllers/params.rb +8 -0
- data/lib/jets/spec_helpers/controllers/request.rb +101 -0
- data/lib/jets/spec_helpers/controllers/response.rb +10 -0
- data/lib/jets/spec_helpers/controllers.rb +47 -0
- data/lib/jets/spec_helpers/fixtures.rb +11 -0
- data/lib/jets/spec_helpers.rb +21 -0
- data/lib/jets/stack/builder.rb +43 -0
- data/lib/jets/stack/definition.rb +50 -0
- data/lib/jets/stack/depends/item.rb +26 -0
- data/lib/jets/stack/depends.rb +34 -0
- data/lib/jets/stack/function.rb +69 -0
- data/lib/jets/stack/main/dsl/base.rb +63 -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/kinesis.rb +15 -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/main/dsl.rb +17 -0
- data/lib/jets/stack/main.rb +4 -0
- data/lib/jets/stack/output/dsl.rb +19 -0
- data/lib/jets/stack/output/lookup.rb +36 -0
- data/lib/jets/stack/output.rb +35 -0
- data/lib/jets/stack/parameter/dsl.rb +42 -0
- data/lib/jets/stack/parameter.rb +37 -0
- data/lib/jets/stack/resource/dsl.rb +19 -0
- data/lib/jets/stack/resource.rb +31 -0
- data/lib/jets/stack/s3_event.rb +87 -0
- data/lib/jets/stack.rb +88 -0
- data/lib/jets/tmp_loader.rb +53 -0
- data/lib/jets/turbine.rb +41 -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/application.rb +5 -0
- data/lib/jets/turbo/project/config/routes.rb +4 -0
- data/lib/jets/turbo/project/config.ru +5 -0
- data/lib/jets/turbo/rails.rb +127 -0
- data/lib/jets/turbo/templates/config/database.yml +30 -0
- data/lib/jets/turbo.rb +56 -0
- data/lib/jets/util.rb +40 -0
- data/lib/jets/version.rb +3 -0
- data/lib/jets.rb +31 -0
- data/readme/prerelease.md +6 -0
- data/readme/testing.md +60 -0
- metadata +1105 -0
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
# Based on sinatra/cookies.rb
|
|
2
|
+
# https://github.com/sinatra/sinatra/blob/master/sinatra-contrib/lib/sinatra/cookies.rb
|
|
3
|
+
module Jets::Controller::Cookies
|
|
4
|
+
class Jar
|
|
5
|
+
include Enumerable
|
|
6
|
+
attr_reader :options
|
|
7
|
+
|
|
8
|
+
def initialize(controller)
|
|
9
|
+
@response_string = nil
|
|
10
|
+
@response_hash = {}
|
|
11
|
+
@response = controller.response
|
|
12
|
+
@request = controller.request
|
|
13
|
+
@deleted = []
|
|
14
|
+
|
|
15
|
+
@options = {
|
|
16
|
+
path: @request.script_name.to_s.empty? ? '/' : @request.script_name,
|
|
17
|
+
domain: @request.host == 'localhost' ? nil : @request.host,
|
|
18
|
+
secure: @request.ssl?,
|
|
19
|
+
httponly: true
|
|
20
|
+
}
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def ==(other)
|
|
24
|
+
other.respond_to? :to_hash and to_hash == other.to_hash
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def [](key)
|
|
28
|
+
response_cookies[key.to_s] || request_cookies[key.to_s]
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def []=(key, value)
|
|
32
|
+
set(key, value: value)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def assoc(key)
|
|
36
|
+
to_hash.assoc(key.to_s)
|
|
37
|
+
end if Hash.method_defined? :assoc
|
|
38
|
+
|
|
39
|
+
def clear
|
|
40
|
+
each_key { |k| delete(k) }
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def compare_by_identity?
|
|
44
|
+
false
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def default
|
|
48
|
+
nil
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
alias default_proc default
|
|
52
|
+
|
|
53
|
+
def delete(key)
|
|
54
|
+
result = self[key]
|
|
55
|
+
@response.delete_cookie(key.to_s, @options)
|
|
56
|
+
result
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def delete_if
|
|
60
|
+
return enum_for(__method__) unless block_given?
|
|
61
|
+
each { |k, v| delete(k) if yield(k, v) }
|
|
62
|
+
self
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def each(&block)
|
|
66
|
+
return enum_for(__method__) unless block_given?
|
|
67
|
+
to_hash.each(&block)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def each_key(&block)
|
|
71
|
+
return enum_for(__method__) unless block_given?
|
|
72
|
+
to_hash.each_key(&block)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
alias each_pair each
|
|
76
|
+
|
|
77
|
+
def each_value(&block)
|
|
78
|
+
return enum_for(__method__) unless block_given?
|
|
79
|
+
to_hash.each_value(&block)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def empty?
|
|
83
|
+
to_hash.empty?
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def fetch(key, &block)
|
|
87
|
+
response_cookies.fetch(key.to_s) do
|
|
88
|
+
request_cookies.fetch(key.to_s, &block)
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def flatten
|
|
93
|
+
to_hash.flatten
|
|
94
|
+
end if Hash.method_defined? :flatten
|
|
95
|
+
|
|
96
|
+
def has_key?(key)
|
|
97
|
+
response_cookies.has_key? key.to_s or request_cookies.has_key? key.to_s
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def has_value?(value)
|
|
101
|
+
response_cookies.has_value? value or request_cookies.has_value? value
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def hash
|
|
105
|
+
to_hash.hash
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
alias include? has_key?
|
|
109
|
+
alias member? has_key?
|
|
110
|
+
|
|
111
|
+
def index(value)
|
|
112
|
+
warn "Hash#index is deprecated; use Hash#key"
|
|
113
|
+
key(value)
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def inspect
|
|
117
|
+
"<##{self.class}: #{to_hash.inspect[1..-2]}>"
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def invert
|
|
121
|
+
to_hash.invert
|
|
122
|
+
end if Hash.method_defined? :invert
|
|
123
|
+
|
|
124
|
+
def keep_if
|
|
125
|
+
return enum_for(__method__) unless block_given?
|
|
126
|
+
delete_if { |*a| not yield(*a) }
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def key(value)
|
|
130
|
+
to_hash.key(value)
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
alias key? has_key?
|
|
134
|
+
|
|
135
|
+
def keys
|
|
136
|
+
to_hash.keys
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def length
|
|
140
|
+
to_hash.length
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
def merge(other, &block)
|
|
144
|
+
to_hash.merge(other, &block)
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
def merge!(other)
|
|
148
|
+
other.each_pair do |key, value|
|
|
149
|
+
if block_given? and include? key
|
|
150
|
+
self[key] = yield(key.to_s, self[key], value)
|
|
151
|
+
else
|
|
152
|
+
self[key] = value
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
def rassoc(value)
|
|
158
|
+
to_hash.rassoc(value)
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
def rehash
|
|
162
|
+
response_cookies.rehash
|
|
163
|
+
request_cookies.rehash
|
|
164
|
+
self
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
def reject(&block)
|
|
168
|
+
return enum_for(__method__) unless block_given?
|
|
169
|
+
to_hash.reject(&block)
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
alias reject! delete_if
|
|
173
|
+
|
|
174
|
+
def replace(other)
|
|
175
|
+
select! { |k, v| other.include?(k) or other.include?(k.to_s) }
|
|
176
|
+
merge! other
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
def select(&block)
|
|
180
|
+
return enum_for(__method__) unless block_given?
|
|
181
|
+
to_hash.select(&block)
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
alias select! keep_if if Hash.method_defined? :select!
|
|
185
|
+
|
|
186
|
+
def set(key, options = {})
|
|
187
|
+
@response.set_cookie key.to_s, @options.merge(options)
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
def shift
|
|
191
|
+
key, value = to_hash.shift
|
|
192
|
+
delete(key)
|
|
193
|
+
[key, value]
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
alias size length
|
|
197
|
+
|
|
198
|
+
def sort(&block)
|
|
199
|
+
to_hash.sort(&block)
|
|
200
|
+
end if Hash.method_defined? :sort
|
|
201
|
+
|
|
202
|
+
alias store []=
|
|
203
|
+
|
|
204
|
+
def to_hash
|
|
205
|
+
request_cookies.merge(response_cookies)
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
def to_a
|
|
209
|
+
to_hash.to_a
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
def to_s
|
|
213
|
+
to_hash.to_s
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
alias update merge!
|
|
217
|
+
alias value? has_value?
|
|
218
|
+
|
|
219
|
+
def values
|
|
220
|
+
to_hash.values
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
def values_at(*list)
|
|
224
|
+
list.map { |k| self[k] }
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
private
|
|
228
|
+
|
|
229
|
+
def warn(message)
|
|
230
|
+
super "#{caller.first[/^[^:]:\d+:/]} warning: #{message}"
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
def deleted
|
|
234
|
+
parse_response
|
|
235
|
+
@deleted
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
def response_cookies
|
|
239
|
+
parse_response
|
|
240
|
+
@response_hash
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
def parse_response
|
|
244
|
+
string = @response.headers['Set-Cookie']
|
|
245
|
+
return if @response_string == string
|
|
246
|
+
|
|
247
|
+
hash = {}
|
|
248
|
+
|
|
249
|
+
string.each_line do |line|
|
|
250
|
+
key, value = line.split(';', 2).first.to_s.split('=', 2)
|
|
251
|
+
next if key.nil?
|
|
252
|
+
key = Rack::Utils.unescape(key)
|
|
253
|
+
if line =~ /expires=Thu, 01[-\s]Jan[-\s]1970/
|
|
254
|
+
@deleted << key
|
|
255
|
+
else
|
|
256
|
+
@deleted.delete key
|
|
257
|
+
hash[key] = value
|
|
258
|
+
end
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
@response_hash.replace hash
|
|
262
|
+
@response_string = string
|
|
263
|
+
end
|
|
264
|
+
|
|
265
|
+
def request_cookies
|
|
266
|
+
@request.cookies.reject { |key, value| deleted.include? key }
|
|
267
|
+
end
|
|
268
|
+
end
|
|
269
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Based on sinatra/cookies.rb
|
|
2
|
+
# https://github.com/sinatra/sinatra/blob/master/sinatra-contrib/lib/sinatra/cookies.rb
|
|
3
|
+
class Jets::Controller
|
|
4
|
+
# = Jets::Controller::Cookies
|
|
5
|
+
#
|
|
6
|
+
# Easy way to deal with cookies
|
|
7
|
+
#
|
|
8
|
+
# == Usage
|
|
9
|
+
#
|
|
10
|
+
# Allows you to read cookies:
|
|
11
|
+
#
|
|
12
|
+
# def index
|
|
13
|
+
# "value: #{cookies[:something]}"
|
|
14
|
+
# end
|
|
15
|
+
#
|
|
16
|
+
# And of course to write cookies:
|
|
17
|
+
#
|
|
18
|
+
# def show
|
|
19
|
+
# cookies[:something] = 'foobar'
|
|
20
|
+
# render json: cookies
|
|
21
|
+
# end
|
|
22
|
+
#
|
|
23
|
+
# And generally behaves like a hash:
|
|
24
|
+
#
|
|
25
|
+
# def index
|
|
26
|
+
# cookies.merge! 'foo' => 'bar', 'bar' => 'baz'
|
|
27
|
+
# cookies.keep_if { |key, value| key.start_with? 'b' }
|
|
28
|
+
# foo, bar = cookies.values_at 'foo', 'bar'
|
|
29
|
+
# puts "size: #{cookies.length}"
|
|
30
|
+
# render json: cookies
|
|
31
|
+
# end
|
|
32
|
+
#
|
|
33
|
+
module Cookies
|
|
34
|
+
def cookies
|
|
35
|
+
@cookies ||= Jar.new(self)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
class Jets::Controller
|
|
2
|
+
module ForgeryProtection
|
|
3
|
+
extend ActiveSupport::Concern
|
|
4
|
+
|
|
5
|
+
included do
|
|
6
|
+
config = Jets.config
|
|
7
|
+
default_protect_from_forgery = config.dig(:controllers, :default_protect_from_forgery)
|
|
8
|
+
if default_protect_from_forgery.nil? && config.mode == "html" || default_protect_from_forgery # true
|
|
9
|
+
protect_from_forgery
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
class_methods do
|
|
14
|
+
def protect_from_forgery(options = {})
|
|
15
|
+
before_action :verify_authenticity_token, options
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def skip_forgery_protection
|
|
19
|
+
skip_before_action :verify_authenticity_token
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def forgery_protection_enabled?
|
|
23
|
+
# Example:
|
|
24
|
+
#
|
|
25
|
+
# before_actions [[:verify_authenticity_token, {}], [:set_post, {:only=>[:show, :edit, :update, :delete]}
|
|
26
|
+
#
|
|
27
|
+
before_actions.map { |a| a[0] }.include?(:verify_authenticity_token)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Instance methods
|
|
32
|
+
def verify_authenticity_token
|
|
33
|
+
return true if Jets.env.test? || request.get? || request.head?
|
|
34
|
+
|
|
35
|
+
token = session[:authenticity_token]
|
|
36
|
+
verified = !token.nil? && (token == params[:authenticity_token] || token == request.headers["x-csrf-token"])
|
|
37
|
+
|
|
38
|
+
unless verified
|
|
39
|
+
raise Error::InvalidAuthenticityToken
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -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,Auth,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,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,22 @@
|
|
|
1
|
+
class Jets::Controller::Middleware::Local
|
|
2
|
+
class RouteMatcher
|
|
3
|
+
def initialize(env)
|
|
4
|
+
@env = env
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def find_route
|
|
8
|
+
Jets::Router::Finder.new(path, method).run
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
private
|
|
12
|
+
attr_reader :env
|
|
13
|
+
|
|
14
|
+
def method
|
|
15
|
+
env["REQUEST_METHOD"] || "GET"
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def path
|
|
19
|
+
env["PATH_INFO"].sub(/^\//,'')
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|