releaser 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.
- data/.gitignore +5 -0
- data/.rspec +1 -0
- data/Gemfile +4 -0
- data/Rakefile +10 -0
- data/bin/releaser +5 -0
- data/lib/releaser.rb +10 -0
- data/lib/releaser/cli.rb +71 -0
- data/lib/releaser/revision.rb +56 -0
- data/lib/releaser/version.rb +3 -0
- data/releaser.gemspec +28 -0
- data/spec/lib/releaser/revision_spec.rb +126 -0
- data/spec/spec_helper.rb +12 -0
- data/spec/support/.gitkeep +0 -0
- metadata +124 -0
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--colour
|
data/Gemfile
ADDED
data/Rakefile
ADDED
data/bin/releaser
ADDED
data/lib/releaser.rb
ADDED
data/lib/releaser/cli.rb
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
require "active_support/core_ext/object/blank"
|
2
|
+
require 'rails/generators/actions'
|
3
|
+
|
4
|
+
module Releaser
|
5
|
+
class CLI < ::Thor
|
6
|
+
include Thor::Actions
|
7
|
+
include Rails::Generators::Actions
|
8
|
+
add_runtime_options!
|
9
|
+
class_option :message, :type => :string, :aliases => "-m", :desc => "Specify a tag message (-m option for git tag)"
|
10
|
+
class_option :push, :type => :boolean, :default => true
|
11
|
+
default_task :info
|
12
|
+
|
13
|
+
desc "major [CODENAME]", "Issue a major release"
|
14
|
+
def major(codename = "")
|
15
|
+
codename = ask "Please, give a codename: " unless codename.present?
|
16
|
+
new_version = version_from_tag_to_release.new_major(codename)
|
17
|
+
message = options.message.presence || "Major release: #{new_version}"
|
18
|
+
tag(new_version.to_tagline, :message => message)
|
19
|
+
end
|
20
|
+
|
21
|
+
desc "minor", "Issue a minor release"
|
22
|
+
def minor
|
23
|
+
new_version = version_from_tag_to_release.new_minor
|
24
|
+
message = options.message.presence || "Minor release: #{new_version}"
|
25
|
+
tag(new_version.to_tagline, :message => message)
|
26
|
+
end
|
27
|
+
|
28
|
+
desc "deploy", "Tag current commit for a deploy"
|
29
|
+
def deploy
|
30
|
+
tag(version_from_tag_to_release.to_deploy_tagline, :force => true)
|
31
|
+
rescue AlreadyReleasedError
|
32
|
+
# no actions required
|
33
|
+
end
|
34
|
+
|
35
|
+
desc "info", "Get current version"
|
36
|
+
method_option :verbose, :type => :boolean, :default => false, :aliases => "-v"
|
37
|
+
def info
|
38
|
+
version = version_from_tag
|
39
|
+
|
40
|
+
unless options.verbose?
|
41
|
+
say version
|
42
|
+
else
|
43
|
+
log :current_version, version
|
44
|
+
log :next_major, version.next_major("[CODENAME]")
|
45
|
+
log :next_minor, version.next_minor
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
protected
|
50
|
+
|
51
|
+
def version_from_tag_to_release
|
52
|
+
version_from_tag.tap { |v| raise AlreadyReleasedError.new(v.to_s) if v.current? }
|
53
|
+
end
|
54
|
+
|
55
|
+
def version_from_tag
|
56
|
+
tagline = `git describe --match \"v[0-9]*\" --long`.chomp
|
57
|
+
Version.new(tagline)
|
58
|
+
end
|
59
|
+
|
60
|
+
def tag(tag, config = {})
|
61
|
+
tag_options = [].tap do |opts|
|
62
|
+
opts.push "-m \"#{config[:message]}\"" if config[:message]
|
63
|
+
opts.push "-f" if config[:force]
|
64
|
+
end
|
65
|
+
|
66
|
+
run "git tag #{tag_options.join(" ")} -- #{tag}"
|
67
|
+
run "git push origin #{tag}" if options.push?
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'ostruct'
|
2
|
+
|
3
|
+
module Releaser
|
4
|
+
class Revision < OpenStruct
|
5
|
+
def initialize(duck)
|
6
|
+
super(duck.is_a?(String) ? parse_string(duck) : duck)
|
7
|
+
raise ArgumentError.new("Version should at least contain major part, but given: #{duck.inspect}") unless valid?
|
8
|
+
end
|
9
|
+
|
10
|
+
def valid?
|
11
|
+
!!major
|
12
|
+
end
|
13
|
+
|
14
|
+
def to_s
|
15
|
+
append_codename(version_string, " ")
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_tagline
|
19
|
+
append_codename(version_string, "-")
|
20
|
+
end
|
21
|
+
|
22
|
+
def to_deploy_tagline
|
23
|
+
version_string
|
24
|
+
end
|
25
|
+
|
26
|
+
def current?
|
27
|
+
build == 0
|
28
|
+
end
|
29
|
+
|
30
|
+
def next_major(codename = nil)
|
31
|
+
self.class.new(@table.merge(:build => 0, :minor => 0, :codename => codename).tap {|hsh| hsh[:major] += 1})
|
32
|
+
end
|
33
|
+
alias_method :new_major, :next_major
|
34
|
+
|
35
|
+
def next_minor
|
36
|
+
self.class.new(@table.merge(:build => 0).tap {|hsh| hsh[:minor] += 1})
|
37
|
+
end
|
38
|
+
alias_method :new_minor, :next_minor
|
39
|
+
|
40
|
+
protected
|
41
|
+
|
42
|
+
def version_string(prefix = "v")
|
43
|
+
"#{prefix}#{[major, minor, build == 0 ? nil : build].compact.join(".")}"
|
44
|
+
end
|
45
|
+
|
46
|
+
def parse_string(str)
|
47
|
+
major, minor, codename, build, sha = *str.match(/^v(?:(\d+)(?:\.(\d+))?)(?:.\d+)?(?:-(.*))?(?:-(\d+))(?:-(.*))$/).captures
|
48
|
+
{ :major => major.to_i, :minor => minor.to_i, :codename => codename, :build => build.to_i, :sha => sha }
|
49
|
+
end
|
50
|
+
|
51
|
+
def append_codename(str, separator = "")
|
52
|
+
[str, codename].compact.join(separator)
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
end
|
data/releaser.gemspec
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "releaser/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "releaser"
|
7
|
+
s.version = Releaser::VERSION
|
8
|
+
s.authors = ["Dmitriy Kiriyenko"]
|
9
|
+
s.email = ["dmitriy.kiriyenko@anahoret.com"]
|
10
|
+
s.homepage = ""
|
11
|
+
s.summary = %q{A set of thor scripts for managing application versions}
|
12
|
+
s.description = %q{A set of thor scripts for managing application versions.
|
13
|
+
Use it to control and even display your application current version.}
|
14
|
+
|
15
|
+
s.rubyforge_project = "releaser"
|
16
|
+
|
17
|
+
s.files = `git ls-files`.split("\n")
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
+
s.require_paths = ["lib"]
|
21
|
+
|
22
|
+
# specify any dependencies here; for example:
|
23
|
+
s.add_development_dependency "rspec"
|
24
|
+
s.add_development_dependency "rake"
|
25
|
+
s.add_runtime_dependency "thor"
|
26
|
+
s.add_runtime_dependency "activesupport"
|
27
|
+
s.add_runtime_dependency "railties"
|
28
|
+
end
|
@@ -0,0 +1,126 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Releaser::Revision do
|
4
|
+
let(:clazz) {Releaser::Revision}
|
5
|
+
|
6
|
+
def extract_hash_from_revision(revision)
|
7
|
+
{
|
8
|
+
:major => revision.major,
|
9
|
+
:minor => revision.minor,
|
10
|
+
:codename => revision.codename,
|
11
|
+
:build => revision.build,
|
12
|
+
:sha => revision.sha
|
13
|
+
}
|
14
|
+
end
|
15
|
+
|
16
|
+
def verify_revision(revision, expected_hash)
|
17
|
+
extract_hash_from_revision(revision).should include(expected_hash)
|
18
|
+
end
|
19
|
+
|
20
|
+
context "creation" do
|
21
|
+
context "from hash" do
|
22
|
+
it "should create correct object from hash" do
|
23
|
+
hash = {:major => 2, :minor => 3, :codename => "Hyperion", :build => 5, :sha => 'ab3de'}
|
24
|
+
revision = clazz.new(hash)
|
25
|
+
verify_revision(revision, hash)
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should raise error when creating without major" do
|
29
|
+
hash = {:minor => 3, :codename => "Hyperion", :build => 5, :sha => 'ab3de'}
|
30
|
+
lambda { clazz.new(hash) }.should raise_error
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context "from string" do
|
35
|
+
shared_examples_for "parsing from string" do
|
36
|
+
it "should create correct object from string" do
|
37
|
+
revision = clazz.new(given_string)
|
38
|
+
verify_revision(revision, expected_hash)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
context "when only major" do
|
43
|
+
let(:given_string) { "v6-Edison-59-gf7114dd" }
|
44
|
+
let(:expected_hash) { {
|
45
|
+
:major => 6,
|
46
|
+
:minor => 0,
|
47
|
+
:build => 59,
|
48
|
+
:codename => "Edison",
|
49
|
+
:sha => "gf7114dd"
|
50
|
+
} }
|
51
|
+
it_should_behave_like "parsing from string"
|
52
|
+
end
|
53
|
+
|
54
|
+
context "when major and minor" do
|
55
|
+
let(:given_string) { "v6.1-Edison-59-gf7114dd" }
|
56
|
+
let(:expected_hash) { {
|
57
|
+
:major => 6,
|
58
|
+
:minor => 1,
|
59
|
+
:build => 59,
|
60
|
+
:codename => "Edison",
|
61
|
+
:sha => "gf7114dd"
|
62
|
+
} }
|
63
|
+
it_should_behave_like "parsing from string"
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
context "serialization" do
|
69
|
+
subject {clazz.new "v6.1-Edison-59-gf7114dd"}
|
70
|
+
its(:to_s) { should == "v6.1.59 Edison" }
|
71
|
+
its(:to_tagline) { should == "v6.1.59-Edison" }
|
72
|
+
its(:to_deploy_tagline) { should == "v6.1.59" }
|
73
|
+
|
74
|
+
context "with initial build" do
|
75
|
+
subject {clazz.new "v6.1-Edison-0-gf7114dd"}
|
76
|
+
its(:to_s) { should == "v6.1 Edison" }
|
77
|
+
its(:to_tagline) { should == "v6.1-Edison" }
|
78
|
+
its(:to_deploy_tagline) { should == "v6.1" }
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
describe "current" do
|
83
|
+
context "when build is initial" do
|
84
|
+
subject {clazz.new "v6.1-Edison-0-gf7114dd"}
|
85
|
+
it { should be_current }
|
86
|
+
end
|
87
|
+
|
88
|
+
context "when build is not initial" do
|
89
|
+
subject {clazz.new "v6.1-Edison-59-gf7114dd"}
|
90
|
+
it { should_not be_current }
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
context "next version" do
|
95
|
+
subject {clazz.new "v6.1-Edison-59-gf7114dd"}
|
96
|
+
|
97
|
+
it "should correctly return next major version" do
|
98
|
+
verify_revision(subject.next_major("Archimedes"), {
|
99
|
+
:major => 7,
|
100
|
+
:minor => 0,
|
101
|
+
:build => 0,
|
102
|
+
:codename => "Archimedes"
|
103
|
+
})
|
104
|
+
end
|
105
|
+
|
106
|
+
it "should correctly return next major version without codename" do
|
107
|
+
subject.next_major.to_s.should == "v7.0"
|
108
|
+
verify_revision(subject.next_major, {
|
109
|
+
:major => 7,
|
110
|
+
:minor => 0,
|
111
|
+
:build => 0,
|
112
|
+
:codename => nil
|
113
|
+
})
|
114
|
+
end
|
115
|
+
|
116
|
+
it "should correctly return next major version without codename" do
|
117
|
+
verify_revision(subject.next_minor, {
|
118
|
+
:major => 6,
|
119
|
+
:minor => 2,
|
120
|
+
:build => 0,
|
121
|
+
:codename => "Edison"
|
122
|
+
})
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler/setup'
|
3
|
+
|
4
|
+
Bundler.require(:default, :development)
|
5
|
+
|
6
|
+
# Requires supporting files with custom matchers and macros, etc,
|
7
|
+
# in ./support/ and its subdirectories.
|
8
|
+
Dir[File.join(File.dirname(__FILE__), "support", "**", "*.rb")].each {|f| require f}
|
9
|
+
|
10
|
+
RSpec.configure do |config|
|
11
|
+
# some (optional) config here
|
12
|
+
end
|
File without changes
|
metadata
ADDED
@@ -0,0 +1,124 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: releaser
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Dmitriy Kiriyenko
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-11-18 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rspec
|
16
|
+
requirement: &2160508780 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *2160508780
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rake
|
27
|
+
requirement: &2160507760 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *2160507760
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: thor
|
38
|
+
requirement: &2160506980 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
type: :runtime
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *2160506980
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: activesupport
|
49
|
+
requirement: &2160505660 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :runtime
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *2160505660
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: railties
|
60
|
+
requirement: &2160504880 !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
66
|
+
type: :runtime
|
67
|
+
prerelease: false
|
68
|
+
version_requirements: *2160504880
|
69
|
+
description: ! "A set of thor scripts for managing application versions.\n Use
|
70
|
+
it to control and even display your application current version."
|
71
|
+
email:
|
72
|
+
- dmitriy.kiriyenko@anahoret.com
|
73
|
+
executables:
|
74
|
+
- releaser
|
75
|
+
extensions: []
|
76
|
+
extra_rdoc_files: []
|
77
|
+
files:
|
78
|
+
- .gitignore
|
79
|
+
- .rspec
|
80
|
+
- Gemfile
|
81
|
+
- Rakefile
|
82
|
+
- bin/releaser
|
83
|
+
- lib/releaser.rb
|
84
|
+
- lib/releaser/cli.rb
|
85
|
+
- lib/releaser/revision.rb
|
86
|
+
- lib/releaser/version.rb
|
87
|
+
- releaser.gemspec
|
88
|
+
- spec/lib/releaser/revision_spec.rb
|
89
|
+
- spec/spec_helper.rb
|
90
|
+
- spec/support/.gitkeep
|
91
|
+
homepage: ''
|
92
|
+
licenses: []
|
93
|
+
post_install_message:
|
94
|
+
rdoc_options: []
|
95
|
+
require_paths:
|
96
|
+
- lib
|
97
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
98
|
+
none: false
|
99
|
+
requirements:
|
100
|
+
- - ! '>='
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '0'
|
103
|
+
segments:
|
104
|
+
- 0
|
105
|
+
hash: -2611041167600780001
|
106
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
107
|
+
none: false
|
108
|
+
requirements:
|
109
|
+
- - ! '>='
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '0'
|
112
|
+
segments:
|
113
|
+
- 0
|
114
|
+
hash: -2611041167600780001
|
115
|
+
requirements: []
|
116
|
+
rubyforge_project: releaser
|
117
|
+
rubygems_version: 1.8.6
|
118
|
+
signing_key:
|
119
|
+
specification_version: 3
|
120
|
+
summary: A set of thor scripts for managing application versions
|
121
|
+
test_files:
|
122
|
+
- spec/lib/releaser/revision_spec.rb
|
123
|
+
- spec/spec_helper.rb
|
124
|
+
- spec/support/.gitkeep
|