roro 0.3.13 → 0.3.21

Sign up to get free protection for your applications and to get access to all the features.
Files changed (214) hide show
  1. checksums.yaml +5 -5
  2. data/.circleci/config.yml +55 -11
  3. data/.gitignore +3 -2
  4. data/Guardfile +8 -10
  5. data/README.md +2 -1
  6. data/lib/roro.rb +3 -1
  7. data/lib/roro/cli.rb +16 -74
  8. data/lib/roro/cli/generate/exposed.rb +14 -0
  9. data/lib/roro/cli/generate/{generate_keys.rb → keys.rb} +24 -2
  10. data/lib/roro/cli/generate/obfuscated.rb +17 -0
  11. data/lib/roro/cli/generate/story.rb +18 -0
  12. data/lib/roro/cli/greenfield/rails.rb +14 -0
  13. data/lib/roro/cli/rollon.rb +126 -63
  14. data/lib/roro/cli/rollon/rails/base/base.rb +4 -0
  15. data/lib/roro/cli/{base → rollon/rails/base}/insert_gems.rb +2 -10
  16. data/lib/roro/cli/{base → rollon/rails/base}/insertions.rb +8 -0
  17. data/lib/roro/cli/rollon/rails/database.rb +26 -0
  18. data/lib/roro/cli/rollon/{stories/rails → rails}/database/with_mysql.rb +4 -4
  19. data/lib/roro/cli/rollon/{stories/rails → rails}/database/with_postgresql.rb +5 -6
  20. data/lib/roro/cli/rollon/ruby_gem.rb +1 -0
  21. data/lib/roro/cli/rollon/{stories/ruby_gem → ruby_gem}/with_ci_cd.rb +8 -8
  22. data/lib/roro/cli/rollon/stories.rb +2 -2
  23. data/lib/roro/configurator.rb +15 -0
  24. data/lib/roro/configurator/eligibility.rb +137 -0
  25. data/lib/roro/configurator/okonomi.rb +28 -0
  26. data/lib/roro/configurator/omakase.rb +170 -0
  27. data/lib/roro/crypto.rb +73 -0
  28. data/lib/roro/stories/greenfield.yml +1 -0
  29. data/lib/roro/stories/greenfield/rails.yml +9 -0
  30. data/lib/roro/stories/rollon.yml +42 -0
  31. data/lib/roro/stories/rollon/rails.yml +76 -0
  32. data/lib/roro/stories/rollon/rails/ci_cd.yml +1 -0
  33. data/lib/roro/stories/rollon/rails/ci_cd/circleci.yml +2 -0
  34. data/lib/roro/stories/rollon/rails/database.yml +9 -0
  35. data/lib/roro/stories/rollon/rails/database/mysql.yml +17 -0
  36. data/lib/roro/stories/rollon/rails/database/postgresql.yml +15 -0
  37. data/lib/roro/stories/rollon/rails/kubernetes.yml +1 -0
  38. data/lib/roro/stories/rollon/rails/kubernetes/postgresql.yml +10 -0
  39. data/lib/roro/stories/rollon/rails/kubernetes/postgresql/default.yml +1 -0
  40. data/lib/roro/stories/rollon/rails/kubernetes/postgresql/edge.yml +1 -0
  41. data/lib/roro/stories/rollon/ruby_gem.yml +5 -0
  42. data/lib/roro/templates/base/.circleci/_aliases.yml +8 -0
  43. data/lib/roro/templates/base/.circleci/_commands.yml +31 -0
  44. data/lib/roro/templates/base/.circleci/_defaults.yml +5 -0
  45. data/lib/roro/templates/base/.circleci/_executors.yml +11 -0
  46. data/lib/roro/templates/base/.circleci/_major_only.yml +4 -0
  47. data/lib/roro/templates/base/.circleci/_version.yml +1 -0
  48. data/lib/roro/templates/base/.circleci/_workflow.yml +2 -0
  49. data/lib/roro/templates/base/.circleci/config.job-example.yml +33 -0
  50. data/lib/roro/templates/base/.circleci/jobs/_build.yml +4 -0
  51. data/lib/roro/templates/base/.circleci/jobs/_release.yml +12 -0
  52. data/lib/roro/templates/base/.circleci/workflows/_build_release.yml +10 -0
  53. data/lib/roro/{cli/templates → templates}/base/.dockerignore +0 -0
  54. data/lib/roro/templates/base/dotenv +1 -0
  55. data/lib/roro/{cli/rollon/stories/rails → templates/base/jumpstart}/.keep +0 -0
  56. data/lib/roro/{cli/templates → templates/base}/jumpstart/Dockerfile.tt +0 -0
  57. data/lib/roro/{cli/templates → templates/base}/jumpstart/docker-compose.yml +0 -0
  58. data/lib/roro/{cli/templates → templates/base}/jumpstart/docker-entrypoint.sh +0 -0
  59. data/lib/roro/{cli/templates → templates/base}/livereload/hosts.example +0 -0
  60. data/lib/roro/{cli/templates/base → templates/base/roro}/.keep +0 -0
  61. data/lib/roro/{cli/templates/jumpstart → templates/base/roro/roro}/.keep +0 -0
  62. data/lib/roro/{cli/templates/roro → templates/base/roro/roro/containers}/.keep +0 -0
  63. data/lib/roro/{cli/templates/roro/roro → templates/base/roro/roro/containers/app}/.keep +0 -0
  64. data/lib/roro/{cli/templates/roro/roro/containers → templates/base/roro/roro/containers/frontend}/.keep +0 -0
  65. data/lib/roro/{cli/templates → templates/base}/roro/roro/docker-entrypoint.sh.tt +0 -0
  66. data/lib/roro/{cli/templates/roro/roro/containers/app → templates/rails/.circleci}/.keep +0 -0
  67. data/lib/roro/templates/rails/.circleci/config.yml.tt +11 -0
  68. data/lib/roro/templates/rails/.circleci/jobs/_build.yml +14 -0
  69. data/lib/roro/templates/rails/.circleci/jobs/_push.yml +11 -0
  70. data/lib/roro/templates/rails/.circleci/jobs/_test.yml +12 -0
  71. data/lib/roro/{cli/templates/ruby_gem → templates/rails}/.circleci/setup-gem-credentials.sh +0 -0
  72. data/lib/roro/templates/rails/.circleci/workflows/_build_test_push.yml +12 -0
  73. data/lib/roro/{cli/templates/roro/roro/containers/frontend → templates/rails}/.keep +0 -0
  74. data/lib/roro/templates/rails/Dockerfile.greenfield.tt +51 -0
  75. data/lib/roro/{cli/templates/base → templates/rails}/config/database.mysql.yml +0 -0
  76. data/lib/roro/{cli/templates/base → templates/rails}/config/database.pg.yml +2 -3
  77. data/lib/roro/templates/rails/database/with_mysql/_service.yml +10 -0
  78. data/lib/roro/{cli/templates/ruby_gem/.circleci → templates/rails/database/with_postgresql}/.keep +0 -0
  79. data/lib/roro/templates/rails/database/with_postgresql/_service.yml +7 -0
  80. data/lib/roro/{cli/templates/roro → templates/rails}/docker-compose.yml.tt +9 -10
  81. data/lib/roro/{cli/templates/ruby_gem/roro/containers → templates/rails/dotenv}/.keep +0 -0
  82. data/lib/roro/templates/rails/dotenv/database.mysql.env.tt +6 -0
  83. data/lib/roro/templates/rails/dotenv/database.pg.env.tt +4 -0
  84. data/lib/roro/templates/rails/dotenv/web.env.tt +2 -0
  85. data/lib/roro/templates/rails/kube.rake.tt +114 -0
  86. data/lib/roro/{cli/templates/ruby_gem/roro/keys → templates/rails/roro}/.keep +0 -0
  87. data/lib/roro/{cli/templates/stories → templates/rails/roro/containers}/.keep +0 -0
  88. data/lib/roro/{cli/templates/stories/rails/database/with_postgresql → templates/rails/roro/containers/app}/.keep +0 -0
  89. data/lib/roro/templates/rails/roro/containers/app/Dockerfile.tt +34 -0
  90. data/lib/roro/{cli/templates/stories/with_postgresql → templates/rails/roro/containers/frontend}/.keep +0 -0
  91. data/lib/roro/templates/rails/roro/docker-entrypoint.sh +8 -0
  92. data/lib/roro/{cli/rollon/stories/database.rb → templates/rails/roro/kube/.keep} +0 -0
  93. data/lib/roro/templates/rails/roro/kube/certificate.yml.tt +0 -0
  94. data/lib/roro/templates/rails/roro/kube/cluster-issuer.yml.tt +0 -0
  95. data/lib/roro/templates/rails/roro/kube/deployment.yml.tt +50 -0
  96. data/lib/roro/templates/rails/roro/kube/deployments/postgres_deploy.yaml +47 -0
  97. data/lib/roro/templates/rails/roro/kube/deployments/rails_deploy.yaml +62 -0
  98. data/lib/roro/templates/rails/roro/kube/deployments/redis_deploy.yaml +23 -0
  99. data/lib/roro/templates/rails/roro/kube/deployments/sidekiq_deploy.yaml +56 -0
  100. data/lib/roro/templates/rails/roro/kube/ingress.yml.tt +0 -0
  101. data/lib/roro/templates/rails/roro/kube/ingresses/ingress.yaml +13 -0
  102. data/lib/roro/templates/rails/roro/kube/job-migrate.yml.tt +0 -0
  103. data/lib/roro/templates/rails/roro/kube/jobs/setup.yaml +42 -0
  104. data/lib/roro/templates/rails/roro/kube/secret-digital-ocean.yml.tt +4 -0
  105. data/lib/roro/templates/rails/roro/kube/service.yml.tt +10 -0
  106. data/lib/roro/templates/rails/roro/kube/services/postgres_svc.yaml +13 -0
  107. data/lib/roro/templates/rails/roro/kube/services/rails_svc.yaml +13 -0
  108. data/lib/roro/templates/rails/roro/kube/services/redis_svc.yaml +13 -0
  109. data/lib/roro/templates/rails/roro/kube/volumes/postgres_volumes.yaml +25 -0
  110. data/lib/roro/templates/ruby_gem/.circleci/.keep +0 -0
  111. data/lib/roro/templates/ruby_gem/.circleci/config.yml.tt +16 -0
  112. data/lib/roro/templates/ruby_gem/.circleci/jobs/_test.yml +4 -0
  113. data/lib/roro/templates/ruby_gem/.circleci/setup-gem-credentials.sh +3 -0
  114. data/lib/roro/{cli/templates → templates}/ruby_gem/docker-compose.yml +0 -0
  115. data/lib/roro/templates/ruby_gem/roro/containers/.keep +0 -0
  116. data/lib/roro/{cli/templates → templates}/ruby_gem/roro/containers/ruby_image/Dockerfile.tt +1 -1
  117. data/lib/roro/templates/ruby_gem/roro/containers/ruby_image/ci.env.tt +1 -0
  118. data/lib/roro/templates/ruby_gem/roro/keys/.keep +0 -0
  119. data/lib/roro/version.rb +1 -1
  120. data/roro.gemspec +11 -21
  121. data/roro/containers/app/Dockerfile +51 -0
  122. metadata +165 -173
  123. data/lib/roro/cli/base/base.rb +0 -8
  124. data/lib/roro/cli/base/base_files.rb +0 -24
  125. data/lib/roro/cli/base/check_dependencies.rb +0 -98
  126. data/lib/roro/cli/base/continuous_integration.rb +0 -13
  127. data/lib/roro/cli/base/utilities.rb +0 -39
  128. data/lib/roro/cli/cli.rb +0 -99
  129. data/lib/roro/cli/configuration.rb +0 -69
  130. data/lib/roro/cli/expose.rb +0 -14
  131. data/lib/roro/cli/generate/config.rb +0 -13
  132. data/lib/roro/cli/generate/config/rails.rb +0 -17
  133. data/lib/roro/cli/greenfield.rb +0 -31
  134. data/lib/roro/cli/obfuscate.rb +0 -19
  135. data/lib/roro/cli/rollon/stories/rails.rb +0 -1
  136. data/lib/roro/cli/rollon/stories/rails/database.rb +0 -33
  137. data/lib/roro/cli/rollon/stories/ruby_gem.rb +0 -77
  138. data/lib/roro/cli/rollon/stories/stories.rb +0 -3
  139. data/lib/roro/cli/roro_configurator.yml +0 -157
  140. data/lib/roro/cli/ruby_gem.rb +0 -67
  141. data/lib/roro/cli/templates/base/.roro_config.yml +0 -15
  142. data/lib/roro/cli/templates/base/Dockerfile.tt +0 -82
  143. data/lib/roro/cli/templates/greenfield/Dockerfile.tt +0 -43
  144. data/lib/roro/cli/templates/ruby_gem/.circleci/config.yml.tt +0 -40
  145. data/lib/roro/cli/templates/ruby_gem/roro/containers/ruby_image/ci.env.tt +0 -1
  146. data/lib/roro/cli/templates/stories/rails/database/with_mysql/_service.yml +0 -10
  147. data/lib/roro/cli/templates/stories/rails/database/with_postgresql/_service.yml +0 -7
  148. data/lib/roro/cli/templates/stories/ruby_gem/with_ci_cd/_build.yml +0 -11
  149. data/lib/roro/cli/templates/stories/with_mysql/_service.yml +0 -10
  150. data/lib/roro/cli/templates/stories/with_postgresql/_service.yml +0 -7
  151. data/lib/tasks/deploy.rake +0 -126
  152. data/vendor/cache/actionpack-6.0.3.2.gem +0 -0
  153. data/vendor/cache/actionview-6.0.3.2.gem +0 -0
  154. data/vendor/cache/activesupport-6.0.3.2.gem +0 -0
  155. data/vendor/cache/addressable-2.7.0.gem +0 -0
  156. data/vendor/cache/builder-3.2.4.gem +0 -0
  157. data/vendor/cache/byebug-11.1.3.gem +0 -0
  158. data/vendor/cache/coderay-1.1.3.gem +0 -0
  159. data/vendor/cache/concurrent-ruby-1.1.7.gem +0 -0
  160. data/vendor/cache/crass-1.0.6.gem +0 -0
  161. data/vendor/cache/em-websocket-0.5.1.gem +0 -0
  162. data/vendor/cache/erubi-1.9.0.gem +0 -0
  163. data/vendor/cache/eventmachine-1.2.7.gem +0 -0
  164. data/vendor/cache/ffi-1.13.1.gem +0 -0
  165. data/vendor/cache/formatador-0.2.5.gem +0 -0
  166. data/vendor/cache/gem-release-2.1.1.gem +0 -0
  167. data/vendor/cache/given_core-3.8.0.gem +0 -0
  168. data/vendor/cache/guard-2.16.2.gem +0 -0
  169. data/vendor/cache/guard-compat-1.2.1.gem +0 -0
  170. data/vendor/cache/guard-livereload-2.5.2.gem +0 -0
  171. data/vendor/cache/guard-minitest-2.4.6.gem +0 -0
  172. data/vendor/cache/handsome_fencer-crypto-0.1.6.gem +0 -0
  173. data/vendor/cache/handsome_fencer-test-0.1.1.gem +0 -0
  174. data/vendor/cache/http_parser.rb-0.6.0.gem +0 -0
  175. data/vendor/cache/i18n-1.8.5.gem +0 -0
  176. data/vendor/cache/launchy-2.5.0.gem +0 -0
  177. data/vendor/cache/listen-3.2.1.gem +0 -0
  178. data/vendor/cache/loofah-2.6.0.gem +0 -0
  179. data/vendor/cache/lumberjack-1.2.7.gem +0 -0
  180. data/vendor/cache/method_source-1.0.0.gem +0 -0
  181. data/vendor/cache/mini_portile2-2.4.0.gem +0 -0
  182. data/vendor/cache/minitest-5.14.1.gem +0 -0
  183. data/vendor/cache/minitest-given-3.8.0.gem +0 -0
  184. data/vendor/cache/minitest-matchers_vaccine-1.0.4.gem +0 -0
  185. data/vendor/cache/minitest-rails-6.0.1.gem +0 -0
  186. data/vendor/cache/mocha-1.11.2.gem +0 -0
  187. data/vendor/cache/multi_json-1.15.0.gem +0 -0
  188. data/vendor/cache/nenv-0.3.0.gem +0 -0
  189. data/vendor/cache/net-scp-3.0.0.gem +0 -0
  190. data/vendor/cache/net-ssh-6.1.0.gem +0 -0
  191. data/vendor/cache/nokogiri-1.10.10.gem +0 -0
  192. data/vendor/cache/notiffany-0.1.3.gem +0 -0
  193. data/vendor/cache/os-1.0.0.gem +0 -0
  194. data/vendor/cache/pry-0.13.1.gem +0 -0
  195. data/vendor/cache/public_suffix-4.0.5.gem +0 -0
  196. data/vendor/cache/rack-2.2.3.gem +0 -0
  197. data/vendor/cache/rack-livereload-0.3.17.gem +0 -0
  198. data/vendor/cache/rack-test-1.1.0.gem +0 -0
  199. data/vendor/cache/rails-dom-testing-2.0.3.gem +0 -0
  200. data/vendor/cache/rails-html-sanitizer-1.3.0.gem +0 -0
  201. data/vendor/cache/railties-6.0.3.2.gem +0 -0
  202. data/vendor/cache/rake-13.0.1.gem +0 -0
  203. data/vendor/cache/rb-fsevent-0.10.4.gem +0 -0
  204. data/vendor/cache/rb-inotify-0.10.1.gem +0 -0
  205. data/vendor/cache/shellany-0.0.1.gem +0 -0
  206. data/vendor/cache/shoulda-4.0.0.gem +0 -0
  207. data/vendor/cache/shoulda-context-2.0.0.gem +0 -0
  208. data/vendor/cache/shoulda-matchers-4.3.0.gem +0 -0
  209. data/vendor/cache/sorcerer-2.0.1.gem +0 -0
  210. data/vendor/cache/sshkit-1.18.2.gem +0 -0
  211. data/vendor/cache/thor-1.0.1.gem +0 -0
  212. data/vendor/cache/thread_safe-0.3.6.gem +0 -0
  213. data/vendor/cache/tzinfo-1.2.7.gem +0 -0
  214. data/vendor/cache/zeitwerk-2.4.0.gem +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 6b8dac88c95d43a7e4531d2b44849f30e1e37c9e
4
- data.tar.gz: 20af42166d1cc70f7b20d327d8cbc8027255cc6c
2
+ SHA256:
3
+ metadata.gz: 43e30bd9aa551984852307e9c258049546a167e89aaab22e3f8b7256cec22a23
4
+ data.tar.gz: 790ad729852cf34c8bbdfa6499ab325f399334d1df2c385d20e7ae5757dcd707
5
5
  SHA512:
6
- metadata.gz: c05e7ff871bcfb14a52602ef71b3a331113ff87da423cca594fb07b41fb5463a432809e0526b8ca77987fb6838829c5ccacfc6e85e1823bf92d6d66a5c1bc3f9
7
- data.tar.gz: db4039537980f16d922c0f08add246f66d1229b3055e0cfc0880f5bbdd968eca374d142639fb09d1b4d3d6246efac5dbe381239f516170e065ef3e72ab400366
6
+ metadata.gz: 4de76d1807c627790a721e968e458bcff335d9a972b8b496d5a1dfc494c8b750332eae75411dc689482bb3e60fab44319fa46cc95c63547cedfa5c849e527ce5
7
+ data.tar.gz: b7f2647884d116fc849431070829e2806f244771580a532f57e65cabbf17d856bf209d76e425eee28e370eee90ef6d10f0ab8de10998503bc058da846387bb78
data/.circleci/config.yml CHANGED
@@ -1,14 +1,58 @@
1
+ aliases:
2
+ - &workspace-location
3
+ at: /tmp/workspace
4
+ - &copy-ci-dotenv |
5
+ cp -rf /tmp/workspace/roro .
6
+ - &source-ci-variables |
7
+ echo 'source roro/containers/app/ci.env' >> $BASH_ENV
8
+ source $BASH_ENV
9
+
10
+ defaults: &defaults
11
+ executor: machine-executor
12
+ working_directory: ~/project
13
+
14
+ major_only: &major_only
15
+ filters:
16
+ branches:
17
+ only: master
18
+
19
+ release: &release
20
+ filters:
21
+ branches:
22
+ only: release
23
+
24
+
1
25
  version: 2.1
2
26
 
27
+ executors:
28
+ machine-executor:
29
+ machine: true
30
+ ruby-executor:
31
+ docker:
32
+ - image: cimg/ruby:2.7
33
+
3
34
  jobs:
4
35
 
5
36
  build:
6
- machine: true
37
+ <<: *defaults
7
38
  steps:
8
39
  - checkout
9
40
 
41
+ test-rollon-rails:
42
+ executor: ruby-executor
43
+ steps:
44
+ - checkout
45
+ - setup_remote_docker:
46
+ version: 19.03.12
47
+ - run: |
48
+ rake install
49
+ mkdir greenfield
50
+ cd greenfield
51
+ (yes || true) | roro greenfield
52
+ - run: echo 'success'
53
+
10
54
  test:
11
- machine: true
55
+ <<: *defaults
12
56
  steps:
13
57
  - checkout
14
58
  - run: RUBY_VERSION=2.5 docker-compose build ruby_gem
@@ -22,7 +66,7 @@ jobs:
22
66
  - run: RUBY_VERSION=2.7 docker-compose run ruby_gem bundle exec rake test
23
67
 
24
68
  release:
25
- machine: true
69
+ <<: *defaults
26
70
  steps:
27
71
  - checkout
28
72
  - run: gem install roro
@@ -39,17 +83,17 @@ jobs:
39
83
  workflows:
40
84
  version: 2
41
85
 
42
- build-release:
86
+ build-cli:
43
87
  jobs:
44
- - build
88
+ - build:
89
+ <<: *major_only
90
+ <<: *release
91
+ - test-rollon-rails:
92
+ <<: *major_only
45
93
  - test:
46
- filters:
47
- branches:
48
- only: master
94
+ <<: *major_only
49
95
 
50
96
  - release:
51
97
  requires:
52
98
  - build
53
- filters:
54
- branches:
55
- only: release
99
+ <<: *release
data/.gitignore CHANGED
@@ -14,11 +14,12 @@ roro/**/*.key
14
14
  *.key
15
15
  *.env
16
16
  !/.gitignore
17
-
17
+ *.gem
18
18
  tmp/*
19
19
  !tmp/.keep
20
20
  sandbox/*
21
21
  !sandbox/.keep
22
22
  !sandbox/greenfield
23
23
  sandbox/greenfield/*
24
- !sandbox/greenfield/.keep
24
+ !sandbox/greenfield/.keep
25
+ TUTORIAL.md
data/Guardfile CHANGED
@@ -1,17 +1,15 @@
1
- # A sample Guardfile
2
- # More info at https://github.com/guard/guard#readme
3
-
4
1
  options = {
5
- cli: '-f',
6
- all_on_start: true,
7
- all_after_pass: true
2
+ all_on_start: false,
3
+ all_after_pass: false,
8
4
  }
9
5
 
10
6
  guard :minitest, options do
11
7
 
12
- watch(%r{^test/(.*)\/?test_(.*)\.rb$})
13
8
  watch(%r{^test/(.*)\/?(.*)_test\.rb$})
14
- watch(%r{^lib/roro/(.+)\.rb$}) { |m| "test/#{m[1]}_test.rb" }
15
- watch(%r{^test/thor_helper\.rb$}) { 'test' }
16
- watch(%r{^test/fixtures/files/(.*/)?([^/]+)\.yml$}) { 'test' }
9
+ watch(%r{^test/helpers/(.*)\.rb$}) { 'test' }
10
+ watch(%r{^test/test_helper\.rb$}) { 'test' }
11
+ watch(%r{^lib/roro/(.+)\.rb$}) { |m| "test/#{m[1]}_test.rb" }
12
+ watch(%r{^lib/roro/cli/(.+)\.rb$}) { |m| "test/cli/#{m[1]}_test.rb" }
13
+ watch(%r{^lib/roro/cli/(.+)\.yml$}) { |m| "test/cli" }
14
+ watch(%r{^lib/roro/cli/(.+)\.tt$}) { |m| "test/cli" }
17
15
  end
data/README.md CHANGED
@@ -217,4 +217,5 @@ $ docker system prune -af --volumes
217
217
  This gem and its associated practices are just one way of using these tools and not the canonical way. My purpose in publishing it is to get a conversation started about what conventions around these tools might look like. If you have ideas on how to make it better please put in an issue -- or fork the repo, make your changes, write your tests, and send me a pull request. It'll make me feel warm inside.
218
218
 
219
219
  ## License
220
- The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
220
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
221
+
data/lib/roro.rb CHANGED
@@ -1,6 +1,8 @@
1
- require "roro/version"
2
1
  require "thor"
2
+ require "roro/version"
3
3
  require "roro/cli"
4
+ require "roro/configurator"
5
+ require "roro/crypto"
4
6
 
5
7
  module Roro
6
8
  class Error < StandardError; end
data/lib/roro/cli.rb CHANGED
@@ -1,89 +1,31 @@
1
- require 'roro/cli/base/base'
2
- require 'roro/cli/greenfield'
3
- require 'roro/cli/obfuscate'
4
- require 'roro/cli/expose'
5
- require 'roro/cli/generate/config/rails'
6
- require 'roro/cli/generate/config'
7
- require 'roro/cli/generate/generate_keys'
8
- require 'roro/cli/configuration'
9
1
 
2
+ require 'roro/cli/generate/exposed'
3
+ require 'roro/cli/generate/keys'
4
+ require 'roro/cli/generate/obfuscated'
5
+ require 'roro/cli/generate/story'
6
+ require 'roro/cli/greenfield/rails'
10
7
  require 'roro/cli/rollon'
8
+ require 'roro/cli/rollon/rails/base/base'
9
+ require 'roro/cli/rollon/rails/database/with_mysql'
10
+ require 'roro/cli/rollon/rails/database/with_postgresql'
11
+
12
+ require 'roro/cli/rollon/ruby_gem'
13
+
11
14
  module Roro
12
-
13
15
  class CLI < Thor
14
16
 
15
17
  include Thor::Actions
16
18
 
17
19
  def self.source_root
18
- File.dirname(__FILE__) + '/cli/templates'
19
- end
20
-
21
-
22
- desc "rollon::rails", "Generates files for and makes changes to your app
23
- so it can run using Docker containers."
24
- method_option :interactive, desc: "Set up your environment variables as
25
- you go."
26
- map "rollon::rails" => "rollon_rails"
27
-
28
- def rollon_rails
29
- rollon
30
- end
31
-
32
-
33
- desc "greenfield::rails", "Greenfield a new, dockerized rails app with
34
- either MySQL or PostgreSQL in a separate container."
35
-
36
- method_option :env_vars, type: :hash, default: {}, desc: "Pass a list of environment variables like so: env:var", banner: "key1:value1 key2:value2"
37
- method_option :interactive, desc: "Set up your environment variables as you go."
38
- method_option :force, desc: "force over-write of existing files"
39
-
40
- map "greenfield::rails" => "greenfield_rails"
41
-
42
- def greenfield_rails(*args)
43
- greenfield(*args)
20
+ File.dirname(__FILE__) + '/templates'
44
21
  end
45
- desc "generate::exposed", "Generate private .env files from
46
- encrypted .env.enc files inside the roro directory."
47
- map "generate::exposed" => "generate_exposed"
48
22
 
49
- def generate_exposed(*args)
50
- expose(*args)
23
+ def self.story_root
24
+ File.dirname(__FILE__) + '/stories'
51
25
  end
52
26
 
53
- desc "generate::key", "Generate a key inside roro/keys. Takes the name of
54
- an environment as an argument to private .env files from
55
- encrypted .env.enc files inside the roro directory.
56
- Expose encrypted files"
57
-
58
- map "generate::key" => "generate_key"
59
- method_option :environment, type: :hash, default: {}, desc: "Pass a list of environment variables like so: env:var", banner: "development, staging"
60
-
61
- def generate_key(*args)
62
- generate_key_or_keys(*args)
63
- end
64
-
65
- desc "generate::keys", "Generate keys for each environment inside roro/keys.
66
- If you have .env files like 'roro/containers/app/[staging_env].env' and
67
- 'roro/[circle_ci_env].env' it will generate '/roro/keys/[staging_env].key'
68
- and '/roro/keys/[circle_ci_env].key'."
69
- map "generate::keys" => "generate_keys"
70
-
71
- def generate_keys(*args)
72
- generate_key(*args)
73
- end
74
-
75
- desc "generate::config", "Generate a config file at .roro_config.yml"
76
- map "generate::config" => "generate_config"
77
-
78
- def generate_config
79
- create_file ".roro_config.yml", @config.app.to_yaml
80
- end
81
-
82
- desc "generate::obfuscated", "obfuscates any files matching the pattern ./roro/**/*.env"
83
- map "generate::obfuscated" => "generate_obfuscated"
84
-
85
- def generate_obfuscated(*args)
86
- obfuscate(*args)
27
+ def self.roro_environments
28
+ %w(development production test staging ci)
87
29
  end
88
30
  end
89
31
  end
@@ -0,0 +1,14 @@
1
+ module Roro
2
+ class CLI < Thor
3
+
4
+ desc "generate::exposed", "Generate private .env files from encrypted .env.enc files inside the roro directory."
5
+ map "generate::exposed" => "generate_exposed"
6
+
7
+ def generate_exposed(*args)
8
+ environments = args.first ? [args.first] : gather_environments
9
+ environments.each do |environment|
10
+ Roro::Crypto.expose(environment, 'roro')
11
+ end
12
+ end
13
+ end
14
+ end
@@ -2,6 +2,28 @@ module Roro
2
2
 
3
3
  class CLI < Thor
4
4
 
5
+ desc "generate::key", "Generate a key inside roro/keys. Takes the name of
6
+ an environment as an argument to private .env files from
7
+ encrypted .env.enc files inside the roro directory.
8
+ Expose encrypted files"
9
+
10
+ map "generate::key" => "generate_key"
11
+ method_option :environment, type: :hash, default: {}, desc: "Pass a list of environment variables like so: env:var", banner: "development, staging"
12
+
13
+ def generate_key(*args)
14
+ generate_key_or_keys(*args)
15
+ end
16
+
17
+ desc "generate::keys", "Generate keys for each environment inside roro/keys.
18
+ If you have .env files like 'roro/containers/app/[staging_env].env' and
19
+ 'roro/[circle_ci_env].env' it will generate '/roro/keys/[staging_env].key'
20
+ and '/roro/keys/[circle_ci_env].key'."
21
+ map "generate::keys" => "generate_keys"
22
+
23
+ def generate_keys(*args)
24
+ generate_key(*args)
25
+ end
26
+
5
27
  no_commands do
6
28
 
7
29
  def generate_key_or_keys(*args)
@@ -23,7 +45,7 @@ module Roro
23
45
  def gather_environments
24
46
  environments = []
25
47
  ['.env', '.env.enc'].each do |extension|
26
- HandsomeFencer::Crypto.source_files('roro', extension).each do |env_file|
48
+ Roro::Crypto.source_files('roro', extension).each do |env_file|
27
49
  environments << env_file.split('/').last.split(extension).last
28
50
  end
29
51
  end
@@ -32,7 +54,7 @@ module Roro
32
54
 
33
55
  def confirm_files_decrypted?(environment)
34
56
  orphan_encrypted = []
35
- HandsomeFencer::Crypto.source_files('.', '.env.enc').each do |file|
57
+ Roro::Crypto.source_files('.', '.env.enc').each do |file|
36
58
  unless File.exist? file.split('.enc').first
37
59
  orphan_encrypted << file
38
60
  end
@@ -0,0 +1,17 @@
1
+ require 'roro/crypto'
2
+
3
+ module Roro
4
+
5
+ class CLI < Thor
6
+
7
+ desc "generate::obfuscated", "obfuscates any files matching the pattern ./roro/**/*.env"
8
+ map "generate::obfuscated" => "generate_obfuscated"
9
+
10
+ def generate_obfuscated(*args)
11
+ environments = args.first ? [args.first] : gather_environments
12
+ environments.each do |environment|
13
+ Roro::Crypto.obfuscate(environment, 'roro')
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,18 @@
1
+ module Roro
2
+ class CLI < Thor
3
+
4
+ desc "generate::story", "Generate a config file at .roro_config.yml to use later"
5
+ map "generate::story" => "generate_story"
6
+
7
+ def generate_story
8
+
9
+ @config ||= Roro::Configuration.new(options)
10
+ # configuration = {
11
+ # env_vars: @config.env.keys,
12
+ # intentions: @config.intentions,
13
+ # story: @config.structure['story']
14
+ # }
15
+ # create_file ".roro_configurator.yml", @config.env.to_yaml
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,14 @@
1
+ module Roro
2
+
3
+ class CLI < Thor
4
+
5
+ desc "greenfield::rails", "Greenfield a new, dockerized rails app with
6
+ either MySQL or PostgreSQL in a separate container."
7
+
8
+ map "greenfield::rails" => "greenfield_rails"
9
+
10
+ def greenfield_rails
11
+ greenfield( { story: :rails } )
12
+ end
13
+ end
14
+ end
@@ -1,84 +1,147 @@
1
- require 'roro/cli/rollon/stories'
2
-
3
1
  module Roro
4
-
5
2
  class CLI < Thor
6
3
 
7
- desc "rollon", "Generates files for and makes changes to your app
8
- so it can run using Docker containers."
9
- method_option :interactive, desc: "Set up your environment variables as
10
- you go."
11
-
12
- def rollon
13
- confirm_directory_not_empty
14
- confirm_dependencies
15
- remove_roro_artifacts
4
+ class << self
5
+ private
6
+ def shared_options!
7
+ method_option :omakase, desc: "Use the Roro setup with some configuring. 'Omakase' translates as 'I'll leave it up to you.'", aliases: ['-d', '--default']
8
+ method_option :fatsutofodo, desc: 'Use the Roro setup without having to think.', aliases: ['-f', '--fast']
9
+ method_option :okonomi, desc: "Use Roro how you like. 'Okonomi' has the opposite meaning of omakase.", aliases: ['-i', '--interactive']
10
+ end
11
+
12
+ alias_method :orig_desc, :desc
13
+
14
+ def desc(*args)
15
+ orig_desc(*args)
16
+ shared_options!
17
+ end
18
+ end
19
+ rollonto = ' into Roro.'
20
+ desc "rollon", "Roll an existing app#{rollonto}"
21
+ def rollon(args={})
22
+ @config ||= Roro::Configuration.new(args, options)
23
+ greenfield_actions
24
+ greenfield_commands
25
+ manifest_actions
26
+ manifest_intentions
27
+ congratulations
28
+ startup_commands
29
+ end
30
+
31
+ desc "greenfield", "Greenfield a new app and roll it#{rollonto}"
32
+ def greenfield(args={})
33
+ args[:greenfield] = :greenfield
16
34
 
17
- configure_for_rollon
18
-
19
- copy_roro_files
20
- generate_config
21
- startup_commands
35
+ rollon(args)
22
36
  end
23
37
 
24
- no_commands do
25
-
26
- def configure_for_rollon
38
+ desc "greenfield::rails", "Greenfield a new Rails app and roll it#{rollonto}"
39
+
40
+ map "greenfield::rails" => "greenfield_rails"
41
+
42
+ def greenfield_rails
43
+ greenfield( { story: :rails } )
44
+ end
45
+
46
+ desc "rollon::rails", "Roll an existing app#{rollonto}"
47
+ map "rollon::rails" => "rollon_rails"
48
+
49
+ def rollon_rails(args={})
50
+ rollon( { story: :rails } )
51
+ end
52
+
53
+ desc "rollon::rails::kubernetes", "Adds Kubernetes for production."
54
+ map "rollon::rails::kubernetes" => "rollon_rails_kubernetes"
55
+
56
+ def rollon_rails_kubernetes(args={})
57
+ story = {
58
+ rails: [
59
+ { database: :postgresql },
60
+ { kubernetes: :postgresql },
61
+ { ci_cd: :circleci}
62
+ ]
63
+ }
64
+ rollon( { story: story } )
65
+ end
66
+
67
+ desc "greenfield::rails::kubernetes", "Adds Kubernetes for production."
68
+ map "greenfield::rails::kubernetes" => "greenfield_rails_kubernetes"
69
+
70
+ def greenfield_rails_kubernetes(args={})
71
+ story = {
72
+ rails: [
73
+ { database: :postgresql },
74
+ { kubernetes: :postgresql },
75
+ { ci_cd: :circleci}
76
+ ]
77
+ }
78
+ rollon( { story: story } )
79
+ end
80
+
81
+ no_commands do
82
+
83
+ def configure_for_rollon(aroptions=nil)
27
84
  @config ||= Roro::Configuration.new(options)
28
85
  end
29
-
30
- def yaml_from_template(file)
31
- File.read(File.dirname(__FILE__) + "/templates/#{file}")
86
+
87
+ def manifest_actions
88
+ @config.structure[:actions].each {|a| eval a }
32
89
  end
33
90
 
34
- def copy_roro_files
35
- configure_database
36
- directory 'roro', './', @config.app
37
- template 'base/Dockerfile.tt', 'roro/containers/app/Dockerfile', @config.app
38
- take_thor_actions
39
- end
91
+ def manifest_intentions
92
+ @config.intentions.each {|k, v| eval(k.to_s) if v.eql?('y') }
93
+ end
40
94
 
41
- def take_thor_actions
42
- @config.thor_actions.each {|k, v| eval(k) if v.eql?('y') }
43
- end
44
-
45
- def startup_commands
46
- system 'docker-compose build'
47
- system 'docker-compose run web bundle'
48
- system 'docker-compose run web bin/rails webpacker:install'
49
- system 'docker-compose run web bin/rails yarn:install'
50
- system 'docker-compose run web bin/rails db:create'
51
- system 'docker-compose run web bin/rails db:migrate'
52
- system 'docker-compose up'
53
- end
95
+ def greenfield_actions
96
+ return unless @config.structure[:greenfield_actions]
97
+ @config.structure[:greenfield_actions].each {|a| eval a }
98
+ end
54
99
 
55
- def confirm_directory_empty
56
- confirm = confirm_dependency({
57
- system_query: "ls -A",
58
- warning: "this is not an empty directory. Roro will not greenfield a new Rails app unless either a) the current directory is empty or b) you run greenfield with the --force flag",
59
- suggestion: "$ roro greenfield --force",
60
- conditional: "Dir.glob('*').empty?" })
61
- confirm || true
100
+ def greenfield_commands
101
+ return unless @config.structure[:greenfield_actions]
102
+ @config.structure[:greenfield_commands].each {|a| eval a }
62
103
  end
63
104
 
64
-
65
- def confirm_dependency(options)
66
- msg = []
67
- msg << ""
68
- msg << delineator
69
- msg << "It looks like #{options[:warning]}. The following bash command returns false:"
70
- msg << "\t$ #{options[:system_query]}"
71
- msg << "Please try these instructions:"
72
- msg << ("\t" + options[:suggestion])
73
- msg << delineator
74
- conditional = options[:conditional] ? eval(options[:conditional]) : system(options[:system_query])
75
- if conditional == false
76
- raise(Roro::Error.new(msg.join("\n\n")))
105
+ def congratulations(story=nil)
106
+ ( @config.story[:rollon])
107
+ if @config.structure[:greenfield]
108
+ usecase = 'greenfielded a new '
77
109
  else
78
- true
110
+ usecase = 'rolled your existing '
111
+ end
112
+ array = ["You've successfully "]
113
+ array << usecase
114
+ congrats = array.join("")
115
+ puts congrats
116
+ end
117
+
118
+ def startup_commands
119
+ congratulations( @config.story[:rollon])
120
+ cmd = @config.structure[:startup]
121
+ commands = cmd[:commands]
122
+ question = []
123
+ question << "\n\n You can start your app up with some combination of these commands:\n"
124
+ commands.each { |c| question << "\t#{c}"}
125
+ question << "\nOr if you'd like Roro to try and do it for you:"
126
+ question = question.join("\n")
127
+ if ask(question, default: 'y', limited_to: ['y', 'n']).eql?("y")
128
+ commands.each {|a| system(a) }
129
+ puts "\n\n#{cmd[:success]}\n\n"
79
130
  end
80
131
  end
81
132
 
133
+ def yaml_from_template(file)
134
+ File.read(find_in_source_paths(file))
135
+ end
136
+
137
+ def generate_config_story
138
+ roro_story = {
139
+ story: @config.story,
140
+ env_vars: @config.env,
141
+ intentions: @config.intentions
142
+ }
143
+ create_file ".roro_story.yml", roro_story.to_yaml
144
+ end
82
145
  end
83
146
  end
84
147
  end