historian 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 (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