pry-auto_benching.rb 2.7.0 → 2.8.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/README.md +27 -14
- data/lib/pry-auto_benching/pry_command.rb +32 -11
- data/lib/pry-auto_benching/version.rb +1 -1
- data/lib/pry-auto_benching.rb +115 -38
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 237980bf9d213d1a40df42c9fa3b78a7920ad90f6bf0e2115ea7fc27e47a1c7e
|
4
|
+
data.tar.gz: 93206785da40f07e91cead03bd5c75fb90969e65ddce7131ed5f73525fe8c9f3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5484e2012f9ebb124ae4954022f174fc537ead567a31fd71cc29ce04e2abff6b9b820c5992106434c5e7575be53dab5b6e17b58d0ecf0d6532a6901dab645060
|
7
|
+
data.tar.gz: de3c42d2facb770932b0cbde3d588ef494135d035ae66cbee97329085041e195760394599d8b87a48311ba7ddb21d97189f2a54930d310a0f33b9d6fd4edb8cf
|
data/README.md
CHANGED
@@ -4,17 +4,17 @@ pry-auto_benching.rb automatically benchmarks input entered into Pry.
|
|
4
4
|
|
5
5
|
## Configuration (optional)
|
6
6
|
|
7
|
-
Configuration isn't required unless you want to change a default
|
8
|
-
To change a default, open `~/.pryrc` and add code along the lines
|
9
|
-
of:
|
7
|
+
Configuration isn't required unless you want to change a default.<br>
|
8
|
+
To change a default, open `~/.pryrc` and add code along the lines of:
|
10
9
|
|
11
10
|
```ruby
|
12
11
|
Pry.configure do |config|
|
13
12
|
# Start benchmarking as soon as Pry starts? default is true.
|
14
13
|
config.auto_benching.enabled = false
|
15
14
|
|
16
|
-
#
|
17
|
-
|
15
|
+
# The max number of previous benchmark results to store in memory,
|
16
|
+
# for use by `auto-benching --past`. The default is 70.
|
17
|
+
config.auto_benching.max_history_size = 120
|
18
18
|
|
19
19
|
# The type of clock to use, default is Process::CLOCK_MONOTONIC.
|
20
20
|
# See https://www.rubydoc.info/stdlib/core/Process:clock_gettime
|
@@ -47,12 +47,14 @@ __1.__
|
|
47
47
|
|
48
48
|
Show help by running `auto-benching -h`:
|
49
49
|
|
50
|
-
[
|
51
|
-
Usage: auto-benching [enable|disable]
|
50
|
+
[11] pry(main)> auto-benching -h
|
51
|
+
Usage: auto-benching [options] [enable|disable]
|
52
52
|
|
53
|
-
|
53
|
+
The auto-benching command can enable, disable, and
|
54
|
+
provide other features related to pry-auto_benching.rb
|
54
55
|
|
55
56
|
-v, --version Display version.
|
57
|
+
-p, --past Display past benchmark results.
|
56
58
|
-h, --help Show this message.
|
57
59
|
|
58
60
|
__2.__
|
@@ -66,7 +68,6 @@ Disable auto benchmarking by running `auto-benching disable`:
|
|
66
68
|
__3.__
|
67
69
|
|
68
70
|
An example showing the prompt being updated with benchmark results.
|
69
|
-
`_pry_.config.auto_benching.target_display` is set to `:prompt` (the default).
|
70
71
|
|
71
72
|
[7] pry(main)> sleep 0.2
|
72
73
|
=> 0
|
@@ -92,24 +93,36 @@ An example with `_pry_.config.auto_benching.target_display` set to `:output`.
|
|
92
93
|
pry-auto_benching.rb: 0.31s
|
93
94
|
=> #<Net::HTTPOK 200 OK readbody=true>
|
94
95
|
|
96
|
+
__5.__
|
97
|
+
|
98
|
+
Display benchmark results from the current Pry session using `auto-benching --past`:
|
99
|
+
|
100
|
+
[6] 0.5s (main)> auto-benching --past
|
101
|
+
1. Net::HTTP.get_response URI.parse('https://github.com') (0.88s)
|
102
|
+
2. Net::HTTP.get_response URI.parse('https://www.youtube.com') (2.18s)
|
103
|
+
3. Net::HTTP.get_response URI.parse('https://www.github.com/ruby/ruby') (0.59s)
|
104
|
+
4. sleep 0.5 (0.5s)
|
105
|
+
[7] pry(main)>
|
106
|
+
|
95
107
|
## Accuracy
|
96
108
|
|
97
|
-
pry-auto_benching.rb can measure down to
|
98
|
-
|
109
|
+
pry-auto_benching.rb can measure down to 10 milliseconds (0.01 = 10 milliseconds). <br>
|
110
|
+
Benchmarking `sleep 0.01` shows no overhead in the results:
|
99
111
|
|
100
112
|
[1] pry(main)> sleep 0.01
|
101
113
|
=> 0
|
102
114
|
[2] 0.01s (main)>
|
103
115
|
|
104
|
-
|
116
|
+
But it is possible results can be reported inaccurately since the measurement
|
105
117
|
includes a **very** small number of method calls to Pry internals. The overhead should be
|
106
118
|
minimal and skew results by a margin that could be considered negligible.
|
107
119
|
|
108
120
|
## Integration with custom prompts
|
109
121
|
|
110
|
-
If you want a custom prompt to integrate with pry-auto_benching.rb, it's easy,
|
122
|
+
If you want a custom prompt to integrate with pry-auto_benching.rb, it's easy, just use
|
111
123
|
`pry.config.prompt_name` (by default it is equal to 'pry') somewhere in the prompt and the
|
112
|
-
duration of a benchmark will be inserted in its place.
|
124
|
+
duration of a benchmark will be inserted in its place, as long as `auto_benching.target_display`
|
125
|
+
is set to `:prompt`.
|
113
126
|
|
114
127
|
Example:
|
115
128
|
|
@@ -5,27 +5,48 @@ Pry::Commands.add_command Class.new(Pry::ClassCommand) {
|
|
5
5
|
group 'pry-auto_benching.rb'
|
6
6
|
description 'Enable or disable benchmarking.'
|
7
7
|
banner <<-CMDBANNER
|
8
|
-
Usage: auto-benching [enable|disable]
|
8
|
+
Usage: auto-benching [options] [enable|disable]
|
9
9
|
|
10
|
-
|
10
|
+
The auto-benching command can enable, disable, and
|
11
|
+
provide other features related to pry-auto_benching.rb
|
11
12
|
CMDBANNER
|
12
13
|
|
13
14
|
def options(o)
|
14
15
|
o.on :v, :version, 'Display version.'
|
16
|
+
o.on :p, :past, 'Display past benchmark results.'
|
15
17
|
end
|
16
18
|
|
17
19
|
def process(command)
|
18
|
-
|
19
|
-
|
20
|
+
case
|
21
|
+
when opts.version?
|
22
|
+
_pry_.output.puts "pry-auto_benching.rb v#{Pry::AutoBenching::VERSION}"
|
23
|
+
when opts.past?
|
24
|
+
process_past
|
25
|
+
else
|
26
|
+
if command == 'enable'
|
27
|
+
Pry::AutoBenching.enable(_pry_)
|
28
|
+
_pry_.pager.page('pry-auto_benching.rb: benchmarking.')
|
29
|
+
elsif command == 'disable'
|
30
|
+
Pry::AutoBenching.disable(_pry_)
|
31
|
+
_pry_.pager.page('pry-auto_benching.rb: stopped benchmarking.')
|
32
|
+
else
|
33
|
+
raise Pry::CommandError, "'#{command}' is not implemented by this command, try -h for help."
|
34
|
+
end
|
20
35
|
end
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
def process_past
|
40
|
+
moments = Pry::AutoBenching.moments[_pry_.hash]
|
41
|
+
if moments.empty?
|
42
|
+
_pry_.pager.page "No benchmark results are currently stored for this session."
|
27
43
|
else
|
28
|
-
|
44
|
+
_pry_.pager.page moments.map.with_index { |moment, i|
|
45
|
+
format "%{index}. %{code} (%{duration})",
|
46
|
+
index: blue(i + 1),
|
47
|
+
code: moment.input.chomp,
|
48
|
+
duration: bold("#{moment.duration}s")
|
49
|
+
}.join("\n")
|
29
50
|
end
|
30
51
|
end
|
31
52
|
}
|
data/lib/pry-auto_benching.rb
CHANGED
@@ -1,6 +1,52 @@
|
|
1
1
|
module Pry::AutoBenching
|
2
2
|
require 'pry-auto_benching/pry_command'
|
3
3
|
|
4
|
+
#
|
5
|
+
# MomentList is an Array-like object who cycles its contents
|
6
|
+
# when a max size is reached.
|
7
|
+
#
|
8
|
+
# @api private
|
9
|
+
#
|
10
|
+
MomentList = Class.new do
|
11
|
+
include Enumerable
|
12
|
+
|
13
|
+
def initialize(pry)
|
14
|
+
@pry = pry
|
15
|
+
@ary = []
|
16
|
+
end
|
17
|
+
|
18
|
+
def each
|
19
|
+
@ary.each do |moment|
|
20
|
+
yield moment
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def [](index)
|
25
|
+
@ary[index]
|
26
|
+
end
|
27
|
+
|
28
|
+
def pop
|
29
|
+
@ary.pop
|
30
|
+
end
|
31
|
+
|
32
|
+
def empty?
|
33
|
+
@ary.empty?
|
34
|
+
end
|
35
|
+
|
36
|
+
def <<(other)
|
37
|
+
@ary.pop while @ary.size >= @pry.config.auto_benching.max_history_size
|
38
|
+
@ary << other
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
#
|
43
|
+
# @api private
|
44
|
+
#
|
45
|
+
Moment = Struct.new(:start_timestamp) do
|
46
|
+
attr_accessor :input
|
47
|
+
attr_accessor :duration
|
48
|
+
end
|
49
|
+
|
4
50
|
write_duration = -> (pry, duration) {
|
5
51
|
auto_benching = pry.config.auto_benching
|
6
52
|
if auto_benching.target_display == :prompt
|
@@ -16,64 +62,95 @@ module Pry::AutoBenching
|
|
16
62
|
end
|
17
63
|
}
|
18
64
|
|
19
|
-
|
65
|
+
@moments = Hash.new do |h, pry|
|
66
|
+
h[pry.hash] = MomentList.new(pry)
|
67
|
+
end
|
20
68
|
|
21
|
-
|
69
|
+
@before_eval = ->(_, pry) do
|
22
70
|
clock_type = pry.config.auto_benching.clock_type
|
23
|
-
|
71
|
+
k = @moments.key?(pry.hash) ? pry.hash : pry
|
72
|
+
@moments[k] << Moment.new(Process.clock_gettime(clock_type))
|
24
73
|
end
|
25
74
|
|
26
|
-
|
75
|
+
@after_eval = ->(_, pry) do
|
27
76
|
auto_benching = pry.config.auto_benching
|
28
|
-
|
29
|
-
|
30
|
-
|
77
|
+
moment = @moments[pry.hash][-1]
|
78
|
+
moment.duration = (sprintf "%.2f", Process.clock_gettime(auto_benching.clock_type) - moment.start_timestamp).to_f
|
79
|
+
if auto_benching.display_duration_if.call(pry, moment.duration)
|
80
|
+
moment.input = pry.input_ring.to_a[-1]
|
81
|
+
write_duration.call(pry, moment.duration)
|
31
82
|
else
|
83
|
+
@moments[pry.hash].pop
|
32
84
|
pry.config.forget(:prompt_name)
|
33
85
|
end
|
34
86
|
end
|
35
87
|
|
36
|
-
|
88
|
+
@before_session = ->(_, _, pry) do
|
37
89
|
Pry::AutoBenching.enable(pry) if pry.config.auto_benching.enabled
|
38
90
|
end
|
39
91
|
|
40
|
-
|
41
|
-
|
92
|
+
@after_session = ->(_, _, pry) do
|
93
|
+
@moments.delete(pry.hash)
|
42
94
|
end
|
43
95
|
|
96
|
+
#
|
97
|
+
# Enables benchmarking for the param `pry`.
|
98
|
+
#
|
99
|
+
# @param [Pry] pry
|
100
|
+
# An instance of Pry.
|
101
|
+
#
|
102
|
+
# @return [void]
|
103
|
+
#
|
44
104
|
def self.enable(pry)
|
45
|
-
if not pry.config.hooks.hook_exists? :before_eval,
|
46
|
-
pry.config.hooks.add_hook :before_eval,
|
47
|
-
pry.config.hooks.add_hook :after_eval,
|
48
|
-
pry.config.hooks.add_hook :after_session,
|
105
|
+
if not pry.config.hooks.hook_exists? :before_eval, @before_eval.hash
|
106
|
+
pry.config.hooks.add_hook :before_eval, @before_eval.hash, @before_eval
|
107
|
+
pry.config.hooks.add_hook :after_eval, @after_eval.hash , @after_eval
|
108
|
+
pry.config.hooks.add_hook :after_session, @after_session.hash , @after_session
|
49
109
|
end
|
50
110
|
end
|
51
111
|
|
112
|
+
#
|
113
|
+
# Disables benchmarking for the param `pry`.
|
114
|
+
#
|
115
|
+
# @param [Pry] pry
|
116
|
+
# An instance of Pry.
|
117
|
+
#
|
118
|
+
# @return [void]
|
119
|
+
#
|
52
120
|
def self.disable(pry)
|
53
|
-
pry.config.hooks.delete_hook :before_eval,
|
54
|
-
pry.config.hooks.delete_hook :after_eval ,
|
55
|
-
pry.config.hooks.delete_hook :after_session ,
|
56
|
-
|
121
|
+
pry.config.hooks.delete_hook :before_eval, @before_eval.hash
|
122
|
+
pry.config.hooks.delete_hook :after_eval , @after_eval.hash
|
123
|
+
pry.config.hooks.delete_hook :after_session , @after_session.hash
|
124
|
+
@moments.delete(pry.hash)
|
57
125
|
end
|
58
|
-
end
|
59
126
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
127
|
+
#
|
128
|
+
# @return [Pry::AutoBenching::MomentList]
|
129
|
+
# An Array-like object.
|
130
|
+
#
|
131
|
+
# @api private
|
132
|
+
#
|
133
|
+
def self.moments
|
134
|
+
@moments
|
135
|
+
end
|
136
|
+
|
137
|
+
Pry.configure do |config|
|
138
|
+
config.hooks.add_hook :before_session, @before_session.hash, @before_session
|
139
|
+
config.auto_benching = Pry::Config.from_hash({
|
140
|
+
max_history_size: 70,
|
141
|
+
enabled: true,
|
142
|
+
target_display: :prompt,
|
143
|
+
prompt_color: :green,
|
144
|
+
clock_type: Process::CLOCK_MONOTONIC,
|
145
|
+
display_duration_if: ->(pry, duration) { duration >= 0.01 },
|
146
|
+
output_string: ->(pry, duration) {
|
147
|
+
format("%{TextDesc} %{Duration}s", {
|
148
|
+
:TextDesc => pry.color ?
|
149
|
+
Pry::Helpers::Text.green("pry-auto_benching.rb:") :
|
150
|
+
"pry-auto_benching.rb:",
|
151
|
+
:Duration => sprintf("%.2f", duration)
|
152
|
+
})
|
153
|
+
}
|
154
|
+
})
|
155
|
+
end
|
79
156
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pry-auto_benching.rb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robert Gleeson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-11-
|
11
|
+
date: 2018-11-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pry
|