jets_bb_fork 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.circleci/bin/commit_docs.sh +26 -0
- data/.circleci/config.yml +126 -0
- data/.codebuild/README.md +68 -0
- data/.codebuild/bin/jets +3 -0
- data/.codebuild/buildspec-base.yml +14 -0
- data/.codebuild/integration.sh +72 -0
- data/.codebuild/jets.postman_collection.json +323 -0
- data/.codebuild/scripts/install-docker.sh +12 -0
- data/.codebuild/scripts/install-dynamodb-local.sh +22 -0
- data/.codebuild/scripts/install-java.sh +22 -0
- data/.codebuild/scripts/install-node.sh +4 -0
- data/.github/ISSUE_TEMPLATE.md +7 -0
- data/.github/ISSUE_TEMPLATE/bug_report.md +84 -0
- data/.github/ISSUE_TEMPLATE/documentation.md +27 -0
- data/.github/ISSUE_TEMPLATE/feature_request.md +64 -0
- data/.github/ISSUE_TEMPLATE/question.md +16 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +42 -0
- data/.gitignore +24 -0
- data/.gitmodules +0 -0
- data/.python-version +1 -0
- data/.rspec +4 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +734 -0
- data/CONDUCT.md +1 -0
- data/CONTRIBUTING.md +1 -0
- data/Dockerfile +16 -0
- data/Dockerfile.base +53 -0
- data/Gemfile +14 -0
- data/Guardfile +22 -0
- data/LICENSE.txt +22 -0
- data/Procfile +2 -0
- data/README.md +203 -0
- data/Rakefile +24 -0
- data/backers.md +16 -0
- data/bin/release +9 -0
- data/buildspec.yml +18 -0
- data/exe/jets_bb_fork +14 -0
- data/jets.gemspec +68 -0
- data/lib/jets.rb +27 -0
- data/lib/jets/application.rb +216 -0
- data/lib/jets/application/defaults.rb +172 -0
- data/lib/jets/autoloaders.rb +97 -0
- data/lib/jets/aws_info.rb +113 -0
- data/lib/jets/aws_services.rb +65 -0
- data/lib/jets/aws_services/global_memoist.rb +57 -0
- data/lib/jets/aws_services/s3_bucket.rb +34 -0
- data/lib/jets/aws_services/stack_status.rb +59 -0
- data/lib/jets/booter.rb +119 -0
- data/lib/jets/builders/code_builder.rb +399 -0
- data/lib/jets/builders/code_size.rb +57 -0
- data/lib/jets/builders/gem_replacer.rb +76 -0
- data/lib/jets/builders/handler_generator.rb +186 -0
- data/lib/jets/builders/lambda_layer.rb +69 -0
- data/lib/jets/builders/md5.rb +60 -0
- data/lib/jets/builders/md5_zip.rb +61 -0
- data/lib/jets/builders/purger.rb +35 -0
- data/lib/jets/builders/rack_packager.rb +51 -0
- data/lib/jets/builders/rackup_wrappers/rackup +19 -0
- data/lib/jets/builders/rackup_wrappers/rackup.rb +7 -0
- data/lib/jets/builders/reconfigure_rails.rb +114 -0
- data/lib/jets/builders/reconfigure_rails/config/initializers/jets.rb +16 -0
- data/lib/jets/builders/ruby_packager.rb +207 -0
- data/lib/jets/builders/shim_vars/app.rb +78 -0
- data/lib/jets/builders/shim_vars/base.rb +25 -0
- data/lib/jets/builders/shim_vars/shared.rb +37 -0
- data/lib/jets/builders/templates/handler.rb +12 -0
- data/lib/jets/builders/tidy.rb +107 -0
- data/lib/jets/builders/util.rb +31 -0
- data/lib/jets/bundle.rb +82 -0
- data/lib/jets/camelizer.rb +71 -0
- data/lib/jets/cfn/builders/api_deployment_builder.rb +63 -0
- data/lib/jets/cfn/builders/api_gateway_builder.rb +157 -0
- data/lib/jets/cfn/builders/base_child_builder.rb +75 -0
- data/lib/jets/cfn/builders/controller_builder.rb +42 -0
- data/lib/jets/cfn/builders/function_builder.rb +14 -0
- data/lib/jets/cfn/builders/interface.rb +137 -0
- data/lib/jets/cfn/builders/job_builder.rb +14 -0
- data/lib/jets/cfn/builders/paged.rb +37 -0
- data/lib/jets/cfn/builders/parent_builder.rb +100 -0
- data/lib/jets/cfn/builders/rule_builder.rb +24 -0
- data/lib/jets/cfn/builders/shared_builder.rb +14 -0
- data/lib/jets/cfn/ship.rb +185 -0
- data/lib/jets/cfn/status.rb +212 -0
- data/lib/jets/cfn/upload.rb +139 -0
- data/lib/jets/cli.rb +194 -0
- data/lib/jets/commands/base.rb +146 -0
- data/lib/jets/commands/build.rb +234 -0
- data/lib/jets/commands/call.rb +169 -0
- data/lib/jets/commands/call/anonymous_guesser.rb +96 -0
- data/lib/jets/commands/call/autoload_guesser.rb +136 -0
- data/lib/jets/commands/call/base_guesser.rb +60 -0
- data/lib/jets/commands/call/guesser.rb +48 -0
- data/lib/jets/commands/clean.rb +19 -0
- data/lib/jets/commands/clean/base.rb +24 -0
- data/lib/jets/commands/clean/build.rb +13 -0
- data/lib/jets/commands/clean/log.rb +107 -0
- data/lib/jets/commands/console.rb +12 -0
- data/lib/jets/commands/db.rb +13 -0
- data/lib/jets/commands/db/environment-task.rake +3 -0
- data/lib/jets/commands/db/tasks.rb +44 -0
- data/lib/jets/commands/dbconsole.rb +131 -0
- data/lib/jets/commands/delete.rb +143 -0
- data/lib/jets/commands/deploy.rb +141 -0
- data/lib/jets/commands/dynamodb.rb +19 -0
- data/lib/jets/commands/dynamodb/migrate.rb +9 -0
- data/lib/jets/commands/dynamodb/migrator.rb +36 -0
- data/lib/jets/commands/gems.rb +21 -0
- data/lib/jets/commands/help.rb +9 -0
- data/lib/jets/commands/help/build.md +6 -0
- data/lib/jets/commands/help/call.md +61 -0
- data/lib/jets/commands/help/clean/build.md +5 -0
- data/lib/jets/commands/help/clean/log.md +5 -0
- data/lib/jets/commands/help/console.md +18 -0
- data/lib/jets/commands/help/db/generate.md +8 -0
- data/lib/jets/commands/help/dbconsole.md +9 -0
- data/lib/jets/commands/help/delete.md +22 -0
- data/lib/jets/commands/help/deploy.md +32 -0
- data/lib/jets/commands/help/destroy.md +16 -0
- data/lib/jets/commands/help/dynamodb/generate.md +52 -0
- data/lib/jets/commands/help/dynamodb/migrate.md +4 -0
- data/lib/jets/commands/help/gems/check.md +8 -0
- data/lib/jets/commands/help/generate.md +22 -0
- data/lib/jets/commands/help/import/rack.md +13 -0
- data/lib/jets/commands/help/import/rails.md +11 -0
- data/lib/jets/commands/help/new.md +42 -0
- data/lib/jets/commands/help/routes.md +16 -0
- data/lib/jets/commands/help/runner.md +17 -0
- data/lib/jets/commands/help/server.md +15 -0
- data/lib/jets/commands/help/status.md +14 -0
- data/lib/jets/commands/help/upgrade.md +5 -0
- data/lib/jets/commands/help/url.md +6 -0
- data/lib/jets/commands/import.rb +12 -0
- data/lib/jets/commands/import/base.rb +49 -0
- data/lib/jets/commands/import/cheatsheet.rb +35 -0
- data/lib/jets/commands/import/rack.rb +16 -0
- data/lib/jets/commands/import/rails.rb +74 -0
- data/lib/jets/commands/import/sequence.rb +90 -0
- data/lib/jets/commands/import/templates/config/database.yml +26 -0
- data/lib/jets/commands/import/templates/submodules-cheatsheet.md +89 -0
- data/lib/jets/commands/main.rb +157 -0
- data/lib/jets/commands/markdown/creator.rb +58 -0
- data/lib/jets/commands/markdown/index.rb +27 -0
- data/lib/jets/commands/markdown/page.rb +125 -0
- data/lib/jets/commands/markdown/shell.rb +11 -0
- data/lib/jets/commands/new.rb +157 -0
- data/lib/jets/commands/rake_command.rb +61 -0
- data/lib/jets/commands/rake_tasks.rb +46 -0
- data/lib/jets/commands/runner.rb +16 -0
- data/lib/jets/commands/sequence.rb +99 -0
- data/lib/jets/commands/stack_info.rb +30 -0
- data/lib/jets/commands/templates/skeleton/.gitignore +12 -0
- data/lib/jets/commands/templates/skeleton/.jetskeep +1 -0
- data/lib/jets/commands/templates/skeleton/.rspec +3 -0
- data/lib/jets/commands/templates/skeleton/Gemfile.tt +38 -0
- data/lib/jets/commands/templates/skeleton/Procfile +7 -0
- data/lib/jets/commands/templates/skeleton/README.md +11 -0
- data/lib/jets/commands/templates/skeleton/Rakefile +2 -0
- data/lib/jets/commands/templates/skeleton/app/controllers/application_controller.rb +2 -0
- data/lib/jets/commands/templates/skeleton/app/helpers/application_helper.rb +2 -0
- data/lib/jets/commands/templates/skeleton/app/jobs/application_job.rb +4 -0
- data/lib/jets/commands/templates/skeleton/app/models/application_item.rb +2 -0
- data/lib/jets/commands/templates/skeleton/app/models/application_record.rb +3 -0
- data/lib/jets/commands/templates/skeleton/app/views/layouts/application.html.erb.tt +25 -0
- data/lib/jets/commands/templates/skeleton/config.ru +5 -0
- data/lib/jets/commands/templates/skeleton/config/application.rb.tt +67 -0
- data/lib/jets/commands/templates/skeleton/config/database.yml.tt +26 -0
- data/lib/jets/commands/templates/skeleton/config/dynamodb.yml +22 -0
- data/lib/jets/commands/templates/skeleton/config/environments/development.rb +7 -0
- data/lib/jets/commands/templates/skeleton/config/environments/production.rb +9 -0
- data/lib/jets/commands/templates/skeleton/config/environments/test.rb +7 -0
- data/lib/jets/commands/templates/skeleton/config/routes.rb +9 -0
- data/lib/jets/commands/templates/skeleton/db/.gitkeep +0 -0
- data/lib/jets/commands/templates/skeleton/public/404.html +67 -0
- data/lib/jets/commands/templates/skeleton/public/422.html +67 -0
- data/lib/jets/commands/templates/skeleton/public/500.html +66 -0
- data/lib/jets/commands/templates/skeleton/public/favicon.ico +0 -0
- data/lib/jets/commands/templates/skeleton/public/index.html.tt +91 -0
- data/lib/jets/commands/templates/skeleton/spec/controllers/posts_controller_spec.rb +15 -0
- data/lib/jets/commands/templates/skeleton/spec/fixtures/payloads/posts-index.json +51 -0
- data/lib/jets/commands/templates/skeleton/spec/fixtures/payloads/posts-show.json +53 -0
- data/lib/jets/commands/templates/skeleton/spec/spec_helper.rb.tt +30 -0
- data/lib/jets/commands/templates/webpacker/app/javascript/packs/application.js.tt +14 -0
- data/lib/jets/commands/templates/webpacker/app/javascript/packs/theme.scss.tt +24 -0
- data/lib/jets/commands/templates/webpacker/app/javascript/src/jets/crud.js +87 -0
- data/lib/jets/commands/upgrade.rb +145 -0
- data/lib/jets/commands/upgrade/templates/bin/webpack +19 -0
- data/lib/jets/commands/upgrade/templates/bin/webpack-dev-server +19 -0
- data/lib/jets/commands/url.rb +68 -0
- data/lib/jets/commands/webpacker_template.rb +18 -0
- data/lib/jets/controller.rb +3 -0
- data/lib/jets/controller/base.rb +108 -0
- data/lib/jets/controller/callbacks.rb +68 -0
- data/lib/jets/controller/cookies.rb +38 -0
- data/lib/jets/controller/cookies/jar.rb +269 -0
- data/lib/jets/controller/layout.rb +17 -0
- data/lib/jets/controller/middleware/cors.rb +60 -0
- data/lib/jets/controller/middleware/local.rb +116 -0
- data/lib/jets/controller/middleware/local/api_gateway.rb +93 -0
- data/lib/jets/controller/middleware/local/mimic_aws_call.rb +38 -0
- data/lib/jets/controller/middleware/local/route_matcher.rb +106 -0
- data/lib/jets/controller/middleware/main.rb +46 -0
- data/lib/jets/controller/middleware/reloader.rb +15 -0
- data/lib/jets/controller/middleware/webpacker_setup.rb +6 -0
- data/lib/jets/controller/params.rb +87 -0
- data/lib/jets/controller/rack/adapter.rb +88 -0
- data/lib/jets/controller/rack/env.rb +105 -0
- data/lib/jets/controller/redirection.rb +55 -0
- data/lib/jets/controller/rendering.rb +79 -0
- data/lib/jets/controller/rendering/rack_renderer.rb +250 -0
- data/lib/jets/controller/request.rb +29 -0
- data/lib/jets/controller/response.rb +61 -0
- data/lib/jets/controller/stage.rb +33 -0
- data/lib/jets/core.rb +149 -0
- data/lib/jets/core_ext/kernel.rb +13 -0
- data/lib/jets/db.rb +15 -0
- data/lib/jets/dotenv.rb +48 -0
- data/lib/jets/dotenv/ssm.rb +48 -0
- data/lib/jets/erb.rb +51 -0
- data/lib/jets/generator.rb +48 -0
- data/lib/jets/generator/templates/erb/controller/view.html.erb +2 -0
- data/lib/jets/generator/templates/erb/scaffold/_form.html.erb +39 -0
- data/lib/jets/generator/templates/erb/scaffold/edit.html.erb +6 -0
- data/lib/jets/generator/templates/erb/scaffold/index.html.erb +29 -0
- data/lib/jets/generator/templates/erb/scaffold/new.html.erb +5 -0
- data/lib/jets/generator/templates/erb/scaffold/show.html.erb +9 -0
- data/lib/jets/generator/templates/rails/assets/javascript.js +2 -0
- data/lib/jets/generator/templates/rails/assets/stylesheet.css +4 -0
- data/lib/jets/generator/templates/rails/controller/controller.rb +13 -0
- data/lib/jets/generator/templates/rails/helper/helper.rb +4 -0
- data/lib/jets/generator/templates/rails/scaffold/scaffold.css +80 -0
- data/lib/jets/generator/templates/rails/scaffold_controller/api_controller.rb +62 -0
- data/lib/jets/generator/templates/rails/scaffold_controller/controller.rb +79 -0
- data/lib/jets/inflections.rb +32 -0
- data/lib/jets/internal/app/controllers/jets/mailers_controller.rb +97 -0
- data/lib/jets/internal/app/controllers/jets/public_controller.rb +31 -0
- data/lib/jets/internal/app/controllers/jets/rack_controller.rb +25 -0
- data/lib/jets/internal/app/functions/jets/base_path.rb +157 -0
- data/lib/jets/internal/app/helpers/jets/mailers_helper.rb +9 -0
- data/lib/jets/internal/app/jobs/jets/preheat_job.rb +70 -0
- data/lib/jets/internal/app/shared/functions/jets/s3_bucket_config.rb +43 -0
- data/lib/jets/internal/app/views/jets/mailers/email.html.erb +145 -0
- data/lib/jets/internal/app/views/jets/mailers/index.html.erb +8 -0
- data/lib/jets/internal/app/views/jets/mailers/mailer.html.erb +6 -0
- data/lib/jets/internal/turbines/jets/mailer.rb +51 -0
- data/lib/jets/job/base.rb +39 -0
- data/lib/jets/job/dsl.rb +40 -0
- data/lib/jets/job/dsl/dynamodb_event.rb +65 -0
- data/lib/jets/job/dsl/event_source_mapping.rb +11 -0
- data/lib/jets/job/dsl/iot_event.rb +24 -0
- data/lib/jets/job/dsl/kinesis_event.rb +46 -0
- data/lib/jets/job/dsl/log_event.rb +15 -0
- data/lib/jets/job/dsl/rule_event.rb +75 -0
- data/lib/jets/job/dsl/s3_event.rb +36 -0
- data/lib/jets/job/dsl/sns_event.rb +54 -0
- data/lib/jets/job/dsl/sqs_event.rb +96 -0
- data/lib/jets/job/helpers/kinesis_event_helper.rb +13 -0
- data/lib/jets/job/helpers/log_event_helper.rb +17 -0
- data/lib/jets/job/helpers/s3_event_helper.rb +13 -0
- data/lib/jets/klass.rb +109 -0
- data/lib/jets/lambda/dsl.rb +419 -0
- data/lib/jets/lambda/function.rb +29 -0
- data/lib/jets/lambda/function_constructor.rb +55 -0
- data/lib/jets/lambda/functions.rb +34 -0
- data/lib/jets/lambda/task.rb +111 -0
- data/lib/jets/logger.rb +21 -0
- data/lib/jets/mega/hash_converter.rb +25 -0
- data/lib/jets/mega/request.rb +139 -0
- data/lib/jets/mega/request/source.rb +21 -0
- data/lib/jets/middleware.rb +33 -0
- data/lib/jets/middleware/configurator.rb +84 -0
- data/lib/jets/middleware/default_stack.rb +51 -0
- data/lib/jets/middleware/layer.rb +34 -0
- data/lib/jets/middleware/stack.rb +77 -0
- data/lib/jets/naming.rb +49 -0
- data/lib/jets/overrides/lambda.rb +1 -0
- data/lib/jets/overrides/lambda/marshaller.rb +31 -0
- data/lib/jets/overrides/rails.rb +4 -0
- data/lib/jets/overrides/rails/asset_tag_helper.rb +114 -0
- data/lib/jets/overrides/rails/common_methods.rb +13 -0
- data/lib/jets/overrides/rails/rendering_helper.rb +26 -0
- data/lib/jets/overrides/rails/url_helper.rb +25 -0
- data/lib/jets/poly_fun.rb +73 -0
- data/lib/jets/poly_fun/base_executor.rb +125 -0
- data/lib/jets/poly_fun/lambda_executor.rb +16 -0
- data/lib/jets/poly_fun/node_error.rb +8 -0
- data/lib/jets/poly_fun/node_executor.rb +54 -0
- data/lib/jets/poly_fun/python_error.rb +8 -0
- data/lib/jets/poly_fun/python_executor.rb +23 -0
- data/lib/jets/preheat.rb +117 -0
- data/lib/jets/processors/deducer.rb +65 -0
- data/lib/jets/processors/main_processor.rb +61 -0
- data/lib/jets/rack_server.rb +86 -0
- data/lib/jets/rdoc.rb +30 -0
- data/lib/jets/resource.rb +71 -0
- data/lib/jets/resource/api_gateway/base_path/function.rb +42 -0
- data/lib/jets/resource/api_gateway/base_path/mapping.rb +44 -0
- data/lib/jets/resource/api_gateway/base_path/role.rb +76 -0
- data/lib/jets/resource/api_gateway/cors.rb +61 -0
- data/lib/jets/resource/api_gateway/deployment.rb +78 -0
- data/lib/jets/resource/api_gateway/domain_name.rb +59 -0
- data/lib/jets/resource/api_gateway/method.rb +98 -0
- data/lib/jets/resource/api_gateway/resource.rb +101 -0
- data/lib/jets/resource/api_gateway/rest_api.rb +56 -0
- data/lib/jets/resource/api_gateway/rest_api/change_detection.rb +42 -0
- data/lib/jets/resource/api_gateway/rest_api/logical_id.rb +63 -0
- data/lib/jets/resource/api_gateway/rest_api/routes.rb +7 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/change.rb +8 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/change/base.rb +130 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/change/to.rb +29 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/change/variable.rb +39 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/collision.rb +121 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/collision/variable_exception.rb +7 -0
- data/lib/jets/resource/associated.rb +37 -0
- data/lib/jets/resource/base.rb +28 -0
- data/lib/jets/resource/child_stack/api_deployment.rb +56 -0
- data/lib/jets/resource/child_stack/api_gateway.rb +53 -0
- data/lib/jets/resource/child_stack/app_class.rb +107 -0
- data/lib/jets/resource/child_stack/base.rb +24 -0
- data/lib/jets/resource/child_stack/shared.rb +92 -0
- data/lib/jets/resource/config/config_rule.rb +74 -0
- data/lib/jets/resource/config/managed_rule.rb +15 -0
- data/lib/jets/resource/events/rule.rb +31 -0
- data/lib/jets/resource/iam/application_role.rb +27 -0
- data/lib/jets/resource/iam/base_role_definition.rb +47 -0
- data/lib/jets/resource/iam/class_role.rb +74 -0
- data/lib/jets/resource/iam/function_role.rb +54 -0
- data/lib/jets/resource/iam/managed_policy.rb +22 -0
- data/lib/jets/resource/iam/policy_document.rb +41 -0
- data/lib/jets/resource/iot/topic_rule.rb +34 -0
- data/lib/jets/resource/lambda/event_source_mapping.rb +31 -0
- data/lib/jets/resource/lambda/function.rb +214 -0
- data/lib/jets/resource/lambda/function/environment.rb +62 -0
- data/lib/jets/resource/lambda/gem_layer.rb +17 -0
- data/lib/jets/resource/lambda/layer_version.rb +44 -0
- data/lib/jets/resource/logs/subscription_filter.rb +31 -0
- data/lib/jets/resource/permission.rb +45 -0
- data/lib/jets/resource/replacer.rb +85 -0
- data/lib/jets/resource/route53/record_set.rb +70 -0
- data/lib/jets/resource/s3/bucket.rb +24 -0
- data/lib/jets/resource/sns/subscription.rb +29 -0
- data/lib/jets/resource/sns/topic.rb +35 -0
- data/lib/jets/resource/sns/topic_policy.rb +40 -0
- data/lib/jets/resource/sqs/queue.rb +21 -0
- data/lib/jets/resource/standardizer.rb +42 -0
- data/lib/jets/route.rb +166 -0
- data/lib/jets/router.rb +177 -0
- data/lib/jets/router/scope.rb +30 -0
- data/lib/jets/rule/base.rb +19 -0
- data/lib/jets/rule/dsl.rb +110 -0
- data/lib/jets/spec_helpers.rb +54 -0
- data/lib/jets/spec_helpers/params.rb +10 -0
- data/lib/jets/spec_helpers/request.rb +78 -0
- data/lib/jets/spec_helpers/response.rb +5 -0
- data/lib/jets/stack.rb +88 -0
- data/lib/jets/stack/builder.rb +43 -0
- data/lib/jets/stack/definition.rb +50 -0
- data/lib/jets/stack/depends.rb +34 -0
- data/lib/jets/stack/depends/item.rb +9 -0
- data/lib/jets/stack/function.rb +69 -0
- data/lib/jets/stack/main.rb +4 -0
- data/lib/jets/stack/main/dsl.rb +28 -0
- data/lib/jets/stack/main/dsl/base.rb +49 -0
- data/lib/jets/stack/main/dsl/cloudwatch.rb +19 -0
- data/lib/jets/stack/main/dsl/iam.rb +8 -0
- data/lib/jets/stack/main/dsl/lambda.rb +83 -0
- data/lib/jets/stack/main/dsl/s3.rb +12 -0
- data/lib/jets/stack/main/dsl/sns.rb +16 -0
- data/lib/jets/stack/main/dsl/sqs.rb +10 -0
- data/lib/jets/stack/output.rb +35 -0
- data/lib/jets/stack/output/dsl.rb +19 -0
- data/lib/jets/stack/output/lookup.rb +36 -0
- data/lib/jets/stack/parameter.rb +37 -0
- data/lib/jets/stack/parameter/dsl.rb +42 -0
- data/lib/jets/stack/resource.rb +31 -0
- data/lib/jets/stack/resource/dsl.rb +19 -0
- data/lib/jets/stack/s3_event.rb +87 -0
- data/lib/jets/tmp_loader.rb +52 -0
- data/lib/jets/turbine.rb +41 -0
- data/lib/jets/turbo.rb +55 -0
- data/lib/jets/turbo/database_yaml.rb +41 -0
- data/lib/jets/turbo/project/.gitignore +12 -0
- data/lib/jets/turbo/project/.jetskeep +1 -0
- data/lib/jets/turbo/project/Gemfile +16 -0
- data/lib/jets/turbo/project/Rakefile +2 -0
- data/lib/jets/turbo/project/app/controllers/application_controller.rb +2 -0
- data/lib/jets/turbo/project/app/helpers/application_helper.rb +2 -0
- data/lib/jets/turbo/project/app/jobs/application_job.rb +4 -0
- data/lib/jets/turbo/project/config.ru +5 -0
- data/lib/jets/turbo/project/config/application.rb +4 -0
- data/lib/jets/turbo/project/config/routes.rb +4 -0
- data/lib/jets/turbo/rails.rb +127 -0
- data/lib/jets/turbo/templates/config/database.yml +26 -0
- data/lib/jets/util.rb +38 -0
- data/lib/jets/version.rb +3 -0
- data/readme/prerelease.md +6 -0
- data/readme/testing.md +60 -0
- metadata +1004 -0
|
@@ -0,0 +1,234 @@
|
|
|
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
|
+
end
|
|
36
|
+
|
|
37
|
+
def full?
|
|
38
|
+
@options[:templates] || @options[:stack_type] == :full
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def build_all_templates
|
|
42
|
+
# CloudFormation templates
|
|
43
|
+
# 1. Shared templates - child templates needs them
|
|
44
|
+
build_api_gateway_templates
|
|
45
|
+
# 2. Child templates - parent template needs them
|
|
46
|
+
build_app_child_templates
|
|
47
|
+
# 2. Child templates - parent template needs them
|
|
48
|
+
build_shared_resources_templates
|
|
49
|
+
# 4. Finally parent template
|
|
50
|
+
build_parent_template # must be called at the end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def build_minimal_template
|
|
54
|
+
# minimal_template does no longer includes ApiGateway since that is now paged and
|
|
55
|
+
# at this point we know nothing about the pages.
|
|
56
|
+
Jets::Cfn::Builders::ParentBuilder.new(@options).build
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def build_api_gateway_templates
|
|
60
|
+
@api_gateway_builder = Jets::Cfn::Builders::ApiGatewayBuilder.new(@options).build
|
|
61
|
+
Jets::Cfn::Builders::ApiDeploymentBuilder.new(@options).build
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def build_app_child_templates
|
|
65
|
+
app_files.each do |path|
|
|
66
|
+
build_child_template(path)
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def build_shared_resources_templates
|
|
71
|
+
Jets::Stack.subclasses.each do |subclass|
|
|
72
|
+
Jets::Cfn::Builders::SharedBuilder.new(subclass).build
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# path: app/controllers/comments_controller.rb
|
|
77
|
+
# path: app/jobs/easy_job.rb
|
|
78
|
+
def build_child_template(path)
|
|
79
|
+
md = path.match(%r{app/(.*?)/}) # extract: controller, job or function
|
|
80
|
+
process_class = md[1].classify
|
|
81
|
+
builder_class = "Jets::Cfn::Builders::#{process_class}Builder".constantize
|
|
82
|
+
|
|
83
|
+
# Examples:
|
|
84
|
+
# Jets::Cfn::Builders::ControllerBuilder.new(PostsController)
|
|
85
|
+
# Jets::Cfn::Builders::JobBuilder.new(EasyJob)
|
|
86
|
+
# Jets::Cfn::Builders::RuleBuilder.new(CheckRule)
|
|
87
|
+
# Jets::Cfn::Builders::FunctionBuilder.new(Hello)
|
|
88
|
+
# Jets::Cfn::Builders::FunctionBuilder.new(HelloFunction)
|
|
89
|
+
app_class = Jets::Klass.from_path(path)
|
|
90
|
+
builder = builder_class.new(app_class)
|
|
91
|
+
unless Jets.poly_only? && app_class == Jets::PreheatJob
|
|
92
|
+
builder.build
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def build_parent_template
|
|
97
|
+
options = @options.dup
|
|
98
|
+
options[:api_gateway_page_range] = @api_gateway_builder.range
|
|
99
|
+
options[:indexed_paths] = @api_gateway_builder.indexed_paths
|
|
100
|
+
options[:required_parameters] = @api_gateway_builder.required_parameters
|
|
101
|
+
Jets::Cfn::Builders::ParentBuilder.new(options).build
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def clean_templates
|
|
105
|
+
FileUtils.rm_rf("#{Jets.build_root}/templates")
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def app_files
|
|
109
|
+
self.class.app_files
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# Crucial that the Dir.pwd is in the tmp_code because for
|
|
113
|
+
# because Jets.boot set ups autoload_paths and this is how project
|
|
114
|
+
# classes are loaded.
|
|
115
|
+
# TODO: rework code so that Dir.pwd does not have to be in tmp_code for build to work.
|
|
116
|
+
def self.app_files
|
|
117
|
+
paths = []
|
|
118
|
+
expression = "#{Jets.root}/app/**/**/*.rb"
|
|
119
|
+
Dir.glob(expression).each do |path|
|
|
120
|
+
return false unless File.file?(path)
|
|
121
|
+
next unless app_file?(path)
|
|
122
|
+
next if concerns?(path)
|
|
123
|
+
|
|
124
|
+
relative_path = path.sub("#{Jets.root}/", '')
|
|
125
|
+
# Rids of the Jets.root at beginning
|
|
126
|
+
paths << relative_path
|
|
127
|
+
end
|
|
128
|
+
paths += internal_app_files
|
|
129
|
+
paths
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def shared_files
|
|
133
|
+
self.class.shared_files
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def self.shared_files
|
|
137
|
+
paths = []
|
|
138
|
+
expression = "#{Jets.root}/app/**/**/*.rb"
|
|
139
|
+
Dir.glob(expression).each do |path|
|
|
140
|
+
return false unless File.file?(path)
|
|
141
|
+
next unless path.include?("app/shared/resources")
|
|
142
|
+
|
|
143
|
+
relative_path = path.sub("#{Jets.root}/", '')
|
|
144
|
+
# Rids of the Jets.root at beginning
|
|
145
|
+
paths << relative_path
|
|
146
|
+
end
|
|
147
|
+
paths
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
# Finds out of the app has polymorphic functions only and zero ruby functions.
|
|
151
|
+
# In this case, we can skip a lot of the ruby related building and speed up the
|
|
152
|
+
# deploy process.
|
|
153
|
+
def self.poly_only?
|
|
154
|
+
!app_has_ruby? && !shared_has_ruby?
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
def self.app_has_ruby?
|
|
158
|
+
has_ruby = app_files.detect do |path|
|
|
159
|
+
app_class = Jets::Klass.from_path(path) # IE: PostsController, Jets::PublicController
|
|
160
|
+
langs = app_class.tasks.map(&:lang)
|
|
161
|
+
langs.include?(:ruby) && app_class != Jets::PreheatJob
|
|
162
|
+
end
|
|
163
|
+
!!has_ruby
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
def self.shared_has_ruby?
|
|
167
|
+
has_ruby = false
|
|
168
|
+
Jets::Stack.subclasses.each do |klass|
|
|
169
|
+
klass.functions.each do |fun|
|
|
170
|
+
if fun.lang == :ruby
|
|
171
|
+
has_ruby = true
|
|
172
|
+
break
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
has_ruby
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
# Add internal Jets controllers if they are being used
|
|
180
|
+
# TODO: Interesting, this eventually just used to generate handlers and controllers only.
|
|
181
|
+
# Maybe rename to make that clear.
|
|
182
|
+
# The copying of other internal files like views is done in builders/code_builder.rb copy_internal_jets_code
|
|
183
|
+
def self.internal_app_files
|
|
184
|
+
paths = []
|
|
185
|
+
controllers = File.expand_path("../../internal/app/controllers/jets", __FILE__)
|
|
186
|
+
|
|
187
|
+
public_catchall = Jets::Router.has_controller?("Jets::PublicController")
|
|
188
|
+
paths << "#{controllers}/public_controller.rb" if public_catchall
|
|
189
|
+
|
|
190
|
+
rack_catchall = Jets::Router.has_controller?("Jets::RackController")
|
|
191
|
+
paths << "#{controllers}/rack_controller.rb" if rack_catchall
|
|
192
|
+
|
|
193
|
+
mailer_controller = Jets::Router.has_controller?("Jets::MailersController")
|
|
194
|
+
paths << "#{controllers}/mailers_controller.rb" if mailer_controller
|
|
195
|
+
|
|
196
|
+
if Jets.config.prewarm.enable
|
|
197
|
+
jobs = File.expand_path("../../internal/app/jobs/jets", __FILE__)
|
|
198
|
+
paths << "#{jobs}/preheat_job.rb"
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
paths
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
def self.app_file?(path)
|
|
205
|
+
return false unless File.extname(path) == ".rb"
|
|
206
|
+
# Do not define lamda functions for the application_controller.rb or
|
|
207
|
+
# application_job.rb
|
|
208
|
+
excludes = %w[
|
|
209
|
+
application_controller.rb
|
|
210
|
+
application_job.rb
|
|
211
|
+
]
|
|
212
|
+
return false if excludes.detect { |p| path.include?(p) }
|
|
213
|
+
|
|
214
|
+
includes = %w[
|
|
215
|
+
app/controllers
|
|
216
|
+
app/jobs
|
|
217
|
+
app/functions
|
|
218
|
+
app/rules
|
|
219
|
+
]
|
|
220
|
+
return true if includes.detect { |p| path.include?(p) }
|
|
221
|
+
|
|
222
|
+
false
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
def self.concerns?(path)
|
|
226
|
+
path =~ %r{app/\w+/concerns/}
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
def self.tmp_code(full_build_path=false)
|
|
230
|
+
full_build_path ? "#{Jets.build_root}/stage/code" : "stage/code"
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
end
|
|
234
|
+
end
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
require "base64"
|
|
2
|
+
require "json"
|
|
3
|
+
|
|
4
|
+
class Jets::Commands::Call
|
|
5
|
+
include Jets::AwsServices
|
|
6
|
+
|
|
7
|
+
def initialize(provided_function_name, event, options={})
|
|
8
|
+
@options = options
|
|
9
|
+
@guess = @options[:guess].nil? ? true : @options[:guess]
|
|
10
|
+
|
|
11
|
+
@provided_function_name = provided_function_name
|
|
12
|
+
@event = event
|
|
13
|
+
|
|
14
|
+
@invocation_type = options[:invocation_type] || "RequestResponse"
|
|
15
|
+
@log_type = options[:log_type] || "Tail"
|
|
16
|
+
@qualifier = @qualifier
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def function_name
|
|
20
|
+
if @guess
|
|
21
|
+
ensure_guesses_found! # possibly exits here
|
|
22
|
+
guesser.function_name # guesser adds namespace already
|
|
23
|
+
else
|
|
24
|
+
[Jets.config.project_namespace, @provided_function_name].join('-')
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def run
|
|
29
|
+
@options[:local] ? local_run : remote_run
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# With local mode there is no way to bypass the guesser
|
|
33
|
+
def local_run
|
|
34
|
+
puts "Local mode enabled!"
|
|
35
|
+
ensure_guesses_found! # possibly exits here
|
|
36
|
+
klass = guesser.class_name.constantize
|
|
37
|
+
# Example:
|
|
38
|
+
# PostsController.process(event, context, meth)
|
|
39
|
+
event = JSON.load(transformed_event) || {} # transformed_event is JSON text String
|
|
40
|
+
|
|
41
|
+
fun = Jets::PolyFun.new(klass, guesser.method_name)
|
|
42
|
+
result = fun.run(event) # check the logs for polymorphic function errors
|
|
43
|
+
# Note: even though data might not always be json, the JSON.dump does a
|
|
44
|
+
# good job of not bombing, so always calling it to simplify code.
|
|
45
|
+
|
|
46
|
+
text = Jets::Util.normalize_result(result)
|
|
47
|
+
STDOUT.puts text
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def remote_run
|
|
51
|
+
puts "Calling lambda function #{function_name} on AWS" unless @options[:mute]
|
|
52
|
+
return if @options[:noop]
|
|
53
|
+
|
|
54
|
+
options = {
|
|
55
|
+
# client_context: client_context,
|
|
56
|
+
function_name: function_name,
|
|
57
|
+
invocation_type: @invocation_type, # "Event", # RequestResponse
|
|
58
|
+
log_type: @log_type, # pretty sweet
|
|
59
|
+
payload: transformed_event, # "fileb://file-path/input.json", <= JSON
|
|
60
|
+
qualifier: @qualifier, # "1",
|
|
61
|
+
}
|
|
62
|
+
begin
|
|
63
|
+
resp = aws_lambda.invoke(options)
|
|
64
|
+
rescue Aws::Lambda::Errors::ResourceNotFoundException
|
|
65
|
+
puts "The function #{function_name} was not found. Maybe check the spelling or the AWS_PROFILE?".color(:red)
|
|
66
|
+
return
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
if @options[:show_log]
|
|
70
|
+
puts "Last 4KB of log in the x-amz-log-result header:".color(:green)
|
|
71
|
+
puts Base64.decode64(resp.log_result)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
add_console_link_to_clipboard
|
|
75
|
+
result = resp.payload.read # already been normalized/JSON.dump by AWS
|
|
76
|
+
unless @options[:mute_output]
|
|
77
|
+
STDOUT.puts result # only thing that goes to stdout
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def guesser
|
|
82
|
+
@guesser ||= Guesser.new(@provided_function_name)
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def ensure_guesses_found!
|
|
86
|
+
unless guesser.class_name and guesser.method_name
|
|
87
|
+
puts guesser.error_message
|
|
88
|
+
exit
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# @event is String because it can be the file:// notation
|
|
93
|
+
# Returns text String for the lambda.invoke payload.
|
|
94
|
+
def transformed_event
|
|
95
|
+
text = @event
|
|
96
|
+
if text && text.include?("file://")
|
|
97
|
+
text = load_event_from_file(text)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
check_valid_json!(text)
|
|
101
|
+
|
|
102
|
+
puts "Function name: #{function_name.color(:green)}" unless @options[:mute]
|
|
103
|
+
return text unless function_name.include?("_controller-")
|
|
104
|
+
return text if @options[:lambda_proxy] == false
|
|
105
|
+
|
|
106
|
+
event = JSON.load(text)
|
|
107
|
+
lambda_proxy = {"queryStringParameters" => event}
|
|
108
|
+
JSON.dump(lambda_proxy)
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def load_event_from_file(text)
|
|
112
|
+
path = text.gsub('file://','')
|
|
113
|
+
path = "#{Jets.root}/#{path}" unless path[0..0] == '/'
|
|
114
|
+
unless File.exist?(path)
|
|
115
|
+
puts "File #{path} does not exist. Are you sure the file exists?".color(:red)
|
|
116
|
+
exit
|
|
117
|
+
end
|
|
118
|
+
text = IO.read(path)
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
# Exits with friendly error message when user provides bad just
|
|
122
|
+
def check_valid_json!(text)
|
|
123
|
+
JSON.load(text)
|
|
124
|
+
rescue JSON::ParserError => e
|
|
125
|
+
puts "Invalid json provided:\n '#{text}'"
|
|
126
|
+
puts "Exiting... Please try again and provide valid json."
|
|
127
|
+
exit 1
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
# So use can quickly paste this into their browser if they want to see the function
|
|
131
|
+
# via the Lambda console
|
|
132
|
+
def add_console_link_to_clipboard
|
|
133
|
+
return unless RUBY_PLATFORM =~ /darwin/
|
|
134
|
+
return unless system("type pbcopy > /dev/null")
|
|
135
|
+
|
|
136
|
+
# TODO: for add_console_link_to_clipboard get the region from the ~/.aws/config and AWS_PROFILE setting
|
|
137
|
+
region = Aws.config[:region] || 'us-east-1'
|
|
138
|
+
link = "https://console.aws.amazon.com/lambda/home?region=#{region}#/functions/#{function_name}?tab=configuration"
|
|
139
|
+
system("echo #{link} | pbcopy")
|
|
140
|
+
puts "Pro tip: The Lambda Console Link to the #{function_name} function has been added to your clipboard." unless @options[:mute]
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
# TODO: Hook client_context up and maek sure it works. Think I've figure out how to sign client_context below.
|
|
144
|
+
# Client context must be a valid Base64-encoded JSON object
|
|
145
|
+
# Example: http://docs.aws.amazon.com/mobileanalytics/latest/ug/PutEvents.html
|
|
146
|
+
def client_context
|
|
147
|
+
context = {
|
|
148
|
+
"client" => {
|
|
149
|
+
"client_id" => "Jets",
|
|
150
|
+
"app_title" => "jets call cli",
|
|
151
|
+
"app_version_name" => Jets::VERSION,
|
|
152
|
+
},
|
|
153
|
+
"custom" => {},
|
|
154
|
+
"env" =>{
|
|
155
|
+
"platform" => RUBY_PLATFORM,
|
|
156
|
+
"platform_version" => RUBY_VERSION,
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
Base64.encode64(JSON.dump(context))
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
# For this class redirect puts to stderr so user can pipe output to tools like
|
|
163
|
+
# jq. Example:
|
|
164
|
+
# jets call posts_controller-index '{"test":1}' | jq .
|
|
165
|
+
def puts(text)
|
|
166
|
+
$stderr.puts(text)
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
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
|