spackle 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. data/.document +5 -0
  2. data/.gitignore +21 -0
  3. data/LICENSE +20 -0
  4. data/README.rdoc +166 -0
  5. data/Rakefile +49 -0
  6. data/VERSION +1 -0
  7. data/bin/ruby-project-root +14 -0
  8. data/bin/spackle +14 -0
  9. data/bin/spackle-vim-load-quickfix +47 -0
  10. data/bin/spackle-vim-open +49 -0
  11. data/lib/spackle/commandline.rb +53 -0
  12. data/lib/spackle/configuration.rb +37 -0
  13. data/lib/spackle/error.rb +31 -0
  14. data/lib/spackle/helpers/ruby_project_root.rb +34 -0
  15. data/lib/spackle/output/base.rb +44 -0
  16. data/lib/spackle/output/vim_quickfix.rb +7 -0
  17. data/lib/spackle/output.rb +2 -0
  18. data/lib/spackle/spec/base_formatter.rb +22 -0
  19. data/lib/spackle/spec/spackle_formatter.rb +14 -0
  20. data/lib/spackle/spec.rb +1 -0
  21. data/lib/spackle.rb +104 -0
  22. data/spec/integration_spec.rb +84 -0
  23. data/spec/spackle/commandline_spec.rb +48 -0
  24. data/spec/spackle/configuration_spec.rb +43 -0
  25. data/spec/spackle/error_spec.rb +34 -0
  26. data/spec/spackle/output/base_spec.rb +53 -0
  27. data/spec/spackle/output/vim_quickfix_spec.rb +25 -0
  28. data/spec/spackle/spec/base_formatter_spec.rb +15 -0
  29. data/spec/spackle/spec/spackle_formatter_spec.rb +58 -0
  30. data/spec/spackle_error_fixture.rb +10 -0
  31. data/spec/spackle_spec.rb +203 -0
  32. data/spec/spec.opts +1 -0
  33. data/spec/spec_helper.rb +14 -0
  34. data/spec/test_app_helper.rb +55 -0
  35. data/support/vim/spackle.vim +17 -0
  36. data/test_app/lib/error_raiser.rb +7 -0
  37. data/test_app/lib/method_typo.rb +7 -0
  38. data/test_app/lib/missing_end.rb +7 -0
  39. data/test_app/lib/working_class.rb +7 -0
  40. data/test_app/spec/error_raiser_spec.rb +14 -0
  41. data/test_app/spec/failing_working_class_spec.rb +14 -0
  42. data/test_app/spec/method_typo_spec.rb +14 -0
  43. data/test_app/spec/missing_end_spec.rb +13 -0
  44. data/test_app/spec/passing_working_class_spec.rb +14 -0
  45. data/test_app/spec/spec_helper.rb +8 -0
  46. metadata +127 -0
data/lib/spackle.rb ADDED
@@ -0,0 +1,104 @@
1
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__)))
2
+
3
+ require 'spackle/configuration'
4
+ require 'spackle/error'
5
+ require 'spackle/output'
6
+ require 'spackle/spec' if defined? Spec
7
+ require 'spackle/helpers/ruby_project_root'
8
+
9
+ module Spackle
10
+ class << self
11
+ def already_initialized?
12
+ @already_initialized == true
13
+ end
14
+
15
+ def callback_command
16
+ Spackle.configuration.callback_command
17
+ end
18
+
19
+ def configuration
20
+ @configuration ||= Spackle::Configuration.new
21
+ end
22
+
23
+ def configure
24
+ yield configuration
25
+ end
26
+
27
+ def error_formatter_class
28
+ class_name = configuration.error_formatter.to_s.
29
+ split("_").collect { |w| w.capitalize }.join
30
+ begin
31
+ eval("Spackle::Output::#{class_name}")
32
+ rescue SyntaxError
33
+ raise RuntimeError.new("Spackle Error: no configuration for error_formatter_class -- have you configured Spackle with a .spackle file?")
34
+ rescue NameError
35
+ raise RuntimeError.new("Spackle Error: Cannot find Spackle::Output::#{class_name} -- have you configured Spackle with a .spackle file?")
36
+ end
37
+ end
38
+
39
+ def init(options = {})
40
+ return if already_initialized?
41
+
42
+ @already_initialized = true
43
+ load_config
44
+ File.unlink(spackle_file) if File.exists?(spackle_file)
45
+
46
+ case options[:with]
47
+ when :spec_formatter
48
+ ::Spec::Runner.options.parse_format "Spackle::Spec::SpackleFormatter:/dev/null"
49
+ end
50
+ end
51
+
52
+ def load_config
53
+ load_config_from_dotfile
54
+ end
55
+
56
+ def load_config_from_dotfile
57
+ config_files = []
58
+
59
+ if ENV['SPACKLE_CONFIG']
60
+ # SPACKLE_CONFIG is mostly intended for use with the integration tests
61
+ config_files << File.expand_path(ENV['SPACKLE_CONFIG'])
62
+ else
63
+ config_files << File.expand_path("~/.spackle")
64
+
65
+ project_root = Spackle::Helpers::RubyProjectRoot.search Dir.pwd
66
+ if project_root
67
+ config_files << File.join(project_root, ".spackle")
68
+ end
69
+ end
70
+
71
+ config_files.inject(false) do |config_loaded, file|
72
+ if File.exists? file
73
+ load file
74
+ config_loaded = true
75
+ end
76
+ config_loaded
77
+ end
78
+ end
79
+
80
+ def spackle_file
81
+ projectname = Spackle::Helpers::RubyProjectRoot.search Dir.pwd
82
+ projectname = File.basename(projectname) + ".spackle" if projectname
83
+ filename = configuration.spackle_file || projectname || "default.spackle"
84
+
85
+ File.join(tempdir, filename)
86
+ end
87
+
88
+ def tempdir
89
+ configuration.tempdir || '/tmp'
90
+ end
91
+
92
+ def test_finished(errors)
93
+ return unless configuration.error_formatter
94
+ File.open( spackle_file, "w", 0600 ) do |f|
95
+ errors.each do |error|
96
+ f.write error_formatter_class.format(error)
97
+ end
98
+ end
99
+ system(configuration.callback_command, spackle_file) if configuration.callback_command
100
+ end
101
+
102
+
103
+ end
104
+ end
@@ -0,0 +1,84 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ # This matcher is necessary because the expected/actual strings look just
4
+ # like bits of regular Ruby backtraces, which apparently is how autotest
5
+ # figures out which files to test. Outputting bits of the backtraces from
6
+ # the testapp's test harness mightily confuses an autotest running Spackle.
7
+ Spec::Matchers.define :have_spackle do |expected|
8
+ match do |actual|
9
+ actual.spackle_output == expected
10
+ end
11
+
12
+ def sanitize(str)
13
+ str.gsub(/_spec.rb/, '_s_p_e_c_dot_r_b')
14
+ end
15
+
16
+ failure_message_for_should do |actual|
17
+ <<-EOF
18
+ Expected spackles to match, but they didn't! Note that the "expected"
19
+ and "got" below have been transformed so autotest doesn't get confused
20
+ and blow up. See spec/integration_spec.rb for details.
21
+ COMMAND
22
+ #{actual.command}
23
+ EXPECTED:
24
+ #{sanitize expected }
25
+ GOT:
26
+ #{sanitize actual.spackle_output}
27
+ EOF
28
+ end
29
+ end
30
+
31
+
32
+ if ENV['INTEGRATE_SPACKLE']
33
+
34
+ # -- expected spackles ---------------------------------------------------
35
+ FAILING_WORKING_CLASS = <<EOF
36
+ ./spec/failing_working_class_spec.rb:9: expected false, got true
37
+ EOF
38
+
39
+ ERROR_RAISER = <<EOF
40
+ ./spec/error_raiser_spec.rb:9: an unhandled error
41
+ EOF
42
+
43
+ MISSING_END = <<EOF
44
+ EOF
45
+
46
+ METHOD_TYPO = <<EOF
47
+ ./spec/method_typo_spec.rb:9: undefined method `sirt' for [3, 1, 2]:Array
48
+ EOF
49
+ # ------------------------------------------------------------------------
50
+
51
+ DOT_SPACKLE = '/tmp/dot_spackle'
52
+
53
+ describe "integration" do
54
+ before do
55
+ @harness = TestAppHelper::Spec.new
56
+ end
57
+
58
+
59
+ it "running passing_working_class should return no output" do
60
+ @harness.run(:passing_working_class)
61
+ @harness.spackle_output.should be_empty
62
+ end
63
+
64
+ it "running failing_working_class should return a spackle" do
65
+ @harness.run(:failing_working_class)
66
+ @harness.should have_spackle(FAILING_WORKING_CLASS)
67
+ end
68
+
69
+ it "running error_raiser should return a spackle" do
70
+ @harness.run(:error_raiser)
71
+ @harness.should have_spackle(ERROR_RAISER)
72
+ end
73
+
74
+ it "running missing_end should return a spackle" do
75
+ @harness.run(:missing_end)
76
+ @harness.spackle_output.should be_empty
77
+ end
78
+
79
+ it "running method_typo should return a spackle" do
80
+ @harness.run(:method_typo)
81
+ @harness.should have_spackle(METHOD_TYPO)
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,48 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ require 'spackle/commandline'
4
+ module Spackle
5
+ describe Commandline do
6
+ describe "--install option" do
7
+ before do
8
+ Commandline.stub! :show_error
9
+ end
10
+
11
+ it "should call install with the argument" do
12
+ Commandline.should_receive(:install).with("foo")
13
+ result = Commandline.parse(%w(--install foo))
14
+ end
15
+
16
+ it "should return 1 and output an error if the argument is unrecognized" do
17
+ lambda {
18
+ Commandline.parse(%w(--install foo)).should == 1
19
+ }.should raise_error(RuntimeError, /unrecognized/i)
20
+ end
21
+
22
+ describe "for vim" do
23
+ it "should copy the plugin" do
24
+ Commandline.should_receive(:puts)
25
+ FileUtils.should_receive(:copy).with(/spackle.vim$/, /plugin$/)
26
+ Commandline.parse %w(--install vim)
27
+ end
28
+
29
+ it "should raise an error if the destination dir doesn't exist" do
30
+ File.stub! :directory? => false
31
+ lambda {
32
+ Commandline.parse %w(--install vim)
33
+ }.should raise_error(RuntimeError, /directory/)
34
+ end
35
+ end
36
+
37
+ it "should raise an error if it receives unrecognized options" do
38
+ lambda {
39
+ Commandline.parse %w(something unexpected)
40
+ }.should raise_error
41
+ end
42
+
43
+
44
+
45
+ end
46
+ end
47
+
48
+ end
@@ -0,0 +1,43 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ module Spackle
4
+ describe Configuration do
5
+ before do
6
+ @subject = Spackle::Configuration.new
7
+ end
8
+
9
+ it { should respond_to(:callback_command=) }
10
+ it { should respond_to(:callback_command) }
11
+ it { should respond_to(:tempdir=) }
12
+ it { should respond_to(:tempdir) }
13
+ it { should respond_to(:error_formatter=) }
14
+ it { should respond_to(:error_formatter) }
15
+ it { should respond_to(:spackle_file=) }
16
+ it { should respond_to(:spackle_file) }
17
+
18
+ it { should respond_to(:set_defaults_for) }
19
+
20
+ it "should raise an error if defaults_for receives an unrecognized argument" do
21
+ lambda {
22
+ @subject.set_defaults_for :something_invalid
23
+ }.should raise_error(ArgumentError)
24
+ end
25
+
26
+ describe "defaults for vim" do
27
+ before do
28
+ @subject.set_defaults_for :vim
29
+ end
30
+
31
+ it "should set the editor to spackle-vim-load-quickfix" do
32
+ @subject.callback_command.should == "spackle-vim-load-quickfix"
33
+ end
34
+
35
+ it "should set the error formatter to :vim_quickfix" do
36
+ @subject.error_formatter.should == :vim_quickfix
37
+ end
38
+ end
39
+
40
+
41
+ end
42
+ end
43
+
@@ -0,0 +1,34 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ module Spackle
4
+ describe Error do
5
+ before do
6
+ @subject = Error.new("message")
7
+ end
8
+
9
+ it "should store the message" do
10
+ @subject.message.should == "message"
11
+ end
12
+
13
+ it "should have an empty backtrace" do
14
+ @subject.backtrace.should be_empty
15
+ end
16
+
17
+ it "should allow adding errors by file and line" do
18
+ file = "foo/bar/baz.rb"
19
+ line = 123
20
+ @subject.add_error file, line
21
+ @subject.backtrace.should have(1).errors
22
+ @subject.backtrace.first.file.should == file
23
+ @subject.backtrace.first.line.should == line
24
+ end
25
+
26
+ it "should allow adding errors using a block" do
27
+ @subject = Error.new("message") do |e|
28
+ e.add_error "foo/bar", 12
29
+ e.add_error "bubba/flubba", 23
30
+ end
31
+ @subject.backtrace.should have(2).errors
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,53 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ module Spackle::Output
4
+ describe Base do
5
+ before do
6
+ @error = spackle_error_fixture
7
+ end
8
+
9
+ describe "instance" do
10
+ before do
11
+ @subject = Base.new spackle_error_fixture
12
+ end
13
+
14
+ it "should call format_backtrace_line" do
15
+ line_count = spackle_error_fixture.backtrace.size
16
+ @subject.should_receive(:format_backtrace_line).exactly(line_count).times
17
+ @subject.format
18
+ end
19
+
20
+ it "should return the formatted output" do
21
+ @subject.stub!(:format_backtrace_line).and_return("foo")
22
+ @subject.format.should == "foo\n" * 3
23
+ end
24
+ end
25
+
26
+ describe "instantiating" do
27
+ it "should use Spackle's default error if none specified" do
28
+ Spackle.should_receive(:current_error).and_return(@error)
29
+ Base.new.error.should == @error
30
+ end
31
+ end
32
+
33
+ describe "#format class method" do
34
+ before do
35
+ @instance = mock("instance")
36
+ end
37
+
38
+ it "should initialize and return formatted lines" do
39
+ Base.should_receive(:new).with(@error).and_return(@instance)
40
+ @instance.should_receive :format
41
+ Base.format @error
42
+ end
43
+
44
+ it "should use Spackle's default error if none specified" do
45
+ Base.should_receive(:new).with(@error).and_return(@instance)
46
+ Spackle.should_receive(:current_error).and_return(@error)
47
+ @instance.stub!(:format)
48
+ Base.format
49
+ end
50
+ end
51
+ end
52
+ end
53
+
@@ -0,0 +1,25 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ module Spackle::Output
4
+ describe VimQuickfix do
5
+ before do
6
+ Spackle.stub!(:current_error)
7
+ end
8
+ it "should format errors in 'path:line: message' format" do
9
+ VimQuickfix.new.format_backtrace_line("message", "file", "123").should == "file:123: message"
10
+ end
11
+
12
+ it "should strip newlines from messages" do
13
+ VimQuickfix.new.format_backtrace_line("many\nlines", "ignore", "ignore").should_not match(/\n/)
14
+ end
15
+
16
+ it "should integrate with Base and return a nice quickfix!" do
17
+ VimQuickfix.format( spackle_error_fixture ).should == <<-EOF
18
+ /clutzy/child/waving/arms:1: CATASTROPHE: the milk was spilled! Begin crying? [Y/n]
19
+ /cupboard/shelf/glass:350: CATASTROPHE: the milk was spilled! Begin crying? [Y/n]
20
+ /fridge/shelf/jug/milk:4: CATASTROPHE: the milk was spilled! Begin crying? [Y/n]
21
+ EOF
22
+ end
23
+ end
24
+ end
25
+
@@ -0,0 +1,15 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '../../../spec_helper')
2
+
3
+ module Spackle::Spec
4
+ describe BaseFormatter do
5
+ it "should initialize errors to an empty array" do
6
+ BaseFormatter.new(nil,nil).errors.should == []
7
+ end
8
+
9
+ it "should notify Spackle of the finished test along with the errors on close" do
10
+ Spackle.should_receive(:test_finished).with([])
11
+ BaseFormatter.new(nil,nil).close
12
+ end
13
+ end
14
+ end
15
+
@@ -0,0 +1,58 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '../../../spec_helper')
2
+
3
+ module Spackle::Spec
4
+ describe SpackleFormatter do
5
+ before do
6
+ @output = StringIO.new
7
+ @subject = SpackleFormatter.new({}, @output)
8
+ end
9
+
10
+ describe "example_failed" do
11
+ before do
12
+ @error = mock("error", :add_error => nil)
13
+ Spackle::Error.stub!(:new).and_return @error
14
+
15
+ Spackle.stub!(:format_error)
16
+
17
+ @exception = mock "exception", {
18
+ :message => "a message",
19
+ :backtrace => [
20
+ "some/path/to/file:123",
21
+ "another/path/to/file:345"
22
+ ]
23
+ }
24
+ @failure = mock "failure", { :exception => @exception }
25
+ end
26
+
27
+ def example_failed
28
+ @subject.example_failed("example", "counter", @failure)
29
+ end
30
+
31
+ it "should create an error with the message" do
32
+ Spackle::Error.should_receive(:new).with("a message").and_return(@error)
33
+ example_failed
34
+ end
35
+
36
+ it "should add two entries to the error" do
37
+ @error.should_receive(:add_error).exactly(2).times
38
+ example_failed
39
+ end
40
+
41
+ it "should add errors by file and line number" do
42
+ @error.should_receive(:add_error) do |file, line|
43
+ correct_args =
44
+ (file == "some/path/to/file" && line = "123") ||
45
+ (file == "another/path/to/file" && line = "345")
46
+ correct_args.should be_true
47
+ end
48
+ example_failed
49
+ end
50
+
51
+ it "should append the to the errors format" do
52
+ example_failed
53
+ @subject.errors.last.should == @error
54
+ end
55
+ end
56
+ end
57
+ end
58
+
@@ -0,0 +1,10 @@
1
+ module SpackleErrorFixture
2
+ def spackle_error_fixture
3
+ Spackle::Error.new "CATASTROPHE: the milk was spilled! Begin crying? [Y/n]" do |e|
4
+ e.add_error "/clutzy/child/waving/arms", 1
5
+ e.add_error "/cupboard/shelf/glass", 350
6
+ e.add_error "/fridge/shelf/jug/milk", 4
7
+ end
8
+ end
9
+ end
10
+
@@ -0,0 +1,203 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ class Spackle::Output::SomeClass
4
+ def self.format(*args)
5
+ end
6
+ end
7
+
8
+
9
+ describe Spackle do
10
+ it "should be configurable" do
11
+ config = Spackle.configuration
12
+ config.should == Spackle.configuration
13
+ Spackle.configure do |c|
14
+ c.should == config
15
+ end
16
+ end
17
+
18
+ describe "load_config_from_dotfile" do
19
+ before do
20
+ Spackle.stub!(:load)
21
+ end
22
+
23
+ it "should return false if a config file was found" do
24
+ File.stub(:exists?).and_return false
25
+ Spackle.load_config_from_dotfile.should be_false
26
+ end
27
+
28
+ it "should return true if a config file was found" do
29
+ File.stub(:exists?).and_return true
30
+ Spackle.load_config_from_dotfile.should be_true
31
+ end
32
+
33
+ it "should check for a .spackle file in the project root directory" do
34
+ Spackle::Helpers::RubyProjectRoot.should_receive(:search).and_return("/some/dir/project")
35
+ File.should_receive(:exists?).with any_args()
36
+ File.should_receive(:exists?).with("/some/dir/project/.spackle").and_return(true)
37
+ Spackle.load_config_from_dotfile.should be_true
38
+ end
39
+ end
40
+
41
+
42
+ describe "loading configuration" do
43
+ it "should have nil for the callback command if no config found" do
44
+ Spackle.stub(:load_config_from_dotfile).and_return(false)
45
+ Spackle.load_config
46
+ Spackle.configuration.callback_command.should be_nil
47
+ end
48
+
49
+ it "should not use the vim defaults when a config file is found" do
50
+ Spackle.configuration.should_not_receive(:set_defaults_for).with(:vim)
51
+ Spackle.stub(:load_config_from_dotfile).and_return(true)
52
+ Spackle.load_config
53
+ end
54
+ end
55
+
56
+
57
+ describe "tempdir" do
58
+ it "should default to /tmp" do
59
+ Spackle.tempdir.should == "/tmp"
60
+ end
61
+
62
+ it "should use the configured tempdir" do
63
+ Spackle.configuration.tempdir = "my_tempdir"
64
+ Spackle.tempdir.should == "my_tempdir"
65
+ end
66
+ end
67
+
68
+ describe "spackle_file" do
69
+ it "should return the tempdir" do
70
+ Spackle.stub!(:tempdir).and_return("/temp")
71
+ Spackle.spackle_file.should match(%r{^/temp/.+})
72
+ end
73
+
74
+ it "should end with the Configuration's spackle_file if specified" do
75
+ Spackle.configuration.spackle_file = "my_spackle"
76
+ Spackle.spackle_file.should match(%r(/my_spackle$))
77
+ end
78
+
79
+ describe "when no configured spackle_file" do
80
+ before do
81
+ Spackle.configuration.spackle_file = nil
82
+ end
83
+
84
+ it "should end with default.spackle if no project root detected" do
85
+ Spackle::Helpers::RubyProjectRoot.stub! :search => nil
86
+ Spackle.spackle_file.should match(%r(/default\.spackle$))
87
+ end
88
+
89
+ it "should be named after the project root if detected" do
90
+ Spackle::Helpers::RubyProjectRoot.should_receive(:search).and_return("/some/dir/project")
91
+ Spackle.spackle_file.should match(%r(/project\.spackle$))
92
+ end
93
+
94
+ end
95
+
96
+ end
97
+
98
+ describe "formatter_class" do
99
+ it "should convert the configuration's error_formatter to a class" do
100
+ Spackle.configuration.error_formatter = :some_class
101
+ Spackle.error_formatter_class.should == Spackle::Output::SomeClass
102
+ end
103
+
104
+ it "should raise a helpful error if no matching class can be found" do
105
+ Spackle.configuration.error_formatter = :not_existing
106
+ lambda {
107
+ Spackle.error_formatter_class
108
+ }.should raise_error(RuntimeError, /\.spackle/)
109
+ end
110
+ end
111
+
112
+ describe "test_finished" do
113
+ before do
114
+ @errors = [ spackle_error_fixture ]
115
+ @formatter = mock("formatter", :format => "string")
116
+ @file = StringIO.new
117
+ File.stub!(:open).and_yield(@file)
118
+ Spackle.stub!(
119
+ :error_formatter_class => @formatter,
120
+ :system => true,
121
+ :spackle_file => @spackle_file
122
+ )
123
+ Spackle.configuration.error_formatter = :something
124
+ end
125
+
126
+ it "should write the output to the spackle_file if defined" do
127
+ end
128
+
129
+ it "should not write the spackle_file if the error_formatter is undefined" do
130
+ Spackle.configuration.error_formatter = nil
131
+ File.should_not_receive(:open)
132
+ Spackle.test_finished @errors
133
+ end
134
+
135
+ it "should invoke the callback_command if defined" do
136
+ Spackle.configuration.callback_command = '/bin/true'
137
+ Spackle.should_receive(:system).with('/bin/true', @spackle_file)
138
+ Spackle.test_finished @errors
139
+ end
140
+
141
+ it "should not invoke the callback_command if none defined" do
142
+ Spackle.configuration.callback_command = nil
143
+ Spackle.should_not_receive(:system)
144
+ Spackle.test_finished @errors
145
+ end
146
+
147
+ it "should format the errors" do
148
+ @formatter.should_receive(:format).with(@errors[0])
149
+ Spackle.test_finished @errors
150
+ end
151
+
152
+ it "should write formatted output to file" do
153
+ @file.should_receive(:write).with("string")
154
+ Spackle.test_finished @errors
155
+ end
156
+ end
157
+
158
+ describe "init" do
159
+ before do
160
+ Spackle.stub! :load_config => true,
161
+ :spackle_file => true,
162
+ :already_initialized? => false
163
+ File.stub! :unlink => true,
164
+ :exists? => false
165
+ end
166
+
167
+ it "should only init once" do
168
+ Spackle.should_receive(:load_config).exactly(1).times
169
+ Spackle.init
170
+ Spackle.stub! :already_initialized? => true
171
+ Spackle.should_not_receive(:load_config)
172
+ Spackle.init
173
+ end
174
+
175
+ it "should delete the old file, if it exists" do
176
+ Spackle.stub! :spackle_file => "file"
177
+ File.should_receive(:exists?).with("file").and_return(true)
178
+ File.should_receive(:unlink).with("file")
179
+ Spackle.init
180
+ end
181
+
182
+ it "should not delete the old file unless it exists" do
183
+ Spackle.stub! :spackle_file => "file"
184
+ File.should_receive(:exists?).with("file").and_return(false)
185
+ File.should_not_receive(:unlink).with("file")
186
+ Spackle.init
187
+ end
188
+
189
+ it "should load the config" do
190
+ Spackle.should_receive :load_config
191
+ Spackle.init
192
+ end
193
+
194
+ it "should insert the RSpec formatter if :with => :spec_formatter specified" do
195
+ Spec::Runner.options.should_receive(:parse_format).with /Spackle::Spec::SpackleFormatter/
196
+ Spackle.init :with => :spec_formatter
197
+ end
198
+
199
+
200
+ end
201
+
202
+ end
203
+
data/spec/spec.opts ADDED
@@ -0,0 +1 @@
1
+ --color