kungfuig 0.10.0 → 0.11.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
  SHA1:
3
- metadata.gz: c46ca10e03faa3bb4f6d9eeb8216011c5dbb10f8
4
- data.tar.gz: b6c314ca7222809ffdc2693c6d497f81c93a0948
3
+ metadata.gz: bc4658d114e15ae6587f426fd6484f73ac507d49
4
+ data.tar.gz: fd0ba43d7d5f10f1d148c32fccb8b22d15bf1269
5
5
  SHA512:
6
- metadata.gz: c57384f359cf7f73a3acf92a5aa2914619e0d126c2fcbd62049e4bb5f26da953ade875cdc1a801b91df012a9f25dd6ba9b8c40e779888a28b3ab4416f61cfbe4
7
- data.tar.gz: 8ffb336572f9d1a222c4e416046b14d9a505f61ce14f7f1509cb4e7dcbc2fc8246355261b4a4ea687ad40750e1446ff6e8ca01f0ef5f6f30a81b23243564e95e
6
+ metadata.gz: 088b8cc7fa2c5dde35d5133eb24eedeac49667c072246492e6924dd84b2995ee3e07ea9ea601122fc918f35a5fbfb68129b7f74b1da2c6956a4a30de3bf724c0
7
+ data.tar.gz: 5425c1425ed7ed78e3aecfadebe29410049798f14129b1797a9961cc4d4c38d1d34d4699c3ca9eef723ad7d3d650ebd77460271a272569d9324080d43b4e4331
@@ -2,7 +2,6 @@ require 'yaml'
2
2
  require 'hashie'
3
3
 
4
4
  require 'kungfuig/version'
5
- require 'kungfuig/color'
6
5
  require 'kungfuig/aspector'
7
6
  require 'kungfuig/prepender'
8
7
 
@@ -12,11 +11,7 @@ module Kungfuig
12
11
  # rubocop:disable Style/MethodName
13
12
  def ✍(receiver: nil, method: nil, result: nil, args: nil, **params)
14
13
  require 'logger'
15
- @✍ ||= Kernel.const_defined?('Rails') && Rails.logger || Logger.new($stdout)
16
- message = receiver.is_a?(String) ? "#{receiver} | #{method}" : "#{receiver.class}##{method}"
17
- "#{Color.to_xterm256(message, :info)} called with «#{Color.to_xterm256(args.inspect, :success)}» and returned «#{result || 'nothing (was it before aspect?)'}»".tap do |m|
18
- @✍.debug m
19
- end
14
+ Logger.new($stdout).debug({receiver: receiver, method: method, result: result, args: args, **params}.inspect)
20
15
  end
21
16
  module_function :✍
22
17
  # rubocop:enable Style/MethodName
@@ -35,6 +30,7 @@ module Kungfuig
35
30
  rescue
36
31
  raise ArgumentError, "#{__callee__} expects valid YAML configuration string (misspelled file name?). Got:\n#{hos.inspect}"
37
32
  end
33
+ when ->(h) { h.respond_to?(:to_h) } then Hashie::Mash.new(h.to_h)
38
34
  when ->(h) { h.respond_to?(:to_hash) } then Hashie::Mash.new(h.to_hash)
39
35
  else
40
36
  fail ArgumentError.new "#{__callee__} accepts either String or Hash as parameter."
@@ -32,10 +32,23 @@ module Kungfuig
32
32
  class Jobber
33
33
  RESPOND_TO = ->(m, r) { r.respond_to? m.to_sym }
34
34
 
35
+ # this is an ugly hack unless I understand why digest gets corrupted sometimes
36
+ class UglyHack
37
+ def self.cleanup_digest(digest)
38
+ case digest
39
+ when String then digest
40
+ when Symbol then digest.to_s
41
+ when Hash then digest[:digest] || digest['digest'] || digest.inspect
42
+ else digest.inspect
43
+ end
44
+ end
45
+ end
46
+
35
47
  class Dummy
36
48
  prepend Kungfuig::Worker
37
49
 
38
50
  def perform digest: nil, delay: nil, worker: nil, worker_params: nil
51
+ digest = UglyHack.cleanup_digest(digest)
39
52
  Sidekiq.redis { |redis| redis.set(digest, worker_params.to_json) }
40
53
  DummyExecutor.perform_in(delay, digest: digest, worker: worker)
41
54
  end
@@ -45,13 +58,14 @@ module Kungfuig
45
58
  prepend Kungfuig::Worker
46
59
 
47
60
  def perform digest: nil, worker: nil
61
+ digest = UglyHack.cleanup_digest(digest)
48
62
  params = Sidekiq.redis do |redis|
49
63
  redis.multi do
50
64
  redis.get(digest)
51
65
  redis.del(digest)
52
66
  end
53
67
  end
54
- Kernel.const_get(worker).perform_async(atomize_keys(params.first)) if params.last > 0
68
+ Kernel.const_get(worker).perform_async(**atomize_keys(params.first)) if params.last > 0
55
69
  end
56
70
 
57
71
  private
@@ -1,3 +1,3 @@
1
1
  module Kungfuig
2
- VERSION = '0.10.0'.freeze
2
+ VERSION = '0.11.0'.freeze
3
3
  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.10.0
4
+ version: 0.11.0
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-10-21 00:00:00.000000000 Z
11
+ date: 2016-10-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: hashie
@@ -209,7 +209,6 @@ files:
209
209
  - kungfuig.png
210
210
  - lib/kungfuig.rb
211
211
  - lib/kungfuig/aspector.rb
212
- - lib/kungfuig/color.rb
213
212
  - lib/kungfuig/jobber.rb
214
213
  - lib/kungfuig/prepender.rb
215
214
  - lib/kungfuig/version.rb
@@ -1,286 +0,0 @@
1
- module Kungfuig
2
- # rubocop:disable Metrics/ClassLength
3
- # Dealing with colors
4
- class Color
5
- # Copyright (c) 2007 McClain Looney
6
- #
7
- # Permission is hereby granted, free of charge, to any person obtaining a copy
8
- # of this software and associated documentation files (the "Software"), to deal
9
- # in the Software without restriction, including without limitation the rights
10
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
- # copies of the Software, and to permit persons to whom the Software is
12
- # furnished to do so, subject to the following conditions:
13
- #
14
- # The above copyright notice and this permission notice shall be included in
15
- # all copies or substantial portions of the Software.
16
- #
17
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23
- # THE SOFTWARE.
24
-
25
- # Implements a color (r,g,b + a) with conversion to/from web format (eg #aabbcc), and
26
- # with a number of utilities to lighten, darken and blend values.
27
-
28
- attr_reader :r, :g, :b, :a
29
-
30
- # Table for conversion to hex
31
- HEXVAL = ('0'..'9').to_a.concat(('A'..'F').to_a).freeze
32
- # Default value for #darken, #lighten etc.
33
- BRIGHTNESS_DEFAULT = 0.2
34
-
35
- # Constructor. Inits to white (#FFFFFF) by default, or accepts any params
36
- # supported by #parse.
37
- def initialize(*args)
38
- @r = 255
39
- @g = 255
40
- @b = 255
41
- @a = 255
42
-
43
- if args.size.between?(3, 4)
44
- self.r = args[0]
45
- self.g = args[1]
46
- self.b = args[2]
47
- self.a = args[3] if args[3]
48
- else
49
- set(*args)
50
- end
51
- end
52
-
53
- # All-purpose setter - pass in another Color, '#000000', rgb vals... whatever
54
- def set(*args)
55
- val = Color.parse(*args)
56
- unless val.nil?
57
- self.r = val.r
58
- self.g = val.g
59
- self.b = val.b
60
- self.a = val.a
61
- end
62
- self
63
- end
64
-
65
- # Test for equality, accepts string vals as well, eg Color.new('aaa') == '#AAAAAA' => true
66
- def ==(other)
67
- val = Color.parse(other)
68
- return false if val.nil?
69
- r == val.r && g == val.g && b == val.b && a == val.a
70
- end
71
-
72
- # Setters for individual channels - take 0-255 or '00'-'FF' values
73
- %i(r g b a).each do |m|
74
- define_method "#{m}=" do |val|
75
- instance_variable_set("@#{m}", from_hex(val))
76
- end
77
- end
78
-
79
- # rubocop:disable Metrics/CyclomaticComplexity
80
- # rubocop:disable Metrics/MethodLength
81
- # Attempt to read in a string and parse it into values
82
- def self.parse(*args)
83
- case args.size
84
- when 0 then return nil
85
- when 1
86
- case val = args.first
87
- when Color then val
88
- when Fixnum then Color.new(val, val, val) # Single value, assume grayscale
89
- when String
90
- str = val.to_s.upcase[/[0-9A-F]{3,8}/] || ''
91
- Color.new(*case str.length
92
- when 3, 4 then str.scan(/[0-9A-F]/)
93
- when 6, 8 then str.scan(/[0-9A-F]{2}/)
94
- else 'FF'
95
- end.map { |c| Integer("0x#{c}") })
96
- end
97
- when 2 # assume gray + alpha
98
- val, alpha = args
99
- Color.new(val, val, val, alpha)
100
- when 3, 4 then Color.new(*args)
101
- end
102
- end
103
- # rubocop:enable Metrics/MethodLength
104
- # rubocop:enable Metrics/CyclomaticComplexity
105
-
106
- def inspect
107
- id = format('%x', object_id << 1)
108
- "#<#{self.class.name}:0x#{id.rjust(14, '0')} 💻=“\\e[#{to_esc(true)}#{to_esc(false)}\e[0mm” 🗔=“#{self}”>"
109
- end
110
-
111
- def to_s(add_hash = true)
112
- trans? ? to_rgba(add_hash) : to_rgb(add_hash)
113
- end
114
-
115
- # rubocop:disable Metrics/CyclomaticComplexity
116
- # rubocop:disable Metrics/PerceivedComplexity
117
- # rubocop:disable Metrics/ParameterLists
118
- # Color as used in 256-color terminal escape sequences
119
- def to_esc(surround = true, bold: true, italic: false, underline: false, reverse: false, foreground: true)
120
- result = if grayscale?
121
- (r > 239) ? 15 : (r / 10).floor + 232
122
- else
123
- 16 + 36 * (r / 51).floor + 6 * (g / 51).floor + (b / 51).floor
124
- end
125
-
126
- esc = [
127
- bold ? '01' : nil,
128
- italic ? '03' : nil,
129
- underline ? '04' : nil,
130
- reverse ? '07' : nil,
131
- foreground ? '38' : '48',
132
- '05',
133
- result
134
- ].compact.join(';')
135
-
136
- surround ? "\e[#{esc}m" : esc
137
- end
138
- # rubocop:enable Metrics/ParameterLists
139
- # rubocop:enable Metrics/PerceivedComplexity
140
- # rubocop:enable Metrics/CyclomaticComplexity
141
-
142
- def to_rgb(add_hash = true)
143
- (add_hash ? '#' : '') + to_hex(r) + to_hex(g) + to_hex(b)
144
- end
145
-
146
- def to_rgba(add_hash = true)
147
- to_rgb(add_hash) + to_hex(a)
148
- end
149
-
150
- def opaque?
151
- @a == 255
152
- end
153
-
154
- def trans?
155
- !opaque?
156
- end
157
-
158
- def grayscale?
159
- @r == @g && @g == @b
160
- end
161
-
162
- # Lighten color towards white. 0.0 is a no-op, 1.0 will return #FFFFFF
163
- def lighten(amt = BRIGHTNESS_DEFAULT)
164
- return self if amt <= 0
165
- return WHITE if amt >= 1.0
166
- Color.new(self).tap do |val|
167
- val.r += ((255 - val.r) * amt).to_i
168
- val.g += ((255 - val.g) * amt).to_i
169
- val.b += ((255 - val.b) * amt).to_i
170
- end
171
- end
172
-
173
- # In place version of #lighten
174
- def lighten!(amt = BRIGHTNESS_DEFAULT)
175
- set(lighten(amt))
176
- end
177
-
178
- # Darken a color towards full black. 0.0 is a no-op, 1.0 will return #000000
179
- def darken(amt = BRIGHTNESS_DEFAULT)
180
- return self if amt <= 0
181
- return BLACK if amt >= 1.0
182
- Color.new(self).tap do |val|
183
- val.r -= (val.r * amt).to_i
184
- val.g -= (val.g * amt).to_i
185
- val.b -= (val.b * amt).to_i
186
- end
187
- end
188
-
189
- # In place version of #darken
190
- def darken!(amt = BRIGHTNESS_DEFAULT)
191
- set(darken(amt))
192
- end
193
-
194
- # Convert to grayscale, using perception-based weighting
195
- def grayscale
196
- Color.new(self).tap do |val|
197
- val.r = val.g = val.b = (0.2126 * val.r + 0.7152 * val.g + 0.0722 * val.b)
198
- end
199
- end
200
-
201
- # In place version of #grayscale
202
- def grayscale!
203
- set(grayscale)
204
- end
205
-
206
- # rubocop:disable Metrics/AbcSize
207
- # Blend to a color amt % towards another color value, eg
208
- # red.blend(blue, 0.5) will be purple, white.blend(black, 0.5) will be gray, etc.
209
- def blend(other, amt)
210
- other = Color.parse(other)
211
- return Color.new(self) if amt <= 0 || other.nil?
212
- return Color.new(other) if amt >= 1.0
213
- Color.new(self).tap do |val|
214
- val.r += ((other.r - val.r) * amt).to_i
215
- val.g += ((other.g - val.g) * amt).to_i
216
- val.b += ((other.b - val.b) * amt).to_i
217
- end
218
- end
219
- # rubocop:enable Metrics/AbcSize
220
-
221
- # In place version of #blend
222
- def blend!(other, amt)
223
- set(blend(other, amt))
224
- self
225
- end
226
-
227
- # Class-level version for explicit blends of two values, useful with constants
228
- def self.blend(col1, col2, amt)
229
- col1, col2 = [col1, col2].map { |c| Color.parse c }
230
- col1.blend(col2, amt)
231
- end
232
-
233
- # rubocop:disable Metrics/ParameterLists
234
- def self.to_xterm256(text, color, bold: true, italic: false, underline: false, reverse: false, foreground: true)
235
- color = Color.preset(color) unless color.is_a?(Color)
236
- [
237
- color.to_esc(true, bold: bold, italic: italic, underline: underline, reverse: reverse, foreground: foreground),
238
- text,
239
- "\e[0m"
240
- ].join
241
- end
242
- # rubocop:enable Metrics/ParameterLists
243
-
244
- # rubocop:disable Metrics/CyclomaticComplexity
245
- def self.preset type
246
- Color.parse case type
247
- when :label then '#999999'
248
- when :success then '#468847'
249
- when :warning then '#F89406'
250
- when :important then '#B94A48'
251
- when :fatal then '#B94A48'
252
- when :error then '#FF0000'
253
- when :info then '#3A87AD'
254
- when :inverse then '#333333'
255
- else type
256
- end
257
- end
258
- # rubocop:enable Metrics/CyclomaticComplexity
259
-
260
- protected
261
-
262
- # Convert int to string hex, eg 255 => 'FF'
263
- def to_hex(val)
264
- HEXVAL[val / 16] + HEXVAL[val % 16]
265
- end
266
-
267
- # Convert int or string to int, eg 80 => 80, 'FF' => 255, '7' => 119
268
- def from_hex(val)
269
- if val.is_a?(String)
270
- # Double up if single char form
271
- val *= 2 if val.size == 1
272
- # Convert to integer
273
- val = val.hex
274
- end
275
- # Clamp
276
- val = 0 if val < 0
277
- val = 255 if val > 255
278
- val
279
- end
280
-
281
- # Some constants for general use
282
- WHITE = Color.new(255, 255, 255).freeze
283
- BLACK = Color.new(0, 0, 0).freeze
284
- end
285
- # rubocop:enable Metrics/ClassLength
286
- end