geordi 3.0.0 → 3.0.1
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 +4 -4
- data/CHANGELOG.md +7 -0
- data/Gemfile.lock +1 -1
- data/lib/geordi/COMMAND_TEMPLATE +2 -3
- data/lib/geordi/chromedriver_updater.rb +7 -8
- data/lib/geordi/cli.rb +0 -1
- data/lib/geordi/commands/_setup_vnc.rb +22 -22
- data/lib/geordi/commands/bundle_install.rb +1 -1
- data/lib/geordi/commands/capistrano.rb +4 -4
- data/lib/geordi/commands/clean.rb +6 -5
- data/lib/geordi/commands/console.rb +2 -2
- data/lib/geordi/commands/create_database_yml.rb +2 -2
- data/lib/geordi/commands/create_databases.rb +1 -1
- data/lib/geordi/commands/cucumber.rb +8 -8
- data/lib/geordi/commands/delete_dumps.rb +5 -5
- data/lib/geordi/commands/deploy.rb +18 -18
- data/lib/geordi/commands/drop_databases.rb +3 -3
- data/lib/geordi/commands/dump.rb +8 -8
- data/lib/geordi/commands/firefox.rb +2 -2
- data/lib/geordi/commands/migrate.rb +3 -3
- data/lib/geordi/commands/png_optimize.rb +5 -5
- data/lib/geordi/commands/rake.rb +1 -1
- data/lib/geordi/commands/remove_executable_flags.rb +2 -2
- data/lib/geordi/commands/rspec.rb +5 -5
- data/lib/geordi/commands/security_update.rb +17 -17
- data/lib/geordi/commands/server.rb +2 -2
- data/lib/geordi/commands/setup.rb +3 -3
- data/lib/geordi/commands/shell.rb +1 -1
- data/lib/geordi/commands/tests.rb +1 -1
- data/lib/geordi/commands/unit.rb +2 -2
- data/lib/geordi/commands/update.rb +2 -2
- data/lib/geordi/commands/with_rake.rb +2 -2
- data/lib/geordi/commands/yarn_install.rb +1 -1
- data/lib/geordi/cucumber.rb +14 -15
- data/lib/geordi/db_cleaner.rb +21 -22
- data/lib/geordi/dump_loader.rb +2 -3
- data/lib/geordi/firefox_for_selenium.rb +17 -19
- data/lib/geordi/gitpt.rb +2 -3
- data/lib/geordi/interaction.rb +2 -6
- data/lib/geordi/remote.rb +3 -4
- data/lib/geordi/util.rb +13 -8
- data/lib/geordi/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6526d69319548d39cfe259c4c62788ae997bffec2d305f5bd8ee63bef9a5e12e
|
4
|
+
data.tar.gz: e19060563af6fad488e1521aa3574c36499ff74dfca2e782283a35ca34f7301f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 429dc10291a955e101c6ba802475d2daef6a05eaad3c5e6737853194bc4565797d86820c2b20bc97ad387b5eeebeb4bfdec4651c99f12bc325c75a9ed6eece54
|
7
|
+
data.tar.gz: 2196c5fb48bbc1365fbf2731441d0fac73a57944414a99a97b61f4cbff6c95ab551346ebb418c844f89ea21c96182e66110d9b842405ceaf6e1119c8c10e928a
|
data/CHANGELOG.md
CHANGED
@@ -11,6 +11,13 @@ This project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html
|
|
11
11
|
### Breaking changes
|
12
12
|
|
13
13
|
|
14
|
+
## 3.0.1 2020-05-13
|
15
|
+
|
16
|
+
### Compatible changes
|
17
|
+
- Fix #93: Using `$CHILDSTATUS` instead of `$?` did not work properly. This affected commands like `geordi drop-databases` to fail.
|
18
|
+
- Fix #92: Geordi fail messages were converted to exceptions by accident. Now they are printed as red error message without the backtrace again.
|
19
|
+
|
20
|
+
|
14
21
|
## 3.0.0 2020-05-04
|
15
22
|
|
16
23
|
### Compatible changes
|
data/Gemfile.lock
CHANGED
data/lib/geordi/COMMAND_TEMPLATE
CHANGED
@@ -21,10 +21,9 @@ def example
|
|
21
21
|
# Invoke other commands like this:
|
22
22
|
invoke_cmd 'other_command', 'argument', an: 'option'
|
23
23
|
|
24
|
-
fail 'Option missing' unless options.opt?
|
24
|
+
Interaction.fail 'Option missing' unless options.opt?
|
25
25
|
|
26
|
-
|
27
|
-
success 'Done.'
|
26
|
+
Interaction.success 'Done.'
|
28
27
|
end
|
29
28
|
|
30
29
|
# Command mappings, usually not needed
|
@@ -4,14 +4,13 @@ require 'tempfile'
|
|
4
4
|
|
5
5
|
module Geordi
|
6
6
|
class ChromedriverUpdater
|
7
|
-
include Geordi::Interaction
|
8
7
|
|
9
8
|
def run
|
10
9
|
chrome_version = determine_chrome_version
|
11
10
|
chromedriver_version = determine_chromedriver_version
|
12
11
|
|
13
12
|
if skip_update?(chrome_version, chromedriver_version)
|
14
|
-
warn("No update required, you are using for both executables the same version #{chrome_version}!")
|
13
|
+
Interaction.warn("No update required, you are using for both executables the same version #{chrome_version}!")
|
15
14
|
else
|
16
15
|
chromedriver_zip = download_chromedriver(chrome_version)
|
17
16
|
unzip(chromedriver_zip, File.expand_path('~/bin'))
|
@@ -19,7 +18,7 @@ module Geordi
|
|
19
18
|
chromedriver_zip.unlink
|
20
19
|
|
21
20
|
# We need to determine the version again, as it could be nil in case no chromedriver was installed before
|
22
|
-
note "Chromedriver updated to version #{determine_chromedriver_version}"
|
21
|
+
Interaction.note "Chromedriver updated to version #{determine_chromedriver_version}"
|
23
22
|
end
|
24
23
|
end
|
25
24
|
|
@@ -32,7 +31,7 @@ module Geordi
|
|
32
31
|
end
|
33
32
|
|
34
33
|
if !status.success? || chrome_version.nil?
|
35
|
-
|
34
|
+
Interaction.fail('Could not determine the current Google Chrome version')
|
36
35
|
else
|
37
36
|
chrome_version.to_i
|
38
37
|
end
|
@@ -47,7 +46,7 @@ module Geordi
|
|
47
46
|
end
|
48
47
|
|
49
48
|
if !status.success? || chromedriver_version.nil?
|
50
|
-
|
49
|
+
Interaction.fail('Could not determine the current chromedriver version')
|
51
50
|
else
|
52
51
|
chromedriver_version.to_i
|
53
52
|
end
|
@@ -69,7 +68,7 @@ module Geordi
|
|
69
68
|
|
70
69
|
file
|
71
70
|
else
|
72
|
-
|
71
|
+
Interaction.fail("Could not download chromedriver version #{latest_version}")
|
73
72
|
end
|
74
73
|
end
|
75
74
|
|
@@ -80,7 +79,7 @@ module Geordi
|
|
80
79
|
if response.is_a?(Net::HTTPSuccess)
|
81
80
|
response.body.to_s
|
82
81
|
else
|
83
|
-
|
82
|
+
Interaction.fail("Could not find the latest version for Google Chrome version #{chrome_version}")
|
84
83
|
end
|
85
84
|
end
|
86
85
|
|
@@ -88,7 +87,7 @@ module Geordi
|
|
88
87
|
_stdout_str, _error_str, status = Open3.capture3('unzip', '-d', output_dir, '-o', zip.path)
|
89
88
|
|
90
89
|
unless status.success?
|
91
|
-
|
90
|
+
Interaction.fail("Could not unzip #{zip.path}")
|
92
91
|
end
|
93
92
|
end
|
94
93
|
end
|
data/lib/geordi/cli.rb
CHANGED
@@ -2,33 +2,33 @@ desc '-setup-vnc', 'Setup VNC for running Selenium tests there', hide: true
|
|
2
2
|
def _setup_vnc
|
3
3
|
`clear`
|
4
4
|
|
5
|
-
note 'This script will help you install a VNC server and a VNC viewer.'
|
5
|
+
Interaction.note 'This script will help you install a VNC server and a VNC viewer.'
|
6
6
|
puts
|
7
|
-
puts strip_heredoc <<-TEXT
|
7
|
+
puts Util.strip_heredoc <<-TEXT
|
8
8
|
With those you will be able to use our cucumber script without being
|
9
9
|
disturbed by focus-stealing Selenium windows. Instead, they will open
|
10
10
|
inside a VNC session.
|
11
11
|
|
12
12
|
You can still inspect everything with:
|
13
13
|
TEXT
|
14
|
-
note_cmd 'geordi vnc'
|
14
|
+
Interaction.note_cmd 'geordi vnc'
|
15
15
|
puts
|
16
|
-
note 'Please open a second shell to execute instructions.'
|
17
|
-
prompt 'Continue ...'
|
16
|
+
Interaction.note 'Please open a second shell to execute instructions.'
|
17
|
+
Interaction.prompt 'Continue ...'
|
18
18
|
|
19
|
-
announce 'Setup VNC server'
|
19
|
+
Interaction.announce 'Setup VNC server'
|
20
20
|
|
21
21
|
vnc_server_installed = system('which vncserver > /dev/null 2>&1')
|
22
22
|
if vnc_server_installed
|
23
|
-
success 'It appears you already have a VNC server installed. Good job!'
|
23
|
+
Interaction.success 'It appears you already have a VNC server installed. Good job!'
|
24
24
|
else
|
25
25
|
puts 'Please run:'
|
26
|
-
note_cmd 'sudo apt-get install vnc4server'
|
27
|
-
prompt 'Continue ...'
|
26
|
+
Interaction.note_cmd 'sudo apt-get install vnc4server'
|
27
|
+
Interaction.prompt 'Continue ...'
|
28
28
|
|
29
29
|
puts
|
30
|
-
note 'We will now set a password for your VNC server.'
|
31
|
-
puts strip_heredoc <<-TEXT
|
30
|
+
Interaction.note 'We will now set a password for your VNC server.'
|
31
|
+
puts Util.strip_heredoc <<-TEXT
|
32
32
|
When running our cucumber script, you will not actually need this
|
33
33
|
password, and there is no security risk. However, if you start a vncserver
|
34
34
|
without our cucumber script, a user with your password can connect to
|
@@ -36,31 +36,31 @@ def _setup_vnc
|
|
36
36
|
|
37
37
|
TEXT
|
38
38
|
puts 'Please run:'
|
39
|
-
note_cmd 'vncserver :20'
|
40
|
-
warn 'Enter a secure password!'
|
41
|
-
prompt 'Continue ...'
|
39
|
+
Interaction.note_cmd 'vncserver :20'
|
40
|
+
Interaction.warn 'Enter a secure password!'
|
41
|
+
Interaction.prompt 'Continue ...'
|
42
42
|
|
43
43
|
puts 'Now stop the server again. Please run:'
|
44
|
-
note_cmd 'vncserver -kill :20'
|
45
|
-
prompt 'Continue ...'
|
44
|
+
Interaction.note_cmd 'vncserver -kill :20'
|
45
|
+
Interaction.prompt 'Continue ...'
|
46
46
|
end
|
47
47
|
|
48
|
-
announce 'Setup VNC viewer'
|
48
|
+
Interaction.announce 'Setup VNC viewer'
|
49
49
|
|
50
50
|
vnc_viewer_installed = system('which vncviewer > /dev/null 2>&1')
|
51
51
|
if vnc_viewer_installed
|
52
|
-
success 'It appears you already have a VNC viewer installed. Good job!'
|
52
|
+
Interaction.success 'It appears you already have a VNC viewer installed. Good job!'
|
53
53
|
else
|
54
54
|
puts 'Please run:'
|
55
|
-
note_cmd 'sudo apt-get install xtightvncviewer'
|
56
|
-
prompt 'Continue ...'
|
55
|
+
Interaction.note_cmd 'sudo apt-get install xtightvncviewer'
|
56
|
+
Interaction.prompt 'Continue ...'
|
57
57
|
end
|
58
58
|
|
59
59
|
puts
|
60
|
-
puts strip_heredoc <<-TEXT
|
60
|
+
puts Util.strip_heredoc <<-TEXT
|
61
61
|
All done. Our cucumber script will now automatically run Selenium features
|
62
62
|
in VNC.
|
63
63
|
TEXT
|
64
64
|
|
65
|
-
success 'Happy cuking!'
|
65
|
+
Interaction.success 'Happy cuking!'
|
66
66
|
end
|
@@ -6,16 +6,16 @@ LONGDESC
|
|
6
6
|
def capistrano(*args)
|
7
7
|
targets = Dir['config/deploy/*.rb'].map { |file| File.basename(file, '.rb') }.sort
|
8
8
|
|
9
|
-
note 'Found the following deploy targets:'
|
9
|
+
Interaction.note 'Found the following deploy targets:'
|
10
10
|
puts targets
|
11
|
-
prompt('Continue?', 'n', /y|yes/) ||
|
11
|
+
Interaction.prompt('Continue?', 'n', /y|yes/) || Interaction.fail('Cancelled.')
|
12
12
|
|
13
13
|
targets << nil if targets.empty? # default target
|
14
14
|
targets.each do |stage|
|
15
|
-
announce 'Target: ' + (stage || '(default)')
|
15
|
+
Interaction.announce 'Target: ' + (stage || '(default)')
|
16
16
|
|
17
17
|
command = "bundle exec cap #{stage} " + args.join(' ')
|
18
|
-
note_cmd command
|
18
|
+
Interaction.note_cmd command
|
19
19
|
|
20
20
|
Util.system!(command, fail_message: 'Capistrano failed. Have a look!')
|
21
21
|
end
|
@@ -1,14 +1,15 @@
|
|
1
1
|
desc 'clean', 'Remove unneeded files from the current directory'
|
2
2
|
def clean
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
|
4
|
+
Interaction.announce 'Removing tempfiles'
|
5
|
+
for pattern in %w[ webrat-* capybara-* tmp/webrat-* tmp/capybara-* tmp/rtex/* log/*.log ]
|
6
|
+
Interaction.note pattern
|
6
7
|
puts `rm -vfR #{pattern}`
|
7
8
|
end
|
8
9
|
|
9
|
-
announce 'Finding recursively and removing backup files'
|
10
|
+
Interaction.announce 'Finding recursively and removing backup files'
|
10
11
|
%w[*~].each do |pattern|
|
11
|
-
note pattern
|
12
|
+
Interaction.note pattern
|
12
13
|
`find . -name #{pattern} -exec rm {} ';'`
|
13
14
|
end
|
14
15
|
end
|
@@ -14,11 +14,11 @@ def console(target = 'development', *_args)
|
|
14
14
|
if target == 'development'
|
15
15
|
invoke_cmd 'yarn_install'
|
16
16
|
|
17
|
-
announce 'Opening a local Rails console'
|
17
|
+
Interaction.announce 'Opening a local Rails console'
|
18
18
|
|
19
19
|
Util.system! Util.console_command(target)
|
20
20
|
else
|
21
|
-
announce 'Opening a Rails console on ' + target
|
21
|
+
Interaction.announce 'Opening a Rails console on ' + target
|
22
22
|
|
23
23
|
Geordi::Remote.new(target).console(options)
|
24
24
|
end
|
@@ -4,7 +4,7 @@ def create_database_yml
|
|
4
4
|
sample_yml = 'config/database.sample.yml'
|
5
5
|
|
6
6
|
if File.exist?(sample_yml) && !File.exist?(real_yml)
|
7
|
-
announce 'Creating ' + real_yml
|
7
|
+
Interaction.announce 'Creating ' + real_yml
|
8
8
|
|
9
9
|
sample = File.read(sample_yml)
|
10
10
|
adapter = sample.match(/adapter: (\w+)\n/).captures.first
|
@@ -15,6 +15,6 @@ def create_database_yml
|
|
15
15
|
real = sample.gsub(/password:.*$/, "password: #{db_password}")
|
16
16
|
File.open(real_yml, 'w') { |f| f.write(real) }
|
17
17
|
|
18
|
-
note "Created #{real_yml}."
|
18
|
+
Interaction.note "Created #{real_yml}."
|
19
19
|
end
|
20
20
|
end
|
@@ -56,7 +56,7 @@ def cucumber(*args)
|
|
56
56
|
|
57
57
|
# Serial run of @solo scenarios ############################################
|
58
58
|
if files.any? { |f| f.include? ':' }
|
59
|
-
note '@solo run skipped when called with line numbers' if options.verbose
|
59
|
+
Interaction.note '@solo run skipped when called with line numbers' if options.verbose
|
60
60
|
else
|
61
61
|
solo_files = if files.empty?
|
62
62
|
'features' # Proper grepping
|
@@ -70,14 +70,14 @@ def cucumber(*args)
|
|
70
70
|
solo_cmd_opts = cmd_opts.dup
|
71
71
|
solo_cmd_opts << '--tags' << '@solo'
|
72
72
|
|
73
|
-
announce 'Running @solo features'
|
73
|
+
Interaction.announce 'Running @solo features'
|
74
74
|
solo_success = Geordi::Cucumber.new.run files, solo_cmd_opts, verbose: options.verbose, parallel: false
|
75
|
-
solo_success ||
|
75
|
+
solo_success || Interaction.fail('Features failed.')
|
76
76
|
end
|
77
77
|
end
|
78
78
|
|
79
79
|
# Parallel run of all given features + reruns ##############################
|
80
|
-
announce 'Running features'
|
80
|
+
Interaction.announce 'Running features'
|
81
81
|
normal_run_successful = Geordi::Cucumber.new.run(files, cmd_opts, verbose: options.verbose)
|
82
82
|
|
83
83
|
unless normal_run_successful
|
@@ -85,16 +85,16 @@ def cucumber(*args)
|
|
85
85
|
|
86
86
|
# Reruns
|
87
87
|
(options.rerun + 1).times do |i|
|
88
|
-
|
88
|
+
Interaction.fail 'Features failed.' if i == options.rerun # All reruns done?
|
89
89
|
|
90
|
-
announce "Rerun ##{i + 1} of #{options.rerun}"
|
90
|
+
Interaction.announce "Rerun ##{i + 1} of #{options.rerun}"
|
91
91
|
break if Geordi::Cucumber.new.run([], cmd_opts, verbose: options.verbose, parallel: false)
|
92
92
|
end
|
93
93
|
end
|
94
94
|
|
95
|
-
success 'Features green.'
|
95
|
+
Interaction.success 'Features green.'
|
96
96
|
|
97
97
|
else
|
98
|
-
note 'Cucumber not employed.'
|
98
|
+
Interaction.note 'Cucumber not employed.'
|
99
99
|
end
|
100
100
|
end
|
@@ -20,24 +20,24 @@ def delete_dumps(dump_directory = nil)
|
|
20
20
|
else
|
21
21
|
[dump_directory]
|
22
22
|
end
|
23
|
-
announce 'Looking for *.dump in ' << dump_directories.join(',')
|
23
|
+
Interaction.announce 'Looking for *.dump in ' << dump_directories.join(',')
|
24
24
|
dump_directories.each do |d|
|
25
25
|
d_2 = File.expand_path(d)
|
26
26
|
unless File.directory? File.realdirpath(d_2)
|
27
|
-
warn "Directory #{d_2} does not exist"
|
27
|
+
Interaction.warn "Directory #{d_2} does not exist"
|
28
28
|
next
|
29
29
|
end
|
30
30
|
deletable_dumps.concat(Dir.glob("#{d_2}/**/*.dump"))
|
31
31
|
end
|
32
32
|
if deletable_dumps.empty?
|
33
|
-
success 'No dumps to delete' if deletable_dumps.empty?
|
33
|
+
Interaction.success 'No dumps to delete' if deletable_dumps.empty?
|
34
34
|
exit 0
|
35
35
|
end
|
36
36
|
deletable_dumps.uniq!.sort!
|
37
|
-
note 'The following dumps can be deleted:'
|
37
|
+
Interaction.note 'The following dumps can be deleted:'
|
38
38
|
puts
|
39
39
|
puts deletable_dumps
|
40
|
-
prompt('Delete those dumps', 'n', /y|yes/) || raise('Cancelled.')
|
40
|
+
Interaction.prompt('Delete those dumps', 'n', /y|yes/) || raise('Cancelled.')
|
41
41
|
deletable_dumps.each do |dump|
|
42
42
|
File.delete dump unless File.directory? dump
|
43
43
|
end
|
@@ -41,14 +41,14 @@ def deploy(target_stage = nil)
|
|
41
41
|
if target_stage && (Util.deploy_targets.exclude? target_stage)
|
42
42
|
# Target stage autocompletion from available stages
|
43
43
|
target_stage = Util.deploy_targets.find { |t| t.start_with? target_stage }
|
44
|
-
target_stage || warn('Given deployment stage not found')
|
44
|
+
target_stage || Interaction.warn('Given deployment stage not found')
|
45
45
|
end
|
46
46
|
|
47
47
|
# Ask for required information
|
48
|
-
target_stage ||= prompt 'Deployment stage:', branch_stage_map.fetch(Util.current_branch, 'staging')
|
48
|
+
target_stage ||= Interaction.prompt 'Deployment stage:', branch_stage_map.fetch(Util.current_branch, 'staging')
|
49
49
|
if options.current_branch
|
50
50
|
stage_file = "config/deploy/#{target_stage}.rb"
|
51
|
-
Util.file_containing?(stage_file, 'DEPLOY_BRANCH') ||
|
51
|
+
Util.file_containing?(stage_file, 'DEPLOY_BRANCH') || Interaction.fail(<<-ERROR)
|
52
52
|
To deploy from the current branch, configure #{stage_file} to respect the
|
53
53
|
environment variable DEPLOY_BRANCH. Example:
|
54
54
|
|
@@ -57,38 +57,38 @@ set :branch, ENV['DEPLOY_BRANCH'] || 'master'
|
|
57
57
|
|
58
58
|
source_branch = target_branch = Util.current_branch
|
59
59
|
else
|
60
|
-
source_branch = prompt 'Source branch:', Util.current_branch
|
61
|
-
target_branch = prompt 'Deploy branch:', branch_stage_map.invert.fetch(target_stage, 'master')
|
60
|
+
source_branch = Interaction.prompt 'Source branch:', Util.current_branch
|
61
|
+
target_branch = Interaction.prompt 'Deploy branch:', branch_stage_map.invert.fetch(target_stage, 'master')
|
62
62
|
end
|
63
63
|
|
64
64
|
merge_needed = (source_branch != target_branch)
|
65
65
|
push_needed = merge_needed || `git cherry -v | wc -l`.strip.to_i > 0
|
66
66
|
push_needed = false if Util.testing? # Hard to test
|
67
67
|
|
68
|
-
announce "Checking whether your #{source_branch} branch is ready" ############
|
68
|
+
Interaction.announce "Checking whether your #{source_branch} branch is ready" ############
|
69
69
|
Util.system! "git checkout #{source_branch}"
|
70
70
|
if (`git status -s | wc -l`.strip != '0') && !Util.testing?
|
71
|
-
warn "Your #{source_branch} branch holds uncommitted changes."
|
72
|
-
prompt('Continue anyway?', 'n', /y|yes/) || raise('Cancelled.')
|
71
|
+
Interaction.warn "Your #{source_branch} branch holds uncommitted changes."
|
72
|
+
Interaction.prompt('Continue anyway?', 'n', /y|yes/) || raise('Cancelled.')
|
73
73
|
else
|
74
|
-
note 'All good.'
|
74
|
+
Interaction.note 'All good.'
|
75
75
|
end
|
76
76
|
|
77
77
|
if merge_needed
|
78
|
-
announce "Checking what's in your #{target_branch} branch right now" #######
|
78
|
+
Interaction.announce "Checking what's in your #{target_branch} branch right now" #######
|
79
79
|
Util.system! "git checkout #{target_branch} && git pull"
|
80
80
|
end
|
81
81
|
|
82
|
-
announce 'You are about to:' #################################################
|
83
|
-
note "Merge branch #{source_branch} into #{target_branch}" if merge_needed
|
82
|
+
Interaction.announce 'You are about to:' #################################################
|
83
|
+
Interaction.note "Merge branch #{source_branch} into #{target_branch}" if merge_needed
|
84
84
|
if push_needed
|
85
|
-
note 'Push these commits:' if push_needed
|
85
|
+
Interaction.note 'Push these commits:' if push_needed
|
86
86
|
Util.system! "git --no-pager log origin/#{target_branch}..#{source_branch} --oneline"
|
87
87
|
end
|
88
|
-
note "Deploy to #{target_stage}"
|
89
|
-
note "From current branch #{source_branch}" if options.current_branch
|
88
|
+
Interaction.note "Deploy to #{target_stage}"
|
89
|
+
Interaction.note "From current branch #{source_branch}" if options.current_branch
|
90
90
|
|
91
|
-
if prompt('Go ahead with the deployment?', 'n', /y|yes/)
|
91
|
+
if Interaction.prompt('Go ahead with the deployment?', 'n', /y|yes/)
|
92
92
|
puts
|
93
93
|
git_call = []
|
94
94
|
git_call << "git merge #{source_branch}" if merge_needed
|
@@ -107,9 +107,9 @@ set :branch, ENV['DEPLOY_BRANCH'] || 'master'
|
|
107
107
|
|
108
108
|
Util.system! capistrano_call, show_cmd: true
|
109
109
|
|
110
|
-
success 'Deployment complete.'
|
110
|
+
Interaction.success 'Deployment complete.'
|
111
111
|
else
|
112
112
|
Util.system! "git checkout #{source_branch}"
|
113
|
-
|
113
|
+
Interaction.fail 'Deployment cancelled.'
|
114
114
|
end
|
115
115
|
end
|
@@ -28,7 +28,7 @@ option :mysql, banner: 'PORT_OR_SOCKET',
|
|
28
28
|
|
29
29
|
def drop_databases
|
30
30
|
require 'geordi/db_cleaner'
|
31
|
-
|
31
|
+
Interaction.fail '-P and -M are mutually exclusive' if options.postgres_only && options.mysql_only
|
32
32
|
mysql_flags = nil
|
33
33
|
postgres_flags = nil
|
34
34
|
|
@@ -38,7 +38,7 @@ def drop_databases
|
|
38
38
|
mysql_flags = "--port=#{mysql_port} --protocol=TCP"
|
39
39
|
rescue AttributeError
|
40
40
|
unless File.exist? options.mysql
|
41
|
-
|
41
|
+
Interaction.fail "Path #{options.mysql} is not a valid MySQL socket"
|
42
42
|
end
|
43
43
|
mysql_flags = "--socket=#{options.mysql}"
|
44
44
|
end
|
@@ -54,5 +54,5 @@ def drop_databases
|
|
54
54
|
cleaner.clean_mysql unless options.postgres_only
|
55
55
|
cleaner.clean_postgres unless options.mysql_only
|
56
56
|
|
57
|
-
success 'Done.'
|
57
|
+
Interaction.success 'Done.'
|
58
58
|
end
|
data/lib/geordi/commands/dump.rb
CHANGED
@@ -30,33 +30,33 @@ def dump(target = nil, *_args)
|
|
30
30
|
if target.nil?
|
31
31
|
if options.load
|
32
32
|
# validate load option
|
33
|
-
|
33
|
+
Interaction.fail 'Missing a dump file.' if options.load == 'load'
|
34
34
|
File.exist?(options.load) || raise('Could not find the given dump file: ' + options.load)
|
35
35
|
|
36
36
|
loader = DumpLoader.new(options.load)
|
37
37
|
|
38
|
-
announce "Sourcing dump into the #{loader.config['database']} db"
|
38
|
+
Interaction.announce "Sourcing dump into the #{loader.config['database']} db"
|
39
39
|
loader.load
|
40
40
|
|
41
|
-
success "Your #{loader.config['database']} database has now the data of #{options.load}."
|
41
|
+
Interaction.success "Your #{loader.config['database']} database has now the data of #{options.load}."
|
42
42
|
|
43
43
|
else
|
44
|
-
announce 'Dumping the development database'
|
44
|
+
Interaction.announce 'Dumping the development database'
|
45
45
|
Util.system! 'dumple development'
|
46
|
-
success 'Successfully dumped the development database.'
|
46
|
+
Interaction.success 'Successfully dumped the development database.'
|
47
47
|
end
|
48
48
|
|
49
49
|
else
|
50
|
-
announce 'Dumping the database of ' + target
|
50
|
+
Interaction.announce 'Dumping the database of ' + target
|
51
51
|
dump_path = Geordi::Remote.new(target).dump(options)
|
52
52
|
|
53
53
|
if options.load
|
54
54
|
loader = DumpLoader.new(dump_path)
|
55
55
|
|
56
|
-
announce "Sourcing dump into the #{loader.config['database']} db"
|
56
|
+
Interaction.announce "Sourcing dump into the #{loader.config['database']} db"
|
57
57
|
loader.load
|
58
58
|
|
59
|
-
success "Your #{loader.config['database']} database has now the data of #{target}."
|
59
|
+
Interaction.success "Your #{loader.config['database']} database has now the data of #{target}."
|
60
60
|
end
|
61
61
|
end
|
62
62
|
end
|
@@ -15,7 +15,7 @@ option :setup, banner: 'FIREFOX_VERSION',
|
|
15
15
|
|
16
16
|
def firefox(*command)
|
17
17
|
if options.setup
|
18
|
-
|
18
|
+
Interaction.fail 'Firefox version required (e.g. --setup 24.0)' if options.setup == 'setup'
|
19
19
|
|
20
20
|
require 'geordi/firefox_for_selenium'
|
21
21
|
Geordi::FirefoxForSelenium.install(options.setup)
|
@@ -27,7 +27,7 @@ def firefox(*command)
|
|
27
27
|
FirefoxForSelenium.setup_firefox
|
28
28
|
|
29
29
|
puts
|
30
|
-
note_cmd command.join(' ')
|
30
|
+
Interaction.note_cmd command.join(' ')
|
31
31
|
system *command # Util.system! would reset the Firefox PATH
|
32
32
|
end
|
33
33
|
end
|
@@ -10,11 +10,11 @@ LONGDESC
|
|
10
10
|
def migrate
|
11
11
|
invoke_cmd 'bundle_install'
|
12
12
|
invoke_cmd 'yarn_install'
|
13
|
-
announce 'Migrating'
|
13
|
+
Interaction.announce 'Migrating'
|
14
14
|
|
15
15
|
if File.directory?('db/migrate')
|
16
16
|
if Util.file_containing?('Gemfile', /parallel_tests/)
|
17
|
-
note 'Development and parallel test databases'
|
17
|
+
Interaction.note 'Development and parallel test databases'
|
18
18
|
puts
|
19
19
|
|
20
20
|
Util.system! 'bundle exec rake db:migrate parallel:prepare'
|
@@ -22,6 +22,6 @@ def migrate
|
|
22
22
|
invoke_cmd 'rake', 'db:migrate'
|
23
23
|
end
|
24
24
|
else
|
25
|
-
note 'No migrations directory found.'
|
25
|
+
Interaction.note 'No migrations directory found.'
|
26
26
|
end
|
27
27
|
end
|
@@ -10,10 +10,10 @@ LONGDESC
|
|
10
10
|
def png_optimize(path)
|
11
11
|
require 'fileutils'
|
12
12
|
|
13
|
-
announce 'Optimizing .png files'
|
13
|
+
Interaction.announce 'Optimizing .png files'
|
14
14
|
|
15
15
|
if `which pngcrush`.strip.empty?
|
16
|
-
|
16
|
+
Interaction.fail 'Please install pngcrush first (sudo apt-get install pngcrush)'
|
17
17
|
end
|
18
18
|
|
19
19
|
po = PngOptimizer.new
|
@@ -22,10 +22,10 @@ def png_optimize(path)
|
|
22
22
|
elsif File.file?(path)
|
23
23
|
po.optimize_inplace(path)
|
24
24
|
else
|
25
|
-
|
25
|
+
Interaction.fail 'Neither directory nor file: ' + path
|
26
26
|
end
|
27
27
|
|
28
|
-
success 'PNG optimization completed.'
|
28
|
+
Interaction.success 'PNG optimization completed.'
|
29
29
|
end
|
30
30
|
|
31
31
|
class PngOptimizer
|
@@ -64,7 +64,7 @@ class PngOptimizer
|
|
64
64
|
FileUtils.rm(input_file)
|
65
65
|
FileUtils.mv(temp_file.to_s, input_file.to_s)
|
66
66
|
else
|
67
|
-
|
67
|
+
Interaction.fail 'Error:' + $?
|
68
68
|
end
|
69
69
|
end
|
70
70
|
|
data/lib/geordi/commands/rake.rb
CHANGED
@@ -13,7 +13,7 @@ def rake(*args)
|
|
13
13
|
%w[development test cucumber].each do |env| # update long_desc when changing this
|
14
14
|
if File.exist? "config/environments/#{env}.rb"
|
15
15
|
call = %w[bundle exec rake] + args + ["RAILS_ENV=#{env}"]
|
16
|
-
note_cmd call.join(' ')
|
16
|
+
Interaction.note_cmd call.join(' ')
|
17
17
|
|
18
18
|
Util.system! *call
|
19
19
|
end
|
@@ -1,13 +1,13 @@
|
|
1
1
|
desc 'remove-executable-flags', 'Remove executable-flags from files that should not be executable'
|
2
2
|
def remove_executable_flags
|
3
|
-
announce 'Removing executable-flags'
|
3
|
+
Interaction.announce 'Removing executable-flags'
|
4
4
|
|
5
5
|
patterns = %w[
|
6
6
|
*.rb *.html *.erb *.haml *.yml *.css *.sass *.rake *.png *.jpg
|
7
7
|
*.gif *.pdf *.txt *.rdoc *.feature Rakefile VERSION README Capfile
|
8
8
|
]
|
9
9
|
patterns.each do |pattern|
|
10
|
-
note pattern
|
10
|
+
Interaction.note pattern
|
11
11
|
`find . -name "#{pattern}" -exec chmod -x {} ';'`
|
12
12
|
end
|
13
13
|
puts 'Done.'
|