pluginator 0.11.3 → 0.11.4
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.
- checksums.yaml +4 -4
- data/README.md +16 -0
- data/lib/pluginator.rb +6 -0
- data/lib/pluginator/autodetect.rb +4 -0
- data/lib/pluginator/errors.rb +9 -0
- data/lib/pluginator/extendable_autodetect.rb +9 -0
- data/lib/pluginator/group.rb +9 -0
- data/lib/pluginator/version.rb +2 -1
- data/lib/plugins/pluginator/extensions/conversions.rb +5 -0
- data/lib/plugins/pluginator/extensions/first_ask.rb +9 -1
- data/lib/plugins/pluginator/extensions/first_class.rb +7 -0
- data/lib/plugins/pluginator/extensions/matching.rb +7 -0
- data/lib/plugins/pluginator/extensions/plugins_map.rb +4 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a42be419608abc90291c8358a4f23b1e43165cec
|
4
|
+
data.tar.gz: baa6ea7161c799f1455cc31fff04f4be8e594794
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8cf984f2cb328242a966ae4cd58b4e19d2314689c00bac2a08356149ef8ea98bea0ef4864f39af033f79f4031b573c59b6b97dd0199280c320bf6c25c2441414
|
7
|
+
data.tar.gz: eea32d7a0e76329967ff1a9ef62d9cf3b92fc40433997148ccb5408c77d4f7956d829d3141daacd4428ca88d7a1640a2b5dc0046366fe01a9fd20d09ae54fb4a
|
data/README.md
CHANGED
@@ -63,6 +63,16 @@ plugins.first_ask( "<type>", "method_to_call", *params) => plugin or nil
|
|
63
63
|
plugins.first_ask!("<type>", "method_to_call", *params) => plugin or exception PluginatorError
|
64
64
|
```
|
65
65
|
|
66
|
+
### First class
|
67
|
+
|
68
|
+
Find first plugin that clas matches the given name.
|
69
|
+
|
70
|
+
```ruby
|
71
|
+
plugins = Pluginator.find("<group>", extends: %i{first_class})
|
72
|
+
plugins.first_class( "<type>", "<name>") => plugin or nil
|
73
|
+
plugins.first_class!("<type>", "<name>") => plugin or exception PluginatorError
|
74
|
+
```
|
75
|
+
|
66
76
|
### Matching
|
67
77
|
|
68
78
|
Map array of names to available plugins.
|
@@ -73,6 +83,12 @@ plugins.matching( "<type>", [<array_of_names>]) => [plugins] # nil for missing o
|
|
73
83
|
plugins.matching!("<type>", [<array_of_names>]) => [plugins] or exception PluginatorError
|
74
84
|
```
|
75
85
|
|
86
|
+
## Exceptions
|
87
|
+
|
88
|
+
- `PluginatorError` - base error for all Pluginator errors
|
89
|
+
- `MissingPlugin` - raised when plugin can not be found, generated by `*!` methods
|
90
|
+
- `MissingType` - raised when type can not be found, generated by `*!` methods
|
91
|
+
|
76
92
|
## Examples
|
77
93
|
|
78
94
|
### Example 1 - task plugins
|
data/lib/pluginator.rb
CHANGED
@@ -2,6 +2,12 @@ require_relative "pluginator/extendable_autodetect"
|
|
2
2
|
require_relative "pluginator/version"
|
3
3
|
|
4
4
|
module Pluginator
|
5
|
+
# Find plugins for the given group
|
6
|
+
#
|
7
|
+
# @param group [String] name of plugins group
|
8
|
+
# @param type [String] optional name of type to load
|
9
|
+
# @param extends optional list of extension to extend into pluginator instance
|
10
|
+
# @return instance of Pluginator
|
5
11
|
def self.group(group, type: nil, extends: [])
|
6
12
|
Pluginator::ExtendableAutodetect.new(group, type: type, extends: extends)
|
7
13
|
end
|
@@ -5,6 +5,10 @@ require_relative "name_converter"
|
|
5
5
|
module Pluginator
|
6
6
|
class Autodetect < Group
|
7
7
|
|
8
|
+
# Automatically load plugins for given group (and type)
|
9
|
+
#
|
10
|
+
# @param group [String] name of the plugins group
|
11
|
+
# @param type [String] optional name of the plugin type
|
8
12
|
def initialize(group, type: nil)
|
9
13
|
super(group)
|
10
14
|
setup_autodetect(type)
|
data/lib/pluginator/errors.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
module Pluginator
|
2
|
+
|
3
|
+
# base error for all Pluginator errors
|
2
4
|
class PluginatorError < RuntimeError
|
3
5
|
private
|
4
6
|
def list_to_s(list)
|
@@ -6,13 +8,20 @@ module Pluginator
|
|
6
8
|
end
|
7
9
|
end
|
8
10
|
|
11
|
+
# raised when plugin can not be found, generated by `*!` methods
|
9
12
|
class MissingPlugin < PluginatorError
|
13
|
+
# @param type [String] type of the loaded plugin
|
14
|
+
# @param name [String] name of the loaded plugin
|
15
|
+
# @param list [Array] list of available plugins
|
10
16
|
def initialize(type, name, list)
|
11
17
|
super("Can not find plugin '#{name}' in #{list_to_s(list)} for type '#{type}'.")
|
12
18
|
end
|
13
19
|
end
|
14
20
|
|
21
|
+
# raised when type can not be found, generated by `*!` methods
|
15
22
|
class MissingType < PluginatorError
|
23
|
+
# @param type [String] type of the loaded plugin
|
24
|
+
# @param list [Array] list of available types
|
16
25
|
def initialize(type, list)
|
17
26
|
super("Can not find type '#{type}' in #{list_to_s(list)}.")
|
18
27
|
end
|
@@ -3,11 +3,20 @@ require_relative "autodetect"
|
|
3
3
|
module Pluginator
|
4
4
|
class ExtendableAutodetect < Autodetect
|
5
5
|
|
6
|
+
# Automatically load plugins for given group (and type)
|
7
|
+
# Extend instance with extensions if given.
|
8
|
+
#
|
9
|
+
# @param group [String] name of the plugins group
|
10
|
+
# @param type [String] optional name of the plugin type
|
11
|
+
# @param extends optional list of extension to extend into pluginator instance
|
6
12
|
def initialize(group, type: nil, extends: [])
|
7
13
|
super(group, type: type)
|
8
14
|
extend_plugins(extends)
|
9
15
|
end
|
10
16
|
|
17
|
+
# Extend pluginator instance with given extensions
|
18
|
+
#
|
19
|
+
# @param extends list of extension to extend into pluginator instance
|
11
20
|
def extend_plugins(extends)
|
12
21
|
extensions_matching(extends).each do |plugin|
|
13
22
|
extend plugin
|
data/lib/pluginator/group.rb
CHANGED
@@ -1,19 +1,28 @@
|
|
1
1
|
module Pluginator
|
2
2
|
class Group
|
3
|
+
# Group name used for plugins
|
3
4
|
attr_reader :group
|
4
5
|
|
6
|
+
# @param group [String] name of the plugins group
|
5
7
|
def initialize(group)
|
6
8
|
setup_group(group)
|
7
9
|
end
|
8
10
|
|
11
|
+
# @param [String] type of plugins to select
|
12
|
+
# @return [Array] list of plugins for type
|
9
13
|
def [](type)
|
10
14
|
@plugins[type.to_s]
|
11
15
|
end
|
12
16
|
|
17
|
+
# @return [Array] list of plugin types loaded
|
13
18
|
def types
|
14
19
|
@plugins.keys
|
15
20
|
end
|
16
21
|
|
22
|
+
# Register a new plugin, can be used to load custom plugins
|
23
|
+
#
|
24
|
+
# @param type [String] type for the klass
|
25
|
+
# @param klass [Class] klass of the plugin to add
|
17
26
|
def register_plugin(type, klass)
|
18
27
|
type = type.to_s
|
19
28
|
@plugins[type] ||= []
|
data/lib/pluginator/version.rb
CHANGED
@@ -1,10 +1,15 @@
|
|
1
1
|
module Pluginator::Extensions
|
2
2
|
module Conversions
|
3
|
+
|
4
|
+
# converts class name to a file name
|
3
5
|
def class2string( klass )
|
4
6
|
klass.to_s.gsub(/([A-Z])/m){|match| "_#{$1.downcase}" }[1..-1]
|
5
7
|
end
|
8
|
+
|
9
|
+
# converts file name to a class name
|
6
10
|
def string2class( str )
|
7
11
|
str.to_s.capitalize.gsub(/_(.)/){ $1.upcase }
|
8
12
|
end
|
13
|
+
|
9
14
|
end
|
10
15
|
end
|
@@ -4,13 +4,21 @@ module Pluginator::Extensions
|
|
4
4
|
module FirstAsk
|
5
5
|
include PluginsMap
|
6
6
|
|
7
|
+
# Call a method on plugin and return first one that returns `true`.
|
8
|
+
#
|
9
|
+
# @param type [String] name of type to search for plugins
|
10
|
+
# @param method_name [Symbol] name of the method to execute
|
11
|
+
# @param *params [Array] params to pass to the called method
|
12
|
+
# @return The first plugin that method call returns true
|
7
13
|
def first_ask(type, method_name, *params)
|
8
14
|
@plugins[type] or return nil
|
9
15
|
@plugins[type].detect do |plugin|
|
10
|
-
plugin.public_send(method_name, *params)
|
16
|
+
plugin.public_send(method_name.to_sym, *params)
|
11
17
|
end
|
12
18
|
end
|
13
19
|
|
20
|
+
# Call a method on plugin and return first one that returns `true`.
|
21
|
+
# Behaves like `first_ask` but throws exceptions if can not find anything.
|
14
22
|
def first_ask!(type, method_name, *params)
|
15
23
|
@plugins[type] or raise Pluginator::MissingType.new(type, @plugins.keys)
|
16
24
|
@plugins[type].detect do |plugin|
|
@@ -6,10 +6,17 @@ module Pluginator::Extensions
|
|
6
6
|
include PluginsMap
|
7
7
|
include Conversions
|
8
8
|
|
9
|
+
# Find first plugin that clas matches the given name.
|
10
|
+
#
|
11
|
+
# @param type [String] name of type to search for plugins
|
12
|
+
# @param klass [Symbol or String] name of the searched class
|
13
|
+
# @return The first plugin that matches the klass
|
9
14
|
def first_class(type, klass)
|
10
15
|
(plugins_map(type) || {})[string2class(klass)]
|
11
16
|
end
|
12
17
|
|
18
|
+
# Find first plugin that clas matches the given name.
|
19
|
+
# Behaves like `first_class` but throws exceptions if can not find anything.
|
13
20
|
def first_class!(type, klass)
|
14
21
|
@plugins[type] or raise Pluginator::MissingType.new(type, @plugins.keys)
|
15
22
|
klass = string2class(klass)
|
@@ -6,12 +6,19 @@ module Pluginator::Extensions
|
|
6
6
|
include PluginsMap
|
7
7
|
include Conversions
|
8
8
|
|
9
|
+
# Map array of names to available plugins.
|
10
|
+
#
|
11
|
+
# @param type [String] name of type to search for plugins
|
12
|
+
# @param list [Array] list of plugin names to load
|
13
|
+
# @return [Array] list of loaded plugins
|
9
14
|
def matching(type, list)
|
10
15
|
list.map do |plugin|
|
11
16
|
(plugins_map(type) || {})[string2class(plugin)]
|
12
17
|
end
|
13
18
|
end
|
14
19
|
|
20
|
+
# Map array of names to available plugins.
|
21
|
+
# Behaves like `matching` but throws exceptions if can not find anything.
|
15
22
|
def matching!(type, list)
|
16
23
|
@plugins[type] or raise Pluginator::MissingType.new(type, @plugins.keys)
|
17
24
|
list.map do |plugin|
|
@@ -1,5 +1,9 @@
|
|
1
1
|
module Pluginator::Extensions
|
2
2
|
module PluginsMap
|
3
|
+
# provide extra map of plugins with symbolized names as keys
|
4
|
+
#
|
5
|
+
# @param type [String] name of type to generate the map for
|
6
|
+
# @return [Hash] map of the names and plugin classes
|
3
7
|
def plugins_map( type )
|
4
8
|
@plugins_map ||= {}
|
5
9
|
type = type.to_s
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pluginator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.11.
|
4
|
+
version: 0.11.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michal Papis
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-05-
|
11
|
+
date: 2013-05-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|