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.
Files changed (292) hide show
  1. checksums.yaml +5 -5
  2. data/.circleci/bin/commit_docs.sh +26 -0
  3. data/.circleci/config.yml +126 -0
  4. data/.codebuild/README.md +57 -0
  5. data/.codebuild/bin/jets +3 -0
  6. data/.codebuild/buildspec-base.yml +14 -0
  7. data/.codebuild/integration.sh +54 -0
  8. data/.codebuild/jets.postman_collection.json +323 -0
  9. data/.codebuild/scripts/install-docker.sh +12 -0
  10. data/.codebuild/scripts/install-dynamodb-local.sh +22 -0
  11. data/.codebuild/scripts/install-java.sh +20 -0
  12. data/.codebuild/scripts/install-node.sh +4 -0
  13. data/.gitignore +3 -0
  14. data/.gitmodules +9 -0
  15. data/.python-version +1 -0
  16. data/.rspec +2 -0
  17. data/.ruby-version +1 -1
  18. data/CHANGELOG.md +3 -0
  19. data/Dockerfile +16 -0
  20. data/Dockerfile.base +53 -0
  21. data/Gemfile +8 -1
  22. data/Gemfile.lock +132 -28
  23. data/LICENSE.txt +1 -1
  24. data/Procfile +2 -0
  25. data/README.md +116 -17
  26. data/Rakefile +6 -0
  27. data/buildspec.yml +18 -0
  28. data/exe/jets +14 -0
  29. data/jets.gemspec +31 -3
  30. data/lib/jets.rb +56 -8
  31. data/lib/jets/application.rb +121 -0
  32. data/lib/jets/application/middleware.rb +23 -0
  33. data/lib/jets/aws_services.rb +71 -0
  34. data/lib/jets/booter.rb +95 -0
  35. data/lib/jets/builders.rb +6 -0
  36. data/lib/jets/builders/code_builder.rb +431 -0
  37. data/lib/jets/builders/deducer.rb +73 -0
  38. data/lib/jets/builders/gem_replacer.rb +154 -0
  39. data/lib/jets/builders/handler_generator.rb +76 -0
  40. data/lib/jets/builders/node-hello.js +73 -0
  41. data/lib/jets/builders/node-shim.js +151 -0
  42. data/lib/jets/cfn.rb +5 -4
  43. data/lib/jets/cfn/ship.rb +178 -0
  44. data/lib/jets/cfn/status.rb +208 -0
  45. data/lib/jets/cfn/template_builders.rb +21 -0
  46. data/lib/jets/cfn/template_builders/api_gateway_builder.rb +73 -0
  47. data/lib/jets/cfn/template_builders/api_gateway_deployment_builder.rb +38 -0
  48. data/lib/jets/cfn/template_builders/base_child_builder.rb +38 -0
  49. data/lib/jets/cfn/template_builders/controller_builder.rb +107 -0
  50. data/lib/jets/cfn/template_builders/function_builder.rb +20 -0
  51. data/lib/jets/cfn/template_builders/function_properties.rb +6 -0
  52. data/lib/jets/cfn/template_builders/function_properties/base_builder.rb +106 -0
  53. data/lib/jets/cfn/template_builders/function_properties/node_builder.rb +12 -0
  54. data/lib/jets/cfn/template_builders/function_properties/python_builder.rb +12 -0
  55. data/lib/jets/cfn/template_builders/function_properties/ruby_builder.rb +13 -0
  56. data/lib/jets/cfn/template_builders/interface.rb +91 -0
  57. data/lib/jets/cfn/template_builders/job_builder.rb +63 -0
  58. data/lib/jets/cfn/template_builders/parent_builder.rb +97 -0
  59. data/lib/jets/cfn/template_builders/rule_builder.rb +55 -0
  60. data/lib/jets/cfn/template_builders/templates/minimal-stack.yml +45 -0
  61. data/lib/jets/cfn/template_mappers.rb +23 -0
  62. data/lib/jets/cfn/template_mappers/api_gateway_deployment_mapper.rb +48 -0
  63. data/lib/jets/cfn/template_mappers/api_gateway_mapper.rb +4 -0
  64. data/lib/jets/cfn/template_mappers/child_mapper.rb +41 -0
  65. data/lib/jets/cfn/template_mappers/config_rule_mapper.rb +34 -0
  66. data/lib/jets/cfn/template_mappers/controller_mapper.rb +36 -0
  67. data/lib/jets/cfn/template_mappers/events_rule_mapper.rb +40 -0
  68. data/lib/jets/cfn/template_mappers/function_mapper.rb +4 -0
  69. data/lib/jets/cfn/template_mappers/gateway_method_mapper.rb +56 -0
  70. data/lib/jets/cfn/template_mappers/gateway_resource_mapper.rb +62 -0
  71. data/lib/jets/cfn/template_mappers/job_mapper.rb +4 -0
  72. data/lib/jets/cfn/template_mappers/lambda_function_mapper.rb +50 -0
  73. data/lib/jets/cfn/template_mappers/rule_mapper.rb +5 -0
  74. data/lib/jets/cli.rb +180 -15
  75. data/lib/jets/commands.rb +22 -0
  76. data/lib/jets/commands/base.rb +151 -0
  77. data/lib/jets/commands/build.rb +186 -0
  78. data/lib/jets/commands/call.rb +175 -0
  79. data/lib/jets/commands/call/anonymous_guesser.rb +96 -0
  80. data/lib/jets/commands/call/autoload_guesser.rb +112 -0
  81. data/lib/jets/commands/call/base_guesser.rb +33 -0
  82. data/lib/jets/commands/call/guesser.rb +51 -0
  83. data/lib/jets/commands/console.rb +12 -0
  84. data/lib/jets/commands/db.rb +15 -0
  85. data/lib/jets/commands/db/environment-task.rake +3 -0
  86. data/lib/jets/commands/db/tasks.rb +30 -0
  87. data/lib/jets/commands/dbconsole.rb +131 -0
  88. data/lib/jets/commands/delete.rb +119 -0
  89. data/lib/jets/commands/deploy.rb +53 -0
  90. data/lib/jets/commands/dynamodb.rb +22 -0
  91. data/lib/jets/commands/dynamodb/migrate.rb +9 -0
  92. data/lib/jets/commands/dynamodb/migrator.rb +36 -0
  93. data/lib/jets/commands/help.rb +9 -0
  94. data/lib/jets/commands/help/build.md +1 -0
  95. data/lib/jets/commands/help/call.md +55 -0
  96. data/lib/jets/commands/help/console.md +4 -0
  97. data/lib/jets/commands/help/db/generate.md +8 -0
  98. data/lib/jets/commands/help/dbconsole.md +5 -0
  99. data/lib/jets/commands/help/delete.md +9 -0
  100. data/lib/jets/commands/help/deploy.md +5 -0
  101. data/lib/jets/commands/help/dynamodb/generate.md +50 -0
  102. data/lib/jets/commands/help/dynamodb/migrate.md +4 -0
  103. data/lib/jets/commands/help/generate.md +5 -0
  104. data/lib/jets/commands/help/new.md +9 -0
  105. data/lib/jets/commands/help/process/controller.md +6 -0
  106. data/lib/jets/commands/help/process/function.md +5 -0
  107. data/lib/jets/commands/help/process/job.md +5 -0
  108. data/lib/jets/commands/help/process/rule.md +5 -0
  109. data/lib/jets/commands/help/routes.md +3 -0
  110. data/lib/jets/commands/help/server.md +6 -0
  111. data/lib/jets/commands/help/status.md +1 -0
  112. data/lib/jets/commands/help/url.md +5 -0
  113. data/lib/jets/commands/main.rb +111 -0
  114. data/lib/jets/commands/markdown.rb +8 -0
  115. data/lib/jets/commands/markdown/creator.rb +58 -0
  116. data/lib/jets/commands/markdown/index.rb +27 -0
  117. data/lib/jets/commands/markdown/page.rb +125 -0
  118. data/lib/jets/commands/markdown/shell.rb +11 -0
  119. data/lib/jets/commands/new.rb +110 -0
  120. data/lib/jets/commands/rake_command.rb +61 -0
  121. data/lib/jets/commands/rake_tasks.rb +45 -0
  122. data/lib/jets/commands/sequence.rb +44 -0
  123. data/lib/jets/commands/stack_info.rb +30 -0
  124. data/lib/jets/commands/templates/skeleton/.env +2 -0
  125. data/lib/jets/commands/templates/skeleton/.env.development.tt +3 -0
  126. data/lib/jets/commands/templates/skeleton/.env.test +3 -0
  127. data/lib/jets/commands/templates/skeleton/.gitignore +14 -0
  128. data/lib/jets/commands/templates/skeleton/.jetskeep +1 -0
  129. data/lib/jets/commands/templates/skeleton/Gemfile.tt +27 -0
  130. data/lib/jets/commands/templates/skeleton/Procfile +7 -0
  131. data/lib/jets/commands/templates/skeleton/README.md +4 -0
  132. data/lib/jets/commands/templates/skeleton/Rakefile +2 -0
  133. data/lib/jets/commands/templates/skeleton/app/controllers/application_controller.rb +2 -0
  134. data/lib/jets/commands/templates/skeleton/app/helpers/application_helper.rb +2 -0
  135. data/lib/jets/commands/templates/skeleton/app/jobs/application_job.rb +2 -0
  136. data/lib/jets/commands/templates/skeleton/app/models/application_item.rb +2 -0
  137. data/lib/jets/commands/templates/skeleton/app/models/application_record.rb +3 -0
  138. data/lib/jets/commands/templates/skeleton/app/views/layouts/application.html.erb.tt +24 -0
  139. data/lib/jets/commands/templates/skeleton/bin/ruby_server +18 -0
  140. data/lib/jets/commands/templates/skeleton/bin/ruby_server.rb +2 -0
  141. data/lib/jets/commands/templates/skeleton/config.ru +4 -0
  142. data/lib/jets/commands/templates/skeleton/config/application.rb.tt +26 -0
  143. data/lib/jets/commands/templates/skeleton/config/database.yml.tt +27 -0
  144. data/lib/jets/commands/templates/skeleton/config/dynamodb.yml +25 -0
  145. data/lib/jets/commands/templates/skeleton/config/routes.rb +8 -0
  146. data/lib/jets/commands/templates/skeleton/db/.gitkeep +0 -0
  147. data/lib/jets/commands/templates/skeleton/public/404.html +67 -0
  148. data/lib/jets/commands/templates/skeleton/public/422.html +67 -0
  149. data/lib/jets/commands/templates/skeleton/public/500.html +66 -0
  150. data/lib/jets/commands/templates/skeleton/public/favicon.ico +0 -0
  151. data/lib/jets/commands/templates/skeleton/public/index.html.tt +79 -0
  152. data/lib/jets/commands/templates/skeleton/spec/controllers/posts_controller_spec.rb +18 -0
  153. data/lib/jets/commands/templates/skeleton/spec/fixtures/payloads/posts-index.json +51 -0
  154. data/lib/jets/commands/templates/skeleton/spec/fixtures/payloads/posts-show.json +53 -0
  155. data/lib/jets/commands/templates/skeleton/spec/spec_helper.rb.tt +27 -0
  156. data/lib/jets/commands/templates/webpacker/app/javascript/packs/application.js.tt +14 -0
  157. data/lib/jets/commands/templates/webpacker/app/javascript/packs/theme.scss.tt +24 -0
  158. data/lib/jets/commands/templates/webpacker/app/javascript/src/jets/crud.js +87 -0
  159. data/lib/jets/commands/url.rb +45 -0
  160. data/lib/jets/commands/webpacker_template.rb +19 -0
  161. data/lib/jets/controller.rb +9 -0
  162. data/lib/jets/controller/base.rb +50 -0
  163. data/lib/jets/controller/callbacks.rb +43 -0
  164. data/lib/jets/controller/layout.rb +17 -0
  165. data/lib/jets/controller/params.rb +53 -0
  166. data/lib/jets/controller/redirection.rb +55 -0
  167. data/lib/jets/controller/renderers.rb +5 -0
  168. data/lib/jets/controller/renderers/aws_proxy_renderer.rb +69 -0
  169. data/lib/jets/controller/renderers/base_renderer.rb +16 -0
  170. data/lib/jets/controller/renderers/template_renderer.rb +107 -0
  171. data/lib/jets/controller/rendering.rb +80 -0
  172. data/lib/jets/controller/request.rb +55 -0
  173. data/lib/jets/core.rb +81 -0
  174. data/lib/jets/default/application.rb +20 -0
  175. data/lib/jets/dotenv.rb +37 -0
  176. data/lib/jets/erb.rb +51 -0
  177. data/lib/jets/generator.rb +40 -0
  178. data/lib/jets/generator/templates/erb/controller/view.html.erb +2 -0
  179. data/lib/jets/generator/templates/erb/scaffold/_form.html.erb +39 -0
  180. data/lib/jets/generator/templates/erb/scaffold/edit.html.erb +6 -0
  181. data/lib/jets/generator/templates/erb/scaffold/index.html.erb +29 -0
  182. data/lib/jets/generator/templates/erb/scaffold/new.html.erb +5 -0
  183. data/lib/jets/generator/templates/erb/scaffold/show.html.erb +9 -0
  184. data/lib/jets/generator/templates/rails/assets/javascript.js +2 -0
  185. data/lib/jets/generator/templates/rails/assets/stylesheet.css +4 -0
  186. data/lib/jets/generator/templates/rails/controller/controller.rb +13 -0
  187. data/lib/jets/generator/templates/rails/helper/helper.rb +4 -0
  188. data/lib/jets/generator/templates/rails/scaffold/scaffold.css +80 -0
  189. data/lib/jets/generator/templates/rails/scaffold_controller/api_controller.rb +62 -0
  190. data/lib/jets/generator/templates/rails/scaffold_controller/controller.rb +71 -0
  191. data/lib/jets/internal/app/controllers/jets/public_controller.rb +30 -0
  192. data/lib/jets/internal/app/controllers/jets/public_controller/python/show.py +47 -0
  193. data/lib/jets/internal/app/controllers/jets/public_controller/python/show.pyc +0 -0
  194. data/lib/jets/internal/app/controllers/jets/welcome_controller.rb +22 -0
  195. data/lib/jets/internal/app/controllers/jets/welcome_controller/python/index.py +24 -0
  196. data/lib/jets/internal/app/jobs/jets/preheat_job.rb +52 -0
  197. data/lib/jets/job.rb +5 -0
  198. data/lib/jets/job/base.rb +29 -0
  199. data/lib/jets/job/dsl.rb +58 -0
  200. data/lib/jets/job/task.rb +17 -0
  201. data/lib/jets/klass.rb +71 -0
  202. data/lib/jets/lambda.rb +18 -0
  203. data/lib/jets/lambda/dsl.rb +153 -0
  204. data/lib/jets/lambda/function.rb +29 -0
  205. data/lib/jets/lambda/function_constructor.rb +60 -0
  206. data/lib/jets/lambda/functions.rb +22 -0
  207. data/lib/jets/lambda/task.rb +77 -0
  208. data/lib/jets/naming.rb +61 -0
  209. data/lib/jets/pascalize.rb +30 -0
  210. data/lib/jets/poly_fun.rb +61 -0
  211. data/lib/jets/poly_fun/base_executor.rb +129 -0
  212. data/lib/jets/poly_fun/lambda_executor.rb +16 -0
  213. data/lib/jets/poly_fun/node_error.rb +8 -0
  214. data/lib/jets/poly_fun/node_executor.rb +54 -0
  215. data/lib/jets/poly_fun/python_error.rb +8 -0
  216. data/lib/jets/poly_fun/python_executor.rb +23 -0
  217. data/lib/jets/preheat.rb +72 -0
  218. data/lib/jets/processors.rb +4 -0
  219. data/lib/jets/processors/deducer.rb +54 -0
  220. data/lib/jets/processors/main_processor.rb +57 -0
  221. data/lib/jets/rails_overrides.rb +4 -0
  222. data/lib/jets/rails_overrides/asset_tag_helper.rb +41 -0
  223. data/lib/jets/rails_overrides/common_methods.rb +13 -0
  224. data/lib/jets/rails_overrides/rendering_helper.rb +26 -0
  225. data/lib/jets/rails_overrides/url_helper.rb +26 -0
  226. data/lib/jets/route.rb +145 -0
  227. data/lib/jets/router.rb +115 -0
  228. data/lib/jets/ruby_server.rb +91 -0
  229. data/lib/jets/rule.rb +5 -0
  230. data/lib/jets/rule/base.rb +19 -0
  231. data/lib/jets/rule/dsl.rb +64 -0
  232. data/lib/jets/rule/task.rb +44 -0
  233. data/lib/jets/server.rb +16 -0
  234. data/lib/jets/server/api_gateway.rb +39 -0
  235. data/lib/jets/server/lambda_aws_proxy.rb +122 -0
  236. data/lib/jets/server/route_matcher.rb +96 -0
  237. data/lib/jets/server/timing_middleware.rb +16 -0
  238. data/lib/jets/server/webpacker_setup.rb +7 -0
  239. data/lib/jets/timing.rb +65 -0
  240. data/lib/jets/timing/report.rb +82 -0
  241. data/lib/jets/util.rb +7 -12
  242. data/lib/jets/version.rb +1 -1
  243. data/support/clean +3 -0
  244. data/support/console +3 -0
  245. metadata +473 -76
  246. data/bin/jets +0 -14
  247. data/lib/jets/base_controller.rb +0 -54
  248. data/lib/jets/build.rb +0 -46
  249. data/lib/jets/build/handler_generator.rb +0 -46
  250. data/lib/jets/build/lambda_deducer.rb +0 -23
  251. data/lib/jets/build/templates/handler.js +0 -149
  252. data/lib/jets/build/traveling_ruby.rb +0 -133
  253. data/lib/jets/cfn/base.rb +0 -17
  254. data/lib/jets/cfn/builder.rb +0 -53
  255. data/lib/jets/cfn/namer.rb +0 -30
  256. data/lib/jets/cli/help.rb +0 -19
  257. data/lib/jets/command.rb +0 -25
  258. data/lib/jets/process.rb +0 -18
  259. data/lib/jets/process/base_processor.rb +0 -23
  260. data/lib/jets/process/controller_processor.rb +0 -36
  261. data/lib/jets/process/help.rb +0 -11
  262. data/lib/jets/process/processor_deducer.rb +0 -51
  263. data/lib/jets/project.rb +0 -23
  264. data/notes/design.md +0 -107
  265. data/notes/faq.md +0 -3
  266. data/notes/lambda_ruby_info.md +0 -34
  267. data/notes/traveling-ruby-packaging-jets.md +0 -26
  268. data/notes/traveling-ruby-packaging.md +0 -103
  269. data/notes/traveling-ruby-structure.md +0 -6
  270. data/notes/traveling-ruby.md +0 -82
  271. data/spec/fixtures/classes.rb +0 -5
  272. data/spec/fixtures/project/.gitignore +0 -3
  273. data/spec/fixtures/project/.ruby-version +0 -1
  274. data/spec/fixtures/project/Gemfile +0 -4
  275. data/spec/fixtures/project/Gemfile.lock +0 -23
  276. data/spec/fixtures/project/app/controllers/application_controller.rb +0 -2
  277. data/spec/fixtures/project/app/controllers/posts_controller.rb +0 -12
  278. data/spec/fixtures/project/bin/jets +0 -22
  279. data/spec/fixtures/project/config/routes.rb +0 -6
  280. data/spec/fixtures/project/handlers/controllers/posts.js +0 -212
  281. data/spec/lib/cli_spec.rb +0 -20
  282. data/spec/lib/jets/base_controller_spec.rb +0 -18
  283. data/spec/lib/jets/build/handler_generator_spec.rb +0 -20
  284. data/spec/lib/jets/build/lambda_deducer_spec.rb +0 -15
  285. data/spec/lib/jets/build_spec.rb +0 -34
  286. data/spec/lib/jets/cfn/builder_spec.rb +0 -18
  287. data/spec/lib/jets/cfn/namer_spec.rb +0 -16
  288. data/spec/lib/jets/process/controller_processor_spec.rb +0 -22
  289. data/spec/lib/jets/process/infer_spec.rb +0 -24
  290. data/spec/lib/jets/process_spec.rb +0 -18
  291. data/spec/lib/jets/project_spec.rb +0 -14
  292. data/spec/spec_helper.rb +0 -28
data/Rakefile CHANGED
@@ -4,3 +4,9 @@ require "rspec/core/rake_task"
4
4
  task :default => :spec
5
5
 
6
6
  RSpec::Core::RakeTask.new
7
+
8
+ require_relative "lib/jets"
9
+ desc "Generates cli reference docs as markdown"
10
+ task :docs do
11
+ Jets::Commands::Markdown::Creator.create_all
12
+ end
@@ -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
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # traps: INT - ^C
4
+ ['INT', 'TERM', 'QUIT'].each do |signal|
5
+ trap(signal) do
6
+ puts ""
7
+ sleep 0.1
8
+ exit
9
+ end
10
+ end
11
+
12
+ $:.unshift(File.expand_path("../../lib", __FILE__))
13
+ require "jets"
14
+ Jets::CLI.start
@@ -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
- spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
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
@@ -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 'pp'
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 :Build, 'jets/build'
12
- autoload :Process, 'jets/process'
13
- autoload :BaseController, 'jets/base_controller'
14
- autoload :Project, 'jets/project'
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
- extend Util
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
@@ -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