semver_stringer 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/.gitignore +4 -0
- data/00notes.md +5 -0
- data/Gemfile +4 -0
- data/README.md +24 -0
- data/Rakefile +1 -0
- data/lib/semver_stringer/semver.rb +78 -0
- data/lib/semver_stringer/version.rb +3 -0
- data/lib/semver_stringer.rb +6 -0
- data/semver_stringer.gemspec +26 -0
- data/spec/semver_spec.rb +106 -0
- metadata +68 -0
data/.gitignore
ADDED
data/00notes.md
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# SemverStringer #
|
2
|
+
|
3
|
+
Gives you a little help with your [semver](http://semver.org/) strings.
|
4
|
+
|
5
|
+
## Usage
|
6
|
+
|
7
|
+
require 'semver_stringer'
|
8
|
+
|
9
|
+
semver = SemverStringer::Semver.new
|
10
|
+
semver.to_s # => "0.0.1"
|
11
|
+
|
12
|
+
version_info = {
|
13
|
+
:major=>2, # integer, >= 0
|
14
|
+
:minor=>1, # integer, >= 0
|
15
|
+
:patch=>13, # integer, >= 0
|
16
|
+
:pre=>["alpha", 1], # string ([A-Za-z0-9-]*), integer >=0, or list of these
|
17
|
+
:build=>2134 # string ([A-Za-z0-9-]*), integer >=0, or list of these
|
18
|
+
}
|
19
|
+
semver = SemverStringer::Semver.new version_info
|
20
|
+
semver.to_s # => "2.1.13-alpha.1+2134"
|
21
|
+
|
22
|
+
## TODO
|
23
|
+
|
24
|
+
* Comparison operators to implement the ordering as laid out in the semver spec.
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
@@ -0,0 +1,78 @@
|
|
1
|
+
module SemverStringer
|
2
|
+
class Semver
|
3
|
+
|
4
|
+
def initialize(params={})
|
5
|
+
@major, @minor, @patch = get_version_numbers_from params
|
6
|
+
@build = get_build_string_from params
|
7
|
+
@pre = get_pre_string_from params
|
8
|
+
end
|
9
|
+
|
10
|
+
def to_s
|
11
|
+
version = "#{@major}.#{@minor}.#{@patch}"
|
12
|
+
version << "-#{@pre}" unless @pre == nil
|
13
|
+
version << "+#{@build}" unless @build == nil
|
14
|
+
version
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
def raise_if_invalid_version_number(hash, key)
|
19
|
+
if hash.has_key? key
|
20
|
+
raise ArgumentError.new("Positive integers only") if hash[key] < 0
|
21
|
+
raise ArgumentError.new("Integral numbers only") if ! hash[key].integer?
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
def get_valid_version_number(hash, key)
|
27
|
+
raise_if_invalid_version_number(hash, key)
|
28
|
+
(hash.has_key? key) ? hash[key] : 0
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
def get_version_numbers_from(params)
|
33
|
+
if (params.has_key? :major) || (params.has_key? :minor) || (params.has_key? :patch)
|
34
|
+
major = get_valid_version_number(params, :major)
|
35
|
+
minor = get_valid_version_number(params, :minor)
|
36
|
+
patch = get_valid_version_number(params, :patch)
|
37
|
+
else
|
38
|
+
major = minor = 0
|
39
|
+
patch = 1
|
40
|
+
end
|
41
|
+
|
42
|
+
[major, minor, patch]
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
def get_pre_string_from(params)
|
47
|
+
return get_optional_string_from params, :pre
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
def get_build_string_from(params)
|
52
|
+
return get_optional_string_from params, :build
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
def get_optional_string_from(params, type)
|
57
|
+
disallowed_chars = /[^0-9A-Za-z-]/
|
58
|
+
|
59
|
+
if params.has_key? type
|
60
|
+
identifiers = scalar_to_array params[type]
|
61
|
+
|
62
|
+
identifiers.each do |param|
|
63
|
+
raise ArgumentError.new("Characters in #{type} ID are not allowed") if disallowed_chars.match param.to_s
|
64
|
+
end
|
65
|
+
|
66
|
+
return identifiers.join "."
|
67
|
+
else
|
68
|
+
return nil
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
def scalar_to_array(scalar)
|
74
|
+
(scalar.is_a? Array) ? scalar : Array.new(1, scalar)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "semver_stringer/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "semver_stringer"
|
7
|
+
s.version = SemverStringer::VERSION
|
8
|
+
s.authors = ["Ian Truslove"]
|
9
|
+
s.email = ["ian.truslove@gmail.com"]
|
10
|
+
s.homepage = "https://github.com/iantruslove/SemverStringer"
|
11
|
+
s.summary = %q{Makes nice strings for your SemVer needs}
|
12
|
+
s.description = %q{See semver.org for the rules, or https://github.com/iantruslove/SemverStringer#readme for a little documentation.}
|
13
|
+
|
14
|
+
# s.rubyforge_project = "semverstringer"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
# specify any dependencies here; for example:
|
22
|
+
# s.add_development_dependency "rspec"
|
23
|
+
# s.add_runtime_dependency "rest-client"
|
24
|
+
|
25
|
+
s.add_development_dependency "rspec", "~> 2.8"
|
26
|
+
end
|
data/spec/semver_spec.rb
ADDED
@@ -0,0 +1,106 @@
|
|
1
|
+
require 'semver_stringer/semver'
|
2
|
+
|
3
|
+
describe SemverStringer::Semver do
|
4
|
+
describe "parameterless construction" do
|
5
|
+
it "can be initialized with no parameters" do
|
6
|
+
semver = SemverStringer::Semver.new
|
7
|
+
end
|
8
|
+
|
9
|
+
it "will output a default version string of 0.0.1" do
|
10
|
+
semver = SemverStringer::Semver.new
|
11
|
+
semver.to_s.should == "0.0.1"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "parameterized construction" do
|
16
|
+
it "can be constructed with integer parameter for major version" do
|
17
|
+
semver = SemverStringer::Semver.new :major => 1
|
18
|
+
semver.to_s.should == "1.0.0"
|
19
|
+
end
|
20
|
+
|
21
|
+
it "can be constructed with integer parameter for minor version" do
|
22
|
+
semver = SemverStringer::Semver.new :minor => 2
|
23
|
+
semver.to_s.should == "0.2.0"
|
24
|
+
end
|
25
|
+
|
26
|
+
it "can be constructed with integer parameter for patch version" do
|
27
|
+
semver = SemverStringer::Semver.new :patch => 23
|
28
|
+
semver.to_s.should == "0.0.23"
|
29
|
+
end
|
30
|
+
|
31
|
+
it "can be constructed with combinations of major, minor and patch versions" do
|
32
|
+
semver = SemverStringer::Semver.new :major=>2, :minor=>4, :patch=>20
|
33
|
+
semver.to_s.should == "2.4.20"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "invalid initialization values" do
|
38
|
+
it "should only allow positive version number components" do
|
39
|
+
lambda { SemverStringer::Semver.new :minor=>-1 }.should raise_error(ArgumentError)
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should only allow numeric version number components" do
|
43
|
+
lambda { SemverStringer::Semver.new :minor=>"a" }.should raise_error(ArgumentError)
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should only allow integral version number components" do
|
47
|
+
lambda { SemverStringer::Semver.new :minor=>1.2 }.should raise_error(ArgumentError)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe "optional pre-release identifier" do
|
52
|
+
it "can take an integer pre-release identifier" do
|
53
|
+
semver = SemverStringer::Semver.new :pre=>1
|
54
|
+
semver.to_s.should == "0.0.1-1"
|
55
|
+
end
|
56
|
+
|
57
|
+
it "can take alphanumeric pre-release id" do
|
58
|
+
semver = SemverStringer::Semver.new :major=>2, :pre=>"alpha"
|
59
|
+
semver.to_s.should == "2.0.0-alpha"
|
60
|
+
end
|
61
|
+
|
62
|
+
it "can accept a list of pre-release identifiers" do
|
63
|
+
semver = SemverStringer::Semver.new :minor=>1, :pre=>["rc", 2, 20100401113022]
|
64
|
+
semver.to_s.should == "0.1.0-rc.2.20100401113022"
|
65
|
+
end
|
66
|
+
|
67
|
+
it "will not allow disallowed characters for the pre-relase id" do
|
68
|
+
lambda { SemverStringer::Semver.new :pre=>"period.is.forbidden" }.should raise_error(ArgumentError)
|
69
|
+
lambda { SemverStringer::Semver.new :pre=>"underscore_is_forbidden" }.should raise_error(ArgumentError)
|
70
|
+
lambda { SemverStringer::Semver.new :pre=>"special$chars@not*allowed!" }.should raise_error(ArgumentError)
|
71
|
+
lambda { SemverStringer::Semver.new :pre=>["or", "in", "arrays!!!"] }.should raise_error(ArgumentError)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
describe "optional build identifier" do
|
76
|
+
it "can take an integer build id" do
|
77
|
+
semver = SemverStringer::Semver.new :major=>2, :build=>1234
|
78
|
+
semver.to_s.should == "2.0.0+1234"
|
79
|
+
end
|
80
|
+
|
81
|
+
it "can take alphanumeric build id" do
|
82
|
+
semver = SemverStringer::Semver.new :build=>"AaBb-123"
|
83
|
+
semver.to_s.should == "0.0.1+AaBb-123"
|
84
|
+
end
|
85
|
+
|
86
|
+
it "can accept a list of build identifiers" do
|
87
|
+
semver = SemverStringer::Semver.new :patch=>3, :build=>["build", 1, "aA", "2"]
|
88
|
+
semver.to_s.should == "0.0.3+build.1.aA.2"
|
89
|
+
end
|
90
|
+
|
91
|
+
it "will not allow disallowed characters" do
|
92
|
+
lambda { SemverStringer::Semver.new :build=>"period.is.forbidden" }.should raise_error(ArgumentError)
|
93
|
+
lambda { SemverStringer::Semver.new :build=>"underscore_is_forbidden" }.should raise_error(ArgumentError)
|
94
|
+
lambda { SemverStringer::Semver.new :build=>"special$chars@not*allowed!" }.should raise_error(ArgumentError)
|
95
|
+
lambda { SemverStringer::Semver.new :build=>["or", "in", "arrays!!!"] }.should raise_error(ArgumentError)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
describe "the full semver kitchen sink" do
|
100
|
+
it "supports any combination of major, minor, patch, pre-release and build identifiers" do
|
101
|
+
options = { :major=>1, :minor=>2, :patch=>303, :pre=>"beta", :build=>["build",1234] }
|
102
|
+
semver = SemverStringer::Semver.new options
|
103
|
+
semver.to_s.should == "1.2.303-beta+build.1234"
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
metadata
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: semver_stringer
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Ian Truslove
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-02-24 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rspec
|
16
|
+
requirement: &70208392024840 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '2.8'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70208392024840
|
25
|
+
description: See semver.org for the rules, or https://github.com/iantruslove/SemverStringer#readme
|
26
|
+
for a little documentation.
|
27
|
+
email:
|
28
|
+
- ian.truslove@gmail.com
|
29
|
+
executables: []
|
30
|
+
extensions: []
|
31
|
+
extra_rdoc_files: []
|
32
|
+
files:
|
33
|
+
- .gitignore
|
34
|
+
- 00notes.md
|
35
|
+
- Gemfile
|
36
|
+
- README.md
|
37
|
+
- Rakefile
|
38
|
+
- lib/semver_stringer.rb
|
39
|
+
- lib/semver_stringer/semver.rb
|
40
|
+
- lib/semver_stringer/version.rb
|
41
|
+
- semver_stringer.gemspec
|
42
|
+
- spec/semver_spec.rb
|
43
|
+
homepage: https://github.com/iantruslove/SemverStringer
|
44
|
+
licenses: []
|
45
|
+
post_install_message:
|
46
|
+
rdoc_options: []
|
47
|
+
require_paths:
|
48
|
+
- lib
|
49
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
56
|
+
none: false
|
57
|
+
requirements:
|
58
|
+
- - ! '>='
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0'
|
61
|
+
requirements: []
|
62
|
+
rubyforge_project:
|
63
|
+
rubygems_version: 1.8.15
|
64
|
+
signing_key:
|
65
|
+
specification_version: 3
|
66
|
+
summary: Makes nice strings for your SemVer needs
|
67
|
+
test_files:
|
68
|
+
- spec/semver_spec.rb
|