library 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.
@@ -0,0 +1,8 @@
1
+ require 'library'
2
+ require 'library/kernel'
3
+
4
+ # Note the plural!!!
5
+ list = ENV['RUBYLIBS'].to_s.split(/[:;]/)
6
+
7
+ Library.prime(*list, :expound=>true)
8
+
@@ -0,0 +1,14 @@
1
+ = Load and Require
2
+
3
+ The #library method can be used to constrain a library to a particular
4
+ version.
5
+
6
+ library('tryme', '1.1')
7
+
8
+ If we try to constrain a library to an incompatible version a VersionConflit
9
+ will be raised.
10
+
11
+ expect Library::VersionConflict do
12
+ library('tryme', '1.0')
13
+ end
14
+
@@ -0,0 +1,55 @@
1
+ = Library Instances
2
+
3
+ The Library class can be initialized given the location of the project.
4
+
5
+ tryme10 = Library.new(fixtures + '/tryme/1.0')
6
+ tryme11 = Library.new(fixtures + '/tryme/1.1')
7
+
8
+ With a library instance in hand we can query it for information about itself.
9
+
10
+ tryme10.name.assert == "tryme"
11
+ tryme11.name.assert == "tryme"
12
+
13
+ tryme10.version.to_s.assert == "1.0"
14
+ tryme11.version.to_s.assert == "1.1"
15
+
16
+ Secondary information, taken from a project's .ruby file, can be queried via
17
+ the #metadata method.
18
+
19
+ tryme10.metadata['resources']['home'].assert == "http://tryme.foo"
20
+ tryme11.metadata['resources']['home'].assert == "http://tryme.foo"
21
+
22
+ Of course, the most important function of a library is to load and require
23
+ a script. With an Library instance in hand this can be achieved directly.
24
+
25
+ tryme10.load('tryme.rb')
26
+ $tryme_message.assert == "Try Me v1.0"
27
+
28
+ But if we try to load from another version, we will get a VersionConflict
29
+ error.
30
+
31
+ expect Library::VersionConflict do
32
+ tryme11.load('tryme.rb')
33
+ end
34
+
35
+ However, we can bypass this constraint (if we know what you are doing!) with
36
+ the :force option.
37
+
38
+ tryme11.load('tryme.rb', :force=>true)
39
+ $tryme_message.assert == "Try Me v1.1"
40
+
41
+ Notice that when requiring files directly via a Library instance, if a file
42
+ is required from two different versions of a library, a VersionConflict
43
+ error will be rasied.
44
+
45
+ expect Library::VersionConflict do
46
+ tryme11.require('tryme')
47
+ end
48
+
49
+ But there is no error if we use the active version.
50
+
51
+ tryme10.require('tryme')
52
+
53
+ TODO: In the future, I think we will put in a version check, and a :force
54
+ option to override.
55
+
@@ -0,0 +1,30 @@
1
+ = The Ledger
2
+
3
+ At the heart of Library lies a Ledger object. It is essentially a Hash of
4
+ library names indexing Library objects stored in the global $LEDGER variable.
5
+
6
+ $LEDGER.keys.sort.assert == ['foo', 'ruby', 'tryme']
7
+
8
+ The Library class redirects a number of calls to the $LEDGER, so we
9
+ could invoke the same methods on it instead.
10
+
11
+ Library.names.assert == $LEDGER.keys
12
+
13
+ Which we choose to use is really a matter of taste. The Roll::Library
14
+ methods were designed for readability, whereas $LEDGER is used internally.
15
+ For the rest of this demo we will use $LEDGER since this demonstration
16
+ is specifically about it.
17
+
18
+ The values of $LEDGER will always be either a Library object or an
19
+ array of Library objects, of the same name but differnt versions.
20
+
21
+ When a particular library is activated for the first time the corresponding
22
+ array value will be replaced by the library.
23
+
24
+ $LEDGER['tryme'].assert.is_a?(Array)
25
+
26
+ library('tryme')
27
+
28
+ $LEDGER['tryme'].assert.is_a?(Library)
29
+
30
+
@@ -0,0 +1,101 @@
1
+ = Version Class
2
+
3
+ Librarys has a versioj class which it uses to compare
4
+ versions via vairous constraints.
5
+
6
+ Load the library.
7
+
8
+ require 'library/version'
9
+
10
+ First, a version object will return the string representation
11
+ via #to_s.
12
+
13
+ v = Library::Version.new('1.2.3')
14
+ '1.2.3'.assert == v.to_s
15
+
16
+ It will also do this for #to_str.
17
+
18
+ v = Library::Version.new('1.2.3')
19
+ '1.2.3'.assert == v.to_str
20
+
21
+ The actual segments of a version are stored in an array.
22
+ We can access those via #[].
23
+
24
+ v = Library::Version.new('1.2.3')
25
+ 1.assert == v[0]
26
+ 2.assert == v[1]
27
+ 3.assert == v[2]
28
+
29
+ In addition certain segmetns have special names.
30
+ The first is accessible via #major.
31
+
32
+ v = Library::Version.new('1.2.3')
33
+ v.major.assert == 1
34
+
35
+ The second is accessible via #minor.
36
+
37
+ v = Library::Version.new('1.2.3')
38
+ v.minor.assert == 2
39
+
40
+ The third is accessible via #patch.
41
+
42
+ v = Library::Version.new('1.2.3')
43
+ v.patch.assert == 3
44
+
45
+ And lastly anything beyond the patch number is accessible
46
+ via #build.
47
+
48
+ v = Library::Version.new('1.2.3.pre.1')
49
+ v.build.assert == 'pre.1'
50
+
51
+ Two version can be compared with the #<=> method, which
52
+ importantly also makes lists of versions sortable.
53
+
54
+ v1 = Library::Version.new('1.2.3')
55
+ v2 = Library::Version.new('1.2.4')
56
+ (v2 <=> v1).assert == 1
57
+
58
+ While #=~ provides *pessimistic* constraint comparison.
59
+
60
+ v1 = Library::Version.new('1.2.4')
61
+ v2 = Library::Version.new('1.2')
62
+ assert(v1 =~ v2)
63
+
64
+ The Version class also provides some useful singleton methods
65
+ such as #parse_constraint. This method deciphers a comparision string.
66
+
67
+ a = Library::Version.parse_constraint("~> 1.0.0")
68
+ e = ["=~", Library::Version['1.0.0']]
69
+ a.assert == e
70
+
71
+ Equality can be written with `==` or `=`.
72
+
73
+ a = Library::Version.parse_constraint("= 0.9.0")
74
+ e = ["==", Library::Version['0.9.0']]
75
+ a.assert == e
76
+
77
+ Without an operator equality is implied.
78
+
79
+ a = Library::Version.parse_constraint("1.1")
80
+ e = [ "==", Library::Version['1.1'] ]
81
+ a.assert == e
82
+
83
+ This is usefuly for parsing requirement configurations. Using it, the Version
84
+ class can build contraint comparison procedures.
85
+
86
+ compare = Library::Version.constraint_lambda("=1.0")
87
+ compare.call('1.0').assert == true
88
+ compare.call('0.9').assert == false
89
+
90
+ Greater than
91
+
92
+ compare = Library::Version.constraint_lambda(">1.0")
93
+ compare.call('1.1').assert == true
94
+ compare.call('0.9').assert == false
95
+
96
+ Less than
97
+
98
+ compare = Library::Version.constraint_lambda("<1.0")
99
+ compare.call('1.1').assert == false
100
+ compare.call('0.9').assert == true
101
+
@@ -0,0 +1,11 @@
1
+ if ENV['RUBYOPT'].index('-rubylibs') || ENV['RUBYOPT'].index('-roll')
2
+ abort "Remove -rubylibs or -roll from RUBYOPT before running these tests."
3
+ end
4
+
5
+ # Make sure we use local version of files.
6
+ #$:.unshift('lib')
7
+
8
+ def fixtures
9
+ @_fixtures ||= File.dirname(__FILE__) + '/../fixtures'
10
+ end
11
+
@@ -0,0 +1,34 @@
1
+ require 'library'
2
+ require 'library/kernel'
3
+
4
+ require 'pathname'
5
+
6
+ project_directory = Pathname.new('projects')
7
+
8
+ When 'Given a project directory "(((\S+)))"' do |name|
9
+ @project_directory = project_directory + name
10
+ libdir = @project_directory + 'lib'
11
+ FileUtils.mkdir_p(libdir) unless libdir.exist?
12
+ end
13
+
14
+ When 'With a file "(((\S+)))" containing' do |name, text|
15
+ file = @project_directory + name
16
+ FileUtils.mkdir_p(file.parent) unless file.parent.exist?
17
+ File.open(file.to_s, 'w'){ |f| f << text }
18
+ end
19
+
20
+ Before :demo do
21
+ prime_ledger
22
+ #p $LEDGER
23
+ end
24
+
25
+ # Support method to setup fresh Ledger.
26
+ def prime_ledger
27
+ projects = File.dirname(__FILE__) + '/../fixtures/*'
28
+
29
+ # reset ledger (shouldn't this happen in Library.prime call?)
30
+ $LEDGER = ::Library::Ledger.new
31
+
32
+ ::Library.prime(*projects, :expound=>true)
33
+ end
34
+
@@ -0,0 +1,5 @@
1
+ ---
2
+ name: foo
3
+ version: 0.8.2
4
+ date: 2011-12-12
5
+ title: Foo
@@ -0,0 +1 @@
1
+ $foo_message = "Foo 0.8.2"
@@ -0,0 +1,6 @@
1
+ ---
2
+ name: tryme
3
+ version: 1.0
4
+ title: TryMe
5
+ resources:
6
+ home: "http://tryme.foo"
@@ -0,0 +1 @@
1
+ $tryme_message = "Try Me v1.0"
@@ -0,0 +1,7 @@
1
+ ---
2
+ name: tryme
3
+ version: 1.1
4
+ title: TryMe
5
+ resources:
6
+ home: "http://tryme.foo"
7
+
@@ -0,0 +1 @@
1
+ $tryme_message = "Try Me v1.1"
@@ -0,0 +1,29 @@
1
+ = Additional Project
2
+
3
+ == Neo 0.0.1
4
+
5
+ Given a project directory "neo/0.0.1".
6
+
7
+ With a file "VERSION" containing...
8
+
9
+ name: neo
10
+ vers: 0.0.1
11
+
12
+ With a file "PROFILE" containing...
13
+
14
+ title : Neo
15
+ author : Thomas Sawyer
16
+ homepage: http://neo.foo
17
+
18
+ With a file "lib/neo.rb" containing...
19
+
20
+ $neo_message = "Neo v0.0.1"
21
+
22
+ With a file ".ruby/name" containing...
23
+
24
+ neo
25
+
26
+ With a file ".ruby/version" containing...
27
+
28
+ 0.0.1
29
+
@@ -0,0 +1,56 @@
1
+ = Basic Set of Projects
2
+
3
+ == TryMe 1.0
4
+
5
+ Given a project directory "tryme/1.0".
6
+
7
+ With a file "VERSION" containing...
8
+
9
+ name: tryme
10
+ vers: 1.0
11
+
12
+ With a file "PROFILE" containing...
13
+
14
+ title : TryMe
15
+ author : Thomas Sawyer
16
+ homepage: http://tryme.foo
17
+
18
+ With a file "lib/tryme.rb" containing...
19
+
20
+ $tryme_message = "Try Me v1.0"
21
+
22
+ With a file ".ruby/name" containing...
23
+
24
+ tryme
25
+
26
+ With a file ".ruby/version" containing...
27
+
28
+ 1.0
29
+
30
+ == TryMe 1.1
31
+
32
+ Given a project directory "tryme/1.1".
33
+
34
+ With a file "VERSION" containing...
35
+
36
+ name: tryme
37
+ vers: 1.1
38
+
39
+ With a file "PROFILE" containing...
40
+
41
+ title : TryMe
42
+ author : Thomas Sawyer
43
+ homepage: http://tryme.foo
44
+
45
+ With a file "lib/tryme.rb" containing...
46
+
47
+ $tryme_message = "Try Me v1.1"
48
+
49
+ With a file ".ruby/name" containing...
50
+
51
+ tryme
52
+
53
+ With a file ".ruby/version" containing...
54
+
55
+ 1.1
56
+
@@ -0,0 +1,23 @@
1
+ covers 'library/ledger'
2
+
3
+ testcase Library::Ledger do
4
+
5
+ method :add do
6
+ test do
7
+ ledger = Library::Ledger.new
8
+ ledger.add(File.dirname(__FILE__) + '/fixture')
9
+ ledger.assert.size == 1
10
+ end
11
+ end
12
+
13
+ method :[] do
14
+ test do
15
+ ledger = Library::Ledger.new
16
+ ledger.add(File.dirname(__FILE__) + '/fixture')
17
+
18
+ ledger[:foo].assert.is_a? Array
19
+ ledger['foo'].assert.is_a? Array
20
+ end
21
+ end
22
+
23
+ end
@@ -0,0 +1,13 @@
1
+ covers 'library'
2
+
3
+ testcase Library do
4
+
5
+ class_method :new do
6
+
7
+ test do
8
+ Library.new(File.dirname(__FILE__) + '/fixture')
9
+ end
10
+
11
+ end
12
+
13
+ end
@@ -0,0 +1,89 @@
1
+ covers 'library/version'
2
+
3
+ testcase Library::Version do
4
+
5
+ concern "Ensure functionality of Roll's Version class."
6
+
7
+ method :to_s do
8
+ test do
9
+ v = Library::Version.new('1.2.3')
10
+ v.to_s.assert == '1.2.3'
11
+ end
12
+ end
13
+
14
+ method :to_str do
15
+ test do
16
+ v = Library::Version.new('1.2.3')
17
+ v.to_str.assert == '1.2.3'
18
+ end
19
+ end
20
+
21
+ method :inspect do
22
+ test do
23
+ v = Library::Version.new('1.2.3')
24
+ v.inspect.assert == '1.2.3'
25
+ end
26
+ end
27
+
28
+ method :[] do
29
+ test do
30
+ v = Library::Version.new('1.2.3')
31
+ v[0].assert == 1
32
+ v[1].assert == 2
33
+ v[2].assert == 3
34
+ end
35
+ end
36
+
37
+ method :<=> do
38
+ test do
39
+ v1 = Library::Version.new('1.2.3')
40
+ v2 = Library::Version.new('1.2.4')
41
+ (v2 <=> v1).assert == 1
42
+ end
43
+ end
44
+
45
+ # TODO
46
+ # def =~( other )
47
+ # #other = other.to_t
48
+ # upver = other.dup
49
+ # upver[0] += 1
50
+ # @self >= other and @self < upver
51
+ # end
52
+
53
+ method :=~ do
54
+ test "pessimistic constraint" do
55
+ v1 = Library::Version.new('1.2.4')
56
+ v2 = Library::Version.new('1.2')
57
+ assert(v1 =~ v2)
58
+ end
59
+ end
60
+
61
+ method :major do
62
+ test do
63
+ v = Library::Version.new('1.2.3')
64
+ v.major.assert == 1
65
+ end
66
+ end
67
+
68
+ method :minor do
69
+ test do
70
+ v = Library::Version.new('1.2.3')
71
+ v.minor.assert == 2
72
+ end
73
+ end
74
+
75
+ method :patch do
76
+ test do
77
+ v = Library::Version.new('1.2.3')
78
+ v.patch.assert == 3
79
+ end
80
+ end
81
+
82
+ class_method :parse_constraint do
83
+ test do
84
+ constraint = Library::Version.parse_constraint("~> 1.0.0")
85
+ constraint.assert == ["=~", Library::Version['1.0.0']]
86
+ end
87
+ end
88
+
89
+ end