yuuki 0.1.7 → 0.1.10
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +42 -0
- data/Gemfile +1 -1
- data/bin/console +3 -3
- data/lib/yuuki/caller.rb +35 -12
- data/lib/yuuki/periodic.rb +6 -4
- data/lib/yuuki/version.rb +1 -1
- data/yuuki.gemspec +3 -2
- metadata +17 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f0f63a39117df0dcba0f1bc9144369ad91cc0b93116b4d69d56b1e4d066616b9
|
4
|
+
data.tar.gz: 1669228275ba64bba60af4909d29cccca46b5cf6f1819aa769023aa181906bbd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: af212d7facc9bf11231dc891ce57d58c94055049bcfc9d92bbf50ecca32a51411422e5475ce782d2d72c78acc91e4b91f92f8f7cf8fb718af22201e8d26f3237
|
7
|
+
data.tar.gz: db7cc9405dea2279e4f7febed94200990c0fa25c8ecd0175b8cca853b9db5f90a8f0e2ba2d478b000f2edbc97fd7fc2b4ebdda4f775b307c59bd06fa620c7ec7
|
data/.rubocop.yml
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
AllCops:
|
2
|
+
TargetRubyVersion: 2.6
|
3
|
+
|
4
|
+
Metrics/AbcSize:
|
5
|
+
Max: 170
|
6
|
+
|
7
|
+
Metrics/BlockLength:
|
8
|
+
Max: 250
|
9
|
+
|
10
|
+
Metrics/ClassLength:
|
11
|
+
Max: 1000
|
12
|
+
|
13
|
+
Metrics/CyclomaticComplexity:
|
14
|
+
Max: 70
|
15
|
+
|
16
|
+
Metrics/MethodLength:
|
17
|
+
Max: 100
|
18
|
+
|
19
|
+
Metrics/ModuleLength:
|
20
|
+
Max: 1000
|
21
|
+
|
22
|
+
Metrics/ParameterLists:
|
23
|
+
Max: 50
|
24
|
+
|
25
|
+
Metrics/PerceivedComplexity:
|
26
|
+
Max: 80
|
27
|
+
|
28
|
+
Layout/SpaceInsideBlockBraces:
|
29
|
+
EnforcedStyle: no_space
|
30
|
+
SpaceBeforeBlockParameters: false
|
31
|
+
|
32
|
+
Style/Documentation:
|
33
|
+
Enabled: false
|
34
|
+
|
35
|
+
Style/NumericPredicate:
|
36
|
+
EnforcedStyle: comparison
|
37
|
+
|
38
|
+
Style/MultilineBlockChain:
|
39
|
+
Enabled: false
|
40
|
+
|
41
|
+
Style/SpecialGlobalVars:
|
42
|
+
EnforcedStyle: use_perl_names
|
data/Gemfile
CHANGED
data/bin/console
CHANGED
data/lib/yuuki/caller.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require 'set'
|
4
4
|
require 'yuuki/runner'
|
5
|
+
require 'yoshinon'
|
5
6
|
|
6
7
|
module Yuuki
|
7
8
|
class Caller
|
@@ -9,14 +10,15 @@ module Yuuki
|
|
9
10
|
# @param [String] require_dir directory
|
10
11
|
# @param [Boolean] recursive
|
11
12
|
def self.require_dir(require_dir, recursive: false)
|
12
|
-
Dir.glob(recursive ? "#{require_dir}/**/*.rb" : "#{require_dir}/*.rb"){|file| require file}
|
13
|
+
Dir.glob(recursive ? "#{require_dir}/**/*.rb" : "#{require_dir}/*.rb").sort.each {|file| require file}
|
13
14
|
end
|
14
15
|
|
15
16
|
# @param [Object] instances
|
16
|
-
def initialize(*instances)
|
17
|
+
def initialize(*instances, use_yoshinon: true)
|
17
18
|
@instances = Set.new
|
18
19
|
@threads = []
|
19
20
|
add(*instances)
|
21
|
+
@use_yoshinon = use_yoshinon
|
20
22
|
end
|
21
23
|
|
22
24
|
# adds instances to yuuki
|
@@ -27,13 +29,19 @@ module Yuuki
|
|
27
29
|
if instance.is_a?(Class)
|
28
30
|
klass = instance
|
29
31
|
# check the klass is extended
|
30
|
-
|
32
|
+
unless klass.singleton_class.include?(Yuuki::Runner)
|
33
|
+
raise Yuuki::Error, 'Runner instance must be extend Yuuki::Runner'
|
34
|
+
end
|
35
|
+
|
31
36
|
instance = instance.allocate
|
32
37
|
instance.instance_variable_set(:@yuuki, self)
|
33
38
|
instance.send(:initialize)
|
34
39
|
else
|
35
40
|
# check the klass is extended
|
36
|
-
|
41
|
+
unless instance.class.singleton_class.include?(Yuuki::Runner)
|
42
|
+
raise Yuuki::Error, 'Runner instance must be extend Yuuki::Runner'
|
43
|
+
end
|
44
|
+
|
37
45
|
# add @yuuki to the instance
|
38
46
|
instance.instance_variable_set(:@yuuki, self)
|
39
47
|
end
|
@@ -48,19 +56,19 @@ module Yuuki
|
|
48
56
|
def runners
|
49
57
|
list = @instances.flat_map do |instance|
|
50
58
|
methods = instance.class.instance_variable_get(:@yuuki_methods)
|
51
|
-
methods.select{|_sig, meta| meta[:enabled]}.map{|sig, meta| [instance.method(sig), meta]}
|
59
|
+
methods.select {|_sig, meta| meta[:enabled]}.map {|sig, meta| [instance.method(sig), meta]}
|
52
60
|
end
|
53
|
-
list.sort_by{|_method, meta| -(meta[:priority] || 0)}
|
61
|
+
list.sort_by {|_method, meta| -(meta[:priority] || 0)}
|
54
62
|
end
|
55
63
|
|
56
64
|
# returns all tags defined as Set
|
57
65
|
def tags
|
58
66
|
tags = @instances.flat_map do |instance|
|
59
67
|
methods = instance.class.instance_variable_get(:@yuuki_methods)
|
60
|
-
methods.select{|_sig, meta| meta[:enabled]}.flat_map{|_sig, meta| meta[:tags]}
|
68
|
+
methods.select {|_sig, meta| meta[:enabled]}.flat_map {|_sig, meta| meta[:tags]}
|
61
69
|
end
|
62
70
|
ret = Set.new
|
63
|
-
tags.each{|e| ret += e if e}
|
71
|
+
tags.each {|e| ret += e if e}
|
64
72
|
ret
|
65
73
|
end
|
66
74
|
|
@@ -90,9 +98,10 @@ module Yuuki
|
|
90
98
|
tags.each do |e|
|
91
99
|
next if t.include?(e)
|
92
100
|
raise Yuuki::Error, "tag `#{e}` is not associated" unless @ignore_tag_error
|
101
|
+
|
93
102
|
warn "Yuuki Warning: tag `#{e}` is not associated"
|
94
103
|
end
|
95
|
-
run_select(proc{|_method, meta| meta[:tags]&.intersect?(tags)}, **args, &block)
|
104
|
+
run_select(proc {|_method, meta| meta[:tags]&.intersect?(tags)}, **args, &block)
|
96
105
|
end
|
97
106
|
|
98
107
|
# runs the specific method
|
@@ -140,8 +149,10 @@ module Yuuki
|
|
140
149
|
end
|
141
150
|
|
142
151
|
def run_method_internal(method, args, &block)
|
152
|
+
yoshinon = Yoshinon.lock if @use_yoshinon
|
143
153
|
params = method.parameters
|
144
154
|
return method[] if params.empty?
|
155
|
+
|
145
156
|
params_array = []
|
146
157
|
params_hash = {}
|
147
158
|
params_block = nil
|
@@ -149,11 +160,15 @@ module Yuuki
|
|
149
160
|
params.each do |type, name|
|
150
161
|
case type
|
151
162
|
when :req
|
152
|
-
|
163
|
+
unless args.key?(name)
|
164
|
+
raise Yuuki::Error, "A required argument '#{name}' was not found on running #{method.owner}::#{method.name}"
|
165
|
+
end
|
166
|
+
|
153
167
|
params_array << args[name]
|
154
168
|
when :opt
|
155
169
|
# if parameters do not contain the :opt argument, treat it as not specified
|
156
170
|
next nonspecified_last_opt = name unless args.key?(name)
|
171
|
+
|
157
172
|
if nonspecified_last_opt
|
158
173
|
# if there already exist non-specified :opt arguments, no more specified :opt argument is allowed
|
159
174
|
raise Yuuki::Error, "A required argument '#{nonspecified_last_opt}' was not found"\
|
@@ -162,6 +177,7 @@ module Yuuki
|
|
162
177
|
params_array << args[name]
|
163
178
|
when :rest
|
164
179
|
next unless args.key?(name)
|
180
|
+
|
165
181
|
if nonspecified_last_opt
|
166
182
|
# if there already exist non-specified :opt arguments, the :rest argument cannot be handled
|
167
183
|
raise Yuuki::Error, "A required argument '#{nonspecified_last_opt}' not found"\
|
@@ -173,12 +189,17 @@ module Yuuki
|
|
173
189
|
params_array << args[name]
|
174
190
|
end
|
175
191
|
when :keyreq
|
176
|
-
|
192
|
+
unless args.key?(name)
|
193
|
+
raise Yuuki::Error,
|
194
|
+
"A required key argument '#{name}' was not found on running #{method.owner}::#{method.name}"
|
195
|
+
end
|
196
|
+
|
177
197
|
params_hash[name] = args[name]
|
178
198
|
when :key
|
179
199
|
params_hash[name] = args[name] if args.key?(name)
|
180
200
|
when :keyrest
|
181
201
|
next unless args.key?(name)
|
202
|
+
|
182
203
|
if args[name].respond_to?(:to_hash)
|
183
204
|
params_hash.merge!(args[name])
|
184
205
|
else
|
@@ -188,8 +209,10 @@ module Yuuki
|
|
188
209
|
params_block = args[name]
|
189
210
|
end
|
190
211
|
end
|
191
|
-
params_block = block unless params.any?{|type, _| type == :block}
|
212
|
+
params_block = block unless params.any? {|type, _| type == :block}
|
192
213
|
params_hash.empty? ? method[*params_array, ¶ms_block] : method[*params_array, **params_hash, ¶ms_block]
|
214
|
+
ensure
|
215
|
+
yoshinon&.unlock
|
193
216
|
end
|
194
217
|
end
|
195
218
|
end
|
data/lib/yuuki/periodic.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require 'yuuki/caller'
|
4
4
|
require 'yuuki/runner'
|
5
|
+
require 'yoshinon'
|
5
6
|
|
6
7
|
module Yuuki
|
7
8
|
module Runner
|
@@ -35,7 +36,7 @@ module Yuuki
|
|
35
36
|
class PeriodicCaller < Caller
|
36
37
|
attr_reader :first_run, :current_time
|
37
38
|
|
38
|
-
def initialize(*instances)
|
39
|
+
def initialize(*instances, use_yoshinon: true)
|
39
40
|
super
|
40
41
|
@first_run = true
|
41
42
|
end
|
@@ -59,18 +60,19 @@ module Yuuki
|
|
59
60
|
next true if @first_run && meta[:first_run]
|
60
61
|
next false unless meta[:periodic]
|
61
62
|
next false unless last_time
|
63
|
+
|
62
64
|
c = @current_time + gmtoff
|
63
65
|
l = last_time + gmtoff
|
64
|
-
|
66
|
+
(l.div(meta[:periodic]) + 1) * meta[:periodic] <= c
|
65
67
|
end
|
66
68
|
run_select(select_proc, **args, &block)
|
67
|
-
rescue
|
69
|
+
rescue StandardError
|
68
70
|
@on_error ? @on_error[$!] : raise
|
69
71
|
end
|
70
72
|
@first_run = false
|
71
73
|
|
72
74
|
last_time = @current_time
|
73
|
-
((@current_time + 1).floor - Time.now.to_f).tap{|e| sleep e if e > 0}
|
75
|
+
((@current_time + 1).floor - Time.now.to_f).tap {|e| sleep e if e > 0}
|
74
76
|
end
|
75
77
|
end
|
76
78
|
end
|
data/lib/yuuki/version.rb
CHANGED
data/yuuki.gemspec
CHANGED
@@ -18,12 +18,13 @@ Gem::Specification.new do |spec|
|
|
18
18
|
# Specify which files should be added to the gem when it is released.
|
19
19
|
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
20
20
|
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
21
|
-
`git ls-files -z`.split("\x0").reject{|f| f.match(%r{^(test|spec|features)/})}
|
21
|
+
`git ls-files -z`.split("\x0").reject {|f| f.match(%r{^(test|spec|features)/})}
|
22
22
|
end
|
23
23
|
spec.bindir = 'exe'
|
24
|
-
spec.executables = spec.files.grep(%r{^exe/}){|f| File.basename(f)}
|
24
|
+
spec.executables = spec.files.grep(%r{^exe/}) {|f| File.basename(f)}
|
25
25
|
spec.require_paths = ['lib']
|
26
26
|
|
27
|
+
spec.add_dependency 'yoshinon'
|
27
28
|
spec.add_development_dependency 'bundler'
|
28
29
|
spec.add_development_dependency 'pry'
|
29
30
|
spec.add_development_dependency 'rake'
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: yuuki
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ishotihadus
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-06-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: yoshinon
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: bundler
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -61,6 +75,7 @@ extra_rdoc_files: []
|
|
61
75
|
files:
|
62
76
|
- ".DS_Store"
|
63
77
|
- ".gitignore"
|
78
|
+
- ".rubocop.yml"
|
64
79
|
- Gemfile
|
65
80
|
- LICENSE.txt
|
66
81
|
- README.md
|