pry-inline 0.1.2 → 1.0.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 +4 -4
- data/.rubocop.yml +0 -3
- data/Gemfile +0 -5
- data/README.md +2 -2
- data/Rakefile +1 -0
- data/lib/pry-inline.rb +4 -3
- data/lib/pry-inline/code_extension.rb +106 -0
- data/lib/pry-inline/parser.rb +37 -0
- data/lib/pry-inline/version.rb +1 -1
- data/pry-inline.gemspec +7 -2
- data/screenshot.png +0 -0
- metadata +62 -7
- data/bin/console +0 -14
- data/bin/setup +0 -7
- data/lib/pry-inline/inline_debuggable_code.rb +0 -71
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 90b17cf9bb9eb0a447283a2ad34d1e581ed045c9
|
4
|
+
data.tar.gz: 12fc419a7d493a318bd4797facab7f715a7c4091
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 942e74b75b54f63f4849d3f986159281ca1d79cc1bcb3cb5116966705e37920c519bec4d1be97bf2fc01c24940d6e391079a3349ce3527d35ddfddac5f35d91d
|
7
|
+
data.tar.gz: 46e61a948e6ba68a844d85034f7f304d1a0aab067d2c88e7959a4898d0dcc6ff0c8c0469303792c64899cd18deea4c6316872dad7f83c85e55847c754906288c
|
data/.rubocop.yml
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# Pry Inline
|
2
2
|
|
3
3
|
Pry Inline is a plugin for [pry](https://github.com/pry/pry/),
|
4
|
-
which enables the inline
|
4
|
+
which enables the inline variables view like [RubyMine](https://www.jetbrains.com/ruby/help/inline-debugging.html).
|
5
5
|
|
6
6
|

|
7
7
|
|
@@ -25,7 +25,7 @@ Or install it yourself as:
|
|
25
25
|
|
26
26
|
There is no need to edit any configuration.
|
27
27
|
After you have added the dependency in Gemfile,
|
28
|
-
pry-inline will enable the inline
|
28
|
+
pry-inline will enable the inline variables view functionality.
|
29
29
|
|
30
30
|
## Development
|
31
31
|
|
data/Rakefile
CHANGED
data/lib/pry-inline.rb
CHANGED
@@ -2,10 +2,11 @@ require 'pry'
|
|
2
2
|
require 'ripper'
|
3
3
|
require 'set'
|
4
4
|
|
5
|
-
require 'pry-inline/
|
5
|
+
require 'pry-inline/code_extension'
|
6
|
+
require 'pry-inline/parser'
|
6
7
|
|
7
8
|
Pry.config.hooks.add_hook(:when_started, :pry_inline) do
|
8
|
-
Pry::Code.send(:prepend, PryInline::
|
9
|
+
Pry::Code.send(:prepend, PryInline::CodeExtension)
|
9
10
|
end
|
10
11
|
|
11
12
|
before_session_hooks = Pry.config.hooks.get_hooks(:before_session)
|
@@ -13,7 +14,7 @@ Pry.config.hooks.delete_hooks(:before_session)
|
|
13
14
|
|
14
15
|
begin
|
15
16
|
Pry.config.hooks.add_hook(:before_session, :pry_inline) do |_, target, _|
|
16
|
-
PryInline::
|
17
|
+
PryInline::CodeExtension.current_binding = target
|
17
18
|
end
|
18
19
|
ensure
|
19
20
|
before_session_hooks.each do |name, callable|
|
@@ -0,0 +1,106 @@
|
|
1
|
+
require 'unicode'
|
2
|
+
|
3
|
+
module PryInline
|
4
|
+
# monkey patch for Pry::Code
|
5
|
+
module CodeExtension
|
6
|
+
def self.current_binding
|
7
|
+
@current_binding
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.current_binding=(value)
|
11
|
+
@current_binding = value
|
12
|
+
end
|
13
|
+
|
14
|
+
def print_to_output(output, color = false)
|
15
|
+
begin
|
16
|
+
not_colorized_output_lines = super('', false).split("\n")
|
17
|
+
@lineno_to_variables = Hash.new { |h, k| h[k] = Set.new }
|
18
|
+
traverse_sexp(Parser.sexp(@lines.map(&:line).join("\n")))
|
19
|
+
|
20
|
+
@lineno_to_variables.each do |lineno, variables|
|
21
|
+
variables.each do |v|
|
22
|
+
next unless @lineno_to_variables.any? do |l, vs|
|
23
|
+
l > lineno && vs.include?(v)
|
24
|
+
end
|
25
|
+
variables.delete(v)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
current_line = CodeExtension.current_binding.eval('__LINE__')
|
30
|
+
@lineno_to_variables.each do |lineno, variables|
|
31
|
+
next if lineno == 0 || @lines.length <= lineno
|
32
|
+
next if lineno > (current_line - @lines[0].lineno)
|
33
|
+
|
34
|
+
original_width = Unicode.width(not_colorized_output_lines[lineno - 1], true)
|
35
|
+
debug_info_width = terminal_width - original_width % terminal_width + 1
|
36
|
+
debug_info_width += terminal_width if debug_info_width < min_debug_info_width
|
37
|
+
|
38
|
+
@lines[lineno - 1].tuple[0] +=
|
39
|
+
debug_info(variables)
|
40
|
+
.slice(0, debug_info_width)
|
41
|
+
.split('')
|
42
|
+
.map { |c| [c, Unicode.width(c, true)] }
|
43
|
+
.reduce([]) { |a, e| a + [[e[0], e[1] + (a.empty? ? 0 : a[-1][1])]] }
|
44
|
+
.take_while { |_, w| w < debug_info_width }
|
45
|
+
.map(&:first)
|
46
|
+
.join
|
47
|
+
end
|
48
|
+
ensure
|
49
|
+
ret = super(output, color)
|
50
|
+
end
|
51
|
+
ret
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
|
56
|
+
def terminal_width
|
57
|
+
`tput cols`.to_i
|
58
|
+
end
|
59
|
+
|
60
|
+
def traverse_sexp(sexp)
|
61
|
+
return unless sexp.is_a?(Array)
|
62
|
+
event = sexp[0]
|
63
|
+
|
64
|
+
return sexp.each { |s| traverse_sexp(s) } if event.is_a?(Array)
|
65
|
+
return traverse_sexp_in_assignment(sexp[1]) if %i( assign opassign massign ).include?(event)
|
66
|
+
return traverse_sexp_in_assignment(sexp[1..-1]) if event == :params
|
67
|
+
traverse_sexp(sexp[1..-1]) unless event.to_s.start_with?('@')
|
68
|
+
end
|
69
|
+
|
70
|
+
def traverse_sexp_in_assignment(sexp)
|
71
|
+
return unless sexp.is_a?(Array)
|
72
|
+
event = sexp[0]
|
73
|
+
|
74
|
+
return sexp.each { |s| traverse_sexp_in_assignment(s) } if event.is_a?(Array)
|
75
|
+
if %i( @ident @cvar @ivar @gvar ).include?(event)
|
76
|
+
return @lineno_to_variables[sexp[2][0]] << sexp[1]
|
77
|
+
elsif %i( @label ).include?(event)
|
78
|
+
return @lineno_to_variables[sexp[2][0]] << sexp[1].slice(0..-2)
|
79
|
+
end
|
80
|
+
|
81
|
+
traverse_sexp_in_assignment(sexp[1..-1])
|
82
|
+
end
|
83
|
+
|
84
|
+
def defined_variables
|
85
|
+
return [] unless CodeExtension.current_binding
|
86
|
+
%w(local_variables global_variables
|
87
|
+
self.instance_variables self.class.class_variables).map do |exp|
|
88
|
+
CodeExtension.current_binding.eval(exp)
|
89
|
+
end.flatten.to_set.map(&:to_s)
|
90
|
+
end
|
91
|
+
|
92
|
+
def debug_info(variables)
|
93
|
+
return '' if !variables || (variables & defined_variables).size <= 0
|
94
|
+
' # ' + variables.select { |k| defined_variables.include?(k) }
|
95
|
+
.map { |k| "#{k}: #{CodeExtension.current_binding.eval(k).inspect.delete("\n")}" }
|
96
|
+
.join(', ')
|
97
|
+
end
|
98
|
+
|
99
|
+
def min_debug_info_width
|
100
|
+
if Pry.config.inline.is_a?(Hash)
|
101
|
+
min_width = Pry.config.inline[:min_debug_info_width]
|
102
|
+
end
|
103
|
+
min_width || 16
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'ripper'
|
2
|
+
|
3
|
+
module PryInline
|
4
|
+
class Parser < Ripper
|
5
|
+
attr_reader :ret
|
6
|
+
|
7
|
+
def self.sexp(src, filename = '-', lineno = 1)
|
8
|
+
parser = Parser.new(src, filename, lineno)
|
9
|
+
parser.parse || parser.ret
|
10
|
+
end
|
11
|
+
|
12
|
+
Ripper::PARSER_EVENTS.each do |event|
|
13
|
+
module_eval(<<-End, __FILE__, __LINE__ + 1)
|
14
|
+
def on_#{event}(*args)
|
15
|
+
args.unshift :#{event}
|
16
|
+
@ret = args
|
17
|
+
end
|
18
|
+
End
|
19
|
+
end
|
20
|
+
|
21
|
+
Ripper::SCANNER_EVENTS.each do |event|
|
22
|
+
module_eval(<<-End, __FILE__, __LINE__ + 1)
|
23
|
+
def on_#{event}(tok)
|
24
|
+
@ret = [:@#{event}, tok, [lineno(), column()]]
|
25
|
+
end
|
26
|
+
End
|
27
|
+
end
|
28
|
+
|
29
|
+
def compile_error(_)
|
30
|
+
@ret
|
31
|
+
end
|
32
|
+
|
33
|
+
def on_parse_error(_)
|
34
|
+
@ret
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/pry-inline/version.rb
CHANGED
data/pry-inline.gemspec
CHANGED
@@ -10,8 +10,8 @@ Gem::Specification.new do |spec|
|
|
10
10
|
spec.authors = ['Seiichi KONDO']
|
11
11
|
spec.email = ['seikichi@kmc.gr.jp']
|
12
12
|
|
13
|
-
spec.summary = 'Inline
|
14
|
-
spec.description = 'This Pry plugin enables inline
|
13
|
+
spec.summary = 'Inline variables view like RubyMine'
|
14
|
+
spec.description = 'This Pry plugin enables inline variables view like RubyMine!'
|
15
15
|
spec.homepage = 'https://github.com/seikichi/pry-inline'
|
16
16
|
spec.license = 'MIT'
|
17
17
|
|
@@ -19,7 +19,12 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.require_paths = ['lib']
|
20
20
|
|
21
21
|
spec.add_dependency 'pry', '~> 0.10.0'
|
22
|
+
spec.add_dependency 'unicode', '~> 0.4.4'
|
22
23
|
spec.add_development_dependency 'bundler', '~> 1.10'
|
23
24
|
spec.add_development_dependency 'rake', '~> 10.0'
|
25
|
+
spec.add_development_dependency 'simplecov', '~> 0.10.0'
|
24
26
|
spec.add_development_dependency 'test-unit', '>= 3.0.0'
|
27
|
+
|
28
|
+
spec.add_development_dependency 'rubocop'
|
29
|
+
spec.add_development_dependency 'pry-theme'
|
25
30
|
end
|
data/screenshot.png
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pry-inline
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Seiichi KONDO
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-09-
|
11
|
+
date: 2015-09-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pry
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 0.10.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: unicode
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.4.4
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.4.4
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: bundler
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,6 +66,20 @@ dependencies:
|
|
52
66
|
- - "~>"
|
53
67
|
- !ruby/object:Gem::Version
|
54
68
|
version: '10.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: simplecov
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 0.10.0
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 0.10.0
|
55
83
|
- !ruby/object:Gem::Dependency
|
56
84
|
name: test-unit
|
57
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -66,7 +94,35 @@ dependencies:
|
|
66
94
|
- - ">="
|
67
95
|
- !ruby/object:Gem::Version
|
68
96
|
version: 3.0.0
|
69
|
-
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rubocop
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: pry-theme
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
description: This Pry plugin enables inline variables view like RubyMine!
|
70
126
|
email:
|
71
127
|
- seikichi@kmc.gr.jp
|
72
128
|
executables: []
|
@@ -81,10 +137,9 @@ files:
|
|
81
137
|
- LICENSE.txt
|
82
138
|
- README.md
|
83
139
|
- Rakefile
|
84
|
-
- bin/console
|
85
|
-
- bin/setup
|
86
140
|
- lib/pry-inline.rb
|
87
|
-
- lib/pry-inline/
|
141
|
+
- lib/pry-inline/code_extension.rb
|
142
|
+
- lib/pry-inline/parser.rb
|
88
143
|
- lib/pry-inline/version.rb
|
89
144
|
- pry-inline.gemspec
|
90
145
|
- screenshot.png
|
@@ -111,6 +166,6 @@ rubyforge_project:
|
|
111
166
|
rubygems_version: 2.4.5
|
112
167
|
signing_key:
|
113
168
|
specification_version: 4
|
114
|
-
summary: Inline
|
169
|
+
summary: Inline variables view like RubyMine
|
115
170
|
test_files: []
|
116
171
|
has_rdoc:
|
data/bin/console
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'bundler/setup'
|
4
|
-
require 'pry/inline'
|
5
|
-
|
6
|
-
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
-
# with your gem easier. You can also use a different console, if you like.
|
8
|
-
|
9
|
-
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
-
# require "pry"
|
11
|
-
# Pry.start
|
12
|
-
|
13
|
-
require 'irb'
|
14
|
-
IRB.start
|
data/bin/setup
DELETED
@@ -1,71 +0,0 @@
|
|
1
|
-
module PryInline
|
2
|
-
# monkey patch for Pry::Code
|
3
|
-
module InlineDebuggableCode
|
4
|
-
MAX_DEBUG_INFO_LENGTH = 80
|
5
|
-
|
6
|
-
@@binding = nil
|
7
|
-
|
8
|
-
def self.binding=(value)
|
9
|
-
@@binding = value
|
10
|
-
end
|
11
|
-
|
12
|
-
def print_to_output(output, color = false)
|
13
|
-
begin
|
14
|
-
@lineno_to_variables = Hash.new { |h, k| h[k] = Set.new }
|
15
|
-
traverse_sexp(Ripper.sexp(@lines.map(&:line).join("\n")))
|
16
|
-
@lineno_to_variables.each do |lineno, variables|
|
17
|
-
next if lineno == 0 || @lines.length <= lineno
|
18
|
-
next if @with_marker && lineno > (@marker_lineno - @lines[0].lineno)
|
19
|
-
add_debug_info(@lines[lineno - 1], variables)
|
20
|
-
end
|
21
|
-
ensure
|
22
|
-
ret = super(output, color)
|
23
|
-
end
|
24
|
-
ret
|
25
|
-
end
|
26
|
-
|
27
|
-
private
|
28
|
-
|
29
|
-
def traverse_sexp(sexp)
|
30
|
-
return unless sexp.is_a?(Array)
|
31
|
-
event = sexp[0]
|
32
|
-
|
33
|
-
return sexp.each { |s| traverse_sexp(s) } if event.is_a?(Array)
|
34
|
-
return traverse_sexp_in_assignment(sexp[1]) if %i( assign massign ).include?(event)
|
35
|
-
return traverse_sexp_in_assignment(sexp[1..-1]) if event == :params
|
36
|
-
traverse_sexp(sexp[1..-1]) unless event.to_s.start_with?('@')
|
37
|
-
end
|
38
|
-
|
39
|
-
def traverse_sexp_in_assignment(sexp)
|
40
|
-
return unless sexp.is_a?(Array)
|
41
|
-
event = sexp[0]
|
42
|
-
|
43
|
-
return sexp.each { |s| traverse_sexp_in_assignment(s) } if event.is_a?(Array)
|
44
|
-
if %i( @ident @cvar @ivar ).include?(event)
|
45
|
-
return @lineno_to_variables[sexp[2][0]] << sexp[1]
|
46
|
-
end
|
47
|
-
|
48
|
-
traverse_sexp_in_assignment(sexp[1..-1])
|
49
|
-
end
|
50
|
-
|
51
|
-
def add_debug_info(loc, variables)
|
52
|
-
return if !variables || (variables & defined_variables).size <= 0
|
53
|
-
info = debug_info(variables)
|
54
|
-
loc.tuple[0] += " # #{info[0..MAX_DEBUG_INFO_LENGTH]}"
|
55
|
-
loc.tuple[0] += ' ...' if info.length > MAX_DEBUG_INFO_LENGTH
|
56
|
-
end
|
57
|
-
|
58
|
-
def defined_variables
|
59
|
-
return [] unless @@binding
|
60
|
-
@@binding.eval('local_variables').map(&:to_s) |
|
61
|
-
@@binding.eval('self.instance_variables').map(&:to_s) |
|
62
|
-
@@binding.eval('self.class.class_variables').map(&:to_s)
|
63
|
-
end
|
64
|
-
|
65
|
-
def debug_info(variables)
|
66
|
-
variables.select { |k| defined_variables.include?(k) }
|
67
|
-
.map { |k| "#{k}: #{@@binding.eval(k).inspect}" }
|
68
|
-
.join(', ')
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|