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 ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/00notes.md ADDED
@@ -0,0 +1,5 @@
1
+ # Notes
2
+
3
+ Best practices for making gems: <http://weblog.rubyonrails.org/2009/9/1/gem-packaging-best-practices>
4
+
5
+
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in semverstringer.gemspec
4
+ gemspec
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,3 @@
1
+ module SemverStringer
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,6 @@
1
+ require "semver_stringer/version"
2
+ require "semver_stringer/semver"
3
+
4
+ module SemverStringer
5
+ # Your code goes here...
6
+ end
@@ -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
@@ -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