rad_core 0.2.6 → 0.2.7
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.
- data/Rakefile +2 -2
- data/bin/rad +20 -25
- data/lib/components/config.rb +1 -1
- data/lib/components/configurators.rb +2 -2
- data/lib/components/controller.rb +2 -2
- data/lib/components/conveyors.rb +2 -2
- data/lib/components/environment.rb +1 -1
- data/lib/components/environment.yml +28 -28
- data/lib/components/flash.rb +1 -1
- data/lib/components/html.rb +1 -1
- data/lib/components/http.rb +1 -1
- data/lib/components/http.yml +1 -1
- data/lib/components/logger.rb +2 -2
- data/lib/components/mailer.rb +2 -2
- data/lib/components/remote.rb +1 -1
- data/lib/components/router.rb +3 -3
- data/lib/components/template.rb +2 -2
- data/lib/components/web.rb +3 -3
- data/lib/rad.rb +1 -1
- data/lib/rad/_support/active_support.rb +7 -7
- data/lib/rad/_support/active_support/locales/ru/actionview.yml +8 -8
- data/lib/rad/_support/active_support/locales/ru/activesupport.yml +4 -4
- data/lib/rad/_support/active_support/locales/ru/datetime.yml +5 -5
- data/lib/rad/_support/active_support/time.rb +2 -2
- data/lib/rad/_support/addressable.rb +6 -6
- data/lib/rad/_support/class_loader.rb +1 -1
- data/lib/rad/_support/extensions.rb +5 -5
- data/lib/rad/_support/filters.rb +13 -13
- data/lib/rad/_support/hacks_and_fixes.rb +5 -5
- data/lib/rad/_support/mime.rb +4 -4
- data/lib/rad/_support/module.rb +11 -11
- data/lib/rad/_support/require.rb +5 -5
- data/lib/rad/_support/rson.rb +4 -4
- data/lib/rad/_support/string.rb +9 -9
- data/lib/rad/cli/helper.rb +5 -5
- data/lib/rad/configurators/_require.rb +2 -2
- data/lib/rad/configurators/abstract.rb +5 -5
- data/lib/rad/configurators/web.rb +8 -8
- data/lib/rad/controller/_abstract.rb +15 -14
- data/lib/rad/controller/_abstract/miscellaneous.rb +5 -5
- data/lib/rad/controller/_abstract/render.rb +40 -40
- data/lib/rad/controller/_abstract/responder.rb +1 -1
- data/lib/rad/controller/_context.rb +1 -1
- data/lib/rad/controller/_http.rb +11 -11
- data/lib/rad/controller/_require.rb +6 -6
- data/lib/rad/controller/processors/controller_caller.rb +3 -3
- data/lib/rad/controller/processors/controller_error_handling.rb +14 -14
- data/lib/rad/controller/processors/controller_logger.rb +1 -1
- data/lib/rad/conveyors/_conveyor.rb +9 -9
- data/lib/rad/conveyors/_conveyors.rb +4 -4
- data/lib/rad/conveyors/_params.rb +5 -5
- data/lib/rad/conveyors/_processor.rb +2 -2
- data/lib/rad/conveyors/_workspace.rb +5 -5
- data/lib/rad/conveyors/processors/conveyor_logger.rb +3 -3
- data/lib/rad/environment/_config.rb +4 -4
- data/lib/rad/environment/_environment.rb +10 -10
- data/lib/rad/environment/_files_helper.rb +5 -5
- data/lib/rad/environment/_logger.rb +9 -9
- data/lib/rad/environment/_require.rb +4 -4
- data/lib/rad/gems.rb +14 -14
- data/lib/rad/html/_flash.rb +5 -5
- data/lib/rad/html/_helpers/basic_html_helper.rb +12 -12
- data/lib/rad/html/_helpers/form_helper.rb +19 -19
- data/lib/rad/html/_helpers/javascript_helper.rb +6 -6
- data/lib/rad/html/_helpers/model_helper.rb +17 -17
- data/lib/rad/html/_require.rb +1 -1
- data/lib/rad/html/processors/prepare_flash.rb +3 -3
- data/lib/rad/html/processors/scoped_params.rb +4 -4
- data/lib/rad/http/_http.rb +4 -4
- data/lib/rad/http/_http_adapter.rb +5 -5
- data/lib/rad/http/_request.rb +11 -11
- data/lib/rad/http/_require.rb +8 -8
- data/lib/rad/http/_response.rb +5 -5
- data/lib/rad/http/_support/rack/fixes.rb +3 -3
- data/lib/rad/http/_support/rack/rack_adapter.rb +5 -5
- data/lib/rad/http/processors/evaluate_format.rb +4 -4
- data/lib/rad/http/processors/http_logger.rb +3 -3
- data/lib/rad/http/processors/http_writer.rb +7 -7
- data/lib/rad/http/processors/prepare_params.rb +5 -5
- data/lib/rad/mailer/_letter.rb +1 -1
- data/lib/rad/mailer/_mailer.rb +1 -1
- data/lib/rad/mailer/_mailer_controller.rb +6 -6
- data/lib/rad/mailer/_require.rb +1 -1
- data/lib/rad/mailer/processors/letter_builder.rb +6 -6
- data/lib/rad/profiles/mailer.rb +2 -2
- data/lib/rad/profiles/web.rb +13 -13
- data/lib/rad/remote/processors/remote_caller.rb +10 -10
- data/lib/rad/remote/processors/remote_logger.rb +1 -1
- data/lib/rad/router/_abstract_router.rb +9 -9
- data/lib/rad/router/_alias_router.rb +34 -34
- data/lib/rad/router/_basic_router.rb +12 -12
- data/lib/rad/router/_configurator.rb +6 -6
- data/lib/rad/router/_core_routing_helper.rb +4 -4
- data/lib/rad/router/_object_router.rb +45 -45
- data/lib/rad/router/_require.rb +8 -8
- data/lib/rad/router/_restful_router.rb +25 -25
- data/lib/rad/router/_router.rb +78 -78
- data/lib/rad/router/_simple_router.rb +5 -5
- data/lib/rad/router/processors/router.rb +6 -6
- data/lib/rad/spec/controller.rb +9 -9
- data/lib/rad/spec/environment.rb +7 -7
- data/lib/rad/spec/http.rb +2 -2
- data/lib/rad/spec/http_controller.rb +22 -22
- data/lib/rad/spec/mailer.rb +4 -4
- data/lib/rad/spec/remote.rb +1 -1
- data/lib/rad/spec/router.rb +4 -4
- data/lib/rad/spec/template.rb +2 -2
- data/lib/rad/tasks.rb +2 -2
- data/lib/rad/template/_context.rb +15 -15
- data/lib/rad/template/_relative_path_resolver.rb +1 -1
- data/lib/rad/template/_support/tilt.rb +17 -17
- data/lib/rad/template/_support/tilt_fixes.rb +3 -3
- data/lib/rad/template/_template.rb +47 -47
- data/lib/rad/web/_ajax_helper.rb +4 -4
- data/lib/rad/web/_controller_miscellaneous_helper.rb +5 -5
- data/lib/rad/web/_ensure_no_www.rb +5 -5
- data/lib/rad/web/_protect_from_forgery.rb +18 -18
- data/lib/rad/web/_require.rb +7 -7
- data/lib/rad/web/_router/abstract_routing_helper.rb +4 -4
- data/lib/rad/web/_router/controller_routing_helper.rb +15 -15
- data/lib/rad/web/_router/view_routing_helper.rb +12 -12
- data/readme.md +5 -5
- data/spec/controller/abstract_spec.rb +29 -29
- data/spec/controller/context_spec.rb +32 -32
- data/spec/controller/error_handling_spec.rb +31 -31
- data/spec/controller/helper_spec.rb +13 -13
- data/spec/controller/http_spec.rb +32 -32
- data/spec/controller/render_spec.rb +59 -59
- data/spec/conveyors/conveyors_spec.rb +32 -32
- data/spec/environment/config_spec.rb +6 -6
- data/spec/environment/environment_spec.rb +7 -7
- data/spec/environment/minimal_app_spec.rb +4 -4
- data/spec/environment/standard_app_spec.rb +10 -10
- data/spec/html/basic_html_helper_spec.rb +6 -6
- data/spec/html/form_helper_spec.rb +5 -5
- data/spec/html/javascript_helper_spec.rb +4 -4
- data/spec/html/model_helper_spec.rb +12 -12
- data/spec/html/scoped_params_spec.rb +2 -2
- data/spec/html/spec_helper.rb +3 -3
- data/spec/http/http_spec.rb +9 -9
- data/spec/http/miscellaneous_spec.rb +2 -2
- data/spec/mailer/mail_controller_spec.rb +23 -23
- data/spec/remote/remote_spec.rb +26 -26
- data/spec/router/alias_router_spec.rb +22 -22
- data/spec/router/basic_router_spec.rb +8 -8
- data/spec/router/configurator_spec.rb +4 -4
- data/spec/router/integration_spec.rb +17 -17
- data/spec/router/object_router_spec.rb +47 -47
- data/spec/router/persistent_params_spec.rb +18 -18
- data/spec/router/restful_router_spec.rb +39 -39
- data/spec/router/router_spec.rb +37 -37
- data/spec/router/routing_helper_spec.rb +18 -18
- data/spec/support/filters_spec.rb +11 -13
- data/spec/template/template_spec.rb +43 -45
- data/spec/template/template_spec/views/layout/content_for/content.erb +3 -1
- data/spec/template/template_spec/views/layout/content_for/layout.erb +1 -1
- data/spec/template/tilt_spec.rb +24 -24
- data/spec/web/basic_spec.rb +25 -25
- data/spec/web/controller_routing_helper_spec.rb +26 -26
- data/spec/web/flash_spec.rb +31 -31
- data/spec/web/protect_from_forgery_spec.rb +44 -44
- data/spec/web/spec_helper_spec.rb +16 -16
- data/spec/web/view_routing_helper_spec.rb +31 -31
- metadata +46 -49
- data/lib/rad/_support/callbacks.rb +0 -166
- data/lib/rad/_support/ruby_ext_with_active_support.rb +0 -4
- data/spec/support/callbacks_spec.rb +0 -157
|
@@ -2,12 +2,12 @@ rad.http
|
|
|
2
2
|
|
|
3
3
|
class HttpLogger < Rad::Conveyors::Processor
|
|
4
4
|
def call
|
|
5
|
-
if workspace.request? and workspace.params?
|
|
6
|
-
method, path, ip, time, format = workspace.request.request_method, workspace.path,
|
|
5
|
+
if workspace.request? and workspace.params?
|
|
6
|
+
method, path, ip, time, format = workspace.request.request_method, workspace.path,
|
|
7
7
|
workspace.request.ip, (workspace.start_time || Time.now), workspace.params.format
|
|
8
8
|
logger.info "RAD started '#{path}' as '#{format}' (for #{ip} at #{time.to_s} with #{method})"
|
|
9
9
|
end
|
|
10
|
-
|
|
10
|
+
|
|
11
11
|
next_processor.call
|
|
12
12
|
end
|
|
13
13
|
end
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
rad.http
|
|
2
2
|
|
|
3
|
-
class HttpWriter < Rad::Conveyors::Processor
|
|
3
|
+
class HttpWriter < Rad::Conveyors::Processor
|
|
4
4
|
def call
|
|
5
5
|
response = workspace.response.must_be.defined
|
|
6
|
-
|
|
6
|
+
|
|
7
7
|
begin
|
|
8
8
|
next_processor.call
|
|
9
9
|
|
|
10
10
|
response.body = workspace.content if response.body.blank? and workspace.content?
|
|
11
|
-
response.content_type ||= Mime[(workspace.params.format if workspace.params?) || rad.http.default_format]
|
|
12
|
-
rescue StandardError => e
|
|
11
|
+
response.content_type ||= Mime[(workspace.params.format if workspace.params?) || rad.http.default_format]
|
|
12
|
+
rescue StandardError => e
|
|
13
13
|
raise e if rad.test?
|
|
14
|
-
|
|
15
|
-
response.clear
|
|
14
|
+
|
|
15
|
+
response.clear
|
|
16
16
|
if workspace.params.format? and workspace.params.format == 'json'
|
|
17
17
|
response.body = {error: (rad.production? ? "Internal error!" : e.message)}.to_json
|
|
18
18
|
response.content_type = Mime.json
|
|
@@ -20,7 +20,7 @@ class HttpWriter < Rad::Conveyors::Processor
|
|
|
20
20
|
response.body = (rad.production? ? "Internal error!" : e.message)
|
|
21
21
|
response.content_type = Mime.text
|
|
22
22
|
end
|
|
23
|
-
|
|
23
|
+
|
|
24
24
|
logger.error e
|
|
25
25
|
logger.info "\n"
|
|
26
26
|
end
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
rad.http
|
|
2
2
|
|
|
3
|
-
#
|
|
3
|
+
#
|
|
4
4
|
# Outdated, Rack does this by themself, keeping it just in case.
|
|
5
|
-
#
|
|
5
|
+
#
|
|
6
6
|
class PrepareParams < Rad::Conveyors::Processor
|
|
7
|
-
def call
|
|
8
|
-
workspace.env.must_be.defined
|
|
9
|
-
workspace.request = Rad::Http::Request.new(workspace.env)
|
|
7
|
+
def call
|
|
8
|
+
workspace.env.must_be.defined
|
|
9
|
+
workspace.request = Rad::Http::Request.new(workspace.env)
|
|
10
10
|
workspace.path = workspace.request.path
|
|
11
11
|
params = workspace.params = Rad::Conveyors::Params.new(workspace.request.params)
|
|
12
12
|
|
data/lib/rad/mailer/_letter.rb
CHANGED
|
@@ -13,7 +13,7 @@ class Rad::Mailer::Letter
|
|
|
13
13
|
from || raise("letter :from not specified!")
|
|
14
14
|
to || raise("letter :to not specified!")
|
|
15
15
|
subject || raise("letter :subject not specified!")
|
|
16
|
-
body || raise("letter :body not specified!")
|
|
16
|
+
body || raise("letter :body not specified!")
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
def deliver
|
data/lib/rad/mailer/_mailer.rb
CHANGED
|
@@ -4,9 +4,9 @@ module Rad::Mailer::MailerController
|
|
|
4
4
|
attr_accessor :from, :to, :subject, :body
|
|
5
5
|
|
|
6
6
|
module ClassMethods
|
|
7
|
-
protected
|
|
7
|
+
protected
|
|
8
8
|
inject conveyors: :conveyors
|
|
9
|
-
|
|
9
|
+
|
|
10
10
|
def method_missing m, *args, &block
|
|
11
11
|
mail_controller = self.new
|
|
12
12
|
if mail_controller.respond_to? m
|
|
@@ -14,13 +14,13 @@ module Rad::Mailer::MailerController
|
|
|
14
14
|
else
|
|
15
15
|
super
|
|
16
16
|
end
|
|
17
|
-
end
|
|
18
|
-
|
|
17
|
+
end
|
|
18
|
+
|
|
19
19
|
def build_letter mail_controller, m, *args
|
|
20
20
|
conveyors.mail.must_be.present
|
|
21
|
-
|
|
21
|
+
|
|
22
22
|
# copying parameter from current workspace if any
|
|
23
|
-
# mail_workspace = rad.workspace? ? rad.workspace.clone : {}
|
|
23
|
+
# mail_workspace = rad.workspace? ? rad.workspace.clone : {}
|
|
24
24
|
# mail_workspace.merge!(
|
|
25
25
|
# controller: mail_controller,
|
|
26
26
|
# method_name: m,
|
data/lib/rad/mailer/_require.rb
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
rad.mailer
|
|
2
2
|
|
|
3
3
|
class LetterBuilder < Rad::Conveyors::Processor
|
|
4
|
-
def call
|
|
4
|
+
def call
|
|
5
5
|
# prepare
|
|
6
6
|
controller = workspace.controller.must_be.present
|
|
7
7
|
raise "The controller #{controller} must be a Rad::Mailer::MailerController!" unless controller.is_a? Rad::Mailer::MailerController
|
|
@@ -9,10 +9,10 @@ class LetterBuilder < Rad::Conveyors::Processor
|
|
|
9
9
|
|
|
10
10
|
# call
|
|
11
11
|
controller.set! params: workspace.params, action_name: workspace.action_name
|
|
12
|
-
content = controller.call action_name, *workspace.arguments
|
|
13
|
-
|
|
12
|
+
content = controller.call action_name, *workspace.arguments
|
|
13
|
+
|
|
14
14
|
controller.body = content unless content.blank?
|
|
15
|
-
|
|
15
|
+
|
|
16
16
|
# letter
|
|
17
17
|
workspace.letter = ::Rad::Mailer::Letter.new(
|
|
18
18
|
from: controller.from,
|
|
@@ -21,8 +21,8 @@ class LetterBuilder < Rad::Conveyors::Processor
|
|
|
21
21
|
body: controller.body
|
|
22
22
|
)
|
|
23
23
|
workspace.letter.validate!
|
|
24
|
-
|
|
24
|
+
|
|
25
25
|
next_processor.call if next_processor
|
|
26
|
-
end
|
|
26
|
+
end
|
|
27
27
|
|
|
28
28
|
end
|
data/lib/rad/profiles/mailer.rb
CHANGED
data/lib/rad/profiles/web.rb
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
#
|
|
1
|
+
#
|
|
2
2
|
# Router
|
|
3
|
-
#
|
|
3
|
+
#
|
|
4
4
|
rad.router.routers = [
|
|
5
5
|
[:alias_router, Rad::Router::AliasRouter.new],
|
|
6
|
-
[:basic_router, Rad::Router::BasicRouter.new],
|
|
6
|
+
[:basic_router, Rad::Router::BasicRouter.new],
|
|
7
7
|
[:restful_router, Rad::Router::RestfulRouter.new],
|
|
8
8
|
[:object_router, Rad::Router::ObjectRouter.new]
|
|
9
9
|
]
|
|
10
10
|
|
|
11
11
|
|
|
12
|
-
#
|
|
12
|
+
#
|
|
13
13
|
# Conveyors
|
|
14
|
-
#
|
|
14
|
+
#
|
|
15
15
|
rad.conveyors.web do |web|
|
|
16
|
-
# conveyor
|
|
16
|
+
# conveyor
|
|
17
17
|
web.use Rad::Conveyors::Processors::ConveyorLogger
|
|
18
18
|
|
|
19
|
-
# http
|
|
19
|
+
# http
|
|
20
20
|
web.use Rad::Http::Processors::HttpWriter
|
|
21
21
|
web.use Rad::Http::Processors::PrepareParams
|
|
22
22
|
web.use Rad::Http::Processors::EvaluateFormat
|
|
@@ -41,7 +41,7 @@ rad.conveyors.web do |web|
|
|
|
41
41
|
# router
|
|
42
42
|
web.use Rad::Router::Processors::Router, :class, :method_name
|
|
43
43
|
|
|
44
|
-
# controller
|
|
44
|
+
# controller
|
|
45
45
|
web.use Rad::Controller::Processors::ControllerLogger
|
|
46
46
|
web.use Rad::Controller::Processors::ControllerCaller
|
|
47
47
|
|
|
@@ -49,20 +49,20 @@ rad.conveyors.web do |web|
|
|
|
49
49
|
end
|
|
50
50
|
|
|
51
51
|
|
|
52
|
-
#
|
|
52
|
+
#
|
|
53
53
|
# RackAdapter
|
|
54
|
-
#
|
|
54
|
+
#
|
|
55
55
|
rad.http.stack.push(-> builder {
|
|
56
56
|
# CommonLogger, ShowExceptions, Lint
|
|
57
57
|
builder.use Rack::Lint if rad.development?
|
|
58
|
-
|
|
58
|
+
|
|
59
59
|
# Static Files
|
|
60
60
|
if rad.http.static? and rad.http.public_path and defined?(Rad::Assets) and rad.development?
|
|
61
|
-
filters = /^\/.*?\/static\/|^\/static\/|\/favicon/
|
|
61
|
+
filters = /^\/.*?\/static\/|^\/static\/|^\/fs\/|\/favicon/
|
|
62
62
|
builder.use Rad::Assets::StaticFiles, filters
|
|
63
63
|
end
|
|
64
64
|
|
|
65
|
-
# use Rack::Session::Cookie, key: 'rack.session', domain: 'foo.com', path: '/', expire_after: 2592000, secret: 'change_me'
|
|
65
|
+
# use Rack::Session::Cookie, key: 'rack.session', domain: 'foo.com', path: '/', expire_after: 2592000, secret: 'change_me'
|
|
66
66
|
builder.use Rack::Session::Cookie, rad.http.session.stringify_keys if rad.http.session
|
|
67
67
|
|
|
68
68
|
# builder.use Rack::CommonLogger
|
|
@@ -3,19 +3,19 @@ rad.remote
|
|
|
3
3
|
class RemoteCaller < Rad::Conveyors::Processor
|
|
4
4
|
# TODO2 :remote isn't registered with rad[
|
|
5
5
|
inject remote: :remote
|
|
6
|
-
|
|
6
|
+
|
|
7
7
|
def initialize next_processor, result_variable = 'content'
|
|
8
8
|
super(next_processor)
|
|
9
9
|
@result_variable = result_variable
|
|
10
10
|
end
|
|
11
|
-
|
|
12
|
-
def call
|
|
11
|
+
|
|
12
|
+
def call
|
|
13
13
|
return next_processor.call unless workspace.class?
|
|
14
|
-
|
|
14
|
+
|
|
15
15
|
# prepare
|
|
16
16
|
klass = workspace.class
|
|
17
17
|
raise "The remote class #{klass} must be a Rad::Remote::RemoteController!" unless klass.is? Rad::Remote::RemoteController
|
|
18
|
-
workspace.remote_object = klass.new
|
|
18
|
+
workspace.remote_object = klass.new
|
|
19
19
|
method = workspace.method_name
|
|
20
20
|
|
|
21
21
|
# call
|
|
@@ -23,26 +23,26 @@ class RemoteCaller < Rad::Conveyors::Processor
|
|
|
23
23
|
result = workspace.remote_object.run_callbacks :action, method: method do
|
|
24
24
|
workspace.remote_object.send method
|
|
25
25
|
end
|
|
26
|
-
|
|
26
|
+
|
|
27
27
|
ensure_correct_result! result
|
|
28
|
-
workspace.remote_result = result
|
|
28
|
+
workspace.remote_result = result
|
|
29
29
|
|
|
30
30
|
next_processor.call
|
|
31
31
|
|
|
32
32
|
# write JSON as a result if format is JSON and no one else filled it
|
|
33
33
|
if workspace[@result_variable].blank?
|
|
34
34
|
workspace[@result_variable] = workspace.remote_result.to_json
|
|
35
|
-
end
|
|
35
|
+
end
|
|
36
36
|
rescue StandardError => e
|
|
37
37
|
raise e if !workspace.params.format == 'json' or rad.test?
|
|
38
|
-
|
|
38
|
+
|
|
39
39
|
workspace[@result_variable] = {error: e.message}.to_json
|
|
40
40
|
|
|
41
41
|
logger.error e
|
|
42
42
|
logger.info "\n"
|
|
43
43
|
end
|
|
44
44
|
end
|
|
45
|
-
|
|
45
|
+
|
|
46
46
|
private
|
|
47
47
|
def ensure_correct_result! result
|
|
48
48
|
unless result.rson?
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
module Rad::Router::AbstractRouter
|
|
2
|
-
|
|
2
|
+
|
|
3
3
|
class Meta < Hash
|
|
4
4
|
def get_class
|
|
5
5
|
@klass ||= self[:class_name].constantize
|
|
@@ -13,36 +13,36 @@ module Rad::Router::AbstractRouter
|
|
|
13
13
|
url_root = nil if url_root == '/'
|
|
14
14
|
url_root
|
|
15
15
|
end
|
|
16
|
-
|
|
17
|
-
def parse_prefix options
|
|
16
|
+
|
|
17
|
+
def parse_prefix options
|
|
18
18
|
prefix = Array(options[:prefix])
|
|
19
19
|
prefix.empty? ? nil : prefix
|
|
20
20
|
end
|
|
21
21
|
|
|
22
22
|
def encode_prefix_params! path, params, prefix
|
|
23
23
|
parts = []
|
|
24
|
-
prefix.each do |name|
|
|
24
|
+
prefix.each do |name|
|
|
25
25
|
value = params.delete(name) || (rad.workspace? && rad.workspace.params[name])
|
|
26
26
|
raise "not provided :#{name} prefix!" unless value
|
|
27
27
|
parts << value.to_param.to_s.url_escape
|
|
28
28
|
end
|
|
29
29
|
"/#{parts.join('/')}#{path}"
|
|
30
30
|
end
|
|
31
|
-
|
|
31
|
+
|
|
32
32
|
# def encode_url_root! path, meta
|
|
33
33
|
# if url_root = meta[:url_root]
|
|
34
|
-
# "#{url_root}#{path}"
|
|
34
|
+
# "#{url_root}#{path}"
|
|
35
35
|
# else
|
|
36
36
|
# path
|
|
37
37
|
# end
|
|
38
38
|
# end
|
|
39
|
-
|
|
39
|
+
|
|
40
40
|
def decode_prefix_params! parts, params, prefix
|
|
41
|
-
prefix.each do |name|
|
|
41
|
+
prefix.each do |name|
|
|
42
42
|
params[name] = parts.shift || raise("not provided :#{name} prefix!")
|
|
43
43
|
end
|
|
44
44
|
end
|
|
45
|
-
|
|
45
|
+
|
|
46
46
|
def decode_url_root! parts, url_root
|
|
47
47
|
raise 'not implemented'
|
|
48
48
|
# raise "invalid :url_root!" if meta[:url_root] and meta[:url_root] != "/#{parts.join('/')}"
|
|
@@ -4,64 +4,64 @@ class Rad::Router::AliasRouter
|
|
|
4
4
|
class TreeHash < Hash
|
|
5
5
|
attr_accessor :meta
|
|
6
6
|
end
|
|
7
|
-
|
|
7
|
+
|
|
8
8
|
def initialize
|
|
9
9
|
@route_methods, @paths, @classes = {}, TreeHash.new, {}
|
|
10
10
|
end
|
|
11
11
|
|
|
12
|
-
def add als, options = {}
|
|
13
|
-
# parsing options
|
|
12
|
+
def add als, options = {}
|
|
13
|
+
# parsing options
|
|
14
14
|
# als, options = als.to_s, options.to_openobject
|
|
15
15
|
options.validate_options! :class_name, :method, :url_root, :prefix
|
|
16
|
-
|
|
16
|
+
|
|
17
17
|
als = als.to_s
|
|
18
18
|
als.must =~ /^\//
|
|
19
19
|
class_name = options.delete(:class_name) || raise("no class name!")
|
|
20
20
|
class_name.must_be.a String
|
|
21
21
|
method = options.delete(:method) || raise("no method!")
|
|
22
|
-
method = method.must_be.a Symbol
|
|
22
|
+
method = method.must_be.a Symbol
|
|
23
23
|
url_root = parse_url_root options
|
|
24
24
|
prefix = parse_prefix options
|
|
25
|
-
|
|
25
|
+
|
|
26
26
|
raise "you can't use '/' alias with :url_root!" if als == '/' and url_root
|
|
27
|
-
|
|
28
|
-
# logic
|
|
27
|
+
|
|
28
|
+
# logic
|
|
29
29
|
meta = Meta.new
|
|
30
30
|
meta.merge!(
|
|
31
|
-
class_name: class_name,
|
|
31
|
+
class_name: class_name,
|
|
32
32
|
method: method,
|
|
33
|
-
path: als,
|
|
34
|
-
url_root: url_root,
|
|
33
|
+
path: als,
|
|
34
|
+
url_root: url_root,
|
|
35
35
|
prefix: prefix
|
|
36
36
|
)
|
|
37
|
-
|
|
38
|
-
route_methods["#{als[1..-1]}_path"] = meta
|
|
39
|
-
|
|
37
|
+
|
|
38
|
+
route_methods["#{als[1..-1]}_path"] = meta
|
|
39
|
+
|
|
40
40
|
(classes[class_name] ||= {})[method] = meta
|
|
41
|
-
|
|
42
|
-
|
|
41
|
+
|
|
42
|
+
|
|
43
43
|
parts = als[1..-1].split('/')
|
|
44
44
|
parts << '' if parts.empty?
|
|
45
|
-
|
|
45
|
+
|
|
46
46
|
tree_iterator = paths
|
|
47
47
|
parts.reverse.each do |part|
|
|
48
|
-
tree_iterator = (tree_iterator[part] ||= TreeHash.new)
|
|
48
|
+
tree_iterator = (tree_iterator[part] ||= TreeHash.new)
|
|
49
49
|
raise "alias '#{als}' conflicted with another alias ('#{tree_iterator.meta[:path]}')!" if tree_iterator.meta
|
|
50
50
|
end
|
|
51
51
|
tree_iterator.meta = meta
|
|
52
52
|
end
|
|
53
53
|
|
|
54
|
-
def encode klass, method, params
|
|
54
|
+
def encode klass, method, params
|
|
55
55
|
if meta = classes[klass.name].try(:[], method)
|
|
56
56
|
path = meta[:path]
|
|
57
|
-
|
|
57
|
+
|
|
58
58
|
# prefix
|
|
59
59
|
prefix = meta[:prefix]
|
|
60
60
|
path = encode_prefix_params! path, params, prefix if prefix
|
|
61
|
-
|
|
61
|
+
|
|
62
62
|
url_root = meta[:url_root]
|
|
63
63
|
params[:url_root] = url_root if url_root
|
|
64
|
-
|
|
64
|
+
|
|
65
65
|
return path, params
|
|
66
66
|
else
|
|
67
67
|
nil
|
|
@@ -71,36 +71,36 @@ class Rad::Router::AliasRouter
|
|
|
71
71
|
def decode path, params
|
|
72
72
|
parts = path[1..-1].split('/')
|
|
73
73
|
parts << '' if parts.empty?
|
|
74
|
-
|
|
74
|
+
|
|
75
75
|
tree_iterator = paths
|
|
76
|
-
|
|
76
|
+
|
|
77
77
|
# checking for first part
|
|
78
78
|
part = parts.pop
|
|
79
|
-
tree_iterator = tree_iterator[part]
|
|
80
|
-
return nil unless tree_iterator
|
|
79
|
+
tree_iterator = tree_iterator[part]
|
|
80
|
+
return nil unless tree_iterator
|
|
81
81
|
|
|
82
|
-
# checking for exact match
|
|
82
|
+
# checking for exact match
|
|
83
83
|
while part = parts.pop
|
|
84
84
|
tmp = tree_iterator[part]
|
|
85
85
|
unless tmp
|
|
86
86
|
parts << part
|
|
87
|
-
break
|
|
87
|
+
break
|
|
88
88
|
end
|
|
89
89
|
tree_iterator = tmp
|
|
90
|
-
end
|
|
90
|
+
end
|
|
91
91
|
|
|
92
92
|
meta = tree_iterator.meta
|
|
93
|
-
|
|
93
|
+
|
|
94
94
|
# url_root
|
|
95
95
|
url_root = meta[:url_root]
|
|
96
96
|
return nil if url_root and "/#{parts.shift}" != url_root
|
|
97
|
-
|
|
97
|
+
|
|
98
98
|
# prefix
|
|
99
99
|
prefix = meta[:prefix]
|
|
100
|
-
decode_prefix_params! parts, params, prefix if prefix
|
|
101
|
-
|
|
100
|
+
decode_prefix_params! parts, params, prefix if prefix
|
|
101
|
+
|
|
102
102
|
return meta.get_class, meta[:method], params
|
|
103
|
-
end
|
|
103
|
+
end
|
|
104
104
|
|
|
105
105
|
def encode_method route_method, has_id
|
|
106
106
|
if meta = route_methods[route_method]
|