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,42 @@
|
|
|
1
|
+
class Jets::Resource
|
|
2
|
+
class Standardizer
|
|
3
|
+
attr_reader :definition
|
|
4
|
+
def initialize(*definition)
|
|
5
|
+
@definition = definition.flatten
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def template
|
|
9
|
+
camelize(standarize(@definition))
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def camelize(attributes)
|
|
13
|
+
Jets::Camelizer.transform(attributes)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def standarize(definition)
|
|
17
|
+
first, second, third, _ = definition
|
|
18
|
+
if definition.size == 1 && first.is_a?(Hash) # long form
|
|
19
|
+
first # pass through
|
|
20
|
+
elsif definition.size == 2 && second.is_a?(Hash) # medium form
|
|
21
|
+
logical_id, attributes = first, second
|
|
22
|
+
attributes.delete(:properties) if attributes[:properties].nil? || attributes[:properties].empty?
|
|
23
|
+
{ logical_id => attributes }
|
|
24
|
+
elsif definition.size == 2 && second.is_a?(String) # short form
|
|
25
|
+
logical_id, type = first, second
|
|
26
|
+
{ logical_id => {
|
|
27
|
+
type: type
|
|
28
|
+
}}
|
|
29
|
+
elsif definition.size == 3 && (second.is_a?(String) || second.is_a?(NilClass))# short form
|
|
30
|
+
logical_id, type, properties = first, second, third
|
|
31
|
+
template = { logical_id => {
|
|
32
|
+
type: type
|
|
33
|
+
}}
|
|
34
|
+
attributes = template.values.first
|
|
35
|
+
attributes[:properties] = properties unless properties.empty?
|
|
36
|
+
template
|
|
37
|
+
else # Dont understand this form
|
|
38
|
+
raise "Invalid form provided. definition #{definition.inspect}"
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
class Jets::Resource
|
|
2
|
+
extend Memoist
|
|
3
|
+
|
|
4
|
+
attr_reader :definition, :replacements
|
|
5
|
+
def initialize(definition, replacements={})
|
|
6
|
+
@definition = definition
|
|
7
|
+
@replacements = replacements
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def template
|
|
11
|
+
standarize(definition)
|
|
12
|
+
end
|
|
13
|
+
memoize :template
|
|
14
|
+
|
|
15
|
+
# CloudFormation Resources reference: https://amzn.to/2NKg6ip
|
|
16
|
+
def standarize(*definition)
|
|
17
|
+
Standardizer.new(definition).template
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def logical_id
|
|
21
|
+
id = template.keys.first
|
|
22
|
+
# replace possible {namespace} in the logical id
|
|
23
|
+
id = replacer.replace_value(id)
|
|
24
|
+
id = Jets::Camelizer.camelize(id)
|
|
25
|
+
|
|
26
|
+
Jets::Resource.truncate_id(id)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def self.truncate_id(id, postfix = '')
|
|
30
|
+
# Api Gateway resource name has a limit of 64 characters.
|
|
31
|
+
# Yet it throws not found when ID is longer than 62 characters and I don't know why.
|
|
32
|
+
# To keep it safe, let's stick to the 62 characters limit.
|
|
33
|
+
if id.size + postfix.size > 62
|
|
34
|
+
"#{id[0..(55 - postfix.size)]}#{Digest::MD5.hexdigest(id)[0..5]}#{postfix}"
|
|
35
|
+
else
|
|
36
|
+
"#{id}#{postfix}"
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def type
|
|
41
|
+
attributes['Type']
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def properties
|
|
45
|
+
attributes['Properties']
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def attributes
|
|
49
|
+
attributes = template.values.first
|
|
50
|
+
attributes = replacer.replace_placeholders(attributes)
|
|
51
|
+
Jets::Camelizer.transform(attributes)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def parameters
|
|
55
|
+
{}
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def outputs
|
|
59
|
+
{}
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def replacer
|
|
63
|
+
Replacer.new(replacements)
|
|
64
|
+
end
|
|
65
|
+
memoize :replacer
|
|
66
|
+
|
|
67
|
+
def permission
|
|
68
|
+
Permission.new(replacements, self)
|
|
69
|
+
end
|
|
70
|
+
memoize :permission
|
|
71
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
module Jets::Router::Dsl
|
|
2
|
+
module Mount
|
|
3
|
+
# The mounted class must be a Rack compatiable class
|
|
4
|
+
def mount(klass, at:)
|
|
5
|
+
options = {to: "jets/mount#call", mount_class: klass}
|
|
6
|
+
at = at[1..-1] if at.starts_with?('/') # be more forgiving if / accidentally included
|
|
7
|
+
at_wildcard = at.blank? ? "*path" : "#{at}/*path"
|
|
8
|
+
|
|
9
|
+
any at, options
|
|
10
|
+
any at_wildcard, options
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
class Jets::Router
|
|
2
|
+
module Dsl
|
|
3
|
+
include Mount
|
|
4
|
+
|
|
5
|
+
# Methods supported by API Gateway
|
|
6
|
+
%w[any delete get head options patch post put].each do |method_name|
|
|
7
|
+
define_method method_name do |path, options={}|
|
|
8
|
+
create_route(options.merge(path: escape_path(path), method: __method__))
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def namespace(ns, &block)
|
|
13
|
+
scope(module: ns, prefix: ns, as: ns, from: :namespace, &block)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def prefix(prefix, &block)
|
|
17
|
+
scope(prefix: prefix, &block)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# scope supports three options: module, prefix and as.
|
|
21
|
+
# Jets vs Rails:
|
|
22
|
+
# module - module
|
|
23
|
+
# prefix - path
|
|
24
|
+
# as - as
|
|
25
|
+
def scope(args)
|
|
26
|
+
# normalizes `scope(:admin)` as `scope(prefix: :admin)`
|
|
27
|
+
options = case args
|
|
28
|
+
when Hash
|
|
29
|
+
args
|
|
30
|
+
when String, Symbol
|
|
31
|
+
{ prefix: args }
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
root_level = @scope.nil?
|
|
35
|
+
@scope = root_level ? Scope.new(options) : @scope.new(options)
|
|
36
|
+
yield
|
|
37
|
+
ensure
|
|
38
|
+
@scope = @scope.parent if @scope
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# resources macro expands to all the routes
|
|
42
|
+
def resources(*items, **options)
|
|
43
|
+
items.each do |item|
|
|
44
|
+
scope_options = scope_options!(item, options)
|
|
45
|
+
scope_options[:from] = :resources # flag for MethodCreator logic: to handle method_name_leaf and more
|
|
46
|
+
scope(scope_options) do
|
|
47
|
+
each_resources(item, options, block_given?)
|
|
48
|
+
yield if block_given?
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def scope_options!(item, options)
|
|
54
|
+
prefix = if options[:prefix]
|
|
55
|
+
# prefix given from the resources macro get automatically prepended to the item name
|
|
56
|
+
p = options.delete(:prefix)
|
|
57
|
+
"#{p}/#{item}"
|
|
58
|
+
else
|
|
59
|
+
item
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
{
|
|
63
|
+
as: options.delete(:as) || item, # delete as or it messes with create_route
|
|
64
|
+
prefix: prefix,
|
|
65
|
+
param: options[:param],
|
|
66
|
+
# module: options.delete(:module) || item, # NOTE: resources does not automatically set module, but namespace does
|
|
67
|
+
}
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def each_resources(name, options={}, has_block=nil)
|
|
71
|
+
o = Resources::Options.new(name, options)
|
|
72
|
+
f = Resources::Filter.new(name, options)
|
|
73
|
+
param = default_param(has_block, name, options)
|
|
74
|
+
|
|
75
|
+
get name, o.build(:index) if f.yes?(:index)
|
|
76
|
+
get "#{name}/new", o.build(:new) if f.yes?(:new) && !api_mode?
|
|
77
|
+
get "#{name}/:#{param}", o.build(:show) if f.yes?(:show)
|
|
78
|
+
post name, o.build(:create) if f.yes?(:create)
|
|
79
|
+
get "#{name}/:#{param}/edit", o.build(:edit) if f.yes?(:edit) && !api_mode?
|
|
80
|
+
put "#{name}/:#{param}", o.build(:update) if f.yes?(:update)
|
|
81
|
+
post "#{name}/:#{param}", o.build(:update) if f.yes?(:update) # for binary uploads
|
|
82
|
+
patch "#{name}/:#{param}", o.build(:update) if f.yes?(:update)
|
|
83
|
+
delete "#{name}/:#{param}", o.build(:delete) if f.yes?(:delete)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def resource(*items, **options)
|
|
87
|
+
items.each do |item|
|
|
88
|
+
scope_options = scope_options!(item, options)
|
|
89
|
+
scope_options[:from] = :resource # flag for MethodCreator logic: to handle method_name_leaf and more
|
|
90
|
+
scope(scope_options) do
|
|
91
|
+
each_resource(item, options, block_given?)
|
|
92
|
+
yield if block_given?
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def each_resource(name, options={}, has_block=nil)
|
|
98
|
+
o = Resources::Options.new(name, options.merge(singular_resource: true))
|
|
99
|
+
f = Resources::Filter.new(name, options)
|
|
100
|
+
|
|
101
|
+
get "#{name}/new", o.build(:new) if f.yes?(:new) && !api_mode?
|
|
102
|
+
get name, o.build(:show) if f.yes?(:show)
|
|
103
|
+
post name, o.build(:create) if f.yes?(:create)
|
|
104
|
+
get "#{name}/edit", o.build(:edit) if f.yes?(:edit) && !api_mode?
|
|
105
|
+
put name, o.build(:update) if f.yes?(:update)
|
|
106
|
+
post name, o.build(:update) if f.yes?(:update) # for binary uploads
|
|
107
|
+
patch name, o.build(:update) if f.yes?(:update)
|
|
108
|
+
delete name, o.build(:delete) if f.yes?(:delete)
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def member
|
|
112
|
+
@on_option = :member
|
|
113
|
+
yield
|
|
114
|
+
@on_option = nil
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def collection
|
|
118
|
+
@on_option = :collection
|
|
119
|
+
yield
|
|
120
|
+
@on_option = nil
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
# If a block has pass then we assume the resources will be nested and then prefix
|
|
124
|
+
# the param name with the resource. IE: post_id instead of id
|
|
125
|
+
# This avoids an API Gateway parent sibling variable collision.
|
|
126
|
+
def default_param(has_block, name, options)
|
|
127
|
+
default_param = has_block ? "#{name.to_s.singularize}_id".to_sym : :id
|
|
128
|
+
options[:param] || default_param
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
# root "posts#index"
|
|
132
|
+
def root(to, options={})
|
|
133
|
+
default = {path: '', to: to, method: :get, root: true}
|
|
134
|
+
options = default.merge(options)
|
|
135
|
+
MethodCreator.new(options, @scope).create_root_helper
|
|
136
|
+
@routes << Route.new(options, @scope)
|
|
137
|
+
end
|
|
138
|
+
private
|
|
139
|
+
|
|
140
|
+
def escape_path(path)
|
|
141
|
+
path.to_s.split('/').map { |s| s =~ /\A[:\*]/ ? s : CGI.escape(s) }.join('/')
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
class Jets::Router
|
|
2
|
+
class Finder
|
|
3
|
+
extend Memoist
|
|
4
|
+
|
|
5
|
+
def initialize(path, method)
|
|
6
|
+
@path = path
|
|
7
|
+
@method = method.to_s.upcase
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def run
|
|
11
|
+
reset_routes!
|
|
12
|
+
# Precedence:
|
|
13
|
+
# 1. Routes with no captures get highest precedence: posts/new
|
|
14
|
+
# 2. Then we consider the routes with captures: post/:id
|
|
15
|
+
#
|
|
16
|
+
# Within these 2 groups we consider the routes with the longest path first
|
|
17
|
+
# since posts/:id and posts/:id/edit can both match.
|
|
18
|
+
routes = router.ordered_routes
|
|
19
|
+
route = routes.find do |r|
|
|
20
|
+
matcher.match?(r)
|
|
21
|
+
end
|
|
22
|
+
route
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
private
|
|
26
|
+
|
|
27
|
+
attr_reader :path, :method
|
|
28
|
+
|
|
29
|
+
# "hot reload" for development
|
|
30
|
+
def reset_routes!
|
|
31
|
+
return unless Jets.env.development?
|
|
32
|
+
|
|
33
|
+
Jets::Router.clear!
|
|
34
|
+
Jets.application.load_routes(refresh: true)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def matcher
|
|
38
|
+
Jets::Router::Matcher.new(path, method)
|
|
39
|
+
end
|
|
40
|
+
memoize :matcher
|
|
41
|
+
|
|
42
|
+
def router
|
|
43
|
+
Jets.application.routes
|
|
44
|
+
end
|
|
45
|
+
memoize :router
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
module Jets::Router::Helpers
|
|
2
|
+
module CoreHelper
|
|
3
|
+
extend ActiveSupport::Concern
|
|
4
|
+
|
|
5
|
+
# Used for form_for helper
|
|
6
|
+
def polymorphic_path(record, _)
|
|
7
|
+
url_for(record)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
# override helper delegates to point to jets controller
|
|
11
|
+
# TODO: params is weird
|
|
12
|
+
CONTROLLER_DELEGATES = %w[session response headers]
|
|
13
|
+
CONTROLLER_DELEGATES.each do |meth|
|
|
14
|
+
define_method meth do
|
|
15
|
+
@_jets[:controller].send(meth)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
class_methods do
|
|
20
|
+
def define_helper_method(name)
|
|
21
|
+
define_method(name) do
|
|
22
|
+
@_jets[:controller].send(name)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
class Jets::Router
|
|
2
|
+
class Matcher
|
|
3
|
+
def initialize(path, method)
|
|
4
|
+
@path = path.sub(/^\//,'')
|
|
5
|
+
@method = method.to_s.upcase
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def match?(route)
|
|
9
|
+
# Immediately stop checking when the request method: GET, POST, ANY, etc
|
|
10
|
+
# doesnt match.
|
|
11
|
+
|
|
12
|
+
return false if method != route.method && route.method != "ANY"
|
|
13
|
+
|
|
14
|
+
route_path = route.path
|
|
15
|
+
|
|
16
|
+
if path == route_path
|
|
17
|
+
# regular string match detection
|
|
18
|
+
return true # exact route matches are highest precedence
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# Check path for route capture and wildcard matches:
|
|
22
|
+
# A colon (:) means the variable has a variable
|
|
23
|
+
if route_path.include?(':') # 2nd highest precedence
|
|
24
|
+
capture_detection(route_path, path) # early return true or false
|
|
25
|
+
# A star (*) means the variable has a glob
|
|
26
|
+
elsif route_path.include?('*') # lowest precedence
|
|
27
|
+
proxy_detection(route_path, path) # early return true or false
|
|
28
|
+
else
|
|
29
|
+
false # reach here, means no route matched
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
private
|
|
34
|
+
|
|
35
|
+
attr_reader :path, :method
|
|
36
|
+
|
|
37
|
+
# catchall/globbing/wildcard/proxy routes. Examples:
|
|
38
|
+
#
|
|
39
|
+
# get "files/*path", to: "files#show"
|
|
40
|
+
# get "others/*rest", to: "others#show"
|
|
41
|
+
# get "*catchall", to: "public_files#show" # last catchall route for Jets
|
|
42
|
+
#
|
|
43
|
+
def proxy_detection(route_path, actual_path)
|
|
44
|
+
# drop the proxy_segment
|
|
45
|
+
leading_path = route_path.split('/')[0..-2].join('/')
|
|
46
|
+
|
|
47
|
+
# get "*catchall", to: "public_files#show"
|
|
48
|
+
if leading_path.empty? # This is the last catchall route "*catchall"
|
|
49
|
+
return true # always return true here because the entire path
|
|
50
|
+
# will always match
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Other types of wildcard route:
|
|
54
|
+
#
|
|
55
|
+
# get "files/*path", to: "files#show"
|
|
56
|
+
# get "others/*rest", to: "others#show"
|
|
57
|
+
unless leading_path.ends_with?('/')
|
|
58
|
+
# Ensure trailing slash to make pattern matching stricter
|
|
59
|
+
leading_path = "#{leading_path}/"
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
pattern = "^#{leading_path}"
|
|
63
|
+
regexp = Regexp.new(pattern)
|
|
64
|
+
!!regexp.match(actual_path) # could be true or false
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def capture_detection(route_path, actual_path)
|
|
68
|
+
# changes path to a string used for a regexp
|
|
69
|
+
# posts/:id/edit => posts\/(.*)\/edit
|
|
70
|
+
regexp_string = route_path.split('/').map do |s|
|
|
71
|
+
s.include?(':') ? Jets::Router::Route::CAPTURE_REGEX : s
|
|
72
|
+
end.join('\/')
|
|
73
|
+
# make sure beginning and end of the string matches
|
|
74
|
+
regexp_string = "^#{regexp_string}$"
|
|
75
|
+
|
|
76
|
+
regexp = Regexp.new(regexp_string)
|
|
77
|
+
|
|
78
|
+
!!regexp.match(actual_path) # could be true or false
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
class Jets::Router::MethodCreator
|
|
2
|
+
class Code
|
|
3
|
+
include Jets::Router::Util
|
|
4
|
+
|
|
5
|
+
def initialize(options, scope, controller, action=nil)
|
|
6
|
+
@options, @scope, @controller, @action = options, scope, controller, action
|
|
7
|
+
@path, @as = options[:path], options[:as]
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def meth_args
|
|
11
|
+
params = full_path.split('/').select { |x| x.include?(':') }
|
|
12
|
+
items = params.map { |x| x.sub(':','') }
|
|
13
|
+
|
|
14
|
+
items.empty? ? nil : "("+items.join(', ')+")"
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def meth_result
|
|
18
|
+
results = full_path.split('/').map do |x|
|
|
19
|
+
if x.include?(':')
|
|
20
|
+
variable = x.sub(':','')
|
|
21
|
+
"\#{#{variable}.to_param}"
|
|
22
|
+
else
|
|
23
|
+
x
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
'/' + results.join('/') unless results.empty?
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def full_path
|
|
31
|
+
route = Jets::Router::Route.new(@options, @scope)
|
|
32
|
+
route.compute_path
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def action
|
|
36
|
+
@action || self.class.name.split('::').last.downcase # MethodCreator::Edit, MethodCreator::New, etc
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def full_as
|
|
40
|
+
@scope&.full_as
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# The method_name_leaf is used to generate method names.
|
|
44
|
+
# Can be nil because sometimes the name is fully acquired from the scope.
|
|
45
|
+
def method_name_leaf
|
|
46
|
+
unless %w[resource resources].include?(@scope.from.to_s) && @options[:from_scope]
|
|
47
|
+
@controller
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def full_meth_name(suffix=nil)
|
|
52
|
+
as = @as || meth_name
|
|
53
|
+
name = [as, suffix].compact.join('_')
|
|
54
|
+
underscore(name)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def path_method
|
|
58
|
+
return if @as == :disabled
|
|
59
|
+
<<~EOL
|
|
60
|
+
def #{full_meth_name(:path)}#{meth_args}
|
|
61
|
+
"#{meth_result}"
|
|
62
|
+
end
|
|
63
|
+
EOL
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def url_method
|
|
67
|
+
return if @as == :disabled
|
|
68
|
+
path_method_call = "#{full_meth_name(:path)}#{meth_args}"
|
|
69
|
+
# Note: It is important lazily get the value of ENV['JETS_HOST'] within the method.
|
|
70
|
+
# Since it is not set until the request goes through the main middleware.
|
|
71
|
+
<<~EOL
|
|
72
|
+
def #{full_meth_name(:url)}#{meth_args}
|
|
73
|
+
"\#{ENV['JETS_HOST']}\#{#{path_method_call}}"
|
|
74
|
+
end
|
|
75
|
+
EOL
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def param_name(name)
|
|
79
|
+
# split('/').last for case:
|
|
80
|
+
#
|
|
81
|
+
# resources :posts, prefix: "articles", only: :index do
|
|
82
|
+
# resources :comments, only: :new
|
|
83
|
+
# end
|
|
84
|
+
#
|
|
85
|
+
# Since the prefix at the scope level is added to the posts item, which results in:
|
|
86
|
+
#
|
|
87
|
+
# param_name("articles/posts")
|
|
88
|
+
#
|
|
89
|
+
# We drop the articles prefix portion. The resources items can only be words with no /.
|
|
90
|
+
#
|
|
91
|
+
name.to_s.split('/').last.singularize + "_id"
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
private
|
|
95
|
+
def singularize(s)
|
|
96
|
+
s&.singularize
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
class Jets::Router::MethodCreator
|
|
2
|
+
class Edit < Code
|
|
3
|
+
def meth_name
|
|
4
|
+
path_items = @path.to_s.split('/')
|
|
5
|
+
if method_name_leaf && path_items.size != 3
|
|
6
|
+
nil # fallback: do not define url method
|
|
7
|
+
else # comes from resources
|
|
8
|
+
join(action, singularize(full_as), singularize(method_name_leaf))
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
class Jets::Router::MethodCreator
|
|
2
|
+
class Index < Code
|
|
3
|
+
def meth_name
|
|
4
|
+
# TODO: figure out how to improve this and make easier to follow.
|
|
5
|
+
#
|
|
6
|
+
# Example 1:
|
|
7
|
+
#
|
|
8
|
+
# resources :users, only: [] do
|
|
9
|
+
# resources :posts, only: :index
|
|
10
|
+
# end
|
|
11
|
+
#
|
|
12
|
+
# Results in:
|
|
13
|
+
#
|
|
14
|
+
# full_as: user_posts
|
|
15
|
+
# method_name_leaf: nil
|
|
16
|
+
#
|
|
17
|
+
# Example 2:
|
|
18
|
+
#
|
|
19
|
+
# resources :users, only: [] do
|
|
20
|
+
# get "posts", to: "posts#index"
|
|
21
|
+
# end
|
|
22
|
+
#
|
|
23
|
+
# Results in:
|
|
24
|
+
#
|
|
25
|
+
# full_as: users
|
|
26
|
+
# method_name_leaf: posts
|
|
27
|
+
#
|
|
28
|
+
# This is because using resources contains all the info we need in parent scopes.
|
|
29
|
+
# The scope.full_as already has the desired meth_name.
|
|
30
|
+
#
|
|
31
|
+
# However, when using the simple create_route methods like get, the parent scope does not contain
|
|
32
|
+
# all the info we need. In this tricky case, the method_name_leaf is set.
|
|
33
|
+
# We then have to reconstruct the meth_name.
|
|
34
|
+
#
|
|
35
|
+
|
|
36
|
+
if method_name_leaf
|
|
37
|
+
path_items = @path.to_s.split('/')
|
|
38
|
+
if path_items.size == 1
|
|
39
|
+
join(singularize(full_as), method_name_leaf) # reconstruct
|
|
40
|
+
else
|
|
41
|
+
nil # fallback: do not define url method
|
|
42
|
+
end
|
|
43
|
+
else # comes from resources
|
|
44
|
+
join(full_as) # construct entirely from scope info
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
class Jets::Router::MethodCreator
|
|
2
|
+
class New < Code
|
|
3
|
+
def meth_name
|
|
4
|
+
path_items = @path.to_s.split('/')
|
|
5
|
+
if method_name_leaf && path_items.size != 2
|
|
6
|
+
nil # fallback: do not define url method
|
|
7
|
+
else # comes from resources
|
|
8
|
+
join(action, singularize(full_as), singularize(method_name_leaf))
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
class Jets::Router::MethodCreator
|
|
2
|
+
class Show < Code
|
|
3
|
+
def meth_name
|
|
4
|
+
path_items = @path.to_s.split('/')
|
|
5
|
+
if method_name_leaf && path_items.size != 2
|
|
6
|
+
nil # fallback: do not define url method
|
|
7
|
+
else # comes from resources
|
|
8
|
+
join(singularize(full_as), singularize(method_name_leaf))
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|