versionary 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +7 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +27 -0
- data/README.md +30 -0
- data/Rakefile +35 -0
- data/cucumber.yml +6 -0
- data/lib/versionary/version_number.rb +72 -0
- data/rake/audit_tasks/you_need_our_dependency_manager.rb +16 -0
- data/rake/audit_tasks/you_need_the_right_ruby_version.rb +20 -0
- data/rake/audit_tasks/you_need_to_install_any_dependencies.rb +11 -0
- data/rake/required_audits.rb +3 -0
- data/rake/testing_tasks/check_features_with_cucumber.rb +18 -0
- data/rake/testing_tasks/check_internals_with_rspec.rb +20 -0
- data/spec/versionary/version_number_spec.rb +100 -0
- metadata +128 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
versionary (0.1.0)
|
5
|
+
|
6
|
+
GEM
|
7
|
+
remote: http://rubygems.org/
|
8
|
+
specs:
|
9
|
+
diff-lcs (1.1.2)
|
10
|
+
rake (0.8.7)
|
11
|
+
rspec (2.6.0)
|
12
|
+
rspec-core (~> 2.6.0)
|
13
|
+
rspec-expectations (~> 2.6.0)
|
14
|
+
rspec-mocks (~> 2.6.0)
|
15
|
+
rspec-core (2.6.4)
|
16
|
+
rspec-expectations (2.6.0)
|
17
|
+
diff-lcs (~> 1.1.2)
|
18
|
+
rspec-mocks (2.6.0)
|
19
|
+
|
20
|
+
PLATFORMS
|
21
|
+
ruby
|
22
|
+
|
23
|
+
DEPENDENCIES
|
24
|
+
bundler (~> 1.0.0)
|
25
|
+
rake (~> 0.8.7)
|
26
|
+
rspec (>= 2.5.0)
|
27
|
+
versionary!
|
data/README.md
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
# Versionary - a simple gem that allows you to compare version numbers
|
2
|
+
|
3
|
+
This was extracted from the [RiverGlide ruby template project](https://github.com/RiverGlide/ruby_project_template)
|
4
|
+
|
5
|
+
## Synopsis
|
6
|
+
|
7
|
+
A simple, comparable, [rational](http://docs.rubygems.org/read/chapter/7), version number object.
|
8
|
+
|
9
|
+
Allows you to do things like this:
|
10
|
+
|
11
|
+
raise "not the right version" unless VersionNumber.of( RUBY_VERSION ) >= VersionNumber.of( '1.9'2' )
|
12
|
+
raise "not the right version" unless VersionNumber.of( RUBY_VERSION ) >= '1.9.2'
|
13
|
+
|
14
|
+
Or any other comparison between any VersionNumber you create:
|
15
|
+
|
16
|
+
VersionNumber.of( '0.9.10' ) > '0.9.9'
|
17
|
+
VersionNumber.of( '0.9.9' ) < '0.9.10'
|
18
|
+
VersionNumber.of( '0.9.10' ) >= '0.9.9'
|
19
|
+
VersionNumber.of( '0.9.10' ) == '0.9.10'
|
20
|
+
|
21
|
+
As you can see, it does a numerical (rather than alphabetical) comparison of the major, minor and build numbers.
|
22
|
+
|
23
|
+
It doesn't do version bumping or anything like that - but if you want to to, fork it, branch, add that ability and send us a pull request :-)
|
24
|
+
|
25
|
+
## Usage
|
26
|
+
|
27
|
+
If you're using bundler, reference the gem in your Gemfile or gemspec as a runtime dependency and bundler will do the rest...
|
28
|
+
Or, `gem install versionary` and then:
|
29
|
+
|
30
|
+
require 'versionary/version_number'
|
data/Rakefile
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
puts "\n ** RiverGlide.com - flow without friction **\n"
|
2
|
+
|
3
|
+
ENV[ 'MINIMUM_RUBY_VERSION' ] = '1.8.7'
|
4
|
+
|
5
|
+
require './rake/required_audits'
|
6
|
+
desc "Make sure your environment is ready"
|
7
|
+
task :environment_ready => [
|
8
|
+
:you_need_the_right_ruby_version,
|
9
|
+
:you_need_our_dependency_manager,
|
10
|
+
:you_need_to_install_any_dependencies
|
11
|
+
]
|
12
|
+
|
13
|
+
begin
|
14
|
+
require 'bundler'
|
15
|
+
Bundler::GemHelper.install_tasks
|
16
|
+
rescue NameError => e
|
17
|
+
puts "This problem should get sorted out once you've completed the above instructions:\n" + e.message
|
18
|
+
end
|
19
|
+
|
20
|
+
require 'rake/rdoctask'
|
21
|
+
Rake::RDocTask.new do |rdoc|
|
22
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
23
|
+
|
24
|
+
rdoc.rdoc_dir = 'rdoc'
|
25
|
+
rdoc.title = "CukeSalad #{version}"
|
26
|
+
rdoc.rdoc_files.include('README*')
|
27
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
28
|
+
end
|
29
|
+
|
30
|
+
require './rake/testing_tasks/check_internals_with_rspec'
|
31
|
+
desc "Checks the environment and runs all tests"
|
32
|
+
task :default => [
|
33
|
+
:environment_ready,
|
34
|
+
:spec
|
35
|
+
]
|
data/cucumber.yml
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
module Versionary
|
2
|
+
class VersionNumber
|
3
|
+
|
4
|
+
include Comparable
|
5
|
+
|
6
|
+
attr_reader :major, :minor, :build
|
7
|
+
|
8
|
+
VERSION_PATTERN = /^\d+\.\d+\.\d+$/
|
9
|
+
|
10
|
+
def self.of version
|
11
|
+
self.new version
|
12
|
+
end
|
13
|
+
|
14
|
+
def initialize version
|
15
|
+
raise NotAVersionComplaint.about version if not a_recognised? version
|
16
|
+
number = infer_from version
|
17
|
+
@major = value_of :major, number
|
18
|
+
@minor = value_of :minor, number
|
19
|
+
@build = value_of :build, number
|
20
|
+
end
|
21
|
+
|
22
|
+
def <=> other_version
|
23
|
+
with_other_version = VersionNumber.of(other_version) if other_version.class == String
|
24
|
+
with_other_version = other_version if other_version.class == self.class
|
25
|
+
|
26
|
+
compare(self, with_other_version)
|
27
|
+
end
|
28
|
+
|
29
|
+
def to_s
|
30
|
+
"#{@major}.#{@minor}.#{@build}"
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
def a_recognised? version
|
35
|
+
version =~ VERSION_PATTERN
|
36
|
+
end
|
37
|
+
|
38
|
+
def infer_from version
|
39
|
+
version.split( '.' ).collect { |n| n.to_i }
|
40
|
+
end
|
41
|
+
|
42
|
+
def value_of position, from_numbers
|
43
|
+
positions = {:major => 0, :minor => 1, :build => 2}
|
44
|
+
from_numbers[positions[position]]
|
45
|
+
end
|
46
|
+
|
47
|
+
def compare first_version, second_version
|
48
|
+
differences = []
|
49
|
+
differences[0] = first_version.major <=> second_version.major
|
50
|
+
differences[1] = first_version.minor <=> second_version.minor
|
51
|
+
differences[2] = first_version.build <=> second_version.build
|
52
|
+
differences.each do |indication|
|
53
|
+
return indication if it_is_a_greater_than_or_less_than? indication
|
54
|
+
end
|
55
|
+
0
|
56
|
+
end
|
57
|
+
|
58
|
+
def it_is_a_greater_than_or_less_than? indication
|
59
|
+
indication != 0
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
class NotAVersionComplaint < Exception
|
64
|
+
def self.about version
|
65
|
+
self.new version
|
66
|
+
end
|
67
|
+
|
68
|
+
def initialize version
|
69
|
+
super "#{version} is not a recognised version number"
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
task :you_need_our_dependency_manager do
|
2
|
+
begin
|
3
|
+
require 'bundler'
|
4
|
+
puts "You have our preferred dependency manager. Cool!"
|
5
|
+
rescue LoadError => e
|
6
|
+
abort "\nOoops! You're not quite ready to start.\n" +
|
7
|
+
e.message + "\n\n" +
|
8
|
+
"We can fix this easily...\n" +
|
9
|
+
"\nAll you should need to do is run `gem install bundler`\n" +
|
10
|
+
"\nBefore you do that, we recommend that you use rvm and use a fresh gemset.\n" +
|
11
|
+
" rvm: http://beginrescueend.com/\n" +
|
12
|
+
" rvm gemsets: http://beginrescueend.com/gemsets/\n" +
|
13
|
+
" rvm creating gemsets: http://beginrescueend.com/gemsets/creating/\n" +
|
14
|
+
"\nOnce you've installed bundler into your nice new gemset, run `rake` again and we'll tell you what's next.\n\n"
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
$: << File.join(File.expand_path(File.dirname(__FILE__)), "..", "..", "lib")
|
2
|
+
require 'versionary/version_number'
|
3
|
+
|
4
|
+
task :you_need_the_right_ruby_version do
|
5
|
+
include Versionary
|
6
|
+
|
7
|
+
minimum_ruby_version = ENV[ 'MINIMUM_RUBY_VERSION' ]
|
8
|
+
|
9
|
+
with_guidance = "
|
10
|
+
Oops! You are using ruby #{RUBY_VERSION}. We really want you to use ruby #{minimum_ruby_version} or higher
|
11
|
+
Suggestion:
|
12
|
+
We like using rvm to manage our ruby versions.
|
13
|
+
That way, you can just say `rvm use #{minimum_ruby_version}` and hey presto, you're on version #{minimum_ruby_version}
|
14
|
+
rvm: http://beginrescueend.com/
|
15
|
+
Hey, it's up to you, but once you're on ruby #{minimum_ruby_version} let us know by running `rake` again.\n\n"
|
16
|
+
|
17
|
+
abort with_guidance if VersionNumber.of( RUBY_VERSION ) < minimum_ruby_version
|
18
|
+
|
19
|
+
puts "You're using ruby #{RUBY_VERSION}. We're happy about that."
|
20
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
task :you_need_to_install_any_dependencies do
|
2
|
+
begin
|
3
|
+
Bundler.setup(:default, :development)
|
4
|
+
puts "You have all the dependencies you need!!\n\n"
|
5
|
+
rescue Bundler::BundlerError => e
|
6
|
+
$stderr.puts "Oops! So near, yet so far.\n\n"
|
7
|
+
$stderr.puts e.message + "\n\n"
|
8
|
+
$stderr.puts "Run `bundle install` and all the dependencies you need will be installed\n\n"
|
9
|
+
exit e.status_code
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
begin
|
2
|
+
require 'cucumber/rake/task'
|
3
|
+
|
4
|
+
Cucumber::Rake::Task.new(:features)
|
5
|
+
|
6
|
+
additional_tasks = {
|
7
|
+
:features_wip => '-p wip',
|
8
|
+
:features_todo => '-p todo'
|
9
|
+
}
|
10
|
+
|
11
|
+
additional_tasks.each do | task_name, options |
|
12
|
+
Cucumber::Rake::Task.new(task_name) do |wip|
|
13
|
+
wip.cucumber_opts = options
|
14
|
+
end
|
15
|
+
end
|
16
|
+
rescue LoadError => e
|
17
|
+
#do_nothing - bundler will sort this out
|
18
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
begin
|
2
|
+
require 'rspec/core'
|
3
|
+
require 'rspec/core/rake_task'
|
4
|
+
|
5
|
+
file_pattern = 'spec/**/*_spec.rb'
|
6
|
+
tasks = {
|
7
|
+
:spec => "-cfd --tag ~wip --tag ~todo",
|
8
|
+
:spec_wip => "-cfd --tag @wip",
|
9
|
+
:spec_todo => "-cfd --tag @todo"
|
10
|
+
}
|
11
|
+
|
12
|
+
tasks.each do | task_name, options |
|
13
|
+
RSpec::Core::RakeTask.new(task_name) do |spec|
|
14
|
+
spec.pattern = FileList[file_pattern]
|
15
|
+
spec.rspec_opts = options
|
16
|
+
end
|
17
|
+
end
|
18
|
+
rescue LoadError => e
|
19
|
+
#do_nothing - bundler will sort this out
|
20
|
+
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
require 'versionary/version_number'
|
2
|
+
module Versionary
|
3
|
+
describe VersionNumber do
|
4
|
+
include Versionary
|
5
|
+
|
6
|
+
context "when the versions are the same" do
|
7
|
+
it "tells you they are equal" do
|
8
|
+
VersionNumber.of( RUBY_VERSION ).should == VersionNumber.of( RUBY_VERSION )
|
9
|
+
end
|
10
|
+
|
11
|
+
it "tells you that the first number is not less than second number" do
|
12
|
+
VersionNumber.of( RUBY_VERSION ).should_not < VersionNumber.of( RUBY_VERSION )
|
13
|
+
end
|
14
|
+
|
15
|
+
it "tells you that the first number is not greater than second number" do
|
16
|
+
VersionNumber.of( RUBY_VERSION ).should_not > VersionNumber.of( RUBY_VERSION )
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
[:major, :minor, :build].each do | position |
|
21
|
+
context "when the #{position} number is different" do
|
22
|
+
context "making the first version lower than the second version" do
|
23
|
+
let(:first_version) {'0.0.9'}
|
24
|
+
let(:second_version) { a_version :higher_than, first_version, position }
|
25
|
+
|
26
|
+
it "tells you that the first number is less than the second number" do
|
27
|
+
VersionNumber.of( first_version ).should < VersionNumber.of( second_version )
|
28
|
+
end
|
29
|
+
|
30
|
+
it "tells you that the first number is not greater than the second number" do
|
31
|
+
VersionNumber.of( first_version ).should_not > VersionNumber.of( second_version )
|
32
|
+
end
|
33
|
+
|
34
|
+
it "tells you that they're not equal" do
|
35
|
+
VersionNumber.of( first_version ).should_not == VersionNumber.of( second_version )
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
context "making the first version higher than the second version" do
|
40
|
+
let(:first_version) {'10.10.10'} # to ensure that digits are compared numerically, not alphabetically
|
41
|
+
let(:second_version) { a_version :lower_than, first_version, position }
|
42
|
+
|
43
|
+
it "tells you that the first number is greater than the second number" do
|
44
|
+
VersionNumber.of( first_version ).should > VersionNumber.of( second_version )
|
45
|
+
end
|
46
|
+
|
47
|
+
it "tells you that the first number is not less than the second number" do
|
48
|
+
VersionNumber.of( first_version ).should_not < VersionNumber.of( second_version )
|
49
|
+
end
|
50
|
+
|
51
|
+
it "tells you that they're not equal" do
|
52
|
+
VersionNumber.of( first_version ).should_not == VersionNumber.of( second_version )
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
context "when the latter number is a string" do
|
59
|
+
it "tells you when they're equal as version numbers" do
|
60
|
+
VersionNumber.of('1.9.2').should == '1.9.2'
|
61
|
+
end
|
62
|
+
|
63
|
+
it "tells you when the first version number is greater than a string representation" do
|
64
|
+
VersionNumber.of('1.9.10').should > '1.9.9'
|
65
|
+
end
|
66
|
+
it "tells you when the first version number is less than a string representation" do
|
67
|
+
VersionNumber.of('1.9.9').should < '1.9.10'
|
68
|
+
end
|
69
|
+
|
70
|
+
it "tells you when the number is not equal to the string representation" do
|
71
|
+
VersionNumber.of('1.9.9').should_not == '1.9.10'
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
context "when the version number provided is not understood, for example:" do
|
76
|
+
[ "1.9.a",
|
77
|
+
"v1.9.2",
|
78
|
+
"1.9.2a",
|
79
|
+
"not a version",
|
80
|
+
".1.9.2",
|
81
|
+
"1.9.2.1"
|
82
|
+
].each do | unrecognised_version |
|
83
|
+
it "can't understand '#{unrecognised_version}'" do
|
84
|
+
lambda {VersionNumber.of( unrecognised_version )}.should raise_error NotAVersionComplaint
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def a_version higher_or_lower_than, version_number, major_minor_or_build
|
90
|
+
alterations = {:higher_than => :+, :lower_than => :-}
|
91
|
+
positions = {:major => 0, :minor => 1, :build => 2 }
|
92
|
+
altered_by = alterations[higher_or_lower_than]
|
93
|
+
position = positions[major_minor_or_build]
|
94
|
+
|
95
|
+
version_numbers = version_number.split( '.' ).collect {|n| n.to_i}
|
96
|
+
version_numbers[position] = version_numbers[position].send altered_by, 1
|
97
|
+
version_numbers.join '.'
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
metadata
ADDED
@@ -0,0 +1,128 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: versionary
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 27
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 0
|
10
|
+
version: 0.1.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- RiverGlide
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-06-15 00:00:00 +01:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: bundler
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 23
|
30
|
+
segments:
|
31
|
+
- 1
|
32
|
+
- 0
|
33
|
+
- 0
|
34
|
+
version: 1.0.0
|
35
|
+
type: :development
|
36
|
+
version_requirements: *id001
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: rake
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
hash: 49
|
46
|
+
segments:
|
47
|
+
- 0
|
48
|
+
- 8
|
49
|
+
- 7
|
50
|
+
version: 0.8.7
|
51
|
+
type: :development
|
52
|
+
version_requirements: *id002
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: rspec
|
55
|
+
prerelease: false
|
56
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
hash: 27
|
62
|
+
segments:
|
63
|
+
- 2
|
64
|
+
- 5
|
65
|
+
- 0
|
66
|
+
version: 2.5.0
|
67
|
+
type: :development
|
68
|
+
version_requirements: *id003
|
69
|
+
description: "Versionary has a simple VersionNumber object that allows you to do things like `raise \"Not the right version\" unless VersionNumber.of( RUBY_VERSION ) >= '1.9.2'` "
|
70
|
+
email:
|
71
|
+
- talktous@riverglide.com
|
72
|
+
executables: []
|
73
|
+
|
74
|
+
extensions: []
|
75
|
+
|
76
|
+
extra_rdoc_files: []
|
77
|
+
|
78
|
+
files:
|
79
|
+
- .gitignore
|
80
|
+
- Gemfile
|
81
|
+
- Gemfile.lock
|
82
|
+
- README.md
|
83
|
+
- Rakefile
|
84
|
+
- cucumber.yml
|
85
|
+
- lib/versionary/version_number.rb
|
86
|
+
- rake/audit_tasks/you_need_our_dependency_manager.rb
|
87
|
+
- rake/audit_tasks/you_need_the_right_ruby_version.rb
|
88
|
+
- rake/audit_tasks/you_need_to_install_any_dependencies.rb
|
89
|
+
- rake/required_audits.rb
|
90
|
+
- rake/testing_tasks/check_features_with_cucumber.rb
|
91
|
+
- rake/testing_tasks/check_internals_with_rspec.rb
|
92
|
+
- spec/versionary/version_number_spec.rb
|
93
|
+
has_rdoc: true
|
94
|
+
homepage: https://github.com/RiverGlide/Versionary
|
95
|
+
licenses:
|
96
|
+
- MIT
|
97
|
+
post_install_message:
|
98
|
+
rdoc_options: []
|
99
|
+
|
100
|
+
require_paths:
|
101
|
+
- lib
|
102
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
103
|
+
none: false
|
104
|
+
requirements:
|
105
|
+
- - ">="
|
106
|
+
- !ruby/object:Gem::Version
|
107
|
+
hash: 3
|
108
|
+
segments:
|
109
|
+
- 0
|
110
|
+
version: "0"
|
111
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
112
|
+
none: false
|
113
|
+
requirements:
|
114
|
+
- - ">="
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
hash: 3
|
117
|
+
segments:
|
118
|
+
- 0
|
119
|
+
version: "0"
|
120
|
+
requirements: []
|
121
|
+
|
122
|
+
rubyforge_project:
|
123
|
+
rubygems_version: 1.6.2
|
124
|
+
signing_key:
|
125
|
+
specification_version: 3
|
126
|
+
summary: Simple, comparable, rational Version Number object
|
127
|
+
test_files:
|
128
|
+
- spec/versionary/version_number_spec.rb
|