rad_core 0.0.25 → 0.0.26

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.
Files changed (72) hide show
  1. data/Rakefile +3 -1
  2. data/bin/rad +33 -0
  3. data/lib/components/configurators.rb +5 -0
  4. data/lib/components/environment.production.yml +1 -0
  5. data/lib/components/environment.yml +30 -1
  6. data/lib/components/http.yml +12 -1
  7. data/lib/components/web.rb +2 -2
  8. data/lib/rad/_support/active_support/{micelaneous.rb → miscellaneous.rb} +0 -0
  9. data/lib/rad/_support/active_support.rb +1 -1
  10. data/lib/rad/_support/exception.rb +9 -40
  11. data/lib/rad/_support/string.rb +7 -1
  12. data/lib/rad/cli/helper.rb +34 -0
  13. data/lib/rad/configurators/_require.rb +13 -0
  14. data/lib/rad/configurators/abstract.rb +24 -0
  15. data/lib/rad/configurators/runtime.rb +4 -0
  16. data/lib/rad/configurators/web.rb +34 -0
  17. data/lib/rad/controller/_abstract/{micelaneous.rb → miscellaneous.rb} +1 -1
  18. data/lib/rad/controller/_abstract/render.rb +54 -53
  19. data/lib/rad/controller/_abstract.rb +16 -8
  20. data/lib/rad/controller/_context.rb +3 -9
  21. data/lib/rad/controller/_http.rb +22 -17
  22. data/lib/rad/controller/_require.rb +1 -1
  23. data/lib/rad/controller/processors/controller_caller.rb +5 -13
  24. data/lib/rad/controller/processors/controller_error_handling.rb +2 -2
  25. data/lib/rad/environment/_environment.rb +4 -0
  26. data/lib/rad/environment/_logger.rb +5 -5
  27. data/lib/rad/html/_require.rb +1 -1
  28. data/lib/rad/http/_http.rb +8 -4
  29. data/lib/rad/http/_http_adapter.rb +1 -21
  30. data/lib/rad/http/_request.rb +48 -7
  31. data/lib/rad/http/_require.rb +1 -1
  32. data/lib/rad/http/_response.rb +1 -1
  33. data/lib/rad/http/_support/rack/fixes.rb +6 -0
  34. data/lib/rad/http/processors/prepare_params.rb +1 -1
  35. data/lib/rad/mailer/processors/letter_builder.rb +3 -9
  36. data/lib/rad/profiles/web.rb +35 -10
  37. data/lib/rad/router/_router.rb +1 -1
  38. data/lib/rad/router/{micelaneous_router.rb → miscellaneous_router.rb} +0 -0
  39. data/lib/rad/spec/http_controller.rb +15 -11
  40. data/lib/rad/spec/web.rb +7 -0
  41. data/lib/rad/spec.rb +1 -0
  42. data/lib/rad/tasks.rb +15 -0
  43. data/lib/rad/template/_context.rb +0 -4
  44. data/lib/rad/template/_template.rb +1 -1
  45. data/lib/rad/web/_ajax_helper.rb +16 -0
  46. data/lib/rad/{core_web/_controller_micelaneous_helper.rb → web/_controller_miscellaneous_helper.rb} +2 -2
  47. data/lib/rad/web/_ensure_no_www.rb +30 -0
  48. data/lib/rad/web/_protect_from_forgery.rb +71 -0
  49. data/lib/rad/{core_web → web}/_require.rb +13 -4
  50. data/lib/rad/{core_web → web}/_router/abstract_routing_helper.rb +0 -0
  51. data/lib/rad/{core_web → web}/_router/controller_routing_helper.rb +0 -0
  52. data/lib/rad/{core_web → web}/_router/view_routing_helper.rb +0 -0
  53. data/lib/rad.rb +1 -1
  54. data/readme.md +14 -7
  55. data/spec/controller/abstract_spec.rb +2 -2
  56. data/spec/controller/error_handling_spec.rb +1 -1
  57. data/spec/controller/http_spec/views/ViewVariablesSpec/action.erb +2 -0
  58. data/spec/controller/http_spec.rb +18 -1
  59. data/spec/controller/render_spec.rb +13 -13
  60. data/spec/http/http_spec.rb +1 -1
  61. data/spec/http/{micelaneous_spec.rb → miscellaneous_spec.rb} +0 -0
  62. data/spec/router/integration_spec.rb +4 -1
  63. data/spec/router/object_router_spec.rb +1 -1
  64. data/spec/router/persistent_params_spec.rb +1 -1
  65. data/spec/router/restful_router_spec.rb +1 -1
  66. data/spec/web/basic_spec.rb +8 -4
  67. data/spec/web/controller_routing_helper_spec.rb +4 -3
  68. data/spec/web/flash_spec.rb +2 -3
  69. data/spec/web/protect_from_forgery_spec.rb +187 -0
  70. data/spec/web/spec_helper_spec.rb +9 -5
  71. data/spec/web/view_routing_helper_spec.rb +1 -1
  72. metadata +27 -12
data/Rakefile CHANGED
@@ -3,8 +3,10 @@ require 'rake_ext'
3
3
  project(
4
4
  name: 'rad',
5
5
  official_name: 'rad_core',
6
+ bin: 'bin',
7
+ dirs: 'bin',
6
8
  gem: true,
7
- summary: 'General purposed Web/App Framework',
9
+ summary: 'Simple and highly customizable Web Framework encouraging to build an app as a set of low-coupled components instead of monolith',
8
10
 
9
11
  author: 'Alexey Petrushin',
10
12
  homepage: 'http://github.com/alexeypetrushin/rad_core'
data/bin/rad ADDED
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env ruby
2
+ # sadly it's impossible to pass '-Ku' argument to ruby via shebang, use RUBYOPT to set it, something like:
3
+ # $ export RUBYOPT="-Ku -rrubygems"
4
+
5
+ require 'rad'
6
+ require 'rad/cli/helper'
7
+
8
+ # version
9
+ if ARGV.first =~ /-v|version|-version/
10
+ puts "Rad #{Rad::VERSION}"
11
+ exit
12
+ end
13
+
14
+ # mode and environment
15
+ mode = (%w(server console).include? ARGV.first) ? ARGV.shift : 'server'
16
+ environment = (%w(production development test).include? ARGV.first) ? ARGV.shift : :development
17
+ rad.mode = environment
18
+
19
+ # config options
20
+ ARGV.each do |expression|
21
+ name, value = expression.split('=')
22
+ name.sub!(/^-+/, '')
23
+ if name =~ /\./
24
+ component_name, key = name.split('.').collect{|s| s.to_sym}
25
+ rad.config[component_name] ||= {}
26
+ rad.config[component_name][key] = value
27
+ else
28
+ rad.config[name.to_sym] = value
29
+ end
30
+ end
31
+
32
+ # running
33
+ Rad::Cli::Helper.send "run_#{mode}"
@@ -0,0 +1,5 @@
1
+ rad.register :configurators, depends_on: :environment do
2
+ require 'rad/configurators/_require'
3
+
4
+ Rad::Conveyors.new
5
+ end
@@ -0,0 +1 @@
1
+ backtrace_filters: []
@@ -1,3 +1,32 @@
1
1
  available_languages:
2
2
  - :en
3
- language: :en
3
+ language: :en
4
+
5
+ backtrace_filters:
6
+ - /timeout.rb
7
+ - rubygems/custom_require
8
+ - /bin/spec
9
+ - /monitor
10
+ - /synchronize
11
+ - internal:lib/
12
+
13
+ - /gems/haml
14
+ - /gems/tilt
15
+ - /gems/rack
16
+ - /gems/rspec
17
+ - /gems/thin
18
+ - /gems/eventmachine
19
+ - /gems/mongoid
20
+
21
+ - lib/fake_gem
22
+ - /class_loader
23
+ - /micon
24
+
25
+ - /kit/
26
+ - /rad/
27
+ - /face/
28
+
29
+ # - /rad/template
30
+ # - /rad/_support
31
+ # - /face/view_builder
32
+ # - /face/view_helper
@@ -2,7 +2,18 @@ host: 'localhost'
2
2
  port: 4000
3
3
  static: true
4
4
  url_root: '/'
5
- default_format: 'html'
5
+ default_format: 'html'
6
+
7
+ # used in forgery protection and captcha
8
+ browser_generated_types:
9
+ - text/html
10
+ - text/plain
11
+ - text/javascript
12
+ - application/x-www-form-urlencoded
13
+ - multipart/form-data
14
+ browser_generated_formats:
15
+ - html
16
+ - js
6
17
 
7
18
  # session sample
8
19
  # session:
@@ -1,5 +1,5 @@
1
- rad.register :web, depends_on: [:html, :router, :controller, :http] do
2
- require 'rad/core_web/_require'
1
+ rad.register :web, depends_on: [:html, :router, :controller, :http, :configurators] do
2
+ require 'rad/web/_require'
3
3
 
4
4
  load 'rad/profiles/web.rb'
5
5
  load 'rad/profiles/mailer.rb'
@@ -49,7 +49,7 @@ require 'active_support/all'
49
49
  # Hacks
50
50
  #
51
51
  %w(
52
- micelaneous
52
+ miscellaneous
53
53
  time
54
54
  ).each{|f| require "rad/_support/active_support/#{f}"}
55
55
  require 'yaml_fix'
@@ -1,45 +1,14 @@
1
- Exception.metaclass_eval do
2
- attr_accessor :filters
3
- end
4
-
5
- Exception.filters = []
6
- Exception.filters = %w(
7
- /gems/haml
8
- /gems/tilt
9
- /gems/facets
10
- /gems/rack
11
- /gems/mongrel
12
- /gems/rspec
13
- /gems/thin
14
-
15
- /timeout.rb
16
- /bin/spec
17
-
18
- lib/fake_gem
19
- rubygems/custom_require
20
-
21
- /rad/template
22
- /rad/template
23
-
24
- /face/view_builder
25
- /face/view_helper
26
-
27
- /rad/_support
28
-
29
- /monitor
30
- /synchronize
31
- /class_loader
32
- /micon
33
-
34
- internal:lib/
35
- )
36
-
37
- # Uncomment this line to disable filtering
38
- # Exception.filters = []
39
-
40
1
  Exception.class_eval do
41
2
  alias_method :set_backtrace_without_filter, :set_backtrace
42
3
  def set_backtrace array
43
- set_backtrace_without_filter array.sfilter(::Exception.filters)
4
+ begin
5
+ if environment = rad.environment? && rad.environment
6
+ set_backtrace_without_filter array.sfilter(environment.backtrace_filters)
7
+ else
8
+ set_backtrace_without_filter array
9
+ end
10
+ rescue
11
+ set_backtrace_without_filter array
12
+ end
44
13
  end
45
14
  end
@@ -12,10 +12,16 @@ class String
12
12
  gsub(/[&"><]/){|special| HTML_ESCAPE_MAP[special]}
13
13
  end
14
14
 
15
- def url_escape
15
+ def url_escape
16
+ # TODO2 change to Rack::Utils.escape
16
17
  CGI.escape self
17
18
  end
18
19
 
20
+ def url_unescape
21
+ # TODO2 change to Rack::Utils.unescape
22
+ CGI.unescape self
23
+ end
24
+
19
25
  JS_ESCAPE_MAP = {
20
26
  '\\' => '\\\\',
21
27
  '</' => '<\/',
@@ -0,0 +1,34 @@
1
+ module Helper
2
+ RUNTIME_DIR = 'runtime'
3
+
4
+ class << self
5
+ inject logger: :logger
6
+
7
+ def run_console
8
+ prepare_running_environment
9
+
10
+ require 'irb'
11
+ IRB.start
12
+ end
13
+
14
+ def run_server
15
+ app = prepare_running_environment
16
+
17
+ rad.http.run app, rad.http.host, rad.http.port
18
+ end
19
+
20
+ def use_runtime_path!
21
+ runtime_path = "./#{RUNTIME_DIR}"
22
+ Dir.chdir runtime_path if Dir.exist? runtime_path
23
+ end
24
+
25
+ protected
26
+ def prepare_running_environment
27
+ use_runtime_path!
28
+
29
+ require 'rack'
30
+ app, options = Rack::Builder.parse_file 'config.ru'
31
+ app
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,13 @@
1
+ # %w(
2
+ # abstract
3
+ # runtime
4
+ # web
5
+ # ).each{|f| require "rad/configurators/#{f}"}
6
+
7
+ class Micon::Core
8
+ def configure configurator_name, dir, &block
9
+ configurator_class = "Rad::Configurators::#{configurator_name.to_s.classify}".constantize
10
+ configurator = configurator_class.new dir
11
+ block.call configurator if block
12
+ end
13
+ end
@@ -0,0 +1,24 @@
1
+ rad.configurators
2
+
3
+ class Abstract
4
+ def initialize dir
5
+ @dir = File.expand_path(dir)
6
+ end
7
+
8
+ # def config options = {}
9
+ # rad.config.merge_config! "#{dir}/config/config.yml", options
10
+ # end
11
+
12
+ def routes
13
+ routes_file = "#{dir}/config/routes.rb"
14
+ load routes_file if File.exist? routes_file
15
+ end
16
+
17
+ def locales
18
+ I18n.load_path += Dir["#{dir}/config/locales/**/*.{rb,yml}"]
19
+ I18n.load_path += Dir["#{dir}/config/locales/*.{rb,yml}"]
20
+ end
21
+
22
+ protected
23
+ attr_reader :dir #, :after_config, :after_environment
24
+ end
@@ -0,0 +1,4 @@
1
+ rad.configurators
2
+
3
+ class Runtime < Abstract
4
+ end
@@ -0,0 +1,34 @@
1
+ rad.configurators
2
+
3
+ class Web < Abstract
4
+ def asset_paths *relative_paths
5
+ relative_paths = relative_paths.first if relative_paths.first.is_a? Array
6
+ relative_paths.each do |relative_path|
7
+ path = "#{dir}/#{relative_path}"
8
+ rad.assets.paths << path unless rad.assets.paths.include? path
9
+ end
10
+ end
11
+
12
+ def load_paths *relative_paths
13
+ relative_paths = relative_paths.first if relative_paths.first.is_a? Array
14
+ relative_paths.each do |relative_path|
15
+ path = "#{dir}/#{relative_path}"
16
+ $LOAD_PATH << path unless $LOAD_PATH.include? path
17
+ end
18
+ end
19
+
20
+ def template_paths *relative_paths
21
+ rad.template
22
+
23
+ relative_paths = relative_paths.first if relative_paths.first.is_a? Array
24
+ relative_paths.each do |relative_path|
25
+ path = "#{dir}/#{relative_path}"
26
+ rad.template.paths << path unless rad.template.paths.include? path
27
+ end
28
+ end
29
+
30
+ def autoload_paths *relative_paths
31
+ relative_paths = relative_paths.first if relative_paths.first.is_a? Array
32
+ relative_paths.each{|d| autoload_dir "#{dir}/#{d}", true}
33
+ end
34
+ end
@@ -1,4 +1,4 @@
1
- module Rad::Controller::Abstract::Micelaneous
1
+ module Rad::Controller::Abstract::Miscellaneous
2
2
  #
3
3
  # respond_to
4
4
  #
@@ -13,46 +13,67 @@ module Rad::Controller::Abstract::Render
13
13
  @_layout = layout
14
14
  end
15
15
 
16
- def render *args
17
- options = rad.template.parse_arguments *args
18
- content = render_with_parsed_arguments options, args
16
+ def render *args
17
+ options = rad.template.parse_arguments *args
18
+
19
+ instance_variables = {
20
+ controller_name: self.class.controller_name
21
+ }
22
+
23
+ instance_variable_names.each do |name|
24
+ instance_variables[name[1..-1]] = instance_variable_get name unless name =~ /^@_/
25
+ end
26
+
27
+ instance_variables[:action_name] = options[:action] if options[:action]
28
+
29
+ context = self.class.context_class.new(instance_variables, self)
30
+
31
+ options.reverse_merge! \
32
+ context: context,
33
+ format: params.format,
34
+ exact_format: true,
35
+ relative_path_resolver: self.class
36
+
37
+ content = render_content options
38
+ content = render_layout content, options
39
+
19
40
  throw :halt, content
20
41
  end
21
42
 
22
43
  protected
23
- def render_action options
24
- instance_variables = {
25
- action_name: (options[:action] || workspace.action).to_sym,
26
- controller_name: self.class.controller_name
27
- }
28
- instance_variable_names.each do |name|
29
- instance_variables[name[1..-1]] = instance_variable_get name unless name =~ /^@_/
44
+ def render_content options
45
+ if special_format = SPECIAL_FORMAT_HANDLERS.keys.find{|f| options.include? f}
46
+ handler = SPECIAL_FORMAT_HANDLERS[special_format]
47
+ if special_format.to_s != params.format
48
+ raise "You trying responing with '#{special_format}' to the '#{params.format}' requested format!"
49
+ end
50
+ handler.call options[special_format]
51
+ elsif options.include? :inline
52
+ options[:inline]
53
+ elsif options[:template] == :nothing
54
+ ''
55
+ else
56
+ if action = options.delete(:action)
57
+ options[:template].must_be.blank
58
+ options[:template] = action
59
+
60
+ options.reverse_merge! \
61
+ prefixes: [''],
62
+ if_not_exist: '/rad_default_templates/blank_template'
63
+ end
64
+ options[:template].must_be.present
65
+ options[:template] = options[:template].to_s
66
+
67
+ rad.template.render options
30
68
  end
31
- context = self.class.context_class.new(instance_variables, self)
32
-
33
- options[:template] ||= options.delete(:action)
34
- options[:template].must_be.present
35
- options[:template] = options[:template].to_s
36
-
37
- options.reverse_merge!(
38
- context: context,
39
- format: params.format,
40
- exact_format: true,
41
- prefixes: ['']
42
- )
43
-
44
- # rendering content
45
- content, context = render_content options
46
-
47
- # rendering layout
48
- options[:content] = context
49
- render_layout options, content
50
69
  end
51
-
52
- def render_layout options, content
70
+
71
+ def render_layout content, options
53
72
  layout = options.include?(:layout) ? options[:layout] : self._layout
54
- if layout # and rad.template.exist? layout, options
55
- rad.template.render layout, options do |*args|
73
+
74
+ if layout and rad.template.exist? layout, options
75
+ options = options.merge template: layout
76
+ rad.template.render options do |*args|
56
77
  if args.empty?
57
78
  content
58
79
  else
@@ -66,26 +87,6 @@ module Rad::Controller::Abstract::Render
66
87
  end
67
88
  end
68
89
 
69
- def render_content options
70
- rad.template.basic_render options.merge(relative_path_resolver: self.class, if_not_exist: '/rad_default_templates/blank_template')
71
- end
72
-
73
- def render_with_parsed_arguments options, original_args
74
- if special_format = SPECIAL_FORMAT_HANDLERS.keys.find{|f| options.include? f}
75
- handler = SPECIAL_FORMAT_HANDLERS[special_format]
76
- if special_format.to_s != params.format
77
- raise "You trying responing with '#{special_format}' to the '#{params.format}' requested format!"
78
- end
79
- handler.call options[special_format]
80
- elsif options.include? :inline
81
- options[:inline]
82
- elsif options[:template] == :nothing
83
- ''
84
- else
85
- render_action options
86
- end
87
- end
88
-
89
90
  module ClassMethods
90
91
  def layout layout, options = {}
91
92
  before options do |controller|
@@ -1,16 +1,24 @@
1
1
  module Rad::Controller::Abstract
2
+ inherit OpenConstructor
2
3
  inherit Rad::Filters
3
- inherit Rad::Controller::Abstract::Render, Rad::Controller::Abstract::Micelaneous
4
+ inherit Rad::Controller::Abstract::Render, Rad::Controller::Abstract::Miscellaneous
4
5
 
5
6
  inject workspace: :workspace, logger: :logger
6
7
 
7
- def params
8
- workspace.params
9
- end
10
-
11
- # def response
12
- # workspace.response
13
- # end
8
+ attr_accessor :action_name
9
+ attr_required :action_name
10
+
11
+ attr_writer :params
12
+ def params; @params ||= Rad::Conveyors::Params.new end
13
+
14
+ def call action, *args
15
+ catch :halt do
16
+ run_callbacks :action, method: action do
17
+ send action, *args
18
+ render action: action
19
+ end
20
+ end
21
+ end
14
22
 
15
23
  module ClassMethods
16
24
  inject workspace: :workspace, logger: :logger
@@ -1,15 +1,9 @@
1
1
  class Rad::Controller::Context < Rad::Template::Context
2
- attr_reader :controller
2
+ attr_reader :controller, :controller_name, :action_name
3
+ delegate :params, :request, :response, to: :controller
4
+
3
5
  def initialize instance_variables, controller
4
6
  super instance_variables
5
7
  @controller = controller
6
8
  end
7
-
8
- def controller_name
9
- @controller_name #workspace.controller.class.controller_name
10
- end
11
-
12
- def action_name
13
- @action_name #workspace.action.to_sym
14
- end
15
9
  end
@@ -1,22 +1,28 @@
1
1
  module Rad::Controller::Http
2
2
  inherit Rad::Controller::Abstract
3
3
 
4
- # def response
5
- # workspace.response
6
- # end
4
+ def request; rad.workspace? ? workspace.request : nil end
5
+ def response; rad.workspace? ? workspace.response : nil end
6
+
7
+ def render *args
8
+ if args.size == 1 and (status = Rad::Http::Response.decode_status_message(args.first))
9
+ response.set! status: status
10
+ throw :halt, ""
11
+ else
12
+ super
13
+ end
14
+ end
7
15
 
8
16
  protected
9
- def render_with_parsed_arguments options, original_args
10
- response = workspace.response
11
- response.set!(
12
- status: options[:status] || :ok,
13
- content_type: options[:content_type] || Mime[params.format]
14
- )
17
+ def render_content options
18
+ if response
19
+ response.set!(
20
+ status: options[:status] || :ok,
21
+ content_type: options[:content_type] || Mime[params.format]
22
+ )
23
+ end
15
24
 
16
- if original_args.size == 1 and (status = Rad::Http::Response.decode_status_message(original_args.first))
17
- response.set! status: status
18
- throw :halt, ""
19
- elsif options[:location]
25
+ if options[:location]
20
26
  redirect_to options[:location]
21
27
  else
22
28
  super
@@ -36,11 +42,10 @@ module Rad::Controller::Http
36
42
  private
37
43
  def enable_protection_from_get_requests!
38
44
  unless respond_to? :protect_from_get_request
39
- define_method :protect_from_get_request do
40
- request = workspace.request
45
+ define_method :protect_from_get_request do
41
46
  get = !(request.post? or request.put? or request.delete?)
42
- if get and !self.class.actions_allowed_for_get_request.include?(workspace.action)
43
- raise "GET request not allowed for :#{workspace.action} action!"
47
+ if get and !self.class.actions_allowed_for_get_request.include?(action_name)
48
+ raise "GET request not allowed for :#{action_name} action!"
44
49
  end
45
50
  end
46
51
  before :protect_from_get_request
@@ -11,7 +11,7 @@ end
11
11
  %w(
12
12
  _abstract/render
13
13
  _abstract/responder
14
- _abstract/micelaneous
14
+ _abstract/miscellaneous
15
15
  _abstract
16
16
  _context
17
17
 
@@ -5,22 +5,14 @@ class ControllerCaller < Rad::Conveyors::Processor
5
5
  # prepare
6
6
  response = workspace.response.must_be.defined
7
7
  klass = workspace.class.must_be.present
8
- raise "The controller class #{klass} must be a Rad::Controller::Abstract!" unless klass.is? Rad::Controller::Abstract
9
- controller = workspace.controller = klass.new
10
- action = workspace.action = workspace.method_name
8
+ raise "The controller class #{klass} must be a Rad::Controller::Abstract!" unless klass.is? Rad::Controller::Abstract
9
+ action_name = workspace.action_name = workspace.method_name
11
10
  format = workspace.params.format
12
11
 
13
12
  # call
14
-
15
- workspace.content = catch :halt do
16
- controller.run_callbacks :action, method: action do
17
- # call controller
18
- controller.send action
19
-
20
- # render view
21
- controller.render action: action
22
- end
23
- end
13
+ controller = workspace.controller = klass.new
14
+ controller.set! params: workspace.params, action_name: workspace.action_name
15
+ workspace.content = controller.call action_name
24
16
  end
25
17
 
26
18
  end
@@ -8,7 +8,7 @@ class ControllerErrorHandling < Rad::Conveyors::Processor
8
8
  next_processor.call
9
9
  rescue StandardError => e
10
10
  if rad.test?
11
- e.set_backtrace e.backtrace.sfilter(Exception.filters)
11
+ # e.set_backtrace e.backtrace.sfilter(Exception.filters)
12
12
  raise e
13
13
  elsif rad.production?
14
14
  error_shown_to_user = StandardError.new "Internal error!"
@@ -17,7 +17,7 @@ class ControllerErrorHandling < Rad::Conveyors::Processor
17
17
  error_shown_to_user = e
18
18
  end
19
19
 
20
- workspace.response.clear if workspace.response?
20
+ workspace.response.clear if workspace.response
21
21
  format = workspace.params.format
22
22
  handler = SPECIAL_ERROR_HANDLERS[format] || DEFAULT_ERROR_HANDLER
23
23
  workspace.content = handler.call error_shown_to_user, format
@@ -11,6 +11,10 @@ class Rad::Environment
11
11
 
12
12
  attr_accessor :language
13
13
 
14
+ attr_writer :backtrace_filters
15
+ def backtrace_filters; @backtrace_filters ||= [] end
16
+
17
+
14
18
  class << self
15
19
  inject logger: :logger
16
20
  end
@@ -13,19 +13,19 @@ class Rad::Logger
13
13
  end
14
14
 
15
15
  def info obj
16
- write obj_to_string(obj) + "\n"
16
+ write obj_to_string(obj)
17
17
  end
18
18
 
19
19
  def warn obj
20
- write "WARN: " + obj_to_string(obj) + "\n"
20
+ write "WARN: " + obj_to_string(obj)
21
21
  end
22
22
 
23
23
  def error obj
24
- write "ERROR: " + obj_to_string(obj) + "\n"
24
+ write "ERROR: " + obj_to_string(obj)
25
25
  end
26
26
 
27
27
  def debug obj
28
- write obj_to_string(obj).gsub(/BSON::ObjectId\(([a-z0-9'"]+)\)/, "\\1") + "\n"
28
+ write obj_to_string(obj).gsub(/BSON::ObjectId\(([a-z0-9'"]+)\)/, "\\1")
29
29
  end
30
30
 
31
31
  protected
@@ -45,7 +45,7 @@ class Rad::Logger
45
45
 
46
46
  def obj_to_string obj
47
47
  if obj.is_a? Exception
48
- backtrace = (obj.backtrace && obj.backtrace.sfilter(Exception.filters)) || []
48
+ backtrace = obj.backtrace || []
49
49
  %{\
50
50
  #{obj.message}
51
51
  #{backtrace.join("\n ")}