pry-moves 1.0.0 → 1.0.1

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: 2c08b34502f7649fecea8dbf09d8bbc04e917341a260c92bc1e1b50e70ad7fe3
4
- data.tar.gz: 27be890e5b41dafdbdf58279c85618682ef8a3f24fa2a89094053ec8d5af9455
3
+ metadata.gz: 47c7a7529bee28ca664536458891b00f6a1bee574869106686cd2abef9b57adb
4
+ data.tar.gz: 13d671c5f8ed4005304da6d4201908c0857d19e8ee3fe85631d18cea5c109580
5
5
  SHA512:
6
- metadata.gz: b3d5d0a64ab6d910529b3e228154d609b638892913e66ea66c0403e152aea5aa9dceb8e66a46e8515978142af942bb7f59801ec233e1abcb2be44c2338279bc2
7
- data.tar.gz: f288273d0b30e3bde39ec975e3bd5cb360a7d1a2f747cf8ab95d17e9190ac4f38797c9b21a90a3398383fd5b384dbd4df675a250ad23723360e60ccaed8ebf75
6
+ metadata.gz: addaf61aa995184e49f3b655f1d4fa863fa0554d1fb00f022fce7a9e1d8671595c03056e37754fd394bf9a204e32c91b3005a00fac3287f2803bafb66273e2d6
7
+ data.tar.gz: 9ba407049732e75c27e8cc87936e25967a30798212098fce844e948e7986912874137088fc87ffc8d9ef48ca09a3c2445da545132109a58ed47d5c4577775db4
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- pry-moves (1.0.0)
4
+ pry-moves (1.0.1)
5
5
  binding_of_caller (~> 0.7)
6
6
  colorize (~> 0.8)
7
7
  pry (>= 0.10.4, < 0.13)
@@ -13,7 +13,7 @@ GEM
13
13
  debug_inspector (>= 0.0.1)
14
14
  coderay (1.1.2)
15
15
  colorize (0.8.1)
16
- debug_inspector (0.0.3)
16
+ debug_inspector (1.1.0)
17
17
  diff-lcs (1.3)
18
18
  method_source (0.9.0)
19
19
  pry (0.11.3)
@@ -65,7 +65,6 @@ end
65
65
 
66
66
  SUFFIX_COMMANDS = [
67
67
  PryMoves::Method,
68
- PryMoves::ArgumentCall,
69
68
  PryMoves::ArrayIndex,
70
69
  PryMoves::ArrayCall,
71
70
  PryMoves::HashKey
@@ -2,10 +2,12 @@ require 'fileutils'
2
2
 
3
3
  class PryMoves::Backtrace
4
4
 
5
+ FILTERS = %w[/gems/ /rubygems/ /bin/ /lib/ruby/]
6
+
5
7
  class << self
6
8
 
7
9
  def filter
8
- @filter || /(\/gems\/|\/rubygems\/|\/bin\/|\/lib\/ruby\/)/
10
+ @filter ||= Regexp.new FILTERS.join("|")
9
11
  end
10
12
  def filter=(f); @filter = f; end
11
13
 
@@ -49,11 +51,13 @@ class PryMoves::Backtrace
49
51
  end
50
52
 
51
53
  def build
52
- show_vapid = %w(+ a all hidden vapid).include?(@filter)
53
54
  show_all = %w(a all).include?(@filter)
55
+ show_vapid = %w(+ hidden vapid).include?(@filter) || show_all
54
56
  result = []
55
57
  current_object, vapid_count = nil, 0
56
58
 
59
+ recursion = PryMoves::Recursion::Holder.new
60
+
57
61
  frame_manager.bindings.each_with_details do |binding, vapid|
58
62
  next if !show_all and binding.eval('__FILE__').match self.class::filter
59
63
 
@@ -74,16 +78,20 @@ class PryMoves::Backtrace
74
78
  current_object = obj
75
79
  end
76
80
 
77
- result << build_line(binding)
81
+ file, line = binding.eval('[__FILE__, __LINE__]')
82
+ recursion.track file, line, result.count, binding.index unless show_vapid
83
+ result << build_line(binding, file, line)
78
84
  end
79
85
 
86
+ recursion.each { |t| t.apply result }
87
+
80
88
  result << "👽 frames hidden: #{vapid_count}" if vapid_count > 0
81
89
 
82
90
  result
83
91
  end
84
92
 
85
- def build_line(binding)
86
- file = @formatter.shorten_path "#{binding.eval('__FILE__')}"
93
+ def build_line(binding, file, line)
94
+ file = @formatter.shorten_path "#{file}"
87
95
 
88
96
  signature = @formatter.method_signature binding
89
97
  signature = ":#{binding.frame_type}" if !signature or signature.length < 1
@@ -97,7 +105,6 @@ class PryMoves::Backtrace
97
105
  ' '
98
106
  end
99
107
 
100
- line = binding.eval('__LINE__')
101
108
  "#{indent}#{file}:#{line} #{signature}"
102
109
  end
103
110
 
@@ -45,6 +45,7 @@ class PryMoves::Formatter
45
45
  end
46
46
 
47
47
  def cut_string str
48
+ return str unless str
48
49
  str.length > 50 ? "#{str.first 50}..." : str
49
50
  end
50
51
 
@@ -0,0 +1,94 @@
1
+ module PryMoves::Recursion
2
+
3
+ class Tracker
4
+
5
+ attr_reader :loops
6
+
7
+ def initialize
8
+ @history = []
9
+ @loops = 0
10
+ @missing = 0
11
+ @currently_missing = []
12
+ @missing_lines = []
13
+ end
14
+
15
+ def track file, line_num, bt_index, binding_index
16
+ line = "#{file}:#{line_num}"
17
+ if @last_index
18
+ check_recursion line, bt_index, binding_index
19
+ elsif (prev_index = @history.rindex line)
20
+ @loops += 1
21
+ @last_index = prev_index
22
+ @recursion_size = 1
23
+ else
24
+ @history << line
25
+ @last_index = nil
26
+ end
27
+
28
+ @repetitions_start ||= bt_index if @loops == 2
29
+ end
30
+
31
+ def check_recursion line, bt_index, binding_index
32
+ prev_index = @history.rindex line
33
+ if prev_index == @last_index
34
+ @loops += 1
35
+ @missing = 0
36
+ @recursion_size = 0
37
+ @missing_lines.concat @currently_missing
38
+ @repetitions_end = bt_index
39
+ elsif prev_index && prev_index > @last_index
40
+ @last_index = prev_index + 1
41
+ @recursion_size += 1
42
+ # todo: finish tracking and debug multi-line recursions
43
+ elsif @missing <= @recursion_size
44
+ @missing += 1
45
+ @currently_missing << binding_index
46
+ false
47
+ else
48
+ # @missing_lines = nil
49
+ # @last_index = nil
50
+ @is_finished = true
51
+ false
52
+ end
53
+ end
54
+
55
+ def finished?
56
+ @is_finished
57
+ end
58
+
59
+ def good?
60
+ @repetitions_start and @repetitions_end
61
+ end
62
+
63
+ def apply result
64
+ label = "♻️ recursion with #{@loops} loops"
65
+ label += " Ⓜ️ #{@missing} missing lines #{@missing_lines}" if @missing_lines.present?
66
+ label = "...(#{label})..."
67
+ # puts "#{@repetitions_start}..#{@repetitions_end}"
68
+ result[@repetitions_start..@repetitions_end] = [label]
69
+ end
70
+
71
+ end
72
+
73
+ class Holder < Array
74
+
75
+ def initialize(*args)
76
+ super
77
+ new_tracker
78
+ end
79
+
80
+ def new_tracker
81
+ @tracker = Tracker.new
82
+ end
83
+
84
+ def track *args
85
+ @tracker.track *args
86
+ if @tracker.finished?
87
+ self << @tracker if @tracker.good?
88
+ new_tracker
89
+ end
90
+ end
91
+
92
+ end
93
+
94
+ end
@@ -1,3 +1,3 @@
1
1
  module PryMoves
2
- VERSION = '1.0.0'
2
+ VERSION = '1.0.1'
3
3
  end
data/lib/pry-moves.rb CHANGED
@@ -11,6 +11,7 @@ require 'pry-moves/backtrace'
11
11
  require 'pry-moves/watch'
12
12
  require 'pry-moves/painter'
13
13
  require 'pry-moves/restartable'
14
+ require 'pry-moves/recursion_tracker'
14
15
 
15
16
  require 'commands/traced_method'
16
17
  require 'commands/trace_helpers'
@@ -48,8 +49,8 @@ module PryMoves
48
49
  pry_moves_stack_root = true
49
50
  PryMoves.re_execution
50
51
  if PryMoves.stop_on_breakpoints
52
+ self.debug_called_times += 1
51
53
  if at
52
- self.debug_called_times += 1
53
54
  return unless self.debug_called_times == at
54
55
  end
55
56
  PryMoves.messages << message if message
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pry-moves
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - garmoshka-mo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-09-09 00:00:00.000000000 Z
11
+ date: 2021-10-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pry
@@ -108,6 +108,7 @@ files:
108
108
  - lib/pry-moves/pry_ext.rb
109
109
  - lib/pry-moves/pry_remote_ext.rb
110
110
  - lib/pry-moves/pry_wrapper.rb
111
+ - lib/pry-moves/recursion_tracker.rb
111
112
  - lib/pry-moves/restartable.rb
112
113
  - lib/pry-moves/version.rb
113
114
  - lib/pry-moves/watch.rb