geordi 0.18.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. checksums.yaml +13 -5
  2. data/.ruby-version +1 -0
  3. data/README.md +199 -110
  4. data/Rakefile +40 -0
  5. data/bin/apache-site +1 -19
  6. data/bin/cap-all +1 -27
  7. data/bin/cleanup-directory +1 -11
  8. data/bin/console-for +1 -12
  9. data/bin/cuc +1 -2
  10. data/bin/cuc-show +1 -2
  11. data/bin/cuc-vnc-setup +1 -114
  12. data/bin/deploy-to-production +1 -91
  13. data/bin/dump-for +4 -32
  14. data/bin/dumple +2 -4
  15. data/bin/geordi +10 -0
  16. data/bin/gitpt +1 -2
  17. data/bin/launchy_browser +9 -3
  18. data/bin/load-dump +1 -4
  19. data/bin/migrate-all +1 -13
  20. data/bin/optimize-png +1 -118
  21. data/bin/power-rake +1 -7
  22. data/bin/remove-executable-flags +1 -6
  23. data/bin/rs +1 -26
  24. data/bin/run_tests +1 -2
  25. data/bin/setup-firefox-for-selenium +1 -3
  26. data/bin/shell-for +1 -8
  27. data/bin/tests +1 -5
  28. data/geordi.gemspec +19 -0
  29. data/lib/geordi/COMMAND_TEMPLATE +29 -0
  30. data/lib/geordi/capistrano.rb +9 -7
  31. data/lib/geordi/capistrano_config.rb +66 -0
  32. data/lib/geordi/cli.rb +28 -0
  33. data/lib/geordi/commands/all_targets.rb +26 -0
  34. data/lib/geordi/commands/apache_site.rb +22 -0
  35. data/lib/geordi/commands/bundle_install.rb +7 -0
  36. data/lib/geordi/commands/cleanup_directory.rb +16 -0
  37. data/lib/geordi/commands/commit.rb +171 -0
  38. data/lib/geordi/commands/console.rb +24 -0
  39. data/lib/geordi/commands/create_database_yml.rb +18 -0
  40. data/lib/geordi/commands/create_databases.rb +16 -0
  41. data/lib/geordi/commands/cucumber.rb +20 -0
  42. data/lib/geordi/commands/deploy.rb +65 -0
  43. data/lib/geordi/commands/devserver.rb +14 -0
  44. data/lib/geordi/commands/dump.rb +63 -0
  45. data/lib/geordi/commands/migrate.rb +26 -0
  46. data/lib/geordi/commands/png_optimize.rb +92 -0
  47. data/lib/geordi/commands/rake.rb +21 -0
  48. data/lib/geordi/commands/remove_executable_flags.rb +14 -0
  49. data/lib/geordi/commands/rspec.rb +40 -0
  50. data/lib/geordi/commands/security_update.rb +56 -0
  51. data/lib/geordi/commands/setup.rb +33 -0
  52. data/lib/geordi/commands/setup_firefox_for_selenium.rb +6 -0
  53. data/lib/geordi/commands/setup_vnc.rb +84 -0
  54. data/lib/geordi/commands/shell.rb +20 -0
  55. data/lib/geordi/commands/test.rb +9 -0
  56. data/lib/geordi/commands/unit.rb +11 -0
  57. data/lib/geordi/commands/update.rb +33 -0
  58. data/lib/geordi/commands/version.rb +7 -0
  59. data/lib/geordi/commands/vnc_show.rb +6 -0
  60. data/lib/geordi/commands/with_firefox_for_selenium.rb +18 -0
  61. data/lib/geordi/commands/with_rake.rb +11 -0
  62. data/lib/geordi/{cuc.rb → cucumber.rb} +28 -39
  63. data/lib/geordi/dump_loader.rb +44 -70
  64. data/lib/geordi/firefox_for_selenium.rb +93 -74
  65. data/lib/geordi/interaction.rb +47 -0
  66. data/lib/geordi/remote.rb +66 -0
  67. data/lib/geordi/util.rb +60 -0
  68. data/lib/geordi/version.rb +1 -1
  69. data/lib/geordi.rb +1 -0
  70. metadata +50 -16
  71. data/bin/install-gems-remotely +0 -18
  72. data/bin/install-gems-remotely.sh +0 -16
  73. data/bin/power-deploy +0 -18
  74. data/bin/remotify-local-branch +0 -12
  75. data/lib/geordi/gitpt.rb +0 -175
@@ -0,0 +1,21 @@
1
+ desc 'rake TASK', 'Run a rake task in several Rails environments'
2
+ long_desc <<-LONGDESC
3
+ Example: `geordi rake db:migrate`
4
+
5
+ TASK is run in the following Rails environments (if present):
6
+
7
+ - development
8
+ - test
9
+ - cucumber
10
+ LONGDESC
11
+
12
+ def rake(*args)
13
+ for env in %w(development test cucumber) # update long_desc when changing this
14
+ if File.exists? "config/environments/#{env}.rb"
15
+ call = %w[bundle exec rake] + args + ["RAILS_ENV=#{env}"]
16
+ note_cmd call.join(' ')
17
+
18
+ Util.system! *call
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,14 @@
1
+ desc 'remove-executable-flags', 'Remove executable-flags from files that should not be executable'
2
+ def remove_executable_flags
3
+ announce 'Removing executable-flags'
4
+
5
+ patterns = %w[
6
+ *.rb *.html *.erb *.haml *.yml *.css *.sass *.rake *.png *.jpg
7
+ *.gif *.pdf *.txt *.rdoc *.feature Rakefile VERSION README Capfile
8
+ ]
9
+ for pattern in patterns
10
+ note pattern
11
+ `find . -name "#{pattern}" -exec chmod -x {} ';'`
12
+ end
13
+ puts 'Done.'
14
+ end
@@ -0,0 +1,40 @@
1
+ desc 'rspec [FILES]', 'Run RSpec'
2
+ long_desc <<-LONGDESC
3
+ Example: `geordi rspec spec/models/user_spec.rb:13`
4
+
5
+ Runs RSpec as you want: with RSpec 1/2 detection, `bundle exec`, rspec_spinner
6
+ detection, etc.
7
+ LONGDESC
8
+
9
+ def rspec(*files)
10
+ if File.exists?('spec/spec_helper.rb')
11
+ invoke_cmd 'bundle_install'
12
+
13
+ announce 'Running specs'
14
+
15
+ if file_containing?('Gemfile', /parallel_tests/) and files.empty?
16
+ note 'All specs at once (using parallel_tests)'
17
+ Util.system! 'bundle exec rake parallel:spec', :fail_message => 'Specs failed.'
18
+
19
+ else
20
+ # tell which specs will be run
21
+ if files.empty?
22
+ files << 'spec/'
23
+ note 'All specs in spec/'
24
+ else
25
+ note 'Only: ' + files.join(', ')
26
+ end
27
+
28
+ command = ['bundle exec']
29
+ # differentiate RSpec 1/2
30
+ command << (File.exists?('script/spec') ? 'spec -c' : 'rspec')
31
+ command << '-r rspec_spinner -f RspecSpinner::Bar' if file_containing?('Gemfile', /rspec_spinner/)
32
+ command << files.join(' ')
33
+
34
+ puts
35
+ Util.system! command.join(' '), :fail_message => 'Specs failed.'
36
+ end
37
+ else
38
+ note 'RSpec not employed.'
39
+ end
40
+ end
@@ -0,0 +1,56 @@
1
+ desc 'security-update [step]', 'Support for performing security updates'
2
+ long_desc <<-LONGDESC
3
+ Preparation for security update: `geordi security-update`
4
+
5
+ After performing the update: `geordi security-update finish`
6
+
7
+ Switches branches, pulls, pushes and deploys as required by our workflow. Tells
8
+ what it will do before it does it.
9
+ LONGDESC
10
+
11
+ def security_update(step='prepare')
12
+ case step
13
+ when 'prepare'
14
+ announce 'Preparing for security update'
15
+ warn 'Please read https://makandracards.com/makandra/1587 before applying security updates!'
16
+ note 'About to: pull master and production branches, checkout production'
17
+ wait 'Continue?'
18
+
19
+ Util.system! 'git checkout master', :show_cmd => true
20
+ Util.system! 'git pull', :show_cmd => true
21
+ Util.system! 'git checkout production', :show_cmd => true
22
+ Util.system! 'git pull', :show_cmd => true
23
+
24
+ success 'Successfully prepared for security update'
25
+ puts
26
+ note 'Please apply the security update now.'
27
+ note 'When you are done, run `geordi security-update finish`.'
28
+
29
+
30
+ when 'finish'
31
+ announce 'Finishing security update'
32
+
33
+ # ensure everything is committed
34
+ `git status --porcelain`.empty? or fail('There are uncommitted changes.')
35
+ note 'Working directory clean.'
36
+
37
+ print 'Have you successfully run all tests? [yN] '
38
+ exit unless $stdin.gets =~ /[yes]+/
39
+
40
+ note 'About to: push production, checkout & pull master, merge production, push master, deploy all stages'
41
+ wait 'Continue?'
42
+
43
+ Util.system! 'git push', :show_cmd => true
44
+ Util.system! 'git checkout master', :show_cmd => true
45
+ Util.system! 'git pull', :show_cmd => true
46
+ Util.system! 'git merge production', :show_cmd => true
47
+ Util.system! 'git push', :show_cmd => true
48
+
49
+ invoke_cmd 'all_targets', 'deploy:migrations'
50
+
51
+ success 'Successfully pushed and deployed security update'
52
+ puts
53
+ note 'Now send an email to customer and project lead, informing them about the update.'
54
+ note 'Do not forget to make a joblog on a security budget, if available.'
55
+ end
56
+ end
@@ -0,0 +1,33 @@
1
+ desc 'setup', 'Setup a project for the first time'
2
+ long_desc <<-LONGDESC
3
+ Example: `geordi setup`
4
+
5
+ Check out a repository, cd into its directory. Now let `setup` do the tiring
6
+ work: run `bundle install`, create `database.yml`, create databases, migrate
7
+ (all if applicable).
8
+
9
+ After setting up, loads a dump into the development db when called with the
10
+ `--dump` option:
11
+
12
+ geordi setup -d staging
13
+
14
+ After setting up, runs all tests when called with the `--test` option:
15
+
16
+ geordi setup -t
17
+
18
+ See `geordi help setup` for details.
19
+ LONGDESC
20
+
21
+ option :dump, :type => :string, :aliases => '-d', :banner => 'TARGET',
22
+ :desc => 'After setup, dump the TARGET db and source it into the development db'
23
+ option :test, :type => :boolean, :aliases => '-t', :desc => 'After setup, run tests'
24
+
25
+ def setup
26
+ invoke_cmd 'create_databases'
27
+ invoke_cmd 'migrate'
28
+
29
+ success 'Successfully set up the project.'
30
+
31
+ invoke_cmd 'dump', options.dump, :load => true if options.dump
32
+ invoke_cmd 'tests' if options.test
33
+ end
@@ -0,0 +1,6 @@
1
+ desc 'setup-firefox-for-selenium VERSION', 'Install a special firefox for running Selenium tests'
2
+ def setup_firefox_for_selenium(version)
3
+ require 'geordi/firefox_for_selenium'
4
+
5
+ Geordi::FirefoxForSelenium.install(version)
6
+ end
@@ -0,0 +1,84 @@
1
+ class ::String
2
+ def colorize(color_code)
3
+ "\e[#{color_code}m#{self}\e[0m"
4
+ end
5
+
6
+ def red() colorize(31) end
7
+ def pink() colorize(35) end
8
+ def green() colorize(32) end
9
+ end
10
+
11
+ desc 'setup-vnc', 'Setup VNC for running Selenium tests there'
12
+ def setup_vnc
13
+ `clear`
14
+
15
+ instruct <<-TEXT
16
+ This script will help you install a VNC server and a VNC viewer.
17
+
18
+ With those you will be able to use our cucumber script without being
19
+ disturbed by focus-stealing selenium windows. Instead, they will open
20
+ inside a VNC session. You can still inspect everything with #{"geordi
21
+ vnc_show".pink}.
22
+
23
+ Please open a second shell to execute instructions.
24
+ TEXT
25
+
26
+ announce 'Setup VNC server'
27
+
28
+ if installed?('vncserver')
29
+ success 'It appears you already have a VNC server installed. Good job!'
30
+ else
31
+ instruct <<-TEXT
32
+ Please run #{'sudo apt-get install vnc4server'.pink}.
33
+ TEXT
34
+
35
+ instruct <<-TEXT
36
+ We will now set a password for your VNC server.
37
+
38
+ When running our cucumber script, you will not actually need this
39
+ password, and there is no security risk. However, if you start a vncserver
40
+ without our cucumber script, a user with your password can connect to
41
+ your machine.
42
+
43
+ Please run #{'vncserver :20'.pink} and #{'enter a secure password'.red}.
44
+ TEXT
45
+
46
+ instruct <<-TEXT
47
+ Now stop the server again.
48
+ Please run #{'vncserver -kill :20'.pink}.
49
+ TEXT
50
+ end
51
+
52
+ announce 'Setup VNC viewer'
53
+
54
+ if installed?('vncviewer')
55
+ success 'It appears you already have a VNC viewer installed. Good job!'
56
+ else
57
+ instruct <<-TEXT
58
+ Please run #{'sudo apt-get install xtightvncviewer'.pink}.
59
+ TEXT
60
+ end
61
+
62
+ instruct <<-TEXT, false
63
+ All done. Our cucumber script will now automatically run Selenium features
64
+ in VNC.
65
+ #{"Happy cuking!".green}
66
+ TEXT
67
+
68
+ end
69
+
70
+ private
71
+
72
+ def instruct(text, wait = true)
73
+ text =~ /^( *)./
74
+ level = $1 ? $1.size : 0
75
+ text.gsub!(/^ {#{level}}/, '')
76
+ puts text
77
+
78
+ wait('[ENTER]') if wait
79
+ end
80
+
81
+ def installed?(app)
82
+ `which #{app}`
83
+ $?.success?
84
+ end
@@ -0,0 +1,20 @@
1
+ # This method has a triple 'l' because :shell is a Thor reserved word. However,
2
+ # it can still be called with `geordi shell` :)
3
+
4
+ desc 'shell TARGET', 'Open a shell on a Capistrano deploy target'
5
+ long_desc <<-LONGDESC
6
+ Example: `geordi shell production`
7
+
8
+ Lets you select the server to connect to when called with `--select-server`:
9
+
10
+ geordi shell production -s
11
+ LONGDESC
12
+
13
+ option :select_server, :default => false, :type => :boolean, :aliases => '-s'
14
+
15
+ def shelll(target, *args)
16
+ require 'geordi/remote'
17
+
18
+ announce 'Opening a shell on ' + target
19
+ Geordi::Remote.new(target).shell(options)
20
+ end
@@ -0,0 +1,9 @@
1
+ desc 'tests', 'Run all employed tests'
2
+ def tests
3
+ invoke_cmd 'with_rake'
4
+ invoke_cmd 'unit'
5
+ invoke_cmd 'rspec'
6
+ invoke_cmd 'cucumber'
7
+
8
+ success 'Successfully ran tests.'
9
+ end
@@ -0,0 +1,11 @@
1
+ desc 'unit', 'Run Test::Unit'
2
+ def unit
3
+ if File.exists?('test/test_helper.rb')
4
+ invoke_cmd 'bundle_install'
5
+
6
+ announce 'Running Test::Unit'
7
+ Util.system! 'bundle exec rake test'
8
+ else
9
+ note 'Test::Unit not employed.'
10
+ end
11
+ end
@@ -0,0 +1,33 @@
1
+ desc 'update', 'Bring a project up to date'
2
+ long_desc <<-LONGDESC
3
+ Example: `geordi update`
4
+
5
+ Performs: `git pull`, `bundle install` (if necessary) and migrates (if applicable).
6
+
7
+ After updating, loads a dump into the development db when called with the
8
+ `--dump` option:
9
+
10
+ geordi update -d staging
11
+
12
+ After updating, runs all tests when called with the `--test` option:
13
+
14
+ geordi update -t
15
+
16
+ See `geordi help update` for details.
17
+ LONGDESC
18
+
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
+
23
+ def update
24
+ announce 'Updating repository'
25
+ Util.system! 'git pull', :show_cmd => true
26
+
27
+ invoke_cmd 'migrate'
28
+
29
+ success 'Successfully updated the project.'
30
+
31
+ invoke_cmd 'dump', options.dump, :load => true if options.dump
32
+ invoke_cmd 'tests' if options.test
33
+ end
@@ -0,0 +1,7 @@
1
+ desc 'version', 'Print the current version of geordi'
2
+ def version
3
+ require 'geordi/version'
4
+ puts 'Geordi ' + Geordi::VERSION
5
+ end
6
+ map '-v' => :version
7
+ map '--version' => :version
@@ -0,0 +1,6 @@
1
+ desc 'vnc-show', 'Show the hidden VNC window'
2
+ def vnc_show
3
+ require 'geordi/cucumber'
4
+
5
+ Geordi::Cucumber.new.launch_vnc_viewer
6
+ end
@@ -0,0 +1,18 @@
1
+ desc 'with-firefox-for-selenium COMMAND', 'Run a command with firefox for selenium set up'
2
+ long_desc <<-LONGDESC
3
+ Example: `geordi with-firefox-for-selenium b cucumber`
4
+
5
+ Useful when you need Firefox for Selenium, but can't use the `geordi cucumber`
6
+ command.
7
+ LONGDESC
8
+
9
+ def with_firefox_for_selenium(*command)
10
+ note 'Setting up Firefox for Selenium ...'
11
+ require 'geordi/cucumber'
12
+ Cucumber.new.setup_vnc
13
+ FirefoxForSelenium.setup_firefox
14
+ puts
15
+
16
+ note_cmd command.join
17
+ Util.system! *command
18
+ end
@@ -0,0 +1,11 @@
1
+ desc 'with-rake', 'Run tests with `rake`'
2
+ def with_rake
3
+ if file_containing?('Rakefile', /^task.+default.+(spec|test)/)
4
+ invoke_cmd 'bundle_install'
5
+
6
+ announce 'Running tests with `rake`'
7
+ Util.system! 'rake'
8
+ else
9
+ note '`rake` does not run tests.'
10
+ end
11
+ end
@@ -1,34 +1,32 @@
1
- require "rubygems"
2
- require File.join(File.dirname(__FILE__), 'firefox_for_selenium')
1
+ require 'rubygems'
3
2
  require 'tempfile'
4
3
 
4
+ # This require-style is to prevent Ruby from loading files of a different
5
+ # version of Geordi.
6
+ require File.expand_path('../interaction', __FILE__)
7
+ require File.expand_path('../firefox_for_selenium', __FILE__)
8
+
5
9
  module Geordi
6
10
  class Cucumber
11
+ include Geordi::Interaction
7
12
 
8
13
  VNC_DISPLAY = ':17'
9
14
  VNC_SERVER_COMMAND = "vncserver #{VNC_DISPLAY} -localhost -nolisten tcp -SecurityTypes None -geometry 1280x1024"
10
15
  VNC_VIEWER_COMMAND = "vncviewer #{VNC_DISPLAY}"
11
16
  VNC_ENV_VARIABLES = %w[DISPLAY BROWSER LAUNCHY_BROWSER]
12
17
 
13
- def run
14
- 4.times { puts }
15
- puts "Running Cucumber tests..."
16
- puts "========================="
18
+ def run(argv)
19
+ self.argv = argv
17
20
 
18
21
  consolidate_rerun_txt_files
19
22
  show_features_to_run
20
-
21
23
  setup_vnc
22
24
 
23
25
  command = use_parallel_tests? ? parallel_execution_command : serial_execution_command
26
+ note 'Command: ' + command if argv.include? '-v'
24
27
 
25
- if argv.include? "-v"
26
- puts command
27
- 2.times { puts }
28
- end
29
-
30
- 2.times { puts }
31
- exec command
28
+ puts
29
+ system command
32
30
  end
33
31
 
34
32
  def launch_vnc_viewer
@@ -38,10 +36,11 @@ module Geordi
38
36
  end
39
37
  unless $?.success?
40
38
  if $?.exitstatus == 127
41
- puts "VNC viewer not found. Install it using cuc-vnc-setup."
39
+ fail 'VNC viewer not found. Install it with `geordi setup-vnc`.'
42
40
  else
43
- puts "VNC viewer could not be opened:"
41
+ note 'VNC viewer could not be opened:'
44
42
  puts error
43
+ puts
45
44
  end
46
45
  end
47
46
  }
@@ -58,21 +57,16 @@ module Geordi
58
57
  VNC_ENV_VARIABLES.each do |variable|
59
58
  ENV["OUTER_#{variable}"] = ENV[variable] if ENV[variable]
60
59
  end
61
- ENV["BROWSER"] = ENV["LAUNCHY_BROWSER"] = File.expand_path(File.join(File.dirname(__FILE__), '../../bin/launchy_browser'))
60
+ ENV["BROWSER"] = ENV["LAUNCHY_BROWSER"] = File.expand_path('../../../bin/launchy_browser', __FILE__)
62
61
  ENV["DISPLAY"] = VNC_DISPLAY
63
62
 
64
- puts
65
- puts "Selenium is running in a VNC window. Use cuc-show to view it."
63
+ note 'Selenium is running in a VNC window. Use `geordi vnc-show` to view it.'
66
64
  end
67
65
  end
68
66
 
69
-
70
67
  private
71
68
 
72
- attr_writer :argv
73
- def argv
74
- @argv ||= ARGV
75
- end
69
+ attr_accessor :argv
76
70
 
77
71
  def serial_execution_command
78
72
  format_args = []
@@ -83,7 +77,7 @@ module Geordi
83
77
  end
84
78
 
85
79
  def parallel_execution_command
86
- puts "Using parallel_tests ...\n\n"
80
+ note 'Using parallel_tests'
87
81
  self.argv = argv - command_line_features
88
82
  gem 'parallel_tests', parallel_tests_version
89
83
  require 'parallel_tests'
@@ -112,13 +106,12 @@ module Geordi
112
106
  end
113
107
 
114
108
  def show_features_to_run
115
- unless features_to_run.empty?
116
- passed_by = (features_to_run == rerun_txt_features && features_to_run != command_line_features) ? 'rerun.txt' : 'command line'
117
- 2.times { puts }
118
- puts "features to run (passed by #{passed_by}):"
119
- puts "-----------------------------------------"
120
- puts features_to_run.join("\n")
121
- puts "-----------------------------------------"
109
+ if features_to_run.empty?
110
+ note 'All features in features/'
111
+ else
112
+ notification = 'Only: ' + features_to_run.join(', ')
113
+ notification << + ' (from rerun.txt)' if (features_to_run == rerun_txt_features) && (features_to_run != command_line_features)
114
+ note notification
122
115
  end
123
116
  end
124
117
 
@@ -170,8 +163,7 @@ module Geordi
170
163
  def consolidate_rerun_txt_files
171
164
  parallel_rerun_files = Dir.glob("parallel_rerun*.txt")
172
165
  unless parallel_rerun_files.empty?
173
- 2.times { puts }
174
- puts "consolidating parallel_rerun.txt files ..."
166
+ note 'Consolidating parallel_rerun.txt files ...'
175
167
 
176
168
  rerun_content = []
177
169
  parallel_rerun_files.each do |filename|
@@ -235,15 +227,12 @@ module Geordi
235
227
  98 # was already running after all
236
228
  true
237
229
  when 127 # not installed
238
- puts "Could not launch VNC server. Install it by running cuc-vnc-setup."
239
- puts
240
- puts
230
+ warn 'Could not launch VNC server. Install it with `geordi setup-vnc`.'
241
231
  false
242
232
  else
243
- puts "Starting VNC failed:"
233
+ warn 'Starting VNC failed:'
244
234
  puts error
245
235
  puts
246
- puts
247
236
  false
248
237
  end
249
238
  end
@@ -1,86 +1,60 @@
1
1
  require 'rubygems'
2
2
  require 'highline'
3
+ require 'geordi/interaction'
4
+ require 'geordi/util'
3
5
 
6
+ module Geordi
7
+ class DumpLoader
8
+ include Geordi::Interaction
4
9
 
5
- class DumpLoader
6
-
7
- def initialize(argv)
8
- @argv = argv
9
- @verbose = !!@argv.delete('-v')
10
- end
11
-
12
- def dumps_dir
13
- require 'etc'
14
- user_dir = Etc.getpwuid.dir
15
- File.join(user_dir, 'dumps')
16
- end
10
+ def initialize(file)
11
+ @dump_file = file
12
+ end
17
13
 
18
- def development_database_config
19
- require 'yaml'
14
+ def development_database_config
15
+ require 'yaml'
20
16
 
21
- @config ||= YAML::load(ERB.new(File.read('config/database.yml')).result)
22
- @config['development']
23
- end
24
- alias_method :config, :development_database_config
25
-
26
- def mysql_command
27
- ENV['MYSQL_PWD'] = config['password']
28
- command = 'mysql --silent'
29
- command << ' -u' << config['username']
30
- command << ' --default-character-set=utf8'
31
- command << ' ' << config['database']
32
- command << ' < ' << dump_file
33
- end
34
- alias_method :mysql2_command, :mysql_command
17
+ @config ||= YAML::load(ERB.new(File.read('config/database.yml')).result)
18
+ @config['development']
19
+ end
20
+ alias_method :config, :development_database_config
35
21
 
36
- def postgresql_command
37
- ENV['PGPASSWORD'] = config['password']
38
- command = 'pg_restore --no-owner --clean'
39
- command << ' --username=' << config['username']
40
- command << ' --host=' << config['host']
41
- command << ' --dbname=' << config['database']
42
- command << ' ' << dump_file
43
- end
44
-
45
- def source_dump!
46
- source_command = send("#{config['adapter']}_command")
47
- `#{source_command}`
48
- end
49
-
50
- def choose_dump_file
51
- highline = HighLine.new
52
-
53
- available_dumps = Dir.glob("#{dumps_dir}/*.dump").sort
54
- selected_dump = highline.choose(*available_dumps) do |menu|
55
- menu.hidden('') { exit }
22
+ def mysql_command
23
+ command = 'mysql --silent'
24
+ command << ' -p' << config['password']
25
+ command << ' -u' << config['username']
26
+ command << ' --default-character-set=utf8'
27
+ command << ' ' << config['database']
28
+ command << ' < ' << dump_file
56
29
  end
57
- end
58
-
59
- def dump_file
60
- @dump_file ||= if @argv[0] && File.exists?(@argv[0])
61
- @argv[0]
62
- else
63
- choose_dump_file
30
+ alias_method :mysql2_command, :mysql_command
31
+
32
+ def postgresql_command
33
+ ENV['PGPASSWORD'] = config['password']
34
+ command = 'pg_restore --no-owner --clean'
35
+ command << ' --username=' << config['username']
36
+ command << ' --host=' << config['host']
37
+ command << ' --dbname=' << config['database']
38
+ command << ' ' << dump_file
64
39
  end
65
- end
66
40
 
67
- def execute
68
- puts "Sourcing #{dump_file} into #{config['database']} db ..." if @verbose
41
+ def dump_file
42
+ @dump_file ||= begin
43
+ dumps_glob = File.join(File.expand_path('~'), 'dumps', '*.dump')
44
+ available_dumps = Dir.glob(dumps_glob).sort
69
45
 
70
- source_dump!
46
+ HighLine.new.choose(*available_dumps) do |menu|
47
+ menu.hidden('') { fail 'Abort.' }
48
+ end
49
+ end
50
+ end
51
+
52
+ def load
53
+ note 'Source file: ' + dump_file
71
54
 
72
- if $?.success?
73
- puts 'Successfully sourced the dump.' if @verbose
74
- else
75
- $stderr.puts "An error occured while loading the dump #{File.basename(dump_file)}."
55
+ source_command = send("#{config['adapter']}_command")
56
+ Util.system! source_command, :fail_message => "An error occured loading #{File.basename(dump_file)}"
76
57
  end
77
-
78
- $?.success?
79
- end
80
58
 
81
- def execute!
82
- execute or exit(1)
83
59
  end
84
-
85
60
  end
86
-