rad_core 0.0.13
Sign up to get free protection for your applications and to get access to all the features.
- 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,93 @@
|
|
1
|
+
require 'rad/spec/controller'
|
2
|
+
|
3
|
+
rspec do
|
4
|
+
def request
|
5
|
+
rad.workspace.request
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.with_http
|
9
|
+
with_controller
|
10
|
+
|
11
|
+
before :all do
|
12
|
+
rad.before_scope :cycle do
|
13
|
+
if defined?(Rad::Processors) and defined?(Rad::Processors::PrepareParams)
|
14
|
+
rad.conveyors.web do |web|
|
15
|
+
web.definitions.delete_if{|pdef, args| pdef == Rad::Processors::PrepareParams}
|
16
|
+
web.build!
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
WCALL_OPTIONS = [:controller]
|
24
|
+
attr_writer :wcall_options
|
25
|
+
def wcall_options; @wcall_options ||= {} end
|
26
|
+
|
27
|
+
def set_wcall options
|
28
|
+
invalid_options = options.keys - WCALL_OPTIONS
|
29
|
+
raise "Unsupported options #{invalid_options}!" unless invalid_options.empty?
|
30
|
+
|
31
|
+
self.wcall_options = options
|
32
|
+
end
|
33
|
+
|
34
|
+
def set_controller controller_class
|
35
|
+
set_wcall controller: controller_class
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.set_controller &block
|
39
|
+
block.must_be.defined
|
40
|
+
before(:each){set_controller block.call}
|
41
|
+
end
|
42
|
+
|
43
|
+
def wcall *args, &block
|
44
|
+
workspace_variables, params = parse_wcall_arguments *args
|
45
|
+
ccall nil, nil, params, workspace_variables, &block
|
46
|
+
end
|
47
|
+
|
48
|
+
def post_wcall *args, &block
|
49
|
+
params = args.extract_options!
|
50
|
+
raise "_method variable already set!" if params.include?(:_method) or params.include?('_method')
|
51
|
+
wcall(*(args << params.merge(_method: 'post')), &block)
|
52
|
+
end
|
53
|
+
|
54
|
+
protected
|
55
|
+
def parse_wcall_arguments *args
|
56
|
+
# parsing params
|
57
|
+
params = args.extract_options!
|
58
|
+
first = args.first
|
59
|
+
|
60
|
+
workspace_variables = {}
|
61
|
+
if args.size == 1 and first.is_a?(String) and first =~ /^\//
|
62
|
+
workspace_variables[:path] = first
|
63
|
+
elsif (first.is_a?(String) or first.is_a?(Symbol)) and args.size <= 2
|
64
|
+
workspace_variables[:path] = '/'
|
65
|
+
workspace_variables[:class] = wcall_options[:controller] || raise("not defined wcall controller (use set_wcall controller: SomeController)!")
|
66
|
+
workspace_variables[:method_name] = first
|
67
|
+
workspace_variables.merge! args[1] if args.size > 1
|
68
|
+
elsif first.is_a?(Class) and args.size <= 3
|
69
|
+
workspace_variables[:path] = '/'
|
70
|
+
workspace_variables[:class] = args[0]
|
71
|
+
workspace_variables[:method_name] = args[1]
|
72
|
+
workspace_variables.merge! args[2] if args.size > 2
|
73
|
+
else
|
74
|
+
raise "Invalid input!"
|
75
|
+
end
|
76
|
+
|
77
|
+
# preparing environment
|
78
|
+
workspace_variables[:env] ||= {}
|
79
|
+
workspace_variables[:env].reverse_merge! Rad::HTTPAdapter.mock_environment
|
80
|
+
|
81
|
+
# setting request method
|
82
|
+
if request_method = params.delete(:_method) || params.delete('_method')
|
83
|
+
request_method = request_method.to_s.upcase
|
84
|
+
raise "invalid request method :#{request}" unless %w(GET POST PUT DELETE).include? request_method.
|
85
|
+
raise "REQUEST_METHOD variable already set!" if workspace_variables[:env].include? 'REQUEST_METHOD'
|
86
|
+
workspace_variables[:env]['REQUEST_METHOD'] = request_method
|
87
|
+
end
|
88
|
+
|
89
|
+
workspace_variables[:request] = Rad::Request.new(workspace_variables[:env])
|
90
|
+
|
91
|
+
return workspace_variables, params
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Rad
|
2
|
+
module RSpecHelper
|
3
|
+
def sent_letters
|
4
|
+
Rad::RSpecHelper.sent_letters
|
5
|
+
end
|
6
|
+
|
7
|
+
class << self
|
8
|
+
attr_accessor :sent_letters
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
rspec do
|
14
|
+
def self.with_mail
|
15
|
+
Rad::Mailer.class_eval do
|
16
|
+
def deliver letter
|
17
|
+
Rad::RSpecHelper.sent_letters << letter
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
Mail.defaults do
|
22
|
+
delivery_method :test
|
23
|
+
end
|
24
|
+
|
25
|
+
rspec.include Rad::RSpecHelper
|
26
|
+
|
27
|
+
before :each do
|
28
|
+
Rad::RSpecHelper.sent_letters = []
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'rad/router'
|
2
|
+
|
3
|
+
rspec do
|
4
|
+
def self.with_router
|
5
|
+
include Rad::CoreRoutingHelper
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
# Rad::Response.class_eval do
|
10
|
+
# def success?
|
11
|
+
# headers['Location'].blank?
|
12
|
+
# end
|
13
|
+
# end
|
14
|
+
|
15
|
+
rspec.define_matcher :redirect_to do |actual, expected|
|
16
|
+
(actual.headers['Location'] and actual.headers['Location'].include?(expected)) or
|
17
|
+
(actual.body and actual.body.include?('window.location') and actual.body.include?(expected))
|
18
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
class String
|
2
|
+
def to_xhtml css = nil
|
3
|
+
node = Nokogiri::HTML(self)
|
4
|
+
unless css
|
5
|
+
node
|
6
|
+
else
|
7
|
+
nodes = node.css(css)
|
8
|
+
raise "Elements for '#{css}' CSS query not found!" if nodes.size < 1
|
9
|
+
raise "Found more than one elment for '#{css}' CSS query!" if nodes.size > 1
|
10
|
+
nodes.first
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
require 'nokogiri'
|
16
|
+
::Nokogiri::XML::Node.class_eval do
|
17
|
+
def should_be_fuzzy_equal_to attributes
|
18
|
+
node_attributes = {}
|
19
|
+
|
20
|
+
attributes.each do |k, v|
|
21
|
+
nv = if k.to_s == 'content'
|
22
|
+
self.content
|
23
|
+
else
|
24
|
+
self[k.to_s]
|
25
|
+
end
|
26
|
+
node_attributes[k] = nv
|
27
|
+
end
|
28
|
+
|
29
|
+
node_attributes.should == attributes
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
end
|
data/lib/rad/spec.rb
ADDED
@@ -0,0 +1,154 @@
|
|
1
|
+
"en":
|
2
|
+
number:
|
3
|
+
# Used in number_with_delimiter()
|
4
|
+
# These are also the defaults for 'currency', 'percentage', 'precision', and 'human'
|
5
|
+
format:
|
6
|
+
# Sets the separator between the units, for more precision (e.g. 1.0 / 2.0 == 0.5)
|
7
|
+
separator: "."
|
8
|
+
# Delimets thousands (e.g. 1,000,000 is a million) (always in groups of three)
|
9
|
+
delimiter: ","
|
10
|
+
# Number of decimals, behind the separator (the number 1 with a precision of 2 gives: 1.00)
|
11
|
+
precision: 3
|
12
|
+
# If set to true, precision will mean the number of significant digits instead
|
13
|
+
# of the number of decimal digits (1234 with precision 2 becomes 1200, 1.23543 becomes 1.2)
|
14
|
+
significant: false
|
15
|
+
# If set, the zeros after the decimal separator will always be stripped (eg.: 1.200 will be 1.2)
|
16
|
+
strip_insignificant_zeros: false
|
17
|
+
|
18
|
+
# Used in number_to_currency()
|
19
|
+
currency:
|
20
|
+
format:
|
21
|
+
# Where is the currency sign? %u is the currency unit, %n the number (default: $5.00)
|
22
|
+
format: "%u%n"
|
23
|
+
unit: "$"
|
24
|
+
# These five are to override number.format and are optional
|
25
|
+
separator: "."
|
26
|
+
delimiter: ","
|
27
|
+
precision: 2
|
28
|
+
significant: false
|
29
|
+
strip_insignificant_zeros: false
|
30
|
+
|
31
|
+
# Used in number_to_percentage()
|
32
|
+
percentage:
|
33
|
+
format:
|
34
|
+
# These five are to override number.format and are optional
|
35
|
+
# separator:
|
36
|
+
delimiter: ""
|
37
|
+
# precision:
|
38
|
+
# significant: false
|
39
|
+
# strip_insignificant_zeros: false
|
40
|
+
|
41
|
+
# Used in number_to_precision()
|
42
|
+
precision:
|
43
|
+
format:
|
44
|
+
# These five are to override number.format and are optional
|
45
|
+
# separator:
|
46
|
+
delimiter: ""
|
47
|
+
# precision:
|
48
|
+
# significant: false
|
49
|
+
# strip_insignificant_zeros: false
|
50
|
+
|
51
|
+
# Used in number_to_human_size() and number_to_human()
|
52
|
+
human:
|
53
|
+
format:
|
54
|
+
# These five are to override number.format and are optional
|
55
|
+
# separator:
|
56
|
+
delimiter: ""
|
57
|
+
precision: 3
|
58
|
+
significant: true
|
59
|
+
strip_insignificant_zeros: true
|
60
|
+
# Used in number_to_human_size()
|
61
|
+
storage_units:
|
62
|
+
# Storage units output formatting.
|
63
|
+
# %u is the storage unit, %n is the number (default: 2 MB)
|
64
|
+
format: "%n %u"
|
65
|
+
units:
|
66
|
+
byte:
|
67
|
+
one: "Byte"
|
68
|
+
other: "Bytes"
|
69
|
+
kb: "KB"
|
70
|
+
mb: "MB"
|
71
|
+
gb: "GB"
|
72
|
+
tb: "TB"
|
73
|
+
# Used in number_to_human()
|
74
|
+
decimal_units:
|
75
|
+
format: "%n %u"
|
76
|
+
# Decimal units output formatting
|
77
|
+
# By default we will only quantify some of the exponents
|
78
|
+
# but the commented ones might be defined or overridden
|
79
|
+
# by the user.
|
80
|
+
units:
|
81
|
+
# femto: Quadrillionth
|
82
|
+
# pico: Trillionth
|
83
|
+
# nano: Billionth
|
84
|
+
# micro: Millionth
|
85
|
+
# mili: Thousandth
|
86
|
+
# centi: Hundredth
|
87
|
+
# deci: Tenth
|
88
|
+
unit: ""
|
89
|
+
# ten:
|
90
|
+
# one: Ten
|
91
|
+
# other: Tens
|
92
|
+
# hundred: Hundred
|
93
|
+
thousand: Thousand
|
94
|
+
million: Million
|
95
|
+
billion: Billion
|
96
|
+
trillion: Trillion
|
97
|
+
quadrillion: Quadrillion
|
98
|
+
|
99
|
+
# Used in distance_of_time_in_words(), distance_of_time_in_words_to_now(), time_ago_in_words()
|
100
|
+
datetime:
|
101
|
+
distance_in_words:
|
102
|
+
half_a_minute: "half a minute"
|
103
|
+
less_than_x_seconds:
|
104
|
+
one: "less than 1 second"
|
105
|
+
other: "less than %{count} seconds"
|
106
|
+
x_seconds:
|
107
|
+
one: "1 second"
|
108
|
+
other: "%{count} seconds"
|
109
|
+
less_than_x_minutes:
|
110
|
+
one: "less than a minute"
|
111
|
+
other: "less than %{count} minutes"
|
112
|
+
x_minutes:
|
113
|
+
one: "1 minute"
|
114
|
+
other: "%{count} minutes"
|
115
|
+
about_x_hours:
|
116
|
+
one: "about 1 hour"
|
117
|
+
other: "about %{count} hours"
|
118
|
+
x_days:
|
119
|
+
one: "1 day"
|
120
|
+
other: "%{count} days"
|
121
|
+
about_x_months:
|
122
|
+
one: "about 1 month"
|
123
|
+
other: "about %{count} months"
|
124
|
+
x_months:
|
125
|
+
one: "1 month"
|
126
|
+
other: "%{count} months"
|
127
|
+
about_x_years:
|
128
|
+
one: "about 1 year"
|
129
|
+
other: "about %{count} years"
|
130
|
+
over_x_years:
|
131
|
+
one: "over 1 year"
|
132
|
+
other: "over %{count} years"
|
133
|
+
almost_x_years:
|
134
|
+
one: "almost 1 year"
|
135
|
+
other: "almost %{count} years"
|
136
|
+
prompts:
|
137
|
+
year: "Year"
|
138
|
+
month: "Month"
|
139
|
+
day: "Day"
|
140
|
+
hour: "Hour"
|
141
|
+
minute: "Minute"
|
142
|
+
second: "Seconds"
|
143
|
+
|
144
|
+
helpers:
|
145
|
+
select:
|
146
|
+
# Default value for :prompt => true in FormOptionsHelper
|
147
|
+
prompt: "Please select"
|
148
|
+
|
149
|
+
# Default translation keys for submit FormHelper
|
150
|
+
submit:
|
151
|
+
create: 'Create %{model}'
|
152
|
+
update: 'Update %{model}'
|
153
|
+
submit: 'Save %{model}'
|
154
|
+
|
@@ -0,0 +1,36 @@
|
|
1
|
+
en:
|
2
|
+
date:
|
3
|
+
formats:
|
4
|
+
# Use the strftime parameters for formats.
|
5
|
+
# When no format has been given, it uses default.
|
6
|
+
# You can provide other formats here if you like!
|
7
|
+
default: "%Y-%m-%d"
|
8
|
+
short: "%b %d"
|
9
|
+
long: "%B %d, %Y"
|
10
|
+
|
11
|
+
day_names: [Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday]
|
12
|
+
abbr_day_names: [Sun, Mon, Tue, Wed, Thu, Fri, Sat]
|
13
|
+
|
14
|
+
# Don't forget the nil at the beginning; there's no such thing as a 0th month
|
15
|
+
month_names: [~, January, February, March, April, May, June, July, August, September, October, November, December]
|
16
|
+
abbr_month_names: [~, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec]
|
17
|
+
# Used in date_select and datetime_select.
|
18
|
+
order:
|
19
|
+
- :year
|
20
|
+
- :month
|
21
|
+
- :day
|
22
|
+
|
23
|
+
time:
|
24
|
+
formats:
|
25
|
+
default: "%a, %d %b %Y %H:%M:%S %z"
|
26
|
+
short: "%d %b %H:%M"
|
27
|
+
long: "%B %d, %Y %H:%M"
|
28
|
+
am: "am"
|
29
|
+
pm: "pm"
|
30
|
+
|
31
|
+
# Used in array.to_sentence.
|
32
|
+
support:
|
33
|
+
array:
|
34
|
+
words_connector: ", "
|
35
|
+
two_words_connector: " and "
|
36
|
+
last_word_connector: ", and "
|
@@ -0,0 +1,105 @@
|
|
1
|
+
class Time
|
2
|
+
# Reports the approximate distance in time between two Time or Date objects or integers as seconds.
|
3
|
+
# Set <tt>include_seconds</tt> to true if you want more detailed approximations when distance < 1 min, 29 secs
|
4
|
+
# Distances are reported based on the following table:
|
5
|
+
#
|
6
|
+
# 0 <-> 29 secs # => less than a minute
|
7
|
+
# 30 secs <-> 1 min, 29 secs # => 1 minute
|
8
|
+
# 1 min, 30 secs <-> 44 mins, 29 secs # => [2..44] minutes
|
9
|
+
# 44 mins, 30 secs <-> 89 mins, 29 secs # => about 1 hour
|
10
|
+
# 89 mins, 29 secs <-> 23 hrs, 59 mins, 29 secs # => about [2..24] hours
|
11
|
+
# 23 hrs, 59 mins, 29 secs <-> 47 hrs, 59 mins, 29 secs # => 1 day
|
12
|
+
# 47 hrs, 59 mins, 29 secs <-> 29 days, 23 hrs, 59 mins, 29 secs # => [2..29] days
|
13
|
+
# 29 days, 23 hrs, 59 mins, 30 secs <-> 59 days, 23 hrs, 59 mins, 29 secs # => about 1 month
|
14
|
+
# 59 days, 23 hrs, 59 mins, 30 secs <-> 1 yr minus 1 sec # => [2..12] months
|
15
|
+
# 1 yr <-> 1 yr, 3 months # => about 1 year
|
16
|
+
# 1 yr, 3 months <-> 1 yr, 9 months # => over 1 year
|
17
|
+
# 1 yr, 9 months <-> 2 yr minus 1 sec # => almost 2 years
|
18
|
+
# 2 yrs <-> max time or date # => (same rules as 1 yr)
|
19
|
+
#
|
20
|
+
# With <tt>include_seconds</tt> = true and the difference < 1 minute 29 seconds:
|
21
|
+
# 0-4 secs # => less than 5 seconds
|
22
|
+
# 5-9 secs # => less than 10 seconds
|
23
|
+
# 10-19 secs # => less than 20 seconds
|
24
|
+
# 20-39 secs # => half a minute
|
25
|
+
# 40-59 secs # => less than a minute
|
26
|
+
# 60-89 secs # => 1 minute
|
27
|
+
#
|
28
|
+
# ==== Examples
|
29
|
+
# from_time = Time.now
|
30
|
+
# distance_of_time_in_words(from_time, from_time + 50.minutes) # => about 1 hour
|
31
|
+
# distance_of_time_in_words(from_time, 50.minutes.from_now) # => about 1 hour
|
32
|
+
# distance_of_time_in_words(from_time, from_time + 15.seconds) # => less than a minute
|
33
|
+
# distance_of_time_in_words(from_time, from_time + 15.seconds, true) # => less than 20 seconds
|
34
|
+
# distance_of_time_in_words(from_time, 3.years.from_now) # => about 3 years
|
35
|
+
# distance_of_time_in_words(from_time, from_time + 60.hours) # => about 3 days
|
36
|
+
# distance_of_time_in_words(from_time, from_time + 45.seconds, true) # => less than a minute
|
37
|
+
# distance_of_time_in_words(from_time, from_time - 45.seconds, true) # => less than a minute
|
38
|
+
# distance_of_time_in_words(from_time, 76.seconds.from_now) # => 1 minute
|
39
|
+
# distance_of_time_in_words(from_time, from_time + 1.year + 3.days) # => about 1 year
|
40
|
+
# distance_of_time_in_words(from_time, from_time + 3.years + 6.months) # => over 3 years
|
41
|
+
# distance_of_time_in_words(from_time, from_time + 4.years + 9.days + 30.minutes + 5.seconds) # => about 4 years
|
42
|
+
#
|
43
|
+
# to_time = Time.now + 6.years + 19.days
|
44
|
+
# distance_of_time_in_words(from_time, to_time, true) # => about 6 years
|
45
|
+
# distance_of_time_in_words(to_time, from_time, true) # => about 6 years
|
46
|
+
# distance_of_time_in_words(Time.now, Time.now) # => less than a minute
|
47
|
+
#
|
48
|
+
def distance_of_time_in_words(to_time = 0, include_seconds = false, options = {})
|
49
|
+
from_time = self
|
50
|
+
|
51
|
+
from_time = from_time.to_time if from_time.respond_to?(:to_time)
|
52
|
+
to_time = to_time.to_time if to_time.respond_to?(:to_time)
|
53
|
+
distance_in_minutes = (((to_time - from_time).abs)/60).round
|
54
|
+
distance_in_seconds = ((to_time - from_time).abs).round
|
55
|
+
|
56
|
+
I18n.with_options :locale => options[:locale], :scope => :'datetime.distance_in_words' do |locale|
|
57
|
+
case distance_in_minutes
|
58
|
+
when 0..1
|
59
|
+
return distance_in_minutes == 0 ?
|
60
|
+
locale.t(:less_than_x_minutes, :count => 1) :
|
61
|
+
locale.t(:x_minutes, :count => distance_in_minutes) unless include_seconds
|
62
|
+
|
63
|
+
case distance_in_seconds
|
64
|
+
when 0..4 then locale.t :less_than_x_seconds, :count => 5
|
65
|
+
when 5..9 then locale.t :less_than_x_seconds, :count => 10
|
66
|
+
when 10..19 then locale.t :less_than_x_seconds, :count => 20
|
67
|
+
when 20..39 then locale.t :half_a_minute
|
68
|
+
when 40..59 then locale.t :less_than_x_minutes, :count => 1
|
69
|
+
else locale.t :x_minutes, :count => 1
|
70
|
+
end
|
71
|
+
|
72
|
+
when 2..44 then locale.t :x_minutes, :count => distance_in_minutes
|
73
|
+
when 45..89 then locale.t :about_x_hours, :count => 1
|
74
|
+
when 90..1439 then locale.t :about_x_hours, :count => (distance_in_minutes.to_f / 60.0).round
|
75
|
+
when 1440..2529 then locale.t :x_days, :count => 1
|
76
|
+
when 2530..43199 then locale.t :x_days, :count => (distance_in_minutes.to_f / 1440.0).round
|
77
|
+
when 43200..86399 then locale.t :about_x_months, :count => 1
|
78
|
+
when 86400..525599 then locale.t :x_months, :count => (distance_in_minutes.to_f / 43200.0).round
|
79
|
+
else
|
80
|
+
distance_in_years = distance_in_minutes / 525600
|
81
|
+
minute_offset_for_leap_year = (distance_in_years / 4) * 1440
|
82
|
+
remainder = ((distance_in_minutes - minute_offset_for_leap_year) % 525600)
|
83
|
+
if remainder < 131400
|
84
|
+
locale.t(:about_x_years, :count => distance_in_years)
|
85
|
+
elsif remainder < 394200
|
86
|
+
locale.t(:over_x_years, :count => distance_in_years)
|
87
|
+
else
|
88
|
+
locale.t(:almost_x_years, :count => distance_in_years + 1)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
# Like distance_of_time_in_words, but where <tt>to_time</tt> is fixed to <tt>Time.now</tt>.
|
95
|
+
#
|
96
|
+
# ==== Examples
|
97
|
+
# time_ago_in_words(3.minutes.from_now) # => 3 minutes
|
98
|
+
# time_ago_in_words(Time.now - 15.hours) # => 15 hours
|
99
|
+
# time_ago_in_words(Time.now) # => less than a minute
|
100
|
+
#
|
101
|
+
# from_time = Time.now - 3.days - 14.minutes - 25.seconds # => 3 days
|
102
|
+
def time_ago_in_words(include_seconds = false)
|
103
|
+
distance_of_time_in_words(Time.now, include_seconds)
|
104
|
+
end
|
105
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'active_support/all'
|
2
|
+
|
3
|
+
# gem 'activesupport' #, '= 2.3.5'
|
4
|
+
#
|
5
|
+
# # autoload :BacktraceCleaner, 'active_support/backtrace_cleaner'
|
6
|
+
# autoload :Base64, 'active_support/base64'
|
7
|
+
# # autoload :BasicObject, 'active_support/basic_object' we use our own implementation
|
8
|
+
#
|
9
|
+
# # autoload :BufferedLogger, 'active_support/buffered_logger'
|
10
|
+
# # autoload :Cache, 'active_support/cache'
|
11
|
+
# # autoload :Callbacks, 'active_support/callbacks'
|
12
|
+
# # autoload :Deprecation, 'active_support/deprecation'
|
13
|
+
# # autoload :Duration, 'active_support/duration'
|
14
|
+
# # autoload :Gzip, 'active_support/gzip'
|
15
|
+
# autoload :Inflector, 'active_support/inflector'
|
16
|
+
# # autoload :Memoizable, 'active_support/memoizable'
|
17
|
+
# # autoload :MessageEncryptor, 'active_support/message_encryptor'
|
18
|
+
# # autoload :MessageVerifier, 'active_support/message_verifier'
|
19
|
+
# # autoload :Multibyte, 'active_support/multibyte'
|
20
|
+
# # autoload :OptionMerger, 'active_support/option_merger'
|
21
|
+
# # autoload :OrderedHash, 'active_support/ordered_hash'
|
22
|
+
# # autoload :OrderedOptions, 'active_support/ordered_options'
|
23
|
+
# # autoload :Rescuable, 'active_support/rescuable'
|
24
|
+
# # autoload :SecureRandom, 'active_support/secure_random'
|
25
|
+
# # autoload :StringInquirer, 'active_support/string_inquirer'
|
26
|
+
# autoload :TimeWithZone, 'active_support/time_with_zone'
|
27
|
+
# autoload :TimeZone, 'active_support/values/time_zone'
|
28
|
+
# # autoload :XmlMini, 'active_support/xml_mini'
|
29
|
+
#
|
30
|
+
# # require 'active_support/vendor'
|
31
|
+
# require 'active_support/core_ext'
|
32
|
+
# # require 'active_support/dependencies'
|
33
|
+
# # require 'active_support/json'
|
34
|
+
|
35
|
+
|
36
|
+
#
|
37
|
+
# Hacks
|
38
|
+
#
|
39
|
+
%w(
|
40
|
+
micelaneous
|
41
|
+
time
|
42
|
+
).each{|f| require "rad/support/active_support/#{f}"}
|
43
|
+
|
44
|
+
|
45
|
+
#
|
46
|
+
# Locales
|
47
|
+
#
|
48
|
+
support_dir = File.dirname __FILE__
|
49
|
+
I18n.load_path += Dir["#{support_dir}/active_support/locales/**/*.{rb,yml}"]
|
@@ -0,0 +1,45 @@
|
|
1
|
+
Addressable::URI.class_eval do
|
2
|
+
def request_uri
|
3
|
+
return nil if self.absolute? && self.scheme !~ /^https?$/
|
4
|
+
return (
|
5
|
+
(self.path != "" ? self.path : "/") +
|
6
|
+
(self.query ? "?#{self.query}" : "")
|
7
|
+
)
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.normalize_host host
|
11
|
+
host.gsub(/^www\./, "")
|
12
|
+
end
|
13
|
+
|
14
|
+
def normalized_host
|
15
|
+
host ? host : host.gsub(/^www\./, '')
|
16
|
+
end
|
17
|
+
|
18
|
+
# Delete 'nil' keys
|
19
|
+
def query_values_with_skip_nil= options
|
20
|
+
to_delete = []
|
21
|
+
options.each{|k, v| to_delete << k if v.nil?}
|
22
|
+
to_delete.each{|k| options.delete k}
|
23
|
+
|
24
|
+
self.query_values_without_skip_nil = options
|
25
|
+
end
|
26
|
+
alias_method_chain :query_values=, :skip_nil
|
27
|
+
|
28
|
+
|
29
|
+
# Override original to fix:
|
30
|
+
# - extra '?' sign (/some_path?) if there's empty but not-nil query
|
31
|
+
def to_s
|
32
|
+
@uri_string ||= (begin
|
33
|
+
uri_string = ""
|
34
|
+
uri_string << "#{self.scheme}:" if self.scheme != nil
|
35
|
+
uri_string << "//#{self.authority}" if self.authority != nil
|
36
|
+
uri_string << self.path.to_s
|
37
|
+
uri_string << "?#{self.query}" unless self.query.blank?
|
38
|
+
uri_string << "##{self.fragment}" if self.fragment != nil
|
39
|
+
if uri_string.respond_to?(:force_encoding)
|
40
|
+
uri_string.force_encoding(Encoding::UTF_8)
|
41
|
+
end
|
42
|
+
uri_string
|
43
|
+
end)
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
#
|
2
|
+
# In development mode log also to STDOUT
|
3
|
+
#
|
4
|
+
ActiveSupport::BufferedLogger.class_eval do
|
5
|
+
|
6
|
+
def flush_with_stdout
|
7
|
+
STDOUT.write(buffer.join) unless buffer.empty?
|
8
|
+
flush_without_stdout
|
9
|
+
end
|
10
|
+
rad.after :config do
|
11
|
+
if rad.include?(:config) and (rad.config.development? or rad.config.stdout_logger(false))
|
12
|
+
alias_method_chain :flush, :stdout
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
|
17
|
+
def info_with_format obj
|
18
|
+
info_without_format(obj_to_string(obj))
|
19
|
+
end
|
20
|
+
alias_method_chain :info, :format
|
21
|
+
|
22
|
+
def warn_with_format obj
|
23
|
+
warn_without_format("WARN: " + obj_to_string(obj))
|
24
|
+
end
|
25
|
+
alias_method_chain :warn, :format
|
26
|
+
|
27
|
+
def error_with_format obj
|
28
|
+
error_without_format("ERROR: " + obj_to_string(obj))
|
29
|
+
end
|
30
|
+
alias_method_chain :error, :format
|
31
|
+
|
32
|
+
protected
|
33
|
+
def obj_to_string obj
|
34
|
+
if obj.is_a? Exception
|
35
|
+
backtrace = (obj.backtrace && obj.backtrace.sfilter(Exception.common_filters)) || []
|
36
|
+
%{\
|
37
|
+
#{obj.message}
|
38
|
+
#{backtrace.join("\n ")}
|
39
|
+
}
|
40
|
+
else
|
41
|
+
obj.to_s
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|