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,36 @@
|
|
|
1
|
+
module Rad
|
|
2
|
+
class Workspace < OpenObject
|
|
3
|
+
def params
|
|
4
|
+
self[:params] || Params.new
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def params?
|
|
8
|
+
!!params
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
alias_method :set_without_params, :[]=
|
|
12
|
+
def []= k, v
|
|
13
|
+
if k.to_s == 'params'
|
|
14
|
+
self.params = v
|
|
15
|
+
else
|
|
16
|
+
set_without_params k, v
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def params= v
|
|
21
|
+
if v.is_a? Params
|
|
22
|
+
set_without_params :params, v
|
|
23
|
+
else
|
|
24
|
+
set_without_params :params, Params.new(v)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def inspect
|
|
29
|
+
h = {}
|
|
30
|
+
each{|k, v| h[k] = v}
|
|
31
|
+
h['env'] = "..." if h.include? 'env'
|
|
32
|
+
h['request'] = "..." if h.include? 'request'
|
|
33
|
+
h.inspect
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
data/lib/rad/conveyor.rb
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Conveyor is the heart of Rad, it allows for Processors to process request and build responce.
|
|
2
|
+
|
|
3
|
+
require 'rad/environment'
|
|
4
|
+
|
|
5
|
+
[
|
|
6
|
+
# 'config',
|
|
7
|
+
'params',
|
|
8
|
+
'workspace',
|
|
9
|
+
'processor',
|
|
10
|
+
'conveyor',
|
|
11
|
+
'conveyors',
|
|
12
|
+
'processors/conveyor_logger',
|
|
13
|
+
].each{|f| require "rad/conveyor/#{f}"}
|
|
14
|
+
|
|
15
|
+
Rad.metaclass_eval do
|
|
16
|
+
inject conveyors: :conveyors
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
#
|
|
20
|
+
# Initializations
|
|
21
|
+
#
|
|
22
|
+
rad do
|
|
23
|
+
register :workspace, scope: :cycle, depends_on: :environment
|
|
24
|
+
register :conveyors, depends_on: :environment do
|
|
25
|
+
Rad::Conveyors.new
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
Rad::Config::DEFAULTS[:show_exceptions] = false
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
module Rad
|
|
2
|
+
class Config < SafeHash
|
|
3
|
+
inherit ::OpenConstructor
|
|
4
|
+
|
|
5
|
+
DEFAULTS = {}
|
|
6
|
+
RUNTIME = {}
|
|
7
|
+
|
|
8
|
+
def initialize
|
|
9
|
+
super
|
|
10
|
+
|
|
11
|
+
DEFAULTS.each{|k, v| self[k] = v}
|
|
12
|
+
RUNTIME.each{|k, v| self[k] = v}
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# trying to load both file_path and file_path.environment files if they are exists
|
|
16
|
+
def merge_config! file_path
|
|
17
|
+
# unless ::Micon.include? :config
|
|
18
|
+
# raise("this method should be called only after config already initialized (use app.after :config do ... end)!")
|
|
19
|
+
# end
|
|
20
|
+
raise("config file must have .yml extension (#{file_path})!") unless file_path.end_with? '.yml'
|
|
21
|
+
default_file_path = file_path.sub(/yml$/, "default.yml")
|
|
22
|
+
file_path_for_current_environment = file_path.sub(/yml$/, "#{environment!}.yml")
|
|
23
|
+
[
|
|
24
|
+
default_file_path,
|
|
25
|
+
file_path,
|
|
26
|
+
file_path_for_current_environment
|
|
27
|
+
].each do |cfile|
|
|
28
|
+
if ::File.exist? cfile
|
|
29
|
+
data = ::YAML.load_file cfile
|
|
30
|
+
if data
|
|
31
|
+
data.must_be.a ::Hash
|
|
32
|
+
self.deep_merge! data
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
#
|
|
39
|
+
# runtime_dir
|
|
40
|
+
#
|
|
41
|
+
def runtime_dir= runtime_dir
|
|
42
|
+
if runtime_dir
|
|
43
|
+
self[:runtime_dir] = ::File.expand_path(runtime_dir)
|
|
44
|
+
else
|
|
45
|
+
self.delete 'runtime_dir'
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
#
|
|
51
|
+
# public_dir
|
|
52
|
+
#
|
|
53
|
+
def public_dir
|
|
54
|
+
runtime_dir? ? "#{runtime_dir}/public" : self[:public_dir]
|
|
55
|
+
end
|
|
56
|
+
def public_dir?; runtime_dir? end
|
|
57
|
+
def public_dir!
|
|
58
|
+
"#{runtime_dir!}/public"
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
#
|
|
63
|
+
# environment
|
|
64
|
+
#
|
|
65
|
+
def environment= env
|
|
66
|
+
env = env.to_s
|
|
67
|
+
env.must_be.in %w{production development test}
|
|
68
|
+
self['environment'] = env
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def development?; environment == 'development' end
|
|
72
|
+
def production?; environment == 'production' end
|
|
73
|
+
def test?; environment == 'test' end
|
|
74
|
+
|
|
75
|
+
def development █ block.call if development? end
|
|
76
|
+
def production █ block.call if production? end
|
|
77
|
+
def test █ block.call if test? end
|
|
78
|
+
|
|
79
|
+
#
|
|
80
|
+
# log_path
|
|
81
|
+
#
|
|
82
|
+
attr_writer :log_path
|
|
83
|
+
def log_path
|
|
84
|
+
@log_path ||= runtime_dir? ? "#{runtime_dir}/log/#{environment}.log" : ""
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
#
|
|
89
|
+
# log_level
|
|
90
|
+
#
|
|
91
|
+
attr_writer :log_level
|
|
92
|
+
def log_level
|
|
93
|
+
@log_level ||= production? ? :info : :debug
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
#
|
|
98
|
+
# session
|
|
99
|
+
#
|
|
100
|
+
# key: 'rack.session', domain: 'foo.com', path: '/', expire_after: 2592000, secret: 'change_me'
|
|
101
|
+
# attr_accessor :session
|
|
102
|
+
# def session?; !!session end
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
# class << self
|
|
106
|
+
# attr_accessor :command_line_config
|
|
107
|
+
#
|
|
108
|
+
# def defered_configs; @defered_configs ||= [] end
|
|
109
|
+
# end
|
|
110
|
+
end
|
|
111
|
+
end
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# module Rad
|
|
2
|
+
# class DependencyResolver
|
|
3
|
+
# class Dependency
|
|
4
|
+
# attr_accessor :name, :block, :before, :after
|
|
5
|
+
#
|
|
6
|
+
# def initialize name, block
|
|
7
|
+
# @name, @block = name, block
|
|
8
|
+
# @before, @after = [], []
|
|
9
|
+
# end
|
|
10
|
+
#
|
|
11
|
+
# def inspect
|
|
12
|
+
# "#<#{name} #{before.inspect}, #{after.inspect}>"
|
|
13
|
+
# end
|
|
14
|
+
# end
|
|
15
|
+
#
|
|
16
|
+
# def dependencies; @dependencies ||= {} end
|
|
17
|
+
#
|
|
18
|
+
# #
|
|
19
|
+
# # Define dependency
|
|
20
|
+
# #
|
|
21
|
+
# def run name, options = {}, &block
|
|
22
|
+
# options = options.to_openobject
|
|
23
|
+
# # raise "Invalid usage, you must specify :after or :before!" unless options.before? or options.after?
|
|
24
|
+
# d = Dependency.new name, block
|
|
25
|
+
#
|
|
26
|
+
# if options.before?
|
|
27
|
+
# add_dependency d, :before, options.before.must_be.present
|
|
28
|
+
# elsif options.after?
|
|
29
|
+
# add_dependency d, :after, options.after.must_be.present
|
|
30
|
+
# else
|
|
31
|
+
# add_dependency d, nil, nil
|
|
32
|
+
# end
|
|
33
|
+
# end
|
|
34
|
+
#
|
|
35
|
+
#
|
|
36
|
+
# #
|
|
37
|
+
# # Call dependencies
|
|
38
|
+
# #
|
|
39
|
+
# def call name, &block
|
|
40
|
+
# return unless dep = dependencies[name]
|
|
41
|
+
#
|
|
42
|
+
# # before
|
|
43
|
+
# callees = []
|
|
44
|
+
# dep_lists = [dep.before]
|
|
45
|
+
# while !dep_lists.empty?
|
|
46
|
+
# dep_lists.each do |list|
|
|
47
|
+
# callees << list
|
|
48
|
+
# end
|
|
49
|
+
#
|
|
50
|
+
# dep_lists = next_level dep_lists, :before
|
|
51
|
+
# end
|
|
52
|
+
# call_all callees.reverse
|
|
53
|
+
#
|
|
54
|
+
# # call
|
|
55
|
+
# dep.block.call if dep.block
|
|
56
|
+
#
|
|
57
|
+
# # after
|
|
58
|
+
# dep_lists = [dep.after]
|
|
59
|
+
# while !dep_lists.empty?
|
|
60
|
+
# call_all dep_lists
|
|
61
|
+
#
|
|
62
|
+
# dep_lists = next_level dep_lists, :after
|
|
63
|
+
# end
|
|
64
|
+
# end
|
|
65
|
+
#
|
|
66
|
+
# protected
|
|
67
|
+
# def add_dependency dep, type, ref
|
|
68
|
+
# raise "Dependency '#{dep.name}' already defined!" if dependencies.include? dep.name
|
|
69
|
+
# dependencies[dep.name] = dep
|
|
70
|
+
#
|
|
71
|
+
# # add back reference
|
|
72
|
+
# if type
|
|
73
|
+
# catch :found do
|
|
74
|
+
# dep_lists = [dependencies.values]
|
|
75
|
+
# while !dep_lists.empty?
|
|
76
|
+
# dep_lists.each do |list|
|
|
77
|
+
# list.each do |d|
|
|
78
|
+
# if d.name == ref
|
|
79
|
+
# d.send(type) << dep
|
|
80
|
+
# throw :found
|
|
81
|
+
# end
|
|
82
|
+
# end
|
|
83
|
+
# end
|
|
84
|
+
#
|
|
85
|
+
# dep_lists = next_level dep_lists, type
|
|
86
|
+
# end
|
|
87
|
+
#
|
|
88
|
+
# raise "Dependency '#{ref}' referenced from '#{dep.name}' not found!"
|
|
89
|
+
# end
|
|
90
|
+
# end
|
|
91
|
+
# end
|
|
92
|
+
#
|
|
93
|
+
# def next_level dep_lists, type
|
|
94
|
+
# r = []
|
|
95
|
+
# dep_lists.each do |list|
|
|
96
|
+
# list.each do |d|
|
|
97
|
+
# r << d.send(type)
|
|
98
|
+
# end
|
|
99
|
+
# end
|
|
100
|
+
# r
|
|
101
|
+
# end
|
|
102
|
+
#
|
|
103
|
+
# def call_all list_of_lists
|
|
104
|
+
# list_of_lists.each{|list| list.each{|d| d.block.call if d.block}}
|
|
105
|
+
# end
|
|
106
|
+
# end
|
|
107
|
+
# end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
module Rad
|
|
2
|
+
class Environment
|
|
3
|
+
inject logger: :logger, config: :config
|
|
4
|
+
|
|
5
|
+
class << self
|
|
6
|
+
inject logger: :logger, config: :config
|
|
7
|
+
|
|
8
|
+
# def initialize_runtime runtime_dir, environment = nil
|
|
9
|
+
# init_file_path = "#{runtime_dir}/init.rb"
|
|
10
|
+
# load init_file_path if File.exist? init_file_path
|
|
11
|
+
#
|
|
12
|
+
# Micon.after :config do |config|
|
|
13
|
+
# config.runtime_dir = runtime_dir
|
|
14
|
+
#
|
|
15
|
+
# config.merge_config! "#{runtime_dir}/config/config.yml"
|
|
16
|
+
# end
|
|
17
|
+
# end
|
|
18
|
+
#
|
|
19
|
+
# def initialize_plugin plugin_dir
|
|
20
|
+
# init_file_path = "#{plugin_dir}/init.rb"
|
|
21
|
+
# load init_file_path if File.exist? init_file_path
|
|
22
|
+
#
|
|
23
|
+
# Micon.after :config do |config|
|
|
24
|
+
# config.merge_config! "#{plugin_dir}/config/config.yml"
|
|
25
|
+
# end
|
|
26
|
+
# end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
module Rad
|
|
2
|
+
module FilesHelper
|
|
3
|
+
def directories
|
|
4
|
+
$LOAD_PATH
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def file_exist? path, directories = nil
|
|
8
|
+
find_files(path).size > 0
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def find_files fname, directories = nil
|
|
12
|
+
directories ||= self.directories
|
|
13
|
+
FilesHelper.find_files fname, directories
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def find_files_without_cache fname, directories = nil
|
|
17
|
+
# directories ||= self.directories
|
|
18
|
+
FilesHelper.find_files_without_cache fname, directories
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def find_file fname, directories = nil
|
|
22
|
+
files = find_files(fname, directories)
|
|
23
|
+
raise "File '#{fname}' not found!" if files.size == 0
|
|
24
|
+
raise "Found multiple files for '#{fname}'" if files.size > 1
|
|
25
|
+
files.first
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def find_files_by_pattern_without_cache pattern, directories = nil
|
|
29
|
+
directories ||= self.directories
|
|
30
|
+
patterns = directories.to_a.collect{|d| "#{d}#{pattern}"}
|
|
31
|
+
Dir.glob patterns
|
|
32
|
+
end
|
|
33
|
+
alias_method :find_files_by_pattern, :find_files_by_pattern_without_cache
|
|
34
|
+
|
|
35
|
+
def find_file_by_pattern pattern
|
|
36
|
+
files = find_files_by_pattern(pattern)
|
|
37
|
+
raise "File '#{pattern}' not found!" if files.size == 0
|
|
38
|
+
raise "Found multiple files for '#{pattern}'" if files.size > 1
|
|
39
|
+
files.first
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
class << self
|
|
43
|
+
# don't move this class method to module, because there will be then
|
|
44
|
+
# multiple cache for every object that includes it.
|
|
45
|
+
def find_files fname, directories = nil
|
|
46
|
+
fname.must =~ /\//
|
|
47
|
+
directories.must_be.present # || raise('directories ')= self.directories
|
|
48
|
+
files = directories.collect{|dir| "#{dir}#{fname}"}
|
|
49
|
+
files.select{|f| File.exist? f}
|
|
50
|
+
end
|
|
51
|
+
cache_method_with_params_in_production :find_files
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
rad.register :logger do
|
|
2
|
+
if defined?(SILENCE_LOGGER)
|
|
3
|
+
logger = Logger.new nil
|
|
4
|
+
else
|
|
5
|
+
config = rad[:config]
|
|
6
|
+
if config and config.runtime_dir? and File.exist?("#{config.runtime_dir}/log")
|
|
7
|
+
logger = ActiveSupport::BufferedLogger.new rad.config.log_path
|
|
8
|
+
logger.level = ActiveSupport::BufferedLogger.const_get config.log_level.to_s.upcase
|
|
9
|
+
# logger.auto_flushing = false if config.production? and !config.stdout_logger(false)
|
|
10
|
+
elsif config and config.test?
|
|
11
|
+
logger = Logger.new nil
|
|
12
|
+
elsif config
|
|
13
|
+
logger = Logger.new STDOUT
|
|
14
|
+
logger.warn "No log folder!"
|
|
15
|
+
else
|
|
16
|
+
logger = Logger.new STDOUT
|
|
17
|
+
logger.warn "Config not initialized!"
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
logger
|
|
21
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# Environment prepares and assembles your app ($LOAD_PATH, plugins and config files)
|
|
2
|
+
|
|
3
|
+
#
|
|
4
|
+
# Support
|
|
5
|
+
#
|
|
6
|
+
require 'rad/support'
|
|
7
|
+
|
|
8
|
+
# config
|
|
9
|
+
[
|
|
10
|
+
'config',
|
|
11
|
+
].each{|f| require "rad/environment/#{f}"}
|
|
12
|
+
|
|
13
|
+
module Rad
|
|
14
|
+
VERSION = '0.0.1'
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# environment
|
|
18
|
+
[
|
|
19
|
+
'logger',
|
|
20
|
+
'environment',
|
|
21
|
+
'files_helper'
|
|
22
|
+
].each{|f| require "rad/environment/#{f}"}
|
|
23
|
+
Rad::Environment.inherit Rad::FilesHelper
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
#
|
|
27
|
+
# Runtime initialization
|
|
28
|
+
#
|
|
29
|
+
rad do
|
|
30
|
+
register :config do
|
|
31
|
+
Rad::Config.new
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
register :environment, depends_on: :config do
|
|
35
|
+
environment = Rad::Environment.new
|
|
36
|
+
logger.info " Rad #{Rad::VERSION} started in :#{config.environment!} mode (at #{Time.now.to_s})\n\n" unless config.test?
|
|
37
|
+
environment
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
#
|
|
42
|
+
# Handy mehtods
|
|
43
|
+
#
|
|
44
|
+
module Rad
|
|
45
|
+
class << self
|
|
46
|
+
inject(
|
|
47
|
+
config: :config,
|
|
48
|
+
environment: :environment,
|
|
49
|
+
logger: :logger,
|
|
50
|
+
workspace: :workspace
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
# delegate :initialize_runtime, :initialize_plugin, to: Environment
|
|
54
|
+
end
|
|
55
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
module Rad
|
|
2
|
+
class Flash < OpenObject
|
|
3
|
+
attr_accessor :previous_messages, :current_messages
|
|
4
|
+
|
|
5
|
+
def initialize format, previous_messages = {}
|
|
6
|
+
self.current_messages, self.previous_messages = {}, previous_messages
|
|
7
|
+
@keep = false
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def [] key
|
|
11
|
+
key = key.to_s
|
|
12
|
+
|
|
13
|
+
if keep?
|
|
14
|
+
previous_messages[key]
|
|
15
|
+
else
|
|
16
|
+
current_messages[key] || previous_messages[key]
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def []= key, value
|
|
21
|
+
current_messages[key.to_s] = value.to_s
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def keep!
|
|
25
|
+
@keep = true
|
|
26
|
+
self
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def keep?
|
|
30
|
+
!!@keep
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def messages_for_next_request
|
|
34
|
+
if keep?
|
|
35
|
+
current_messages
|
|
36
|
+
else
|
|
37
|
+
{}
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
module Rad
|
|
2
|
+
module BasicHtmlHelper
|
|
3
|
+
BOOLEAN_ATTRIBUTES = %w(disabled readonly multiple checked autobuffer
|
|
4
|
+
autoplay controls loop selected hidden scoped async
|
|
5
|
+
defer reversed ismap seemless muted required
|
|
6
|
+
autofocus novalidate formnovalidate open).to_set
|
|
7
|
+
BOOLEAN_ATTRIBUTES.merge(BOOLEAN_ATTRIBUTES.map {|attr| attr.to_sym })
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
#
|
|
11
|
+
# authenticity_token
|
|
12
|
+
#
|
|
13
|
+
def authenticity_token; workspace.request.session['authenticity_token'] end
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
#
|
|
17
|
+
# JavaScript & StyleSheets
|
|
18
|
+
#
|
|
19
|
+
def stylesheet_link_tag *stylesheets
|
|
20
|
+
Array(stylesheets).collect{|ssheet|
|
|
21
|
+
tag :link, '', href: "#{config && config.url_root!}#{ssheet}", media: "screen", rel: "stylesheet", type: "text/css"
|
|
22
|
+
}.join("\n")
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
#
|
|
27
|
+
# Assets
|
|
28
|
+
#
|
|
29
|
+
def image_tag src, opt = {}
|
|
30
|
+
opt[:src] = src
|
|
31
|
+
tag :img, '', opt
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
#
|
|
36
|
+
# Common HTML tags
|
|
37
|
+
#
|
|
38
|
+
def label_tag name, text, options = {}
|
|
39
|
+
tag :label, text, options.merge(for: name)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
#
|
|
44
|
+
# Special
|
|
45
|
+
#
|
|
46
|
+
def tag name, content_or_options_with_block = nil, options = nil, escape = true, &block
|
|
47
|
+
if block_given?
|
|
48
|
+
options = content_or_options_with_block if content_or_options_with_block.is_a?(Hash)
|
|
49
|
+
content = capture(&block)
|
|
50
|
+
concat "<#{name}#{tag_options(options)}>#{content}</#{name}>"
|
|
51
|
+
else
|
|
52
|
+
content = content_or_options_with_block
|
|
53
|
+
"<#{name}#{tag_options(options)}>#{content}</#{name}>"
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# instance_methods(false).each do |m|
|
|
58
|
+
# alias_method "html_#{m}", m
|
|
59
|
+
# end
|
|
60
|
+
|
|
61
|
+
# Escape
|
|
62
|
+
def h obj; obj.to_s.html_escape end
|
|
63
|
+
|
|
64
|
+
protected
|
|
65
|
+
|
|
66
|
+
def tag_options options
|
|
67
|
+
return "" unless options
|
|
68
|
+
options.must_be.a Hash
|
|
69
|
+
unless options.blank?
|
|
70
|
+
attrs = []
|
|
71
|
+
options.each_pair do |key, value|
|
|
72
|
+
if BOOLEAN_ATTRIBUTES.include?(key)
|
|
73
|
+
attrs << %(#{key}="#{key}") if value
|
|
74
|
+
elsif !value.nil?
|
|
75
|
+
final_value = value.is_a?(Array) ? value.join(" ") : value
|
|
76
|
+
attrs << %(#{key}="#{final_value}")
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
" #{attrs.sort * ' '}" unless attrs.empty?
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
module Rad
|
|
2
|
+
module FormHelper
|
|
3
|
+
#
|
|
4
|
+
# Form
|
|
5
|
+
#
|
|
6
|
+
def form_for *args, &block
|
|
7
|
+
model_helper, options = build_form_model_helper_and_form_options *args
|
|
8
|
+
|
|
9
|
+
form_tag options do
|
|
10
|
+
block.call model_helper if block
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def build_form_model_helper_and_form_options model_name, model, options = {}
|
|
15
|
+
model_name.must_be.a String, Symbol
|
|
16
|
+
return ModelHelper.new(self, self, model_name, model, options), options
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def form_tag options = {}, &block
|
|
20
|
+
options['method'] ||= options[:method] || 'post'
|
|
21
|
+
tag :form, options, &block
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
#
|
|
26
|
+
# Errors
|
|
27
|
+
#
|
|
28
|
+
# delegate :error_messages, :field_with_errors, to: :form_builder
|
|
29
|
+
def error_messages *errors
|
|
30
|
+
errors = errors.first if errors.size == 1 and errors.first.is_a? Array
|
|
31
|
+
html = errors.join("<br/>")
|
|
32
|
+
tag :div, html, class: :error_messages
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def field_with_errors name, errors, options, field_html
|
|
36
|
+
html = tag :div, errors.join("<br/>"), class: :field_error_messages
|
|
37
|
+
html << tag(:span, field_html, class: :field_with_errors)
|
|
38
|
+
html
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
#
|
|
43
|
+
# Form fields
|
|
44
|
+
#
|
|
45
|
+
def check_box_tag name, checked = false, options = {}
|
|
46
|
+
options = {type: "checkbox", name: name, value: '1'}.update(options)
|
|
47
|
+
options[:checked] = "checked" if checked
|
|
48
|
+
tag_with_style :input, '', options
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def field_set_tag legend = nil, options = {}, &block
|
|
52
|
+
content = ""
|
|
53
|
+
content << tag(:legend, legend) unless legend.blank?
|
|
54
|
+
content << capture(&block)
|
|
55
|
+
tag_with_style :fieldset, content, options
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def file_field_tag name, options = {}
|
|
59
|
+
text_field_tag name, nil, options.update(type: "file")
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def hidden_field_tag name, value = '', options = {}
|
|
63
|
+
text_field_tag(name, value, options.update(type: "hidden"))
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def password_field_tag name, value = nil, options = {}
|
|
67
|
+
text_field_tag(name, value, options.update(type: "password"))
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def radio_button_tag name, checked = false, options = {}
|
|
71
|
+
options = {type: "radio", name: name, value: '1'}.update(options)
|
|
72
|
+
options["checked"] = "checked" if checked
|
|
73
|
+
tag_with_style :input, '', options
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def select_tag name, selected, values, options = {}
|
|
77
|
+
buff = "\n"
|
|
78
|
+
values.each do |n, v|
|
|
79
|
+
o = {}
|
|
80
|
+
o[:value] = v if v
|
|
81
|
+
o[:selected] = 'selected' if (v || n) == selected
|
|
82
|
+
buff << tag(:option, n, o)
|
|
83
|
+
buff << "\n"
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
tag_with_style :select, buff, {name: name}.update(options)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def text_field_tag name, value = '', options = {}
|
|
90
|
+
tag_with_style :input, '', {type: "text", name: name, value: value}.update(options)
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def text_area_tag name, value = '', options = {}
|
|
94
|
+
tag_with_style :textarea, value, {name: name}.update(options)
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
#
|
|
99
|
+
# Other
|
|
100
|
+
#
|
|
101
|
+
def submit_tag value, options = {}
|
|
102
|
+
tag_with_style :input, '', {type: "submit", value: value}.update(options)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
protected
|
|
106
|
+
def tag_with_style name, value, options, &block
|
|
107
|
+
# add special class to fix with CSS some problems with fields display
|
|
108
|
+
klass = options.delete(:class) || options.delete('class') || ""
|
|
109
|
+
klass << " #{options[:type] || options['type'] || name}_input"
|
|
110
|
+
options['class'] = klass
|
|
111
|
+
|
|
112
|
+
tag name, value, options, &block
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
end
|