kungfuig 0.5.8 → 0.6.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: 70ebdf0a5662d38602eac378b7ec01ec641f00b3
4
- data.tar.gz: d4a756c9db21daa1548f3e41e04089d5c622527c
3
+ metadata.gz: 9d7f9a97f500edb6d6bf35a4cb678989571aac2a
4
+ data.tar.gz: 7b15f8867b76dd007cfda00c17275bb4a1d45057
5
5
  SHA512:
6
- metadata.gz: 9997c1a39cdedef891fa5e02e50b496daa4ee87179294819818bcca442312d55d4cfe42e44f80c8152040f1644d401f0853ef16db7e09893834020581fc49810
7
- data.tar.gz: 70bbeda0218ca5edaa9a2bbc88ffaba37522fa222dba3b4eed936a4426bd52dc50eeecd7c6fc323a6037306bf02e628f3fb289b9cf4c9daca5bdf6fa33229f0f
6
+ metadata.gz: 1b7646e393a547a7916291e4fd3e2a4d22fd6d1807cb6f5c67a9b3d2bdaccbcc817ed661aed83a2ccf7cee08b46ec09b3689d4317662755defacb8489ceb2a89
7
+ data.tar.gz: 2907858a439b6818f99b5fb783d3603bb2fe7ebd9bf0dd2c1637de93cc2a07cb23e4e9b53319ba89415e89efed67de8b16ad5ec0906c0e633607584a6006cdfc
data/.rubocop.yml CHANGED
@@ -10,6 +10,11 @@ Style/AsciiComments:
10
10
  - 'lib/**/*'
11
11
  - 'spec/**/*'
12
12
 
13
+ Style/Documentation:
14
+ Exclude:
15
+ - 'lib/**/*'
16
+ - 'spec/**/*'
17
+
13
18
  Style/RaiseArgs:
14
19
  Exclude:
15
20
  - 'lib/**/*'
@@ -18,3 +23,8 @@ Style/SpecialGlobalVars:
18
23
  Exclude:
19
24
  - 'lib/**/*'
20
25
  - 'spec/**/*'
26
+
27
+ Style/MultilineBlockChain:
28
+ Exclude:
29
+ - 'lib/**/*'
30
+ - 'spec/**/*'
data/.rubocop_todo.yml CHANGED
@@ -1,6 +1,6 @@
1
1
  # This configuration was generated by
2
2
  # `rubocop --auto-gen-config`
3
- # on 2016-03-21 14:26:06 +0100 using RuboCop version 0.37.2.
3
+ # on 2016-04-22 13:12:24 +0200 using RuboCop version 0.39.0.
4
4
  # The point is for the user to remove these configuration records
5
5
  # one by one as the offenses are removed from the code base.
6
6
  # Note that changes in the inspected code, or installation of new
@@ -13,37 +13,37 @@ Lint/UnusedBlockArgument:
13
13
  Exclude:
14
14
  - 'features/step_definitions/kungfuig_steps.rb'
15
15
 
16
- # Offense count: 2
17
- Lint/UselessAssignment:
18
- Exclude:
19
- - 'lib/kungfuig.rb'
20
-
21
- # Offense count: 2
16
+ # Offense count: 10
22
17
  Metrics/AbcSize:
23
- Max: 26
18
+ Max: 41
24
19
 
25
- # Offense count: 1
20
+ # Offense count: 4
26
21
  Metrics/CyclomaticComplexity:
27
- Max: 7
22
+ Max: 12
28
23
 
29
- # Offense count: 13
24
+ # Offense count: 77
30
25
  # Configuration parameters: AllowHeredoc, AllowURI, URISchemes.
31
26
  # URISchemes: http, https
32
27
  Metrics/LineLength:
33
- Max: 180
28
+ Max: 174
34
29
 
35
- # Offense count: 2
30
+ # Offense count: 6
36
31
  # Configuration parameters: CountComments.
37
32
  Metrics/MethodLength:
38
- Max: 16
33
+ Max: 24
39
34
 
40
- # Offense count: 1
35
+ # Offense count: 2
36
+ Metrics/PerceivedComplexity:
37
+ Max: 8
38
+
39
+ # Offense count: 3
41
40
  # Cop supports --auto-correct.
42
41
  # Configuration parameters: EnforcedStyle, SupportedStyles.
43
42
  # SupportedStyles: prefer_alias, prefer_alias_method
44
43
  Style/Alias:
45
44
  Exclude:
46
45
  - 'lib/kungfuig.rb'
46
+ - 'lib/kungfuig/prepender.rb'
47
47
 
48
48
  # Offense count: 4
49
49
  # Cop supports --auto-correct.
@@ -65,22 +65,7 @@ Style/BracesAroundHashParameters:
65
65
  Exclude:
66
66
  - 'features/step_definitions/kungfuig_steps.rb'
67
67
 
68
- # Offense count: 3
69
- Style/Documentation:
70
- Exclude:
71
- - 'spec/**/*'
72
- - 'test/**/*'
73
- - 'lib/kungfuig.rb'
74
-
75
- # Offense count: 1
76
- # Cop supports --auto-correct.
77
- # Configuration parameters: EnforcedStyle, SupportedStyles.
78
- # SupportedStyles: empty_lines, no_empty_lines
79
- Style/EmptyLinesAroundBlockBody:
80
- Exclude:
81
- - 'lib/kungfuig.rb'
82
-
83
- # Offense count: 10
68
+ # Offense count: 21
84
69
  # Cop supports --auto-correct.
85
70
  # Configuration parameters: EnforcedStyle, SupportedStyles.
86
71
  # SupportedStyles: require_parentheses, require_no_parentheses, require_no_parentheses_except_multiline
@@ -98,12 +83,6 @@ Style/MutableConstant:
98
83
  Exclude:
99
84
  - 'lib/kungfuig/version.rb'
100
85
 
101
- # Offense count: 6
102
- # Configuration parameters: SupportedStyles.
103
- # SupportedStyles: compact, exploded
104
- Style/RaiseArgs:
105
- EnforcedStyle: compact
106
-
107
86
  # Offense count: 6
108
87
  # Cop supports --auto-correct.
109
88
  # Configuration parameters: EnforcedStyle, SupportedStyles.
@@ -119,16 +98,28 @@ Style/SpaceAroundOperators:
119
98
  Exclude:
120
99
  - 'features/support/env.rb'
121
100
 
122
- # Offense count: 2
101
+ # Offense count: 4
102
+ # Cop supports --auto-correct.
103
+ Style/SpaceBeforeSemicolon:
104
+ Exclude:
105
+ - 'lib/kungfuig/prepender.rb'
106
+
107
+ # Offense count: 20
123
108
  # Cop supports --auto-correct.
124
109
  # Configuration parameters: EnforcedStyle, EnforcedStyleForEmptyBraces, SupportedStyles.
125
110
  # SupportedStyles: space, no_space
126
111
  Style/SpaceInsideHashLiteralBraces:
127
112
  Enabled: false
128
113
 
129
- # Offense count: 3
114
+ # Offense count: 12
130
115
  # Cop supports --auto-correct.
131
116
  # Configuration parameters: EnforcedStyle, SupportedStyles, ConsistentQuotesInMultiline.
132
117
  # SupportedStyles: single_quotes, double_quotes
133
118
  Style/StringLiterals:
134
119
  Enabled: false
120
+
121
+ # Offense count: 2
122
+ # Configuration parameters: EnforcedStyle, SupportedStyles.
123
+ # SupportedStyles: snake_case, camelCase
124
+ Style/VariableName:
125
+ Enabled: false
data/kungfuig.gemspec CHANGED
@@ -28,9 +28,9 @@ Gem::Specification.new do |spec|
28
28
  spec.add_development_dependency 'rake', '~> 10.0'
29
29
  spec.add_development_dependency 'pry', '~> 0.10'
30
30
 
31
- spec.add_development_dependency 'rspec', '~> 2.12'
31
+ spec.add_development_dependency 'rspec', '~> 3'
32
32
  spec.add_development_dependency 'cucumber', '~> 1.3'
33
33
  spec.add_development_dependency 'yard', '~> 0'
34
34
 
35
- spec.add_development_dependency 'rspec-sidekiq', '~> 1'
35
+ spec.add_development_dependency 'rspec-sidekiq', '~> 2'
36
36
  end
@@ -4,14 +4,22 @@ module Kungfuig
4
4
  # Helper methods
5
5
  class H
6
6
  def value_to_method_list klazz, values_inc, values_exc
7
- [values_inc, values_exc].map do |v|
8
- v = [*v].map(&:to_sym)
9
- case
10
- when v.empty? then []
11
- when v.include?('*'), v.include?(:'*') then klazz.instance_methods(false)
12
- else klazz.instance_methods & v
13
- end
14
- end.reduce(&:-) - klazz.instance_methods(false).select { |m| m.to_s.start_with?('to_') }
7
+ # FIXME MOVE JOKER HANDLING INTO PREPENDER !!!!
8
+ if klazz.is_a?(Module)
9
+ [values_inc, values_exc].map do |v|
10
+ v = [*v].map(&:to_sym)
11
+ case
12
+ when v.empty? then []
13
+ when v.include?('*'), v.include?(:'*') then klazz.instance_methods(false)
14
+ else klazz.instance_methods & v
15
+ end
16
+ end.reduce(&:-) - klazz.instance_methods(false).select { |m| m.to_s.start_with?('to_') }
17
+ else
18
+ # NOT YET IMPLEMENTED FIXME MOVE TO PREPENDER
19
+ [values_inc, values_exc].map do |v|
20
+ [*v].map(&:to_sym)
21
+ end.reduce(&:-)
22
+ end
15
23
  end
16
24
 
17
25
  def remap_hash_for_easy_iteration hash
@@ -27,41 +35,34 @@ module Kungfuig
27
35
  m, k = string.split('#').reverse
28
36
  (k ? Kernel.const_get(k).method(m) : method(m)).to_proc
29
37
  end
38
+
39
+ def try_to_class name
40
+ Kernel.const_defined?(name.to_s) ? Kernel.const_get(name.to_s) : name
41
+ end
30
42
  end
31
43
 
32
- # rubocop:disable Metrics/CyclomaticComplexity
33
- # rubocop:disable Metrics/MethodLength
34
44
  def attach(to, before: nil, after: nil, exclude: nil)
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}"
44
- end
45
-
46
45
  raise ArgumentError, "Trying to attach nothing to #{klazz}##{to}. I need a block!" unless block_given?
47
- klazz.send(:include, Kungfuig) unless klazz.ancestors.include? Kungfuig
46
+
48
47
  cb = Proc.new
49
48
 
49
+ klazz = case to
50
+ when Module then to # got a class! wow, somebody has the documentation read
51
+ when String, Symbol then H.new.try_to_class(to) # we are ready to get a class name
52
+ else class << to; self; end # attach to klazz’s eigenclass if object given
53
+ end
54
+
50
55
  H.new.value_to_method_list(klazz, before, exclude).each do |m|
51
- # FIXME: log methods that failed to be wrapped more accurately? # Kungfuig.✍(klazz, m, e.inspect)
52
- klazz.aspect(m, false, &cb)
56
+ Kungfuig::Prepender.new(to, m).before(&cb)
53
57
  end unless before.nil?
54
58
 
55
59
  H.new.value_to_method_list(klazz, after, exclude).each do |m|
56
- # FIXME: log methods that failed to be wrapped more accurately? # Kungfuig.✍(klazz, m, e.inspect)
57
- klazz.aspect(m, true, &cb)
60
+ Kungfuig::Prepender.new(to, m).after(&cb)
58
61
  end unless after.nil?
59
62
 
60
63
  klazz.aspects
61
64
  end
62
65
  module_function :attach
63
- # rubocop:enable Metrics/MethodLength
64
- # rubocop:enable Metrics/CyclomaticComplexity
65
66
 
66
67
  # 'Test':
67
68
  # after:
@@ -23,9 +23,7 @@ module Kungfuig
23
23
  )
24
24
  end
25
25
 
26
- # rubocop:disable Metrics/AbcSize
27
- # rubocop:disable Metrics/MethodLength
28
- def bottleneck(receiver, method, result, *args)
26
+ def bottleneck(method:nil, receiver:nil, result:nil, args:nil, **_)
29
27
  respond_to = ->(m, r) { r.respond_to? m.to_sym }
30
28
  r = case receiver
31
29
  when Hash, Array, String then receiver
@@ -39,14 +37,12 @@ module Kungfuig
39
37
 
40
38
  Kernel.const_get(@hash[receiver_class.name][method]).perform_async(r, method, result, *args)
41
39
  rescue => e
42
- Kungfuig.✍([
40
+ Kungfuig.✍(receiver: [
43
41
  "Fail [#{e.message}]",
44
42
  *e.backtrace.unshift("Backtrace:").join("#{$/}⮩ "),
45
43
  "while #{receiver}"
46
- ].join($/), method, result, *args)
44
+ ].join($/), method: method, result: result, args: args)
47
45
  end
48
- # rubocop:enable Metrics/MethodLength
49
- # rubocop:enable Metrics/AbcSize
50
46
  end
51
47
  end
52
48
  end
@@ -0,0 +1,156 @@
1
+ module Kungfuig
2
+ module I★I
3
+ end
4
+
5
+ LAMBDA = lambda do |λ, e, **hash|
6
+ begin
7
+ Kungfuig::Prepender.error! e, **hash
8
+ λ[:on_error].call(e, **hash) if λ[:on_error]
9
+ rescue => e
10
+ Kungfuig::Prepender.error! e, reason: :on_error
11
+ end
12
+ end
13
+
14
+ class Prepender
15
+ class MalformedTarget < StandardError
16
+ def initialize msg, args
17
+ super "#{msg}. Target arguments: [#{args.inspect}]."
18
+ end
19
+ end
20
+
21
+ AGRESSIVE_ERRORS = true
22
+
23
+ class << self
24
+ def errors
25
+ @errors ||= []
26
+ end
27
+
28
+ def error! e, **hash
29
+ errors << [e, hash]
30
+ end
31
+
32
+ def anteponer *args
33
+ raise MalformedTarget.new "Factory requires a block; use Prepender#new for more accurate tuning", args unless block_given?
34
+ Prepender.new(*args, &Proc.new)
35
+ end
36
+ end
37
+
38
+ attr_reader :method, :receiver, :options, :λ
39
+
40
+ # Parameters might be:
41
+ # • 1
42
+ # — method instance
43
+ # — string in form "Class#method"
44
+ # • 2
45
+ # — class (String, Symbol or Class), method name (String, Symbol)
46
+ # — instance (Object), method name (String, Symbol)
47
+ def initialize *args, **params
48
+ @λ = { before: nil, after: nil, on_hook: nil }
49
+ @klazz, @method, @receiver = case args.size
50
+ when 1
51
+ case args.first
52
+ when Method then [(class << args.first.receiver ; self ; end), args.first.name, args.first.receiver]
53
+ when UnboundMethod then [args.first.owner, args.first.name]
54
+ when String
55
+ k, m = args.first.split('#')
56
+ [k, m && m.to_sym]
57
+ end
58
+ when 2
59
+ case args.first
60
+ when Module, String then [args.first, args.last.to_sym]
61
+ when Symbol then [args.first.to_s.split('_').map(&:capitalize).join, args.last.to_sym]
62
+ else
63
+ [(class << args.first ; self ; end), args.last.to_sym, args.first]
64
+ end
65
+ end
66
+
67
+ @options = params
68
+ after(Proc.new) if block_given? # assign the block to after by default
69
+
70
+ raise MalformedTarget.new "Unable to lookup class", args unless @klazz
71
+ raise MalformedTarget.new "Unable to lookup method", args unless @method
72
+
73
+ postpone_hook
74
+ end
75
+
76
+ def before λ = nil
77
+ @λ[__callee__] = λ || (block_given? ? Proc.new : nil)
78
+ self
79
+ end
80
+ alias_method :after, :before
81
+ alias_method :on_hook, :before
82
+ alias_method :on_error, :before
83
+
84
+ protected
85
+
86
+ def klazz
87
+ return @klazz if @klazz.is_a?(Module)
88
+ @klazz = Kernel.const_get(@klazz) if Kernel.const_defined?(@klazz)
89
+ @klazz
90
+ end
91
+
92
+ def ready?
93
+ @receiver && @receiver.respond_to?(@method) ||
94
+ klazz.is_a?(Module) && klazz.instance_methods.include?(@method)
95
+ end
96
+
97
+ def to_hash
98
+ {
99
+ klazz: klazz,
100
+ method: @method,
101
+ lambdas: @λ
102
+ }
103
+ end
104
+
105
+ def hook
106
+ status = {}
107
+
108
+ λ = (hash = to_hash).delete(:lambdas)
109
+
110
+ p = Module.new do
111
+ include Kungfuig::I★I
112
+ define_method(hash[:method]) do |*args, **params, &cb|
113
+ before_params = hash.merge(receiver: self, args: args, params: params, cb: cb)
114
+ begin
115
+ λ[:before].call(**before_params) if λ[:before]
116
+ rescue => e
117
+ status[:before] = e
118
+ LAMBDA.call λ, e, **hash
119
+ end
120
+
121
+ super(*args, **params, &cb).tap do |result|
122
+ begin
123
+ λ[:after].call(**before_params.merge(result: result)) if λ[:after]
124
+ rescue => e
125
+ status[:after] = e
126
+ LAMBDA.call λ, e, **hash
127
+ end
128
+ end
129
+ end
130
+ end
131
+ klazz.send(:include, Kungfuig) unless klazz.ancestors.include? Kungfuig
132
+ klazz.send(:prepend, p)
133
+
134
+ rescue => e
135
+ status[:rescued] = e
136
+ raise MalformedTarget.new e.message, "#{@klazz}##{@method}" if AGRESSIVE_ERRORS
137
+ ensure
138
+ begin
139
+ λ[:on_hook].call(status) if λ[:on_hook]
140
+ rescue => e
141
+ LAMBDA.call λ, e, reason: :on_hook
142
+ end
143
+ end
144
+
145
+ def postpone_hook
146
+ return hook if ready?
147
+
148
+ TracePoint.new(:end) do |tp|
149
+ if tp.self.name == @klazz && ready?
150
+ hook
151
+ tp.disable
152
+ end
153
+ end.enable
154
+ end
155
+ end
156
+ end
@@ -1,3 +1,3 @@
1
1
  module Kungfuig
2
- VERSION = "0.5.8"
2
+ VERSION = "0.6.0"
3
3
  end
data/lib/kungfuig.rb CHANGED
@@ -4,16 +4,13 @@ require 'hashie'
4
4
  require 'kungfuig/version'
5
5
  require 'kungfuig/color'
6
6
  require 'kungfuig/aspector'
7
+ require 'kungfuig/prepender'
7
8
 
8
9
  module Kungfuig
9
- ASPECT_PREFIX = '♻_'.freeze
10
- ASPECT_TEMPLATE = -> { %i(after before).map { |k| [k, []] }.to_h }
11
-
12
10
  MX = Mutex.new
13
11
 
14
- # rubocop:disable Style/VariableName
15
12
  # rubocop:disable Style/MethodName
16
- def ✍(receiver, method, result, *args)
13
+ def ✍(receiver: nil, method: nil, result: nil, args: nil, **params)
17
14
  require 'logger'
18
15
  @✍ ||= Kernel.const_defined?('Rails') && Rails.logger || Logger.new($stdout)
19
16
  message = receiver.is_a?(String) ? "#{receiver} | #{method}" : "#{receiver.class}##{method}"
@@ -23,9 +20,7 @@ module Kungfuig
23
20
  end
24
21
  module_function :✍
25
22
  # rubocop:enable Style/MethodName
26
- # rubocop:enable Style/VariableName
27
23
 
28
- # rubocop:disable Metrics/MethodLength
29
24
  def load_stuff hos
30
25
  case hos
31
26
  when NilClass then Hashie::Mash.new # aka skip
@@ -45,7 +40,6 @@ module Kungfuig
45
40
  fail ArgumentError.new "#{__callee__} accepts either String or Hash as parameter."
46
41
  end
47
42
  end
48
- # rubocop:enable Metrics/MethodLength
49
43
  module_function :load_stuff
50
44
 
51
45
  module InstanceMethods
@@ -113,14 +107,6 @@ module Kungfuig
113
107
  options.deep_merge! Kungfuig.load_stuff hos
114
108
  end
115
109
  private :merge_hash_or_string!
116
-
117
- def lookup_aspects meth
118
- # ⇓⇓⇓ eigenclass ⇓⇓⇓ ancestors
119
- [(class << self; self; end), *self.class.ancestors].inject(ASPECT_TEMPLATE.call) do |memo, c|
120
- c.respond_to?(:aspects?) && c.aspects? ? c.aspects(meth.to_sym).merge(memo) { |_, c1, c2| c1 | c2 } : memo
121
- end
122
- end
123
- private :lookup_aspects
124
110
  end
125
111
 
126
112
  def self.included base
@@ -145,41 +131,18 @@ module Kungfuig
145
131
  instance_eval(&block)
146
132
  end
147
133
 
148
- # rubocop:disable Metrics/MethodLength
149
134
  def aspect meth, after = true
150
135
  fail ArgumentError.new "Aspect must have a codeblock" unless block_given?
151
136
  fail NoMethodError.new "Aspect must be attached to existing method" unless instance_methods.include? meth.to_sym
152
137
 
153
- aspects(meth)[after ? :after : :before] << Proc.new
154
-
155
- unless instance_methods.include?(:"#{ASPECT_PREFIX}#{meth}")
156
- class_eval <<-CODE
157
- alias_method :'#{ASPECT_PREFIX}#{meth}', :'#{meth}'
158
- def #{meth}(*args, &cb)
159
- ps = lookup_aspects(:'#{meth}')
160
- ps[:before].each do |p|
161
- p.call(self, :'#{meth}', nil, *args) # FIXME: allow argument modification!!!
162
- end
163
- send(:'#{ASPECT_PREFIX}#{meth}', *args, &cb).tap do |result|
164
- ps[:after].each do |p|
165
- p.call(self, :'#{meth}', result, *args)
166
- end
167
- end
168
- end
169
- CODE
170
- end
171
-
172
- meth.to_sym
173
- end
174
- # rubocop:enable Metrics/MethodLength
175
-
176
- def aspects?
177
- @aspects.is_a?(Hash)
138
+ Kungfuig::Prepender.new(self, meth).public_send((after ? :after : :before), &Proc.new)
178
139
  end
179
140
 
180
- def aspects meth = nil
181
- @aspects ||= {}
182
- meth ? @aspects[meth.to_sym] ||= Kungfuig::ASPECT_TEMPLATE.call : @aspects
141
+ def aspects
142
+ ancestors.select { |a| a.name.nil? && a.ancestors.include?(I★I) }
143
+ .flat_map { |m| m.instance_methods(false) }
144
+ .group_by { |e| e }
145
+ .map { |k, v| [k, v.count] }.to_h
183
146
  end
184
147
  alias_method :set, :option!
185
148
  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.8
4
+ version: 0.6.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-04-12 00:00:00.000000000 Z
11
+ date: 2016-04-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: hashie
@@ -92,14 +92,14 @@ dependencies:
92
92
  requirements:
93
93
  - - "~>"
94
94
  - !ruby/object:Gem::Version
95
- version: '2.12'
95
+ version: '3'
96
96
  type: :development
97
97
  prerelease: false
98
98
  version_requirements: !ruby/object:Gem::Requirement
99
99
  requirements:
100
100
  - - "~>"
101
101
  - !ruby/object:Gem::Version
102
- version: '2.12'
102
+ version: '3'
103
103
  - !ruby/object:Gem::Dependency
104
104
  name: cucumber
105
105
  requirement: !ruby/object:Gem::Requirement
@@ -134,14 +134,14 @@ dependencies:
134
134
  requirements:
135
135
  - - "~>"
136
136
  - !ruby/object:Gem::Version
137
- version: '1'
137
+ version: '2'
138
138
  type: :development
139
139
  prerelease: false
140
140
  version_requirements: !ruby/object:Gem::Requirement
141
141
  requirements:
142
142
  - - "~>"
143
143
  - !ruby/object:Gem::Version
144
- version: '1'
144
+ version: '2'
145
145
  description: Config with goodnesses.
146
146
  email:
147
147
  - aleksei.matiushkin@kantox.com
@@ -168,6 +168,7 @@ files:
168
168
  - lib/kungfuig/aspector.rb
169
169
  - lib/kungfuig/color.rb
170
170
  - lib/kungfuig/jobber.rb
171
+ - lib/kungfuig/prepender.rb
171
172
  - lib/kungfuig/version.rb
172
173
  homepage: http://kantox.com
173
174
  licenses: