acfs 0.29.1.1.b257 → 0.29.1.1.b259

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,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- Yzg2OTZhYjY2MTUyY2FkZWIzYWY0ODI1MjI3YjJmM2YzODQ1ZWJmYg==
4
+ OWVkNzczZWRjZWMxNzJlZmQ2YjJjYjQ2ZTQ4ODhjOTA1MDc1M2Y5YQ==
5
5
  data.tar.gz: !binary |-
6
- YTQxOWE5YzgzOTA4Nzk1OTk4NzEyYWQwZDdjZGE5MTU2ZjcyNTMzNA==
6
+ YjJkYTUyZTMwMWRlMDUwYjQ2OTM5YzdiMDZjYWNhZDgyOTRlMGQ0OQ==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- YmM4MGFjYWQwODlkZWI3OTE0Nzc1MWRlY2ZhOTZkZGRjMzIwYzU3ZTcwMGI5
10
- ODljYTlkZTdkODlkMWY4MjI0ZmEwM2I1OWM2NjY3MjdhN2JlYzQyMWY1MDJk
11
- NzI5Zjc0NWQwNGQ5YzAxN2YwMGQ0ZTkxMTkxZDBiYjFjMDQxM2U=
9
+ NTJmMWVjYjA4MTU0YjllOTBiMGUxZDc5N2JmOGJjYjY1ZTdjZmFjOGI5OWMw
10
+ ZDY2NGUxMGZhMGMwZTQzNzIzNGM1ZWM5MmMxMzQ0ZjZmZTM0YzQ4YmI4OWEx
11
+ OTEwOWMwMmFhYTA5NTcyNmI2N2MwZjU4OTk4NGM5NTQ2MTk0M2E=
12
12
  data.tar.gz: !binary |-
13
- ZjMwYzFlZjA3MjhkNTBjZjljNjk5NjAxZTFhM2MzODlmOTU5YTQ2MTQyMmRm
14
- ZGYwNzY5NWE3NzZmMjNiOTE0ODg3ZjNhOGFjYjhhNThmMWNjMGY5YjY5Nzk4
15
- YjVjZGFmZGE5ZmM1YTI5MjhlNDE3OTdjOTNiZjAyNDc3MjMyZDE=
13
+ ZDYxNGJlMDE2ODhlOWY1NWMxNDJkMTg5YjcwM2UyMzlmM2IwMWVlYWI2Y2Rh
14
+ ZTAyNDY2NzYxNzdhNDZlNzg3NDg2ODVhY2E1ZmY1ODQyNzU4MmIwNWYxZmE5
15
+ MWFlOWYwNGU1ZThhNGE4MDRhZmNmOWQxNDZlZGI0NjM3MmVkZTA=
@@ -9,6 +9,7 @@ module Acfs
9
9
  require 'acfs/version'
10
10
  require 'acfs/errors'
11
11
  require 'acfs/global'
12
+ require 'acfs/util'
12
13
 
13
14
  require 'acfs/collection'
14
15
  require 'acfs/configuration'
@@ -6,6 +6,7 @@ module Acfs
6
6
 
7
7
  class Collection < ::Delegator
8
8
  include Model::Loadable
9
+ include Acfs::Util::Callbacks
9
10
 
10
11
  def initialize
11
12
  super([])
@@ -40,5 +40,28 @@ module Acfs
40
40
  self.runner.clear
41
41
  Acfs::Stub.clear
42
42
  end
43
+
44
+ # @api public
45
+ #
46
+ # Add an additional callback hook to not loaded resource.
47
+ # If given resource already loaded callback will be invoked immediately.
48
+ #
49
+ # This method will be replaced by explicit callback handling when query methods
50
+ # return explicit future objects.
51
+ #
52
+ # @example
53
+ # user = MyUser.find 1, &callback_one
54
+ # Acfs.add_callback(user, &callback_two)
55
+ #
56
+ def add_callback(resource, &block)
57
+ raise ArgumentError.new "Given resource is not an Acfs resource but a: #{resource.class.name}" unless resource.respond_to?(:__callbacks__)
58
+ return false if block.nil?
59
+
60
+ if resource.loaded?
61
+ block.call resource
62
+ else
63
+ resource.__callbacks__ << block
64
+ end
65
+ end
43
66
  end
44
67
  end
@@ -98,15 +98,16 @@ module Acfs::Model
98
98
  # @return [ self ] Resource object, nil if empty list is returned
99
99
  #
100
100
  def find_by(params, &block)
101
- model = ResourceDelegator.new self.new
101
+ model = Acfs::Util::ResourceDelegator.new self.new
102
+ model.__callbacks__ << block unless block.nil?
102
103
 
103
104
  operation :list, params: params do |data|
104
- unless data.empty?
105
- model.__setobj__ create_resource data.first, origin: model.__getobj__
106
- else
105
+ if data.empty?
107
106
  model.__setobj__ nil
107
+ else
108
+ model.__setobj__ create_resource data.first, origin: model.__getobj__
108
109
  end
109
- block.call model unless block.nil?
110
+ model.__invoke__
110
111
  end
111
112
 
112
113
  model
@@ -130,21 +131,18 @@ module Acfs::Model
130
131
  end
131
132
  end
132
133
 
133
- # TODO: Replace delegator with promise or future for the long run.
134
- class ResourceDelegator < SimpleDelegator
135
- delegate :class, :is_a?, :kind_of?, :nil?, to: :__getobj__
136
- end
137
-
138
134
  private
139
135
  def find_single(id, opts, &block)
140
- model = ResourceDelegator.new self.new
136
+ model = Acfs::Util::ResourceDelegator.new self.new
141
137
 
142
138
  opts[:params] ||= {}
143
139
  opts[:params].merge!({ id: id })
144
140
 
141
+ model.__callbacks__ << block unless block.nil?
142
+
145
143
  operation :read, opts do |data|
146
144
  model.__setobj__ create_resource data, origin: model.__getobj__
147
- block.call model unless block.nil?
145
+ model.__invoke__
148
146
  end
149
147
 
150
148
  model
@@ -152,13 +150,15 @@ module Acfs::Model
152
150
 
153
151
  def find_multiple(ids, opts, &block)
154
152
  ::Acfs::Collection.new.tap do |collection|
153
+ collection.__callbacks__ << block unless block.nil?
154
+
155
155
  counter = 0
156
156
  ids.each do |id|
157
157
  find_single id, opts do |resource|
158
158
  collection << resource
159
159
  if (counter += 1) == ids.size
160
160
  collection.loaded!
161
- block.call collection unless block.nil?
161
+ collection.__invoke__
162
162
  end
163
163
  end
164
164
  end
@@ -69,7 +69,7 @@ module Acfs
69
69
  def find(*attrs, &block)
70
70
  opts = { params: attrs.extract_options! }
71
71
 
72
- model = ResourceDelegator.new self.new
72
+ model = Util::ResourceDelegator.new self.new
73
73
 
74
74
  operation :read, opts do |data|
75
75
  model.__setobj__ create_resource data, origin: model.__getobj__
@@ -0,0 +1,20 @@
1
+ module Acfs
2
+ module Util
3
+ # TODO: Merge wit features in v1.0
4
+ module Callbacks
5
+ def __callbacks__
6
+ @__callbacks__ ||= []
7
+ end
8
+
9
+ def __invoke__
10
+ __callbacks__.each{|c| c.call self}
11
+ end
12
+ end
13
+
14
+ # TODO: Replace delegator with promise or future for the long run.
15
+ class ResourceDelegator < SimpleDelegator
16
+ delegate :class, :is_a?, :kind_of?, :nil?, to: :__getobj__
17
+ include Callbacks
18
+ end
19
+ end
20
+ end
@@ -29,6 +29,23 @@ describe Acfs::Model::QueryMethods do
29
29
  Acfs.run
30
30
  end
31
31
 
32
+ it 'should invoke multiple callback after model is loaded' do
33
+ proc1 = Proc.new { }
34
+ proc2 = Proc.new { }
35
+ expect(proc1).to receive(:call) do |user|
36
+ expect(user).to equal @user
37
+ expect(user).to be_loaded
38
+ end
39
+ expect(proc2).to receive(:call) do |user|
40
+ expect(user).to equal @user
41
+ expect(user).to be_loaded
42
+ end
43
+
44
+ @user = model.find 1, &proc1
45
+ Acfs.add_callback(@user, &proc2)
46
+ Acfs.run
47
+ end
48
+
32
49
  context 'with resource type inheritance' do
33
50
  let!(:user) { MyUser.find 2 }
34
51
  subject { user }
@@ -104,6 +121,25 @@ describe Acfs::Model::QueryMethods do
104
121
  Acfs.run
105
122
  end
106
123
 
124
+ it 'should invoke multiple callback after all models are loaded' do
125
+ proc1 = Proc.new { }
126
+ proc2 = Proc.new { }
127
+ expect(proc1).to receive(:call) do |users|
128
+ expect(users).to be === @users
129
+ expect(users.size).to be == 2
130
+ expect(users).to be_loaded
131
+ end
132
+ expect(proc2).to receive(:call) do |users|
133
+ expect(users).to be === @users
134
+ expect(users.size).to be == 2
135
+ expect(users).to be_loaded
136
+ end
137
+
138
+ @users = model.find 1, 2, &proc1
139
+ Acfs.add_callback(@users, &proc2)
140
+ Acfs.run
141
+ end
142
+
107
143
  it 'should respect resource type inheritance' do
108
144
  customers = MyUser.find 3, 4
109
145
  Acfs.run
@@ -220,6 +256,27 @@ describe Acfs::Model::QueryMethods do
220
256
  Acfs.run
221
257
  end
222
258
 
259
+ it 'should invoke multiple callbacks after model is loaded' do
260
+ proc1 = Proc.new { }
261
+ proc2 = Proc.new { }
262
+
263
+ expect(proc1).to receive(:call) do |user|
264
+ expect(user).to eql @user.__getobj__
265
+ expect(user).to be_a MyUser
266
+ expect(user).to be_loaded
267
+ end
268
+
269
+ expect(proc2).to receive(:call) do |user|
270
+ expect(user).to eql @user.__getobj__
271
+ expect(user).to be_a MyUser
272
+ expect(user).to be_loaded
273
+ end
274
+
275
+ @user = model.send described_method, age: 24, &proc1
276
+ Acfs.add_callback @user, &proc2
277
+ Acfs.run
278
+ end
279
+
223
280
  it 'should load a single MyUser object' do
224
281
  expect(subject).to be_a MyUser
225
282
  end
@@ -260,6 +317,24 @@ describe Acfs::Model::QueryMethods do
260
317
  @user = model.find_by age: 24, &proc
261
318
  Acfs.run
262
319
  end
320
+
321
+ it 'should invoke multiple callbacks after model is loaded' do
322
+ proc1 = Proc.new { }
323
+ proc2 = Proc.new { }
324
+
325
+ expect(proc1).to receive(:call) do |user|
326
+ expect(user).to eql @user.__getobj__
327
+ expect(user).to be_a NilClass
328
+ end
329
+ expect(proc2).to receive(:call) do |user|
330
+ expect(user).to eql @user.__getobj__
331
+ expect(user).to be_a NilClass
332
+ end
333
+
334
+ @user = model.find_by age: 24, &proc1
335
+ Acfs.add_callback @user, &proc2
336
+ Acfs.run
337
+ end
263
338
  end
264
339
  end
265
340
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: acfs
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.29.1.1.b257
4
+ version: 0.29.1.1.b259
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jan Graichen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-06 00:00:00.000000000 Z
11
+ date: 2014-02-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -165,6 +165,7 @@ files:
165
165
  - lib/acfs/service/middleware.rb
166
166
  - lib/acfs/singleton_resource.rb
167
167
  - lib/acfs/stub.rb
168
+ - lib/acfs/util.rb
168
169
  - lib/acfs/version.rb
169
170
  - lib/acfs/yard.rb
170
171
  - spec/acfs/configuration_spec.rb