orange-core 0.5.3

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/README.markdown +145 -0
  2. data/lib/orange-core.rb +8 -0
  3. data/lib/orange-core/application.rb +132 -0
  4. data/lib/orange-core/assets/css/exceptions.css +50 -0
  5. data/lib/orange-core/assets/js/exceptions.js +44 -0
  6. data/lib/orange-core/carton.rb +178 -0
  7. data/lib/orange-core/core.rb +266 -0
  8. data/lib/orange-core/magick.rb +270 -0
  9. data/lib/orange-core/middleware/base.rb +96 -0
  10. data/lib/orange-core/middleware/database.rb +45 -0
  11. data/lib/orange-core/middleware/four_oh_four.rb +45 -0
  12. data/lib/orange-core/middleware/globals.rb +17 -0
  13. data/lib/orange-core/middleware/loader.rb +13 -0
  14. data/lib/orange-core/middleware/rerouter.rb +53 -0
  15. data/lib/orange-core/middleware/restful_router.rb +99 -0
  16. data/lib/orange-core/middleware/route_context.rb +39 -0
  17. data/lib/orange-core/middleware/route_site.rb +51 -0
  18. data/lib/orange-core/middleware/show_exceptions.rb +80 -0
  19. data/lib/orange-core/middleware/static.rb +67 -0
  20. data/lib/orange-core/middleware/static_file.rb +32 -0
  21. data/lib/orange-core/middleware/template.rb +60 -0
  22. data/lib/orange-core/packet.rb +232 -0
  23. data/lib/orange-core/plugin.rb +172 -0
  24. data/lib/orange-core/resource.rb +96 -0
  25. data/lib/orange-core/resources/mapper.rb +36 -0
  26. data/lib/orange-core/resources/model_resource.rb +228 -0
  27. data/lib/orange-core/resources/not_found.rb +10 -0
  28. data/lib/orange-core/resources/page_parts.rb +68 -0
  29. data/lib/orange-core/resources/parser.rb +113 -0
  30. data/lib/orange-core/resources/routable_resource.rb +16 -0
  31. data/lib/orange-core/resources/scaffold.rb +106 -0
  32. data/lib/orange-core/stack.rb +226 -0
  33. data/lib/orange-core/templates/exceptions.haml +111 -0
  34. data/lib/orange-core/views/default_resource/create.haml +4 -0
  35. data/lib/orange-core/views/default_resource/edit.haml +9 -0
  36. data/lib/orange-core/views/default_resource/list.haml +10 -0
  37. data/lib/orange-core/views/default_resource/show.haml +4 -0
  38. data/lib/orange-core/views/default_resource/table_row.haml +7 -0
  39. data/lib/orange-core/views/not_found/404.haml +2 -0
  40. data/spec/orange-core/application_spec.rb +183 -0
  41. data/spec/orange-core/carton_spec.rb +136 -0
  42. data/spec/orange-core/core_spec.rb +248 -0
  43. data/spec/orange-core/magick_spec.rb +96 -0
  44. data/spec/orange-core/middleware/base_spec.rb +38 -0
  45. data/spec/orange-core/middleware/globals_spec.rb +3 -0
  46. data/spec/orange-core/middleware/rerouter_spec.rb +3 -0
  47. data/spec/orange-core/middleware/restful_router_spec.rb +3 -0
  48. data/spec/orange-core/middleware/route_context_spec.rb +3 -0
  49. data/spec/orange-core/middleware/route_site_spec.rb +3 -0
  50. data/spec/orange-core/middleware/show_exceptions_spec.rb +3 -0
  51. data/spec/orange-core/middleware/static_file_spec.rb +3 -0
  52. data/spec/orange-core/middleware/static_spec.rb +3 -0
  53. data/spec/orange-core/mock/mock_app.rb +16 -0
  54. data/spec/orange-core/mock/mock_carton.rb +43 -0
  55. data/spec/orange-core/mock/mock_core.rb +2 -0
  56. data/spec/orange-core/mock/mock_middleware.rb +25 -0
  57. data/spec/orange-core/mock/mock_mixins.rb +19 -0
  58. data/spec/orange-core/mock/mock_model_resource.rb +47 -0
  59. data/spec/orange-core/mock/mock_pulp.rb +24 -0
  60. data/spec/orange-core/mock/mock_resource.rb +26 -0
  61. data/spec/orange-core/mock/mock_router.rb +10 -0
  62. data/spec/orange-core/orange_spec.rb +19 -0
  63. data/spec/orange-core/packet_spec.rb +203 -0
  64. data/spec/orange-core/resource_spec.rb +96 -0
  65. data/spec/orange-core/resources/mapper_spec.rb +5 -0
  66. data/spec/orange-core/resources/model_resource_spec.rb +246 -0
  67. data/spec/orange-core/resources/parser_spec.rb +5 -0
  68. data/spec/orange-core/resources/routable_resource_spec.rb +5 -0
  69. data/spec/orange-core/spec_helper.rb +53 -0
  70. data/spec/orange-core/stack_spec.rb +232 -0
  71. data/spec/stats.rb +182 -0
  72. metadata +227 -0
@@ -0,0 +1,172 @@
1
+ require 'orange-core/magick'
2
+ require 'orange-core/core'
3
+ module Orange::Plugins
4
+ # This class defines a basic Orange plugin. A plugin simply defines
5
+ # a bunch of possible classes/files that can be called up by the main
6
+ # orange system.
7
+ #
8
+ # The plugins are used in several places. When the core is initialized,
9
+ # it will ask all plugins if they have any resources that should be added,
10
+ # and load those resources if they exist.
11
+ #
12
+ # The stack will call the list of plugins several times in building a stack
13
+ # once for each possible middleware location.
14
+ class Base
15
+ extend ClassInheritableAttributes
16
+ cattr_accessor :prerouting_middleware, :routing_middleware,
17
+ :responder_middleware, :postrouting_middleware, :has_middleware
18
+ cattr_accessor :assets, :assets_name
19
+ cattr_accessor :resources
20
+ cattr_accessor :views
21
+ cattr_accessor :templates
22
+
23
+ # Adds a single prerouting middleware class to list of prerouting middleware
24
+ def self.prerouter(r)
25
+ prerouters(r)
26
+ end
27
+
28
+ # Adds several prerouting middleware classes to list of prerouting middleware
29
+ def self.prerouters(*routers)
30
+ self.has_middleware = true
31
+ routers.each do |prerouter|
32
+ self.prerouting_middleware << prerouter
33
+ end
34
+ end
35
+
36
+ # Adds a single postrouting middleware class to list of postrouting middleware
37
+ def self.postrouter(r)
38
+ postrouters(r)
39
+ end
40
+
41
+ # Adds several postrouting middleware classes to list of postrouting middleware
42
+ def self.postrouters(*routers)
43
+ self.has_middleware = true
44
+ routers.each do |postrouter|
45
+ self.postrouting_middleware << postrouter
46
+ end
47
+ end
48
+
49
+ # Adds a router middleware class to the list of routing middleware
50
+ def self.router(r)
51
+ routers(r)
52
+ end
53
+ # Adds several router middleware classes
54
+ def self.routers(*routers)
55
+ self.has_middleware = true
56
+ routers.each do |router|
57
+ self.routing_middleware << router
58
+ end
59
+ end
60
+ # Adds a responder middleware class
61
+ def self.responder(r)
62
+ responders(r)
63
+ end
64
+ # Adds several responder middleware classes
65
+ def self.responders(*respones)
66
+ self.has_middleware = true
67
+ respones.each do |response|
68
+ self.responder_middleware << response
69
+ end
70
+ end
71
+
72
+ # Returns the list of prerouting_middleware defined or
73
+ # an empty array if none defined
74
+ def self.prerouting_middleware
75
+ super || self.prerouting_middleware = []
76
+ end
77
+
78
+ # Returns the list of prerouting_middleware defined or
79
+ # an empty array if none defined
80
+ def self.postrouting_middleware
81
+ super || self.postrouting_middleware = []
82
+ end
83
+
84
+ # Returns the list of routing_middleware defined or
85
+ # an empty array if none defined
86
+ def self.routing_middleware
87
+ super || self.routing_middleware = []
88
+ end
89
+
90
+ # Returns the list of responder_middleware defined or
91
+ # an empty array if none defined
92
+ def self.responder_middleware
93
+ super || self.responder_middleware = []
94
+ end
95
+
96
+ def self.templates_dir(arg)
97
+ self.templates = arg
98
+ end
99
+
100
+ def self.views_dir(arg)
101
+ self.views = arg
102
+ end
103
+
104
+ def self.assets_dir(arg)
105
+ self.assets = arg
106
+ end
107
+
108
+ def self.resource(instance, name = false)
109
+ self.resources << [instance, name]
110
+ end
111
+
112
+ def self.resources
113
+ super || self.resources = []
114
+ end
115
+
116
+ # Returns the assigned asset dir name,
117
+ # or Plugin class name formatted like this: PluginClass -> _pluginclass_
118
+ def assets_name
119
+ self.class.assets_name || '_'+self.class.to_s.gsub(/Orange::Plugins::/, '').gsub(/::/, '_').downcase+'_'
120
+ end
121
+
122
+ # Returns the assets directory for this plugin
123
+ def assets
124
+ self.class.assets
125
+ end
126
+
127
+ # Whether this plugin has assets for the static middleware to worry
128
+ # about
129
+ def has_assets?
130
+ !assets.blank?
131
+ end
132
+
133
+ def resources
134
+ self.class.resources
135
+ end
136
+
137
+ def has_resources?
138
+ !resources.blank?
139
+ end
140
+
141
+ def views
142
+ self.class.views
143
+ end
144
+
145
+ def has_views?
146
+ !views.blank?
147
+ end
148
+
149
+ def templates
150
+ self.class.templates
151
+ end
152
+
153
+ def has_templates?
154
+ !templates.blank?
155
+ end
156
+
157
+ def middleware(type = :has)
158
+ case type
159
+ when :responders then self.class.responder_middleware
160
+ when :routing then self.class.routing_middleware
161
+ when :prerouting then self.class.prerouting_middleware
162
+ when :postrouting then self.class.postrouting_middleware
163
+ when :has then self.class.has_middleware
164
+ else nil
165
+ end
166
+ end
167
+
168
+ def has_middleware?
169
+ !middleware.blank?
170
+ end
171
+ end
172
+ end
@@ -0,0 +1,96 @@
1
+ require 'orange-core/core'
2
+
3
+ module Orange
4
+ # Orange Resource for being subclassed
5
+ class Resource
6
+ extend ClassInheritableAttributes
7
+ # Defines a model class as an inheritable class attribute and also an instance
8
+ # attribute
9
+ cattr_accessor :called
10
+
11
+ def initialize(*args, &block)
12
+ @options = DefaultHash.new.merge!(Options.new(*args, &block).hash)
13
+ end
14
+
15
+ def set_orange(orange, name)
16
+ @orange = orange
17
+ @my_orange_name = name
18
+ init
19
+ orange.register(:stack_loaded) { |s| stack_init } if self.respond_to? :stack_init
20
+ self
21
+ end
22
+
23
+ def self.set_orange(*args)
24
+ raise 'instantiate the resource before calling set orange'
25
+ end
26
+
27
+ def init
28
+ afterLoad
29
+ end
30
+
31
+ def afterLoad
32
+ end
33
+
34
+ def self.call_me(name)
35
+ self.called = name
36
+ end
37
+
38
+ def orange
39
+ @orange
40
+ end
41
+
42
+ def routable
43
+ false
44
+ end
45
+
46
+ def view(packet = false, *args)
47
+ ''
48
+ end
49
+
50
+ def orange_name
51
+ @my_orange_name || self.class.called || false
52
+ end
53
+
54
+ def options
55
+ @options
56
+ end
57
+
58
+ # Renders a view, with all options set for haml to access.
59
+ # Calls #view_opts to generate the haml options.
60
+ # @param [Orange::Packet] packet the packet we are returning a view for
61
+ # @param [Symbol] mode the mode we are trying to view (used to find template name)
62
+ # @param [optional, Array] args the args array
63
+ # @return [String] haml parsed string to be placed in packet[:content] by #route
64
+ def do_view(packet, mode, *args)
65
+ haml_opts = view_opts(packet, mode, *args)
66
+ orange[:parser].haml("#{mode.to_s}.haml", packet, haml_opts)
67
+ end
68
+
69
+
70
+ # Returns the options for including in template rendering. All keys passed in the args array
71
+ # will automatically be local variables in the haml template.
72
+ # In addition, the props, resource, and model_name variables will be available.
73
+ # @param [Orange::Packet] packet the packet we are returning a view for
74
+ # @param [Symbol] mode the mode we are trying to view (used to find template name)
75
+ # @param [boolean] is_list whether we want a list or not (view_opts will automatically look up
76
+ # a single object or a list of objects, so we need to know which)
77
+ # @param [optional, Array] args the args array
78
+ # @return [Hash] hash of options to be used
79
+ def view_opts(packet, mode, *args)
80
+ opts = args.extract_options!.with_defaults({:path => ''})
81
+ all_opts = {:resource => self, :model_name => @my_orange_name}.merge!(opts)
82
+ all_opts.with_defaults! find_extras(packet, mode)
83
+ all_opts
84
+ end
85
+
86
+ # Returns a hash of extra options to be set and made available by the haml parser.
87
+ # Overriding this method is useful for passing extra bits of info to rendering
88
+ # for certain view modes without rewriting all of the other scaffolding
89
+ # @param [Orange::Packet] packet the packet we are returning a view for
90
+ # @param [Symbol] mode the mode we are trying to view (used to find template name)
91
+ # @return [Hash] a hash of extras to be included in the rendering
92
+ def find_extras(packet, mode)
93
+ {}
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,36 @@
1
+ require 'orange-core/core'
2
+
3
+ module Orange
4
+ class Mapper < Resource
5
+ # Takes a packet extracts request information, then calls packet.route
6
+ def afterLoad
7
+ orange.add_pulp Pulp::Packet_Mapper
8
+ end
9
+
10
+ def route_to(packet, resource, *args)
11
+ opts = args.extract_options!
12
+ packet = DefaultHash.new unless packet
13
+ context = opts[:context]
14
+ context = packet['route.context', nil] unless (context || (packet['route.context'] == :live))
15
+ site = packet['route.faked_site'] ? packet['route.site_url', nil] : nil
16
+ args.unshift(resource)
17
+ args.unshift(context)
18
+ args.unshift(site)
19
+ '/'+args.compact.join('/')
20
+ end
21
+ end
22
+
23
+ module Pulp::Packet_Mapper
24
+ def route_to(resource, *args)
25
+ orange[:mapper].route_to(self, resource, *args)
26
+ end
27
+
28
+ def reroute(url, type = :real, *args)
29
+ packet['reroute.to'] = url
30
+ packet['reroute.type'] = type
31
+ packet['reroute.args'] = *args if args
32
+ raise Reroute.new(self), 'Unhandled reroute'
33
+ end
34
+ end
35
+
36
+ end
@@ -0,0 +1,228 @@
1
+ require 'orange-core/resources/routable_resource'
2
+
3
+ module Orange
4
+ class ModelResource < RoutableResource
5
+ # Defines a model class as an inheritable class attribute and also an instance
6
+ # attribute
7
+ cattr_accessor :model_class
8
+ attr_accessor :model_class
9
+
10
+ # Tells the Model resource which Carton class to scaffold
11
+ # @param [Orange::Carton] my_model_class class name of the carton class to scaffold
12
+ def self.use(my_model_class)
13
+ self.model_class = my_model_class
14
+ end
15
+
16
+ # Overrides the instantiation of new Resource object to set instance model
17
+ # class to the class-level model class defined by #use
18
+ def self.new(*args, &block)
19
+ me = super(*args, &block)
20
+ me.model_class = self.model_class
21
+ me
22
+ end
23
+
24
+ # Views a packet by calling method defined as opts[:mode].
25
+ # Defaults mode to show or list, if it can't find opts[:mode].
26
+ # Decision between show or list is determined by whether an id has been chosen.
27
+ # An id is set in opts[:id], or extracted from the packet['route.resource_id'].
28
+ # Calling view is equivalent to calling a viewable method directly, view just
29
+ # sets up safe defaults so method missing errors are less likely.
30
+ # @param [Orange::Packet] packet the packet calling view on this resource
31
+ def view(packet, opts = {})
32
+ resource_id = opts[:id] || packet['route.resource_id', false]
33
+ mode = opts[:mode] || packet['route.resource_action'] ||
34
+ (resource_id ? :show : :index)
35
+ self.__send__(mode, packet, opts)
36
+ end
37
+
38
+ # Renders a view, with all options set for haml to access.
39
+ # Calls #view_opts to generate the haml options.
40
+ # @param [Orange::Packet] packet the packet we are returning a view for
41
+ # @param [Symbol] mode the mode we are trying to view (used to find template name)
42
+ # @param [optional, Array] args the args array
43
+ # @return [String] haml parsed string to be placed in packet[:content] by #route
44
+ def do_view(packet, mode, *args)
45
+ haml_opts = view_opts(packet, mode, false, *args)
46
+ orange[:parser].haml("#{mode.to_s}.haml", packet, haml_opts)
47
+ end
48
+
49
+ # Renders a view, with all options set for haml to access. Same as do_view, but
50
+ # calls #view_opts with is_list set to true to generate the haml options.
51
+ # @param [Orange::Packet] packet the packet we are returning a view for
52
+ # @param [Symbol] mode the mode we are trying to view (used to find template name)
53
+ # @param [optional, Array] args the args array
54
+ # @return [String] haml parsed string to be placed in packet[:content] by #route
55
+ def do_list_view(packet, mode, *args)
56
+ haml_opts = view_opts(packet, mode, true, *args)
57
+ orange[:parser].haml("#{mode.to_s}.haml", packet, haml_opts)
58
+ end
59
+
60
+ # Returns the options for including in template rendering. All keys passed in the args array
61
+ # will automatically be local variables in the haml template.
62
+ # In addition, the props, resource, and model_name variables will be available.
63
+ # @param [Orange::Packet] packet the packet we are returning a view for
64
+ # @param [Symbol] mode the mode we are trying to view (used to find template name)
65
+ # @param [boolean] is_list whether we want a list or not (view_opts will automatically look up
66
+ # a single object or a list of objects, so we need to know which)
67
+ # @param [optional, Array] args the args array
68
+ # @return [Hash] hash of options to be used
69
+ def view_opts(packet, mode, is_list, *args)
70
+ opts = args.extract_options!.with_defaults({:path => ''})
71
+ props = model_class.form_props(packet['route.context'])
72
+ resource_id = opts[:id] || packet['route.resource_id'] || false
73
+ all_opts = {:props => props, :resource => self, :model_name => @my_orange_name}.merge!(opts)
74
+ all_opts.with_defaults! :model => find_one(packet, mode, resource_id) unless is_list
75
+ all_opts.with_defaults! :list => find_list(packet, mode) if is_list
76
+ all_opts.with_defaults! find_extras(packet, mode)
77
+ all_opts
78
+ end
79
+
80
+ # Returns a single object found by the model class, given an id.
81
+ # If id isn't given, we return false.
82
+ # @param [Orange::Packet] packet the packet we are returning a view for
83
+ # @param [Symbol] mode the mode we are trying to view (used to find template name)
84
+ # @param [Numeric] id the id to lookup on the model class
85
+ # @return [Object] returns an object of type set by #use, if one found with same id
86
+ def find_one(packet, mode, id = false)
87
+ return false unless id
88
+ model_class.get(id)
89
+ end
90
+
91
+ # Returns a list of all objects found by the model class
92
+ # If none, returns an empty array
93
+ # @param [Orange::Packet] packet the packet we are returning a view for
94
+ # @param [Symbol] mode the mode we are trying to view (used to find template name)
95
+ # @param [Numeric] id the id to lookup on the model class
96
+ # @return [Enumerable] returns a collection of objects of type set by #use
97
+ def find_list(packet, mode)
98
+ model_class.all || []
99
+ end
100
+
101
+ # Creates a new model object and saves it (if a post), then reroutes to the main page
102
+ # @param [Orange::Packet] packet the packet being routed
103
+ def new(packet, opts = {})
104
+ no_reroute = opts.delete(:no_reroute)
105
+ if packet.request.post? || !opts.blank?
106
+ params = opts.with_defaults(opts.delete(:params) || packet.request.params[@my_orange_name.to_s] || {})
107
+ before = beforeNew(packet, params)
108
+ obj = onNew(packet, params) if before
109
+ afterNew(packet, obj, params) if before
110
+ obj.save if obj && before
111
+ end
112
+ packet.reroute(@my_orange_name, :orange) unless (packet.request.xhr? || no_reroute)
113
+ obj || false
114
+ end
115
+
116
+ # A callback for the actual new item event
117
+ def onNew(packet, opts = {})
118
+ model_class.new(opts)
119
+ end
120
+
121
+ # A callback for before a new item is created
122
+ # @param [Orange::Packet] packet the packet being routed
123
+ def beforeNew(packet, opts = {})
124
+ true
125
+ end
126
+
127
+ # A callback for after a new item is created
128
+ # @param [Orange::Packet] packet the packet being routed
129
+ # @param [Object] obj the model class just created
130
+ def afterNew(packet, obj, opts = {})
131
+ end
132
+
133
+ # Deletes an object specified by packet['route.resource_id'], then reroutes to main.
134
+ # The request must come in as a delete. Rack::MethodOverride can be used to do this.
135
+ # @param [Orange::Packet] packet the packet being routed
136
+ def delete(packet, opts = {})
137
+ no_reroute = opts.delete(:no_reroute)
138
+ if packet.request.delete? || !opts.blank?
139
+ id = opts.delete(:resource_id) || packet['route.resource_id']
140
+ m = model_class.get(packet['route.resource_id'])
141
+ before = beforeDelete(packet, m, opts)
142
+ onDelete(packet, m, opts) if m && before
143
+ afterDelete(packet, m, opts) if before
144
+ orange.fire(:model_resource_deleted, packet, {:resource_id => id, :resource => @my_orange_name})
145
+ end
146
+ packet.reroute(@my_orange_name, :orange) unless (packet.request.xhr? || no_reroute)
147
+ end
148
+
149
+ def beforeDelete(packet, obj, opts = {})
150
+ true
151
+ end
152
+
153
+ # Delete object
154
+ def onDelete(packet, obj, opts = {})
155
+ obj.destroy
156
+ end
157
+
158
+ def afterDelete(packet, obj, opts = {})
159
+ end
160
+
161
+ # Saves updates to an object specified by packet['route.resource_id'], then reroutes to main
162
+ # @param [Orange::Packet] packet the packet being routed
163
+ def save(packet, opts = {})
164
+ no_reroute = opts.delete(:no_reroute)
165
+ if packet.request.post? || !opts.blank?
166
+ my_id = opts.delete(:resource_id) || packet['route.resource_id']
167
+ m = opts.delete(:model) || model_class.get(my_id)
168
+ params = opts.with_defaults(opts.delete(:params) || packet.request.params[@my_orange_name.to_s] || {})
169
+ if m
170
+ before = beforeSave(packet, m, params)
171
+ onSave(packet, m, params) if before
172
+ afterSave(packet, m, params) if before
173
+ end
174
+ end
175
+ packet.reroute(@my_orange_name, :orange) unless (packet.request.xhr? || no_reroute)
176
+ m || false
177
+ end
178
+
179
+ def beforeSave(packet, obj, opts = {})
180
+ true
181
+ end
182
+
183
+ def onSave(packet, obj, opts = {})
184
+ obj.update(opts)
185
+ end
186
+
187
+ def afterSave(packet, obj, opts = {})
188
+ end
189
+
190
+ # Calls #do_view with :show mode
191
+ # @param [Orange::Packet] packet the packet being routed
192
+ def show(packet, *opts)
193
+ do_view(packet, :show, *opts)
194
+ end
195
+
196
+ # Calls #do_view with :edit mode
197
+ # @param [Orange::Packet] packet the packet being routed
198
+ def edit(packet, *opts)
199
+ do_view(packet, :edit, *opts)
200
+ end
201
+
202
+ # Calls #do_view with :create mode
203
+ # @param [Orange::Packet] packet the packet being routed
204
+ def create(packet, *opts)
205
+ do_view(packet, :create, *opts)
206
+ end
207
+
208
+ # Calls #do_view with :table_row mode
209
+ # @param [Orange::Packet] packet the packet being routed
210
+ def table_row(packet, *opts)
211
+ do_view(packet, :table_row, *opts)
212
+ end
213
+
214
+ # Calls #do_list_view with :list mode
215
+ # @param [Orange::Packet] packet the packet being routed
216
+ def list(packet, *opts)
217
+ do_list_view(packet, :list, *opts)
218
+ end
219
+
220
+ # Calls #do_list_view with :list mode.
221
+ # @param [Orange::Packet] packet the packet being routed
222
+ def index(packet, *opts)
223
+ do_list_view(packet, :list, *opts)
224
+ end
225
+
226
+ end
227
+
228
+ end