tapping_device 0.5.6 → 0.5.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 83a8ec6a373e181e3125d846a7621edf426441f68177406364ce67e268774f6a
4
- data.tar.gz: aa9a5f8c937a33f8d1ea18e755e6cf6971fe6db5a6c3aa87329c9394bc90e916
3
+ metadata.gz: 28a848cfef98c43315488230c1593aba48ef1b3ee91dc7a495a6cee7cb406771
4
+ data.tar.gz: 30601c6039343512d3d7c157bd0c8e5645b8005aa37a4b365458018cb477c2d2
5
5
  SHA512:
6
- metadata.gz: 2343c68ade029e6323d606eb34564476051bb65ffa0631361d1c306fd47875c530ba5e2e4c164a5fe53e9b7c34d54d543a3a811855808af99c97afaa718beb47
7
- data.tar.gz: d5270b82e2f8058512394f529c26f3f690f142982be36533504662468f8b23cbd981e2631cd10196505b9e0cd963e3c719e2fb24fd79d263a025bde804d6ebc1
6
+ metadata.gz: 2540416f3d4ece8dfb76ee567030d3f4ab9da497c9ae97e9d7418b952d7ce0552453aad33278344ce683dc89a393244d74aef20bc6c6cf9847f0198911999a20
7
+ data.tar.gz: b417c4c17f18a152ce0bbc4135657bc41cb90b70788b971debb4242a1d35a9189c21621420af5f5bf06e9aa76148f9a49c6e2fb786000769a193c57765de45d1
@@ -1,9 +1,10 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- tapping_device (0.5.6)
4
+ tapping_device (0.5.7)
5
5
  activerecord (>= 5.2)
6
6
  activesupport
7
+ pastel
7
8
  pry
8
9
 
9
10
  GEM
@@ -21,15 +22,17 @@ GEM
21
22
  tzinfo (~> 1.1)
22
23
  zeitwerk (~> 2.2, >= 2.2.2)
23
24
  coderay (1.1.3)
24
- concurrent-ruby (1.1.6)
25
+ concurrent-ruby (1.1.7)
25
26
  database_cleaner (1.7.0)
26
27
  diff-lcs (1.3)
27
28
  docile (1.3.2)
28
- i18n (1.8.3)
29
+ i18n (1.8.5)
29
30
  concurrent-ruby (~> 1.0)
30
31
  json (2.3.0)
31
32
  method_source (1.0.0)
32
- minitest (5.14.1)
33
+ minitest (5.14.2)
34
+ pastel (0.8.0)
35
+ tty-color (~> 0.5)
33
36
  pry (0.13.1)
34
37
  coderay (~> 1.1)
35
38
  method_source (~> 1.0)
@@ -54,6 +57,7 @@ GEM
54
57
  simplecov-html (0.10.2)
55
58
  sqlite3 (1.4.1)
56
59
  thread_safe (0.3.6)
60
+ tty-color (0.5.2)
57
61
  tzinfo (1.2.7)
58
62
  thread_safe (~> 0.1)
59
63
  zeitwerk (2.4.0)
@@ -153,6 +153,7 @@ class TappingDevice
153
153
  defined_class: tp.defined_class,
154
154
  trace: get_traces(tp),
155
155
  is_private_call?: tp.defined_class.private_method_defined?(tp.callee_id),
156
+ tag: options[:tag],
156
157
  tp: tp
157
158
  })
158
159
  end
@@ -1,17 +1,24 @@
1
+ require "pastel"
2
+
1
3
  class TappingDevice
2
4
  module Output
3
5
  class Payload < Payload
4
6
  UNDEFINED = "[undefined]"
7
+ PRIVATE_MARK = " (private)"
8
+
9
+ PASTEL = Pastel.new
10
+ PASTEL.alias_color(:orange, :bright_red, :bright_yellow)
5
11
 
6
12
  alias :raw_arguments :arguments
7
13
  alias :raw_return_value :return_value
8
14
 
9
15
  def method_name(options = {})
10
- if is_private_call?
11
- ":#{super(options)} (private)"
12
- else
13
- ":#{super(options)}"
14
- end
16
+ name = ":#{super(options)}"
17
+
18
+ name += " [#{tag}]" if tag
19
+ name += PRIVATE_MARK if is_private_call?
20
+
21
+ name
15
22
  end
16
23
 
17
24
  def arguments(options = {})
@@ -22,29 +29,13 @@ class TappingDevice
22
29
  generate_string_result(raw_return_value, options[:inspect])
23
30
  end
24
31
 
25
- COLOR_CODES = {
26
- green: 10,
27
- yellow: 11,
28
- blue: 12,
29
- megenta: 13,
30
- cyan: 14,
31
- orange: 214
32
- }
33
-
34
- COLORS = COLOR_CODES.each_with_object({}) do |(name, code), hash|
35
- hash[name] = "\u001b[38;5;#{code}m"
36
- end.merge(
37
- reset: "\u001b[0m",
38
- nocolor: ""
39
- )
40
-
41
32
  PAYLOAD_ATTRIBUTES = {
42
- method_name: {symbol: "", color: COLORS[:blue]},
43
- location: {symbol: "from:", color: COLORS[:green]},
44
- return_value: {symbol: "=>", color: COLORS[:megenta]},
45
- arguments: {symbol: "<=", color: COLORS[:orange]},
46
- ivar_changes: {symbol: "changes:\n", color: COLORS[:blue]},
47
- defined_class: {symbol: "#", color: COLORS[:yellow]}
33
+ method_name: {symbol: "", color: :bright_blue},
34
+ location: {symbol: "from:", color: :green},
35
+ return_value: {symbol: "=>", color: :magenta},
36
+ arguments: {symbol: "<=", color: :orange},
37
+ ivar_changes: {symbol: "changes:\n", color: :blue},
38
+ defined_class: {symbol: "#", color: :yellow}
48
39
  }
49
40
 
50
41
  PAYLOAD_ATTRIBUTES.each do |attribute, attribute_options|
@@ -57,7 +48,7 @@ class TappingDevice
57
48
  call_result = send("original_#{attribute}", options)
58
49
 
59
50
  if options[:colorize]
60
- "#{color}#{call_result}#{COLORS[:reset]}"
51
+ PASTEL.send(color, call_result)
61
52
  else
62
53
  call_result
63
54
  end
@@ -87,7 +78,7 @@ class TappingDevice
87
78
  return unless arg_name
88
79
 
89
80
  arg_name = ":#{arg_name}"
90
- arg_name = value_with_color(arg_name, :orange) if options[:colorize]
81
+ arg_name = PASTEL.orange(arg_name) if options[:colorize]
91
82
  msg = "Passed as #{arg_name} in '#{defined_class(options)}##{method_name(options)}' at #{location(options)}\n"
92
83
  msg += " > #{method_head}\n" if with_method_head
93
84
  msg
@@ -109,12 +100,12 @@ class TappingDevice
109
100
  after = generate_string_result(value_changes[:after], options[:inspect])
110
101
 
111
102
  if options[:colorize]
112
- ivar = "#{COLORS[:orange]}#{ivar}#{COLORS[:reset]}"
113
- before = "#{COLORS[:blue]}#{before.to_s}#{COLORS[:reset]}"
114
- after = "#{COLORS[:blue]}#{after.to_s}#{COLORS[:reset]}"
103
+ ivar = PASTEL.orange(ivar)
104
+ before = PASTEL.bright_blue(before.to_s)
105
+ after = PASTEL.bright_blue(after.to_s)
115
106
  end
116
107
 
117
- " #{ivar}: #{before.to_s} => #{after.to_s}"
108
+ " #{ivar}: #{before} => #{after}"
118
109
  end.join("\n")
119
110
  end
120
111
 
@@ -130,10 +121,6 @@ class TappingDevice
130
121
 
131
122
  private
132
123
 
133
- def value_with_color(value, color)
134
- "#{COLORS[color]}#{value}#{COLORS[:reset]}"
135
- end
136
-
137
124
  def generate_string_result(obj, inspect)
138
125
  case obj
139
126
  when Array
@@ -2,7 +2,7 @@ class TappingDevice
2
2
  class Payload < Hash
3
3
  ATTRS = [
4
4
  :target, :receiver, :method_name, :method_object, :arguments, :return_value, :filepath, :line_number,
5
- :defined_class, :trace, :tp, :ivar_changes, :is_private_call?
5
+ :defined_class, :trace, :tag, :tp, :ivar_changes, :is_private_call?
6
6
  ]
7
7
 
8
8
  ATTRS.each do |attr|
@@ -34,7 +34,16 @@ class TappingDevice
34
34
  method_name = tp.callee_id
35
35
 
36
36
  if @is_active_record_model
37
- method_name == :new && receiver.is_a?(Class) && receiver.ancestors.include?(target)
37
+ # ActiveRecord redefines model classes' .new method,
38
+ # so instead of calling Model#initialize, it'll actually call Model.new
39
+ # see https://github.com/rails/rails/blob/master/activerecord/lib/active_record/inheritance.rb#L50
40
+ method_name == :new &&
41
+ receiver.is_a?(Class) &&
42
+ # this checks if the model class is the target class or a subclass of it
43
+ receiver.ancestors.include?(target) &&
44
+ # Model.new triggers both c_return and return events. so we should only return in 1 type of the events
45
+ # otherwise the callback will be triggered twice
46
+ tp.event == :return
38
47
  else
39
48
  method_name == :initialize && receiver.is_a?(target)
40
49
  end
@@ -1,3 +1,3 @@
1
1
  class TappingDevice
2
- VERSION = "0.5.6"
2
+ VERSION = "0.5.7"
3
3
  end
@@ -34,6 +34,7 @@ Gem::Specification.new do |spec|
34
34
 
35
35
  spec.add_dependency "pry" # for using Method#source in MutationTracker
36
36
  spec.add_dependency "activesupport"
37
+ spec.add_dependency "pastel"
37
38
 
38
39
  spec.add_development_dependency "sqlite3", ">= 1.3.6"
39
40
  spec.add_development_dependency "database_cleaner"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tapping_device
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.6
4
+ version: 0.5.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - st0012
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-07-17 00:00:00.000000000 Z
11
+ date: 2020-09-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pastel
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: sqlite3
57
71
  requirement: !ruby/object:Gem::Requirement