orats 0.7.3 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -1
- data/Gemfile +1 -1
- data/{LICENSE.txt → LICENSE} +21 -21
- data/README.md +51 -346
- data/Rakefile +1 -1
- data/bin/orats +5 -2
- data/lib/orats/argv_adjust.rb +61 -0
- data/lib/orats/cli.rb +53 -141
- data/lib/orats/cli_help/new +27 -0
- data/lib/orats/cli_help/nuke +19 -0
- data/lib/orats/commands/new/exec.rb +59 -0
- data/lib/orats/commands/new/rails.rb +197 -0
- data/lib/orats/commands/new/server.rb +67 -0
- data/lib/orats/commands/nuke.rb +66 -44
- data/lib/orats/common.rb +76 -0
- data/lib/orats/postgres.rb +90 -0
- data/lib/orats/process.rb +35 -0
- data/lib/orats/redis.rb +25 -0
- data/lib/orats/shell.rb +12 -0
- data/lib/orats/templates/auth.rb +96 -82
- data/lib/orats/templates/base.rb +115 -110
- data/lib/orats/templates/includes/new/rails/.env +28 -28
- data/lib/orats/templates/includes/new/rails/Gemfile +4 -4
- data/lib/orats/templates/includes/new/rails/config/{whenever.rb → schedule.rb} +0 -0
- data/lib/orats/ui.rb +33 -0
- data/lib/orats/version.rb +3 -2
- data/lib/orats.rb +2 -1
- data/orats.gemspec +7 -5
- data/test/integration/cli_test.rb +28 -177
- data/test/test_helper.rb +24 -9
- metadata +17 -29
- data/lib/orats/commands/common.rb +0 -146
- data/lib/orats/commands/diff/compare.rb +0 -106
- data/lib/orats/commands/diff/exec.rb +0 -60
- data/lib/orats/commands/diff/parse.rb +0 -66
- data/lib/orats/commands/inventory.rb +0 -100
- data/lib/orats/commands/playbook.rb +0 -60
- data/lib/orats/commands/project/exec.rb +0 -74
- data/lib/orats/commands/project/rails.rb +0 -162
- data/lib/orats/commands/project/server.rb +0 -57
- data/lib/orats/commands/role.rb +0 -70
- data/lib/orats/commands/ui.rb +0 -47
- data/lib/orats/templates/includes/inventory/group_vars/all.yml +0 -202
- data/lib/orats/templates/includes/inventory/hosts +0 -8
- data/lib/orats/templates/includes/playbook/Galaxyfile +0 -15
- data/lib/orats/templates/includes/playbook/common.yml +0 -23
- data/lib/orats/templates/includes/playbook/site.yml +0 -36
- data/lib/orats/templates/includes/role/.travis.yml +0 -19
- data/lib/orats/templates/includes/role/README.md +0 -62
- data/lib/orats/templates/includes/role/meta/main.yml +0 -123
- data/lib/orats/templates/includes/role/tests/inventory +0 -1
- data/lib/orats/templates/includes/role/tests/main.yml +0 -7
- data/lib/orats/templates/playbook.rb +0 -119
- data/lib/orats/templates/role.rb +0 -144
data/lib/orats/cli.rb
CHANGED
@@ -1,169 +1,81 @@
|
|
1
1
|
require 'thor'
|
2
|
-
require 'orats/commands/
|
3
|
-
require 'orats/commands/inventory'
|
4
|
-
require 'orats/commands/playbook'
|
5
|
-
require 'orats/commands/role'
|
2
|
+
require 'orats/commands/new/exec'
|
6
3
|
require 'orats/commands/nuke'
|
7
|
-
require 'orats/
|
4
|
+
require 'orats/version'
|
8
5
|
|
9
6
|
module Orats
|
7
|
+
# the thor driven command line interface
|
10
8
|
class CLI < Thor
|
11
|
-
|
12
|
-
|
13
|
-
option :pg_password, required: true, aliases: '-p'
|
14
|
-
option :redis_location, default: 'localhost', aliases: '-n'
|
15
|
-
option :redis_password, default: '', aliases: '-d'
|
16
|
-
option :template, default: '', aliases: '-m'
|
17
|
-
option :custom, default: '', aliases: '-c'
|
18
|
-
option :skip_ansible, type: :boolean, default: false, aliases: '-A'
|
19
|
-
option :skip_server_start, type: :boolean, default: false, aliases: '-S'
|
20
|
-
desc 'project TARGET_PATH [options]', ''
|
21
|
-
long_desc <<-D
|
22
|
-
`orats project target_path --pg-password supersecret` will create a new rails project and it will also create an ansible inventory to go with it by default.
|
23
|
-
|
24
|
-
You must supply at least this flag:
|
25
|
-
|
26
|
-
`--pg-password` to supply your development postgres password so the rails application can run database migrations
|
27
|
-
|
28
|
-
Configuration:
|
29
|
-
|
30
|
-
`--pg-location` to supply a custom postgres location [localhost]
|
31
|
-
|
32
|
-
`--pg-username` to supply a custom postgres username [postgres]
|
33
|
-
|
34
|
-
`--redis-location` to supply a custom redis location [localhost]
|
35
|
-
|
36
|
-
`--redis-password` to supply your development redis password []
|
37
|
-
|
38
|
-
Template features:
|
9
|
+
# if options are added through the .oratsrc file then we run the risk
|
10
|
+
# of having options not set for the command it was ran for
|
39
11
|
|
40
|
-
|
12
|
+
# for example the new command has a --template flag but the nuke command
|
13
|
+
# does not. thor will throw an error if you have --template in the
|
14
|
+
# .oratsrc config because it does not exist for the nuke command
|
41
15
|
|
42
|
-
|
16
|
+
# the code below gets a list of options that came from the .oratsrc file
|
17
|
+
# and compares them to the current options for the current command
|
43
18
|
|
44
|
-
|
19
|
+
# this is good, but now we need a way to somehow add these options into
|
20
|
+
# the command to fool thor into thinking they exist. we need to add
|
21
|
+
# the option somehow, thoughts?
|
45
22
|
|
46
|
-
|
23
|
+
# for now none of the code below is in action and the readme explicitly
|
24
|
+
# says you can only store the postgres and redis credentials since
|
25
|
+
# the args only get inserted into the new and nuke commands
|
26
|
+
def initialize(args, local_options, config)
|
27
|
+
super
|
47
28
|
|
48
|
-
|
49
|
-
D
|
29
|
+
matched_options = []
|
50
30
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
desc 'inventory TARGET_PATH [options]', ''
|
56
|
-
long_desc <<-D
|
57
|
-
`orats inventory target_path` will create an ansible inventory.
|
58
|
-
D
|
59
|
-
|
60
|
-
def inventory(target_path)
|
61
|
-
Commands::Inventory.new(target_path, options).init
|
62
|
-
end
|
63
|
-
|
64
|
-
option :custom, default: '', aliases: '-c'
|
65
|
-
desc 'playbook TARGET_PATH [options]', ''
|
66
|
-
long_desc <<-D
|
67
|
-
`orats playbook target_path` will create an ansible playbook.
|
68
|
-
|
69
|
-
Help:
|
31
|
+
config[:current_command].options.each do |key|
|
32
|
+
aliases = key[1].aliases
|
33
|
+
option = key[0].to_s.gsub('_', '-')
|
70
34
|
|
71
|
-
|
35
|
+
aliases.each do |item|
|
36
|
+
matched_options << item if local_options.join.include?(item)
|
37
|
+
end
|
72
38
|
|
73
|
-
|
74
|
-
|
75
|
-
`--custom` will let you supply a custom template, a url or file is ok but urls
|
76
|
-
must start with http or https []
|
77
|
-
D
|
78
|
-
|
79
|
-
def playbook(target_path)
|
80
|
-
Commands::Playbook.new(target_path, options).init
|
39
|
+
matched_options << option if local_options.include?("--#{option}")
|
40
|
+
end
|
81
41
|
end
|
82
42
|
|
83
|
-
option :
|
43
|
+
option :pg_location, default: 'localhost', aliases: '-l'
|
44
|
+
option :pg_username, default: 'postgres', aliases: '-u'
|
45
|
+
option :pg_password, default: '', aliases: '-p'
|
46
|
+
option :redis_location, default: 'localhost', aliases: '-n'
|
47
|
+
option :redis_password, default: '', aliases: '-d'
|
48
|
+
option :template, default: '', aliases: '-t'
|
84
49
|
option :custom, default: '', aliases: '-c'
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
`--repo-name` if your github repo name is different than the full role name
|
92
|
-
|
93
|
-
Template features:
|
94
|
-
|
95
|
-
`--custom` will let you supply a custom template, a url or file is ok but urls
|
96
|
-
must start with http or https []
|
97
|
-
D
|
98
|
-
|
99
|
-
def role(target_path)
|
100
|
-
Commands::Role.new(target_path, options).init
|
50
|
+
option :skip_server_start, type: :boolean, default: false, aliases: '-S'
|
51
|
+
option :rc, default: ''
|
52
|
+
desc 'new PATH [options]', 'Create a new orats application'
|
53
|
+
long_desc File.read(File.join(File.dirname(__FILE__), 'cli_help/new'))
|
54
|
+
def new(target_path)
|
55
|
+
Commands::New::Exec.new(target_path, options).init
|
101
56
|
end
|
102
57
|
|
103
|
-
option :
|
58
|
+
option :pg_location, default: 'localhost', aliases: '-l'
|
59
|
+
option :pg_username, default: 'postgres', aliases: '-u'
|
60
|
+
option :pg_password, default: '', aliases: '-p'
|
61
|
+
option :redis_location, default: 'localhost', aliases: '-n'
|
104
62
|
option :redis_password, default: '', aliases: '-d'
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
Options:
|
110
|
-
|
111
|
-
`--skip-data` will skip deleting app specific postgres databases and redis namespaces [false]
|
112
|
-
|
113
|
-
`--redis-password` to supply your development redis password []
|
114
|
-
D
|
115
|
-
|
63
|
+
option :skip_data, type: :boolean, default: false, aliases: '-D'
|
64
|
+
option :rc, default: ''
|
65
|
+
desc 'nuke PATH [options]', 'Delete a path and optionally its data'
|
66
|
+
long_desc File.read(File.join(File.dirname(__FILE__), 'cli_help/nuke'))
|
116
67
|
def nuke(target_path)
|
117
68
|
Commands::Nuke.new(target_path, options).init
|
118
69
|
end
|
119
70
|
|
120
|
-
|
121
|
-
|
122
|
-
option :hosts, default: '', aliases: '-h'
|
123
|
-
option :inventory, default: '', aliases: '-i'
|
124
|
-
desc 'diff [options]', ''
|
125
|
-
long_desc <<-D
|
126
|
-
`orats diff` will run various comparisons on orats and your ansible files.
|
127
|
-
|
128
|
-
Options:
|
129
|
-
|
130
|
-
`--galaxyfile` to supply a galaxyfile for comparison []
|
131
|
-
|
132
|
-
`--playbook` to supply a playbook directory/file for comparison []
|
133
|
-
|
134
|
-
`--hosts` to supply a hosts file for comparison []
|
135
|
-
|
136
|
-
`--inventory` to supply an inventory directory/file for comparison []
|
137
|
-
|
138
|
-
Quality of life features:
|
139
|
-
|
140
|
-
`--playbook` also accepts a playbook path, if you kept the
|
141
|
-
default file names it will automatically compare both your Galaxyfile and
|
142
|
-
site.yml files.
|
143
|
-
|
144
|
-
`--inventory` also accepts an inventory path, if you kept the
|
145
|
-
default file names it will automatically compare both your hosts and
|
146
|
-
group_vars/all.yml files.
|
147
|
-
D
|
148
|
-
|
149
|
-
def diff
|
150
|
-
Commands::Diff::Exec.new(nil, options).init
|
151
|
-
end
|
152
|
-
|
153
|
-
desc 'templates', ''
|
154
|
-
long_desc <<-D
|
155
|
-
`orats templates` will return a list of available orats templates.
|
156
|
-
D
|
157
|
-
|
71
|
+
desc 'templates', 'Return a list of available templates'
|
72
|
+
long_desc 'Return a list of available built in templates.'
|
158
73
|
def templates
|
159
|
-
Commands::
|
74
|
+
Commands::New::Exec.new.available_templates
|
160
75
|
end
|
161
76
|
|
162
|
-
desc 'version', ''
|
163
|
-
long_desc
|
164
|
-
`orats version` will print the current version.
|
165
|
-
D
|
166
|
-
|
77
|
+
desc 'version', 'The current version of orats'
|
78
|
+
long_desc 'Print the current version.'
|
167
79
|
def version
|
168
80
|
puts "Orats version #{VERSION}"
|
169
81
|
end
|
@@ -176,4 +88,4 @@ group_vars/all.yml files.
|
|
176
88
|
caller_locations(0).any? { |backtrace| backtrace.label == 'invoke' }
|
177
89
|
end
|
178
90
|
end
|
179
|
-
end
|
91
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
Create a new shiny rails app with quite a few best practices and opinions.
|
2
|
+
|
3
|
+
Development server credentials:
|
4
|
+
|
5
|
+
`--pg-location` to supply a custom postgres location [localhost]
|
6
|
+
|
7
|
+
`--pg-username` to supply a custom postgres username [postgres]
|
8
|
+
|
9
|
+
`--pg-password` to supply your postgres password to run migrations []
|
10
|
+
|
11
|
+
`--redis-location` to supply a custom redis location [localhost]
|
12
|
+
|
13
|
+
`--redis-password` to supply your redis password []
|
14
|
+
|
15
|
+
Options:
|
16
|
+
|
17
|
+
`--rc` to supply an .oratsrc file path to automatically populate credentials []
|
18
|
+
|
19
|
+
Template features:
|
20
|
+
|
21
|
+
`--template` to mix in an official orats template by supplying its name []
|
22
|
+
|
23
|
+
`--custom` to add your own template at the very end, a url or file is ok []
|
24
|
+
|
25
|
+
Project features:
|
26
|
+
|
27
|
+
`--skip-server-start` to skip automatically running puma and sidekiq [false]
|
@@ -0,0 +1,19 @@
|
|
1
|
+
Delete the target path and optionally all data associated to it.
|
2
|
+
|
3
|
+
Development server credentials:
|
4
|
+
|
5
|
+
`--pg-location` to supply a custom postgres location [localhost]
|
6
|
+
|
7
|
+
`--pg-username` to supply a custom postgres username [postgres]
|
8
|
+
|
9
|
+
`--pg-password` to supply your postgres password []
|
10
|
+
|
11
|
+
`--redis-location` to supply a custom redis location [localhost]
|
12
|
+
|
13
|
+
`--redis-password` to supply your redis password []
|
14
|
+
|
15
|
+
Options:
|
16
|
+
|
17
|
+
`--skip-data` to skip deleting app specific postgres and redis data [false]
|
18
|
+
|
19
|
+
`--rc` to supply an .oratsrc file path to automatically populate credentials []
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'orats/common'
|
2
|
+
require 'orats/commands/new/rails'
|
3
|
+
require 'orats/commands/new/server'
|
4
|
+
|
5
|
+
module Orats
|
6
|
+
module Commands
|
7
|
+
module New
|
8
|
+
# entry point to the new command
|
9
|
+
class Exec < Common
|
10
|
+
include Rails
|
11
|
+
include Server
|
12
|
+
|
13
|
+
AVAILABLE_TEMPLATES = {
|
14
|
+
auth: 'add authentication and authorization'
|
15
|
+
}
|
16
|
+
|
17
|
+
def initialize(target_path = '', options = {})
|
18
|
+
super
|
19
|
+
end
|
20
|
+
|
21
|
+
def init
|
22
|
+
check_exit_conditions
|
23
|
+
|
24
|
+
rails_template 'base' do
|
25
|
+
rails_template_actions
|
26
|
+
end
|
27
|
+
|
28
|
+
orats_rails_template if template_exist?(@options[:template])
|
29
|
+
custom_rails_template unless @options[:custom].empty?
|
30
|
+
server_start
|
31
|
+
end
|
32
|
+
|
33
|
+
def available_templates
|
34
|
+
puts
|
35
|
+
log 'templates',
|
36
|
+
'Add `-t TEMPLATE` to the new command to mixin a template',
|
37
|
+
:magenta
|
38
|
+
puts
|
39
|
+
|
40
|
+
AVAILABLE_TEMPLATES.each_pair do |key, value|
|
41
|
+
log key, value, :cyan
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def orats_to_local(source, dest)
|
48
|
+
includes_path = "#{base_path}/templates/includes"
|
49
|
+
|
50
|
+
unless Dir.exist?(File.dirname(dest))
|
51
|
+
system "mkdir -p #{File.dirname(dest)}"
|
52
|
+
end
|
53
|
+
|
54
|
+
system "cp #{includes_path}/#{source} #{dest}"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,197 @@
|
|
1
|
+
module Orats
|
2
|
+
module Commands
|
3
|
+
module New
|
4
|
+
# helper functions for the new::exec class
|
5
|
+
module Rails
|
6
|
+
def check_exit_conditions
|
7
|
+
exit_if_path_exists
|
8
|
+
exit_if_invalid_template
|
9
|
+
exit_if_invalid_system
|
10
|
+
exit_if_database_exists
|
11
|
+
end
|
12
|
+
|
13
|
+
def rails_template(command, flags = '')
|
14
|
+
orats_template = "--template #{base_path}/templates/#{command}.rb"
|
15
|
+
|
16
|
+
run "rails new #{@target_path} #{flags} --skip-bundle " + \
|
17
|
+
" #{orats_template unless command.empty?}"
|
18
|
+
|
19
|
+
yield if block_given?
|
20
|
+
end
|
21
|
+
|
22
|
+
def orats_rails_template
|
23
|
+
rails_template @options[:template], '--skip ' do
|
24
|
+
migrate_and_seed_database
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def custom_rails_template
|
29
|
+
task 'Add custom template'
|
30
|
+
|
31
|
+
if @options[:custom].include('://')
|
32
|
+
url_to_string(@options[:custom])
|
33
|
+
else
|
34
|
+
file_to_string(@options[:custom])
|
35
|
+
end
|
36
|
+
|
37
|
+
rails_template '', "--skip --template #{@options[:custom]}"
|
38
|
+
end
|
39
|
+
|
40
|
+
def rails_template_actions
|
41
|
+
gsub_postgres_info
|
42
|
+
gsub_redis_info
|
43
|
+
gsub_app_path
|
44
|
+
gsub_readme
|
45
|
+
|
46
|
+
bundle_install
|
47
|
+
bundle_binstubs
|
48
|
+
spring_binstub
|
49
|
+
|
50
|
+
create_and_migrate_database
|
51
|
+
generate_home_page
|
52
|
+
generate_favicons
|
53
|
+
end
|
54
|
+
|
55
|
+
def gsub_postgres_info
|
56
|
+
task 'Update the postgres connection details'
|
57
|
+
|
58
|
+
gsub_file "#{@target_path}/.env", "DATABASE_HOST: 'localhost'",
|
59
|
+
"DATABASE_HOST: '#{@options[:pg_location]}'"
|
60
|
+
gsub_file "#{@target_path}/.env", ": 'postgres'",
|
61
|
+
": '#{@options[:pg_username]}'"
|
62
|
+
gsub_file "#{@target_path}/.env", ": 'supersecrets'",
|
63
|
+
": '#{@options[:pg_password]}'"
|
64
|
+
|
65
|
+
commit 'Update the postgres connection details'
|
66
|
+
end
|
67
|
+
|
68
|
+
def gsub_redis_info
|
69
|
+
task 'Update the redis connection details'
|
70
|
+
|
71
|
+
gsub_file "#{@target_path}/.env", "HE_PASSWORD: ''",
|
72
|
+
"HE_PASSWORD: '#{@options[:redis_password]}'"
|
73
|
+
gsub_file "#{@target_path}/.env", "CACHE_HOST: 'localhost'",
|
74
|
+
"CACHE_HOST: '#{@options[:redis_location]}'"
|
75
|
+
|
76
|
+
commit 'Update the redis connection details'
|
77
|
+
end
|
78
|
+
|
79
|
+
def gsub_app_path
|
80
|
+
task 'Update the app path'
|
81
|
+
|
82
|
+
gsub_file "#{@target_path}/.env", ": '/tmp/yourapp'",
|
83
|
+
": '#{File.expand_path(@target_path)}'"
|
84
|
+
|
85
|
+
commit 'Update the app path'
|
86
|
+
end
|
87
|
+
|
88
|
+
def gsub_readme
|
89
|
+
task 'Update the readme'
|
90
|
+
|
91
|
+
gsub_file "#{@target_path}/README.md", 'VERSION', VERSION
|
92
|
+
|
93
|
+
commit 'Update the readme'
|
94
|
+
end
|
95
|
+
|
96
|
+
def bundle_install
|
97
|
+
task 'Run bundle install, this may take a while'
|
98
|
+
run_from @target_path, 'bundle install'
|
99
|
+
|
100
|
+
commit 'Add Gemfile.lock'
|
101
|
+
end
|
102
|
+
|
103
|
+
def bundle_binstubs
|
104
|
+
task 'Run bundle binstubs for a few gems'
|
105
|
+
run_from @target_path, 'bundle binstubs whenever puma sidekiq backup'
|
106
|
+
|
107
|
+
commit 'Add binstubs for the important gems'
|
108
|
+
end
|
109
|
+
|
110
|
+
def spring_binstub
|
111
|
+
task 'Run spring binstub'
|
112
|
+
run_from @target_path, 'bundle exec spring binstub --all'
|
113
|
+
|
114
|
+
commit 'Add spring binstubs for all of the bins'
|
115
|
+
end
|
116
|
+
|
117
|
+
def generate_home_page
|
118
|
+
kill_spring_servers
|
119
|
+
|
120
|
+
task 'Add pages controller with static page'
|
121
|
+
run_from @target_path, 'bundle exec rails g controller Pages home'
|
122
|
+
|
123
|
+
gsub_home_page
|
124
|
+
copy_home_page_views
|
125
|
+
|
126
|
+
commit 'Add pages controller with home page'
|
127
|
+
end
|
128
|
+
|
129
|
+
def generate_favicons
|
130
|
+
run_rake 'orats:favicons'
|
131
|
+
|
132
|
+
commit 'Add favicons'
|
133
|
+
end
|
134
|
+
|
135
|
+
def create_and_migrate_database
|
136
|
+
task 'Create and migrate the database'
|
137
|
+
|
138
|
+
create_database
|
139
|
+
run_rake 'db:migrate'
|
140
|
+
|
141
|
+
commit 'Add the database schema file'
|
142
|
+
end
|
143
|
+
|
144
|
+
def migrate_and_seed_database
|
145
|
+
run_rake 'db:migrate db:seed'
|
146
|
+
|
147
|
+
commit 'Update the database schema file'
|
148
|
+
end
|
149
|
+
|
150
|
+
def template_exist?(template)
|
151
|
+
Exec::AVAILABLE_TEMPLATES.include?(template.to_sym)
|
152
|
+
end
|
153
|
+
|
154
|
+
private
|
155
|
+
|
156
|
+
def gsub_home_page
|
157
|
+
gsub_file "#{@target_path}/config/routes.rb",
|
158
|
+
" # root 'welcome#index'", " root 'pages#home'"
|
159
|
+
gsub_file "#{@target_path}/config/routes.rb",
|
160
|
+
" get 'pages/home'\n\n", ''
|
161
|
+
|
162
|
+
gsub_file "#{@target_path}/test/controllers/pages_controller_" + \
|
163
|
+
'test.rb', '"should get home"', "'expect home page'"
|
164
|
+
end
|
165
|
+
|
166
|
+
def copy_home_page_views
|
167
|
+
run_from @target_path, 'rm app/views/pages/home.html.erb'
|
168
|
+
|
169
|
+
orats_to_local 'new/rails/app/views/pages/home.html.erb',
|
170
|
+
"#{@target_path}/app/views/pages/home.html.erb"
|
171
|
+
|
172
|
+
gsub_file "#{@target_path}/app/views/pages/home.html.erb",
|
173
|
+
'vVERSION', VERSION
|
174
|
+
end
|
175
|
+
|
176
|
+
def exit_if_invalid_template
|
177
|
+
template = @options[:template] || ''
|
178
|
+
task 'Check if template exists'
|
179
|
+
|
180
|
+
return if template.empty? || template_exist?(template)
|
181
|
+
|
182
|
+
error 'Cannot find template',
|
183
|
+
"'#{template}' is not a valid template name"
|
184
|
+
|
185
|
+
available_templates
|
186
|
+
exit 1
|
187
|
+
end
|
188
|
+
|
189
|
+
def kill_spring_servers
|
190
|
+
# rails generators will lock up if a spring server is running,
|
191
|
+
# so kill them all before continuing
|
192
|
+
system 'pkill -f spring'
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|
197
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'socket'
|
2
|
+
require 'timeout'
|
3
|
+
|
4
|
+
module Orats
|
5
|
+
module Commands
|
6
|
+
module New
|
7
|
+
# handle starting the server
|
8
|
+
module Server
|
9
|
+
START_COMMAND = 'bundle exec foreman start'
|
10
|
+
|
11
|
+
def server_start
|
12
|
+
if @options[:skip_server_start]
|
13
|
+
message = 'Start your'
|
14
|
+
else
|
15
|
+
message = 'Starting'
|
16
|
+
end
|
17
|
+
|
18
|
+
display_notice message
|
19
|
+
attempt_to_start unless @options[:skip_server_start]
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def display_notice(message)
|
25
|
+
results "#{message} server with the following commands",
|
26
|
+
'command', "cd #{@target_path}"
|
27
|
+
log 'command', START_COMMAND, :white
|
28
|
+
end
|
29
|
+
|
30
|
+
def attempt_to_start
|
31
|
+
while port_taken?
|
32
|
+
error 'Failed to start server',
|
33
|
+
"Another application is using port 3000\n"
|
34
|
+
puts
|
35
|
+
exit 1 if no?('Would you like to try running ' + \
|
36
|
+
' the server again? (y/N)', :cyan)
|
37
|
+
end
|
38
|
+
|
39
|
+
puts
|
40
|
+
run_from @target_path, START_COMMAND
|
41
|
+
end
|
42
|
+
|
43
|
+
def port_taken?
|
44
|
+
begin
|
45
|
+
start_server?
|
46
|
+
rescue Timeout::Error
|
47
|
+
false
|
48
|
+
end
|
49
|
+
|
50
|
+
false
|
51
|
+
end
|
52
|
+
|
53
|
+
def start_server?
|
54
|
+
Timeout.timeout(5) do
|
55
|
+
s = TCPSocket.new('localhost', 3000)
|
56
|
+
s.close
|
57
|
+
|
58
|
+
true
|
59
|
+
end
|
60
|
+
|
61
|
+
rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH
|
62
|
+
false
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|