renogen 0.0.1 → 0.1.0.pre
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +62 -3
- data/bin/renogen +2 -58
- data/lib/renogen.rb +9 -0
- data/lib/renogen/change_log.rb +9 -0
- data/lib/renogen/change_log/group.rb +21 -0
- data/lib/renogen/change_log/item.rb +60 -0
- data/lib/renogen/change_log/model.rb +41 -0
- data/lib/renogen/change_log/writer.rb +39 -0
- data/lib/renogen/cli.rb +60 -0
- data/lib/renogen/cli/param_parser.rb +73 -0
- data/lib/renogen/config.rb +35 -0
- data/lib/renogen/exceptions.rb +8 -0
- data/lib/renogen/exceptions/base.rb +7 -0
- data/lib/renogen/exceptions/extraction_stratagy_not_found.rb +20 -0
- data/lib/renogen/exceptions/formatter_not_found.rb +20 -0
- data/lib/renogen/extraction_stratagies.rb +42 -0
- data/lib/renogen/extraction_stratagies/base.rb +29 -0
- data/lib/renogen/extraction_stratagies/yaml_file.rb +10 -0
- data/lib/renogen/extraction_stratagies/yaml_file/parser.rb +39 -0
- data/lib/renogen/extraction_stratagies/yaml_file/provider.rb +24 -0
- data/lib/renogen/extraction_stratagies/yaml_file/reader.rb +48 -0
- data/lib/renogen/formatters.rb +43 -0
- data/lib/renogen/formatters/base.rb +54 -0
- data/lib/renogen/formatters/html.rb +47 -0
- data/lib/renogen/formatters/markdown.rb +33 -0
- data/lib/renogen/formatters/plain_text.rb +33 -0
- data/lib/renogen/generator.rb +34 -0
- data/lib/renogen/version.rb +3 -0
- data/spec/lib/renogen/change_log/group_spec.rb +13 -0
- data/spec/lib/renogen/change_log/item_spec.rb +51 -0
- data/spec/lib/renogen/change_log/model_spec.rb +36 -0
- data/spec/lib/renogen/change_log/writer_spec.rb +8 -0
- data/spec/lib/renogen/config_spec.rb +19 -0
- data/spec/lib/renogen/exceptions/extraction_stratagy_not_found_spec.rb +13 -0
- data/spec/lib/renogen/exceptions/formatter_not_found_spec.rb +13 -0
- data/spec/lib/renogen/extraction_stratagies/base_spec.rb +10 -0
- data/spec/lib/renogen/extraction_stratagies/yaml_file/parser_spec.rb +24 -0
- data/spec/lib/renogen/extraction_stratagies/yaml_file/provider_spec.rb +12 -0
- data/spec/lib/renogen/extraction_stratagies/yaml_file/reader_spec.rb +20 -0
- data/spec/lib/renogen/formatters/base_spec.rb +21 -0
- data/spec/lib/renogen/formatters/html_spec.rb +38 -0
- data/spec/lib/renogen/formatters/markdown_spec.rb +29 -0
- data/spec/lib/renogen/formatters/plain_text_spec.rb +29 -0
- data/spec/lib/renogen_spec.rb +11 -0
- data/spec/spec_helper.rb +76 -0
- metadata +67 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0601d545b81d975fb00732f998a904c07abf2604
|
4
|
+
data.tar.gz: d635d1c62edc949f38db2b03a42a48098d48fc8d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d0c5ece883782914cdb6bc731cfcc368d63bab3c250396cfa36bbbee7e65b774ef253199579e90fe126fb2fe9e3e669d746281f0e4e0e0b2f6423857d2dd8c0f
|
7
|
+
data.tar.gz: 8c2f2eb12331c3dd664066202aafe1e60545b37945e7a2ba7130a30109ad0832246f206ebebc3445f194858089e7dc1fecb8c8e27ce4386bf5f52cbf340923d5
|
data/README.md
CHANGED
@@ -1,12 +1,71 @@
|
|
1
|
-
#
|
1
|
+
# Renogen
|
2
2
|
|
3
|
-
Re(lease) No(tes) Gen(
|
4
|
-
a CHANGELOG from a chosen source into a chosen format
|
3
|
+
Renogen or Re(lease) No(tes) Gen(erator) is a tool to separate feature notes from product versions.
|
5
4
|
|
6
5
|
### Installation
|
7
6
|
|
7
|
+
To install Renogen, use the following command:
|
8
|
+
|
9
|
+
`$ gem install renogen`
|
10
|
+
|
11
|
+
or add the following to your Gemfile
|
12
|
+
|
13
|
+
`gem 'renogen', :require => false, :group => :development`
|
14
|
+
|
15
|
+
`$ renogen init # optional creates directory for notes`
|
16
|
+
`$ renogen --help # list available command options
|
17
|
+
|
8
18
|
### Usage
|
9
19
|
|
20
|
+
To generate your notes run the following command
|
21
|
+
|
22
|
+
`$ renogen <VERSION> # e.g v1.2.1`
|
23
|
+
|
24
|
+
Unfortunatly renogen cant write documentation for your change.
|
25
|
+
By default renogen uses the yaml file stratagy to extract your notes
|
26
|
+
|
27
|
+
#### Adding YAML feature notes
|
28
|
+
|
29
|
+
Create a file within the next version folder(default:'change_log/next/')
|
30
|
+
|
31
|
+
Example feature note
|
32
|
+
```
|
33
|
+
# change_log/next/example.yml
|
34
|
+
MyFormattedSingleLine:
|
35
|
+
identifier: bug_1
|
36
|
+
link: example.com/bug_1
|
37
|
+
summary: fixes all issues
|
38
|
+
|
39
|
+
MyMultiLineNote: |
|
40
|
+
Title
|
41
|
+
|
42
|
+
description
|
43
|
+
|
44
|
+
Example of usage
|
45
|
+
$ foo bar baz
|
46
|
+
MyList:
|
47
|
+
- e.g. run this command
|
48
|
+
- e.g. run this as well
|
49
|
+
```
|
50
|
+
|
51
|
+
#### Examples
|
52
|
+
|
53
|
+
Prepend your notes to a changelog file(TODO make command simple)
|
54
|
+
`$ renogen --format markdown v1.2.1 > CHANGELOG.md | cat - CHANGELOG > CHANGELOG.tmp && mv CHANGELOG.tmp CHANGELOG`
|
55
|
+
|
56
|
+
Writes notes to html file
|
57
|
+
`$ renogen --format html v1.2.1 > v1_2_1.html
|
58
|
+
|
59
|
+
Print all notes since v1.0.0 as text
|
60
|
+
`$ renogen --format text -l v1.0.0 v1.2.1
|
61
|
+
|
62
|
+
### Configuration
|
63
|
+
|
64
|
+
TODO
|
65
|
+
`.renogen` file
|
66
|
+
single line format
|
67
|
+
change log directory
|
68
|
+
|
10
69
|
### License
|
11
70
|
|
12
71
|
Renogen is a programming tool to generate a log of source code changes
|
data/bin/renogen
CHANGED
@@ -1,61 +1,5 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require 'renogen'
|
4
|
-
require 'optparse'
|
3
|
+
require 'renogen/cli'
|
5
4
|
|
6
|
-
|
7
|
-
def self.parse(options)
|
8
|
-
args = Hash.new
|
9
|
-
|
10
|
-
opt_parser = OptionParser.new do |opts|
|
11
|
-
|
12
|
-
opts.banner = "Usage: renogen [options] VERSION"
|
13
|
-
|
14
|
-
opts.separator ""
|
15
|
-
opts.separator "Required:"
|
16
|
-
opts.separator " VERSION this is the version that is currently being required:"
|
17
|
-
|
18
|
-
opts.separator ""
|
19
|
-
opts.separator "Optional:"
|
20
|
-
|
21
|
-
opts.on("-fFORMAT", "--format=FORMAT", "Output format to be generated") do |n|
|
22
|
-
args['format'] = n
|
23
|
-
end
|
24
|
-
|
25
|
-
opts.on("-sSOURCE", "--source=SOURCE", "Type of source that changes will be extracted from") do |n|
|
26
|
-
args['source'] = n
|
27
|
-
end
|
28
|
-
|
29
|
-
opts.on_tail("-h", "--help", "Show this message") do
|
30
|
-
puts opts
|
31
|
-
exit
|
32
|
-
end
|
33
|
-
|
34
|
-
opts.on_tail("--version", "Show renogen version") do
|
35
|
-
puts Renogen::VERSION
|
36
|
-
exit
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
opt_parser.parse!(options)
|
41
|
-
|
42
|
-
args['new_version'] = options.shift
|
43
|
-
if args['new_version'].nil?
|
44
|
-
puts "Missing argument: VERSION"
|
45
|
-
puts
|
46
|
-
puts opt_parser
|
47
|
-
exit 1
|
48
|
-
elsif options.count > 0
|
49
|
-
puts "Unknown arguments: #{options}"
|
50
|
-
puts
|
51
|
-
puts opt_parser
|
52
|
-
exit 1
|
53
|
-
end
|
54
|
-
|
55
|
-
return args
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
options = Parser.parse(ARGV)
|
60
|
-
|
61
|
-
Renogen.generate(options)
|
5
|
+
Renogen::Cli.run(ARGV)
|
data/lib/renogen.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
module Renogen
|
2
|
+
module ChangeLog
|
3
|
+
# Object to represent a group of changes
|
4
|
+
class Group
|
5
|
+
attr_reader :name, :changes
|
6
|
+
|
7
|
+
def initialize(group_name, options={})
|
8
|
+
@name = group_name
|
9
|
+
@changes ||= []
|
10
|
+
end
|
11
|
+
|
12
|
+
# Add change to the groups change list
|
13
|
+
#
|
14
|
+
# @param new_change [ChangeLog::Item]
|
15
|
+
def add(new_change)
|
16
|
+
@changes << new_change
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module Renogen
|
2
|
+
module ChangeLog
|
3
|
+
# Object to represent single change item
|
4
|
+
class Item
|
5
|
+
attr_accessor :change
|
6
|
+
attr_reader :group_name
|
7
|
+
|
8
|
+
def initialize(group_name, change, options={})
|
9
|
+
@group_name = group_name
|
10
|
+
@change = change
|
11
|
+
end
|
12
|
+
|
13
|
+
# @return [String]
|
14
|
+
def to_s
|
15
|
+
case change.class.to_s
|
16
|
+
when String.to_s
|
17
|
+
format_multiline(change)
|
18
|
+
when Hash.to_s
|
19
|
+
format_oneline(change)
|
20
|
+
when Array.to_s
|
21
|
+
# TODO should return a string
|
22
|
+
change
|
23
|
+
else
|
24
|
+
raise TypeError
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# @return [Boolean] true if change is of type array
|
29
|
+
def list?
|
30
|
+
change.is_a? Array
|
31
|
+
end
|
32
|
+
|
33
|
+
def each
|
34
|
+
change.each do |item|
|
35
|
+
yield item.to_s
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def format_multiline(change)
|
42
|
+
change.gsub('\n', '\n \n ') + "\n"
|
43
|
+
end
|
44
|
+
|
45
|
+
def format_oneline(change)
|
46
|
+
# TODO Refactor
|
47
|
+
string = config.single_line_format.downcase.gsub('\n', '\n ')
|
48
|
+
config.supported_keys.each do |key|
|
49
|
+
string = string.gsub(key, '#{change[\'' + key + '\']}')
|
50
|
+
end
|
51
|
+
ss = "\"#{string}\""
|
52
|
+
eval(ss)
|
53
|
+
end
|
54
|
+
|
55
|
+
def config
|
56
|
+
Config.instance
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'date'
|
2
|
+
|
3
|
+
module Renogen
|
4
|
+
module ChangeLog
|
5
|
+
# Object to represent a Changelog/release notes
|
6
|
+
class Model
|
7
|
+
attr_reader :items
|
8
|
+
attr_accessor :version
|
9
|
+
|
10
|
+
def initialize(options={})
|
11
|
+
@version = options[:version]
|
12
|
+
@items = []
|
13
|
+
end
|
14
|
+
|
15
|
+
# The title for the change log output
|
16
|
+
#
|
17
|
+
# @return [String]
|
18
|
+
def header
|
19
|
+
"#{version} (#{Date.today})"
|
20
|
+
end
|
21
|
+
|
22
|
+
# @return [Hash<group_name: change>]
|
23
|
+
def groups
|
24
|
+
items.inject({}) do |hash, change|
|
25
|
+
hash[change.group_name] ||= []
|
26
|
+
hash[change.group_name] << change
|
27
|
+
hash
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
# Adds a change to the changelog
|
32
|
+
#
|
33
|
+
# @param change [Renogen::ChangeLog::Item]
|
34
|
+
# @return [Array] All changes
|
35
|
+
def add_change(change)
|
36
|
+
raise TypeError unless change.is_a?(Renogen::ChangeLog::Item)
|
37
|
+
items << change
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Renogen
|
2
|
+
module ChangeLog
|
3
|
+
# Writes out the change log
|
4
|
+
class Writer
|
5
|
+
def initialize(formatter)
|
6
|
+
@formatter = formatter
|
7
|
+
end
|
8
|
+
|
9
|
+
# Writes out the change log
|
10
|
+
#
|
11
|
+
# @param changelog [ChangeLog::Model]
|
12
|
+
def write!(changelog)
|
13
|
+
puts formatter.write_header(changelog.header)
|
14
|
+
output_groups(changelog.groups)
|
15
|
+
puts formatter.write_footer(changelog)
|
16
|
+
end
|
17
|
+
|
18
|
+
protected
|
19
|
+
|
20
|
+
attr_reader :formatter
|
21
|
+
|
22
|
+
def output_change(change)
|
23
|
+
if change.list?
|
24
|
+
change.each { |item| puts formatter.write_change(item) }
|
25
|
+
else
|
26
|
+
puts formatter.write_change(change.to_s)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def output_groups(groups)
|
31
|
+
groups.each do |group, changes|
|
32
|
+
puts formatter.write_group(group)
|
33
|
+
changes.each { |change| output_change(change) }
|
34
|
+
puts formatter.write_group_end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/lib/renogen/cli.rb
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'renogen'
|
2
|
+
|
3
|
+
module Renogen
|
4
|
+
# Command line interface helpers
|
5
|
+
module Cli
|
6
|
+
require 'renogen/cli/param_parser'
|
7
|
+
|
8
|
+
# Execute the program via command line
|
9
|
+
# Renogen exceptions will be rescued and printed
|
10
|
+
# @param args [Array]
|
11
|
+
def self.run(args)
|
12
|
+
return init if args.first == 'init'
|
13
|
+
param_parser = ParamParser.new(args)
|
14
|
+
version, options = param_parser.parse
|
15
|
+
|
16
|
+
format = options['format'] || Config.instance.output_format
|
17
|
+
source = options['source'] || Config.instance.input_source
|
18
|
+
options['changelog_path'] ||= Config.instance.changelog_path
|
19
|
+
options['old_version'] ||= Config.instance.changelog_path
|
20
|
+
|
21
|
+
begin
|
22
|
+
generator = Renogen::Generator.new(version, source, format, options)
|
23
|
+
generator.generate!
|
24
|
+
rescue Renogen::Exceptions::Base => e
|
25
|
+
puts e.message
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# Initialize the current working directory with example change
|
30
|
+
def self.init
|
31
|
+
Dir.mkdir('./change_log')
|
32
|
+
puts "Created './change_log/'"
|
33
|
+
|
34
|
+
Dir.mkdir('./change_log/next')
|
35
|
+
puts "Created './change_log/next/'"
|
36
|
+
|
37
|
+
File.open("./change_log/next/added_renogen_gem.yml", 'w') do |f|
|
38
|
+
f.write("Summary:\n")
|
39
|
+
f.write(" identifier: renogen\n")
|
40
|
+
f.write(" link: https://github.com/DDAZZA/renogen\n")
|
41
|
+
f.write(" summary: Added ReNoGen gem\n")
|
42
|
+
f.write("\n")
|
43
|
+
f.write("Detailed: |\n")
|
44
|
+
f.write(" Added ReNoGen gem\n")
|
45
|
+
f.write("\n")
|
46
|
+
f.write(" Allows release notes to be generated\n")
|
47
|
+
f.write("\n")
|
48
|
+
f.write("Tasks:\n")
|
49
|
+
f.write(" - $ renogen vX.Y.Z > release_vX_Y_Z.md\n")
|
50
|
+
end
|
51
|
+
|
52
|
+
puts "Created './change_log/next/added_renogen_gem.yml'"
|
53
|
+
|
54
|
+
File.open(".renogen", 'w') do |f|
|
55
|
+
f.write("changelog_path: './change_log/'\n")
|
56
|
+
end
|
57
|
+
puts "Created '.renogen'"
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
|
3
|
+
module Renogen
|
4
|
+
module Cli
|
5
|
+
# Extracts options and version from argument list
|
6
|
+
class ParamParser
|
7
|
+
attr_accessor :options
|
8
|
+
|
9
|
+
def initialize(options)
|
10
|
+
@options = options
|
11
|
+
end
|
12
|
+
|
13
|
+
# Extracts options and version from argument list
|
14
|
+
#
|
15
|
+
# @return [Hash] options
|
16
|
+
def parse
|
17
|
+
args = Hash.new
|
18
|
+
|
19
|
+
opt_parser = OptionParser.new do |opts|
|
20
|
+
opts.banner = "Usage: renogen [options] VERSION"
|
21
|
+
opts.separator ""
|
22
|
+
opts.separator "Required:"
|
23
|
+
opts.separator " VERSION this is the version that is currently being required:"
|
24
|
+
opts.separator ""
|
25
|
+
opts.separator "Options:"
|
26
|
+
|
27
|
+
opts.on("-fFORMAT", "--format=FORMAT", "Output format to be generated") do |n|
|
28
|
+
args['format'] = n
|
29
|
+
end
|
30
|
+
|
31
|
+
opts.on("-sSOURCE", "--source=SOURCE", "Type of source that changes will be extracted from") do |n|
|
32
|
+
args['source'] = n
|
33
|
+
end
|
34
|
+
|
35
|
+
opts.on("-pPATH", "--path=PATH", "Path to changelog files") do |n|
|
36
|
+
args['changelog_path'] = n
|
37
|
+
end
|
38
|
+
|
39
|
+
opts.on("-lVERSION", "--legacy=VERSION", "Used to collate all changes since") do |n|
|
40
|
+
args['legacy_version'] = n
|
41
|
+
end
|
42
|
+
|
43
|
+
opts.on_tail("-h", "--help", "Show this message") do
|
44
|
+
puts opts
|
45
|
+
exit
|
46
|
+
end
|
47
|
+
|
48
|
+
opts.on_tail("--version", "Show renogen version") do
|
49
|
+
puts Renogen::VERSION
|
50
|
+
exit
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
opt_parser.parse!(options)
|
55
|
+
|
56
|
+
new_version = options.shift
|
57
|
+
if new_version.nil?
|
58
|
+
puts "Missing argument: VERSION"
|
59
|
+
puts
|
60
|
+
puts opt_parser
|
61
|
+
exit 1
|
62
|
+
elsif options.count > 0
|
63
|
+
puts "Unknown arguments: #{options}"
|
64
|
+
puts
|
65
|
+
puts opt_parser
|
66
|
+
exit 1
|
67
|
+
end
|
68
|
+
|
69
|
+
return new_version, args
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|