heed 0.0.8 → 0.1.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/History.md +4 -0
- data/README.md +35 -30
- data/{hark.gemspec → heed.gemspec} +5 -5
- data/lib/heed.rb +11 -0
- data/lib/{hark → heed}/ad_hoc.rb +1 -1
- data/lib/{hark → heed}/core_ext.rb +2 -2
- data/lib/{hark → heed}/dispatcher.rb +1 -1
- data/lib/{hark → heed}/listener.rb +1 -1
- data/lib/heed/version.rb +3 -0
- data/spec/{hark_spec.rb → heed_spec.rb} +4 -4
- metadata +13 -13
- data/lib/hark.rb +0 -11
- data/lib/hark/version.rb +0 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1eee3efa688c2c5129607edf8cfa0f259921556d
|
4
|
+
data.tar.gz: 6af68b66b4511904cb27a555759ffa12295579df
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cae07b49dc966fcdb17f1a0df686b79d3ed44a2a867802559bd035170f5f4218dd96ed0b2a8d82a94ca6e2ebbaf8254830b8469a51671b8c93d7528b68f957dd
|
7
|
+
data.tar.gz: 1873db35c58e1425834ec2d37a1d16c383874eec96420a9ad060be25f16b95d83ad54ca590ecaa0e8ef60f71d9eabf53d948feef5bcbc7b7d1e4686d5689f3ee
|
data/History.md
CHANGED
data/README.md
CHANGED
@@ -1,18 +1,18 @@
|
|
1
|
-
#
|
1
|
+
# `heed` (and `hark`)
|
2
2
|
|
3
|
-
[](https://rubygems.org/gems/heed)
|
4
|
+
[](https://travis-ci.org/ianwhite/heed)
|
5
|
+
[](https://gemnasium.com/ianwhite/heed)
|
6
|
+
[](https://codeclimate.com/github/ianwhite/heed)
|
7
|
+
[](https://coveralls.io/r/ianwhite/heed)
|
8
8
|
|
9
|
-
Create
|
9
|
+
Create and use ad-hoc listeners with hark and heed.
|
10
10
|
|
11
11
|
## Installation
|
12
12
|
|
13
13
|
Add this line to your application's Gemfile:
|
14
14
|
|
15
|
-
gem '
|
15
|
+
gem 'heed'
|
16
16
|
|
17
17
|
And then execute:
|
18
18
|
|
@@ -20,12 +20,12 @@ And then execute:
|
|
20
20
|
|
21
21
|
Or install it yourself as:
|
22
22
|
|
23
|
-
$ gem install
|
23
|
+
$ gem install heed
|
24
24
|
|
25
25
|
## What & Why?
|
26
26
|
|
27
|
-
**
|
28
|
-
The consumers of
|
27
|
+
**heed** enables you to use 'listener' objects very easily. It's for programming in the *hexagonal* or *tell, don't ask* style.
|
28
|
+
The consumers of heed listeners don't know anything about heed. Because heed makes it easy to create ad-hoc object, it's easy to get
|
29
29
|
started with a tell-dont-ask style, in rails controllers for example. For more detail see the 'Rationale' section.
|
30
30
|
|
31
31
|
## Usage
|
@@ -61,14 +61,14 @@ Or, a 'respond_to' style block
|
|
61
61
|
|
62
62
|
### Strict & lax listeners
|
63
63
|
|
64
|
-
By default,
|
64
|
+
By default, heed listeners are 'strict', they will only respond to the methods defined on them.
|
65
65
|
|
66
66
|
You create a 'lax' listener, responding to any message, by sending the `lax` message.
|
67
67
|
|
68
68
|
listener = hark(:foo) { "Foo" }
|
69
69
|
|
70
70
|
listener.bar
|
71
|
-
# => NoMethodError: undefined method `bar' for #<
|
71
|
+
# => NoMethodError: undefined method `bar' for #<Heed::StrictListener:0x007fc91a03e568>
|
72
72
|
|
73
73
|
listener = listener.lax
|
74
74
|
listener.bar
|
@@ -102,7 +102,7 @@ Combine with any object that support the same protocol
|
|
102
102
|
Turn any object into a listener, adding new methods as we go
|
103
103
|
|
104
104
|
hark UserLogger.new do |on|
|
105
|
-
on.created {|user| Emailer.
|
105
|
+
on.created {|user| Emailer.send_welcome_email(user) }
|
106
106
|
end
|
107
107
|
|
108
108
|
Now, when listener is sent #created, all create handlers are called.
|
@@ -125,7 +125,8 @@ You may use #heed to create an ad-hoc listener using a passed block as follows
|
|
125
125
|
end
|
126
126
|
|
127
127
|
If you want to combine listeners with an ad-hoc block, you may pass a 0-arity block that is
|
128
|
-
yielded as the listener
|
128
|
+
yielded as the listener. This means you can use the block to wire up listeners, adding
|
129
|
+
extra ones that have the caller's binding (useful in controllers for example)
|
129
130
|
|
130
131
|
heed seller, :request_valuation, item do
|
131
132
|
hark valuation_notifier do |on|
|
@@ -136,8 +137,8 @@ yielded as the listener
|
|
136
137
|
|
137
138
|
### Return value
|
138
139
|
|
139
|
-
Using the return value of a listener is not encouraged.
|
140
|
-
style of coding. That said the return value of a
|
140
|
+
Using the return value of a listener is not encouraged. Heed is designed for a *tell, don't ask*
|
141
|
+
style of coding. That said the return value of a heed listener is an array of its handlers return values.
|
141
142
|
|
142
143
|
a = hark(:foo) { 'a' }
|
143
144
|
b = Object.new.tap {|o| o.singleton_class.send(:define_method, :foo) { 'b' } }
|
@@ -149,14 +150,14 @@ style of coding. That said the return value of a hark listener is an array of i
|
|
149
150
|
|
150
151
|
### Immutable
|
151
152
|
|
152
|
-
|
153
|
+
Heed listeners are immutable and `#lax`, `#strict`, and `#heed` all return new listeners.
|
153
154
|
|
154
155
|
## Rationale
|
155
156
|
|
156
157
|
When programming in the 'tell-dont-ask' or 'hexagonal' style, program flow is managed by passing listener, or
|
157
158
|
response, objects to service objects, which call back depending on what happened. This allows logic that is concerned with the caller's domain to remain isolated from the service object.
|
158
159
|
|
159
|
-
The idea behind **
|
160
|
+
The idea behind **heed** is that there should be little ceremony involved in the listener/response mechanics, and
|
160
161
|
that simple listeners can easily be refactored into objects in their own right, without changing the protocols between
|
161
162
|
the calling and servcie objects.
|
162
163
|
|
@@ -176,13 +177,13 @@ The UserCreator object's main method will have some code as follows:
|
|
176
177
|
response.invalid_user(user)
|
177
178
|
end
|
178
179
|
|
179
|
-
Let's say a controller is calling this, and you are using
|
180
|
+
Let's say a controller is calling this, and you are using heed. In the beginning you would do something like this:
|
180
181
|
|
181
182
|
def create
|
182
|
-
user_creator
|
183
|
+
heed user_creator, :create_user, user_params do |on|
|
183
184
|
on.created_user {|user| redirect_to user, notice: "Welome!" }
|
184
185
|
on.invalid_user {|user| @user = user; render "new" }
|
185
|
-
end
|
186
|
+
end
|
186
187
|
end
|
187
188
|
|
188
189
|
This keeps the controller's handling of the user creation nicely separate from the saving of the user creator.
|
@@ -190,7 +191,7 @@ This keeps the controller's handling of the user creation nicely separate from t
|
|
190
191
|
Then, a requirement comes in to log the creation of users. The first attempt might be this:
|
191
192
|
|
192
193
|
def create
|
193
|
-
user_creator
|
194
|
+
heed user_creator, :create_user, user_params do |on|
|
194
195
|
on.created_user do |user|
|
195
196
|
redirect_to user, notice: "Welome!"
|
196
197
|
logger.info "User #{user} created"
|
@@ -205,8 +206,9 @@ to the same protocol. Also, the UX team want to log invalid users.
|
|
205
206
|
There's quite a lot going on now, we can tie it up as follows:
|
206
207
|
|
207
208
|
def create
|
208
|
-
|
209
|
-
|
209
|
+
heed user_creator, :create_user, user_params do
|
210
|
+
hark ui_response, UserEmailer.new, ux_team_response
|
211
|
+
end
|
210
212
|
end
|
211
213
|
|
212
214
|
# UserEmailer responds to #created_user(user)
|
@@ -222,12 +224,13 @@ There's quite a lot going on now, we can tie it up as follows:
|
|
222
224
|
hark(:invalid_user) {|user| logger.info("User invalid: #{user}") }
|
223
225
|
end
|
224
226
|
|
225
|
-
If some of the response code gets hairy, we can easily swap out
|
227
|
+
If some of the response code gets hairy, we can easily swap out heed ad-hoc objects for 'proper' ones.
|
226
228
|
For example, the UI response might get a bit hairy, and so we make a new object.
|
227
229
|
|
228
230
|
def create
|
229
|
-
|
230
|
-
|
231
|
+
heed user_creator, :create_user, user_params do
|
232
|
+
hark UiResponse.new(self), UserEmailer.new, ux_team_response
|
233
|
+
end
|
231
234
|
end
|
232
235
|
|
233
236
|
class UiResponse < SimpleDelegator
|
@@ -245,11 +248,11 @@ For example, the UI response might get a bit hairy, and so we make a new object.
|
|
245
248
|
end
|
246
249
|
|
247
250
|
Note that throughout this process we didn't have to modify the UserCreator code, even when we transitioned
|
248
|
-
to/from hark for different repsonses/styles.
|
251
|
+
to/from heed/hark for different repsonses/styles.
|
249
252
|
|
250
253
|
### Testing your listeners
|
251
254
|
|
252
|
-
Don't pay any attention to
|
255
|
+
Don't pay any attention to heed when you're testing, heed is just a utility to create listeners, and so what
|
253
256
|
you should be testing is the protocol.
|
254
257
|
|
255
258
|
For example the service object tests will test functionality that pertains to the actual creation of the user,
|
@@ -322,6 +325,8 @@ dictated by the protocol.
|
|
322
325
|
end
|
323
326
|
end
|
324
327
|
|
328
|
+
Note that in the above tests, there is *no mention of hark or heed*. This ensures a smooth transition to 'full blown'
|
329
|
+
response objects should the need occur.
|
325
330
|
|
326
331
|
## Contributing
|
327
332
|
|
@@ -1,16 +1,16 @@
|
|
1
1
|
# coding: 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 'heed/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
7
|
spec.name = "heed"
|
8
|
-
spec.version =
|
8
|
+
spec.version = Heed::VERSION
|
9
9
|
spec.authors = ["Ian White"]
|
10
10
|
spec.email = ["ian.w.white@gmail.com"]
|
11
|
-
spec.description = %q{Create ad-hoc
|
12
|
-
spec.summary = %q{
|
13
|
-
spec.homepage = "http://github.com/ianwhite/
|
11
|
+
spec.description = %q{Create and use ad-hoc listeners with hark and heed}
|
12
|
+
spec.summary = %q{Heed is a gem that enables writing code in a "hexagonal architecture" or "tell don't ask" style}
|
13
|
+
spec.homepage = "http://github.com/ianwhite/heed"
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
16
16
|
spec.files = `git ls-files`.split($/)
|
data/lib/heed.rb
ADDED
data/lib/{hark → heed}/ad_hoc.rb
RENAMED
@@ -1,10 +1,10 @@
|
|
1
1
|
module Kernel
|
2
2
|
def hark *args, &block
|
3
|
-
|
3
|
+
Heed.listener *args, &block
|
4
4
|
end
|
5
5
|
|
6
6
|
def heed object, *args, &block
|
7
|
-
listener = (block.arity == 1) ?
|
7
|
+
listener = (block.arity == 1) ? Heed.listener(&block) : block.call
|
8
8
|
object.send *args + [listener]
|
9
9
|
end
|
10
10
|
end
|
data/lib/heed/version.rb
ADDED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
require '
|
2
|
+
require 'heed'
|
3
3
|
|
4
|
-
describe
|
4
|
+
describe Heed do
|
5
5
|
let(:transcript) { [] }
|
6
6
|
|
7
7
|
class PlainListener < Struct.new(:transcript)
|
@@ -125,8 +125,8 @@ describe Hark do
|
|
125
125
|
end
|
126
126
|
|
127
127
|
describe "lax/strict is preserved on #hark" do
|
128
|
-
it { hark.lax.hark.should be_a
|
129
|
-
it { hark.strict.hark.should be_a
|
128
|
+
it { hark.lax.hark.should be_a Heed::LaxListener }
|
129
|
+
it { hark.strict.hark.should be_a Heed::StrictListener }
|
130
130
|
end
|
131
131
|
|
132
132
|
describe "when methods return falsy" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: heed
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ian White
|
@@ -66,7 +66,7 @@ dependencies:
|
|
66
66
|
- - '>='
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
-
description: Create ad-hoc
|
69
|
+
description: Create and use ad-hoc listeners with hark and heed
|
70
70
|
email:
|
71
71
|
- ian.w.white@gmail.com
|
72
72
|
executables: []
|
@@ -81,16 +81,16 @@ files:
|
|
81
81
|
- LICENSE.txt
|
82
82
|
- README.md
|
83
83
|
- Rakefile
|
84
|
-
-
|
85
|
-
- lib/
|
86
|
-
- lib/
|
87
|
-
- lib/
|
88
|
-
- lib/
|
89
|
-
- lib/
|
90
|
-
- lib/
|
91
|
-
- spec/
|
84
|
+
- heed.gemspec
|
85
|
+
- lib/heed.rb
|
86
|
+
- lib/heed/ad_hoc.rb
|
87
|
+
- lib/heed/core_ext.rb
|
88
|
+
- lib/heed/dispatcher.rb
|
89
|
+
- lib/heed/listener.rb
|
90
|
+
- lib/heed/version.rb
|
91
|
+
- spec/heed_spec.rb
|
92
92
|
- spec/spec_helper.rb
|
93
|
-
homepage: http://github.com/ianwhite/
|
93
|
+
homepage: http://github.com/ianwhite/heed
|
94
94
|
licenses:
|
95
95
|
- MIT
|
96
96
|
metadata: {}
|
@@ -113,8 +113,8 @@ rubyforge_project:
|
|
113
113
|
rubygems_version: 2.0.6
|
114
114
|
signing_key:
|
115
115
|
specification_version: 4
|
116
|
-
summary:
|
116
|
+
summary: Heed is a gem that enables writing code in a "hexagonal architecture" or
|
117
117
|
"tell don't ask" style
|
118
118
|
test_files:
|
119
|
-
- spec/
|
119
|
+
- spec/heed_spec.rb
|
120
120
|
- spec/spec_helper.rb
|
data/lib/hark.rb
DELETED
data/lib/hark/version.rb
DELETED