roro 0.3.5 → 0.3.12

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 (89) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +15 -2
  3. data/Guardfile +4 -10
  4. data/lib/roro.rb +0 -1
  5. data/lib/roro/cli.rb +75 -5
  6. data/lib/roro/cli/base/base.rb +2 -1
  7. data/lib/roro/cli/base/base_files.rb +1 -7
  8. data/lib/roro/cli/base/check_dependencies.rb +98 -0
  9. data/lib/roro/cli/base/insert_gems.rb +15 -7
  10. data/lib/roro/cli/base/insertions.rb +3 -1
  11. data/lib/roro/cli/cli.rb +99 -0
  12. data/lib/roro/cli/configuration.rb +69 -0
  13. data/lib/roro/cli/expose.rb +8 -7
  14. data/lib/roro/cli/generate/config.rb +13 -0
  15. data/lib/roro/cli/generate/config/rails.rb +17 -0
  16. data/lib/roro/cli/generate/generate.rb +1 -0
  17. data/lib/roro/cli/generate/generate_keys.rb +47 -0
  18. data/lib/roro/cli/greenfield.rb +20 -31
  19. data/lib/roro/cli/obfuscate.rb +10 -11
  20. data/lib/roro/cli/rollon.rb +67 -21
  21. data/lib/roro/cli/rollon/stories.rb +2 -3
  22. data/{.keep → lib/roro/cli/rollon/stories/database.rb} +0 -0
  23. data/lib/roro/cli/rollon/stories/rails.rb +1 -0
  24. data/lib/roro/cli/{templates/base/roro → rollon/stories/rails}/.keep +0 -0
  25. data/lib/roro/cli/rollon/stories/rails/database.rb +33 -0
  26. data/lib/roro/cli/rollon/stories/rails/database/with_mysql.rb +22 -0
  27. data/lib/roro/cli/rollon/stories/rails/database/with_postgresql.rb +21 -0
  28. data/lib/roro/cli/rollon/stories/ruby_gem.rb +77 -0
  29. data/lib/roro/cli/rollon/stories/ruby_gem/with_ci_cd.rb +81 -0
  30. data/lib/roro/cli/rollon/stories/stories.rb +3 -0
  31. data/lib/roro/cli/roro_configurator.yml +157 -0
  32. data/lib/roro/cli/ruby_gem.rb +60 -47
  33. data/lib/roro/cli/templates/base/.roro_config.yml +15 -0
  34. data/lib/roro/cli/templates/base/Dockerfile.tt +82 -0
  35. data/lib/roro/cli/templates/base/config/database.mysql.yml +19 -0
  36. data/lib/roro/cli/templates/base/config/{database.yml.pg.tt → database.pg.yml} +0 -0
  37. data/lib/roro/cli/templates/greenfield/Dockerfile.tt +29 -7
  38. data/lib/roro/cli/templates/{base/livereload → livereload}/hosts.example +0 -0
  39. data/lib/roro/cli/templates/{base/roro/containers → roro}/.keep +0 -0
  40. data/lib/roro/cli/templates/{greenfield → roro}/docker-compose.yml.tt +18 -13
  41. data/lib/roro/cli/templates/{base/roro/containers/app → roro/roro}/.keep +0 -0
  42. data/lib/roro/cli/templates/{base/roro/containers/frontend → roro/roro/containers}/.keep +0 -0
  43. data/lib/roro/cli/templates/{dockerize/.env → roro/roro/containers/app}/.keep +0 -0
  44. data/lib/roro/cli/templates/{dockerize/.env/development → roro/roro/containers/frontend}/.keep +0 -0
  45. data/lib/roro/cli/templates/{quickstart/entrypoint.sh → roro/roro/docker-entrypoint.sh.tt} +1 -1
  46. data/lib/roro/cli/templates/ruby_gem/.circleci/config.yml +17 -0
  47. data/lib/roro/cli/templates/ruby_gem/docker-compose.yml +6 -4
  48. data/lib/roro/cli/templates/ruby_gem/roro/ci.env.tt +1 -0
  49. data/lib/roro/cli/templates/{dockerize → ruby_gem/roro/containers}/.keep +0 -0
  50. data/lib/roro/cli/templates/ruby_gem/roro/containers/ruby_image/Dockerfile.tt +16 -0
  51. data/lib/roro/cli/templates/ruby_gem/{docker/env_files → roro/keys}/.keep +0 -0
  52. data/lib/roro/cli/templates/{ruby_gem/docker/keys → stories}/.keep +0 -0
  53. data/lib/roro/cli/templates/stories/with_mysql/_service.yml +10 -0
  54. data/lib/roro/cli/templates/stories/with_postgresql/.keep +0 -0
  55. data/lib/roro/cli/templates/stories/with_postgresql/_service.yml +7 -0
  56. data/lib/roro/version.rb +1 -1
  57. data/roro.gemspec +3 -4
  58. data/sandbox/.keep +0 -0
  59. data/vendor/cache/concurrent-ruby-1.1.7.gem +0 -0
  60. data/vendor/cache/gem-release-2.1.1.gem +0 -0
  61. metadata +69 -66
  62. data/lib/roro/cli/base/configuration.rb +0 -118
  63. data/lib/roro/cli/generate_keys.rb +0 -79
  64. data/lib/roro/cli/rollon/rollon_as_dockerize.rb +0 -42
  65. data/lib/roro/cli/rollon/rollon_as_quickstart.rb +0 -17
  66. data/lib/roro/cli/rollon/rollon_as_roro.rb +0 -30
  67. data/lib/roro/cli/templates/base/circleci/config.yml.tt +0 -70
  68. data/lib/roro/cli/templates/base/docker-compose.yml.tt +0 -53
  69. data/lib/roro/cli/templates/base/pg/config/database.yml.pg.tt +0 -20
  70. data/lib/roro/cli/templates/base/pg/database.yml.pg.tt +0 -20
  71. data/lib/roro/cli/templates/base/roro/containers/app/Dockerfile.tt +0 -32
  72. data/lib/roro/cli/templates/base/roro/containers/app/development.env.tt +0 -1
  73. data/lib/roro/cli/templates/base/roro/containers/app/docker-entrypoint.sh +0 -8
  74. data/lib/roro/cli/templates/base/roro/containers/app/test.env.tt +0 -1
  75. data/lib/roro/cli/templates/base/roro/containers/database/development.env.tt +0 -4
  76. data/lib/roro/cli/templates/base/roro/containers/database/test.env.tt +0 -4
  77. data/lib/roro/cli/templates/dockerize/.env/development/database +0 -3
  78. data/lib/roro/cli/templates/dockerize/.env/development/web +0 -1
  79. data/lib/roro/cli/templates/dockerize/Dockerfile.tt +0 -23
  80. data/lib/roro/cli/templates/dockerize/docker-compose.yml.tt +0 -60
  81. data/lib/roro/cli/templates/dockerize/docker-entrypoint.sh +0 -9
  82. data/lib/roro/cli/templates/quickstart/Dockerfile.tt +0 -20
  83. data/lib/roro/cli/templates/quickstart/database.yml +0 -85
  84. data/lib/roro/cli/templates/quickstart/docker-compose.yml +0 -17
  85. data/lib/roro/cli/templates/ruby_gem/.gitignore +0 -8
  86. data/lib/roro/cli/templates/ruby_gem/config.yml +0 -122
  87. data/lib/roro/cli/templates/ruby_gem/docker/containers/app/Dockerfile.tt +0 -10
  88. data/roro-0.3.4.gem +0 -0
  89. data/vendor/cache/concurrent-ruby-1.1.6.gem +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d1748207f4c1b87ab2301b252cd90eac18dc36107544b404b031e9ba9b0df62f
4
- data.tar.gz: eda27e549ca1789b75f5f0af646415b92c8c82f5e3b05dcf612a7d591326c33d
3
+ metadata.gz: c6bf9813b07f7c2c2f34a0e0e4578130062af0752865da885f4da75c4def51c2
4
+ data.tar.gz: 2ff26062242671ba49fdffd5b6e87d0477ffb906fb5af967b758440fb4dade1d
5
5
  SHA512:
6
- metadata.gz: ec101f6fba2f50fe296792633d606e3ee2a0680e798c7fef0508706ef37d58dd979f04ea6be7e0fffe044596315aca2933d9ca7416d5694b4f083b18de923182
7
- data.tar.gz: 3b89bd8d48d381ef5461deb8b99712cea71a8c2708cc32fdd5c195f931001736598ca48ddbebc0269f09e6c7cbd9e5294e7c7fcb943c1627b8c48e5bdcdae684
6
+ metadata.gz: d272d16756b148c197ec2b0dcaf25463f0669e88ad4c79ff2f9fc19a2508be72d7ebd13b33ef595df1d146bd22346a8f9413f99ce4d61139167ee0923e103dc7
7
+ data.tar.gz: 1ce050d03045da0c39d93f8f6ecbf9e4a92782ee7a7594aa976dbdea7350b53964612cd6b970f852749d016b071ccc8c56afca4ce71ed8ab632360150f086fd8
data/.gitignore CHANGED
@@ -5,7 +5,20 @@
5
5
  /doc/
6
6
  /pkg/
7
7
  /spec/reports/
8
- tmp/*
9
8
  Gemfile.lock
10
9
  .byebug_history
11
- /sandbox/**/*
10
+
11
+ roro/**/*.env
12
+ roro/**/*.key
13
+
14
+ *.key
15
+ *.env
16
+
17
+ tmp/*
18
+ tmp/*
19
+ !tmp/.gitkeep
20
+ sandbox/*
21
+ !sandbox/.keep
22
+ !sandbox/greenfield
23
+ sandbox/greenfield/*
24
+ !sandbox/greenfield/.keep
data/Guardfile CHANGED
@@ -2,22 +2,16 @@
2
2
  # More info at https://github.com/guard/guard#readme
3
3
 
4
4
  options = {
5
- # cli: '',
6
- # all_after_run: true,
7
- # all_after_pass: true
5
+ cli: '-f',
6
+ all_on_start: true,
7
+ all_after_pass: true
8
8
  }
9
9
 
10
10
  guard :minitest, options do
11
11
 
12
12
  watch(%r{^test/(.*)\/?test_(.*)\.rb$})
13
13
  watch(%r{^test/(.*)\/?(.*)_test\.rb$})
14
- watch(%r{^lib/roro/cli/(.+)\.rb$}) { |m| "test/generators/#{m[1]}_test.rb" }
15
- watch(%r{^lib/roro/cli/rollon/*.rb$}) { 'test/generators' }
16
- watch(%r{^lib/roro/cli/(.+).rb$}) { 'test' }
17
-
18
-
14
+ watch(%r{^lib/roro/(.+)\.rb$}) { |m| "test/#{m[1]}_test.rb" }
19
15
  watch(%r{^test/thor_helper\.rb$}) { 'test' }
20
-
21
16
  watch(%r{^test/fixtures/files/(.*/)?([^/]+)\.yml$}) { 'test' }
22
-
23
17
  end
@@ -4,5 +4,4 @@ require "roro/cli"
4
4
 
5
5
  module Roro
6
6
  class Error < StandardError; end
7
- # Your code goes here...
8
7
  end
@@ -1,19 +1,89 @@
1
- require 'thor'
2
1
  require 'roro/cli/base/base'
3
- require 'roro/cli/rollon'
4
2
  require 'roro/cli/greenfield'
5
- require 'roro/cli/generate_keys'
6
3
  require 'roro/cli/obfuscate'
7
4
  require 'roro/cli/expose'
8
- require 'roro/cli/ruby_gem'
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
9
 
10
+ require 'roro/cli/rollon'
10
11
  module Roro
12
+
11
13
  class CLI < Thor
12
14
 
13
15
  include Thor::Actions
14
-
16
+
15
17
  def self.source_root
16
18
  File.dirname(__FILE__) + '/cli/templates'
17
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)
44
+ 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
+
49
+ def generate_exposed(*args)
50
+ expose(*args)
51
+ end
52
+
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)
87
+ end
18
88
  end
19
89
  end
@@ -1,4 +1,5 @@
1
- require_relative 'configuration.rb'
1
+
2
+ require_relative 'check_dependencies.rb'
2
3
  require_relative 'continuous_integration.rb'
3
4
  require_relative 'utilities.rb'
4
5
  require_relative 'insertions.rb'
@@ -16,14 +16,8 @@ module Roro
16
16
  template "base/docker-compose.yml", 'docker-compose.yml', @env_hash
17
17
  end
18
18
 
19
- def copy_roro
20
- directory 'base/roro/containers/app', "roro/containers/#{@env_hash[:app_name]}", @env_hash
21
- directory 'base/roro/containers/database', "roro/containers/#{@env_hash[:database_container]}", @env_hash
22
- directory 'base/roro/containers/frontend', "roro/containers/#{@env_hash[:frontend_container]}", @env_hash
23
- end
24
-
25
19
  def copy_database_yml_pg
26
- copy_file "base/config/database.yml.pg", 'config/database.yml', force: @env_hash[:use_force]
20
+ copy_file "base/config/database.pg.yml", 'config/database.yml', force: @env_hash[:use_force]
27
21
  end
28
22
  end
29
23
  end
@@ -0,0 +1,98 @@
1
+ module Roro
2
+
3
+ class CLI < Thor
4
+
5
+ no_commands do
6
+
7
+ def confirm_directory_not_empty
8
+ confirm_dependency({
9
+ system_query: "ls -A",
10
+ warning: "This is an empty directory. You can generate a new and fully
11
+ dockerized Rails app using the 'greenfield' command here here but if
12
+ you want to containerize an existing app -- which is what the 'rollon'
13
+ command is for -- you'll need to navigate to a directory with an app we
14
+ can roll onto.",
15
+ suggestion: "$ roro greenfield",
16
+ conditional: "!Dir.glob('*').empty?" })
17
+ end
18
+
19
+ def confirm_directory_empty
20
+ confirm = confirm_dependency({
21
+ system_query: "ls -A",
22
+ 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",
23
+ suggestion: "$ roro greenfield --force",
24
+ conditional: "Dir.glob('*').empty?" })
25
+ confirm || true
26
+ end
27
+
28
+ def remove_roro_artifacts
29
+ appname = Dir.pwd.split('/').last
30
+ check_for_clashes = "docker ps --filter name=#{appname}* -aq"
31
+ no_artifact_containers = IO.popen(check_for_clashes).count.eql?(0)
32
+ no_artifact_volumes = IO.popen("docker volume ls --filter name=greenfield*").count > (1)
33
+ unless (no_artifact_containers && no_artifact_volumes)
34
+ remove_clashes = ["docker ps --filter name=#{appname}* -aq | xargs docker stop | xargs docker rm"]
35
+ volumes = %w(db_data app)
36
+ volumes.each {|v| remove_clashes << "docker volume rm #{appname}_#{v}"}
37
+ question = [
38
+ "\n\nWe found some container and volume artifacts which may clash",
39
+ "with RoRo moving forward. You can verify their existence in a ",
40
+ "separate terminal with:",
41
+ "\n\t$ #{check_for_clashes}'\n",
42
+ "You can remove these artifacts with something like:\n"
43
+ ]
44
+ remove_clashes.each { |c| question << "\t$ #{c}"}
45
+ question << "\nWould you like RoRo to attempt to remove them for you?"
46
+ question = question.join("\n")
47
+
48
+ prompt = [question]
49
+ choices = {'y' => 'Yes', 'n' => 'No'}
50
+ choices.each { |k,v| prompt << "(#{k}) #{v.to_s}" }
51
+ answer = ask((prompt.join("\n\n") + "\n\n"),
52
+ default: 'y', limited_to: choices.keys)
53
+ remove_clashes.each {|c| system c }
54
+ end
55
+ end
56
+
57
+ def confirm_dependency(options)
58
+ msg = []
59
+ msg << ""
60
+ msg << delineator
61
+ msg << "It looks like #{options[:warning]}. The following bash command returns false:"
62
+ msg << "\t$ #{options[:system_query]}"
63
+ msg << "Please try these instructions:"
64
+ msg << ("\t" + options[:suggestion])
65
+ msg << delineator
66
+ conditional = options[:conditional] ? eval(options[:conditional]) : system(options[:system_query])
67
+ if conditional == false
68
+ raise(Roro::Error.new(msg.join("\n\n")))
69
+ else
70
+ true
71
+ end
72
+ end
73
+
74
+ def confirm_dependencies
75
+ dependencies = [
76
+ {
77
+ system_query: "which docker",
78
+ warning: "Docker isn't installed",
79
+ suggestion: "https://docs.docker.com/install/"
80
+ }, {
81
+ system_query: "which docker-compose",
82
+ warning: "Docker Compose isn't installed",
83
+ suggestion: "https://docs.docker.com/compose/install/"
84
+
85
+ }, {
86
+ system_query: "docker info",
87
+ warning: "the Docker daemon isn't running",
88
+ suggestion: "https://docs.docker.com/config/daemon/#start-the-daemon-manually"
89
+ }
90
+ ]
91
+
92
+ dependencies.each do |dependency|
93
+ confirm_dependency(dependency)
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
@@ -6,17 +6,25 @@ module Roro
6
6
  no_commands do
7
7
 
8
8
  def insert_roro_gem_into_gemfile
9
- insert_into_file 'Gemfile', "gem 'roro'", before: "group :development, :test do"
9
+ insert_into_file 'Gemfile', "gem 'roro'\n\n", before: "group :development, :test do"
10
10
  end
11
-
12
- def insert_pg_gem_into_gemfile
13
- comment_lines 'Gemfile', /sqlite/
14
- comment_lines 'Gemfile', /mysql/
15
- insert_into_file 'Gemfile', "gem 'pg'\n", before: "group :development, :test do"
11
+
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
23
+ insert_into_file 'Gemfile', "gem '#{gem}'\n\n", before: "group :development, :test"
16
24
  end
17
25
 
18
26
  def insert_hfci_gem_into_gemfile
19
- insert_into_file 'Gemfile', "gem 'handsome_fencer-test'", after: "group :development, :test do"
27
+ insert_into_file 'Gemfile', "gem 'handsome_fencer-test'\n\n", after: "group :development, :test do"
20
28
  end
21
29
  end
22
30
  end
@@ -6,7 +6,9 @@ module Roro
6
6
  no_commands do
7
7
 
8
8
  def config_std_out_true
9
- prepend_to_file('config/boot.rb', "$stdout.sync = true\n\n", force: @env_hash[:use_force])
9
+ file = 'config/boot.rb'
10
+ line = "$stdout.sync = true\n\n"
11
+ prepend_to_file(file, line, force: true)
10
12
  end
11
13
 
12
14
  def gitignore_sensitive_files
@@ -0,0 +1,99 @@
1
+ require 'thor'
2
+ require 'roro/cli/base/base'
3
+ require 'roro/cli/rollon/stories'
4
+ require 'roro/cli/rollon'
5
+ require 'roro/cli/greenfield'
6
+ require 'roro/cli/obfuscate'
7
+ require 'roro/cli/expose'
8
+ require 'roro/cli/ruby_gem'
9
+ require 'roro/cli/generate/config/rails'
10
+ require 'roro/cli/generate/config'
11
+ require 'roro/cli/generate/generate_keys'
12
+ require 'roro/cli/configuration'
13
+
14
+ module Roro
15
+
16
+ class CLI < Thor
17
+
18
+ include Thor::Actions
19
+
20
+ def self.source_root
21
+ File.dirname(__FILE__) + '/cli/templates'
22
+ end
23
+
24
+ desc "rollon::ruby_gem", "Generate files for containerized gem testing, CircleCI, and releasing to RubyGems."
25
+ method_option :rubies, type: :array, banner: "2.5.3 2.4.2"
26
+ map "rollon::ruby_gem" => "rollon_ruby_gem"
27
+
28
+ def rollon_ruby_gem(*args)
29
+ ruby_gem(*args)
30
+ end
31
+
32
+ desc "rollon::rails", "Generates files for and makes changes to your app
33
+ so it can run using Docker containers."
34
+ method_option :interactive, desc: "Set up your environment variables as
35
+ you go."
36
+ map "rollon::rails" => "rollon_rails"
37
+
38
+ def rollon_rails
39
+ rollon
40
+ end
41
+
42
+
43
+ desc "greenfield::rails", "Greenfield a new, dockerized rails app with
44
+ either MySQL or PostgreSQL in a separate container."
45
+
46
+ method_option :env_vars, type: :hash, default: {}, desc: "Pass a list of environment variables like so: env:var", banner: "key1:value1 key2:value2"
47
+ method_option :interactive, desc: "Set up your environment variables as you go."
48
+ method_option :force, desc: "force over-write of existing files"
49
+
50
+ map "greenfield::rails" => "greenfield_rails"
51
+
52
+ def greenfield_rails(*args)
53
+ greenfield(*args)
54
+ end
55
+ desc "generate::exposed", "Generate private .env files from
56
+ encrypted .env.enc files inside the roro directory."
57
+ map "generate::exposed" => "generate_exposed"
58
+
59
+ def generate_exposed(*args)
60
+ expose(*args)
61
+ end
62
+
63
+ desc "generate::key", "Generate a key inside roro/keys. Takes the name of
64
+ an environment as an argument to private .env files from
65
+ encrypted .env.enc files inside the roro directory.
66
+ Expose encrypted files"
67
+
68
+ map "generate::key" => "generate_key"
69
+ method_option :environment, type: :hash, default: {}, desc: "Pass a list of environment variables like so: env:var", banner: "development, staging"
70
+
71
+ def generate_key(*args)
72
+ generate_key_or_keys(*args)
73
+ end
74
+
75
+ desc "generate::keys", "Generate keys for each environment inside roro/keys.
76
+ If you have .env files like 'roro/containers/app/[staging_env].env' and
77
+ 'roro/[circle_ci_env].env' it will generate '/roro/keys/[staging_env].key'
78
+ and '/roro/keys/[circle_ci_env].key'."
79
+ map "generate::keys" => "generate_keys"
80
+
81
+ def generate_keys(*args)
82
+ generate_key(*args)
83
+ end
84
+
85
+ desc "generate::config", "Generate a config file at .roro_config.yml"
86
+ map "generate::config" => "generate_config"
87
+
88
+ def generate_config
89
+ create_file ".roro_config.yml", @config.app.to_yaml
90
+ end
91
+
92
+ desc "generate::obfuscated", "obfuscates any files matching the pattern ./roro/**/*.env"
93
+ map "generate::obfuscated" => "generate_obfuscated"
94
+
95
+ def generate_obfuscated(*args)
96
+ obfuscate(*args)
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,69 @@
1
+ require 'yaml'
2
+ module Roro
3
+ class Configuration < Thor
4
+
5
+ attr_reader :master, :app, :choices, :thor_actions
6
+
7
+ def initialize(options={})
8
+ @options = options || {}
9
+ @master = YAML.load_file(File.dirname(__FILE__) + '/roro_configurator.yml')
10
+ @master['services']['server_app']['vendors']['rails']['version'] = `ruby -v`.scan(/\d.\d/).first
11
+ @choices = @master['services']['server_app']['vendors']['rails']['choices']
12
+ @app = {}
13
+ @thor_actions = {}
14
+ configure
15
+ end
16
+
17
+ no_commands do
18
+
19
+ def configure
20
+ set_from_defaults
21
+ case
22
+ when @options['interactive'] && File.exist?('.roro_config.yml')
23
+ set_from_roro_config
24
+ set_from_interactive
25
+ when File.exist?('.roro_config.yml')
26
+ set_from_roro_config
27
+ when @options['interactive']
28
+ set_from_interactive
29
+ end
30
+ end
31
+
32
+ def set_from_defaults
33
+ svcs = @master['services']
34
+ rails = svcs['server_app']['vendors']['rails']
35
+ @app = {
36
+ 'main_app_name' => Dir.pwd.split('/').last,
37
+ 'database_host' => rails['env_vars']['DATABASE_HOST'],
38
+ 'ruby_version' => rails['version'],
39
+ 'frontend_service' => svcs['frontend']['name'],
40
+ 'webserver_service' => svcs['webserver']['default'],
41
+ 'database_service' => svcs['database']['name'],
42
+ 'database_vendor' => svcs['database']['vendor'],
43
+ }
44
+ @choices.each { |key, value| @thor_actions[key] = value["default"] }
45
+ end
46
+
47
+ def set_from_roro_config
48
+ yaml = YAML.load_file(Dir.pwd + '/.roro_config.yml')
49
+ yaml.each { |key, value| @app[key] = value }
50
+ if yaml['thor_actions']
51
+ yaml['thor_actions'].each do |key, value|
52
+ @thor_actions[key] = value
53
+ end
54
+ end
55
+ end
56
+
57
+ def set_from_interactive
58
+ @choices.each do |key, v|
59
+ prompt = ["\n\n" + v['question']]
60
+ v['choices'].each { |k,v| prompt << "(#{k}) #{v.to_s}" }
61
+ answer = ask((prompt.join("\n\n") + "\n\n"),
62
+ default: v['default'],
63
+ limited_to: v['choices'].keys)
64
+ @thor_actions[key] = answer
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end