renogen 0.0.1 → 0.1.0.pre

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 (47) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +62 -3
  3. data/bin/renogen +2 -58
  4. data/lib/renogen.rb +9 -0
  5. data/lib/renogen/change_log.rb +9 -0
  6. data/lib/renogen/change_log/group.rb +21 -0
  7. data/lib/renogen/change_log/item.rb +60 -0
  8. data/lib/renogen/change_log/model.rb +41 -0
  9. data/lib/renogen/change_log/writer.rb +39 -0
  10. data/lib/renogen/cli.rb +60 -0
  11. data/lib/renogen/cli/param_parser.rb +73 -0
  12. data/lib/renogen/config.rb +35 -0
  13. data/lib/renogen/exceptions.rb +8 -0
  14. data/lib/renogen/exceptions/base.rb +7 -0
  15. data/lib/renogen/exceptions/extraction_stratagy_not_found.rb +20 -0
  16. data/lib/renogen/exceptions/formatter_not_found.rb +20 -0
  17. data/lib/renogen/extraction_stratagies.rb +42 -0
  18. data/lib/renogen/extraction_stratagies/base.rb +29 -0
  19. data/lib/renogen/extraction_stratagies/yaml_file.rb +10 -0
  20. data/lib/renogen/extraction_stratagies/yaml_file/parser.rb +39 -0
  21. data/lib/renogen/extraction_stratagies/yaml_file/provider.rb +24 -0
  22. data/lib/renogen/extraction_stratagies/yaml_file/reader.rb +48 -0
  23. data/lib/renogen/formatters.rb +43 -0
  24. data/lib/renogen/formatters/base.rb +54 -0
  25. data/lib/renogen/formatters/html.rb +47 -0
  26. data/lib/renogen/formatters/markdown.rb +33 -0
  27. data/lib/renogen/formatters/plain_text.rb +33 -0
  28. data/lib/renogen/generator.rb +34 -0
  29. data/lib/renogen/version.rb +3 -0
  30. data/spec/lib/renogen/change_log/group_spec.rb +13 -0
  31. data/spec/lib/renogen/change_log/item_spec.rb +51 -0
  32. data/spec/lib/renogen/change_log/model_spec.rb +36 -0
  33. data/spec/lib/renogen/change_log/writer_spec.rb +8 -0
  34. data/spec/lib/renogen/config_spec.rb +19 -0
  35. data/spec/lib/renogen/exceptions/extraction_stratagy_not_found_spec.rb +13 -0
  36. data/spec/lib/renogen/exceptions/formatter_not_found_spec.rb +13 -0
  37. data/spec/lib/renogen/extraction_stratagies/base_spec.rb +10 -0
  38. data/spec/lib/renogen/extraction_stratagies/yaml_file/parser_spec.rb +24 -0
  39. data/spec/lib/renogen/extraction_stratagies/yaml_file/provider_spec.rb +12 -0
  40. data/spec/lib/renogen/extraction_stratagies/yaml_file/reader_spec.rb +20 -0
  41. data/spec/lib/renogen/formatters/base_spec.rb +21 -0
  42. data/spec/lib/renogen/formatters/html_spec.rb +38 -0
  43. data/spec/lib/renogen/formatters/markdown_spec.rb +29 -0
  44. data/spec/lib/renogen/formatters/plain_text_spec.rb +29 -0
  45. data/spec/lib/renogen_spec.rb +11 -0
  46. data/spec/spec_helper.rb +76 -0
  47. metadata +67 -9
@@ -0,0 +1,33 @@
1
+ module Renogen
2
+ module Formatters
3
+ # For formatting a change into markdown format
4
+ class Markdown < Base
5
+ register :markdown
6
+ register :md
7
+
8
+ # Outputs a line or block of text appearing at the top of the change log.
9
+ #
10
+ # @param header [String]
11
+ # @return [String]
12
+ def write_header(header)
13
+ "# #{header}"
14
+ end
15
+
16
+ # Outputs a line or block as a header for a group.
17
+ #
18
+ # @param group [String]
19
+ # @return [String]
20
+ def write_group(group)
21
+ "### #{group}"
22
+ end
23
+
24
+ # Outputs a line or block as the body for a change.
25
+ #
26
+ # @param change [String]
27
+ # @return [String]
28
+ def write_change(change)
29
+ "* #{change}"
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,33 @@
1
+ module Renogen
2
+ module Formatters
3
+ # For formatting a change as plain text
4
+ class PlainText < Base
5
+ register :plain_text
6
+ register :text
7
+
8
+ # Outputs a line or block of text appearing at the top of the change log.
9
+ #
10
+ # @param header [String]
11
+ # @return [String]
12
+ def write_header(header)
13
+ "#{header}\n "
14
+ end
15
+
16
+ # Outputs a line or block as a header for a group.
17
+ #
18
+ # @param group [String]
19
+ # @return [String]
20
+ def write_group(group)
21
+ "#{group}"
22
+ end
23
+
24
+ # Outputs a line or block as the body for a change.
25
+ #
26
+ # @param change [String]
27
+ # @return [String]
28
+ def write_change(change)
29
+ "- #{change}"
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,34 @@
1
+ module Renogen
2
+ class Generator
3
+ attr_accessor :source, :version, :output_format, :options
4
+
5
+ def initialize(version, source, output_format, options={})
6
+ @version = version
7
+ @source = source
8
+ @output_format = output_format
9
+ @options = options
10
+ end
11
+
12
+ # Create the change log
13
+ def generate!
14
+ changelog = extraction_stratagy.extract
15
+ changelog.version = version
16
+
17
+ writer.write!(changelog)
18
+ end
19
+
20
+ protected
21
+
22
+ def writer
23
+ Renogen::ChangeLog::Writer.new(formatter)
24
+ end
25
+
26
+ def extraction_stratagy
27
+ Renogen::ExtractionStratagies.obtain(source, options)
28
+ end
29
+
30
+ def formatter
31
+ Renogen::Formatters.obtain(output_format, options)
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,3 @@
1
+ module Renogen
2
+ VERSION='0.1.0.pre'.freeze # :nodoc:
3
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe Renogen::ChangeLog::Group do
4
+ describe '#add' do
5
+ subject { described_class.new('my group') }
6
+
7
+ it 'adds change to group' do
8
+ subject.add('foo')
9
+ expect(subject.changes).to include('foo')
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,51 @@
1
+ require 'spec_helper'
2
+
3
+ describe Renogen::ChangeLog::Item do
4
+ let(:change) { Array.new }
5
+ subject { described_class.new('foo', change) }
6
+
7
+ describe '#to_s' do
8
+ context "when change type is a 'String'" do
9
+ let(:change) { "foo\nbar\n" }
10
+ it 'returns string with newline at end' do
11
+ expect(subject.to_s).to eql "foo\nbar\n\n"
12
+ end
13
+ end
14
+
15
+ context "when change type is a 'Hash'" do
16
+ let(:change) { Hash.new }
17
+ it 'returns single line string' do
18
+ config = Renogen::Config.instance
19
+ string = config.single_line_format.downcase.gsub('\n', '\n ')
20
+ config.supported_keys.each do |key|
21
+ string = string.gsub(key, '')
22
+ end
23
+ expect(subject.to_s).to eql string
24
+ end
25
+ end
26
+
27
+ context "when change type is a 'Array'" do
28
+ let(:change) { Array.new }
29
+ it 'returns array' do
30
+ expect(subject.to_s).to eql change
31
+ end
32
+ end
33
+
34
+ context "when change type is unknown" do
35
+ let(:change) { described_class }
36
+ it 'raises a type error' do
37
+ expect{subject.to_s}.to raise_error TypeError
38
+ end
39
+ end
40
+ end
41
+
42
+ describe '#list?' do
43
+ it 'returns true when change is an array type' do
44
+ expect(subject.list?).to be_truthy
45
+ end
46
+ end
47
+
48
+ describe '#each' do
49
+ end
50
+ end
51
+
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ describe Renogen::ChangeLog::Model do
4
+ let(:change_item) { Renogen::ChangeLog::Item.new('foo', 'bar') }
5
+
6
+ describe '#groups' do
7
+ it 'returns an empty hash when no changes' do
8
+ expect(subject.groups).to eql Hash.new
9
+ end
10
+
11
+ it 'returns hash of changes by group_name' do
12
+ subject.add_change(change_item)
13
+ expect(subject.groups).to eql({change_item.group_name => [change_item]})
14
+ end
15
+ end
16
+
17
+ describe '#header' do
18
+ it 'returns version and date' do
19
+ subject.version = '123'
20
+ expect(subject.header).to eql "123 (#{Date.today})"
21
+ end
22
+ end
23
+
24
+ describe '#add_change' do
25
+ it 'adds change to changes store' do
26
+ subject.add_change(change_item)
27
+ expect(subject.items.first).to eql change_item
28
+ expect(subject.items.size).to eql 1
29
+ end
30
+
31
+ it 'raises error when non valid change is added' do
32
+ expect{subject.add_change('bar')}.to raise_error TypeError
33
+ end
34
+ end
35
+
36
+ end
@@ -0,0 +1,8 @@
1
+ require 'spec_helper'
2
+
3
+ describe Renogen::ChangeLog::Writer do
4
+
5
+ describe '#write!' do
6
+ end
7
+ end
8
+
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe Renogen::Config do
4
+
5
+ subject { described_class.instance }
6
+
7
+ describe '#configure' do
8
+ before :each do
9
+ described_class.configure do |config|
10
+ config.single_line_format = 'bar'
11
+ end
12
+ end
13
+
14
+ it 'can set value' do
15
+ expect(subject.single_line_format).to eql 'bar'
16
+ end
17
+ end
18
+
19
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe Renogen::Exceptions::ExtractionStratagyNotFound do
4
+ let(:name) { 'foobar' }
5
+ subject { described_class.new(name) }
6
+
7
+ describe '#message' do
8
+ it 'returns friendly error message' do
9
+ expect(subject.message).to eql "Error: Unsupported source type '#{name}'"
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe Renogen::Exceptions::FormatterNotFound do
4
+ let(:name) { 'foobar' }
5
+ subject { described_class.new(name) }
6
+
7
+ describe '#message' do
8
+ it 'returns friendly error message' do
9
+ expect(subject.message).to eql "Error: Unsupported format type '#{name}'"
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,10 @@
1
+ require 'spec_helper'
2
+
3
+ describe Renogen::ExtractionStratagies::Base do
4
+ describe '#extract' do
5
+ it 'raises an NotImplementedError' do
6
+ expect{subject.extract}.to raise_error NotImplementedError
7
+ end
8
+
9
+ end
10
+ end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+
3
+ describe Renogen::ExtractionStratagies::YamlFile::Parser do
4
+ let(:file_contents) { { 'Foo' => 'Bar' } }
5
+
6
+ describe '#parse!' do
7
+ before :each do
8
+ yaml_file_reader = double(Renogen::ExtractionStratagies::YamlFile::Reader)
9
+ allow(yaml_file_reader).to receive(:each_yaml_file).and_yield(file_contents)
10
+ allow(Renogen::ExtractionStratagies::YamlFile::Reader).to receive(:new).and_return(yaml_file_reader)
11
+ end
12
+
13
+ it 'extracts contents from file' do
14
+ changelog_item = Renogen::ChangeLog::Item.new('Foo', 'Bar')
15
+ allow(Renogen::ChangeLog::Item).to receive(:new).with('Foo', 'Bar').and_return changelog_item
16
+
17
+ changelog = subject.parse!
18
+
19
+ expect(changelog.items).to include changelog_item
20
+ expect(changelog.items.size).to eql 1
21
+ end
22
+ end
23
+
24
+ end
@@ -0,0 +1,12 @@
1
+ require 'spec_helper'
2
+
3
+ describe Renogen::ExtractionStratagies::YamlFile::Provider do
4
+ it "is returned for 'yaml_file'" do
5
+ expect(Renogen::ExtractionStratagies.obtain(:yaml_file)).to be_a described_class
6
+ end
7
+
8
+ it "is returned for 'yaml'" do
9
+ expect(Renogen::ExtractionStratagies.obtain(:yaml)).to be_a described_class
10
+ end
11
+
12
+ end
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+ require 'json'
3
+
4
+ describe Renogen::ExtractionStratagies::YamlFile::Reader do
5
+ let(:directory_path) { './my/directory/path' }
6
+ subject { described_class.new(directory_path) }
7
+
8
+ describe '#each_yaml_file' do
9
+ let(:file_contents) { { 'Foo' => 'Bar' }.to_json }
10
+
11
+ before :each do
12
+ allow(Dir).to receive(:glob).with([File.join(directory_path, 'next', "*.yml")]).and_return(['foo_file'])
13
+ allow(YAML).to receive(:load_file).with('foo_file').and_return(file_contents)
14
+ end
15
+
16
+ it 'yields each yaml file within given directory' do
17
+ expect{ |b| subject.each_yaml_file(&b) }.to yield_with_args(file_contents)
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,21 @@
1
+ require 'spec_helper'
2
+
3
+ describe Renogen::Formatters::Base do
4
+ describe '#write_header' do
5
+ it 'raises an NotImplementedError' do
6
+ expect{subject.write_header('header')}.to raise_error NotImplementedError
7
+ end
8
+ end
9
+
10
+ describe '#write_group' do
11
+ it 'raises an NotImplementedError' do
12
+ expect{subject.write_group('group_name')}.to raise_error NotImplementedError
13
+ end
14
+ end
15
+
16
+ describe '#write_change' do
17
+ it 'raises an NotImplementedError' do
18
+ expect{subject.write_change('change')}.to raise_error NotImplementedError
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+
3
+ describe Renogen::Formatters::Html do
4
+
5
+ it 'is registered' do
6
+ expect(Renogen::Formatters.obtain(:html)).to be_kind_of described_class
7
+ end
8
+
9
+ describe '#write_header' do
10
+ it 'returns header with newline' do
11
+ expect(subject.write_header('header')).to eql "<html>\n<h1>header</h1>"
12
+ end
13
+ end
14
+
15
+ describe '#write_group' do
16
+ it 'returns group' do
17
+ expect(subject.write_group('group')).to eql "<h2>group</h2>\n<ul>"
18
+ end
19
+ end
20
+
21
+ describe '#write_group_end' do
22
+ it 'returns closing list tag' do
23
+ expect(subject.write_group_end).to eql "</ul>"
24
+ end
25
+ end
26
+
27
+ describe '#write_change' do
28
+ it 'returns change with newline and hyphen' do
29
+ expect(subject.write_change('change')).to eql " <li>change</li>"
30
+ end
31
+ end
32
+
33
+ describe '#write_footer' do
34
+ it 'returns closing html tag' do
35
+ expect(subject.write_footer('change')).to eql '</html>'
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ describe Renogen::Formatters::Markdown do
4
+ it "is returned for 'markdown'" do
5
+ expect(Renogen::Formatters.obtain(:markdown)).to be_kind_of described_class
6
+ end
7
+
8
+ it "is returned for 'md'" do
9
+ expect(Renogen::Formatters.obtain(:md)).to be_kind_of described_class
10
+ end
11
+
12
+ describe '#write_header' do
13
+ it 'returns header with newline' do
14
+ expect(subject.write_header('header')).to eql "# header"
15
+ end
16
+ end
17
+
18
+ describe '#write_group' do
19
+ it 'returns group' do
20
+ expect(subject.write_group('group')).to eql "### group"
21
+ end
22
+ end
23
+
24
+ describe '#write_change' do
25
+ it 'returns change with newline and hyphen' do
26
+ expect(subject.write_change('change')).to eql "* change"
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ describe Renogen::Formatters::PlainText do
4
+ it "is returned for 'plain_text'" do
5
+ expect(Renogen::Formatters.obtain(:plain_text)).to be_kind_of described_class
6
+ end
7
+
8
+ it "is returned for 'text'" do
9
+ expect(Renogen::Formatters.obtain(:text)).to be_kind_of described_class
10
+ end
11
+
12
+ describe '#write_header' do
13
+ it 'returns header with newline' do
14
+ expect(subject.write_header('header')).to eql "header\n "
15
+ end
16
+ end
17
+
18
+ describe '#write_group' do
19
+ it 'returns group' do
20
+ expect(subject.write_group('group')).to eql "group"
21
+ end
22
+ end
23
+
24
+ describe '#write_change' do
25
+ it 'returns change with newline and hyphen' do
26
+ expect(subject.write_change('change')).to eql "- change"
27
+ end
28
+ end
29
+ end