kaicho 0.2.0 → 0.2.2

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
  SHA256:
3
- metadata.gz: 0b149a80108fa8af5935e0f99b59b90b2f969b4d386b14178b6eb90db506e5b4
4
- data.tar.gz: 71a2d0c27a52c307b5593f69cb7a3922a3c9610a9772ba4ff5e21cba7c2eb3e3
3
+ metadata.gz: 10295f3c7c5a763d97c7f2e611c1f63766a6250d937e1295881031fecda0d08e
4
+ data.tar.gz: bf5e3bd28fbd09324a6944cdb09035d5c83bdfae97a4abefac3715255b302527
5
5
  SHA512:
6
- metadata.gz: 6b0880aefc00222a7111195111ddf4924f5010ec5ca406c5420d399848d9e89a4f6cb2dab42b3296304423c567c8946cea28dafa3f8766709b7ac9a35823536e
7
- data.tar.gz: 3342fc356fc06c54720d66ae236de47e77e2a300d919a97940c881c51ec72400650f42591f2ab84a7484024c8d6aff5a9a1ffecbc715dce998d316e9f2c0e84b
6
+ metadata.gz: 275467c78b00d15d69d4b614e62080ac40bae1fe11b3513464856f7c06e9fa6a4c01f2e2c372fdc5893a24f39f7abe2bbbeb3633a881a9ea6bb869cd59a23b28
7
+ data.tar.gz: eb7a56313adcb19c7fe8faebb5590795231c188bb2e8e89cade8d3417467bc1ac1dd68cc1684f45e310e6396f7234b85a7885801ebabf2cf3763a456a2907df3
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- kaicho (0.1.0)
4
+ kaicho (0.2.2)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -15,14 +15,14 @@ GEM
15
15
  diff-lcs (1.3)
16
16
  docile (1.3.1)
17
17
  json (2.1.0)
18
- rake (12.3.1)
18
+ rake (12.3.2)
19
19
  rspec (3.8.0)
20
20
  rspec-core (~> 3.8.0)
21
21
  rspec-expectations (~> 3.8.0)
22
22
  rspec-mocks (~> 3.8.0)
23
23
  rspec-core (3.8.0)
24
24
  rspec-support (~> 3.8.0)
25
- rspec-expectations (3.8.1)
25
+ rspec-expectations (3.8.2)
26
26
  diff-lcs (>= 1.2.0, < 2.0)
27
27
  rspec-support (~> 3.8.0)
28
28
  rspec-mocks (3.8.0)
@@ -34,10 +34,10 @@ GEM
34
34
  json (>= 1.8, < 3)
35
35
  simplecov-html (~> 0.10.0)
36
36
  simplecov-html (0.10.2)
37
- term-ansicolor (1.6.0)
37
+ term-ansicolor (1.7.0)
38
38
  tins (~> 1.0)
39
39
  thor (0.19.4)
40
- tins (1.16.3)
40
+ tins (1.20.2)
41
41
 
42
42
  PLATFORMS
43
43
  ruby
@@ -50,4 +50,4 @@ DEPENDENCIES
50
50
  rspec (~> 3.8, >= 3.8.0)
51
51
 
52
52
  BUNDLED WITH
53
- 1.16.5
53
+ 1.17.1
@@ -15,6 +15,35 @@ require 'kaicho/util'
15
15
  #
16
16
  # Note that all methods act on instances of Classes at the moment.
17
17
  module Kaicho
18
+ # Called when Kaicho is `include`d
19
+ # if you use the provided class methods, be sure to call super in your
20
+ # initialize method, otherwise they will have no effect
21
+ def self.append_features(rcvr)
22
+ super
23
+
24
+ rcvr.instance_variable_set(:@class_resources, [])
25
+ rcvr.instance_variable_set(:@class_triggers, [])
26
+
27
+ # @see #def_resource
28
+ rcvr.define_singleton_method(:def_resource) do |*args, &block|
29
+ @class_resources << [args, block]
30
+ end
31
+
32
+ # @see #add_triggers
33
+ rcvr.define_singleton_method(:add_triggers) do |*triggers|
34
+ @triggers += triggers
35
+ end
36
+ end
37
+
38
+ def initialize
39
+ (self.class.instance_variable_get(:@class_resources))
40
+ .each { |args, block| def_resource(*args, &block) }
41
+
42
+ add_triggers(*(self.class.instance_variable_get(:@class_triggers)))
43
+
44
+ super
45
+ end
46
+
18
47
  # adds trigger(s) which can be used to trigger updates of resources
19
48
  # who have the trigger set
20
49
  #
@@ -64,7 +93,7 @@ module Kaicho
64
93
  end
65
94
 
66
95
  define_singleton_method(dname) do
67
- update_resource(dname) unless @resources[dname][:udid].positive?
96
+ update_resource(dname, rand) unless resource_defined?(dname)
68
97
  read.call
69
98
  end
70
99
 
@@ -90,7 +119,7 @@ module Kaicho
90
119
 
91
120
  define_singleton_method(:"#{dname}=") do |v|
92
121
  write.call(v)
93
- update_dependants(dname)
122
+ update_dependants(dname, rand)
94
123
  v
95
124
  end
96
125
 
@@ -121,6 +150,7 @@ module Kaicho
121
150
  # - +:write+, +:w+ - defines an {#attr_writer}
122
151
  # - +:both+, +:rw+ - defines both, see {#attr_accessor}
123
152
  # - +:none+ - don't generate any accessors
153
+ # @param [Symbol] accessors alias to accessor
124
154
  # @param block a block that will be called, with no arguments, to update this
125
155
  # resource
126
156
  # @return [True] this method always returns true or raises an exception
@@ -128,15 +158,20 @@ module Kaicho
128
158
  depends: {},
129
159
  triggers: [],
130
160
  overwrite: false,
131
- share: nil,
132
- accessor: :read,
161
+ share: nil,
162
+ accessor: :read,
163
+ accessors: nil,
133
164
  &block)
134
165
  @resources ||= {}
135
166
 
167
+ accessor = accessors unless accessors.nil?
168
+
136
169
  Kaicho::Util.check_type(Symbol, dname)
137
170
  Kaicho::Util.check_type(Hash, depends)
138
171
  Kaicho::Util.check_type(Array, triggers)
139
172
 
173
+ block = nil unless block_given?
174
+
140
175
  unless %i[read r write w both rw none].include?(accessor)
141
176
  raise(ArgumentError, "invalid accessor: :#{accessor}")
142
177
  end
@@ -208,23 +243,23 @@ module Kaicho
208
243
  end
209
244
 
210
245
  return if @resources[dname][:udid] == udid
211
-
212
246
  udid ||= rand
247
+ @resources[dname][:udid] = udid
213
248
 
214
249
  return unless update_depends(dname, udid)
215
250
 
216
- result = @resources[dname][:proc].call
251
+ unless @resources[dname][:proc].nil?
252
+ result = self.instance_exec(&@resources[dname][:proc])
217
253
 
218
- if @resources[dname][:share].nil?
219
- instance_variable_set(@resources[dname][:varname], result)
220
- else
221
- @resources[dname][:share].class_variable_set(
222
- @resources[dname][:varname], result
223
- )
254
+ if @resources[dname][:share].nil?
255
+ instance_variable_set(@resources[dname][:varname], result)
256
+ else
257
+ @resources[dname][:share].class_variable_set(
258
+ @resources[dname][:varname], result
259
+ )
260
+ end
224
261
  end
225
262
 
226
- @resources[dname][:udid] = udid
227
-
228
263
  update_dependants(dname, udid)
229
264
 
230
265
  true
@@ -237,7 +272,7 @@ module Kaicho
237
272
  # @param dname the name of the resource
238
273
  # @param udid the update-id of this call, this should be left +nil+. It is
239
274
  # internally to avoid infinite loops during update cascades.
240
- # @return [True] this method always returns true or raises an exception
275
+ # @return [bool] returns false if the resource could not be found, else return true
241
276
  def update_depends(dname, udid = nil)
242
277
  udid ||= rand
243
278
  @resources[dname][:depends].each do |d, o|
@@ -265,10 +300,9 @@ module Kaicho
265
300
  # @return [True] this method always returns true or raises an exception
266
301
  def update_dependants(dname, udid = nil)
267
302
  udid ||= rand
268
- dependants = @resources.select do |_, v|
303
+ @resources.select do |_, v|
269
304
  v[:depends].include?(dname) && v[:udid] != udid
270
- end
271
- dependants.each { |d, _| update_resource(d, udid) }
305
+ end.each { |d, _| update_resource(d, udid) }
272
306
 
273
307
  true
274
308
  end
@@ -295,8 +329,23 @@ module Kaicho
295
329
  # @return [True] this method always returns true or raises an exception
296
330
  def update_all_resources
297
331
  udid = rand
298
- @resources.keys.each { |d| update_resource(d, udid) }
332
+
333
+ resource_roots.each { |d| update_resource(d, udid) }
299
334
 
300
335
  true
301
336
  end
337
+
338
+ # Determine the root resources of the current object
339
+ #
340
+ # A resource is a root resource if it either does not depend on anything or
341
+ # all of its dependencies have the +:fail+ action (i.e. they are not managed
342
+ # by kaicho)
343
+ #
344
+ # @return [Array] an array of Symbol where each element is the name of a
345
+ # resource root
346
+ def resource_roots
347
+ @resources.select do |a, attr|
348
+ attr[:depends].empty? || attr[:depends].all? { |_,a| a == :fail }
349
+ end.map { |a, _| a }
350
+ end
302
351
  end
@@ -2,5 +2,5 @@
2
2
 
3
3
  module Kaicho
4
4
  # Version of Kaicho
5
- VERSION = '0.2.0'
5
+ VERSION = '0.2.2'
6
6
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kaicho
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stone Tickle
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-10-03 00:00:00.000000000 Z
11
+ date: 2018-12-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler