ianwhite-hark 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 613e390efbcf4b85473a608ceb85ddf80a466a71
4
+ data.tar.gz: 0e135cd5077287cdfee91caa8fd3d98b2768d89c
5
+ SHA512:
6
+ metadata.gz: 0144dab15f39746e69b7bf31e47996bb3b5dc6d25cb0a06259c6c25287bccee67b0f3ac1a9a80ee8c2c9420bcb6aaf710c65e7c8c6169e49680a71e83175ae8a
7
+ data.tar.gz: 8a3971eaf75d614426179ecf6752a01b5ecb3deb185e1963da51b9f2dbc343134b2aff23066ce4c3311e4c5851ec49440239c54873dc8f92c8e8592e51a78998
data/.coveralls.yml ADDED
@@ -0,0 +1 @@
1
+ service_name: travis-ci
data/History.md ADDED
@@ -0,0 +1,13 @@
1
+ # History
2
+
3
+ ## master
4
+
5
+ * Adds coveralls & History
6
+
7
+ ## 0.0.3
8
+
9
+ * Adds ruby < 1.9 support
10
+
11
+ ## 0.0.1 - 0.0.2
12
+
13
+ * Initial release, slims API down to Kernel#hark
data/README.md CHANGED
@@ -1,6 +1,12 @@
1
- # Hark [![Code Climate](https://codeclimate.com/repos/52691919c7f3a37a2301dfc5/badges/8f5a4caa333ec7a654ec/gpa.png)](https://codeclimate.com/repos/52691919c7f3a37a2301dfc5/feed) [![Build Status](https://travis-ci.org/ianwhite/hark.png)](https://travis-ci.org/ianwhite/hark)
1
+ # Hark
2
2
 
3
- Create an ad-hoc listener object with hark.
3
+ [![Gem Version](https://badge.fury.io/rb/ianwhite-hark.png)](https://rubygems.org/gems/ianwhite-hark)
4
+ [![Build Status](https://travis-ci.org/ianwhite/hark.png)](https://travis-ci.org/ianwhite/hark)
5
+ [![Dependency Status](https://gemnasium.com/ianwhite/hark.png)](https://gemnasium.com/ianwhite/hark)
6
+ [![Code Climate](https://codeclimate.com/github/ianwhite/hark.png)](https://codeclimate.com/github/ianwhite/hark)
7
+ [![Coverage Status](https://coveralls.io/repos/ianwhite/hark/badge.png)](https://coveralls.io/r/ianwhite/hark)
8
+
9
+ Create a ad-hoc listeners with hark.
4
10
 
5
11
  ## Installation
6
12
 
@@ -16,64 +22,301 @@ Or install it yourself as:
16
22
 
17
23
  $ gem install ianwhite-hark
18
24
 
25
+ ## What & Why?
26
+
27
+ **hark** enables you to create a 'listener' object very easily. It's for programming in the *hexagonal* or *tell, don't ask* style.
28
+ The consumers of hark listeners don't know anything about hark. Because hark makes it easy to create ad-hoc object, it's easy to get
29
+ started with a tell-dont-ask style, in rails controllers for example. For more detail see the 'Rationale' section.
30
+
19
31
  ## Usage
20
32
 
21
- The idea behind hark is that the objects that receive listeners shouldn't need to perform any ceremony on
22
- them, just treat them as objects that respond to messages. It's up to the caller to provide these lsitener objects,
23
- and to decide how they behave, perhaps combining together listeners (in an subscriber fashion). If required, these ad-hoc
24
- listeners can easily be refactored into classes in their own right, as the recievers don't need to know anything about
25
- hark.
33
+ ### Create a listener
34
+
35
+ To create a listener object use `hark`.
36
+
37
+ You can pass a symbol and block
38
+
39
+ hark :created do |user|
40
+ redirect_to(user, notice: "You have signed up!")
41
+ end
42
+
43
+ The following methods are more suitable for a listener with multiple messages.
44
+
45
+ A hash with callables as keys
46
+
47
+ hark(
48
+ created: ->(user) { redirect_to(user, notice: "You have signed up!") },
49
+ invalid: ->(user) { @user = user; render "new" }
50
+ )
51
+
52
+ # assuming some methods for rendering and redirecting exist on the controller
53
+ hash created: method(:redirect_to_user), invalid: method(:render_new)
54
+
55
+ Or, a 'respond_to' style block
56
+
57
+ hark do |on|
58
+ on.created {|user| redirect_to(user, notice: "You have signed up!") }
59
+ on.invalid {|user| @user = user; render "new" }
60
+ end
61
+
62
+ ### Strict & lax listeners
63
+
64
+ By default, hark listeners are 'strict', they will only respond to the methods defined on them.
65
+
66
+ You create a 'lax' listener, responding to any message, by sending the `lax` message.
67
+
68
+ listener = hark(:foo) { "Foo" }
69
+
70
+ listener.bar
71
+ # => NoMethodError: undefined method `bar' for #<Hark::StrictListener:0x007fc91a03e568>
72
+
73
+ listener = listener.lax
74
+ listener.bar
75
+ # => []
76
+
77
+ To make a strict listener send the `strict` message.
78
+
79
+ ### Combining listeners
80
+
81
+ Here are some ways of combining listeners.
82
+
83
+ # redirect listener
84
+ listener = hark(created: method(:redirect_to_user))
85
+
86
+ Add a message
87
+
88
+ listener = listener.hark :created do |user|
89
+ WelomeMailer.send_email(user)
90
+ end
91
+
92
+ Combine with another listener
93
+
94
+ logger = listener.hark(created: ->(u) { logger.info "User #{u} created" } )
95
+ listener = listener.hark(logger)
96
+
97
+ Combine with any object that support the same protocol
98
+
99
+ logger = UserLogger.new # responds to :created
100
+ listener = listener.hark(logger)
101
+
102
+ Now, when listener is sent #created, all create handlers are called.
103
+
104
+ ### Sugar: #hearken
105
+
106
+ Because of the precedence of the block operator, constructing ad-hoc listeners requires
107
+ you to insert some parens, which might be seen as unsightly, e.g:
108
+
109
+ seller.request_valuation(item, (hark do |on|
110
+ on.valuation_requested {|valuation| redirect_to valuation}
111
+ on.invalid_item {|item| redirect_to item, error: "Item not evaluable" }
112
+ end))
113
+
114
+ You may use Kernerl#hearken to create an ad-hoc listener using a passed block as follows
115
+
116
+ seller.hearken :request_valuation, item do |on|
117
+ on.valuation_requested {|valuation| redirect_to valuation}
118
+ on.invalid_item {|item| redirect_to item, error: "Item not evaluable" }
119
+ end
120
+
121
+ If you want to combine listeners with an ad-hoc blokc, you may pass a 0-arity block that is
122
+ yielded as the listener
123
+
124
+ seller.hearken :request_valuation, item do
125
+ hark valuation_notifier do |on|
126
+ on.valuation_requested {|valuation| redirect_to valuation}
127
+ on.invalid_item {|item| redirect_to item, error: "Item not evaluable" }
128
+ end
129
+ end
130
+
131
+ ### Return value
132
+
133
+ Using the return value of a listener is not encouraged. Hark is designed for a *tell, don't ask*
134
+ style of coding. That said the return value of a hark listener is an array of its handlers return values.
135
+
136
+ a = hark(:foo) { 'a' }
137
+ b = Object.new.tap {|o| o.singleton_class.send(:define_method, :foo) { 'b' } }
138
+ c = hark(foo: -> { 'c' }, bar: -> { 'c bar' })
139
+
140
+ a.foo # => ["a"]
141
+ hark(a,b).foo # => ["a", "b"]
142
+ hark(a,b,c).foo # => ["a", "b", "c"]
26
143
 
27
- Tell don't ask style is encouraged with hark. That said, the return value for a message sent to a hark listener is an array of all of the return values.
144
+ ### Immutable
28
145
 
29
- listener = hark success: ->{ "succeeded" }, failure: ->{ "failed" }
30
- listener.success # => ["succeeded"]
31
- listener.failure # => ["failed"]
32
- listener.unknown # raises NoMethodError
146
+ Hark listeners are immutable and `#lax`, `#strict`, and `#hark` all return new listeners.
33
147
 
34
- Listeners return an array of return values, but using return values is discouraged (tell don't ask)
148
+ ## Rationale
35
149
 
36
- To create a listener that silently swallows unknown messages, send it the #lax method
150
+ When programming in the 'tell-dont-ask' or 'hexagonal' style, program flow is managed by passing listener, or
151
+ 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.
37
152
 
38
- listener = hark(success: ->{ "succeeded" }).lax
39
- listener.success # => ["succeeded"]
40
- listener.unknown # => []
153
+ The idea behind **hark** is that there should be little ceremony involved in the listener/response mechanics, and
154
+ that simple listeners can easily be refactored into objects in their own right, without changing the protocols between
155
+ the calling and servcie objects.
41
156
 
42
- To make a lax listener strict again, send it the #strict method
157
+ To that end, service objects should not know anything other than the listener/response protocol, and shouldn't have to 'publish' their
158
+ results beyond a simple method call.
43
159
 
44
- listener = listener.strict
160
+ As a simple example, a user creation service object defines a response protocol as follows:
45
161
 
46
- To smush together listeners, use #hark
162
+ * created_user(user) _the user was succesfully created_
163
+ * invalid_user(user) _the user couldn't be created because it was invalid_
47
164
 
48
- listener = listener.hark other_listener
49
- listener = listener.hark emailer, logger
50
- listener = hark(emailer, logger, twitter_notifier)
165
+ The UserCreator object's main method will have some code as follows:
51
166
 
52
- To add new messages to a listener, use #hark
167
+ if # some logic that means the user params were valid and we could persist the user
168
+ response.created_user(user)
169
+ else
170
+ response.invalid_user(user)
171
+ end
172
+
173
+ Let's say a controller is calling this, and you are using hark. In the beginning you would do something like this:
174
+
175
+ def create
176
+ user_creator.call(user_params, hark do |on|
177
+ on.created_user {|user| redirect_to user, notice: "Welome!" }
178
+ on.invalid_user {|user| @user = user; render "new" }
179
+ end)
180
+ end
53
181
 
54
- listener = listener.hark(:success) { "extra success" }
55
- listener.success # => ["success", "extra success"]
182
+ This keeps the controller's handling of the user creation nicely separate from the saving of the user creator.
56
183
 
57
- To decorate an object (of any sort) so that it becomes a hark listener (and therefore can be smushed etc)
184
+ Then, a requirement comes in to log the creation of users. The first attempt might be this:
58
185
 
59
- listener = hark(object)
186
+ def create
187
+ user_creator.call(user_params, hark do |on|
188
+ on.created_user do |user|
189
+ redirect_to user, notice: "Welome!"
190
+ logger.info "User #{user} created"
191
+ end
192
+ on.invalid_user {|user| @user = user; render "new" }
193
+ end
194
+ end
60
195
 
61
- The listener is immutable, #strict, #lax, and #hark all return new listeners
196
+ Then a requirement comes in to email users on succesful creation, there's an UserEmailer that responds
197
+ to the same protocol. Also, the UX team want to log invalid users.
62
198
 
63
- Here's an example from a rails controller
199
+ There's quite a lot going on now, we can tie it up as follows:
64
200
 
65
201
  def create
66
- SignupNewUser.new params, hark(create_response, SignupEmailer.new)
202
+ response = hark(ui_response, UserEmailer.new, ux_team_response)
203
+ user_creator.call user_params, response
67
204
  end
68
205
 
69
- # response block style
70
- def create_response
206
+ # UserEmailer responds to #created_user(user)
207
+
208
+ def ui_response
71
209
  hark do |on|
72
- on.signed_up {|user| redirect_to user, notice: "Signed up!" }
73
- on.invalid {|user| render "new", user: user }
210
+ on.created_user {|user| redirect_to user, notice: "Welome!" }
211
+ on.invalid_user {|user| @user = user; render "new" }
212
+ end
213
+ end
214
+
215
+ def ux_team_response
216
+ hark(:invalid_user) {|user| logger.info("User invalid: #{user}") }
217
+ end
218
+
219
+ If some of the response code gets hairy, we can easily swap out hark ad-hoc objects for 'proper' ones.
220
+ For example, the UI response might get a bit hairy, and so we make a new object.
221
+
222
+ def create
223
+ response = hark(UiResponse.new(self), UserEmailer.new, ux_team_response)
224
+ user_creator.call user_params, response
225
+ end
226
+
227
+ class UiResponse < SimpleDelegator
228
+ def created_user user
229
+ if request.format.json?
230
+ # ...
231
+ else
232
+ # ...
233
+ end
234
+ end
235
+
236
+ def invalid_user user
237
+ # ...
238
+ end
239
+ end
240
+
241
+ Note that throughout this process we didn't have to modify the UserCreator code, even when we transitioned
242
+ to/from hark for different repsonses/styles.
243
+
244
+ ### Testing your listeners
245
+
246
+ Don't pay any attention to hark when you're testing, hark is just a utility to create listeners, and so what
247
+ you should be testing is the protocol.
248
+
249
+ For example the service object tests will test functionality that pertains to the actual creation of the user,
250
+ and will test that the correct message is sent to the response in those circumstances. Whereas the controller tests
251
+ will mock out the service object, and test what happens when the service object sends the messages to the response as
252
+ dictated by the protocol.
253
+
254
+ describe UserCreator do
255
+ let(:service) { described_class.new }
256
+
257
+ describe "#call params, response" do
258
+ subject { service.call params, response }
259
+
260
+ let(:response) { double }
261
+
262
+ context "when the user succesfully saves"
263
+ let(:params) { {name: "created user", # and other successful user params }
264
+
265
+ it "sends #created_user to the response with the created user" do
266
+ response.should_receive(:created_user) do |user|
267
+ user.name.should == "created user"
268
+ end
269
+ subject
270
+ end
271
+ end
272
+
273
+ context "when the user succesfully saves"
274
+ let(:params) { {name: "invalid user", # and invalid user params }
275
+
276
+ it "sends #invalid_user to the response with the created user" do
277
+ response.should_receive(:invalid_user) do |user|
278
+ # test that the object passed is the invalid user
279
+ end
280
+ subject
281
+ end
282
+ end
74
283
  end
75
284
  end
76
285
 
286
+ describe NewUserController do
287
+ before { controller.stub(user_creator: user_creator) } # or some other sensible way of injecting a fake user_creator
288
+
289
+ let(:user_creator) { double "User creator" }
290
+ let(:user) { double "A user" }
291
+
292
+ context "when the user_creator is succesful" do
293
+ before do
294
+ user_creator.stub :call do |params, response|
295
+ response.created_user(user)
296
+ end
297
+ end
298
+
299
+ it "should redirect to the user"
300
+
301
+ it "should email the user"
302
+
303
+ it "should log the creation of the user"
304
+ end
305
+
306
+ context "when the user_creator says the params are invalid" do
307
+ before do
308
+ user_creator.stub :call do |params, response|
309
+ response.invalid_user(user)
310
+ end
311
+ end
312
+
313
+ it "should render new with the user"
314
+
315
+ it "should log something for the UX team"
316
+ end
317
+ end
318
+
319
+
77
320
  ## Contributing
78
321
 
79
322
  1. Fork it
data/hark.gemspec CHANGED
@@ -21,4 +21,8 @@ Gem::Specification.new do |spec|
21
21
  spec.add_development_dependency "bundler", "~> 1.3"
22
22
  spec.add_development_dependency "rake"
23
23
  spec.add_development_dependency "rspec"
24
+
25
+ if RUBY_VERSION > "1.9"
26
+ spec.add_development_dependency "coveralls"
27
+ end
24
28
  end
data/lib/hark/core_ext.rb CHANGED
@@ -2,4 +2,13 @@ module Kernel
2
2
  def hark *args, &block
3
3
  Hark.from *args, &block
4
4
  end
5
+
6
+ def to_hark *args, &block
7
+ hark self, *args, &block
8
+ end
9
+
10
+ def hearken method, *args, &block
11
+ listener = (block.arity == 1) ? hark(&block) : block.call
12
+ send method, *args, listener
13
+ end
5
14
  end
@@ -12,11 +12,7 @@ module Hark
12
12
  #
13
13
  def self.from(*args, &block)
14
14
  if block
15
- if args.last.is_a?(Symbol)
16
- args << {args.pop => block}
17
- elsif args.empty?
18
- args << block
19
- end
15
+ args << (args.last.is_a?(Symbol) ? {args.pop => block} : block)
20
16
  end
21
17
 
22
18
  new args.map{|o| to_handler(o) }.flatten.freeze
data/lib/hark/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Hark
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
data/spec/hark_spec.rb CHANGED
@@ -91,21 +91,43 @@ describe Hark do
91
91
  it_should_behave_like "a success/failure hark listener"
92
92
  end
93
93
 
94
- describe "hark object" do
94
+ describe "#hark(object)" do
95
95
  let(:listener) { hark PlainListener.new(transcript) }
96
96
 
97
97
  it_should_behave_like "a success/failure hark listener"
98
98
  end
99
99
 
100
+ describe "object.to_hark" do
101
+ let(:listener) { PlainListener.new(transcript).to_hark }
102
+
103
+ it_should_behave_like "a success/failure hark listener"
104
+ end
105
+
100
106
  describe "combine two listeners together" do
101
107
  let(:logger) { hark(:signup_user) {|user| transcript << "User #{user} signed up" } }
102
108
  let(:emailer) { hark(:signup_user) {|user| transcript << "Emailed #{user}" } }
103
109
 
104
- let(:listener) { logger.hark(emailer) }
110
+ shared_examples_for "combined listeners" do
111
+ before { listener.signup_user("Fred") }
105
112
 
106
- before { listener.signup_user("Fred") }
113
+ it { transcript.should == ["User Fred signed up", "Emailed Fred"] }
114
+ end
107
115
 
108
- it { transcript.should == ["User Fred signed up", "Emailed Fred"] }
116
+ it_behaves_like "combined listeners" do
117
+ let(:listener) { logger.hark(emailer) }
118
+ end
119
+
120
+ it_behaves_like "combined listeners" do
121
+ let(:listener) { hark(logger, emailer) }
122
+ end
123
+
124
+ it_behaves_like "combined listeners" do
125
+ let(:listener) do
126
+ hark logger do |on|
127
+ on.signup_user {|user| transcript << "Emailed #{user}" }
128
+ end
129
+ end
130
+ end
109
131
  end
110
132
 
111
133
  describe "lax/strict is preserved on #hark" do
@@ -119,4 +141,38 @@ describe Hark do
119
141
  it { expect{ listener.foo }.to_not raise_error }
120
142
  it { listener.foo.should == [false] }
121
143
  end
144
+
145
+ describe "#hearken :method" do
146
+ let(:object) do
147
+ Object.new.tap do |obj|
148
+ class << obj
149
+ def foo arg1, arg2, listener
150
+ listener.foo(arg1)
151
+ listener.bar(arg2)
152
+ end
153
+ end
154
+ end
155
+ end
156
+
157
+ context "with 1 arity block" do
158
+ it "sends :method with an ad-hoc listener created from the block" do
159
+ object.hearken :foo, "ONE", "TWO" do |on|
160
+ on.foo {|a| transcript << [:foo, a] }
161
+ on.bar {|a| transcript << [:bar, a] }
162
+ end
163
+ transcript.should == [[:foo, "ONE"], [:bar, "TWO"]]
164
+ end
165
+ end
166
+
167
+ context "with 0 arity block" do
168
+ it "sends :method with listener created by yielding to the block" do
169
+ foo = hark(:foo) {|a| transcript << [:foo, a] }
170
+
171
+ object.hearken :foo, "ONE", "TWO" do
172
+ hark(foo, :bar) {|a| transcript << [:bar, a] }
173
+ end
174
+ transcript.should == [[:foo, "ONE"], [:bar, "TWO"]]
175
+ end
176
+ end
177
+ end
122
178
  end
data/spec/spec_helper.rb CHANGED
@@ -1,3 +1,9 @@
1
1
  $LOAD_PATH.unshift File.dirname('../lib')
2
2
 
3
3
  require 'rspec'
4
+
5
+ begin
6
+ require 'coveralls'
7
+ Coveralls.wear!
8
+ rescue LoadError
9
+ end
metadata CHANGED
@@ -1,78 +1,83 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: ianwhite-hark
3
- version: !ruby/object:Gem::Version
4
- hash: 25
5
- prerelease:
6
- segments:
7
- - 0
8
- - 0
9
- - 3
10
- version: 0.0.3
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.4
11
5
  platform: ruby
12
- authors:
6
+ authors:
13
7
  - Ian White
14
8
  autorequire:
15
9
  bindir: bin
16
10
  cert_chain: []
17
-
18
- date: 2013-11-14 00:00:00 Z
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
11
+ date: 2013-11-23 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
21
14
  name: bundler
22
- version_requirements: &id001 !ruby/object:Gem::Requirement
23
- none: false
24
- requirements:
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
25
17
  - - ~>
26
- - !ruby/object:Gem::Version
27
- hash: 9
28
- segments:
29
- - 1
30
- - 3
31
- version: "1.3"
32
- prerelease: false
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
33
20
  type: :development
34
- requirement: *id001
35
- - !ruby/object:Gem::Dependency
36
- name: rake
37
- version_requirements: &id002 !ruby/object:Gem::Requirement
38
- none: false
39
- requirements:
40
- - - ">="
41
- - !ruby/object:Gem::Version
42
- hash: 3
43
- segments:
44
- - 0
45
- version: "0"
46
21
  prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
47
34
  type: :development
48
- requirement: *id002
49
- - !ruby/object:Gem::Dependency
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
50
42
  name: rspec
51
- version_requirements: &id003 !ruby/object:Gem::Requirement
52
- none: false
53
- requirements:
54
- - - ">="
55
- - !ruby/object:Gem::Version
56
- hash: 3
57
- segments:
58
- - 0
59
- version: "0"
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
60
49
  prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: coveralls
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
61
62
  type: :development
62
- requirement: *id003
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
63
69
  description: Create ad-hoc listener objects with impunity
64
- email:
70
+ email:
65
71
  - ian.w.white@gmail.com
66
72
  executables: []
67
-
68
73
  extensions: []
69
-
70
74
  extra_rdoc_files: []
71
-
72
- files:
75
+ files:
76
+ - .coveralls.yml
73
77
  - .gitignore
74
78
  - .travis.yml
75
79
  - Gemfile
80
+ - History.md
76
81
  - LICENSE.txt
77
82
  - README.md
78
83
  - Rakefile
@@ -86,38 +91,30 @@ files:
86
91
  - spec/hark_spec.rb
87
92
  - spec/spec_helper.rb
88
93
  homepage: http://github.com/ianwhite/hark
89
- licenses:
94
+ licenses:
90
95
  - MIT
96
+ metadata: {}
91
97
  post_install_message:
92
98
  rdoc_options: []
93
-
94
- require_paths:
99
+ require_paths:
95
100
  - lib
96
- required_ruby_version: !ruby/object:Gem::Requirement
97
- none: false
98
- requirements:
99
- - - ">="
100
- - !ruby/object:Gem::Version
101
- hash: 3
102
- segments:
103
- - 0
104
- version: "0"
105
- required_rubygems_version: !ruby/object:Gem::Requirement
106
- none: false
107
- requirements:
108
- - - ">="
109
- - !ruby/object:Gem::Version
110
- hash: 3
111
- segments:
112
- - 0
113
- version: "0"
101
+ required_ruby_version: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - '>='
104
+ - !ruby/object:Gem::Version
105
+ version: '0'
106
+ required_rubygems_version: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
114
111
  requirements: []
115
-
116
112
  rubyforge_project:
117
- rubygems_version: 1.8.25
113
+ rubygems_version: 2.0.6
118
114
  signing_key:
119
- specification_version: 3
120
- summary: Hark is a gem that enables writing code in a "hexagonal architecture" or "tell don't ask" style
121
- test_files:
115
+ specification_version: 4
116
+ summary: Hark is a gem that enables writing code in a "hexagonal architecture" or
117
+ "tell don't ask" style
118
+ test_files:
122
119
  - spec/hark_spec.rb
123
120
  - spec/spec_helper.rb