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
@@ -0,0 +1,5 @@
1
+ The node shim spawns out to this command.
2
+
3
+ ## Example
4
+
5
+ $ jets process:rule file://config_change.json '{"context":"data"}' "handlers/rules/game_rule.protect"
@@ -0,0 +1,3 @@
1
+ ## Example
2
+
3
+ $ jets routes
@@ -0,0 +1,6 @@
1
+ The local server for mimics API Gateway and provides a way to test your app locally without deploying to AWS.
2
+
3
+ ## Examples
4
+
5
+ $ jets server
6
+ $ jets server --host 0.0.0.0
@@ -0,0 +1 @@
1
+ Essentially the events of the CloudFormation stack update. If the CloudFormation stack is currently updating, this will tail the events logs.
@@ -0,0 +1,5 @@
1
+ Provides the app url if routes have been configured.
2
+
3
+ ## Example
4
+
5
+ $ jets url
@@ -0,0 +1,111 @@
1
+ require "thor"
2
+
3
+ module Jets::Commands
4
+ class Main < Base
5
+
6
+ class_option :noop, type: :boolean
7
+
8
+ desc "build", "Builds and packages project for AWS Lambda"
9
+ long_desc Help.text(:build)
10
+ option :templates_only, type: :boolean, default: false, desc: "provide a way to skip building the code and only build the CloudFormation templates"
11
+ def build
12
+ Build.new(options).run
13
+ end
14
+
15
+ desc "deploy [environment]", "Builds and deploys project to AWS Lambda"
16
+ long_desc Help.text(:deploy)
17
+ option :capabilities, type: :array, desc: "iam capabilities. Ex: CAPABILITY_IAM, CAPABILITY_NAMED_IAM"
18
+ option :iam, type: :boolean, desc: "Shortcut for common IAM capabilities: CAPABILITY_IAM, CAPABILITY_NAMED_IAM"
19
+ # Note the environment is here to trick the Thor parser to allowing an
20
+ # environment parameter. It is not actually set here. It is set earlier
21
+ # in cli.rb: set_jets_env_for_deploy_command!
22
+ def deploy(environment=nil)
23
+ Jets::Timing.clear # must happen outside Deploy#run
24
+ Deploy.new(options).run
25
+ Jets::Timing.report
26
+ end
27
+
28
+ desc "delete", "Delete the Jets project and all its resources"
29
+ long_desc Help.text(:delete)
30
+ option :sure, type: :boolean, desc: "Skip are you sure prompt."
31
+ option :wait, type: :boolean, default: true, desc: "Wait for stack deletion to complete."
32
+ def delete
33
+ Delete.new(options).run
34
+ end
35
+
36
+ desc "server", "Runs a local server that mimics API Gateway for development"
37
+ long_desc Help.text(:server)
38
+ option :port, default: "8888", desc: "use PORT"
39
+ option :host, default: "127.0.0.1", desc: "listen on HOST"
40
+ def server
41
+ # shell out to shotgun for automatic reloading
42
+ o = options
43
+ command = "bundle exec shotgun --port #{o[:port]} --host #{o[:host]}"
44
+ puts "=> #{command}".colorize(:green)
45
+ puts Jets::Booter.message
46
+ system(command)
47
+ end
48
+
49
+ desc "routes", "Print out your application routes"
50
+ long_desc Help.text(:routes)
51
+ def routes
52
+ puts Jets::Router.routes_help
53
+ end
54
+
55
+ desc "console", "REPL console with Jets environment loaded"
56
+ long_desc Help.text(:console)
57
+ def console
58
+ Console.run
59
+ end
60
+
61
+ desc "dbconsole", "Starts DB REPL console"
62
+ long_desc Help.text(:dbconsole)
63
+ def dbconsole
64
+ Dbconsole.start(*args)
65
+ end
66
+
67
+ # Command is called 'call' because invoke is a Thor keyword.
68
+ desc "call [function] [event]", "Call a lambda function on AWS or locally"
69
+ long_desc Help.text(:call)
70
+ option :invocation_type, default: "RequestResponse", desc: "RequestResponse, Event, or DryRun"
71
+ option :log_type, default: "Tail", desc: "Works if invocation_type set to RequestResponse"
72
+ option :qualifier, desc: "Lambda function version or alias name"
73
+ option :show_log, type: :boolean, desc: "Shows last 4KB of log in the x-amz-log-result header"
74
+ option :lambda_proxy, type: :boolean, default: true, desc: "Enables automatic Lambda proxy transformation of the event payload"
75
+ option :guess, type: :boolean, default: true, desc: "Enables guess mode. Uses inference to allows use of all dashes to specify functions. Smart mode verifies that the function exists in the code base."
76
+ option :local, type: :boolean, desc: "Enables local mode. Instead of invoke the AWS Lambda function, the method gets called locally with current app code. With local mode guess mode is always used."
77
+ def call(function_name, payload='')
78
+ Call.new(function_name, payload, options).run
79
+ end
80
+
81
+ desc "generate [type] [args]", "Generates things like scaffolds"
82
+ long_desc Help.text(:generate)
83
+ def generate(generator, *args)
84
+ Jets::Generator.invoke(generator, *args)
85
+ end
86
+
87
+ desc "status", "Shows the current status of the Jets app."
88
+ long_desc Help.text(:status)
89
+ def status
90
+ Jets::Cfn::Status.new(options).run
91
+ end
92
+
93
+ desc "url", "App url if routes are defined"
94
+ long_desc Help.text(:url)
95
+ def url
96
+ Jets::Commands::Url.new(options).display
97
+ end
98
+
99
+ desc "version", "Prints Jets version"
100
+ long_desc Help.text(:version)
101
+ def version
102
+ puts Jets.version
103
+ end
104
+
105
+ long_desc Help.text(:new)
106
+ Jets::Commands::New.cli_options.each do |args|
107
+ option *args
108
+ end
109
+ register(Jets::Commands::New, "new", "new", "Creates a starter skeleton jets project")
110
+ end
111
+ end
@@ -0,0 +1,8 @@
1
+ module Jets::Commands
2
+ module Markdown
3
+ autoload :Creator, 'jets/commands/markdown/creator'
4
+ autoload :Index, 'jets/commands/markdown/index'
5
+ autoload :Page, 'jets/commands/markdown/page'
6
+ autoload :Shell, 'jets/commands/markdown/shell'
7
+ end
8
+ end
@@ -0,0 +1,58 @@
1
+ module Jets::Commands::Markdown
2
+ class Creator
3
+ cattr_accessor :mute
4
+
5
+ def self.create_all
6
+ clean
7
+ new.create_all
8
+ end
9
+
10
+ def self.clean
11
+ FileUtils.rm_rf("docs/_reference")
12
+ FileUtils.rm_f("docs/reference.md")
13
+ end
14
+
15
+ def cli_classes
16
+ Jets::Commands::Base.namespaced_commands.map do |full_command|
17
+ # IE of full_command: dynamodb:generate
18
+ Jets::CLI.new([full_command]).lookup(full_command)
19
+ end.uniq
20
+ end
21
+
22
+ def create_all
23
+ create_index
24
+
25
+ cli_classes.each do |cli_class|
26
+ # cli_class examples:
27
+ # Jets::Commands::Main
28
+ # Jets::Commands::Db
29
+ # Jets::Commands::Dynamodb::Migrate
30
+ cli_class.commands.each do |command|
31
+ command_name = command.first
32
+
33
+ page = Page.new(cli_class: cli_class, command_name: command_name)
34
+ create_page(page)
35
+ end
36
+ end
37
+ end
38
+
39
+ def create_page(page)
40
+ puts "Creating page: #{page.path}..."
41
+ FileUtils.mkdir_p(File.dirname(page.path))
42
+ IO.write(page.path, page.doc)
43
+ end
44
+
45
+ def create_index
46
+ create_include_reference
47
+ page = Index.new
48
+ FileUtils.mkdir_p(File.dirname(page.path))
49
+ puts "Creating index: #{page.path}"
50
+ IO.write(page.path, page.doc)
51
+ end
52
+
53
+ def create_include_reference
54
+ path = "docs/_includes/reference.md"
55
+ IO.write(path, "Generic tool description. Please edit #{path} with a description.") unless File.exist?(path)
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,27 @@
1
+ module Jets::Commands::Markdown
2
+ class Index
3
+ def path
4
+ "docs/reference.md"
5
+ end
6
+
7
+ def command_list
8
+ commands = Jets::Commands::Base.namespaced_commands.sort.reject {|c| c.include?('help') }
9
+ commands.map do |full_command|
10
+ # Example: [jets deploy]({% link _reference/jets-deploy.md %})
11
+ link = full_command.gsub(':','-')
12
+ "* [jets #{full_command}]({% link _reference/jets-#{link}.md %})"
13
+ end.join("\n")
14
+ end
15
+
16
+ def doc
17
+ <<-EOL
18
+ ---
19
+ title: CLI Reference
20
+ ---
21
+ {% include reference.md %}
22
+
23
+ #{command_list}
24
+ EOL
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,125 @@
1
+ module Jets::Commands::Markdown
2
+ class Page
3
+ attr_reader :cli_name
4
+ def initialize(cli_class:, command_name:)
5
+ @cli_class = cli_class # IE: Jets::Commands::Main
6
+ @command_name = command_name # IE: generate
7
+
8
+ @cli_name = "jets"
9
+ @command = @cli_class.commands[@command_name]
10
+ end
11
+
12
+ def usage
13
+ banner = @cli_class.send(:banner, @command) # banner is protected method
14
+ invoking_command = File.basename($0) # could be rspec, etc
15
+ banner.sub(invoking_command, cli_name)
16
+ end
17
+
18
+ def full_command
19
+ [namespace, @command_name].compact.join(':')
20
+ end
21
+
22
+ def namespace
23
+ ns = @cli_class.to_s.sub('Jets::Commands::','').underscore.gsub('/','-')
24
+ ns == 'main' ? nil : ns
25
+ end
26
+
27
+ def description
28
+ @command.description
29
+ end
30
+
31
+ def options
32
+ shell = Shell.new
33
+ @cli_class.send(:class_options_help, shell, nil => @command.options.values)
34
+ text = shell.stdout.string
35
+ return "" if text.empty? # there are no options
36
+
37
+ lines = text.split("\n")[1..-1] # remove first line wihth "Options: "
38
+ lines.map! do |line|
39
+ # remove 2 leading spaces
40
+ line.sub(/^ /, '')
41
+ end
42
+ lines.join("\n")
43
+ end
44
+
45
+ # Use command's long description as main description
46
+ def long_description
47
+ text = @command.long_description
48
+ return "" if text.nil? # empty description
49
+
50
+ lines = text.split("\n")
51
+ lines.map do |line|
52
+ # In the CLI help, we use 2 spaces to designate commands
53
+ # In Markdown we need 4 spaces.
54
+ line.sub(/^ \b/, ' ')
55
+ end.join("\n")
56
+ end
57
+
58
+ def path
59
+ full_name = [cli_name, namespace, @command_name].compact.join('-')
60
+ "docs/_reference/#{full_name}.md"
61
+ end
62
+
63
+ def doc
64
+ <<-EOL
65
+ #{front_matter}
66
+ #{usage_markdown}
67
+ #{long_desc_markdown}
68
+ #{options_markdown}
69
+ EOL
70
+ end
71
+
72
+ def front_matter
73
+ command = [cli_name, full_command].compact.join(' ')
74
+ <<-EOL
75
+ ---
76
+ title: #{command}
77
+ reference: true
78
+ ---
79
+ EOL
80
+ end
81
+
82
+ def usage_markdown
83
+ <<-EOL
84
+ ## Usage
85
+
86
+ #{usage}
87
+ EOL
88
+ end
89
+
90
+ def desc_markdown
91
+ <<-EOL
92
+ ## Description
93
+
94
+ #{description}
95
+ EOL
96
+ end
97
+
98
+ # If the Thor long_description is empty then use the description.
99
+ def long_desc_markdown
100
+ return desc_markdown if long_description.empty?
101
+
102
+ <<-EOL
103
+ ## Description
104
+
105
+ #{description}.
106
+
107
+ #{long_description}
108
+ EOL
109
+ end
110
+
111
+ # handles blank options
112
+ def options_markdown
113
+ return '' if options.empty?
114
+
115
+ <<-EOL
116
+ ## Options
117
+
118
+ ```
119
+ #{options}
120
+ ```
121
+ EOL
122
+ end
123
+
124
+ end
125
+ end
@@ -0,0 +1,11 @@
1
+ require 'thor'
2
+
3
+ module Jets::Commands::Markdown
4
+ # Override stdout as an @io object so we can grab the text written normally
5
+ # outputted to the shell.
6
+ class Shell < Thor::Shell::Basic
7
+ def stdout
8
+ @io ||= StringIO.new
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,110 @@
1
+ module Jets::Commands
2
+ class New < Sequence
3
+ argument :project_name
4
+
5
+ # Ugly, but when the class_option is only defined in the Thor::Group class
6
+ # it doesnt show up with jets new help :(
7
+ # If anyone knows how to fix this let me know.
8
+ def self.cli_options
9
+ [
10
+ [:repo, desc: "GitHub repo to use. Format: user/repo"],
11
+ [:force, type: :boolean, desc: "Bypass overwrite are you sure prompt for existing files."],
12
+ [:api, type: :boolean, default: false, desc: "API mode."],
13
+ [:webpacker, type: :boolean, default: true, desc: "Install webpacker"],
14
+ [:bootstrap, type: :boolean, default: true, desc: "Install bootstrap css"], # same option in WebpackerTemplate
15
+ [:git, type: :boolean, default: true, desc: "Git initialize the project"],
16
+ ]
17
+ end
18
+
19
+ cli_options.each do |args|
20
+ class_option *args
21
+ end
22
+
23
+ def set_api_mode
24
+ # options is a frozen hash by Thor so cannot modify it.
25
+ # Also had trouble unfreezing it with .dup. So using instance variables instead
26
+ if options[:api]
27
+ @webpacker = false
28
+ @bootstrap = false
29
+ else
30
+ @webpacker = options[:webpacker]
31
+ @bootstrap = options[:bootstrap]
32
+ end
33
+ end
34
+
35
+ def create_project
36
+ options[:repo] ? clone_project : copy_project
37
+
38
+ destination_root = "#{Dir.pwd}/#{project_name}"
39
+ self.destination_root = destination_root
40
+ FileUtils.cd("#{Dir.pwd}/#{project_name}")
41
+ end
42
+
43
+ def make_bin_executable
44
+ chmod "bin", 0755 & ~File.umask, verbose: false
45
+ end
46
+
47
+ def bundle_install
48
+ Bundler.with_clean_env do
49
+ system("BUNDLE_IGNORE_CONFIG=1 bundle install")
50
+ end
51
+ end
52
+
53
+ def webpacker_install
54
+ return unless @webpacker
55
+
56
+ command = "jets webpacker:install"
57
+ command += " FORCE=1" if options[:force]
58
+ run(command)
59
+ end
60
+
61
+ # bootstrap is dependent on webpacker, options[:bootstrap] is used
62
+ # in webpacker_install.
63
+ def bootstrap_install
64
+ return unless @bootstrap
65
+
66
+ # Add jquery and popper plugin to handle Delete of CRUD
67
+ jquery =<<-JS
68
+ const webpack = require('webpack')
69
+ environment.plugins.prepend('Provide', new webpack.ProvidePlugin({
70
+ $: 'jquery',
71
+ jQuery: 'jquery',
72
+ Popper: ['popper.js', 'default']
73
+ }))
74
+ JS
75
+ after = "const { environment } = require('@rails/webpacker')\n"
76
+ insert_into_file("config/webpack/environment.js", jquery, after: after)
77
+
78
+ run("yarn add bootstrap@4.0.0-beta jquery popper.js")
79
+ end
80
+
81
+ def git_init
82
+ return if !options[:git]
83
+ return unless git_installed?
84
+ return if File.exist?(".git") # this is a clone repo
85
+
86
+ run("git init")
87
+ run("git add .")
88
+ run("git commit -m 'first commit'")
89
+ end
90
+
91
+ def user_message
92
+ puts <<-EOL
93
+ #{"="*64}
94
+ Congrats 🎉 You have successfully created a Jets project.
95
+
96
+ Cd into the project directory:
97
+ cd #{project_name}
98
+
99
+ To start a server and test locally:
100
+ jets server # localhost:8888 should have the Jets welcome page
101
+
102
+ Scaffold example:
103
+ jets generate scaffold Post title:string body:text published:boolean
104
+
105
+ To deploy to AWS Lambda:
106
+ jets deploy
107
+ EOL
108
+ end
109
+ end
110
+ end