step-up 0.1.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.
- data/README.md +3 -0
- data/Rakefile +40 -0
- data/bin/stepup +9 -0
- data/lib/step-up.rb +11 -0
- data/lib/step-up/cli.rb +26 -0
- data/lib/step-up/config.rb +14 -0
- data/lib/step-up/config/step-up.yml +19 -0
- data/lib/step-up/driver/git.rb +83 -0
- data/lib/step-up/git_extensions.rb +130 -0
- data/lib/step-up/parser/version_mask.rb +73 -0
- data/lib/step-up/version.rb +28 -0
- data/spec/lib/step-up/driver/git_spec.rb +176 -0
- data/spec/lib/step-up/parser/version_mask_spec.rb +51 -0
- data/spec/spec_helper.rb +13 -0
- metadata +130 -0
data/README.md
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
begin
|
2
|
+
require 'rspec/core/rake_task'
|
3
|
+
|
4
|
+
desc "Run specs"
|
5
|
+
RSpec::Core::RakeTask.new do |t|
|
6
|
+
t.rspec_opts = %w(-fs --color)
|
7
|
+
t.ruby_opts = %w(-w)
|
8
|
+
end
|
9
|
+
rescue LoadError
|
10
|
+
task :spec do
|
11
|
+
abort "Run `rake spec:deps` to be able to run the specs"
|
12
|
+
end
|
13
|
+
|
14
|
+
namespace :spec do
|
15
|
+
desc "Ensure spec dependencies are installed"
|
16
|
+
task :deps do
|
17
|
+
sh "gem list rspec | (grep 'rspec (2.0' 1> /dev/null) || gem install rspec --no-ri --no-rdoc"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
desc "Build the gem"
|
23
|
+
task :build do
|
24
|
+
opers = Dir.glob('*.gem')
|
25
|
+
opers = ["rm #{ opers.join(' ') }"] unless opers.empty?
|
26
|
+
opers << ["gem build step-up.gemspec"]
|
27
|
+
sh opers.join(" && ")
|
28
|
+
end
|
29
|
+
|
30
|
+
desc "Build and install the gem, removing old installation"
|
31
|
+
task :install => :build do
|
32
|
+
gem = Dir.glob('*.gem').first
|
33
|
+
if gem.nil?
|
34
|
+
puts "could not install the gem"
|
35
|
+
else
|
36
|
+
sh "gem uninstall step-up && gem install #{ gem }"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
task :default => :spec
|
data/bin/stepup
ADDED
data/lib/step-up.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
module StepUp
|
2
|
+
autoload :CONFIG, 'step-up/config.rb'
|
3
|
+
autoload :VERSION, 'step-up/version.rb'
|
4
|
+
module Driver
|
5
|
+
autoload :Git, 'step-up/driver/git.rb'
|
6
|
+
end
|
7
|
+
autoload :GitExtensions, 'step-up/git_extensions.rb'
|
8
|
+
module Parser
|
9
|
+
autoload :VersionMask, 'step-up/parser/version_mask.rb'
|
10
|
+
end
|
11
|
+
end
|
data/lib/step-up/cli.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'thor'
|
2
|
+
require 'step-up'
|
3
|
+
|
4
|
+
module StepUp
|
5
|
+
class CLI < Thor
|
6
|
+
map %w(--version -v) => :gem_version
|
7
|
+
|
8
|
+
default_task :version
|
9
|
+
|
10
|
+
desc "", "show the last version of the application"
|
11
|
+
def version
|
12
|
+
puts StepUp::Driver::Git.last_version
|
13
|
+
end
|
14
|
+
|
15
|
+
desc "notes [object]", "show notes for the next version"
|
16
|
+
method_options :clean => :boolean
|
17
|
+
def notes(commit_base = nil)
|
18
|
+
puts StepUp::Driver::Git.unversioned_notes(commit_base, options[:clean])
|
19
|
+
end
|
20
|
+
|
21
|
+
desc "-v, --version", "show the last version of the gem"
|
22
|
+
def gem_version
|
23
|
+
puts StepUp::VERSION
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
module StepUp
|
3
|
+
CONFIG = {}
|
4
|
+
|
5
|
+
def self.load_config path
|
6
|
+
return CONFIG unless File.exists? path
|
7
|
+
CONFIG.merge! YAML.load_file(path)
|
8
|
+
rescue TypeError => e
|
9
|
+
puts "could not load #{path}: #{e.inspect}"
|
10
|
+
end
|
11
|
+
|
12
|
+
load_config File.expand_path('../config/step-up.yml', __FILE__)
|
13
|
+
load_config '.versionrc' # from working folder
|
14
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
notes:
|
2
|
+
after_versioned:
|
3
|
+
strategy: "remove"
|
4
|
+
#strategy: "keep"
|
5
|
+
section: "versioning"
|
6
|
+
changelog_message: "available on {version}"
|
7
|
+
sections:
|
8
|
+
- changes
|
9
|
+
- bugfixes
|
10
|
+
- features
|
11
|
+
- deploy_steps
|
12
|
+
versioning:
|
13
|
+
version_mask: "v0.0.0.9.rc9"
|
14
|
+
version_parts:
|
15
|
+
- major
|
16
|
+
- minor
|
17
|
+
- tiny
|
18
|
+
- patch
|
19
|
+
- rc
|
@@ -0,0 +1,83 @@
|
|
1
|
+
module StepUp
|
2
|
+
module Driver
|
3
|
+
class Git
|
4
|
+
include GitExtensions::Notes
|
5
|
+
attr_reader :mask
|
6
|
+
def initialize
|
7
|
+
@mask = Parser::VersionMask.new(CONFIG["versioning"]["version_mask"])
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.last_version(commit_base = nil)
|
11
|
+
@driver ||= new
|
12
|
+
@driver.last_version_tag(commit_base) || "%s%s" % [@driver.mask.blank, '+']
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.unversioned_notes(commit_base = nil, clean = false)
|
16
|
+
options = {:mode => :with_objects}
|
17
|
+
options.delete :mode if clean
|
18
|
+
new.all_objects_with_notes(commit_base).unversioned_only.to_changelog(options)
|
19
|
+
end
|
20
|
+
|
21
|
+
def commit_history(commit_base, top = nil)
|
22
|
+
top = "-n#{ top }" unless top.nil?
|
23
|
+
`git log --pretty=oneline --no-color --no-notes #{ top } #{ commit_base }`.gsub(/^(\w+)\s.*$/, '\1').split("\n")
|
24
|
+
end
|
25
|
+
|
26
|
+
def all_tags
|
27
|
+
`git tag -l`.split("\n")
|
28
|
+
end
|
29
|
+
|
30
|
+
def objects_with_notes_of(ref)
|
31
|
+
`git notes --ref=#{ ref } list`.gsub(/^\w+\s(\w+)$/, '\1').split(/\n/)
|
32
|
+
end
|
33
|
+
|
34
|
+
def all_objects_with_notes(commit_base = nil)
|
35
|
+
objects = commit_history(commit_base)
|
36
|
+
objects_with_notes = {}.extend GitExtensions::NotesTransformation
|
37
|
+
objects_with_notes.driver = self
|
38
|
+
notes_sections.each do |section|
|
39
|
+
obj = objects_with_notes_of(section)
|
40
|
+
obj = obj.collect { |object|
|
41
|
+
pos = objects.index(object)
|
42
|
+
pos.nil? ? nil : [pos, object]
|
43
|
+
}.compact.sort.reverse
|
44
|
+
objects_with_notes[section] = obj.collect{ |o| o.last }
|
45
|
+
end
|
46
|
+
objects_with_notes
|
47
|
+
end
|
48
|
+
|
49
|
+
def note_message(ref, commit)
|
50
|
+
`git notes --ref=#{ ref } show #{ commit }`
|
51
|
+
end
|
52
|
+
|
53
|
+
def notes_messages(objects_with_notes)
|
54
|
+
objects_with_notes.messages
|
55
|
+
end
|
56
|
+
|
57
|
+
def all_version_tags
|
58
|
+
@version_tags ||= all_tags.map{ |tag| mask.parse(tag) }.compact.sort.map{ |tag| mask.format(tag) }.reverse
|
59
|
+
end
|
60
|
+
|
61
|
+
def increase_version_tag(part, commit_base = nil)
|
62
|
+
commands = []
|
63
|
+
tag = last_version_tag(commit_base)
|
64
|
+
tag = tag.sub(/\+$/, '')
|
65
|
+
tag = mask.increase_version(tag, part)
|
66
|
+
message = all_objects_with_notes(commit_base)
|
67
|
+
commands << "git fetch"
|
68
|
+
commands << "git tag -a -m \"#{ message.to_changelog }\" #{ tag }"
|
69
|
+
commands << "git push --tags"
|
70
|
+
commands + steps_for_archiving_notes(message, tag)
|
71
|
+
end
|
72
|
+
|
73
|
+
def last_version_tag(commit_base = nil)
|
74
|
+
objects = commit_history(commit_base)
|
75
|
+
all_version_tags.each do |tag|
|
76
|
+
index = objects.index(commit_history(tag, 1).first)
|
77
|
+
return "#{ tag }#{ '+' unless index.zero? }" unless index.nil?
|
78
|
+
end
|
79
|
+
nil
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,130 @@
|
|
1
|
+
module StepUp
|
2
|
+
module GitExtensions
|
3
|
+
NOTES_STRATEGIES = {}
|
4
|
+
def self.register_notes_strategy(key, instance)
|
5
|
+
NOTES_STRATEGIES[key] = instance
|
6
|
+
end
|
7
|
+
|
8
|
+
module Notes
|
9
|
+
def steps_for_archiving_notes(objects_with_notes, tag)
|
10
|
+
strategy = notes_after_versioned["strategy"]
|
11
|
+
raise ArgumentError, "unknown strategy: #{ strategy }" unless NOTES_STRATEGIES.include?(strategy)
|
12
|
+
NOTES_STRATEGIES[strategy].steps_for_archiving_notes(objects_with_notes, tag, self)
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def notes_sections
|
18
|
+
CONFIG["notes"]["sections"]
|
19
|
+
end
|
20
|
+
|
21
|
+
def notes_after_versioned
|
22
|
+
CONFIG["notes"]["after_versioned"]
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
module NotesTransformation
|
27
|
+
def self.extend_object(base)
|
28
|
+
super
|
29
|
+
class << base
|
30
|
+
attr_writer :driver, :parent, :kept_notes
|
31
|
+
def []=(p1, p2)
|
32
|
+
super
|
33
|
+
sections << p1 unless sections.include?(p1)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def driver
|
39
|
+
@driver ||= parent.driver
|
40
|
+
end
|
41
|
+
|
42
|
+
def sections
|
43
|
+
@sections ||= parent != self && parent.sections && parent.sections.dup || []
|
44
|
+
end
|
45
|
+
|
46
|
+
def parent
|
47
|
+
@parent ||= self
|
48
|
+
end
|
49
|
+
|
50
|
+
def kept_notes
|
51
|
+
@kept_notes ||= driver.objects_with_notes_of(kept_notes_section)
|
52
|
+
end
|
53
|
+
|
54
|
+
def kept_notes_section
|
55
|
+
driver.send(:notes_after_versioned)["section"]
|
56
|
+
end
|
57
|
+
|
58
|
+
def unversioned_only
|
59
|
+
notes = {}.extend NotesTransformation
|
60
|
+
notes.driver = driver
|
61
|
+
notes.kept_notes = kept_notes
|
62
|
+
sections.each do |section|
|
63
|
+
notes[section] = (parent[section] || []).select{ |commit| not kept_notes.include?(commit) }
|
64
|
+
end
|
65
|
+
notes
|
66
|
+
end
|
67
|
+
|
68
|
+
def messages
|
69
|
+
unless defined? @messages
|
70
|
+
notes = {}.extend NotesTransformation
|
71
|
+
notes.parent = self
|
72
|
+
sections.each do |section|
|
73
|
+
notes[section] = (parent[section] || []).map{ |commit| driver.note_message(section, commit) }
|
74
|
+
end
|
75
|
+
@messages = notes
|
76
|
+
end
|
77
|
+
@messages
|
78
|
+
end
|
79
|
+
|
80
|
+
def to_changelog(options = {})
|
81
|
+
changelog = []
|
82
|
+
sections.each_with_index do |section, index|
|
83
|
+
changelog << "#{ section.capitalize.gsub(/_/, ' ') }:\n" unless index.zero? || messages[section].empty?
|
84
|
+
messages[section].each_with_index do |note, index|
|
85
|
+
note = note.sub(/$/, " (#{ parent[section][index] })") if options[:mode] == :with_objects
|
86
|
+
changelog += note.split(/\n+/).collect{ |line| line.sub(/^(\s*)/, '\1 - ') }
|
87
|
+
end
|
88
|
+
changelog << "" unless messages[section].empty?
|
89
|
+
end
|
90
|
+
changelog.join("\n")
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
module Strategy
|
95
|
+
class RemoveNotes
|
96
|
+
def steps_for_archiving_notes(objects_with_notes, tag, driver)
|
97
|
+
commands = []
|
98
|
+
objects_with_notes.sections.each do |section|
|
99
|
+
objects_with_notes[section].each do |object|
|
100
|
+
commands << "git notes --ref=#{ section } remove #{ object }"
|
101
|
+
end
|
102
|
+
commands << "git push origin refs/notes/#{ section }" unless objects_with_notes[section].empty?
|
103
|
+
end
|
104
|
+
commands
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
class KeepNotes
|
109
|
+
def steps_for_archiving_notes(objects_with_notes, tag, driver)
|
110
|
+
commands = []
|
111
|
+
objects = []
|
112
|
+
changelog_message = driver.notes_after_versioned["changelog_message"]
|
113
|
+
objects_with_notes.sections.each do |section|
|
114
|
+
objects_with_notes[section].each do |object|
|
115
|
+
unless objects.include?(object)
|
116
|
+
objects << object
|
117
|
+
kept_message = changelog_message.gsub(/\{version\}/, tag)
|
118
|
+
commands << "git notes --ref=#{ driver.notes_after_versioned["section"] } add -m \"#{ kept_message }\" #{ object }"
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
commands << "git push origin refs/notes/#{ driver.notes_after_versioned["section"] }" unless objects.empty?
|
123
|
+
commands
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
register_notes_strategy "remove", Strategy::RemoveNotes.new
|
128
|
+
register_notes_strategy "keep", Strategy::KeepNotes.new
|
129
|
+
end
|
130
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
module StepUp
|
2
|
+
module Parser
|
3
|
+
class VersionMask
|
4
|
+
attr_reader :mask
|
5
|
+
attr_reader :iterator
|
6
|
+
def initialize(mask)
|
7
|
+
@mask = mask.scan(/\D+[09]/)
|
8
|
+
raise ArgumentError if mask != @mask.join
|
9
|
+
@iterator = @mask.map do |token|
|
10
|
+
Regexp.new token.sub(/\./, '\\.').sub(/[09]$/,'(\d+)')
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def parse(version)
|
15
|
+
return unless version.is_a?(String)
|
16
|
+
i = 0
|
17
|
+
v = []
|
18
|
+
iterator.each_with_index do |pattern, index|
|
19
|
+
pos = version.index(pattern, i)
|
20
|
+
if pos.nil?
|
21
|
+
if mask[index] =~ /9$/
|
22
|
+
v << 0
|
23
|
+
else
|
24
|
+
return
|
25
|
+
end
|
26
|
+
else
|
27
|
+
if pos == i
|
28
|
+
n = $1
|
29
|
+
i += mask[index].size + n.size - 1
|
30
|
+
v << n.to_i
|
31
|
+
elsif mask[index] =~ /9$/
|
32
|
+
v << 0
|
33
|
+
else
|
34
|
+
return
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
v
|
39
|
+
end
|
40
|
+
|
41
|
+
def format(version)
|
42
|
+
raise ArgumentError unless version.is_a?(Array) && version.size == mask.size
|
43
|
+
v = []
|
44
|
+
iterator.each_with_index do |pattern, index|
|
45
|
+
raise ArgumentError unless version[index].is_a?(Fixnum)
|
46
|
+
unless version[index].zero? && mask[index] =~ /9$/
|
47
|
+
v << mask[index].sub(/[09]$/, version[index].to_s)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
v.join
|
51
|
+
end
|
52
|
+
|
53
|
+
def increase_version(version, part)
|
54
|
+
v = parse version
|
55
|
+
part = version_parts.index(part)
|
56
|
+
(v.size-part).times do |index|
|
57
|
+
v[part+index] = (index.zero? ? v[part+index]+1 : 0)
|
58
|
+
end
|
59
|
+
format v
|
60
|
+
end
|
61
|
+
|
62
|
+
def blank
|
63
|
+
format mask.size.times.map{ 0 }
|
64
|
+
end
|
65
|
+
|
66
|
+
private
|
67
|
+
|
68
|
+
def version_parts
|
69
|
+
CONFIG["versioning"]["version_parts"]
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module StepUp
|
2
|
+
path = File.expand_path('../..', __FILE__)
|
3
|
+
v = nil
|
4
|
+
if path =~ /\/step-up-([\w\.\-]+)/
|
5
|
+
v = $1
|
6
|
+
end
|
7
|
+
if v.nil?
|
8
|
+
$:.each do |path|
|
9
|
+
if path =~ /\/step-up-([\w\.\-]+)/
|
10
|
+
v = $1
|
11
|
+
break
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
if v.nil?
|
16
|
+
path = File.expand_path('../../../.git', __FILE__)
|
17
|
+
if File.exists?(path)
|
18
|
+
v = Driver::Git.last_version
|
19
|
+
end
|
20
|
+
end
|
21
|
+
if v.nil?
|
22
|
+
VERSION = "0.0.0"
|
23
|
+
else
|
24
|
+
v.sub!(/^v/, '')
|
25
|
+
v.sub!(/\+$/, '')
|
26
|
+
VERSION = v
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,176 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe StepUp::Driver::Git do
|
4
|
+
before do
|
5
|
+
@driver = StepUp::Driver::Git.new
|
6
|
+
end
|
7
|
+
|
8
|
+
|
9
|
+
context 'fetching information' do
|
10
|
+
it 'should get all commits from history log' do
|
11
|
+
@driver.should respond_to :commit_history
|
12
|
+
@driver.commit_history("f4cfcc2").should be == ["f4cfcc2c8b1f7edb1b7817b4e8a9063d21db089b", "2fb8a3281fb6777405aadcd699adb852b615a3e4", "d7b0fa26ca547b963569d7a82afd7d7ca11b71ae", "8b38f7c842496fd50b4e1b7ca5e883940b9cbf83", "f76c8d7bf64678963aeef84009be54f1819e3389", "8299243c7dac8f27c3572424a348a7f83ef0ce28", "570fe2e6e7f0b06140ae109e50a1e86628819493", "cdd4d5aa885b22136f4a08c1b35076f888f9536e", "72174c160b50ec73a8f67c8150e0dcd976857411", "b2da007b4fb35e0274858c14a83a836852d055a4", "4f0e7e0f6b3df2d49ed0029ed01998bf2102b28f"]
|
13
|
+
@driver.commit_history("f4cfcc2", 3).should be == ["f4cfcc2c8b1f7edb1b7817b4e8a9063d21db089b", "2fb8a3281fb6777405aadcd699adb852b615a3e4", "d7b0fa26ca547b963569d7a82afd7d7ca11b71ae"]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
context 'fetching tags' do
|
19
|
+
it "should get tags sorted" do
|
20
|
+
tags = %w[note-v0.2.0-1 v0.1.0 v0.1.1 v0.1.2 v0.1.1.rc3]
|
21
|
+
@driver.stubs(:all_tags).returns(tags)
|
22
|
+
@driver.all_version_tags.should be == %w[v0.1.2 v0.1.1.rc3 v0.1.1 v0.1.0]
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should return last tag visible" do
|
26
|
+
@driver.last_version_tag("f4cfcc2").should be == "v0.0.1+"
|
27
|
+
@driver.last_version_tag("570fe2e").should be == "v0.0.1"
|
28
|
+
@driver.class.last_version("f4cfcc2").should be == "v0.0.1+"
|
29
|
+
@driver.class.last_version("570fe2e").should be == "v0.0.1"
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should get no tag visible" do
|
33
|
+
@driver.last_version_tag("cdd4d5a").should be_nil
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should get a blank tag" do
|
37
|
+
@driver.mask.blank.should be == "v0.0.0"
|
38
|
+
@driver.class.last_version("cdd4d5a").should be == "v0.0.0+"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
context "fetching notes" do
|
44
|
+
context "from test_* sections" do
|
45
|
+
before do
|
46
|
+
@driver.stubs(:notes_sections).returns(%w[test_changes test_bugfixes test_features])
|
47
|
+
@objects_with_notes = {"test_changes" => ["8299243c7dac8f27c3572424a348a7f83ef0ce28", "2fb8a3281fb6777405aadcd699adb852b615a3e4"], "test_bugfixes" => ["d7b0fa26ca547b963569d7a82afd7d7ca11b71ae"], "test_features" => []}
|
48
|
+
@messages = {"test_changes" => ["removing files from gemspec\n .gitignore\n lastversion.gemspec\n", "loading default configuration yaml\n\nloading external configuration yaml\n"], "test_bugfixes" => ["sorting tags according to the mask parser\n"], "test_features" => []}
|
49
|
+
@changelog_full = <<-MSG
|
50
|
+
- removing files from gemspec (8299243c7dac8f27c3572424a348a7f83ef0ce28)
|
51
|
+
- .gitignore
|
52
|
+
- lastversion.gemspec
|
53
|
+
- loading default configuration yaml (2fb8a3281fb6777405aadcd699adb852b615a3e4)
|
54
|
+
- loading external configuration yaml
|
55
|
+
|
56
|
+
Test bugfixes:
|
57
|
+
|
58
|
+
- sorting tags according to the mask parser (d7b0fa26ca547b963569d7a82afd7d7ca11b71ae)
|
59
|
+
MSG
|
60
|
+
@changelog = @changelog_full.gsub(/\s\(\w+\)$/, '')
|
61
|
+
@all_objects_with_notes = @driver.all_objects_with_notes("f4cfcc2")
|
62
|
+
end
|
63
|
+
it "should get all objects with notes" do
|
64
|
+
@all_objects_with_notes.should be == @objects_with_notes
|
65
|
+
end
|
66
|
+
it "should get all notes messages" do
|
67
|
+
@all_objects_with_notes.should respond_to(:messages)
|
68
|
+
@all_objects_with_notes.messages.should be == @messages
|
69
|
+
end
|
70
|
+
it "should get changelog message" do
|
71
|
+
@all_objects_with_notes.should respond_to(:to_changelog)
|
72
|
+
@all_objects_with_notes.sections.should be == @driver.notes_sections
|
73
|
+
@all_objects_with_notes.messages.should be == @messages
|
74
|
+
@all_objects_with_notes.messages.to_changelog.should be == @changelog
|
75
|
+
@all_objects_with_notes.to_changelog.should be == @changelog
|
76
|
+
@all_objects_with_notes.messages.to_changelog(:mode => :with_objects).should be == @changelog_full
|
77
|
+
@all_objects_with_notes.to_changelog(:mode => :with_objects).should be == @changelog_full
|
78
|
+
end
|
79
|
+
it "should get unversioned changelog message" do
|
80
|
+
@all_objects_with_notes.should be == @objects_with_notes
|
81
|
+
object = @objects_with_notes["test_changes"].shift
|
82
|
+
@all_objects_with_notes.stubs(:kept_notes).returns([object])
|
83
|
+
@all_objects_with_notes.should respond_to(:unversioned_only)
|
84
|
+
@all_objects_with_notes.unversioned_only.should be == @objects_with_notes
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
|
90
|
+
context "increasing version" do
|
91
|
+
before do
|
92
|
+
@driver.stubs(:notes_sections).returns(%w[test_changes test_bugfixes test_features])
|
93
|
+
end
|
94
|
+
|
95
|
+
|
96
|
+
context "using 'remove' as after_versioned:strategy" do
|
97
|
+
before do
|
98
|
+
@driver.stubs(:notes_after_versioned).returns({"strategy" => "remove", "section" => "test_versioning", "changelog_message" => "available on {version}"})
|
99
|
+
@steps = <<-STEPS
|
100
|
+
git fetch
|
101
|
+
|
102
|
+
git tag -a -m " - removing files from gemspec
|
103
|
+
- .gitignore
|
104
|
+
- lastversion.gemspec
|
105
|
+
- loading default configuration yaml
|
106
|
+
- loading external configuration yaml
|
107
|
+
|
108
|
+
Test bugfixes:
|
109
|
+
|
110
|
+
- sorting tags according to the mask parser
|
111
|
+
" v0.1.0
|
112
|
+
|
113
|
+
git push --tags
|
114
|
+
|
115
|
+
git notes --ref=test_changes remove 8299243c7dac8f27c3572424a348a7f83ef0ce28
|
116
|
+
|
117
|
+
git notes --ref=test_changes remove 2fb8a3281fb6777405aadcd699adb852b615a3e4
|
118
|
+
|
119
|
+
git push origin refs/notes/test_changes
|
120
|
+
|
121
|
+
git notes --ref=test_bugfixes remove d7b0fa26ca547b963569d7a82afd7d7ca11b71ae
|
122
|
+
|
123
|
+
git push origin refs/notes/test_bugfixes
|
124
|
+
STEPS
|
125
|
+
@steps = @steps.chomp.split(/\n\n/).collect{ |step| step.gsub(/^\s{8}/, '') }
|
126
|
+
end
|
127
|
+
it "should return steps" do
|
128
|
+
@driver.should respond_to :increase_version_tag
|
129
|
+
@driver.increase_version_tag("minor", "f4cfcc2").should be == @steps
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
|
134
|
+
context "using 'keep' as after_versioned:strategy" do
|
135
|
+
before do
|
136
|
+
@driver.stubs(:notes_after_versioned).returns({"strategy" => "keep", "section" => "test_versioning", "changelog_message" => "available on {version}"})
|
137
|
+
@steps = <<-STEPS
|
138
|
+
git fetch
|
139
|
+
|
140
|
+
git tag -a -m " - removing files from gemspec
|
141
|
+
- .gitignore
|
142
|
+
- lastversion.gemspec
|
143
|
+
- loading default configuration yaml
|
144
|
+
- loading external configuration yaml
|
145
|
+
|
146
|
+
Test bugfixes:
|
147
|
+
|
148
|
+
- sorting tags according to the mask parser
|
149
|
+
" v0.1.0
|
150
|
+
|
151
|
+
git push --tags
|
152
|
+
|
153
|
+
git notes --ref=test_versioning add -m "available on v0.1.0" 8299243c7dac8f27c3572424a348a7f83ef0ce28
|
154
|
+
|
155
|
+
git notes --ref=test_versioning add -m "available on v0.1.0" 2fb8a3281fb6777405aadcd699adb852b615a3e4
|
156
|
+
|
157
|
+
git notes --ref=test_versioning add -m "available on v0.1.0" d7b0fa26ca547b963569d7a82afd7d7ca11b71ae
|
158
|
+
|
159
|
+
git push origin refs/notes/test_versioning
|
160
|
+
STEPS
|
161
|
+
@steps = @steps.chomp.split(/\n\n/).collect{ |step| step.gsub(/^\s{8}/, '') }
|
162
|
+
end
|
163
|
+
it "should return steps" do
|
164
|
+
@driver.should respond_to :increase_version_tag
|
165
|
+
@driver.increase_version_tag("minor", "f4cfcc2").should be == @steps
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
|
171
|
+
context "checking helper methods" do
|
172
|
+
it "should load default notes' sections" do
|
173
|
+
@driver.send(:notes_sections).should be == StepUp::CONFIG["notes"]["sections"]
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe StepUp::Parser::VersionMask do
|
4
|
+
before do
|
5
|
+
lambda {
|
6
|
+
@mask = StepUp::Parser::VersionMask.new("v0.0.0.9.9.rc9")
|
7
|
+
}.should_not raise_error ArgumentError
|
8
|
+
end
|
9
|
+
|
10
|
+
|
11
|
+
context "parsing" do
|
12
|
+
it "should parse" do
|
13
|
+
@mask.parse("v0.1.0.rc3").should be == [0, 1, 0, 0, 0, 3]
|
14
|
+
@mask.parse("v0.1.0").should be == [0, 1, 0, 0, 0, 0]
|
15
|
+
@mask.parse("v0.1.4.5.rc3").should be == [0, 1, 4, 5, 0, 3]
|
16
|
+
end
|
17
|
+
it "should not parse" do
|
18
|
+
@mask.parse("v0.1.rc3").should be_nil
|
19
|
+
@mask.parse("note-v0.1.0-1").should be_nil
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
context "formatting" do
|
25
|
+
it "should format" do
|
26
|
+
@mask.format([0, 1, 0, 0, 0, 3]).should be == "v0.1.0.rc3"
|
27
|
+
@mask.format([0, 1, 0, 0, 0, 0]).should be == "v0.1.0"
|
28
|
+
@mask.format([0, 1, 4, 5, 0, 3]).should be == "v0.1.4.5.rc3"
|
29
|
+
end
|
30
|
+
it "should not format" do
|
31
|
+
lambda {@mask.format([0, 1, 0, 0, 3])}.should raise_error ArgumentError
|
32
|
+
lambda {@mask.format([0, 1, 0, 0, 0, 0, 0])}.should raise_error ArgumentError
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
context "increasing version" do
|
38
|
+
before do
|
39
|
+
@mask.stubs(:version_parts).returns(%w[major minor tiny patch build rc])
|
40
|
+
end
|
41
|
+
it "should increase by parts" do
|
42
|
+
version = "v2.3.1.6.4.rc5"
|
43
|
+
@mask.increase_version(version, "major").should be == "v3.0.0"
|
44
|
+
@mask.increase_version(version, "minor").should be == "v2.4.0"
|
45
|
+
@mask.increase_version(version, "tiny").should be == "v2.3.2"
|
46
|
+
@mask.increase_version(version, "patch").should be == "v2.3.1.7"
|
47
|
+
@mask.increase_version(version, "build").should be == "v2.3.1.6.5"
|
48
|
+
@mask.increase_version(version, "rc").should be == "v2.3.1.6.4.rc6"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
$:.unshift File.expand_path('../../lib', __FILE__)
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'step-up'
|
5
|
+
require 'rspec'
|
6
|
+
|
7
|
+
Dir["#{File.expand_path('../support', __FILE__)}/*.rb"].each do |file|
|
8
|
+
require file
|
9
|
+
end
|
10
|
+
|
11
|
+
RSpec.configure do |config|
|
12
|
+
config.mock_with :mocha
|
13
|
+
end
|
metadata
ADDED
@@ -0,0 +1,130 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: step-up
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 27
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 0
|
10
|
+
version: 0.1.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Marcelo Manzan
|
14
|
+
- Eric Adrien Fer
|
15
|
+
autorequire:
|
16
|
+
bindir: bin
|
17
|
+
cert_chain: []
|
18
|
+
|
19
|
+
date: 2010-12-09 00:00:00 -02:00
|
20
|
+
default_executable: stepup
|
21
|
+
dependencies:
|
22
|
+
- !ruby/object:Gem::Dependency
|
23
|
+
name: thor
|
24
|
+
prerelease: false
|
25
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
27
|
+
requirements:
|
28
|
+
- - ">="
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
hash: 43
|
31
|
+
segments:
|
32
|
+
- 0
|
33
|
+
- 14
|
34
|
+
- 6
|
35
|
+
version: 0.14.6
|
36
|
+
type: :runtime
|
37
|
+
version_requirements: *id001
|
38
|
+
- !ruby/object:Gem::Dependency
|
39
|
+
name: rspec
|
40
|
+
prerelease: false
|
41
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
hash: 3
|
47
|
+
segments:
|
48
|
+
- 0
|
49
|
+
version: "0"
|
50
|
+
type: :development
|
51
|
+
version_requirements: *id002
|
52
|
+
- !ruby/object:Gem::Dependency
|
53
|
+
name: mocha
|
54
|
+
prerelease: false
|
55
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
56
|
+
none: false
|
57
|
+
requirements:
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
hash: 3
|
61
|
+
segments:
|
62
|
+
- 0
|
63
|
+
version: "0"
|
64
|
+
type: :development
|
65
|
+
version_requirements: *id003
|
66
|
+
description: StepUp manages a project's versioning through its entire life
|
67
|
+
email:
|
68
|
+
- manzan@gmail.com
|
69
|
+
- eric.fer@gmail.com
|
70
|
+
executables:
|
71
|
+
- stepup
|
72
|
+
extensions: []
|
73
|
+
|
74
|
+
extra_rdoc_files: []
|
75
|
+
|
76
|
+
files:
|
77
|
+
- README.md
|
78
|
+
- Rakefile
|
79
|
+
- bin/stepup
|
80
|
+
- lib/step-up.rb
|
81
|
+
- lib/step-up/cli.rb
|
82
|
+
- lib/step-up/config.rb
|
83
|
+
- lib/step-up/config/step-up.yml
|
84
|
+
- lib/step-up/driver/git.rb
|
85
|
+
- lib/step-up/git_extensions.rb
|
86
|
+
- lib/step-up/parser/version_mask.rb
|
87
|
+
- lib/step-up/version.rb
|
88
|
+
- spec/lib/step-up/driver/git_spec.rb
|
89
|
+
- spec/lib/step-up/parser/version_mask_spec.rb
|
90
|
+
- spec/spec_helper.rb
|
91
|
+
has_rdoc: true
|
92
|
+
homepage: https://github.com/redoc/step-up
|
93
|
+
licenses: []
|
94
|
+
|
95
|
+
post_install_message:
|
96
|
+
rdoc_options: []
|
97
|
+
|
98
|
+
require_paths:
|
99
|
+
- lib
|
100
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
101
|
+
none: false
|
102
|
+
requirements:
|
103
|
+
- - ">="
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
hash: 3
|
106
|
+
segments:
|
107
|
+
- 0
|
108
|
+
version: "0"
|
109
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
110
|
+
none: false
|
111
|
+
requirements:
|
112
|
+
- - ">="
|
113
|
+
- !ruby/object:Gem::Version
|
114
|
+
hash: 23
|
115
|
+
segments:
|
116
|
+
- 1
|
117
|
+
- 3
|
118
|
+
- 6
|
119
|
+
version: 1.3.6
|
120
|
+
requirements: []
|
121
|
+
|
122
|
+
rubyforge_project: step-up
|
123
|
+
rubygems_version: 1.3.7
|
124
|
+
signing_key:
|
125
|
+
specification_version: 3
|
126
|
+
summary: The best way to manage your project's versioning
|
127
|
+
test_files:
|
128
|
+
- spec/lib/step-up/driver/git_spec.rb
|
129
|
+
- spec/lib/step-up/parser/version_mask_spec.rb
|
130
|
+
- spec/spec_helper.rb
|