aldous 1.0.0
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.
- checksums.yaml +7 -0
- data/.gitignore +19 -0
- data/.irbrc +3 -0
- data/.rspec +3 -0
- data/.ruby-version +1 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +591 -0
- data/Rakefile +1 -0
- data/aldous.gemspec +24 -0
- data/examples/basic_todo/.foreman +1 -0
- data/examples/basic_todo/.gitignore +16 -0
- data/examples/basic_todo/.rspec +3 -0
- data/examples/basic_todo/.ruby-version +2 -0
- data/examples/basic_todo/Gemfile +52 -0
- data/examples/basic_todo/Procfile +1 -0
- data/examples/basic_todo/README.rdoc +28 -0
- data/examples/basic_todo/Rakefile +6 -0
- data/examples/basic_todo/app/assets/images/.keep +0 -0
- data/examples/basic_todo/app/assets/javascripts/application.js +13 -0
- data/examples/basic_todo/app/assets/stylesheets/application.css +15 -0
- data/examples/basic_todo/app/controller_actions/base_action.rb +24 -0
- data/examples/basic_todo/app/controller_actions/base_precondition.rb +2 -0
- data/examples/basic_todo/app/controller_actions/home_controller/show.rb +8 -0
- data/examples/basic_todo/app/controller_actions/shared/ensure_user_not_disabled_precondition.rb +9 -0
- data/examples/basic_todo/app/controller_actions/sign_ins_controller/create.rb +24 -0
- data/examples/basic_todo/app/controller_actions/sign_ins_controller/destroy.rb +9 -0
- data/examples/basic_todo/app/controller_actions/sign_ins_controller/new.rb +7 -0
- data/examples/basic_todo/app/controller_actions/sign_ins_controller/user_params.rb +9 -0
- data/examples/basic_todo/app/controller_actions/sign_ups_controller/create.rb +23 -0
- data/examples/basic_todo/app/controller_actions/sign_ups_controller/new.rb +7 -0
- data/examples/basic_todo/app/controller_actions/sign_ups_controller/user_params.rb +9 -0
- data/examples/basic_todo/app/controller_actions/todos/all_completed_controller/destroy.rb +17 -0
- data/examples/basic_todo/app/controller_actions/todos/completed_controller/create.rb +29 -0
- data/examples/basic_todo/app/controller_actions/todos_controller/create.rb +26 -0
- data/examples/basic_todo/app/controller_actions/todos_controller/destroy.rb +21 -0
- data/examples/basic_todo/app/controller_actions/todos_controller/edit.rb +19 -0
- data/examples/basic_todo/app/controller_actions/todos_controller/index.rb +19 -0
- data/examples/basic_todo/app/controller_actions/todos_controller/new.rb +17 -0
- data/examples/basic_todo/app/controller_actions/todos_controller/todo_params.rb +9 -0
- data/examples/basic_todo/app/controller_actions/todos_controller/update.rb +28 -0
- data/examples/basic_todo/app/controller_actions/users_controller/index.rb +19 -0
- data/examples/basic_todo/app/controllers/application_controller.rb +9 -0
- data/examples/basic_todo/app/controllers/home_controller.rb +5 -0
- data/examples/basic_todo/app/controllers/sign_ins_controller.rb +5 -0
- data/examples/basic_todo/app/controllers/sign_ups_controller.rb +5 -0
- data/examples/basic_todo/app/controllers/todos/all_completed_controller.rb +5 -0
- data/examples/basic_todo/app/controllers/todos/completed_controller.rb +5 -0
- data/examples/basic_todo/app/controllers/todos_controller.rb +5 -0
- data/examples/basic_todo/app/controllers/users_controller.rb +5 -0
- data/examples/basic_todo/app/helpers/application_helper.rb +2 -0
- data/examples/basic_todo/app/mailers/.keep +0 -0
- data/examples/basic_todo/app/models/ability.rb +27 -0
- data/examples/basic_todo/app/models/role.rb +5 -0
- data/examples/basic_todo/app/models/todo.rb +5 -0
- data/examples/basic_todo/app/models/user.rb +12 -0
- data/examples/basic_todo/app/models/user_role.rb +5 -0
- data/examples/basic_todo/app/services/create_user_service.rb +26 -0
- data/examples/basic_todo/app/services/find_current_user_service.rb +29 -0
- data/examples/basic_todo/app/services/sign_in_service.rb +13 -0
- data/examples/basic_todo/app/services/sign_out_service.rb +12 -0
- data/examples/basic_todo/app/views/base_view.rb +18 -0
- data/examples/basic_todo/app/views/defaults/bad_request.html.slim +12 -0
- data/examples/basic_todo/app/views/defaults/bad_request_view.rb +15 -0
- data/examples/basic_todo/app/views/defaults/forbidden.html.slim +6 -0
- data/examples/basic_todo/app/views/defaults/forbidden_view.rb +14 -0
- data/examples/basic_todo/app/views/defaults/server_error.html.slim +12 -0
- data/examples/basic_todo/app/views/defaults/server_error_view.rb +14 -0
- data/examples/basic_todo/app/views/home/show.html.slim +5 -0
- data/examples/basic_todo/app/views/home/show_redirect.rb +5 -0
- data/examples/basic_todo/app/views/home/show_view.rb +7 -0
- data/examples/basic_todo/app/views/layouts/application.html.slim +18 -0
- data/examples/basic_todo/app/views/modules/_header.html.slim +13 -0
- data/examples/basic_todo/app/views/modules/header_view.rb +7 -0
- data/examples/basic_todo/app/views/sign_ins/new.html.slim +14 -0
- data/examples/basic_todo/app/views/sign_ins/new_view.rb +10 -0
- data/examples/basic_todo/app/views/sign_ups/new.html.slim +13 -0
- data/examples/basic_todo/app/views/sign_ups/new_view.rb +10 -0
- data/examples/basic_todo/app/views/todos/edit.html.slim +14 -0
- data/examples/basic_todo/app/views/todos/edit_view.rb +10 -0
- data/examples/basic_todo/app/views/todos/index.html.slim +12 -0
- data/examples/basic_todo/app/views/todos/index_redirect.rb +5 -0
- data/examples/basic_todo/app/views/todos/index_view/_todo.html.slim +8 -0
- data/examples/basic_todo/app/views/todos/index_view/todo_view.rb +28 -0
- data/examples/basic_todo/app/views/todos/index_view.rb +26 -0
- data/examples/basic_todo/app/views/todos/new.html.slim +14 -0
- data/examples/basic_todo/app/views/todos/new_view.rb +10 -0
- data/examples/basic_todo/app/views/todos/not_found.html.slim +6 -0
- data/examples/basic_todo/app/views/todos/not_found_view.rb +15 -0
- data/examples/basic_todo/app/views/users/index.html.slim +7 -0
- data/examples/basic_todo/app/views/users/index_redirect.rb +5 -0
- data/examples/basic_todo/app/views/users/index_view/_user.html.slim +2 -0
- data/examples/basic_todo/app/views/users/index_view/user_view.rb +22 -0
- data/examples/basic_todo/app/views/users/index_view.rb +26 -0
- data/examples/basic_todo/bin/bundle +3 -0
- data/examples/basic_todo/bin/rails +8 -0
- data/examples/basic_todo/bin/rake +8 -0
- data/examples/basic_todo/bin/rspec +7 -0
- data/examples/basic_todo/bin/spring +15 -0
- data/examples/basic_todo/config/application.rb +41 -0
- data/examples/basic_todo/config/boot.rb +4 -0
- data/examples/basic_todo/config/database.yml +25 -0
- data/examples/basic_todo/config/environment.rb +5 -0
- data/examples/basic_todo/config/environments/development.rb +37 -0
- data/examples/basic_todo/config/environments/production.rb +78 -0
- data/examples/basic_todo/config/environments/test.rb +39 -0
- data/examples/basic_todo/config/initializers/aldous.rb +3 -0
- data/examples/basic_todo/config/initializers/assets.rb +8 -0
- data/examples/basic_todo/config/initializers/backtrace_silencers.rb +7 -0
- data/examples/basic_todo/config/initializers/cookies_serializer.rb +3 -0
- data/examples/basic_todo/config/initializers/filter_parameter_logging.rb +4 -0
- data/examples/basic_todo/config/initializers/inflections.rb +16 -0
- data/examples/basic_todo/config/initializers/mime_types.rb +4 -0
- data/examples/basic_todo/config/initializers/session_store.rb +3 -0
- data/examples/basic_todo/config/initializers/wrap_parameters.rb +14 -0
- data/examples/basic_todo/config/locales/en.yml +23 -0
- data/examples/basic_todo/config/routes.rb +18 -0
- data/examples/basic_todo/config/secrets.yml +22 -0
- data/examples/basic_todo/config.ru +4 -0
- data/examples/basic_todo/db/migrate/20150226035524_create_user.rb +10 -0
- data/examples/basic_todo/db/migrate/20150227004411_create_todo.rb +11 -0
- data/examples/basic_todo/db/migrate/20150301110126_roles.rb +22 -0
- data/examples/basic_todo/db/migrate/20150301121923_add_user_disabled_column.rb +5 -0
- data/examples/basic_todo/db/schema.rb +45 -0
- data/examples/basic_todo/db/seeds.rb +7 -0
- data/examples/basic_todo/lib/assets/.keep +0 -0
- data/examples/basic_todo/lib/tasks/.keep +0 -0
- data/examples/basic_todo/log/.keep +0 -0
- data/examples/basic_todo/public/404.html +67 -0
- data/examples/basic_todo/public/422.html +67 -0
- data/examples/basic_todo/public/500.html +66 -0
- data/examples/basic_todo/public/favicon.ico +0 -0
- data/examples/basic_todo/public/robots.txt +5 -0
- data/examples/basic_todo/test/controllers/.keep +0 -0
- data/examples/basic_todo/test/fixtures/.keep +0 -0
- data/examples/basic_todo/test/helpers/.keep +0 -0
- data/examples/basic_todo/test/integration/.keep +0 -0
- data/examples/basic_todo/test/mailers/.keep +0 -0
- data/examples/basic_todo/test/models/.keep +0 -0
- data/examples/basic_todo/test/test_helper.rb +10 -0
- data/examples/basic_todo/vendor/assets/javascripts/.keep +0 -0
- data/examples/basic_todo/vendor/assets/stylesheets/.keep +0 -0
- data/lib/aldous/build_respondable_service.rb +23 -0
- data/lib/aldous/configuration.rb +18 -0
- data/lib/aldous/controller/action/precondition/wrapper.rb +32 -0
- data/lib/aldous/controller/action/precondition.rb +52 -0
- data/lib/aldous/controller/action/result_execution_service.rb +27 -0
- data/lib/aldous/controller/action/wrapper.rb +34 -0
- data/lib/aldous/controller/action_execution_service.rb +42 -0
- data/lib/aldous/controller/preconditions_execution_service.rb +32 -0
- data/lib/aldous/controller.rb +21 -0
- data/lib/aldous/controller_action.rb +63 -0
- data/lib/aldous/dummy_error_reporter.rb +9 -0
- data/lib/aldous/dummy_logger.rb +8 -0
- data/lib/aldous/errors/user_error.rb +6 -0
- data/lib/aldous/logging_wrapper.rb +16 -0
- data/lib/aldous/params.rb +34 -0
- data/lib/aldous/respondable/base.rb +32 -0
- data/lib/aldous/respondable/headable.rb +30 -0
- data/lib/aldous/respondable/redirectable.rb +38 -0
- data/lib/aldous/respondable/renderable.rb +50 -0
- data/lib/aldous/respondable/request_http_basic_authentication.rb +23 -0
- data/lib/aldous/respondable/send_data.rb +36 -0
- data/lib/aldous/respondable/shared/flash.rb +24 -0
- data/lib/aldous/service/result/base/predicate_methods_for_inheritance.rb +44 -0
- data/lib/aldous/service/result/base.rb +13 -0
- data/lib/aldous/service/result/failure.rb +11 -0
- data/lib/aldous/service/result/success.rb +11 -0
- data/lib/aldous/service/wrapper.rb +48 -0
- data/lib/aldous/service.rb +34 -0
- data/lib/aldous/simple_dto.rb +47 -0
- data/lib/aldous/stdout_logger.rb +9 -0
- data/lib/aldous/version.rb +3 -0
- data/lib/aldous/view/blank/atom_view.rb +12 -0
- data/lib/aldous/view/blank/html_view.rb +16 -0
- data/lib/aldous/view/blank/json_view.rb +16 -0
- data/lib/aldous.rb +40 -0
- data/spec/aldous/build_respondable_service_spec.rb +48 -0
- data/spec/aldous/configuration_spec.rb +15 -0
- data/spec/aldous/controller/action/precondition/wrapper_spec.rb +48 -0
- data/spec/aldous/controller/action/precondition_spec.rb +81 -0
- data/spec/aldous/controller/action/result_execution_service_spec.rb +43 -0
- data/spec/aldous/controller/action/wrapper_spec.rb +46 -0
- data/spec/aldous/controller/action_execution_service_spec.rb +79 -0
- data/spec/aldous/controller/preconditions_execution_service_spec.rb +45 -0
- data/spec/aldous/controller_action_spec.rb +97 -0
- data/spec/aldous/controller_spec.rb +25 -0
- data/spec/aldous/dummy_error_reporter_spec.rb +10 -0
- data/spec/aldous/dummy_logger_spec.rb +7 -0
- data/spec/aldous/logging_wrapper_spec.rb +55 -0
- data/spec/aldous/params_spec.rb +39 -0
- data/spec/aldous/respondable/base_spec.rb +11 -0
- data/spec/aldous/respondable/headable/head_action_spec.rb +17 -0
- data/spec/aldous/respondable/headable_spec.rb +20 -0
- data/spec/aldous/respondable/redirectable/redirect_action_spec.rb +34 -0
- data/spec/aldous/respondable/redirectable_spec.rb +26 -0
- data/spec/aldous/respondable/renderable/render_action_spec.rb +34 -0
- data/spec/aldous/respondable/renderable_spec.rb +46 -0
- data/spec/aldous/respondable/request_http_basic_authentication_spec.rb +0 -0
- data/spec/aldous/respondable/send_data/send_data_action_spec.rb +15 -0
- data/spec/aldous/respondable/send_data_spec.rb +30 -0
- data/spec/aldous/respondable/shared/flash_spec.rb +30 -0
- data/spec/aldous/service/result/failure_spec.rb +11 -0
- data/spec/aldous/service/result/success_spec.rb +11 -0
- data/spec/aldous/service/wrapper_spec.rb +110 -0
- data/spec/aldous/service_spec.rb +101 -0
- data/spec/aldous/simple_dto_spec.rb +40 -0
- data/spec/aldous/view/blank/atom_view_spec.rb +15 -0
- data/spec/aldous/view/blank/html_view_spec.rb +15 -0
- data/spec/aldous/view/blank/json_view_spec.rb +15 -0
- data/spec/spec_helper.rb +26 -0
- metadata +330 -0
File without changes
|
File without changes
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'aldous/simple_dto'
|
2
|
+
|
3
|
+
module Aldous
|
4
|
+
class BuildRespondableService
|
5
|
+
attr_reader :view_context, :default_view_data
|
6
|
+
attr_reader :respondable_class, :status, :extra_data
|
7
|
+
|
8
|
+
def initialize(view_context:, default_view_data:, respondable_class:, status: nil, extra_data: {})
|
9
|
+
@view_context = view_context
|
10
|
+
@default_view_data = default_view_data
|
11
|
+
@respondable_class = respondable_class
|
12
|
+
@status = status
|
13
|
+
@extra_data = extra_data
|
14
|
+
end
|
15
|
+
|
16
|
+
def perform
|
17
|
+
# we don't need the status as a local
|
18
|
+
actual_extra_data = extra_data.reject{|k, v| k == :status}
|
19
|
+
view_data = SimpleDto.new(default_view_data.merge(actual_extra_data))
|
20
|
+
respondable_class.new(status, view_data, view_context)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'aldous/dummy_error_reporter'
|
2
|
+
require 'aldous/dummy_logger'
|
3
|
+
require 'aldous/stdout_logger'
|
4
|
+
|
5
|
+
module Aldous
|
6
|
+
class Configuration
|
7
|
+
attr_accessor :error_reporter,
|
8
|
+
:logger,
|
9
|
+
:controller_methods_exposed_to_action
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
@error_reporter = ::Aldous::DummyErrorReporter
|
13
|
+
@logger = ::Aldous::StdoutLogger
|
14
|
+
|
15
|
+
@controller_methods_exposed_to_action = [:params, :session, :cookies, :request, :response]
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'aldous/logging_wrapper'
|
2
|
+
|
3
|
+
module Aldous
|
4
|
+
module Controller
|
5
|
+
module Action
|
6
|
+
class Precondition
|
7
|
+
class Wrapper
|
8
|
+
attr :precondition
|
9
|
+
|
10
|
+
def initialize(precondition)
|
11
|
+
@precondition = precondition
|
12
|
+
end
|
13
|
+
|
14
|
+
def default_view_data
|
15
|
+
precondition.action.default_view_data
|
16
|
+
end
|
17
|
+
|
18
|
+
def default_error_respondable
|
19
|
+
precondition.action.default_error_respondable
|
20
|
+
end
|
21
|
+
|
22
|
+
def perform
|
23
|
+
precondition.perform
|
24
|
+
rescue => e
|
25
|
+
::Aldous::LoggingWrapper.log(e)
|
26
|
+
precondition.build_view(default_error_respondable, errors: [e])
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'aldous/controller/action/precondition/wrapper'
|
2
|
+
require 'aldous/build_respondable_service'
|
3
|
+
|
4
|
+
module Aldous
|
5
|
+
module Controller
|
6
|
+
module Action
|
7
|
+
class Precondition
|
8
|
+
include Aldous
|
9
|
+
|
10
|
+
class << self
|
11
|
+
def build(action)
|
12
|
+
Aldous::Controller::Action::Precondition::Wrapper.new(new(action))
|
13
|
+
end
|
14
|
+
|
15
|
+
def perform(action)
|
16
|
+
build(action).perform
|
17
|
+
end
|
18
|
+
|
19
|
+
def inherited(klass)
|
20
|
+
::Aldous.configuration.controller_methods_exposed_to_action.each do |method_name|
|
21
|
+
unless klass.method_defined?(method_name)
|
22
|
+
define_method method_name do
|
23
|
+
action.controller.send(method_name)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
attr_reader :action
|
31
|
+
|
32
|
+
def initialize(action)
|
33
|
+
@action = action
|
34
|
+
end
|
35
|
+
|
36
|
+
def perform
|
37
|
+
raise NotImplementedError.new("#{self.class.name} must implement method #perform")
|
38
|
+
end
|
39
|
+
|
40
|
+
def build_view(respondable_class, extra_data = {})
|
41
|
+
::Aldous::BuildRespondableService.new(
|
42
|
+
view_context: action.controller.view_context,
|
43
|
+
default_view_data: action.default_view_data,
|
44
|
+
respondable_class: respondable_class,
|
45
|
+
status: extra_data[:status],
|
46
|
+
extra_data: extra_data
|
47
|
+
).perform
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'aldous/logging_wrapper'
|
2
|
+
|
3
|
+
module Aldous
|
4
|
+
module Controller
|
5
|
+
module Action
|
6
|
+
class ResultExecutionService
|
7
|
+
class << self
|
8
|
+
def perform(controller, respondable, default_view_data)
|
9
|
+
self.new(controller, respondable, default_view_data).perform
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
attr_reader :controller, :respondable, :default_view_data
|
14
|
+
|
15
|
+
def initialize(controller, respondable, default_view_data)
|
16
|
+
@controller = controller
|
17
|
+
@respondable = respondable
|
18
|
+
@default_view_data = default_view_data
|
19
|
+
end
|
20
|
+
|
21
|
+
def perform
|
22
|
+
respondable.action(controller).execute
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'aldous/logging_wrapper'
|
2
|
+
|
3
|
+
module Aldous
|
4
|
+
module Controller
|
5
|
+
module Action
|
6
|
+
class Wrapper
|
7
|
+
attr :controller_action
|
8
|
+
|
9
|
+
def initialize(controller_action)
|
10
|
+
@controller_action = controller_action
|
11
|
+
end
|
12
|
+
|
13
|
+
def preconditions
|
14
|
+
controller_action.preconditions
|
15
|
+
end
|
16
|
+
|
17
|
+
def default_view_data
|
18
|
+
controller_action.default_view_data
|
19
|
+
end
|
20
|
+
|
21
|
+
def default_error_respondable
|
22
|
+
controller_action.default_error_respondable
|
23
|
+
end
|
24
|
+
|
25
|
+
def perform
|
26
|
+
controller_action.perform
|
27
|
+
rescue => e
|
28
|
+
::Aldous::LoggingWrapper.log(e)
|
29
|
+
controller_action.build_view(default_error_respondable, errors: [e])
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'aldous/controller/preconditions_execution_service'
|
2
|
+
require 'aldous/controller/action/result_execution_service'
|
3
|
+
require 'aldous/logging_wrapper'
|
4
|
+
|
5
|
+
module Aldous
|
6
|
+
module Controller
|
7
|
+
class ActionExecutionService
|
8
|
+
class << self
|
9
|
+
def perform(controller, controller_action_class)
|
10
|
+
self.new(controller, controller_action_class).perform
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
attr_reader :controller, :controller_action_class
|
15
|
+
|
16
|
+
def initialize(controller, controller_action_class)
|
17
|
+
@controller = controller
|
18
|
+
@controller_action_class = controller_action_class
|
19
|
+
end
|
20
|
+
|
21
|
+
def perform
|
22
|
+
action = controller_action_class.build(controller)
|
23
|
+
|
24
|
+
precondition, precondition_result = PreconditionsExecutionService.new(action, controller).perform
|
25
|
+
|
26
|
+
action_result = nil
|
27
|
+
if precondition_result
|
28
|
+
action = precondition
|
29
|
+
action_result = precondition_result
|
30
|
+
else
|
31
|
+
action_result = action.perform
|
32
|
+
end
|
33
|
+
|
34
|
+
Action::ResultExecutionService.perform(controller, action_result, action.default_view_data)
|
35
|
+
rescue => e
|
36
|
+
LoggingWrapper.log(e)
|
37
|
+
controller.head :internal_server_error
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'aldous/respondable/base'
|
2
|
+
require 'aldous/controller/action/precondition/wrapper'
|
3
|
+
|
4
|
+
module Aldous
|
5
|
+
module Controller
|
6
|
+
class PreconditionsExecutionService
|
7
|
+
attr_reader :action, :controller
|
8
|
+
|
9
|
+
def initialize(action, controller)
|
10
|
+
@action = action
|
11
|
+
@controller = controller
|
12
|
+
end
|
13
|
+
|
14
|
+
def perform
|
15
|
+
if action.respond_to?(:preconditions) && !action.preconditions.empty?
|
16
|
+
action.preconditions.each do |precondition_class|
|
17
|
+
# action here is actually an action wrapper hence the
|
18
|
+
# action.controller_action below
|
19
|
+
precondition = precondition_class.build(action.controller_action)
|
20
|
+
precondition_result = precondition.perform
|
21
|
+
|
22
|
+
if precondition_result.kind_of?(::Aldous::Respondable::Base)
|
23
|
+
return [precondition, precondition_result]
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
[nil, nil]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'aldous/controller/action_execution_service'
|
2
|
+
|
3
|
+
module Aldous
|
4
|
+
module Controller
|
5
|
+
include Aldous
|
6
|
+
|
7
|
+
def self.included(base)
|
8
|
+
base.extend ClassMethods
|
9
|
+
end
|
10
|
+
|
11
|
+
module ClassMethods
|
12
|
+
def controller_actions(*actions)
|
13
|
+
actions.each do |action_name|
|
14
|
+
define_method action_name do
|
15
|
+
::Aldous::Controller::ActionExecutionService.perform(self, self.class.const_get(action_name.to_s.classify))
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'aldous/controller/action/wrapper'
|
2
|
+
require 'aldous/view/blank/html_view'
|
3
|
+
require 'aldous/simple_dto'
|
4
|
+
require 'aldous/build_respondable_service'
|
5
|
+
|
6
|
+
module Aldous
|
7
|
+
class ControllerAction
|
8
|
+
include Aldous
|
9
|
+
|
10
|
+
class << self
|
11
|
+
def build(controller)
|
12
|
+
Aldous::Controller::Action::Wrapper.new(new(controller))
|
13
|
+
end
|
14
|
+
|
15
|
+
def perform(controller)
|
16
|
+
build(controller).perform
|
17
|
+
end
|
18
|
+
|
19
|
+
def inherited(klass)
|
20
|
+
# expose methods from controller to the service, according to configuration
|
21
|
+
::Aldous.configuration.controller_methods_exposed_to_action.each do |method_name|
|
22
|
+
unless klass.method_defined?(method_name)
|
23
|
+
define_method method_name do
|
24
|
+
controller.send(method_name)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
attr_reader :controller
|
32
|
+
|
33
|
+
def initialize(controller)
|
34
|
+
@controller = controller
|
35
|
+
end
|
36
|
+
|
37
|
+
def perform
|
38
|
+
raise NotImplementedError.new("#{self.class.name} must implement method #perform")
|
39
|
+
end
|
40
|
+
|
41
|
+
def default_view_data
|
42
|
+
{}
|
43
|
+
end
|
44
|
+
|
45
|
+
def preconditions
|
46
|
+
[]
|
47
|
+
end
|
48
|
+
|
49
|
+
def default_error_respondable
|
50
|
+
::Aldous::View::Blank::HtmlView
|
51
|
+
end
|
52
|
+
|
53
|
+
def build_view(respondable_class, extra_data = {})
|
54
|
+
::Aldous::BuildRespondableService.new(
|
55
|
+
view_context: controller.view_context,
|
56
|
+
default_view_data: default_view_data,
|
57
|
+
respondable_class: respondable_class,
|
58
|
+
status: extra_data[:status],
|
59
|
+
extra_data: extra_data
|
60
|
+
).perform
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Aldous
|
2
|
+
class LoggingWrapper
|
3
|
+
class << self
|
4
|
+
def log(error)
|
5
|
+
if error.kind_of?(String)
|
6
|
+
::Aldous.config.error_reporter.report(error)
|
7
|
+
::Aldous.config.logger.info(error)
|
8
|
+
else # it's an error object
|
9
|
+
::Aldous.config.error_reporter.report(error)
|
10
|
+
::Aldous.config.logger.info(error.message)
|
11
|
+
::Aldous.config.logger.info(error.backtrace.join("\n"))
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'aldous/logging_wrapper'
|
2
|
+
|
3
|
+
module Aldous
|
4
|
+
class Params
|
5
|
+
include Aldous
|
6
|
+
|
7
|
+
class << self
|
8
|
+
def build(*args)
|
9
|
+
new(*args)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
attr_reader :params
|
14
|
+
|
15
|
+
def initialize(params)
|
16
|
+
@params = params
|
17
|
+
end
|
18
|
+
|
19
|
+
def fetch
|
20
|
+
permitted_params
|
21
|
+
rescue => e
|
22
|
+
Aldous::LoggingWrapper.log(e)
|
23
|
+
nil
|
24
|
+
end
|
25
|
+
|
26
|
+
def permitted_params
|
27
|
+
{}
|
28
|
+
end
|
29
|
+
|
30
|
+
def error_message
|
31
|
+
'Missing param'
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'aldous/simple_dto'
|
2
|
+
|
3
|
+
module Aldous
|
4
|
+
module Respondable
|
5
|
+
class Base
|
6
|
+
attr_reader :view_data, :view_context
|
7
|
+
|
8
|
+
def initialize(status, view_data, view_context)
|
9
|
+
@status = status
|
10
|
+
@view_data = view_data
|
11
|
+
@view_context = view_context
|
12
|
+
end
|
13
|
+
|
14
|
+
def action(controller)
|
15
|
+
raise Errors::UserError.new("Respondables must define an 'action' method")
|
16
|
+
end
|
17
|
+
|
18
|
+
def status
|
19
|
+
@status || default_status
|
20
|
+
end
|
21
|
+
|
22
|
+
def default_status
|
23
|
+
:ok
|
24
|
+
end
|
25
|
+
|
26
|
+
def build_view(klass, extra_data = {})
|
27
|
+
dto = Aldous::SimpleDto.new(view_data._data.merge(extra_data))
|
28
|
+
klass.new(status, dto, view_context)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'aldous/respondable/base'
|
2
|
+
|
3
|
+
module Aldous
|
4
|
+
module Respondable
|
5
|
+
class Headable < Base
|
6
|
+
def action(controller)
|
7
|
+
HeadAction.new(controller, status)
|
8
|
+
end
|
9
|
+
|
10
|
+
def default_status
|
11
|
+
:ok
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
class HeadAction
|
17
|
+
attr_reader :controller, :status
|
18
|
+
|
19
|
+
def initialize(controller, status)
|
20
|
+
@controller = controller
|
21
|
+
@status = status
|
22
|
+
end
|
23
|
+
|
24
|
+
def execute
|
25
|
+
controller.head status
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'aldous/respondable/base'
|
2
|
+
require 'aldous/respondable/shared/flash'
|
3
|
+
|
4
|
+
module Aldous
|
5
|
+
module Respondable
|
6
|
+
class Redirectable < Base
|
7
|
+
def action(controller)
|
8
|
+
RedirectAction.new(location, controller, view_data, status)
|
9
|
+
end
|
10
|
+
|
11
|
+
def location
|
12
|
+
raise Errors::UserError.new("Redirectable objects must define a 'location' method")
|
13
|
+
end
|
14
|
+
|
15
|
+
def default_status
|
16
|
+
:found
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
class RedirectAction
|
22
|
+
attr_reader :controller, :view_data, :location, :status
|
23
|
+
|
24
|
+
def initialize(location, controller, view_data, status)
|
25
|
+
@location = location
|
26
|
+
@controller = controller
|
27
|
+
@view_data = view_data
|
28
|
+
@status = status
|
29
|
+
end
|
30
|
+
|
31
|
+
def execute
|
32
|
+
Shared::Flash.new(view_data, controller.flash).set_error
|
33
|
+
controller.redirect_to location, {status: status}
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'aldous/respondable/base'
|
2
|
+
require 'aldous/respondable/shared/flash'
|
3
|
+
|
4
|
+
module Aldous
|
5
|
+
module Respondable
|
6
|
+
class Renderable < Base
|
7
|
+
def action(controller)
|
8
|
+
RenderAction.new(template, status, controller, view_data)
|
9
|
+
end
|
10
|
+
|
11
|
+
def default_status
|
12
|
+
:ok
|
13
|
+
end
|
14
|
+
|
15
|
+
def default_template_locals
|
16
|
+
{}
|
17
|
+
end
|
18
|
+
|
19
|
+
def template_data
|
20
|
+
{}
|
21
|
+
end
|
22
|
+
|
23
|
+
def template(extra_locals = {})
|
24
|
+
template_locals = template_data[:locals] || {}
|
25
|
+
locals = default_template_locals.merge(template_locals)
|
26
|
+
locals = locals.merge(extra_locals || {})
|
27
|
+
template_hash = template_data.merge(locals: locals)
|
28
|
+
template_hash
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
class RenderAction
|
34
|
+
attr_reader :template, :controller, :view_data, :status
|
35
|
+
|
36
|
+
def initialize(template, status, controller, view_data)
|
37
|
+
@status = status
|
38
|
+
@template = template
|
39
|
+
@controller = controller
|
40
|
+
@view_data = view_data
|
41
|
+
end
|
42
|
+
|
43
|
+
def execute
|
44
|
+
Shared::Flash.new(view_data, controller.flash.now).set_error
|
45
|
+
controller.render template.merge(status: status)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Aldous
|
2
|
+
module Respondable
|
3
|
+
class RequestHttpBasicAuthentication < Base
|
4
|
+
def action(controller)
|
5
|
+
RequestHttpBasicAuthenticationAction.new(controller)
|
6
|
+
end
|
7
|
+
|
8
|
+
private
|
9
|
+
|
10
|
+
class RequestHttpBasicAuthenticationAction
|
11
|
+
attr_reader :controller
|
12
|
+
|
13
|
+
def initialize(controller)
|
14
|
+
@controller = controller
|
15
|
+
end
|
16
|
+
|
17
|
+
def execute
|
18
|
+
controller.request_http_basic_authentication
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'aldous/respondable/base'
|
2
|
+
|
3
|
+
module Aldous
|
4
|
+
module Respondable
|
5
|
+
class SendData < Base
|
6
|
+
def action(controller)
|
7
|
+
SendDataAction.new(data, options, controller, view_data)
|
8
|
+
end
|
9
|
+
|
10
|
+
def data
|
11
|
+
raise Errors::UserError.new("SendData objects must define a 'data' method")
|
12
|
+
end
|
13
|
+
|
14
|
+
def options
|
15
|
+
raise Errors::UserError.new("SendData objects must define an 'options' method")
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
class SendDataAction
|
21
|
+
attr_reader :controller, :view_data, :data, :options
|
22
|
+
|
23
|
+
def initialize(data, options, controller, view_data)
|
24
|
+
@controller = controller
|
25
|
+
@view_data = view_data
|
26
|
+
@data = data
|
27
|
+
@options = options
|
28
|
+
end
|
29
|
+
|
30
|
+
def execute
|
31
|
+
controller.send_data data, options
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Aldous
|
2
|
+
module Respondable
|
3
|
+
module Shared
|
4
|
+
class Flash
|
5
|
+
attr_reader :result, :flash_container
|
6
|
+
|
7
|
+
def initialize(result, flash_container)
|
8
|
+
@result = result
|
9
|
+
@flash_container = flash_container
|
10
|
+
end
|
11
|
+
|
12
|
+
def set_error
|
13
|
+
flash_container[:error] = error if error
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def error
|
19
|
+
result.errors.first
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|