jets-fs 1.6.10
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 +73 -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 +6 -0
- data/.python-version +1 -0
- data/.rspec +4 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +533 -0
- data/Dockerfile +16 -0
- data/Dockerfile.base +53 -0
- data/Gemfile +14 -0
- data/Gemfile.lock +190 -0
- data/Guardfile +22 -0
- data/LICENSE.txt +22 -0
- data/Procfile +2 -0
- data/README.md +203 -0
- data/Rakefile +21 -0
- data/backers.md +16 -0
- data/bin/release +9 -0
- data/buildspec.yml +18 -0
- data/exe/jets +14 -0
- data/jets.gemspec +61 -0
- data/lib/jets.rb +71 -0
- data/lib/jets/application.rb +308 -0
- data/lib/jets/aws_info.rb +111 -0
- data/lib/jets/aws_services.rb +60 -0
- data/lib/jets/aws_services/stack_status.rb +59 -0
- data/lib/jets/booter.rb +130 -0
- data/lib/jets/builders.rb +16 -0
- data/lib/jets/builders/code_builder.rb +379 -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 +172 -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.rb +5 -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/camelizer.rb +67 -0
- data/lib/jets/cfn.rb +6 -0
- data/lib/jets/cfn/builders.rb +20 -0
- data/lib/jets/cfn/builders/api_deployment_builder.rb +58 -0
- data/lib/jets/cfn/builders/api_gateway_builder.rb +80 -0
- data/lib/jets/cfn/builders/base_child_builder.rb +82 -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 +127 -0
- data/lib/jets/cfn/builders/job_builder.rb +14 -0
- data/lib/jets/cfn/builders/parent_builder.rb +93 -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 +189 -0
- data/lib/jets/cfn/status.rb +212 -0
- data/lib/jets/cfn/upload.rb +139 -0
- data/lib/jets/cli.rb +189 -0
- data/lib/jets/commands.rb +27 -0
- data/lib/jets/commands/base.rb +164 -0
- data/lib/jets/commands/build.rb +217 -0
- data/lib/jets/commands/call.rb +174 -0
- data/lib/jets/commands/call/anonymous_guesser.rb +96 -0
- data/lib/jets/commands/call/autoload_guesser.rb +112 -0
- data/lib/jets/commands/call/base_guesser.rb +33 -0
- data/lib/jets/commands/call/guesser.rb +48 -0
- data/lib/jets/commands/clean.rb +23 -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 +13 -0
- data/lib/jets/commands/db.rb +15 -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 +131 -0
- data/lib/jets/commands/dynamodb.rb +22 -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/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 +18 -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/rail.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 +152 -0
- data/lib/jets/commands/markdown.rb +8 -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 +45 -0
- data/lib/jets/commands/runner.rb +18 -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 +35 -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 +66 -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 +4 -0
- data/lib/jets/commands/templates/skeleton/config/environments/production.rb +4 -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 +146 -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 +16 -0
- data/lib/jets/controller/base.rb +103 -0
- data/lib/jets/controller/callbacks.rb +62 -0
- data/lib/jets/controller/cookies.rb +40 -0
- data/lib/jets/controller/cookies/jar.rb +269 -0
- data/lib/jets/controller/layout.rb +17 -0
- data/lib/jets/controller/middleware.rb +5 -0
- data/lib/jets/controller/middleware/cors.rb +60 -0
- data/lib/jets/controller/middleware/local.rb +119 -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 +97 -0
- data/lib/jets/controller/middleware/main.rb +46 -0
- data/lib/jets/controller/middleware/webpacker_setup.rb +6 -0
- data/lib/jets/controller/params.rb +87 -0
- data/lib/jets/controller/rack.rb +5 -0
- data/lib/jets/controller/rack/adapter.rb +63 -0
- data/lib/jets/controller/rack/env.rb +105 -0
- data/lib/jets/controller/redirection.rb +55 -0
- data/lib/jets/controller/rendering.rb +84 -0
- data/lib/jets/controller/rendering/rack_renderer.rb +238 -0
- data/lib/jets/controller/request.rb +29 -0
- data/lib/jets/controller/response.rb +61 -0
- data/lib/jets/core.rb +211 -0
- data/lib/jets/core_ext/kernel.rb +56 -0
- data/lib/jets/db.rb +15 -0
- data/lib/jets/dotenv.rb +39 -0
- data/lib/jets/erb.rb +51 -0
- data/lib/jets/generator.rb +41 -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/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 +153 -0
- data/lib/jets/internal/app/jobs/jets/preheat_job.rb +62 -0
- data/lib/jets/io.rb +14 -0
- data/lib/jets/job.rb +4 -0
- data/lib/jets/job/base.rb +29 -0
- data/lib/jets/job/dsl.rb +108 -0
- data/lib/jets/klass.rb +109 -0
- data/lib/jets/lambda.rb +18 -0
- data/lib/jets/lambda/dsl.rb +384 -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 +24 -0
- data/lib/jets/mega.rb +7 -0
- data/lib/jets/mega/hash_converter.rb +25 -0
- data/lib/jets/mega/request.rb +140 -0
- data/lib/jets/mega/request/source.rb +21 -0
- data/lib/jets/middleware.rb +38 -0
- data/lib/jets/middleware/configurator.rb +84 -0
- data/lib/jets/middleware/default_stack.rb +49 -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 +20 -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 +82 -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.rb +4 -0
- data/lib/jets/processors/deducer.rb +65 -0
- data/lib/jets/processors/main_processor.rb +59 -0
- data/lib/jets/rack_server.rb +80 -0
- data/lib/jets/rdoc.rb +30 -0
- data/lib/jets/resource.rb +74 -0
- data/lib/jets/resource/api_gateway.rb +9 -0
- data/lib/jets/resource/api_gateway/base_path.rb +5 -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 +78 -0
- data/lib/jets/resource/api_gateway/rest_api.rb +60 -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 +11 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/change.rb +12 -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 +123 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/collision/variable_exception.rb +7 -0
- data/lib/jets/resource/associated.rb +26 -0
- data/lib/jets/resource/base.rb +28 -0
- data/lib/jets/resource/child_stack.rb +7 -0
- data/lib/jets/resource/child_stack/api_deployment.rb +56 -0
- data/lib/jets/resource/child_stack/api_gateway.rb +29 -0
- data/lib/jets/resource/child_stack/app_class.rb +112 -0
- data/lib/jets/resource/child_stack/base.rb +24 -0
- data/lib/jets/resource/child_stack/shared.rb +90 -0
- data/lib/jets/resource/config.rb +4 -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.rb +3 -0
- data/lib/jets/resource/events/rule.rb +31 -0
- data/lib/jets/resource/iam.rb +8 -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/lambda.rb +5 -0
- data/lib/jets/resource/lambda/function.rb +216 -0
- data/lib/jets/resource/lambda/function/environment.rb +61 -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/permission.rb +45 -0
- data/lib/jets/resource/replacer.rb +77 -0
- data/lib/jets/resource/route53.rb +3 -0
- data/lib/jets/resource/route53/record_set.rb +70 -0
- data/lib/jets/resource/s3.rb +17 -0
- data/lib/jets/resource/sns.rb +3 -0
- data/lib/jets/resource/sqs.rb +3 -0
- data/lib/jets/resource/standardizer.rb +42 -0
- data/lib/jets/route.rb +166 -0
- data/lib/jets/router.rb +175 -0
- data/lib/jets/router/scope.rb +30 -0
- data/lib/jets/rule.rb +4 -0
- data/lib/jets/rule/base.rb +19 -0
- data/lib/jets/rule/dsl.rb +110 -0
- data/lib/jets/spec_helpers.rb +52 -0
- data/lib/jets/spec_helpers/params.rb +10 -0
- data/lib/jets/spec_helpers/request.rb +98 -0
- data/lib/jets/spec_helpers/response.rb +5 -0
- data/lib/jets/stack.rb +103 -0
- data/lib/jets/stack/builder.rb +38 -0
- data/lib/jets/stack/definition.rb +50 -0
- data/lib/jets/stack/function.rb +60 -0
- data/lib/jets/stack/main.rb +5 -0
- data/lib/jets/stack/main/dsl.rb +33 -0
- data/lib/jets/stack/main/extensions/base.rb +45 -0
- data/lib/jets/stack/main/extensions/cloudwatch.rb +19 -0
- data/lib/jets/stack/main/extensions/lambda.rb +71 -0
- data/lib/jets/stack/main/extensions/sns.rb +12 -0
- data/lib/jets/stack/main/extensions/sqs.rb +36 -0
- data/lib/jets/stack/output.rb +38 -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 +38 -0
- data/lib/jets/stack/parameter/dsl.rb +42 -0
- data/lib/jets/stack/resource.rb +32 -0
- data/lib/jets/stack/resource/dsl.rb +19 -0
- data/lib/jets/tmp_loader.rb +52 -0
- data/lib/jets/turbine.rb +30 -0
- data/lib/jets/turbo.rb +47 -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/rail.rb +113 -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 +859 -0
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
require "base64"
|
|
2
|
+
require "json"
|
|
3
|
+
|
|
4
|
+
class Jets::Commands::Call
|
|
5
|
+
autoload :BaseGuesser, "jets/commands/call/base_guesser"
|
|
6
|
+
autoload :AutoloadGuesser, "jets/commands/call/autoload_guesser"
|
|
7
|
+
autoload :AnonymousGuesser, "jets/commands/call/anonymous_guesser"
|
|
8
|
+
autoload :Guesser, "jets/commands/call/guesser"
|
|
9
|
+
|
|
10
|
+
include Jets::AwsServices
|
|
11
|
+
|
|
12
|
+
def initialize(provided_function_name, event, options={})
|
|
13
|
+
@options = options
|
|
14
|
+
@guess = @options[:guess].nil? ? true : @options[:guess]
|
|
15
|
+
|
|
16
|
+
@provided_function_name = provided_function_name
|
|
17
|
+
@event = event
|
|
18
|
+
|
|
19
|
+
@invocation_type = options[:invocation_type] || "RequestResponse"
|
|
20
|
+
@log_type = options[:log_type] || "Tail"
|
|
21
|
+
@qualifier = @qualifier
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def function_name
|
|
25
|
+
if @guess
|
|
26
|
+
ensure_guesses_found! # possibly exits here
|
|
27
|
+
guesser.function_name # guesser adds namespace already
|
|
28
|
+
else
|
|
29
|
+
[Jets.config.project_namespace, @provided_function_name].join('-')
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def run
|
|
34
|
+
@options[:local] ? local_run : remote_run
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# With local mode there is no way to bypass the guesser
|
|
38
|
+
def local_run
|
|
39
|
+
puts "Local mode enabled!"
|
|
40
|
+
ensure_guesses_found! # possibly exits here
|
|
41
|
+
klass = guesser.class_name.constantize
|
|
42
|
+
# Example:
|
|
43
|
+
# PostsController.process(event, context, meth)
|
|
44
|
+
event = JSON.load(transformed_event) || {} # transformed_event is JSON text String
|
|
45
|
+
|
|
46
|
+
fun = Jets::PolyFun.new(klass, guesser.method_name)
|
|
47
|
+
result = fun.run(event) # check the logs for polymorphic function errors
|
|
48
|
+
# Note: even though data might not always be json, the JSON.dump does a
|
|
49
|
+
# good job of not bombing, so always calling it to simplify code.
|
|
50
|
+
|
|
51
|
+
text = Jets::Util.normalize_result(result)
|
|
52
|
+
STDOUT.puts text
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def remote_run
|
|
56
|
+
puts "Calling lambda function #{function_name} on AWS" unless @options[:mute]
|
|
57
|
+
return if @options[:noop]
|
|
58
|
+
|
|
59
|
+
options = {
|
|
60
|
+
# client_context: client_context,
|
|
61
|
+
function_name: function_name,
|
|
62
|
+
invocation_type: @invocation_type, # "Event", # RequestResponse
|
|
63
|
+
log_type: @log_type, # pretty sweet
|
|
64
|
+
payload: transformed_event, # "fileb://file-path/input.json", <= JSON
|
|
65
|
+
qualifier: @qualifier, # "1",
|
|
66
|
+
}
|
|
67
|
+
begin
|
|
68
|
+
resp = lambda.invoke(options)
|
|
69
|
+
rescue Aws::Lambda::Errors::ResourceNotFoundException
|
|
70
|
+
puts "The function #{function_name} was not found. Maybe check the spelling or the AWS_PROFILE?".color(:red)
|
|
71
|
+
return
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
if @options[:show_log]
|
|
75
|
+
puts "Last 4KB of log in the x-amz-log-result header:".color(:green)
|
|
76
|
+
puts Base64.decode64(resp.log_result)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
add_console_link_to_clipboard
|
|
80
|
+
result = resp.payload.read # already been normalized/JSON.dump by AWS
|
|
81
|
+
unless @options[:mute_output]
|
|
82
|
+
STDOUT.puts result # only thing that goes to stdout
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def guesser
|
|
87
|
+
@guesser ||= Guesser.new(@provided_function_name)
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def ensure_guesses_found!
|
|
91
|
+
unless guesser.class_name and guesser.method_name
|
|
92
|
+
puts guesser.error_message
|
|
93
|
+
exit
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# @event is String because it can be the file:// notation
|
|
98
|
+
# Returns text String for the lambda.invoke payload.
|
|
99
|
+
def transformed_event
|
|
100
|
+
text = @event
|
|
101
|
+
if text && text.include?("file://")
|
|
102
|
+
text = load_event_from_file(text)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
check_valid_json!(text)
|
|
106
|
+
|
|
107
|
+
puts "Function name: #{function_name.color(:green)}" unless @options[:mute]
|
|
108
|
+
return text unless function_name.include?("_controller-")
|
|
109
|
+
return text if @options[:lambda_proxy] == false
|
|
110
|
+
|
|
111
|
+
event = JSON.load(text)
|
|
112
|
+
lambda_proxy = {"queryStringParameters" => event}
|
|
113
|
+
JSON.dump(lambda_proxy)
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def load_event_from_file(text)
|
|
117
|
+
path = text.gsub('file://','')
|
|
118
|
+
path = "#{Jets.root}/#{path}" unless path[0..0] == '/'
|
|
119
|
+
unless File.exist?(path)
|
|
120
|
+
puts "File #{path} does not exist. Are you sure the file exists?".color(:red)
|
|
121
|
+
exit
|
|
122
|
+
end
|
|
123
|
+
text = IO.read(path)
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
# Exits with friendly error message when user provides bad just
|
|
127
|
+
def check_valid_json!(text)
|
|
128
|
+
JSON.load(text)
|
|
129
|
+
rescue JSON::ParserError => e
|
|
130
|
+
puts "Invalid json provided:\n '#{text}'"
|
|
131
|
+
puts "Exiting... Please try again and provide valid json."
|
|
132
|
+
exit 1
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
# So use can quickly paste this into their browser if they want to see the function
|
|
136
|
+
# via the Lambda console
|
|
137
|
+
def add_console_link_to_clipboard
|
|
138
|
+
return unless RUBY_PLATFORM =~ /darwin/
|
|
139
|
+
return unless system("type pbcopy > /dev/null")
|
|
140
|
+
|
|
141
|
+
# TODO: for add_console_link_to_clipboard get the region from the ~/.aws/config and AWS_PROFILE setting
|
|
142
|
+
region = Aws.config[:region] || 'us-east-1'
|
|
143
|
+
link = "https://console.aws.amazon.com/lambda/homepage?region=#{region}#/functions/#{function_name}?tab=configuration"
|
|
144
|
+
system("echo #{link} | pbcopy")
|
|
145
|
+
puts "Pro tip: The Lambda Console Link to the #{function_name} function has been added to your clipboard." unless @options[:mute]
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
# TODO: Hook client_context up and maek sure it works. Think I've figure out how to sign client_context below.
|
|
149
|
+
# Client context must be a valid Base64-encoded JSON object
|
|
150
|
+
# Example: http://docs.aws.amazon.com/mobileanalytics/latest/ug/PutEvents.html
|
|
151
|
+
def client_context
|
|
152
|
+
context = {
|
|
153
|
+
"client" => {
|
|
154
|
+
"client_id" => "Jets",
|
|
155
|
+
"app_title" => "jets call cli",
|
|
156
|
+
"app_version_name" => Jets::VERSION,
|
|
157
|
+
},
|
|
158
|
+
"custom" => {},
|
|
159
|
+
"env" =>{
|
|
160
|
+
"platform" => RUBY_PLATFORM,
|
|
161
|
+
"platform_version" => RUBY_VERSION,
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
Base64.encode64(JSON.dump(context))
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
# For this class redirect puts to stderr so user can pipe output to tools like
|
|
168
|
+
# jq. Example:
|
|
169
|
+
# jets call posts_controller-index '{"test":1}' | jq .
|
|
170
|
+
def puts(text)
|
|
171
|
+
$stderr.puts(text)
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
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,112 @@
|
|
|
1
|
+
class Jets::Commands::Call
|
|
2
|
+
class AutoloadGuesser < BaseGuesser
|
|
3
|
+
def detect_class_name
|
|
4
|
+
guess_classes.each do |class_name_guess|
|
|
5
|
+
begin
|
|
6
|
+
class_name_guess.constantize
|
|
7
|
+
return class_name_guess # if there's no error then the class is found
|
|
8
|
+
rescue NameError
|
|
9
|
+
if out_of_guesses(class_name_guess)
|
|
10
|
+
# puts "Unable to find the class to call. Tried guessing: #{guess_classes[0..-2].join(', ')}."
|
|
11
|
+
# raise # re-raise NameError for now but maybe better to provide
|
|
12
|
+
# a custom error class, so we can rescue it and provide a
|
|
13
|
+
# friendly message to the user
|
|
14
|
+
else
|
|
15
|
+
next
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
nil
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def method_name
|
|
24
|
+
return @method_name if defined?(@method_name)
|
|
25
|
+
return nil unless class_name
|
|
26
|
+
|
|
27
|
+
underscored_class_name = class_name.underscore.gsub('/','_')
|
|
28
|
+
underscored_function_name = @provided_function_name.underscore.gsub('/','_')
|
|
29
|
+
meth = underscored_function_name.sub(underscored_class_name, '')
|
|
30
|
+
meth = meth.sub(/^[-_]/,'') # remove leading _ or -
|
|
31
|
+
|
|
32
|
+
if class_name.constantize.tasks.map(&:meth).include?(meth.to_sym)
|
|
33
|
+
@method_name = meth
|
|
34
|
+
else
|
|
35
|
+
@method_name_error ="#{class_name} class found but #{meth} method not found"
|
|
36
|
+
@method_name = nil
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Useful to printing out what was attempted to look up
|
|
41
|
+
def error_message
|
|
42
|
+
guesses = guess_classes
|
|
43
|
+
puts "Unable to find the function to call."
|
|
44
|
+
if class_name and !method_name
|
|
45
|
+
puts @method_name_error
|
|
46
|
+
else
|
|
47
|
+
puts "Tried: #{guesses.join(', ')}"
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def process_type
|
|
52
|
+
if @provided_function_name =~ /[-_]controller/
|
|
53
|
+
"controller"
|
|
54
|
+
elsif @provided_function_name =~ /[-_]job/
|
|
55
|
+
"job"
|
|
56
|
+
elsif @provided_function_name =~ /[-_]rule/
|
|
57
|
+
"rule"
|
|
58
|
+
else
|
|
59
|
+
"function"
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def process_type_pattern
|
|
64
|
+
Regexp.new("[-_]#{process_type}[-_](.*)")
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Strips the action because we dont want it to guess the class name
|
|
68
|
+
# So:
|
|
69
|
+
# admin-related-pages => admin_related_pages_controller
|
|
70
|
+
def underscored_name
|
|
71
|
+
# strip action and concidentally the _controller_ string
|
|
72
|
+
name = @provided_function_name.sub(process_type_pattern,'')
|
|
73
|
+
# Ensure _controller or _job at the end except for simple functions
|
|
74
|
+
unless process_type == "function"
|
|
75
|
+
name = name.gsub('-','_') + "_#{process_type}"
|
|
76
|
+
end
|
|
77
|
+
name
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Guesses autoload paths.
|
|
81
|
+
#
|
|
82
|
+
# underscored_name: admin_related_pages_controller
|
|
83
|
+
# Returns:
|
|
84
|
+
# [
|
|
85
|
+
# "admin_related_pages_controller",
|
|
86
|
+
# "admin/related_pages_controller",
|
|
87
|
+
# "admin_related/pages_controller",
|
|
88
|
+
# "admin_related_pages/controller",
|
|
89
|
+
# ]
|
|
90
|
+
def autoload_paths
|
|
91
|
+
guesses = []
|
|
92
|
+
|
|
93
|
+
parts = underscored_name.split('_')
|
|
94
|
+
parts.size.times do |i|
|
|
95
|
+
namespace = i == 0 ? nil : parts[0..i-1].join('/')
|
|
96
|
+
class_path = parts[i..-1].join('_')
|
|
97
|
+
guesses << [namespace, class_path].compact.join('/')
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
guesses
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def guess_classes
|
|
104
|
+
autoload_paths.map(&:classify)
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def out_of_guesses(guess)
|
|
108
|
+
guess.include?("::Controller")
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
end
|
|
112
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
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
|
+
# provided_function_name:
|
|
9
|
+
# admin/related_pages_controller-list_all
|
|
10
|
+
# admin-related-pages-controller-list-all
|
|
11
|
+
def initialize(provided_function_name)
|
|
12
|
+
@provided_function_name = provided_function_name
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def class_name
|
|
16
|
+
return @class_name if @detection_ran
|
|
17
|
+
|
|
18
|
+
@class_name = detect_class_name
|
|
19
|
+
@detection_ran = true
|
|
20
|
+
@class_name
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def function_name
|
|
24
|
+
# Strip the project namespace if the user has accidentally added it
|
|
25
|
+
# Since we're going to automatically add it no matter what at the end
|
|
26
|
+
# and dont want the namespace to be included twice
|
|
27
|
+
@provided_function_name = @provided_function_name.sub("#{Jets.config.project_namespace}-", "")
|
|
28
|
+
|
|
29
|
+
code_path = class_name.underscore.gsub('/','-')
|
|
30
|
+
function_name = [Jets.config.project_namespace, code_path, method_name].join('-')
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Guesser transforms the user provided function name to the actual lambda
|
|
2
|
+
# function name.
|
|
3
|
+
#
|
|
4
|
+
# Allow for variety of different inputs to work:
|
|
5
|
+
# Simple:
|
|
6
|
+
# admin/pages_controller-index => admin-pages_controller-index
|
|
7
|
+
# admin-pages_controller-index => admin-pages_controller-index
|
|
8
|
+
#
|
|
9
|
+
# Complex, requires detecting the right class name:
|
|
10
|
+
# admin/related_pages_controller-list_all
|
|
11
|
+
# admin-related-pages-controller-list-all
|
|
12
|
+
#
|
|
13
|
+
# All still result in: admin-related_pages_controller-index
|
|
14
|
+
#
|
|
15
|
+
# The detection process follows. Given worse case:
|
|
16
|
+
# admin-related-pages-controller-list-all
|
|
17
|
+
#
|
|
18
|
+
# Know that the action comes after controller, try:
|
|
19
|
+
# AdminRelatedPagesController
|
|
20
|
+
# Admin::RelatedPagesController <= found stop guessing
|
|
21
|
+
#
|
|
22
|
+
# admin/related_pages_controller <= underscored
|
|
23
|
+
# admin/related_pages_controller-list_all <= add action back on
|
|
24
|
+
# admin-related_pages_controller-list_all <= gsub / - DONE
|
|
25
|
+
#
|
|
26
|
+
# Now we're at a point where we can start guessing
|
|
27
|
+
# function_name = detect_function_name(function_name)
|
|
28
|
+
class Jets::Commands::Call
|
|
29
|
+
class Guesser
|
|
30
|
+
delegate :class_name, :method_name, :error_message, :function_name,
|
|
31
|
+
to: :delegate_guesser
|
|
32
|
+
|
|
33
|
+
# Example of provided_function_name:
|
|
34
|
+
# admin/related_pages_controller-list_all
|
|
35
|
+
# admin-related-pages-controller-list-all
|
|
36
|
+
def initialize(provided_function_name)
|
|
37
|
+
@provided_function_name = provided_function_name
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def delegate_guesser
|
|
41
|
+
@delegate_guesser ||= if @provided_function_name =~ /[-_](controller|job|rule)/
|
|
42
|
+
AutoloadGuesser.new(@provided_function_name)
|
|
43
|
+
else
|
|
44
|
+
AnonymousGuesser.new(@provided_function_name)
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|