reverse-require 0.1.2 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,10 @@
1
+ === 0.2.0 / 2008-11-23
2
+
3
+ * Use the new Gem.find_files method provided by RubyGems >= 1.3.0. Using
4
+ Gem.find_files in reverse_require has greatly decreased the executation
5
+ time of reverse_require.
6
+ * Added the require_all method, which is an alias to reverse_require.
7
+
1
8
  === 0.1.2 / 2008-10-22
2
9
 
3
10
  * Fixed a bug where ReverseRequire.require_for would try to activate
@@ -1,10 +1,11 @@
1
1
  History.txt
2
2
  Manifest.txt
3
3
  README.txt
4
+ TODO.txt
4
5
  Rakefile
5
6
  lib/reverse_require.rb
6
7
  lib/reverse_require/version.rb
8
+ lib/reverse_require/exceptions.rb
9
+ lib/reverse_require/exceptions/rubygems_version_exception.rb
7
10
  lib/reverse_require/extensions.rb
8
11
  lib/reverse_require/extensions/kernel.rb
9
- lib/reverse_require/gems.rb
10
- lib/reverse_require/reverse_require.rb
data/README.txt CHANGED
@@ -1,29 +1,30 @@
1
1
  = ReverseRequire
2
2
 
3
3
  * http://reverserequire.rubyforge.org/
4
- * Postmodern Modulus III (postmodern.mod3@gmail.com)
4
+ * Postmodern (postmodern.mod3 at gmail.com)
5
5
 
6
6
  == DESCRIPTION:
7
7
 
8
- reverse_require requires specific files from the gems which depend on a
9
- certain RubyGem and contain the specified path. Using reverse_require one
10
- can allow others to easily extend the functionality of a RubyGem. Simply add
11
- reverse_require into the code of your RubyGem:
8
+ reverse_require will require all files ending with a specified path from
9
+ within previously installed RubyGems. By using reverse_require in your
10
+ code-base, it allows developers to extend the functionality of your
11
+ code-base, by merely adding specially named files to their own RubyGems.
12
+ Simply use reverse_require in the code-base that you'd like to be extendable:
12
13
 
13
- reverse_require 'my_gem', 'some/path'
14
+ reverse_require 'some/path'
14
15
 
15
- Then other gems which depend upon +my_gem+ merely have to provide
16
- <tt>some/path</tt> within their <tt>lib/</tt> directory, and
17
- reverse_require will load them all at run-time. This ability makes
18
- designing plug-in systems for a RubyGem trivial.
16
+ The <tt>some/path.rb</tt> files within the <tt>lib/</tt> directories of
17
+ other RubyGems will then be loaded. This functionality makes designing
18
+ plug-in systems ontop of RubyGems trivial.
19
19
 
20
20
  == FEATURES/PROBLEMS:
21
21
 
22
- * Require files from all the related gems of a RubyGem.
22
+ * Require files ending with a specified path from previously installed
23
+ RubyGems.
23
24
 
24
25
  == REQUIREMENTS:
25
26
 
26
- * RubyGems
27
+ * RubyGems >= 1.3.0
27
28
 
28
29
  == INSTALL:
29
30
 
data/Rakefile CHANGED
@@ -6,7 +6,7 @@ require './lib/reverse_require/version.rb'
6
6
 
7
7
  Hoe.new('reverse-require', ReverseRequire::VERSION) do |p|
8
8
  p.rubyforge_name = 'reverserequire'
9
- p.developer('Postmodern Modulus III','postmodern.mod3@gmail.com')
9
+ p.developer('Postmodern','postmodern.mod3@gmail.com')
10
10
  p.remote_rdoc_dir = ''
11
11
  end
12
12
 
@@ -0,0 +1,2 @@
1
+ == TODO:
2
+
@@ -1,3 +1,2 @@
1
- require 'reverse_require/reverse_require'
2
1
  require 'reverse_require/extensions'
3
2
  require 'reverse_require/version'
@@ -0,0 +1 @@
1
+ require 'reverse_require/exceptions/rubygems_version_exception'
@@ -0,0 +1,4 @@
1
+ module ReverseRequire
2
+ class RubyGemsVersionException < RuntimeError
3
+ end
4
+ end
@@ -1,13 +1,35 @@
1
- require 'reverse_require/reverse_require'
1
+ require 'reverse_require/exceptions/rubygems_version_exception'
2
2
 
3
3
  module Kernel
4
4
  #
5
- # Requires certain files from the gems which depend on the
6
- # specified _ruby_gem_ and contain the specified _sub_path_.
7
- # If no gems contain the specified _sub_path_, +false+ will be
8
- # returned.
5
+ # Requires all files from previously installed RubyGems that
6
+ # end with the specified _path_. If no RubyGems contain the
7
+ # specified _path_, +false+ will be returned.
9
8
  #
10
- def reverse_require(ruby_gem,sub_path)
11
- ReverseRequire.require_for(ReverseRequire.gems_of(ruby_gem),sub_path)
9
+ # reverse_require 'ronin/models'
10
+ # # => true
11
+ #
12
+ def reverse_require(path)
13
+ major, minor, rev = Gem::RubyGemsVersion.split('.').map { |i| i.to_i }
14
+
15
+ if (major == 1 && minor == 2)
16
+ raise(ReverseRequire::RubyGemsVersionException,"RubyGems >= 1.3.0 is required for reverse_require",caller)
17
+ end
18
+
19
+ was_loaded = false
20
+
21
+ Gem.find_files(path).reverse_each do |path|
22
+ begin
23
+ if File.file?(path)
24
+ was_loaded ||= require path
25
+ end
26
+ rescue
27
+ next
28
+ end
29
+ end
30
+
31
+ return was_loaded
12
32
  end
33
+
34
+ alias require_all reverse_require
13
35
  end
@@ -1,3 +1,3 @@
1
1
  module ReverseRequire
2
- VERSION = '0.1.2'
2
+ VERSION = '0.2.0'
3
3
  end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: reverse-require
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
- - Postmodern Modulus III
7
+ - Postmodern
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-10-22 00:00:00 -07:00
12
+ date: 2008-11-23 00:00:00 -08:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -20,9 +20,9 @@ dependencies:
20
20
  requirements:
21
21
  - - ">="
22
22
  - !ruby/object:Gem::Version
23
- version: 1.8.0
23
+ version: 1.8.2
24
24
  version:
25
- description: "reverse_require requires specific files from the gems which depend on a certain RubyGem and contain the specified path. Using reverse_require one can allow others to easily extend the functionality of a RubyGem. Simply add reverse_require into the code of your RubyGem: reverse_require 'my_gem', 'some/path' Then other gems which depend upon +my_gem+ merely have to provide <tt>some/path</tt> within their <tt>lib/</tt> directory, and reverse_require will load them all at run-time. This ability makes designing plug-in systems for a RubyGem trivial."
25
+ description: "reverse_require will require all files ending with a specified path from within previously installed RubyGems. By using reverse_require in your code-base, it allows developers to extend the functionality of your code-base, by merely adding specially named files to their own RubyGems. Simply use reverse_require in the code-base that you'd like to be extendable: reverse_require 'some/path' The <tt>some/path.rb</tt> files within the <tt>lib/</tt> directories of other RubyGems will then be loaded. This functionality makes designing plug-in systems ontop of RubyGems trivial."
26
26
  email:
27
27
  - postmodern.mod3@gmail.com
28
28
  executables: []
@@ -33,17 +33,19 @@ extra_rdoc_files:
33
33
  - History.txt
34
34
  - Manifest.txt
35
35
  - README.txt
36
+ - TODO.txt
36
37
  files:
37
38
  - History.txt
38
39
  - Manifest.txt
39
40
  - README.txt
41
+ - TODO.txt
40
42
  - Rakefile
41
43
  - lib/reverse_require.rb
42
44
  - lib/reverse_require/version.rb
45
+ - lib/reverse_require/exceptions.rb
46
+ - lib/reverse_require/exceptions/rubygems_version_exception.rb
43
47
  - lib/reverse_require/extensions.rb
44
48
  - lib/reverse_require/extensions/kernel.rb
45
- - lib/reverse_require/gems.rb
46
- - lib/reverse_require/reverse_require.rb
47
49
  has_rdoc: true
48
50
  homepage: http://reverserequire.rubyforge.org/
49
51
  post_install_message:
@@ -67,9 +69,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
67
69
  requirements: []
68
70
 
69
71
  rubyforge_project: reverserequire
70
- rubygems_version: 1.3.0
72
+ rubygems_version: 1.3.1
71
73
  signing_key:
72
74
  specification_version: 2
73
- summary: reverse_require requires specific files from the gems which depend on a certain RubyGem and contain the specified path
75
+ summary: reverse_require will require all files ending with a specified path from within previously installed RubyGems
74
76
  test_files: []
75
77
 
@@ -1,147 +0,0 @@
1
- require 'rubygems'
2
-
3
- module ReverseRequire
4
- class Gems
5
-
6
- # Paths of the gems
7
- attr_reader :paths
8
-
9
- # Gem specifications
10
- attr_reader :gem_specs
11
-
12
- #
13
- # Creates a new empty Gems object.
14
- #
15
- def initialize
16
- @paths = []
17
- @gem_specs = []
18
- end
19
-
20
- #
21
- # Creates a new Gems object containing the gems which depend upon
22
- # the RubyGem of the specified _name_.
23
- #
24
- def Gems.depending_on(name)
25
- name = name.to_s
26
- spec_dir = File.join(Gem.dir,'specifications')
27
- gems = Gems.new
28
-
29
- Gem::SourceIndex.from_installed_gems(spec_dir).each do |path,gem_spec|
30
- deps = gem_spec.dependencies.map { |dep| dep.name }
31
-
32
- if deps.include?(name)
33
- gem_path = File.expand_path(File.join(Gem.dir,'gems',path))
34
-
35
- gems.enqueue(gem_path,gem_spec)
36
- end
37
- end
38
-
39
- return gems
40
- end
41
-
42
- #
43
- # Returns the number of paths and gem specs.
44
- #
45
- def length
46
- return 0 if (@paths.empty? || @gem_specs.empty?)
47
- return [@paths.length, @gem_specs.length].min
48
- end
49
-
50
- #
51
- # Returns the gem spec with the specified gem _path_.
52
- #
53
- def [](path)
54
- @gem_specs[@paths.index(path)]
55
- end
56
-
57
- #
58
- # Adds the specified _gem_spec_ with the specified gem _path_.
59
- #
60
- def []=(path,gem_spec)
61
- if @paths.include?(path)
62
- @gem_specs[@paths.index(path)] = gem_spec
63
- else
64
- @paths << path
65
- @gem_specs << gem_spec
66
- end
67
-
68
- return gem_spec
69
- end
70
-
71
- #
72
- # Enqueues the specified _gem_spec_ with the specified gem _path_.
73
- #
74
- def enqueue(path,gem_spec)
75
- if @paths.include?(path)
76
- @gem_specs[@paths.index(path)] = gem_spec
77
- else
78
- @paths.unshift(path)
79
- @gem_specs.unshift(gem_spec)
80
- end
81
-
82
- return self
83
- end
84
-
85
- #
86
- # Iterates over each path and gem spec, passing each to the given
87
- # _block_.
88
- #
89
- def each(&block)
90
- length.times do |i|
91
- block.call(@paths[i], @gem_specs[i])
92
- end
93
-
94
- return self
95
- end
96
-
97
- #
98
- # Returns a new Gems object containing the names and paths from the
99
- # gems which match the specified _block_.
100
- #
101
- def select(&block)
102
- gems = self.class.new
103
-
104
- each do |path,gem_spec|
105
- if block.call(path,gem_spec)
106
- gems[path] = gem_spec
107
- end
108
- end
109
-
110
- return gems
111
- end
112
-
113
- #
114
- # Invokes the given _block_ once for each name and path of the gems.
115
- # Returns an +Array+ containing the values returned by the _block_.
116
- # If no _block_ is given, an empty +Array+ will be returned.
117
- #
118
- def map(&block)
119
- mapped = []
120
-
121
- each do |path,gem_spec|
122
- if block
123
- mapped << block.call(path,gem_spec)
124
- end
125
- end
126
-
127
- return mapped
128
- end
129
-
130
- #
131
- # Returns a new Gems object containing the gems which contain the
132
- # specified _sub_path_.
133
- #
134
- # gems.with_path('some/path') # => {...}
135
- #
136
- def with_path(sub_path)
137
- if File.extname(sub_path).empty?
138
- sub_path += '.rb'
139
- end
140
-
141
- return select do |path,gem_spec|
142
- File.exists?(File.expand_path(File.join(path,sub_path)))
143
- end
144
- end
145
-
146
- end
147
- end
@@ -1,38 +0,0 @@
1
- require 'reverse_require/gems'
2
-
3
- module ReverseRequire
4
- #
5
- # Returns a new Gems object containing the gems which depend upon
6
- # the RubyGem of the specified _name_.
7
- #
8
- def ReverseRequire.gems_of(name)
9
- Gems.depending_on(name)
10
- end
11
-
12
- #
13
- # Requires certain files from the _gems_ that contain the specified
14
- # _sub_path_. If no gems contain the specified _sub_path_, +false+ will be
15
- # returned.
16
- #
17
- def ReverseRequire.require_for(gems,sub_path)
18
- lib_path = File.join('lib',sub_path)
19
-
20
- was_loaded = gems.with_path(lib_path).map do |path,gem_spec|
21
- activated = Gem.loaded_specs.any? do |active_path,activated_spec|
22
- activated_spec.name == gem_spec.name &&
23
- activated_spec.version != gem_spec.version
24
- end
25
-
26
- unless activated
27
- begin
28
- gem(gem_spec.name,gem_spec.version)
29
- require File.expand_path(File.join(path,lib_path))
30
- rescue Gem::Exception
31
- next
32
- end
33
- end
34
- end
35
-
36
- return was_loaded.include?(true)
37
- end
38
- end