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,125 @@
|
|
|
1
|
+
require 'open3'
|
|
2
|
+
require 'tmpdir'
|
|
3
|
+
|
|
4
|
+
class Jets::PolyFun
|
|
5
|
+
class BaseExecutor
|
|
6
|
+
extend Memoist
|
|
7
|
+
|
|
8
|
+
def initialize(task)
|
|
9
|
+
@task = task
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# Handler is in properties:
|
|
13
|
+
# 1. copy lambda function into tmp folder
|
|
14
|
+
# 2. generate Lang wrapper script
|
|
15
|
+
# 3. call wrapper script from ruby. Handle stdout and stderr and result. Pass info back to ruby
|
|
16
|
+
def run(event, context)
|
|
17
|
+
@temp_dir = create_tmpdir
|
|
18
|
+
copy_src_to_temp
|
|
19
|
+
write(code)
|
|
20
|
+
result = run_lambda_executor(event, context)
|
|
21
|
+
cleanup
|
|
22
|
+
result
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def write(code)
|
|
26
|
+
puts "lambda_executor_script #{lambda_executor_script}" if ENV['KEEP_LAMBDA_WRAPPER']
|
|
27
|
+
IO.write(lambda_executor_script, code)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Mimic Dir.mktmpdir randomness, not using Dir.mktmpdir because that generates
|
|
31
|
+
# the folder at the /tmp level only.
|
|
32
|
+
def create_tmpdir
|
|
33
|
+
random = "#{Time.now.strftime("%Y%d%H")}-#{Process.pid}-#{SecureRandom.hex[0..6]}"
|
|
34
|
+
tmpdir = "#{Jets.build_root}/executor/#{random}"
|
|
35
|
+
FileUtils.mkdir_p(tmpdir)
|
|
36
|
+
tmpdir
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def copy_src_to_temp
|
|
40
|
+
app_class = @task.class_name.constantize
|
|
41
|
+
internal = app_class.respond_to?(:internal) && app_class.internal
|
|
42
|
+
src = internal ?
|
|
43
|
+
"#{File.expand_path("../internal", File.dirname(__FILE__))}/#{@task.poly_src_path}" :
|
|
44
|
+
"#{Jets.root}/#{@task.poly_src_path}"
|
|
45
|
+
dest = "#{@temp_dir}/#{@task.poly_src_path}"
|
|
46
|
+
|
|
47
|
+
FileUtils.mkdir_p(File.dirname(dest))
|
|
48
|
+
FileUtils.cp(src, dest)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def lambda_executor_script
|
|
52
|
+
File.dirname("#{@temp_dir}/#{@task.poly_src_path}") + "/lambda_executor" + @task.lang_ext
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# When polymorphic method errors, this method reproduces an error in the lambda format
|
|
56
|
+
# Here's some examples to help example:
|
|
57
|
+
#
|
|
58
|
+
# Example of what the raw python prints out to stderr:
|
|
59
|
+
#
|
|
60
|
+
# Traceback (most recent call last):
|
|
61
|
+
# File "/tmp/jets/lite/executor/20180804-10727-mcs6qk/lambda_executor.py", line 6, in <module>
|
|
62
|
+
# resp = handle(event, context)
|
|
63
|
+
# File "/tmp/jets/lite/executor/20180804-10727-mcs6qk/index.py", line 22, in handle
|
|
64
|
+
# return response({'message': e.message}, 400)
|
|
65
|
+
# File "/tmp/jets/lite/executor/20180804-10727-mcs6qk/index.py", line 5, in response
|
|
66
|
+
# badcode
|
|
67
|
+
# NameError: global name 'badcode' is not defined
|
|
68
|
+
#
|
|
69
|
+
# So last line has the error summary info. Other lines have stack trace after the Traceback indicator.
|
|
70
|
+
#
|
|
71
|
+
# Example of the reproduced lambda error format:
|
|
72
|
+
#
|
|
73
|
+
# {
|
|
74
|
+
# "errorMessage": "'NameError' object has no attribute 'message'",
|
|
75
|
+
# "errorType": "AttributeError",
|
|
76
|
+
# "stackTrace": [
|
|
77
|
+
# [
|
|
78
|
+
# "/var/task/handlers/controllers/posts_controller/python/index.py",
|
|
79
|
+
# 22,
|
|
80
|
+
# "handle",
|
|
81
|
+
# "return response({'message': e.message}, 400)"
|
|
82
|
+
# ]
|
|
83
|
+
# ]
|
|
84
|
+
# }
|
|
85
|
+
#
|
|
86
|
+
def run_lambda_executor(event, context)
|
|
87
|
+
interpreter = @task.lang
|
|
88
|
+
command = %Q|#{interpreter} #{lambda_executor_script} '#{JSON.dump(event)}' '#{JSON.dump(context)}'|
|
|
89
|
+
stdout, stderr, status = Open3.capture3(command)
|
|
90
|
+
# puts "=> #{command}".color(:green)
|
|
91
|
+
# puts "stdout #{stdout}"
|
|
92
|
+
# puts "stderr #{stderr}"
|
|
93
|
+
# puts "status #{status}"
|
|
94
|
+
if status.success?
|
|
95
|
+
stdout
|
|
96
|
+
else
|
|
97
|
+
# We'll mimic the way lambda displays an error.
|
|
98
|
+
# $stderr.puts(stderr) # uncomment to debug
|
|
99
|
+
error_lines = stderr.split("\n")
|
|
100
|
+
error_message = error_lines.pop
|
|
101
|
+
error_type = error_message.split(':').first
|
|
102
|
+
error_lines.shift # remove first line that has the Traceback
|
|
103
|
+
stack_trace = error_lines.reverse # python shows stack trace in opposite order from ruby
|
|
104
|
+
JSON.dump(
|
|
105
|
+
"errorMessage" => error_message,
|
|
106
|
+
"errorType" => error_type, # hardcode
|
|
107
|
+
"stackTrace" => stack_trace
|
|
108
|
+
)
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def cleanup
|
|
113
|
+
FileUtils.rm_rf(@temp_dir) unless ENV['KEEP_LAMBDA_WRAPPER']
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def handler
|
|
117
|
+
# Must use the generated CloudFormation template to get the handler because
|
|
118
|
+
# the handler is derived from mutiple sources.
|
|
119
|
+
resource = Jets::Resource::Lambda::Function.new(@task)
|
|
120
|
+
full_handler = resource.properties["Handler"] # full handler here
|
|
121
|
+
File.extname(full_handler).sub(/^./,'') # the extension of the full handler is the handler
|
|
122
|
+
end
|
|
123
|
+
memoize :handler
|
|
124
|
+
end
|
|
125
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
require 'json'
|
|
2
|
+
|
|
3
|
+
class Jets::PolyFun
|
|
4
|
+
class LambdaExecutor
|
|
5
|
+
def initialize(task)
|
|
6
|
+
@task = task
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def run(event, context)
|
|
10
|
+
executor_class = "Jets::PolyFun::#{@task.lang.capitalize}Executor".constantize
|
|
11
|
+
executor = executor_class.new(@task)
|
|
12
|
+
text = executor.run(event, context)
|
|
13
|
+
JSON.load(text)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
class Jets::PolyFun
|
|
2
|
+
class NodeExecutor < BaseExecutor
|
|
3
|
+
# Code for wrapper script that mimics lambda execution. Wrapper script usage:
|
|
4
|
+
#
|
|
5
|
+
# node WRAPPER_SCRIPT EVENT
|
|
6
|
+
#
|
|
7
|
+
# Example:
|
|
8
|
+
#
|
|
9
|
+
# node /tmp/jets/demo/executor/20180804-12816-imqb9/lambda_executor.js '{}'
|
|
10
|
+
#
|
|
11
|
+
def code
|
|
12
|
+
if async_syntax?
|
|
13
|
+
async_code
|
|
14
|
+
else
|
|
15
|
+
callback_code
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-handler.html
|
|
20
|
+
def async_syntax?
|
|
21
|
+
app_path = "#{Jets.root}/" + @task.handler_path.sub('handlers/', 'app/')
|
|
22
|
+
source_code = IO.read(app_path)
|
|
23
|
+
source_code.match(/=\s*async.*\(/)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def async_code
|
|
27
|
+
<<-EOL
|
|
28
|
+
var event = process.argv[2]
|
|
29
|
+
event = JSON.parse(event)
|
|
30
|
+
var context = {}
|
|
31
|
+
|
|
32
|
+
var app = require("./#{@task.meth}.js")
|
|
33
|
+
app.#{handler}(event, context).then(resp => console.log(JSON.stringify(resp)))
|
|
34
|
+
EOL
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def callback_code
|
|
39
|
+
<<-EOL
|
|
40
|
+
function callback(error, response) {
|
|
41
|
+
var text = JSON.stringify(response)
|
|
42
|
+
console.log(text)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
var event = process.argv[2]
|
|
46
|
+
event = JSON.parse(event)
|
|
47
|
+
var context = {}
|
|
48
|
+
|
|
49
|
+
var app = require("./#{@task.meth}.js")
|
|
50
|
+
var resp = app.#{handler}(event, context, callback)
|
|
51
|
+
EOL
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
class Jets::PolyFun
|
|
2
|
+
class PythonExecutor < BaseExecutor
|
|
3
|
+
# Code for wrapper script that mimics lambda execution. Wrapper script usage:
|
|
4
|
+
#
|
|
5
|
+
# python WRAPPER_SCRIPT EVENT
|
|
6
|
+
#
|
|
7
|
+
# Example:
|
|
8
|
+
#
|
|
9
|
+
# python /tmp/jets/demo/executor/20180804-12816-imqb9/lambda_executor.py '{}'
|
|
10
|
+
def code
|
|
11
|
+
<<-EOL
|
|
12
|
+
import sys
|
|
13
|
+
import json
|
|
14
|
+
from #{@task.meth} import #{handler}
|
|
15
|
+
event = json.loads(sys.argv[1])
|
|
16
|
+
context = {}
|
|
17
|
+
resp = #{handler}(event, context)
|
|
18
|
+
result = json.dumps(resp)
|
|
19
|
+
print(result)
|
|
20
|
+
EOL
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
data/lib/jets/preheat.rb
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
module Jets
|
|
2
|
+
class Preheat
|
|
3
|
+
extend Memoist
|
|
4
|
+
|
|
5
|
+
# Examples:
|
|
6
|
+
#
|
|
7
|
+
# Jets::Preheat.warm("posts_controller-index")
|
|
8
|
+
# Jets::Preheat.warm("jets-preheat_job-warm")
|
|
9
|
+
#
|
|
10
|
+
def self.warm(function_name, options={})
|
|
11
|
+
Preheat.new(options).warm(function_name)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def self.warm_all(options={})
|
|
15
|
+
Preheat.new(options).warm_all
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def initialize(options)
|
|
19
|
+
@options = options # passed to Call.new options
|
|
20
|
+
@options[:mute_output] = true if @options[:mute_output].nil?
|
|
21
|
+
@options[:lambda_proxy] = false # do not transform controller event from {"event": "1"} to {"queryStringParameters":{"_prewarm":"1"}}
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Makes remote call to the Lambda function.
|
|
25
|
+
def warm(function_name)
|
|
26
|
+
Jets::Commands::Call.new(function_name, '{"_prewarm": "1"}', @options).run unless ENV['TEST']
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Loop through all methods for each class and makes special prewarm call to each method.
|
|
30
|
+
def warm_all
|
|
31
|
+
threads = []
|
|
32
|
+
all_functions.each do |function_name|
|
|
33
|
+
next if function_name.include?('jets-public_controller') # handled by warm_public_controller_more
|
|
34
|
+
next if function_name.include?('jets-rack_controller') # handled by warm_rack_controller_more
|
|
35
|
+
threads << Thread.new do
|
|
36
|
+
warm(function_name)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
threads.each { |t| t.join }
|
|
40
|
+
|
|
41
|
+
# Warm the these controllers more since they can be hit more often
|
|
42
|
+
warm_public_controller_more
|
|
43
|
+
warm_rack_controller_more
|
|
44
|
+
|
|
45
|
+
# return the funciton names so we can see in the Lambda console
|
|
46
|
+
# the functions being prewarmed
|
|
47
|
+
all_functions
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def warm_public_controller_more
|
|
51
|
+
function_name = 'jets-public_controller-show' # key function name
|
|
52
|
+
return unless all_functions.include?(function_name)
|
|
53
|
+
|
|
54
|
+
public_ratio = Jets.config.prewarm.public_ratio
|
|
55
|
+
return if public_ratio == 0
|
|
56
|
+
|
|
57
|
+
puts "Prewarming the public controller extra at a ratio of #{public_ratio}" unless @options[:mute]
|
|
58
|
+
|
|
59
|
+
threads = []
|
|
60
|
+
public_ratio.times do
|
|
61
|
+
threads << Thread.new do
|
|
62
|
+
warm(function_name)
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
threads.each { |t| t.join }
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def warm_rack_controller_more
|
|
69
|
+
return unless Jets.rack?
|
|
70
|
+
function_name = 'jets-rack_controller-process' # key function name
|
|
71
|
+
return unless all_functions.include?(function_name)
|
|
72
|
+
|
|
73
|
+
rack_ratio = Jets.config.prewarm.rack_ratio
|
|
74
|
+
return if rack_ratio == 0
|
|
75
|
+
|
|
76
|
+
puts "Prewarming the rack controller extra at a ratio of #{rack_ratio}" unless @options[:mute]
|
|
77
|
+
|
|
78
|
+
threads = []
|
|
79
|
+
rack_ratio.times do
|
|
80
|
+
threads << Thread.new do
|
|
81
|
+
warm(function_name)
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
threads.each { |t| t.join }
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# Returns:
|
|
88
|
+
# [
|
|
89
|
+
# "posts_controller-index",
|
|
90
|
+
# "posts_controller-show",
|
|
91
|
+
# ...
|
|
92
|
+
# ]
|
|
93
|
+
def all_functions
|
|
94
|
+
classes.map do |klass|
|
|
95
|
+
tasks = klass.tasks.select { |t| t.lang == :ruby } # only prewarm ruby functions
|
|
96
|
+
tasks.map do |task|
|
|
97
|
+
meth = task.meth
|
|
98
|
+
underscored = klass.to_s.underscore.gsub('/','-')
|
|
99
|
+
"#{underscored}-#{meth}" # function_name
|
|
100
|
+
end
|
|
101
|
+
end.flatten.uniq.compact
|
|
102
|
+
end
|
|
103
|
+
memoize :all_functions
|
|
104
|
+
|
|
105
|
+
def classes
|
|
106
|
+
Jets::Commands::Build.app_files.map do |path|
|
|
107
|
+
next if path.include?("preheat_job.rb") # dont want to cause an infinite loop, just in case
|
|
108
|
+
next unless path =~ %r{app/controllers} # only prewarm controllers
|
|
109
|
+
|
|
110
|
+
class_path = path.sub(%r{.*app/\w+/},'').sub(/\.rb$/,'')
|
|
111
|
+
class_name = class_path.classify
|
|
112
|
+
# IE: PostsController
|
|
113
|
+
class_name.constantize # load app/**/* class definition
|
|
114
|
+
end.compact
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# Jets::Processors::Deducer class figures out information that allows the
|
|
2
|
+
# controller or job to be called. Sme key methods for deducer:
|
|
3
|
+
#
|
|
4
|
+
# code - code to instance eval. IE: PostsController.new(event, context).index
|
|
5
|
+
# path - full path to the app code. IE: #{Jets.root}app/controllers/posts_controller.rb
|
|
6
|
+
#
|
|
7
|
+
class Jets::Processors::Deducer
|
|
8
|
+
def initialize(handler)
|
|
9
|
+
@handler = handler # handlers/controllers/posts.show
|
|
10
|
+
# @handler_path: "handlers/controllers/posts"
|
|
11
|
+
# @handler_method: "show"
|
|
12
|
+
@handler_path, @handler_method = @handler.split('.')
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def code
|
|
16
|
+
# code: "PostsController.process(event, context, meth: "show")"
|
|
17
|
+
# code: "HardJob.process(event, context, meth: "dig")"
|
|
18
|
+
%|#{class_name}.process(event, context, "#{@handler_method}")|
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# Input: @handler_path: handlers/jobs/hard_job.rb
|
|
22
|
+
# Output: #{Jets.root/app/jobs/hard_job.rb
|
|
23
|
+
def path
|
|
24
|
+
@handler_path.sub("handlers", "app") + ".rb"
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# process_type is key. It can be either "controller" or "job". It is used to
|
|
28
|
+
# deduce the rest of the methods: code, path.
|
|
29
|
+
def process_type
|
|
30
|
+
if shared?
|
|
31
|
+
"function" # all app/shared/functions are always function process_type
|
|
32
|
+
else
|
|
33
|
+
@handler.split('/')[1].singularize # controller, job, rule, etc
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def shared?
|
|
38
|
+
@handler.include?("/shared/functions")
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Example underscored_class_name:
|
|
42
|
+
# class_name = underscored_class_name
|
|
43
|
+
# class_name = class_name # PostsController
|
|
44
|
+
def class_name
|
|
45
|
+
regexp = shared? ?
|
|
46
|
+
Regexp.new(".*handlers/shared/functions/") :
|
|
47
|
+
Regexp.new(".*handlers/#{process_type.pluralize}/")
|
|
48
|
+
|
|
49
|
+
# Example regexp:
|
|
50
|
+
# /.*handlers\/controllers\//
|
|
51
|
+
# /.*handlers\/jobs\//
|
|
52
|
+
class_name = @handler_path.sub(regexp, "")
|
|
53
|
+
# Example class names:
|
|
54
|
+
# posts_controller
|
|
55
|
+
# hard_job
|
|
56
|
+
# hello
|
|
57
|
+
# hello_function
|
|
58
|
+
|
|
59
|
+
class_name.classify
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def load_class
|
|
63
|
+
Jets::Klass.from_path(path)
|
|
64
|
+
end
|
|
65
|
+
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
require 'json'
|
|
2
|
+
require 'stringio'
|
|
3
|
+
|
|
4
|
+
# Node shim calls this class to process both controllers and jobs
|
|
5
|
+
class Jets::Processors::MainProcessor
|
|
6
|
+
attr_reader :event, :context, :handler
|
|
7
|
+
def initialize(event, context, handler)
|
|
8
|
+
@event = event
|
|
9
|
+
@context = context
|
|
10
|
+
@handler = handler
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def run
|
|
14
|
+
# Use the handler to deduce app code to run.
|
|
15
|
+
# Example handlers: handlers/controllers/posts.create, handlers/jobs/sleep.perform
|
|
16
|
+
#
|
|
17
|
+
# deducer = Jets::Processors::Deducer.new("handlers/controllers/posts.create")
|
|
18
|
+
#
|
|
19
|
+
deducer = Jets::Processors::Deducer.new(handler)
|
|
20
|
+
begin
|
|
21
|
+
# Examples:
|
|
22
|
+
# deducer.code => PostsController.process(event, context, "show")
|
|
23
|
+
# deducer.path => app/controllers/posts_controller.rb
|
|
24
|
+
#
|
|
25
|
+
# deducer.code => HardJob.process(event, context, "dig")
|
|
26
|
+
# deducer.path => app/jobs/hard_job.rb
|
|
27
|
+
#
|
|
28
|
+
# deducer.code => HelloFunction.process(event, context, "world")
|
|
29
|
+
# deducer.path => app/functions/hello.rb
|
|
30
|
+
deducer.load_class
|
|
31
|
+
# result = PostsController.process(event, context, "create")
|
|
32
|
+
result = instance_eval(deducer.code, deducer.path)
|
|
33
|
+
result = HashWithIndifferentAccess.new(result) if result.is_a?(Hash)
|
|
34
|
+
|
|
35
|
+
Jets.increase_call_count
|
|
36
|
+
|
|
37
|
+
if result.is_a?(Hash) && result["headers"]
|
|
38
|
+
result["headers"]["x-jets-call-count"] = Jets.call_count
|
|
39
|
+
result["headers"]["x-jets-prewarm-count"] = Jets.prewarm_count
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
result
|
|
43
|
+
rescue Exception => e
|
|
44
|
+
unless ENV['TEST']
|
|
45
|
+
# Customize error message slightly so nodejs shim can process the
|
|
46
|
+
# returned error message.
|
|
47
|
+
# The "RubyError: " is a marker that the javascript shim scans for.
|
|
48
|
+
$stderr.puts("RubyError: #{e.class}: #{e.message}") # js needs this as the first line
|
|
49
|
+
backtrace = e.backtrace.map {|l| " #{l}" }
|
|
50
|
+
$stderr.puts(backtrace)
|
|
51
|
+
# No need to having error in stderr above anymore because errors are handled in memory
|
|
52
|
+
# at ruby_server.rb but keeping around for posterity.
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
Jets.on_exception(e)
|
|
56
|
+
raise(e) # raise error to ruby_server.rb to rescue and handle
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|