marv 0.2.5 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. data/.rspec +1 -0
  2. data/CHANGELOG.md +13 -0
  3. data/Gemfile +3 -4
  4. data/Gemfile.lock +70 -28
  5. data/LICENSE +24 -0
  6. data/Rakefile +7 -1
  7. data/VERSION +1 -1
  8. data/layouts/bramble/functions/functions.php.erb +12 -12
  9. data/layouts/bramble/includes/options.php.erb +4 -4
  10. data/layouts/config/{config.tt → project-config.rb} +4 -1
  11. data/layouts/config/rack-config.ru +38 -0
  12. data/layouts/config/wp-config.php.erb +105 -0
  13. data/layouts/default/functions/functions.php.erb +25 -25
  14. data/layouts/default/includes/filters-admin.php.erb +8 -8
  15. data/layouts/default/includes/filters.php.erb +11 -11
  16. data/layouts/default/includes/helpers.php.erb +1 -1
  17. data/layouts/default/templates/404.php.erb +2 -2
  18. data/layouts/default/templates/archive.php.erb +5 -5
  19. data/layouts/default/templates/author.php.erb +1 -1
  20. data/layouts/default/templates/partials/comments.php.erb +8 -8
  21. data/layouts/default/templates/partials/content-none.php.erb +3 -3
  22. data/layouts/default/templates/partials/content.php.erb +2 -2
  23. data/layouts/default/templates/partials/searchform.php.erb +3 -3
  24. data/layouts/default/templates/search.php.erb +2 -2
  25. data/lib/guard/marv/assets.rb +11 -3
  26. data/lib/guard/marv/config.rb +2 -0
  27. data/lib/guard/marv/folders.rb +37 -0
  28. data/lib/guard/marv/functions.rb +13 -9
  29. data/lib/guard/marv/templates.rb +12 -3
  30. data/lib/marv.rb +1 -0
  31. data/lib/marv/builder.rb +49 -15
  32. data/lib/marv/cli.rb +135 -10
  33. data/lib/marv/engines.rb +3 -1
  34. data/lib/marv/generator.rb +13 -8
  35. data/lib/marv/guard.rb +4 -1
  36. data/lib/marv/project.rb +18 -10
  37. data/lib/marv/server.rb +301 -0
  38. data/lib/marv/version.rb +1 -1
  39. data/marv.gemspec +18 -16
  40. data/spec/lib/marv/project_spec.rb +3 -4
  41. metadata +27 -38
@@ -1,17 +1,17 @@
1
1
  <div class="no-results not-found">
2
2
  <header class="page-header">
3
- <h1 class="page-title"><?php _e( 'Nothing Found', '<%= theme_id %>' ); ?></h1>
3
+ <h1 class="page-title"><?php _e( 'Nothing Found', '<%= project_id %>' ); ?></h1>
4
4
  </header>
5
5
 
6
6
  <div class="page-content">
7
7
  <?php if( is_search() ) : ?>
8
8
 
9
- <p><?php _e( 'Sorry, but nothing matched your search terms. Please try again with some different keywords.', '<%= theme_id %>' ); ?></p>
9
+ <p><?php _e( 'Sorry, but nothing matched your search terms. Please try again with some different keywords.', '<%= project_id %>' ); ?></p>
10
10
  <?php get_search_form(); ?>
11
11
 
12
12
  <?php else : ?>
13
13
 
14
- <p><?php _e( 'It seems we can&rsquo;t find what you&rsquo;re looking for. Perhaps searching can help.', '<%= theme_id %>' ); ?></p>
14
+ <p><?php _e( 'It seems we can&rsquo;t find what you&rsquo;re looking for. Perhaps searching can help.', '<%= project_id %>' ); ?></p>
15
15
  <?php get_search_form(); ?>
16
16
 
17
17
  <?php endif; ?>
@@ -6,11 +6,11 @@
6
6
  <?php if ( is_search() ) : ?>
7
7
  <div class="entry-summary">
8
8
  <?php the_excerpt(); ?>
9
- <a href="<?php the_permalink(); ?>"><?php _e('Read more', '<%= theme_id %>') ?></a>
9
+ <a href="<?php the_permalink(); ?>"><?php _e('Read more', '<%= project_id %>') ?></a>
10
10
  </div>
11
11
  <?php else : ?>
12
12
  <div class="entry-content">
13
- <?php the_content( __( 'Continue reading <span class="meta-nav">&rarr;</span>', '<%= theme_id %>' ) ); ?>
13
+ <?php the_content( __( 'Continue reading <span class="meta-nav">&rarr;</span>', '<%= project_id %>' ) ); ?>
14
14
  </div>
15
15
  <?php endif; ?>
16
16
  </div>
@@ -1,5 +1,5 @@
1
1
  <form method="get" id="searchform" action="<?php echo esc_url( home_url( '/' ) ); ?>">
2
- <label for="s" class="assistive-text"><?php _e( 'Search', '<%= theme_id %>' ); ?></label>
3
- <input type="text" class="field" name="s" id="s" placeholder="<?php esc_attr_e( 'Search', '<%= theme_id %>' ); ?>" />
4
- <button type="submit" class="submit" name="submit" id="searchsubmit"><?php _e( 'Search', '<%= theme_id %>' ); ?></button>
2
+ <label for="s" class="assistive-text"><?php _e( 'Search', '<%= project_id %>' ); ?></label>
3
+ <input type="text" class="field" name="s" id="s" placeholder="<?php esc_attr_e( 'Search', '<%= project_id %>' ); ?>" />
4
+ <button type="submit" class="submit" name="submit" id="searchsubmit"><?php _e( 'Search', '<%= project_id %>' ); ?></button>
5
5
  </form>
@@ -5,7 +5,7 @@
5
5
  <?php if ( have_posts() ) : ?>
6
6
 
7
7
  <header class="page-header">
8
- <h1 class="page-title"><?php printf( __( 'Search Results for: %s', '<%= theme_id %>' ), '<span>' . get_search_query() . '</span>' ); ?></h1>
8
+ <h1 class="page-title"><?php printf( __( 'Search Results for: %s', '<%= project_id %>' ), '<span>' . get_search_query() . '</span>' ); ?></h1>
9
9
  </header>
10
10
 
11
11
  <?php while ( have_posts() ) : the_post(); ?>
@@ -14,7 +14,7 @@
14
14
 
15
15
  <?php endwhile; ?>
16
16
 
17
- <?php <%= theme_id %>_paging_nav(); ?>
17
+ <?php <%= project_id %>_paging_nav(); ?>
18
18
 
19
19
  <?php else : ?>
20
20
 
@@ -10,22 +10,30 @@ module Guard
10
10
 
11
11
  def start
12
12
  UI.info "Building all assets"
13
- ::Marv::Guard.builder.build_assets
13
+ build_assets
14
14
  end
15
15
 
16
16
  # Called on Ctrl-\ signal
17
17
  # This method should be principally used for long action like running all specs/tests/...
18
18
  def run_all
19
19
  UI.info "Rebuilding all assets"
20
- ::Marv::Guard.builder.clean_images
21
- ::Marv::Guard.builder.build_assets
20
+ clean_build_assets
22
21
  end
23
22
 
24
23
  # Called on file(s) modifications
25
24
  def run_on_change(paths)
26
25
  UI.info "Assets have changed, rebuilding..."
26
+ clean_build_assets
27
+ end
28
+
29
+ def build_assets
30
+ ::Marv::Guard.builder.build_assets
31
+ end
32
+
33
+ def clean_build_assets
27
34
  ::Marv::Guard.builder.clean_images
28
35
  ::Marv::Guard.builder.build_assets
29
36
  end
37
+
30
38
  end
31
39
  end
@@ -3,6 +3,7 @@ require 'guard/guard'
3
3
 
4
4
  module Guard
5
5
  class MarvConfig < ::Guard::Guard
6
+
6
7
  def initialize(watchers=[], options={})
7
8
  super
8
9
  end
@@ -30,5 +31,6 @@ module Guard
30
31
  # Rebuild everything if the config changes
31
32
  ::Marv::Guard.builder.build
32
33
  end
34
+
33
35
  end
34
36
  end
@@ -0,0 +1,37 @@
1
+ require 'guard'
2
+ require 'guard/guard'
3
+
4
+ module Guard
5
+ class MarvFolders < ::Guard::Guard
6
+
7
+ def initialize(watchers=[], options={})
8
+ super
9
+ end
10
+
11
+ def start
12
+ UI.info "Copying folders over"
13
+ copy_folders
14
+ end
15
+
16
+ def run_all
17
+ UI.info "Rebuilding all folders"
18
+ clean_copy_folders
19
+ end
20
+
21
+ # Called on file(s) modifications
22
+ def run_on_change(paths)
23
+ UI.info "Folders have changed, copying over"
24
+ clean_copy_folders
25
+ end
26
+
27
+ def copy_folders
28
+ ::Marv::Guard.builder.copy_folders
29
+ end
30
+
31
+ def clean_copy_folders
32
+ ::Marv::Guard.builder.clean_folders
33
+ ::Marv::Guard.builder.copy_folders
34
+ end
35
+
36
+ end
37
+ end
@@ -3,34 +3,38 @@ require 'guard/guard'
3
3
 
4
4
  module Guard
5
5
  class MarvFunctions < ::Guard::Guard
6
+
6
7
  def initialize(watchers=[], options={})
7
8
  super
8
9
  end
9
10
 
10
11
  def start
11
12
  UI.info "Copying functions over"
12
- ::Marv::Guard.builder.copy_functions
13
- ::Marv::Guard.builder.copy_includes
14
- ::Marv::Guard.builder.copy_extras
13
+ copy_functions
15
14
  end
16
15
 
17
16
  def run_all
18
17
  UI.info "Rebuilding all functions"
19
- ::Marv::Guard.builder.clean_functions
20
- ::Marv::Guard.builder.copy_functions
21
- ::Marv::Guard.builder.clean_includes
22
- ::Marv::Guard.builder.copy_includes
23
- ::Marv::Guard.builder.copy_extras
18
+ clean_copy_functions
24
19
  end
25
20
 
26
21
  # Called on file(s) modifications
27
22
  def run_on_change(paths)
28
23
  UI.info "Functions have changed, copying over"
24
+ clean_copy_functions
25
+ end
26
+
27
+ def copy_functions
28
+ ::Marv::Guard.builder.copy_functions
29
+ ::Marv::Guard.builder.copy_includes
30
+ end
31
+
32
+ def clean_copy_functions
29
33
  ::Marv::Guard.builder.clean_functions
30
34
  ::Marv::Guard.builder.copy_functions
31
35
  ::Marv::Guard.builder.clean_includes
32
36
  ::Marv::Guard.builder.copy_includes
33
- ::Marv::Guard.builder.copy_extras
34
37
  end
38
+
35
39
  end
36
40
  end
@@ -3,26 +3,35 @@ require 'guard/guard'
3
3
 
4
4
  module Guard
5
5
  class MarvTemplates < ::Guard::Guard
6
+
6
7
  def initialize(watchers=[], options={})
7
8
  super
8
9
  end
9
10
 
10
11
  def start
11
12
  UI.info "Copying templates over"
12
- ::Marv::Guard.builder.copy_templates
13
+ copy_templates
13
14
  end
14
15
 
15
16
  def run_all
16
17
  UI.info "Rebuilding all templates"
17
- ::Marv::Guard.builder.clean_templates
18
- ::Marv::Guard.builder.copy_templates
18
+ clean_copy_templates
19
19
  end
20
20
 
21
21
  # Called on file(s) modifications
22
22
  def run_on_change(paths)
23
23
  UI.info "Templates have changed, copying over"
24
+ clean_copy_templates
25
+ end
26
+
27
+ def copy_templates
28
+ ::Marv::Guard.builder.copy_templates
29
+ end
30
+
31
+ def clean_copy_templates
24
32
  ::Marv::Guard.builder.clean_templates
25
33
  ::Marv::Guard.builder.copy_templates
26
34
  end
35
+
27
36
  end
28
37
  end
data/lib/marv.rb CHANGED
@@ -7,4 +7,5 @@ module Marv
7
7
  autoload :Project, 'marv/project'
8
8
  autoload :Builder, 'marv/builder'
9
9
  autoload :Generator, 'marv/generator'
10
+ autoload :Server, 'marv/server'
10
11
  end
data/lib/marv/builder.rb CHANGED
@@ -6,6 +6,7 @@ require 'marv/engines'
6
6
 
7
7
  module Marv
8
8
  class Builder
9
+
9
10
  def initialize(project)
10
11
  @project = project
11
12
  @task = project.task
@@ -13,7 +14,6 @@ module Marv
13
14
  @assets_path = @project.assets_path
14
15
  @functions_path = @project.functions_path
15
16
  @includes_path = @project.includes_path
16
- @extras_path = @project.extras_path
17
17
  @package_path = @project.package_path
18
18
 
19
19
  init_sprockets
@@ -25,7 +25,7 @@ module Marv
25
25
  copy_templates
26
26
  copy_functions
27
27
  copy_includes
28
- copy_extras
28
+ copy_folders
29
29
  build_assets
30
30
  end
31
31
 
@@ -97,13 +97,18 @@ module Marv
97
97
  end
98
98
 
99
99
  def clean_functions
100
- FileUtils.rm File.join(@project.build_path, 'functions.php')
101
- FileUtils.rm_rf File.join(@project.build_path, 'functions')
100
+ #remove functions php
101
+ FileUtils.rm File.join(@project.build_path, 'functions.php') if File.exists?(File.join(@project.build_path, 'functions.php'))
102
+ # Remove plugin file
103
+ FileUtils.rm File.join(@project.build_path, @project.project_php_file) if File.exists?(@project.project_php_file)
104
+ # Remove functions folder
105
+ FileUtils.rm_rf File.join(@project.build_path, 'functions') if File.directory?(File.join(@project.build_path, 'functions'))
102
106
  end
103
107
 
104
108
  def copy_functions
105
109
  functions_erb_path = File.join(@functions_path, 'functions.php.erb')
106
110
  functions_php_path = File.join(@functions_path, 'functions.php')
111
+ plugin_php_path = File.join(@functions_path, @project.project_php_file)
107
112
 
108
113
  if File.exists?(functions_erb_path)
109
114
  destination = File.join(@project.build_path, 'functions.php')
@@ -112,8 +117,12 @@ module Marv
112
117
  FileUtils.cp functions_php_path, @project.build_path
113
118
  end
114
119
 
120
+ if File.exists?(plugin_php_path)
121
+ FileUtils.cp plugin_php_path, @project.build_path
122
+ end
123
+
115
124
  functions_paths = Dir.glob(File.join(@functions_path, '*')).reject do |filename|
116
- [functions_erb_path, functions_php_path].include?(filename)
125
+ [functions_erb_path, functions_php_path, plugin_php_path].include?(filename)
117
126
  end
118
127
 
119
128
  unless functions_paths.empty?
@@ -121,7 +130,7 @@ module Marv
121
130
  FileUtils.mkdir_p(File.join(@project.build_path, 'functions'))
122
131
 
123
132
  # Iterate over all files in source/functions, skipping the actual functions.php file
124
- paths = Dir.glob(File.join(@functions_path, '**', '*')).reject {|filename| [functions_erb_path, functions_php_path].include?(filename) }
133
+ paths = Dir.glob(File.join(@functions_path, '**', '*')).reject {|filename| [functions_erb_path, functions_php_path, plugin_php_path].include?(filename) }
125
134
 
126
135
  copy_paths_with_erb(paths, @functions_path, File.join(@project.build_path, 'functions'))
127
136
  end
@@ -142,12 +151,27 @@ module Marv
142
151
  end
143
152
  end
144
153
 
145
- def copy_extras
146
- unless Dir.glob(File.join(@extras_path, '*')).empty?
154
+ def clean_folders
155
+ Dir.glob(File.join(@project.source_path, '*')).each do |folder|
156
+ unless [@assets_path, @templates_path, @functions_path, @includes_path].include?(folder)
157
+ if File.directory?(folder)
158
+ relative_path = folder.gsub(@project.source_path, '')
159
+ destination = File.join(@project.build_path, relative_path)
147
160
 
148
- # Iterate over all files in source/extras, so we can exclude if necessary
149
- paths = Dir.glob(File.join(@extras_path, '**', '*'))
150
- copy_paths_with_erb(paths, @extras_path, File.join(@project.build_path, ''))
161
+ FileUtils.rm_rf destination
162
+ end
163
+ end
164
+ end
165
+ end
166
+
167
+ def copy_folders
168
+ Dir.glob(File.join(@project.source_path, '*')).each do |folder|
169
+ unless [@assets_path, @templates_path, @functions_path, @includes_path].include?(folder)
170
+ if File.directory?(folder)
171
+ paths = Dir.glob(File.join(folder, '**', '*'))
172
+ copy_paths_with_erb(paths, @project.source_path, @project.build_path)
173
+ end
174
+ end
151
175
  end
152
176
  end
153
177
 
@@ -156,7 +180,16 @@ module Marv
156
180
  end
157
181
 
158
182
  def build_assets
159
- [['style.css'], ['admin.css'], ['javascripts', 'theme.js'], ['javascripts', 'admin.js']].each do |asset|
183
+ default_assets = [['style.css'], ['admin.css'], ['javascripts', 'theme.js'], ['javascripts', 'admin.js']]
184
+ additional_assets = @project.config[:additional_assets]
185
+
186
+ if additional_assets
187
+ assets = default_assets + additional_assets
188
+ else
189
+ assets = default_assets
190
+ end
191
+
192
+ assets.each do |asset|
160
193
  destination = File.join(@project.build_path, asset)
161
194
 
162
195
  # Catch any sprockets errors and continue the process
@@ -169,7 +202,7 @@ module Marv
169
202
  end
170
203
  rescue Exception => e
171
204
  @task.say "Error while building #{asset.last}:"
172
- @task.say e.message, Thor::Shell::Color::RED
205
+ @task.say e.message, :red
173
206
 
174
207
  File.open(destination, 'w') do |file|
175
208
  file.puts(e.message)
@@ -273,9 +306,10 @@ module Marv
273
306
  end
274
307
  rescue Exception => e
275
308
  @task.say "Error while building #{File.basename(source)}:"
276
- @task.say e.message + "\n", Thor::Shell::Color::RED
309
+ @task.say e.message + "\n", :red
277
310
  exit
278
- end
311
+ end
279
312
  end
313
+
280
314
  end
281
315
  end
data/lib/marv/cli.rb CHANGED
@@ -3,38 +3,68 @@ require 'guard/marv/assets'
3
3
  require 'guard/marv/config'
4
4
  require 'guard/marv/templates'
5
5
  require 'guard/marv/functions'
6
+ require 'guard/marv/folders'
6
7
 
7
8
  module Marv
8
9
  class CLI < Thor
10
+
9
11
  include Thor::Actions
10
12
 
11
13
  def self.source_root
12
14
  File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'layouts'))
13
15
  end
14
16
 
15
- desc "create DIRECTORY", "Creates a Marv project"
17
+ desc "create DIRECTORY", "Creates a Marv project into specified directory"
16
18
  long_desc "Creates a new project. Use the layout option to choose a scaffold"
17
19
  method_option :layout, :type => :string, :default => 'default', :desc => "Name of alternate layout"
20
+ method_option :local, :type => :boolean, :force => false, :desc => "Use local layout from .marv folder"
18
21
  def create(dir)
19
22
  theme = {}
20
23
  theme[:name] = dir
21
24
 
22
- project = Marv::Project.create(dir, theme, self, options[:layout])
25
+ project = Marv::Project.create(dir, theme, self, options[:layout], options[:local])
23
26
  end
24
27
 
25
- desc "link PATH", "Create a symbolic link to the compilation directory"
26
- long_desc "This command will symlink the compiled version of the theme to the specified path.\n\n"+
27
- "To compile the theme use the `marv watch` command"
28
- def link(path)
28
+ desc "link SERVER", "Create a symbolic link to the compilation directory"
29
+ long_desc "This command will symlink the compiled version of the project to the specified server or WordPress install path"
30
+ method_option :folder, :type => :string, :aliases => "-f" , :enum => %w{themes plugins}, :required => true, :desc => "Link Marv project in themes or plugins folfer"
31
+ method_option :global, :type => :boolean, :aliases => "-g" , :force => false, :desc => "Link Marv project in global folder"
32
+ method_option :path, :type => :string, :aliases => "-p" , :desc => "Create a symbolic link to a WordPress folder"
33
+ def link(server=nil)
29
34
  project = Marv::Project.new('.', self)
35
+ project_folder = project.project_id.gsub('_', '-')
30
36
 
31
37
  FileUtils.mkdir_p project.build_path unless File.directory?(project.build_path)
32
38
 
33
- do_link(project, path)
39
+ unless server.nil?
40
+ server_path = File.join(ENV['HOME'], '.marv', 'servers', server, 'wp-content', options[:folder])
41
+
42
+ unless options[:global]
43
+ do_link(project, File.join(server_path, project_folder))
44
+ end
45
+ end
46
+
47
+ if options[:global]
48
+ global_folder = File.join(ENV['HOME'], '.marv', options[:folder])
49
+ FileUtils.mkdir_p global_folder unless File.directory?(global_folder)
50
+
51
+ do_link(project, File.join(global_folder, project_folder))
52
+
53
+ servers = Dir.glob(File.join(ENV['HOME'], '.marv', 'servers' , '*'))
54
+
55
+ servers.each do |server|
56
+ shell.mute { do_link(project, File.join(server, 'wp-content', options[:folder], project_folder)) }
57
+ end
58
+ end
59
+
60
+ if options[:path]
61
+ wp_path = File.join(options[:path], 'wp-content', options[:folder])
62
+ do_link(project, File.join(wp_path, project_folder))
63
+ end
34
64
  end
35
65
 
36
66
  desc "watch", "Start watch process"
37
- long_desc "Watches the source directory in your project for changes, and reflects those changes in a compile folder"
67
+ long_desc "Watches the source directory in your Marv project for changes, and reflects those changes in a compile folder"
38
68
  method_option :config, :type => :string, :desc => "Name of alternate config file"
39
69
  def watch
40
70
  project = Marv::Project.new('.', self, nil, options[:config])
@@ -61,7 +91,7 @@ module Marv
61
91
  directory(project.build_path, dir)
62
92
  end
63
93
 
64
- desc "package FILENAME", "Compile and zip your project to FILENAME.zip"
94
+ desc "package FILENAME", "Compile and zip your Marv project to FILENAME.zip"
65
95
  method_option :config, :type => :string, :desc => "Name of alternate config file"
66
96
  def package(filename=nil)
67
97
  project = Marv::Project.new('.', self, nil, options[:config])
@@ -71,8 +101,102 @@ module Marv
71
101
  builder.zip(filename)
72
102
  end
73
103
 
104
+ desc "server SERVER", "Start a Marv server by name"
105
+ method_option :create, :type => :boolean, :aliases => "-c" , :force => false, :desc => "Create a new Marv server"
106
+ method_option :stop, :type => :boolean, :aliases => "-s" , :force => false, :desc => "Stop a running Marv server"
107
+ method_option :restart, :type => :boolean, :aliases => "-r" , :force => false, :desc => "Restart a Marv server"
108
+ # method_option :backup, :type => :boolean, :force => false, :desc => "Backup a Marv server"
109
+ # method_option :restore, :type => :boolean, :force => false, :desc => "Restore a Marv server"
110
+ method_option :remove, :type => :boolean, :force => false, :desc => "Remove a Marv server"
111
+ def server(name)
112
+ config = {}
113
+
114
+ if options[:create]
115
+ say "This will create a new Marv server with WordPress installed:", :green
116
+ config[:user] = ask("Mysql username:", nil, {:default => "root"})
117
+ config[:password] = ask("Mysql user password:", nil, {:default => "required"})
118
+ config[:host] = ask("Mysql host:", nil, {:default => "localhost"})
119
+ config[:port] = ask("Mysql port:", nil, {:default => "3306"})
120
+ config[:version] = ask("WordPress version:", nil, {:default => "latest"})
121
+
122
+ server = Marv::Server.new(name, self, config)
123
+ server.create_server
124
+ else
125
+ server = Marv::Server.new(name, self, nil)
126
+
127
+ if options.empty?
128
+ server.start_server
129
+ end
130
+
131
+ if options[:stop]
132
+ server.stop_server
133
+ end
134
+
135
+ if options[:restart]
136
+ server.restart_server
137
+ end
138
+
139
+ if options[:remove]
140
+ say "This will remove the specified Marv server:", :green
141
+ config[:user] = ask("Mysql username:", nil, {:default => "root"})
142
+ config[:password] = ask("Mysql user password:", nil, {:default => "required"})
143
+ config[:host] = ask("Mysql host:", nil, {:default => "localhost"})
144
+ config[:port] = ask("Mysql port:", nil, {:default => "3306"})
145
+ config[:version] = "latest"
146
+
147
+ server = Marv::Server.new(name, self, config)
148
+ server.remove_server
149
+ end
150
+ end
151
+ exit
152
+ end
153
+
154
+ desc "servers OPTION", "List all available Marv servers"
155
+ method_option :remove, :type => :boolean, :force => false, :desc => "Remove all Marv servers"
156
+ # method_option :backup, :type => :boolean, :force => false, :desc => "Backup existing Marv servers"
157
+ # method_option :restore, :type => :boolean, :force => false, :desc => "Restore Marv servers from backup file"
158
+ def servers
159
+ if options.empty?
160
+ list_all_servers
161
+ end
162
+
163
+ if options[:remove]
164
+ config = {}
165
+
166
+ say "This will remove all available Marv servers:", :green
167
+ config[:user] = ask("Mysql username:", nil, {:default => "root"})
168
+ config[:password] = ask("Mysql user password:", nil, {:default => "required"})
169
+ config[:host] = ask("Mysql host:", nil, {:default => "localhost"})
170
+ config[:port] = ask("Mysql port:", nil, {:default => "3306"})
171
+ config[:version] = "latest"
172
+
173
+ remove_all_servers(config)
174
+ end
175
+ exit
176
+ end
177
+
74
178
  protected
75
179
 
180
+ def list_all_servers
181
+ servers_root = File.join(ENV['HOME'], '.marv', 'servers')
182
+ servers = Dir.glob(File.join(servers_root, '*'))
183
+
184
+ servers.each do |server|
185
+ say "Available marv servers:", :yellow
186
+ say '- ' + File.basename(server), :green
187
+ end
188
+ end
189
+
190
+ def remove_all_servers(config)
191
+ servers_root = File.join(ENV['HOME'], '.marv', 'servers')
192
+ servers = Dir.glob(File.join(servers_root, '*'))
193
+
194
+ servers.each do |server|
195
+ server = Marv::Server.new(File.basename(server), self, config)
196
+ server.remove_server
197
+ end
198
+ end
199
+
76
200
  def do_link(project, path)
77
201
  begin
78
202
  project.link(path)
@@ -80,9 +204,10 @@ module Marv
80
204
  say_status :error, "The path #{File.dirname(path)} does not exist", :red
81
205
  exit 2
82
206
  rescue Errno::EEXIST
83
- say_status :error, "The path #{path} already exsts", :red
207
+ say_status :error, "The path #{path} already exists", :red
84
208
  exit 2
85
209
  end
86
210
  end
211
+
87
212
  end
88
213
  end