lib/guard/dsl_describer.rb in guard-0.8.4 vs lib/guard/dsl_describer.rb in guard-0.8.5
- old
+ new
@@ -1,60 +1,150 @@
-require 'guard/dsl'
-
-module Guard
-
- # The DslDescriber overrides methods to create an internal structure
- # of the Guardfile that is used in some inspection utility methods
- # like the CLI commands `show` and `list`.
- #
- # @see Guard::Dsl
- # @see Guard::CLI
- #
- class DslDescriber < Dsl
-
- @@guardfile_structure = [ { :guards => [] } ]
-
- class << self
-
- # Get the Guardfile structure.
- #
- # @return [Array<Hash>] the structure
- #
- def guardfile_structure
- @@guardfile_structure
- end
- end
-
- private
-
- # Declares a group of guards.
- #
- # @param [String] name the group's name called from the CLI
- # @yield a block where you can declare several guards
- #
- # @see Guard::Dsl#group
- #
- def group(name)
- @@guardfile_structure << { :group => name.to_sym, :guards => [] }
- @group = true
-
- yield if block_given?
-
- @group = false
- end
-
- # Declares a Guard.
- #
- # @param [String] name the Guard name
- # @param [Hash] options the options accepted by the Guard
- # @yield a block where you can declare several watch patterns and actions
- #
- # @see Guard::Dsl#guard
- #
- def guard(name, options = {})
- node = (@group ? @@guardfile_structure.last : @@guardfile_structure.first)
-
- node[:guards] << { :name => name, :options => options }
- end
-
- end
-end
+require 'guard/dsl'
+
+module Guard
+
+ autoload :UI, 'guard/ui'
+
+ # The DslDescriber overrides methods to create an internal structure
+ # of the Guardfile that is used in some inspection utility methods
+ # like the CLI commands `show` and `list`.
+ #
+ # @see Guard::Dsl
+ # @see Guard::CLI
+ #
+ class DslDescriber < Dsl
+
+ class << self
+
+ # Evaluate the DSL methods in the `Guardfile`.
+ #
+ # @option options [Array<Symbol,String>] groups the groups to evaluate
+ # @option options [String] guardfile the path to a valid Guardfile
+ # @option options [String] guardfile_contents a string representing the content of a valid Guardfile
+ # @raise [ArgumentError] when options are not a Hash
+ #
+ def evaluate_guardfile(options = {})
+ @@guardfile_structure = [{ :guards => [] }]
+ super options
+ end
+
+ # List the Guards that are available for use in your system and marks
+ # those that are currently used in your `Guardfile`.
+ #
+ # @example Guard list output
+ #
+ # Available guards:
+ # bundler *
+ # livereload
+ # ronn
+ # rspec *
+ # spork
+ #
+ # See also https://github.com/guard/guard/wiki/List-of-available-Guards
+ # * denotes ones already in your Guardfile
+ #
+ # @param [Hash] options the Guard options
+ #
+ def list(options)
+ evaluate_guardfile(options)
+
+ installed = guardfile_structure.inject([]) do |installed, group|
+ group[:guards].each { |guard| installed << guard[:name] } if group[:guards]
+ installed
+ end
+
+ UI.info 'Available guards:'
+
+ ::Guard.guard_gem_names.sort.uniq.each do |name|
+ UI.info " #{ name }#{ installed.include?(name) ? '*' : '' }"
+ end
+
+ UI.info ''
+ UI.info 'See also https://github.com/guard/guard/wiki/List-of-available-Guards'
+ UI.info '* denotes ones already in your Guardfile'
+ end
+
+ # Shows all Guards and their options that are defined in
+ # the `Guardfile`.
+ #
+ # @example guard show output
+ #
+ # (global):
+ # bundler
+ # coffeescript: input => "app/assets/javascripts", noop => true
+ # jasmine
+ # rspec: cli => "--fail-fast --format Fuubar
+ #
+ # @param [Hash] options the Guard options
+ #
+ def show(options)
+ evaluate_guardfile(options)
+
+ guardfile_structure.each do |group|
+ unless group[:guards].empty?
+ if group[:group]
+ UI.info "Group #{ group[:group] }:"
+ else
+ UI.info '(global):'
+ end
+
+ group[:guards].each do |guard|
+ line = " #{ guard[:name] }"
+
+ unless guard[:options].empty?
+ line += ": #{ guard[:options].sort.collect { |k, v| "#{ k } => #{ v.inspect }" }.join(', ') }"
+ end
+
+ UI.info line
+ end
+ end
+ end
+
+ UI.info ''
+ end
+
+ private
+
+ # Get the Guardfile structure.
+ #
+ # @return [Array<Hash>] the structure
+ #
+ def guardfile_structure
+ @@guardfile_structure
+ end
+
+ end
+
+ private
+
+ # Declares a group of guards.
+ #
+ # @param [String] name the group's name called from the CLI
+ # @yield a block where you can declare several guards
+ #
+ # @see Guard::Dsl#group
+ #
+ def group(name)
+ @@guardfile_structure << { :group => name.to_sym, :guards => [] }
+ @group = true
+
+ yield if block_given?
+
+ @group = false
+ end
+
+ # Declares a Guard.
+ #
+ # @param [String] name the Guard name
+ # @param [Hash] options the options accepted by the Guard
+ # @yield a block where you can declare several watch patterns and actions
+ #
+ # @see Guard::Dsl#guard
+ #
+ def guard(name, options = { })
+ node = (@group ? @@guardfile_structure.last : @@guardfile_structure.first)
+
+ node[:guards] << { :name => name, :options => options }
+ end
+
+ end
+end