jets 0.2.0 → 0.5.0
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 +5 -5
- data/.circleci/bin/commit_docs.sh +26 -0
- data/.circleci/config.yml +126 -0
- data/.codebuild/README.md +57 -0
- data/.codebuild/bin/jets +3 -0
- data/.codebuild/buildspec-base.yml +14 -0
- data/.codebuild/integration.sh +54 -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 +20 -0
- data/.codebuild/scripts/install-node.sh +4 -0
- data/.gitignore +3 -0
- data/.gitmodules +9 -0
- data/.python-version +1 -0
- data/.rspec +2 -0
- data/.ruby-version +1 -1
- data/CHANGELOG.md +3 -0
- data/Dockerfile +16 -0
- data/Dockerfile.base +53 -0
- data/Gemfile +8 -1
- data/Gemfile.lock +132 -28
- data/LICENSE.txt +1 -1
- data/Procfile +2 -0
- data/README.md +116 -17
- data/Rakefile +6 -0
- data/buildspec.yml +18 -0
- data/exe/jets +14 -0
- data/jets.gemspec +31 -3
- data/lib/jets.rb +56 -8
- data/lib/jets/application.rb +121 -0
- data/lib/jets/application/middleware.rb +23 -0
- data/lib/jets/aws_services.rb +71 -0
- data/lib/jets/booter.rb +95 -0
- data/lib/jets/builders.rb +6 -0
- data/lib/jets/builders/code_builder.rb +431 -0
- data/lib/jets/builders/deducer.rb +73 -0
- data/lib/jets/builders/gem_replacer.rb +154 -0
- data/lib/jets/builders/handler_generator.rb +76 -0
- data/lib/jets/builders/node-hello.js +73 -0
- data/lib/jets/builders/node-shim.js +151 -0
- data/lib/jets/cfn.rb +5 -4
- data/lib/jets/cfn/ship.rb +178 -0
- data/lib/jets/cfn/status.rb +208 -0
- data/lib/jets/cfn/template_builders.rb +21 -0
- data/lib/jets/cfn/template_builders/api_gateway_builder.rb +73 -0
- data/lib/jets/cfn/template_builders/api_gateway_deployment_builder.rb +38 -0
- data/lib/jets/cfn/template_builders/base_child_builder.rb +38 -0
- data/lib/jets/cfn/template_builders/controller_builder.rb +107 -0
- data/lib/jets/cfn/template_builders/function_builder.rb +20 -0
- data/lib/jets/cfn/template_builders/function_properties.rb +6 -0
- data/lib/jets/cfn/template_builders/function_properties/base_builder.rb +106 -0
- data/lib/jets/cfn/template_builders/function_properties/node_builder.rb +12 -0
- data/lib/jets/cfn/template_builders/function_properties/python_builder.rb +12 -0
- data/lib/jets/cfn/template_builders/function_properties/ruby_builder.rb +13 -0
- data/lib/jets/cfn/template_builders/interface.rb +91 -0
- data/lib/jets/cfn/template_builders/job_builder.rb +63 -0
- data/lib/jets/cfn/template_builders/parent_builder.rb +97 -0
- data/lib/jets/cfn/template_builders/rule_builder.rb +55 -0
- data/lib/jets/cfn/template_builders/templates/minimal-stack.yml +45 -0
- data/lib/jets/cfn/template_mappers.rb +23 -0
- data/lib/jets/cfn/template_mappers/api_gateway_deployment_mapper.rb +48 -0
- data/lib/jets/cfn/template_mappers/api_gateway_mapper.rb +4 -0
- data/lib/jets/cfn/template_mappers/child_mapper.rb +41 -0
- data/lib/jets/cfn/template_mappers/config_rule_mapper.rb +34 -0
- data/lib/jets/cfn/template_mappers/controller_mapper.rb +36 -0
- data/lib/jets/cfn/template_mappers/events_rule_mapper.rb +40 -0
- data/lib/jets/cfn/template_mappers/function_mapper.rb +4 -0
- data/lib/jets/cfn/template_mappers/gateway_method_mapper.rb +56 -0
- data/lib/jets/cfn/template_mappers/gateway_resource_mapper.rb +62 -0
- data/lib/jets/cfn/template_mappers/job_mapper.rb +4 -0
- data/lib/jets/cfn/template_mappers/lambda_function_mapper.rb +50 -0
- data/lib/jets/cfn/template_mappers/rule_mapper.rb +5 -0
- data/lib/jets/cli.rb +180 -15
- data/lib/jets/commands.rb +22 -0
- data/lib/jets/commands/base.rb +151 -0
- data/lib/jets/commands/build.rb +186 -0
- data/lib/jets/commands/call.rb +175 -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 +51 -0
- data/lib/jets/commands/console.rb +12 -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 +30 -0
- data/lib/jets/commands/dbconsole.rb +131 -0
- data/lib/jets/commands/delete.rb +119 -0
- data/lib/jets/commands/deploy.rb +53 -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/help.rb +9 -0
- data/lib/jets/commands/help/build.md +1 -0
- data/lib/jets/commands/help/call.md +55 -0
- data/lib/jets/commands/help/console.md +4 -0
- data/lib/jets/commands/help/db/generate.md +8 -0
- data/lib/jets/commands/help/dbconsole.md +5 -0
- data/lib/jets/commands/help/delete.md +9 -0
- data/lib/jets/commands/help/deploy.md +5 -0
- data/lib/jets/commands/help/dynamodb/generate.md +50 -0
- data/lib/jets/commands/help/dynamodb/migrate.md +4 -0
- data/lib/jets/commands/help/generate.md +5 -0
- data/lib/jets/commands/help/new.md +9 -0
- data/lib/jets/commands/help/process/controller.md +6 -0
- data/lib/jets/commands/help/process/function.md +5 -0
- data/lib/jets/commands/help/process/job.md +5 -0
- data/lib/jets/commands/help/process/rule.md +5 -0
- data/lib/jets/commands/help/routes.md +3 -0
- data/lib/jets/commands/help/server.md +6 -0
- data/lib/jets/commands/help/status.md +1 -0
- data/lib/jets/commands/help/url.md +5 -0
- data/lib/jets/commands/main.rb +111 -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 +110 -0
- data/lib/jets/commands/rake_command.rb +61 -0
- data/lib/jets/commands/rake_tasks.rb +45 -0
- data/lib/jets/commands/sequence.rb +44 -0
- data/lib/jets/commands/stack_info.rb +30 -0
- data/lib/jets/commands/templates/skeleton/.env +2 -0
- data/lib/jets/commands/templates/skeleton/.env.development.tt +3 -0
- data/lib/jets/commands/templates/skeleton/.env.test +3 -0
- data/lib/jets/commands/templates/skeleton/.gitignore +14 -0
- data/lib/jets/commands/templates/skeleton/.jetskeep +1 -0
- data/lib/jets/commands/templates/skeleton/Gemfile.tt +27 -0
- data/lib/jets/commands/templates/skeleton/Procfile +7 -0
- data/lib/jets/commands/templates/skeleton/README.md +4 -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 +2 -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 +24 -0
- data/lib/jets/commands/templates/skeleton/bin/ruby_server +18 -0
- data/lib/jets/commands/templates/skeleton/bin/ruby_server.rb +2 -0
- data/lib/jets/commands/templates/skeleton/config.ru +4 -0
- data/lib/jets/commands/templates/skeleton/config/application.rb.tt +26 -0
- data/lib/jets/commands/templates/skeleton/config/database.yml.tt +27 -0
- data/lib/jets/commands/templates/skeleton/config/dynamodb.yml +25 -0
- data/lib/jets/commands/templates/skeleton/config/routes.rb +8 -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 +79 -0
- data/lib/jets/commands/templates/skeleton/spec/controllers/posts_controller_spec.rb +18 -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 +27 -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/url.rb +45 -0
- data/lib/jets/commands/webpacker_template.rb +19 -0
- data/lib/jets/controller.rb +9 -0
- data/lib/jets/controller/base.rb +50 -0
- data/lib/jets/controller/callbacks.rb +43 -0
- data/lib/jets/controller/layout.rb +17 -0
- data/lib/jets/controller/params.rb +53 -0
- data/lib/jets/controller/redirection.rb +55 -0
- data/lib/jets/controller/renderers.rb +5 -0
- data/lib/jets/controller/renderers/aws_proxy_renderer.rb +69 -0
- data/lib/jets/controller/renderers/base_renderer.rb +16 -0
- data/lib/jets/controller/renderers/template_renderer.rb +107 -0
- data/lib/jets/controller/rendering.rb +80 -0
- data/lib/jets/controller/request.rb +55 -0
- data/lib/jets/core.rb +81 -0
- data/lib/jets/default/application.rb +20 -0
- data/lib/jets/dotenv.rb +37 -0
- data/lib/jets/erb.rb +51 -0
- data/lib/jets/generator.rb +40 -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 +71 -0
- data/lib/jets/internal/app/controllers/jets/public_controller.rb +30 -0
- data/lib/jets/internal/app/controllers/jets/public_controller/python/show.py +47 -0
- data/lib/jets/internal/app/controllers/jets/public_controller/python/show.pyc +0 -0
- data/lib/jets/internal/app/controllers/jets/welcome_controller.rb +22 -0
- data/lib/jets/internal/app/controllers/jets/welcome_controller/python/index.py +24 -0
- data/lib/jets/internal/app/jobs/jets/preheat_job.rb +52 -0
- data/lib/jets/job.rb +5 -0
- data/lib/jets/job/base.rb +29 -0
- data/lib/jets/job/dsl.rb +58 -0
- data/lib/jets/job/task.rb +17 -0
- data/lib/jets/klass.rb +71 -0
- data/lib/jets/lambda.rb +18 -0
- data/lib/jets/lambda/dsl.rb +153 -0
- data/lib/jets/lambda/function.rb +29 -0
- data/lib/jets/lambda/function_constructor.rb +60 -0
- data/lib/jets/lambda/functions.rb +22 -0
- data/lib/jets/lambda/task.rb +77 -0
- data/lib/jets/naming.rb +61 -0
- data/lib/jets/pascalize.rb +30 -0
- data/lib/jets/poly_fun.rb +61 -0
- data/lib/jets/poly_fun/base_executor.rb +129 -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 +72 -0
- data/lib/jets/processors.rb +4 -0
- data/lib/jets/processors/deducer.rb +54 -0
- data/lib/jets/processors/main_processor.rb +57 -0
- data/lib/jets/rails_overrides.rb +4 -0
- data/lib/jets/rails_overrides/asset_tag_helper.rb +41 -0
- data/lib/jets/rails_overrides/common_methods.rb +13 -0
- data/lib/jets/rails_overrides/rendering_helper.rb +26 -0
- data/lib/jets/rails_overrides/url_helper.rb +26 -0
- data/lib/jets/route.rb +145 -0
- data/lib/jets/router.rb +115 -0
- data/lib/jets/ruby_server.rb +91 -0
- data/lib/jets/rule.rb +5 -0
- data/lib/jets/rule/base.rb +19 -0
- data/lib/jets/rule/dsl.rb +64 -0
- data/lib/jets/rule/task.rb +44 -0
- data/lib/jets/server.rb +16 -0
- data/lib/jets/server/api_gateway.rb +39 -0
- data/lib/jets/server/lambda_aws_proxy.rb +122 -0
- data/lib/jets/server/route_matcher.rb +96 -0
- data/lib/jets/server/timing_middleware.rb +16 -0
- data/lib/jets/server/webpacker_setup.rb +7 -0
- data/lib/jets/timing.rb +65 -0
- data/lib/jets/timing/report.rb +82 -0
- data/lib/jets/util.rb +7 -12
- data/lib/jets/version.rb +1 -1
- data/support/clean +3 -0
- data/support/console +3 -0
- metadata +473 -76
- data/bin/jets +0 -14
- data/lib/jets/base_controller.rb +0 -54
- data/lib/jets/build.rb +0 -46
- data/lib/jets/build/handler_generator.rb +0 -46
- data/lib/jets/build/lambda_deducer.rb +0 -23
- data/lib/jets/build/templates/handler.js +0 -149
- data/lib/jets/build/traveling_ruby.rb +0 -133
- data/lib/jets/cfn/base.rb +0 -17
- data/lib/jets/cfn/builder.rb +0 -53
- data/lib/jets/cfn/namer.rb +0 -30
- data/lib/jets/cli/help.rb +0 -19
- data/lib/jets/command.rb +0 -25
- data/lib/jets/process.rb +0 -18
- data/lib/jets/process/base_processor.rb +0 -23
- data/lib/jets/process/controller_processor.rb +0 -36
- data/lib/jets/process/help.rb +0 -11
- data/lib/jets/process/processor_deducer.rb +0 -51
- data/lib/jets/project.rb +0 -23
- data/notes/design.md +0 -107
- data/notes/faq.md +0 -3
- data/notes/lambda_ruby_info.md +0 -34
- data/notes/traveling-ruby-packaging-jets.md +0 -26
- data/notes/traveling-ruby-packaging.md +0 -103
- data/notes/traveling-ruby-structure.md +0 -6
- data/notes/traveling-ruby.md +0 -82
- data/spec/fixtures/classes.rb +0 -5
- data/spec/fixtures/project/.gitignore +0 -3
- data/spec/fixtures/project/.ruby-version +0 -1
- data/spec/fixtures/project/Gemfile +0 -4
- data/spec/fixtures/project/Gemfile.lock +0 -23
- data/spec/fixtures/project/app/controllers/application_controller.rb +0 -2
- data/spec/fixtures/project/app/controllers/posts_controller.rb +0 -12
- data/spec/fixtures/project/bin/jets +0 -22
- data/spec/fixtures/project/config/routes.rb +0 -6
- data/spec/fixtures/project/handlers/controllers/posts.js +0 -212
- data/spec/lib/cli_spec.rb +0 -20
- data/spec/lib/jets/base_controller_spec.rb +0 -18
- data/spec/lib/jets/build/handler_generator_spec.rb +0 -20
- data/spec/lib/jets/build/lambda_deducer_spec.rb +0 -15
- data/spec/lib/jets/build_spec.rb +0 -34
- data/spec/lib/jets/cfn/builder_spec.rb +0 -18
- data/spec/lib/jets/cfn/namer_spec.rb +0 -16
- data/spec/lib/jets/process/controller_processor_spec.rb +0 -22
- data/spec/lib/jets/process/infer_spec.rb +0 -24
- data/spec/lib/jets/process_spec.rb +0 -18
- data/spec/lib/jets/project_spec.rb +0 -14
- data/spec/spec_helper.rb +0 -28
data/Rakefile
CHANGED
data/buildspec.yml
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
version: 0.2
|
|
2
|
+
|
|
3
|
+
phases:
|
|
4
|
+
build:
|
|
5
|
+
commands:
|
|
6
|
+
- echo Build started on `date`
|
|
7
|
+
# sync vendor
|
|
8
|
+
- git submodule sync
|
|
9
|
+
- git submodule update --init
|
|
10
|
+
- /usr/local/bin/dynamodb-local &
|
|
11
|
+
- bundle install
|
|
12
|
+
- bundle exec rspec # unit tests
|
|
13
|
+
# uncomment integration test for now
|
|
14
|
+
# - bash -eux .codebuild/integration.sh # test with newman and postman
|
|
15
|
+
|
|
16
|
+
artifacts:
|
|
17
|
+
files:
|
|
18
|
+
- README.md
|
data/exe/jets
ADDED
data/jets.gemspec
CHANGED
|
@@ -13,8 +13,11 @@ Gem::Specification.new do |spec|
|
|
|
13
13
|
spec.homepage = "https://github.com/tongueroo/jets"
|
|
14
14
|
spec.license = "MIT"
|
|
15
15
|
|
|
16
|
-
spec.files = `git ls-files`.split(
|
|
17
|
-
|
|
16
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
|
17
|
+
f.match(%r{^(test|spec|features|docs)/})
|
|
18
|
+
end
|
|
19
|
+
spec.bindir = "exe"
|
|
20
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
|
18
21
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
|
19
22
|
spec.require_paths = ["lib"]
|
|
20
23
|
|
|
@@ -22,13 +25,38 @@ Gem::Specification.new do |spec|
|
|
|
22
25
|
spec.add_dependency "hashie"
|
|
23
26
|
spec.add_dependency "colorize"
|
|
24
27
|
spec.add_dependency "activesupport"
|
|
28
|
+
spec.add_dependency "actionview"
|
|
29
|
+
spec.add_dependency "actionpack"
|
|
30
|
+
spec.add_dependency "activerecord"
|
|
31
|
+
spec.add_dependency "railties" # ActiveRecord database_tasks.rb require this
|
|
32
|
+
# TODO: only load the database adapters that the app uses, so generate this
|
|
33
|
+
# in the app's Gemfile
|
|
34
|
+
spec.add_dependency "dotenv"
|
|
35
|
+
|
|
36
|
+
spec.add_dependency "recursive-open-struct"
|
|
37
|
+
spec.add_dependency "aws-sdk-s3"
|
|
38
|
+
spec.add_dependency "aws-sdk-cloudformation"
|
|
39
|
+
spec.add_dependency "aws-sdk-dynamodb"
|
|
40
|
+
spec.add_dependency "aws-sdk-lambda"
|
|
41
|
+
spec.add_dependency "kramdown"
|
|
42
|
+
spec.add_dependency "memoist"
|
|
43
|
+
spec.add_dependency "text-table"
|
|
44
|
+
spec.add_dependency "rack"
|
|
45
|
+
spec.add_dependency "json"
|
|
46
|
+
# there are development dependencies because we want to lazy load them
|
|
47
|
+
# in the app. but we want to have them so we can run specs.
|
|
48
|
+
spec.add_dependency "pg", "=0.21"
|
|
49
|
+
|
|
50
|
+
spec.add_dependency "gems" # lambdagem dependency
|
|
25
51
|
|
|
26
|
-
spec.add_development_dependency "bundler"
|
|
27
52
|
spec.add_development_dependency "byebug"
|
|
53
|
+
spec.add_development_dependency "bundler"
|
|
28
54
|
spec.add_development_dependency "rake"
|
|
29
55
|
spec.add_development_dependency "rspec"
|
|
56
|
+
|
|
30
57
|
# ruby_dep-1.5.0 requires ruby version >= 2.2.5, which is incompatible with the current version, ruby 2.2.2p95
|
|
31
58
|
# spec.add_development_dependency "guard"
|
|
32
59
|
# spec.add_development_dependency "guard-bundler"
|
|
33
60
|
# spec.add_development_dependency "guard-rspec"
|
|
61
|
+
# spec.add_development_dependency "codeclimate-test-reporter", group: :test, require: nil
|
|
34
62
|
end
|
data/lib/jets.rb
CHANGED
|
@@ -1,18 +1,66 @@
|
|
|
1
1
|
$:.unshift(File.expand_path("../", __FILE__))
|
|
2
2
|
require "jets/version"
|
|
3
|
+
require "jets/pascalize"
|
|
3
4
|
require "active_support/core_ext/string"
|
|
5
|
+
require "active_support/ordered_hash"
|
|
4
6
|
require "colorize"
|
|
5
|
-
require
|
|
7
|
+
require "fileutils"
|
|
8
|
+
require "pp" # TODO: remove pp after debugging
|
|
9
|
+
require "memoist"
|
|
6
10
|
|
|
7
11
|
module Jets
|
|
8
|
-
autoload :Util, "jets/util"
|
|
9
|
-
autoload :Command, "jets/command"
|
|
10
12
|
autoload :CLI, "jets/cli"
|
|
11
|
-
autoload :
|
|
12
|
-
|
|
13
|
-
autoload :
|
|
14
|
-
autoload :
|
|
13
|
+
autoload :Commands, "jets/commands"
|
|
14
|
+
|
|
15
|
+
autoload :AwsServices, "jets/aws_services"
|
|
16
|
+
autoload :Builders, 'jets/builders'
|
|
17
|
+
autoload :Call, "jets/call"
|
|
15
18
|
autoload :Cfn, 'jets/cfn'
|
|
19
|
+
autoload :Controller, 'jets/controller'
|
|
20
|
+
autoload :Erb, "jets/erb"
|
|
21
|
+
autoload :Generator, "jets/generator"
|
|
22
|
+
autoload :Job, 'jets/job'
|
|
23
|
+
autoload :Lambda, 'jets/lambda'
|
|
24
|
+
autoload :Naming, 'jets/naming'
|
|
25
|
+
autoload :PolyFun, 'jets/poly_fun'
|
|
26
|
+
autoload :Processors, 'jets/processors'
|
|
27
|
+
autoload :Route, "jets/route"
|
|
28
|
+
autoload :Router, "jets/router"
|
|
29
|
+
autoload :Rule, 'jets/rule'
|
|
30
|
+
autoload :Server, "jets/server"
|
|
31
|
+
|
|
32
|
+
autoload :Application, "jets/application"
|
|
33
|
+
autoload :Booter, 'jets/booter'
|
|
34
|
+
autoload :Core, "jets/core"
|
|
35
|
+
autoload :Dotenv, 'jets/dotenv'
|
|
36
|
+
autoload :Klass, 'jets/klass'
|
|
37
|
+
autoload :Util, "jets/util"
|
|
38
|
+
autoload :Timing, "jets/timing"
|
|
39
|
+
autoload :Preheat, "jets/preheat"
|
|
40
|
+
extend Core # root, logger, etc
|
|
41
|
+
|
|
42
|
+
autoload :RubyServer, "jets/ruby_server"
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
$:.unshift(File.expand_path("../../vendor/lambdagem/lib", __FILE__))
|
|
46
|
+
require "lambdagem"
|
|
47
|
+
require "gems" # lambdagem dependency
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
# lazy loaded dependencies: depends what project. Mainly determined by Gemfile
|
|
51
|
+
# and config files.
|
|
52
|
+
if File.exist?("#{Jets.root}config/dynamodb.yml")
|
|
53
|
+
$:.unshift(File.expand_path("../../vendor/dynomite/lib", __FILE__))
|
|
54
|
+
require "dynomite"
|
|
55
|
+
end
|
|
16
56
|
|
|
17
|
-
|
|
57
|
+
# https://makandracards.com/makandra/42521-detecting-if-a-ruby-gem-is-loaded
|
|
58
|
+
# TODO: move require "pg" into loader class and abstract to support more gems
|
|
59
|
+
if File.exist?("#{Jets.root}config/database.yml")
|
|
60
|
+
require "active_record"
|
|
61
|
+
# Note: think this is only needed for specs
|
|
62
|
+
# Apps require pg in their own Gemfile via bundler
|
|
63
|
+
exists = File.exist?("/var/task/bundled/gems/ruby/2.5.0/gems/pg-0.21.0/lib/pg_ext.so")
|
|
64
|
+
# Jets.logger.info("pg_ext.so exists #{exists.inspect}")
|
|
65
|
+
require "pg" if Gem.loaded_specs.has_key?('pg')
|
|
18
66
|
end
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
require "active_support/ordered_options"
|
|
2
|
+
|
|
3
|
+
class Jets::Application
|
|
4
|
+
extend Memoist
|
|
5
|
+
# Middleware used for development only
|
|
6
|
+
autoload :Middleware, "jets/application/middleware"
|
|
7
|
+
include Middleware
|
|
8
|
+
|
|
9
|
+
def configure(&block)
|
|
10
|
+
instance_eval(&block) if block
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def setup!
|
|
14
|
+
load_configs # load config object so following methods can use it
|
|
15
|
+
setup_auto_load_paths
|
|
16
|
+
load_routes
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def config
|
|
20
|
+
config = ActiveSupport::OrderedOptions.new
|
|
21
|
+
config.prewarm = ActiveSupport::OrderedOptions.new
|
|
22
|
+
config.lambdagems = ActiveSupport::OrderedOptions.new
|
|
23
|
+
config.lambdagems.sources = [
|
|
24
|
+
'https://gems.lambdagems.com'
|
|
25
|
+
]
|
|
26
|
+
config
|
|
27
|
+
end
|
|
28
|
+
memoize :config
|
|
29
|
+
|
|
30
|
+
def setup_auto_load_paths
|
|
31
|
+
autoload_paths = config.autoload_paths + config.extra_autoload_paths
|
|
32
|
+
autoload_paths = autoload_paths.uniq.map { |p| "#{Jets.root}#{p}" }
|
|
33
|
+
# internal_autoload_paths are last
|
|
34
|
+
autoload_paths += internal_autoload_paths
|
|
35
|
+
ActiveSupport::Dependencies.autoload_paths += autoload_paths
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def internal_autoload_paths
|
|
39
|
+
internal = File.expand_path("../internal", __FILE__)
|
|
40
|
+
paths = %w[
|
|
41
|
+
app/controllers
|
|
42
|
+
app/models
|
|
43
|
+
app/jobs
|
|
44
|
+
]
|
|
45
|
+
paths.map { |path| "#{internal}/#{path}" }
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def load_configs
|
|
49
|
+
# The Jets default/application.rb is loaded.
|
|
50
|
+
require File.expand_path("../default/application.rb", __FILE__)
|
|
51
|
+
# Then project config/application.rb is loaded.
|
|
52
|
+
app_config = "#{Jets.root}config/application.rb"
|
|
53
|
+
require app_config if File.exist?(app_config)
|
|
54
|
+
# Normalize config and setup some shortcuts
|
|
55
|
+
set_aliases!
|
|
56
|
+
normalize_env_vars!
|
|
57
|
+
load_db_config
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Use the shorter name in stack names, but use the full name when it
|
|
61
|
+
# comes to checking for the env.
|
|
62
|
+
#
|
|
63
|
+
# Example:
|
|
64
|
+
#
|
|
65
|
+
# Jets.env: 'development'
|
|
66
|
+
# Jets.config.project_namespace: 'demo-dev'
|
|
67
|
+
ENV_MAP = {
|
|
68
|
+
development: 'dev',
|
|
69
|
+
production: 'prod',
|
|
70
|
+
staging: 'stag',
|
|
71
|
+
}
|
|
72
|
+
def set_aliases!
|
|
73
|
+
# env_extra can be also be set with JETS_ENV_EXTRA.
|
|
74
|
+
# JETS_ENV_EXTRA higher precedence than config.env_extra
|
|
75
|
+
config.env_extra = ENV['JETS_ENV_EXTRA'] if ENV['JETS_ENV_EXTRA']
|
|
76
|
+
# IE: With env_extra: project-dev-1
|
|
77
|
+
# Without env_extra: project-dev
|
|
78
|
+
config.short_env = ENV_MAP[Jets.env.to_sym] || Jets.env
|
|
79
|
+
config.project_namespace = [config.project_name, config.short_env, config.env_extra].compact.join('-')
|
|
80
|
+
# table_namespace does not have the env_extra, more common case desired.
|
|
81
|
+
config.table_namespace = [config.project_name, config.short_env].compact.join('-')
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# It is pretty easy to attempt to set environment variables without
|
|
85
|
+
# the correct AWS Environment.Variables path struture.
|
|
86
|
+
# Auto-fix it for convenience.
|
|
87
|
+
def normalize_env_vars!
|
|
88
|
+
environment = config.function.environment
|
|
89
|
+
if environment and !environment.to_h.key?(:variables)
|
|
90
|
+
config.function.environment = {
|
|
91
|
+
variables: environment.to_h
|
|
92
|
+
}
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def load_db_config
|
|
97
|
+
config.database = {}
|
|
98
|
+
|
|
99
|
+
database_yml = "#{Jets.root}config/database.yml"
|
|
100
|
+
if File.exist?(database_yml)
|
|
101
|
+
text = Jets::Erb.result(database_yml)
|
|
102
|
+
db_config = YAML.load(text)
|
|
103
|
+
config.database = db_config
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# Naming it routes because config/routes.rb requires
|
|
108
|
+
#
|
|
109
|
+
# Jets.application.routes.draw do
|
|
110
|
+
#
|
|
111
|
+
# for scaffolding to work.
|
|
112
|
+
def routes
|
|
113
|
+
@router ||= Jets::Router.new
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def load_routes
|
|
117
|
+
routes_file = "#{Jets.root}config/routes.rb"
|
|
118
|
+
require routes_file if File.exist?(routes_file)
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module Jets::Application::Middleware
|
|
2
|
+
def call(env)
|
|
3
|
+
# Only require when necessary because middleware is only used for development
|
|
4
|
+
# Requring here instead of top of file because Jets::Application::Middleware
|
|
5
|
+
# gets autoloaded when Jets::Application gets autoloaded.
|
|
6
|
+
# Trying to keep the config.ru interface clean:
|
|
7
|
+
#
|
|
8
|
+
# require "jets"
|
|
9
|
+
# run Jets.application
|
|
10
|
+
require "jets/server/webpacker_setup" if Jets.webpacker? # makes "use Webpacker::DevServerProxy" works
|
|
11
|
+
triplet = assemble_app.call(env)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def assemble_app
|
|
15
|
+
Rack::Builder.new do
|
|
16
|
+
map("/") do
|
|
17
|
+
use Jets::Server::TimingMiddleware
|
|
18
|
+
use Webpacker::DevServerProxy if Jets.webpacker?
|
|
19
|
+
run Jets::Server
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
require "aws-sdk-s3"
|
|
2
|
+
require "aws-sdk-cloudformation"
|
|
3
|
+
require "aws-sdk-lambda"
|
|
4
|
+
|
|
5
|
+
module Jets::AwsServices
|
|
6
|
+
def s3
|
|
7
|
+
@s3 ||= Aws::S3::Client.new
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def s3_resource
|
|
11
|
+
@s3_resource ||= Aws::S3::Resource.new
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def cfn
|
|
15
|
+
@cfn ||= Aws::CloudFormation::Client.new
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def lambda
|
|
19
|
+
@lambda ||= Aws::Lambda::Client.new
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def stack_exists?(stack_name)
|
|
23
|
+
return false if ENV['TEST']
|
|
24
|
+
|
|
25
|
+
exist = nil
|
|
26
|
+
begin
|
|
27
|
+
# When the stack does not exist an exception is raised. Example:
|
|
28
|
+
# Aws::CloudFormation::Errors::ValidationError: Stack with id blah does not exist
|
|
29
|
+
resp = cfn.describe_stacks(stack_name: stack_name)
|
|
30
|
+
exist = true
|
|
31
|
+
rescue Aws::CloudFormation::Errors::ValidationError => e
|
|
32
|
+
if e.message =~ /does not exist/
|
|
33
|
+
exist = false
|
|
34
|
+
elsif e.message.include?("'stackName' failed to satisfy constraint")
|
|
35
|
+
# Example of e.message when describe_stack with invalid stack name
|
|
36
|
+
# "1 validation error detected: Value 'instance_and_route53' at 'stackName' failed to satisfy constraint: Member must satisfy regular expression pattern: [a-zA-Z][-a-zA-Z0-9]*|arn:[-a-zA-Z0-9:/._+]*"
|
|
37
|
+
puts "Invalid stack name: #{stack_name}"
|
|
38
|
+
puts "Full error message: #{e.message}"
|
|
39
|
+
exit 1
|
|
40
|
+
else
|
|
41
|
+
raise # re-raise exception because unsure what other errors can happen
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
exist
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# All CloudFormation states listed here: http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-describing-stacks.html
|
|
48
|
+
#
|
|
49
|
+
# Returns resp so we can use it to grab data about the stack without calling api again.
|
|
50
|
+
def stack_in_progress?(stack_name)
|
|
51
|
+
return true if !stack_exists?(stack_name)
|
|
52
|
+
|
|
53
|
+
# Assumes stack exists
|
|
54
|
+
resp = cfn.describe_stacks(stack_name: stack_name)
|
|
55
|
+
status = resp.stacks[0].stack_status
|
|
56
|
+
if status =~ /_IN_PROGRESS$/
|
|
57
|
+
puts "The '#{stack_name}' stack status is #{status}. " \
|
|
58
|
+
"Please wait until the stack is ready and try again.".colorize(:red)
|
|
59
|
+
exit 0
|
|
60
|
+
elsif resp.stacks[0].outputs.empty?
|
|
61
|
+
# This Happens when the miminal stack fails at the very beginning.
|
|
62
|
+
# There is no s3 bucket at all. User should delete the stack.
|
|
63
|
+
puts "The minimal stack failed to create. Please delete the stack first and try again." \
|
|
64
|
+
"You can delete the CloudFormation stack or use the `jets delete` command"
|
|
65
|
+
exit 0
|
|
66
|
+
else
|
|
67
|
+
true
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
end
|
data/lib/jets/booter.rb
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
class Jets::Booter
|
|
2
|
+
class << self
|
|
3
|
+
@booted = false
|
|
4
|
+
def boot!
|
|
5
|
+
return if @booted
|
|
6
|
+
|
|
7
|
+
stdout_to_stderr
|
|
8
|
+
confirm_jets_project!
|
|
9
|
+
require_bundle_gems
|
|
10
|
+
Jets::Dotenv.load!
|
|
11
|
+
Jets.application # triggers application.setup! # autoload_paths, routes, etc
|
|
12
|
+
setup_db
|
|
13
|
+
|
|
14
|
+
@booted = true
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# Override for Lambda processing.
|
|
18
|
+
# $stdout = $stderr might seem weird but we want puts to write to stderr which
|
|
19
|
+
# is set in the node shim to write to stderr. This directs the output to
|
|
20
|
+
# Lambda logs.
|
|
21
|
+
# Printing to stdout managles up the payload returned from Lambda function.
|
|
22
|
+
# This is not desired when returning payload to API Gateway eventually.
|
|
23
|
+
def stdout_to_stderr
|
|
24
|
+
$stdout.sync = true
|
|
25
|
+
$stderr.sync = true
|
|
26
|
+
$stdout = $stderr
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# require_bundle_gems called when environment boots up via Jets.boot. It
|
|
30
|
+
# also useful for when to loading Rake tasks in
|
|
31
|
+
# Jets::Commands::RakeTasks.load!
|
|
32
|
+
#
|
|
33
|
+
# For example, some gems like webpacker that load rake tasks are specified
|
|
34
|
+
# with a git based source:
|
|
35
|
+
#
|
|
36
|
+
# gem "webpacker", git: "https://github.com/tongueroo/webpacker.git"
|
|
37
|
+
#
|
|
38
|
+
# This results in the user having to specific bundle exec in front of
|
|
39
|
+
# jets for those rake tasks to show up in jets help.
|
|
40
|
+
#
|
|
41
|
+
# Instead, when the user is within the project folder, jets automatically
|
|
42
|
+
# requires bundler for the user. So the rake tasks show up when calling
|
|
43
|
+
# jets help.
|
|
44
|
+
#
|
|
45
|
+
# When the user calls jets help from outside the project folder, bundler
|
|
46
|
+
# is not used and the load errors get rescued gracefully. This is done in
|
|
47
|
+
# Jets::Commands::RakeTasks.load! In the case when there are in another
|
|
48
|
+
# project with another Gemfile, the load errors will still be rescued.
|
|
49
|
+
def require_bundle_gems
|
|
50
|
+
# NOTE: Dont think ENV['BUNDLE_GEMFILE'] is quite working right. We still need
|
|
51
|
+
# to be in the project directory. Leaving logic in here for when it gets fix.
|
|
52
|
+
if ENV['BUNDLE_GEMFILE'] || File.exist?("Gemfile")
|
|
53
|
+
require "bundler/setup"
|
|
54
|
+
Bundler.require(*bundler_groups)
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Only connects connect to database for ActiveRecord and when
|
|
59
|
+
# config/database.yml exists.
|
|
60
|
+
# Dynomite handles connecting to the clients lazily.
|
|
61
|
+
def setup_db
|
|
62
|
+
return unless File.exist?("#{Jets.root}config/database.yml")
|
|
63
|
+
|
|
64
|
+
db_configs = Jets.application.config.database
|
|
65
|
+
# DatabaseTasks.database_configuration for db:create db:migrate tasks
|
|
66
|
+
# Documented in DatabaseTasks that this is the right way to set it when
|
|
67
|
+
# using ActiveRecord rake tasks outside of Rails.
|
|
68
|
+
ActiveRecord::Tasks::DatabaseTasks.database_configuration = db_configs
|
|
69
|
+
|
|
70
|
+
current_config = db_configs[Jets.env]
|
|
71
|
+
if current_config.empty?
|
|
72
|
+
abort("ERROR: config/database.yml exists but no environment section configured for #{Jets.env}")
|
|
73
|
+
end
|
|
74
|
+
# Using ActiveRecord rake tasks outside of Rails, so we need to set up the
|
|
75
|
+
# db connection ourselves
|
|
76
|
+
ActiveRecord::Base.establish_connection(current_config)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def bundler_groups
|
|
80
|
+
[:default, Jets.env.to_sym]
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# Cannot call this for the jets new
|
|
84
|
+
def confirm_jets_project!
|
|
85
|
+
unless File.exist?("#{Jets.root}config/application.rb")
|
|
86
|
+
puts "It does not look like you are running this command within a jets project. Please confirm that you are in a jets project and try again.".colorize(:red)
|
|
87
|
+
exit
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def message
|
|
92
|
+
"Jets booting up in #{Jets.env.colorize(:green)} mode!"
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|