kungfuig 0.5.1 → 0.5.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +5 -5
- data/lib/kungfuig/aspector.rb +16 -7
- data/lib/kungfuig/color.rb +1 -1
- data/lib/kungfuig/jobber.rb +18 -2
- data/lib/kungfuig/version.rb +1 -1
- data/lib/kungfuig.rb +26 -4
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fdc42cd90b49647a952a90a49d8c29a4c952822f
|
4
|
+
data.tar.gz: c1b33a8b31c3b86dcfeef91685ced514df47e576
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5973581c6471eedd579745e5f8025f40a58b3c8ab5d558986bc04fc5a75268d97a303b5eb93c5f3463abe5fd610a2a6b81340f97cdde6894f1792d722874d49b
|
7
|
+
data.tar.gz: a5f53d80c9ca338c4e25fcb6b73b0d729994dcc72699c3377b0e564376428d4fac02a7abd7474524c964685caa1e68d90b9a0932ccdc8e779ea6d109f761373d
|
data/README.md
CHANGED
@@ -14,20 +14,20 @@ class MyApp
|
|
14
14
|
end
|
15
15
|
|
16
16
|
# Load configuration file
|
17
|
-
MyApp.
|
17
|
+
MyApp.kungfuig('config/myapp.yml')
|
18
18
|
|
19
19
|
# Append options explicitly
|
20
|
-
MyApp.
|
20
|
+
MyApp.kungfuig do |options|
|
21
21
|
options.value = 42
|
22
22
|
end
|
23
23
|
|
24
24
|
# load options from JSON file and execute block on it
|
25
|
-
MyApp.
|
25
|
+
MyApp.kungfuig('config/myapp.json') do |options|
|
26
26
|
options.other_value = options[:value]
|
27
27
|
end
|
28
28
|
|
29
29
|
# DSL (note `kungfuig` method name)
|
30
|
-
MyApp.
|
30
|
+
MyApp.kungfuigure do
|
31
31
|
set :value, 42
|
32
32
|
end
|
33
33
|
```
|
@@ -43,7 +43,7 @@ class MyApp
|
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
46
|
-
MyApp.
|
46
|
+
MyApp.kungfuigure do
|
47
47
|
aspect :report do |result|
|
48
48
|
puts "MyApp#report returned #{result}"
|
49
49
|
end
|
data/lib/kungfuig/aspector.rb
CHANGED
@@ -11,7 +11,7 @@ module Kungfuig
|
|
11
11
|
when v.include?('*'), v.include?(:'*') then klazz.instance_methods(false)
|
12
12
|
else klazz.instance_methods & v
|
13
13
|
end
|
14
|
-
end.reduce(&:-)
|
14
|
+
end.reduce(&:-) - klazz.instance_methods(false).select { |m| m.to_s.start_with?('to_') }
|
15
15
|
end
|
16
16
|
|
17
17
|
def remap_hash_for_easy_iteration hash
|
@@ -29,15 +29,22 @@ module Kungfuig
|
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
|
+
# rubocop:disable Metrics/CyclomaticComplexity
|
33
|
+
# rubocop:disable Metrics/MethodLength
|
32
34
|
def attach(to, before: nil, after: nil, exclude: nil)
|
33
|
-
klazz =
|
34
|
-
|
35
|
-
|
36
|
-
|
35
|
+
klazz = begin
|
36
|
+
case to
|
37
|
+
when Class then to # got a class! wow, somebody has the documentation read
|
38
|
+
when String then Kernel.const_get(to) # we are ready to get a class name
|
39
|
+
when Symbol then Kernel.const_get(to.to_s)
|
40
|
+
else class << to; self; end # attach to klazz’s eigenclass if object given
|
41
|
+
end
|
42
|
+
rescue => e
|
43
|
+
raise ArgumentError, "Unable to attach to #{to}. I need a valid class/method name!\nOriginal exception: #{e.message}"
|
37
44
|
end
|
38
45
|
|
39
46
|
raise ArgumentError, "Trying to attach nothing to #{klazz}##{to}. I need a block!" unless block_given?
|
40
|
-
klazz.send(:include, Kungfuig
|
47
|
+
klazz.send(:include, Kungfuig) unless klazz.ancestors.include? Kungfuig
|
41
48
|
cb = Proc.new
|
42
49
|
|
43
50
|
H.new.value_to_method_list(klazz, before, exclude).each do |m|
|
@@ -53,6 +60,8 @@ module Kungfuig
|
|
53
60
|
klazz.aspects
|
54
61
|
end
|
55
62
|
module_function :attach
|
63
|
+
# rubocop:enable Metrics/MethodLength
|
64
|
+
# rubocop:enable Metrics/CyclomaticComplexity
|
56
65
|
|
57
66
|
# 'Test':
|
58
67
|
# after:
|
@@ -70,7 +79,7 @@ module Kungfuig
|
|
70
79
|
raise ArgumentError, [
|
71
80
|
"Bad input to Kungfuig::Aspector##{__callee__}.",
|
72
81
|
"Args: #{methods.inspect}",
|
73
|
-
"Original exception:
|
82
|
+
"Original exception: #{e.message}.",
|
74
83
|
e.backtrace.unshift("Backtrace:").join("#{$/}⮩ ")
|
75
84
|
].join($/.to_s)
|
76
85
|
end
|
data/lib/kungfuig/color.rb
CHANGED
@@ -88,7 +88,7 @@ module Kungfuig
|
|
88
88
|
when Fixnum then Color.new(val, val, val) # Single value, assume grayscale
|
89
89
|
when String
|
90
90
|
str = val.to_s.upcase[/[0-9A-F]{3,8}/] || ''
|
91
|
-
Color.new(*case str.
|
91
|
+
Color.new(*case str.length
|
92
92
|
when 3, 4 then str.scan(/[0-9A-F]/)
|
93
93
|
when 6, 8 then str.scan(/[0-9A-F]{2}/)
|
94
94
|
else 'FF'
|
data/lib/kungfuig/jobber.rb
CHANGED
@@ -23,19 +23,35 @@ module Kungfuig
|
|
23
23
|
)
|
24
24
|
end
|
25
25
|
|
26
|
+
# rubocop:disable Metrics/AbcSize
|
27
|
+
# rubocop:disable Metrics/CyclomaticComplexity
|
28
|
+
# rubocop:disable Metrics/PerceivedComplexity
|
29
|
+
# rubocop:disable Metrics/MethodLength
|
26
30
|
def bottleneck(receiver, method, result, *args)
|
27
31
|
respond_to = ->(m, r) { r.respond_to? m.to_sym }
|
28
32
|
r = case receiver
|
33
|
+
when Hash, Array, String then receiver
|
29
34
|
when respond_to.curry[:to_hash] then receiver.to_hash
|
30
35
|
when respond_to.curry[:to_h] then receiver.to_h
|
31
36
|
else receiver
|
32
37
|
end
|
38
|
+
return unless (receiver_class = receiver.class.ancestors.detect do |c|
|
39
|
+
@hash[c.name] && @hash[c.name][method]
|
40
|
+
end)
|
33
41
|
|
34
|
-
Kernel.const_get(@hash[
|
35
|
-
|
42
|
+
job = Kernel.const_get(@hash[receiver_class.name][method])
|
43
|
+
if Kernel.const_defined?('Rails') && Rails.env.development?
|
44
|
+
job.new.perform(r, method, result, *args)
|
45
|
+
else
|
46
|
+
job.perform_async(r, method, result, *args)
|
47
|
+
end
|
36
48
|
rescue => e
|
37
49
|
Kungfuig.✍("Fail [#{e.message}] while #{receiver}", method, result, *args)
|
38
50
|
end
|
51
|
+
# rubocop:enable Metrics/MethodLength
|
52
|
+
# rubocop:enable Metrics/PerceivedComplexity
|
53
|
+
# rubocop:enable Metrics/CyclomaticComplexity
|
54
|
+
# rubocop:enable Metrics/AbcSize
|
39
55
|
end
|
40
56
|
end
|
41
57
|
end
|
data/lib/kungfuig/version.rb
CHANGED
data/lib/kungfuig.rb
CHANGED
@@ -7,6 +7,8 @@ require 'kungfuig/aspector'
|
|
7
7
|
|
8
8
|
module Kungfuig
|
9
9
|
ASPECT_PREFIX = '♻_'.freeze
|
10
|
+
ASPECT_TEMPLATE = -> { %i(after before).map { |k| [k, []] }.to_h }
|
11
|
+
|
10
12
|
MX = Mutex.new
|
11
13
|
|
12
14
|
# rubocop:disable Style/VariableName
|
@@ -52,7 +54,7 @@ module Kungfuig
|
|
52
54
|
# Configures everything by hash or yaml from string or file. Whether code block
|
53
55
|
# is passed, it is processed with @options instance.
|
54
56
|
# @param hos [String|Hash|Hashie::Mash] the input data to merge into options
|
55
|
-
def
|
57
|
+
def kungfuig hos = nil
|
56
58
|
MX.synchronize {
|
57
59
|
merge_hash_or_string! hos
|
58
60
|
yield options if block_given?
|
@@ -113,6 +115,22 @@ module Kungfuig
|
|
113
115
|
options.deep_merge! Kungfuig.load_stuff hos
|
114
116
|
end
|
115
117
|
private :merge_hash_or_string!
|
118
|
+
|
119
|
+
def lookup_aspects meth
|
120
|
+
meth = meth.to_sym
|
121
|
+
eigenclass = class << self; self; end
|
122
|
+
return eigenclass.aspects(meth) if eigenclass.respond_to?(:aspects?) && eigenclass.aspects?
|
123
|
+
aspected = self.class.ancestors.detect do |c|
|
124
|
+
c.respond_to?(:aspects?) && c.aspects?
|
125
|
+
end
|
126
|
+
|
127
|
+
aspected ? aspected.aspects(meth) : Kungfuig::ASPECT_TEMPLATE.call
|
128
|
+
|
129
|
+
# self.class.ancestors.inject(initial) do |memo, c|
|
130
|
+
# c.respond_to?(:aspects?) && c.aspects? ? c.aspects(meth).merge(memo) { |_, c1, c2| c1 | c2 } : memo
|
131
|
+
# end
|
132
|
+
end
|
133
|
+
private :lookup_aspects
|
116
134
|
end
|
117
135
|
|
118
136
|
def self.included base
|
@@ -133,7 +151,7 @@ module Kungfuig
|
|
133
151
|
|
134
152
|
# A wrapper for the configuration block
|
135
153
|
# @param block the block to be executed in the context of this module
|
136
|
-
def
|
154
|
+
def kungfuigure &block
|
137
155
|
instance_eval(&block)
|
138
156
|
end
|
139
157
|
|
@@ -148,7 +166,7 @@ module Kungfuig
|
|
148
166
|
class_eval <<-CODE
|
149
167
|
alias_method :'#{ASPECT_PREFIX}#{meth}', :'#{meth}'
|
150
168
|
def #{meth}(*args, &cb)
|
151
|
-
ps =
|
169
|
+
ps = lookup_aspects(:'#{meth}')
|
152
170
|
ps[:before].each do |p|
|
153
171
|
p.call(self, :'#{meth}', nil, *args) # FIXME: allow argument modification!!!
|
154
172
|
end
|
@@ -165,9 +183,13 @@ module Kungfuig
|
|
165
183
|
end
|
166
184
|
# rubocop:enable Metrics/MethodLength
|
167
185
|
|
186
|
+
def aspects?
|
187
|
+
@aspects.is_a?(Hash)
|
188
|
+
end
|
189
|
+
|
168
190
|
def aspects meth = nil
|
169
191
|
@aspects ||= {}
|
170
|
-
meth ? @aspects[meth.to_sym] ||=
|
192
|
+
meth ? @aspects[meth.to_sym] ||= Kungfuig::ASPECT_TEMPLATE.call : @aspects
|
171
193
|
end
|
172
194
|
alias_method :set, :option!
|
173
195
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kungfuig
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kantox LTD
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-03-
|
11
|
+
date: 2016-03-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: hashie
|