historian 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. data/.document +5 -0
  2. data/.gitignore +5 -0
  3. data/.rspec +3 -0
  4. data/Gemfile +4 -0
  5. data/Gemfile.lock +35 -0
  6. data/LICENSE +20 -0
  7. data/LICENSE.txt +20 -0
  8. data/README.rdoc +149 -0
  9. data/Rakefile +2 -0
  10. data/VERSION +1 -0
  11. data/autotest/discover.rb +1 -0
  12. data/bin/historian +12 -0
  13. data/historian.gemspec +28 -0
  14. data/lib/historian.rb +12 -0
  15. data/lib/historian/cli.rb +84 -0
  16. data/lib/historian/commit_message.rb +40 -0
  17. data/lib/historian/configuration.rb +10 -0
  18. data/lib/historian/git.rb +189 -0
  19. data/lib/historian/history_file.rb +209 -0
  20. data/lib/historian/version.rb +3 -0
  21. data/spec/example_history.txt +24 -0
  22. data/spec/fixtures/after_0_0_2 +16 -0
  23. data/spec/fixtures/after_0_0_2_changelog +6 -0
  24. data/spec/fixtures/after_0_0_2_history +17 -0
  25. data/spec/fixtures/all_types_history +17 -0
  26. data/spec/fixtures/anonymous_release_log +7 -0
  27. data/spec/fixtures/arbitrary_text +21 -0
  28. data/spec/fixtures/courageous_camel_history +13 -0
  29. data/spec/fixtures/courageous_camel_release_log +7 -0
  30. data/spec/fixtures/empty +0 -0
  31. data/spec/fixtures/invalid_significance +17 -0
  32. data/spec/fixtures/missing_significance +16 -0
  33. data/spec/fixtures/normal +10 -0
  34. data/spec/fixtures/normal_changelog_after_major +11 -0
  35. data/spec/fixtures/normal_changelog_after_minor +8 -0
  36. data/spec/fixtures/normal_history_after_major +17 -0
  37. data/spec/fixtures/normal_history_after_minor +14 -0
  38. data/spec/fixtures/patch_on_nothing +5 -0
  39. data/spec/fixtures/release_on_nothing +1 -0
  40. data/spec/fixtures/second_patch_on_nothing +6 -0
  41. data/spec/historian/cli_spec.rb +210 -0
  42. data/spec/historian/commit_message_spec.rb +95 -0
  43. data/spec/historian/git_spec.rb +199 -0
  44. data/spec/historian/history_file_spec.rb +225 -0
  45. data/spec/spec.opts +3 -0
  46. data/spec/spec_helper.rb +21 -0
  47. data/spec/support/fixture_helper.rb +8 -0
  48. data/spec/support/git_helpers.rb +53 -0
  49. data/spec/support/history_file_matchers.rb +52 -0
  50. metadata +189 -0
@@ -0,0 +1,17 @@
1
+ == In Git
2
+
3
+ === Bugfixes
4
+ * bugfix #1
5
+ * bugfix #2
6
+
7
+
8
+ == 0.0.2 Bubbling Baboon
9
+
10
+ === Bugfixes
11
+ * more fur
12
+
13
+
14
+ == 0.0.1 Addled Adder
15
+
16
+ === Bugfixes
17
+ * more scales
@@ -0,0 +1,17 @@
1
+ == In Git
2
+
3
+ === Major Changes
4
+ * major #1
5
+
6
+ === Minor Changes
7
+ * minor #1
8
+
9
+ === Bugfixes
10
+ * bugfix #1
11
+ * bugfix #2
12
+
13
+
14
+ == 11.22.33 Addled Adder
15
+
16
+ === Bugfixes
17
+ * more scales
@@ -0,0 +1,7 @@
1
+ == 12.0.0 - 2010/12/12
2
+
3
+ === Major Changes
4
+ * major #1
5
+
6
+ === Bugfixes
7
+ * bugfix #1
@@ -0,0 +1,21 @@
1
+ == In Git
2
+
3
+ === Major Changes
4
+ * major #1
5
+
6
+ === Minor Changes
7
+ * minor #1
8
+
9
+ This line has some arbitrary text, which would be nice to support
10
+ without having the parser blow up, really, but for now it'll have to do
11
+ to at least be strict about the format.
12
+
13
+ === Bugfixes
14
+ * bugfix #1
15
+ * bugfix #2
16
+
17
+
18
+ == 11.22.33 Addled Adder
19
+
20
+ === Bugfixes
21
+ * more scales
@@ -0,0 +1,13 @@
1
+ == 12.0.0 Courageous Camel - 2010/12/12
2
+
3
+ === Major Changes
4
+ * major #1
5
+
6
+ === Bugfixes
7
+ * bugfix #1
8
+
9
+
10
+ == 11.22.33 Addled Adder
11
+
12
+ === Bugfixes
13
+ * more scales
@@ -0,0 +1,7 @@
1
+ == 12.0.0 Courageous Camel - 2010/12/12
2
+
3
+ === Major Changes
4
+ * major #1
5
+
6
+ === Bugfixes
7
+ * bugfix #1
File without changes
@@ -0,0 +1,17 @@
1
+ == In Git
2
+
3
+ === This Line Is An Invalid Significance
4
+ * major #1
5
+
6
+ === Minor Changes
7
+ * minor #1
8
+
9
+ === Bugfixes
10
+ * bugfix #1
11
+ * bugfix #2
12
+
13
+
14
+ == 11.22.33 Addled Adder
15
+
16
+ === Bugfixes
17
+ * more scales
@@ -0,0 +1,16 @@
1
+ == In Git
2
+
3
+ * this line does not follow a significance (triple-equals) marker
4
+
5
+ === Minor Changes
6
+ * minor #1
7
+
8
+ === Bugfixes
9
+ * bugfix #1
10
+ * bugfix #2
11
+
12
+
13
+ == 11.22.33 Addled Adder
14
+
15
+ === Bugfixes
16
+ * more scales
@@ -0,0 +1,10 @@
1
+ == In Git
2
+
3
+ === Bugfixes
4
+ * bugfix #1
5
+
6
+
7
+ == 11.22.33 Addled Adder
8
+
9
+ === Bugfixes
10
+ * more scales
@@ -0,0 +1,11 @@
1
+ == In Git
2
+
3
+ === Major Changes
4
+ * major #1
5
+
6
+ === Minor Changes
7
+ * minor #1
8
+
9
+ === Bugfixes
10
+ * bugfix #1
11
+ * bugfix #2
@@ -0,0 +1,8 @@
1
+ == In Git
2
+
3
+ === Minor Changes
4
+ * minor #1
5
+
6
+ === Bugfixes
7
+ * bugfix #1
8
+ * bugfix #2
@@ -0,0 +1,17 @@
1
+ == In Git
2
+
3
+ === Major Changes
4
+ * major #1
5
+
6
+ === Minor Changes
7
+ * minor #1
8
+
9
+ === Bugfixes
10
+ * bugfix #1
11
+ * bugfix #2
12
+
13
+
14
+ == 11.22.33 Addled Adder
15
+
16
+ === Bugfixes
17
+ * more scales
@@ -0,0 +1,14 @@
1
+ == In Git
2
+
3
+ === Minor Changes
4
+ * minor #1
5
+
6
+ === Bugfixes
7
+ * bugfix #1
8
+ * bugfix #2
9
+
10
+
11
+ == 11.22.33 Addled Adder
12
+
13
+ === Bugfixes
14
+ * more scales
@@ -0,0 +1,5 @@
1
+ == In Git
2
+
3
+ === Bugfixes
4
+ * bugfix #1
5
+
@@ -0,0 +1 @@
1
+ == 0.0.1 Addled Adder - 2010/12/12
@@ -0,0 +1,6 @@
1
+ == In Git
2
+
3
+ === Bugfixes
4
+ * bugfix #1
5
+ * bugfix #2
6
+
@@ -0,0 +1,210 @@
1
+ require 'spec_helper'
2
+
3
+ describe Historian::CLI do
4
+ include GitHelpers
5
+
6
+ before do
7
+ create_test_repo
8
+ Dir.chdir repo_directory
9
+ end
10
+
11
+ context "on initialization" do
12
+ it "finds the root of the current git repository" do
13
+ subdir = File.join repo_directory, "subdir/subdir"
14
+ FileUtils.mkdir_p subdir
15
+ Dir.chdir subdir
16
+ Dir.pwd.should eql(subdir)
17
+ cli = Historian::CLI.new
18
+ cli.git.repo_directory.should eq(repo_directory)
19
+ end
20
+
21
+ it "creates a history file if none exists" do
22
+ ProjectScout.stub :scan => repo_directory
23
+ File.should_receive(:exists?).and_return(false)
24
+ File.stub(:open).and_return(StringIO.new)
25
+ File.should_receive(:open).at_least(:once).with(/History.txt/, "w")
26
+ cli = Historian::CLI.new
27
+ end
28
+
29
+ it "initializes a GitHookInstaller with the repository directory" do
30
+ Historian::Git.should_receive(:new).with(repo_directory, anything).and_return(@ghi)
31
+ cli = Historian::CLI.new
32
+ end
33
+
34
+ end
35
+
36
+ describe "#commit-msg" do
37
+ before do
38
+ @message_file = "/tmp/historian_test_message"
39
+ @cli = Historian::CLI.new
40
+ end
41
+
42
+ context "when an amendment flag exists" do
43
+ before do
44
+ @amend_flag = File.join(repo_directory, ".git", "historian-amend")
45
+ File.open(@amend_flag, "w")
46
+ end
47
+
48
+ it "does not parse the commit message" do
49
+ File.should_not_receive(:open).with(@message_file)
50
+ @cli.commit_msg @message_file
51
+ end
52
+ end
53
+
54
+ context "when message contains no historian tokens" do
55
+ before do
56
+ File.open(@message_file, "w") do |f|
57
+ f.puts "test bugfix"
58
+ end
59
+ @cli.commit_msg @message_file
60
+ end
61
+
62
+ after do
63
+ File.unlink @message_file
64
+ end
65
+
66
+ it "doesn't create an amend flag" do
67
+ amend_flag = File.join(repo_directory, ".git", "historian-amend")
68
+ File.exists?(amend_flag).should be_false
69
+ end
70
+
71
+ it "doesn't update the history file" do
72
+ history_file = File.join repo_directory, "History.txt"
73
+ modified?(history_file).should be_false
74
+ end
75
+ end
76
+
77
+ context "when message contains historian tokens" do
78
+ before do
79
+ File.open(@message_file, "w") do |f|
80
+ f.puts "b:test bugfix"
81
+ end
82
+ @cli.commit_msg @message_file
83
+ end
84
+
85
+ after do
86
+ File.unlink @message_file
87
+ end
88
+
89
+ it "creates an amend flag" do
90
+ amend_flag = File.join(repo_directory, ".git", "historian-amend")
91
+ File.exists?(amend_flag).should be_true
92
+ end
93
+
94
+ it "updates the history file" do
95
+ history_file = File.join repo_directory, "History.txt"
96
+ history = File.readlines(history_file)
97
+ history.grep(/test bugfix/).should have(1).match
98
+ modified?(history_file).should be_true
99
+ end
100
+
101
+ it "strips the tokens out of the message file" do
102
+ File.read(@message_file).should_not match(/b:/)
103
+ end
104
+
105
+ it "updates the commit message with tokens and suppressed lines removed" do
106
+ File.read(@message_file).should eq("test bugfix\n")
107
+ end
108
+ end
109
+
110
+ context "when the message contains a release token" do
111
+ before do
112
+ File.open(@message_file, "w") do |f|
113
+ f.puts "!:Addled Adder"
114
+ end
115
+ @cli.commit_msg @message_file
116
+ end
117
+
118
+ after do
119
+ File.unlink @message_file
120
+ end
121
+
122
+ it "creates a release flag" do
123
+ release_flag = File.join(repo_directory, ".git", "historian-release")
124
+ File.exists?(release_flag).should be_true
125
+ end
126
+
127
+ it "creates an amend flag" do
128
+ amend_flag = File.join(repo_directory, ".git", "historian-amend")
129
+ File.exists?(amend_flag).should be_true
130
+ end
131
+
132
+ it "strips the tokens out of the message file" do
133
+ File.read(@message_file).should_not match(/!:/)
134
+ end
135
+
136
+ it "updates the history file" do
137
+ history_file = File.join repo_directory, "History.txt"
138
+ history = File.readlines(history_file)
139
+ history.grep(/== 0.0.1 Addled Adder/).should have(1).match
140
+ modified?(history_file).should be_true
141
+ end
142
+ end
143
+ end
144
+
145
+ describe "#install" do
146
+ before do
147
+ @git = mock("Historian::Git", :install_hook => nil)
148
+ Historian::Git.stub(:new).and_return(@git)
149
+ @cli = Historian::CLI.new
150
+ end
151
+
152
+ subject { @cli }
153
+
154
+ it "installs the commit-msg hook" do
155
+ @git.should_receive(:install_hook).with(:commit_msg).at_least(:once)
156
+ subject.install
157
+ end
158
+
159
+ it "installs the post-commit hook" do
160
+ @git.should_receive(:install_hook).at_least(:once).with(:post_commit)
161
+ subject.install
162
+ end
163
+ end
164
+
165
+
166
+ describe "#post-commit" do
167
+ before do
168
+ @git = mock("Historian::Git",
169
+ :bundle_history_file => nil,
170
+ :tag_release => nil)
171
+ Historian::Git.stub(:new).and_return(@git)
172
+ @cli = Historian::CLI.new
173
+ end
174
+
175
+ context "when an amendment flag exists" do
176
+ before do
177
+ @amend_flag = File.join(repo_directory, ".git", "historian-amend")
178
+ File.open(@amend_flag, "w")
179
+ end
180
+
181
+ it "bundles the history file" do
182
+ @git.should_receive :bundle_history_file
183
+ @cli.post_commit
184
+ end
185
+
186
+ it "deletes the amendment flag" do
187
+ @cli.post_commit
188
+ File.exists?(@amend_flag).should_not be_true
189
+ end
190
+ end
191
+
192
+ context "when a release flag exists" do
193
+ before do
194
+ @release_flag = File.join(repo_directory, ".git", "historian-release")
195
+ File.open(@release_flag, "w")
196
+ end
197
+
198
+ it "tags the release" do
199
+ @git.should_receive :tag_release
200
+ @cli.post_commit
201
+ end
202
+
203
+ it "deletes the release flag" do
204
+ @cli.post_commit
205
+ File.exists?(@release_flag).should_not be_true
206
+ end
207
+ end
208
+ end
209
+
210
+ end
@@ -0,0 +1,95 @@
1
+ require 'spec_helper'
2
+
3
+ describe Historian::CommitMessage do
4
+ describe "#parse line" do
5
+ describe "#supressed?" do
6
+ subject { Historian::CommitMessage.parse_line(@line) }
7
+
8
+ it "is suppressed if the line contains a supression token" do
9
+ @line = "b#: suppress me"
10
+ subject.should be_suppressed
11
+ end
12
+
13
+ it "is not suppressed if the line doesn't have a suppression token" do
14
+ @line = "b: don't suppress me"
15
+ subject.should_not be_suppressed
16
+ end
17
+
18
+ it "is not suppressed if the line has no Historian token" do
19
+ @line = "x: not really a token!"
20
+ subject.should_not be_suppressed
21
+ end
22
+ end
23
+
24
+ describe "#to_s" do
25
+ subject { Historian::CommitMessage.parse_line(@line).to_s }
26
+
27
+ it "returns the input if the string contains no Historian token" do
28
+ @line = "a line without a token"
29
+ subject.should eq(@line)
30
+ end
31
+ it "is strips the Historian token from the string if present" do
32
+ @line = "M: * major!"
33
+ subject.should eq(" * major!")
34
+ end
35
+ end
36
+
37
+ describe "#to_messsage_s" do
38
+ subject { Historian::CommitMessage.parse_line(@line).to_message_s }
39
+
40
+ it "is nil with no token" do
41
+ @line = "no token"
42
+ subject.should be_nil
43
+ end
44
+
45
+ it "strips whitespace from the beginning of the string" do
46
+ @line = "M: major!"
47
+ subject.should eq("major!")
48
+ end
49
+
50
+ it "strips non alphanumeric characters from the beginning of the string" do
51
+ @line = "M: * major!"
52
+ subject.should eq("major!")
53
+ end
54
+ end
55
+
56
+ describe "#significance" do
57
+ subject { Historian::CommitMessage.parse_line(@line).significance }
58
+
59
+ it "is nil with token that doesn't precede an alphanumeric" do
60
+ @line = "b: * ^^ !"
61
+ subject.should be_nil
62
+ end
63
+
64
+ it "is nil with no Historian token" do
65
+ @line = "there's no token here"
66
+ subject.should be_nil
67
+ end
68
+
69
+ it "is nil if the token doesn't start at the beginning of the line" do
70
+ @line = " b: this isn't a bugfix"
71
+ subject.should be_nil
72
+ end
73
+
74
+ it "is :patch with a bugfix token" do
75
+ @line = "b: this is a bugfix"
76
+ subject.should eq(:patch)
77
+ end
78
+
79
+ it "is :minor with a minor improvement token" do
80
+ @line = "m: this is a minor improvement"
81
+ subject.should eq(:minor)
82
+ end
83
+
84
+ it "is :major with a major improvement token" do
85
+ @line = "M: this is a major improvement"
86
+ subject.should eq(:major)
87
+ end
88
+
89
+ it "is :release with a release token" do
90
+ @line = "!: this is a release"
91
+ subject.should eq(:release)
92
+ end
93
+ end
94
+ end
95
+ end