actionpack 4.2.10 → 7.2.0.rc1
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.
Potentially problematic release.
This version of actionpack might be problematic. Click here for more details.
- checksums.yaml +5 -5
- data/CHANGELOG.md +86 -600
- data/MIT-LICENSE +1 -1
- data/README.rdoc +13 -14
- data/lib/abstract_controller/asset_paths.rb +5 -1
- data/lib/abstract_controller/base.rb +166 -136
- data/lib/abstract_controller/caching/fragments.rb +149 -0
- data/lib/abstract_controller/caching.rb +68 -0
- data/lib/abstract_controller/callbacks.rb +126 -57
- data/lib/abstract_controller/collector.rb +13 -15
- data/lib/abstract_controller/deprecator.rb +9 -0
- data/lib/abstract_controller/error.rb +8 -0
- data/lib/abstract_controller/helpers.rb +181 -132
- data/lib/abstract_controller/logger.rb +5 -1
- data/lib/abstract_controller/railties/routes_helpers.rb +10 -3
- data/lib/abstract_controller/rendering.rb +56 -56
- data/lib/abstract_controller/translation.rb +29 -15
- data/lib/abstract_controller/url_for.rb +15 -11
- data/lib/abstract_controller.rb +21 -5
- data/lib/action_controller/api/api_rendering.rb +18 -0
- data/lib/action_controller/api.rb +154 -0
- data/lib/action_controller/base.rb +219 -155
- data/lib/action_controller/caching.rb +28 -68
- data/lib/action_controller/deprecator.rb +9 -0
- data/lib/action_controller/form_builder.rb +55 -0
- data/lib/action_controller/log_subscriber.rb +35 -22
- data/lib/action_controller/metal/allow_browser.rb +119 -0
- data/lib/action_controller/metal/basic_implicit_render.rb +17 -0
- data/lib/action_controller/metal/conditional_get.rb +259 -122
- data/lib/action_controller/metal/content_security_policy.rb +86 -0
- data/lib/action_controller/metal/cookies.rb +9 -5
- data/lib/action_controller/metal/data_streaming.rb +87 -104
- data/lib/action_controller/metal/default_headers.rb +21 -0
- data/lib/action_controller/metal/etag_with_flash.rb +22 -0
- data/lib/action_controller/metal/etag_with_template_digest.rb +35 -26
- data/lib/action_controller/metal/exceptions.rb +71 -24
- data/lib/action_controller/metal/flash.rb +26 -19
- data/lib/action_controller/metal/head.rb +45 -36
- data/lib/action_controller/metal/helpers.rb +80 -64
- data/lib/action_controller/metal/http_authentication.rb +297 -244
- data/lib/action_controller/metal/implicit_render.rb +57 -9
- data/lib/action_controller/metal/instrumentation.rb +76 -64
- data/lib/action_controller/metal/live.rb +238 -176
- data/lib/action_controller/metal/logging.rb +22 -0
- data/lib/action_controller/metal/mime_responds.rb +177 -166
- data/lib/action_controller/metal/parameter_encoding.rb +84 -0
- data/lib/action_controller/metal/params_wrapper.rb +145 -118
- data/lib/action_controller/metal/permissions_policy.rb +38 -0
- data/lib/action_controller/metal/rate_limiting.rb +62 -0
- data/lib/action_controller/metal/redirecting.rb +203 -64
- data/lib/action_controller/metal/renderers.rb +108 -65
- data/lib/action_controller/metal/rendering.rb +216 -56
- data/lib/action_controller/metal/request_forgery_protection.rb +496 -163
- data/lib/action_controller/metal/rescue.rb +19 -21
- data/lib/action_controller/metal/streaming.rb +179 -138
- data/lib/action_controller/metal/strong_parameters.rb +1058 -382
- data/lib/action_controller/metal/testing.rb +11 -17
- data/lib/action_controller/metal/url_for.rb +37 -21
- data/lib/action_controller/metal.rb +236 -138
- data/lib/action_controller/railtie.rb +89 -11
- data/lib/action_controller/railties/helpers.rb +5 -1
- data/lib/action_controller/renderer.rb +161 -0
- data/lib/action_controller/template_assertions.rb +13 -0
- data/lib/action_controller/test_case.rb +425 -497
- data/lib/action_controller.rb +44 -22
- data/lib/action_dispatch/constants.rb +34 -0
- data/lib/action_dispatch/deprecator.rb +9 -0
- data/lib/action_dispatch/http/cache.rb +119 -63
- data/lib/action_dispatch/http/content_disposition.rb +47 -0
- data/lib/action_dispatch/http/content_security_policy.rb +364 -0
- data/lib/action_dispatch/http/filter_parameters.rb +36 -34
- data/lib/action_dispatch/http/filter_redirect.rb +24 -12
- data/lib/action_dispatch/http/headers.rb +66 -31
- data/lib/action_dispatch/http/mime_negotiation.rb +106 -75
- data/lib/action_dispatch/http/mime_type.rb +196 -136
- data/lib/action_dispatch/http/mime_types.rb +25 -7
- data/lib/action_dispatch/http/parameters.rb +97 -45
- data/lib/action_dispatch/http/permissions_policy.rb +187 -0
- data/lib/action_dispatch/http/rack_cache.rb +6 -0
- data/lib/action_dispatch/http/request.rb +299 -170
- data/lib/action_dispatch/http/response.rb +311 -160
- data/lib/action_dispatch/http/upload.rb +52 -23
- data/lib/action_dispatch/http/url.rb +201 -125
- data/lib/action_dispatch/journey/formatter.rb +110 -50
- data/lib/action_dispatch/journey/gtg/builder.rb +37 -50
- data/lib/action_dispatch/journey/gtg/simulator.rb +20 -17
- data/lib/action_dispatch/journey/gtg/transition_table.rb +96 -36
- data/lib/action_dispatch/journey/nfa/dot.rb +5 -14
- data/lib/action_dispatch/journey/nodes/node.rb +100 -20
- data/lib/action_dispatch/journey/parser.rb +19 -17
- data/lib/action_dispatch/journey/parser.y +4 -3
- data/lib/action_dispatch/journey/parser_extras.rb +14 -4
- data/lib/action_dispatch/journey/path/pattern.rb +79 -63
- data/lib/action_dispatch/journey/route.rb +108 -44
- data/lib/action_dispatch/journey/router/utils.rb +41 -29
- data/lib/action_dispatch/journey/router.rb +64 -57
- data/lib/action_dispatch/journey/routes.rb +23 -21
- data/lib/action_dispatch/journey/scanner.rb +28 -17
- data/lib/action_dispatch/journey/visitors.rb +100 -54
- data/lib/action_dispatch/journey/visualizer/fsm.js +49 -24
- data/lib/action_dispatch/journey/visualizer/index.html.erb +1 -1
- data/lib/action_dispatch/journey.rb +7 -5
- data/lib/action_dispatch/log_subscriber.rb +25 -0
- data/lib/action_dispatch/middleware/actionable_exceptions.rb +46 -0
- data/lib/action_dispatch/middleware/assume_ssl.rb +27 -0
- data/lib/action_dispatch/middleware/callbacks.rb +7 -6
- data/lib/action_dispatch/middleware/cookies.rb +471 -328
- data/lib/action_dispatch/middleware/debug_exceptions.rb +149 -66
- data/lib/action_dispatch/middleware/debug_locks.rb +129 -0
- data/lib/action_dispatch/middleware/debug_view.rb +73 -0
- data/lib/action_dispatch/middleware/exception_wrapper.rb +275 -73
- data/lib/action_dispatch/middleware/executor.rb +32 -0
- data/lib/action_dispatch/middleware/flash.rb +143 -101
- data/lib/action_dispatch/middleware/host_authorization.rb +171 -0
- data/lib/action_dispatch/middleware/public_exceptions.rb +36 -27
- data/lib/action_dispatch/middleware/reloader.rb +10 -92
- data/lib/action_dispatch/middleware/remote_ip.rb +133 -107
- data/lib/action_dispatch/middleware/request_id.rb +29 -15
- data/lib/action_dispatch/middleware/server_timing.rb +78 -0
- data/lib/action_dispatch/middleware/session/abstract_store.rb +49 -27
- data/lib/action_dispatch/middleware/session/cache_store.rb +33 -16
- data/lib/action_dispatch/middleware/session/cookie_store.rb +86 -80
- data/lib/action_dispatch/middleware/session/mem_cache_store.rb +15 -3
- data/lib/action_dispatch/middleware/show_exceptions.rb +66 -36
- data/lib/action_dispatch/middleware/ssl.rb +134 -36
- data/lib/action_dispatch/middleware/stack.rb +109 -44
- data/lib/action_dispatch/middleware/static.rb +159 -90
- 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 +7 -24
- data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.text.erb +1 -1
- data/lib/action_dispatch/middleware/templates/rescues/_source.html.erb +36 -0
- data/lib/action_dispatch/middleware/templates/rescues/_source.text.erb +8 -0
- data/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb +46 -36
- data/lib/action_dispatch/middleware/templates/rescues/blocked_host.html.erb +12 -0
- data/lib/action_dispatch/middleware/templates/rescues/blocked_host.text.erb +9 -0
- data/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb +26 -7
- data/lib/action_dispatch/middleware/templates/rescues/diagnostics.text.erb +3 -3
- data/lib/action_dispatch/middleware/templates/rescues/invalid_statement.html.erb +24 -0
- data/lib/action_dispatch/middleware/templates/rescues/invalid_statement.text.erb +16 -0
- data/lib/action_dispatch/middleware/templates/rescues/layout.erb +139 -15
- data/lib/action_dispatch/middleware/templates/rescues/missing_exact_template.html.erb +23 -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 +6 -6
- data/lib/action_dispatch/middleware/templates/rescues/routing_error.html.erb +7 -7
- data/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb +9 -9
- data/lib/action_dispatch/middleware/templates/rescues/template_error.text.erb +1 -1
- data/lib/action_dispatch/middleware/templates/rescues/unknown_action.html.erb +4 -4
- data/lib/action_dispatch/middleware/templates/rescues/unknown_action.text.erb +1 -1
- data/lib/action_dispatch/middleware/templates/routes/_route.html.erb +7 -4
- data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +125 -93
- data/lib/action_dispatch/railtie.rb +44 -16
- data/lib/action_dispatch/request/session.rb +159 -69
- data/lib/action_dispatch/request/utils.rb +97 -23
- data/lib/action_dispatch/routing/endpoint.rb +11 -2
- data/lib/action_dispatch/routing/inspector.rb +195 -106
- data/lib/action_dispatch/routing/mapper.rb +1338 -955
- data/lib/action_dispatch/routing/polymorphic_routes.rb +234 -201
- data/lib/action_dispatch/routing/redirection.rb +78 -51
- data/lib/action_dispatch/routing/route_set.rb +460 -374
- data/lib/action_dispatch/routing/routes_proxy.rb +36 -12
- data/lib/action_dispatch/routing/url_for.rb +172 -124
- data/lib/action_dispatch/routing.rb +159 -158
- data/lib/action_dispatch/system_test_case.rb +206 -0
- data/lib/action_dispatch/system_testing/browser.rb +84 -0
- data/lib/action_dispatch/system_testing/driver.rb +85 -0
- data/lib/action_dispatch/system_testing/server.rb +33 -0
- data/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb +164 -0
- data/lib/action_dispatch/system_testing/test_helpers/setup_and_teardown.rb +23 -0
- data/lib/action_dispatch/testing/assertion_response.rb +48 -0
- data/lib/action_dispatch/testing/assertions/response.rb +71 -39
- data/lib/action_dispatch/testing/assertions/routing.rb +228 -103
- data/lib/action_dispatch/testing/assertions.rb +9 -6
- data/lib/action_dispatch/testing/integration.rb +486 -306
- data/lib/action_dispatch/testing/request_encoder.rb +60 -0
- data/lib/action_dispatch/testing/test_helpers/page_dump_helper.rb +35 -0
- data/lib/action_dispatch/testing/test_process.rb +35 -22
- data/lib/action_dispatch/testing/test_request.rb +29 -34
- data/lib/action_dispatch/testing/test_response.rb +48 -15
- data/lib/action_dispatch.rb +82 -40
- data/lib/action_pack/gem_version.rb +8 -4
- data/lib/action_pack/version.rb +6 -2
- data/lib/action_pack.rb +21 -18
- metadata +146 -56
- data/lib/action_controller/caching/fragments.rb +0 -103
- 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/middleware/templates/rescues/_source.erb +0 -27
- 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,32 +0,0 @@
|
|
1
|
-
require 'action_dispatch/http/request'
|
2
|
-
require 'action_dispatch/http/response'
|
3
|
-
|
4
|
-
module ActionController
|
5
|
-
module RackDelegation
|
6
|
-
extend ActiveSupport::Concern
|
7
|
-
|
8
|
-
delegate :headers, :status=, :location=, :content_type=,
|
9
|
-
:status, :location, :content_type, :response_code, :to => "@_response"
|
10
|
-
|
11
|
-
def dispatch(action, request)
|
12
|
-
set_response!(request)
|
13
|
-
super(action, request)
|
14
|
-
end
|
15
|
-
|
16
|
-
def response_body=(body)
|
17
|
-
response.body = body if response
|
18
|
-
super
|
19
|
-
end
|
20
|
-
|
21
|
-
def reset_session
|
22
|
-
@_request.reset_session
|
23
|
-
end
|
24
|
-
|
25
|
-
private
|
26
|
-
|
27
|
-
def set_response!(request)
|
28
|
-
@_response = ActionDispatch::Response.new
|
29
|
-
@_response.request = request
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
@@ -1,39 +0,0 @@
|
|
1
|
-
module ActionController
|
2
|
-
class Middleware < Metal
|
3
|
-
class ActionMiddleware
|
4
|
-
def initialize(controller, app)
|
5
|
-
@controller, @app = controller, app
|
6
|
-
end
|
7
|
-
|
8
|
-
def call(env)
|
9
|
-
request = ActionDispatch::Request.new(env)
|
10
|
-
@controller.build(@app).dispatch(:index, request)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
class << self
|
15
|
-
alias build new
|
16
|
-
|
17
|
-
def new(app)
|
18
|
-
ActionMiddleware.new(self, app)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
attr_internal :app
|
23
|
-
|
24
|
-
def process(action)
|
25
|
-
response = super
|
26
|
-
self.status, self.headers, self.response_body = response if response.is_a?(Array)
|
27
|
-
response
|
28
|
-
end
|
29
|
-
|
30
|
-
def initialize(app)
|
31
|
-
super()
|
32
|
-
@_app = app
|
33
|
-
end
|
34
|
-
|
35
|
-
def index
|
36
|
-
call(env)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
@@ -1,12 +0,0 @@
|
|
1
|
-
module ActionController
|
2
|
-
module ModelNaming
|
3
|
-
# Converts the given object to an ActiveModel compliant one.
|
4
|
-
def convert_to_model(object)
|
5
|
-
object.respond_to?(:to_model) ? object.to_model : object
|
6
|
-
end
|
7
|
-
|
8
|
-
def model_name_from_record_or_class(record_or_class)
|
9
|
-
convert_to_model(record_or_class).model_name
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
@@ -1,72 +0,0 @@
|
|
1
|
-
module ActionDispatch
|
2
|
-
module Http
|
3
|
-
class ParameterFilter
|
4
|
-
FILTERED = '[FILTERED]'.freeze # :nodoc:
|
5
|
-
|
6
|
-
def initialize(filters = [])
|
7
|
-
@filters = filters
|
8
|
-
end
|
9
|
-
|
10
|
-
def filter(params)
|
11
|
-
compiled_filter.call(params)
|
12
|
-
end
|
13
|
-
|
14
|
-
private
|
15
|
-
|
16
|
-
def compiled_filter
|
17
|
-
@compiled_filter ||= CompiledFilter.compile(@filters)
|
18
|
-
end
|
19
|
-
|
20
|
-
class CompiledFilter # :nodoc:
|
21
|
-
def self.compile(filters)
|
22
|
-
return lambda { |params| params.dup } if filters.empty?
|
23
|
-
|
24
|
-
strings, regexps, blocks = [], [], []
|
25
|
-
|
26
|
-
filters.each do |item|
|
27
|
-
case item
|
28
|
-
when Proc
|
29
|
-
blocks << item
|
30
|
-
when Regexp
|
31
|
-
regexps << item
|
32
|
-
else
|
33
|
-
strings << item.to_s
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
regexps << Regexp.new(strings.join('|'), true) unless strings.empty?
|
38
|
-
new regexps, blocks
|
39
|
-
end
|
40
|
-
|
41
|
-
attr_reader :regexps, :blocks
|
42
|
-
|
43
|
-
def initialize(regexps, blocks)
|
44
|
-
@regexps = regexps
|
45
|
-
@blocks = blocks
|
46
|
-
end
|
47
|
-
|
48
|
-
def call(original_params)
|
49
|
-
filtered_params = {}
|
50
|
-
|
51
|
-
original_params.each do |key, value|
|
52
|
-
if regexps.any? { |r| key =~ r }
|
53
|
-
value = FILTERED
|
54
|
-
elsif value.is_a?(Hash)
|
55
|
-
value = call(value)
|
56
|
-
elsif value.is_a?(Array)
|
57
|
-
value = value.map { |v| v.is_a?(Hash) ? call(v) : v }
|
58
|
-
elsif blocks.any?
|
59
|
-
key = key.dup if key.duplicable?
|
60
|
-
value = value.dup if value.duplicable?
|
61
|
-
blocks.each { |b| b.call(key, value) }
|
62
|
-
end
|
63
|
-
|
64
|
-
filtered_params[key] = value
|
65
|
-
end
|
66
|
-
|
67
|
-
filtered_params
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
@@ -1,76 +0,0 @@
|
|
1
|
-
require 'action_dispatch/journey/nfa/transition_table'
|
2
|
-
require 'action_dispatch/journey/gtg/transition_table'
|
3
|
-
|
4
|
-
module ActionDispatch
|
5
|
-
module Journey # :nodoc:
|
6
|
-
module NFA # :nodoc:
|
7
|
-
class Visitor < Visitors::Visitor # :nodoc:
|
8
|
-
def initialize(tt)
|
9
|
-
@tt = tt
|
10
|
-
@i = -1
|
11
|
-
end
|
12
|
-
|
13
|
-
def visit_CAT(node)
|
14
|
-
left = visit(node.left)
|
15
|
-
right = visit(node.right)
|
16
|
-
|
17
|
-
@tt.merge(left.last, right.first)
|
18
|
-
|
19
|
-
[left.first, right.last]
|
20
|
-
end
|
21
|
-
|
22
|
-
def visit_GROUP(node)
|
23
|
-
from = @i += 1
|
24
|
-
left = visit(node.left)
|
25
|
-
to = @i += 1
|
26
|
-
|
27
|
-
@tt.accepting = to
|
28
|
-
|
29
|
-
@tt[from, left.first] = nil
|
30
|
-
@tt[left.last, to] = nil
|
31
|
-
@tt[from, to] = nil
|
32
|
-
|
33
|
-
[from, to]
|
34
|
-
end
|
35
|
-
|
36
|
-
def visit_OR(node)
|
37
|
-
from = @i += 1
|
38
|
-
children = node.children.map { |c| visit(c) }
|
39
|
-
to = @i += 1
|
40
|
-
|
41
|
-
children.each do |child|
|
42
|
-
@tt[from, child.first] = nil
|
43
|
-
@tt[child.last, to] = nil
|
44
|
-
end
|
45
|
-
|
46
|
-
@tt.accepting = to
|
47
|
-
|
48
|
-
[from, to]
|
49
|
-
end
|
50
|
-
|
51
|
-
def terminal(node)
|
52
|
-
from_i = @i += 1 # new state
|
53
|
-
to_i = @i += 1 # new state
|
54
|
-
|
55
|
-
@tt[from_i, to_i] = node
|
56
|
-
@tt.accepting = to_i
|
57
|
-
@tt.add_memo(to_i, node.memo)
|
58
|
-
|
59
|
-
[from_i, to_i]
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
class Builder # :nodoc:
|
64
|
-
def initialize(ast)
|
65
|
-
@ast = ast
|
66
|
-
end
|
67
|
-
|
68
|
-
def transition_table
|
69
|
-
tt = TransitionTable.new
|
70
|
-
Visitor.new(tt).accept(@ast)
|
71
|
-
tt
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
@@ -1,47 +0,0 @@
|
|
1
|
-
require 'strscan'
|
2
|
-
|
3
|
-
module ActionDispatch
|
4
|
-
module Journey # :nodoc:
|
5
|
-
module NFA # :nodoc:
|
6
|
-
class MatchData # :nodoc:
|
7
|
-
attr_reader :memos
|
8
|
-
|
9
|
-
def initialize(memos)
|
10
|
-
@memos = memos
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
class Simulator # :nodoc:
|
15
|
-
attr_reader :tt
|
16
|
-
|
17
|
-
def initialize(transition_table)
|
18
|
-
@tt = transition_table
|
19
|
-
end
|
20
|
-
|
21
|
-
def simulate(string)
|
22
|
-
input = StringScanner.new(string)
|
23
|
-
state = tt.eclosure(0)
|
24
|
-
until input.eos?
|
25
|
-
sym = input.scan(%r([/.?]|[^/.?]+))
|
26
|
-
|
27
|
-
# FIXME: tt.eclosure is not needed for the GTG
|
28
|
-
state = tt.eclosure(tt.move(state, sym))
|
29
|
-
end
|
30
|
-
|
31
|
-
acceptance_states = state.find_all { |s|
|
32
|
-
tt.accepting?(tt.eclosure(s).sort.last)
|
33
|
-
}
|
34
|
-
|
35
|
-
return if acceptance_states.empty?
|
36
|
-
|
37
|
-
memos = acceptance_states.flat_map { |x| tt.memo(x) }.compact
|
38
|
-
|
39
|
-
MatchData.new(memos)
|
40
|
-
end
|
41
|
-
|
42
|
-
alias :=~ :simulate
|
43
|
-
alias :match :simulate
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
@@ -1,163 +0,0 @@
|
|
1
|
-
require 'action_dispatch/journey/nfa/dot'
|
2
|
-
|
3
|
-
module ActionDispatch
|
4
|
-
module Journey # :nodoc:
|
5
|
-
module NFA # :nodoc:
|
6
|
-
class TransitionTable # :nodoc:
|
7
|
-
include Journey::NFA::Dot
|
8
|
-
|
9
|
-
attr_accessor :accepting
|
10
|
-
attr_reader :memos
|
11
|
-
|
12
|
-
def initialize
|
13
|
-
@table = Hash.new { |h,f| h[f] = {} }
|
14
|
-
@memos = {}
|
15
|
-
@accepting = nil
|
16
|
-
@inverted = nil
|
17
|
-
end
|
18
|
-
|
19
|
-
def accepting?(state)
|
20
|
-
accepting == state
|
21
|
-
end
|
22
|
-
|
23
|
-
def accepting_states
|
24
|
-
[accepting]
|
25
|
-
end
|
26
|
-
|
27
|
-
def add_memo(idx, memo)
|
28
|
-
@memos[idx] = memo
|
29
|
-
end
|
30
|
-
|
31
|
-
def memo(idx)
|
32
|
-
@memos[idx]
|
33
|
-
end
|
34
|
-
|
35
|
-
def []=(i, f, s)
|
36
|
-
@table[f][i] = s
|
37
|
-
end
|
38
|
-
|
39
|
-
def merge(left, right)
|
40
|
-
@memos[right] = @memos.delete(left)
|
41
|
-
@table[right] = @table.delete(left)
|
42
|
-
end
|
43
|
-
|
44
|
-
def states
|
45
|
-
(@table.keys + @table.values.flat_map(&:keys)).uniq
|
46
|
-
end
|
47
|
-
|
48
|
-
# Returns a generalized transition graph with reduced states. The states
|
49
|
-
# are reduced like a DFA, but the table must be simulated like an NFA.
|
50
|
-
#
|
51
|
-
# Edges of the GTG are regular expressions.
|
52
|
-
def generalized_table
|
53
|
-
gt = GTG::TransitionTable.new
|
54
|
-
marked = {}
|
55
|
-
state_id = Hash.new { |h,k| h[k] = h.length }
|
56
|
-
alphabet = self.alphabet
|
57
|
-
|
58
|
-
stack = [eclosure(0)]
|
59
|
-
|
60
|
-
until stack.empty?
|
61
|
-
state = stack.pop
|
62
|
-
next if marked[state] || state.empty?
|
63
|
-
|
64
|
-
marked[state] = true
|
65
|
-
|
66
|
-
alphabet.each do |alpha|
|
67
|
-
next_state = eclosure(following_states(state, alpha))
|
68
|
-
next if next_state.empty?
|
69
|
-
|
70
|
-
gt[state_id[state], state_id[next_state]] = alpha
|
71
|
-
stack << next_state
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
final_groups = state_id.keys.find_all { |s|
|
76
|
-
s.sort.last == accepting
|
77
|
-
}
|
78
|
-
|
79
|
-
final_groups.each do |states|
|
80
|
-
id = state_id[states]
|
81
|
-
|
82
|
-
gt.add_accepting(id)
|
83
|
-
save = states.find { |s|
|
84
|
-
@memos.key?(s) && eclosure(s).sort.last == accepting
|
85
|
-
}
|
86
|
-
|
87
|
-
gt.add_memo(id, memo(save))
|
88
|
-
end
|
89
|
-
|
90
|
-
gt
|
91
|
-
end
|
92
|
-
|
93
|
-
# Returns set of NFA states to which there is a transition on ast symbol
|
94
|
-
# +a+ from some state +s+ in +t+.
|
95
|
-
def following_states(t, a)
|
96
|
-
Array(t).flat_map { |s| inverted[s][a] }.uniq
|
97
|
-
end
|
98
|
-
|
99
|
-
# Returns set of NFA states to which there is a transition on ast symbol
|
100
|
-
# +a+ from some state +s+ in +t+.
|
101
|
-
def move(t, a)
|
102
|
-
Array(t).map { |s|
|
103
|
-
inverted[s].keys.compact.find_all { |sym|
|
104
|
-
sym === a
|
105
|
-
}.map { |sym| inverted[s][sym] }
|
106
|
-
}.flatten.uniq
|
107
|
-
end
|
108
|
-
|
109
|
-
def alphabet
|
110
|
-
inverted.values.flat_map(&:keys).compact.uniq.sort_by { |x| x.to_s }
|
111
|
-
end
|
112
|
-
|
113
|
-
# Returns a set of NFA states reachable from some NFA state +s+ in set
|
114
|
-
# +t+ on nil-transitions alone.
|
115
|
-
def eclosure(t)
|
116
|
-
stack = Array(t)
|
117
|
-
seen = {}
|
118
|
-
children = []
|
119
|
-
|
120
|
-
until stack.empty?
|
121
|
-
s = stack.pop
|
122
|
-
next if seen[s]
|
123
|
-
|
124
|
-
seen[s] = true
|
125
|
-
children << s
|
126
|
-
|
127
|
-
stack.concat(inverted[s][nil])
|
128
|
-
end
|
129
|
-
|
130
|
-
children.uniq
|
131
|
-
end
|
132
|
-
|
133
|
-
def transitions
|
134
|
-
@table.flat_map { |to, hash|
|
135
|
-
hash.map { |from, sym| [from, sym, to] }
|
136
|
-
}
|
137
|
-
end
|
138
|
-
|
139
|
-
private
|
140
|
-
|
141
|
-
def inverted
|
142
|
-
return @inverted if @inverted
|
143
|
-
|
144
|
-
@inverted = Hash.new { |h, from|
|
145
|
-
h[from] = Hash.new { |j, s| j[s] = [] }
|
146
|
-
}
|
147
|
-
|
148
|
-
@table.each { |to, hash|
|
149
|
-
hash.each { |from, sym|
|
150
|
-
if sym
|
151
|
-
sym = Nodes::Symbol === sym ? sym.regexp : sym.left
|
152
|
-
end
|
153
|
-
|
154
|
-
@inverted[from][sym] << to
|
155
|
-
}
|
156
|
-
}
|
157
|
-
|
158
|
-
@inverted
|
159
|
-
end
|
160
|
-
end
|
161
|
-
end
|
162
|
-
end
|
163
|
-
end
|
@@ -1,27 +0,0 @@
|
|
1
|
-
module ActionDispatch
|
2
|
-
module Journey # :nodoc:
|
3
|
-
class Router # :nodoc:
|
4
|
-
class Strexp # :nodoc:
|
5
|
-
class << self
|
6
|
-
alias :compile :new
|
7
|
-
end
|
8
|
-
|
9
|
-
attr_reader :path, :requirements, :separators, :anchor, :ast
|
10
|
-
|
11
|
-
def self.build(path, requirements, separators, anchor = true)
|
12
|
-
parser = Journey::Parser.new
|
13
|
-
ast = parser.parse path
|
14
|
-
new ast, path, requirements, separators, anchor
|
15
|
-
end
|
16
|
-
|
17
|
-
def initialize(ast, path, requirements, separators, anchor = true)
|
18
|
-
@ast = ast
|
19
|
-
@path = path
|
20
|
-
@requirements = requirements
|
21
|
-
@separators = separators
|
22
|
-
@anchor = anchor
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
@@ -1,60 +0,0 @@
|
|
1
|
-
require 'active_support/core_ext/hash/conversions'
|
2
|
-
require 'action_dispatch/http/request'
|
3
|
-
require 'active_support/core_ext/hash/indifferent_access'
|
4
|
-
|
5
|
-
module ActionDispatch
|
6
|
-
class ParamsParser
|
7
|
-
class ParseError < StandardError
|
8
|
-
attr_reader :original_exception
|
9
|
-
|
10
|
-
def initialize(message, original_exception)
|
11
|
-
super(message)
|
12
|
-
@original_exception = original_exception
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
DEFAULT_PARSERS = { Mime::JSON => :json }
|
17
|
-
|
18
|
-
def initialize(app, parsers = {})
|
19
|
-
@app, @parsers = app, DEFAULT_PARSERS.merge(parsers)
|
20
|
-
end
|
21
|
-
|
22
|
-
def call(env)
|
23
|
-
if params = parse_formatted_parameters(env)
|
24
|
-
env["action_dispatch.request.request_parameters"] = params
|
25
|
-
end
|
26
|
-
|
27
|
-
@app.call(env)
|
28
|
-
end
|
29
|
-
|
30
|
-
private
|
31
|
-
def parse_formatted_parameters(env)
|
32
|
-
request = Request.new(env)
|
33
|
-
|
34
|
-
return false if request.content_length.zero?
|
35
|
-
|
36
|
-
strategy = @parsers[request.content_mime_type]
|
37
|
-
|
38
|
-
return false unless strategy
|
39
|
-
|
40
|
-
case strategy
|
41
|
-
when Proc
|
42
|
-
strategy.call(request.raw_post)
|
43
|
-
when :json
|
44
|
-
data = ActiveSupport::JSON.decode(request.raw_post)
|
45
|
-
data = {:_json => data} unless data.is_a?(Hash)
|
46
|
-
Request::Utils.deep_munge(data).with_indifferent_access
|
47
|
-
else
|
48
|
-
false
|
49
|
-
end
|
50
|
-
rescue => e # JSON or Ruby code block errors
|
51
|
-
logger(env).debug "Error occurred while parsing request parameters.\nContents:\n\n#{request.raw_post}"
|
52
|
-
|
53
|
-
raise ParseError.new(e.message, e)
|
54
|
-
end
|
55
|
-
|
56
|
-
def logger(env)
|
57
|
-
env['action_dispatch.logger'] || ActiveSupport::Logger.new($stderr)
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
@@ -1,27 +0,0 @@
|
|
1
|
-
<% @source_extracts.each_with_index do |source_extract, index| %>
|
2
|
-
<% if source_extract[:code] %>
|
3
|
-
<div class="source <%="hidden" if @show_source_idx != index%>" id="frame-source-<%=index%>">
|
4
|
-
<div class="info">
|
5
|
-
Extracted source (around line <strong>#<%= source_extract[:line_number] %></strong>):
|
6
|
-
</div>
|
7
|
-
<div class="data">
|
8
|
-
<table cellpadding="0" cellspacing="0" class="lines">
|
9
|
-
<tr>
|
10
|
-
<td>
|
11
|
-
<pre class="line_numbers">
|
12
|
-
<% source_extract[:code].each_key do |line_number| %>
|
13
|
-
<span><%= line_number -%></span>
|
14
|
-
<% end %>
|
15
|
-
</pre>
|
16
|
-
</td>
|
17
|
-
<td width="100%">
|
18
|
-
<pre>
|
19
|
-
<% source_extract[:code].each do |line, source| -%><div class="line<%= " active" if line == source_extract[:line_number] -%>"><%= source -%></div><% end -%>
|
20
|
-
</pre>
|
21
|
-
</td>
|
22
|
-
</tr>
|
23
|
-
</table>
|
24
|
-
</div>
|
25
|
-
</div>
|
26
|
-
<% end %>
|
27
|
-
<% end %>
|