geordi 4.0.0 → 4.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +5 -0
  3. data/CHANGELOG.md +59 -0
  4. data/Gemfile +2 -1
  5. data/Gemfile.lock +46 -28
  6. data/README.md +29 -6
  7. data/Rakefile +1 -1
  8. data/exe/dumple +19 -4
  9. data/geordi.gemspec +3 -3
  10. data/lib/geordi/COMMAND_TEMPLATE +1 -1
  11. data/lib/geordi/chromedriver_updater.rb +2 -2
  12. data/lib/geordi/cli.rb +1 -1
  13. data/lib/geordi/commands/bundle_install.rb +1 -1
  14. data/lib/geordi/commands/capistrano.rb +1 -1
  15. data/lib/geordi/commands/chromedriver_update.rb +8 -1
  16. data/lib/geordi/commands/console.rb +4 -3
  17. data/lib/geordi/commands/create_database_yml.rb +1 -1
  18. data/lib/geordi/commands/create_databases.rb +7 -6
  19. data/lib/geordi/commands/cucumber.rb +9 -4
  20. data/lib/geordi/commands/deploy.rb +7 -7
  21. data/lib/geordi/commands/dump.rb +14 -4
  22. data/lib/geordi/commands/firefox.rb +1 -1
  23. data/lib/geordi/commands/migrate.rb +4 -4
  24. data/lib/geordi/commands/rake.rb +6 -4
  25. data/lib/geordi/commands/rspec.rb +5 -5
  26. data/lib/geordi/commands/security_update.rb +10 -10
  27. data/lib/geordi/commands/server.rb +3 -3
  28. data/lib/geordi/commands/setup.rb +5 -5
  29. data/lib/geordi/commands/shell.rb +1 -1
  30. data/lib/geordi/commands/tests.rb +4 -4
  31. data/lib/geordi/commands/unit.rb +3 -3
  32. data/lib/geordi/commands/update.rb +4 -4
  33. data/lib/geordi/commands/vnc.rb +1 -1
  34. data/lib/geordi/commands/with_rake.rb +3 -3
  35. data/lib/geordi/commands/yarn_install.rb +1 -1
  36. data/lib/geordi/cucumber.rb +2 -2
  37. data/lib/geordi/dump_loader.rb +1 -1
  38. data/lib/geordi/gitpt.rb +1 -1
  39. data/lib/geordi/interaction.rb +1 -1
  40. data/lib/geordi/remote.rb +5 -4
  41. data/lib/geordi/settings.rb +11 -2
  42. data/lib/geordi/util.rb +33 -21
  43. data/lib/geordi/version.rb +1 -1
  44. metadata +4 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a5ef220369795b8dc7615505cffc05a91776cf91a46580916ab30abd7902262a
4
- data.tar.gz: e030a912bd16d9e805081cf4ce3669260223a0198ea1f1d0dfaf8e7c10b75b7f
3
+ metadata.gz: 143cfb8cfd0cc7fb52b39eb7a41d22fb1af259f78f817fa55742cec61271b117
4
+ data.tar.gz: 2bde738375417d40af0545c582c290c85a67cff890679fe58521054eb9f80d67
5
5
  SHA512:
6
- metadata.gz: 49df1e803163f9d602f663d29da0f0036214a5ccb571727cbd02b9951094e4aa72fa7bf2654ceae3b7af47ace8286e6c26b94933277377a1ef5b5f21d7fe6ff5
7
- data.tar.gz: 6cf4fafbb0e8f8c311279d61f3ea090ee9bb44589bb9f8566ab0796b26514862d52e89f93e9f5686aa63c8350951fb147c7a967ed2270ff29bb77cb07277da2d
6
+ metadata.gz: 418c1c83487f4b807346a576fa3a9ee08e890c01075df6937e47bc2669cbe4031829c4a9d797223e747ed93ba209e5f689eab0fc8c722c1bb8067fd5c25af538
7
+ data.tar.gz: 5a979db241a56d199d496becb9a2966dbb92adfe90125a6d026b0b323f3b24111810876aaf2bc70b2d111450412230b9f00be4939dd7548bae7c311d36fe96b2
@@ -8,12 +8,17 @@ rvm:
8
8
  - '2.4.10'
9
9
  - '2.5.8'
10
10
  - '2.6.6'
11
+ - '2.7.1'
11
12
 
12
13
  gemfile:
13
14
  - 'Gemfile'
14
15
 
15
16
  dist: trusty
16
17
 
18
+ before_install:
19
+ - sudo apt-get install -y vnc4server
20
+ # Fake required password for vncserver
21
+ - mkdir ~/.vnc && touch ~/.vnc/passwd && chmod 700 ~/.vnc/passwd
17
22
  install:
18
23
  - gem install bundler:1.17.3
19
24
  # Replace default Travis CI bundler script with a version that doesn't
@@ -5,10 +5,68 @@ All notable changes to this project will be documented in this file.
5
5
  This project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
6
6
 
7
7
  ## Unreleased
8
+
8
9
  ### Compatible changes
9
10
  ### Breaking changes
10
11
 
11
12
 
13
+ ## 4.2.0 2020-10-02
14
+
15
+ ### Compatible changes
16
+ * Add `auto_update_chromedriver` as global setting option to automatically update chromedriver before cucumber
17
+ tests, if Chrome and chromedriver versions don't match.
18
+ * Dump command: Add support for multiple databases (#103 by @kajatiger)
19
+ * Add Ruby 2.7 to list of supported Ruby versions
20
+ * Fix #115: `geordi cucumber --modified` command, that corrupted filenames like:
21
+ ```
22
+ No such file or directory tures/pages.feature
23
+ ```
24
+ * Avoid writing an instance of HighLine::String to Geordi config files (closes #114)
25
+
26
+
27
+ ## 4.1.1 2020-08-28
28
+ ### Compatible changes
29
+
30
+ * Fixed: System calls are not executed properly if no bin stub is present. This resulted in errors like:
31
+
32
+ ```
33
+ % geordi rspec
34
+
35
+ # Running specs
36
+ > All specs at once (using parallel_tests)
37
+
38
+ x Specs failed.
39
+ ```
40
+
41
+ or
42
+
43
+ ```
44
+ % geordi migrate
45
+
46
+ # Migrating
47
+ > Development and parallel test databases
48
+
49
+ x Something went wrong.
50
+ ```
51
+
52
+
53
+ ## 4.1.0 2020-08-18
54
+
55
+ ### Compatible changes
56
+
57
+ - Added dumple option `--compress` to compress after dumping
58
+
59
+ ## 4.0.1 2020-08-11
60
+
61
+ ### Compatible changes
62
+
63
+ - Fix `geordi migrate` command, that fails with:
64
+
65
+ ```
66
+ Don't know how to build task 'db:migrate parallel:prepare'
67
+ ```
68
+
69
+
12
70
  ## 4.0.0 2020-07-30
13
71
 
14
72
  ### Compatible changes
@@ -18,6 +76,7 @@ This project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html
18
76
  ### Breaking changes
19
77
  - Removed deprecated executables
20
78
  - Removed `eurest` command
79
+ - Respect binstubs if available, otherwise fallback to geordi's previous behaviour. Note that this might cause failures, when your binstubs are not working. Please have a look at #109 for how a failure might look like and how you can fix it.
21
80
 
22
81
 
23
82
  ## 3.2.0 2020-07-15
data/Gemfile CHANGED
@@ -3,7 +3,8 @@ source 'http://rubygems.org'
3
3
  # Specify your gem's dependencies in geordi.gemspec
4
4
  gemspec
5
5
 
6
- gem 'aruba'
6
+ gem 'aruba', '< 1' # Drops support for Ruby 2.2-
7
+ gem 'rake', '< 13' # Drops support for Ruby 2.1
7
8
  gem 'rspec-mocks'
8
9
  gem 'highline'
9
10
  gem 'parallel_tests'
@@ -1,76 +1,93 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- geordi (4.0.0)
4
+ geordi (4.2.1)
5
5
  thor (~> 1)
6
6
 
7
7
  GEM
8
8
  remote: http://rubygems.org/
9
9
  specs:
10
- addressable (2.3.8)
11
- aruba (0.6.2)
12
- childprocess (>= 0.3.6)
13
- cucumber (>= 1.1.1)
14
- rspec-expectations (>= 2.7.0)
10
+ addressable (2.7.0)
11
+ public_suffix (>= 2.0.2, < 5.0)
12
+ aruba (0.14.14)
13
+ childprocess (>= 0.6.3, < 4.0.0)
14
+ contracts (~> 0.9)
15
+ cucumber (>= 1.3.19)
16
+ ffi (~> 1.9)
17
+ rspec-expectations (>= 2.99)
18
+ thor (>= 0.19, < 2.0)
15
19
  axiom-types (0.1.1)
16
20
  descendants_tracker (~> 0.0.4)
17
21
  ice_nine (~> 0.11.0)
18
22
  thread_safe (~> 0.3, >= 0.3.1)
19
- builder (3.2.3)
23
+ backports (3.18.2)
24
+ builder (3.2.4)
20
25
  childprocess (1.0.1)
21
26
  rake (< 13.0)
22
- coderay (1.1.2)
27
+ coderay (1.1.3)
23
28
  coercible (1.0.0)
24
29
  descendants_tracker (~> 0.0.1)
25
- cucumber (1.3.20)
30
+ contracts (0.16.0)
31
+ cucumber (3.0.0)
26
32
  builder (>= 2.1.2)
27
- diff-lcs (>= 1.1.3)
28
- gherkin (~> 2.12)
33
+ cucumber-core (~> 3.0.0)
34
+ cucumber-expressions (~> 4.0.3)
35
+ cucumber-wire (~> 0.0.1)
36
+ diff-lcs (~> 1.3)
37
+ gherkin (~> 4.0)
29
38
  multi_json (>= 1.7.5, < 2.0)
30
39
  multi_test (>= 0.1.2)
40
+ cucumber-core (3.0.0)
41
+ backports (>= 3.8.0)
42
+ cucumber-tag_expressions (>= 1.0.1)
43
+ gherkin (>= 4.1.3)
44
+ cucumber-expressions (4.0.4)
45
+ cucumber-tag_expressions (2.0.2)
46
+ cucumber-wire (0.0.1)
31
47
  declarative (0.0.10)
32
48
  declarative-option (0.1.0)
33
49
  descendants_tracker (0.0.4)
34
50
  thread_safe (~> 0.3, >= 0.3.1)
35
- diff-lcs (1.2.5)
51
+ diff-lcs (1.4.4)
36
52
  equalizer (0.0.11)
37
- excon (0.73.0)
53
+ excon (0.76.0)
38
54
  faraday (0.17.3)
39
55
  multipart-post (>= 1.2, < 3)
40
56
  faraday_middleware (0.14.0)
41
57
  faraday (>= 0.7.4, < 1.0)
42
- gherkin (2.12.2)
43
- multi_json (~> 1.3)
44
- highline (1.6.21)
58
+ ffi (1.12.2)
59
+ gherkin (4.1.3)
60
+ highline (2.0.3)
45
61
  ice_nine (0.11.2)
46
62
  launchy (2.4.3)
47
63
  addressable (~> 2.3)
48
64
  method_source (1.0.0)
49
- mimemagic (0.3.4)
50
- multi_json (1.13.1)
65
+ mimemagic (0.3.5)
66
+ multi_json (1.15.0)
51
67
  multi_test (0.1.2)
52
68
  multipart-post (2.1.1)
53
- parallel (0.5.16)
54
- parallel_tests (0.6.18)
69
+ parallel (1.13.0)
70
+ parallel_tests (2.23.0)
55
71
  parallel
56
72
  pry (0.13.1)
57
73
  coderay (~> 1.1)
58
74
  method_source (~> 1.0)
59
- rake (10.5.0)
75
+ public_suffix (2.0.5)
76
+ rake (12.3.3)
60
77
  representable (3.0.4)
61
78
  declarative (< 0.1.0)
62
79
  declarative-option (< 0.2.0)
63
80
  uber (< 0.2.0)
64
- rspec-expectations (3.4.0)
81
+ rspec-expectations (3.9.2)
65
82
  diff-lcs (>= 1.2.0, < 2.0)
66
- rspec-support (~> 3.4.0)
67
- rspec-mocks (3.4.1)
83
+ rspec-support (~> 3.9.0)
84
+ rspec-mocks (3.9.1)
68
85
  diff-lcs (>= 1.2.0, < 2.0)
69
- rspec-support (~> 3.4.0)
70
- rspec-support (3.4.1)
86
+ rspec-support (~> 3.9.0)
87
+ rspec-support (3.9.3)
71
88
  thor (1.0.1)
72
89
  thread_safe (0.3.6)
73
- tracker_api (1.10.0)
90
+ tracker_api (1.11.0)
74
91
  addressable
75
92
  equalizer
76
93
  excon
@@ -91,12 +108,13 @@ PLATFORMS
91
108
  ruby
92
109
 
93
110
  DEPENDENCIES
94
- aruba
111
+ aruba (< 1)
95
112
  geordi!
96
113
  highline
97
114
  launchy
98
115
  parallel_tests
99
116
  pry
117
+ rake (< 13)
100
118
  rspec-mocks
101
119
  tracker_api
102
120
 
data/README.md CHANGED
@@ -39,6 +39,13 @@ Example: `geordi chromedriver_update`
39
39
  This command will find and install the matching chromedriver for the currently
40
40
  installed Chrome.
41
41
 
42
+ Setting `auto_update_chromedriver` to `true` in your global Geordi config file
43
+ (`~/.config/geordi/global.yml`), will automatically update chromedriver before
44
+ cucumber tests, in case Chrome and chromedriver versions don't match
45
+
46
+ **Options**
47
+ - `[--quiet-if-matching], [--no-quiet-if-matching]`: Suppress notification if chromedriver and chrome versions match
48
+
42
49
 
43
50
  ### `geordi clean`
44
51
  Remove unneeded files from the current directory.
@@ -169,10 +176,18 @@ offer to edit the whitelist instead.
169
176
  - `[--postgres=PORT_OR_SOCKET]`: Use Postgres port or socket
170
177
  - `[--mysql=PORT_OR_SOCKET]`: Use MySQL/MariaDB port or socket
171
178
 
172
-
173
179
  ### `geordi dump [TARGET]`
174
180
  Handle (remote) database dumps.
175
181
 
182
+ If you are using multiple databases per environment, pass the database name like this:
183
+
184
+ geordi dump -d primary
185
+
186
+ Loading a dump into one of multiple local databases is not supported yet.
187
+
188
+ When called with the `--load` option, sources the specified dump into the
189
+ development database.
190
+
176
191
  `geordi dump` (without arguments) dumps the development database with `dumple`.
177
192
 
178
193
  `geordi dump -l tmp/staging.dump` (with the `--load` option) sources the
@@ -382,10 +397,18 @@ browser, as opposed to opening it within the VNC window.
382
397
  Contributing
383
398
  ============
384
399
 
385
- * Run the tests for the oldest supported ruby version with `bundle exec rake`. Ensure that all other ruby versions in the `travis.yml` pass as well after pushing your feature branch and triggering the travis build.
386
- * Update this `README`. The whole `geordi` section is auto-generated from command
387
- descriptions when running `rake readme`.
388
- * Document your changes in the `CHANGELOG.md` file.
400
+ When making changes to Geordi, please make sure your code is tested. Not all,
401
+ but most features of Geordi can be tested. See other tests for inspiration.
402
+
403
+ Once you have completed your modifications, please update CHANGELOG and README
404
+ as needed. Use `rake readme` to regenerate the Geordi section of the README from
405
+ the command documentations.
406
+
407
+ Make sure tests are green in the default Ruby *plus* in the oldest Ruby > 1.8
408
+ that you have installed on your system (1.8.7 support has been dropped).
409
+
410
+ Before releasing your changes, wait for the Travis results to see that tests
411
+ passed in all Ruby versions.
389
412
 
390
413
 
391
414
  Adding a new command
@@ -399,7 +422,7 @@ To try Geordi locally, call it like this:
399
422
 
400
423
  # -I means "add the following directory to load path"
401
424
  ruby -Ilib exe/geordi
402
-
425
+
403
426
  # From another directory
404
427
  ruby -I ../geordi/lib ../geordi/exe/geordi
405
428
 
data/Rakefile CHANGED
@@ -5,7 +5,7 @@ desc 'Default: Run all tests'
5
5
  task default: :features
6
6
 
7
7
  task :features do
8
- system 'bundle exec cucumber'
8
+ exec 'bundle exec cucumber'
9
9
  end
10
10
 
11
11
  task :readme do
data/exe/dumple CHANGED
@@ -3,6 +3,7 @@
3
3
  require 'erb'
4
4
 
5
5
  fail_gently = ARGV.include?("--fail-gently")
6
+ compress = ARGV.include?("--compress")
6
7
 
7
8
  if ARGV.include?("-i")
8
9
  puts "*******************************************************"
@@ -44,9 +45,13 @@ begin
44
45
  end
45
46
 
46
47
  config = YAML::load(ERB.new(File.read(config_path)).result)
48
+ environment, database = ARGV.reject{ |arg| arg[0].chr == '-' }
49
+ environment ||= 'production'
50
+ config = config[environment] or raise "No #{environment} database found.\nUsage: dumple ENVIRONMENT [DATABASE]"
47
51
 
48
- environment = ARGV.reject{ |arg| arg[0].chr == '-' }.first || 'production'
49
- config = config[environment] or raise "No #{environment} database found.\nUsage: dumple ENVIRONMENT"
52
+ if database
53
+ config = config[database] or raise %(Unknown #{environment} database "#{database}")
54
+ end
50
55
 
51
56
  dump_dir = "#{ENV['HOME']}/dumps"
52
57
  unless File.directory?(dump_dir)
@@ -60,7 +65,8 @@ begin
60
65
  dump_path = "#{dump_dir}/#{config['database']}_#{Time.now.strftime("%Y%m%d_%H%M%S")}.dump"
61
66
  end
62
67
 
63
- puts "> Dumping database for \"#{environment}\" environment ..."
68
+ given_database = database ? %(#{database} ) : ""
69
+ puts "> Dumping #{given_database}database for \"#{environment}\" environment ..."
64
70
 
65
71
  host = config['host']
66
72
  port = config['port']
@@ -89,13 +95,22 @@ begin
89
95
  command << " --port=#{port}" if port
90
96
  command
91
97
  else
92
- raise "Adapter \"#{config['adapter']} is not supported"
98
+ raise "Adapter \"#{config['adapter']}\" is not supported"
93
99
  end
94
100
  success = system(dump_command)
95
101
  success or raise "Creating the dump failed"
96
102
 
97
103
  system "chmod 600 #{dump_path}"
98
104
 
105
+ if compress
106
+ puts "> Compressing the dump ..."
107
+
108
+ # gzip compresses in place
109
+ compress_success = system("gzip #{dump_path}")
110
+ compress_success or raise "Compressing the dump failed"
111
+ dump_path << ".gz"
112
+ end
113
+
99
114
  dump_size_kb = (File.size(dump_path) / 1024).round
100
115
 
101
116
  puts "> Dumped to #{dump_path} (#{dump_size_kb} KB)"
@@ -11,13 +11,13 @@ Gem::Specification.new do |spec|
11
11
 
12
12
  spec.summary = 'Collection of command line tools we use in our daily work with Ruby, Rails and Linux at makandra.'
13
13
  spec.description = 'Collection of command line tools we use in our daily work with Ruby, Rails and Linux at makandra.'
14
- spec.homepage = 'http://makandra.com'
14
+ spec.homepage = 'https://makandra.com'
15
15
  spec.license = 'MIT'
16
16
 
17
17
  # Specify which files should be added to the gem when it is released.
18
18
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
19
19
  spec.files = Dir.chdir(File.expand_path(__dir__)) do
20
- `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
20
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(spec|features)/}) }
21
21
  end
22
22
  spec.bindir = 'exe'
23
23
  spec.executables = spec.files.grep(%r(^exe/)) { |f| File.basename(f) }
@@ -27,6 +27,6 @@ Gem::Specification.new do |spec|
27
27
 
28
28
  spec.post_install_message = <<-ATTENTION
29
29
  * Binary `geordi` installed
30
- * Geordi 4.0.0 has removed its deprecated executables. If you want to invoke these commands like before, you may create aliases on your machine. For the alias mapping, please refer to https://github.com/makandra/geordi/commit/68fa92acb146ebde3acb92d7b9556bd4eaa2b4ff
30
+ * Geordi 4 has removed its deprecated executables. If you want to invoke these commands like before, you may create aliases on your machine. For the alias mapping, please refer to https://github.com/makandra/geordi/commit/68fa92acb146ebde3acb92d7b9556bd4eaa2b4ff
31
31
  ATTENTION
32
32
  end
@@ -21,7 +21,7 @@ option :opt, type: :boolean, aliases: '-o', banner: 'VALUE_NAME', desc: 'If set,
21
21
 
22
22
  def example
23
23
  # Invoke other commands like this:
24
- invoke_cmd 'other_command', 'argument', an: 'option'
24
+ invoke_geordi 'other_command', 'argument', an: 'option'
25
25
 
26
26
  Interaction.fail 'Option missing' unless options.opt?
27
27
 
@@ -5,12 +5,12 @@ require 'tempfile'
5
5
  module Geordi
6
6
  class ChromedriverUpdater
7
7
 
8
- def run
8
+ def run(options)
9
9
  chrome_version = determine_chrome_version
10
10
  chromedriver_version = determine_chromedriver_version
11
11
 
12
12
  if skip_update?(chrome_version, chromedriver_version)
13
- Interaction.warn("No update required, you are using for both executables the same version #{chrome_version}!")
13
+ Interaction.note("No update required, you are using for both executables the same version #{chrome_version}!") unless options[:quiet_if_matching]
14
14
  else
15
15
  chromedriver_zip = download_chromedriver(chrome_version)
16
16
  unzip(chromedriver_zip, File.expand_path('~/bin'))
@@ -18,7 +18,7 @@ module Geordi
18
18
  private
19
19
 
20
20
  # fix weird implementation of #invoke
21
- def invoke_cmd(name, *args)
21
+ def invoke_geordi(name, *args)
22
22
  options = args.last.is_a?(Hash) ? args.pop : {}
23
23
  invoke(name, args, options)
24
24
  end
@@ -2,6 +2,6 @@ desc 'bundle-install', 'Run bundle install if required', hide: true
2
2
  def bundle_install
3
3
  if File.exist?('Gemfile') && !system('bundle check > /dev/null 2>&1')
4
4
  Interaction.announce 'Bundling'
5
- Util.system! 'bundle install'
5
+ Util.run!('bundle install')
6
6
  end
7
7
  end
@@ -17,6 +17,6 @@ def capistrano(*args)
17
17
  command = "bundle exec cap #{stage} " + args.join(' ')
18
18
  Interaction.note_cmd command
19
19
 
20
- Util.system!(command, fail_message: 'Capistrano failed. Have a look!')
20
+ Util.run!(command, fail_message: 'Capistrano failed. Have a look!')
21
21
  end
22
22
  end
@@ -4,10 +4,17 @@ Example: `geordi chromedriver_update`
4
4
 
5
5
  This command will find and install the matching chromedriver for the currently
6
6
  installed Chrome.
7
+
8
+ Setting `auto_update_chromedriver` to `true` in your global Geordi config file
9
+ (`~/.config/geordi/global.yml`), will automatically update chromedriver before
10
+ cucumber tests, in case Chrome and chromedriver versions don't match
7
11
  LONGDESC
8
12
 
13
+ option :quiet_if_matching, type: :boolean, default: false,
14
+ desc: 'Suppress notification if chromedriver and chrome versions match'
15
+
9
16
  def chromedriver_update
10
17
  require 'geordi/chromedriver_updater'
11
18
 
12
- ChromedriverUpdater.new.run
19
+ ChromedriverUpdater.new.run(options)
13
20
  end
@@ -14,14 +14,15 @@ option :select_server, type: :string, aliases: '-s', banner: '[SERVER_NUMBER]',
14
14
 
15
15
  def console(target = 'development', *_args)
16
16
  require 'geordi/remote'
17
- invoke_cmd 'bundle_install'
17
+ invoke_geordi 'bundle_install'
18
18
 
19
19
  if target == 'development'
20
- invoke_cmd 'yarn_install'
20
+ invoke_geordi 'yarn_install'
21
21
 
22
22
  Interaction.announce 'Opening a local Rails console'
23
23
 
24
- Util.system! Util.console_command(target)
24
+ command = Util.console_command(target)
25
+ Util.run!(command)
25
26
  else
26
27
  Interaction.announce 'Opening a Rails console on ' + target
27
28
 
@@ -7,7 +7,7 @@ def create_database_yml
7
7
  Interaction.announce 'Creating ' + real_yml
8
8
 
9
9
  sample = File.read(sample_yml)
10
- adapter = sample.match(/adapter: (\w+)\n/).captures.first
10
+ adapter = sample.match(/adapter: (\w+)/).captures.first
11
11
 
12
12
  print "Please enter your #{adapter} password: "
13
13
  db_password = STDIN.gets.strip
@@ -1,16 +1,17 @@
1
1
  desc 'create-databases', 'Create all databases', hide: true
2
2
  def create_databases
3
- invoke_cmd 'create_database_yml'
4
- invoke_cmd 'bundle_install'
3
+ invoke_geordi 'create_database_yml'
4
+ invoke_geordi 'bundle_install'
5
5
 
6
6
  Interaction.announce 'Creating databases'
7
7
 
8
8
  if File.exist?('config/database.yml')
9
- command = Util.binstub 'rake'
10
- command << ' db:create:all'
11
- command << ' parallel:create' if Util.file_containing?('Gemfile', /parallel_tests/)
9
+ command = []
10
+ command << Util.binstub_or_fallback('rake')
11
+ command << 'db:create:all'
12
+ command << 'parallel:create' if Util.file_containing?('Gemfile', /parallel_tests/)
12
13
 
13
- Util.system! command
14
+ Util.run!(command)
14
15
  else
15
16
  puts 'config/database.yml does not exist. Nothing to do.'
16
17
  end
@@ -37,7 +37,7 @@ def cucumber(*args)
37
37
  if args.empty?
38
38
  # This is not testable as there is no way to stub `git` :(
39
39
  if options.modified?
40
- modified_features = `git status --short`.split($INPUT_RECORD_SEPARATOR).map do |line|
40
+ modified_features = `git status --short`.split("\n").map do |line|
41
41
  indicators = line.slice!(0..2) # Remove leading indicators
42
42
  line if line.include?('.feature') && !indicators.include?('D')
43
43
  end.compact
@@ -45,7 +45,7 @@ def cucumber(*args)
45
45
  end
46
46
 
47
47
  if options.containing
48
- matching_features = `grep -lri '#{options.containing}' --include=*.feature features/`.split($INPUT_RECORD_SEPARATOR)
48
+ matching_features = `grep -lri '#{options.containing}' --include=*.feature features/`.split("\n")
49
49
  args = matching_features.uniq
50
50
  end
51
51
  end
@@ -53,8 +53,13 @@ def cucumber(*args)
53
53
  if File.directory?('features')
54
54
  require 'geordi/cucumber'
55
55
 
56
- invoke_cmd 'bundle_install'
57
- invoke_cmd 'yarn_install'
56
+ settings = Geordi::Settings.new
57
+
58
+ invoke_geordi 'bundle_install'
59
+ invoke_geordi 'yarn_install'
60
+ if settings.auto_update_chromedriver
61
+ invoke_geordi 'chromedriver_update', quiet_if_matching: true
62
+ end
58
63
 
59
64
  cmd_opts, files = args.partition { |f| f.start_with? '-' }
60
65
  cmd_opts << '--format' << 'pretty' << '--backtrace' if options.debug
@@ -66,7 +66,7 @@ set :branch, ENV['DEPLOY_BRANCH'] || 'master'
66
66
  push_needed = false if Util.testing? # Hard to test
67
67
 
68
68
  Interaction.announce "Checking whether your #{source_branch} branch is ready" ############
69
- Util.system! "git checkout #{source_branch}"
69
+ Util.run!("git checkout #{source_branch}")
70
70
  if (`git status -s | wc -l`.strip != '0') && !Util.testing?
71
71
  Interaction.warn "Your #{source_branch} branch holds uncommitted changes."
72
72
  Interaction.prompt('Continue anyway?', 'n', /y|yes/) || raise('Cancelled.')
@@ -76,14 +76,14 @@ set :branch, ENV['DEPLOY_BRANCH'] || 'master'
76
76
 
77
77
  if merge_needed
78
78
  Interaction.announce "Checking what's in your #{target_branch} branch right now" #######
79
- Util.system! "git checkout #{target_branch} && git pull"
79
+ Util.run!("git checkout #{target_branch} && git pull")
80
80
  end
81
81
 
82
82
  Interaction.announce 'You are about to:' #################################################
83
83
  Interaction.note "Merge branch #{source_branch} into #{target_branch}" if merge_needed
84
84
  if push_needed
85
85
  Interaction.note 'Push these commits:' if push_needed
86
- Util.system! "git --no-pager log origin/#{target_branch}..#{source_branch} --oneline"
86
+ Util.run!("git --no-pager log origin/#{target_branch}..#{source_branch} --oneline")
87
87
  end
88
88
  Interaction.note "Deploy to #{target_stage}"
89
89
  Interaction.note "From current branch #{source_branch}" if options.current_branch
@@ -94,7 +94,7 @@ set :branch, ENV['DEPLOY_BRANCH'] || 'master'
94
94
  git_call << "git merge #{source_branch}" if merge_needed
95
95
  git_call << 'git push' if push_needed
96
96
 
97
- invoke_cmd 'bundle_install'
97
+ invoke_geordi 'bundle_install'
98
98
 
99
99
  capistrano_call = "cap #{target_stage} deploy"
100
100
  capistrano_call << ':migrations' unless Util.gem_major_version('capistrano') == 3 || options.no_migrations
@@ -102,14 +102,14 @@ set :branch, ENV['DEPLOY_BRANCH'] || 'master'
102
102
  capistrano_call = "DEPLOY_BRANCH=#{source_branch} #{capistrano_call}" if options.current_branch
103
103
 
104
104
  if git_call.any?
105
- Util.system! git_call.join(' && '), show_cmd: true
105
+ Util.run!(git_call.join(' && '), show_cmd: true)
106
106
  end
107
107
 
108
- Util.system! capistrano_call, show_cmd: true
108
+ Util.run!(capistrano_call, show_cmd: true)
109
109
 
110
110
  Interaction.success 'Deployment complete.'
111
111
  else
112
- Util.system! "git checkout #{source_branch}"
112
+ Util.run!("git checkout #{source_branch}")
113
113
  Interaction.fail 'Deployment cancelled.'
114
114
  end
115
115
  end
@@ -10,13 +10,21 @@ specified target's database and downloads it to `tmp/`.
10
10
 
11
11
  `geordi dump staging -l` (with a Capistrano deploy target and the `--load`
12
12
  option) sources the dump into the development database after downloading it.
13
+
14
+ If you are using multiple databases per environment, pass the database name like this:
15
+
16
+ geordi dump -d primary
17
+
18
+ Loading a dump into one of multiple local databases is not supported yet.
13
19
  DESC
14
20
 
15
21
  option :load, aliases: '-l', type: :string, desc: 'Load a dump', banner: '[DUMP_FILE]'
22
+ option :database, aliases: '-d', type: :string, desc: 'Database name, if there are multiple databases', banner: 'NAME'
16
23
 
17
24
  def dump(target = nil, *_args)
18
25
  require 'geordi/dump_loader'
19
26
  require 'geordi/remote'
27
+ database = options[:database] ? "#{options[:database]} " : ''
20
28
 
21
29
  if target.nil?
22
30
  if options.load
@@ -33,12 +41,14 @@ def dump(target = nil, *_args)
33
41
 
34
42
  else
35
43
  Interaction.announce 'Dumping the development database'
36
- Util.system! 'dumple development'
37
- Interaction.success 'Successfully dumped the development database.'
44
+ Util.run!("dumple development #{database}")
45
+ Interaction.success "Successfully dumped the #{database}development database."
38
46
  end
39
47
 
40
48
  else
41
- Interaction.announce 'Dumping the database of ' + target
49
+ database_label = options[:database] ? " (#{database}database)" : ""
50
+
51
+ Interaction.announce "Dumping the database of #{target}#{database_label}"
42
52
  dump_path = Geordi::Remote.new(target).dump(options)
43
53
 
44
54
  if options.load
@@ -47,7 +57,7 @@ def dump(target = nil, *_args)
47
57
  Interaction.announce "Sourcing dump into the #{loader.config['database']} db"
48
58
  loader.load
49
59
 
50
- Interaction.success "Your #{loader.config['database']} database has now the data of #{target}."
60
+ Interaction.success "Your #{loader.config['database']} database has now the data of #{target}#{database_label}."
51
61
  end
52
62
  end
53
63
  end
@@ -25,7 +25,7 @@ def firefox(*command)
25
25
 
26
26
  puts
27
27
  Interaction.note_cmd command.join(' ')
28
- system *command # Util.system! would reset the Firefox PATH
28
+ system *command # Util.run! would reset the Firefox PATH
29
29
  end
30
30
  end
31
31
 
@@ -8,8 +8,8 @@ with `db:migrate`.
8
8
  LONGDESC
9
9
 
10
10
  def migrate
11
- invoke_cmd 'bundle_install'
12
- invoke_cmd 'yarn_install'
11
+ invoke_geordi 'bundle_install'
12
+ invoke_geordi 'yarn_install'
13
13
  Interaction.announce 'Migrating'
14
14
 
15
15
  if File.directory?('db/migrate')
@@ -17,9 +17,9 @@ def migrate
17
17
  Interaction.note 'Development and parallel test databases'
18
18
  puts
19
19
 
20
- Util.system! Util.binstub('rake'), 'db:migrate parallel:prepare'
20
+ Util.run!([Util.binstub_or_fallback('rake'), 'db:migrate', 'parallel:prepare'])
21
21
  else
22
- invoke_cmd 'rake', 'db:migrate'
22
+ invoke_geordi 'rake', 'db:migrate'
23
23
  end
24
24
  else
25
25
  Interaction.note 'No migrations directory found.'
@@ -10,14 +10,16 @@ Example: `geordi rake db:migrate`
10
10
  LONGDESC
11
11
 
12
12
  def rake(*args)
13
- invoke_cmd 'bundle_install'
13
+ invoke_geordi 'bundle_install'
14
14
 
15
15
  %w[development test cucumber].each do |env| # update long_desc when changing this
16
16
  if File.exist? "config/environments/#{env}.rb"
17
- call = [Util.binstub('rake')] + args + ["RAILS_ENV=#{env}"]
18
- Interaction.note_cmd call.join(' ')
17
+ command = []
18
+ command << Util.binstub_or_fallback('rake')
19
+ command += args
20
+ command << "RAILS_ENV=#{env}"
19
21
 
20
- Util.system! *call
22
+ Util.run!(command, show_cmd: true)
21
23
  end
22
24
  end
23
25
  end
@@ -7,14 +7,14 @@ LONGDESC
7
7
 
8
8
  def rspec(*files)
9
9
  if File.exist?('spec/spec_helper.rb')
10
- invoke_cmd 'bundle_install'
11
- invoke_cmd 'yarn_install'
10
+ invoke_geordi 'bundle_install'
11
+ invoke_geordi 'yarn_install'
12
12
 
13
13
  Interaction.announce 'Running specs'
14
14
 
15
15
  if Util.file_containing?('Gemfile', /parallel_tests/) && files.empty?
16
16
  Interaction.note 'All specs at once (using parallel_tests)'
17
- Util.system! Util.binstub('rake'), 'parallel:spec', fail_message: 'Specs failed.'
17
+ Util.run!([Util.binstub_or_fallback('rake'), 'parallel:spec'], fail_message: 'Specs failed.')
18
18
 
19
19
  else
20
20
  # tell which specs will be run
@@ -28,13 +28,13 @@ def rspec(*files)
28
28
  command = if File.exist?('script/spec')
29
29
  ['bundle exec spec -c'] # RSpec 1
30
30
  else
31
- [Util.binstub('rspec')]
31
+ [Util.binstub_or_fallback('rspec')]
32
32
  end
33
33
  command << '-r rspec_spinner -f RspecSpinner::Bar' if Util.file_containing?('Gemfile', /rspec_spinner/)
34
34
  command << files.join(' ')
35
35
 
36
36
  puts
37
- Util.system! command.join(' '), fail_message: 'Specs failed.'
37
+ Util.run!(command.join(' '), fail_message: 'Specs failed.')
38
38
  end
39
39
  else
40
40
  Interaction.note 'RSpec not employed.'
@@ -35,8 +35,8 @@ def security_update(step = 'prepare')
35
35
  Interaction.note 'About to checkout production and pull.'
36
36
  Interaction.prompt('Continue?', 'y', /y|yes/) || Interaction.fail('Cancelled.')
37
37
 
38
- Util.system! 'git checkout production', show_cmd: true
39
- Util.system! 'git pull', show_cmd: true
38
+ Util.run!('git checkout production', show_cmd: true)
39
+ Util.run!('git pull', show_cmd: true)
40
40
 
41
41
  Interaction.success 'Successfully prepared for security update'
42
42
  puts
@@ -47,7 +47,7 @@ def security_update(step = 'prepare')
47
47
  when 'f', 'finish'
48
48
  # ensure everything is committed
49
49
  if Util.testing?
50
- puts 'Util.system! git status --porcelain'
50
+ puts 'Util.run! git status --porcelain'
51
51
  else
52
52
  `git status --porcelain`.empty? || Interaction.fail('Please commit your changes before finishing the update.')
53
53
  end
@@ -59,11 +59,11 @@ def security_update(step = 'prepare')
59
59
  Interaction.note 'About to: push production, checkout & pull master, merge production, push master.'
60
60
  Interaction.prompt('Continue?', 'n', /y|yes/) || Interaction.fail('Cancelled.')
61
61
 
62
- Util.system! 'git push', show_cmd: true
63
- Util.system! 'git checkout master', show_cmd: true
64
- Util.system! 'git pull', show_cmd: true
65
- Util.system! 'git merge production', show_cmd: true
66
- Util.system! 'git push', show_cmd: true
62
+ Util.run!('git push', show_cmd: true)
63
+ Util.run!('git checkout master', show_cmd: true)
64
+ Util.run!('git pull', show_cmd: true)
65
+ Util.run!('git merge production', show_cmd: true)
66
+ Util.run!('git push', show_cmd: true)
67
67
 
68
68
  Interaction.announce 'Deployment'
69
69
  deploy = (Util.gem_major_version('capistrano') == 3) ? 'deploy' : 'deploy:migrations'
@@ -76,7 +76,7 @@ def security_update(step = 'prepare')
76
76
  Interaction.prompt('Deploy staging now?', 'y', /y|yes/) || Interaction.fail('Cancelled.')
77
77
 
78
78
  Interaction.announce 'Deploy staging'
79
- Util.system! "bundle exec cap staging #{deploy}", show_cmd: true
79
+ Util.run! "bundle exec cap staging #{deploy}", show_cmd: true
80
80
 
81
81
  Interaction.prompt('Is the deployment log okay and the application is still running on staging?', 'y', /y|yes/) || Interaction.fail('Please fix the deployment issues on staging before you continue.')
82
82
  else
@@ -96,7 +96,7 @@ def security_update(step = 'prepare')
96
96
 
97
97
  deploy_targets_without_staging.each do |target|
98
98
  Interaction.announce "Deploy #{target}"
99
- Util.system! "bundle exec cap #{target} #{deploy}", show_cmd: true
99
+ Util.run!("bundle exec cap #{target} #{deploy}", show_cmd: true)
100
100
  end
101
101
 
102
102
  Interaction.prompt('Is the application still running on all other stages and the logs are okay?', 'y', /y|yes/) || Interaction.fail('Please fix the application immediately!')
@@ -6,8 +6,8 @@ option :public, aliases: '-P', type: :boolean,
6
6
  desc: 'Make the server accessible from the local network'
7
7
 
8
8
  def server(port = nil)
9
- invoke_cmd 'bundle_install'
10
- invoke_cmd 'yarn_install'
9
+ invoke_geordi 'bundle_install'
10
+ invoke_geordi 'yarn_install'
11
11
  require 'geordi/util'
12
12
 
13
13
  Interaction.announce 'Booting a development server'
@@ -18,7 +18,7 @@ def server(port = nil)
18
18
  command = Util.server_command
19
19
  command << ' -b 0.0.0.0' if options.public
20
20
  command << ' -p ' << port
21
- Util.system! command
21
+ Util.run!(command)
22
22
  end
23
23
 
24
24
  map 'devserver' => 'server'
@@ -19,14 +19,14 @@ def setup
19
19
  Interaction.announce 'Running bin/setup'
20
20
  Interaction.note "Geordi's own setup routine is skipped"
21
21
 
22
- Util.system! 'bin/setup'
22
+ Util.run!('bin/setup')
23
23
  else
24
- invoke_cmd 'create_databases'
25
- invoke_cmd 'migrate'
24
+ invoke_geordi 'create_databases'
25
+ invoke_geordi 'migrate'
26
26
  end
27
27
 
28
28
  Interaction.success 'Successfully set up the project.'
29
29
 
30
- invoke_cmd 'dump', options.dump, load: true if options.dump
31
- invoke_cmd 'tests' if options.test
30
+ invoke_geordi 'dump', options.dump, load: true if options.dump
31
+ invoke_geordi 'tests' if options.test
32
32
  end
@@ -15,7 +15,7 @@ option :select_server, type: :string, aliases: '-s', banner: '[SERVER_NUMBER]',
15
15
  def shelll(target, *_args)
16
16
  require 'geordi/remote'
17
17
 
18
- invoke_cmd 'bundle_install'
18
+ invoke_geordi 'bundle_install'
19
19
 
20
20
  Interaction.announce 'Opening a shell on ' + target
21
21
  Geordi::Remote.new(target).shell(options)
@@ -1,13 +1,13 @@
1
1
  desc 'tests', 'Run all employed tests'
2
2
  def tests
3
- rake_result = invoke_cmd 'with_rake'
3
+ rake_result = invoke_geordi 'with_rake'
4
4
 
5
5
  # Since `rake` usually is configured to run all tests, only run them if `rake`
6
6
  # did not perform
7
7
  if rake_result == :did_not_perform
8
- invoke_cmd 'unit'
9
- invoke_cmd 'rspec'
10
- invoke_cmd 'cucumber'
8
+ invoke_geordi 'unit'
9
+ invoke_geordi 'rspec'
10
+ invoke_geordi 'cucumber'
11
11
  end
12
12
 
13
13
  Interaction.success 'Successfully ran tests.'
@@ -1,11 +1,11 @@
1
1
  desc 'unit', 'Run Test::Unit'
2
2
  def unit
3
3
  if File.exist?('test/test_helper.rb')
4
- invoke_cmd 'bundle_install'
5
- invoke_cmd 'yarn_install'
4
+ invoke_geordi 'bundle_install'
5
+ invoke_geordi 'yarn_install'
6
6
 
7
7
  Interaction.announce 'Running Test::Unit'
8
- Util.system! Util.binstub('rake'), 'test'
8
+ Util.run!([Util.binstub_or_fallback('rake'), 'test'])
9
9
  else
10
10
  Interaction.note 'Test::Unit not employed.'
11
11
  end
@@ -11,12 +11,12 @@ option :test, type: :boolean, aliases: '-t', desc: 'After updating, run tests'
11
11
 
12
12
  def update
13
13
  Interaction.announce 'Updating repository'
14
- Util.system! 'git pull', show_cmd: true
14
+ Util.run!('git pull', show_cmd: true)
15
15
 
16
- invoke_cmd 'migrate'
16
+ invoke_geordi 'migrate'
17
17
 
18
18
  Interaction.success 'Successfully updated the project.'
19
19
 
20
- invoke_cmd 'dump', options.dump, load: true if options.dump
21
- invoke_cmd 'tests' if options.test
20
+ invoke_geordi 'dump', options.dump, load: true if options.dump
21
+ invoke_geordi 'tests' if options.test
22
22
  end
@@ -10,7 +10,7 @@ option :setup, type: :boolean, desc: 'Guide through the setup of VNC'
10
10
 
11
11
  def vnc
12
12
  if options.setup
13
- invoke_cmd :_setup_vnc
13
+ invoke_geordi :_setup_vnc
14
14
  else
15
15
  require 'geordi/cucumber'
16
16
  Geordi::Cucumber.new.launch_vnc_viewer
@@ -1,11 +1,11 @@
1
1
  desc 'with-rake', 'Run tests with `rake`', hide: true
2
2
  def with_rake
3
3
  if Util.file_containing?('Rakefile', /^task.+default.+(spec|test|feature)/)
4
- invoke_cmd 'bundle_install'
5
- invoke_cmd 'yarn_install'
4
+ invoke_geordi 'bundle_install'
5
+ invoke_geordi 'yarn_install'
6
6
 
7
7
  Interaction.announce 'Running tests with `rake`'
8
- Util.system! Util.binstub('rake')
8
+ Util.run!(Util.binstub_or_fallback('rake'))
9
9
  else
10
10
  Interaction.note '`rake` does not run tests.'
11
11
  :did_not_perform
@@ -3,6 +3,6 @@ desc 'yarn-install', 'Runs yarn install if required', hide: true
3
3
  def yarn_install
4
4
  if File.exist?('package.json') && !system('yarn check --integrity > /dev/null 2>&1')
5
5
  Interaction.announce 'Yarn install'
6
- Util.system! 'yarn install'
6
+ Util.run!('yarn install')
7
7
  end
8
8
  end
@@ -27,7 +27,7 @@ module Geordi
27
27
  Interaction.note_cmd(command) if options[:verbose]
28
28
 
29
29
  puts # Make newline
30
- system command # Util.system! would reset the Firefox PATH
30
+ system command # Util.run! would reset the Firefox PATH
31
31
  end
32
32
 
33
33
  def launch_vnc_viewer
@@ -74,7 +74,7 @@ module Geordi
74
74
  unless argv.include?('--format') || argv.include?('-f')
75
75
  format_args = spinner_available? ? ['--format', 'CucumberSpinner::CuriousProgressBarFormatter'] : ['--format', 'progress']
76
76
  end
77
- [use_firefox_for_selenium, Util.binstub('cucumber'), format_args, escape_shell_args(argv)].flatten.compact.join(' ')
77
+ [use_firefox_for_selenium, Util.binstub_or_fallback('cucumber'), format_args, escape_shell_args(argv)].flatten.compact.join(' ')
78
78
  end
79
79
 
80
80
  def parallel_execution_command
@@ -57,7 +57,7 @@ module Geordi
57
57
  Interaction.note 'Source file: ' + dump_file
58
58
 
59
59
  source_command = send("#{config['adapter']}_command")
60
- Util.system! source_command, fail_message: "An error occured loading #{File.basename(dump_file)}"
60
+ Util.run! source_command, fail_message: "An error occured loading #{File.basename(dump_file)}"
61
61
  end
62
62
 
63
63
  end
@@ -89,7 +89,7 @@ No staged changes. Will create an empty commit.
89
89
  extra = highline.ask("\nAdd an optional message").strip
90
90
  message << ' - ' << extra if extra != ''
91
91
 
92
- Geordi::Util.system! 'git', 'commit', '--allow-empty', '-m', message, *git_args
92
+ Geordi::Util.run!(['git', 'commit', '--allow-empty', '-m', message, *git_args])
93
93
  end
94
94
 
95
95
  def bold(string)
@@ -24,7 +24,7 @@ module Geordi
24
24
  end
25
25
 
26
26
  # Like `note`, but pink. Use to print (bash) commands.
27
- # Also see Util.system!
27
+ # Also see Util.run!
28
28
  def note_cmd(text)
29
29
  message = "> #{text}"
30
30
  puts "\e[35m#{message}\e[0m" # pink
@@ -31,9 +31,10 @@ module Geordi
31
31
  end
32
32
 
33
33
  def dump(options = {})
34
+ database = options[:database] ? " #{options[:database]}" : ''
34
35
  # Generate dump on the server
35
36
  shell options.merge({
36
- remote_command: "dumple #{@config.env} --for_download",
37
+ remote_command: "dumple #{@config.env}#{database} --for_download",
37
38
  })
38
39
 
39
40
  destination_directory = File.join(@config.root, 'tmp')
@@ -43,9 +44,9 @@ module Geordi
43
44
 
44
45
  Interaction.note "Downloading remote dump to #{relative_destination} ..."
45
46
  server = @config.primary_server
46
- Util.system! "scp -C #{@config.user(server)}@#{server}:#{REMOTE_DUMP_PATH} #{destination_path}"
47
+ Util.run!("scp -C #{@config.user(server)}@#{server}:#{REMOTE_DUMP_PATH} #{destination_path}")
47
48
 
48
- Interaction.success "Dumped the #{@stage} database to #{relative_destination}."
49
+ Interaction.success "Dumped the#{database} #{@stage} database to #{relative_destination}."
49
50
 
50
51
  destination_path
51
52
  end
@@ -74,7 +75,7 @@ module Geordi
74
75
  remote_command << " -c '#{options[:remote_command]}'" if options[:remote_command]
75
76
 
76
77
  Interaction.note 'Connecting to ' + server.to_s
77
- Util.system! 'ssh', "#{@config.user(server)}@#{server}", '-t', remote_command
78
+ Util.run!(['ssh', "#{@config.user(server)}@#{server}", '-t', remote_command])
78
79
  end
79
80
 
80
81
  end
@@ -8,7 +8,7 @@ module Geordi
8
8
  GLOBAL_SETTINGS_FILE_NAME = Util.testing? ? './tmp/global_settings.yml'.freeze : File.join(ENV['HOME'], '.config/geordi/global.yml').freeze
9
9
  LOCAL_SETTINGS_FILE_NAME = Util.testing? ? './tmp/local_settings.yml'.freeze : './.geordi.yml'.freeze
10
10
 
11
- ALLOWED_GLOBAL_SETTINGS = %w[ pivotal_tracker_api_key ].freeze
11
+ ALLOWED_GLOBAL_SETTINGS = %w[ pivotal_tracker_api_key auto_update_chromedriver ].freeze
12
12
  ALLOWED_LOCAL_SETTINGS = %w[ use_vnc pivotal_tracker_project_ids ].freeze
13
13
 
14
14
  def initialize
@@ -25,6 +25,15 @@ module Geordi
25
25
  save_global_settings
26
26
  end
27
27
 
28
+ def auto_update_chromedriver
29
+ @global_settings["auto_update_chromedriver"] || false
30
+ end
31
+
32
+ def auto_update_chromedriver=(value)
33
+ @global_settings['auto_update_chromedriver'] = value
34
+ save_global_settings
35
+ end
36
+
28
37
  # Local settings
29
38
  # They should not be changed by geordi to avoid unexpected diffs, therefore
30
39
  # there are no setters for these settings
@@ -129,7 +138,7 @@ module Geordi
129
138
  def inquire_pt_api_key
130
139
  Geordi::Interaction.warn 'Your settings are missing or invalid.'
131
140
  Geordi::Interaction.warn "Please configure your Pivotal Tracker access."
132
- token = Geordi::Interaction.prompt 'Your API key:'
141
+ token = Geordi::Interaction.prompt('Your API key:').to_s # Just be sure
133
142
  self.pivotal_tracker_api_key = token
134
143
  puts
135
144
 
@@ -21,7 +21,7 @@ module Geordi
21
21
  # install missing gem
22
22
  Interaction.warn 'Probably missing gem: ' + gem_name
23
23
  Interaction.prompt('Install it now?', 'y', /y|yes/) || Interaction.fail('Missing Gems.')
24
- system! install_command, show_cmd: true
24
+ Util.run!(install_command, show_cmd: true)
25
25
 
26
26
  # retry
27
27
  Gem.clear_paths
@@ -33,50 +33,62 @@ module Geordi
33
33
  # Run a command with a clean environment.
34
34
  # Print an error message and exit if the command fails.
35
35
  #
36
- # @option show_cmd: Whether to print the command
37
- # @option confirm: Whether to ask for confirmation before running it
38
- # @option fail_message: The text to print on command failure
39
- def system!(*commands)
40
- options = commands.last.is_a?(Hash) ? commands.pop : {}
41
- Interaction.note_cmd commands.join(' ') if options[:show_cmd]
42
-
43
- if options[:confirm]
36
+ # show_cmd: Whether to print the command
37
+ # confirm: Whether to ask for confirmation before running it
38
+ # fail_message: The text to print on command failure
39
+ def run!(command, show_cmd: false, confirm: false, fail_message: 'Something went wrong.')
40
+ # Disable shell features for arrays https://stackoverflow.com/questions/13338147/ruby-system-method-arguments
41
+ # Conversion: ['ls *', 'some arg'] => ['ls', '*', 'some arg']
42
+ # If you need shell features, you need to pass in a String instead of an array.
43
+ if command.is_a?(Array)
44
+ real_command, *arguments = *command
45
+ command = [real_command.split(' '), arguments].flatten
46
+ show_command = command
47
+ else
48
+ show_command = [command]
49
+ end
50
+
51
+ if show_cmd
52
+ # Join with spaces for better readability and copy-pasting
53
+ Interaction.note_cmd show_command.join(' ')
54
+ end
55
+
56
+ if confirm
44
57
  Interaction.prompt('Run this now?', 'n', /y|yes/) or Interaction.fail('Cancelled.')
45
58
  end
46
59
 
47
60
  if testing?
48
- puts "Util.system! #{commands.join ', '}"
61
+ # Join with commas for precise argument distinction
62
+ puts "Util.run! #{show_command.join(', ')}"
49
63
  else
50
64
  # Remove Geordi's Bundler environment when running commands.
51
65
  success = if !defined?(Bundler)
52
- system(*commands)
66
+ system(*command)
53
67
  elsif Gem::Version.new(Bundler::VERSION) >= Gem::Version.new('2.1.2')
54
68
  Bundler.with_original_env do
55
- system(*commands)
69
+ system(*command)
56
70
  end
57
71
  else
58
- Bundler.clean_system(*commands)
72
+ Bundler.clean_system(*command)
59
73
  end
60
74
 
61
- success || Interaction.fail(options[:fail_message] || 'Something went wrong.')
75
+ success || Interaction.fail(fail_message)
62
76
  end
63
77
  end
64
78
 
65
- def binstub(executable, *arguments)
79
+ def binstub_or_fallback(executable)
66
80
  binstub_file = "bin/#{executable}"
67
81
 
68
- command = File.exists?(binstub_file) ? [binstub_file] : ['bundle exec', executable]
69
- command.push(*arguments)
70
- command.join(' ')
82
+ File.exists?(binstub_file) ? binstub_file : "bundle exec #{executable}"
71
83
  end
72
84
 
73
85
  def console_command(environment)
74
86
  if gem_major_version('rails') == 2
75
87
  'script/console ' + environment
76
88
  elsif gem_major_version('rails') == 3
77
- binstub 'rails', 'console', environment
89
+ "#{binstub_or_fallback('rails')} console #{environment}"
78
90
  else
79
- binstub 'rails', 'console -e', environment
91
+ "#{binstub_or_fallback('rails')} console -e #{environment}"
80
92
  end
81
93
  end
82
94
 
@@ -84,7 +96,7 @@ module Geordi
84
96
  if gem_major_version('rails') == 2
85
97
  'script/server ""'
86
98
  else
87
- binstub 'rails', 'server'
99
+ "#{binstub_or_fallback('rails')} server"
88
100
  end
89
101
  end
90
102
 
@@ -1,3 +1,3 @@
1
1
  module Geordi
2
- VERSION = '4.0.0'.freeze
2
+ VERSION = '4.2.1'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: geordi
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.0
4
+ version: 4.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Henning Koch
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-07-30 00:00:00.000000000 Z
11
+ date: 2020-11-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -97,13 +97,13 @@ files:
97
97
  - lib/geordi/settings.rb
98
98
  - lib/geordi/util.rb
99
99
  - lib/geordi/version.rb
100
- homepage: http://makandra.com
100
+ homepage: https://makandra.com
101
101
  licenses:
102
102
  - MIT
103
103
  metadata: {}
104
104
  post_install_message: |
105
105
  * Binary `geordi` installed
106
- * Geordi 4.0.0 has removed its deprecated executables. If you want to invoke these commands like before, you may create aliases on your machine. For the alias mapping, please refer to https://github.com/makandra/geordi/commit/68fa92acb146ebde3acb92d7b9556bd4eaa2b4ff
106
+ * Geordi 4 has removed its deprecated executables. If you want to invoke these commands like before, you may create aliases on your machine. For the alias mapping, please refer to https://github.com/makandra/geordi/commit/68fa92acb146ebde3acb92d7b9556bd4eaa2b4ff
107
107
  rdoc_options: []
108
108
  require_paths:
109
109
  - lib