kaicho 0.1.0 → 0.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fb83b5885137a7bf2c5f7356781218603fff10efd4ff45f2d3279ba9e9df9c03
4
- data.tar.gz: a16eb9fb31003ce0030e3520d7825a34e76d27f3bc68ef481f1b705d894e1ce9
3
+ metadata.gz: 0b149a80108fa8af5935e0f99b59b90b2f969b4d386b14178b6eb90db506e5b4
4
+ data.tar.gz: 71a2d0c27a52c307b5593f69cb7a3922a3c9610a9772ba4ff5e21cba7c2eb3e3
5
5
  SHA512:
6
- metadata.gz: 16b18fd50f9585ca9654244efbf784f45d250f3bad1e915a97631d84ad43c2f2da29ec5ca5aea414997db4187d3cc1e886dddb46d62785a4ec8b994680eaaaac
7
- data.tar.gz: ccf475fcdceda0ffd6b15ee90d30ea06d8db64d059a6f6be6e1b8b665c1dec9ff1b56d5ab1d815e92272f87bc26bd72bf7a6b591ce010407d9a8f3c061d92fb8
6
+ metadata.gz: 6b0880aefc00222a7111195111ddf4924f5010ec5ca406c5420d399848d9e89a4f6cb2dab42b3296304423c567c8946cea28dafa3f8766709b7ac9a35823536e
7
+ data.tar.gz: 3342fc356fc06c54720d66ae236de47e77e2a300d919a97940c881c51ec72400650f42591f2ab84a7484024c8d6aff5a9a1ffecbc715dce998d316e9f2c0e84b
data/Gemfile CHANGED
@@ -1,6 +1,8 @@
1
- source "https://rubygems.org"
1
+ # frozen_string_literal: true
2
2
 
3
- git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
3
+ source 'https://rubygems.org'
4
+
5
+ git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
4
6
 
5
7
  # Specify your gem's dependencies in kaicho.gemspec
6
8
  gemspec
@@ -0,0 +1,53 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ kaicho (0.1.0)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ coveralls (0.8.22)
10
+ json (>= 1.8, < 3)
11
+ simplecov (~> 0.16.1)
12
+ term-ansicolor (~> 1.3)
13
+ thor (~> 0.19.4)
14
+ tins (~> 1.6)
15
+ diff-lcs (1.3)
16
+ docile (1.3.1)
17
+ json (2.1.0)
18
+ rake (12.3.1)
19
+ rspec (3.8.0)
20
+ rspec-core (~> 3.8.0)
21
+ rspec-expectations (~> 3.8.0)
22
+ rspec-mocks (~> 3.8.0)
23
+ rspec-core (3.8.0)
24
+ rspec-support (~> 3.8.0)
25
+ rspec-expectations (3.8.1)
26
+ diff-lcs (>= 1.2.0, < 2.0)
27
+ rspec-support (~> 3.8.0)
28
+ rspec-mocks (3.8.0)
29
+ diff-lcs (>= 1.2.0, < 2.0)
30
+ rspec-support (~> 3.8.0)
31
+ rspec-support (3.8.0)
32
+ simplecov (0.16.1)
33
+ docile (~> 1.1)
34
+ json (>= 1.8, < 3)
35
+ simplecov-html (~> 0.10.0)
36
+ simplecov-html (0.10.2)
37
+ term-ansicolor (1.6.0)
38
+ tins (~> 1.0)
39
+ thor (0.19.4)
40
+ tins (1.16.3)
41
+
42
+ PLATFORMS
43
+ ruby
44
+
45
+ DEPENDENCIES
46
+ bundler (~> 1.16, >= 1.16.5)
47
+ coveralls (~> 0.8, >= 0.8.22)
48
+ kaicho!
49
+ rake (~> 12.3, >= 12.3.1)
50
+ rspec (~> 3.8, >= 3.8.0)
51
+
52
+ BUNDLED WITH
53
+ 1.16.5
data/README.md CHANGED
@@ -1,4 +1,8 @@
1
1
  # Kaicho
2
+ [![Build Status](https://travis-ci.org/annacrombie/kaicho.svg?branch=master)](https://travis-ci.org/annacrombie/kaicho)
3
+ [![Coverage Status](https://coveralls.io/repos/github/annacrombie/kaicho/badge.svg?branch=master)](https://coveralls.io/github/annacrombie/kaicho?branch=master)
4
+ [![Inline docs](http://inch-ci.org/github/annacrombie/kaicho.svg?branch=master&style=shields)](http://inch-ci.org/github/annacrombie/kaicho)
5
+ [![Gem Version](https://badge.fury.io/rb/kaicho.svg)](https://badge.fury.io/rb/kaicho)
2
6
 
3
7
  Kaicho is the boss for your resources. It handles keeping everything up to
4
8
  date.
data/Rakefile CHANGED
@@ -1,6 +1,8 @@
1
- require "bundler/gem_tasks"
2
- require "rspec/core/rake_task"
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/gem_tasks'
4
+ require 'rspec/core/rake_task'
3
5
 
4
6
  RSpec::Core::RakeTask.new(:spec)
5
7
 
6
- task :default => :spec
8
+ task default: :spec
@@ -1,7 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
- require "bundler/setup"
4
- require "kaicho"
4
+ require 'bundler/setup'
5
+ require 'kaicho'
5
6
 
6
7
  # You can add fixtures and/or initialization code here to make experimenting
7
8
  # with your gem easier. You can also use a different console, if you like.
@@ -10,5 +11,5 @@ require "kaicho"
10
11
  # require "pry"
11
12
  # Pry.start
12
13
 
13
- require "irb"
14
+ require 'irb'
14
15
  IRB.start(__FILE__)
data/bin/setup CHANGED
@@ -1,4 +1,6 @@
1
1
  #!/usr/bin/env bash
2
+ # frozen_string_literal: true
3
+
2
4
  set -euo pipefail
3
5
  IFS=$'\n\t'
4
6
  set -vx
@@ -1,27 +1,30 @@
1
- lib = File.expand_path("../lib", __FILE__)
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__)
2
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
- require "kaicho/version"
5
+ require 'kaicho/version'
4
6
 
5
7
  Gem::Specification.new do |spec|
6
- spec.name = "kaicho"
8
+ spec.name = 'kaicho'
7
9
  spec.version = Kaicho::VERSION
8
- spec.authors = ["Stone Tickle"]
9
- spec.email = ["lattis@mochiro.moe"]
10
+ spec.authors = ['Stone Tickle']
11
+ spec.email = ['lattis@mochiro.moe']
10
12
 
11
- spec.summary = "a resource manager"
12
- spec.homepage = "https://github.com/annacrombie/kaicho"
13
+ spec.summary = 'a resource manager'
14
+ spec.homepage = 'https://github.com/annacrombie/kaicho'
13
15
 
14
- # Specify which files should be added to the gem when it is released.
15
- # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
16
- spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
17
- `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
16
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
17
+ `git ls-files -z`.split("\x0").reject do |f|
18
+ f.match(%r{^(test|spec|features)/})
19
+ end
18
20
  end
19
21
 
20
- spec.bindir = "exe"
22
+ spec.bindir = 'exe'
21
23
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
- spec.require_paths = ["lib"]
24
+ spec.require_paths = ['lib']
23
25
 
24
- spec.add_development_dependency "bundler", "~> 1.16"
25
- spec.add_development_dependency "rake", "~> 10.0"
26
- spec.add_development_dependency "rspec", "~> 3.0"
26
+ spec.add_development_dependency 'bundler', '~> 1.16', '>=1.16.5'
27
+ spec.add_development_dependency 'rake', '~> 12.3', '>=12.3.1'
28
+ spec.add_development_dependency 'rspec', '~> 3.8', '>=3.8.0'
29
+ spec.add_development_dependency 'coveralls', '~> 0.8', '>=0.8.22'
27
30
  end
@@ -1,104 +1,129 @@
1
- require "kaicho/version"
1
+ # frozen_string_literal: true
2
2
 
3
- # Kaicho is a module that assists in a class's resource management.
4
- # It enables you to chain resources together. Each resource when changed
5
- # will update all of its dependants. Additionally, if you try to access a
6
- # resource which has not been initialized, it will update itself along with
7
- # all resources it depends on.
8
- #
9
- # This is useful if you have a class with many instance variables that all
10
- # form a dependancy tree. For instance:
11
- #
12
- # ```
13
- # class Fruits
14
- # include Kaicho
3
+ require 'kaicho/version'
4
+ require 'kaicho/util'
5
+
6
+ # Kaicho is a module for instance variable management. It can also manage
7
+ # class variables, both are referred to as ``resources.'' All class and
8
+ # instance variables are automatically considered resources, but only those
9
+ # which have been defined with {#def_resource} have the ability to be
10
+ # automatically updated.
15
11
  #
16
- # def intialize
17
- # def_resource :apples, accessor: :both { @apples || 0 }
18
- # def_resource :oranges, accessor: :both { @oranges || 0 }
19
- # def_resource :total, depend: { apples: :fail, oranges: :fail } do
20
- # puts "computing total"
21
- # @apples + @oranges
22
- # end
23
- # end
24
- # end
12
+ # Auto-updates occur whenever a resource is updated through {#update_resource}
13
+ # or if a resource has never been initialized and is accessed through a kaicho
14
+ # #{attr_reader}.
25
15
  #
26
- # f = Fruits.new
27
- # f.apples #=> 0
28
- # f.apples += 1 #=> 1
29
- # computing total
30
- # f.oranges = 10 #=> 10
31
- # computing total
32
- # f.total #=> 11
33
- # f.oranges = 2
34
- # computing total
35
- # f.total #=> 13
36
- # f.total #=> 13
37
- # ```
16
+ # Note that all methods act on instances of Classes at the moment.
38
17
  module Kaicho
39
18
  # adds trigger(s) which can be used to trigger updates of resources
40
19
  # who have the trigger set
41
20
  #
42
- # @param t a list of symbols to be used as triggers
43
- def add_triggers(*t)
21
+ # @param [[Symbol]] trigs a list of symbols to be used as triggers
22
+ # @return [True] this method always returns true or raises an exception
23
+ def add_triggers(*trigs)
44
24
  @triggers ||= []
45
- @triggers += t.map(&:to_sym)
25
+ @triggers += trigs.map(&:to_sym)
26
+
27
+ true
46
28
  end
47
29
 
48
- # makes both an attr_reader and an attr_writer for the `dname`
30
+ # makes both an attr_reader and an attr_writer for the +dname+
49
31
  #
50
32
  # @param dname the resource to create accessors for
51
33
  # @param share the owner of the shared variable
34
+ # @return [True] this method always returns true or raises an exception
52
35
  def attr_accessor(dname, share: nil)
53
- attr_reader(dname, share: nil)
54
- attr_writer(dname, share: nil)
36
+ attr_reader(dname, share: share)
37
+ attr_writer(dname, share: share)
38
+
39
+ true
55
40
  end
56
41
 
57
- # builds an attr_reader for a resource which functions just like a typical
58
- # attr_reader but will update the resource if it hasn't been accessed
59
- # before.
42
+ # defines an attr_reader singleton method for a resource which functions just
43
+ # like a typical attr_reader but will update the resource if it hasn't been
44
+ # accessed before. Unlike an attr_writer, an attr_reader can only be defined
45
+ # for resources that have been previously defined using {#def_resource}.
46
+ #
47
+ # @param dname the resource that will be accessed, as well as the name of the
48
+ # singleton method.
60
49
  #
61
- # @param dname the resource that will be accessed
62
50
  # @param share the owner of the shared variable
51
+ # @return [True] this method always returns true or raises an exception
63
52
  def attr_reader(dname, share: nil)
64
- read = share.nil? ? -> { instance_variable_get(:"@#{dname}") }
65
- : -> { share.class_variable_get(:"@@#{dname}") }
53
+ @resources ||= {}
54
+
55
+ unless @resources.key?(dname)
56
+ raise(ArgumentError, "resource #{dname} has not been defined")
57
+ end
58
+
59
+ read =
60
+ if share.nil?
61
+ -> { instance_variable_get(:"@#{dname}") }
62
+ else
63
+ -> { share.class_variable_get(:"@@#{dname}") }
64
+ end
65
+
66
66
  define_singleton_method(dname) do
67
67
  update_resource(dname) unless @resources[dname][:udid].positive?
68
68
  read.call
69
69
  end
70
+
71
+ true
70
72
  end
71
73
 
72
- # builds an attr_writer for a resource which functions just like a typical
73
- # attr_writer but will update the resource's dependants when it is called.
74
+ # defines an attr_writer singleton method for a resource which functions just
75
+ # like a typical attr_writer but will update the resource's dependants when
76
+ # it is called. Unlike an attr_reader, the resource +dname+ need not be
77
+ # previously defined using {#def_resource}.
74
78
  #
75
- # @param dname the resource that will be accessed
79
+ # @param dname the resource that will be accessed. The name of the singleton
80
+ # method defined will be +"#{dname}="+.
76
81
  # @param share the owner of the shared variable
82
+ # @return [True] this method always returns true or raises an exception
77
83
  def attr_writer(dname, share: nil)
78
- write = share.nil? ? -> (v) { instance_variable_set(:"@#{dname}", v) }
79
- : -> (v) { share.class_variable_set(:"@@#{dname}", v) }
84
+ write =
85
+ if share.nil?
86
+ ->(v) { instance_variable_set(:"@#{dname}", v) }
87
+ else
88
+ ->(v) { share.class_variable_set(:"@@#{dname}", v) }
89
+ end
90
+
80
91
  define_singleton_method(:"#{dname}=") do |v|
81
92
  write.call(v)
82
93
  update_dependants(dname)
83
94
  v
84
95
  end
85
- end
86
96
 
87
- def check_type(expected, got)
88
- unless expected === got
89
- raise TypeError.new("expected #{expected.name} got #{got}:#{got.class.name}")
90
- end
97
+ true
91
98
  end
92
99
 
93
- # define a resource
100
+ # Define a resource
94
101
  #
95
- # @param dname the name of the resource
96
- # @param depends a hash of dependants with the format
97
- # { dependant_name: :update_action }
98
- # where update_action is the action that
99
- # is taken when this resource is updated.
100
- # update_action can be one of
101
- # :
102
+ # @param [Symbol] dname the name of the resource
103
+ # @param [Hash] depends a hash of dependants with the format
104
+ # +{ dependant_name: :update_action }+ where update_action is the action
105
+ # that is taken when this resource is updated. Update_action can be one of:
106
+ # - +:update+ - update the dependant before updating this resource
107
+ # - +:keep+ - keep the dependant if it is already defined, otherwise,
108
+ # update it
109
+ # - +:fail+ - don't try to update this resource if the dependant is not
110
+ # defined
111
+ # @param [Array] triggers a list of triggers. These triggers must have been
112
+ # previously defined using {#add_triggers}
113
+ # @param [Boolean] overwrite if a resource with this name already exists,
114
+ # should it be overwritten
115
+ # @param [Object, nil] share if +nil+, this resource is stored as an instance
116
+ # variable, else the value must be an instance of a class and this resource
117
+ # is stored as a class variable owned by the class specified.
118
+ # @param [Symbol] accessor a symbol that determines which attribute accessors
119
+ # should be generated for this resource
120
+ # - +:read+, +:r+ - defines an {#attr_reader}
121
+ # - +:write+, +:w+ - defines an {#attr_writer}
122
+ # - +:both+, +:rw+ - defines both, see {#attr_accessor}
123
+ # - +:none+ - don't generate any accessors
124
+ # @param block a block that will be called, with no arguments, to update this
125
+ # resource
126
+ # @return [True] this method always returns true or raises an exception
102
127
  def def_resource(dname,
103
128
  depends: {},
104
129
  triggers: [],
@@ -108,39 +133,29 @@ module Kaicho
108
133
  &block)
109
134
  @resources ||= {}
110
135
 
111
- check_type(Symbol, dname)
112
- check_type(Hash, depends)
113
- check_type(Array, triggers)
136
+ Kaicho::Util.check_type(Symbol, dname)
137
+ Kaicho::Util.check_type(Hash, depends)
138
+ Kaicho::Util.check_type(Array, triggers)
114
139
 
115
- return if @resources.key?(dname) && !overwrite
140
+ unless %i[read r write w both rw none].include?(accessor)
141
+ raise(ArgumentError, "invalid accessor: :#{accessor}")
142
+ end
116
143
 
117
144
  add_triggers # initialize @triggers to []
118
145
  triggers.each do |t|
119
- raise ArgumentError.new("invalid trigger ':#{t}'") unless @triggers.include?(t)
146
+ raise(ArgumentError, "invalid trigger :#{t}") unless @triggers.include?(t)
120
147
  end
121
148
 
122
- depends.map =
123
- case depends
124
- when Array
125
- depends.map { |d| [d, :keep] }.to_h
126
- when Hash
127
- depends
128
- else
129
- { depends => :keep }
130
- end
149
+ return if @resources.key?(dname) && !overwrite
131
150
 
132
- Zashoku.log.warn(self) { "overwriting resource #{dname}" } if @resources.key?(dname)
133
- Zashoku.log.info(self) { "defining resource #{dname}" }
134
- @resources.merge!(
135
- dname => {
136
- depends: depends,
137
- proc: block,
138
- udid: -1,
139
- triggers: triggers & (@triggers || []),
140
- share: share,
141
- varname: share.nil? ? "@#{dname}" : "@@#{dname}"
142
- }
143
- )
151
+ @resources[dname] = {
152
+ depends: depends,
153
+ proc: block,
154
+ udid: -1,
155
+ triggers: triggers,
156
+ share: share,
157
+ varname: share.nil? ? "@#{dname}" : "@@#{dname}"
158
+ }
144
159
 
145
160
  case accessor
146
161
  when :read, :r
@@ -150,45 +165,80 @@ module Kaicho
150
165
  when :both, :rw
151
166
  attr_accessor(dname, share: share)
152
167
  end
168
+
169
+ true
153
170
  end
154
171
 
172
+ # Determine if the value for resource has been defined. In other words,
173
+ # determine if a resource has ever been updated.
174
+ #
175
+ # If this resource has been defined using {#def_resource} then check if an
176
+ # associated instance or class variable is defined. Otherwise this method is
177
+ # eqivalent to calling +instance_variable_defined?("@#{dname}")+.
178
+ #
179
+ # @param [Symbol] dname the name of the resource
180
+ # @return [True] this method always returns true or raises an exception
155
181
  def resource_defined?(dname)
156
182
  return instance_variable_defined?("@#{dname}") unless @resources.key?(dname)
157
183
 
158
184
  if @resources[dname][:share].nil?
159
185
  instance_variable_defined?(@resources[dname][:varname])
160
186
  else
161
- @resources[dname][:share].class_variable_defined?(@resources[dname][:varname])
187
+ @resources[dname][:share].class_variable_defined?(
188
+ @resources[dname][:varname]
189
+ )
162
190
  end
163
191
  end
164
192
 
165
- def update_resource(dname, udid=nil)
166
- raise "no such resource #{dname}" unless @resources.key?(dname)
167
-
168
- Zashoku.log.debug(self) { "not updating #{dname}" } if @resources[dname][:udid] == udid
193
+ # Update a resource
194
+ #
195
+ # This method will update the specified resource and all of its depends
196
+ # and dependants.
197
+ #
198
+ # @see #update_depends
199
+ # @see #update_dependants
200
+ #
201
+ # @param dname the name of the resource
202
+ # @param udid the update-id of this call, this should be left +nil+. It is
203
+ # internally to avoid infinite loops during update cascades.
204
+ # @return [True] this method always returns true or raises an exception
205
+ def update_resource(dname, udid = nil)
206
+ unless @resources.key?(dname)
207
+ raise(ArgumentError, "no such resource #{dname}")
208
+ end
169
209
 
170
210
  return if @resources[dname][:udid] == udid
171
211
 
172
- Zashoku.log.debug(self) { "updating resource #{dname} #{udid}" }
173
-
174
212
  udid ||= rand
175
213
 
176
- return unless update_requisites(dname, udid)
214
+ return unless update_depends(dname, udid)
177
215
 
178
216
  result = @resources[dname][:proc].call
179
217
 
180
218
  if @resources[dname][:share].nil?
181
219
  instance_variable_set(@resources[dname][:varname], result)
182
220
  else
183
- @resources[dname][:share].class_variable_set(@resources[dname][:varname], result)
221
+ @resources[dname][:share].class_variable_set(
222
+ @resources[dname][:varname], result
223
+ )
184
224
  end
185
225
 
186
226
  @resources[dname][:udid] = udid
187
227
 
188
228
  update_dependants(dname, udid)
229
+
230
+ true
189
231
  end
190
232
 
191
- def update_requisites(dname, udid=nil)
233
+ # Update the prerequisites of a resource.
234
+ #
235
+ # This method will update all resources that +dname+ depends on.
236
+ #
237
+ # @param dname the name of the resource
238
+ # @param udid the update-id of this call, this should be left +nil+. It is
239
+ # internally to avoid infinite loops during update cascades.
240
+ # @return [True] this method always returns true or raises an exception
241
+ def update_depends(dname, udid = nil)
192
242
  udid ||= rand
193
243
  @resources[dname][:depends].each do |d, o|
194
244
  case o
@@ -197,34 +247,56 @@ module Kaicho
197
247
  when :keep
198
248
  update_resource(d, udid) unless resource_defined?(d)
199
249
  when :fail
200
- unless resource_defined?(d)
201
- Zashoku.log.debug(self) { "update resource #{dname} failing on #{d}" }
202
- return false
203
- end
204
- when :force
205
- update_resource(d, udid)
206
- else
207
- raise "option #{o} not understood for #{d} while updating #{dname}"
250
+ return false unless resource_defined?(d)
208
251
  end
209
- true
210
252
  end
253
+
254
+ true
211
255
  end
212
256
 
213
- def update_dependants(dname, udid=nil)
257
+ # Update the dependants of +dname+
258
+ #
259
+ # This method will update all resources that have +dname+ in their list of
260
+ # depends.
261
+ #
262
+ # @param dname the name of the resource
263
+ # @param udid the update-id of this call, this should be left +nil+. It is
264
+ # internally to avoid infinite loops during update cascades.
265
+ # @return [True] this method always returns true or raises an exception
266
+ def update_dependants(dname, udid = nil)
214
267
  udid ||= rand
215
- Zashoku.log.debug(self) { "updating dependants for #{dname}" }
216
- dependants = @resources.select { |_,v| v[:depends].include?(dname) && v[:udid] != udid }
217
- dependants.each { |d,_| update_resource(d, udid) }
268
+ dependants = @resources.select do |_, v|
269
+ v[:depends].include?(dname) && v[:udid] != udid
270
+ end
271
+ dependants.each { |d, _| update_resource(d, udid) }
272
+
273
+ true
218
274
  end
219
275
 
276
+ # Trigger resource updates
277
+ #
278
+ # This method will update all resources that have +trigger+ in their list of
279
+ # triggers.
280
+ #
281
+ # @param [Symbol] trigger the name of the trigger to trigger
282
+ # @return [True] this method always returns true or raises an exception
220
283
  def trigger_resources(trigger)
221
284
  udid = rand
222
- res = @resources.select { |_,v| v[:triggers].include?(trigger) }
223
- res.each { |r,_| update_resource(r, udid) }
285
+ res = @resources.select { |_, v| v[:triggers].include?(trigger) }
286
+ res.each { |r, _| update_resource(r, udid) }
287
+
288
+ true
224
289
  end
225
290
 
291
+ # Update all resources
292
+ #
293
+ # Equivalent to calling {#update_resource} for each resource in +@resources+.
294
+ #
295
+ # @return [True] this method always returns true or raises an exception
226
296
  def update_all_resources
227
297
  udid = rand
228
298
  @resources.keys.each { |d| update_resource(d, udid) }
299
+
300
+ true
229
301
  end
230
302
  end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kaicho
4
+ # A utility module for Kaicho. Don't touch this stuff!
5
+ module Util
6
+ module_function
7
+
8
+ # raise an exception if a type is invalid
9
+ #
10
+ # @param [Class] expected the expected type
11
+ # @param [Instance] got the received type
12
+ # @return [True] this method always returns true or raises an exception
13
+ def check_type(expected, got)
14
+ unless expected === got
15
+ raise(
16
+ TypeError,
17
+ "expected #{expected.name} got #{got}:#{got.class.name}"
18
+ )
19
+ end
20
+
21
+ true
22
+ end
23
+ end
24
+ end
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Kaicho
2
- VERSION = "0.1.0"
4
+ # Version of Kaicho
5
+ VERSION = '0.2.0'
3
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.1.0
4
+ version: 0.2.0
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-02 00:00:00.000000000 Z
11
+ date: 2018-10-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -17,6 +17,9 @@ dependencies:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.16'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 1.16.5
20
23
  type: :development
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -24,34 +27,69 @@ dependencies:
24
27
  - - "~>"
25
28
  - !ruby/object:Gem::Version
26
29
  version: '1.16'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 1.16.5
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: rake
29
35
  requirement: !ruby/object:Gem::Requirement
30
36
  requirements:
31
37
  - - "~>"
32
38
  - !ruby/object:Gem::Version
33
- version: '10.0'
39
+ version: '12.3'
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 12.3.1
34
43
  type: :development
35
44
  prerelease: false
36
45
  version_requirements: !ruby/object:Gem::Requirement
37
46
  requirements:
38
47
  - - "~>"
39
48
  - !ruby/object:Gem::Version
40
- version: '10.0'
49
+ version: '12.3'
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 12.3.1
41
53
  - !ruby/object:Gem::Dependency
42
54
  name: rspec
43
55
  requirement: !ruby/object:Gem::Requirement
44
56
  requirements:
45
57
  - - "~>"
46
58
  - !ruby/object:Gem::Version
47
- version: '3.0'
59
+ version: '3.8'
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: 3.8.0
48
63
  type: :development
49
64
  prerelease: false
50
65
  version_requirements: !ruby/object:Gem::Requirement
51
66
  requirements:
52
67
  - - "~>"
53
68
  - !ruby/object:Gem::Version
54
- version: '3.0'
69
+ version: '3.8'
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: 3.8.0
73
+ - !ruby/object:Gem::Dependency
74
+ name: coveralls
75
+ requirement: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - "~>"
78
+ - !ruby/object:Gem::Version
79
+ version: '0.8'
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: 0.8.22
83
+ type: :development
84
+ prerelease: false
85
+ version_requirements: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0.8'
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ version: 0.8.22
55
93
  description:
56
94
  email:
57
95
  - lattis@mochiro.moe
@@ -63,12 +101,14 @@ files:
63
101
  - ".rspec"
64
102
  - ".travis.yml"
65
103
  - Gemfile
104
+ - Gemfile.lock
66
105
  - README.md
67
106
  - Rakefile
68
107
  - bin/console
69
108
  - bin/setup
70
109
  - kaicho.gemspec
71
110
  - lib/kaicho.rb
111
+ - lib/kaicho/util.rb
72
112
  - lib/kaicho/version.rb
73
113
  homepage: https://github.com/annacrombie/kaicho
74
114
  licenses: []