rad_core 0.0.13
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 +10 -0
- data/lib/rad/controller/abstract_controller/micelaneous.rb +31 -0
- data/lib/rad/controller/abstract_controller/render.rb +160 -0
- data/lib/rad/controller/abstract_controller/responder.rb +17 -0
- data/lib/rad/controller/abstract_controller.rb +64 -0
- data/lib/rad/controller/controller_context.rb +15 -0
- data/lib/rad/controller/http_controller.rb +48 -0
- data/lib/rad/controller/processors/controller_caller.rb +28 -0
- data/lib/rad/controller/processors/controller_error_handling.rb +51 -0
- data/lib/rad/controller/processors/controller_logger.rb +12 -0
- data/lib/rad/controller.rb +28 -0
- data/lib/rad/conveyor/conveyor.rb +74 -0
- data/lib/rad/conveyor/conveyors.rb +20 -0
- data/lib/rad/conveyor/params.rb +14 -0
- data/lib/rad/conveyor/processor.rb +68 -0
- data/lib/rad/conveyor/processors/conveyor_logger.rb +25 -0
- data/lib/rad/conveyor/workspace.rb +36 -0
- data/lib/rad/conveyor.rb +29 -0
- data/lib/rad/environment/config.rb +111 -0
- data/lib/rad/environment/dependency_resolver.rb +107 -0
- data/lib/rad/environment/environment.rb +29 -0
- data/lib/rad/environment/files_helper.rb +55 -0
- data/lib/rad/environment/logger.rb +21 -0
- data/lib/rad/environment.rb +55 -0
- data/lib/rad/html/flash.rb +42 -0
- data/lib/rad/html/helpers/basic_html_helper.rb +83 -0
- data/lib/rad/html/helpers/flash_helper.rb +5 -0
- data/lib/rad/html/helpers/form_helper.rb +115 -0
- data/lib/rad/html/helpers/html_helper.rb +5 -0
- data/lib/rad/html/helpers/javascript_helper.rb +18 -0
- data/lib/rad/html/helpers/model_helper.rb +135 -0
- data/lib/rad/html/include_into_controller.rb +0 -0
- data/lib/rad/html/processors/prepare_flash.rb +26 -0
- data/lib/rad/html/processors/scoped_params.rb +26 -0
- data/lib/rad/html.rb +26 -0
- data/lib/rad/http/http.rb +21 -0
- data/lib/rad/http/http_adapter.rb +36 -0
- data/lib/rad/http/middleware/static_files.rb +21 -0
- data/lib/rad/http/processors/evaluate_format.rb +22 -0
- data/lib/rad/http/processors/http_logger.rb +15 -0
- data/lib/rad/http/processors/http_writer.rb +30 -0
- data/lib/rad/http/processors/prepare_params.rb +22 -0
- data/lib/rad/http/support/rack/fixes.rb +36 -0
- data/lib/rad/http/support/rack/rack_adapter.rb +67 -0
- data/lib/rad/http/support/rack/request.rb +42 -0
- data/lib/rad/http/support/rack/response.rb +86 -0
- data/lib/rad/http.rb +48 -0
- data/lib/rad/integration/controller_micelaneous_helper.rb +19 -0
- data/lib/rad/integration/router/abstract_routing_helper.rb +22 -0
- data/lib/rad/integration/router/controller_routing_helper.rb +58 -0
- data/lib/rad/integration/router/view_routing_helper.rb +104 -0
- data/lib/rad/integration.rb +30 -0
- data/lib/rad/mail/letter.rb +30 -0
- data/lib/rad/mail/mail_controller.rb +31 -0
- data/lib/rad/mail/mailer.rb +23 -0
- data/lib/rad/mail/processors/letter_builder.rb +36 -0
- data/lib/rad/mail.rb +15 -0
- data/lib/rad/profiles/mail.rb +16 -0
- data/lib/rad/profiles/web.rb +68 -0
- data/lib/rad/profiles/web_require.rb +5 -0
- data/lib/rad/remote/processors/remote_caller.rb +54 -0
- data/lib/rad/remote/processors/remote_logger.rb +13 -0
- data/lib/rad/remote/remote.rb +15 -0
- data/lib/rad/remote.rb +9 -0
- data/lib/rad/router/core/configurator.rb +25 -0
- data/lib/rad/router/core/core_routing_helper.rb +41 -0
- data/lib/rad/router/core/default_format_processor.rb +12 -0
- data/lib/rad/router/core/processors/router.rb +29 -0
- data/lib/rad/router/core/router.rb +271 -0
- data/lib/rad/router/core/simple_router.rb +23 -0
- data/lib/rad/router/routers/abstract_router.rb +62 -0
- data/lib/rad/router/routers/alias_router.rb +113 -0
- data/lib/rad/router/routers/restful_router.rb +113 -0
- data/lib/rad/router.rb +29 -0
- data/lib/rad/spec/controller.rb +41 -0
- data/lib/rad/spec/environment.rb +51 -0
- data/lib/rad/spec/http.rb +93 -0
- data/lib/rad/spec/mail.rb +31 -0
- data/lib/rad/spec/remote.rb +9 -0
- data/lib/rad/spec/router.rb +18 -0
- data/lib/rad/spec/template.rb +12 -0
- data/lib/rad/spec/view.rb +10 -0
- data/lib/rad/spec/xhtml.rb +33 -0
- data/lib/rad/spec.rb +11 -0
- data/lib/rad/support/active_support/locales/en/actionpack.yml +154 -0
- data/lib/rad/support/active_support/locales/en/activesupport.yml +36 -0
- data/lib/rad/support/active_support/micelaneous.rb +2 -0
- data/lib/rad/support/active_support/time.rb +105 -0
- data/lib/rad/support/active_support.rb +49 -0
- data/lib/rad/support/addressable.rb +45 -0
- data/lib/rad/support/buffered_logger.rb +44 -0
- data/lib/rad/support/callbacks.rb +168 -0
- data/lib/rad/support/exception.rb +31 -0
- data/lib/rad/support/filters.rb +34 -0
- data/lib/rad/support/format.rb +17 -0
- data/lib/rad/support/hacks_and_fixes.rb +23 -0
- data/lib/rad/support/micon.rb +13 -0
- data/lib/rad/support/mime.rb +13 -0
- data/lib/rad/support/module.rb +48 -0
- data/lib/rad/support/rson.rb +53 -0
- data/lib/rad/support/ruby_ext_with_active_support.rb +4 -0
- data/lib/rad/support/string.rb +26 -0
- data/lib/rad/support.rb +63 -0
- data/lib/rad/template/support/tilt.rb +68 -0
- data/lib/rad/template/support/tilt_fixes.rb +17 -0
- data/lib/rad/template/template.rb +250 -0
- data/lib/rad/template/template_context.rb +62 -0
- data/lib/rad/template.rb +25 -0
- data/lib/rad_core/gems.rb +31 -0
- data/readme.md +33 -0
- data/spec/controller/abstract_controller_spec/views/OperationsOrderSpec/action.erb +1 -0
- data/spec/controller/abstract_controller_spec/views/ViewVariablesSpec/action.erb +11 -0
- data/spec/controller/abstract_controller_spec.rb +132 -0
- data/spec/controller/controller_context_spec/views/ItemSpec/actions.erb +4 -0
- data/spec/controller/controller_context_spec/views/ItemSpec/show.erb +0 -0
- data/spec/controller/controller_context_spec/views/ItemSpec/update.erb +0 -0
- data/spec/controller/controller_context_spec/views/NamespaceSpec/ClassSpec/show.erb +0 -0
- data/spec/controller/controller_context_spec/views/PageSpec/actions.erb +3 -0
- data/spec/controller/controller_context_spec/views/PageSpec/show.erb +0 -0
- data/spec/controller/controller_context_spec/views/namespace_spec/class_spec/update.erb +0 -0
- data/spec/controller/controller_context_spec.rb +123 -0
- data/spec/controller/controller_helper_spec/views/HelperMethodSpec/action.erb +1 -0
- data/spec/controller/controller_helper_spec/views/HelperSpec/action.erb +1 -0
- data/spec/controller/controller_helper_spec.rb +53 -0
- data/spec/controller/controller_render_spec/views/AlreadyRenderedSpec/action.erb +1 -0
- data/spec/controller/controller_render_spec/views/AlreadyRenderedSpec/custom_template.erb +1 -0
- data/spec/controller/controller_render_spec/views/AnotherActionSpec/another_action.erb +1 -0
- data/spec/controller/controller_render_spec/views/AnotherLayout/action.erb +1 -0
- data/spec/controller/controller_render_spec/views/ForbidPartialAsActionSpec/_action.erb +1 -0
- data/spec/controller/controller_render_spec/views/FormatSpec/action.html.erb +1 -0
- data/spec/controller/controller_render_spec/views/FormatSpec/action.js.erb +1 -0
- data/spec/controller/controller_render_spec/views/LayoutFiltersSpec/action_with_layout.erb +1 -0
- data/spec/controller/controller_render_spec/views/LayoutFiltersSpec/action_without_layout.erb +1 -0
- data/spec/controller/controller_render_spec/views/LayoutSpec/action.erb +1 -0
- data/spec/controller/controller_render_spec/views/MultipleActions/actions.haml +7 -0
- data/spec/controller/controller_render_spec/views/layouts/admin.erb +1 -0
- data/spec/controller/controller_render_spec/views/layouts/app.html.erb +1 -0
- data/spec/controller/controller_render_spec/views/layouts/app.js.erb +1 -0
- data/spec/controller/controller_render_spec/views/rem ExplicitRenderSpec/action.erb +1 -0
- data/spec/controller/controller_render_spec/views/rem ExplicitRenderSpec/another_action.erb +1 -0
- data/spec/controller/controller_render_spec/views/some_template.erb +1 -0
- data/spec/controller/controller_render_spec/views/standalone.html.erb +1 -0
- data/spec/controller/controller_render_spec.rb +217 -0
- data/spec/controller/error_handling_spec/views/diferrent_error_handling_spec/a.erb +1 -0
- data/spec/controller/error_handling_spec/views/diferrent_error_handling_spec/b.erb +1 -0
- data/spec/controller/error_handling_spec/views/diferrent_error_handling_spec/c.erb +1 -0
- data/spec/controller/error_handling_spec.rb +117 -0
- data/spec/controller/http_controller_spec.rb +130 -0
- data/spec/controller/spec_helper.rb +19 -0
- data/spec/conveyor/conveyor_spec.rb +124 -0
- data/spec/conveyor/spec_helper.rb +3 -0
- data/spec/environment/config_spec/config.default.yml +3 -0
- data/spec/environment/config_spec/config.development.yml +3 -0
- data/spec/environment/config_spec/config.yml +5 -0
- data/spec/environment/config_spec.rb +30 -0
- data/spec/environment/environment_spec/path1/file1 +0 -0
- data/spec/environment/environment_spec/path1/some_folder/some_file +0 -0
- data/spec/environment/environment_spec/path2/file2 +0 -0
- data/spec/environment/environment_spec/path2/some_folder/some_file +0 -0
- data/spec/environment/environment_spec.rb +65 -0
- data/spec/environment/logger_spec.rb +19 -0
- data/spec/environment/minimal_app_spec/app.rb +1 -0
- data/spec/environment/minimal_app_spec.rb +25 -0
- data/spec/environment/spec_helper.rb +1 -0
- data/spec/environment/standard_app_spec/app/lib/app/init.rb +3 -0
- data/spec/environment/standard_app_spec/plugin_a/lib/plugin_a/init.rb +1 -0
- data/spec/environment/standard_app_spec/plugin_b/lib/emptygit +0 -0
- data/spec/environment/standard_app_spec.rb +48 -0
- data/spec/html/basic_html_helper_spec.rb +29 -0
- data/spec/html/form_helper_spec.rb +63 -0
- data/spec/html/javascript_helper_spec.rb +15 -0
- data/spec/html/model_helper_spec.rb +81 -0
- data/spec/html/scoped_params_spec.rb +15 -0
- data/spec/html/spec_helper.rb +28 -0
- data/spec/http/http_spec/app/lib/app/init.rb +10 -0
- data/spec/http/http_spec/app/runtime/public/emptygit +0 -0
- data/spec/http/http_spec/plugin_a/lib/plugin_a/init.rb +0 -0
- data/spec/http/http_spec/plugin_b/lib/plugin_b/init.rb +5 -0
- data/spec/http/http_spec/plugin_b/static/emptygit +0 -0
- data/spec/http/http_spec.rb +51 -0
- data/spec/http/micelaneous_spec.rb +13 -0
- data/spec/http/spec_helper.rb +5 -0
- data/spec/integration/basic_spec/views/smoke_test_spec/action.erb +1 -0
- data/spec/integration/basic_spec.rb +79 -0
- data/spec/integration/controller_routing_helper_spec.rb +84 -0
- data/spec/integration/flash_spec.rb +206 -0
- data/spec/integration/spec_helper.rb +5 -0
- data/spec/integration/spec_helper_spec.rb +63 -0
- data/spec/integration/view_routing_helper_spec.rb +134 -0
- data/spec/mail/mail_controller_spec/views/body_template_spec/signup.erb +1 -0
- data/spec/mail/mail_controller_spec.rb +61 -0
- data/spec/mail/spec_helper.rb +7 -0
- data/spec/remote/remote_spec.rb +75 -0
- data/spec/remote/spec_helper.rb +17 -0
- data/spec/router/alias_router_spec.rb +98 -0
- data/spec/router/basic_spec.rb +111 -0
- data/spec/router/configurator_spec.rb +18 -0
- data/spec/router/integration_spec.rb +42 -0
- data/spec/router/persistent_params_spec.rb +65 -0
- data/spec/router/restful_router_spec.rb +120 -0
- data/spec/router/routing_helper_spec.rb +55 -0
- data/spec/router/spec_helper.rb +20 -0
- data/spec/support/callbacks_spec.rb +157 -0
- data/spec/support/filters_spec.rb +60 -0
- data/spec/support/spec_helper.rb +4 -0
- data/spec/template/spec_helper.rb +6 -0
- data/spec/template/template_spec/file.erb +1 -0
- data/spec/template/template_spec/views/basic/custom_context.erb +1 -0
- data/spec/template/template_spec/views/basic/extension.erb +1 -0
- data/spec/template/template_spec/views/basic/general.html.erb +5 -0
- data/spec/template/template_spec/views/basic/non_existing_format.html.erb +0 -0
- data/spec/template/template_spec/views/format/format.erb +1 -0
- data/spec/template/template_spec/views/format/format.html.erb +1 -0
- data/spec/template/template_spec/views/format/format.js.erb +1 -0
- data/spec/template/template_spec/views/format_for_partials/_form.html.erb +1 -0
- data/spec/template/template_spec/views/format_for_partials/dialog.js.erb +1 -0
- data/spec/template/template_spec/views/layout/basic/content.erb +1 -0
- data/spec/template/template_spec/views/layout/basic/layout.erb +1 -0
- data/spec/template/template_spec/views/layout/content_for/content.erb +3 -0
- data/spec/template/template_spec/views/layout/content_for/layout.erb +3 -0
- data/spec/template/template_spec/views/layout/format/content.html.erb +1 -0
- data/spec/template/template_spec/views/layout/format/content.js.erb +1 -0
- data/spec/template/template_spec/views/layout/format/layout.html.erb +1 -0
- data/spec/template/template_spec/views/layout/format/layout.js.erb +1 -0
- data/spec/template/template_spec/views/layout/nested_yield/a.erb +1 -0
- data/spec/template/template_spec/views/layout/nested_yield/layout.erb +1 -0
- data/spec/template/template_spec/views/layout/nested_yield/layout_b.erb +1 -0
- data/spec/template/template_spec/views/layout/same_context/a.erb +1 -0
- data/spec/template/template_spec/views/layout/same_context/b.erb +1 -0
- data/spec/template/template_spec/views/layout/same_context/layout.erb +1 -0
- data/spec/template/template_spec/views/nested/format/a.erb +1 -0
- data/spec/template/template_spec/views/nested/format/b.erb +1 -0
- data/spec/template/template_spec/views/nested/relative/a.erb +1 -0
- data/spec/template/template_spec/views/nested/relative/b.erb +1 -0
- data/spec/template/template_spec/views/nested/relative/c.erb +1 -0
- data/spec/template/template_spec/views/nested/shared/c.erb +1 -0
- data/spec/template/template_spec/views/nesting_format/_edit.html.erb +1 -0
- data/spec/template/template_spec/views/nesting_format/_form.html.erb +1 -0
- data/spec/template/template_spec/views/nesting_format/dialog.js.erb +1 -0
- data/spec/template/template_spec/views/other/template.erb +1 -0
- data/spec/template/template_spec/views/prefixes/_underscored.erb +1 -0
- data/spec/template/template_spec/views/prefixes/without_prefix.erb +1 -0
- data/spec/template/template_spec.rb +204 -0
- data/spec/template/tilt_spec/views/concat_and_capture.erb +1 -0
- data/spec/template/tilt_spec/views/concat_and_capture.haml +3 -0
- data/spec/template/tilt_spec/views/encoding/erb.erb +1 -0
- data/spec/template/tilt_spec/views/encoding/haml.haml +1 -0
- data/spec/template/tilt_spec/views/errors.erb +3 -0
- data/spec/template/tilt_spec/views/errors.haml +3 -0
- data/spec/template/tilt_spec/views/mixed_templates/broken_erb_concat_erb.erb +4 -0
- data/spec/template/tilt_spec/views/mixed_templates/broken_erb_concat_haml.haml +1 -0
- data/spec/template/tilt_spec/views/mixed_templates/broken_haml_concat_erb.erb +1 -0
- data/spec/template/tilt_spec/views/mixed_templates/broken_haml_concat_haml.haml +2 -0
- data/spec/template/tilt_spec/views/nested_capture_and_concat.haml +3 -0
- data/spec/template/tilt_spec/views/ugly.haml +3 -0
- data/spec/template/tilt_spec/views/yield.erb +1 -0
- data/spec/template/tilt_spec.rb +98 -0
- metadata +531 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module Rad
|
|
2
|
+
module JavascriptHelper
|
|
3
|
+
def javascript_include_tag *scripts
|
|
4
|
+
Array(scripts).collect{|script|
|
|
5
|
+
tag :script, '', src: "#{config && config.url_root!}#{script}", type: "text/javascript"
|
|
6
|
+
}.join("\n")
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def javascript_tag value = nil, &block
|
|
10
|
+
args = [{type: "text/javascript"}]
|
|
11
|
+
args.unshift value if value
|
|
12
|
+
tag :script, *args, &block
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Escape
|
|
16
|
+
def js obj; obj.to_s.js_escape end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
module Rad
|
|
2
|
+
class ModelHelper
|
|
3
|
+
attr_accessor :template, :model_name, :model, :options, :form_helper
|
|
4
|
+
|
|
5
|
+
def initialize template, form_helper, model_name, model, options
|
|
6
|
+
self.template, self.form_helper, self.model_name, self.model, self.options = template, form_helper, model_name, model, options
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
#
|
|
11
|
+
# Helpers
|
|
12
|
+
#
|
|
13
|
+
def check_box name, options = {}
|
|
14
|
+
render_attribute name, options do |fname, value, o|
|
|
15
|
+
form_helper.check_box_tag fname, !!value, o
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def file_field name, options = {}
|
|
20
|
+
render_attribute name, options do |fname, value, o|
|
|
21
|
+
form_helper.file_field_tag fname, o
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def hidden_field name, options = {}
|
|
26
|
+
render_attribute name, options do |fname, value, o|
|
|
27
|
+
form_helper.hidden_field_tag fname, value, o
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def password_field name, options = {}
|
|
32
|
+
render_attribute name, options do |fname, value, o|
|
|
33
|
+
form_helper.password_field_tag fname, nil, o
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def radio_button name, options = {}
|
|
38
|
+
render_attribute name, options do |fname, value, o|
|
|
39
|
+
form_helper.radio_button_tag fname, !!value, o
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def submit value, options = {}
|
|
44
|
+
form_helper.submit_tag value, options
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def text_field name, options = {}
|
|
48
|
+
render_attribute name, options do |fname, value, o|
|
|
49
|
+
form_helper.text_field_tag fname, value, o
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def text_area name, options = {}
|
|
54
|
+
render_attribute name, options do |fname, value, o|
|
|
55
|
+
form_helper.text_area_tag fname, value, o
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def select name, values, options = {}
|
|
60
|
+
render_attribute name, options do |fname, value, o|
|
|
61
|
+
form_helper.select_tag fname, value, values, o
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def error_messages
|
|
66
|
+
merrors = errors[:base]
|
|
67
|
+
form_helper.error_messages merrors.to_a unless merrors.blank?
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
protected
|
|
72
|
+
def method_missing m, *args, &b
|
|
73
|
+
form_helper.send m, *args, &b
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def render_attribute name, options, &block
|
|
77
|
+
name.must_be.a Symbol
|
|
78
|
+
ferrors = errors_for(name)
|
|
79
|
+
|
|
80
|
+
options = insert_human_readable_label name, options
|
|
81
|
+
|
|
82
|
+
if form_helper.respond_to? :field_with_errors
|
|
83
|
+
field_html = block.call field_name_for(name), value_of(name), options
|
|
84
|
+
unless ferrors.blank?
|
|
85
|
+
form_helper.field_with_errors name, ferrors, options, field_html
|
|
86
|
+
else
|
|
87
|
+
field_html
|
|
88
|
+
end
|
|
89
|
+
else
|
|
90
|
+
options[:errors] = ferrors
|
|
91
|
+
block.call field_name_for(name), value_of(name), options
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def errors
|
|
96
|
+
unless @errors
|
|
97
|
+
@errors = {}
|
|
98
|
+
(
|
|
99
|
+
(model.respond_to?(:errors) && model.errors) ||
|
|
100
|
+
(model.respond_to?(:[]) && (model['errors'] || model[:errors])) ||
|
|
101
|
+
{}
|
|
102
|
+
).each do |k, v|
|
|
103
|
+
@errors[k.to_sym] = Array.wrap(v)
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
@errors
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def errors_for name
|
|
110
|
+
name.must_be.a Symbol
|
|
111
|
+
errors[name]
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def field_name_for name
|
|
115
|
+
"#{model_name}[#{name}]"
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def value_of name
|
|
119
|
+
if model.respond_to? name
|
|
120
|
+
model.send name
|
|
121
|
+
elsif model.respond_to? :[]
|
|
122
|
+
model[name.to_sym] || model[name.to_s]
|
|
123
|
+
else
|
|
124
|
+
raise "Model not respond to :#{name} nor to :[]!"
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def insert_human_readable_label name, options
|
|
129
|
+
unless options.include?(:label) or options.include?(:label)
|
|
130
|
+
options[:label] = model.t(name) if model.respond_to? :t
|
|
131
|
+
end
|
|
132
|
+
options
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
end
|
|
File without changes
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
module Rad
|
|
2
|
+
module Processors
|
|
3
|
+
class PrepareFlash < Processor
|
|
4
|
+
|
|
5
|
+
def call
|
|
6
|
+
workspace.request.must_be.present
|
|
7
|
+
workspace.params.must_be.defined
|
|
8
|
+
|
|
9
|
+
previous_messages = workspace.request.session.delete 'flash'
|
|
10
|
+
if previous_messages.present?
|
|
11
|
+
previous_messages = JSON.load previous_messages
|
|
12
|
+
rad[:flash] = Rad::Flash.new workspace.params.format, previous_messages
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
next_processor.call
|
|
16
|
+
|
|
17
|
+
if rad.include? :flash
|
|
18
|
+
flash = rad[:flash]
|
|
19
|
+
messages = flash.messages_for_next_request
|
|
20
|
+
workspace.request.must_be.present
|
|
21
|
+
workspace.request.session['flash'] = messages.to_json unless messages.empty?
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Converts {'model[attribute]' => value} into {'model' => {'attribute' => value}}
|
|
2
|
+
module Rad
|
|
3
|
+
module Processors
|
|
4
|
+
class ScopedParams < Processor
|
|
5
|
+
def call
|
|
6
|
+
if workspace.params?
|
|
7
|
+
to_delete = []
|
|
8
|
+
to_add = {}
|
|
9
|
+
workspace.params.each do |name, value|
|
|
10
|
+
name.to_s.scan /(.+)\[(.+)\]/ do |scope_name, name_in_scope|
|
|
11
|
+
logger.warn "Owerriding :#{scope} param!" if workspace.params.include? scope_name
|
|
12
|
+
scope = to_add[scope_name.to_sym] ||= {}
|
|
13
|
+
scope[name_in_scope] = value
|
|
14
|
+
to_delete << name
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
workspace.params.merge! to_add
|
|
18
|
+
to_delete.each{|n| workspace.params.delete n}
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
next_processor.call
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
data/lib/rad/html.rb
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
require 'rad/http'
|
|
2
|
+
require 'rad/template'
|
|
3
|
+
|
|
4
|
+
[
|
|
5
|
+
'flash',
|
|
6
|
+
|
|
7
|
+
'helpers/basic_html_helper',
|
|
8
|
+
'helpers/form_helper',
|
|
9
|
+
'helpers/model_helper',
|
|
10
|
+
'helpers/javascript_helper',
|
|
11
|
+
'helpers/flash_helper',
|
|
12
|
+
'helpers/html_helper',
|
|
13
|
+
|
|
14
|
+
'processors/scoped_params',
|
|
15
|
+
'processors/prepare_flash'
|
|
16
|
+
].each{|f| require "rad/html/#{f}"}
|
|
17
|
+
|
|
18
|
+
# Flash
|
|
19
|
+
rad.register :flash, scope: :cycle, depends_on: :environment do
|
|
20
|
+
workspace = rad[:workspace]
|
|
21
|
+
workspace.params.must_be.defined
|
|
22
|
+
Rad::Flash.new workspace.params.format
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Initialization
|
|
26
|
+
Rad::Config::DEFAULTS[:remote_link_formats] = ['js', 'json']
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module Rad
|
|
2
|
+
module HTTP
|
|
3
|
+
class << self
|
|
4
|
+
inject environment: :environment, config: :config
|
|
5
|
+
|
|
6
|
+
def ensure_public_symlink symlink_name, plugin_public_folder
|
|
7
|
+
plugin_public_folder = File.expand_path(plugin_public_folder)
|
|
8
|
+
File.must.exist(plugin_public_folder)
|
|
9
|
+
|
|
10
|
+
environment.must_be.defined
|
|
11
|
+
if environment.config.static? and !environment.config.test?
|
|
12
|
+
symlink_path = "#{config.public_dir!}/#{symlink_name}"
|
|
13
|
+
unless File.exist?(symlink_path) # and File.symlink?(symlink_path)
|
|
14
|
+
# File.delete(symlink_path) if File.symlink?(symlink_path)
|
|
15
|
+
File.symlink(plugin_public_folder, symlink_path)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
module Rad
|
|
2
|
+
module HTTPAdapter
|
|
3
|
+
class << self
|
|
4
|
+
inject conveyors: :conveyors, config: :config
|
|
5
|
+
|
|
6
|
+
def call env, workspace = {}, &block
|
|
7
|
+
# result, opt = nil, opt.to_openobject
|
|
8
|
+
workspace = conveyors.web.call(
|
|
9
|
+
{env: env, response: Rad::Response.new}.merge(workspace),
|
|
10
|
+
&block
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
response = workspace.response.must_be.defined
|
|
14
|
+
result = response.finish
|
|
15
|
+
|
|
16
|
+
result
|
|
17
|
+
end
|
|
18
|
+
# synchronize_method :call
|
|
19
|
+
|
|
20
|
+
# def mock_call env = {}, workspace = {}, &block
|
|
21
|
+
# env['PATH_INFO'] ||= '/'
|
|
22
|
+
# env['rack.input'] ||= StringIO.new
|
|
23
|
+
#
|
|
24
|
+
# call env, workspace, &block
|
|
25
|
+
# end
|
|
26
|
+
|
|
27
|
+
def mock_environment
|
|
28
|
+
{
|
|
29
|
+
'rack.url_scheme' => 'http',
|
|
30
|
+
'PATH_INFO' => '/',
|
|
31
|
+
'rack.input' => StringIO.new
|
|
32
|
+
}
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module Rad
|
|
2
|
+
class StaticFiles
|
|
3
|
+
|
|
4
|
+
def initialize(app, dir, filter = nil)
|
|
5
|
+
@app = app
|
|
6
|
+
@dir = File.expand_path(dir)
|
|
7
|
+
@file_server = Rack::File.new(@dir)
|
|
8
|
+
@filter = filter
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def call(env)
|
|
12
|
+
path = env["PATH_INFO"]
|
|
13
|
+
|
|
14
|
+
if (!@filter or (@filter and @filter =~ path)) and File.exist?("#{@dir}#{path}")
|
|
15
|
+
@file_server.call(env)
|
|
16
|
+
else
|
|
17
|
+
@app.call(env)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module Rad
|
|
2
|
+
module Processors
|
|
3
|
+
class EvaluateFormat < Processor
|
|
4
|
+
def call
|
|
5
|
+
path = workspace.path.must_be.defined
|
|
6
|
+
params = workspace.params.must_be.defined
|
|
7
|
+
|
|
8
|
+
parts = path.split('.')
|
|
9
|
+
if parts.size > 1
|
|
10
|
+
format = parts.last
|
|
11
|
+
logger.warn "Two :format parameters!" if params.include?(:format)
|
|
12
|
+
workspace.params = params.clone
|
|
13
|
+
workspace.params.format = format
|
|
14
|
+
else
|
|
15
|
+
params.format ||= config.default_format!
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
next_processor.call
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module Rad
|
|
2
|
+
module Processors
|
|
3
|
+
class HTTPLogger < Processor
|
|
4
|
+
def call
|
|
5
|
+
if workspace.request? and workspace.params?
|
|
6
|
+
method, path, ip, time, format = workspace.request.request_method, workspace.path,
|
|
7
|
+
workspace.request.ip, (workspace.start_time || Time.now), workspace.params.format
|
|
8
|
+
logger.info " Started '#{path}' as '#{format}' (for #{ip} at #{time.to_s} with #{method})"
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
next_processor.call
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
module Rad
|
|
2
|
+
module Processors
|
|
3
|
+
class HttpWriter < Processor
|
|
4
|
+
def call
|
|
5
|
+
response = workspace.response.must_be.defined
|
|
6
|
+
|
|
7
|
+
begin
|
|
8
|
+
next_processor.call
|
|
9
|
+
|
|
10
|
+
response.body = workspace.content if response.body.blank? and workspace.content?
|
|
11
|
+
response.content_type ||= Mime[(workspace.params.format if workspace.params?) || config.default_format]
|
|
12
|
+
rescue StandardError => e
|
|
13
|
+
raise e if config.test?
|
|
14
|
+
|
|
15
|
+
response.clear
|
|
16
|
+
if workspace.params.format? and workspace.params.format == 'json'
|
|
17
|
+
response.body = {error: (config.production? ? "Internal error!" : e.message)}.to_json
|
|
18
|
+
response.content_type = Mime.json
|
|
19
|
+
else
|
|
20
|
+
response.body = (config.production? ? "Internal error!" : e.message)
|
|
21
|
+
response.content_type = Mime.text
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
logger.error e
|
|
25
|
+
logger.info "\n"
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module Rad
|
|
2
|
+
module Processors
|
|
3
|
+
class PrepareParams < Processor
|
|
4
|
+
def call
|
|
5
|
+
workspace.env.must_be.defined
|
|
6
|
+
workspace.request = Rad::Request.new(workspace.env)
|
|
7
|
+
workspace.path = workspace.request.path
|
|
8
|
+
params = workspace.params = Rad::Params.new(workspace.request.params)
|
|
9
|
+
|
|
10
|
+
if params.json?
|
|
11
|
+
json_params = JSON.load params['json']
|
|
12
|
+
json_params.must_be.a Hash
|
|
13
|
+
json_params.keys.each do |k|
|
|
14
|
+
logger.warn "Parameter :#{k} will be overwriden from JSON!" if params.include?(k)
|
|
15
|
+
end
|
|
16
|
+
params.merge! json_params
|
|
17
|
+
end
|
|
18
|
+
next_processor.call
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Rack doesn't works well with ruby 1.9.2
|
|
3
|
+
# there's no :each method in String anymore
|
|
4
|
+
#
|
|
5
|
+
class Rack::Response
|
|
6
|
+
def each(&callback)
|
|
7
|
+
if @body.is_a? String
|
|
8
|
+
@body.each_char(&callback)
|
|
9
|
+
else
|
|
10
|
+
@body.each(&callback)
|
|
11
|
+
end
|
|
12
|
+
@writer = callback
|
|
13
|
+
@block.call(self) if @block
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
class Rack::Request
|
|
18
|
+
alias_method :params_with_wrong_encoding, :params
|
|
19
|
+
def params
|
|
20
|
+
@params ||= encode_in_utf8(params_with_wrong_encoding)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
protected
|
|
24
|
+
def encode_in_utf8 hash
|
|
25
|
+
r = {}
|
|
26
|
+
hash.each do |k, v|
|
|
27
|
+
r[k] = if v.is_a? String
|
|
28
|
+
v.force_encoding("UTF-8")
|
|
29
|
+
elsif v.is_a? Hash
|
|
30
|
+
encode_in_utf8(v)
|
|
31
|
+
else
|
|
32
|
+
v
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
module Rad
|
|
2
|
+
class RackAdapter
|
|
3
|
+
SERVERS = %w{thin mongrel webrick}
|
|
4
|
+
|
|
5
|
+
# class Callback
|
|
6
|
+
# def initialize app; end
|
|
7
|
+
# def self.call env; Rad::Adapter.call env end
|
|
8
|
+
# end
|
|
9
|
+
|
|
10
|
+
class << self
|
|
11
|
+
inject(
|
|
12
|
+
logger: :logger,
|
|
13
|
+
config: :config
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
def initialize_rack builder = nil, &block
|
|
17
|
+
@rack_configurations ||= []
|
|
18
|
+
if block
|
|
19
|
+
raise "provide configuration block!" unless block
|
|
20
|
+
@rack_configurations << block
|
|
21
|
+
else
|
|
22
|
+
if @rack_configurations.empty?
|
|
23
|
+
raise "Common App not defined! Use profiles (like rad/profiles/web), define it by yourself or use your own configuration!"
|
|
24
|
+
end
|
|
25
|
+
@rack_configurations.each{|conf| conf.call builder}
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def parse_config
|
|
30
|
+
app, options = Rack::Builder.parse_file 'config.ru'
|
|
31
|
+
app
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def run app, host, port
|
|
35
|
+
handler = detect_rack_handler
|
|
36
|
+
handler_name = handler.name.gsub(/.*::/, '')
|
|
37
|
+
logger.info " HTTP server started on #{host}:#{port}" unless config.test?
|
|
38
|
+
# unless handler_name =~/cgi/i
|
|
39
|
+
handler.run app, Host: host, Port: port do |server|
|
|
40
|
+
[:INT, :TERM].each {|sig| trap(sig){quit!(server, handler_name)}}
|
|
41
|
+
end
|
|
42
|
+
rescue Errno::EADDRINUSE => e
|
|
43
|
+
logger.error "Port #{port} taken!"
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def quit!(server, handler_name)
|
|
47
|
+
## Use thins' hard #stop! if available, otherwise just #stop
|
|
48
|
+
server.respond_to?(:stop!) ? server.stop! : server.stop
|
|
49
|
+
puts "\nRad stopped" unless handler_name =~/cgi/i
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
protected
|
|
53
|
+
def detect_rack_handler
|
|
54
|
+
return Rack::Handler.get('thin')
|
|
55
|
+
SERVERS.each do |server_name|
|
|
56
|
+
begin
|
|
57
|
+
return Rack::Handler.get(server_name.downcase)
|
|
58
|
+
rescue LoadError
|
|
59
|
+
rescue NameError
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
fail " Server handler (#{SERVERS.join(', ')}) not found."
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
module Rad
|
|
2
|
+
class Request < Rack::Request
|
|
3
|
+
# Returns an array of acceptable media types for the response
|
|
4
|
+
# def accept
|
|
5
|
+
# @env['HTTP_ACCEPT'].to_s.split(',').map { |a| a.split(';')[0].strip }
|
|
6
|
+
# end
|
|
7
|
+
#
|
|
8
|
+
# def secure?
|
|
9
|
+
# (@env['HTTP_X_FORWARDED_PROTO'] || @env['rack.url_scheme']) == 'https'
|
|
10
|
+
# end
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
# Returns all the \subdomains as an array, so <tt>["dev", "www"]</tt> would be
|
|
14
|
+
# returned for "dev.www.rubyonrails.org". You can specify a different <tt>tld_length</tt>,
|
|
15
|
+
# such as 2 to catch <tt>["www"]</tt> instead of <tt>["www", "rubyonrails"]</tt>
|
|
16
|
+
# in "www.rubyonrails.co.uk".
|
|
17
|
+
def subdomains(tld_length = 1)
|
|
18
|
+
return [] unless named_host?(host)
|
|
19
|
+
parts = host.split('.')
|
|
20
|
+
parts[0..-(tld_length+2)]
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
# Returns the \domain part of a \host, such as "rubyonrails.org" in "www.rubyonrails.org". You can specify
|
|
25
|
+
# a different <tt>tld_length</tt>, such as 2 to catch rubyonrails.co.uk in "www.rubyonrails.co.uk".
|
|
26
|
+
def domain(tld_length = 1)
|
|
27
|
+
return nil unless named_host?(host)
|
|
28
|
+
|
|
29
|
+
host.split('.').last(1 + tld_length).join('.')
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def cookies_with_memory
|
|
33
|
+
@cookies_with_memory ||= cookies_without_memory
|
|
34
|
+
end
|
|
35
|
+
alias_method_chain :cookies, :memory
|
|
36
|
+
|
|
37
|
+
protected
|
|
38
|
+
def named_host?(host)
|
|
39
|
+
!(host.nil? || /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.match(host))
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
module Rad
|
|
2
|
+
class Response < Rack::Response
|
|
3
|
+
include ::OpenConstructor
|
|
4
|
+
|
|
5
|
+
STATUS_MESSAGES = {
|
|
6
|
+
ok: 200,
|
|
7
|
+
not_found: 404,
|
|
8
|
+
failed: 500,
|
|
9
|
+
error: 500,
|
|
10
|
+
redirect: 301
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
def initialize *args
|
|
14
|
+
super
|
|
15
|
+
clear
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def content_type= type; self["Content-Type"] = type end
|
|
19
|
+
def content_type; self["Content-Type"] end
|
|
20
|
+
def content_type?; !!content_type end
|
|
21
|
+
|
|
22
|
+
def location; self['Location'] end
|
|
23
|
+
def location= location; self['Location'] = location end
|
|
24
|
+
|
|
25
|
+
# def to_a
|
|
26
|
+
# [status, headers, body]
|
|
27
|
+
# end
|
|
28
|
+
|
|
29
|
+
def body_as_string
|
|
30
|
+
if @body.is_a? String
|
|
31
|
+
@body
|
|
32
|
+
else
|
|
33
|
+
@body ? @body.join : ""
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def inspect
|
|
38
|
+
to_a2.inspect
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def == other
|
|
42
|
+
to_a2 == other
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def cookies
|
|
46
|
+
self['Set-Cookie']
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def clear
|
|
50
|
+
@status = 200
|
|
51
|
+
@header = Rack::Utils::HeaderHash.new("Content-Type" => nil)
|
|
52
|
+
@length = 0
|
|
53
|
+
@body = []
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def status= code_or_message
|
|
57
|
+
@status = if code_or_message.is_a? Numeric
|
|
58
|
+
code_or_message
|
|
59
|
+
else
|
|
60
|
+
self.class.decode_status_message(code_or_message) || raise("unknown http status message '#{code_or_message}'!")
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def self.decode_status_message message
|
|
65
|
+
STATUS_MESSAGES[message]
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
#
|
|
70
|
+
# Status helpers
|
|
71
|
+
#
|
|
72
|
+
STATUS_MESSAGES.each do |message, status_code|
|
|
73
|
+
define_method("#{message}?"){self.status == status_code}
|
|
74
|
+
end
|
|
75
|
+
alias_method :success?, :ok?
|
|
76
|
+
|
|
77
|
+
def redirect?
|
|
78
|
+
super or (body and body.include?('window.location'))
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
protected
|
|
82
|
+
def to_a2
|
|
83
|
+
[status, header, body_as_string]
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
data/lib/rad/http.rb
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# WServer provides support for Web Servers (via Rack)
|
|
2
|
+
|
|
3
|
+
require 'rack'
|
|
4
|
+
require 'rack/builder'
|
|
5
|
+
|
|
6
|
+
require 'rad/conveyor'
|
|
7
|
+
|
|
8
|
+
# support
|
|
9
|
+
[
|
|
10
|
+
'rack/request',
|
|
11
|
+
'rack/response',
|
|
12
|
+
'rack/rack_adapter',
|
|
13
|
+
'rack/fixes'
|
|
14
|
+
].each{|f| require "rad/http/support/#{f}"}
|
|
15
|
+
|
|
16
|
+
# http
|
|
17
|
+
[
|
|
18
|
+
# 'config',
|
|
19
|
+
'http',
|
|
20
|
+
'http_adapter',
|
|
21
|
+
'processors/prepare_params',
|
|
22
|
+
'processors/http_writer',
|
|
23
|
+
'processors/http_logger',
|
|
24
|
+
'processors/evaluate_format'
|
|
25
|
+
].each{|f| require "rad/http/#{f}"}
|
|
26
|
+
|
|
27
|
+
module Rad
|
|
28
|
+
autoload :StaticFiles, 'rad/http/middleware/static_files'
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
Rad.metaclass_eval do
|
|
32
|
+
delegate :initialize_rack, to: Rad::RackAdapter
|
|
33
|
+
delegate :call, to: Rad::HTTPAdapter
|
|
34
|
+
delegate :ensure_public_symlink, to: Rad::HTTP
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
#
|
|
39
|
+
# Initialization
|
|
40
|
+
#
|
|
41
|
+
Rad::Config::DEFAULTS.merge!(
|
|
42
|
+
host: '0.0.0.0',
|
|
43
|
+
port: 4000,
|
|
44
|
+
|
|
45
|
+
static: true,
|
|
46
|
+
url_root: '',
|
|
47
|
+
default_format: 'html',
|
|
48
|
+
)
|