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.
- checksums.yaml +5 -5
- data/.circleci/config.yml +55 -11
- data/.gitignore +3 -2
- data/Guardfile +8 -10
- data/README.md +2 -1
- data/lib/roro.rb +3 -1
- data/lib/roro/cli.rb +16 -74
- data/lib/roro/cli/generate/exposed.rb +14 -0
- data/lib/roro/cli/generate/{generate_keys.rb → keys.rb} +24 -2
- data/lib/roro/cli/generate/obfuscated.rb +17 -0
- data/lib/roro/cli/generate/story.rb +18 -0
- data/lib/roro/cli/greenfield/rails.rb +14 -0
- data/lib/roro/cli/rollon.rb +126 -63
- data/lib/roro/cli/rollon/rails/base/base.rb +4 -0
- data/lib/roro/cli/{base → rollon/rails/base}/insert_gems.rb +2 -10
- data/lib/roro/cli/{base → rollon/rails/base}/insertions.rb +8 -0
- data/lib/roro/cli/rollon/rails/database.rb +26 -0
- data/lib/roro/cli/rollon/{stories/rails → rails}/database/with_mysql.rb +4 -4
- data/lib/roro/cli/rollon/{stories/rails → rails}/database/with_postgresql.rb +5 -6
- data/lib/roro/cli/rollon/ruby_gem.rb +1 -0
- data/lib/roro/cli/rollon/{stories/ruby_gem → ruby_gem}/with_ci_cd.rb +8 -8
- data/lib/roro/cli/rollon/stories.rb +2 -2
- data/lib/roro/configurator.rb +15 -0
- data/lib/roro/configurator/eligibility.rb +137 -0
- data/lib/roro/configurator/okonomi.rb +28 -0
- data/lib/roro/configurator/omakase.rb +170 -0
- data/lib/roro/crypto.rb +73 -0
- data/lib/roro/stories/greenfield.yml +1 -0
- data/lib/roro/stories/greenfield/rails.yml +9 -0
- data/lib/roro/stories/rollon.yml +42 -0
- data/lib/roro/stories/rollon/rails.yml +76 -0
- data/lib/roro/stories/rollon/rails/ci_cd.yml +1 -0
- data/lib/roro/stories/rollon/rails/ci_cd/circleci.yml +2 -0
- data/lib/roro/stories/rollon/rails/database.yml +9 -0
- data/lib/roro/stories/rollon/rails/database/mysql.yml +17 -0
- data/lib/roro/stories/rollon/rails/database/postgresql.yml +15 -0
- data/lib/roro/stories/rollon/rails/kubernetes.yml +1 -0
- data/lib/roro/stories/rollon/rails/kubernetes/postgresql.yml +10 -0
- data/lib/roro/stories/rollon/rails/kubernetes/postgresql/default.yml +1 -0
- data/lib/roro/stories/rollon/rails/kubernetes/postgresql/edge.yml +1 -0
- data/lib/roro/stories/rollon/ruby_gem.yml +5 -0
- data/lib/roro/templates/base/.circleci/_aliases.yml +8 -0
- data/lib/roro/templates/base/.circleci/_commands.yml +31 -0
- data/lib/roro/templates/base/.circleci/_defaults.yml +5 -0
- data/lib/roro/templates/base/.circleci/_executors.yml +11 -0
- data/lib/roro/templates/base/.circleci/_major_only.yml +4 -0
- data/lib/roro/templates/base/.circleci/_version.yml +1 -0
- data/lib/roro/templates/base/.circleci/_workflow.yml +2 -0
- data/lib/roro/templates/base/.circleci/config.job-example.yml +33 -0
- data/lib/roro/templates/base/.circleci/jobs/_build.yml +4 -0
- data/lib/roro/templates/base/.circleci/jobs/_release.yml +12 -0
- data/lib/roro/templates/base/.circleci/workflows/_build_release.yml +10 -0
- data/lib/roro/{cli/templates → templates}/base/.dockerignore +0 -0
- data/lib/roro/templates/base/dotenv +1 -0
- data/lib/roro/{cli/rollon/stories/rails → templates/base/jumpstart}/.keep +0 -0
- data/lib/roro/{cli/templates → templates/base}/jumpstart/Dockerfile.tt +0 -0
- data/lib/roro/{cli/templates → templates/base}/jumpstart/docker-compose.yml +0 -0
- data/lib/roro/{cli/templates → templates/base}/jumpstart/docker-entrypoint.sh +0 -0
- data/lib/roro/{cli/templates → templates/base}/livereload/hosts.example +0 -0
- data/lib/roro/{cli/templates/base → templates/base/roro}/.keep +0 -0
- data/lib/roro/{cli/templates/jumpstart → templates/base/roro/roro}/.keep +0 -0
- data/lib/roro/{cli/templates/roro → templates/base/roro/roro/containers}/.keep +0 -0
- data/lib/roro/{cli/templates/roro/roro → templates/base/roro/roro/containers/app}/.keep +0 -0
- data/lib/roro/{cli/templates/roro/roro/containers → templates/base/roro/roro/containers/frontend}/.keep +0 -0
- data/lib/roro/{cli/templates → templates/base}/roro/roro/docker-entrypoint.sh.tt +0 -0
- data/lib/roro/{cli/templates/roro/roro/containers/app → templates/rails/.circleci}/.keep +0 -0
- data/lib/roro/templates/rails/.circleci/config.yml.tt +11 -0
- data/lib/roro/templates/rails/.circleci/jobs/_build.yml +14 -0
- data/lib/roro/templates/rails/.circleci/jobs/_push.yml +11 -0
- data/lib/roro/templates/rails/.circleci/jobs/_test.yml +12 -0
- data/lib/roro/{cli/templates/ruby_gem → templates/rails}/.circleci/setup-gem-credentials.sh +0 -0
- data/lib/roro/templates/rails/.circleci/workflows/_build_test_push.yml +12 -0
- data/lib/roro/{cli/templates/roro/roro/containers/frontend → templates/rails}/.keep +0 -0
- data/lib/roro/templates/rails/Dockerfile.greenfield.tt +51 -0
- data/lib/roro/{cli/templates/base → templates/rails}/config/database.mysql.yml +0 -0
- data/lib/roro/{cli/templates/base → templates/rails}/config/database.pg.yml +2 -3
- data/lib/roro/templates/rails/database/with_mysql/_service.yml +10 -0
- data/lib/roro/{cli/templates/ruby_gem/.circleci → templates/rails/database/with_postgresql}/.keep +0 -0
- data/lib/roro/templates/rails/database/with_postgresql/_service.yml +7 -0
- data/lib/roro/{cli/templates/roro → templates/rails}/docker-compose.yml.tt +9 -10
- data/lib/roro/{cli/templates/ruby_gem/roro/containers → templates/rails/dotenv}/.keep +0 -0
- data/lib/roro/templates/rails/dotenv/database.mysql.env.tt +6 -0
- data/lib/roro/templates/rails/dotenv/database.pg.env.tt +4 -0
- data/lib/roro/templates/rails/dotenv/web.env.tt +2 -0
- data/lib/roro/templates/rails/kube.rake.tt +114 -0
- data/lib/roro/{cli/templates/ruby_gem/roro/keys → templates/rails/roro}/.keep +0 -0
- data/lib/roro/{cli/templates/stories → templates/rails/roro/containers}/.keep +0 -0
- data/lib/roro/{cli/templates/stories/rails/database/with_postgresql → templates/rails/roro/containers/app}/.keep +0 -0
- data/lib/roro/templates/rails/roro/containers/app/Dockerfile.tt +34 -0
- data/lib/roro/{cli/templates/stories/with_postgresql → templates/rails/roro/containers/frontend}/.keep +0 -0
- data/lib/roro/templates/rails/roro/docker-entrypoint.sh +8 -0
- data/lib/roro/{cli/rollon/stories/database.rb → templates/rails/roro/kube/.keep} +0 -0
- data/lib/roro/templates/rails/roro/kube/certificate.yml.tt +0 -0
- data/lib/roro/templates/rails/roro/kube/cluster-issuer.yml.tt +0 -0
- data/lib/roro/templates/rails/roro/kube/deployment.yml.tt +50 -0
- data/lib/roro/templates/rails/roro/kube/deployments/postgres_deploy.yaml +47 -0
- data/lib/roro/templates/rails/roro/kube/deployments/rails_deploy.yaml +62 -0
- data/lib/roro/templates/rails/roro/kube/deployments/redis_deploy.yaml +23 -0
- data/lib/roro/templates/rails/roro/kube/deployments/sidekiq_deploy.yaml +56 -0
- data/lib/roro/templates/rails/roro/kube/ingress.yml.tt +0 -0
- data/lib/roro/templates/rails/roro/kube/ingresses/ingress.yaml +13 -0
- data/lib/roro/templates/rails/roro/kube/job-migrate.yml.tt +0 -0
- data/lib/roro/templates/rails/roro/kube/jobs/setup.yaml +42 -0
- data/lib/roro/templates/rails/roro/kube/secret-digital-ocean.yml.tt +4 -0
- data/lib/roro/templates/rails/roro/kube/service.yml.tt +10 -0
- data/lib/roro/templates/rails/roro/kube/services/postgres_svc.yaml +13 -0
- data/lib/roro/templates/rails/roro/kube/services/rails_svc.yaml +13 -0
- data/lib/roro/templates/rails/roro/kube/services/redis_svc.yaml +13 -0
- data/lib/roro/templates/rails/roro/kube/volumes/postgres_volumes.yaml +25 -0
- data/lib/roro/templates/ruby_gem/.circleci/.keep +0 -0
- data/lib/roro/templates/ruby_gem/.circleci/config.yml.tt +16 -0
- data/lib/roro/templates/ruby_gem/.circleci/jobs/_test.yml +4 -0
- data/lib/roro/templates/ruby_gem/.circleci/setup-gem-credentials.sh +3 -0
- data/lib/roro/{cli/templates → templates}/ruby_gem/docker-compose.yml +0 -0
- data/lib/roro/templates/ruby_gem/roro/containers/.keep +0 -0
- data/lib/roro/{cli/templates → templates}/ruby_gem/roro/containers/ruby_image/Dockerfile.tt +1 -1
- data/lib/roro/templates/ruby_gem/roro/containers/ruby_image/ci.env.tt +1 -0
- data/lib/roro/templates/ruby_gem/roro/keys/.keep +0 -0
- data/lib/roro/version.rb +1 -1
- data/roro.gemspec +11 -21
- data/roro/containers/app/Dockerfile +51 -0
- metadata +165 -173
- data/lib/roro/cli/base/base.rb +0 -8
- data/lib/roro/cli/base/base_files.rb +0 -24
- data/lib/roro/cli/base/check_dependencies.rb +0 -98
- data/lib/roro/cli/base/continuous_integration.rb +0 -13
- data/lib/roro/cli/base/utilities.rb +0 -39
- data/lib/roro/cli/cli.rb +0 -99
- data/lib/roro/cli/configuration.rb +0 -69
- data/lib/roro/cli/expose.rb +0 -14
- data/lib/roro/cli/generate/config.rb +0 -13
- data/lib/roro/cli/generate/config/rails.rb +0 -17
- data/lib/roro/cli/greenfield.rb +0 -31
- data/lib/roro/cli/obfuscate.rb +0 -19
- data/lib/roro/cli/rollon/stories/rails.rb +0 -1
- data/lib/roro/cli/rollon/stories/rails/database.rb +0 -33
- data/lib/roro/cli/rollon/stories/ruby_gem.rb +0 -77
- data/lib/roro/cli/rollon/stories/stories.rb +0 -3
- data/lib/roro/cli/roro_configurator.yml +0 -157
- data/lib/roro/cli/ruby_gem.rb +0 -67
- data/lib/roro/cli/templates/base/.roro_config.yml +0 -15
- data/lib/roro/cli/templates/base/Dockerfile.tt +0 -82
- data/lib/roro/cli/templates/greenfield/Dockerfile.tt +0 -43
- data/lib/roro/cli/templates/ruby_gem/.circleci/config.yml.tt +0 -40
- data/lib/roro/cli/templates/ruby_gem/roro/containers/ruby_image/ci.env.tt +0 -1
- data/lib/roro/cli/templates/stories/rails/database/with_mysql/_service.yml +0 -10
- data/lib/roro/cli/templates/stories/rails/database/with_postgresql/_service.yml +0 -7
- data/lib/roro/cli/templates/stories/ruby_gem/with_ci_cd/_build.yml +0 -11
- data/lib/roro/cli/templates/stories/with_mysql/_service.yml +0 -10
- data/lib/roro/cli/templates/stories/with_postgresql/_service.yml +0 -7
- data/lib/tasks/deploy.rake +0 -126
- data/vendor/cache/actionpack-6.0.3.2.gem +0 -0
- data/vendor/cache/actionview-6.0.3.2.gem +0 -0
- data/vendor/cache/activesupport-6.0.3.2.gem +0 -0
- data/vendor/cache/addressable-2.7.0.gem +0 -0
- data/vendor/cache/builder-3.2.4.gem +0 -0
- data/vendor/cache/byebug-11.1.3.gem +0 -0
- data/vendor/cache/coderay-1.1.3.gem +0 -0
- data/vendor/cache/concurrent-ruby-1.1.7.gem +0 -0
- data/vendor/cache/crass-1.0.6.gem +0 -0
- data/vendor/cache/em-websocket-0.5.1.gem +0 -0
- data/vendor/cache/erubi-1.9.0.gem +0 -0
- data/vendor/cache/eventmachine-1.2.7.gem +0 -0
- data/vendor/cache/ffi-1.13.1.gem +0 -0
- data/vendor/cache/formatador-0.2.5.gem +0 -0
- data/vendor/cache/gem-release-2.1.1.gem +0 -0
- data/vendor/cache/given_core-3.8.0.gem +0 -0
- data/vendor/cache/guard-2.16.2.gem +0 -0
- data/vendor/cache/guard-compat-1.2.1.gem +0 -0
- data/vendor/cache/guard-livereload-2.5.2.gem +0 -0
- data/vendor/cache/guard-minitest-2.4.6.gem +0 -0
- data/vendor/cache/handsome_fencer-crypto-0.1.6.gem +0 -0
- data/vendor/cache/handsome_fencer-test-0.1.1.gem +0 -0
- data/vendor/cache/http_parser.rb-0.6.0.gem +0 -0
- data/vendor/cache/i18n-1.8.5.gem +0 -0
- data/vendor/cache/launchy-2.5.0.gem +0 -0
- data/vendor/cache/listen-3.2.1.gem +0 -0
- data/vendor/cache/loofah-2.6.0.gem +0 -0
- data/vendor/cache/lumberjack-1.2.7.gem +0 -0
- data/vendor/cache/method_source-1.0.0.gem +0 -0
- data/vendor/cache/mini_portile2-2.4.0.gem +0 -0
- data/vendor/cache/minitest-5.14.1.gem +0 -0
- data/vendor/cache/minitest-given-3.8.0.gem +0 -0
- data/vendor/cache/minitest-matchers_vaccine-1.0.4.gem +0 -0
- data/vendor/cache/minitest-rails-6.0.1.gem +0 -0
- data/vendor/cache/mocha-1.11.2.gem +0 -0
- data/vendor/cache/multi_json-1.15.0.gem +0 -0
- data/vendor/cache/nenv-0.3.0.gem +0 -0
- data/vendor/cache/net-scp-3.0.0.gem +0 -0
- data/vendor/cache/net-ssh-6.1.0.gem +0 -0
- data/vendor/cache/nokogiri-1.10.10.gem +0 -0
- data/vendor/cache/notiffany-0.1.3.gem +0 -0
- data/vendor/cache/os-1.0.0.gem +0 -0
- data/vendor/cache/pry-0.13.1.gem +0 -0
- data/vendor/cache/public_suffix-4.0.5.gem +0 -0
- data/vendor/cache/rack-2.2.3.gem +0 -0
- data/vendor/cache/rack-livereload-0.3.17.gem +0 -0
- data/vendor/cache/rack-test-1.1.0.gem +0 -0
- data/vendor/cache/rails-dom-testing-2.0.3.gem +0 -0
- data/vendor/cache/rails-html-sanitizer-1.3.0.gem +0 -0
- data/vendor/cache/railties-6.0.3.2.gem +0 -0
- data/vendor/cache/rake-13.0.1.gem +0 -0
- data/vendor/cache/rb-fsevent-0.10.4.gem +0 -0
- data/vendor/cache/rb-inotify-0.10.1.gem +0 -0
- data/vendor/cache/shellany-0.0.1.gem +0 -0
- data/vendor/cache/shoulda-4.0.0.gem +0 -0
- data/vendor/cache/shoulda-context-2.0.0.gem +0 -0
- data/vendor/cache/shoulda-matchers-4.3.0.gem +0 -0
- data/vendor/cache/sorcerer-2.0.1.gem +0 -0
- data/vendor/cache/sshkit-1.18.2.gem +0 -0
- data/vendor/cache/thor-1.0.1.gem +0 -0
- data/vendor/cache/thread_safe-0.3.6.gem +0 -0
- data/vendor/cache/tzinfo-1.2.7.gem +0 -0
- data/vendor/cache/zeitwerk-2.4.0.gem +0 -0
|
@@ -10,16 +10,8 @@ module Roro
|
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
def insert_db_gem(gem)
|
|
13
|
-
|
|
14
|
-
|
|
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 '
|
|
10
|
-
config = @config.
|
|
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[
|
|
13
|
+
config[:rails_env] = environment
|
|
14
14
|
|
|
15
|
-
source = '
|
|
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
|
-
|
|
9
|
-
|
|
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[
|
|
11
|
+
config[:rails_env] = environment
|
|
13
12
|
|
|
14
|
-
source = '
|
|
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.
|
|
19
|
-
@config.
|
|
18
|
+
@config.env[:rubygems_api_key] = rubygems_api_key
|
|
19
|
+
@config.env[:rubies] = []
|
|
20
20
|
3.times do |index|
|
|
21
|
-
newruby = @config.
|
|
22
|
-
@config.
|
|
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.
|
|
25
|
-
directory 'ruby_gem/.circleci', './.circleci', @config.
|
|
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.
|
|
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/
|
|
2
|
-
require 'roro/cli/rollon/
|
|
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
|