much-plugin 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bench/script.rb +27 -0
- data/lib/much-plugin.rb +21 -15
- data/lib/much-plugin/version.rb +1 -1
- data/much-plugin.gemspec +2 -2
- data/test/unit/much-plugin_tests.rb +9 -5
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
|
4
|
-
|
3
|
+
metadata.gz: 7f75f3177a2f12db73711551a7ae1c1f8676addf
|
4
|
+
data.tar.gz: 5fe30d9b7dc34dcb998a1a47b7ea37e1f3b0de80
|
5
5
|
SHA512:
|
6
|
-
|
7
|
-
|
6
|
+
metadata.gz: 9792123b848b0fb119f42d7fc13ba15ec2d7af55eab316137f3b4a782912f830668859bcc6683ace7827920ee72000178133b6f92534d2448788f0a73b4c77a6
|
7
|
+
data.tar.gz: cb9a718201fa65522e4570ba8cee508b2c7818ccab7e99c50aa52c52ea666b016f9330202b5ca28bf33b7d1aca5a6f0f77e74cd3a8cb762949ecc136184315eb
|
data/bench/script.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'much-plugin'
|
2
|
+
require 'benchmark'
|
3
|
+
|
4
|
+
module Methods; end
|
5
|
+
|
6
|
+
module MyMixin
|
7
|
+
def self.included(receiver)
|
8
|
+
receiver.class_eval{ include Methods }
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
module MyPlugin
|
13
|
+
include MuchPlugin
|
14
|
+
|
15
|
+
plugin_included do
|
16
|
+
include Methods
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
Benchmark.bmbm do |x|
|
21
|
+
x.report("MyMixin") do
|
22
|
+
10_000.times{ Class.new{ include MyMixin } }
|
23
|
+
end
|
24
|
+
x.report("MyPlugin") do
|
25
|
+
10_000.times{ Class.new{ include MyPlugin } }
|
26
|
+
end
|
27
|
+
end
|
data/lib/much-plugin.rb
CHANGED
@@ -3,28 +3,34 @@ require "much-plugin/version"
|
|
3
3
|
module MuchPlugin
|
4
4
|
|
5
5
|
def self.included(receiver)
|
6
|
-
receiver.class_eval
|
7
|
-
|
6
|
+
receiver.class_eval{ extend ClassMethods }
|
7
|
+
end
|
8
8
|
|
9
|
-
|
10
|
-
# already been installed on the reciever. If it has not been,
|
11
|
-
# class eval each callback on the receiver.
|
9
|
+
module ClassMethods
|
12
10
|
|
13
|
-
|
14
|
-
|
11
|
+
# install an included hook that first checks if this plugin's receiver mixin
|
12
|
+
# has already been included. If it has not been, include the receiver mixin
|
13
|
+
# and run all of the `plugin_included` hooks
|
14
|
+
def included(plugin_receiver)
|
15
|
+
return if plugin_receiver.include?(self.much_plugin_included_detector)
|
16
|
+
plugin_receiver.send(:include, self.much_plugin_included_detector)
|
15
17
|
|
16
|
-
|
17
|
-
|
18
|
-
plugin_receiver.class_eval(&hook)
|
19
|
-
end
|
18
|
+
self.much_plugin_included_hooks.each do |hook|
|
19
|
+
plugin_receiver.class_eval(&hook)
|
20
20
|
end
|
21
|
-
|
22
21
|
end
|
23
|
-
end
|
24
22
|
|
25
|
-
|
23
|
+
# the included detector is an empty module that is only used to detect if
|
24
|
+
# the plugin has been included or not, it doesn't add any behavior or
|
25
|
+
# methods to the object receiving the plugin; we use `const_set` to name the
|
26
|
+
# module so if its seen in the ancestors it doesn't look like some random
|
27
|
+
# module and it can be tracked back to much-plugin
|
28
|
+
def much_plugin_included_detector
|
29
|
+
@much_plugin_included_detector ||= Module.new.tap do |m|
|
30
|
+
self.const_set("MuchPluginIncludedDetector", m)
|
31
|
+
end
|
32
|
+
end
|
26
33
|
|
27
|
-
def much_plugin_receivers; @much_plugin_receivers ||= []; end
|
28
34
|
def much_plugin_included_hooks; @much_plugin_included_hooks ||= []; end
|
29
35
|
|
30
36
|
def plugin_included(&hook)
|
data/lib/much-plugin/version.rb
CHANGED
data/much-plugin.gemspec
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
lib = File.expand_path('../lib', __FILE__)
|
3
3
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require
|
4
|
+
require "much-plugin/version"
|
5
5
|
|
6
6
|
Gem::Specification.new do |gem|
|
7
7
|
gem.name = "much-plugin"
|
8
|
-
gem.version = MuchPlugin::VERSION
|
8
|
+
gem.version = "0.2.0" #MuchPlugin::VERSION
|
9
9
|
gem.authors = ["Kelly Redding", "Collin Redding"]
|
10
10
|
gem.email = ["kelly@kellyredding.com", "collin.redding@me.com"]
|
11
11
|
gem.summary = %q{An API to ensure mixin included logic (the "plugin") only runs once.}
|
@@ -13,15 +13,19 @@ module MuchPlugin
|
|
13
13
|
end
|
14
14
|
subject{ @plugin }
|
15
15
|
|
16
|
-
should have_imeths :
|
16
|
+
should have_imeths :much_plugin_included_detector, :much_plugin_included_hooks
|
17
17
|
should have_imeths :plugin_included
|
18
18
|
|
19
|
-
should "
|
20
|
-
|
19
|
+
should "know its included detector" do
|
20
|
+
mixin = subject.much_plugin_included_detector
|
21
|
+
assert_instance_of Module, mixin
|
22
|
+
assert_same mixin, subject.much_plugin_included_detector
|
23
|
+
exp = subject::MuchPluginIncludedDetector
|
24
|
+
assert_same exp, subject.much_plugin_included_detector
|
21
25
|
end
|
22
26
|
|
23
|
-
should "have no plugin
|
24
|
-
assert_empty subject.
|
27
|
+
should "have no plugin included hooks by default" do
|
28
|
+
assert_empty subject.much_plugin_included_hooks
|
25
29
|
end
|
26
30
|
|
27
31
|
should "append hooks" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: much-plugin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kelly Redding
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2016-06-
|
13
|
+
date: 2016-06-03 00:00:00 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: assert
|
@@ -37,6 +37,7 @@ files:
|
|
37
37
|
- Gemfile
|
38
38
|
- LICENSE
|
39
39
|
- README.md
|
40
|
+
- bench/script.rb
|
40
41
|
- lib/much-plugin.rb
|
41
42
|
- lib/much-plugin/version.rb
|
42
43
|
- log/.gitkeep
|
@@ -67,7 +68,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
67
68
|
requirements: []
|
68
69
|
|
69
70
|
rubyforge_project:
|
70
|
-
rubygems_version: 2.
|
71
|
+
rubygems_version: 2.5.1
|
71
72
|
signing_key:
|
72
73
|
specification_version: 4
|
73
74
|
summary: An API to ensure mixin included logic (the "plugin") only runs once.
|