plugins 0.2.4 → 0.3.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.
- checksums.yaml +4 -4
- data/lib/plugins.rb +95 -0
- data/lib/{ribbon/plugins → plugins}/around_stack.rb +2 -2
- data/lib/{ribbon/plugins → plugins}/block_stack.rb +2 -2
- data/lib/plugins/component_mixin.rb +45 -0
- data/lib/{ribbon/plugins → plugins}/errors.rb +2 -2
- data/lib/{ribbon/plugins → plugins}/plugin.rb +2 -2
- data/lib/plugins/version.rb +3 -0
- metadata +10 -10
- data/lib/ribbon/plugins.rb +0 -97
- data/lib/ribbon/plugins/component_mixin.rb +0 -47
- data/lib/ribbon/plugins/version.rb +0 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 456787abd50681a78ad147e4a211cb48def2d30f
|
4
|
+
data.tar.gz: 8a4ac2ed935ef744f9848c2d9537edab96f608e3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3f9059010da8fb8b9234bf989b40803d236b462ddbddd46453f56190bc5eecb0662d1b007badbb707c70b269aa36123541574125aaf437686ed9f0113e8060bb
|
7
|
+
data.tar.gz: 98621f1f7ca9c6f0565261fd9250a753329d45edd58399a355f82f3967c051ed87b7a0dd6638d27dc40c080d8180a37f8050255f2d447b228ecf63979dfbb1c6
|
data/lib/plugins.rb
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
require 'plugins/version'
|
2
|
+
|
3
|
+
class Plugins
|
4
|
+
autoload(:Errors, 'plugins/errors')
|
5
|
+
autoload(:Plugin, 'plugins/plugin')
|
6
|
+
autoload(:AroundStack, 'plugins/around_stack')
|
7
|
+
autoload(:BlockStack, 'plugins/block_stack')
|
8
|
+
autoload(:ComponentMixin, 'plugins/component_mixin')
|
9
|
+
|
10
|
+
attr_reader :component, :plugin_loader
|
11
|
+
|
12
|
+
def initialize(component=nil, &block)
|
13
|
+
@component = component
|
14
|
+
@plugin_loader = block
|
15
|
+
end
|
16
|
+
|
17
|
+
def add(plugin=nil, *args, &block)
|
18
|
+
plugin = _load(plugin, &block)
|
19
|
+
_add_plugin(plugin.new(self, *args))
|
20
|
+
end
|
21
|
+
|
22
|
+
def clear
|
23
|
+
@_plugins = nil
|
24
|
+
@_around_stack = nil
|
25
|
+
end
|
26
|
+
|
27
|
+
def before(subject, *args)
|
28
|
+
_plugins.reverse_each { |plugin| plugin.before(subject, *args) }
|
29
|
+
end
|
30
|
+
|
31
|
+
def after(subject, *args)
|
32
|
+
_plugins.reverse_each { |plugin| plugin.after(subject, *args) }
|
33
|
+
end
|
34
|
+
|
35
|
+
def around(subject, *args, &block)
|
36
|
+
_around_stack.call(subject, *args) { |subject, *args| block.call(*args) }
|
37
|
+
end
|
38
|
+
|
39
|
+
def perform(subject, *args, &block)
|
40
|
+
before(subject, *args)
|
41
|
+
retval = around(subject, *args, &block)
|
42
|
+
after(subject, *args)
|
43
|
+
|
44
|
+
retval
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
def _plugins
|
49
|
+
@_plugins ||= []
|
50
|
+
end
|
51
|
+
|
52
|
+
def _around_stack
|
53
|
+
@_around_stack ||= AroundStack.new(:block, self)
|
54
|
+
end
|
55
|
+
|
56
|
+
def _add_plugin(plugin)
|
57
|
+
_plugins.push(plugin)
|
58
|
+
|
59
|
+
_around_stack.push { |subject, *args|
|
60
|
+
plugin.around(subject, *args) { |*args|
|
61
|
+
perform_block(subject, *args)
|
62
|
+
}
|
63
|
+
}
|
64
|
+
|
65
|
+
plugin
|
66
|
+
end
|
67
|
+
|
68
|
+
def _load(plugin, &block)
|
69
|
+
if plugin
|
70
|
+
_load_plugin(plugin)
|
71
|
+
elsif block_given?
|
72
|
+
Plugin.create(&block)
|
73
|
+
else
|
74
|
+
raise Errors::LoadError, 'No plugin information provided'
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def _load_plugin(plugin)
|
79
|
+
_call_plugin_loader(plugin).tap { |p| plugin = p if p }
|
80
|
+
|
81
|
+
case plugin
|
82
|
+
when Class
|
83
|
+
plugin < Plugin && plugin or
|
84
|
+
raise Errors::LoadError, "Invalid plugin class: #{plugin.inspect} Must extend Plugin."
|
85
|
+
when Proc
|
86
|
+
Plugin.create(&plugin)
|
87
|
+
else
|
88
|
+
raise Errors::LoadError, "Invalid plugin identifier: #{plugin.inspect}"
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def _call_plugin_loader(plugin)
|
93
|
+
plugin_loader && component.instance_exec(plugin, &plugin_loader)
|
94
|
+
end
|
95
|
+
end # Plugins
|
@@ -0,0 +1,45 @@
|
|
1
|
+
class Plugins
|
2
|
+
##
|
3
|
+
# Intended to be mixed into any class utilizing the plugins functionality.
|
4
|
+
module ComponentMixin
|
5
|
+
def self.included(base)
|
6
|
+
base.extend(ClassMethods)
|
7
|
+
end
|
8
|
+
|
9
|
+
module ClassMethods
|
10
|
+
##
|
11
|
+
# Get or define the plugin loader.
|
12
|
+
#
|
13
|
+
# This block will be used to load a plugin given the value passed to the
|
14
|
+
# +plugin+ instance method. It's the responsibility of this block to
|
15
|
+
# translate the inputted value into either a Class that extends Plugin
|
16
|
+
# or a Proc.
|
17
|
+
#
|
18
|
+
# If for a particular value you wish to not perform any translation,
|
19
|
+
# return falsey.
|
20
|
+
def plugin_loader(&block)
|
21
|
+
if block_given?
|
22
|
+
@_plugin_loader = block
|
23
|
+
else
|
24
|
+
@_plugin_loader
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
###
|
30
|
+
# Instance Methods
|
31
|
+
###
|
32
|
+
|
33
|
+
##
|
34
|
+
# Reference to the Plugins instance for the component.
|
35
|
+
def plugins
|
36
|
+
@plugins ||= Plugins.new(self, &self.class.plugin_loader)
|
37
|
+
end
|
38
|
+
|
39
|
+
##
|
40
|
+
# Add a plugin.
|
41
|
+
def plugin(*args, &block)
|
42
|
+
plugins.add(*args, &block)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: plugins
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robert Honer
|
@@ -32,19 +32,19 @@ dependencies:
|
|
32
32
|
version: 3.2.0
|
33
33
|
description: A flexible plugins framework.
|
34
34
|
email:
|
35
|
-
- robert@
|
35
|
+
- robert@payout.com
|
36
36
|
executables: []
|
37
37
|
extensions: []
|
38
38
|
extra_rdoc_files: []
|
39
39
|
files:
|
40
|
-
- lib/
|
41
|
-
- lib/
|
42
|
-
- lib/
|
43
|
-
- lib/
|
44
|
-
- lib/
|
45
|
-
- lib/
|
46
|
-
- lib/
|
47
|
-
homepage: http://github.com/
|
40
|
+
- lib/plugins.rb
|
41
|
+
- lib/plugins/around_stack.rb
|
42
|
+
- lib/plugins/block_stack.rb
|
43
|
+
- lib/plugins/component_mixin.rb
|
44
|
+
- lib/plugins/errors.rb
|
45
|
+
- lib/plugins/plugin.rb
|
46
|
+
- lib/plugins/version.rb
|
47
|
+
homepage: http://github.com/payout/plugins
|
48
48
|
licenses:
|
49
49
|
- BSD
|
50
50
|
metadata: {}
|
data/lib/ribbon/plugins.rb
DELETED
@@ -1,97 +0,0 @@
|
|
1
|
-
require 'ribbon/plugins/version'
|
2
|
-
|
3
|
-
module Ribbon
|
4
|
-
class Plugins
|
5
|
-
autoload(:Errors, 'ribbon/plugins/errors')
|
6
|
-
autoload(:Plugin, 'ribbon/plugins/plugin')
|
7
|
-
autoload(:AroundStack, 'ribbon/plugins/around_stack')
|
8
|
-
autoload(:BlockStack, 'ribbon/plugins/block_stack')
|
9
|
-
autoload(:ComponentMixin, 'ribbon/plugins/component_mixin')
|
10
|
-
|
11
|
-
attr_reader :component, :plugin_loader
|
12
|
-
|
13
|
-
def initialize(component=nil, &block)
|
14
|
-
@component = component
|
15
|
-
@plugin_loader = block
|
16
|
-
end
|
17
|
-
|
18
|
-
def add(plugin=nil, *args, &block)
|
19
|
-
plugin = _load(plugin, &block)
|
20
|
-
_add_plugin(plugin.new(self, *args))
|
21
|
-
end
|
22
|
-
|
23
|
-
def clear
|
24
|
-
@_plugins = nil
|
25
|
-
@_around_stack = nil
|
26
|
-
end
|
27
|
-
|
28
|
-
def before(subject, *args)
|
29
|
-
_plugins.reverse_each { |plugin| plugin.before(subject, *args) }
|
30
|
-
end
|
31
|
-
|
32
|
-
def after(subject, *args)
|
33
|
-
_plugins.reverse_each { |plugin| plugin.after(subject, *args) }
|
34
|
-
end
|
35
|
-
|
36
|
-
def around(subject, *args, &block)
|
37
|
-
_around_stack.call(subject, *args) { |subject, *args| block.call(*args) }
|
38
|
-
end
|
39
|
-
|
40
|
-
def perform(subject, *args, &block)
|
41
|
-
before(subject, *args)
|
42
|
-
retval = around(subject, *args, &block)
|
43
|
-
after(subject, *args)
|
44
|
-
|
45
|
-
retval
|
46
|
-
end
|
47
|
-
|
48
|
-
private
|
49
|
-
def _plugins
|
50
|
-
@_plugins ||= []
|
51
|
-
end
|
52
|
-
|
53
|
-
def _around_stack
|
54
|
-
@_around_stack ||= AroundStack.new(:block, self)
|
55
|
-
end
|
56
|
-
|
57
|
-
def _add_plugin(plugin)
|
58
|
-
_plugins.push(plugin)
|
59
|
-
|
60
|
-
_around_stack.push { |subject, *args|
|
61
|
-
plugin.around(subject, *args) { |*args|
|
62
|
-
perform_block(subject, *args)
|
63
|
-
}
|
64
|
-
}
|
65
|
-
|
66
|
-
plugin
|
67
|
-
end
|
68
|
-
|
69
|
-
def _load(plugin, &block)
|
70
|
-
if plugin
|
71
|
-
_load_plugin(plugin)
|
72
|
-
elsif block_given?
|
73
|
-
Plugin.create(&block)
|
74
|
-
else
|
75
|
-
raise Errors::LoadError, 'No plugin information provided'
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
def _load_plugin(plugin)
|
80
|
-
_call_plugin_loader(plugin).tap { |p| plugin = p if p }
|
81
|
-
|
82
|
-
case plugin
|
83
|
-
when Class
|
84
|
-
plugin < Plugin && plugin or
|
85
|
-
raise Errors::LoadError, "Invalid plugin class: #{plugin.inspect} Must extend Plugin."
|
86
|
-
when Proc
|
87
|
-
Plugin.create(&plugin)
|
88
|
-
else
|
89
|
-
raise Errors::LoadError, "Invalid plugin identifier: #{plugin.inspect}"
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
def _call_plugin_loader(plugin)
|
94
|
-
plugin_loader && component.instance_exec(plugin, &plugin_loader)
|
95
|
-
end
|
96
|
-
end # Plugins
|
97
|
-
end # Ribbon
|
@@ -1,47 +0,0 @@
|
|
1
|
-
module Ribbon
|
2
|
-
class Plugins
|
3
|
-
##
|
4
|
-
# Intended to be mixed into any class utilizing the plugins functionality.
|
5
|
-
module ComponentMixin
|
6
|
-
def self.included(base)
|
7
|
-
base.extend(ClassMethods)
|
8
|
-
end
|
9
|
-
|
10
|
-
module ClassMethods
|
11
|
-
##
|
12
|
-
# Get or define the plugin loader.
|
13
|
-
#
|
14
|
-
# This block will be used to load a plugin given the value passed to the
|
15
|
-
# +plugin+ instance method. It's the responsibility of this block to
|
16
|
-
# translate the inputted value into either a Class that extends Plugin
|
17
|
-
# or a Proc.
|
18
|
-
#
|
19
|
-
# If for a particular value you wish to not perform any translation,
|
20
|
-
# return falsey.
|
21
|
-
def plugin_loader(&block)
|
22
|
-
if block_given?
|
23
|
-
@_plugin_loader = block
|
24
|
-
else
|
25
|
-
@_plugin_loader
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
###
|
31
|
-
# Instance Methods
|
32
|
-
###
|
33
|
-
|
34
|
-
##
|
35
|
-
# Reference to the Plugins instance for the component.
|
36
|
-
def plugins
|
37
|
-
@plugins ||= Plugins.new(self, &self.class.plugin_loader)
|
38
|
-
end
|
39
|
-
|
40
|
-
##
|
41
|
-
# Add a plugin.
|
42
|
-
def plugin(*args, &block)
|
43
|
-
plugins.add(*args, &block)
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|