changelog_jira 1.12.0

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 (34) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +233 -0
  3. data/Rakefile +39 -0
  4. data/bin/git-generate-changelog +4 -0
  5. data/bin/github_changelog_generator +4 -0
  6. data/lib/CHANGELOG.md +58 -0
  7. data/lib/github_changelog_generator.rb +41 -0
  8. data/lib/github_changelog_generator/fetcher.rb +221 -0
  9. data/lib/github_changelog_generator/generator/generator.rb +143 -0
  10. data/lib/github_changelog_generator/generator/generator_fetcher.rb +83 -0
  11. data/lib/github_changelog_generator/generator/generator_generation.rb +190 -0
  12. data/lib/github_changelog_generator/generator/generator_processor.rb +193 -0
  13. data/lib/github_changelog_generator/generator/generator_tags.rb +184 -0
  14. data/lib/github_changelog_generator/helper.rb +37 -0
  15. data/lib/github_changelog_generator/parser.rb +285 -0
  16. data/lib/github_changelog_generator/parser_file.rb +103 -0
  17. data/lib/github_changelog_generator/reader.rb +84 -0
  18. data/lib/github_changelog_generator/task.rb +67 -0
  19. data/lib/github_changelog_generator/version.rb +3 -0
  20. data/man/git-generate-changelog.1 +252 -0
  21. data/man/git-generate-changelog.html +262 -0
  22. data/man/git-generate-changelog.md +179 -0
  23. data/spec/files/angular.js.md +9395 -0
  24. data/spec/files/bundler.md +1911 -0
  25. data/spec/files/github-changelog-generator.md +305 -0
  26. data/spec/install-gem-in-bundler.gemfile +3 -0
  27. data/spec/spec_helper.rb +55 -0
  28. data/spec/unit/fetcher_spec.rb +59 -0
  29. data/spec/unit/generator/generator_processor_spec.rb +28 -0
  30. data/spec/unit/generator/generator_tags_spec.rb +243 -0
  31. data/spec/unit/parse_file_spec.rb +73 -0
  32. data/spec/unit/parser_spec.rb +60 -0
  33. data/spec/unit/reader_spec.rb +113 -0
  34. metadata +190 -0
@@ -0,0 +1,243 @@
1
+ describe GitHubChangelogGenerator::Generator do
2
+ def tag_mash_with_name(tag)
3
+ Hashie::Mash.new.tap { |mash_tag| mash_tag.name = tag }
4
+ end
5
+
6
+ def tags_mash_from_strings(tags_strings)
7
+ tags_strings.map do |tag|
8
+ tag_mash_with_name(tag)
9
+ end
10
+ end
11
+
12
+ describe "#filter_between_tags" do
13
+ context "when between_tags nil" do
14
+ before do
15
+ @generator = GitHubChangelogGenerator::Generator.new(between_tags: nil)
16
+ end
17
+
18
+ subject do
19
+ @generator.get_filtered_tags(tags_mash_from_strings(%w(1 2 3)))
20
+ end
21
+ it { is_expected.to be_a(Array) }
22
+ it { is_expected.to match_array(tags_mash_from_strings(%w(1 2 3))) }
23
+ end
24
+ context "when between_tags same as input array" do
25
+ before do
26
+ @generator = GitHubChangelogGenerator::Generator.new(between_tags: %w(1 2 3))
27
+ end
28
+ subject do
29
+ @generator.get_filtered_tags(tags_mash_from_strings(%w(1 2 3)))
30
+ end
31
+ it { is_expected.to be_a(Array) }
32
+ it { is_expected.to match_array(tags_mash_from_strings(%w(1 2 3))) }
33
+ end
34
+
35
+ context "when between_tags filled with correct values" do
36
+ before do
37
+ @generator = GitHubChangelogGenerator::Generator.new(between_tags: %w(1 2))
38
+ end
39
+ subject do
40
+ @generator.get_filtered_tags(tags_mash_from_strings(%w(1 2 3)))
41
+ end
42
+ it { is_expected.to be_a(Array) }
43
+ it { is_expected.to match_array(tags_mash_from_strings(%w(1 2))) }
44
+ end
45
+
46
+ context "when between_tags filled with invalid values" do
47
+ before do
48
+ @generator = GitHubChangelogGenerator::Generator.new(between_tags: %w(1 q w))
49
+ end
50
+
51
+ subject do
52
+ @generator.get_filtered_tags(tags_mash_from_strings(%w(1 2 3)))
53
+ end
54
+ it { is_expected.to be_a(Array) }
55
+ it { is_expected.to match_array(tags_mash_from_strings(%w(1))) }
56
+ end
57
+ end
58
+
59
+ describe "#get_filtered_tags" do
60
+ subject do
61
+ generator.get_filtered_tags(tags_mash_from_strings(%w(1 2 3 4 5)))
62
+ end
63
+
64
+ context "with excluded and between tags" do
65
+ let(:generator) { GitHubChangelogGenerator::Generator.new(between_tags: %w(1 2 3), exclude_tags: %w(2)) }
66
+ it { is_expected.to be_a Array }
67
+ it { is_expected.to match_array(tags_mash_from_strings(%w(1 3))) }
68
+ end
69
+ end
70
+
71
+ describe "#filter_excluded_tags" do
72
+ subject { generator.filter_excluded_tags(tags_mash_from_strings(%w(1 2 3))) }
73
+
74
+ context "with matching string" do
75
+ let(:generator) { GitHubChangelogGenerator::Generator.new(exclude_tags: %w(3)) }
76
+ it { is_expected.to be_a Array }
77
+ it { is_expected.to match_array(tags_mash_from_strings(%w(1 2))) }
78
+ end
79
+
80
+ context "with non-matching string" do
81
+ let(:generator) { GitHubChangelogGenerator::Generator.new(exclude_tags: %w(invalid tags)) }
82
+ it { is_expected.to be_a Array }
83
+ it { is_expected.to match_array(tags_mash_from_strings(%w(1 2 3))) }
84
+ end
85
+
86
+ context "with matching regex" do
87
+ let(:generator) { GitHubChangelogGenerator::Generator.new(exclude_tags: /[23]/) }
88
+ it { is_expected.to be_a Array }
89
+ it { is_expected.to match_array(tags_mash_from_strings(%w(1))) }
90
+ end
91
+
92
+ context "with non-matching regex" do
93
+ let(:generator) { GitHubChangelogGenerator::Generator.new(exclude_tags: /[abc]/) }
94
+ it { is_expected.to be_a Array }
95
+ it { is_expected.to match_array(tags_mash_from_strings(%w(1 2 3))) }
96
+ end
97
+ end
98
+
99
+ describe "#filter_excluded_tags_regex" do
100
+ subject { generator.filter_excluded_tags(tags_mash_from_strings(%w(1 2 3))) }
101
+
102
+ context "with matching regex" do
103
+ let(:generator) { GitHubChangelogGenerator::Generator.new(exclude_tags_regex: "[23]") }
104
+ it { is_expected.to be_a Array }
105
+ it { is_expected.to match_array(tags_mash_from_strings(%w(1))) }
106
+ end
107
+
108
+ context "with non-matching regex" do
109
+ let(:generator) { GitHubChangelogGenerator::Generator.new(exclude_tags_regex: "[45]") }
110
+ it { is_expected.to be_a Array }
111
+ it { is_expected.to match_array(tags_mash_from_strings(%w(1 2 3))) }
112
+ end
113
+ end
114
+
115
+ describe "#filter_since_tag" do
116
+ context "with filled array" do
117
+ subject { generator.filter_since_tag(tags_mash_from_strings(%w(1 2 3))) }
118
+
119
+ context "with valid since tag" do
120
+ let(:generator) { GitHubChangelogGenerator::Generator.new(since_tag: "2") }
121
+ it { is_expected.to be_a Array }
122
+ it { is_expected.to match_array(tags_mash_from_strings(%w(1))) }
123
+ end
124
+
125
+ context "with invalid since tag" do
126
+ let(:generator) { GitHubChangelogGenerator::Generator.new(since_tag: "Invalid tag") }
127
+ it { is_expected.to be_a Array }
128
+ it { is_expected.to match_array(tags_mash_from_strings(%w(1 2 3))) }
129
+ end
130
+ end
131
+
132
+ context "with empty array" do
133
+ subject { generator.filter_since_tag(tags_mash_from_strings(%w())) }
134
+
135
+ context "with valid since tag" do
136
+ let(:generator) { GitHubChangelogGenerator::Generator.new(since_tag: "2") }
137
+ it { is_expected.to be_a Array }
138
+ it { is_expected.to match_array(tags_mash_from_strings(%w())) }
139
+ end
140
+
141
+ context "with invalid since tag" do
142
+ let(:generator) { GitHubChangelogGenerator::Generator.new(since_tag: "Invalid tag") }
143
+ it { is_expected.to be_a Array }
144
+ it { is_expected.to match_array(tags_mash_from_strings(%w())) }
145
+ end
146
+ end
147
+ end
148
+
149
+ describe "#filter_due_tag" do
150
+ context "with filled array" do
151
+ subject { generator.filter_due_tag(tags_mash_from_strings(%w(1 2 3))) }
152
+
153
+ context "with valid due tag" do
154
+ let(:generator) { GitHubChangelogGenerator::Generator.new(due_tag: "2") }
155
+ it { is_expected.to be_a Array }
156
+ it { is_expected.to match_array(tags_mash_from_strings(%w(3))) }
157
+ end
158
+
159
+ context "with invalid due tag" do
160
+ let(:generator) { GitHubChangelogGenerator::Generator.new(due_tag: "Invalid tag") }
161
+ it { is_expected.to be_a Array }
162
+ it { is_expected.to match_array(tags_mash_from_strings(%w(1 2 3))) }
163
+ end
164
+ end
165
+
166
+ context "with empty array" do
167
+ subject { generator.filter_due_tag(tags_mash_from_strings(%w())) }
168
+
169
+ context "with valid due tag" do
170
+ let(:generator) { GitHubChangelogGenerator::Generator.new(due_tag: "2") }
171
+ it { is_expected.to be_a Array }
172
+ it { is_expected.to match_array(tags_mash_from_strings(%w())) }
173
+ end
174
+
175
+ context "with invalid due tag" do
176
+ let(:generator) { GitHubChangelogGenerator::Generator.new(due_tag: "Invalid tag") }
177
+ it { is_expected.to be_a Array }
178
+ it { is_expected.to match_array(tags_mash_from_strings(%w())) }
179
+ end
180
+ end
181
+ end
182
+
183
+ describe "#get_time_of_tag" do
184
+ current_time = Time.now
185
+ before(:all) { @generator = GitHubChangelogGenerator::Generator.new }
186
+ context "run with nil parameter" do
187
+ it "should raise ChangelogGeneratorError" do
188
+ expect { @generator.get_time_of_tag nil }.to raise_error(GitHubChangelogGenerator::ChangelogGeneratorError)
189
+ end
190
+ end
191
+ context "fetch already filled tag" do
192
+ before { @generator.instance_variable_set :@tag_times_hash, "valid_tag" => current_time }
193
+ subject { @generator.get_time_of_tag tag_mash_with_name("valid_tag") }
194
+ it { is_expected.to be_a_kind_of(Time) }
195
+ it { is_expected.to eq(current_time) }
196
+ end
197
+ context "fetch not filled tag" do
198
+ before do
199
+ mock = double("fake fetcher")
200
+ allow(mock).to receive_messages(fetch_date_of_tag: current_time)
201
+ @generator.instance_variable_set :@fetcher, mock
202
+ end
203
+ subject do
204
+ of_tag = @generator.get_time_of_tag(tag_mash_with_name("valid_tag"))
205
+ of_tag
206
+ end
207
+ it { is_expected.to be_a_kind_of(Time) }
208
+ it { is_expected.to eq(current_time) }
209
+ end
210
+ end
211
+
212
+ describe "#sort_tags_by_date" do
213
+ let(:time1) { Time.now }
214
+ let(:time2) { Time.now }
215
+ let(:time3) { Time.now }
216
+
217
+ before(:all) do
218
+ @generator = GitHubChangelogGenerator::Generator.new
219
+ end
220
+
221
+ before do
222
+ @generator.instance_variable_set(:@tag_times_hash, "valid_tag1" => time1,
223
+ "valid_tag2" => time2,
224
+ "valid_tag3" => time3)
225
+ end
226
+
227
+ subject do
228
+ @generator.sort_tags_by_date(tags)
229
+ end
230
+ context "sort unsorted tags" do
231
+ let(:tags) { tags_mash_from_strings %w(valid_tag1 valid_tag2 valid_tag3) }
232
+
233
+ it { is_expected.to be_a_kind_of(Array) }
234
+ it { is_expected.to match_array(tags.reverse!) }
235
+ end
236
+ context "sort sorted tags" do
237
+ let(:tags) { tags_mash_from_strings %w(valid_tag3 valid_tag2 valid_tag1) }
238
+
239
+ it { is_expected.to be_a_kind_of(Array) }
240
+ it { is_expected.to match_array(tags) }
241
+ end
242
+ end
243
+ end
@@ -0,0 +1,73 @@
1
+ describe GitHubChangelogGenerator::ParserFile do
2
+ describe ".github_changelog_generator" do
3
+ let(:options) { {} }
4
+
5
+ context "when the well-known default file does not exist" do
6
+ let(:parser) { GitHubChangelogGenerator::ParserFile.new(options) }
7
+ subject { parser.parse! }
8
+ it { is_expected.to be_nil }
9
+ end
10
+
11
+ context "when file is empty" do
12
+ let(:parser) { GitHubChangelogGenerator::ParserFile.new(options, StringIO.new("")) }
13
+
14
+ it "does not change the options" do
15
+ expect { parser.parse! }.to_not change { options }
16
+ end
17
+ end
18
+
19
+ context "when file is incorrect" do
20
+ let(:options_before_change) { options.dup }
21
+ let(:file) { StringIO.new("unreleased_label=staging\nunreleased: false") }
22
+ let(:parser) do
23
+ GitHubChangelogGenerator::ParserFile.new(options, file)
24
+ end
25
+ it { expect { parser.parse! }.to raise_error(/line #2/) }
26
+ end
27
+
28
+ context "allows empty lines and comments with semi-colon or pound sign" do
29
+ let(:file) { StringIO.new("\n \n# Comment on first line\nunreleased_label=staging\n; Comment on third line\nunreleased=false") }
30
+ let(:parser) do
31
+ GitHubChangelogGenerator::ParserFile.new(options, file)
32
+ end
33
+ it { expect { parser.parse! }.not_to raise_error }
34
+ end
35
+
36
+ context "when override default values" do
37
+ let(:default_options) { GitHubChangelogGenerator::Parser.default_options }
38
+ let(:options) { {}.merge(default_options) }
39
+ let(:options_before_change) { options.dup }
40
+ let(:file) { StringIO.new("unreleased_label=staging\nunreleased=false\nheader==== Changelog ===") }
41
+ let(:parser) { GitHubChangelogGenerator::ParserFile.new(options, file) }
42
+
43
+ it "changes the options" do
44
+ expect { parser.parse! }.to change { options }
45
+ .from(options_before_change)
46
+ .to(options_before_change.merge(unreleased_label: "staging",
47
+ unreleased: false,
48
+ header: "=== Changelog ==="))
49
+ end
50
+
51
+ context "turns exclude-labels into an Array", bug: '#327' do
52
+ let(:file) do
53
+ StringIO.new(<<EOF
54
+ exclude-labels=73a91042-da6f-11e5-9335-1040f38d7f90,7adf83b4-da6f-11e5-ae18-1040f38d7f90
55
+ header_label=# My changelog
56
+ EOF
57
+ )
58
+ end
59
+ it "reads exclude_labels into an Array" do
60
+ expect { parser.parse! }.to change { options[:exclude_labels] }
61
+ .from(default_options[:exclude_labels])
62
+ .to(["73a91042-da6f-11e5-9335-1040f38d7f90", "7adf83b4-da6f-11e5-ae18-1040f38d7f90"])
63
+ end
64
+
65
+ it "translates given header_label into the :header option" do
66
+ expect { parser.parse! }.to change { options[:header] }
67
+ .from(default_options[:header])
68
+ .to("# My changelog")
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,60 @@
1
+ describe GitHubChangelogGenerator::Parser do
2
+ describe ".user_project_from_remote" do
3
+ context "when remote is type 1" do
4
+ subject { GitHubChangelogGenerator::Parser.user_project_from_remote("origin https://github.com/skywinder/ActionSheetPicker-3.0 (fetch)") }
5
+ it { is_expected.to be_a(Array) }
6
+ it { is_expected.to match_array(["skywinder", "ActionSheetPicker-3.0"]) }
7
+ end
8
+ context "when remote is type 2" do
9
+ subject { GitHubChangelogGenerator::Parser.user_project_from_remote("https://github.com/skywinder/ActionSheetPicker-3.0") }
10
+ it { is_expected.to be_a(Array) }
11
+ it { is_expected.to match_array(["skywinder", "ActionSheetPicker-3.0"]) }
12
+ end
13
+ context "when remote is type 3" do
14
+ subject { GitHubChangelogGenerator::Parser.user_project_from_remote("https://github.com/skywinder/ActionSheetPicker-3.0") }
15
+ it { is_expected.to be_a(Array) }
16
+ it { is_expected.to match_array(["skywinder", "ActionSheetPicker-3.0"]) }
17
+ end
18
+ context "when remote is type 4" do
19
+ subject { GitHubChangelogGenerator::Parser.user_project_from_remote("origin git@github.com:skywinder/ActionSheetPicker-3.0.git (fetch)") }
20
+ it { is_expected.to be_a(Array) }
21
+ it { is_expected.to match_array(["skywinder", "ActionSheetPicker-3.0"]) }
22
+ end
23
+ context "when remote is invalid" do
24
+ subject { GitHubChangelogGenerator::Parser.user_project_from_remote("some invalid text") }
25
+ it { is_expected.to be_a(Array) }
26
+ it { is_expected.to match_array([nil, nil]) }
27
+ end
28
+ end
29
+ describe ".user_project_from_option" do
30
+ context "when option is invalid" do
31
+ it("should return nil") { expect(GitHubChangelogGenerator::Parser.user_project_from_option("blah", nil, nil)).to be_nil }
32
+ end
33
+
34
+ context "when option is valid" do
35
+ subject { GitHubChangelogGenerator::Parser.user_project_from_option("skywinder/ActionSheetPicker-3.0", nil, nil) }
36
+ it { is_expected.to be_a(Array) }
37
+ it { is_expected.to match_array(["skywinder", "ActionSheetPicker-3.0"]) }
38
+ end
39
+ context "when option nil" do
40
+ subject { GitHubChangelogGenerator::Parser.user_project_from_option(nil, nil, nil) }
41
+ it { is_expected.to be_a(Array) }
42
+ it { is_expected.to match_array([nil, nil]) }
43
+ end
44
+ context "when site is nil" do
45
+ subject { GitHubChangelogGenerator::Parser.user_project_from_option("skywinder/ActionSheetPicker-3.0", nil, nil) }
46
+ it { is_expected.to be_a(Array) }
47
+ it { is_expected.to match_array(["skywinder", "ActionSheetPicker-3.0"]) }
48
+ end
49
+ context "when site is valid" do
50
+ subject { GitHubChangelogGenerator::Parser.user_project_from_option("skywinder/ActionSheetPicker-3.0", nil, "https://codeclimate.com") }
51
+ it { is_expected.to be_a(Array) }
52
+ it { is_expected.to match_array(["skywinder", "ActionSheetPicker-3.0"]) }
53
+ end
54
+ context "when second arg is not nil" do
55
+ subject { GitHubChangelogGenerator::Parser.user_project_from_option("skywinder/ActionSheetPicker-3.0", "blah", nil) }
56
+ it { is_expected.to be_a(Array) }
57
+ it { is_expected.to match_array([nil, nil]) }
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,113 @@
1
+ #
2
+ # Author:: Enrico Stahn <mail@enricostahn.com>
3
+ #
4
+ # Copyright 2014, Zanui, <engineering@zanui.com.au>
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ describe GitHubChangelogGenerator::Reader do
20
+ before(:all) do
21
+ @reader = GitHubChangelogGenerator::Reader.new
22
+ end
23
+
24
+ describe "#parse_heading" do
25
+ context "when heading is empty" do
26
+ subject { @reader.parse_heading("## ") }
27
+ it { is_expected.to be_a(Hash) }
28
+ it { is_expected.to include("version", "url", "date") }
29
+ it { is_expected.to include("version" => nil, "url" => nil, "date" => nil) }
30
+ # TODO: Doesn't work?
31
+ # it { is_expected.to have_all_string_keys }
32
+ end
33
+ context "when given version, url and date" do
34
+ subject { @reader.parse_heading("## [1.3.10](https://github.com/skywinder/Github-Changelog-Generator/tree/1.3.10) (2015-03-18)") }
35
+ it { is_expected.to include("version" => "1.3.10") }
36
+ it { is_expected.to include("url" => "https://github.com/skywinder/Github-Changelog-Generator/tree/1.3.10") }
37
+ it { is_expected.to include("date" => "2015-03-18") }
38
+ end
39
+ context "when no url and date is provided" do
40
+ subject { @reader.parse_heading("## foobar") }
41
+ it { is_expected.to include("version" => "foobar", "url" => nil, "date" => nil) }
42
+ end
43
+ end
44
+
45
+ describe "#parse" do
46
+ context "when file is empty" do
47
+ subject { @reader.parse("") }
48
+ it { is_expected.to be_an(Array) }
49
+ it { is_expected.to be_empty }
50
+ end
51
+ context "when file has only the header" do
52
+ subject { @reader.parse("# Change Log") }
53
+ it { is_expected.to be_an(Array) }
54
+ it { is_expected.to be_empty }
55
+ end
56
+ end
57
+
58
+ describe "example CHANGELOG files" do
59
+ subject { @reader.read(File.expand_path(File.join(File.dirname(__FILE__), "..", "files", self.class.description))) }
60
+ context "github-changelog-generator.md" do
61
+ it { is_expected.to be_an(Array) }
62
+ it { is_expected.not_to be_empty }
63
+ it { expect(subject.count).to eq(28) }
64
+ it { expect(subject.first).to include("version" => "1.3.10") }
65
+ it { expect(subject.first).to include("url" => "https://github.com/skywinder/Github-Changelog-Generator/tree/1.3.10") }
66
+ it { expect(subject.first).to include("date" => "2015-03-18") }
67
+ it { expect(subject.first).to include("content") }
68
+ it "content should not be empty" do
69
+ expect(subject.first["content"]).not_to be_empty
70
+ end
71
+ end
72
+ context "bundler.md" do
73
+ it { is_expected.to be_an(Array) }
74
+ it { is_expected.not_to be_empty }
75
+ it { expect(subject.count).to eq(151) }
76
+ it { expect(subject.first).to include("version" => "1.9.1") }
77
+ it { expect(subject.first).to include("url" => nil) }
78
+ it { expect(subject.first).to include("date" => "2015-03-21") }
79
+ it { expect(subject.first).to include("content") }
80
+ it "content should not be empty" do
81
+ expect(subject.first["content"]).not_to be_empty
82
+ end
83
+ end
84
+ context "angular.js.md" do
85
+ it { is_expected.to be_an(Array) }
86
+ it { is_expected.not_to be_empty }
87
+ it do
88
+ pending("Implement heading_level for parser.")
89
+ expect(subject.count).to eq(134)
90
+ end
91
+ # it do
92
+ # pending('Implement heading_level for parser.')
93
+ # expect(subject.first).to include('version' => '1.4.0-beta.6 cookie-liberation')
94
+ # end
95
+ # it do
96
+ # pending('Implement heading_level for parser.')
97
+ # expect(subject.first).to include('url' => nil)
98
+ # end
99
+ # it do
100
+ # pending('Implement heading_level for parser.')
101
+ # expect(subject.first).to include('date' => '2015-03-17')
102
+ # end
103
+ # it do
104
+ # pending('Implement heading_level for parser.')
105
+ # expect(subject.first).to include('content')
106
+ # end
107
+ # it 'content should not be empty' do
108
+ # pending('Implement heading_level for parser.')
109
+ # expect(subject.first['content']).not_to be_empty
110
+ # end
111
+ end
112
+ end
113
+ end