orange-core 0.5.3

Sign up to get free protection for your applications and to get access to all the features.
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