abstractivator 0.1.0 → 0.1.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0a6548a23dbbb3727663ad80929bb8a10f30abe2
4
- data.tar.gz: 739a8d584e2c49765477507abfdbae0f1060c16a
3
+ metadata.gz: f0f97f449a6f91eaac8ae39f200348648279e81e
4
+ data.tar.gz: 13f4f30033ab6cd63d57d837cbea7250ae5e183d
5
5
  SHA512:
6
- metadata.gz: 0e621bd42c5d2d7d6a3607ba27e1ffdc76f5889408d48cc4f43b20db5bc6c5f929b810a4cb658fb897ebb4d475dc42112c8e93f0b48a6920d5347f68f26259f0
7
- data.tar.gz: d39b5ed89186aa413261018dace9671357abd4a01a2e423322191868682da45f5a74fd830343fac56f29590a0ef064ecc7c3ee017747febd23738ba261303728
6
+ metadata.gz: 3b9565dcf535296a0c0434e3fadc2409a82ca5b8991193b6f5dfec81d3e0c17bb420c59546bedbb6df1ded02ba731e310eaefdcfdd49bb9d5c331c5435d42293
7
+ data.tar.gz: 642b58f09048ce0c2897c8b6a43dd4ed28db10380e6d9754c1cbf14792351f78e7ae536e459d82aa7c707385713bfd3268a960046bb35f74ec493eddde624047
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Abstractivator
2
2
 
3
- TODO: Write a gem description
3
+ A collection of useful ruby code
4
4
 
5
5
  ## Installation
6
6
 
@@ -18,12 +18,4 @@ Or install it yourself as:
18
18
 
19
19
  ## Usage
20
20
 
21
- TODO: Write usage instructions here
22
-
23
- ## Contributing
24
-
25
- 1. Fork it ( https://github.com/[my-github-username]/abstractivator/fork )
26
- 2. Create your feature branch (`git checkout -b my-new-feature`)
27
- 3. Commit your changes (`git commit -am 'Add some feature'`)
28
- 4. Push to the branch (`git push origin my-new-feature`)
29
- 5. Create a new Pull Request
21
+ See specs for examples.
data/Rakefile CHANGED
@@ -1,2 +1,11 @@
1
- require "bundler/gem_tasks"
1
+ require 'bundler/gem_tasks'
2
2
 
3
+ begin
4
+ require 'rspec/core/rake_task'
5
+
6
+ RSpec::Core::RakeTask.new(:spec)
7
+
8
+ task :default => :spec
9
+ rescue LoadError
10
+ # no rspec available
11
+ end
@@ -0,0 +1,31 @@
1
+ module Abstractivator
2
+ module Event
3
+ def self.included(base)
4
+ base.extend(ClassMethods)
5
+ end
6
+ module ClassMethods
7
+ def event(*names)
8
+ names.each do |name|
9
+ define_method("on_#{name}") do |&block|
10
+ __event_hooks[name] << block
11
+ proc { __event_hooks[name].delete(block) }
12
+ end
13
+
14
+ define_method("do_#{name}") do |*args, **kws, &block|
15
+ __event_hooks[name].each do |hook|
16
+ if hook.parameters.map(&:first).include?(:key)
17
+ hook.call(*args, **kws, &block)
18
+ else
19
+ hook.call(*args, &block)
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+
27
+ def __event_hooks
28
+ @__event_hooks ||= Hash.new { |h, k| h[k] = [] }
29
+ end
30
+ end
31
+ end
@@ -1,3 +1,3 @@
1
1
  module Abstractivator
2
- VERSION = '0.1.0'
2
+ VERSION = '0.1.1'
3
3
  end
@@ -0,0 +1,95 @@
1
+ require 'rspec'
2
+ require 'abstractivator/event'
3
+
4
+ describe Abstractivator::Event do
5
+
6
+ class EventedObject
7
+ include Abstractivator::Event
8
+ event :arrived, :departed
9
+ end
10
+
11
+ subject { EventedObject.new }
12
+
13
+ describe 'the "do" method' do
14
+ context 'when there are no hooks' do
15
+ it 'does nothing' do
16
+ subject.do_arrived
17
+ end
18
+ end
19
+ it 'calls the hooks in the order in which they were added' do
20
+ log = []
21
+ subject.on_arrived { log << 'hello' }
22
+ subject.on_arrived { log << 'hello again'}
23
+ expect(log).to eql []
24
+ subject.do_arrived
25
+ expect(log).to eql ['hello', 'hello again']
26
+ end
27
+ it 'passes arguments to the hooks' do
28
+ observed_args = nil
29
+ subject.on_arrived { |*args| observed_args = args }
30
+ subject.do_arrived(2, 3)
31
+ expect(observed_args).to eql [2, 3]
32
+ end
33
+ it 'passes keyword arguments to the hooks' do
34
+ observed_keywords = nil
35
+ subject.on_arrived { |a: nil, b: nil| observed_keywords = [a, b] }
36
+ subject.do_arrived(a: 2, b: 3)
37
+ expect(observed_keywords).to eql [2, 3]
38
+ end
39
+ it 'passes the block to the hooks' do
40
+ manifest = {1 => 'Bob', 2 => 'Fred'}
41
+ greeting = nil
42
+ subject.on_arrived { |id, &greet| greet.call(manifest[id]) }
43
+ subject.do_arrived(1) { |name| greeting = "Hello, #{name}" }
44
+ expect(greeting).to eql 'Hello, Bob'
45
+ end
46
+ end
47
+
48
+ describe 'the "on" method' do
49
+ it 'returns an unhook procedure' do
50
+ log = []
51
+ unhook = subject.on_arrived { log << 'hello' }
52
+ subject.do_arrived
53
+ expect(log).to eql %w(hello)
54
+
55
+ unhook.call
56
+ subject.do_arrived
57
+ expect(log).to eql %w(hello)
58
+ end
59
+ end
60
+
61
+ describe 'the unhook procedure' do
62
+ it 'returns the initial hook procedure' do
63
+ log = []
64
+ unhook = subject.on_arrived { log << 'hello' }
65
+ subject.do_arrived
66
+ expect(log).to eql %w(hello)
67
+
68
+ hook = unhook.call
69
+ subject.on_arrived(&hook)
70
+ subject.do_arrived
71
+ expect(log).to eql %w(hello hello)
72
+ end
73
+ it 'returns nil if called more than once' do
74
+ unhook = subject.on_arrived { log << 'hello' }
75
+ expect(unhook.call).to be_a Proc
76
+ expect(unhook.call).to be nil
77
+ end
78
+ end
79
+
80
+ it 'hooks are independent' do
81
+ arrived_list = []
82
+ departed_list = []
83
+ subject.on_arrived { |who| arrived_list << who }
84
+ subject.on_departed { |who| departed_list << who }
85
+
86
+ subject.do_arrived('Fred')
87
+ expect(arrived_list).to eql %w(Fred)
88
+ expect(departed_list).to eql []
89
+
90
+ subject.do_departed('Bob')
91
+ expect(arrived_list).to eql %w(Fred)
92
+ expect(departed_list).to eql %w(Bob)
93
+
94
+ end
95
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: abstractivator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Winton
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-08-28 00:00:00.000000000 Z
11
+ date: 2015-10-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -100,6 +100,7 @@ files:
100
100
  - lib/abstractivator/cons.rb
101
101
  - lib/abstractivator/enum.rb
102
102
  - lib/abstractivator/enumerable_ext.rb
103
+ - lib/abstractivator/event.rb
103
104
  - lib/abstractivator/proc_ext.rb
104
105
  - lib/abstractivator/schedule.rb
105
106
  - lib/abstractivator/schedule/schedule.rb
@@ -116,6 +117,7 @@ files:
116
117
  - spec/lib/abstractivator/cons_spec.rb
117
118
  - spec/lib/abstractivator/enum_spec.rb
118
119
  - spec/lib/abstractivator/enumerable_ext_spec.rb
120
+ - spec/lib/abstractivator/event_spec.rb
119
121
  - spec/lib/abstractivator/proc_ext_spec.rb
120
122
  - spec/lib/abstractivator/schedule/em_util.rb
121
123
  - spec/lib/abstractivator/schedule/schedule_runner_spec.rb
@@ -154,6 +156,7 @@ test_files:
154
156
  - spec/lib/abstractivator/cons_spec.rb
155
157
  - spec/lib/abstractivator/enum_spec.rb
156
158
  - spec/lib/abstractivator/enumerable_ext_spec.rb
159
+ - spec/lib/abstractivator/event_spec.rb
157
160
  - spec/lib/abstractivator/proc_ext_spec.rb
158
161
  - spec/lib/abstractivator/schedule/em_util.rb
159
162
  - spec/lib/abstractivator/schedule/schedule_runner_spec.rb