stackprof-webnav 1.0.2 → 1.0.3
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/.github/workflows/ruby.yml +3 -1
- data/Gemfile.lock +14 -14
- data/lib/stackprof-webnav/public/css/application.css +6 -0
- data/lib/stackprof-webnav/public/lib/string_score.js +78 -0
- data/lib/stackprof-webnav/public/overview.js +29 -0
- data/lib/stackprof-webnav/server.rb +0 -1
- data/lib/stackprof-webnav/version.rb +1 -1
- data/lib/stackprof-webnav/views/overview.haml +8 -2
- data/stackprof-webnav.gemspec +3 -2
- metadata +22 -7
- data/.travis.yml +0 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1b4dd46c0ac72aaee58af286f92444820d29a4e06152981a41c6667c4183aa19
|
4
|
+
data.tar.gz: 74b43d464b781f3f42ef815e21beaab77c7eb9e46b47f2b3233a69519b9aee1e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b4dbb9e1bd18dbedfcee77cced956d2a205094ffb6721c100a8f5bf592fc1a008d91647bcd113eb1ed7d8d89c38e908407c32932b58f764f93ce5503de0104f1
|
7
|
+
data.tar.gz: 21e1289ab6b4170da780cdaefb1d4c8cdf0a63b79f887ed9e5f2330f6f1f733e8fb9bc39ed0820c60ce2518fe6c371ba70a2004f60de8ad0ee8a81b88627f1c8
|
data/.github/workflows/ruby.yml
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,18 +1,18 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
stackprof-webnav (1.0.
|
4
|
+
stackprof-webnav (1.0.3)
|
5
5
|
better_errors (~> 1.1.0)
|
6
6
|
haml (~> 5.1.2)
|
7
7
|
ruby-graphviz (~> 1.2.4)
|
8
|
-
sinatra (~> 2.0
|
9
|
-
sinatra-contrib (~> 2.0
|
8
|
+
sinatra (~> 2.1.0)
|
9
|
+
sinatra-contrib (~> 2.1.0)
|
10
10
|
stackprof (>= 0.2.13)
|
11
|
+
webrick (~> 1.7.0)
|
11
12
|
|
12
13
|
GEM
|
13
14
|
remote: https://rubygems.org/
|
14
15
|
specs:
|
15
|
-
backports (3.21.0)
|
16
16
|
better_errors (1.1.0)
|
17
17
|
coderay (>= 1.0.0)
|
18
18
|
erubis (>= 2.6.6)
|
@@ -29,8 +29,8 @@ GEM
|
|
29
29
|
pry (0.12.2)
|
30
30
|
coderay (~> 1.1.0)
|
31
31
|
method_source (~> 0.9.0)
|
32
|
-
rack (2.
|
33
|
-
rack-protection (2.0
|
32
|
+
rack (2.2.3)
|
33
|
+
rack-protection (2.1.0)
|
34
34
|
rack
|
35
35
|
rack-test (1.1.0)
|
36
36
|
rack (>= 1.0, < 3)
|
@@ -51,22 +51,22 @@ GEM
|
|
51
51
|
rspec-support (3.9.0)
|
52
52
|
ruby-graphviz (1.2.5)
|
53
53
|
rexml
|
54
|
-
ruby2_keywords (0.0.
|
55
|
-
sinatra (2.0
|
54
|
+
ruby2_keywords (0.0.5)
|
55
|
+
sinatra (2.1.0)
|
56
56
|
mustermann (~> 1.0)
|
57
|
-
rack (~> 2.
|
58
|
-
rack-protection (= 2.0
|
57
|
+
rack (~> 2.2)
|
58
|
+
rack-protection (= 2.1.0)
|
59
59
|
tilt (~> 2.0)
|
60
|
-
sinatra-contrib (2.0
|
61
|
-
backports (>= 2.8.2)
|
60
|
+
sinatra-contrib (2.1.0)
|
62
61
|
multi_json
|
63
62
|
mustermann (~> 1.0)
|
64
|
-
rack-protection (= 2.0
|
65
|
-
sinatra (= 2.0
|
63
|
+
rack-protection (= 2.1.0)
|
64
|
+
sinatra (= 2.1.0)
|
66
65
|
tilt (~> 2.0)
|
67
66
|
stackprof (0.2.17)
|
68
67
|
temple (0.8.2)
|
69
68
|
tilt (2.0.10)
|
69
|
+
webrick (1.7.0)
|
70
70
|
|
71
71
|
PLATFORMS
|
72
72
|
ruby
|
@@ -0,0 +1,78 @@
|
|
1
|
+
/*
|
2
|
+
* string_score.js: Quicksilver-like string scoring algorithm.
|
3
|
+
*
|
4
|
+
* Copyright (C) 2009-2011 Joshaven Potter <yourtech@gmail.com>
|
5
|
+
* Copyright (C) 2010-2011 Yesudeep Mangalapilly <yesudeep@gmail.com>
|
6
|
+
* MIT license: http://www.opensource.org/licenses/mit-license.php
|
7
|
+
*
|
8
|
+
* This is a javascript port of the above mentionned, with a tiny change:
|
9
|
+
* it avoids string monkey patch.
|
10
|
+
*/
|
11
|
+
;(function(global) {
|
12
|
+
global.stringScore = (string, abbreviation) => {
|
13
|
+
// Perfect match if the spring equals the abbreviation
|
14
|
+
if (string == abbreviation) return 1.0
|
15
|
+
|
16
|
+
// Initializing variables.
|
17
|
+
let string_length = string.length
|
18
|
+
let abbreviation_length = abbreviation.length
|
19
|
+
let total_character_score = 0
|
20
|
+
|
21
|
+
// Awarded only if the string and the abbreviation have a common prefix.
|
22
|
+
let should_award_common_prefix_bonus = 0
|
23
|
+
|
24
|
+
// # Sum character scores
|
25
|
+
|
26
|
+
// Add up scores for each character in the abbreviation.
|
27
|
+
for (let i = 0, c = abbreviation[i]; i < abbreviation_length; c = abbreviation[++i]) {
|
28
|
+
// Find the index of current character (case-insensitive) in remaining part of string.
|
29
|
+
let index_c_lowercase = string.indexOf(c.toLowerCase())
|
30
|
+
let index_c_uppercase = string.indexOf(c.toUpperCase())
|
31
|
+
let min_index = Math.min(index_c_lowercase, index_c_uppercase)
|
32
|
+
let index_in_string = min_index > -1 ? min_index : Math.max(index_c_lowercase, index_c_uppercase)
|
33
|
+
|
34
|
+
// # Identical Strings
|
35
|
+
// Bail out if current character is not found (case-insensitive) in remaining part of string.
|
36
|
+
if (index_in_string == -1) return 0
|
37
|
+
|
38
|
+
// Set base score for current character.
|
39
|
+
let character_score = 0.1
|
40
|
+
|
41
|
+
|
42
|
+
// # Case-match bonus
|
43
|
+
// If the current abbreviation character has the same case
|
44
|
+
// as that of the character in the string, we add a bonus.
|
45
|
+
if (string[index_in_string] == c) character_score += 0.1
|
46
|
+
|
47
|
+
// # Consecutive character match and common prefix bonuses
|
48
|
+
// Increase the score when each consecutive character of
|
49
|
+
// the abbreviation matches the first character of the
|
50
|
+
// remaining string.
|
51
|
+
if (index_in_string == 0) {
|
52
|
+
character_score += 0.8
|
53
|
+
// String and abbreviation have common prefix, so award bonus.
|
54
|
+
if (i == 0) should_award_common_prefix_bonus = 1
|
55
|
+
}
|
56
|
+
|
57
|
+
// # Acronym bonus
|
58
|
+
// Typing the first character of an acronym is as
|
59
|
+
// though you preceded it with two perfect character
|
60
|
+
// matches.
|
61
|
+
if (string.charAt(index_in_string - 1) == ' ') // TODO: better accro
|
62
|
+
character_score += 0.8 // * Math.min(index_in_string, 5) # Cap bonus at 0.4 * 5
|
63
|
+
|
64
|
+
// Left trim the matched part of the string
|
65
|
+
// (forces sequential matching).
|
66
|
+
string = string.substring(index_in_string + 1, string_length)
|
67
|
+
|
68
|
+
// Add to total character score.
|
69
|
+
total_character_score += character_score
|
70
|
+
}
|
71
|
+
|
72
|
+
let abbreviation_score = total_character_score / abbreviation_length
|
73
|
+
|
74
|
+
let final_score = ((abbreviation_score * (abbreviation_length / string_length)) + abbreviation_score) / 2
|
75
|
+
if (should_award_common_prefix_bonus && final_score + 0.1 < 1) final_score += 0.1
|
76
|
+
return final_score
|
77
|
+
}
|
78
|
+
})(window)
|
@@ -0,0 +1,29 @@
|
|
1
|
+
;(function() {
|
2
|
+
const table = document.getElementsByTagName('table')[0]
|
3
|
+
const input = document.getElementsByClassName('filter')[0]
|
4
|
+
const rows = {}
|
5
|
+
const filterKeys = Array.from(document.querySelectorAll('tr[data-filter-key]')).map(el => {
|
6
|
+
key = el.dataset.filterKey
|
7
|
+
rows[key] = el
|
8
|
+
return key
|
9
|
+
})
|
10
|
+
const scores = {}
|
11
|
+
const computeScores = () => {
|
12
|
+
const searchString = input.value
|
13
|
+
filterKeys.forEach(filterKey => scores[filterKey] = stringScore(filterKey, searchString))
|
14
|
+
}
|
15
|
+
|
16
|
+
const redrawTable = (sorted) => {
|
17
|
+
const newBody = document.createElement('tbody')
|
18
|
+
sorted.forEach(key => newBody.appendChild(rows[key]))
|
19
|
+
table.removeChild(table.getElementsByTagName('tbody')[0])
|
20
|
+
table.appendChild(newBody)
|
21
|
+
}
|
22
|
+
|
23
|
+
input.addEventListener('input', () => {
|
24
|
+
computeScores()
|
25
|
+
redrawTable(
|
26
|
+
filterKeys.filter(k => scores[k] !== 0).sort((a, b) => scores[b] - scores[a])
|
27
|
+
)
|
28
|
+
})
|
29
|
+
})()
|
@@ -25,11 +25,14 @@
|
|
25
25
|
%th %
|
26
26
|
%th Samples
|
27
27
|
%th %
|
28
|
-
%th
|
28
|
+
%th
|
29
|
+
Method
|
30
|
+
%input.filter{:placeholder => "filter methods", :type => "text"}/
|
29
31
|
|
30
32
|
%tbody
|
31
33
|
- @frames.each do |frame|
|
32
|
-
|
34
|
+
- # Filter keys are preprocessed to better match acronyms.
|
35
|
+
%tr{"data-filter-key" => frame[:method].gsub(/[A-Z]/, " \\0").gsub(/[\W_]+/, " ").strip}
|
33
36
|
%td= frame[:total]
|
34
37
|
%td= frame[:total_pct]
|
35
38
|
%td= frame[:samples]
|
@@ -37,3 +40,6 @@
|
|
37
40
|
%td
|
38
41
|
%a{:href => url_for("/method", name: frame[:method])}
|
39
42
|
&= frame[:method]
|
43
|
+
|
44
|
+
%script{src: "lib/string_score.js"}
|
45
|
+
%script{src: "overview.js"}
|
data/stackprof-webnav.gemspec
CHANGED
@@ -21,12 +21,13 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.bindir = 'bin'
|
22
22
|
spec.executables << 'stackprof-webnav'
|
23
23
|
|
24
|
-
spec.add_dependency "sinatra", "~> 2.0
|
24
|
+
spec.add_dependency "sinatra", "~> 2.1.0"
|
25
25
|
spec.add_dependency "haml", "~> 5.1.2"
|
26
26
|
spec.add_dependency "stackprof", ">= 0.2.13"
|
27
27
|
spec.add_dependency "better_errors", "~> 1.1.0"
|
28
28
|
spec.add_dependency "ruby-graphviz", "~> 1.2.4"
|
29
|
-
spec.add_dependency "sinatra-contrib", "~> 2.0
|
29
|
+
spec.add_dependency "sinatra-contrib", "~> 2.1.0"
|
30
|
+
spec.add_dependency "webrick", "~> 1.7.0"
|
30
31
|
spec.add_development_dependency "bundler", "~> 2.2"
|
31
32
|
spec.add_development_dependency "rake", "~> 10.1"
|
32
33
|
spec.add_development_dependency "rspec", "~> 3.9.0"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: stackprof-webnav
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrei Lisnic
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-08-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sinatra
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 2.0
|
19
|
+
version: 2.1.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 2.0
|
26
|
+
version: 2.1.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: haml
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -86,14 +86,28 @@ dependencies:
|
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: 2.0
|
89
|
+
version: 2.1.0
|
90
90
|
type: :runtime
|
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.0
|
96
|
+
version: 2.1.0
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: webrick
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 1.7.0
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 1.7.0
|
97
111
|
- !ruby/object:Gem::Dependency
|
98
112
|
name: bundler
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -160,7 +174,6 @@ extra_rdoc_files: []
|
|
160
174
|
files:
|
161
175
|
- ".github/workflows/ruby.yml"
|
162
176
|
- ".gitignore"
|
163
|
-
- ".travis.yml"
|
164
177
|
- Gemfile
|
165
178
|
- Gemfile.lock
|
166
179
|
- LICENSE.txt
|
@@ -176,6 +189,8 @@ files:
|
|
176
189
|
- lib/stackprof-webnav/public/css/foundation.min.css
|
177
190
|
- lib/stackprof-webnav/public/css/normalize.css
|
178
191
|
- lib/stackprof-webnav/public/flamegraph.js
|
192
|
+
- lib/stackprof-webnav/public/lib/string_score.js
|
193
|
+
- lib/stackprof-webnav/public/overview.js
|
179
194
|
- lib/stackprof-webnav/server.rb
|
180
195
|
- lib/stackprof-webnav/version.rb
|
181
196
|
- lib/stackprof-webnav/views/error.haml
|
data/.travis.yml
DELETED