ruby-hooks 0.0.1 → 1.0.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 +5 -13
- data/lib/ruby/hooks.rb +8 -0
- data/lib/ruby/hooks/extensible.rb +23 -0
- data/lib/ruby/hooks/hook.rb +28 -0
- data/lib/ruby/hooks/instance_hooks.rb +30 -0
- data/lib/ruby/hooks/version.rb +10 -2
- data/test/example1_test.rb +48 -0
- data/test/example2_test.rb +63 -0
- data/test/ruby/hooks/extensible_test.rb +58 -0
- data/test/ruby/hooks/hook_test.rb +29 -0
- data/test/ruby/hooks/instance_hooks_test.rb +35 -0
- data/test/test_helper.rb +33 -0
- metadata +38 -7
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
MWVjYTA2ZDI4ODY2YWVmNDY2NGNjNDQ5MjJkMDZjN2I3NjgzYjE3OQ==
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: faf3e81331151394f1e31790f945f67194a4477d
|
4
|
+
data.tar.gz: 76c02d07f7f8bbe97b04fb29b2f03bab744dd827
|
7
5
|
SHA512:
|
8
|
-
metadata.gz:
|
9
|
-
|
10
|
-
ZmVjNzljMjg3NGY3YjFjYjZjNTZlOTFmOGE1NTAyMzVlOWNmNWVkYzIyY2Zi
|
11
|
-
M2YwMjY2MTRhZTI1Y2Q2Y2FlOGViMGMzMDJmZmI2NjVjMWFlZGM=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
YWI1NmQzYzJmZTk5N2IxNWIyODQ5NWYzZmJiY2IxMmI1YzdlNTgzMDI4MWQ3
|
14
|
-
ODdlMjFjNDE0YTBiOGMzODE3NTE1ZjllMWJjMWFjNzY2MTc1NGQ3OTcwNzFi
|
15
|
-
NDQwNTUxNzIxMjY5MmEwODdiNGI5M2MwNDIyNGQwNDE3NzJkNzI=
|
6
|
+
metadata.gz: 42d819cf30ef2957b783dfb9fb1a7b29e5c0c66ac3cfabe7bc7810f506d613f56c00e8da885b27db437f73635ed77292a461b4656470f336612e371df23072c0
|
7
|
+
data.tar.gz: 06ec442741c9e8d95221724f2af93dccc9b5b56e4a9579ff35054db4be822ce1c0c6258d0ad64c506582576d782cd79edff49222081b8432206a5206fe5ecd08
|
data/lib/ruby/hooks.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
=begin
|
2
|
+
Copyright 2014 Michal Papis <mpapis@gmail.com>
|
3
|
+
|
4
|
+
See the file LICENSE for copying permission.
|
5
|
+
=end
|
6
|
+
|
7
|
+
# Allow extending object with plugins(modules)
|
8
|
+
module Ruby::Hooks::Extensible
|
9
|
+
|
10
|
+
# handle single parameters as well as arrays of params
|
11
|
+
# @param method [Symbol] name of the method to call
|
12
|
+
# @param plugins [Array] call method for every element of array
|
13
|
+
# @param plugins [Object] call method for the object
|
14
|
+
# @returns :nodoc: - unperdictable
|
15
|
+
def add_plugins(method, plugins = nil)
|
16
|
+
case plugins
|
17
|
+
when Array then plugins.each { |plugin| send(method, plugin) }
|
18
|
+
when nil then true
|
19
|
+
else send(method, plugins)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
=begin
|
2
|
+
Copyright 2014 Michal Papis <mpapis@gmail.com>
|
3
|
+
|
4
|
+
See the file LICENSE for copying permission.
|
5
|
+
=end
|
6
|
+
|
7
|
+
require "observer"
|
8
|
+
require "ruby/hooks/extensible"
|
9
|
+
|
10
|
+
# Wrapper for Observable module
|
11
|
+
class Ruby::Hooks::Hook
|
12
|
+
include Observable
|
13
|
+
include ::Ruby::Hooks::Extensible
|
14
|
+
|
15
|
+
# automatically extends Hook instance with given modules
|
16
|
+
# @option options [Array] :extend array of modules to extend hook instance
|
17
|
+
# @option options [Module] :extend module to extend hook instance
|
18
|
+
def initialize(options = {})
|
19
|
+
@options = options
|
20
|
+
add_plugins( :extend, options[:extends])
|
21
|
+
end
|
22
|
+
|
23
|
+
# allow writign code independent of the internals of Observable
|
24
|
+
def observers
|
25
|
+
@observer_peers
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
=begin
|
2
|
+
Copyright 2014 Michal Papis <mpapis@gmail.com>
|
3
|
+
|
4
|
+
See the file LICENSE for copying permission.
|
5
|
+
=end
|
6
|
+
|
7
|
+
require "ruby/hooks/hook"
|
8
|
+
|
9
|
+
# Helper to add multiple instance hooks
|
10
|
+
module Ruby::Hooks::InstanceHooks
|
11
|
+
|
12
|
+
# define instance hook method, it gives easy acces to Hook and
|
13
|
+
# it's methods
|
14
|
+
#
|
15
|
+
# @param name [Symbol] name of the hook handling method to define
|
16
|
+
# @param options [Hash] optional settigns for hook
|
17
|
+
# @option options [Module] :extends - the module to extend hook instance
|
18
|
+
# @return [Method or Symbol] exactly what method definition would return
|
19
|
+
def define_hook(name, options = {})
|
20
|
+
define_method(name) do
|
21
|
+
if hook = instance_variable_get(:"@#{name}")
|
22
|
+
then return hook
|
23
|
+
end
|
24
|
+
hook = Ruby::Hooks::Hook.new(options)
|
25
|
+
instance_variable_set(:"@#{name}", hook)
|
26
|
+
hook
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
data/lib/ruby/hooks/version.rb
CHANGED
@@ -1,6 +1,14 @@
|
|
1
|
+
=begin
|
2
|
+
Copyright 2014 Michal Papis <mpapis@gmail.com>
|
3
|
+
|
4
|
+
See the file LICENSE for copying permission.
|
5
|
+
=end
|
6
|
+
|
1
7
|
module Ruby
|
2
|
-
|
3
|
-
|
8
|
+
# Helpers for multiple publish/subscribe hooks
|
9
|
+
module Hooks
|
10
|
+
# Rubygems version of Ruby::Hooks
|
11
|
+
VERSION = '1.0.0'
|
4
12
|
end
|
5
13
|
end
|
6
14
|
|
@@ -0,0 +1,48 @@
|
|
1
|
+
=begin
|
2
|
+
Copyright 2014 Michal Papis <mpapis@gmail.com>
|
3
|
+
|
4
|
+
See the file LICENSE for copying permission.
|
5
|
+
=end
|
6
|
+
|
7
|
+
require 'test_helper'
|
8
|
+
require 'ruby/hooks'
|
9
|
+
|
10
|
+
class Test1
|
11
|
+
extend Ruby::Hooks::InstanceHooks
|
12
|
+
define_hook(:my_event_one)
|
13
|
+
end
|
14
|
+
|
15
|
+
class Observer1
|
16
|
+
attr_accessor :result
|
17
|
+
def update(x)
|
18
|
+
@result = x
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
class Observer2
|
23
|
+
attr_accessor :result
|
24
|
+
def log(x)
|
25
|
+
@result = x
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe Ruby::Hooks::Extensible do
|
30
|
+
subject do
|
31
|
+
Test1.new
|
32
|
+
end
|
33
|
+
|
34
|
+
before do
|
35
|
+
@object1 = Observer1.new
|
36
|
+
@object2 = Observer2.new
|
37
|
+
end
|
38
|
+
|
39
|
+
it "uses extended method to find single observer" do
|
40
|
+
subject.my_event_one.add_observer(@object1)
|
41
|
+
subject.my_event_one.add_observer(@object2, :log)
|
42
|
+
subject.my_event_one.changed
|
43
|
+
subject.my_event_one.notify_observers("msg")
|
44
|
+
@object1.result.must_equal("msg")
|
45
|
+
@object2.result.must_equal("msg")
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
=begin
|
2
|
+
Copyright 2014 Michal Papis <mpapis@gmail.com>
|
3
|
+
|
4
|
+
See the file LICENSE for copying permission.
|
5
|
+
=end
|
6
|
+
|
7
|
+
require 'test_helper'
|
8
|
+
require 'ruby/hooks'
|
9
|
+
|
10
|
+
module FindObserver
|
11
|
+
def find_observer(*arg)
|
12
|
+
result = nil
|
13
|
+
if changed?
|
14
|
+
if observers
|
15
|
+
result =
|
16
|
+
observers.find do |k, v|
|
17
|
+
k.send v, *arg
|
18
|
+
end
|
19
|
+
end
|
20
|
+
changed(false)
|
21
|
+
end
|
22
|
+
result and result.first
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
class Test2
|
27
|
+
extend Ruby::Hooks::InstanceHooks
|
28
|
+
define_hook(:my_event_two, :extends => FindObserver)
|
29
|
+
end
|
30
|
+
|
31
|
+
class Observer3
|
32
|
+
def test_me(x)
|
33
|
+
x == 3
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
class Observer4
|
38
|
+
def test_me(x)
|
39
|
+
x == 4
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe Ruby::Hooks::Extensible do
|
44
|
+
subject do
|
45
|
+
Test2.new
|
46
|
+
end
|
47
|
+
|
48
|
+
it "uses extended method to find single observer" do
|
49
|
+
subject.my_event_two.add_observer(Observer3.new, :test_me)
|
50
|
+
subject.my_event_two.add_observer(Observer4.new, :test_me)
|
51
|
+
subject.my_event_two.methods.map(&:to_sym).must_include :find_observer
|
52
|
+
subject.my_event_two.changed
|
53
|
+
subject.my_event_two.changed?.must_equal true
|
54
|
+
subject.my_event_two.find_observer(1).must_be_nil
|
55
|
+
subject.my_event_two.changed?.must_equal false
|
56
|
+
subject.my_event_two.changed
|
57
|
+
subject.my_event_two.find_observer(3).must_be_instance_of(Observer3)
|
58
|
+
subject.my_event_two.changed
|
59
|
+
subject.my_event_two.find_observer(4).must_be_instance_of(Observer4)
|
60
|
+
subject.my_event_two.find_observer(4).must_be_nil
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
=begin
|
2
|
+
Copyright 2014 Michal Papis <mpapis@gmail.com>
|
3
|
+
|
4
|
+
See the file LICENSE for copying permission.
|
5
|
+
=end
|
6
|
+
|
7
|
+
require 'test_helper'
|
8
|
+
require 'ruby/hooks/extensible'
|
9
|
+
|
10
|
+
class ExtensibleTestClass
|
11
|
+
include Ruby::Hooks::Extensible
|
12
|
+
attr_reader :calls
|
13
|
+
def initialize
|
14
|
+
@calls = []
|
15
|
+
end
|
16
|
+
def count(name)
|
17
|
+
@calls << name
|
18
|
+
end
|
19
|
+
module Extra
|
20
|
+
def method_1
|
21
|
+
end
|
22
|
+
end
|
23
|
+
module Test1
|
24
|
+
end
|
25
|
+
module Test2
|
26
|
+
end
|
27
|
+
module Test3
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe Ruby::Hooks::Extensible do
|
32
|
+
subject do
|
33
|
+
ExtensibleTestClass.new
|
34
|
+
end
|
35
|
+
|
36
|
+
it "extends self" do
|
37
|
+
subject.methods.map(&:to_sym).wont_include :method_1
|
38
|
+
subject.add_plugins :extend, ExtensibleTestClass::Extra
|
39
|
+
subject.methods.map(&:to_sym).must_include :method_1
|
40
|
+
subject.calls.must_be_empty
|
41
|
+
end
|
42
|
+
|
43
|
+
it "calls single element" do
|
44
|
+
subject.add_plugins :count, ExtensibleTestClass::Test1
|
45
|
+
subject.calls.must_equal [ExtensibleTestClass::Test1]
|
46
|
+
end
|
47
|
+
|
48
|
+
it "calls each element" do
|
49
|
+
subject.add_plugins :count, [ExtensibleTestClass::Test1, ExtensibleTestClass::Test2, ExtensibleTestClass::Test3]
|
50
|
+
subject.calls.must_equal [ExtensibleTestClass::Test1, ExtensibleTestClass::Test2, ExtensibleTestClass::Test3]
|
51
|
+
end
|
52
|
+
|
53
|
+
it "calls nothing" do
|
54
|
+
subject.add_plugins :count
|
55
|
+
subject.calls.must_equal []
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
=begin
|
2
|
+
Copyright 2014 Michal Papis <mpapis@gmail.com>
|
3
|
+
|
4
|
+
See the file LICENSE for copying permission.
|
5
|
+
=end
|
6
|
+
|
7
|
+
require 'test_helper'
|
8
|
+
require 'ruby/hooks/hook'
|
9
|
+
|
10
|
+
class HookTestClass
|
11
|
+
module Extra
|
12
|
+
def method_2
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe Ruby::Hooks::Hook do
|
18
|
+
subject do
|
19
|
+
Ruby::Hooks::Hook.allocate
|
20
|
+
end
|
21
|
+
|
22
|
+
it "extends self" do
|
23
|
+
subject.must_be_kind_of(Observable)
|
24
|
+
subject.methods.map(&:to_sym).wont_include :method_2
|
25
|
+
subject.send :initialize, :extends => HookTestClass::Extra
|
26
|
+
subject.methods.map(&:to_sym).must_include :method_2
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
=begin
|
2
|
+
Copyright 2014 Michal Papis <mpapis@gmail.com>
|
3
|
+
|
4
|
+
See the file LICENSE for copying permission.
|
5
|
+
=end
|
6
|
+
|
7
|
+
require 'test_helper'
|
8
|
+
require 'ruby/hooks/instance_hooks'
|
9
|
+
|
10
|
+
class InstanceHooksTestClass
|
11
|
+
module Extra
|
12
|
+
def method3
|
13
|
+
end
|
14
|
+
end
|
15
|
+
extend Ruby::Hooks::InstanceHooks
|
16
|
+
define_hook(:test1)
|
17
|
+
define_hook(:test2, :extends => Extra)
|
18
|
+
end
|
19
|
+
|
20
|
+
describe Ruby::Hooks::Extensible do
|
21
|
+
subject do
|
22
|
+
InstanceHooksTestClass.new
|
23
|
+
end
|
24
|
+
|
25
|
+
it "defines and extends hooks" do
|
26
|
+
subject.methods.map(&:to_sym).must_include :test1
|
27
|
+
subject.methods.map(&:to_sym).must_include :test2
|
28
|
+
subject.test2.methods.map(&:to_sym).must_include :method3
|
29
|
+
end
|
30
|
+
|
31
|
+
it "reuses existing hook" do
|
32
|
+
subject.test2.must_equal subject.test2
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
=begin
|
2
|
+
Copyright 2014 Michal Papis <mpapis@gmail.com>
|
3
|
+
|
4
|
+
See the file LICENSE for copying permission.
|
5
|
+
=end
|
6
|
+
|
7
|
+
require 'rubygems'
|
8
|
+
|
9
|
+
if
|
10
|
+
RUBY_VERSION == "2.0.0" && # check Gemfile
|
11
|
+
$0 != "-e" # do not do that in guard
|
12
|
+
then
|
13
|
+
require "coveralls"
|
14
|
+
require "simplecov"
|
15
|
+
|
16
|
+
SimpleCov.start do
|
17
|
+
formatter SimpleCov::Formatter::MultiFormatter[
|
18
|
+
SimpleCov::Formatter::HTMLFormatter,
|
19
|
+
Coveralls::SimpleCov::Formatter,
|
20
|
+
]
|
21
|
+
command_name "Unit Tests"
|
22
|
+
add_filter "/test/"
|
23
|
+
end
|
24
|
+
|
25
|
+
Coveralls.noisy = true unless ENV['CI']
|
26
|
+
end
|
27
|
+
|
28
|
+
# Autoload all lib/**/*.rb files so simplecov does not misses anything
|
29
|
+
Dir[File.expand_path("../../lib/**/*.rb", __FILE__)].each{|f| require f }
|
30
|
+
|
31
|
+
require 'minitest/autorun' unless $0=="-e" # skip in guard
|
32
|
+
require 'minitest/unit'
|
33
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-hooks
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michal Papis
|
@@ -14,14 +14,28 @@ dependencies:
|
|
14
14
|
name: rake
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - '>='
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: minitest
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
25
39
|
- !ruby/object:Gem::Version
|
26
40
|
version: '0'
|
27
41
|
description: Helpers for multiple publish/subscribe hooks
|
@@ -31,7 +45,17 @@ executables: []
|
|
31
45
|
extensions: []
|
32
46
|
extra_rdoc_files: []
|
33
47
|
files:
|
48
|
+
- lib/ruby/hooks.rb
|
49
|
+
- lib/ruby/hooks/extensible.rb
|
50
|
+
- lib/ruby/hooks/hook.rb
|
51
|
+
- lib/ruby/hooks/instance_hooks.rb
|
34
52
|
- lib/ruby/hooks/version.rb
|
53
|
+
- test/example1_test.rb
|
54
|
+
- test/example2_test.rb
|
55
|
+
- test/ruby/hooks/extensible_test.rb
|
56
|
+
- test/ruby/hooks/hook_test.rb
|
57
|
+
- test/ruby/hooks/instance_hooks_test.rb
|
58
|
+
- test/test_helper.rb
|
35
59
|
homepage: https://github.com/remote-exec/ruby-hooks
|
36
60
|
licenses:
|
37
61
|
- MIT
|
@@ -42,18 +66,25 @@ require_paths:
|
|
42
66
|
- lib
|
43
67
|
required_ruby_version: !ruby/object:Gem::Requirement
|
44
68
|
requirements:
|
45
|
-
- -
|
69
|
+
- - '>='
|
46
70
|
- !ruby/object:Gem::Version
|
47
71
|
version: '0'
|
48
72
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
49
73
|
requirements:
|
50
|
-
- -
|
74
|
+
- - '>='
|
51
75
|
- !ruby/object:Gem::Version
|
52
76
|
version: '0'
|
53
77
|
requirements: []
|
54
78
|
rubyforge_project:
|
55
|
-
rubygems_version: 2.4.
|
79
|
+
rubygems_version: 2.4.2
|
56
80
|
signing_key:
|
57
81
|
specification_version: 4
|
58
82
|
summary: Helpers for multiple publish/subscribe hooks
|
59
|
-
test_files:
|
83
|
+
test_files:
|
84
|
+
- test/ruby/hooks/extensible_test.rb
|
85
|
+
- test/ruby/hooks/hook_test.rb
|
86
|
+
- test/ruby/hooks/instance_hooks_test.rb
|
87
|
+
- test/test_helper.rb
|
88
|
+
- test/example2_test.rb
|
89
|
+
- test/example1_test.rb
|
90
|
+
has_rdoc:
|