germinate 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -0
- data/History.txt +26 -0
- data/README.rdoc +152 -0
- data/Rakefile +43 -0
- data/TODO +140 -0
- data/bin/germ +260 -0
- data/cucumber.yml +2 -0
- data/examples/basic.rb +123 -0
- data/examples/short.rb +19 -0
- data/features/author-formats-article.feature +111 -0
- data/features/author-lists-info.pending_feature +48 -0
- data/features/author-publishes-article-source.feature +5 -0
- data/features/author-publishes-article.feature +57 -0
- data/features/author-republishes-article.feature +5 -0
- data/features/author-selects-hunks.feature +26 -0
- data/features/author-sets-variables.feature +88 -0
- data/features/author-updates-article-source.feature +5 -0
- data/features/author-views-stuff.pending_feature +52 -0
- data/features/bin/quoter +6 -0
- data/features/bin/sorter +4 -0
- data/features/example_articles/bracketing.rb +27 -0
- data/features/example_articles/escaping.txt +13 -0
- data/features/example_articles/excerpt_output.rb +16 -0
- data/features/example_articles/hello.rb +9 -0
- data/features/example_articles/pipelines.txt +25 -0
- data/features/example_articles/regexen.rb +24 -0
- data/features/example_articles/sample_offsets.rb +18 -0
- data/features/example_articles/specials.rb +19 -0
- data/features/example_articles/stderr.rb +10 -0
- data/features/example_articles/wrapping.rb +8 -0
- data/features/example_output/bracketing.out +23 -0
- data/features/example_output/code_samples.txt +186 -0
- data/features/example_output/escaping.out +5 -0
- data/features/example_output/excerpt_output.out +6 -0
- data/features/example_output/hello.txt +1 -0
- data/features/example_output/pipelines.out +28 -0
- data/features/example_output/regexen.txt +22 -0
- data/features/example_output/sample_offsets.txt +15 -0
- data/features/example_output/specials.txt +40 -0
- data/features/example_output/stderr.out +3 -0
- data/features/example_output/wrapping.txt +3 -0
- data/features/step_definitions/germinate.rb +42 -0
- data/features/support/env.rb +20 -0
- data/germinate.gemspec +55 -0
- data/lib/germinate.rb +54 -0
- data/lib/germinate/application.rb +113 -0
- data/lib/germinate/article_editor.rb +20 -0
- data/lib/germinate/formatter.rb +119 -0
- data/lib/germinate/hunk.rb +183 -0
- data/lib/germinate/implicit_insertion.rb +9 -0
- data/lib/germinate/insertion.rb +29 -0
- data/lib/germinate/librarian.rb +293 -0
- data/lib/germinate/origin.rb +5 -0
- data/lib/germinate/pipeline.rb +13 -0
- data/lib/germinate/publisher.rb +57 -0
- data/lib/germinate/reader.rb +266 -0
- data/lib/germinate/selector.rb +136 -0
- data/lib/germinate/shared_style_attributes.rb +54 -0
- data/lib/germinate/shell_process.rb +94 -0
- data/lib/germinate/shell_publisher.rb +19 -0
- data/lib/germinate/simple_publisher.rb +7 -0
- data/lib/germinate/source_file.rb +41 -0
- data/lib/germinate/text_transforms.rb +119 -0
- data/lib/germinate/transform_process.rb +25 -0
- data/lib/germinate/variable.rb +23 -0
- data/sample.rb +14 -0
- data/spec/germinate/application_spec.rb +31 -0
- data/spec/germinate/article_editor_spec.rb +97 -0
- data/spec/germinate/code_hunk_spec.rb +73 -0
- data/spec/germinate/file_hunk_spec.rb +28 -0
- data/spec/germinate/formatter_spec.rb +160 -0
- data/spec/germinate/hunk_spec.rb +84 -0
- data/spec/germinate/implicit_insertion_spec.rb +33 -0
- data/spec/germinate/insertion_spec.rb +19 -0
- data/spec/germinate/librarian_spec.rb +555 -0
- data/spec/germinate/pipeline_spec.rb +34 -0
- data/spec/germinate/process_spec.rb +105 -0
- data/spec/germinate/publisher_spec.rb +130 -0
- data/spec/germinate/reader_spec.rb +385 -0
- data/spec/germinate/selector_spec.rb +121 -0
- data/spec/germinate/shell_publisher_spec.rb +61 -0
- data/spec/germinate/source_file_spec.rb +99 -0
- data/spec/germinate/text_hunk_spec.rb +98 -0
- data/spec/germinate/text_transforms_spec.rb +242 -0
- data/spec/germinate/transform_process_spec.rb +50 -0
- data/spec/germinate/variable_spec.rb +14 -0
- data/spec/germinate_spec.rb +8 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +16 -0
- data/tasks/ann.rake +80 -0
- data/tasks/bones.rake +20 -0
- data/tasks/cucumber.rake +5 -0
- data/tasks/gem.rake +201 -0
- data/tasks/git.rake +40 -0
- data/tasks/notes.rake +27 -0
- data/tasks/post_load.rake +34 -0
- data/tasks/rdoc.rake +51 -0
- data/tasks/rubyforge.rake +55 -0
- data/tasks/setup.rb +292 -0
- data/tasks/spec.rake +54 -0
- data/tasks/svn.rake +47 -0
- data/tasks/test.rake +40 -0
- data/tasks/zentest.rake +36 -0
- data/test/test_germinate.rb +0 -0
- metadata +228 -0
@@ -0,0 +1,121 @@
|
|
1
|
+
require File.expand_path(
|
2
|
+
File.join(File.dirname(__FILE__), %w[.. .. lib germinate]))
|
3
|
+
|
4
|
+
module Germinate
|
5
|
+
describe Selector do
|
6
|
+
|
7
|
+
it "should be comparable to a string" do
|
8
|
+
Selector.new("@A:1..5").should be == "@A:1..5"
|
9
|
+
Selector.new("@A:1..5").should_not be == "@A:1..6"
|
10
|
+
end
|
11
|
+
|
12
|
+
context "given a subscript" do
|
13
|
+
before :each do
|
14
|
+
@it = Germinate::Selector.new("@A:1", "DEFAULT")
|
15
|
+
end
|
16
|
+
|
17
|
+
specify { @it.should be_slice }
|
18
|
+
specify { @it.should_not be_whole }
|
19
|
+
end
|
20
|
+
|
21
|
+
context "given no subscript" do
|
22
|
+
before :each do
|
23
|
+
@it = Germinate::Selector.new("@A", "DEFAULT")
|
24
|
+
end
|
25
|
+
|
26
|
+
specify { @it.should_not be_slice }
|
27
|
+
specify { @it.should be_whole }
|
28
|
+
end
|
29
|
+
|
30
|
+
context "given a post-pipeline subscript" do
|
31
|
+
before :each do
|
32
|
+
@it = Germinate::Selector.new("@A|foo:1", "DEFAULT")
|
33
|
+
end
|
34
|
+
|
35
|
+
specify { @it.should_not be_slice }
|
36
|
+
specify { @it.should be_whole }
|
37
|
+
end
|
38
|
+
|
39
|
+
context "given no type sigil or key" do
|
40
|
+
before :each do
|
41
|
+
@it = Selector.new(":2..5")
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should have type code" do
|
45
|
+
@it.selector_type.should == :special
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should have key SOURCE" do
|
49
|
+
@it.key.should == "SOURCE"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
EXAMPLE_SELECTORS = [
|
54
|
+
# selector type key delim start end length pipeline excerpt_output?
|
55
|
+
[ "@A", :code, "A", '..', 1, -1, nil, %w[_transform] ,false],
|
56
|
+
[ "@A:1", :code, "A", nil, 1, 1, nil, %w[_transform] ,false],
|
57
|
+
[ "", :code, "DEFAULT", '..', 1, -1, nil, %w[_transform] ,false],
|
58
|
+
[ nil, :code, "DEFAULT", '..', 1, -1, nil, %w[_transform] ,false],
|
59
|
+
[ ":2..4", :code, "DEFAULT", '..', 2, 4, nil, %w[_transform] ,false],
|
60
|
+
[ ":2...4", :code, "DEFAULT", '...', 2, 4, nil, %w[_transform] ,false],
|
61
|
+
[ "@B:2,5", :code, "B", ',', 2, nil,5, %w[_transform] ,false],
|
62
|
+
[ "@B:/z/,6", :code, "B", ',', /z/, nil,6, %w[_transform] ,false],
|
63
|
+
[ "@_:/z/../x/", :code, "_", '..', /z/, /x/,nil, %w[_transform] ,false],
|
64
|
+
[ "@B:2,4|fnord",:code, "B", ',', 2, nil,4, %w[_transform fnord] ,false],
|
65
|
+
[ "$FOO", :special, "FOO", '..', 1, -1, nil, %w[_transform] ,false],
|
66
|
+
[ "@A|foo|bar", :code, "A", '..', 1, -1, nil, %w[_transform foo bar],false],
|
67
|
+
[ "@B|fnord:2,4",:code, "B", ',', 2, nil,4, %w[_transform fnord],true],
|
68
|
+
[ "@B|_transform",:code, "B", '..', 1, -1, nil, %w[_transform], false]
|
69
|
+
]
|
70
|
+
|
71
|
+
EXAMPLE_SELECTORS.each do |selector_attributes|
|
72
|
+
selector_string = selector_attributes[0]
|
73
|
+
type = selector_attributes[1]
|
74
|
+
key = selector_attributes[2]
|
75
|
+
delimiter = selector_attributes[3]
|
76
|
+
start = selector_attributes[4]
|
77
|
+
end_offset = selector_attributes[5]
|
78
|
+
length = selector_attributes[6]
|
79
|
+
pipeline = selector_attributes[7]
|
80
|
+
excerpt_output = selector_attributes[8]
|
81
|
+
|
82
|
+
context "given selector '#{selector_attributes[0]}'" do
|
83
|
+
before :each do
|
84
|
+
@it = Germinate::Selector.new(selector_string, "DEFAULT")
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should have string #{selector_string}" do
|
88
|
+
@it.string.should == selector_string
|
89
|
+
end
|
90
|
+
|
91
|
+
it "should have type #{type.inspect}" do
|
92
|
+
@it.selector_type.should == type
|
93
|
+
end
|
94
|
+
it "should have key #{key.inspect}" do
|
95
|
+
@it.key.should == key
|
96
|
+
end
|
97
|
+
it "should start at #{start.inspect}" do
|
98
|
+
@it.start_offset.should == start
|
99
|
+
end
|
100
|
+
it "should end at #{end_offset.inspect}" do
|
101
|
+
@it.end_offset.should == end_offset
|
102
|
+
end
|
103
|
+
it "should have length #{length.inspect}" do
|
104
|
+
@it.length.should == length
|
105
|
+
end
|
106
|
+
it "should have pipeline #{pipeline.inspect}" do
|
107
|
+
@it.pipeline.should == pipeline
|
108
|
+
end
|
109
|
+
it "should have delimiter #{delimiter.inspect}" do
|
110
|
+
@it.delimiter.should == delimiter
|
111
|
+
end
|
112
|
+
|
113
|
+
if excerpt_output
|
114
|
+
specify { @it.should be_excerpt_output }
|
115
|
+
else
|
116
|
+
specify { @it.should_not be_excerpt_output }
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require File.expand_path(
|
2
|
+
File.join(File.dirname(__FILE__), %w[.. .. lib germinate]))
|
3
|
+
|
4
|
+
module Germinate
|
5
|
+
describe ShellPublisher do
|
6
|
+
before :each do
|
7
|
+
@name = "frank"
|
8
|
+
@pipeline_output = ["* line 1\n", "* line 2\n"]
|
9
|
+
@pipeline = stub("Pipeline", :call => @pipeline_output)
|
10
|
+
@variables = stub("Variables")
|
11
|
+
@librarian = stub("Librarian",
|
12
|
+
:make_pipeline => @pipeline,
|
13
|
+
:variables => @variables)
|
14
|
+
@command = "cat %f"
|
15
|
+
@options = {:command => @command}
|
16
|
+
@it = ShellPublisher.new(@name, @librarian, @options)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should have identifier 'shell'" do
|
20
|
+
ShellPublisher.identifier.should == "shell"
|
21
|
+
end
|
22
|
+
|
23
|
+
context "on publish" do
|
24
|
+
before :each do
|
25
|
+
@result = ["line 1\n", "line 2\n"]
|
26
|
+
@output = StringIO.new
|
27
|
+
@process = stub("ShellProcess", :call => @result).as_null_object
|
28
|
+
@source = stub("Source").as_null_object
|
29
|
+
@librarian.stub!(:[]).and_return(@source)
|
30
|
+
ShellProcess.stub!(:new).and_return(@process)
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should create a new process" do
|
34
|
+
ShellProcess.should_receive(:new).with(@name, @command, @variables)
|
35
|
+
@it.publish!(@output)
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should execute the created process" do
|
39
|
+
@process.should_receive(:call).with(anything).and_return(@result)
|
40
|
+
@it.publish!(@output)
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should pass the pipeline output to the created process" do
|
44
|
+
@process.should_receive(:call).with(@pipeline_output).and_return(@result)
|
45
|
+
@it.publish!(@output)
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should ask the librarian for the source file" do
|
49
|
+
@librarian.should_receive(:[]).with("$TEXT|_transform", anything)
|
50
|
+
@it.publish!(@output)
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should write process output to given output stream" do
|
54
|
+
@it.publish!(@output)
|
55
|
+
@output.rewind
|
56
|
+
@output.read.should == "line 1\nline 2\n"
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
require File.expand_path(
|
2
|
+
File.join(File.dirname(__FILE__), %w[.. .. lib germinate]))
|
3
|
+
|
4
|
+
module Germinate
|
5
|
+
describe SourceFile do
|
6
|
+
before :each do
|
7
|
+
@it = SourceFile.new("DIR/SOURCE_PATH.EXT")
|
8
|
+
@file = stub("File", :flock => 0)
|
9
|
+
@lines = ["Line 1\n", "Line 2\n"]
|
10
|
+
File.stub!(:new).and_return(@file)
|
11
|
+
FileUtils.stub!(:cp)
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should have a source path" do
|
15
|
+
@it.path.to_s.should == "DIR/SOURCE_PATH.EXT"
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should append .germ.back for the backup path" do
|
19
|
+
@it.backup_path.to_s.should == "DIR/SOURCE_PATH.EXT.germ.bak"
|
20
|
+
end
|
21
|
+
|
22
|
+
context "when writing" do
|
23
|
+
before :each do
|
24
|
+
@open_file = stub("Open File", :write => nil)
|
25
|
+
@path = stub("Source Path", :read => "...")
|
26
|
+
@path.stub!(:open).and_yield(@open_file)
|
27
|
+
@backup_path = stub("BACKUP_PATH", :read => "...")
|
28
|
+
@it.backup_path = @backup_path
|
29
|
+
@it.path = @path
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should lock and unlock the source path" do
|
33
|
+
File.should_receive(:new).with(@it.path).and_return(@file)
|
34
|
+
@file.should_receive(:flock).with(File::LOCK_EX).ordered.and_return(0)
|
35
|
+
@file.should_receive(:flock).with(File::LOCK_UN).ordered
|
36
|
+
@it.write!(@lines)
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should raise error if locking fails" do
|
40
|
+
@file.should_receive(:flock).with(File::LOCK_EX).ordered.and_return(1)
|
41
|
+
@file.should_receive(:flock).with(File::LOCK_UN).ordered
|
42
|
+
|
43
|
+
lambda do
|
44
|
+
@it.write!(@lines)
|
45
|
+
end.should raise_error(RuntimeError)
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should make a backup copy after locking the file" do
|
49
|
+
@file.should_receive(:flock).with(File::LOCK_EX).ordered.and_return(0)
|
50
|
+
FileUtils.should_receive(:cp).with(@it.path, @backup_path).ordered
|
51
|
+
@it.write!(@lines)
|
52
|
+
end
|
53
|
+
|
54
|
+
it "should make no backup if locking fails" do
|
55
|
+
@file.should_receive(:flock).with(File::LOCK_EX).ordered.and_return(1)
|
56
|
+
FileUtils.should_not_receive(:cp)
|
57
|
+
@it.write!(@lines) rescue nil
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should unlock the file if backup fails" do
|
61
|
+
FileUtils.should_receive(:cp).and_raise("Some Error")
|
62
|
+
@file.should_receive(:flock).with(File::LOCK_UN)
|
63
|
+
@it.write!(@lines) rescue nil
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should raise error if source file and backup are not equal" do
|
67
|
+
@path.should_receive(:read).and_return("...")
|
68
|
+
@backup_path.should_receive(:read).and_return("....")
|
69
|
+
lambda do @it.write!(@lines) end.should raise_error(RuntimeError)
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should not open the source file if comparison fails" do
|
73
|
+
@path.should_receive(:read).and_return("...")
|
74
|
+
@backup_path.should_receive(:read).and_return("....")
|
75
|
+
@path.should_not_receive(:open)
|
76
|
+
lambda do @it.write!(@lines) end.should raise_error(RuntimeError)
|
77
|
+
end
|
78
|
+
|
79
|
+
it "should open the source file for overwriting after backing up" do
|
80
|
+
FileUtils.should_receive(:cp).ordered
|
81
|
+
@path.should_receive(:open).with('w+').ordered
|
82
|
+
@it.write!(@lines)
|
83
|
+
end
|
84
|
+
|
85
|
+
it "should write lines to the source file" do
|
86
|
+
@open_file.should_receive(:write).with("Line 1\n").ordered
|
87
|
+
@open_file.should_receive(:write).with("Line 2\n").ordered
|
88
|
+
@it.write!(@lines)
|
89
|
+
end
|
90
|
+
|
91
|
+
it "should restore backup if write fails" do
|
92
|
+
@open_file.should_receive(:write).and_raise("Some Failure")
|
93
|
+
FileUtils.should_receive(:cp).with(@backup_path, @path)
|
94
|
+
lambda do @it.write!(@lines) end.should raise_error(RuntimeError)
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
require File.expand_path(
|
2
|
+
File.join(File.dirname(__FILE__), %w[.. .. lib germinate]))
|
3
|
+
|
4
|
+
module Germinate
|
5
|
+
describe TextHunk do
|
6
|
+
before :each do
|
7
|
+
@it = TextHunk.new(["line 1", "line 2"])
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should enable insertion expansion" do
|
11
|
+
@it.should be_expand_insertions
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should enable line joining" do
|
15
|
+
@it.should be_join_lines
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should enable blank stripping" do
|
19
|
+
@it.should be_strip_blanks
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should disable comment erasure" do
|
23
|
+
@it.should_not be_erase_comments
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should enable uncommenting" do
|
27
|
+
@it.should be_uncomment
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should enable stripping right-side whitespace" do
|
31
|
+
@it.should be_rstrip_lines
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should disable bracketing" do
|
35
|
+
@it.should_not be_bracket
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should enable pipeline processing" do
|
39
|
+
@it.should be_pipeline
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should enable insertion resolution" do
|
43
|
+
@it.should be_expand_insertions
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should enable flattening nested hunks" do
|
47
|
+
@it.should be_flatten_nested
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
context "when visited by a formatter" do
|
52
|
+
before :each do
|
53
|
+
@comment_prefix = ">>"
|
54
|
+
contents = [
|
55
|
+
"foo",
|
56
|
+
"bar"
|
57
|
+
]
|
58
|
+
@it = TextHunk.new(contents,
|
59
|
+
:comment_prefix => @comment_prefix)
|
60
|
+
@formatter = stub("Formatter")
|
61
|
+
end
|
62
|
+
|
63
|
+
it "should call #format_text! on self" do
|
64
|
+
@formatter.should_receive(:format_text!).with(@it, anything)
|
65
|
+
@it.format_with(@formatter)
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should provide the comment prefix to the formatter" do
|
69
|
+
@formatter.should_receive(:format_text!).with(anything, @comment_prefix)
|
70
|
+
@it.format_with(@formatter)
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
describe "with a nested hunk" do
|
76
|
+
before :each do
|
77
|
+
@comment_prefix = ">>"
|
78
|
+
@formatter = stub("Formatter")
|
79
|
+
@nested_hunk = stub("Nested Hunk", :empty? => false)
|
80
|
+
contents = [
|
81
|
+
"foo",
|
82
|
+
"bar",
|
83
|
+
@nested_hunk,
|
84
|
+
"baz"
|
85
|
+
]
|
86
|
+
@it = TextHunk.new(contents,
|
87
|
+
:comment_prefix => @comment_prefix)
|
88
|
+
end
|
89
|
+
|
90
|
+
it "should pass formatter on to nested hunks" do
|
91
|
+
@formatter.should_receive(:format_text!).with(["foo", "bar"], ">>").ordered
|
92
|
+
@nested_hunk.should_receive(:format_with).with(@formatter).ordered
|
93
|
+
@formatter.should_receive(:format_text!).with(["baz"], ">>").ordered
|
94
|
+
@it.format_with(@formatter)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
@@ -0,0 +1,242 @@
|
|
1
|
+
require File.expand_path(
|
2
|
+
File.join(File.dirname(__FILE__), %w[.. .. lib germinate]))
|
3
|
+
|
4
|
+
module Germinate
|
5
|
+
describe TextTransforms do
|
6
|
+
|
7
|
+
Germinate::TextTransforms.methods(false).each do |transform|
|
8
|
+
describe "'#{transform}'" do
|
9
|
+
before :each do
|
10
|
+
@transform = Germinate::TextTransforms.send(transform)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should preserve hunk attributes from input to output" do
|
14
|
+
@pipeline = lambda {|h| h}
|
15
|
+
@input = Hunk.new([], :comment_prefix => "foo", :pipeline => @pipeline)
|
16
|
+
@output = @transform.call(@input)
|
17
|
+
@output.comment_prefix.should == @input.comment_prefix
|
18
|
+
end
|
19
|
+
|
20
|
+
unless transform == "flatten_nested"
|
21
|
+
context "given a lumpy hunk" do
|
22
|
+
before :each do
|
23
|
+
@nested_hunk = Hunk.new(["line 3", "line 4"])
|
24
|
+
@lumpy = Hunk.new([
|
25
|
+
"line 1",
|
26
|
+
@nested_hunk,
|
27
|
+
"line 2"
|
28
|
+
],
|
29
|
+
:comment_prefix => "foo")
|
30
|
+
@output = @transform.call(@lumpy)
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should pass nested hunks through untouched" do
|
34
|
+
@output[1].should == @nested_hunk
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe "join_lines" do
|
42
|
+
before :each do
|
43
|
+
@it = TextTransforms.join_lines
|
44
|
+
end
|
45
|
+
|
46
|
+
context "given some line-broken paragraphs" do
|
47
|
+
before :each do
|
48
|
+
@input = [
|
49
|
+
"p1l1\n",
|
50
|
+
"p1l2\n",
|
51
|
+
"\n",
|
52
|
+
"p2l1",
|
53
|
+
"p2l2"
|
54
|
+
]
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should collapse the paragraphs into single lines" do
|
58
|
+
@it.call(@input).should == [
|
59
|
+
"p1l1 p1l2",
|
60
|
+
"\n",
|
61
|
+
"p2l1 p2l2"
|
62
|
+
]
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
describe "uncomment" do
|
68
|
+
context "with no comment prefix" do
|
69
|
+
before :each do
|
70
|
+
@it = TextTransforms.uncomment(nil)
|
71
|
+
end
|
72
|
+
|
73
|
+
it "should do nothing" do
|
74
|
+
@it.call(Hunk.new(["# foo", " bar"])).should == ["# foo", " bar"]
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
context "with a comment prefix of '# '" do
|
79
|
+
before :each do
|
80
|
+
@it = TextTransforms.uncomment('# ')
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should strip matching comment prefixes" do
|
84
|
+
@it.call(["# foo", " bar"]).should == ["foo", " bar"]
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
context "given no explicit prefix" do
|
89
|
+
before :each do
|
90
|
+
@hunk = Hunk.new([" # foo", " bar"], :comment_prefix => " # ")
|
91
|
+
@it = TextTransforms.uncomment
|
92
|
+
end
|
93
|
+
|
94
|
+
it "should fall back on hunk's comment prefix" do
|
95
|
+
@it.call(@hunk).should == ["foo", " bar"]
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
|
101
|
+
describe "strip_blanks" do
|
102
|
+
context "given some leading and trailing blank lines" do
|
103
|
+
before :each do
|
104
|
+
@hunk = Hunk.new(
|
105
|
+
[
|
106
|
+
" \n ", "\t\t\t", "the good stuff",
|
107
|
+
" \n", "more good stuff\n", "\n"
|
108
|
+
])
|
109
|
+
@it = TextTransforms.strip_blanks
|
110
|
+
end
|
111
|
+
|
112
|
+
it "should strip the blak lines" do
|
113
|
+
@it.call(@hunk).should == ["the good stuff", " \n", "more good stuff\n"]
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
context "given a nested hunk at the end" do
|
118
|
+
before :each do
|
119
|
+
@hunk = Hunk.new(
|
120
|
+
[
|
121
|
+
"not blank",
|
122
|
+
"the good stuff",
|
123
|
+
Hunk.new(["line 1"])
|
124
|
+
])
|
125
|
+
@it = TextTransforms.strip_blanks
|
126
|
+
end
|
127
|
+
|
128
|
+
it "should not strip the hunk" do
|
129
|
+
@it.call(@hunk).should ==
|
130
|
+
["not blank", "the good stuff", Hunk.new(["line 1"])]
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
end
|
135
|
+
|
136
|
+
describe "rstrip_lines" do
|
137
|
+
before :each do
|
138
|
+
@it = TextTransforms.rstrip_lines
|
139
|
+
end
|
140
|
+
|
141
|
+
it "should strip whitespace from the ends of lines" do
|
142
|
+
@it.call(["foo\n", "\n", "", "\tbar\t \n "]).should == ["foo", "", "", "\tbar"]
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
describe "bracket" do
|
147
|
+
|
148
|
+
context "given explicit brackets" do
|
149
|
+
before :each do
|
150
|
+
@it = TextTransforms.bracket("[", "]")
|
151
|
+
end
|
152
|
+
|
153
|
+
it "should bracket lines with the given brackets" do
|
154
|
+
@it.call(["line 1", "line 2"]).should == ["[", "line 1", "line 2", "]"]
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
context "given no arguments" do
|
159
|
+
before :each do
|
160
|
+
@hunk = Hunk.new(
|
161
|
+
["line 1", "line 2"],
|
162
|
+
:code_open_bracket => "{{{",
|
163
|
+
:code_close_bracket => "}}}")
|
164
|
+
@it = TextTransforms.bracket
|
165
|
+
end
|
166
|
+
|
167
|
+
it "should use brackets specified on hunk" do
|
168
|
+
@it.call(@hunk).should == ["{{{", "line 1", "line 2", "}}}"]
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
context "given no no brackets" do
|
173
|
+
before :each do
|
174
|
+
@hunk = Hunk.new(
|
175
|
+
["line 1", "line 2"])
|
176
|
+
@it = TextTransforms.bracket
|
177
|
+
end
|
178
|
+
|
179
|
+
it "should leave the hunk unchanged" do
|
180
|
+
@it.call(@hunk).should == ["line 1", "line 2"]
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
describe "pipeline" do
|
186
|
+
before :each do
|
187
|
+
@output = stub("Output")
|
188
|
+
@pipeline = stub("Pipeline", :call => @output)
|
189
|
+
@hunk = stub("Hunk")
|
190
|
+
end
|
191
|
+
|
192
|
+
context "called on a hunk and a pipeline" do
|
193
|
+
before :each do
|
194
|
+
@it = TextTransforms.pipeline(@pipeline)
|
195
|
+
end
|
196
|
+
|
197
|
+
it "should invoke the pipeline on the hunk" do
|
198
|
+
@pipeline.should_receive(:call).with(@hunk).and_return(@output)
|
199
|
+
@it.call(@hunk).should == @output
|
200
|
+
end
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
describe "expand_insertions" do
|
205
|
+
before :each do
|
206
|
+
@output = stub("Output")
|
207
|
+
@hunk = stub("Hunk")
|
208
|
+
end
|
209
|
+
|
210
|
+
context "called on a hunk" do
|
211
|
+
before :each do
|
212
|
+
@it = TextTransforms.expand_insertions
|
213
|
+
end
|
214
|
+
|
215
|
+
it "should invoke expand_insertions on the hunk" do
|
216
|
+
@hunk.should_receive(:resolve_insertions).and_return(@output)
|
217
|
+
@it.call(@hunk).should == @output
|
218
|
+
end
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
describe "flatten" do
|
223
|
+
context "given a lumpy hunk" do
|
224
|
+
before :each do
|
225
|
+
@nested_hunk = Hunk.new(["line 3", "line 4"])
|
226
|
+
@lumpy = Hunk.new([
|
227
|
+
"line 1",
|
228
|
+
@nested_hunk,
|
229
|
+
"line 2"
|
230
|
+
],
|
231
|
+
:comment_prefix => "foo")
|
232
|
+
@output = TextTransforms.flatten_nested.call(@lumpy)
|
233
|
+
end
|
234
|
+
|
235
|
+
it "should flatten the hunk into a single level" do
|
236
|
+
@output.should == ["line 1", "line 3", "line 4", "line 2"]
|
237
|
+
end
|
238
|
+
end
|
239
|
+
|
240
|
+
end
|
241
|
+
end
|
242
|
+
end
|