pluginator 0.9.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/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ *.gem
2
+ Gemfile.lock
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source "http://rubygems.org"
2
+
3
+ #ruby=1.9.3
4
+
5
+ gemspec
data/README.md ADDED
@@ -0,0 +1,86 @@
1
+ # Pluginator
2
+
3
+ Gem plugin system management, detects plugins using `Gem.find_file`.
4
+ Is only supposed with ruby 1.9.2+
5
+
6
+ Pluginator tries to stay out of your way, you do not have to include or inherit anything.
7
+ Pluginator only finds and groups plugins, rest is up to you,
8
+ you decide what methods to define and how to find them.
9
+
10
+ ## Defining plugins
11
+
12
+ crate a gem with a path:
13
+
14
+ ```ruby
15
+ plugins/<prefix>/<type>/<name>.rb
16
+ ```
17
+
18
+ with a class inside:
19
+
20
+ ```ruby
21
+ <prefix>::<type>::<name>
22
+ ```
23
+
24
+ where `<type>` can be nested
25
+
26
+ ## Loading plugins
27
+
28
+ ```ruby
29
+ rvm2plugins = Pluginator.new("<prefix>")
30
+ type_plugins = rvm2plugins["<type>"]
31
+ types = rvm2plugins.types
32
+ ```
33
+
34
+ ## Examples
35
+
36
+ ### Example 1 - task plugins
37
+
38
+ `plugins/rvm2/cli/echo.rb`:
39
+
40
+ ```ruby
41
+ class Rvm2::Cli::Echo
42
+ def self.question? command
43
+ command == "echo"
44
+ end
45
+ def answer param
46
+ puts param
47
+ end
48
+ end
49
+ ```
50
+
51
+ where `question?` and `answer` are user defined methods
52
+
53
+ Now the plugin can be used:
54
+
55
+ ```ruby
56
+ require 'pluginator'
57
+
58
+ rvm2plugins = Pluginator.new("rvm2")
59
+ plugin = rvm2plugins["cli"].first{ |plugin|
60
+ plugin.question?('echo')
61
+ }
62
+ plugin.new.answer("Hello world")
63
+ ```
64
+
65
+ ### Example 2 - hook plugins
66
+
67
+ `plugins/rvm2/hooks/after_install/show.rb`:
68
+
69
+ ```ruby
70
+ class Rvm2::Hooks::AfterInstall::Show
71
+ def self.execute name, path
72
+ puts "Ruby '#{name}' was installed in '#{path}'."
73
+ end
74
+ end
75
+ ```
76
+
77
+ and using hooks:
78
+
79
+ ```ruby
80
+ require 'pluginator'
81
+
82
+ rvm2plugins = Pluginator.new("rvm2")
83
+ plugin = rvm2plugins["hooks/after_install"].each{ |plugin|
84
+ plugin.execute(name, path)
85
+ }
86
+ ```
data/lib/pluginator.rb ADDED
@@ -0,0 +1,84 @@
1
+ class Pluginator
2
+ attr_reader :plugins_name
3
+
4
+ def initialize(plugins_name)
5
+ @plugins = {}
6
+ @plugins_name = plugins_name
7
+ detect
8
+ end
9
+
10
+ def first_plugin type, method, *args
11
+ result = nil
12
+ name, plugin = all_by_type(type).detect do |name, plugin|
13
+ result = plugin.send(method.to_sym, *args)
14
+ end
15
+ [ name, plugin, result ]
16
+ end
17
+
18
+ def all_by_type type
19
+ @plugins[type.to_s]
20
+ end
21
+ alias :[] :all_by_type
22
+
23
+ def types
24
+ @plugins.keys
25
+ end
26
+
27
+ # TODO do we need those???
28
+ def all_plugins type, method, *args
29
+ @plugins[type.to_s].select do |name,plugin|
30
+ plugin.send(method.to_sym, *args)
31
+ end
32
+ end
33
+ def first_plugin_by_parent parent_class
34
+ @plugins.detect do |type, plugins|
35
+ plugins.detect do |name, plugin|
36
+ plugin < parent_class
37
+ end
38
+ end
39
+ end
40
+ def find_class_by_parent parent_class
41
+ classes = []
42
+ ObjectSpace.each_object(Class) do |klass|
43
+ classes << klass if klass < parent_class
44
+ end
45
+ classes
46
+ end
47
+
48
+ private
49
+
50
+ def detect
51
+ Gem.find_files("plugins/#{@plugins_name}/*/*.rb").each do |file_name|
52
+ # $stderr.puts "parsing #{file_name}"
53
+ path, name, type = file_name.match(/.*\/(plugins\/(#{@plugins_name}\/(.*)\/[^\/]*)\.rb)$/)[1..3]
54
+ load_plugin path, file_name
55
+ register_plugin type, name
56
+ end
57
+ end
58
+
59
+ def load_plugin path, file_name
60
+ gemspec = Gem::Specification.find_by_path(path)
61
+ gemspec.activate if gemspec && !gemspec.activated?
62
+ require path
63
+ end
64
+
65
+ def register_plugin type, name
66
+ type = type.to_s
67
+ @plugins[type] ||= {}
68
+ if @plugins[type][name].nil?
69
+ # $stderr.puts "loading #{name}"
70
+ @plugins[type][name] = name2class(name)
71
+ end
72
+ end
73
+
74
+ def name2class name
75
+ klass = Kernel
76
+ name.split(/\//).map{ |part|
77
+ part.capitalize.gsub(/_(.)/){ $1.upcase }
78
+ }.each{|part|
79
+ klass = klass.const_get( part )
80
+ }
81
+ klass
82
+ end
83
+
84
+ end
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- encoding: utf-8 -*-
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = "pluginator"
6
+ s.version = "0.9.0"
7
+ s.authors = ["Michal Papis"]
8
+ s.email = ["mpapis@gmail.com"]
9
+ s.homepage = "https://github.com/mpapis/pluginator"
10
+ s.summary = %q{Rubygesm plugin system using Gem.find_files.}
11
+
12
+ s.files = `git ls-files`.split("\n")
13
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
14
+ s.required_ruby_version = '>= 1.9.2'
15
+
16
+ #s.add_development_dependency "smf-gem"
17
+ end
metadata ADDED
@@ -0,0 +1,51 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pluginator
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.9.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Michal Papis
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-02-14 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description:
15
+ email:
16
+ - mpapis@gmail.com
17
+ executables: []
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - .gitignore
22
+ - Gemfile
23
+ - README.md
24
+ - lib/pluginator.rb
25
+ - pluginator.gemspec
26
+ homepage: https://github.com/mpapis/pluginator
27
+ licenses: []
28
+ post_install_message:
29
+ rdoc_options: []
30
+ require_paths:
31
+ - lib
32
+ required_ruby_version: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: 1.9.2
38
+ required_rubygems_version: !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ requirements: []
45
+ rubyforge_project:
46
+ rubygems_version: 1.8.25
47
+ signing_key:
48
+ specification_version: 3
49
+ summary: Rubygesm plugin system using Gem.find_files.
50
+ test_files: []
51
+ has_rdoc: