2010-10-18 19:45:31 +00:00
|
|
|
require 'spec_helper'
|
2011-05-26 16:53:58 +00:00
|
|
|
require 'guard/guard'
|
2010-10-18 19:45:31 +00:00
|
|
|
|
|
|
|
describe Guard do
|
2011-02-22 14:15:09 +00:00
|
|
|
|
2011-05-13 09:26:05 +00:00
|
|
|
describe ".setup" do
|
|
|
|
subject { ::Guard.setup }
|
2011-02-22 14:15:09 +00:00
|
|
|
|
2011-05-13 09:26:05 +00:00
|
|
|
it "returns itself for chaining" do
|
|
|
|
subject.should be ::Guard
|
|
|
|
end
|
2011-02-22 14:15:09 +00:00
|
|
|
|
2011-08-16 22:39:45 +00:00
|
|
|
it "initializes @guards" do
|
|
|
|
subject.guards.should eql []
|
|
|
|
end
|
|
|
|
|
|
|
|
it "initializes @groups" do
|
2011-09-15 23:01:58 +00:00
|
|
|
Guard.groups.should eql [{ :name => :default, :options => {} }]
|
2011-05-13 09:26:05 +00:00
|
|
|
end
|
2011-02-22 14:15:09 +00:00
|
|
|
|
2011-05-13 09:26:05 +00:00
|
|
|
it "initializes the options" do
|
|
|
|
opts = { :my_opts => true }
|
2011-08-16 22:39:45 +00:00
|
|
|
Guard.setup(opts).options.should include(:my_opts)
|
2011-05-13 09:26:05 +00:00
|
|
|
end
|
2011-02-22 14:15:09 +00:00
|
|
|
|
2011-05-13 09:26:05 +00:00
|
|
|
it "initializes the listener" do
|
|
|
|
::Guard.listener.should be_kind_of(Guard::Listener)
|
|
|
|
end
|
2011-04-10 20:32:29 +00:00
|
|
|
|
2011-07-28 22:23:20 +00:00
|
|
|
it "respect the watchdir option" do
|
|
|
|
::Guard.setup(:watchdir => "/foo/bar")
|
|
|
|
::Guard.listener.directory.should eql "/foo/bar"
|
|
|
|
end
|
|
|
|
|
2011-05-13 09:26:05 +00:00
|
|
|
it "turns on the notifier by default" do
|
|
|
|
ENV["GUARD_NOTIFY"] = nil
|
|
|
|
::Guard::Notifier.should_receive(:turn_on)
|
|
|
|
::Guard.setup(:notify => true)
|
|
|
|
end
|
2011-05-06 21:19:31 +00:00
|
|
|
|
2011-05-13 09:26:05 +00:00
|
|
|
it "turns off the notifier if the notify option is false" do
|
|
|
|
::Guard::Notifier.should_receive(:turn_off)
|
|
|
|
::Guard.setup(:notify => false)
|
|
|
|
end
|
2011-05-06 21:19:31 +00:00
|
|
|
|
2011-05-13 09:26:05 +00:00
|
|
|
it "turns off the notifier if environment variable GUARD_NOTIFY is false" do
|
|
|
|
ENV["GUARD_NOTIFY"] = 'false'
|
|
|
|
::Guard::Notifier.should_receive(:turn_off)
|
|
|
|
::Guard.setup(:notify => true)
|
2010-10-27 13:18:00 +00:00
|
|
|
end
|
2011-06-28 13:13:24 +00:00
|
|
|
|
2011-08-05 12:37:08 +00:00
|
|
|
it "logs command execution if the debug option is true" do
|
|
|
|
::Guard.should_receive(:debug_command_execution)
|
|
|
|
::Guard.setup(:debug => true)
|
|
|
|
end
|
2011-05-13 09:26:05 +00:00
|
|
|
end
|
2011-08-05 08:23:54 +00:00
|
|
|
|
2011-07-28 22:23:20 +00:00
|
|
|
describe ".start" do
|
|
|
|
it "basic check that core methods are called" do
|
|
|
|
opts = { :my_opts => true, :guardfile => File.join(@fixture_path, "Guardfile") }
|
|
|
|
::Guard.should_receive(:setup).with(opts)
|
|
|
|
::Guard::Dsl.should_receive(:evaluate_guardfile).with(opts)
|
|
|
|
::Guard.listener.should_receive(:start)
|
|
|
|
|
|
|
|
::Guard.start(opts)
|
|
|
|
end
|
|
|
|
end
|
2011-02-22 14:15:09 +00:00
|
|
|
|
2011-08-16 22:39:45 +00:00
|
|
|
describe ".add_guard" do
|
|
|
|
before(:each) do
|
|
|
|
@guard_rspec_class = double('Guard::RSpec')
|
|
|
|
@guard_rspec = double('Guard::RSpec')
|
|
|
|
|
|
|
|
Guard.stub!(:get_guard_class) { @guard_rspec_class }
|
|
|
|
|
|
|
|
Guard.setup
|
|
|
|
end
|
|
|
|
|
|
|
|
it "accepts guard name as string" do
|
|
|
|
@guard_rspec_class.should_receive(:new).and_return(@guard_rspec)
|
|
|
|
|
|
|
|
Guard.add_guard('rspec')
|
|
|
|
end
|
|
|
|
|
|
|
|
it "accepts guard name as symbol" do
|
|
|
|
@guard_rspec_class.should_receive(:new).and_return(@guard_rspec)
|
|
|
|
|
|
|
|
Guard.add_guard(:rspec)
|
|
|
|
end
|
|
|
|
|
|
|
|
it "adds guard to the @guards array" do
|
|
|
|
@guard_rspec_class.should_receive(:new).and_return(@guard_rspec)
|
|
|
|
|
|
|
|
Guard.add_guard(:rspec)
|
|
|
|
|
|
|
|
Guard.guards.should eql [@guard_rspec]
|
|
|
|
end
|
|
|
|
|
|
|
|
context "with no watchers given" do
|
|
|
|
it "gives an empty array of watchers" do
|
2011-08-17 08:04:42 +00:00
|
|
|
@guard_rspec_class.should_receive(:new).with([], {}).and_return(@guard_rspec)
|
2011-08-16 22:39:45 +00:00
|
|
|
|
|
|
|
Guard.add_guard(:rspec, [])
|
2010-11-03 22:31:00 +00:00
|
|
|
end
|
2011-08-16 22:39:45 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
context "with watchers given" do
|
|
|
|
it "give the watchers array" do
|
2011-08-17 08:04:42 +00:00
|
|
|
@guard_rspec_class.should_receive(:new).with([:foo], {}).and_return(@guard_rspec)
|
2011-02-22 14:15:09 +00:00
|
|
|
|
2011-08-16 22:39:45 +00:00
|
|
|
Guard.add_guard(:rspec, [:foo])
|
2010-11-03 22:31:00 +00:00
|
|
|
end
|
2011-08-16 22:39:45 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
context "with no options given" do
|
|
|
|
it "gives an empty hash of options" do
|
2011-08-17 08:04:42 +00:00
|
|
|
@guard_rspec_class.should_receive(:new).with([], {}).and_return(@guard_rspec)
|
2011-02-22 14:15:09 +00:00
|
|
|
|
2011-08-16 23:34:27 +00:00
|
|
|
Guard.add_guard(:rspec, [], [], {})
|
2010-11-03 22:31:00 +00:00
|
|
|
end
|
2011-08-16 22:39:45 +00:00
|
|
|
end
|
2011-02-22 14:15:09 +00:00
|
|
|
|
2011-08-16 22:39:45 +00:00
|
|
|
context "with options given" do
|
|
|
|
it "give the options hash" do
|
2011-08-17 08:04:42 +00:00
|
|
|
@guard_rspec_class.should_receive(:new).with([], { :foo => true, :group => :backend }).and_return(@guard_rspec)
|
2011-08-16 22:39:45 +00:00
|
|
|
|
2011-08-17 08:45:20 +00:00
|
|
|
Guard.add_guard(:rspec, [], [], { :foo => true, :group => :backend })
|
2011-04-10 20:32:29 +00:00
|
|
|
end
|
2010-10-27 13:18:00 +00:00
|
|
|
end
|
2011-08-16 22:39:45 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
describe ".add_group" do
|
2011-09-15 23:01:58 +00:00
|
|
|
subject { ::Guard.setup }
|
2011-08-16 22:39:45 +00:00
|
|
|
|
|
|
|
it "accepts group name as string" do
|
2011-09-15 23:01:58 +00:00
|
|
|
subject.add_group('backend')
|
2011-08-16 23:34:27 +00:00
|
|
|
|
2011-09-15 23:01:58 +00:00
|
|
|
subject.groups.should eql [{ :name => :default, :options => {} }, { :name => :backend, :options => {} }]
|
2011-08-16 22:39:45 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
it "accepts group name as symbol" do
|
2011-09-15 23:01:58 +00:00
|
|
|
subject.add_group(:backend)
|
|
|
|
|
|
|
|
subject.groups.should eql [{ :name => :default, :options => {} }, { :name => :backend, :options => {} }]
|
|
|
|
end
|
|
|
|
|
|
|
|
it "accepts options" do
|
|
|
|
subject.add_group(:backend, { :halt_on_fail => true })
|
2011-08-16 23:34:27 +00:00
|
|
|
|
2011-09-15 23:01:58 +00:00
|
|
|
subject.groups.should eql [{ :name => :default, :options => {} }, { :name => :backend, :options => { :halt_on_fail => true } }]
|
2011-08-16 22:39:45 +00:00
|
|
|
end
|
|
|
|
end
|
2011-08-16 23:34:27 +00:00
|
|
|
|
2011-05-13 09:26:05 +00:00
|
|
|
describe ".get_guard_class" do
|
2011-05-26 16:53:58 +00:00
|
|
|
after do
|
|
|
|
[:Classname, :DashedClassName, :Inline].each do |const|
|
|
|
|
Guard.send(:remove_const, const) rescue nil
|
2010-11-03 22:31:00 +00:00
|
|
|
end
|
2011-05-26 16:53:58 +00:00
|
|
|
end
|
2011-02-22 14:15:09 +00:00
|
|
|
|
2011-05-13 09:26:05 +00:00
|
|
|
it "reports an error if the class is not found" do
|
2011-08-05 08:23:54 +00:00
|
|
|
::Guard::UI.should_receive(:error).twice
|
2011-05-13 09:26:05 +00:00
|
|
|
Guard.get_guard_class('notAGuardClass')
|
|
|
|
end
|
2011-02-22 14:15:09 +00:00
|
|
|
|
2011-05-13 09:26:05 +00:00
|
|
|
context 'with a nested Guard class' do
|
2011-05-26 16:53:58 +00:00
|
|
|
it "resolves the Guard class from string" do
|
|
|
|
Guard.should_receive(:require) { |classname|
|
|
|
|
classname.should == 'guard/classname'
|
2011-05-27 15:56:46 +00:00
|
|
|
class Guard::Classname
|
|
|
|
end
|
|
|
|
}
|
2011-05-26 16:53:58 +00:00
|
|
|
Guard.get_guard_class('classname').should == Guard::Classname
|
2011-04-21 21:39:46 +00:00
|
|
|
end
|
|
|
|
|
2011-05-26 16:53:58 +00:00
|
|
|
it "resolves the Guard class from symbol" do
|
|
|
|
Guard.should_receive(:require) { |classname|
|
|
|
|
classname.should == 'guard/classname'
|
2011-05-13 09:26:05 +00:00
|
|
|
class Guard::Classname
|
2011-04-21 21:39:46 +00:00
|
|
|
end
|
2011-05-13 09:26:05 +00:00
|
|
|
}
|
2011-05-26 16:53:58 +00:00
|
|
|
Guard.get_guard_class(:classname).should == Guard::Classname
|
2011-04-21 21:39:46 +00:00
|
|
|
end
|
2011-05-13 09:26:05 +00:00
|
|
|
end
|
2011-04-21 21:39:46 +00:00
|
|
|
|
2011-05-23 23:07:12 +00:00
|
|
|
context 'with a name with dashes' do
|
|
|
|
it "returns the Guard class" do
|
2011-05-26 16:53:58 +00:00
|
|
|
Guard.should_receive(:require) { |classname|
|
|
|
|
classname.should == 'guard/dashed-class-name'
|
2011-05-23 23:07:12 +00:00
|
|
|
class Guard::DashedClassName
|
|
|
|
end
|
|
|
|
}
|
|
|
|
Guard.get_guard_class('dashed-class-name').should == Guard::DashedClassName
|
2011-02-18 18:53:05 +00:00
|
|
|
end
|
2010-10-27 13:18:00 +00:00
|
|
|
end
|
2011-02-22 14:15:09 +00:00
|
|
|
|
2011-05-13 09:26:05 +00:00
|
|
|
context 'with an inline Guard class' do
|
|
|
|
it 'returns the Guard class' do
|
|
|
|
module Guard
|
|
|
|
class Inline < Guard
|
2011-04-21 21:39:46 +00:00
|
|
|
end
|
2011-02-18 18:53:05 +00:00
|
|
|
end
|
2011-05-13 09:26:05 +00:00
|
|
|
|
2011-05-26 16:53:58 +00:00
|
|
|
Guard.should_not_receive(:require)
|
2011-05-13 09:26:05 +00:00
|
|
|
Guard.get_guard_class('inline').should == Guard::Inline
|
2010-11-03 22:31:00 +00:00
|
|
|
end
|
2010-10-27 13:18:00 +00:00
|
|
|
end
|
2011-05-13 09:26:05 +00:00
|
|
|
end
|
2011-02-22 14:15:09 +00:00
|
|
|
|
2011-05-13 09:26:05 +00:00
|
|
|
describe ".locate_guard" do
|
|
|
|
it "returns the path of a Guard gem" do
|
|
|
|
if Gem::Version.create(Gem::VERSION) >= Gem::Version.create('1.8.0')
|
|
|
|
gem_location = Gem::Specification.find_by_name("guard-rspec").full_gem_path
|
|
|
|
else
|
|
|
|
gem_location = Gem.source_index.find_name("guard-rspec").last.full_gem_path
|
2010-11-30 20:23:53 +00:00
|
|
|
end
|
2011-02-22 14:15:09 +00:00
|
|
|
|
2011-05-13 09:26:05 +00:00
|
|
|
Guard.locate_guard('rspec').should == gem_location
|
2010-10-27 13:18:00 +00:00
|
|
|
end
|
2011-05-13 09:26:05 +00:00
|
|
|
end
|
2011-02-22 14:15:09 +00:00
|
|
|
|
2011-08-09 00:11:22 +00:00
|
|
|
describe ".guard_gem_names" do
|
|
|
|
it "returns the list of guard gems" do
|
|
|
|
gems = Guard.guard_gem_names
|
|
|
|
gems.should include("rspec")
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2011-09-15 23:01:58 +00:00
|
|
|
describe ".execute_supervised_task_for_all_guards" do
|
|
|
|
subject { ::Guard.setup }
|
|
|
|
|
|
|
|
before do
|
|
|
|
class Guard::Dummy < Guard::Guard; end
|
|
|
|
|
|
|
|
subject.add_group(:foo, { :halt_on_fail => true })
|
|
|
|
subject.add_group(:bar)
|
|
|
|
subject.add_guard(:dummy, [], [], { :group => :foo })
|
|
|
|
subject.add_guard(:dummy, [], [], { :group => :foo })
|
|
|
|
subject.add_guard(:dummy, [], [], { :group => :bar })
|
|
|
|
subject.add_guard(:dummy, [], [], { :group => :bar })
|
|
|
|
@sum = { :foo => 0, :bar => 0}
|
|
|
|
end
|
|
|
|
|
|
|
|
context "all tasks succeed" do
|
|
|
|
before do
|
|
|
|
subject.guards.each { |guard| guard.stub!(:task) { @sum[guard.group] += 1; true } }
|
|
|
|
end
|
|
|
|
|
|
|
|
it "executes the task for each guard in each group" do
|
|
|
|
subject.execute_supervised_task_for_all_guards(:task)
|
|
|
|
|
|
|
|
@sum.all? { |k, v| v == 2 }.should be_true
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context "one guard fails (by returning false)" do
|
|
|
|
before do
|
2011-09-15 23:20:22 +00:00
|
|
|
subject.guards.each_with_index do |g, i|
|
|
|
|
g.stub!(:task) do
|
|
|
|
@sum[g.group] += i+1
|
|
|
|
if i % 2 == 0
|
|
|
|
throw :task_has_failed
|
|
|
|
else
|
|
|
|
true
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2011-09-15 23:01:58 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
it "executes the task only for guards that didn't fail for group with :halt_on_fail == true" do
|
|
|
|
subject.execute_supervised_task_for_all_guards(:task)
|
|
|
|
|
|
|
|
@sum[:foo].should eql 1
|
|
|
|
@sum[:bar].should eql 7
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2011-05-13 09:26:05 +00:00
|
|
|
describe ".supervised_task" do
|
|
|
|
subject { ::Guard.setup }
|
|
|
|
|
2011-09-15 23:01:58 +00:00
|
|
|
before do
|
2011-05-13 09:26:05 +00:00
|
|
|
@g = mock(Guard::Guard).as_null_object
|
|
|
|
subject.guards.push(@g)
|
2011-09-15 23:01:58 +00:00
|
|
|
subject.groups.push({ :name => :foo, :options => { :halt_on_fail => true } })
|
2011-05-13 09:26:05 +00:00
|
|
|
end
|
2011-02-22 14:15:09 +00:00
|
|
|
|
2011-05-13 09:26:05 +00:00
|
|
|
context "with a task that succeed" do
|
|
|
|
context 'without any arguments' do
|
2010-11-30 20:23:53 +00:00
|
|
|
before(:each) do
|
2011-08-16 23:34:27 +00:00
|
|
|
@g.stub!(:regular_without_arg) { true }
|
2010-11-30 20:23:53 +00:00
|
|
|
end
|
2011-02-22 14:15:09 +00:00
|
|
|
|
2011-05-13 09:26:05 +00:00
|
|
|
it "doesn't fire the Guard" do
|
2011-08-16 23:34:27 +00:00
|
|
|
lambda { subject.supervised_task(@g, :regular_without_arg) }.should_not change(subject.guards, :size)
|
2010-11-30 20:23:53 +00:00
|
|
|
end
|
2011-02-22 14:15:09 +00:00
|
|
|
|
2011-05-13 09:26:05 +00:00
|
|
|
it "returns the result of the task" do
|
2011-08-16 23:34:27 +00:00
|
|
|
::Guard.supervised_task(@g, :regular_without_arg).should be_true
|
2010-11-30 20:23:53 +00:00
|
|
|
end
|
2011-04-16 21:02:13 +00:00
|
|
|
|
2011-04-18 00:06:45 +00:00
|
|
|
it "passes the args to the :begin hook" do
|
2011-08-16 23:34:27 +00:00
|
|
|
@g.should_receive(:hook).with("regular_without_arg_begin", "given_path")
|
|
|
|
::Guard.supervised_task(@g, :regular_without_arg, "given_path")
|
2011-04-18 00:06:45 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
it "passes the result of the supervised method to the :end hook" do
|
2011-08-16 23:34:27 +00:00
|
|
|
@g.should_receive(:hook).with("regular_without_arg_begin", "given_path")
|
|
|
|
@g.should_receive(:hook).with("regular_without_arg_end", true)
|
|
|
|
::Guard.supervised_task(@g, :regular_without_arg, "given_path")
|
2011-04-16 21:02:13 +00:00
|
|
|
end
|
2010-11-03 22:31:00 +00:00
|
|
|
end
|
2011-02-22 14:15:09 +00:00
|
|
|
|
2011-05-13 09:26:05 +00:00
|
|
|
context 'with arguments' do
|
|
|
|
before(:each) do
|
|
|
|
@g.stub!(:regular_with_arg).with("given_path") { "I'm a success" }
|
|
|
|
end
|
2011-02-22 14:15:09 +00:00
|
|
|
|
2011-05-13 09:26:05 +00:00
|
|
|
it "doesn't fire the Guard" do
|
|
|
|
lambda { subject.supervised_task(@g, :regular_with_arg, "given_path") }.should_not change(subject.guards, :size)
|
2010-11-30 20:23:53 +00:00
|
|
|
end
|
2011-02-22 14:15:09 +00:00
|
|
|
|
2011-05-13 09:26:05 +00:00
|
|
|
it "returns the result of the task" do
|
2011-08-16 23:34:27 +00:00
|
|
|
::Guard.supervised_task(@g, :regular_with_arg, "given_path").should eql "I'm a success"
|
2010-11-30 20:23:53 +00:00
|
|
|
end
|
2011-04-14 20:53:53 +00:00
|
|
|
|
2011-04-16 21:02:13 +00:00
|
|
|
it "calls the default begin hook but not the default end hook" do
|
|
|
|
@g.should_receive(:hook).with("failing_begin")
|
|
|
|
@g.should_not_receive(:hook).with("failing_end")
|
|
|
|
::Guard.supervised_task(@g, :failing)
|
|
|
|
end
|
|
|
|
end
|
2010-10-27 13:18:00 +00:00
|
|
|
end
|
2011-04-16 21:13:29 +00:00
|
|
|
|
2011-09-15 23:01:58 +00:00
|
|
|
context "with a task that return false and guard's group has the :halt_on_fail option == true" do
|
2011-09-15 23:20:22 +00:00
|
|
|
before(:each) { @g.stub!(:group) { :foo }; @g.stub!(:failing) { throw :task_has_failed } }
|
2011-09-15 23:01:58 +00:00
|
|
|
|
|
|
|
it "throws :task_has_failed" do
|
|
|
|
expect { subject.supervised_task(@g, :failing) }.to throw_symbol(:task_has_failed)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2011-05-13 09:26:05 +00:00
|
|
|
context "with a task that raises an exception" do
|
|
|
|
before(:each) { @g.stub!(:failing) { raise "I break your system" } }
|
|
|
|
|
|
|
|
it "fires the Guard" do
|
|
|
|
lambda { subject.supervised_task(@g, :failing) }.should change(subject.guards, :size).by(-1)
|
|
|
|
subject.guards.should_not include(@g)
|
2011-04-16 21:13:29 +00:00
|
|
|
end
|
2011-05-06 19:51:50 +00:00
|
|
|
|
2011-05-13 09:26:05 +00:00
|
|
|
it "returns the exception" do
|
|
|
|
failing_result = ::Guard.supervised_task(@g, :failing)
|
|
|
|
failing_result.should be_kind_of(Exception)
|
|
|
|
failing_result.message.should == 'I break your system'
|
2011-04-16 21:13:29 +00:00
|
|
|
end
|
|
|
|
end
|
2010-10-27 13:18:00 +00:00
|
|
|
end
|
2011-02-22 14:15:09 +00:00
|
|
|
|
2011-08-05 12:37:08 +00:00
|
|
|
describe ".debug_command_execution" do
|
|
|
|
subject { ::Guard.setup }
|
|
|
|
|
|
|
|
before do
|
|
|
|
@original_system = Kernel.method(:system)
|
|
|
|
@original_command = Kernel.method(:"`")
|
|
|
|
end
|
|
|
|
|
|
|
|
after do
|
|
|
|
Kernel.send(:define_method, :system, @original_system.to_proc )
|
|
|
|
Kernel.send(:define_method, :"`", @original_command.to_proc )
|
|
|
|
end
|
|
|
|
|
|
|
|
it "outputs Kernel.#system method parameters" do
|
|
|
|
::Guard.setup(:debug => true)
|
|
|
|
::Guard::UI.should_receive(:debug).with("Command execution: echo test")
|
|
|
|
system("echo", "test").should be_true
|
2011-04-16 21:13:29 +00:00
|
|
|
end
|
2011-08-05 12:37:08 +00:00
|
|
|
|
|
|
|
it "outputs Kernel.#` method parameters" do
|
|
|
|
::Guard.setup(:debug => true)
|
|
|
|
::Guard::UI.should_receive(:debug).twice.with("Command execution: echo test")
|
|
|
|
`echo test`.should eql "test\n"
|
|
|
|
%x{echo test}.should eql "test\n"
|
|
|
|
end
|
|
|
|
|
2010-10-27 13:18:00 +00:00
|
|
|
end
|
2011-02-22 14:15:09 +00:00
|
|
|
|
2011-02-18 18:53:05 +00:00
|
|
|
end
|