plugin 0.9 → 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 (4) hide show
  1. data/README +18 -16
  2. data/lib/plugin.rb +72 -19
  3. data/meta/version +1 -1
  4. metadata +2 -2
data/README CHANGED
@@ -1,32 +1,34 @@
1
1
  = Plugin
2
2
 
3
3
  * home: http://rubyworks.github.com/plugin
4
+ * source: http://github.com/rubyworks/plugin
4
5
 
5
6
 
6
7
  == DESCRIPTION
7
8
 
8
- Plugin is a straighforward plugin manager for Ruby.
9
- It can handle RubyGems, Rolls and Ruby's standard
10
- site locals.
11
-
12
-
13
- == USAGE
9
+ Plugin is a straighforward plugin manager for Ruby. It can handle
10
+ RubyGems, Rolls and Ruby's standard site locals. It is both more
11
+ flexible and more robust the using Gem.find_files or searching the
12
+ $LOAD_PATH manually.
14
13
 
15
14
  The Plugin library does two signifficant things. First it designates
16
15
  a location in the ruby $LOAD_PATH for plugins. Second it provides
17
16
  an easy to use function for finding plugin scripts stored in the
18
17
  designated location.
19
18
 
20
- Place all plugin code in your project's <tt>lib/plugin/<name>/</tt>,
21
- or if you have altered the load path for your project, you can
22
- place it in the alternae location under <tt>plugin/<name></tt>.
19
+ == USAGE
20
+
21
+ Place all plugins for you projectt in <tt>lib/plugin/<name>/</tt>.
22
+ Or if you have altered the load path for your project, you can
23
+ place it in the alternate location under <tt>plugin/<name></tt>.
24
+ However, this is not a recommended practice.
23
25
 
24
- To find plugins, simply provide a path or file glob to the
25
- <tt>Plugin.find</tt> function, and it will return all matches
26
- found within current and most recent versions of libraries.
26
+ To find plugins, simply provide a glob to the <tt>Plugin.find</tt> function,
27
+ and it will return all matches found within current and/or most recent versions
28
+ of libraries.
27
29
 
28
- For example, it wil be common for pluggable applications to require all
29
- the plugins they find:
30
+ For example, a common use case for a pluggable application is to require all
31
+ the plugins found:
30
32
 
31
33
  require 'plugin'
32
34
 
@@ -34,8 +36,8 @@ the plugins they find:
34
36
  require(file)
35
37
  end
36
38
 
37
- Alternately you might load plugins only as needs. Say, it a command-line
38
- call required it.
39
+ Alternately you might load plugins only as needed. For instance, if a command-line
40
+ option calls for it.
39
41
 
40
42
 
41
43
  == COPYRIGHTS
data/lib/plugin.rb CHANGED
@@ -2,6 +2,38 @@
2
2
  #
3
3
  # Find plugins across various library managers.
4
4
  #
5
+ # All plugins are expected to be within a libraries designated
6
+ # loadpath(s) under a <tt>plugin/</tt> subdirectory. By using
7
+ # this assigned space, ie. <tt>plugin/<tt>, plugins are kept
8
+ # isolated from normal libary scripts. This helps prevent
9
+ # inadvertent name clashes.
10
+ #
11
+ # == How To Use
12
+ #
13
+ # Usage is very simple. Just supply a glob to the +Plugin.find+
14
+ # function.
15
+ #
16
+ # Plugin.find('syckle/*')
17
+ #
18
+ # A shortcut is provided with <tt>[]</tt>.
19
+ #
20
+ # Plugin['syckle/*']
21
+ #
22
+ # == A Note on RubyGems
23
+ #
24
+ # A way has not yet been devised to isolate the actived version
25
+ # of a gem from the latest inactive version. Therefore some
26
+ # overlap can occur if an older version of a plugin-containing
27
+ # gem has been activated prior to calling Plugin.find(). Such an
28
+ # occurance will be rare (considering the use cases of plugins),
29
+ # so it is nothing to be overly concerned about. Moreover, it is
30
+ # a long-way from the offical Gems plugin policy which is to find
31
+ # all matching files from *all* versions using Gem.find_files().
32
+ # I quote Eric Hodel, "It's an encouragement to make your plugin
33
+ # files as light as possible, such as requiring an additional file
34
+ # or calling some very stable API." While an understandable
35
+ # encouragment, ultimately it is not a robust solution.
36
+
5
37
  module Plugin
6
38
 
7
39
  extend self
@@ -17,20 +49,27 @@ module Plugin
17
49
  #
18
50
  def find(match)
19
51
  plugins = []
52
+ plugins.concat find_roll(match)
53
+ plugins.concat find_loadpath(match)
54
+ plugins.concat find_gems(match)
55
+ plugins.uniq
56
+ end
20
57
 
21
- # Standard $LOAD_PATH
22
- $LOAD_PATH.uniq.each do |path|
23
- list = Dir.glob(File.join(path, DIRECTORY, match))
24
- #dirs = dirs.select{ |d| File.directory?(d) }
25
- list = list.map{ |d| d.chomp('/') }
26
- plugins.concat(list)
27
- end
58
+ # Shortcut for #find.
59
+ #
60
+ # Plugin['syckle/*']
61
+ #
62
+ alias_method :[], :find
63
+
64
+
65
+ # Search roll for current or latest libraries.
28
66
 
29
- # ROLL (load latest or current versions only)
67
+ def find_roll(match)
68
+ plugins = []
30
69
  if defined?(::Roll)
31
70
  ::Roll::Library.ledger.each do |name, lib|
32
71
  lib = lib.sort.first if Array===lib
33
- lib.load_path.each do |path|
72
+ lib.loadpath.each do |path|
34
73
  find = File.join(lib.location, path, DIRECTORY, match)
35
74
  list = Dir.glob(find)
36
75
  list = list.map{ |d| d.chomp('/') }
@@ -38,25 +77,39 @@ module Plugin
38
77
  end
39
78
  end
40
79
  end
80
+ plugins
81
+ end
82
+
83
+ # Search standard $LOAD_PATH.
84
+ #
85
+ # Activated gem versions are in here too.
86
+
87
+ def find_loadpath(match)
88
+ plugins = []
89
+ $LOAD_PATH.uniq.each do |path|
90
+ list = Dir.glob(File.join(path, DIRECTORY, match))
91
+ #dirs = dirs.select{ |d| File.directory?(d) }
92
+ list = list.map{ |d| d.chomp('/') }
93
+ plugins.concat(list)
94
+ end
95
+ plugins
96
+ end
97
+
98
+ # Search latest gem versions.
99
+ #
100
+ # TODO: Is there anyway to skip active gems?
41
101
 
42
- # RubyGems (load latest versions only)
43
- # TODO: need current versions
102
+ def find_gems(match)
103
+ plugins = []
44
104
  if defined?(::Gem)
45
- Gem.latest_load_paths do |path|
105
+ ::Gem.latest_load_paths do |path|
46
106
  list = Dir.glob(File.join(path, DIRECTORY, match))
47
107
  list = list.map{ |d| d.chomp('/') }
48
108
  plugins.concat(list)
49
109
  end
50
110
  end
51
-
52
111
  plugins
53
112
  end
54
113
 
55
- # Shortcut for #find.
56
- #
57
- # Plugins['syckle/*']
58
- #
59
- alias_method :[], :find
60
-
61
114
  end
62
115
 
data/meta/version CHANGED
@@ -1 +1 @@
1
- 0.9
1
+ 1.0
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: plugin
3
3
  version: !ruby/object:Gem::Version
4
- version: "0.9"
4
+ version: "1.0"
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thomas Sawyer
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-11-20 00:00:00 -05:00
12
+ date: 2009-11-24 00:00:00 -05:00
13
13
  default_executable:
14
14
  dependencies: []
15
15