fudge 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. data/bin/fudge +9 -0
  2. data/lib/fudge.rb +16 -0
  3. data/lib/fudge/build.rb +31 -0
  4. data/lib/fudge/cli.rb +29 -0
  5. data/lib/fudge/description.rb +53 -0
  6. data/lib/fudge/exceptions.rb +31 -0
  7. data/lib/fudge/helpers.rb +5 -0
  8. data/lib/fudge/helpers/bundle_aware.rb +14 -0
  9. data/lib/fudge/parser.rb +12 -0
  10. data/lib/fudge/railtie.rb +17 -0
  11. data/lib/fudge/runner.rb +25 -0
  12. data/lib/fudge/task_dsl.rb +41 -0
  13. data/lib/fudge/tasks.rb +31 -0
  14. data/lib/fudge/tasks/clean_bundler_env.rb +24 -0
  15. data/lib/fudge/tasks/composite_task.rb +24 -0
  16. data/lib/fudge/tasks/each_directory.rb +34 -0
  17. data/lib/fudge/tasks/in_directory.rb +24 -0
  18. data/lib/fudge/tasks/rake.rb +19 -0
  19. data/lib/fudge/tasks/rspec.rb +29 -0
  20. data/lib/fudge/tasks/shell.rb +76 -0
  21. data/lib/fudge/tasks/task.rb +18 -0
  22. data/lib/fudge/tasks/yard.rb +29 -0
  23. data/lib/fudge/version.rb +3 -0
  24. data/lib/tasks/fudge.rake +7 -0
  25. data/spec/lib/fudge/build_spec.rb +5 -0
  26. data/spec/lib/fudge/cli_spec.rb +76 -0
  27. data/spec/lib/fudge/description_spec.rb +241 -0
  28. data/spec/lib/fudge/exceptions_spec.rb +36 -0
  29. data/spec/lib/fudge/parser_spec.rb +23 -0
  30. data/spec/lib/fudge/runner_spec.rb +25 -0
  31. data/spec/lib/fudge/tasks/bundler_spec.rb +39 -0
  32. data/spec/lib/fudge/tasks/composite_task_spec.rb +60 -0
  33. data/spec/lib/fudge/tasks/each_directory_spec.rb +57 -0
  34. data/spec/lib/fudge/tasks/in_directory_spec.rb +39 -0
  35. data/spec/lib/fudge/tasks/rake_spec.rb +18 -0
  36. data/spec/lib/fudge/tasks/rspec_spec.rb +36 -0
  37. data/spec/lib/fudge/tasks/shell_spec.rb +38 -0
  38. data/spec/lib/fudge/tasks/task_spec.rb +14 -0
  39. data/spec/lib/fudge/tasks/yard_spec.rb +25 -0
  40. data/spec/lib/fudge/tasks_spec.rb +33 -0
  41. data/spec/spec_helper.rb +22 -0
  42. data/spec/support/dummy_task.rb +40 -0
  43. data/spec/support/matchers.rb +47 -0
  44. data/spec/support/tmpdir.rb +12 -0
  45. metadata +302 -0
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ module Fudge::Exceptions
4
+ describe Base do
5
+ it { should be_a StandardError }
6
+ end
7
+
8
+ describe BuildFailed do
9
+ it { should be_a Base }
10
+ its(:message) { should be_a String }
11
+ end
12
+
13
+ describe TaskNotFound do
14
+ subject { described_class.new :foo }
15
+
16
+ it { should be_a Base }
17
+
18
+ its(:message) { should be_a String }
19
+
20
+ it "should take a task name as a parameter" do
21
+ expect { described_class.new }.to raise_error ArgumentError
22
+ end
23
+ end
24
+
25
+ describe TaskGroupNotFound do
26
+ subject { described_class.new :foo }
27
+
28
+ it { should be_a Base }
29
+
30
+ its(:message) { should be_a String }
31
+
32
+ it "should take a task group name as a parameter" do
33
+ expect { described_class.new }.to raise_error ArgumentError
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe Fudge::Parser do
4
+ use_tmp_dir
5
+
6
+ describe :parse do
7
+ before :each do
8
+ @path = 'FudgeFile'
9
+
10
+ File.open(@path, 'w') do |f|
11
+ f.write('@foo = :bar')
12
+ end
13
+ end
14
+
15
+ it "should read a file and evaluate it" do
16
+ subject.parse(@path).should be_a Fudge::Description
17
+ end
18
+
19
+ it "should pass the contents to the new description" do
20
+ subject.parse(@path).instance_variable_get(:@foo).should == :bar
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ describe Fudge::Runner do
4
+ let(:input) do
5
+ StringIO.new('build :default do; task :dummy; end').tap do |s|
6
+ s.stub(:path).and_return('')
7
+ end
8
+ end
9
+ let(:description) { Fudge::Description.new(input) }
10
+ subject { described_class.new(description) }
11
+
12
+ describe :run_build do
13
+ it "should run the default task in the description" do
14
+ subject.run_build
15
+
16
+ DummyTask.ran.should be_true
17
+ end
18
+
19
+ it "should raise an exception if the build fails" do
20
+ Fudge::Build.any_instance.stub(:run).and_return(false)
21
+
22
+ expect { subject.run_build }.to raise_error Fudge::Exceptions::BuildFailed
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+
3
+ class TestBundlerAwareTask
4
+ def self.name
5
+ :test_bundle_aware
6
+ end
7
+
8
+ def run(options = {})
9
+ options[:bundler] == true
10
+ end
11
+ end
12
+
13
+ class TestNonBundlerAwareTask
14
+ def self.name
15
+ :test_non_bundle_aware
16
+ end
17
+
18
+ def run(options={})
19
+ true
20
+ end
21
+ end
22
+
23
+ describe Fudge::Tasks::CleanBundlerEnv do
24
+ it { should be_registered_as :clean_bundler_env }
25
+
26
+ describe :run do
27
+ let(:bundle_aware_task) { TestBundlerAwareTask.new }
28
+ let(:non_bundle_aware_task) { TestNonBundlerAwareTask.new }
29
+
30
+ context "with a bundle aware task" do
31
+ it "should run the bundle dependent tasks successfully" do
32
+ subject.tasks << bundle_aware_task
33
+ subject.tasks << non_bundle_aware_task
34
+
35
+ subject.run.should be_true
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,60 @@
1
+ require 'spec_helper'
2
+
3
+ class DummyTask2 < DummyTask
4
+ def self.name
5
+ :dummy2
6
+ end
7
+ end
8
+ Fudge::Tasks.register(DummyTask2)
9
+
10
+ describe Fudge::Tasks::CompositeTask do
11
+ subject { described_class.new do; end }
12
+
13
+ describe :run do
14
+ before :each do
15
+ subject.tasks << DummyTask.new
16
+ subject.tasks << DummyTask2.new
17
+ end
18
+
19
+ it "should run all tasks defined and return true if they all succeed" do
20
+ DummyTask.any_instance.should_receive(:run).and_return(true)
21
+ DummyTask2.any_instance.should_receive(:run).and_return(true)
22
+
23
+ subject.run.should be_true
24
+ end
25
+
26
+ it "should return false if any of the tasks fail" do
27
+ DummyTask.any_instance.should_receive(:run).and_return(false)
28
+ DummyTask2.any_instance.should_not_receive(:run)
29
+
30
+ subject.run.should be_false
31
+ end
32
+ end
33
+
34
+ describe "Using TaskDSL" do
35
+ describe :task do
36
+ class AnotherCompositeTask < Fudge::Tasks::CompositeTask
37
+ include Fudge::TaskDSL
38
+
39
+ def initialize(*args)
40
+ super
41
+
42
+ task :shell, 'foo', 'bar'
43
+ task :dummy_composite do
44
+ task :dummy
45
+ end
46
+ end
47
+ end
48
+
49
+ subject { AnotherCompositeTask.new }
50
+
51
+ it "should define a task for each new instance of the composite task" do
52
+ subject.should run_command 'foo bar'
53
+ end
54
+
55
+ it "should support defining composite tasks" do
56
+ subject.tasks[1].tasks.first.should be_a DummyTask
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,57 @@
1
+ require 'spec_helper'
2
+
3
+ class TestEachDirectoryTask
4
+ attr_accessor :pwds
5
+ def self.name
6
+ :test_each_directory
7
+ end
8
+
9
+ def run(options={})
10
+ (self.pwds ||= []) << FileUtils.pwd
11
+ end
12
+ end
13
+ Fudge::Tasks.register(TestEachDirectoryTask)
14
+
15
+ describe Fudge::Tasks::EachDirectory do
16
+ subject { described_class.new 'spec/*' }
17
+ it { should be_registered_as :each_directory }
18
+
19
+ describe :initialize do
20
+ it "should take a directory pattern as first argument" do
21
+ expect { described_class.new }.to raise_error ArgumentError
22
+ end
23
+ end
24
+
25
+ describe :run do
26
+ let(:task) { TestEachDirectoryTask.new }
27
+ let(:dirs) do
28
+ Dir[File.expand_path('../../../../*', __FILE__)].select { |path| File.directory? path }
29
+ end
30
+
31
+ before :each do
32
+ subject.tasks << task
33
+ end
34
+
35
+ it "should change to the given directories and run child tasks" do
36
+ subject.run
37
+
38
+ task.pwds.should == dirs
39
+ end
40
+
41
+ it "should allow explicit specification of directories through an array" do
42
+ ed2 = described_class.new ["spec/lib","spec/support"]
43
+ ed2.tasks << task
44
+ ed2.run
45
+ task.pwds.should == dirs.sort
46
+ end
47
+
48
+ it "should respect the order of the directories as specified" do
49
+ ed2 = described_class.new ["spec/support","spec/lib"]
50
+ ed2.tasks << task
51
+ ed2.run
52
+ task.pwds.should_not == dirs.sort
53
+ task.pwds.sort.should == dirs.sort
54
+ end
55
+
56
+ end
57
+ end
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+
3
+ class TestInDirectoryTask
4
+ attr_accessor :pwd
5
+ def self.name
6
+ :test_in_directory
7
+ end
8
+
9
+ def run(options={})
10
+ self.pwd = FileUtils.pwd
11
+ end
12
+ end
13
+ Fudge::Tasks.register(TestInDirectoryTask)
14
+
15
+ describe Fudge::Tasks::InDirectory do
16
+ subject { described_class.new 'spec' }
17
+ it { should be_registered_as :in_directory }
18
+
19
+ describe :initialize do
20
+ it "should take a directory as first argument" do
21
+ expect { described_class.new }.to raise_error ArgumentError
22
+ end
23
+ end
24
+
25
+ describe :run do
26
+ let(:task) { TestInDirectoryTask.new }
27
+ let(:path) { File.expand_path('spec', FileUtils.pwd) }
28
+
29
+ before :each do
30
+ subject.tasks << task
31
+ end
32
+
33
+ it "should change to the given directory and run child tasks" do
34
+ subject.run
35
+
36
+ task.pwd.should == path
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+
3
+ describe Fudge::Tasks::Rake do
4
+ it { should be_registered_as :rake }
5
+ it { should be_a Fudge::Tasks::Shell }
6
+
7
+ describe :run do
8
+ it "should be rake by default" do
9
+ subject.should run_command 'rake '
10
+ end
11
+
12
+ it_should_behave_like 'bundle aware'
13
+
14
+ it "should add any arguments given" do
15
+ described_class.new('db:migrate').should run_command 'rake db:migrate'
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ describe Fudge::Tasks::Rspec do
4
+ it { should be_registered_as :rspec }
5
+
6
+ describe :run do
7
+ it "should turn on color if not specified" do
8
+ subject.should run_command /--tty/
9
+ end
10
+
11
+ it "should turn off color if specified" do
12
+ described_class.new(:color => false).should_not run_command /--tty/
13
+ end
14
+
15
+ it "should append any arguments passed in" do
16
+ described_class.new('foobar', :color => false).should run_command 'rspec foobar'
17
+ end
18
+
19
+ it "should default the arguments to spec/" do
20
+ described_class.new(:color => false).should run_command 'rspec spec/'
21
+ end
22
+
23
+ end
24
+
25
+ it_should_behave_like 'bundle aware'
26
+
27
+ describe :coverage do
28
+ subject { described_class.new :coverage => 99 }
29
+
30
+ it { should_not succeed_with_output 'some dummy output with no coverage' }
31
+ it { should_not succeed_with_output '98.99999%) covered' }
32
+ it { should_not succeed_with_output '0.00%) covered' }
33
+ it { should succeed_with_output '99.99999%) covered' }
34
+ it { should succeed_with_output '100.0%) covered' }
35
+ end
36
+ end
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+
3
+ describe Fudge::Tasks::Shell do
4
+ describe :run do
5
+ it "should take a command and run it" do
6
+ described_class.new(:ls).should run_command 'ls'
7
+ end
8
+
9
+ it "should add any arguments given" do
10
+ described_class.new(:ls, '-l', '-a').should run_command 'ls -l -a'
11
+ end
12
+
13
+ it "should return false for an unsuccessful command" do
14
+ described_class.new(:ls, '--newnre').run.should be_false
15
+ end
16
+
17
+ it "should return true for a successful command" do
18
+ described_class.new(:ls).run.should be_true
19
+ end
20
+ end
21
+
22
+ describe :check_for do
23
+ context "with no callable to check the matches" do
24
+ subject { described_class.new(:ls, :check_for => /4 files found/) }
25
+
26
+ it { should succeed_with_output "Hello there were 4 files found." }
27
+ it { should_not succeed_with_output "Hellow there were 5 files found." }
28
+ end
29
+
30
+ context "with a callable to check the matches" do
31
+ subject { described_class.new(:ls, :check_for => [/(\d+) files found/, lambda { |matches| matches[1].to_i >= 4 }]) }
32
+
33
+ it { should_not succeed_with_output "Hello there were 3 files found." }
34
+ it { should succeed_with_output "Hello there were 4 files found." }
35
+ it { should succeed_with_output "Hellow there were 5 files found." }
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+
3
+ class MyTask < Fudge::Tasks::Task
4
+ attr_accessor :blabla
5
+ end
6
+
7
+ describe Fudge::Tasks::Task do
8
+ describe :initialize do
9
+ it "should accepts options and set them" do
10
+ task = MyTask.new :blabla => 'foo'
11
+ task.blabla.should == 'foo'
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ describe Fudge::Tasks::Yard do
4
+ subject { described_class.new }
5
+
6
+ it { should be_registered_as :yard }
7
+
8
+ describe :run do
9
+ it "should run yard with any arguments passed in" do
10
+ described_class.new('-r YardREADME.md').should run_command 'yard -r YardREADME.md'
11
+ end
12
+ end
13
+
14
+ it_should_behave_like 'bundle aware'
15
+
16
+ describe :coverage do
17
+ subject { described_class.new :coverage => 99 }
18
+
19
+ it { should_not succeed_with_output 'some dummy output with no coverage' }
20
+ it { should_not succeed_with_output '98.99999% documented' }
21
+ it { should_not succeed_with_output '0.00% documented' }
22
+ it { should succeed_with_output '99.99999% documented' }
23
+ it { should succeed_with_output '100.0% documented' }
24
+ end
25
+ end
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+
3
+ class TestTask
4
+ def self.name
5
+ :foo
6
+ end
7
+ end
8
+
9
+ describe Fudge::Tasks do
10
+ describe "Class Methods" do
11
+ subject { described_class }
12
+
13
+ describe :register do
14
+ it "should register a task for a given symbol" do
15
+ subject.register(TestTask)
16
+
17
+ subject.discover(:foo).should == TestTask
18
+ end
19
+ end
20
+
21
+ describe :discover do
22
+ it "should return the registered class for the given symbol" do
23
+ subject.register(TestTask)
24
+
25
+ subject.discover(:foo).should == TestTask
26
+ end
27
+
28
+ it "should raise an exception if the task is not found" do
29
+ expect { subject.discover(:something) }.to raise_error Fudge::Exceptions::TaskNotFound
30
+ end
31
+ end
32
+ end
33
+ end