rack-mount 0.4.0 → 0.4.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.
@@ -35,7 +35,7 @@ module Rack::Mount
|
|
35
35
|
|
36
36
|
def process_key(requirements, method, requirement)
|
37
37
|
if requirement.is_a?(Regexp)
|
38
|
-
expression = parse_regexp(requirement)
|
38
|
+
expression = Utils.parse_regexp(requirement)
|
39
39
|
expression = expression.reject { |e| e.is_a?(Reginald::Anchor) }
|
40
40
|
|
41
41
|
if expression.is_a?(Reginald::Expression) && expression.literal?
|
@@ -50,19 +50,13 @@ module Rack::Mount
|
|
50
50
|
@report ||= begin
|
51
51
|
possible_keys.each { |keys| keys.each_pair { |key, _| @key_frequency << key } }
|
52
52
|
return [] if @key_frequency.count <= 1
|
53
|
-
@key_frequency.
|
53
|
+
@key_frequency.keys_above_mean
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
57
57
|
def expire!
|
58
58
|
@possible_keys = @report = nil
|
59
59
|
end
|
60
|
-
|
61
|
-
private
|
62
|
-
def parse_regexp(regexp)
|
63
|
-
@parse_regexp_cache ||= {}
|
64
|
-
@parse_regexp_cache[regexp] ||= Utils.parse_regexp(regexp).freeze
|
65
|
-
end
|
66
60
|
end
|
67
61
|
end
|
68
62
|
end
|
@@ -6,20 +6,56 @@ module Rack::Mount
|
|
6
6
|
def initialize
|
7
7
|
@count = 0
|
8
8
|
super(0)
|
9
|
+
expire_caches!
|
9
10
|
end
|
10
11
|
|
11
12
|
def <<(value)
|
12
13
|
@count += 1
|
13
14
|
self[value] += 1 if value
|
15
|
+
expire_caches!
|
16
|
+
self
|
14
17
|
end
|
15
18
|
|
16
|
-
def
|
17
|
-
|
18
|
-
values.reverse!
|
19
|
-
values = values.select { |_, value| value >= count / size }
|
20
|
-
values.map! { |key, _| key }
|
21
|
-
values
|
19
|
+
def sorted_by_frequency
|
20
|
+
sort_by { |_, value| value }.reverse!
|
22
21
|
end
|
22
|
+
|
23
|
+
def max
|
24
|
+
@max ||= values.max || 0
|
25
|
+
end
|
26
|
+
|
27
|
+
def min
|
28
|
+
@min ||= values.min || 0
|
29
|
+
end
|
30
|
+
|
31
|
+
def mid_range
|
32
|
+
@mid_range ||= calculate_mid_range
|
33
|
+
end
|
34
|
+
|
35
|
+
def mean
|
36
|
+
@mean ||= calculate_mean
|
37
|
+
end
|
38
|
+
|
39
|
+
def keys_above_mean
|
40
|
+
@keys_above_mean ||= compute_keys_above_mean
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
def calculate_mid_range
|
45
|
+
(max + min) / 2
|
46
|
+
end
|
47
|
+
|
48
|
+
def calculate_mean
|
49
|
+
count / size
|
50
|
+
end
|
51
|
+
|
52
|
+
def compute_keys_above_mean
|
53
|
+
sorted_by_frequency.select { |_, value| value >= mean }.map! { |key, _| key }
|
54
|
+
end
|
55
|
+
|
56
|
+
def expire_caches!
|
57
|
+
@max = @min = @mid_range = @mean = @keys_above_mean = nil
|
58
|
+
end
|
23
59
|
end
|
24
60
|
end
|
25
61
|
end
|
@@ -39,7 +39,7 @@ module Rack::Mount
|
|
39
39
|
end
|
40
40
|
|
41
41
|
def separators(key)
|
42
|
-
@boundaries[key].
|
42
|
+
@boundaries[key].keys_above_mean
|
43
43
|
end
|
44
44
|
|
45
45
|
def process_key(requirements, method, requirement)
|
@@ -57,7 +57,7 @@ module Rack::Mount
|
|
57
57
|
def analyze_capture_boundaries(regexp, boundaries) #:nodoc:
|
58
58
|
return boundaries unless regexp.is_a?(Regexp)
|
59
59
|
|
60
|
-
parts = parse_regexp(regexp)
|
60
|
+
parts = Utils.parse_regexp(regexp)
|
61
61
|
parts.each_with_index do |part, index|
|
62
62
|
if part.is_a?(Reginald::Group)
|
63
63
|
if index > 0
|
@@ -88,7 +88,7 @@ module Rack::Mount
|
|
88
88
|
def generate_split_keys(regexp, separators) #:nodoc:
|
89
89
|
segments = []
|
90
90
|
buf = nil
|
91
|
-
parts = parse_regexp(regexp)
|
91
|
+
parts = Utils.parse_regexp(regexp)
|
92
92
|
parts.each_with_index do |part, index|
|
93
93
|
case part
|
94
94
|
when Reginald::Anchor
|
data/lib/rack/mount/utils.rb
CHANGED
@@ -99,6 +99,12 @@ module Rack::Mount
|
|
99
99
|
module_function :normalize_extended_expression
|
100
100
|
|
101
101
|
def parse_regexp(regexp)
|
102
|
+
cache = Thread.current[:rack_mount_utils_parse_regexp_cache] ||= {}
|
103
|
+
|
104
|
+
if expression = cache[regexp]
|
105
|
+
return expression
|
106
|
+
end
|
107
|
+
|
102
108
|
unless regexp.is_a?(RegexpWithNamedGroups)
|
103
109
|
regexp = RegexpWithNamedGroups.new(regexp)
|
104
110
|
end
|
@@ -119,6 +125,7 @@ module Rack::Mount
|
|
119
125
|
tag_captures.call(expression)
|
120
126
|
end
|
121
127
|
|
128
|
+
cache[regexp] = expression.freeze
|
122
129
|
expression
|
123
130
|
rescue Racc::ParseError, Reginald::Parser::ScanError
|
124
131
|
[]
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rack-mount
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joshua Peek
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
12
|
+
date: 2010-01-06 00:00:00 -06:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|