puts_debuggerer 0.8.0 → 0.10.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/CHANGELOG.md +77 -0
- data/LICENSE.txt +1 -1
- data/README.md +470 -54
- data/VERSION +1 -0
- data/lib/pd.rb +1 -0
- data/lib/puts_debuggerer.rb +231 -150
- data/lib/puts_debuggerer/core_ext/kernel.rb +6 -0
- data/lib/puts_debuggerer/run_determiner.rb +109 -0
- data/lib/puts_debuggerer/source_file.rb +31 -0
- metadata +68 -26
@@ -0,0 +1,109 @@
|
|
1
|
+
module PutsDebuggerer
|
2
|
+
module RunDeterminer
|
3
|
+
OBJECT_RUN_AT = {}
|
4
|
+
|
5
|
+
class << self
|
6
|
+
attr_reader :run_at_global_number
|
7
|
+
|
8
|
+
def run_at_global_number=(value)
|
9
|
+
@run_at_global_number = value
|
10
|
+
end
|
11
|
+
|
12
|
+
def init_run_at_global_number
|
13
|
+
@run_at_global_number = 1
|
14
|
+
end
|
15
|
+
|
16
|
+
def increment_run_at_global_number
|
17
|
+
@run_at_global_number += 1
|
18
|
+
end
|
19
|
+
|
20
|
+
def reset_run_at_global_number
|
21
|
+
@run_at_global_number = nil
|
22
|
+
end
|
23
|
+
|
24
|
+
def run_at_number(object, run_at)
|
25
|
+
OBJECT_RUN_AT[[object,run_at]]
|
26
|
+
end
|
27
|
+
|
28
|
+
def init_run_at_number(object, run_at)
|
29
|
+
OBJECT_RUN_AT[[object,run_at]] = 1
|
30
|
+
end
|
31
|
+
|
32
|
+
def increment_run_at_number(object, run_at)
|
33
|
+
OBJECT_RUN_AT[[object,run_at]] += 1
|
34
|
+
end
|
35
|
+
|
36
|
+
def reset_run_at_number(object, run_at)
|
37
|
+
OBJECT_RUN_AT.delete([object, run_at])
|
38
|
+
end
|
39
|
+
|
40
|
+
def reset_run_at_numbers
|
41
|
+
OBJECT_RUN_AT.clear
|
42
|
+
end
|
43
|
+
|
44
|
+
def run_number(object, run_at)
|
45
|
+
run_at_global_number || run_at_number(object, run_at)
|
46
|
+
end
|
47
|
+
|
48
|
+
def run_pd?(object, run_at)
|
49
|
+
run_pd = false
|
50
|
+
if run_at.nil?
|
51
|
+
run_pd = true
|
52
|
+
else
|
53
|
+
run_number = determine_run_number(object, run_at)
|
54
|
+
run_pd = determine_run_pd(run_at, run_number)
|
55
|
+
end
|
56
|
+
run_pd
|
57
|
+
end
|
58
|
+
|
59
|
+
def determine_run_number(object, run_at)
|
60
|
+
if PutsDebuggerer.run_at? # check if global option is set
|
61
|
+
determine_global_run_number
|
62
|
+
else
|
63
|
+
determine_local_run_number(object, run_at)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def determine_global_run_number
|
68
|
+
if PutsDebuggerer::RunDeterminer.run_at_global_number.nil?
|
69
|
+
PutsDebuggerer::RunDeterminer.init_run_at_global_number
|
70
|
+
else
|
71
|
+
PutsDebuggerer::RunDeterminer.increment_run_at_global_number
|
72
|
+
end
|
73
|
+
PutsDebuggerer::RunDeterminer.run_at_global_number
|
74
|
+
end
|
75
|
+
|
76
|
+
def determine_local_run_number(object, run_at)
|
77
|
+
if PutsDebuggerer::RunDeterminer.run_at_number(object, run_at).nil?
|
78
|
+
PutsDebuggerer::RunDeterminer.init_run_at_number(object, run_at)
|
79
|
+
else
|
80
|
+
PutsDebuggerer::RunDeterminer.increment_run_at_number(object, run_at)
|
81
|
+
end
|
82
|
+
PutsDebuggerer::RunDeterminer.run_at_number(object, run_at)
|
83
|
+
end
|
84
|
+
|
85
|
+
def determine_run_pd(run_at, run_number)
|
86
|
+
if run_at.is_a?(Integer)
|
87
|
+
determine_run_pd_integer(run_at, run_number)
|
88
|
+
elsif run_at.is_a?(Array)
|
89
|
+
determine_run_pd_array(run_at, run_number)
|
90
|
+
elsif run_at.is_a?(Range)
|
91
|
+
determine_run_pd_range(run_at, run_number)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def determine_run_pd_integer(run_at, run_number)
|
96
|
+
run_pd = true if run_at == run_number
|
97
|
+
end
|
98
|
+
|
99
|
+
def determine_run_pd_array(run_at, run_number)
|
100
|
+
run_pd = true if run_at.include?(run_number)
|
101
|
+
end
|
102
|
+
|
103
|
+
def determine_run_pd_range(run_at, run_number)
|
104
|
+
run_pd = true if run_at.cover?(run_number) || (run_at.end == -1 && run_number >= run_at.begin)
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module PutsDebuggerer
|
2
|
+
class SourceFile
|
3
|
+
def initialize(file_path)
|
4
|
+
@file = File.new(file_path)
|
5
|
+
end
|
6
|
+
|
7
|
+
def source(source_line_count, source_line_number)
|
8
|
+
@source = ''
|
9
|
+
# For Opal Ruby compatibility, skip source lines if file does not respond to readline (as in Opal)
|
10
|
+
lines = source_lines(source_line_count, source_line_number)
|
11
|
+
@source = lines.join(' '*5) if @file.respond_to?(:readline)
|
12
|
+
@source
|
13
|
+
end
|
14
|
+
|
15
|
+
def source_lines(source_line_count, source_line_number)
|
16
|
+
lines = []
|
17
|
+
begin
|
18
|
+
while @file.lineno < source_line_number + source_line_count
|
19
|
+
file_line_number = @file.lineno + 1
|
20
|
+
file_line = @file.readline
|
21
|
+
if file_line_number >= source_line_number && file_line_number < source_line_number + source_line_count
|
22
|
+
lines << file_line
|
23
|
+
end
|
24
|
+
end
|
25
|
+
rescue EOFError
|
26
|
+
# Done
|
27
|
+
end
|
28
|
+
lines
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: puts_debuggerer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andy Maleh
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-09-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: awesome_print
|
@@ -67,86 +67,129 @@ dependencies:
|
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '3.12'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: jeweler
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version:
|
75
|
+
version: 2.3.9
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version:
|
82
|
+
version: 2.3.9
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
84
|
+
name: bundler
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: 2.
|
89
|
+
version: 2.1.4
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: 2.
|
96
|
+
version: 2.1.4
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: coveralls
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
101
|
- - '='
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: 0.8.
|
103
|
+
version: 0.8.23
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
108
|
- - '='
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: 0.8.
|
110
|
+
version: 0.8.23
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: simplecov
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
115
|
- - "~>"
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version: 0.
|
117
|
+
version: 0.16.1
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 0.16.1
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: simplecov-lcov
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: 0.7.0
|
118
132
|
type: :development
|
119
133
|
prerelease: false
|
120
134
|
version_requirements: !ruby/object:Gem::Requirement
|
121
135
|
requirements:
|
122
136
|
- - "~>"
|
123
137
|
- !ruby/object:Gem::Version
|
124
|
-
version: 0.
|
138
|
+
version: 0.7.0
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: undercover
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - "~>"
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: 0.3.4
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - "~>"
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: 0.3.4
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: logging
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: 2.3.0
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: 2.3.0
|
125
167
|
description: |
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
In other words, puts_debuggerer is a Ruby library for improved puts debugging, automatically displaying bonus useful information such as source line number and source code.
|
131
|
-
|
132
|
-
Partially inspired (only partially ;) by this blog post:
|
133
|
-
https://tenderlovemaking.com/2016/02/05/i-am-a-puts-debuggerer.html
|
134
|
-
(Credit to Tenderlove.)
|
168
|
+
Debuggers are great! They help us troubleshoot complicated programming problems by inspecting values produced by code, line by line. They are invaluable when trying to understand what is going on in a large application composed of thousands or millions of lines of code.
|
169
|
+
In day-to-day test-driven development and simple debugging though, a puts statement can be a lot quicker in revealing what is going on than halting execution completely just to inspect a single value or a few. This is certainly true when writing the simplest possible code that could possibly work, and running a test every few seconds or minutes. Problem is you need to locate puts statements in large output logs, know which methods were invoked, find out what variable names are being printed, and see nicely formatted output. Enter puts_debuggerer. A guilt-free puts debugging Ruby gem FTW that prints file names, line numbers, code statements, and formats output nicely courtesy of awesome_print.
|
170
|
+
Partially inspired by this blog post: https://tenderlovemaking.com/2016/02/05/i-am-a-puts-debuggerer.html (Credit to Tenderlove.)
|
135
171
|
email: andy.am@gmail.com
|
136
172
|
executables: []
|
137
173
|
extensions: []
|
138
174
|
extra_rdoc_files:
|
175
|
+
- CHANGELOG.md
|
139
176
|
- LICENSE.txt
|
140
177
|
- README.md
|
141
178
|
files:
|
179
|
+
- CHANGELOG.md
|
142
180
|
- LICENSE.txt
|
143
181
|
- README.md
|
182
|
+
- VERSION
|
183
|
+
- lib/pd.rb
|
144
184
|
- lib/puts_debuggerer.rb
|
185
|
+
- lib/puts_debuggerer/core_ext/kernel.rb
|
186
|
+
- lib/puts_debuggerer/run_determiner.rb
|
187
|
+
- lib/puts_debuggerer/source_file.rb
|
145
188
|
homepage: http://github.com/AndyObtiva/puts_debuggerer
|
146
189
|
licenses:
|
147
190
|
- MIT
|
148
191
|
metadata: {}
|
149
|
-
post_install_message:
|
192
|
+
post_install_message:
|
150
193
|
rdoc_options: []
|
151
194
|
require_paths:
|
152
195
|
- lib
|
@@ -161,9 +204,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
161
204
|
- !ruby/object:Gem::Version
|
162
205
|
version: '0'
|
163
206
|
requirements: []
|
164
|
-
|
165
|
-
|
166
|
-
signing_key:
|
207
|
+
rubygems_version: 3.1.4
|
208
|
+
signing_key:
|
167
209
|
specification_version: 4
|
168
210
|
summary: Ruby library for improved puts debugging, automatically displaying bonus
|
169
211
|
useful information such as source line number and source code.
|