rblineprof-report 0.0.1
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 +7 -0
- data/lib/rblineprof-report.rb +7 -0
- data/lib/rblineprof/report.rb +34 -0
- data/lib/rblineprof/report/sample.rb +34 -0
- data/lib/rblineprof/report/source.rb +83 -0
- metadata +76 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 43d21ba85e97afcddcc2fa4176fe948548e7c1ff
|
4
|
+
data.tar.gz: 348b67b3b1a92b1ab7caae17132ba7b3e8731def
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 67dae2a435234c504a2b9c3a127a1ef03efc84853f19de8a44cdcceadc2ff169fb9151cd3951136d2630c1cd35ad2e618744a7eb5b9b3fa98c8adc8aca368300
|
7
|
+
data.tar.gz: 1506ac88e3fd5933da6bdce273afe8664aa4c6c0bdc3df724c9b9c39c834f0cfbe73da797a243e164dc074028a44f5ad77754b198eb1ab48141e80f927af8332
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'rblineprof'
|
2
|
+
require 'term/ansicolor'
|
3
|
+
require 'rblineprof/report/sample'
|
4
|
+
require 'rblineprof/report/source'
|
5
|
+
|
6
|
+
module LineProf
|
7
|
+
|
8
|
+
CONTEXT = 0
|
9
|
+
NOMINAL = 1
|
10
|
+
WARNING = 2
|
11
|
+
CRITICAL = 3
|
12
|
+
|
13
|
+
class Report
|
14
|
+
def self.report(profile, options = {})
|
15
|
+
self.new.report(profile, options)
|
16
|
+
end
|
17
|
+
|
18
|
+
# options
|
19
|
+
# :context
|
20
|
+
# :thresholds
|
21
|
+
def report(profile, options = {})
|
22
|
+
puts Term::ANSIColor.blue("\n[LineProf] #{'=' * 63}") + "\n\n" +
|
23
|
+
format_profile(profile, options) + "\n"
|
24
|
+
end
|
25
|
+
|
26
|
+
def format_profile(profile, options = {})
|
27
|
+
sources = profile.map do |filename, samples|
|
28
|
+
Source.new filename, samples, options
|
29
|
+
end
|
30
|
+
|
31
|
+
sources.map(&:format).compact.join "\n"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module LineProf
|
2
|
+
class Report
|
3
|
+
class Sample < Struct.new :ms, :calls, :line, :code, :level
|
4
|
+
|
5
|
+
def format colorize = true
|
6
|
+
formatted = if level == CONTEXT
|
7
|
+
sprintf " | % 3i %s", line, code
|
8
|
+
else
|
9
|
+
sprintf "% 6.1fms %5i | % 3i %s", ms, calls, line, code
|
10
|
+
end
|
11
|
+
|
12
|
+
return formatted unless colorize
|
13
|
+
|
14
|
+
case level
|
15
|
+
when CRITICAL
|
16
|
+
color.red formatted
|
17
|
+
when WARNING
|
18
|
+
color.yellow formatted
|
19
|
+
when NOMINAL
|
20
|
+
color.white formatted
|
21
|
+
else # CONTEXT
|
22
|
+
color.intense_black formatted
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def color
|
29
|
+
Term::ANSIColor
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
module LineProf
|
2
|
+
class Report
|
3
|
+
class Source
|
4
|
+
|
5
|
+
attr_reader :file_name, :raw_samples, :options
|
6
|
+
|
7
|
+
def initialize file_name, raw_samples, options = {}
|
8
|
+
@file_name, @raw_samples, @options = file_name, raw_samples, options
|
9
|
+
end
|
10
|
+
|
11
|
+
def format colorize = true
|
12
|
+
return nil if samples.empty?
|
13
|
+
|
14
|
+
formatted = file_name.sub(Dir.pwd + '/', '') + "\n"
|
15
|
+
|
16
|
+
prev_line = samples.first.line - 1
|
17
|
+
samples.each do |sample|
|
18
|
+
if sample.line != prev_line + 1
|
19
|
+
formatted << color.intense_black(' ' * 14 + '.' * 7) + "\n"
|
20
|
+
end
|
21
|
+
prev_line = sample.line
|
22
|
+
|
23
|
+
formatted << sample.format
|
24
|
+
end
|
25
|
+
|
26
|
+
formatted
|
27
|
+
end
|
28
|
+
|
29
|
+
def samples
|
30
|
+
@samples ||= begin
|
31
|
+
parsed = []
|
32
|
+
|
33
|
+
raw_samples.each_with_index do |sample, line|
|
34
|
+
next if line == 0 # drop file info
|
35
|
+
|
36
|
+
ms = sample[0] / 1000.0
|
37
|
+
calls = sample[2]
|
38
|
+
|
39
|
+
abnormal = ms >= thresholds[NOMINAL]
|
40
|
+
near_abnormal = (line-context..line+context).any? do |near|
|
41
|
+
near = [1, near].max
|
42
|
+
next unless raw_samples[near]
|
43
|
+
(raw_samples[near][0] / 1000.0) >= thresholds[NOMINAL]
|
44
|
+
end
|
45
|
+
|
46
|
+
next unless abnormal or near_abnormal
|
47
|
+
|
48
|
+
threshold = thresholds.invert.detect { |th, _| ms > th }
|
49
|
+
level = threshold ? threshold.last : CONTEXT
|
50
|
+
|
51
|
+
next unless code = source_lines[line - 1]
|
52
|
+
parsed << Sample.new(ms, calls, line, code, level)
|
53
|
+
end
|
54
|
+
|
55
|
+
parsed
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def source_lines
|
60
|
+
@source_lines ||= ::File.open(file_name, 'r').to_a
|
61
|
+
end
|
62
|
+
|
63
|
+
private
|
64
|
+
|
65
|
+
def color
|
66
|
+
Term::ANSIColor
|
67
|
+
end
|
68
|
+
|
69
|
+
def context
|
70
|
+
options.fetch :context, 2
|
71
|
+
end
|
72
|
+
|
73
|
+
def thresholds
|
74
|
+
@thresholds ||= {
|
75
|
+
CRITICAL => 50,
|
76
|
+
WARNING => 5,
|
77
|
+
NOMINAL => 0.2
|
78
|
+
}.merge(options.fetch :thresholds, {})
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
metadata
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rblineprof-report
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Naotoshi Seo
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-11-04 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: term-ansicolor
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.3'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
description: Format and print the result of rblineprof (github.com/tmm1/rblineprof)
|
42
|
+
email:
|
43
|
+
- sonots@gmail.com
|
44
|
+
executables: []
|
45
|
+
extensions: []
|
46
|
+
extra_rdoc_files: []
|
47
|
+
files:
|
48
|
+
- lib/rblineprof-report.rb
|
49
|
+
- lib/rblineprof/report.rb
|
50
|
+
- lib/rblineprof/report/sample.rb
|
51
|
+
- lib/rblineprof/report/source.rb
|
52
|
+
homepage: https://github.com/sonots/rblineprof-report
|
53
|
+
licenses:
|
54
|
+
- MIT
|
55
|
+
metadata: {}
|
56
|
+
post_install_message:
|
57
|
+
rdoc_options: []
|
58
|
+
require_paths:
|
59
|
+
- lib
|
60
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
61
|
+
requirements:
|
62
|
+
- - ">="
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: '0'
|
65
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
requirements: []
|
71
|
+
rubyforge_project:
|
72
|
+
rubygems_version: 2.2.2
|
73
|
+
signing_key:
|
74
|
+
specification_version: 4
|
75
|
+
summary: Format and print the result of rblineprof (github.com/tmm1/rblineprof)
|
76
|
+
test_files: []
|