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,50 @@
|
|
|
1
|
+
class Jets::Router
|
|
2
|
+
class MethodCreator
|
|
3
|
+
include Util
|
|
4
|
+
|
|
5
|
+
def initialize(options, scope)
|
|
6
|
+
@options, @scope = options, scope
|
|
7
|
+
@controller, @action = get_controller_action(@options)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def define_url_helper!
|
|
11
|
+
return unless @options[:method] == :get
|
|
12
|
+
|
|
13
|
+
if %w[index new show edit].include?(@action)
|
|
14
|
+
create_method(@action)
|
|
15
|
+
else
|
|
16
|
+
create_method("generic")
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Examples:
|
|
21
|
+
#
|
|
22
|
+
# posts_path: path: 'posts'
|
|
23
|
+
# admin_posts_path: prefix: 'admin', path: 'posts'
|
|
24
|
+
# new_post_path
|
|
25
|
+
#
|
|
26
|
+
def create_method(action)
|
|
27
|
+
# Code eventually does this:
|
|
28
|
+
#
|
|
29
|
+
# code = Jets::Router::MethodCreator::Edit.new
|
|
30
|
+
# def_meth code.path_method
|
|
31
|
+
#
|
|
32
|
+
class_name = "Jets::Router::MethodCreator::#{action.camelize}"
|
|
33
|
+
klass = class_name.constantize # Index, Show, Edit, New
|
|
34
|
+
code = klass.new(@options, @scope, @controller)
|
|
35
|
+
|
|
36
|
+
def_meth(code.path_method) if code.path_method
|
|
37
|
+
def_meth(code.url_method) if code.url_method
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def create_root_helper
|
|
41
|
+
code = Jets::Router::MethodCreator::Root.new(@options, @scope, @controller)
|
|
42
|
+
def_meth(code.path_method)
|
|
43
|
+
def_meth(code.url_method)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def def_meth(str)
|
|
47
|
+
Jets::Router::Helpers::NamedRoutesHelper.class_eval(str)
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module Jets::Router::Resources
|
|
2
|
+
class Filter < Base
|
|
3
|
+
def yes?(action)
|
|
4
|
+
return true unless @options[:only] || @options[:except]
|
|
5
|
+
|
|
6
|
+
if @options[:only]
|
|
7
|
+
only = [@options[:only]].flatten.map(&:to_s)
|
|
8
|
+
only.include?(action.to_s)
|
|
9
|
+
else # except
|
|
10
|
+
except = [@options[:except]].flatten.map(&:to_s)
|
|
11
|
+
!except.include?(action.to_s)
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
module Jets::Router::Resources
|
|
2
|
+
class Options < Base
|
|
3
|
+
def build(action)
|
|
4
|
+
controller = @options[:singular_resource] ? @name.to_s.pluralize : @name
|
|
5
|
+
options = @options.merge(to: "#{controller}##{action}") # important to create a copy of the options
|
|
6
|
+
# remove special options from getting to create_route. For some reason .slice! doesnt work
|
|
7
|
+
options.delete(:only)
|
|
8
|
+
options.delete(:except)
|
|
9
|
+
options[:from_scope] = true # flag to drop the prefix later in Route#compute_path
|
|
10
|
+
options
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
class Jets::Router::Route
|
|
2
|
+
module Authorizer
|
|
3
|
+
# IE: main#protect => MainProtectAuthorizer
|
|
4
|
+
def authorizer_id(prefix_class: true)
|
|
5
|
+
return unless authorizer
|
|
6
|
+
logical_id(authorizer, prefix_class: prefix_class)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
# Metadata about the authorizer class that can be used later. Stored in the Authorizer template parameters.
|
|
10
|
+
# In app_class.rb `def controller_params` it is used to build the input parameters for controller templates.
|
|
11
|
+
def authorizer_metadata
|
|
12
|
+
metadata(authorizer)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def authorizer
|
|
16
|
+
@options[:authorizer]
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def authorization_scopes
|
|
20
|
+
@options[:authorization_scopes]
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def authorization_type
|
|
24
|
+
@options[:authorization_type] || inferred_authorization_type
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def api_key_required
|
|
28
|
+
@options[:api_key_required]
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
module ModuleMethods
|
|
32
|
+
def logical_id(authorizer, prefix_class: true)
|
|
33
|
+
klass, meth = authorizer.split("#")
|
|
34
|
+
words = [meth, "authorizer"]
|
|
35
|
+
words.unshift(klass) if prefix_class
|
|
36
|
+
words.join('_').camelize # logical_id
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def metadata(authorizer)
|
|
40
|
+
klass = authorizer.split("#").first
|
|
41
|
+
authorizer_class = "#{klass}_authorizer".camelize
|
|
42
|
+
logical_id = logical_id(authorizer, prefix_class: false)
|
|
43
|
+
# IE: MainAuthorizer.ProtectAuthorizer
|
|
44
|
+
"#{authorizer_class}.#{logical_id}"
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
include ModuleMethods # so available as instance methods
|
|
48
|
+
extend ModuleMethods # so also available as module method. IE: Jets::Router::Route::Authorizer.metadata(auth_to)
|
|
49
|
+
|
|
50
|
+
private
|
|
51
|
+
def inferred_authorization_type
|
|
52
|
+
return unless authorizer
|
|
53
|
+
Jets::Authorizer::Base.authorization_type(authorizer)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
end
|
|
57
|
+
end
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
# route = Jets::Router::Route.new(
|
|
2
|
+
# path: "posts",
|
|
3
|
+
# method: :get,
|
|
4
|
+
# to: "posts#index",
|
|
5
|
+
# )
|
|
6
|
+
class Jets::Router
|
|
7
|
+
class Route
|
|
8
|
+
include Util
|
|
9
|
+
include Authorizer
|
|
10
|
+
|
|
11
|
+
CAPTURE_REGEX = "([^/]*)" # as string
|
|
12
|
+
|
|
13
|
+
attr_reader :to, :as
|
|
14
|
+
def initialize(options, scope=Scope.new)
|
|
15
|
+
@options, @scope = options, scope
|
|
16
|
+
@path = compute_path
|
|
17
|
+
@to = compute_to
|
|
18
|
+
@as = compute_as
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def compute_path
|
|
22
|
+
# Note: The @options[:prefix] is missing prefix and is not support via direct create_route.
|
|
23
|
+
# This is because it can be added directly to the path. IE:
|
|
24
|
+
#
|
|
25
|
+
# get "myprefix/posts", to: "posts#index"
|
|
26
|
+
#
|
|
27
|
+
# Also, this helps to keep the method creator logic more simple.
|
|
28
|
+
#
|
|
29
|
+
prefix = @scope.full_prefix
|
|
30
|
+
prefix = account_scope(prefix)
|
|
31
|
+
prefix = account_on(prefix)
|
|
32
|
+
|
|
33
|
+
path = [prefix, @options[:path]].compact.join('/')
|
|
34
|
+
path = path[1..-1] if path.starts_with?('/') # be more forgiving if / accidentally included
|
|
35
|
+
path
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def account_scope(prefix)
|
|
39
|
+
return unless prefix
|
|
40
|
+
return prefix unless @options[:from_scope]
|
|
41
|
+
|
|
42
|
+
if @options[:singular_resource]
|
|
43
|
+
prefix.split('/')[0..-2].join('/')
|
|
44
|
+
else
|
|
45
|
+
prefix.split('/')[0..-3].join('/')
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def account_on(prefix)
|
|
50
|
+
# Tricky @scope.from == :resources since the account_scope already has accounted for it
|
|
51
|
+
if @options[:on] == :collection && @scope.from == :resources
|
|
52
|
+
prefix = prefix.split('/')[0..-2].join('/')
|
|
53
|
+
end
|
|
54
|
+
prefix == '' ? nil : prefix
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def compute_to
|
|
58
|
+
controller, action = get_controller_action(@options)
|
|
59
|
+
mod = @options[:module] || @scope.full_module
|
|
60
|
+
controller = [mod, controller].compact.join('/') # add module
|
|
61
|
+
"#{controller}##{action}"
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def compute_as
|
|
65
|
+
return nil if @options[:as] == :disabled
|
|
66
|
+
return unless @options[:method] == :get || @options[:root]
|
|
67
|
+
|
|
68
|
+
controller, action = get_controller_action(@options)
|
|
69
|
+
klass = if @options[:root]
|
|
70
|
+
Jets::Router::MethodCreator::Root
|
|
71
|
+
elsif %w[index edit show new].include?(action.to_s)
|
|
72
|
+
class_name = "Jets::Router::MethodCreator::#{action.camelize}"
|
|
73
|
+
class_name.constantize # Index, Show, Edit, New
|
|
74
|
+
else
|
|
75
|
+
Jets::Router::MethodCreator::Generic
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
klass.new(@options, @scope, controller).full_meth_name(nil)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# IE: standard: posts/:id/edit
|
|
82
|
+
# api_gateway: posts/{id}/edit
|
|
83
|
+
def path(format=:jets)
|
|
84
|
+
case format
|
|
85
|
+
when :api_gateway
|
|
86
|
+
api_gateway_format(@path)
|
|
87
|
+
when :raw
|
|
88
|
+
@path
|
|
89
|
+
else # jets format
|
|
90
|
+
ensure_jets_format(@path)
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def method
|
|
95
|
+
@options[:method].to_s.upcase
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def internal?
|
|
99
|
+
!!@options[:internal]
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def homepage?
|
|
103
|
+
path == ''
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
# IE: PostsController
|
|
107
|
+
def controller_name
|
|
108
|
+
to.sub(/#.*/,'').camelize + "Controller"
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# IE: index
|
|
112
|
+
def action_name
|
|
113
|
+
to.sub(/.*#/,'')
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# Checks to see if the corresponding controller exists. Useful to validate routes
|
|
117
|
+
# before deploying to CloudFormation and then rolling back.
|
|
118
|
+
def valid?
|
|
119
|
+
controller_class = begin
|
|
120
|
+
controller_name.constantize
|
|
121
|
+
rescue NameError
|
|
122
|
+
return false
|
|
123
|
+
end
|
|
124
|
+
controller_class.lambda_functions.include?(action_name.to_sym)
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
# Extracts the path parameters from the actual path
|
|
128
|
+
# Only supports extracting 1 parameter. So:
|
|
129
|
+
#
|
|
130
|
+
# actual_path: posts/tung/edit
|
|
131
|
+
# route.path: posts/:id/edit
|
|
132
|
+
#
|
|
133
|
+
# Returns:
|
|
134
|
+
# { id: "tung" }
|
|
135
|
+
def extract_parameters(actual_path)
|
|
136
|
+
if path.include?(':')
|
|
137
|
+
extract_parameters_capture(actual_path)
|
|
138
|
+
elsif path.include?('*')
|
|
139
|
+
extract_parameters_proxy(actual_path)
|
|
140
|
+
else
|
|
141
|
+
# Lambda AWS_PROXY sets null to the input request when there are no path parmeters
|
|
142
|
+
nil
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def extract_parameters_proxy(actual_path)
|
|
147
|
+
# changes path to a string used for a regexp
|
|
148
|
+
# others/*proxy => others\/(.*)
|
|
149
|
+
# nested/others/*proxy => nested/others\/(.*)
|
|
150
|
+
if path.include?('/')
|
|
151
|
+
leading_path = path.split('/')[0..-2].join('/') # drop last segment
|
|
152
|
+
# leading_path: nested/others
|
|
153
|
+
# capture everything after the leading_path as the value
|
|
154
|
+
regexp = Regexp.new("#{leading_path}/(.*)")
|
|
155
|
+
value = actual_path.match(regexp)[1]
|
|
156
|
+
else
|
|
157
|
+
value = actual_path
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
# the last segment without the '*' is the key
|
|
161
|
+
proxy_segment = path.split('/').last # last segment is the proxy segment
|
|
162
|
+
# proxy_segment: *proxy
|
|
163
|
+
key = proxy_segment.sub('*','')
|
|
164
|
+
|
|
165
|
+
{ key => value }
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
def extract_parameters_capture(actual_path)
|
|
169
|
+
# changes path to a string used for a regexp
|
|
170
|
+
# posts/:id/edit => posts\/(.*)\/edit
|
|
171
|
+
labels = []
|
|
172
|
+
regexp_string = path.split('/').map do |s|
|
|
173
|
+
if s.start_with?(':')
|
|
174
|
+
labels << s.delete_prefix(':')
|
|
175
|
+
CAPTURE_REGEX
|
|
176
|
+
else
|
|
177
|
+
s
|
|
178
|
+
end
|
|
179
|
+
end.join('\/')
|
|
180
|
+
# make sure beginning and end of the string matches
|
|
181
|
+
regexp_string = "^#{regexp_string}$"
|
|
182
|
+
regexp = Regexp.new(regexp_string)
|
|
183
|
+
|
|
184
|
+
values = regexp.match(actual_path).captures
|
|
185
|
+
labels.map do |next_label|
|
|
186
|
+
[next_label, values.delete_at(0)]
|
|
187
|
+
end.to_h
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
def mount_class
|
|
191
|
+
@options[:mount_class]
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
private
|
|
195
|
+
def ensure_jets_format(path)
|
|
196
|
+
path.split('/').map do |s|
|
|
197
|
+
if s =~ /^\{/ and s =~ /\+\}$/
|
|
198
|
+
s.sub(/^\{/, '*').sub(/\+\}$/,'') # {proxy+} => *proxy
|
|
199
|
+
elsif s =~ /^\{/ and s =~ /\}$/
|
|
200
|
+
s.sub('{',':').sub(/\}$/,'') # {id} => :id
|
|
201
|
+
else
|
|
202
|
+
s
|
|
203
|
+
end
|
|
204
|
+
end.join('/')
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
def api_gateway_format(path)
|
|
208
|
+
path.split('/')
|
|
209
|
+
.map {|s| transform_capture(s) }
|
|
210
|
+
.map {|s| transform_proxy(s) }
|
|
211
|
+
.join('/')
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
def transform_capture(text)
|
|
215
|
+
if text.starts_with?(':')
|
|
216
|
+
text = text.sub(':','')
|
|
217
|
+
text = "{#{text}}"
|
|
218
|
+
end
|
|
219
|
+
text
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
def transform_proxy(text)
|
|
223
|
+
if text.starts_with?('*')
|
|
224
|
+
text = text.sub('*','')
|
|
225
|
+
text = "{#{text}+}"
|
|
226
|
+
end
|
|
227
|
+
text
|
|
228
|
+
end
|
|
229
|
+
end
|
|
230
|
+
end
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
module Jets
|
|
2
|
+
class Router
|
|
3
|
+
class Scope
|
|
4
|
+
include Util
|
|
5
|
+
|
|
6
|
+
attr_reader :options, :parent, :level
|
|
7
|
+
def initialize(options = {}, parent = nil, level = 1)
|
|
8
|
+
@options = options
|
|
9
|
+
@parent = parent
|
|
10
|
+
@level = level
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def root?
|
|
14
|
+
@parent.nil?
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def new(options={})
|
|
18
|
+
self.class.new(options, self, level + 1)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def full_module
|
|
22
|
+
items = walk_parents do |current, i, result|
|
|
23
|
+
mod = current.options[:module]
|
|
24
|
+
next unless mod
|
|
25
|
+
result.unshift(mod)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
items.empty? ? nil : items.join('/')
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def full_prefix
|
|
32
|
+
items = walk_parents do |current, i, result|
|
|
33
|
+
prefix = current.options[:prefix]
|
|
34
|
+
next unless prefix
|
|
35
|
+
|
|
36
|
+
case current.from
|
|
37
|
+
when :resources
|
|
38
|
+
path_param = if current.options[:param]
|
|
39
|
+
":#{current.options[:param]}"
|
|
40
|
+
else
|
|
41
|
+
resource_name = prefix.to_s.split('/').last
|
|
42
|
+
resource_name = ":#{resource_name.singularize}_id"
|
|
43
|
+
end
|
|
44
|
+
result.unshift(path_param)
|
|
45
|
+
result.unshift(prefix)
|
|
46
|
+
else # resource, namespace or general scope
|
|
47
|
+
result.unshift(prefix)
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
items.empty? ? nil : items.join('/')
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def full_as
|
|
55
|
+
items = []
|
|
56
|
+
current = self
|
|
57
|
+
while current
|
|
58
|
+
items.unshift(current.options[:as]) # <= option_name
|
|
59
|
+
current = current.parent
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
items.compact!
|
|
63
|
+
return if items.empty?
|
|
64
|
+
|
|
65
|
+
items = singularize_leading(items)
|
|
66
|
+
items.join('_')
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def walk_parents
|
|
70
|
+
current, i, result = self, 0, []
|
|
71
|
+
while current
|
|
72
|
+
yield(current, i, result)
|
|
73
|
+
current = current.parent
|
|
74
|
+
i += 1
|
|
75
|
+
end
|
|
76
|
+
result
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# singularize all except last item
|
|
80
|
+
def singularize_leading(items)
|
|
81
|
+
result = []
|
|
82
|
+
items.each_with_index do |item, index|
|
|
83
|
+
item = item.to_s
|
|
84
|
+
r = index == items.size - 1 ? item : item.singularize
|
|
85
|
+
result << r
|
|
86
|
+
end
|
|
87
|
+
result
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def from
|
|
91
|
+
@options[:from]
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
class Jets::Router
|
|
2
|
+
module Util
|
|
3
|
+
# used in MethodCreator logic
|
|
4
|
+
def join(*items)
|
|
5
|
+
list = items.compact.join('_')
|
|
6
|
+
underscore(list)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def underscore(str)
|
|
10
|
+
return unless str
|
|
11
|
+
str.to_s.gsub(/[^a-zA-Z0-9]/,'_')
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def get_controller_action(options)
|
|
15
|
+
if options.key?(:controller) && options.key?(:action)
|
|
16
|
+
[options[:controller], options[:action]]
|
|
17
|
+
elsif options.key?(:controller) && options.key?(:to)
|
|
18
|
+
action = options[:to].split('#').last
|
|
19
|
+
[options[:controller], action]
|
|
20
|
+
elsif options.key?(:on)
|
|
21
|
+
handle_on!(options)
|
|
22
|
+
else
|
|
23
|
+
options[:to].split('#') # controller, action
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def handle_on!(options)
|
|
28
|
+
controller = @scope.options[:prefix].to_s
|
|
29
|
+
to = "#{controller}##{options[:path]}"
|
|
30
|
+
options[:to] = to
|
|
31
|
+
|
|
32
|
+
as = @options[:on] == :member ? controller.singularize : controller
|
|
33
|
+
as = "#{@options[:path]}_#{as}"
|
|
34
|
+
options[:as] = as
|
|
35
|
+
to.split('#')
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
data/lib/jets/router.rb
ADDED
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
require 'text-table'
|
|
2
|
+
|
|
3
|
+
module Jets
|
|
4
|
+
class Router
|
|
5
|
+
include Dsl
|
|
6
|
+
|
|
7
|
+
attr_reader :routes
|
|
8
|
+
def initialize
|
|
9
|
+
@routes = []
|
|
10
|
+
@scope = Scope.new
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def draw(&block)
|
|
14
|
+
instance_eval(&block)
|
|
15
|
+
check_collision!
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Validate routes that deployable
|
|
19
|
+
def check_collision!
|
|
20
|
+
paths = self.routes.map(&:path)
|
|
21
|
+
collision = Jets::Resource::ApiGateway::RestApi::Routes::Collision.new
|
|
22
|
+
collide = collision.collision?(paths)
|
|
23
|
+
raise collision.exception if collide
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def create_route(options)
|
|
27
|
+
# TODO: Can use it to add additional things like authorization_type
|
|
28
|
+
# Would be good to add authorization_type at the controller level also
|
|
29
|
+
infer_to_option!(options)
|
|
30
|
+
handle_on!(options)
|
|
31
|
+
MethodCreator.new(options, @scope).define_url_helper!
|
|
32
|
+
@routes << Route.new(options, @scope)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Can possibly infer to option from the path. Example:
|
|
36
|
+
#
|
|
37
|
+
# get 'posts/index'
|
|
38
|
+
# get 'posts', to: 'posts#index'
|
|
39
|
+
#
|
|
40
|
+
# get 'posts/show'
|
|
41
|
+
# get 'posts', to: 'posts#show'
|
|
42
|
+
#
|
|
43
|
+
def infer_to_option!(options)
|
|
44
|
+
return if options[:to]
|
|
45
|
+
|
|
46
|
+
path = options[:path].to_s
|
|
47
|
+
return unless path.include?('/')
|
|
48
|
+
|
|
49
|
+
items = path.split('/')
|
|
50
|
+
if items.size == 2
|
|
51
|
+
options[:to] = items.join('#')
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def handle_on!(options)
|
|
56
|
+
if options[:on] && !%w[resources resource].include?(@scope.from.to_s)
|
|
57
|
+
raise Error.new("ERROR: The `on:` option can only be used within a resource or resources block")
|
|
58
|
+
end
|
|
59
|
+
options[:on] ||= @on_option if @on_option
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def api_mode?
|
|
63
|
+
if Jets.config.key?(:api_mode) || Jets.config.key?(:api_generator)
|
|
64
|
+
puts <<~EOL.color(:yellow)
|
|
65
|
+
DEPRECATED: Jets.config.api_generator
|
|
66
|
+
Instead, please update your config/application.rb to use:
|
|
67
|
+
Jets.config.mode = 'api'
|
|
68
|
+
You can also run:
|
|
69
|
+
jets upgrade
|
|
70
|
+
EOL
|
|
71
|
+
end
|
|
72
|
+
api_mode = Jets.config.mode == 'api' || Jets.config.api_mode || Jets.config.api_generator
|
|
73
|
+
api_mode
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# Useful for creating API Gateway Resources
|
|
77
|
+
def all_paths
|
|
78
|
+
results = []
|
|
79
|
+
paths = routes.map(&:path)
|
|
80
|
+
paths.each do |p|
|
|
81
|
+
sub_paths = []
|
|
82
|
+
parts = p.split('/')
|
|
83
|
+
until parts.empty?
|
|
84
|
+
parts.pop
|
|
85
|
+
sub_path = parts.join('/')
|
|
86
|
+
sub_paths << sub_path unless sub_path == ''
|
|
87
|
+
end
|
|
88
|
+
results += sub_paths
|
|
89
|
+
end
|
|
90
|
+
@all_paths = (results + paths).sort.uniq
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
# Useful for RouterMatcher
|
|
94
|
+
#
|
|
95
|
+
# Precedence:
|
|
96
|
+
# Routes with wildcards are considered after routes without wildcards
|
|
97
|
+
#
|
|
98
|
+
# Routes with fewer captures are ordered first since both
|
|
99
|
+
# /posts/:post_id/comments/new and /posts/:post_id/comments/:id are equally
|
|
100
|
+
# long
|
|
101
|
+
#
|
|
102
|
+
# Routes with the same amount of captures and wildcards are orderd so that
|
|
103
|
+
# the longest path is considered first since posts/:id and posts/:id/edit
|
|
104
|
+
# can both match.
|
|
105
|
+
def ordered_routes
|
|
106
|
+
length = Proc.new { |r| [r.path.count("*"), r.path.count(":"), r.path.length * -1] }
|
|
107
|
+
routes.sort_by(&length)
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
class << self
|
|
111
|
+
def has_controller?(name)
|
|
112
|
+
routes.detect { |r| r.controller_name == name }
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
# Class methods
|
|
116
|
+
def draw
|
|
117
|
+
drawn_router
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
@@drawn_router = nil
|
|
121
|
+
def drawn_router
|
|
122
|
+
return @@drawn_router if @@drawn_router
|
|
123
|
+
|
|
124
|
+
router = Jets.application.routes
|
|
125
|
+
@@drawn_router = router
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def clear!
|
|
129
|
+
@@drawn_router = nil
|
|
130
|
+
Jets::Router::Helpers::NamedRoutesHelper.clear!
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def routes
|
|
134
|
+
drawn_router.routes
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
# Returns all paths including subpaths.
|
|
138
|
+
# Example:
|
|
139
|
+
# Input: ["posts/:id/edit"]
|
|
140
|
+
# Output: ["posts", "posts/:id", "posts/:id/edit"]
|
|
141
|
+
def all_paths
|
|
142
|
+
drawn_router.all_paths
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
def help(routes)
|
|
146
|
+
return "Your routes table is empty." if routes.empty?
|
|
147
|
+
|
|
148
|
+
table = Text::Table.new
|
|
149
|
+
table.head = %w[As Verb Path Controller#action]
|
|
150
|
+
routes.each do |route|
|
|
151
|
+
table.rows << [route.as, route.method, route.path, route.to]
|
|
152
|
+
end
|
|
153
|
+
table
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def all_routes_valid?
|
|
157
|
+
invalid_routes.empty?
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def invalid_routes
|
|
161
|
+
routes.select { |r| !r.valid? }
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
def validate_routes!
|
|
165
|
+
check_route_connected_functions
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
# Checks that all routes are validate and have corresponding lambda functions
|
|
169
|
+
def check_route_connected_functions
|
|
170
|
+
return true if all_routes_valid?
|
|
171
|
+
|
|
172
|
+
puts "Please double check the routes below map to valid controllers:".color(:red)
|
|
173
|
+
invalid_routes.each do |route|
|
|
174
|
+
puts " /#{route.path} => #{route.controller_name}##{route.action_name}"
|
|
175
|
+
end
|
|
176
|
+
false
|
|
177
|
+
end
|
|
178
|
+
end
|
|
179
|
+
end
|
|
180
|
+
end
|