roro 0.3.13 → 0.3.21

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 (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
@@ -0,0 +1,4 @@
1
+
2
+ require_relative 'insertions.rb'
3
+ require_relative 'insert_gems.rb'
4
+
@@ -10,16 +10,8 @@ module Roro
10
10
  end
11
11
 
12
12
  def insert_db_gem(gem)
13
- gem_lines = [
14
- /gem\s['"]sqlite3['"]/,
15
- /gem\s['"]mysql2['"]/,
16
- /gem\s['"]pg['"]/,
17
-
18
- ]
19
- gem_lines.each do |line|
20
- comment_lines 'Gemfile', line
21
- gsub_file 'Gemfile', line, 'gem copied over by roro'
22
- end
13
+ gems = %w(sqlite pg mysql2)
14
+ gems.each { |g| gsub_file('Gemfile', /.*#{g}.*/, '')}
23
15
  insert_into_file 'Gemfile', "gem '#{gem}'\n\n", before: "group :development, :test"
24
16
  end
25
17
 
@@ -11,8 +11,16 @@ module Roro
11
11
  prepend_to_file(file, line, force: true)
12
12
  end
13
13
 
14
+ def copy_dockerignore
15
+ copy_file 'base/.dockerignore', '.dockerignore'
16
+ end
17
+
14
18
  def gitignore_sensitive_files
15
19
  append_to_file ".gitignore", "\nroro/**/*.env\nroro/**/*.key"
20
+ append_to_file ".gitignore", "\nroro/**/*.env\nroro/**/*.key"
21
+ append_to_file ".gitignore", "\n*kubeconfig.yaml"
22
+ append_to_file ".gitignore", "\n*kubeconfig.yml"
23
+ append_to_file ".gitignore", "\n*.roro_configurator.yml"
16
24
  end
17
25
  end
18
26
  end
@@ -0,0 +1,26 @@
1
+ module Roro
2
+
3
+ class CLI < Thor
4
+
5
+ no_commands do
6
+
7
+ def configure_database
8
+ database = @config.intentions[:configure_database]
9
+ case database
10
+ when 'p'
11
+ @config.env[:database_vendor] = 'postgresql'
12
+ configure_for_pg
13
+ when 'm'
14
+ @config.env[:database_vendor] = 'mysql'
15
+ configure_for_mysql
16
+ end
17
+ %w(development production test staging ci).each do |environment|
18
+ src = 'rails/dotenv/web.env.tt'
19
+ dest = "roro/containers/app/#{environment}.env"
20
+ template src, dest, @config.env
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+
@@ -6,13 +6,13 @@ module Roro
6
6
 
7
7
  def configure_for_mysql
8
8
  insert_db_gem('mysql2')
9
- copy_file 'base/config/database.mysql.yml', 'config/database.yml', force: true
10
- config = @config.app.clone
9
+ copy_file 'rails/config/database.mysql.yml', 'config/database.yml', force: true
10
+ config = @config.env.clone
11
11
 
12
12
  %w(development production test staging ci).each do |environment|
13
- config['rails_env'] = environment
13
+ config[:rails_env] = environment
14
14
 
15
- source = 'base/.env/database.mysql.env.tt'
15
+ source = 'rails/dotenv/database.mysql.env.tt'
16
16
  target = "roro/containers/database/#{environment}.env"
17
17
  template( source, target, config )
18
18
  end
@@ -5,14 +5,13 @@ module Roro
5
5
  no_commands do
6
6
 
7
7
  def configure_for_pg
8
- insert_db_gem('pg')
9
- copy_file 'base/config/database.pg.yml', 'config/database.yml', force: true
10
- config = @config.app.clone
8
+ copy_file 'rails/config/database.pg.yml', 'config/database.yml', force: true
9
+ config = @config.env.clone
11
10
  %w(development production test staging ci).each do |environment|
12
- config['rails_env'] = environment
11
+ config[:rails_env] = environment
13
12
 
14
- source = 'base/.env/database.pg.env.tt'
15
- target = "roro/containers/database/#{environment}.env"
13
+ source = 'rails/dotenv/database.pg.env.tt'
14
+ target = "roro/containers/database/#{environment}.env"
16
15
  template( source, target, config )
17
16
  end
18
17
  end
@@ -0,0 +1 @@
1
+ require 'roro/cli/rollon/ruby_gem/with_ci_cd.rb'
@@ -6,26 +6,26 @@ module Roro
6
6
 
7
7
  def rollon_ruby_gem_with_ci_cd(*args)
8
8
  ruby_gem_with_ci_cd(*args)
9
+ configure_for_rollon
9
10
  end
10
11
 
11
12
  no_commands do
12
13
  def ruby_gem_with_ci_cd(*args)
13
- configure_for_rollon
14
14
  answer = ask("\nYou can add your rubygems api key in\n\t
15
15
  './roro/containers/ruby_gem/ci.env' \n\nlater, or we'll try to add it here:",
16
16
  default: '')
17
17
  rubygems_api_key = (answer.eql?("") ? 'some-key' : answer)
18
- @config.app['rubygems_api_key'] = rubygems_api_key
19
- @config.app['rubies'] = []
18
+ @config.env[:rubygems_api_key] = rubygems_api_key
19
+ @config.env[:rubies] = []
20
20
  3.times do |index|
21
- newruby = @config.app['ruby_version'].gsub('.', '').to_i - index
22
- @config.app['rubies'] << newruby.to_s.split('').join('.')
21
+ newruby = @config.env[:ruby_version].gsub('.', '').to_i - index
22
+ @config.env[:rubies] << newruby.to_s.split('').join('.')
23
23
  end
24
- directory 'ruby_gem/roro', './roro', @config.app
25
- directory 'ruby_gem/.circleci', './.circleci', @config.app
24
+ directory 'ruby_gem/roro', './roro', @config.env
25
+ directory 'ruby_gem/.circleci', './.circleci', @config.env
26
26
  copy_file 'ruby_gem/docker-compose.yml', './docker-compose.yml'
27
27
 
28
- @config.app['rubies'].each do |ruby|
28
+ @config.env[:rubies].each do |ruby|
29
29
  file = '.circleci/config.yml'
30
30
  spacer = "\n - run: "
31
31
  rv = "RUBY_VERSION=#{ruby} docker-compose "
@@ -1,2 +1,2 @@
1
- require 'roro/cli/rollon/stories/ruby_gem'
2
- require 'roro/cli/rollon/stories/rails'
1
+ require 'roro/cli/rollon/ruby_gem'
2
+ require 'roro/cli/rollon/rails'
@@ -0,0 +1,15 @@
1
+ require 'roro/configurator/eligibility'
2
+ require 'roro/configurator/okonomi'
3
+ require 'roro/configurator/omakase'
4
+
5
+ module Roro
6
+ module Configurator
7
+ include Eligibility
8
+ include Okonomi
9
+ include Omakase
10
+ end
11
+
12
+ class Configuration < Thor
13
+ include Roro::Configurator
14
+ end
15
+ end
@@ -0,0 +1,137 @@
1
+ require 'open3'
2
+
3
+ module Roro
4
+ module Configurator
5
+ module Eligibility
6
+
7
+ def screen_target_directory
8
+ @structure[:greenfield] ? confirm_directory_empty : confirm_directory_app
9
+ handle_roro_artifacts
10
+ end
11
+
12
+ def confirm_directory_app
13
+ confirm_dependency({
14
+ system_query: "ls -A",
15
+ warning: "This is an empty directory. You can generate a new and fully
16
+ dockerized Rails app using the 'greenfield' command here here but if
17
+ you want to containerize an existing app -- which is what the 'rollon'
18
+ command is for -- you'll need to navigate to a directory with an app we
19
+ can roll onto.",
20
+ suggestion: "$ roro greenfield",
21
+ conditional: "!Dir.glob('*').empty?"})
22
+ end
23
+
24
+ def confirm_directory_empty
25
+ confirm = confirm_dependency({
26
+ system_query: "ls -A",
27
+ 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",
28
+ suggestion: "$ roro greenfield --force",
29
+ conditional: "Dir.glob('*').empty?" # || (Dir.glob('*').size.eql?(1) && Dir.glob('roro_configurator.yml'))"
30
+ })
31
+ confirm || true
32
+ end
33
+
34
+ def artifacts?
35
+ @appname = @env[:main_app_name]
36
+ @artifacts = {}
37
+ hash = {
38
+ containers: {
39
+ list: "docker ps --filter name=#{@appname}\ -a",
40
+ remove: " -q | xargs docker stop | xargs docker rm -f"
41
+ },
42
+ volumes: {
43
+ list: "docker volume ls --filter name=#{@appname}*",
44
+ remove: " -q | xargs docker volume rm -f"
45
+ },
46
+ networks: {
47
+ list: "docker network ls --filter name=#{@appname}",
48
+ remove: " -q | xargs docker network rm"
49
+ },
50
+ images: {
51
+ list: "docker image ls #{@appname}*",
52
+ remove: " -q | xargs docker rmi -f"
53
+ }
54
+ }
55
+ hash.each do |k, v|
56
+ check = IO.popen(v[:list] + ' -q').count > 0
57
+ @artifacts[k] = v if check
58
+ end
59
+ true if @artifacts.empty?
60
+ end
61
+
62
+ def handle_roro_artifacts
63
+ return if artifacts?
64
+ question = [
65
+ "\n\nThis machine has some docker artifacts which may clash with ",
66
+ "RoRo moving forward. You can verify their existence with:\n"
67
+ ]
68
+ @artifacts.each { |k,v| question << "\t$ #{v[:list]}" }
69
+ question << "\nYou can remove these artifacts with something like:\n"
70
+ @artifacts.each { |k,v| question << "\t$ #{v[:list]} #{v[:remove]}" }
71
+ question << "\nWould you like RoRo to attempt to remove them for you?"
72
+ choices = {'y' => 'Yes', 'n' => 'No'}
73
+
74
+ choices.each { |k,v| question << "(#{k}) #{v.to_s}" }
75
+
76
+ prompt = question.join
77
+ answer = ask(prompt, default: 'y', limited_to: choices.keys)
78
+
79
+ if answer.eql?('y')
80
+
81
+ @artifacts.each do |k,v|
82
+ puts "Attempting to remove #{k}"
83
+ system( v[:list] + v[:remove] )
84
+ end
85
+ end
86
+ end
87
+
88
+ def confirm_dependency(options)
89
+ msg = []
90
+ msg << ""
91
+ msg << delineator
92
+ msg << "It looks like #{options[:warning]}. The following bash command returns false:"
93
+ msg << "\t$ #{options[:system_query]}"
94
+ msg << "Try this:"
95
+ msg << ("\t" + options[:suggestion])
96
+ msg << delineator
97
+ conditional = options[:conditional] ? eval(options[:conditional]) : system(options[:system_query])
98
+ query = options[:system_query]
99
+ if conditional == false
100
+
101
+ raise(Roro::Error.new(msg.join("\n\n")))
102
+ else
103
+ true
104
+ end
105
+ end
106
+
107
+ def confirm_dependencies
108
+ dependencies.each do |dependency|
109
+ confirm_dependency(dependency)
110
+ end
111
+ end
112
+
113
+ private
114
+
115
+ def delineator
116
+ ("-" * 80)
117
+ end
118
+
119
+ def dependencies
120
+ [
121
+ {
122
+ system_query: "which docker",
123
+ warning: "Docker isn't installed",
124
+ suggestion: "https://docs.docker.com/install/"
125
+ }, {
126
+ system_query: "which docker-compose",
127
+ warning: "Docker Compose isn't installed",
128
+ suggestion: "https://docs.docker.com/compose/install/"
129
+ }, {
130
+ system_query: "docker info",
131
+ warning: "the Docker daemon isn't running",
132
+ suggestion: "https://docs.docker.com/config/daemon/#start-the-daemon-manually"
133
+ } ]
134
+ end
135
+ end
136
+ end
137
+ end
@@ -0,0 +1,28 @@
1
+ require 'yaml'
2
+ require 'json'
3
+
4
+ module Roro
5
+ module Configurator
6
+ module Okonomi
7
+
8
+ def take_order
9
+ ask_questions
10
+ end
11
+
12
+ def ask_questions
13
+ choices = @structure[:choices]
14
+ choices.each do |key, value|
15
+ @structure[:intentions][key] = ask_question(value)
16
+ end
17
+ end
18
+
19
+ def ask_question(question)
20
+ prompt = question[:question]
21
+ default = question[:default]
22
+ choices = question[:choices].keys
23
+ answer = ask(prompt, default: default, limited_to: choices)
24
+ answer
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,170 @@
1
+ module Roro
2
+ module Configurator
3
+ module Omakase
4
+ attr_reader :structure, :intentions, :env, :options, :story
5
+
6
+ def initialize(args={}, options={})
7
+
8
+ @options = sanitize(args)
9
+ @structure = {
10
+ intentions: {},
11
+ choices: {},
12
+ env_vars: {}
13
+ }
14
+ @story = @options[:story] ? { rollon: @options[:story] } : default_story
15
+ build_story
16
+ @intentions = @structure[:intentions]
17
+ @env = @structure[:env_vars]
18
+ @env[:main_app_name] = Dir.pwd.split('/').last
19
+ @env[:ruby_version] = RUBY_VERSION
20
+ @env[:force] = true
21
+ @env[:verbose] = false
22
+ @env[:roro_version] = VERSION
23
+ screen_target_directory
24
+ end
25
+
26
+ def build_story
27
+ layer_greenfield
28
+ layer_rollon
29
+ layer_story
30
+ layer_okonomi
31
+ end
32
+
33
+ def layer_okonomi
34
+ return unless @options.keys.include?(:okonomi)
35
+ @structure[:okonomi] = true
36
+ take_order
37
+ end
38
+
39
+ def layer_greenfield
40
+ return unless @options.keys.include?(:greenfield)
41
+ @structure[:greenfield] = true
42
+ build_layers( { greenfield: :rails } )
43
+ end
44
+
45
+ def layer_rollon
46
+ build_layers(@story)
47
+ end
48
+
49
+ def layer_story
50
+ file = '.roro_story'
51
+ return unless File.exist?("#{file}.yml")
52
+ overlay(get_layer(file))
53
+ end
54
+
55
+ def build_layers(story, location=nil)
56
+ story = story.is_a?(Hash) ? story : { story => {}}
57
+ story.each do |key, value|
58
+ location = location ? "#{location}/#{key}" : key
59
+ case value
60
+ when Array
61
+ value.each {|value| build_layers(value, location) }
62
+ when true
63
+ when
64
+ build_layers(value, location)
65
+ end
66
+ end
67
+ overlay(get_layer("#{Roro::CLI.story_root}/#{location}"))
68
+ end
69
+
70
+ def overlay(layer)
71
+ layer.each do |key, value|
72
+ @structure[key] ||= value
73
+ end
74
+ overlay_choices(layer) if layer[:choices]
75
+ overlay_env_vars(layer) if layer[:env_vars]
76
+ overlay_actions(layer) if layer[:actions]
77
+ end
78
+
79
+ def overlay_actions(layer)
80
+ @structure[:actions].concat(layer[:actions])
81
+ end
82
+
83
+ def overlay_env_vars(layer)
84
+ layer[:env_vars].each do |key, value|
85
+ @structure[:env_vars][key] = value
86
+ end
87
+ end
88
+
89
+ def overlay_choices(layer)
90
+ @structure[:intentions] ||= {}
91
+ layer[:choices].each do |key, value|
92
+ @structure[:choices][key] = value
93
+ @structure[:intentions][key] = value[:default]
94
+ end
95
+ end
96
+
97
+ def overlay_intentions(layer)
98
+ layer[:intentions].each do |key, value|
99
+ @structure[:intentions][key] = value
100
+ end
101
+ end
102
+
103
+ def sanitize(options)
104
+ options ||= {}
105
+ options.transform_keys!{|k| k.to_sym}
106
+ options.each do |key, value|
107
+ case value
108
+ when Array
109
+ value.each { |vs| sanitize(vs) }
110
+ when Hash
111
+ sanitize(value)
112
+ when true
113
+ options[key] = true
114
+ when String || Symbol
115
+ options[key] = value.to_sym
116
+ end
117
+ end
118
+ end
119
+
120
+ def get_layer(filedir)
121
+ filepath = filedir + '.yml'
122
+ if !File.exist?(filepath)
123
+ key = filedir.split('/').last
124
+ error_msg = "Cannot find that story #{key} at #{filepath}. Has it been written?"
125
+ raise (Roro::Error.new(error_msg))
126
+ end
127
+ json = JSON.parse(YAML.load_file(filepath).to_json, symbolize_names: true)
128
+ json ? json : ( raise (Roro::Error.new(error_msg)))
129
+ end
130
+
131
+ def story_map(story='stories')
132
+ array ||= []
133
+ loc = Roro::CLI.story_root + "/#{story}"
134
+ validate_story(loc)
135
+ stories = Dir.glob(loc + "/*.yml")
136
+ stories.each do |ss|
137
+ name = ss.split('/').last.split('.yml').first
138
+ array << { name.to_sym => story_map([story, name].join('/'))}
139
+ end
140
+ array
141
+ end
142
+
143
+ def default_story(story='rollon', loc=nil)
144
+ hash = {}
145
+ loc = [(loc ||= Roro::CLI.story_root), story].join('/')
146
+ substory = get_layer(loc)[:stories]
147
+ if substory.is_a?(Array)
148
+ array = []
149
+ substory.each do |s|
150
+ ss = get_layer([loc, s].join('/'))[:stories]
151
+ array << (ss.is_a?(String) ? { s.to_sym => ss.to_sym } : default_story( s, loc ) )
152
+ end
153
+ hash[story.to_sym] = array
154
+ else
155
+ hash[story.to_sym] = default_story(substory, loc)
156
+ end
157
+ hash
158
+ end
159
+
160
+ def validate_story(story)
161
+ substories = get_layer(story)[:stories]
162
+ if substories.is_a? String
163
+ File.exist?(story + substories + '.yml')
164
+ elsif substories.is_a? Array
165
+ substories.each { |substory| validate_story(story + '/' + substory) }
166
+ end
167
+ end
168
+ end
169
+ end
170
+ end