controll 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (174) hide show
  1. data/README.md +253 -93
  2. data/Rakefile +1 -1
  3. data/VERSION +1 -1
  4. data/controll.gemspec +121 -84
  5. data/lib/controll/assistant/param_assistant.rb +23 -0
  6. data/lib/controll/assistant/session_assistant.rb +23 -0
  7. data/lib/controll/assistant.rb +9 -7
  8. data/lib/controll/commander.rb +16 -3
  9. data/lib/controll/enabler/macros.rb +75 -0
  10. data/lib/controll/enabler/maps.rb +15 -0
  11. data/lib/controll/enabler/notify.rb +43 -0
  12. data/lib/controll/enabler/path_handler.rb +49 -0
  13. data/lib/controll/enabler/path_resolver.rb +47 -0
  14. data/lib/controll/enabler.rb +49 -0
  15. data/lib/controll/engine.rb +9 -0
  16. data/lib/controll/errors.rb +4 -1
  17. data/lib/controll/event/helper.rb +20 -0
  18. data/lib/controll/{helper/event_matcher.rb → event/matcher.rb} +3 -3
  19. data/lib/controll/event.rb +60 -0
  20. data/lib/controll/events.rb +48 -0
  21. data/lib/controll/executor/base.rb +3 -7
  22. data/lib/controll/executor/controlled.rb +36 -0
  23. data/lib/controll/executor/delegator.rb +6 -0
  24. data/lib/controll/executor.rb +8 -1
  25. data/lib/controll/flow/action/base.rb +30 -0
  26. data/lib/controll/flow/action/fallback.rb +25 -0
  27. data/lib/controll/flow/action/path_action.rb +24 -0
  28. data/lib/controll/flow/action.rb +7 -0
  29. data/lib/controll/flow/action_mapper/base.rb +13 -0
  30. data/lib/controll/flow/action_mapper/complex.rb +52 -0
  31. data/lib/controll/flow/action_mapper/simple.rb +54 -0
  32. data/lib/controll/flow/action_mapper.rb +7 -0
  33. data/lib/controll/flow/errors.rb +16 -0
  34. data/lib/controll/flow/event_mapper/path_finder.rb +36 -0
  35. data/lib/controll/flow/event_mapper/util.rb +43 -0
  36. data/lib/controll/flow/event_mapper.rb +6 -0
  37. data/lib/controll/flow/master/executor.rb +57 -0
  38. data/lib/controll/flow/master/macros.rb +66 -0
  39. data/lib/controll/flow/master.rb +70 -0
  40. data/lib/controll/flow.rb +15 -0
  41. data/lib/controll/focused/enabler.rb +31 -0
  42. data/lib/controll/helper.rb +0 -94
  43. data/lib/controll/macros.rb +12 -0
  44. data/lib/controll/notify/base.rb +22 -43
  45. data/lib/controll/notify/flash.rb +3 -3
  46. data/lib/controll/notify/macros.rb +57 -0
  47. data/lib/controll/notify/message/handler.rb +36 -0
  48. data/lib/controll/notify/message/resolver.rb +28 -0
  49. data/lib/controll/notify/message/translator.rb +45 -0
  50. data/lib/controll/notify/message.rb +25 -0
  51. data/lib/controll/notify/typed.rb +13 -22
  52. data/lib/controll/notify.rb +11 -4
  53. data/lib/controll.rb +8 -2
  54. data/lib/generators/controll/assistant_generator.rb +27 -0
  55. data/lib/generators/controll/executor_generator.rb +23 -0
  56. data/lib/generators/controll/flow_handler_generator.rb +21 -0
  57. data/lib/generators/controll/notifier_generator.rb +21 -0
  58. data/lib/generators/controll/setup_generator.rb +37 -0
  59. data/lib/generators/controll/templates/assistant.tt +10 -0
  60. data/lib/generators/controll/templates/commander.tt +15 -0
  61. data/lib/generators/controll/templates/executor.tt +14 -0
  62. data/lib/generators/controll/templates/flow_handler.tt +26 -0
  63. data/lib/generators/controll/templates/notifier.tt +31 -0
  64. data/spec/acceptance/app_test.rb +1 -1
  65. data/spec/controll/assistant/param_assistant_spec.rb +31 -0
  66. data/spec/controll/assistant/session_assistant_spec.rb +31 -0
  67. data/spec/controll/assistant_spec.rb +26 -0
  68. data/spec/controll/command_spec.rb +4 -4
  69. data/spec/controll/enabler/macros_spec.rb +76 -0
  70. data/spec/controll/enabler/maps_spec.rb +31 -0
  71. data/spec/controll/{helper → enabler}/notify_spec.rb +7 -17
  72. data/spec/controll/enabler/path_handler_spec.rb +24 -0
  73. data/spec/controll/enabler/path_resolver_spec.rb +87 -0
  74. data/spec/controll/enabler_spec.rb +30 -0
  75. data/spec/controll/event/helper_spec.rb +33 -0
  76. data/spec/controll/{helper/event_matcher_spec.rb → event/matcher_spec.rb} +4 -3
  77. data/spec/controll/event_spec.rb +66 -0
  78. data/spec/controll/events_spec.rb +23 -0
  79. data/spec/controll/executor/controlled_spec.rb +36 -0
  80. data/spec/controll/executor/{notificator_spec.rb → delegator_spec.rb} +4 -4
  81. data/spec/controll/flow/action_mapper/complex_spec.rb +102 -0
  82. data/spec/controll/flow/action_mapper/fallback_spec.rb +34 -0
  83. data/spec/controll/{flow_handler/render_spec.rb → flow/action_mapper/simple_spec.rb} +25 -22
  84. data/spec/controll/{flow_handler/redirect/action_spec.rb → flow/event_mapper/path_finder_spec.rb} +10 -10
  85. data/spec/controll/{flow_handler/redirect/mapper_spec.rb → flow/event_mapper/util_spec.rb} +9 -9
  86. data/spec/controll/flow/master/executor_spec.rb +56 -0
  87. data/spec/{app/app/models/.gitkeep → controll/flow/master/macros_spec.rb} +0 -0
  88. data/spec/controll/flow/master_spec.rb +157 -0
  89. data/spec/controll/notify/base_spec.rb +6 -12
  90. data/spec/controll/notify/message/handler_spec.rb +27 -0
  91. data/spec/controll/notify/message/resolver_spec.rb +53 -0
  92. data/spec/controll/notify/message/translator_spec.rb +46 -0
  93. data/spec/controll/notify/message_spec.rb +4 -0
  94. data/spec/controll/notify/{message_handler.rb → services_notifier.rb} +3 -5
  95. data/spec/controll/notify/typed_spec.rb +2 -2
  96. data/spec/{app → controll_app}/.gitignore +0 -0
  97. data/spec/{app → controll_app}/Gemfile +0 -0
  98. data/spec/{app → controll_app}/Gemfile.lock +0 -0
  99. data/spec/{app → controll_app}/README.rdoc +0 -0
  100. data/spec/{app → controll_app}/Rakefile +0 -0
  101. data/spec/controll_app/app/controll/commanders/services_commander.rb +5 -0
  102. data/spec/controll_app/app/controll/executors/services_executor.rb +4 -0
  103. data/spec/controll_app/app/controll/flows/create_services.rb +9 -0
  104. data/spec/controll_app/app/controll/notifiers/services_notifier.rb +9 -0
  105. data/spec/{app → controll_app}/app/controllers/application_controller.rb +0 -1
  106. data/spec/controll_app/app/controllers/services_controller.rb +8 -0
  107. data/spec/{app/lib/assets → controll_app/app/models}/.gitkeep +0 -0
  108. data/spec/{app → controll_app}/app/models/post.rb +0 -0
  109. data/spec/{app → controll_app}/app/views/layouts/application.html.erb +0 -0
  110. data/spec/{app → controll_app}/app/views/posts/_form.html.erb +0 -0
  111. data/spec/{app → controll_app}/app/views/posts/edit.html.erb +0 -0
  112. data/spec/{app → controll_app}/app/views/posts/index.html.erb +0 -0
  113. data/spec/{app → controll_app}/app/views/posts/new.html.erb +0 -0
  114. data/spec/{app → controll_app}/app/views/posts/show.html.erb +0 -0
  115. data/spec/{app → controll_app}/config/application.rb +1 -1
  116. data/spec/{app → controll_app}/config/boot.rb +0 -0
  117. data/spec/{app → controll_app}/config/environment.rb +0 -0
  118. data/spec/{app → controll_app}/config/environments/development.rb +0 -0
  119. data/spec/{app → controll_app}/config/environments/test.rb +0 -0
  120. data/spec/{app → controll_app}/config/initializers/backtrace_silencers.rb +0 -0
  121. data/spec/{app → controll_app}/config/initializers/inflections.rb +0 -0
  122. data/spec/{app → controll_app}/config/initializers/mime_types.rb +0 -0
  123. data/spec/{app → controll_app}/config/initializers/secret_token.rb +0 -0
  124. data/spec/{app → controll_app}/config/initializers/session_store.rb +0 -0
  125. data/spec/{app → controll_app}/config/locales/en.yml +0 -0
  126. data/spec/controll_app/config/routes.rb +5 -0
  127. data/spec/{app → controll_app}/config.ru +0 -0
  128. data/spec/{app → controll_app}/db/seeds.rb +0 -0
  129. data/spec/{app/lib/tasks → controll_app/log}/.gitkeep +0 -0
  130. data/spec/{app → controll_app}/public/404.html +0 -0
  131. data/spec/{app → controll_app}/public/422.html +0 -0
  132. data/spec/{app → controll_app}/public/500.html +0 -0
  133. data/spec/{app → controll_app}/public/favicon.ico +0 -0
  134. data/spec/{app → controll_app}/public/index.html +0 -0
  135. data/spec/{app → controll_app}/public/javascripts/application.js +0 -0
  136. data/spec/{app → controll_app}/public/robots.txt +0 -0
  137. data/spec/{app → controll_app}/public/stylesheets/application.css +0 -0
  138. metadata +122 -85
  139. data/lib/controll/executor/notificator.rb +0 -12
  140. data/lib/controll/flow_handler/base.rb +0 -19
  141. data/lib/controll/flow_handler/control.rb +0 -85
  142. data/lib/controll/flow_handler/errors.rb +0 -5
  143. data/lib/controll/flow_handler/event_helper.rb +0 -18
  144. data/lib/controll/flow_handler/redirect/action.rb +0 -45
  145. data/lib/controll/flow_handler/redirect/mapper.rb +0 -41
  146. data/lib/controll/flow_handler/redirect.rb +0 -51
  147. data/lib/controll/flow_handler/render.rb +0 -51
  148. data/lib/controll/flow_handler.rb +0 -11
  149. data/lib/controll/helper/notify.rb +0 -74
  150. data/lib/controll/helper/path_resolver.rb +0 -45
  151. data/spec/app/app/controllers/posts_controller.rb +0 -52
  152. data/spec/app/config/routes.rb +0 -62
  153. data/spec/app/log/.gitkeep +0 -0
  154. data/spec/app/script/rails +0 -6
  155. data/spec/app/spec/controllers/posts_controller_spec.rb +0 -59
  156. data/spec/app/spec/isolated_spec_helper.rb +0 -6
  157. data/spec/app/spec/spec_helper.rb +0 -5
  158. data/spec/app/spec/unit/controllers/posts_controller_isolated_spec.rb +0 -63
  159. data/spec/app/spec/unit/controllers/posts_controller_spec.rb +0 -59
  160. data/spec/app/test/functional/.gitkeep +0 -0
  161. data/spec/app/test/functional/posts_controller_test.rb +0 -67
  162. data/spec/app/test/isolated_test_helper.rb +0 -7
  163. data/spec/app/test/test_helper.rb +0 -6
  164. data/spec/app/test/unit/.gitkeep +0 -0
  165. data/spec/app/test/unit/controllers/posts_controller_isolated_test.rb +0 -71
  166. data/spec/app/test/unit/controllers/posts_controller_test.rb +0 -67
  167. data/spec/app/vendor/assets/javascripts/.gitkeep +0 -0
  168. data/spec/app/vendor/assets/stylesheets/.gitkeep +0 -0
  169. data/spec/app/vendor/plugins/.gitkeep +0 -0
  170. data/spec/controll/asssistant_spec.rb +0 -5
  171. data/spec/controll/flow_handler/control_spec.rb +0 -159
  172. data/spec/controll/flow_handler/redirect_spec.rb +0 -93
  173. data/spec/controll/helper/path_resolver_spec.rb +0 -49
  174. data/spec/controll/helper_spec.rb +0 -108
@@ -1,19 +0,0 @@
1
- module Controll::FlowHandler
2
- class Base
3
- attr_reader :path
4
-
5
- def initialize path
6
- @path = path.to_s
7
- end
8
-
9
- def perform controller
10
- raise NotImplementedError, 'You must implement the #perform method'
11
- end
12
-
13
- class << self
14
- def action event
15
- raise NotImplementedError, 'You must implement the #action class method'
16
- end
17
- end
18
- end
19
- end
@@ -1,85 +0,0 @@
1
- module Controll::FlowHandler
2
- class Control
3
- class ActionEventError < StandardError; end
4
-
5
- attr_reader :controller, :action_handlers
6
-
7
- def initialize controller, action_handlers = []
8
- @controller = controller
9
- @action_handlers = action_handlers unless action_handlers.blank?
10
- end
11
-
12
- def execute
13
- use_action_handlers
14
- use_alternatives
15
- use_fallback if !executed?
16
- self
17
- end
18
-
19
- def action_handlers
20
- @action_handlers ||= [:redirect, :render]
21
- end
22
-
23
- def executed?
24
- @executed
25
- end
26
-
27
- protected
28
-
29
- delegate :command!, to: :controller
30
-
31
- # can be used to set up control logic that fall outside what can be done
32
- # with the basic action_handlers but can not be considered fall-back.
33
- def use_alternatives
34
- end
35
-
36
- def use_fallback
37
- end
38
-
39
- def event
40
- raise NotImplementedError, 'You must define an #event method that at least returns an event (Symbol). You can use an Executor for this.'
41
- end
42
-
43
- def fallback_action
44
- do_redirect root_url
45
- end
46
-
47
- NoEventsDefinedError = Controll::FlowHandler::Render::NoEventsDefinedError
48
- NoRedirectionFoundError = Controll::FlowHandler::Redirect::NoRedirectionFoundError
49
-
50
- def use_action_handlers
51
- errors = []
52
- action_handlers.each do |action_handler|
53
- begin
54
- action_handler_clazz = handler_class(action_handler)
55
- next unless action_handler_clazz
56
- action = action_handler_clazz.action(event)
57
- execute_with action
58
- return if executed?
59
- rescue NoEventsDefinedError => e
60
- errors << e
61
- rescue NoRedirectionFoundError => e
62
- errors << e
63
- end
64
- end
65
- raise ActionEventError, "#{errors.join ','}" unless errors.empty?
66
- end
67
-
68
- def handler_class action_handler
69
- clazz = "#{self.class}::#{action_handler.to_s.camelize}"
70
- clazz.constantize
71
- rescue NameError
72
- nil
73
- end
74
-
75
- def execute_with action
76
- return if !action
77
- action.perform(controller)
78
- executed!
79
- end
80
-
81
- def executed!
82
- @executed = true
83
- end
84
- end
85
- end
@@ -1,5 +0,0 @@
1
- module Controll::FlowHandler
2
- class NoRedirectionFoundError < StandardError; end
3
- class NoEventsDefinedError < StandardError; end
4
- class BadPathError < StandardError; end
5
- end
@@ -1,18 +0,0 @@
1
- module Controll::FlowHandler
2
- module EventHelper
3
- def types
4
- @types ||= [:notice, :error]
5
- end
6
-
7
- def normalize event
8
- case event
9
- when Symbol
10
- Hashie::Mash.new name: event, type: :notice
11
- when Hash, Hashie::Mash
12
- event
13
- else
14
- raise Controll::InvalidEvent, "Event: #{event} could not be normalized, must be a Hash or Symbol"
15
- end
16
- end
17
- end
18
- end
@@ -1,45 +0,0 @@
1
- module Controll::FlowHandler
2
- class Redirect < Base
3
- class Action
4
- attr_accessor :event, :redirections, :types
5
-
6
- # event is a Hashie::Mash or simply a Symbol (default notice event)
7
- def initialize event, redirections, types = []
8
- raise ArgumentError, "Must take :event option, was: #{event}" if event.blank?
9
- raise ArgumentError, "Must take non-empty :redirections option, was: #{redirections}" if redirections.blank?
10
- @event = normalize event
11
- @types = types unless types.blank?
12
- @redirections = redirections
13
- end
14
-
15
- def map
16
- if redirect.blank?
17
- raise Controll::FlowHandler::NoRedirectionFoundError, "No redirection could be found for: #{event} in: #{redirections}"
18
- end
19
- redirect
20
- end
21
-
22
- protected
23
-
24
- include Controll::FlowHandler::EventHelper
25
-
26
- def redirect
27
- @redirect ||= mapper(redirect_map).map
28
- rescue StandardError => e
29
- raise Controll::FlowHandler::NoRedirectionFoundError, "No redirection could be found for: #{event} in: #{redirections}. Cause: #{e}"
30
- end
31
-
32
- def redirect_map
33
- @redirect_map ||= redirections[event.type] || {}
34
- end
35
-
36
- def mapper redirect_map
37
- @mapper ||= mapper_class.new event, redirect_map
38
- end
39
-
40
- def mapper_class
41
- Controll::FlowHandler::Redirect::Mapper
42
- end
43
- end
44
- end
45
- end
@@ -1,41 +0,0 @@
1
- module Controll::FlowHandler
2
- class Redirect < Base
3
- class Mapper
4
- attr_reader :redirect_map, :event
5
-
6
- def initialize event, redirect_map
7
- @event ||= normalize event
8
-
9
- unless valid_map? redirect_map
10
- raise ArgumentError, "Invalid redirect map: #{redirect_map}, must be a Hash"
11
- end
12
- @redirect_map ||= redirect_map
13
- end
14
-
15
- # An events can also be a Symbol,
16
- # in which case it is a :notice event
17
- def map
18
- redirect_map.each do |path, events|
19
- return path.to_s if valid? events
20
- end
21
- raise Controll::FlowHandler::NoRedirectionFoundError, "No path could be found for event: #{event} in map: #{redirect_map}"
22
- end
23
-
24
- protected
25
-
26
- include Controll::FlowHandler::EventHelper
27
-
28
- def valid_map? redirect_map
29
- redirect_map.kind_of?(Hash) && !redirect_map.blank?
30
- end
31
-
32
- def valid? events
33
- matcher(event).match?(events)
34
- end
35
-
36
- def matcher event
37
- @matcher ||= Controll::Helper::EventMatcher.new event
38
- end
39
- end
40
- end
41
- end
@@ -1,51 +0,0 @@
1
- require 'controll/flow_handler/base'
2
-
3
- module Controll::FlowHandler
4
- class Redirect < Base
5
- autoload :Action, 'controll/flow_handler/redirect/action'
6
- autoload :Mapper, 'controll/flow_handler/redirect/mapper'
7
-
8
- def initialize path
9
- super path
10
- end
11
-
12
- def perform controller
13
- controller.do_redirect controller.send(path)
14
- end
15
-
16
- class << self
17
- attr_accessor :redirections
18
- attr_writer :redirect_maps, :action_clazz
19
-
20
- def action event
21
- path = action_clazz.new(event, redirections, types).map
22
- self.new path unless path.blank?
23
- end
24
-
25
- def types
26
- @types ||= [:notice, :error]
27
- end
28
-
29
- def redirections_for type = :notice
30
- @redirections ||= {}
31
- @redirections[type.to_sym] || {}
32
- end
33
-
34
- def set_redirections *args
35
- type = args.first.kind_of?(Symbol) ? args.shift : :notice
36
- @redirections ||= {}
37
- @redirections[type.to_sym] = args.first
38
- end
39
-
40
- def set_types *names
41
- @redirect_maps ||= names.flatten
42
- end
43
-
44
- protected
45
-
46
- def action_clazz
47
- @action_clazz ||= Controll::FlowHandler::Redirect::Action
48
- end
49
- end
50
- end
51
- end
@@ -1,51 +0,0 @@
1
- require 'controll/flow_handler/base'
2
-
3
- module Controll::FlowHandler
4
- class Render < Base
5
- class NoEventsDefinedError < StandardError; end
6
- class BadPathError < StandardError; end
7
-
8
- def initialize path #, events = []
9
- super path
10
- # @events = events
11
- end
12
-
13
- def perform controller
14
- raise BadPathError, "Bad path: #{path}" if path.blank?
15
- controller.render controller.send(path)
16
- end
17
-
18
- class << self
19
- def action event, path = nil
20
- raise Controll::FlowHandler::NoEventsDefinedError, "You must define a #{self}#events class method that returns a render map" unless respond_to?(:events)
21
- raise Controll::FlowHandler::NoEventsDefinedError, "The #{self}#events class method must return a render map, was #{events}" if events.blank?
22
- event = normalize event
23
- self.new(path || default_path) if events.include? event.name
24
- end
25
-
26
- def default_path
27
- raise NotImplementedError, "You must set a default_path or override the #{self}#action class method"
28
- end
29
-
30
- # http://bugs.ruby-lang.org/issues/1082
31
- # hello.singleton_class
32
- # Instead of always having to write:
33
- # (class << hello; self; end)
34
- def set_default_path str = nil, &block
35
- (class << self; self; end).send :define_method, :default_path do
36
- block_given? ? yield : str
37
- end
38
- end
39
-
40
- def set_events *args, &block
41
- (class << self; self; end).send :define_method, :events do
42
- block_given? ? yield : args.flatten
43
- end
44
- end
45
-
46
- protected
47
-
48
- include Controll::FlowHandler::EventHelper
49
- end
50
- end
51
- end
@@ -1,11 +0,0 @@
1
- require 'controll/flow_handler/errors'
2
-
3
- module Controll
4
- module FlowHandler
5
- autoload :Base, 'controll/flow_handler/base'
6
- autoload :Control, 'controll/flow_handler/control'
7
- autoload :Redirect, 'controll/flow_handler/redirect'
8
- autoload :Render, 'controll/flow_handler/render'
9
- autoload :EventHelper, 'controll/flow_handler/event_helper'
10
- end
11
- end
@@ -1,74 +0,0 @@
1
- module Controll
2
- module Helper
3
- module Notify
4
- extend ActiveSupport::Concern
5
-
6
- included do
7
- attr_writer :notification_types
8
-
9
- notification_types.each do |type|
10
- define_method "create_#{type}" do |*args|
11
- create_notification args.first, type.to_sym, args.extract_options!
12
- end
13
- end
14
- end
15
-
16
- # msg stack
17
- def notifications
18
- @notifications ||= []
19
- end
20
-
21
- def main_event
22
- notifications.last || create_notice(:success)
23
- end
24
-
25
- def notify name, type = nil, options = {}
26
- notifications << create_notification(name, type, options)
27
- self # enable method chaining on controller
28
- end
29
-
30
- protected
31
-
32
- def error name = :error, options = {}
33
- notify name, :error, options
34
- end
35
-
36
- def success name = :success, options = {}
37
- notify name, :success, options
38
- end
39
-
40
- def create_notification name, type = nil, options = {}
41
- type ||= :notice
42
- raise ArgumentError, "Not a valid notification type: #{type}, must be one of: #{valid_notification_types}" unless valid_notification_type?(type)
43
- Hashie::Mash.new(name: name, type: type, options: options)
44
- end
45
- alias_method :create_event, :create_notification
46
-
47
- def valid_notification_type? type
48
- notification_types.include? type.to_sym
49
- end
50
-
51
- def notification_types
52
- return self.class.notification_types if self.class.respond_to? :notification_types
53
- Controll::Notify::Flash.types
54
- end
55
-
56
- # allows customization of notification types
57
- module ClassMethods
58
- def notification_types
59
- @notification_types ||= default_notification_types
60
- end
61
-
62
- def default_notification_types
63
- Controll::Notify::Flash.types
64
- end
65
- end
66
-
67
- def process_notifications
68
- notifications.each do |message|
69
- message_handler.send(message.type).notify message.name, message.options
70
- end
71
- end
72
- end
73
- end
74
- end
@@ -1,45 +0,0 @@
1
- module Controll
2
- module Helper
3
- class PathResolver
4
- class PathResolverError < StandardError; end
5
-
6
- attr_reader :caller
7
-
8
- def initialize caller
9
- @caller = caller
10
- end
11
-
12
- def extract_path type, *args
13
- if args.first.kind_of?(Symbol)
14
- raise "Caller must have a notice method" unless caller.respond_to? :notice
15
- caller.notice args.first
16
- resolve_path type
17
- else
18
- args.empty? ? resolve_path(type) : args.first
19
- end
20
- end
21
-
22
- def resolve_path type
23
- raise "Caller must have a #main_event method" unless caller.respond_to? :main_event
24
- caller.send(type).each do |path, events|
25
- return path.to_s if matches? events
26
- end
27
- raise PathResolverError, "Path could not be resolved for: #{event_name}"
28
- end
29
-
30
- protected
31
-
32
- def matches? events
33
- event_matcher.match?(events)
34
- end
35
-
36
- def event_matcher
37
- @event_matcher ||= EventMatcher.new event
38
- end
39
-
40
- def event
41
- @event ||= caller.main_event
42
- end
43
- end
44
- end
45
- end
@@ -1,52 +0,0 @@
1
- module PostsController
2
- class Action < ApplicationController
3
- end
4
-
5
- class Index < Action
6
- expose(:posts) { Post.all }
7
- end
8
-
9
- class Initializer < Action
10
- expose(:post) { Post.new params[:post] }
11
- end
12
-
13
- class New < Initializer
14
- end
15
-
16
- class Create < Initializer
17
- def run
18
- if post.save
19
- redirect_to post, :notice => 'Post was successfully created.'
20
- else
21
- render :action => "new"
22
- end
23
- end
24
- end
25
-
26
- class Finder < Action
27
- expose(:post) { Post.find params[:id] }
28
- end
29
-
30
- class Show < Finder
31
- end
32
-
33
- class Edit < Finder
34
- end
35
-
36
- class Update < Finder
37
- def run
38
- if post.update_attributes(params[:post])
39
- redirect_to post, :notice => 'Post was successfully updated.'
40
- else
41
- render :action => "edit"
42
- end
43
- end
44
- end
45
-
46
- class Destroy < Finder
47
- def run
48
- post.destroy
49
- redirect_to posts_url
50
- end
51
- end
52
- end
@@ -1,62 +0,0 @@
1
- App::Application.routes.draw do
2
- focused_controller_routes do
3
- resources :posts
4
- end
5
-
6
- # The priority is based upon order of creation:
7
- # first created -> highest priority.
8
-
9
- # Sample of regular route:
10
- # match 'products/:id' => 'catalog#view'
11
- # Keep in mind you can assign values other than :controller and :action
12
-
13
- # Sample of named route:
14
- # match 'products/:id/purchase' => 'catalog#purchase', :as => :purchase
15
- # This route can be invoked with purchase_url(:id => product.id)
16
-
17
- # Sample resource route (maps HTTP verbs to controller actions automatically):
18
- # resources :products
19
-
20
- # Sample resource route with options:
21
- # resources :products do
22
- # member do
23
- # get 'short'
24
- # post 'toggle'
25
- # end
26
- #
27
- # collection do
28
- # get 'sold'
29
- # end
30
- # end
31
-
32
- # Sample resource route with sub-resources:
33
- # resources :products do
34
- # resources :comments, :sales
35
- # resource :seller
36
- # end
37
-
38
- # Sample resource route with more complex sub-resources
39
- # resources :products do
40
- # resources :comments
41
- # resources :sales do
42
- # get 'recent', :on => :collection
43
- # end
44
- # end
45
-
46
- # Sample resource route within a namespace:
47
- # namespace :admin do
48
- # # Directs /admin/products/* to Admin::ProductsController
49
- # # (app/controllers/admin/products_controller.rb)
50
- # resources :products
51
- # end
52
-
53
- # You can have the root of your site routed with "root"
54
- # just remember to delete public/index.html.
55
- # root :to => 'welcome#index'
56
-
57
- # See how all your routes lay out with "rake routes"
58
-
59
- # This is a legacy wild controller route that's not recommended for RESTful applications.
60
- # Note: This route will make all actions in every controller accessible via GET requests.
61
- # match ':controller(/:action(/:id))(.:format)'
62
- end
File without changes
@@ -1,6 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
3
-
4
- APP_PATH = File.expand_path('../../config/application', __FILE__)
5
- require File.expand_path('../../config/boot', __FILE__)
6
- require 'rails/commands'
@@ -1,59 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe PostsController do
4
- include FocusedController::RSpecFunctionalHelper
5
-
6
- before do
7
- @post = Post.create(:title => 'Hello', :body => 'Omg')
8
- end
9
-
10
- describe PostsController::Index do
11
- it "should get index" do
12
- get
13
- response.should be_success
14
- subject.posts.should_not be_nil
15
- end
16
- end
17
-
18
- describe PostsController::New do
19
- it "should get new" do
20
- get
21
- response.should be_success
22
- end
23
- end
24
-
25
- describe PostsController::Create do
26
- it "should create post" do
27
- expect { post :post => @post.attributes }.to change(Post, :count).by(1)
28
- response.should redirect_to(post_path(subject.post))
29
- end
30
- end
31
-
32
- describe PostsController::Show do
33
- it "should show post" do
34
- get :id => @post.id
35
- response.should be_success
36
- end
37
- end
38
-
39
- describe PostsController::Edit do
40
- it "should get edit" do
41
- get :id => @post.id
42
- response.should be_success
43
- end
44
- end
45
-
46
- describe PostsController::Update do
47
- it "should update post" do
48
- put :id => @post.id, :post => @post.attributes
49
- response.should redirect_to(post_path(subject.post))
50
- end
51
- end
52
-
53
- describe PostsController::Destroy do
54
- it "should destroy post" do
55
- expect { delete :id => @post.id }.to change(Post, :count).by(-1)
56
- response.should redirect_to(posts_path)
57
- end
58
- end
59
- end
@@ -1,6 +0,0 @@
1
- require 'bundler/setup'
2
- require 'rspec'
3
- require 'focused_controller/rspec_helper'
4
-
5
- APP_ROOT = File.expand_path('../../app', __FILE__)
6
- POSTS = []
@@ -1,5 +0,0 @@
1
- require 'rails/application'
2
- require File.expand_path("../../config/environment", __FILE__)
3
- require 'rspec'
4
- require 'focused_controller/rspec_helper'
5
- require 'focused_controller/rspec_functional_helper'