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,25 @@
|
|
|
1
|
+
class Jets::RackController < Jets::Controller::Base
|
|
2
|
+
layout false
|
|
3
|
+
internal true
|
|
4
|
+
|
|
5
|
+
# Megamode
|
|
6
|
+
def process
|
|
7
|
+
resp = mega_request
|
|
8
|
+
render(resp)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
private
|
|
12
|
+
# Override process! so it doesnt go through middleware adapter and hits
|
|
13
|
+
# process logic directly. This handles the case for AWS Lambda.
|
|
14
|
+
# For local server, we adjust the Middleware::Local logic.
|
|
15
|
+
def process!
|
|
16
|
+
status, headers, body = dispatch!
|
|
17
|
+
# Use the adapter only to convert the Rack triplet to a API Gateway hash structure
|
|
18
|
+
adapter = Jets::Controller::Rack::Adapter.new(event, context, meth)
|
|
19
|
+
adapter.convert_to_api_gateway(status, headers, body)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def mega_request
|
|
23
|
+
Jets::Mega::Request.new(event, self).proxy
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
require 'aws-sdk-apigateway'
|
|
2
|
+
require 'aws-sdk-cloudformation'
|
|
3
|
+
|
|
4
|
+
STAGE_NAME = "<%= @stage_name %>"
|
|
5
|
+
|
|
6
|
+
def lambda_handler(event:, context:)
|
|
7
|
+
puts("event['RequestType'] #{event['RequestType']}")
|
|
8
|
+
puts("event: #{JSON.dump(event)}")
|
|
9
|
+
puts("context: #{JSON.dump(context)}")
|
|
10
|
+
puts("context.log_stream_name #{context.log_stream_name.inspect}")
|
|
11
|
+
|
|
12
|
+
mimic = event['ResourceProperties']['Mimic']
|
|
13
|
+
physical_id = event['ResourceProperties']['PhysicalId'] || "PhysicalId"
|
|
14
|
+
|
|
15
|
+
puts "mimic: #{mimic}"
|
|
16
|
+
puts "physical_id: #{physical_id}"
|
|
17
|
+
|
|
18
|
+
if event['RequestType'] == 'Delete'
|
|
19
|
+
if mimic == 'FAILED'
|
|
20
|
+
send_response(event, context, "FAILED")
|
|
21
|
+
else
|
|
22
|
+
mapping = BasePathMapping.new(event)
|
|
23
|
+
mapping.delete(true) if mapping.should_delete?
|
|
24
|
+
send_response(event, context, "SUCCESS")
|
|
25
|
+
end
|
|
26
|
+
return # early return
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
mapping = BasePathMapping.new(event)
|
|
30
|
+
mapping.update
|
|
31
|
+
|
|
32
|
+
response_status = mimic == "FAILED" ? "FAILED" : "SUCCESS"
|
|
33
|
+
response_data = { "Hello" => "World" }
|
|
34
|
+
|
|
35
|
+
send_response(event, context, response_status, response_data, physical_id)
|
|
36
|
+
|
|
37
|
+
# We rescue all exceptions and send an message to CloudFormation so we dont have to
|
|
38
|
+
# wait for over an hour for the stack operation to timeout and rollback.
|
|
39
|
+
rescue Exception => e
|
|
40
|
+
puts e.message
|
|
41
|
+
puts e.backtrace
|
|
42
|
+
sleep 10 # provide delete to make sure that the log gets sent to CloudWatch
|
|
43
|
+
send_response(event, context, "FAILED")
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def send_response(event, context, response_status, response_data={}, physical_id="PhysicalId")
|
|
47
|
+
response_body = JSON.dump(
|
|
48
|
+
Status: response_status,
|
|
49
|
+
Reason: "See the details in CloudWatch Log Stream: #{context.log_stream_name.inspect}",
|
|
50
|
+
PhysicalResourceId: physical_id,
|
|
51
|
+
StackId: event['StackId'],
|
|
52
|
+
RequestId: event['RequestId'],
|
|
53
|
+
LogicalResourceId: event['LogicalResourceId'],
|
|
54
|
+
Data: response_data
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
puts "RESPONSE BODY:\n"
|
|
58
|
+
puts response_body
|
|
59
|
+
|
|
60
|
+
url = event['ResponseURL']
|
|
61
|
+
uri = URI(url)
|
|
62
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
|
63
|
+
http.open_timeout = http.read_timeout = 30
|
|
64
|
+
http.use_ssl = true if uri.scheme == 'https'
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
# must used url to include the AWSAccessKeyId and Signature
|
|
68
|
+
req = Net::HTTP::Put.new(url) # url includes query string and uri.path does not, must used url t
|
|
69
|
+
req.body = response_body
|
|
70
|
+
req.content_length = response_body.bytesize
|
|
71
|
+
|
|
72
|
+
# set headers
|
|
73
|
+
req['content-type'] = ''
|
|
74
|
+
req['content-length'] = response_body.bytesize
|
|
75
|
+
|
|
76
|
+
res = http.request(req)
|
|
77
|
+
puts "status code: #{res.code}"
|
|
78
|
+
puts "headers: #{res.each_header.to_h.inspect}"
|
|
79
|
+
puts "body: #{res.body}"
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
class BasePathMapping
|
|
84
|
+
def initialize(event)
|
|
85
|
+
@event = event
|
|
86
|
+
@rest_api_id = get_rest_api_id
|
|
87
|
+
@domain_name = get_domain_name
|
|
88
|
+
@base_path = ''
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def update
|
|
92
|
+
# Cannot use update_base_path_mapping to update the base_mapping because it doesnt
|
|
93
|
+
# allow us to change the rest_api_id. So we delete and create.
|
|
94
|
+
delete(true)
|
|
95
|
+
create
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# Dont delete the newly created base path mapping unless this is an operation
|
|
99
|
+
# where we're fully deleting the stack
|
|
100
|
+
def should_delete?
|
|
101
|
+
deleting_parent?
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def delete(fail_silently=false)
|
|
105
|
+
apigateway.delete_base_path_mapping(
|
|
106
|
+
domain_name: @domain_name, # required
|
|
107
|
+
base_path: '(none)',
|
|
108
|
+
)
|
|
109
|
+
rescue Aws::APIGateway::Errors::NotFoundException => e
|
|
110
|
+
raise(e) unless fail_silently
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def create
|
|
114
|
+
apigateway.create_base_path_mapping(
|
|
115
|
+
domain_name: @domain_name, # required
|
|
116
|
+
base_path: @base_path,
|
|
117
|
+
rest_api_id: @rest_api_id, # required
|
|
118
|
+
stage: STAGE_NAME,
|
|
119
|
+
)
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def get_domain_name
|
|
123
|
+
param = deployment_stack[:parameters].find { |p| p.parameter_key == 'DomainName' }
|
|
124
|
+
param.parameter_value
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def deployment_stack
|
|
128
|
+
@deployment_stack ||= cfn.describe_stacks(stack_name: @event['StackId']).stacks.first
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def get_rest_api_id
|
|
132
|
+
param = deployment_stack[:parameters].find { |p| p.parameter_key == 'RestApi' }
|
|
133
|
+
param.parameter_value
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def deleting_parent?
|
|
137
|
+
stack = cfn.describe_stacks(stack_name: parent_stack_name).stacks.first
|
|
138
|
+
stack.stack_status == 'DELETE_IN_PROGRESS'
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def parent_stack_name
|
|
142
|
+
deployment_stack[:root_id]
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
private
|
|
146
|
+
def apigateway
|
|
147
|
+
@apigateway ||= Aws::APIGateway::Client.new
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def cfn
|
|
151
|
+
@cfn ||= Aws::CloudFormation::Client.new
|
|
152
|
+
end
|
|
153
|
+
end
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
class Jets::PreheatJob < ApplicationJob
|
|
2
|
+
ENABLED = Jets.config.prewarm.enable
|
|
3
|
+
CONCURRENCY = Jets.config.prewarm.concurrency
|
|
4
|
+
PREWARM_RATE = Jets.config.prewarm.rate
|
|
5
|
+
torching = ENABLED && CONCURRENCY > 1
|
|
6
|
+
warming = ENABLED && CONCURRENCY == 1
|
|
7
|
+
|
|
8
|
+
class_timeout 30
|
|
9
|
+
class_memory 1024
|
|
10
|
+
class_iam_policy(
|
|
11
|
+
{
|
|
12
|
+
sid: "Statement1",
|
|
13
|
+
action: ["logs:*"],
|
|
14
|
+
effect: "Allow",
|
|
15
|
+
resource: "arn:aws:logs:#{Jets.aws.region}:#{Jets.aws.account}:log-group:#{Jets.config.project_namespace}-*",
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
sid: "Statement2",
|
|
19
|
+
action: ["lambda:InvokeFunction", "lambda:InvokeAsync"],
|
|
20
|
+
effect: "Allow",
|
|
21
|
+
resource: "arn:aws:lambda:#{Jets.aws.region}:#{Jets.aws.account}:function:#{Jets.config.project_namespace}-*",
|
|
22
|
+
}
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
rate(PREWARM_RATE) if torching
|
|
26
|
+
def torch
|
|
27
|
+
threads = []
|
|
28
|
+
CONCURRENCY.times do
|
|
29
|
+
threads << Thread.new do
|
|
30
|
+
# intentionally calling remote lambda for concurrency
|
|
31
|
+
# avoid passing the _prewarm=1 flag because we want the PreheatJob#warm
|
|
32
|
+
# to run it's normal workload.
|
|
33
|
+
# Do not use Jets::Preheat.warm(function_name) here as that passes the _prewarm=1.
|
|
34
|
+
function_name = "jets-preheat_job-warm"
|
|
35
|
+
event_json = JSON.dump(event)
|
|
36
|
+
options = call_options(event[:quiet])
|
|
37
|
+
Jets::Commands::Call.new(function_name, event_json, options).run unless ENV['TEST']
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
threads.each { |t| t.join }
|
|
41
|
+
"Finished prewarming your application with a concurrency of #{CONCURRENCY}."
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
rate(PREWARM_RATE) if warming
|
|
45
|
+
def warm
|
|
46
|
+
options = call_options(event[:quiet])
|
|
47
|
+
Jets::Preheat.warm_all(options)
|
|
48
|
+
"Finished prewarming your application."
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
private
|
|
52
|
+
def call_options(quiet)
|
|
53
|
+
options = {}
|
|
54
|
+
options.merge!(mute: true, mute_output: true) if quiet
|
|
55
|
+
# All the methods in this Job class leads to Jets::Commands::Call.
|
|
56
|
+
# This is true for the Jets::Preheat.warm_all also.
|
|
57
|
+
# These jobs delegate out to Lambda function calls. We do not need/want
|
|
58
|
+
# the invocation type: RequestResponse in this case.
|
|
59
|
+
options.merge!(invocation_type: "Event")
|
|
60
|
+
options
|
|
61
|
+
end
|
|
62
|
+
end
|
data/lib/jets/io.rb
ADDED
data/lib/jets/job.rb
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
require 'json'
|
|
2
|
+
|
|
3
|
+
# Job public methods get turned into Lambda functions.
|
|
4
|
+
#
|
|
5
|
+
# Jets::Job::Base < Jets::Lambda::Functions
|
|
6
|
+
# Both Jets::Job::Base and Jets::Lambda::Functions have Dsl modules included.
|
|
7
|
+
# So the Jets::Job::Dsl overrides some of the Jets::Lambda::Functions behavior.
|
|
8
|
+
class Jets::Job
|
|
9
|
+
class Base < Jets::Lambda::Functions
|
|
10
|
+
include Dsl
|
|
11
|
+
|
|
12
|
+
class << self
|
|
13
|
+
def process(event, context, meth)
|
|
14
|
+
job = new(event, context, meth)
|
|
15
|
+
job.send(meth)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def perform_now(meth, event={}, context={})
|
|
19
|
+
new(event, context, meth).send(meth)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def perform_later(meth, event={}, context={})
|
|
23
|
+
function_name = "#{self.to_s.underscore}-#{meth}"
|
|
24
|
+
call = Jets::Commands::Call.new(function_name, JSON.dump(event), invocation_type: "Event")
|
|
25
|
+
call.run
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
data/lib/jets/job/dsl.rb
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# Jets::Job::Base < Jets::Lambda::Functions
|
|
2
|
+
# Both Jets::Job::Base and Jets::Lambda::Functions have Dsl modules included.
|
|
3
|
+
# So the Jets::Job::Dsl overrides some of the Jets::Lambda::Functions behavior.
|
|
4
|
+
#
|
|
5
|
+
# Implements:
|
|
6
|
+
#
|
|
7
|
+
# default_associated_resource_definition
|
|
8
|
+
#
|
|
9
|
+
module Jets::Job::Dsl
|
|
10
|
+
extend ActiveSupport::Concern
|
|
11
|
+
|
|
12
|
+
included do
|
|
13
|
+
class << self
|
|
14
|
+
# Public: Creates CloudWatch Event Rule
|
|
15
|
+
#
|
|
16
|
+
# expression - The rate expression.
|
|
17
|
+
#
|
|
18
|
+
# Examples
|
|
19
|
+
#
|
|
20
|
+
# rate("10 minutes")
|
|
21
|
+
# rate("10 minutes", description: "Hard job")
|
|
22
|
+
#
|
|
23
|
+
def rate(expression, props={})
|
|
24
|
+
schedule_job("rate(#{expression})", props)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Public: Creates CloudWatch Event Rule
|
|
28
|
+
#
|
|
29
|
+
# expression - The cron expression.
|
|
30
|
+
#
|
|
31
|
+
# Examples
|
|
32
|
+
#
|
|
33
|
+
# cron("0 */12 * * ? *")
|
|
34
|
+
# cron("0 */12 * * ? *", description: "Hard job")
|
|
35
|
+
#
|
|
36
|
+
def cron(expression, props={})
|
|
37
|
+
schedule_job("cron(#{expression})", props)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def schedule_job(expression, props={})
|
|
41
|
+
@associated_properties = nil # dont use any current associated_properties
|
|
42
|
+
props = props.merge(schedule_expression: expression)
|
|
43
|
+
associated_properties(props)
|
|
44
|
+
# Eager define resource
|
|
45
|
+
resource(events_rule_definition) # add associated resources immediately
|
|
46
|
+
@associated_properties = nil # reset for next definition, since we're defining eagerly
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def event_pattern(details={}, props={})
|
|
50
|
+
@associated_properties = nil # dont use any current associated_properties
|
|
51
|
+
props = props.merge(event_pattern: details)
|
|
52
|
+
associated_properties(props)
|
|
53
|
+
# Eager define resource
|
|
54
|
+
resource(events_rule_definition) # add associated resources immediately
|
|
55
|
+
@associated_properties = nil # reset for next definition, since we're defining eagerly
|
|
56
|
+
add_descriptions # useful: generic description in the Event Rule console
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def events_rule(props={})
|
|
60
|
+
@associated_properties = nil # dont use any current associated_properties
|
|
61
|
+
associated_properties(props)
|
|
62
|
+
# Eager define resource
|
|
63
|
+
resource(events_rule_definition) # add associated resources immediately
|
|
64
|
+
@associated_properties = nil # reset for next definition, since we're defining eagerly
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Works with eager definitions
|
|
68
|
+
def add_descriptions
|
|
69
|
+
numbered_resources = []
|
|
70
|
+
n = 1
|
|
71
|
+
@associated_resources.map do |associated|
|
|
72
|
+
# definition = associated.definition
|
|
73
|
+
# puts "associated #{associated.inspect}"
|
|
74
|
+
# puts "definition #{definition.inspect}"
|
|
75
|
+
|
|
76
|
+
# logical_id = definition.keys.first
|
|
77
|
+
# attributes = definition.values.first
|
|
78
|
+
|
|
79
|
+
logical_id = associated.logical_id
|
|
80
|
+
attributes = associated.attributes
|
|
81
|
+
|
|
82
|
+
attributes[:properties][:description] ||= "#{self.name} Event Rule #{n}"
|
|
83
|
+
new_definition = { "#{logical_id}" => attributes }
|
|
84
|
+
numbered_resources << Jets::Resource::Associated.new(new_definition)
|
|
85
|
+
n += 1
|
|
86
|
+
end
|
|
87
|
+
@associated_resources = numbered_resources
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
ASSOCIATED_PROPERTIES = %W[
|
|
91
|
+
description
|
|
92
|
+
state
|
|
93
|
+
schedule_expression
|
|
94
|
+
]
|
|
95
|
+
define_associated_properties(ASSOCIATED_PROPERTIES)
|
|
96
|
+
alias_method :desc, :description
|
|
97
|
+
|
|
98
|
+
def default_associated_resource_definition(meth)
|
|
99
|
+
events_rule_definition
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def events_rule_definition
|
|
103
|
+
resource = Jets::Resource::Events::Rule.new(associated_properties)
|
|
104
|
+
resource.definition # returns a definition to be added by associated_resources
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|
data/lib/jets/klass.rb
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# Loading a class can usually be loaded via .constantize.
|
|
2
|
+
# But app/functions files are anonymous ruby classes created with
|
|
3
|
+
# Class.new. Anonymous classes cannot be loaded via .constantize and
|
|
4
|
+
# go through standard autoloading.
|
|
5
|
+
#
|
|
6
|
+
# Jets::Klass provides a way to load app classes in app/controllers, app/jobs,
|
|
7
|
+
# app/functions in a consistent way without having to worry about the anonymous
|
|
8
|
+
# class loading quirk. Classes that are not anonymously defined like controllers
|
|
9
|
+
# and jobs are loaded via autoloading with .constantize. Anonymously defined
|
|
10
|
+
# classes like functions are loaded via Object.const_set.
|
|
11
|
+
#
|
|
12
|
+
# Examples:
|
|
13
|
+
#
|
|
14
|
+
# Jets::Klass.from_path("app/controllers/posts_controller.rb")
|
|
15
|
+
# Jets::Klass.from_path("app/jobs/hard_job.rb")
|
|
16
|
+
# Jets::Klass.from_path("app/functions/hello.rb")
|
|
17
|
+
# Jets::Klass.from_path("app/functions/hello_function.rb")
|
|
18
|
+
# Jets::Klass.from_path("app/shared/functions/whatever.rb")
|
|
19
|
+
#
|
|
20
|
+
# Jets::Klass.from_task(task)
|
|
21
|
+
#
|
|
22
|
+
# The from_task method takes a Jets::Lambda::Task as an argument and is useful
|
|
23
|
+
# for the CloudFormation child stack generation there the registered task info
|
|
24
|
+
# is available but the path info is now.
|
|
25
|
+
class Jets::Klass
|
|
26
|
+
class << self
|
|
27
|
+
# from_path allows us to load any app classes in consistent way for
|
|
28
|
+
# app/controllers, app/jobs, and app/functions.
|
|
29
|
+
def from_path(path)
|
|
30
|
+
class_name = class_name(path)
|
|
31
|
+
if path.include?("/functions/") # simple function
|
|
32
|
+
class_name = load_anonymous_class(class_name, path)
|
|
33
|
+
class_name.constantize # removed :: for anonymous classes
|
|
34
|
+
else
|
|
35
|
+
class_name.constantize # autoload
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# app/controllers/posts_controller.rb => PostsController
|
|
40
|
+
def class_name(path)
|
|
41
|
+
if path.include?("/shared/")
|
|
42
|
+
path.sub(%r{.*app/shared/(.*?)/},'').sub(/\.rb$/,'').classify
|
|
43
|
+
else
|
|
44
|
+
path.sub(%r{.*app/(.*?)/},'').sub(/\.rb$/,'').classify
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def from_task(task)
|
|
49
|
+
class_name = task.class_name
|
|
50
|
+
filename = class_name.underscore
|
|
51
|
+
|
|
52
|
+
# Examples of filename: posts_controller, hard_job, security_rule,
|
|
53
|
+
# hello_function, hello
|
|
54
|
+
valid_types = %w[controller job rule]
|
|
55
|
+
type = filename.split('_').last
|
|
56
|
+
type = "function" unless valid_types.include?(type)
|
|
57
|
+
|
|
58
|
+
path = "app/#{type.pluralize}/#{filename}.rb"
|
|
59
|
+
from_path(path)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
@@loaded_anonymous_classes = []
|
|
63
|
+
def load_anonymous_class(class_name, path)
|
|
64
|
+
parent_mod = modularize(class_name)
|
|
65
|
+
|
|
66
|
+
constructor = Jets::Lambda::FunctionConstructor.new(path)
|
|
67
|
+
# Dont load anonyomous class more than once to avoid these warnings:
|
|
68
|
+
# warning: already initialized constant Hello
|
|
69
|
+
# warning: previous definition of Hello was here
|
|
70
|
+
unless @@loaded_anonymous_classes.include?(class_name)
|
|
71
|
+
# use class_name as the variable name for prettier class name.
|
|
72
|
+
leaf_class_name = class_name.split('::').last
|
|
73
|
+
parent_mod.const_set(leaf_class_name, constructor.build)
|
|
74
|
+
@@loaded_anonymous_classes << class_name
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
class_name
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Ensures the parent namespace modules are defined. Example:
|
|
81
|
+
#
|
|
82
|
+
# modularize("Foo::Bar::Test")
|
|
83
|
+
# => Foo::Bar # is a now defined as a module if it wasnt before
|
|
84
|
+
#
|
|
85
|
+
# Also returns the parent module, so we can use it to do a const_set if needed. IE:
|
|
86
|
+
#
|
|
87
|
+
# parent_mod = modularize("Foo::Bar::Test")
|
|
88
|
+
# parent_mod.const_set("Test")
|
|
89
|
+
def modularize(class_name)
|
|
90
|
+
leaves = []
|
|
91
|
+
mods = class_name.split('::')[0..-2] # drop the last word
|
|
92
|
+
# puts "mods: #{mods}"
|
|
93
|
+
return Object if mods.empty?
|
|
94
|
+
|
|
95
|
+
leaves = []
|
|
96
|
+
mods.each do |leaf_mod|
|
|
97
|
+
leaves += [leaf_mod]
|
|
98
|
+
namespace = leaves.join('::')
|
|
99
|
+
previous_namespace = leaves[0..-2].join('::')
|
|
100
|
+
previous_namespace = "Object" if previous_namespace.empty?
|
|
101
|
+
previous_namespace = previous_namespace.constantize
|
|
102
|
+
previous_namespace.const_set(leaf_mod, Module.new) unless Object.const_defined?(namespace)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
mods.join('::').constantize
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
end
|
|
109
|
+
end
|