bezel 0.1.0 → 0.2.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/.ruby +66 -0
- data/DEMO.md +101 -0
- data/HISTORY.rdoc +26 -0
- data/LICENSE.txt +23 -0
- data/README.md +76 -0
- data/{test/demos → demo}/01_example.rdoc +11 -11
- data/demo/02_example.rdoc +53 -0
- data/demo/applique/ae.rb +1 -0
- data/demo/applique/bezel.rb +14 -0
- data/demo/fixtures/gems/tryme-1.0/lib/tryme.bezel +1 -0
- data/{test → demo}/fixtures/gems/tryme-1.0/lib/tryme.rb +1 -1
- data/{test → demo}/fixtures/gems/tryme-1.0/lib/tryme/extra.rb +0 -0
- data/demo/fixtures/gems/tryme-1.1/lib/tryme.bezel +1 -0
- data/{test → demo}/fixtures/gems/tryme-1.1/lib/tryme.rb +1 -1
- data/{test → demo}/fixtures/gems/tryme-1.1/lib/tryme/extra.rb +0 -0
- data/demo/fixtures/specifications/tryme-1.0.gemspec +25 -0
- data/demo/fixtures/specifications/tryme-1.1.gemspec +25 -0
- data/lib/bezel.rb +126 -49
- data/lib/bezel.yml +66 -0
- metadata +109 -65
- data/HISTORY +0 -12
- data/MANIFEST +0 -25
- data/README +0 -60
- data/meta/homepage +0 -1
- data/meta/name +0 -1
- data/meta/ruby +0 -1
- data/meta/suite +0 -1
- data/meta/summary +0 -1
- data/meta/title +0 -1
- data/meta/version +0 -1
data/.ruby
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
---
|
2
|
+
source:
|
3
|
+
- meta
|
4
|
+
authors:
|
5
|
+
- name: trans
|
6
|
+
email: transfire@gmail.com
|
7
|
+
copyrights:
|
8
|
+
- holder: Rubyworks
|
9
|
+
year: '2010'
|
10
|
+
license: BSD-2-Clause
|
11
|
+
requirements:
|
12
|
+
- name: finder
|
13
|
+
version: 0.3~
|
14
|
+
- name: detroit
|
15
|
+
groups:
|
16
|
+
- build
|
17
|
+
development: true
|
18
|
+
- name: qed
|
19
|
+
groups:
|
20
|
+
- test
|
21
|
+
development: true
|
22
|
+
- name: ae
|
23
|
+
groups:
|
24
|
+
- test
|
25
|
+
development: true
|
26
|
+
- name: ansi
|
27
|
+
version: 1.4.2
|
28
|
+
groups:
|
29
|
+
- test
|
30
|
+
development: true
|
31
|
+
dependencies: []
|
32
|
+
alternatives: []
|
33
|
+
conflicts: []
|
34
|
+
repositories:
|
35
|
+
- uri: git://github.com/proutils/bezel.git
|
36
|
+
scm: git
|
37
|
+
name: upstream
|
38
|
+
resources:
|
39
|
+
- uri: http://rubyworks.github.com/bezel
|
40
|
+
label: Website
|
41
|
+
type: home
|
42
|
+
- uri: http://github.com/rubyworks/bezel
|
43
|
+
label: Source Code
|
44
|
+
type: code
|
45
|
+
- uri: http://github.com/rubyworks/bezel/issues
|
46
|
+
label: Issue Tracker
|
47
|
+
type: bugs
|
48
|
+
- uri: http://groups.google.com/groups/rubyworks-mailinglist
|
49
|
+
label: Mailing List
|
50
|
+
type: mail
|
51
|
+
- uri: irc://us.chat.freenode.net/rubyworks
|
52
|
+
label: IRC Channel
|
53
|
+
type: chat
|
54
|
+
categories: []
|
55
|
+
extra: {}
|
56
|
+
load_path:
|
57
|
+
- lib
|
58
|
+
revision: 0
|
59
|
+
name: bezel
|
60
|
+
title: Bezel
|
61
|
+
organization: Rubyworks
|
62
|
+
created: '2010-02-19'
|
63
|
+
summary: Alternate loading system for Ruby allowing version multiplicity.
|
64
|
+
version: 0.2.0
|
65
|
+
description: Alternate loading system for Ruby allowing version multiplicity.
|
66
|
+
date: '2012-05-23'
|
data/DEMO.md
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
= Bezel
|
2
|
+
|
3
|
+
First Bezel must be loaded. This has been done via the applique.
|
4
|
+
It will also load RubyGems as Bezel currently uses the +Gem.path+
|
5
|
+
to locate Ruby libraries. We also use a dummy Gem location for
|
6
|
+
this example (see +fixtures+).
|
7
|
+
|
8
|
+
Now we can try it out. The dummy gem location houses two libraries
|
9
|
+
of the same name but different versions.
|
10
|
+
|
11
|
+
module Example1
|
12
|
+
TryMe = lib('tryme', '1.0')
|
13
|
+
end
|
14
|
+
|
15
|
+
TryMe has a class method called #report and we should see that
|
16
|
+
it works as expected.
|
17
|
+
|
18
|
+
Example1::TryMe.report.assert == "You are using version 1.0!"
|
19
|
+
|
20
|
+
It also imports a method called #extra from a seperate file.
|
21
|
+
|
22
|
+
Example1::TryMe.extra.assert == "Something extra from version 1.0!"
|
23
|
+
|
24
|
+
Now we should be able to do the same for TryMe v1.1 without any
|
25
|
+
issues of interference between the two versions.
|
26
|
+
|
27
|
+
module Example2
|
28
|
+
TryMe = lib('tryme', '1.1')
|
29
|
+
end
|
30
|
+
|
31
|
+
Again we should see that the #report method works as expected, but this
|
32
|
+
time reported form the new version.
|
33
|
+
|
34
|
+
Example2::TryMe.report.assert == "You are using version 1.1!"
|
35
|
+
|
36
|
+
And that it also imports a method called #extra from a seperate file.
|
37
|
+
|
38
|
+
Example2::TryMe.extra.assert == "Something extra from version 1.1!"
|
39
|
+
|
40
|
+
Just to be sure, let try v1.0 again.
|
41
|
+
|
42
|
+
Example1::TryMe.report.assert == "You are using version 1.0!"
|
43
|
+
Example1::TryMe.extra.assert == "Something extra from version 1.0!"
|
44
|
+
|
45
|
+
That's all folks!
|
46
|
+
|
47
|
+
|
48
|
+
= ANSI Example
|
49
|
+
|
50
|
+
require 'bezel'
|
51
|
+
|
52
|
+
ANSI_VERSION = '1.4.2'
|
53
|
+
|
54
|
+
class ColorfulString
|
55
|
+
X = lib('ansi', ANSI_VERSION)
|
56
|
+
#include x
|
57
|
+
|
58
|
+
COLORS = [:red, :yellow, :green, :blue, :magenta]
|
59
|
+
|
60
|
+
def initialize(string)
|
61
|
+
@string = string
|
62
|
+
reset_colors
|
63
|
+
end
|
64
|
+
|
65
|
+
def to_s
|
66
|
+
s = ""
|
67
|
+
@string.split(//).each do |c|
|
68
|
+
s << X::ANSI::Code.send(next_color) + c;
|
69
|
+
end
|
70
|
+
s << X::ANSI::Code::CLEAR
|
71
|
+
reset_colors
|
72
|
+
return s
|
73
|
+
end
|
74
|
+
|
75
|
+
def next_color
|
76
|
+
color = @colors.shift
|
77
|
+
@colors << color
|
78
|
+
color
|
79
|
+
end
|
80
|
+
|
81
|
+
def reset_colors
|
82
|
+
@colors = COLORS.dup
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
Then
|
87
|
+
|
88
|
+
cs = ColorfulString.new("Hello World!")
|
89
|
+
|
90
|
+
#puts cs
|
91
|
+
|
92
|
+
cs.to_s.assert == "\e[31mH\e[33me\e[32ml\e[34ml\e[35mo\e[31m \e[33mW\e[32mo\e[34mr\e[35ml\e[31md\e[33m!\e[0m"
|
93
|
+
|
94
|
+
ANSI 1.2.6+ has been fine-tuned to work with Bezel. So even core extensions
|
95
|
+
work.
|
96
|
+
|
97
|
+
red = "How about this!".ansi(:red)
|
98
|
+
|
99
|
+
red.assert == "\e[31mHow about this!\e[0m"
|
100
|
+
|
101
|
+
|
data/HISTORY.rdoc
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
= RELEASE HISTORY
|
2
|
+
|
3
|
+
== 0.2.0 / 2012-05-23
|
4
|
+
|
5
|
+
New release finally address a number of important issues.
|
6
|
+
You can think of this release as a "beta" release, in that
|
7
|
+
it is *almost* suitable for general use. The next release
|
8
|
+
should provide the final polish for production usage.
|
9
|
+
|
10
|
+
Changes:
|
11
|
+
|
12
|
+
* Add development mode to always use latest version.
|
13
|
+
* Depend on Finder gem for feature lookup.
|
14
|
+
* No longer need to use #import for internal #require.
|
15
|
+
|
16
|
+
|
17
|
+
== 0.1.0 / 2010-02-19
|
18
|
+
|
19
|
+
This is an alpha release of Bezel, an alternate load
|
20
|
+
system for Ruby, just to put it out there and get
|
21
|
+
some feedback.
|
22
|
+
|
23
|
+
Changes:
|
24
|
+
|
25
|
+
* Happy Birthday!
|
26
|
+
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
The MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2010 Thomas Sawyer
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
22
|
+
|
23
|
+
|
data/README.md
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
# Bezel
|
2
|
+
|
3
|
+
|
4
|
+
## DESCRIPTION
|
5
|
+
|
6
|
+
The idea of Bezel is to overcome the limitations of using different
|
7
|
+
versions of the same package in the same Ruby process.
|
8
|
+
|
9
|
+
|
10
|
+
## RESOURCES
|
11
|
+
|
12
|
+
* home: http://proutils.github.com/bezel
|
13
|
+
* work: http://github.com/proutils/bezel
|
14
|
+
* mail: http://googlegroups.com/group/rubyworks-mailinglist
|
15
|
+
* chat: irc://chat.us.freenode.net/rubyworks
|
16
|
+
|
17
|
+
|
18
|
+
## USAGE
|
19
|
+
|
20
|
+
It works like this. Let's say I wrote a library called TomsLib. Now I
|
21
|
+
want to use TomsLib in my new fancy app, FancyApp. In my FancyApp
|
22
|
+
namespace I have to create a reference to TomsLib.
|
23
|
+
|
24
|
+
module FancyApp
|
25
|
+
TomsLib = lib('tomslib', '1.5')
|
26
|
+
...
|
27
|
+
|
28
|
+
Now I have access to TomsLib, but it is localized to my application.
|
29
|
+
If Jane comes along and wants to use a different version of TomsLib
|
30
|
+
but also utilizes my FancyApp, she could do so:
|
31
|
+
|
32
|
+
module JanesProgram
|
33
|
+
TomsLib = lib('tomslib', '1.0')
|
34
|
+
FancyApp = lib('fancyapp') # use newest available
|
35
|
+
...
|
36
|
+
|
37
|
+
How does this work? When you call lib(), Bezel looks for the package
|
38
|
+
in the current Gem paths (and in the future, Roll ledger) then it
|
39
|
+
reads the primary package file (eg. tomslib.rb) from the package and
|
40
|
+
evals it into an anonymous module.
|
41
|
+
|
42
|
+
This has a some important effects on how you write your Ruby programs:
|
43
|
+
|
44
|
+
1. Any reference to core/standard libraries must be referenced via '::'
|
45
|
+
prefix (eg. ::Enumerable).
|
46
|
+
|
47
|
+
2. Core extensions are not version isolated. So when possible, avoid them
|
48
|
+
or depend on highly stable standardized bases such as Ruby Facets
|
49
|
+
and ActiveSupport.
|
50
|
+
|
51
|
+
3. Since Bezel is a completely different alternative to Ruby's normal
|
52
|
+
load system, your program will require Bezel be installed by your
|
53
|
+
users. No big deal. In other words, list it into your projects dependencies.
|
54
|
+
|
55
|
+
4. A project's main require file must be the same as the library's name.
|
56
|
+
|
57
|
+
Despite these necessary practices for its use, Bezel is highly advantageous
|
58
|
+
to the developers and end-users alike in that it puts an *absolute* end to
|
59
|
+
the dreaded *Dependency Hell*.
|
60
|
+
|
61
|
+
|
62
|
+
## STATUS
|
63
|
+
|
64
|
+
It may not be possible to test Bezel via Travis CI because of the way the tests
|
65
|
+
change the GEM_HOME. Currently they fail because of this, even though they pass
|
66
|
+
on local development machine. We'll leave this for now in hopes we will get it
|
67
|
+
working at some point:
|
68
|
+
[](http://travis-ci.org/rubyworks/bezel)
|
69
|
+
|
70
|
+
|
71
|
+
## LICENSE
|
72
|
+
|
73
|
+
Copyright (c) 2009 Thomas Sawyer
|
74
|
+
|
75
|
+
Bezel is distributed under the same terms as Ruby 1.9+, namely the
|
76
|
+
BSD 2-clause license.
|
@@ -1,16 +1,11 @@
|
|
1
1
|
= Bezel
|
2
2
|
|
3
|
-
First Bezel must be loaded
|
4
|
-
RubyGems as Bezel
|
5
|
-
Ruby libraries.
|
3
|
+
First Bezel must be loaded. This has been done via the applique.
|
4
|
+
It will also load RubyGems as Bezel currently uses the +Gem.path+
|
5
|
+
to locate Ruby libraries. We also use a dummy Gem location for
|
6
|
+
this example (see +fixtures+).
|
6
7
|
|
7
|
-
|
8
|
-
|
9
|
-
We are going to use a dummy Gem location for this example.
|
10
|
-
|
11
|
-
Gem.path.unshift(File.expand_path('../fixtures'))
|
12
|
-
|
13
|
-
Now we can try it out. The dummy location houses two libraries
|
8
|
+
Now we can try it out. The dummy gem location houses two libraries
|
14
9
|
of the same name but different versions.
|
15
10
|
|
16
11
|
module Example1
|
@@ -27,7 +22,7 @@ It also imports a method called #extra from a seperate file.
|
|
27
22
|
Example1::TryMe.extra.assert == "Something extra from version 1.0!"
|
28
23
|
|
29
24
|
Now we should be able to do the same for TryMe v1.1 without any
|
30
|
-
issues of interference
|
25
|
+
issues of interference between the two versions.
|
31
26
|
|
32
27
|
module Example2
|
33
28
|
TryMe = lib('tryme', '1.1')
|
@@ -42,5 +37,10 @@ And that it also imports a method called #extra from a seperate file.
|
|
42
37
|
|
43
38
|
Example2::TryMe.extra.assert == "Something extra from version 1.1!"
|
44
39
|
|
40
|
+
Just to be sure, let try v1.0 again.
|
41
|
+
|
42
|
+
Example1::TryMe.report.assert == "You are using version 1.0!"
|
43
|
+
Example1::TryMe.extra.assert == "Something extra from version 1.0!"
|
44
|
+
|
45
45
|
That's all folks!
|
46
46
|
|
@@ -0,0 +1,53 @@
|
|
1
|
+
= ANSI Example
|
2
|
+
|
3
|
+
require 'bezel'
|
4
|
+
|
5
|
+
ANSI_VERSION = '1.4.2'
|
6
|
+
|
7
|
+
class ColorfulString
|
8
|
+
X = lib('ansi', ANSI_VERSION)
|
9
|
+
#include x
|
10
|
+
|
11
|
+
COLORS = [:red, :yellow, :green, :blue, :magenta]
|
12
|
+
|
13
|
+
def initialize(string)
|
14
|
+
@string = string
|
15
|
+
reset_colors
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_s
|
19
|
+
s = ""
|
20
|
+
@string.split(//).each do |c|
|
21
|
+
s << X::ANSI::Code.send(next_color) + c;
|
22
|
+
end
|
23
|
+
s << X::ANSI::Code::CLEAR
|
24
|
+
reset_colors
|
25
|
+
return s
|
26
|
+
end
|
27
|
+
|
28
|
+
def next_color
|
29
|
+
color = @colors.shift
|
30
|
+
@colors << color
|
31
|
+
color
|
32
|
+
end
|
33
|
+
|
34
|
+
def reset_colors
|
35
|
+
@colors = COLORS.dup
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
Then
|
40
|
+
|
41
|
+
cs = ColorfulString.new("Hello World!")
|
42
|
+
|
43
|
+
#puts cs
|
44
|
+
|
45
|
+
cs.to_s.assert == "\e[31mH\e[33me\e[32ml\e[34ml\e[35mo\e[31m \e[33mW\e[32mo\e[34mr\e[35ml\e[31md\e[33m!\e[0m"
|
46
|
+
|
47
|
+
ANSI 1.2.6+ has been fine-tuned to work with Bezel. So even core extensions
|
48
|
+
work.
|
49
|
+
|
50
|
+
red = "How about this!".ansi(:red)
|
51
|
+
|
52
|
+
red.assert == "\e[31mHow about this!\e[0m"
|
53
|
+
|
data/demo/applique/ae.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'ae'
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# Use a dummy Gem location for this example.
|
2
|
+
dummy_gem_home = File.expand_path('../fixtures', File.dirname(__FILE__))
|
3
|
+
|
4
|
+
ENV['GEM_HOME'] = dummy_gem_home
|
5
|
+
Gem.path.unshift(dummy_gem_home)
|
6
|
+
|
7
|
+
Gem::Specification.reset
|
8
|
+
|
9
|
+
#p Gem::Specification.all_names
|
10
|
+
#puts "Gem path added: #{dummy_gem_home}"
|
11
|
+
|
12
|
+
# Require Bezel
|
13
|
+
require 'bezel'
|
14
|
+
|
@@ -0,0 +1 @@
|
|
1
|
+
import 'tryme'
|
File without changes
|
@@ -0,0 +1 @@
|
|
1
|
+
import 'tryme'
|
File without changes
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{tryme}
|
5
|
+
s.version = "1.0"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = [%q{trans}]
|
9
|
+
s.date = %q{2012-05-21}
|
10
|
+
s.description = %q{TryMe is a dummy gem for testing purposes.}
|
11
|
+
s.email = [%q{trans@transfire@gmail.com}]
|
12
|
+
s.homepage = %q{http://github.com/rubyworks/bezel}
|
13
|
+
s.require_paths = [%q{lib}]
|
14
|
+
s.rubygems_version = %q{1.8.5}
|
15
|
+
s.summary = %q{Dummy gem for testing.}
|
16
|
+
|
17
|
+
if s.respond_to? :specification_version then
|
18
|
+
s.specification_version = 3
|
19
|
+
|
20
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
21
|
+
else
|
22
|
+
end
|
23
|
+
else
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{tryme}
|
5
|
+
s.version = "1.1"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = [%q{trans}]
|
9
|
+
s.date = %q{2012-05-22}
|
10
|
+
s.description = %q{TryMe is a dummy gem for testing purposes.}
|
11
|
+
s.email = [%q{trans@transfire@gmail.com}]
|
12
|
+
s.homepage = %q{http://github.com/rubyworks/bezel}
|
13
|
+
s.require_paths = [%q{lib}]
|
14
|
+
s.rubygems_version = %q{1.8.5}
|
15
|
+
s.summary = %q{Dummy gem for testing.}
|
16
|
+
|
17
|
+
if s.respond_to? :specification_version then
|
18
|
+
s.specification_version = 3
|
19
|
+
|
20
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
21
|
+
else
|
22
|
+
end
|
23
|
+
else
|
24
|
+
end
|
25
|
+
end
|
data/lib/bezel.rb
CHANGED
@@ -20,15 +20,15 @@
|
|
20
20
|
# FancyApp = lib('fancyapp') # use newest available
|
21
21
|
# ...
|
22
22
|
#
|
23
|
-
# How does this work? When you call
|
24
|
-
#
|
25
|
-
# then it reads the
|
23
|
+
# How does this work? When you call lib(), Bezel looks for the
|
24
|
+
# package in the current gem paths (and, in the future, Roll ledger)
|
25
|
+
# then it reads the bezel file (e.g. lib/tomslib.rbz) from the package
|
26
26
|
# and evals it into an anonymous module.
|
27
27
|
#
|
28
28
|
# This has a some important effects on how you write your Ruby programs:
|
29
29
|
#
|
30
30
|
# 1. Any reference to core/standard libraries must be referenced via
|
31
|
-
#
|
31
|
+
# toplevel `::` prefix (eg. ::Enumerable).
|
32
32
|
#
|
33
33
|
# 2. Core extensions are not version controlled. So avoid them when
|
34
34
|
# possible, or depend on highly stable standardized bases such as
|
@@ -38,46 +38,85 @@
|
|
38
38
|
# load system, your program will require Bezel be installed by your
|
39
39
|
# users.
|
40
40
|
#
|
41
|
-
# Despite
|
42
|
-
#
|
43
|
-
#
|
41
|
+
# Despite these necessary practices for its use, Bezel is highly advantageous
|
42
|
+
# to developers and end-users alike in that it puts an end to the dreaded
|
43
|
+
# Dependency Hell.
|
44
44
|
#
|
45
|
+
# TODO: Consider how best to support alternate loadpaths beyond 'lib/'.
|
46
|
+
|
45
47
|
class Bezel < Module
|
46
|
-
require '
|
48
|
+
require 'finder'
|
47
49
|
|
48
50
|
# Cache of loaded modules. This speeds things
|
49
51
|
# up if two libraries load the same third library.
|
50
|
-
TABLE = Hash.new{|h,k|h[k]={}}
|
52
|
+
TABLE = Hash.new #{|h,k|h[k]={}}
|
53
|
+
|
54
|
+
# Script cache.
|
55
|
+
SCRIPT = {}
|
51
56
|
|
52
57
|
# Load stack keeps track of what modules are in the process
|
53
58
|
# of being loaded.
|
54
59
|
STACK = []
|
55
60
|
|
56
|
-
#
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
Dir[File.join(dir, 'gems', '*')]
|
61
|
-
end.flatten
|
62
|
-
)
|
61
|
+
# When in development mode, Bezel uses the latest and greatest
|
62
|
+
# available version regardless of version settings.
|
63
|
+
def self.development=(boolean)
|
64
|
+
@development = !!boolean
|
63
65
|
end
|
64
66
|
|
65
67
|
#
|
66
|
-
def self.
|
67
|
-
|
68
|
-
|
69
|
-
|
68
|
+
def self.development?
|
69
|
+
@development
|
70
|
+
end
|
71
|
+
|
72
|
+
# Load library into a module namespace.
|
73
|
+
def self.lib(name, version=nil)
|
74
|
+
version = nil if development?
|
75
|
+
|
76
|
+
##path = find(name, version)
|
77
|
+
##raise LoadError, "#{name}-#{version} not found" unless path
|
78
|
+
## location of main requirement file
|
79
|
+
## TODO: should we require a dedicated bezel file instead? e.g. `*.rbz`.
|
80
|
+
#main = File.join(path, 'lib', name + '.rb') #.rbz #TODO: LOADPATH
|
81
|
+
|
82
|
+
main = Find.feature(name, :from=>name, :version=>version, :absolute=>true).first
|
83
|
+
|
84
|
+
## check cache
|
85
|
+
return TABLE[main] if TABLE.key?(main)
|
86
|
+
|
87
|
+
## load error if no bezel file
|
88
|
+
raise LoadError, "#{name}-#{version} has no bezel!" unless main && File.exist?(main)
|
89
|
+
|
90
|
+
## read in bezel file
|
91
|
+
#script = File.read(main)
|
92
|
+
|
93
|
+
## create new Bezel module for file
|
94
|
+
mod = new(name, version) #, main)
|
95
|
+
|
96
|
+
## put module on STACK
|
97
|
+
STACK.push mod
|
98
|
+
|
99
|
+
## evaluate script in the context of module
|
100
|
+
#mod.module_eval(script, main, 0) # r =
|
101
|
+
mod.__load_feature__(main)
|
102
|
+
|
103
|
+
## pop module off STACK
|
104
|
+
STACK.pop
|
105
|
+
|
106
|
+
## add module to cache, and return module
|
107
|
+
TABLE[main] = mod
|
70
108
|
end
|
71
109
|
|
72
110
|
#
|
73
|
-
def self.
|
74
|
-
if
|
75
|
-
|
76
|
-
|
77
|
-
|
111
|
+
def self.require(path)
|
112
|
+
if current = STACK.last
|
113
|
+
begin
|
114
|
+
current.__load_feature__(path) ? true : false
|
115
|
+
rescue LoadError
|
116
|
+
require_without_bezel(path)
|
78
117
|
end
|
79
118
|
else
|
80
|
-
|
119
|
+
require_without_bezel(path)
|
81
120
|
end
|
82
121
|
end
|
83
122
|
|
@@ -87,44 +126,82 @@ class Bezel < Module
|
|
87
126
|
# File.join(path, 'lib', name + '.rb')
|
88
127
|
#end
|
89
128
|
|
90
|
-
#
|
91
|
-
def initialize(name, path)
|
92
|
-
@__name__
|
93
|
-
@
|
129
|
+
# Construct new Bezel module.
|
130
|
+
def initialize(name, version) #, path)
|
131
|
+
@__name__ = name
|
132
|
+
@__version__ = version
|
133
|
+
#@__path__ = path
|
134
|
+
@__features__ = []
|
135
|
+
super()
|
94
136
|
end
|
95
137
|
|
138
|
+
# Name of library.
|
96
139
|
def __name__
|
97
140
|
@__name__
|
98
141
|
end
|
99
142
|
|
100
|
-
|
101
|
-
|
143
|
+
# Version of library.
|
144
|
+
def __version__
|
145
|
+
@__version__
|
102
146
|
end
|
103
147
|
|
104
|
-
|
105
|
-
|
106
|
-
#
|
107
|
-
|
108
|
-
path = Bezel.find(name, version)
|
109
|
-
main = File.join(path, 'lib', name + '.rb')
|
148
|
+
# Path to library.
|
149
|
+
#def __path__
|
150
|
+
# @__path__
|
151
|
+
#end
|
110
152
|
|
111
|
-
|
153
|
+
#
|
154
|
+
def __features__
|
155
|
+
@__features__
|
156
|
+
end
|
112
157
|
|
113
|
-
|
158
|
+
#
|
159
|
+
def __load_feature__(path)
|
160
|
+
if path =~ /^[\.\/]/ # if absolute path
|
161
|
+
file = File.expand_path(path)
|
162
|
+
else
|
163
|
+
file = Find.feature(path, :from=>__name__, :version=>__version__, :absolute=>true).first
|
164
|
+
end
|
114
165
|
|
115
|
-
|
166
|
+
raise LoadError, "no such file to load -- #{file}" unless file
|
116
167
|
|
117
|
-
|
168
|
+
if __features__.include?(file)
|
169
|
+
return false
|
170
|
+
else
|
171
|
+
__features__ << file
|
172
|
+
script = File.read(file) #(SCRIPT[file] ||= File.read(file))
|
173
|
+
module_eval(script, file, 0)
|
174
|
+
end
|
118
175
|
|
119
|
-
|
176
|
+
return file
|
177
|
+
end
|
120
178
|
|
121
|
-
Bezel::TABLE[main] = mod
|
122
179
|
end
|
123
180
|
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
181
|
+
module Kernel
|
182
|
+
# TODO require_relative
|
183
|
+
|
184
|
+
class << self
|
185
|
+
# Alias original require.
|
186
|
+
alias require_without_bezel require
|
187
|
+
|
188
|
+
# Override require to try bezel first.
|
189
|
+
def require(fname)
|
190
|
+
Bezel.require(fname)
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
# Alias original require.
|
195
|
+
alias require_without_bezel require
|
196
|
+
|
197
|
+
# Override require to try bezel first.
|
198
|
+
def require(fname)
|
199
|
+
Bezel.require(fname)
|
200
|
+
end
|
201
|
+
|
202
|
+
# Retuns a new Bezel Module.
|
203
|
+
def lib(name, version=nil)
|
204
|
+
Bezel.lib(name, version)
|
205
|
+
end
|
129
206
|
end
|
130
207
|
|
data/lib/bezel.yml
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
---
|
2
|
+
source:
|
3
|
+
- meta
|
4
|
+
authors:
|
5
|
+
- name: trans
|
6
|
+
email: transfire@gmail.com
|
7
|
+
copyrights:
|
8
|
+
- holder: Rubyworks
|
9
|
+
year: '2010'
|
10
|
+
license: BSD-2-Clause
|
11
|
+
requirements:
|
12
|
+
- name: finder
|
13
|
+
version: 0.3~
|
14
|
+
- name: detroit
|
15
|
+
groups:
|
16
|
+
- build
|
17
|
+
development: true
|
18
|
+
- name: qed
|
19
|
+
groups:
|
20
|
+
- test
|
21
|
+
development: true
|
22
|
+
- name: ae
|
23
|
+
groups:
|
24
|
+
- test
|
25
|
+
development: true
|
26
|
+
- name: ansi
|
27
|
+
version: 1.4.2
|
28
|
+
groups:
|
29
|
+
- test
|
30
|
+
development: true
|
31
|
+
dependencies: []
|
32
|
+
alternatives: []
|
33
|
+
conflicts: []
|
34
|
+
repositories:
|
35
|
+
- uri: git://github.com/proutils/bezel.git
|
36
|
+
scm: git
|
37
|
+
name: upstream
|
38
|
+
resources:
|
39
|
+
- uri: http://rubyworks.github.com/bezel
|
40
|
+
label: Website
|
41
|
+
type: home
|
42
|
+
- uri: http://github.com/rubyworks/bezel
|
43
|
+
label: Source Code
|
44
|
+
type: code
|
45
|
+
- uri: http://github.com/rubyworks/bezel/issues
|
46
|
+
label: Issue Tracker
|
47
|
+
type: bugs
|
48
|
+
- uri: http://groups.google.com/groups/rubyworks-mailinglist
|
49
|
+
label: Mailing List
|
50
|
+
type: mail
|
51
|
+
- uri: irc://us.chat.freenode.net/rubyworks
|
52
|
+
label: IRC Channel
|
53
|
+
type: chat
|
54
|
+
categories: []
|
55
|
+
extra: {}
|
56
|
+
load_path:
|
57
|
+
- lib
|
58
|
+
revision: 0
|
59
|
+
name: bezel
|
60
|
+
title: Bezel
|
61
|
+
organization: Rubyworks
|
62
|
+
created: '2010-02-19'
|
63
|
+
summary: Alternate loading system for Ruby allowing version multiplicity.
|
64
|
+
version: 0.2.0
|
65
|
+
description: Alternate loading system for Ruby allowing version multiplicity.
|
66
|
+
date: '2012-05-23'
|
metadata
CHANGED
@@ -1,80 +1,124 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: bezel
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
6
|
-
- 0
|
7
|
-
- 1
|
8
|
-
- 0
|
9
|
-
version: 0.1.0
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.0
|
5
|
+
prerelease:
|
10
6
|
platform: ruby
|
11
|
-
authors:
|
12
|
-
|
7
|
+
authors:
|
8
|
+
- trans
|
13
9
|
autorequire:
|
14
10
|
bindir: bin
|
15
11
|
cert_chain: []
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
12
|
+
date: 2012-05-23 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: finder
|
16
|
+
requirement: &21356920 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0.3'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *21356920
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: detroit
|
27
|
+
requirement: &21356440 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *21356440
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: qed
|
38
|
+
requirement: &21372260 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
type: :development
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *21372260
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: ae
|
49
|
+
requirement: &21371740 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :development
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *21371740
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: ansi
|
60
|
+
requirement: &21371180 !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - =
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: 1.4.2
|
66
|
+
type: :development
|
67
|
+
prerelease: false
|
68
|
+
version_requirements: *21371180
|
69
|
+
description: Alternate loading system for Ruby allowing version multiplicity.
|
70
|
+
email:
|
71
|
+
- transfire@gmail.com
|
23
72
|
executables: []
|
24
|
-
|
25
73
|
extensions: []
|
26
|
-
|
27
|
-
|
28
|
-
-
|
29
|
-
|
30
|
-
-
|
31
|
-
|
32
|
-
-
|
74
|
+
extra_rdoc_files:
|
75
|
+
- LICENSE.txt
|
76
|
+
- HISTORY.rdoc
|
77
|
+
- README.md
|
78
|
+
- DEMO.md
|
79
|
+
files:
|
80
|
+
- .ruby
|
81
|
+
- demo/01_example.rdoc
|
82
|
+
- demo/02_example.rdoc
|
83
|
+
- demo/applique/ae.rb
|
84
|
+
- demo/applique/bezel.rb
|
85
|
+
- demo/fixtures/gems/tryme-1.0/lib/tryme/extra.rb
|
86
|
+
- demo/fixtures/gems/tryme-1.0/lib/tryme.bezel
|
87
|
+
- demo/fixtures/gems/tryme-1.0/lib/tryme.rb
|
88
|
+
- demo/fixtures/gems/tryme-1.1/lib/tryme/extra.rb
|
89
|
+
- demo/fixtures/gems/tryme-1.1/lib/tryme.bezel
|
90
|
+
- demo/fixtures/gems/tryme-1.1/lib/tryme.rb
|
91
|
+
- demo/fixtures/specifications/tryme-1.0.gemspec
|
92
|
+
- demo/fixtures/specifications/tryme-1.1.gemspec
|
33
93
|
- lib/bezel.rb
|
34
|
-
-
|
35
|
-
-
|
36
|
-
-
|
37
|
-
-
|
38
|
-
-
|
39
|
-
|
40
|
-
|
41
|
-
-
|
42
|
-
- test/fixtures/gems/tryme-1.0/lib/tryme.rb
|
43
|
-
- test/fixtures/gems/tryme-1.0/lib/tryme/extra.rb
|
44
|
-
- test/fixtures/gems/tryme-1.1/lib/tryme.rb
|
45
|
-
- test/fixtures/gems/tryme-1.1/lib/tryme/extra.rb
|
46
|
-
has_rdoc: true
|
47
|
-
homepage: http://proutils.github.com/bezel
|
48
|
-
licenses: []
|
49
|
-
|
94
|
+
- lib/bezel.yml
|
95
|
+
- HISTORY.rdoc
|
96
|
+
- LICENSE.txt
|
97
|
+
- README.md
|
98
|
+
- DEMO.md
|
99
|
+
homepage: http://rubyworks.github.com/bezel
|
100
|
+
licenses:
|
101
|
+
- BSD-2-Clause
|
50
102
|
post_install_message:
|
51
|
-
rdoc_options:
|
52
|
-
|
53
|
-
- Bezel API
|
54
|
-
- --main
|
55
|
-
- README
|
56
|
-
require_paths:
|
103
|
+
rdoc_options: []
|
104
|
+
require_paths:
|
57
105
|
- lib
|
58
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
requirements:
|
67
|
-
- -
|
68
|
-
- !ruby/object:Gem::Version
|
69
|
-
|
70
|
-
- 0
|
71
|
-
version: "0"
|
106
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
107
|
+
none: false
|
108
|
+
requirements:
|
109
|
+
- - ! '>='
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '0'
|
112
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ! '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
72
118
|
requirements: []
|
73
|
-
|
74
|
-
|
75
|
-
rubygems_version: 1.3.6.pre.3
|
119
|
+
rubyforge_project:
|
120
|
+
rubygems_version: 1.8.11
|
76
121
|
signing_key:
|
77
122
|
specification_version: 3
|
78
123
|
summary: Alternate loading system for Ruby allowing version multiplicity.
|
79
124
|
test_files: []
|
80
|
-
|
data/HISTORY
DELETED
data/MANIFEST
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
HISTORY
|
2
|
-
MANIFEST
|
3
|
-
README
|
4
|
-
lib/bezel.rb
|
5
|
-
meta/homepage
|
6
|
-
meta/name
|
7
|
-
meta/ruby
|
8
|
-
meta/suite
|
9
|
-
meta/summary
|
10
|
-
meta/title
|
11
|
-
meta/version
|
12
|
-
test/demos
|
13
|
-
test/demos/01_example.rdoc
|
14
|
-
test/fixtures
|
15
|
-
test/fixtures/gems
|
16
|
-
test/fixtures/gems/tryme-1.0
|
17
|
-
test/fixtures/gems/tryme-1.0/lib
|
18
|
-
test/fixtures/gems/tryme-1.0/lib/tryme
|
19
|
-
test/fixtures/gems/tryme-1.0/lib/tryme.rb
|
20
|
-
test/fixtures/gems/tryme-1.0/lib/tryme/extra.rb
|
21
|
-
test/fixtures/gems/tryme-1.1
|
22
|
-
test/fixtures/gems/tryme-1.1/lib
|
23
|
-
test/fixtures/gems/tryme-1.1/lib/tryme
|
24
|
-
test/fixtures/gems/tryme-1.1/lib/tryme.rb
|
25
|
-
test/fixtures/gems/tryme-1.1/lib/tryme/extra.rb
|
data/README
DELETED
@@ -1,60 +0,0 @@
|
|
1
|
-
= Bezel
|
2
|
-
|
3
|
-
* home: http://proutils.github.com/bezel
|
4
|
-
* work: http://github.com/proutils/bezel
|
5
|
-
|
6
|
-
== DESCRIPTION
|
7
|
-
|
8
|
-
The idea of Bezel is to overcome the limitations of using different
|
9
|
-
versions of the same package in the same Ruby process.
|
10
|
-
|
11
|
-
== USAGE
|
12
|
-
|
13
|
-
It works like this. Let's say I wrote a library called TomsLib. Now I
|
14
|
-
want to use TomsLib in my new fancy app, FancyApp. In my FancyApp
|
15
|
-
namespace I have to create a reference to TomsLib.
|
16
|
-
|
17
|
-
module FancyApp
|
18
|
-
TomsLib = lib('tomslib', '1.5')
|
19
|
-
...
|
20
|
-
|
21
|
-
Now I have access to TomsLib, but it is localized to my application.
|
22
|
-
If Jane comes along and wants to use a different version of TomsLib
|
23
|
-
but also utilizes my FancyApp, she could do so:
|
24
|
-
|
25
|
-
module JanesProgram
|
26
|
-
TomsLib = lib('tomslib', '1.0')
|
27
|
-
FancyApp = lib('fancyapp') # use newest available
|
28
|
-
...
|
29
|
-
|
30
|
-
How does this work? When you call lib(), Bezel looks for the package
|
31
|
-
in the current Gem paths (and in the future, Roll ledger) then it
|
32
|
-
reads the primary package file (eg. tomslib.rb) from the package and
|
33
|
-
evals it into an anonymous module.
|
34
|
-
|
35
|
-
This has a some important effects on how you write your Ruby programs:
|
36
|
-
|
37
|
-
1. Any reference to core/standard libraries must be referenced via '::'
|
38
|
-
prefix (eg. ::Enumerable).
|
39
|
-
|
40
|
-
2. Core extensions are not version isolated. So avoid them when
|
41
|
-
possible, or depend on highly stable standardized bases such as
|
42
|
-
Ruby Facets and ActiveSupport.
|
43
|
-
|
44
|
-
3. Since Bezel is a completely different alternative to Ruby's normal
|
45
|
-
load system, your program will require Bezel be installed by your
|
46
|
-
users.
|
47
|
-
|
48
|
-
4. Within Bezel dependent libraries #import must be used instead of
|
49
|
-
#require or #load in order to keep the code within the current module.
|
50
|
-
|
51
|
-
Despite the minor limitations and necessary practices required for its
|
52
|
-
use, Bezel is highly advantageous to the developers and end-users alike
|
53
|
-
in that it puts an end to the dreaded Dependency Hell.
|
54
|
-
|
55
|
-
== COPYRIGHT
|
56
|
-
|
57
|
-
Copyright (c) 2009 Thomas Sawyer
|
58
|
-
|
59
|
-
Bezel is distributed under the terms of the Ruby License.
|
60
|
-
|
data/meta/homepage
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
http://proutils.github.com/bezel
|
data/meta/name
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
bezel
|
data/meta/ruby
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
1.8.7
|
data/meta/suite
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
proutils
|
data/meta/summary
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
Alternate loading system for Ruby allowing version multiplicity.
|
data/meta/title
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
Bezel
|
data/meta/version
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
0.1.0
|