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,145 @@
|
|
|
1
|
+
require "thor"
|
|
2
|
+
|
|
3
|
+
# Override thor's long_desc identation behavior
|
|
4
|
+
# https://github.com/erikhuda/thor/issues/398
|
|
5
|
+
class Thor
|
|
6
|
+
module Shell
|
|
7
|
+
class Basic
|
|
8
|
+
def print_wrapped(message, options = {})
|
|
9
|
+
message = "\n#{message}" unless message.starts_with?("\n")
|
|
10
|
+
stdout.puts message
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
class Jets::Commands::Base < Thor
|
|
17
|
+
class << self
|
|
18
|
+
extend Memoist
|
|
19
|
+
|
|
20
|
+
# thor_args is an array of commands. Examples:
|
|
21
|
+
# ["help"]
|
|
22
|
+
# ["dynamodb:migrate"]
|
|
23
|
+
#
|
|
24
|
+
# Same signature as RakeCommand.perform. Not using full_command.
|
|
25
|
+
def perform(full_command, thor_args)
|
|
26
|
+
config = {} # doesnt seem like config is used
|
|
27
|
+
dispatch(nil, thor_args, nil, config)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Hacky way to handle error for 'jets new' when no project name is passed in to avoid
|
|
31
|
+
# this error:
|
|
32
|
+
#
|
|
33
|
+
# required arguments 'project_name' (Thor::RequiredArgumentMissingError)
|
|
34
|
+
def dispatch(command, given_args, given_opts, config)
|
|
35
|
+
if given_args.reject{|s| s =~ /^-/} == ['new'] # user forgot to pass a project name
|
|
36
|
+
given_args = ['help', 'new']
|
|
37
|
+
end
|
|
38
|
+
super
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Track all command subclasses.
|
|
42
|
+
def subclasses
|
|
43
|
+
@subclasses ||= []
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def inherited(base)
|
|
47
|
+
super
|
|
48
|
+
|
|
49
|
+
if base.name
|
|
50
|
+
self.subclasses << base
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Fully qualifed task names. Examples:
|
|
55
|
+
# build
|
|
56
|
+
# process:controller
|
|
57
|
+
# dynamodb:migrate:down
|
|
58
|
+
def namespaced_commands
|
|
59
|
+
eager_load!
|
|
60
|
+
subclasses.map do |klass|
|
|
61
|
+
# This all_tasks is part of Thor not the lambda/dsl.rb
|
|
62
|
+
klass.all_tasks.keys.map do |task_name|
|
|
63
|
+
klass = klass.to_s.sub('Jets::Commands::','')
|
|
64
|
+
namespace = klass =~ /^Main/ ? nil : klass.underscore.gsub('/',':')
|
|
65
|
+
[namespace, task_name].compact.join(':')
|
|
66
|
+
end
|
|
67
|
+
end.flatten.sort
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Use Jets banner instead of Thor to account for namespaces in commands.
|
|
71
|
+
def banner(command, namespace = nil, subcommand = false)
|
|
72
|
+
namespace = namespace_from_class(self)
|
|
73
|
+
command_name = command.usage # set with desc when defining tht Thor class
|
|
74
|
+
namespaced_command = [namespace, command_name].compact.join(':')
|
|
75
|
+
|
|
76
|
+
"jets #{namespaced_command}"
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def namespace_from_class(klass)
|
|
80
|
+
namespace = klass.to_s.sub('Jets::Commands::', '').underscore.gsub('/',':')
|
|
81
|
+
namespace unless namespace == "main"
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def help_list(all=false)
|
|
85
|
+
# hack to show hidden comands when requested
|
|
86
|
+
Thor::HiddenCommand.class_eval do
|
|
87
|
+
def hidden?; false; end
|
|
88
|
+
end if all
|
|
89
|
+
|
|
90
|
+
list = []
|
|
91
|
+
eager_load!
|
|
92
|
+
subclasses.each do |klass|
|
|
93
|
+
commands = klass.printable_commands(true, false)
|
|
94
|
+
commands.reject! { |array| array[0].include?(':help') }
|
|
95
|
+
list += commands
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
list.sort_by! { |array| array[0] }
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def klass_from_namespace(namespace)
|
|
102
|
+
if namespace.nil?
|
|
103
|
+
Jets::Commands::Main
|
|
104
|
+
else
|
|
105
|
+
class_name = namespace.gsub(':','/')
|
|
106
|
+
class_name = "Jets::Commands::#{class_name.camelize}"
|
|
107
|
+
class_name.constantize
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# If this fails to find a match then return the original full command
|
|
112
|
+
def autocomplete(full_command)
|
|
113
|
+
return nil if full_command.nil? # jets help
|
|
114
|
+
|
|
115
|
+
eager_load!
|
|
116
|
+
|
|
117
|
+
words = full_command.split(':')
|
|
118
|
+
namespace = words[0..-2].join(':') if words.size > 1
|
|
119
|
+
command = words.last
|
|
120
|
+
|
|
121
|
+
# Thor's normalize_command_name autocompletes the command but then we need to add the namespace back
|
|
122
|
+
begin
|
|
123
|
+
thor_subclass = klass_from_namespace(namespace) # could NameError
|
|
124
|
+
command = thor_subclass.normalize_command_name(command) # could Thor::AmbiguousCommandError
|
|
125
|
+
[namespace, command].compact.join(':')
|
|
126
|
+
rescue NameError
|
|
127
|
+
full_command # return original full_command
|
|
128
|
+
rescue Thor::AmbiguousCommandError => e
|
|
129
|
+
puts "Unable to autodetect the command name. #{e.message}."
|
|
130
|
+
full_command # return original full_command
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# For help menu to list all commands, we must eager load the command classes.
|
|
135
|
+
#
|
|
136
|
+
# There is special eager_load logic here because this is called super early as part of the CLI start.
|
|
137
|
+
# We cannot assume we have full access to to the project yet.
|
|
138
|
+
def eager_load!
|
|
139
|
+
return if Jets::Turbo.afterburner?
|
|
140
|
+
|
|
141
|
+
Jets::Autoloaders.cli.eager_load
|
|
142
|
+
end
|
|
143
|
+
memoize :eager_load!
|
|
144
|
+
end
|
|
145
|
+
end
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
require 'digest'
|
|
2
|
+
|
|
3
|
+
module Jets::Commands
|
|
4
|
+
class Build
|
|
5
|
+
include StackInfo
|
|
6
|
+
|
|
7
|
+
def initialize(options)
|
|
8
|
+
@options = options.dup
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def run
|
|
12
|
+
puts "Building project for Lambda..."
|
|
13
|
+
|
|
14
|
+
return if @options[:noop]
|
|
15
|
+
# run gets called from the CLI and does not have all the stack_options yet.
|
|
16
|
+
# We compute it and change the options early here.
|
|
17
|
+
@options.merge!(stack_type: stack_type, s3_bucket: s3_bucket)
|
|
18
|
+
build
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def build
|
|
22
|
+
build_code unless @options[:templates]
|
|
23
|
+
build_templates
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def build_code
|
|
27
|
+
Jets::Builders::CodeBuilder.new.build unless @options[:noop]
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def build_templates
|
|
31
|
+
puts "Building CloudFormation templates."
|
|
32
|
+
clean_templates
|
|
33
|
+
build_minimal_template
|
|
34
|
+
build_all_templates if full?
|
|
35
|
+
puts "Generated CloudFormation templates at #{Jets.build_root}/templates"
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def full?
|
|
39
|
+
@options[:templates] || @options[:stack_type] == :full
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def build_all_templates
|
|
43
|
+
# CloudFormation templates
|
|
44
|
+
# 1. Shared and authorizer templates - child templates needs them
|
|
45
|
+
build_api_gateway_templates
|
|
46
|
+
build_authorizer_templates # controllers can use these
|
|
47
|
+
# 2. Child templates - parent template needs them
|
|
48
|
+
build_app_child_templates
|
|
49
|
+
# 2. Child templates - parent template needs them
|
|
50
|
+
build_shared_resources_templates
|
|
51
|
+
# 4. Finally parent template
|
|
52
|
+
build_parent_template # must be called at the end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def build_minimal_template
|
|
56
|
+
Jets::Cfn::Builders::ParentBuilder.new(@options).build(parent=true)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def build_api_gateway_templates
|
|
60
|
+
Jets::Cfn::Builders::ApiGatewayBuilder.new(@options).build
|
|
61
|
+
Jets::Cfn::Builders::ApiDeploymentBuilder.new(@options).build
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def build_authorizer_templates
|
|
65
|
+
authorizer_files.each do |path|
|
|
66
|
+
Jets::Cfn::Builders::AuthorizerBuilder.new(path).build
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def build_app_child_templates
|
|
71
|
+
app_files.each do |path|
|
|
72
|
+
build_child_template(path)
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def build_shared_resources_templates
|
|
77
|
+
Jets::Stack.subclasses.each do |subclass|
|
|
78
|
+
Jets::Cfn::Builders::SharedBuilder.new(subclass).build
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# path: app/controllers/comments_controller.rb
|
|
83
|
+
# path: app/jobs/easy_job.rb
|
|
84
|
+
def build_child_template(path)
|
|
85
|
+
return if authorizer?(path) # AuthorizerBuilder is built earlier
|
|
86
|
+
|
|
87
|
+
md = path.match(%r{app/(.*?)/}) # extract: controller, job or function
|
|
88
|
+
process_class = md[1].classify
|
|
89
|
+
builder_class = "Jets::Cfn::Builders::#{process_class}Builder".constantize
|
|
90
|
+
|
|
91
|
+
# Examples:
|
|
92
|
+
# Jets::Cfn::Builders::ControllerBuilder.new(PostsController)
|
|
93
|
+
# Jets::Cfn::Builders::JobBuilder.new(EasyJob)
|
|
94
|
+
# Jets::Cfn::Builders::RuleBuilder.new(CheckRule)
|
|
95
|
+
# Jets::Cfn::Builders::FunctionBuilder.new(Hello)
|
|
96
|
+
# Jets::Cfn::Builders::FunctionBuilder.new(HelloFunction)
|
|
97
|
+
app_class = Jets::Klass.from_path(path)
|
|
98
|
+
if Jets.poly_only? && app_class == Jets::PreheatJob
|
|
99
|
+
return # No prewarm when there's only poly functions
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
builder = builder_class.new(app_class)
|
|
103
|
+
builder.build
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def authorizer?(path)
|
|
107
|
+
path.include?("app/authorizers")
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def build_parent_template
|
|
111
|
+
Jets::Cfn::Builders::ParentBuilder.new(@options).build(parent=true)
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def clean_templates
|
|
115
|
+
FileUtils.rm_rf("#{Jets.build_root}/templates")
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def app_files
|
|
119
|
+
self.class.app_files
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def shared_files
|
|
123
|
+
self.class.shared_files
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def authorizer_files
|
|
127
|
+
self.class.authorizer_files
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
class << self
|
|
131
|
+
# Crucial that the Dir.pwd is in the tmp_code because for because Jets.boot set ups autoload_paths and this is
|
|
132
|
+
# how project classes are loaded.
|
|
133
|
+
# TODO: rework code so that Dir.pwd does not have to be in tmp_code for build to work.
|
|
134
|
+
#
|
|
135
|
+
# app_files used to determine what CloudFormation templates to build.
|
|
136
|
+
# app_files also used to determine what handlers to build.
|
|
137
|
+
def app_files
|
|
138
|
+
paths = []
|
|
139
|
+
expression = "#{Jets.root}/app/**/**/*.rb"
|
|
140
|
+
Dir.glob(expression).each do |path|
|
|
141
|
+
next unless app_file?(path)
|
|
142
|
+
relative_path = path.sub("#{Jets.root}/", '') # rid of the Jets.root at beginning
|
|
143
|
+
paths << relative_path
|
|
144
|
+
end
|
|
145
|
+
paths += internal_app_files
|
|
146
|
+
paths
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
APP_FOLDERS = %w[authorizers controllers functions jobs rules]
|
|
150
|
+
def app_file?(path)
|
|
151
|
+
return false unless File.extname(path) == ".rb"
|
|
152
|
+
return false unless File.file?(path) unless Jets.env.test?
|
|
153
|
+
return false if application_abstract_classes.detect { |p| path.include?(p) }
|
|
154
|
+
return false if concerns?(path)
|
|
155
|
+
return true if APP_FOLDERS.detect { |p| path.include?("app/#{p}") }
|
|
156
|
+
false
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
# Do not define lamda functions for abstract application parent classes. Examples:
|
|
160
|
+
#
|
|
161
|
+
# application_controller.rb
|
|
162
|
+
# application_job.rb
|
|
163
|
+
# application_authorizer.rb
|
|
164
|
+
def application_abstract_classes
|
|
165
|
+
APP_FOLDERS.map { |a| "application_#{a.singularize}.rb" }
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
def concerns?(path)
|
|
169
|
+
path =~ %r{app/\w+/concerns/}
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
def authorizer_files
|
|
173
|
+
app_files.select { |p| p.include?("app/authorizers") }
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
def shared_files
|
|
177
|
+
find_app_paths("shared/resources")
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
def find_app_paths(app_path)
|
|
181
|
+
paths = []
|
|
182
|
+
expression = "#{Jets.root}/app/#{app_path}/**/*.rb"
|
|
183
|
+
Dir.glob(expression).each do |path|
|
|
184
|
+
return false unless File.file?(path)
|
|
185
|
+
|
|
186
|
+
relative_path = path.sub("#{Jets.root}/", '')
|
|
187
|
+
# Rids of the Jets.root at beginning
|
|
188
|
+
paths << relative_path
|
|
189
|
+
end
|
|
190
|
+
paths
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
# Finds out of the app has polymorphic functions only and zero ruby functions.
|
|
194
|
+
# In this case, we can skip a lot of the ruby related building and speed up the
|
|
195
|
+
# deploy process.
|
|
196
|
+
def poly_only?
|
|
197
|
+
!app_has_ruby? && !shared_has_ruby?
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
def app_has_ruby?
|
|
201
|
+
has_ruby = app_files.detect do |path|
|
|
202
|
+
app_class = Jets::Klass.from_path(path) # IE: PostsController, Jets::PublicController
|
|
203
|
+
langs = app_class.tasks.map(&:lang)
|
|
204
|
+
langs.include?(:ruby) && app_class != Jets::PreheatJob
|
|
205
|
+
end
|
|
206
|
+
!!has_ruby
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
def shared_has_ruby?
|
|
210
|
+
has_ruby = false
|
|
211
|
+
Jets::Stack.subclasses.each do |klass|
|
|
212
|
+
klass.functions.each do |fun|
|
|
213
|
+
if fun.lang == :ruby
|
|
214
|
+
has_ruby = true
|
|
215
|
+
break
|
|
216
|
+
end
|
|
217
|
+
end
|
|
218
|
+
end
|
|
219
|
+
has_ruby
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
# Add internal Jets controllers if they are being used
|
|
223
|
+
# TODO: Interesting, this eventually just used to generate handlers and controllers only.
|
|
224
|
+
# Maybe rename to make that clear.
|
|
225
|
+
# The copying of other internal files like views is done in builders/code_builder.rb copy_internal_jets_code
|
|
226
|
+
def internal_app_files
|
|
227
|
+
paths = []
|
|
228
|
+
internal = File.expand_path("../internal", __dir__)
|
|
229
|
+
|
|
230
|
+
controllers = "#{internal}/app/controllers/jets"
|
|
231
|
+
paths << "#{controllers}/public_controller.rb" if router_has?("Jets::PublicController")
|
|
232
|
+
paths << "#{controllers}/rack_controller.rb" if router_has?("Jets::RackController")
|
|
233
|
+
paths << "#{controllers}/mailers_controller.rb" if router_has?("Jets::MailersController")
|
|
234
|
+
paths << "#{controllers}/mount_controller.rb" if router_has?("Jets::MountController")
|
|
235
|
+
|
|
236
|
+
if Jets.config.prewarm.enable
|
|
237
|
+
paths << "#{internal}/app/jobs/jets/preheat_job.rb"
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
paths
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
def router_has?(controller)
|
|
244
|
+
Jets::Router.has_controller?(controller)
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
def tmp_code(full_build_path=false)
|
|
248
|
+
full_build_path ? "#{Jets.build_root}/stage/code" : "stage/code"
|
|
249
|
+
end
|
|
250
|
+
end
|
|
251
|
+
end
|
|
252
|
+
end
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
class Jets::Commands::Call
|
|
2
|
+
class AnonymousGuesser < BaseGuesser
|
|
3
|
+
def detect_class_name
|
|
4
|
+
found_path = function_paths.find do |path|
|
|
5
|
+
File.exist?("#{Jets.root}/#{path}")
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
klass = Jets::Klass.from_path(found_path) if found_path
|
|
9
|
+
klass.to_s
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def method_name
|
|
13
|
+
return @method_name if defined?(@method_name)
|
|
14
|
+
|
|
15
|
+
full_function_name = @provided_function_name.underscore
|
|
16
|
+
underscored_class_name = class_name.underscore
|
|
17
|
+
meth = full_function_name.sub("#{underscored_class_name}_","")
|
|
18
|
+
|
|
19
|
+
if meth == class_name.constantize.handler.to_s
|
|
20
|
+
@method_name = meth
|
|
21
|
+
else
|
|
22
|
+
@method_name_error = "#{class_name} class found but #{meth} method not found"
|
|
23
|
+
@method_name = nil
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Useful to printing out what was attempted to look up
|
|
28
|
+
def error_message
|
|
29
|
+
guess_paths = function_paths
|
|
30
|
+
puts "Unable to find the function to call."
|
|
31
|
+
if class_name and !method_name
|
|
32
|
+
puts @method_name_error
|
|
33
|
+
else
|
|
34
|
+
puts "Tried: #{guess_paths.join(', ')}"
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def function_filenames(meth=nil, primary_namespace=nil)
|
|
39
|
+
guesses = []
|
|
40
|
+
parts = meth.split('_')
|
|
41
|
+
|
|
42
|
+
if primary_namespace.nil?
|
|
43
|
+
guesses << meth
|
|
44
|
+
|
|
45
|
+
if parts.size == 1 # already on final_primary_namespace
|
|
46
|
+
return guesses # end of recursion
|
|
47
|
+
else
|
|
48
|
+
next_primary_namespace = parts.first
|
|
49
|
+
guesses += function_filenames(meth, next_primary_namespace) # start of recursion
|
|
50
|
+
return guesses # return early
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
next_meth = meth.sub("#{primary_namespace}_", '')
|
|
55
|
+
next_parts = next_meth.split('_')
|
|
56
|
+
|
|
57
|
+
# Takes the next_parts and creates guesses with the parts joined by '/'
|
|
58
|
+
# with the primary_namespace prepended. So if next_parts is
|
|
59
|
+
# ["long", "name", "function"] and primary_namespace is "complex"
|
|
60
|
+
#
|
|
61
|
+
# guesses that get added:
|
|
62
|
+
#
|
|
63
|
+
# [
|
|
64
|
+
# "complex/long_name_function",
|
|
65
|
+
# "complex/long/name_function",
|
|
66
|
+
# "complex/long/name/function",
|
|
67
|
+
# ]
|
|
68
|
+
n = next_parts.size + 1
|
|
69
|
+
next_parts.size.times do |i|
|
|
70
|
+
namespace = i == 0 ? nil : next_parts[0..i-1].join('/')
|
|
71
|
+
class_path = next_parts[i..-1].join('_')
|
|
72
|
+
guesses << [primary_namespace, namespace, class_path].compact.join('/')
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
final_primary_namespace = parts[0..-2].join('_')
|
|
76
|
+
if primary_namespace == final_primary_namespace
|
|
77
|
+
return guesses # end of recursion
|
|
78
|
+
else
|
|
79
|
+
namespace_size = parts.size - next_parts.size
|
|
80
|
+
next_primary_namespace = parts[0..namespace_size].join('_')
|
|
81
|
+
guesses += function_filenames(meth, next_primary_namespace)
|
|
82
|
+
return guesses
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def function_paths
|
|
87
|
+
# drop the last word for starting filename
|
|
88
|
+
starting_filename = @provided_function_name.underscore.split('_')[0..-2].join('_')
|
|
89
|
+
filenames = function_filenames(starting_filename)
|
|
90
|
+
filenames.map do |name|
|
|
91
|
+
"app/functions/#{name}.rb"
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
end
|
|
96
|
+
end
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
class Jets::Commands::Call
|
|
2
|
+
class AutoloadGuesser < BaseGuesser
|
|
3
|
+
def detect_class_name
|
|
4
|
+
# First guess the class name assuming simple
|
|
5
|
+
class_name = simple_detect_class_name
|
|
6
|
+
return class_name if class_name
|
|
7
|
+
|
|
8
|
+
guess_classes.each do |class_name_guess|
|
|
9
|
+
begin
|
|
10
|
+
class_name_guess.constantize
|
|
11
|
+
return class_name_guess # if there's no error then the class is found
|
|
12
|
+
rescue NameError
|
|
13
|
+
if out_of_guesses(class_name_guess)
|
|
14
|
+
# puts "Unable to find the class to call. Tried guessing: #{guess_classes[0..-2].join(', ')}."
|
|
15
|
+
# raise # re-raise NameError for now but maybe better to provide
|
|
16
|
+
# a custom error class, so we can rescue it and provide a
|
|
17
|
+
# friendly message to the user
|
|
18
|
+
else
|
|
19
|
+
next
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
nil
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Can guess name by looking at underscore and dashes.
|
|
28
|
+
#
|
|
29
|
+
# Example:
|
|
30
|
+
#
|
|
31
|
+
# @provided_function_name: first_module-lost_controller-index
|
|
32
|
+
# return: FirstModule::LostController
|
|
33
|
+
#
|
|
34
|
+
def simple_detect_class_name
|
|
35
|
+
parts = @provided_function_name.split('-')
|
|
36
|
+
namespace = parts[0..-3].join('/')
|
|
37
|
+
controller = parts[-2..-2] # dont include the action
|
|
38
|
+
class_name = [namespace, controller].reject {|s| s.empty?}.compact.join('/').camelize
|
|
39
|
+
begin
|
|
40
|
+
class_name.constantize
|
|
41
|
+
return class_name
|
|
42
|
+
rescue NameError
|
|
43
|
+
nil
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def method_name
|
|
48
|
+
return @method_name if defined?(@method_name)
|
|
49
|
+
return nil unless class_name
|
|
50
|
+
|
|
51
|
+
underscored_class_name = class_name.underscore.gsub('/','_')
|
|
52
|
+
underscored_function_name = @provided_function_name.underscore.gsub('/','_')
|
|
53
|
+
meth = underscored_function_name.sub(underscored_class_name, '')
|
|
54
|
+
meth = meth.sub(/^[-_]/,'') # remove leading _ or -
|
|
55
|
+
|
|
56
|
+
if class_name.constantize.tasks.map(&:meth).include?(meth.to_sym)
|
|
57
|
+
@method_name = meth
|
|
58
|
+
else
|
|
59
|
+
@method_name_error ="#{class_name} class found but #{meth} method not found"
|
|
60
|
+
@method_name = nil
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Useful to printing out what was attempted to look up
|
|
65
|
+
def error_message
|
|
66
|
+
guesses = guess_classes
|
|
67
|
+
puts "Unable to find the function to call."
|
|
68
|
+
if class_name and !method_name
|
|
69
|
+
puts @method_name_error
|
|
70
|
+
else
|
|
71
|
+
puts "Tried: #{guesses.join(', ')}"
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def process_type
|
|
76
|
+
if @provided_function_name =~ /[-_]controller/
|
|
77
|
+
"controller"
|
|
78
|
+
elsif @provided_function_name =~ /[-_]job/
|
|
79
|
+
"job"
|
|
80
|
+
elsif @provided_function_name =~ /[-_]rule/
|
|
81
|
+
"rule"
|
|
82
|
+
else
|
|
83
|
+
"function"
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def process_type_pattern
|
|
88
|
+
Regexp.new("[-_]#{process_type}[-_](.*)")
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# Strips the action because we dont want it to guess the class name
|
|
92
|
+
# So:
|
|
93
|
+
# admin-related-pages => admin_related_pages_controller
|
|
94
|
+
def underscored_name
|
|
95
|
+
# strip action and concidentally the _controller_ string
|
|
96
|
+
name = @provided_function_name.sub(process_type_pattern,'')
|
|
97
|
+
# Ensure _controller or _job at the end except for simple functions
|
|
98
|
+
unless process_type == "function"
|
|
99
|
+
name = name.gsub('-','_') + "_#{process_type}"
|
|
100
|
+
end
|
|
101
|
+
name
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# Guesses autoload paths.
|
|
105
|
+
#
|
|
106
|
+
# underscored_name: admin_related_pages_controller
|
|
107
|
+
# Returns:
|
|
108
|
+
# [
|
|
109
|
+
# "admin_related_pages_controller",
|
|
110
|
+
# "admin/related_pages_controller",
|
|
111
|
+
# "admin_related/pages_controller",
|
|
112
|
+
# "admin_related_pages/controller",
|
|
113
|
+
# ]
|
|
114
|
+
def autoload_paths
|
|
115
|
+
guesses = []
|
|
116
|
+
|
|
117
|
+
parts = underscored_name.split('_')
|
|
118
|
+
parts.size.times do |i|
|
|
119
|
+
namespace = i == 0 ? nil : parts[0..i-1].join('/')
|
|
120
|
+
class_path = parts[i..-1].join('_')
|
|
121
|
+
guesses << [namespace, class_path].compact.join('/')
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
guesses
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def guess_classes
|
|
128
|
+
autoload_paths.map(&:classify)
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def out_of_guesses(guess)
|
|
132
|
+
guess.include?("::Controller")
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
end
|
|
136
|
+
end
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# Subclasses of BaseGuessor must implement interface:
|
|
2
|
+
# detect_class_name
|
|
3
|
+
# method_name
|
|
4
|
+
# error_message
|
|
5
|
+
#
|
|
6
|
+
class Jets::Commands::Call
|
|
7
|
+
class BaseGuesser
|
|
8
|
+
include Jets::AwsServices
|
|
9
|
+
|
|
10
|
+
# provided_function_name:
|
|
11
|
+
# admin/related_pages_controller-list_all
|
|
12
|
+
# admin-related-pages-controller-list-all
|
|
13
|
+
def initialize(provided_function_name)
|
|
14
|
+
@provided_function_name = provided_function_name
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def class_name
|
|
18
|
+
return @class_name if @detection_ran
|
|
19
|
+
|
|
20
|
+
@class_name = detect_class_name
|
|
21
|
+
@detection_ran = true
|
|
22
|
+
@class_name
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def function_name
|
|
26
|
+
# Strip the project namespace if the user has accidentally added it
|
|
27
|
+
# Since we're going to automatically add it no matter what at the end
|
|
28
|
+
# and dont want the namespace to be included twice
|
|
29
|
+
@provided_function_name = @provided_function_name.sub("#{Jets.config.project_namespace}-", "")
|
|
30
|
+
|
|
31
|
+
code_path = class_name.underscore.gsub('/','-')
|
|
32
|
+
function_name = [Jets.config.project_namespace, code_path, method_name].join('-')
|
|
33
|
+
generated_function_name(function_name)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def generated_function_name(function_name)
|
|
37
|
+
if function_name.size > Jets::MAX_FUNCTION_NAME_SIZE # name generated by CloudFormation
|
|
38
|
+
logical_id = @class_name.gsub('::','')
|
|
39
|
+
|
|
40
|
+
parent_resources = stack_resources(parent_stack.stack_id)
|
|
41
|
+
app_stack = parent_resources.find { |s| s.logical_resource_id == logical_id }
|
|
42
|
+
|
|
43
|
+
resources = stack_resources(app_stack.physical_resource_id)
|
|
44
|
+
resource = resources.find { |r| r.logical_resource_id == method_name.camelize + "LambdaFunction" } # method_name only contains the method
|
|
45
|
+
resource.physical_resource_id # actual function name
|
|
46
|
+
else
|
|
47
|
+
function_name
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Class variable caches
|
|
52
|
+
@@stack_resources = {}
|
|
53
|
+
def stack_resources(stack_name)
|
|
54
|
+
@@stack_resources[stack_name] ||= cfn.describe_stack_resources(stack_name: stack_name).stack_resources
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
@@parent_stack = nil
|
|
58
|
+
def parent_stack
|
|
59
|
+
@@parent_stack ||= cfn.describe_stacks(stack_name: Jets::Naming.parent_stack_name).stacks.first
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|