library 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.ruby +57 -0
- data/.yardopts +6 -0
- data/COPYING.rdoc +30 -0
- data/HISTORY.rdoc +13 -0
- data/README.md +177 -0
- data/lib/library.rb +532 -0
- data/lib/library/autoload.rb +14 -0
- data/lib/library/core_ext.rb +34 -0
- data/lib/library/domain.rb +244 -0
- data/lib/library/errors.rb +49 -0
- data/lib/library/feature.rb +207 -0
- data/lib/library/kernel.rb +81 -0
- data/lib/library/ledger.rb +642 -0
- data/lib/library/metadata.rb +398 -0
- data/lib/library/rbconfig.rb +65 -0
- data/lib/library/rubygems.rb +19 -0
- data/lib/library/rubylib.rb +206 -0
- data/lib/library/version.rb +387 -0
- data/lib/ubylibs.rb +8 -0
- data/qed/01_loading.rdoc +14 -0
- data/qed/02_library.rdoc +55 -0
- data/qed/03_ledger.rdoc +30 -0
- data/qed/04_version.rdoc +101 -0
- data/qed/applique/check.rb +11 -0
- data/qed/applique/project.rb +34 -0
- data/qed/fixtures/foo/.ruby +5 -0
- data/qed/fixtures/foo/lib/foo.rb +1 -0
- data/qed/fixtures/tryme/1.0/.ruby +6 -0
- data/qed/fixtures/tryme/1.0/lib/tryme.rb +1 -0
- data/qed/fixtures/tryme/1.1/.ruby +7 -0
- data/qed/fixtures/tryme/1.1/lib/tryme.rb +1 -0
- data/qed/helpers/new_project.rdoc +29 -0
- data/qed/helpers/projects.rdoc +56 -0
- data/test/case_ledger.rb +23 -0
- data/test/case_library.rb +13 -0
- data/test/case_version.rb +89 -0
- data/test/fixture/.ruby +56 -0
- data/test/fixture/lib/foo.rb +7 -0
- data/test/helper.rb +2 -0
- metadata +144 -0
data/lib/ubylibs.rb
ADDED
data/qed/01_loading.rdoc
ADDED
@@ -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
|
+
|
data/qed/02_library.rdoc
ADDED
@@ -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
|
+
|
data/qed/03_ledger.rdoc
ADDED
@@ -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
|
+
|
data/qed/04_version.rdoc
ADDED
@@ -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 @@
|
|
1
|
+
$foo_message = "Foo 0.8.2"
|
@@ -0,0 +1 @@
|
|
1
|
+
$tryme_message = "Try Me v1.0"
|
@@ -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
|
+
|
data/test/case_ledger.rb
ADDED
@@ -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,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
|