versus 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.
Files changed (42) hide show
  1. data/.index +45 -0
  2. data/.yardopts +7 -0
  3. data/HISTORY.md +11 -0
  4. data/Index.yml +37 -0
  5. data/LICENSE.txt +23 -0
  6. data/README.md +46 -0
  7. data/demo/applique/ae.rb +5 -0
  8. data/demo/applique/main.rb +1 -0
  9. data/demo/constraint/02_initialize.md +44 -0
  10. data/demo/constraint/04_to_proc.md +11 -0
  11. data/demo/constraint/09_to_gem_version.md +10 -0
  12. data/demo/number/02_initialize.md +14 -0
  13. data/demo/number/03_parse.md +23 -0
  14. data/demo/number/04_crush.md +17 -0
  15. data/demo/number/05_build.md +23 -0
  16. data/demo/number/06_cmp.md +100 -0
  17. data/demo/number/07_segments.md +51 -0
  18. data/demo/number/08_bump.md +46 -0
  19. data/demo/number/09_stable_release.md +23 -0
  20. data/demo/number/10_prerelease.md +19 -0
  21. data/demo/number/11_release_candidate.md +15 -0
  22. data/demo/number/19_match.md +10 -0
  23. data/demo/number/20_to_str.md +13 -0
  24. data/demo/resolver/01_initialize.md +23 -0
  25. data/demo/resolver/02_add.md +11 -0
  26. data/demo/resolver/03_libraries.md +24 -0
  27. data/demo/resolver/04_requirements.md +13 -0
  28. data/demo/resolver/05_possibilities.md +13 -0
  29. data/demo/resolver/06_resolve.md +42 -0
  30. data/lib/versus.rb +5 -0
  31. data/lib/versus/constraint.rb +130 -0
  32. data/lib/versus/core_ext.rb +4 -0
  33. data/lib/versus/core_ext/array.rb +11 -0
  34. data/lib/versus/core_ext/kernel.rb +19 -0
  35. data/lib/versus/core_ext/string.rb +10 -0
  36. data/lib/versus/exceptions.rb +8 -0
  37. data/lib/versus/file.rb +157 -0
  38. data/lib/versus/file/jeweler_format.rb +49 -0
  39. data/lib/versus/file/plain_format.rb +39 -0
  40. data/lib/versus/number.rb +516 -0
  41. data/lib/versus/resolver.rb +303 -0
  42. metadata +124 -0
data/.index ADDED
@@ -0,0 +1,45 @@
1
+ ---
2
+ type: ruby
3
+ revision: 2013
4
+ sources:
5
+ - Index.yml
6
+ authors:
7
+ - name: trans
8
+ email: transfire@gmail.com
9
+ - name: postmodern
10
+ website: http://trans.github.com
11
+ organizations: []
12
+ requirements:
13
+ - groups:
14
+ - test
15
+ development: true
16
+ name: qed
17
+ - groups:
18
+ - test
19
+ development: true
20
+ name: ae
21
+ conflicts: []
22
+ alternatives: []
23
+ resources:
24
+ - type: homepage
25
+ uri: http://dotruby.github.com
26
+ label: Homepage
27
+ - type: source
28
+ uri: http://github.com/dotruby/version
29
+ label: Source Code
30
+ repositories: []
31
+ categories: []
32
+ paths:
33
+ load:
34
+ - lib
35
+ copyrights:
36
+ - holder: Rubyworks
37
+ year: 2011
38
+ license: BSD-2-Clause
39
+ name: versus
40
+ title: Versus
41
+ version: 0.1.0
42
+ summary: Best-of-breed Version Class Library
43
+ description: The Versus gem provides a solid Version class along with supporting functionality,
44
+ such as version constratints and version dependency resolution.
45
+ date: '2013-01-05'
@@ -0,0 +1,7 @@
1
+ --title Versus
2
+ --output-dir doc
3
+ --private
4
+ --protected
5
+ lib/
6
+ -
7
+ [A-Z]*.md
@@ -0,0 +1,11 @@
1
+ # RELEASE HISTORY
2
+
3
+ ## 0.1.0 / 2013-01-05
4
+
5
+ While the code is beening sitting around on my hard drive for nearly
6
+ a year, finally, yes finally, we have settled on a gem name to release
7
+ it under.
8
+
9
+ Changes:
10
+
11
+ * Finally a first release.
@@ -0,0 +1,37 @@
1
+ ---
2
+ name:
3
+ versus
4
+
5
+ version:
6
+ 0.1.0
7
+
8
+ title:
9
+ Versus
10
+
11
+ summary:
12
+ Best-of-breed Version Class Library
13
+
14
+ description:
15
+ The Versus gem provides a solid Version class along with supporting
16
+ functionality, such as version constratints and version dependency
17
+ resolution.
18
+
19
+ requirements:
20
+ - qed (test)
21
+ - ae (test)
22
+
23
+ authors:
24
+ - name: trans
25
+ email: transfire@gmail.com
26
+ - name: postmodern
27
+ website: 'http://trans.github.com'
28
+
29
+ resources:
30
+ homepage: http://dotruby.github.com
31
+ source: http://github.com/dotruby/version
32
+
33
+ copyrights:
34
+ - year: 2011
35
+ holder: Rubyworks
36
+ license: BSD-2-Clause
37
+
@@ -0,0 +1,23 @@
1
+ BSD-2-Clause License
2
+
3
+ Redistribution and use in source and binary forms, with or without
4
+ modification, are permitted provided that the following conditions are met:
5
+
6
+ 1. Redistributions of source code must retain the above copyright notice,
7
+ this list of conditions and the following disclaimer.
8
+
9
+ 2. Redistributions in binary form must reproduce the above copyright
10
+ notice, this list of conditions and the following disclaimer in the
11
+ documentation and/or other materials provided with the distribution.
12
+
13
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
14
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
15
+ FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
16
+ COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
17
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
18
+ NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
19
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
20
+ OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
21
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
22
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23
+
@@ -0,0 +1,46 @@
1
+ [Homepage](http://rubyworks.github.com/versus) /
2
+ [Report Issue](http://github.com/rubyworks/versus) /
3
+ [Source Code](http://github.com/rubyworks/versus)
4
+ ( )
5
+
6
+
7
+ # [Versus](http://rubyworks.github.com/versus)
8
+
9
+ *A Best-of-Breed Version Class Library*
10
+
11
+ The Versus gem is a best-of-breed Version class library, providing classes
12
+ for a number of version related requirements, form `Version::Number` to
13
+ `Version::Resolution`.
14
+
15
+
16
+ ## Overview
17
+
18
+ The primary class of the Versus gem is the `Version::Number` class. It does
19
+ exactly what one would expect, by taking a version literal and giving it a
20
+ versitle interface to query and manipulate.
21
+
22
+ ```ruby
23
+ v = Version::Number.new('1.2.0')
24
+ v.major #=> 1
25
+ v.minor #=> 2
26
+ v.patch #=> 0
27
+ ```
28
+
29
+
30
+ ## Documentation
31
+
32
+ Versus uses QED to provided tested [demonstrations](http://). This provides a end-user
33
+ acceptance testing while also providing very readable documentation.
34
+
35
+ For API documentation checkout the YARD generated docs at [RubyDoc.Info](http://rubydoc.info/gems/versus/frames).
36
+
37
+
38
+ ## Copyrights
39
+
40
+ Versus is copyrighted open source software.
41
+
42
+ Copyright 2011 Rubyworks
43
+
44
+ Versus can be modified and redistributed in accordance with the
45
+ [BSD-2-Clause](http://spdx.org/licenses/bsd-2-clause) License.
46
+
@@ -0,0 +1,5 @@
1
+ require 'ae'
2
+ require 'ae/should'
3
+ require 'ae/check'
4
+
5
+ include AE::Check
@@ -0,0 +1 @@
1
+ require 'versus'
@@ -0,0 +1,44 @@
1
+ ## Version::Constraint#initialize
2
+
3
+ The Constraint class models a single version equality
4
+ or inequality. It consists of the operator and the version
5
+ number.
6
+
7
+ c = Version::Constraint.new(['>=', '1.0'])
8
+
9
+ c.operator == '>='
10
+ c.number == '1.0'
11
+
12
+ ### Using []
13
+
14
+ c = Version::Constraint['>=', '1.0']
15
+
16
+ c.operator == '>='
17
+ c.number == '1.0'
18
+
19
+ ### String Parsing
20
+
21
+ The constraint constructor can also parse strings.
22
+
23
+ check do |mp|
24
+ mp.each do |str, (op, num)|
25
+ c = Version::Constraint.new(str)
26
+ c.operator.should == op
27
+ c.number.to_s.should == num
28
+ end
29
+ end
30
+
31
+ ok '1.2.3' => ['==', '1.2.3']
32
+ ok '= 4.6.2' => ['==', '4.6.2']
33
+ ok '== 5.1.1' => ['==', '5.1.1']
34
+ ok '>= 2.3.4' => ['>=', '2.3.4']
35
+ ok '> 3.4.5' => ['>', '3.4.5']
36
+ ok '<= 2.3.4' => ['<=', '2.3.4']
37
+ ok '< 3.4.5' => ['<', '3.4.5']
38
+
39
+ Suffix notations are also parsable.
40
+
41
+ ok '1.2+' => ['>=', '1.2']
42
+ ok '1.3-' => ['<' , '1.3']
43
+ ok '2.8~' => ['=~', '2.8']
44
+
@@ -0,0 +1,11 @@
1
+ ## Version::Constraint#to_proc
2
+
3
+ A version constraint object can be converter into a Proc object
4
+ for making version comparisions.
5
+
6
+ cv = Version::Constraint['>', '1.0.0']
7
+ cp = cv.to_proc
8
+
9
+ cp.call('1.1.1') #=> true
10
+
11
+
@@ -0,0 +1,10 @@
1
+ ## Version#to_gem_version
2
+
3
+ Since RubyGems supporst a more limited version constrain format, the
4
+ Constraint class provides the `#to_gem_version` method to produce
5
+ a string representation of the constraint that RubyGems can understand.
6
+
7
+ version = Version::Constraint.parse('1.2~')
8
+
9
+ version.to_gem_version.should == "~> 1.2"
10
+
@@ -0,0 +1,14 @@
1
+ ## Version::Number#initialize
2
+
3
+ A version number is composed of segments.
4
+
5
+ v = Version::Number.new(1,2,3,'alpha',4)
6
+
7
+ There a few alternative initializers. The most consice is [].
8
+
9
+ v = Version::Number[1,2,3,'beta',4]
10
+
11
+ The #new constructor can also take a string representation of the version.
12
+
13
+ v = Version::Number.new('1.2.3rc1')
14
+
@@ -0,0 +1,23 @@
1
+ ## Version::Number.parse
2
+
3
+ The `parse` method ...
4
+
5
+ A String
6
+
7
+ v = Version::Number.parse('1.2.3')
8
+
9
+ v.to_s.assert == '1.2.3'
10
+
11
+ An Array
12
+
13
+ v = Version::Number.parse([1,2,3])
14
+
15
+ v.to_s.assert == '1.2.3'
16
+
17
+ Another Version::Number object
18
+
19
+ v1 = Version::Number.parse('2.5.6')
20
+ v2 = Version::Number.parse(v1)
21
+
22
+ v2.to_s.assert == '2.5.6'
23
+
@@ -0,0 +1,17 @@
1
+ ## Version::Number#crush?
2
+
3
+ A version can be represented as a string in one of two ways --either
4
+ as a strict point seprated tuple or *crushed* where string segements
5
+ are merged with the following numerical segement.
6
+
7
+ The Version::Number class will automatically reqcognize a *crushed*
8
+ version if a segment of the version tuple is provided as such.
9
+
10
+ v = Version::Number.new(1,2,3,'alpha4')
11
+
12
+ v.assert.crush?
13
+
14
+ The output result of a crushed version.
15
+
16
+ v.to_s.assert == '1.2.3alpha4'
17
+
@@ -0,0 +1,23 @@
1
+ ## Version::Number#build
2
+
3
+ The `build` method ...
4
+
5
+ v = Version::Number[1,2,3]
6
+
7
+ v.build.should == nil
8
+
9
+
10
+ v = Version::Number[1,2,3,'pre']
11
+
12
+ v.build.should == 'pre'
13
+
14
+
15
+ v = Version::Number[1,2,3,'pre',2]
16
+
17
+ v.build.should == 'pre.2'
18
+
19
+
20
+ v = Version::Number[1,2,3,'20101020']
21
+
22
+ v.build.should == '20101020'
23
+
@@ -0,0 +1,100 @@
1
+ ## Version::Number#<=>
2
+
3
+ The inclusion of Comparable mixin into the Version class
4
+ along with the definition of #<=>, provides the class with
5
+ all the common inequality methods.
6
+
7
+ ### Equality
8
+
9
+ check do |n1, n2|
10
+ v1 = Version::Number.parse(n1)
11
+ v2 = Version::Number.parse(n2)
12
+ v1 == v2
13
+ end
14
+
15
+ ok '1.0.0', '1.0.0'
16
+ ok '1.0.0', '1.0'
17
+
18
+ ### Greater-Than
19
+
20
+ check do |n1, n2|
21
+ v1 = Version::Number.parse(n1)
22
+ v2 = Version::Number.parse(n2)
23
+ v1 > v2
24
+ end
25
+
26
+ ok '1.0.1', '1.0.0'
27
+ ok '1.1.0', '1.0.0'
28
+ ok '2.0.0', '1.0.0'
29
+ ok '1.1', '1.0.0'
30
+ ok '1.0.0', '1.0.0.rc.3'
31
+
32
+ no '1.0.0', '1.0.0'
33
+
34
+ ### Less-Than
35
+
36
+ check do |n1, n2|
37
+ v1 = Version::Number.parse(n1)
38
+ v2 = Version::Number.parse(n2)
39
+ v1 < v2
40
+ end
41
+
42
+ ok '1.0.1', '1.0.2'
43
+ ok '1.1.0', '1.2.0'
44
+ ok '2.0.0', '2.1.0'
45
+ ok '1.2.3', '2.0.0'
46
+ ok '1.2.3', '2.0'
47
+ ok '1.1', '1.2.0'
48
+ ok '1.0.0.rc.2', '1.0.0'
49
+
50
+ no '1.0.0', '1.0.0'
51
+
52
+ ### Greater-Than-Or-Equal
53
+
54
+ check do |n1, n2|
55
+ v1 = Version::Number.parse(n1)
56
+ v2 = Version::Number.parse(n2)
57
+ v1 >= v2
58
+ end
59
+
60
+ ok '1.0.1', '1.0.0'
61
+ ok '1.1.0', '1.0.0'
62
+ ok '2.0.0', '1.0.0'
63
+ ok '1.1', '1.0.0'
64
+ ok '1.0.0', '1.0.0.rc.3'
65
+ ok '1.0.0', '1.0.0'
66
+
67
+ ### Less-Than-Or-Equal
68
+
69
+ check do |n1, n2|
70
+ v1 = Version::Number.parse(n1)
71
+ v2 = Version::Number.parse(n2)
72
+ v1 <= v2
73
+ end
74
+
75
+ ok '1.0.1', '1.0.2'
76
+ ok '1.1.0', '1.2.0'
77
+ ok '2.0.0', '2.1.0'
78
+ ok '1.1', '1.2.0'
79
+ ok '1.0.0', '1.0.0'
80
+
81
+ ok '1.0.0.rc.2', '1.0.0'
82
+
83
+ ### Approximate Constraint
84
+
85
+ check do |n1, n2|
86
+ v1 = Version::Number.parse(n1)
87
+ v2 = Version::Number.parse(n2)
88
+ v1 =~ v2
89
+ end
90
+
91
+ ok '1.0.0', '1.0'
92
+ ok '1.0.2', '1.0'
93
+ ok '2.1.1', '2.1'
94
+
95
+ no '1.1.0', '1.2.0'
96
+ no '1.1.0', '2.0'
97
+
98
+ # TODO: Should this be ok ?
99
+ no '1.0.0.rc.2', '1.0'
100
+
@@ -0,0 +1,51 @@
1
+ ## Version::Number Segments
2
+
3
+ A version number is divided up into segements, or *points*.
4
+ Some of the points have names. THe first three are widely known
5
+ as the *major*, *minor* and *patch* numbers, respectively.
6
+
7
+ v = Version::Number[1,2,3]
8
+
9
+ v.major.assert == 1
10
+ v.minor.assert == 2
11
+ v.patch.assert == 3
12
+
13
+ The Version::Number class also recognizes state, or status.
14
+
15
+ v = Version::Number[1,2,3,'beta',4]
16
+
17
+ v.state.assert == 'beta'
18
+ v.status.assert == 'beta'
19
+
20
+ From the state on is considered the *build* portion of the version.
21
+
22
+ v.build.assert == 'beta.4'
23
+
24
+ The *build number* is the number directly following the state.
25
+
26
+ v.build_number.assert == 4
27
+
28
+ While it is not recommended, technically the Version::Number class
29
+ can handle an arbitrarily long tuple.
30
+
31
+ v = Version::Number[1,2,3,4,5,6,'beta',7]
32
+
33
+ v.major.assert == 1
34
+ v.minor.assert == 2
35
+ v.patch.assert == 3
36
+
37
+ v.state.assert == 'beta'
38
+
39
+ However, there are no recognized names for the segments between
40
+ the third, patch entry and the state entry.
41
+
42
+ Short version can also be used.
43
+
44
+ v = Version::Number[1,'rc',7]
45
+
46
+ v.major.assert == 1
47
+ v.minor.assert == nil
48
+ v.patch.assert == nil
49
+
50
+ v.state.assert == 'rc'
51
+