geordi 2.10.1 → 3.0.3
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/.gitignore +1 -0
 - data/.ruby-version +1 -1
 - data/.travis.yml +8 -2
 - data/CHANGELOG.md +46 -0
 - data/Gemfile +2 -5
 - data/Gemfile.lock +10 -10
 - data/README.md +11 -6
 - data/Rakefile +6 -10
 - data/{bin → exe}/b +0 -0
 - data/{bin → exe}/cap-all +0 -0
 - data/{bin → exe}/console-for +0 -0
 - data/{bin → exe}/cuc +0 -0
 - data/{bin → exe}/cuc-show +0 -0
 - data/{bin → exe}/cuc-vnc-setup +0 -0
 - data/{bin → exe}/deploy-to-production +0 -0
 - data/{bin → exe}/dump-for +0 -0
 - data/{bin → exe}/dumple +0 -0
 - data/{bin → exe}/geordi +0 -0
 - data/{bin → exe}/gitpt +0 -0
 - data/{bin → exe}/launchy_browser +0 -0
 - data/{bin → exe}/load-dump +0 -0
 - data/{bin → exe}/migrate-all +0 -0
 - data/{bin → exe}/rs +0 -0
 - data/{bin → exe}/run_tests +0 -0
 - data/{bin → exe}/shell-for +0 -0
 - data/{bin → exe}/tests +0 -0
 - data/geordi.gemspec +23 -20
 - data/lib/geordi/COMMAND_TEMPLATE +4 -6
 - data/lib/geordi/capistrano_config.rb +20 -17
 - data/lib/geordi/chromedriver_updater.rb +9 -10
 - data/lib/geordi/cli.rb +5 -2
 - data/lib/geordi/commands/_setup_vnc.rb +23 -23
 - data/lib/geordi/commands/apache_site.rb +3 -3
 - data/lib/geordi/commands/bundle_install.rb +3 -3
 - data/lib/geordi/commands/capistrano.rb +5 -6
 - data/lib/geordi/commands/chromedriver_update.rb +0 -9
 - data/lib/geordi/commands/clean.rb +5 -6
 - data/lib/geordi/commands/commit.rb +0 -1
 - data/lib/geordi/commands/console.rb +4 -4
 - data/lib/geordi/commands/create_database_yml.rb +4 -4
 - data/lib/geordi/commands/create_databases.rb +3 -3
 - data/lib/geordi/commands/cucumber.rb +25 -25
 - data/lib/geordi/commands/delete_dumps.rb +12 -12
 - data/lib/geordi/commands/deploy.rb +27 -28
 - data/lib/geordi/commands/drop_databases.rb +13 -15
 - data/lib/geordi/commands/dump.rb +12 -13
 - data/lib/geordi/commands/eurest.rb +2 -2
 - data/lib/geordi/commands/firefox.rb +4 -4
 - data/lib/geordi/commands/migrate.rb +3 -3
 - data/lib/geordi/commands/png_optimize.rb +15 -14
 - data/lib/geordi/commands/rake.rb +3 -3
 - data/lib/geordi/commands/remove_executable_flags.rb +3 -3
 - data/lib/geordi/commands/rspec.rb +11 -11
 - data/lib/geordi/commands/security_update.rb +25 -25
 - data/lib/geordi/commands/server.rb +6 -6
 - data/lib/geordi/commands/setup.rb +8 -8
 - data/lib/geordi/commands/shell.rb +3 -3
 - data/lib/geordi/commands/tests.rb +1 -1
 - data/lib/geordi/commands/unit.rb +3 -3
 - data/lib/geordi/commands/update.rb +7 -7
 - data/lib/geordi/commands/vnc.rb +1 -1
 - data/lib/geordi/commands/with_rake.rb +3 -3
 - data/lib/geordi/commands/yarn_install.rb +3 -3
 - data/lib/geordi/cucumber.rb +35 -36
 - data/lib/geordi/db_cleaner.rb +40 -41
 - data/lib/geordi/dump_loader.rb +6 -5
 - data/lib/geordi/firefox_for_selenium.rb +26 -29
 - data/lib/geordi/gitpt.rb +14 -15
 - data/lib/geordi/interaction.rb +2 -6
 - data/lib/geordi/remote.rb +9 -10
 - data/lib/geordi/util.rb +28 -25
 - data/lib/geordi/version.rb +1 -1
 - metadata +27 -39
 - data/features/commit.feature +0 -17
 - data/features/console.feature +0 -7
 - data/features/cucumber.feature +0 -261
 - data/features/deploy.feature +0 -66
 - data/features/dump.feature +0 -34
 - data/features/firefox.feature +0 -44
 - data/features/server.feature +0 -31
 - data/features/setup.feature +0 -11
 - data/features/shell.feature +0 -78
 - data/features/support/env.rb +0 -8
 - data/features/support/step_definitions/aruba_backport_steps.rb +0 -5
 - data/features/support/step_definitions/miscellaneous_steps.rb +0 -11
 
| 
         @@ -7,13 +7,13 @@ Lets you select the server to connect to when called with `--select-server`: 
     | 
|
| 
       7 
7 
     | 
    
         
             
                geordi shell production -s
         
     | 
| 
       8 
8 
     | 
    
         
             
            LONGDESC
         
     | 
| 
       9 
9 
     | 
    
         | 
| 
       10 
     | 
    
         
            -
            option :select_server, : 
     | 
| 
      
 10 
     | 
    
         
            +
            option :select_server, default: false, type: :boolean, aliases: '-s'
         
     | 
| 
       11 
11 
     | 
    
         | 
| 
       12 
12 
     | 
    
         
             
            # This method has a triple 'l' because :shell is a Thor reserved word. However,
         
     | 
| 
       13 
13 
     | 
    
         
             
            # it can still be called with `geordi shell` :)
         
     | 
| 
       14 
     | 
    
         
            -
            def shelll(target, * 
     | 
| 
      
 14 
     | 
    
         
            +
            def shelll(target, *_args)
         
     | 
| 
       15 
15 
     | 
    
         
             
              require 'geordi/remote'
         
     | 
| 
       16 
16 
     | 
    
         | 
| 
       17 
     | 
    
         
            -
              announce 'Opening a shell on ' + target
         
     | 
| 
      
 17 
     | 
    
         
            +
              Interaction.announce 'Opening a shell on ' + target
         
     | 
| 
       18 
18 
     | 
    
         
             
              Geordi::Remote.new(target).shell(options)
         
     | 
| 
       19 
19 
     | 
    
         
             
            end
         
     | 
    
        data/lib/geordi/commands/unit.rb
    CHANGED
    
    | 
         @@ -1,12 +1,12 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            desc 'unit', 'Run Test::Unit'
         
     | 
| 
       2 
2 
     | 
    
         
             
            def unit
         
     | 
| 
       3 
     | 
    
         
            -
              if File. 
     | 
| 
      
 3 
     | 
    
         
            +
              if File.exist?('test/test_helper.rb')
         
     | 
| 
       4 
4 
     | 
    
         
             
                invoke_cmd 'bundle_install'
         
     | 
| 
       5 
5 
     | 
    
         
             
                invoke_cmd 'yarn_install'
         
     | 
| 
       6 
6 
     | 
    
         | 
| 
       7 
     | 
    
         
            -
                announce 'Running Test::Unit'
         
     | 
| 
      
 7 
     | 
    
         
            +
                Interaction.announce 'Running Test::Unit'
         
     | 
| 
       8 
8 
     | 
    
         
             
                Util.system! 'bundle exec rake test'
         
     | 
| 
       9 
9 
     | 
    
         
             
              else
         
     | 
| 
       10 
     | 
    
         
            -
                note 'Test::Unit not employed.'
         
     | 
| 
      
 10 
     | 
    
         
            +
                Interaction.note 'Test::Unit not employed.'
         
     | 
| 
       11 
11 
     | 
    
         
             
              end
         
     | 
| 
       12 
12 
     | 
    
         
             
            end
         
     | 
| 
         @@ -16,18 +16,18 @@ After updating, runs all tests when called with the `--test` option: 
     | 
|
| 
       16 
16 
     | 
    
         
             
            See `geordi help update` for details.
         
     | 
| 
       17 
17 
     | 
    
         
             
            LONGDESC
         
     | 
| 
       18 
18 
     | 
    
         | 
| 
       19 
     | 
    
         
            -
            option :dump, : 
     | 
| 
       20 
     | 
    
         
            -
              : 
     | 
| 
       21 
     | 
    
         
            -
            option :test, : 
     | 
| 
      
 19 
     | 
    
         
            +
            option :dump, type: :string, aliases: '-d', banner: 'TARGET',
         
     | 
| 
      
 20 
     | 
    
         
            +
              desc: 'After updating, dump the TARGET db and source it into the development db'
         
     | 
| 
      
 21 
     | 
    
         
            +
            option :test, type: :boolean, aliases: '-t', desc: 'After updating, run tests'
         
     | 
| 
       22 
22 
     | 
    
         | 
| 
       23 
23 
     | 
    
         
             
            def update
         
     | 
| 
       24 
     | 
    
         
            -
              announce 'Updating repository'
         
     | 
| 
       25 
     | 
    
         
            -
              Util.system! 'git pull', : 
     | 
| 
      
 24 
     | 
    
         
            +
              Interaction.announce 'Updating repository'
         
     | 
| 
      
 25 
     | 
    
         
            +
              Util.system! 'git pull', show_cmd: true
         
     | 
| 
       26 
26 
     | 
    
         | 
| 
       27 
27 
     | 
    
         
             
              invoke_cmd 'migrate'
         
     | 
| 
       28 
28 
     | 
    
         | 
| 
       29 
     | 
    
         
            -
              success 'Successfully updated the project.'
         
     | 
| 
      
 29 
     | 
    
         
            +
              Interaction.success 'Successfully updated the project.'
         
     | 
| 
       30 
30 
     | 
    
         | 
| 
       31 
     | 
    
         
            -
              invoke_cmd 'dump', options.dump, : 
     | 
| 
      
 31 
     | 
    
         
            +
              invoke_cmd 'dump', options.dump, load: true if options.dump
         
     | 
| 
       32 
32 
     | 
    
         
             
              invoke_cmd 'tests' if options.test
         
     | 
| 
       33 
33 
     | 
    
         
             
            end
         
     | 
    
        data/lib/geordi/commands/vnc.rb
    CHANGED
    
    
| 
         @@ -1,13 +1,13 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            desc 'with-rake', 'Run tests with `rake`', : 
     | 
| 
      
 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 
4 
     | 
    
         
             
                invoke_cmd 'bundle_install'
         
     | 
| 
       5 
5 
     | 
    
         
             
                invoke_cmd 'yarn_install'
         
     | 
| 
       6 
6 
     | 
    
         | 
| 
       7 
     | 
    
         
            -
                announce 'Running tests with `rake`'
         
     | 
| 
      
 7 
     | 
    
         
            +
                Interaction.announce 'Running tests with `rake`'
         
     | 
| 
       8 
8 
     | 
    
         
             
                Util.system! 'rake'
         
     | 
| 
       9 
9 
     | 
    
         
             
              else
         
     | 
| 
       10 
     | 
    
         
            -
                note '`rake` does not run tests.'
         
     | 
| 
      
 10 
     | 
    
         
            +
                Interaction.note '`rake` does not run tests.'
         
     | 
| 
       11 
11 
     | 
    
         
             
                :did_not_perform
         
     | 
| 
       12 
12 
     | 
    
         
             
              end
         
     | 
| 
       13 
13 
     | 
    
         
             
            end
         
     | 
| 
         @@ -1,8 +1,8 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            desc 'yarn-install', 'Runs yarn install if required', : 
     | 
| 
      
 1 
     | 
    
         
            +
            desc 'yarn-install', 'Runs yarn install if required', hide: true
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            def yarn_install
         
     | 
| 
       4 
     | 
    
         
            -
              if File. 
     | 
| 
       5 
     | 
    
         
            -
                announce 'Yarn install'
         
     | 
| 
      
 4 
     | 
    
         
            +
              if File.exist?('package.json') && !system('yarn check --integrity > /dev/null 2>&1')
         
     | 
| 
      
 5 
     | 
    
         
            +
                Interaction.announce 'Yarn install'
         
     | 
| 
       6 
6 
     | 
    
         
             
                Util.system! 'yarn install'
         
     | 
| 
       7 
7 
     | 
    
         
             
              end
         
     | 
| 
       8 
8 
     | 
    
         
             
            end
         
     | 
    
        data/lib/geordi/cucumber.rb
    CHANGED
    
    | 
         @@ -3,17 +3,16 @@ require 'tempfile' 
     | 
|
| 
       3 
3 
     | 
    
         | 
| 
       4 
4 
     | 
    
         
             
            # This require-style is to prevent Ruby from loading files of a different
         
     | 
| 
       5 
5 
     | 
    
         
             
            # version of Geordi.
         
     | 
| 
       6 
     | 
    
         
            -
            require File.expand_path(' 
     | 
| 
       7 
     | 
    
         
            -
            require File.expand_path(' 
     | 
| 
      
 6 
     | 
    
         
            +
            require File.expand_path('interaction', __dir__)
         
     | 
| 
      
 7 
     | 
    
         
            +
            require File.expand_path('firefox_for_selenium', __dir__)
         
     | 
| 
       8 
8 
     | 
    
         | 
| 
       9 
9 
     | 
    
         
             
            module Geordi
         
     | 
| 
       10 
10 
     | 
    
         
             
              class Cucumber
         
     | 
| 
       11 
     | 
    
         
            -
                include Geordi::Interaction
         
     | 
| 
       12 
11 
     | 
    
         | 
| 
       13 
     | 
    
         
            -
                VNC_DISPLAY = ':17'
         
     | 
| 
       14 
     | 
    
         
            -
                VNC_SERVER_COMMAND = "vncserver #{VNC_DISPLAY} -localhost -nolisten tcp -SecurityTypes None -geometry 1280x1024"
         
     | 
| 
       15 
     | 
    
         
            -
                VNC_VIEWER_COMMAND = "vncviewer #{VNC_DISPLAY}"
         
     | 
| 
       16 
     | 
    
         
            -
                VNC_ENV_VARIABLES = %w[DISPLAY BROWSER LAUNCHY_BROWSER]
         
     | 
| 
      
 12 
     | 
    
         
            +
                VNC_DISPLAY = ':17'.freeze
         
     | 
| 
      
 13 
     | 
    
         
            +
                VNC_SERVER_COMMAND = "vncserver #{VNC_DISPLAY} -localhost -nolisten tcp -SecurityTypes None -geometry 1280x1024".freeze
         
     | 
| 
      
 14 
     | 
    
         
            +
                VNC_VIEWER_COMMAND = "vncviewer #{VNC_DISPLAY}".freeze
         
     | 
| 
      
 15 
     | 
    
         
            +
                VNC_ENV_VARIABLES = %w[DISPLAY BROWSER LAUNCHY_BROWSER].freeze
         
     | 
| 
       17 
16 
     | 
    
         | 
| 
       18 
17 
     | 
    
         
             
                def run(files, cucumber_options, options = {})
         
     | 
| 
       19 
18 
     | 
    
         
             
                  self.argv = files + cucumber_options.map { |option| option.split('=') }.flatten
         
     | 
| 
         @@ -23,27 +22,27 @@ module Geordi 
     | 
|
| 
       23 
22 
     | 
    
         
             
                  setup_vnc
         
     | 
| 
       24 
23 
     | 
    
         | 
| 
       25 
24 
     | 
    
         
             
                  command = use_parallel_tests?(options) ? parallel_execution_command : serial_execution_command
         
     | 
| 
       26 
     | 
    
         
            -
                  note_cmd(command) if options[:verbose]
         
     | 
| 
      
 25 
     | 
    
         
            +
                  Interaction.note_cmd(command) if options[:verbose]
         
     | 
| 
       27 
26 
     | 
    
         | 
| 
       28 
27 
     | 
    
         
             
                  puts # Make newline
         
     | 
| 
       29 
28 
     | 
    
         
             
                  system command # Util.system! would reset the Firefox PATH
         
     | 
| 
       30 
29 
     | 
    
         
             
                end
         
     | 
| 
       31 
30 
     | 
    
         | 
| 
       32 
31 
     | 
    
         
             
                def launch_vnc_viewer
         
     | 
| 
       33 
     | 
    
         
            -
                  fork  
     | 
| 
      
 32 
     | 
    
         
            +
                  fork do
         
     | 
| 
       34 
33 
     | 
    
         
             
                    error = capture_stderr do
         
     | 
| 
       35 
34 
     | 
    
         
             
                      system(VNC_VIEWER_COMMAND)
         
     | 
| 
       36 
35 
     | 
    
         
             
                    end
         
     | 
| 
       37 
36 
     | 
    
         
             
                    unless $?.success?
         
     | 
| 
       38 
37 
     | 
    
         
             
                      if $?.exitstatus == 127
         
     | 
| 
       39 
     | 
    
         
            -
                        fail 'VNC viewer not found. Install it with `geordi vnc --setup`.'
         
     | 
| 
      
 38 
     | 
    
         
            +
                        Interaction.fail 'VNC viewer not found. Install it with `geordi vnc --setup`.'
         
     | 
| 
       40 
39 
     | 
    
         
             
                      else
         
     | 
| 
       41 
     | 
    
         
            -
                        note 'VNC viewer could not be opened:'
         
     | 
| 
      
 40 
     | 
    
         
            +
                        Interaction.note 'VNC viewer could not be opened:'
         
     | 
| 
       42 
41 
     | 
    
         
             
                        puts error
         
     | 
| 
       43 
42 
     | 
    
         
             
                        puts
         
     | 
| 
       44 
43 
     | 
    
         
             
                      end
         
     | 
| 
       45 
44 
     | 
    
         
             
                    end
         
     | 
| 
       46 
     | 
    
         
            -
                   
     | 
| 
      
 45 
     | 
    
         
            +
                  end
         
     | 
| 
       47 
46 
     | 
    
         
             
                end
         
     | 
| 
       48 
47 
     | 
    
         | 
| 
       49 
48 
     | 
    
         
             
                def restore_env
         
     | 
| 
         @@ -57,10 +56,10 @@ module Geordi 
     | 
|
| 
       57 
56 
     | 
    
         
             
                    VNC_ENV_VARIABLES.each do |variable|
         
     | 
| 
       58 
57 
     | 
    
         
             
                      ENV["OUTER_#{variable}"] = ENV[variable] if ENV[variable]
         
     | 
| 
       59 
58 
     | 
    
         
             
                    end
         
     | 
| 
       60 
     | 
    
         
            -
                    ENV[ 
     | 
| 
       61 
     | 
    
         
            -
                    ENV[ 
     | 
| 
      
 59 
     | 
    
         
            +
                    ENV['BROWSER'] = ENV['LAUNCHY_BROWSER'] = File.expand_path('../../bin/launchy_browser', __dir__)
         
     | 
| 
      
 60 
     | 
    
         
            +
                    ENV['DISPLAY'] = VNC_DISPLAY
         
     | 
| 
       62 
61 
     | 
    
         | 
| 
       63 
     | 
    
         
            -
                    note 'Run `geordi vnc` to view the Selenium test browsers'
         
     | 
| 
      
 62 
     | 
    
         
            +
                    Interaction.note 'Run `geordi vnc` to view the Selenium test browsers'
         
     | 
| 
       64 
63 
     | 
    
         
             
                  end
         
     | 
| 
       65 
64 
     | 
    
         
             
                end
         
     | 
| 
       66 
65 
     | 
    
         | 
| 
         @@ -73,11 +72,11 @@ module Geordi 
     | 
|
| 
       73 
72 
     | 
    
         
             
                  unless argv.include?('--format') || argv.include?('-f')
         
     | 
| 
       74 
73 
     | 
    
         
             
                    format_args = spinner_available? ? ['--format', 'CucumberSpinner::CuriousProgressBarFormatter'] : ['--format', 'progress']
         
     | 
| 
       75 
74 
     | 
    
         
             
                  end
         
     | 
| 
       76 
     | 
    
         
            -
                  [use_firefox_for_selenium,  
     | 
| 
      
 75 
     | 
    
         
            +
                  [use_firefox_for_selenium, 'b', 'cucumber', format_args, escape_shell_args(argv)].flatten.compact.join(' ')
         
     | 
| 
       77 
76 
     | 
    
         
             
                end
         
     | 
| 
       78 
77 
     | 
    
         | 
| 
       79 
78 
     | 
    
         
             
                def parallel_execution_command
         
     | 
| 
       80 
     | 
    
         
            -
                  note 'Using parallel_tests'
         
     | 
| 
      
 79 
     | 
    
         
            +
                  Interaction.note 'Using parallel_tests'
         
     | 
| 
       81 
80 
     | 
    
         
             
                  self.argv = argv - command_line_features
         
     | 
| 
       82 
81 
     | 
    
         | 
| 
       83 
82 
     | 
    
         
             
                  type_arg = Util.gem_version('parallel_tests') > Gem::Version.new('0.7.0') ? 'cucumber' : 'features'
         
     | 
| 
         @@ -87,8 +86,8 @@ module Geordi 
     | 
|
| 
       87 
86 
     | 
    
         
             
                  [
         
     | 
| 
       88 
87 
     | 
    
         
             
                    use_firefox_for_selenium,
         
     | 
| 
       89 
88 
     | 
    
         
             
                    'b parallel_test -t ' + type_arg,
         
     | 
| 
       90 
     | 
    
         
            -
                    %(-o '#{ 
     | 
| 
       91 
     | 
    
         
            -
                    "-- #{ 
     | 
| 
      
 89 
     | 
    
         
            +
                    %(-o '#{command_line_options.join(' ')} --tags "#{not_tag('@solo')}"'),
         
     | 
| 
      
 90 
     | 
    
         
            +
                    "-- #{features.join(' ')}",
         
     | 
| 
       92 
91 
     | 
    
         
             
                  ].compact.join(' ')
         
     | 
| 
       93 
92 
     | 
    
         
             
                end
         
     | 
| 
       94 
93 
     | 
    
         | 
| 
         @@ -109,21 +108,21 @@ module Geordi 
     | 
|
| 
       109 
108 
     | 
    
         | 
| 
       110 
109 
     | 
    
         
             
                def escape_shell_args(*args)
         
     | 
| 
       111 
110 
     | 
    
         
             
                  args.flatten.collect do |arg|
         
     | 
| 
       112 
     | 
    
         
            -
                    arg.gsub(/([\\ "])/) { | 
     | 
| 
      
 111 
     | 
    
         
            +
                    arg.gsub(/([\\ "])/) { |_match| "\\#{Regexp.last_match(1)}" }
         
     | 
| 
       113 
112 
     | 
    
         
             
                  end
         
     | 
| 
       114 
113 
     | 
    
         
             
                end
         
     | 
| 
       115 
114 
     | 
    
         | 
| 
       116 
115 
     | 
    
         
             
                def show_features_to_run
         
     | 
| 
       117 
116 
     | 
    
         
             
                  if command_line_options.include? '@solo'
         
     | 
| 
       118 
     | 
    
         
            -
                    note 'All features tagged with @solo'
         
     | 
| 
      
 117 
     | 
    
         
            +
                    Interaction.note 'All features tagged with @solo'
         
     | 
| 
       119 
118 
     | 
    
         
             
                  elsif command_line_options.include? 'rerun'
         
     | 
| 
       120 
     | 
    
         
            -
                    note 'Rerunning failed scenarios'
         
     | 
| 
      
 119 
     | 
    
         
            +
                    Interaction.note 'Rerunning failed scenarios'
         
     | 
| 
       121 
120 
     | 
    
         
             
                  elsif features_to_run.empty?
         
     | 
| 
       122 
     | 
    
         
            -
                    note 'All features in features/'
         
     | 
| 
      
 121 
     | 
    
         
            +
                    Interaction.note 'All features in features/'
         
     | 
| 
       123 
122 
     | 
    
         
             
                  else
         
     | 
| 
       124 
123 
     | 
    
         
             
                    notification = 'Only: ' + features_to_run.join(', ')
         
     | 
| 
       125 
124 
     | 
    
         
             
                    notification << ' (from rerun.txt)' if (features_to_run == rerun_txt_features) && (features_to_run != command_line_features)
         
     | 
| 
       126 
     | 
    
         
            -
                    note notification
         
     | 
| 
      
 125 
     | 
    
         
            +
                    Interaction.note notification
         
     | 
| 
       127 
126 
     | 
    
         
             
                  end
         
     | 
| 
       128 
127 
     | 
    
         
             
                end
         
     | 
| 
       129 
128 
     | 
    
         | 
| 
         @@ -137,8 +136,8 @@ module Geordi 
     | 
|
| 
       137 
136 
     | 
    
         | 
| 
       138 
137 
     | 
    
         
             
                def rerun_txt_features
         
     | 
| 
       139 
138 
     | 
    
         
             
                  @rerun_txt_features ||= begin
         
     | 
| 
       140 
     | 
    
         
            -
                    if File. 
     | 
| 
       141 
     | 
    
         
            -
                      IO.read( 
     | 
| 
      
 139 
     | 
    
         
            +
                    if File.exist?('rerun.txt')
         
     | 
| 
      
 140 
     | 
    
         
            +
                      IO.read('rerun.txt').to_s.strip.split(/\s+/)
         
     | 
| 
       142 
141 
     | 
    
         
             
                    else
         
     | 
| 
       143 
142 
     | 
    
         
             
                      []
         
     | 
| 
       144 
143 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -150,7 +149,7 @@ module Geordi 
     | 
|
| 
       150 
149 
     | 
    
         
             
                end
         
     | 
| 
       151 
150 
     | 
    
         | 
| 
       152 
151 
     | 
    
         
             
                def command_line_options
         
     | 
| 
       153 
     | 
    
         
            -
                  @command_line_options ||=  
     | 
| 
      
 152 
     | 
    
         
            +
                  @command_line_options ||= [].tap do |args|
         
     | 
| 
       154 
153 
     | 
    
         
             
                    # Sorry for this mess. Option parsing doesn't get much prettier.
         
     | 
| 
       155 
154 
     | 
    
         
             
                    argv.each_cons(2) do |a, b|
         
     | 
| 
       156 
155 
     | 
    
         
             
                      break if a == '--' # This is the common no-options-beyond marker
         
     | 
| 
         @@ -171,9 +170,9 @@ module Geordi 
     | 
|
| 
       171 
170 
     | 
    
         
             
                end
         
     | 
| 
       172 
171 
     | 
    
         | 
| 
       173 
172 
     | 
    
         
             
                def consolidate_rerun_txt_files
         
     | 
| 
       174 
     | 
    
         
            -
                  parallel_rerun_files = Dir.glob( 
     | 
| 
      
 173 
     | 
    
         
            +
                  parallel_rerun_files = Dir.glob('parallel_rerun*.txt')
         
     | 
| 
       175 
174 
     | 
    
         
             
                  unless parallel_rerun_files.empty?
         
     | 
| 
       176 
     | 
    
         
            -
                    note 'Consolidating parallel_rerun.txt files ...'
         
     | 
| 
      
 175 
     | 
    
         
            +
                    Interaction.note 'Consolidating parallel_rerun.txt files ...'
         
     | 
| 
       177 
176 
     | 
    
         | 
| 
       178 
177 
     | 
    
         
             
                    rerun_content = []
         
     | 
| 
       179 
178 
     | 
    
         
             
                    parallel_rerun_files.each do |filename|
         
     | 
| 
         @@ -181,8 +180,8 @@ module Geordi 
     | 
|
| 
       181 
180 
     | 
    
         
             
                      File.unlink(filename)
         
     | 
| 
       182 
181 
     | 
    
         
             
                    end
         
     | 
| 
       183 
182 
     | 
    
         | 
| 
       184 
     | 
    
         
            -
                    File.open( 
     | 
| 
       185 
     | 
    
         
            -
                      f.puts(rerun_content.join( 
     | 
| 
      
 183 
     | 
    
         
            +
                    File.open('rerun.txt', 'w') do |f|
         
     | 
| 
      
 184 
     | 
    
         
            +
                      f.puts(rerun_content.join(' '))
         
     | 
| 
       186 
185 
     | 
    
         
             
                    end
         
     | 
| 
       187 
186 
     | 
    
         
             
                  end
         
     | 
| 
       188 
187 
     | 
    
         
             
                end
         
     | 
| 
         @@ -190,14 +189,14 @@ module Geordi 
     | 
|
| 
       190 
189 
     | 
    
         
             
                def find_all_features_recursively(files_or_dirs)
         
     | 
| 
       191 
190 
     | 
    
         
             
                  Array(files_or_dirs).map do |file_or_dir|
         
     | 
| 
       192 
191 
     | 
    
         
             
                    if File.directory?(file_or_dir)
         
     | 
| 
       193 
     | 
    
         
            -
                      file_or_dir = Dir.glob(File.join(file_or_dir,  
     | 
| 
      
 192 
     | 
    
         
            +
                      file_or_dir = Dir.glob(File.join(file_or_dir, '**', '*.feature'))
         
     | 
| 
       194 
193 
     | 
    
         
             
                    end
         
     | 
| 
       195 
194 
     | 
    
         
             
                    file_or_dir
         
     | 
| 
       196 
195 
     | 
    
         
             
                  end.flatten.uniq.compact
         
     | 
| 
       197 
196 
     | 
    
         
             
                end
         
     | 
| 
       198 
197 
     | 
    
         | 
| 
       199 
198 
     | 
    
         
             
                def spinner_available?
         
     | 
| 
       200 
     | 
    
         
            -
                  @spinner_available ||= File. 
     | 
| 
      
 199 
     | 
    
         
            +
                  @spinner_available ||= File.exist?('Gemfile') && File.open('Gemfile').read.scan(/cucumber_spinner/).any?
         
     | 
| 
       201 
200 
     | 
    
         
             
                end
         
     | 
| 
       202 
201 
     | 
    
         | 
| 
       203 
202 
     | 
    
         
             
                def use_parallel_tests?(options)
         
     | 
| 
         @@ -209,7 +208,7 @@ module Geordi 
     | 
|
| 
       209 
208 
     | 
    
         | 
| 
       210 
209 
     | 
    
         
             
                def try_and_start_vnc
         
     | 
| 
       211 
210 
     | 
    
         
             
                  # check if vnc is already running
         
     | 
| 
       212 
     | 
    
         
            -
                  #return true if vnc_server_running?
         
     | 
| 
      
 211 
     | 
    
         
            +
                  # return true if vnc_server_running?
         
     | 
| 
       213 
212 
     | 
    
         
             
                  error = capture_stderr do
         
     | 
| 
       214 
213 
     | 
    
         
             
                    system(VNC_SERVER_COMMAND)
         
     | 
| 
       215 
214 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -218,10 +217,10 @@ module Geordi 
     | 
|
| 
       218 
217 
     | 
    
         
             
                    98 # was already running after all
         
     | 
| 
       219 
218 
     | 
    
         
             
                    true
         
     | 
| 
       220 
219 
     | 
    
         
             
                  when 127 # not installed
         
     | 
| 
       221 
     | 
    
         
            -
                    warn 'Could not launch VNC server. Install it with `geordi vnc --setup`.'
         
     | 
| 
      
 220 
     | 
    
         
            +
                    Interaction.warn 'Could not launch VNC server. Install it with `geordi vnc --setup`.'
         
     | 
| 
       222 
221 
     | 
    
         
             
                    false
         
     | 
| 
       223 
222 
     | 
    
         
             
                  else
         
     | 
| 
       224 
     | 
    
         
            -
                    warn 'Starting VNC failed:'
         
     | 
| 
      
 223 
     | 
    
         
            +
                    Interaction.warn 'Starting VNC failed:'
         
     | 
| 
       225 
224 
     | 
    
         
             
                    puts error
         
     | 
| 
       226 
225 
     | 
    
         
             
                    puts
         
     | 
| 
       227 
226 
     | 
    
         
             
                    false
         
     | 
    
        data/lib/geordi/db_cleaner.rb
    CHANGED
    
    | 
         @@ -4,17 +4,16 @@ require 'tempfile' 
     | 
|
| 
       4 
4 
     | 
    
         | 
| 
       5 
5 
     | 
    
         
             
            module Geordi
         
     | 
| 
       6 
6 
     | 
    
         
             
              class DBCleaner
         
     | 
| 
       7 
     | 
    
         
            -
                include Geordi::Interaction
         
     | 
| 
       8 
7 
     | 
    
         | 
| 
       9 
8 
     | 
    
         
             
                def initialize(extra_flags)
         
     | 
| 
       10 
9 
     | 
    
         
             
                  puts 'Please enter your sudo password if asked, for db operations as system users'
         
     | 
| 
       11 
10 
     | 
    
         
             
                  puts "We're going to run `sudo -u postgres psql` for PostgreSQL"
         
     | 
| 
       12 
11 
     | 
    
         
             
                  puts '               and `sudo mysql`            for MariaDB (which uses PAM auth)'
         
     | 
| 
       13 
12 
     | 
    
         
             
                  `sudo true`
         
     | 
| 
       14 
     | 
    
         
            -
                  fail 'sudo access is required for database operations as database users' if $? != 0
         
     | 
| 
      
 13 
     | 
    
         
            +
                  Interaction.fail 'sudo access is required for database operations as database users' if $? != 0
         
     | 
| 
       15 
14 
     | 
    
         
             
                  @derivative_dbname = /_(test\d*|development|cucumber)$/
         
     | 
| 
       16 
15 
     | 
    
         
             
                  base_directory = ENV['XDG_CONFIG_HOME']
         
     | 
| 
       17 
     | 
    
         
            -
                  base_directory =  
     | 
| 
      
 16 
     | 
    
         
            +
                  base_directory = Dir.home.to_s if base_directory.nil?
         
     | 
| 
       18 
17 
     | 
    
         
             
                  @whitelist_directory = File.join(base_directory, '.config', 'geordi', 'whitelists')
         
     | 
| 
       19 
18 
     | 
    
         
             
                  FileUtils.mkdir_p(@whitelist_directory) unless File.directory? @whitelist_directory
         
     | 
| 
       20 
19 
     | 
    
         
             
                  @mysql_command = decide_mysql_command(extra_flags['mysql'])
         
     | 
| 
         @@ -23,11 +22,11 @@ module Geordi 
     | 
|
| 
       23 
22 
     | 
    
         | 
| 
       24 
23 
     | 
    
         
             
                def edit_whitelist(dbtype)
         
     | 
| 
       25 
24 
     | 
    
         
             
                  whitelist = whitelist_fname(dbtype)
         
     | 
| 
       26 
     | 
    
         
            -
                  if File.exist? whitelist
         
     | 
| 
       27 
     | 
    
         
            -
                     
     | 
| 
      
 25 
     | 
    
         
            +
                  whitelisted_dbs = if File.exist? whitelist
         
     | 
| 
      
 26 
     | 
    
         
            +
                    Geordi::Util.stripped_lines(File.read(whitelist))\
         
     | 
| 
       28 
27 
     | 
    
         
             
                      .delete_if { |l| l.start_with? '#' }
         
     | 
| 
       29 
28 
     | 
    
         
             
                  else
         
     | 
| 
       30 
     | 
    
         
            -
                     
     | 
| 
      
 29 
     | 
    
         
            +
                    []
         
     | 
| 
       31 
30 
     | 
    
         
             
                  end
         
     | 
| 
       32 
31 
     | 
    
         
             
                  all_dbs = list_all_dbs(dbtype)
         
     | 
| 
       33 
32 
     | 
    
         
             
                  tmp = Tempfile.open("geordi_whitelist_#{dbtype}")
         
     | 
| 
         @@ -66,7 +65,7 @@ HEREDOC 
     | 
|
| 
       66 
65 
     | 
    
         
             
                    tmpfile_content.push(['keep', db_name]) unless db_name.empty?
         
     | 
| 
       67 
66 
     | 
    
         
             
                  end
         
     | 
| 
       68 
67 
     | 
    
         
             
                  if warn_manual_whitelist
         
     | 
| 
       69 
     | 
    
         
            -
                    warn <<-ERROR_MSG.gsub(/^\s*/, '')
         
     | 
| 
      
 68 
     | 
    
         
            +
                    Interaction.warn <<-ERROR_MSG.gsub(/^\s*/, '')
         
     | 
| 
       70 
69 
     | 
    
         
             
                    Your whitelist #{whitelist} seems to have been generated manually.
         
     | 
| 
       71 
70 
     | 
    
         
             
                    In that case, make sure to use only one database name per line and omit the 'keep' prefix."
         
     | 
| 
       72 
71 
     | 
    
         | 
| 
         @@ -82,16 +81,16 @@ HEREDOC 
     | 
|
| 
       82 
81 
     | 
    
         
             
                  texteditor = Geordi::Util.decide_texteditor
         
     | 
| 
       83 
82 
     | 
    
         
             
                  system("#{texteditor} #{tmp.path}")
         
     | 
| 
       84 
83 
     | 
    
         
             
                  File.open(tmp.path, 'r') do |wl_edited|
         
     | 
| 
       85 
     | 
    
         
            -
                    whitelisted_dbs =  
     | 
| 
      
 84 
     | 
    
         
            +
                    whitelisted_dbs = []
         
     | 
| 
       86 
85 
     | 
    
         
             
                    whitelist_storage = File.open(whitelist, 'w')
         
     | 
| 
       87 
86 
     | 
    
         
             
                    lines = Geordi::Util.stripped_lines(wl_edited.read)
         
     | 
| 
       88 
87 
     | 
    
         
             
                    lines.each do |line|
         
     | 
| 
       89 
88 
     | 
    
         
             
                      next if line.start_with?('#')
         
     | 
| 
       90 
89 
     | 
    
         
             
                      unless line.split.length == 2
         
     | 
| 
       91 
     | 
    
         
            -
                        fail "Invalid edit to whitelist file: \`#{line}\` - Syntax is: ^[keep|drop] dbname$"
         
     | 
| 
      
 90 
     | 
    
         
            +
                        Interaction.fail "Invalid edit to whitelist file: \`#{line}\` - Syntax is: ^[keep|drop] dbname$"
         
     | 
| 
       92 
91 
     | 
    
         
             
                      end
         
     | 
| 
       93 
92 
     | 
    
         
             
                      unless %w[keep drop k d].include? line.split.first
         
     | 
| 
       94 
     | 
    
         
            -
                        fail "Invalid edit to whitelist file: \`#{line}\` - must start with either drop or keep."
         
     | 
| 
      
 93 
     | 
    
         
            +
                        Interaction.fail "Invalid edit to whitelist file: \`#{line}\` - must start with either drop or keep."
         
     | 
| 
       95 
94 
     | 
    
         
             
                      end
         
     | 
| 
       96 
95 
     | 
    
         
             
                      db_status, db_name = line.split
         
     | 
| 
       97 
96 
     | 
    
         
             
                      if db_status == 'keep'
         
     | 
| 
         @@ -107,32 +106,32 @@ HEREDOC 
     | 
|
| 
       107 
106 
     | 
    
         
             
                  cmd = 'sudo mysql'
         
     | 
| 
       108 
107 
     | 
    
         
             
                  unless extra_flags.nil?
         
     | 
| 
       109 
108 
     | 
    
         
             
                    if extra_flags.include? 'port'
         
     | 
| 
       110 
     | 
    
         
            -
                      port = Integer(extra_flags.split('=')[1].split 
     | 
| 
       111 
     | 
    
         
            -
                      fail "Port #{port} is not open" unless Geordi::Util.is_port_open? port
         
     | 
| 
      
 109 
     | 
    
         
            +
                      port = Integer(extra_flags.split('=')[1].split[0])
         
     | 
| 
      
 110 
     | 
    
         
            +
                      Interaction.fail "Port #{port} is not open" unless Geordi::Util.is_port_open? port
         
     | 
| 
       112 
111 
     | 
    
         
             
                    end
         
     | 
| 
       113 
112 
     | 
    
         
             
                    cmd << " #{extra_flags}"
         
     | 
| 
       114 
113 
     | 
    
         
             
                  end
         
     | 
| 
       115 
     | 
    
         
            -
                  Open3.popen3("#{cmd} -e 'QUIT'") do | 
     | 
| 
      
 114 
     | 
    
         
            +
                  Open3.popen3("#{cmd} -e 'QUIT'") do |_stdin, _stdout, stderr, thread|
         
     | 
| 
       116 
115 
     | 
    
         
             
                    break if thread.value.exitstatus == 0
         
     | 
| 
       117 
116 
     | 
    
         
             
                    # sudo mysql was not successful, switching to mysql-internal user management
         
     | 
| 
       118 
117 
     | 
    
         
             
                    mysql_error = stderr.read.lines[0].chomp.strip.split[1]
         
     | 
| 
       119 
     | 
    
         
            -
                    if %w[1045 1698].include? mysql_error 
     | 
| 
      
 118 
     | 
    
         
            +
                    if %w[1045 1698].include? mysql_error # authentication failed
         
     | 
| 
       120 
119 
     | 
    
         
             
                      cmd = 'mysql -uroot'
         
     | 
| 
       121 
120 
     | 
    
         
             
                      cmd << " #{extra_flags}" unless extra_flags.nil?
         
     | 
| 
       122 
121 
     | 
    
         
             
                      unless File.exist? File.join(Dir.home, '.my.cnf')
         
     | 
| 
       123 
122 
     | 
    
         
             
                        puts "Please enter your MySQL/MariaDB password for account 'root'."
         
     | 
| 
       124 
     | 
    
         
            -
                        warn "You should create a ~/.my.cnf file instead, or you'll need to enter your MySQL root password for each db."
         
     | 
| 
       125 
     | 
    
         
            -
                        warn  
     | 
| 
       126 
     | 
    
         
            -
                        cmd << ' -p' 
     | 
| 
      
 123 
     | 
    
         
            +
                        Interaction.warn "You should create a ~/.my.cnf file instead, or you'll need to enter your MySQL root password for each db."
         
     | 
| 
      
 124 
     | 
    
         
            +
                        Interaction.warn 'See https://makandracards.com/makandra/50813-store-mysql-passwords-for-development for more information.'
         
     | 
| 
      
 125 
     | 
    
         
            +
                        cmd << ' -p' # need to ask for password now
         
     | 
| 
       127 
126 
     | 
    
         
             
                      end
         
     | 
| 
       128 
     | 
    
         
            -
                      Open3.popen3("#{cmd} -e 'QUIT'") do | 
     | 
| 
       129 
     | 
    
         
            -
                        fail 'Could not connect to MySQL/MariaDB' unless  
     | 
| 
      
 127 
     | 
    
         
            +
                      Open3.popen3("#{cmd} -e 'QUIT'") do |_stdin_2, _stdout_2, _stderr_2, thread_2|
         
     | 
| 
      
 128 
     | 
    
         
            +
                        Interaction.fail 'Could not connect to MySQL/MariaDB' unless thread_2.value.exitstatus == 0
         
     | 
| 
       130 
129 
     | 
    
         
             
                      end
         
     | 
| 
       131 
     | 
    
         
            -
                    elsif mysql_error == '2013' 
     | 
| 
       132 
     | 
    
         
            -
                      fail 'MySQL/MariaDB connection failed, is this the correct port?'
         
     | 
| 
      
 130 
     | 
    
         
            +
                    elsif mysql_error == '2013' # connection to port or socket failed
         
     | 
| 
      
 131 
     | 
    
         
            +
                      Interaction.fail 'MySQL/MariaDB connection failed, is this the correct port?'
         
     | 
| 
       133 
132 
     | 
    
         
             
                    end
         
     | 
| 
       134 
133 
     | 
    
         
             
                  end
         
     | 
| 
       135 
     | 
    
         
            -
                   
     | 
| 
      
 134 
     | 
    
         
            +
                  cmd
         
     | 
| 
       136 
135 
     | 
    
         
             
                end
         
     | 
| 
       137 
136 
     | 
    
         
             
                private :decide_mysql_command
         
     | 
| 
       138 
137 
     | 
    
         | 
| 
         @@ -141,22 +140,22 @@ HEREDOC 
     | 
|
| 
       141 
140 
     | 
    
         
             
                  unless extra_flags.nil?
         
     | 
| 
       142 
141 
     | 
    
         
             
                    begin
         
     | 
| 
       143 
142 
     | 
    
         
             
                      port = Integer(extra_flags.split('=')[1])
         
     | 
| 
       144 
     | 
    
         
            -
                      fail "Port #{port} is not open" unless Geordi::Util.is_port_open? port
         
     | 
| 
      
 143 
     | 
    
         
            +
                      Interaction.fail "Port #{port} is not open" unless Geordi::Util.is_port_open? port
         
     | 
| 
       145 
144 
     | 
    
         
             
                    rescue ArgumentError
         
     | 
| 
       146 
145 
     | 
    
         
             
                      socket = extra_flags.split('=')[1]
         
     | 
| 
       147 
     | 
    
         
            -
                      fail "Socket #{socket} does not exist" unless File.exist? socket
         
     | 
| 
      
 146 
     | 
    
         
            +
                      Interaction.fail "Socket #{socket} does not exist" unless File.exist? socket
         
     | 
| 
       148 
147 
     | 
    
         
             
                    end
         
     | 
| 
       149 
148 
     | 
    
         
             
                    cmd << " #{extra_flags}"
         
     | 
| 
       150 
149 
     | 
    
         
             
                  end
         
     | 
| 
       151 
     | 
    
         
            -
                   
     | 
| 
      
 150 
     | 
    
         
            +
                  cmd
         
     | 
| 
       152 
151 
     | 
    
         
             
                end
         
     | 
| 
       153 
152 
     | 
    
         
             
                private :decide_postgres_command
         
     | 
| 
       154 
153 
     | 
    
         | 
| 
       155 
154 
     | 
    
         
             
                def list_all_dbs(dbtype)
         
     | 
| 
       156 
155 
     | 
    
         
             
                  if dbtype == 'postgres'
         
     | 
| 
       157 
     | 
    
         
            -
                     
     | 
| 
      
 156 
     | 
    
         
            +
                    list_all_postgres_dbs
         
     | 
| 
       158 
157 
     | 
    
         
             
                  else
         
     | 
| 
       159 
     | 
    
         
            -
                     
     | 
| 
      
 158 
     | 
    
         
            +
                    list_all_mysql_dbs
         
     | 
| 
       160 
159 
     | 
    
         
             
                  end
         
     | 
| 
       161 
160 
     | 
    
         
             
                end
         
     | 
| 
       162 
161 
     | 
    
         | 
| 
         @@ -172,7 +171,7 @@ HEREDOC 
     | 
|
| 
       172 
171 
     | 
    
         
             
                end
         
     | 
| 
       173 
172 
     | 
    
         | 
| 
       174 
173 
     | 
    
         
             
                def clean_mysql
         
     | 
| 
       175 
     | 
    
         
            -
                  announce 'Checking for MySQL databases'
         
     | 
| 
      
 174 
     | 
    
         
            +
                  Interaction.announce 'Checking for MySQL databases'
         
     | 
| 
       176 
175 
     | 
    
         
             
                  database_list = list_all_dbs('mysql')
         
     | 
| 
       177 
176 
     | 
    
         
             
                  # confirm_deletion includes option for whitelist editing
         
     | 
| 
       178 
177 
     | 
    
         
             
                  deletable_dbs = confirm_deletion('mysql', database_list)
         
     | 
| 
         @@ -181,19 +180,19 @@ HEREDOC 
     | 
|
| 
       181 
180 
     | 
    
         
             
                    if @mysql_command.include? '-p'
         
     | 
| 
       182 
181 
     | 
    
         
             
                      puts "Please enter your MySQL/MariaDB account 'root' for: DROP DATABASE #{db}"
         
     | 
| 
       183 
182 
     | 
    
         
             
                    else
         
     | 
| 
       184 
     | 
    
         
            -
                      note "Dropping MySQL/MariaDB database #{db}"
         
     | 
| 
      
 183 
     | 
    
         
            +
                      Interaction.note "Dropping MySQL/MariaDB database #{db}"
         
     | 
| 
       185 
184 
     | 
    
         
             
                    end
         
     | 
| 
       186 
185 
     | 
    
         
             
                    `#{@mysql_command} -e 'DROP DATABASE \`#{db}\`;'`
         
     | 
| 
       187 
186 
     | 
    
         
             
                  end
         
     | 
| 
       188 
187 
     | 
    
         
             
                end
         
     | 
| 
       189 
188 
     | 
    
         | 
| 
       190 
189 
     | 
    
         
             
                def clean_postgres
         
     | 
| 
       191 
     | 
    
         
            -
                  announce 'Checking for Postgres databases'
         
     | 
| 
      
 190 
     | 
    
         
            +
                  Interaction.announce 'Checking for Postgres databases'
         
     | 
| 
       192 
191 
     | 
    
         
             
                  database_list = list_all_dbs('postgres')
         
     | 
| 
       193 
192 
     | 
    
         
             
                  deletable_dbs = confirm_deletion('postgres', database_list)
         
     | 
| 
       194 
193 
     | 
    
         
             
                  return if deletable_dbs.nil?
         
     | 
| 
       195 
194 
     | 
    
         
             
                  deletable_dbs.each do |db|
         
     | 
| 
       196 
     | 
    
         
            -
                    note "Dropping PostgreSQL database `#{db}`."
         
     | 
| 
      
 195 
     | 
    
         
            +
                    Interaction.note "Dropping PostgreSQL database `#{db}`."
         
     | 
| 
       197 
196 
     | 
    
         
             
                    `#{@postgres_command} -c 'DROP DATABASE "#{db}";'`
         
     | 
| 
       198 
197 
     | 
    
         
             
                  end
         
     | 
| 
       199 
198 
     | 
    
         
             
                end
         
     | 
| 
         @@ -207,27 +206,27 @@ HEREDOC 
     | 
|
| 
       207 
206 
     | 
    
         
             
                  until %w[y n].include? proceed
         
     | 
| 
       208 
207 
     | 
    
         
             
                    deletable_dbs = filter_whitelisted(dbtype, database_list)
         
     | 
| 
       209 
208 
     | 
    
         
             
                    if deletable_dbs.empty?
         
     | 
| 
       210 
     | 
    
         
            -
                      note "No #{dbtype} databases found that were not whitelisted"
         
     | 
| 
       211 
     | 
    
         
            -
                      if prompt('Edit the whitelist? [y]es or [n]o') == 'y'
         
     | 
| 
      
 209 
     | 
    
         
            +
                      Interaction.note "No #{dbtype} databases found that were not whitelisted"
         
     | 
| 
      
 210 
     | 
    
         
            +
                      if Interaction.prompt('Edit the whitelist? [y]es or [n]o') == 'y'
         
     | 
| 
       212 
211 
     | 
    
         
             
                        proceed = 'e'
         
     | 
| 
       213 
212 
     | 
    
         
             
                      else
         
     | 
| 
       214 
213 
     | 
    
         
             
                        return []
         
     | 
| 
       215 
214 
     | 
    
         
             
                      end
         
     | 
| 
       216 
215 
     | 
    
         
             
                    end
         
     | 
| 
       217 
216 
     | 
    
         
             
                    if proceed.empty?
         
     | 
| 
       218 
     | 
    
         
            -
                      note "The following #{dbtype} databases are not whitelisted and could be deleted:"
         
     | 
| 
      
 217 
     | 
    
         
            +
                      Interaction.note "The following #{dbtype} databases are not whitelisted and could be deleted:"
         
     | 
| 
       219 
218 
     | 
    
         
             
                      deletable_dbs.sort.each do |db|
         
     | 
| 
       220 
219 
     | 
    
         
             
                        puts db
         
     | 
| 
       221 
220 
     | 
    
         
             
                      end
         
     | 
| 
       222 
     | 
    
         
            -
                      note "Those #{dbtype} databases are not whitelisted and could be deleted."
         
     | 
| 
       223 
     | 
    
         
            -
                      proceed = prompt('Proceed? [y]es, [n]o or [e]dit whitelist')
         
     | 
| 
      
 221 
     | 
    
         
            +
                      Interaction.note "Those #{dbtype} databases are not whitelisted and could be deleted."
         
     | 
| 
      
 222 
     | 
    
         
            +
                      proceed = Interaction.prompt('Proceed? [y]es, [n]o or [e]dit whitelist')
         
     | 
| 
       224 
223 
     | 
    
         
             
                    end
         
     | 
| 
       225 
224 
     | 
    
         
             
                    case proceed
         
     | 
| 
       226 
225 
     | 
    
         
             
                    when 'e'
         
     | 
| 
       227 
     | 
    
         
            -
                      proceed = '' 
     | 
| 
      
 226 
     | 
    
         
            +
                      proceed = '' # reset user selection
         
     | 
| 
       228 
227 
     | 
    
         
             
                      edit_whitelist dbtype
         
     | 
| 
       229 
228 
     | 
    
         
             
                    when 'n'
         
     | 
| 
       230 
     | 
    
         
            -
                      success 'Not deleting anything'
         
     | 
| 
      
 229 
     | 
    
         
            +
                      Interaction.success 'Not deleting anything'
         
     | 
| 
       231 
230 
     | 
    
         
             
                      return []
         
     | 
| 
       232 
231 
     | 
    
         
             
                    when 'y'
         
     | 
| 
       233 
232 
     | 
    
         
             
                      return deletable_dbs
         
     | 
| 
         @@ -245,10 +244,10 @@ HEREDOC 
     | 
|
| 
       245 
244 
     | 
    
         
             
                end
         
     | 
| 
       246 
245 
     | 
    
         | 
| 
       247 
246 
     | 
    
         
             
                def is_whitelisted?(dbtype, database_name)
         
     | 
| 
       248 
     | 
    
         
            -
                  if File.exist? whitelist_fname(dbtype)
         
     | 
| 
       249 
     | 
    
         
            -
                     
     | 
| 
      
 247 
     | 
    
         
            +
                  whitelist_content = if File.exist? whitelist_fname(dbtype)
         
     | 
| 
      
 248 
     | 
    
         
            +
                    Geordi::Util.stripped_lines(File.open(whitelist_fname(dbtype), 'r').read)
         
     | 
| 
       250 
249 
     | 
    
         
             
                  else
         
     | 
| 
       251 
     | 
    
         
            -
                     
     | 
| 
      
 250 
     | 
    
         
            +
                    []
         
     | 
| 
       252 
251 
     | 
    
         
             
                  end
         
     | 
| 
       253 
252 
     | 
    
         
             
                  # Allow explicit whitelisting of derivative databases like projectname_test2
         
     | 
| 
       254 
253 
     | 
    
         
             
                  if whitelist_content.include? database_name
         
     |