actionpack 4.2.10 → 6.1.3.2
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of actionpack might be problematic. Click here for more details.
- checksums.yaml +5 -5
- data/CHANGELOG.md +291 -479
- data/MIT-LICENSE +1 -1
- data/README.rdoc +9 -9
- data/lib/abstract_controller/asset_paths.rb +2 -0
- data/lib/abstract_controller/base.rb +81 -51
- data/lib/{action_controller → abstract_controller}/caching/fragments.rb +64 -17
- data/lib/abstract_controller/caching.rb +66 -0
- data/lib/abstract_controller/callbacks.rb +61 -33
- data/lib/abstract_controller/collector.rb +9 -13
- data/lib/abstract_controller/error.rb +6 -0
- data/lib/abstract_controller/helpers.rb +115 -99
- data/lib/abstract_controller/logger.rb +2 -0
- data/lib/abstract_controller/railties/routes_helpers.rb +21 -3
- data/lib/abstract_controller/rendering.rb +48 -47
- data/lib/abstract_controller/translation.rb +17 -8
- data/lib/abstract_controller/url_for.rb +2 -0
- data/lib/abstract_controller.rb +13 -5
- data/lib/action_controller/api/api_rendering.rb +16 -0
- data/lib/action_controller/api.rb +150 -0
- data/lib/action_controller/base.rb +29 -24
- data/lib/action_controller/caching.rb +12 -57
- data/lib/action_controller/form_builder.rb +50 -0
- data/lib/action_controller/log_subscriber.rb +17 -19
- data/lib/action_controller/metal/basic_implicit_render.rb +13 -0
- data/lib/action_controller/metal/conditional_get.rb +134 -46
- data/lib/action_controller/metal/content_security_policy.rb +51 -0
- data/lib/action_controller/metal/cookies.rb +6 -4
- data/lib/action_controller/metal/data_streaming.rb +30 -50
- data/lib/action_controller/metal/default_headers.rb +17 -0
- data/lib/action_controller/metal/etag_with_flash.rb +18 -0
- data/lib/action_controller/metal/etag_with_template_digest.rb +21 -16
- data/lib/action_controller/metal/exceptions.rb +63 -15
- data/lib/action_controller/metal/flash.rb +9 -8
- data/lib/action_controller/metal/head.rb +26 -21
- data/lib/action_controller/metal/helpers.rb +37 -18
- data/lib/action_controller/metal/http_authentication.rb +81 -73
- data/lib/action_controller/metal/implicit_render.rb +53 -9
- data/lib/action_controller/metal/instrumentation.rb +32 -35
- data/lib/action_controller/metal/live.rb +102 -120
- data/lib/action_controller/metal/logging.rb +20 -0
- data/lib/action_controller/metal/mime_responds.rb +49 -47
- data/lib/action_controller/metal/parameter_encoding.rb +82 -0
- data/lib/action_controller/metal/params_wrapper.rb +83 -66
- data/lib/action_controller/metal/permissions_policy.rb +46 -0
- data/lib/action_controller/metal/redirecting.rb +53 -32
- data/lib/action_controller/metal/renderers.rb +87 -44
- data/lib/action_controller/metal/rendering.rb +77 -50
- data/lib/action_controller/metal/request_forgery_protection.rb +267 -103
- data/lib/action_controller/metal/rescue.rb +10 -17
- data/lib/action_controller/metal/streaming.rb +12 -11
- data/lib/action_controller/metal/strong_parameters.rb +714 -186
- data/lib/action_controller/metal/testing.rb +2 -17
- data/lib/action_controller/metal/url_for.rb +19 -10
- data/lib/action_controller/metal.rb +104 -87
- data/lib/action_controller/railtie.rb +28 -10
- data/lib/action_controller/railties/helpers.rb +3 -1
- data/lib/action_controller/renderer.rb +141 -0
- data/lib/action_controller/template_assertions.rb +11 -0
- data/lib/action_controller/test_case.rb +296 -422
- data/lib/action_controller.rb +34 -23
- data/lib/action_dispatch/http/cache.rb +107 -56
- data/lib/action_dispatch/http/content_disposition.rb +45 -0
- data/lib/action_dispatch/http/content_security_policy.rb +286 -0
- data/lib/action_dispatch/http/filter_parameters.rb +32 -25
- data/lib/action_dispatch/http/filter_redirect.rb +10 -12
- data/lib/action_dispatch/http/headers.rb +55 -22
- data/lib/action_dispatch/http/mime_negotiation.rb +82 -50
- data/lib/action_dispatch/http/mime_type.rb +153 -121
- data/lib/action_dispatch/http/mime_types.rb +20 -6
- data/lib/action_dispatch/http/parameters.rb +90 -40
- data/lib/action_dispatch/http/permissions_policy.rb +173 -0
- data/lib/action_dispatch/http/rack_cache.rb +2 -0
- data/lib/action_dispatch/http/request.rb +226 -121
- data/lib/action_dispatch/http/response.rb +248 -113
- data/lib/action_dispatch/http/upload.rb +21 -7
- data/lib/action_dispatch/http/url.rb +182 -100
- data/lib/action_dispatch/journey/formatter.rb +90 -43
- data/lib/action_dispatch/journey/gtg/builder.rb +28 -41
- data/lib/action_dispatch/journey/gtg/simulator.rb +11 -16
- data/lib/action_dispatch/journey/gtg/transition_table.rb +23 -21
- data/lib/action_dispatch/journey/nfa/dot.rb +3 -14
- data/lib/action_dispatch/journey/nodes/node.rb +29 -15
- data/lib/action_dispatch/journey/parser.rb +17 -16
- data/lib/action_dispatch/journey/parser.y +4 -3
- data/lib/action_dispatch/journey/parser_extras.rb +12 -4
- data/lib/action_dispatch/journey/path/pattern.rb +58 -54
- data/lib/action_dispatch/journey/route.rb +100 -32
- data/lib/action_dispatch/journey/router/utils.rb +29 -18
- data/lib/action_dispatch/journey/router.rb +55 -51
- data/lib/action_dispatch/journey/routes.rb +17 -17
- data/lib/action_dispatch/journey/scanner.rb +26 -17
- data/lib/action_dispatch/journey/visitors.rb +98 -54
- data/lib/action_dispatch/journey.rb +5 -5
- data/lib/action_dispatch/middleware/actionable_exceptions.rb +46 -0
- data/lib/action_dispatch/middleware/callbacks.rb +3 -6
- data/lib/action_dispatch/middleware/cookies.rb +347 -217
- data/lib/action_dispatch/middleware/debug_exceptions.rb +135 -63
- data/lib/action_dispatch/middleware/debug_locks.rb +124 -0
- data/lib/action_dispatch/middleware/debug_view.rb +66 -0
- data/lib/action_dispatch/middleware/exception_wrapper.rb +115 -71
- data/lib/action_dispatch/middleware/executor.rb +21 -0
- data/lib/action_dispatch/middleware/flash.rb +78 -54
- data/lib/action_dispatch/middleware/host_authorization.rb +130 -0
- data/lib/action_dispatch/middleware/public_exceptions.rb +32 -27
- data/lib/action_dispatch/middleware/reloader.rb +5 -91
- data/lib/action_dispatch/middleware/remote_ip.rb +53 -45
- data/lib/action_dispatch/middleware/request_id.rb +17 -10
- data/lib/action_dispatch/middleware/session/abstract_store.rb +41 -26
- data/lib/action_dispatch/middleware/session/cache_store.rb +24 -14
- data/lib/action_dispatch/middleware/session/cookie_store.rb +74 -75
- data/lib/action_dispatch/middleware/session/mem_cache_store.rb +8 -2
- data/lib/action_dispatch/middleware/show_exceptions.rb +28 -23
- data/lib/action_dispatch/middleware/ssl.rb +118 -35
- data/lib/action_dispatch/middleware/stack.rb +82 -41
- data/lib/action_dispatch/middleware/static.rb +156 -89
- data/lib/action_dispatch/middleware/templates/rescues/_actions.html.erb +13 -0
- data/lib/action_dispatch/middleware/templates/rescues/_actions.text.erb +0 -0
- data/lib/action_dispatch/middleware/templates/rescues/_message_and_suggestions.html.erb +22 -0
- data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb +4 -14
- data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.text.erb +1 -1
- data/lib/action_dispatch/middleware/templates/rescues/{_source.erb → _source.html.erb} +4 -2
- data/lib/action_dispatch/middleware/templates/rescues/_source.text.erb +8 -0
- data/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb +45 -35
- data/lib/action_dispatch/middleware/templates/rescues/blocked_host.html.erb +7 -0
- data/lib/action_dispatch/middleware/templates/rescues/blocked_host.text.erb +5 -0
- data/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb +23 -4
- data/lib/action_dispatch/middleware/templates/rescues/diagnostics.text.erb +1 -1
- data/lib/action_dispatch/middleware/templates/rescues/invalid_statement.html.erb +24 -0
- data/lib/action_dispatch/middleware/templates/rescues/invalid_statement.text.erb +15 -0
- data/lib/action_dispatch/middleware/templates/rescues/layout.erb +105 -8
- data/lib/action_dispatch/middleware/templates/rescues/missing_exact_template.html.erb +19 -0
- data/lib/action_dispatch/middleware/templates/rescues/missing_exact_template.text.erb +3 -0
- data/lib/action_dispatch/middleware/templates/rescues/missing_template.html.erb +2 -2
- data/lib/action_dispatch/middleware/templates/rescues/routing_error.html.erb +1 -1
- data/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb +3 -3
- data/lib/action_dispatch/middleware/templates/rescues/template_error.text.erb +1 -1
- data/lib/action_dispatch/middleware/templates/rescues/unknown_action.html.erb +1 -1
- data/lib/action_dispatch/middleware/templates/routes/_route.html.erb +4 -4
- data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +87 -64
- data/lib/action_dispatch/railtie.rb +27 -13
- data/lib/action_dispatch/request/session.rb +109 -61
- data/lib/action_dispatch/request/utils.rb +90 -23
- data/lib/action_dispatch/routing/endpoint.rb +9 -2
- data/lib/action_dispatch/routing/inspector.rb +141 -102
- data/lib/action_dispatch/routing/mapper.rb +811 -473
- data/lib/action_dispatch/routing/polymorphic_routes.rb +167 -143
- data/lib/action_dispatch/routing/redirection.rb +37 -27
- data/lib/action_dispatch/routing/route_set.rb +363 -331
- data/lib/action_dispatch/routing/routes_proxy.rb +32 -5
- data/lib/action_dispatch/routing/url_for.rb +66 -26
- data/lib/action_dispatch/routing.rb +36 -36
- data/lib/action_dispatch/system_test_case.rb +190 -0
- data/lib/action_dispatch/system_testing/browser.rb +86 -0
- data/lib/action_dispatch/system_testing/driver.rb +67 -0
- data/lib/action_dispatch/system_testing/server.rb +31 -0
- data/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb +138 -0
- data/lib/action_dispatch/system_testing/test_helpers/setup_and_teardown.rb +29 -0
- data/lib/action_dispatch/testing/assertion_response.rb +46 -0
- data/lib/action_dispatch/testing/assertions/response.rb +44 -22
- data/lib/action_dispatch/testing/assertions/routing.rb +47 -31
- data/lib/action_dispatch/testing/assertions.rb +6 -4
- data/lib/action_dispatch/testing/integration.rb +391 -220
- data/lib/action_dispatch/testing/request_encoder.rb +55 -0
- data/lib/action_dispatch/testing/test_process.rb +53 -22
- data/lib/action_dispatch/testing/test_request.rb +27 -34
- data/lib/action_dispatch/testing/test_response.rb +11 -11
- data/lib/action_dispatch.rb +35 -21
- data/lib/action_pack/gem_version.rb +6 -4
- data/lib/action_pack/version.rb +3 -1
- data/lib/action_pack.rb +4 -2
- metadata +78 -49
- data/lib/action_controller/metal/force_ssl.rb +0 -97
- data/lib/action_controller/metal/hide_actions.rb +0 -40
- data/lib/action_controller/metal/rack_delegation.rb +0 -32
- data/lib/action_controller/middleware.rb +0 -39
- data/lib/action_controller/model_naming.rb +0 -12
- data/lib/action_dispatch/http/parameter_filter.rb +0 -72
- data/lib/action_dispatch/journey/backwards.rb +0 -5
- data/lib/action_dispatch/journey/nfa/builder.rb +0 -76
- data/lib/action_dispatch/journey/nfa/simulator.rb +0 -47
- data/lib/action_dispatch/journey/nfa/transition_table.rb +0 -163
- data/lib/action_dispatch/journey/router/strexp.rb +0 -27
- data/lib/action_dispatch/middleware/params_parser.rb +0 -60
- data/lib/action_dispatch/testing/assertions/dom.rb +0 -3
- data/lib/action_dispatch/testing/assertions/selector.rb +0 -3
- data/lib/action_dispatch/testing/assertions/tag.rb +0 -3
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "action_dispatch/journey/gtg/transition_table"
|
2
4
|
|
3
5
|
module ActionDispatch
|
4
6
|
module Journey # :nodoc:
|
@@ -11,45 +13,44 @@ module ActionDispatch
|
|
11
13
|
def initialize(root)
|
12
14
|
@root = root
|
13
15
|
@ast = Nodes::Cat.new root, DUMMY
|
14
|
-
@followpos =
|
16
|
+
@followpos = build_followpos
|
15
17
|
end
|
16
18
|
|
17
19
|
def transition_table
|
18
20
|
dtrans = TransitionTable.new
|
19
|
-
marked = {}
|
20
|
-
state_id = Hash.new { |h,k| h[k] = h.length }
|
21
|
+
marked = {}.compare_by_identity
|
22
|
+
state_id = Hash.new { |h, k| h[k] = h.length }.compare_by_identity
|
23
|
+
dstates = [firstpos(root)]
|
21
24
|
|
22
|
-
start = firstpos(root)
|
23
|
-
dstates = [start]
|
24
25
|
until dstates.empty?
|
25
26
|
s = dstates.shift
|
26
27
|
next if marked[s]
|
27
28
|
marked[s] = true # mark s
|
28
29
|
|
29
30
|
s.group_by { |state| symbol(state) }.each do |sym, ps|
|
30
|
-
u = ps.flat_map { |l| followpos
|
31
|
+
u = ps.flat_map { |l| @followpos[l] }
|
31
32
|
next if u.empty?
|
32
33
|
|
33
|
-
|
34
|
-
from = state_id[s]
|
35
|
-
to = state_id[Object.new]
|
36
|
-
dtrans[from, to] = sym
|
34
|
+
from = state_id[s]
|
37
35
|
|
36
|
+
if u.all? { |pos| pos == DUMMY }
|
37
|
+
to = state_id[Object.new]
|
38
|
+
dtrans[from, to] = sym
|
38
39
|
dtrans.add_accepting(to)
|
40
|
+
|
39
41
|
ps.each { |state| dtrans.add_memo(to, state.memo) }
|
40
42
|
else
|
41
|
-
|
43
|
+
to = state_id[u]
|
44
|
+
dtrans[from, to] = sym
|
42
45
|
|
43
46
|
if u.include?(DUMMY)
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
dtrans.add_memo(to, accepting_state.memo)
|
50
|
-
}
|
47
|
+
ps.each do |state|
|
48
|
+
if @followpos[state].include?(DUMMY)
|
49
|
+
dtrans.add_memo(to, state.memo)
|
50
|
+
end
|
51
|
+
end
|
51
52
|
|
52
|
-
dtrans.add_accepting(
|
53
|
+
dtrans.add_accepting(to)
|
53
54
|
end
|
54
55
|
end
|
55
56
|
|
@@ -75,7 +76,7 @@ module ActionDispatch
|
|
75
76
|
when Nodes::Unary
|
76
77
|
nullable?(node.left)
|
77
78
|
else
|
78
|
-
raise ArgumentError,
|
79
|
+
raise ArgumentError, "unknown nullable: %s" % node.class.name
|
79
80
|
end
|
80
81
|
end
|
81
82
|
|
@@ -90,13 +91,13 @@ module ActionDispatch
|
|
90
91
|
firstpos(node.left)
|
91
92
|
end
|
92
93
|
when Nodes::Or
|
93
|
-
node.children.flat_map { |c| firstpos(c) }.uniq
|
94
|
+
node.children.flat_map { |c| firstpos(c) }.tap(&:uniq!)
|
94
95
|
when Nodes::Unary
|
95
96
|
firstpos(node.left)
|
96
97
|
when Nodes::Terminal
|
97
98
|
nullable?(node) ? [] : [node]
|
98
99
|
else
|
99
|
-
raise ArgumentError,
|
100
|
+
raise ArgumentError, "unknown firstpos: %s" % node.class.name
|
100
101
|
end
|
101
102
|
end
|
102
103
|
|
@@ -105,7 +106,7 @@ module ActionDispatch
|
|
105
106
|
when Nodes::Star
|
106
107
|
firstpos(node.left)
|
107
108
|
when Nodes::Or
|
108
|
-
node.children.flat_map { |c| lastpos(c) }.uniq
|
109
|
+
node.children.flat_map { |c| lastpos(c) }.tap(&:uniq!)
|
109
110
|
when Nodes::Cat
|
110
111
|
if nullable?(node.right)
|
111
112
|
lastpos(node.left) | lastpos(node.right)
|
@@ -117,22 +118,13 @@ module ActionDispatch
|
|
117
118
|
when Nodes::Unary
|
118
119
|
lastpos(node.left)
|
119
120
|
else
|
120
|
-
raise ArgumentError,
|
121
|
+
raise ArgumentError, "unknown lastpos: %s" % node.class.name
|
121
122
|
end
|
122
123
|
end
|
123
124
|
|
124
|
-
def followpos(node)
|
125
|
-
followpos_table[node]
|
126
|
-
end
|
127
|
-
|
128
125
|
private
|
129
|
-
|
130
|
-
def followpos_table
|
131
|
-
@followpos ||= build_followpos
|
132
|
-
end
|
133
|
-
|
134
126
|
def build_followpos
|
135
|
-
table = Hash.new { |h, k| h[k] = [] }
|
127
|
+
table = Hash.new { |h, k| h[k] = [] }.compare_by_identity
|
136
128
|
@ast.each do |n|
|
137
129
|
case n
|
138
130
|
when Nodes::Cat
|
@@ -149,12 +141,7 @@ module ActionDispatch
|
|
149
141
|
end
|
150
142
|
|
151
143
|
def symbol(edge)
|
152
|
-
|
153
|
-
when Journey::Nodes::Symbol
|
154
|
-
edge.regexp
|
155
|
-
else
|
156
|
-
edge.left
|
157
|
-
end
|
144
|
+
edge.symbol? ? edge.regexp : edge.left
|
158
145
|
end
|
159
146
|
end
|
160
147
|
end
|
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "strscan"
|
2
4
|
|
3
5
|
module ActionDispatch
|
4
6
|
module Journey # :nodoc:
|
@@ -12,34 +14,27 @@ module ActionDispatch
|
|
12
14
|
end
|
13
15
|
|
14
16
|
class Simulator # :nodoc:
|
17
|
+
INITIAL_STATE = [0].freeze
|
18
|
+
|
15
19
|
attr_reader :tt
|
16
20
|
|
17
21
|
def initialize(transition_table)
|
18
22
|
@tt = transition_table
|
19
23
|
end
|
20
24
|
|
21
|
-
def simulate(string)
|
22
|
-
ms = memos(string) { return }
|
23
|
-
MatchData.new(ms)
|
24
|
-
end
|
25
|
-
|
26
|
-
alias :=~ :simulate
|
27
|
-
alias :match :simulate
|
28
|
-
|
29
25
|
def memos(string)
|
30
26
|
input = StringScanner.new(string)
|
31
|
-
state =
|
27
|
+
state = INITIAL_STATE
|
28
|
+
|
32
29
|
while sym = input.scan(%r([/.?]|[^/.?]+))
|
33
30
|
state = tt.move(state, sym)
|
34
31
|
end
|
35
32
|
|
36
|
-
acceptance_states = state.
|
37
|
-
tt.accepting?
|
38
|
-
|
39
|
-
|
40
|
-
return yield if acceptance_states.empty?
|
33
|
+
acceptance_states = state.each_with_object([]) do |s, memos|
|
34
|
+
memos.concat(tt.memo(s)) if tt.accepting?(s)
|
35
|
+
end
|
41
36
|
|
42
|
-
acceptance_states.
|
37
|
+
acceptance_states.empty? ? yield : acceptance_states
|
43
38
|
end
|
44
39
|
end
|
45
40
|
end
|
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "action_dispatch/journey/nfa/dot"
|
2
4
|
|
3
5
|
module ActionDispatch
|
4
6
|
module Journey # :nodoc:
|
@@ -12,7 +14,7 @@ module ActionDispatch
|
|
12
14
|
@regexp_states = {}
|
13
15
|
@string_states = {}
|
14
16
|
@accepting = {}
|
15
|
-
@memos = Hash.new { |h,k| h[k] = [] }
|
17
|
+
@memos = Hash.new { |h, k| h[k] = [] }
|
16
18
|
end
|
17
19
|
|
18
20
|
def add_accepting(state)
|
@@ -43,20 +45,22 @@ module ActionDispatch
|
|
43
45
|
return [] if t.empty?
|
44
46
|
|
45
47
|
regexps = []
|
48
|
+
strings = []
|
46
49
|
|
47
|
-
t.
|
50
|
+
t.each { |s|
|
48
51
|
if states = @regexp_states[s]
|
49
|
-
|
52
|
+
states.each { |re, v| regexps << v if re.match?(a) && !v.nil? }
|
50
53
|
end
|
51
54
|
|
52
55
|
if states = @string_states[s]
|
53
|
-
states[a]
|
56
|
+
strings << states[a] unless states[a].nil?
|
54
57
|
end
|
55
|
-
}
|
58
|
+
}
|
59
|
+
strings.concat regexps
|
56
60
|
end
|
57
61
|
|
58
62
|
def as_json(options = nil)
|
59
|
-
simple_regexp = Hash.new { |h,k| h[k] = {} }
|
63
|
+
simple_regexp = Hash.new { |h, k| h[k] = {} }
|
60
64
|
|
61
65
|
@regexp_states.each do |from, hash|
|
62
66
|
hash.each do |re, to|
|
@@ -72,20 +76,20 @@ module ActionDispatch
|
|
72
76
|
end
|
73
77
|
|
74
78
|
def to_svg
|
75
|
-
svg = IO.popen(
|
79
|
+
svg = IO.popen("dot -Tsvg", "w+") { |f|
|
76
80
|
f.write(to_dot)
|
77
81
|
f.close_write
|
78
82
|
f.readlines
|
79
83
|
}
|
80
84
|
3.times { svg.shift }
|
81
|
-
svg.join.sub(/width="[^"]*"/,
|
85
|
+
svg.join.sub(/width="[^"]*"/, "").sub(/height="[^"]*"/, "")
|
82
86
|
end
|
83
87
|
|
84
|
-
def visualizer(paths, title =
|
85
|
-
viz_dir = File.join
|
86
|
-
fsm_js = File.read File.join(viz_dir,
|
87
|
-
fsm_css = File.read File.join(viz_dir,
|
88
|
-
erb = File.read File.join(viz_dir,
|
88
|
+
def visualizer(paths, title = "FSM")
|
89
|
+
viz_dir = File.join __dir__, "..", "visualizer"
|
90
|
+
fsm_js = File.read File.join(viz_dir, "fsm.js")
|
91
|
+
fsm_css = File.read File.join(viz_dir, "fsm.css")
|
92
|
+
erb = File.read File.join(viz_dir, "index.html.erb")
|
89
93
|
states = "function tt() { return #{to_json}; }"
|
90
94
|
|
91
95
|
fun_routes = paths.sample(3).map do |ast|
|
@@ -93,10 +97,10 @@ module ActionDispatch
|
|
93
97
|
case n
|
94
98
|
when Nodes::Symbol
|
95
99
|
case n.left
|
96
|
-
when
|
97
|
-
when
|
100
|
+
when ":id" then rand(100).to_s
|
101
|
+
when ":format" then %w{ xml json }.sample
|
98
102
|
else
|
99
|
-
|
103
|
+
"omg"
|
100
104
|
end
|
101
105
|
when Nodes::Terminal then n.symbol
|
102
106
|
else
|
@@ -109,13 +113,12 @@ module ActionDispatch
|
|
109
113
|
svg = to_svg
|
110
114
|
javascripts = [states, fsm_js]
|
111
115
|
|
112
|
-
# Annoying hack for 1.9 warnings
|
113
116
|
fun_routes = fun_routes
|
114
117
|
stylesheets = stylesheets
|
115
118
|
svg = svg
|
116
119
|
javascripts = javascripts
|
117
120
|
|
118
|
-
require
|
121
|
+
require "erb"
|
119
122
|
template = ERB.new erb
|
120
123
|
template.result(binding)
|
121
124
|
end
|
@@ -140,7 +143,6 @@ module ActionDispatch
|
|
140
143
|
end
|
141
144
|
|
142
145
|
private
|
143
|
-
|
144
146
|
def states_hash_for(sym)
|
145
147
|
case sym
|
146
148
|
when String
|
@@ -148,7 +150,7 @@ module ActionDispatch
|
|
148
150
|
when Regexp
|
149
151
|
@regexp_states
|
150
152
|
else
|
151
|
-
raise ArgumentError,
|
153
|
+
raise ArgumentError, "unknown symbol: %s" % sym.class
|
152
154
|
end
|
153
155
|
end
|
154
156
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module ActionDispatch
|
4
4
|
module Journey # :nodoc:
|
@@ -9,18 +9,7 @@ module ActionDispatch
|
|
9
9
|
" #{from} -> #{to} [label=\"#{sym || 'ε'}\"];"
|
10
10
|
}
|
11
11
|
|
12
|
-
|
13
|
-
# label = n
|
14
|
-
# if Journey::Route === n
|
15
|
-
# label = "#{n.verb.source} #{n.path.spec}"
|
16
|
-
# end
|
17
|
-
# " #{n.object_id} [label=\"#{label}\", shape=box];"
|
18
|
-
#}
|
19
|
-
#memo_edges = memos.flat_map { |k, memos|
|
20
|
-
# (memos || []).map { |v| " #{k} -> #{v.object_id};" }
|
21
|
-
#}.uniq
|
22
|
-
|
23
|
-
<<-eodot
|
12
|
+
<<-eodot
|
24
13
|
digraph nfa {
|
25
14
|
rankdir=LR;
|
26
15
|
node [shape = doublecircle];
|
@@ -28,7 +17,7 @@ digraph nfa {
|
|
28
17
|
node [shape = circle];
|
29
18
|
#{edges.join "\n"}
|
30
19
|
}
|
31
|
-
|
20
|
+
eodot
|
32
21
|
end
|
33
22
|
end
|
34
23
|
end
|
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "action_dispatch/journey/visitors"
|
2
4
|
|
3
5
|
module ActionDispatch
|
4
6
|
module Journey # :nodoc:
|
@@ -14,15 +16,15 @@ module ActionDispatch
|
|
14
16
|
end
|
15
17
|
|
16
18
|
def each(&block)
|
17
|
-
Visitors::Each.
|
19
|
+
Visitors::Each::INSTANCE.accept(self, block)
|
18
20
|
end
|
19
21
|
|
20
22
|
def to_s
|
21
|
-
Visitors::String.
|
23
|
+
Visitors::String::INSTANCE.accept(self, "")
|
22
24
|
end
|
23
25
|
|
24
26
|
def to_dot
|
25
|
-
Visitors::Dot.
|
27
|
+
Visitors::Dot::INSTANCE.accept(self)
|
26
28
|
end
|
27
29
|
|
28
30
|
def to_sym
|
@@ -30,7 +32,7 @@ module ActionDispatch
|
|
30
32
|
end
|
31
33
|
|
32
34
|
def name
|
33
|
-
left.tr
|
35
|
+
-left.tr("*:", "")
|
34
36
|
end
|
35
37
|
|
36
38
|
def type
|
@@ -39,10 +41,15 @@ module ActionDispatch
|
|
39
41
|
|
40
42
|
def symbol?; false; end
|
41
43
|
def literal?; false; end
|
44
|
+
def terminal?; false; end
|
45
|
+
def star?; false; end
|
46
|
+
def cat?; false; end
|
47
|
+
def group?; false; end
|
42
48
|
end
|
43
49
|
|
44
50
|
class Terminal < Node # :nodoc:
|
45
51
|
alias :symbol :left
|
52
|
+
def terminal?; true; end
|
46
53
|
end
|
47
54
|
|
48
55
|
class Literal < Terminal # :nodoc:
|
@@ -58,28 +65,32 @@ module ActionDispatch
|
|
58
65
|
def literal?; false; end
|
59
66
|
end
|
60
67
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
68
|
+
class Slash < Terminal # :nodoc:
|
69
|
+
def type; :SLASH; end
|
70
|
+
end
|
71
|
+
|
72
|
+
class Dot < Terminal # :nodoc:
|
73
|
+
def type; :DOT; end
|
67
74
|
end
|
68
75
|
|
69
76
|
class Symbol < Terminal # :nodoc:
|
70
77
|
attr_accessor :regexp
|
71
78
|
alias :symbol :regexp
|
79
|
+
attr_reader :name
|
72
80
|
|
73
81
|
DEFAULT_EXP = /[^\.\/\?]+/
|
74
|
-
|
75
|
-
|
76
|
-
|
82
|
+
GREEDY_EXP = /(.+)/
|
83
|
+
def initialize(left, regexp = DEFAULT_EXP)
|
84
|
+
super(left)
|
85
|
+
@regexp = regexp
|
86
|
+
@name = -left.tr("*:", "")
|
77
87
|
end
|
78
88
|
|
79
89
|
def default_regexp?
|
80
90
|
regexp == DEFAULT_EXP
|
81
91
|
end
|
82
92
|
|
93
|
+
def type; :SYMBOL; end
|
83
94
|
def symbol?; true; end
|
84
95
|
end
|
85
96
|
|
@@ -89,13 +100,15 @@ module ActionDispatch
|
|
89
100
|
|
90
101
|
class Group < Unary # :nodoc:
|
91
102
|
def type; :GROUP; end
|
103
|
+
def group?; true; end
|
92
104
|
end
|
93
105
|
|
94
106
|
class Star < Unary # :nodoc:
|
107
|
+
def star?; true; end
|
95
108
|
def type; :STAR; end
|
96
109
|
|
97
110
|
def name
|
98
|
-
left.name.tr
|
111
|
+
left.name.tr "*:", ""
|
99
112
|
end
|
100
113
|
end
|
101
114
|
|
@@ -111,6 +124,7 @@ module ActionDispatch
|
|
111
124
|
end
|
112
125
|
|
113
126
|
class Cat < Binary # :nodoc:
|
127
|
+
def cat?; true; end
|
114
128
|
def type; :CAT; end
|
115
129
|
end
|
116
130
|
|
@@ -1,32 +1,33 @@
|
|
1
1
|
#
|
2
2
|
# DO NOT MODIFY!!!!
|
3
|
-
# This file is automatically generated by Racc 1.4.
|
4
|
-
# from Racc
|
3
|
+
# This file is automatically generated by Racc 1.4.16
|
4
|
+
# from Racc grammar file "".
|
5
5
|
#
|
6
6
|
|
7
7
|
require 'racc/parser.rb'
|
8
8
|
|
9
|
+
# :stopdoc:
|
9
10
|
|
10
|
-
require
|
11
|
+
require "action_dispatch/journey/parser_extras"
|
11
12
|
module ActionDispatch
|
12
13
|
module Journey
|
13
14
|
class Parser < Racc::Parser
|
14
15
|
##### State transition tables begin ###
|
15
16
|
|
16
17
|
racc_action_table = [
|
17
|
-
13, 15, 14, 7,
|
18
|
-
14, 7, 17, 16, 8, 13, 15, 14, 7,
|
19
|
-
16, 8, 13, 15, 14, 7,
|
18
|
+
13, 15, 14, 7, 19, 16, 8, 19, 13, 15,
|
19
|
+
14, 7, 17, 16, 8, 13, 15, 14, 7, 21,
|
20
|
+
16, 8, 13, 15, 14, 7, 24, 16, 8 ]
|
20
21
|
|
21
22
|
racc_action_check = [
|
22
|
-
2, 2, 2, 2,
|
23
|
-
|
24
|
-
|
23
|
+
2, 2, 2, 2, 22, 2, 2, 2, 19, 19,
|
24
|
+
19, 19, 1, 19, 19, 7, 7, 7, 7, 17,
|
25
|
+
7, 7, 0, 0, 0, 0, 20, 0, 0 ]
|
25
26
|
|
26
27
|
racc_action_pointer = [
|
27
|
-
|
28
|
-
nil, nil, nil, nil, nil, nil, nil,
|
29
|
-
|
28
|
+
20, 12, -2, nil, nil, nil, nil, 13, nil, nil,
|
29
|
+
nil, nil, nil, nil, nil, nil, nil, 19, nil, 6,
|
30
|
+
20, nil, -5, nil, nil ]
|
30
31
|
|
31
32
|
racc_action_default = [
|
32
33
|
-19, -19, -2, -3, -4, -5, -6, -19, -10, -11,
|
@@ -162,7 +163,7 @@ def _reduce_9(val, _values)
|
|
162
163
|
end
|
163
164
|
|
164
165
|
def _reduce_10(val, _values)
|
165
|
-
Star.new(Symbol.new(val.last))
|
166
|
+
Star.new(Symbol.new(val.last, Symbol::GREEDY_EXP))
|
166
167
|
end
|
167
168
|
|
168
169
|
# reduce 11 omitted
|
@@ -174,7 +175,7 @@ end
|
|
174
175
|
# reduce 14 omitted
|
175
176
|
|
176
177
|
def _reduce_15(val, _values)
|
177
|
-
Slash.new(
|
178
|
+
Slash.new(val.first)
|
178
179
|
end
|
179
180
|
|
180
181
|
def _reduce_16(val, _values)
|
@@ -194,5 +195,5 @@ def _reduce_none(val, _values)
|
|
194
195
|
end
|
195
196
|
|
196
197
|
end # class Parser
|
197
|
-
|
198
|
-
|
198
|
+
end # module Journey
|
199
|
+
end # module ActionDispatch
|
@@ -21,7 +21,7 @@ rule
|
|
21
21
|
| expression OR or { Or.new([val.first, val.last]) }
|
22
22
|
;
|
23
23
|
star
|
24
|
-
: STAR { Star.new(Symbol.new(val.last)) }
|
24
|
+
: STAR { Star.new(Symbol.new(val.last, Symbol::GREEDY_EXP)) }
|
25
25
|
;
|
26
26
|
terminal
|
27
27
|
: symbol
|
@@ -30,7 +30,7 @@ rule
|
|
30
30
|
| dot
|
31
31
|
;
|
32
32
|
slash
|
33
|
-
: SLASH { Slash.new(
|
33
|
+
: SLASH { Slash.new(val.first) }
|
34
34
|
;
|
35
35
|
symbol
|
36
36
|
: SYMBOL { Symbol.new(val.first) }
|
@@ -45,5 +45,6 @@ rule
|
|
45
45
|
end
|
46
46
|
|
47
47
|
---- header
|
48
|
+
# :stopdoc:
|
48
49
|
|
49
|
-
require
|
50
|
+
require "action_dispatch/journey/parser_extras"
|
@@ -1,11 +1,18 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "action_dispatch/journey/scanner"
|
4
|
+
require "action_dispatch/journey/nodes/node"
|
3
5
|
|
4
6
|
module ActionDispatch
|
5
|
-
|
6
|
-
|
7
|
+
# :stopdoc:
|
8
|
+
module Journey
|
9
|
+
class Parser < Racc::Parser
|
7
10
|
include Journey::Nodes
|
8
11
|
|
12
|
+
def self.parse(string)
|
13
|
+
new.parse string
|
14
|
+
end
|
15
|
+
|
9
16
|
def initialize
|
10
17
|
@scanner = Scanner.new
|
11
18
|
end
|
@@ -20,4 +27,5 @@ module ActionDispatch
|
|
20
27
|
end
|
21
28
|
end
|
22
29
|
end
|
30
|
+
# :startdoc:
|
23
31
|
end
|