diff --git a/README.md b/README.md index 5b3b05a..2b38251 100644 --- a/README.md +++ b/README.md @@ -331,6 +331,21 @@ Group frontend: livereload ``` +User config file +---------------- + +If a .guard.rb is found in your home directory, it will be appended to +the Guardfile. This can be used for tasks you want guard to handle but +other users probably don't. For example, indexing your source tree with +[Ctags](http://ctags.sourceforge.net): + +``` ruby +guard 'shell' do + watch(%r{^(?:app|lib)/.+\.rb$}) { `ctags -R` } +end + +``` + Create a new guard ------------------ diff --git a/lib/guard/dsl.rb b/lib/guard/dsl.rb index cba1b20..4f85edd 100644 --- a/lib/guard/dsl.rb +++ b/lib/guard/dsl.rb @@ -7,7 +7,8 @@ module Guard options.is_a?(Hash) or raise ArgumentError.new("evaluate_guardfile not passed a Hash!") @@options = options.dup - instance_eval_guardfile(fetch_guardfile_contents) + fetch_guardfile_contents + instance_eval_guardfile(guardfile_contents_with_user_config) UI.error "No guards found in Guardfile, please add at least one." if !::Guard.guards.nil? && ::Guard.guards.empty? end @@ -72,14 +73,17 @@ module Guard UI.error "The command file(#{@@options[:guardfile]}) seems to be empty." exit 1 end - - guardfile_contents end def guardfile_contents @@options ? @@options[:guardfile_contents] : "" end + def guardfile_contents_with_user_config + config = File.read(user_config_path) if File.exist?(user_config_path) + [guardfile_contents, config].join("\n") + end + def guardfile_path @@options ? @@options[:guardfile_path] : "" end @@ -102,6 +106,10 @@ module Guard File.expand_path(File.join("~", ".Guardfile")) end + def user_config_path + File.expand_path(File.join("~", ".guard.rb")) + end + end def group(name, &guard_definition) diff --git a/spec/guard/dsl_describer_spec.rb b/spec/guard/dsl_describer_spec.rb index c66367d..eaaa03d 100644 --- a/spec/guard/dsl_describer_spec.rb +++ b/spec/guard/dsl_describer_spec.rb @@ -1,7 +1,11 @@ require 'spec_helper' describe Guard::DslDescriber do - before(:each) { ::Guard.stub!(:guards).and_return([mock('Guard')]) } + before(:each) do + ::Guard.stub!(:guards).and_return([mock('Guard')]) + user_config_path = File.expand_path(File.join('~', '.guard.rb')) + File.stub(:exist?).with(user_config_path) { false } + end subject { described_class } diff --git a/spec/guard/dsl_spec.rb b/spec/guard/dsl_spec.rb index 1de89aa..0e70f5a 100644 --- a/spec/guard/dsl_spec.rb +++ b/spec/guard/dsl_spec.rb @@ -5,12 +5,18 @@ describe Guard::Dsl do before(:each) do @local_guardfile_path = File.join(Dir.pwd, 'Guardfile') @home_guardfile_path = File.expand_path(File.join("~", ".Guardfile")) + @user_config_path = File.expand_path(File.join("~", ".guard.rb")) ::Guard.stub!(:options).and_return(:debug => true) ::Guard.stub!(:guards).and_return([mock('Guard')]) end + def self.disable_user_config + before(:each) { File.stub(:exist?).with(@user_config_path) { false } } + end + describe "it should select the correct data source for Guardfile" do before(:each) { ::Guard::Dsl.stub!(:instance_eval_guardfile) } + disable_user_config it "should use a string for initializing" do Guard::UI.should_not_receive(:error) @@ -51,6 +57,15 @@ describe Guard::Dsl do lambda { subject.evaluate_guardfile(:guardfile => '/abc/Guardfile') }.should_not raise_error subject.guardfile_contents.should == "guard :foo" end + + it 'should append the user config file if present' do + fake_guardfile('/abc/Guardfile', "guard :foo") + fake_guardfile(@user_config_path, "guard :bar") + Guard::UI.should_not_receive(:error) + lambda { subject.evaluate_guardfile(:guardfile => '/abc/Guardfile') }.should_not raise_error + subject.guardfile_contents_with_user_config.should == "guard :foo\nguard :bar" + end + end it "displays an error message when no Guardfile is found" do @@ -68,6 +83,7 @@ describe Guard::Dsl do describe "correctly reads data from its valid data source" do before(:each) { ::Guard::Dsl.stub!(:instance_eval_guardfile) } + disable_user_config it "reads correctly from a string" do lambda { subject.evaluate_guardfile(:guardfile_contents => valid_guardfile_string) }.should_not raise_error @@ -200,6 +216,8 @@ describe Guard::Dsl do end describe "#group" do + disable_user_config + it "evaluates only the specified string group" do ::Guard.should_receive(:add_guard).with(:pow, [], { :group => :default }) ::Guard.should_receive(:add_guard).with(:test, [], { :group => :w }) @@ -242,6 +260,8 @@ describe Guard::Dsl do end describe "#guard" do + disable_user_config + it "loads a guard specified as a quoted string from the DSL" do ::Guard.should_receive(:add_guard).with(:test, [], { :group => :default }) @@ -274,6 +294,8 @@ describe Guard::Dsl do end describe "#watch" do + disable_user_config + it "should receive watchers when specified" do guardfile_with_watchers = "guard 'test' do watch('a') { 'b' }