orange-core 0.6.0 → 0.7.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.
- data/README.markdown +18 -27
- data/lib/orange-core/application.rb +7 -2
- data/lib/orange-core/carton.rb +17 -9
- data/lib/orange-core/core.rb +25 -8
- data/lib/orange-core/magick.rb +3 -0
- data/lib/orange-core/middleware/abstract_format.rb +46 -0
- data/lib/orange-core/middleware/database.rb +5 -2
- data/lib/orange-core/middleware/globals.rb +1 -1
- data/lib/orange-core/middleware/restful_router.rb +40 -11
- data/lib/orange-core/middleware/root_dir.rb +19 -0
- data/lib/orange-core/middleware/show_exceptions.rb +23 -6
- data/lib/orange-core/middleware/static.rb +6 -6
- data/lib/orange-core/middleware/template.rb +8 -0
- data/lib/orange-core/resource.rb +25 -1
- data/lib/orange-core/resources/mapper.rb +20 -2
- data/lib/orange-core/resources/model_resource.rb +84 -2
- data/lib/orange-core/resources/parser.rb +3 -2
- data/lib/orange-core/stack.rb +10 -12
- data/lib/orange-core/templates/500.haml +2 -0
- data/lib/orange-core/views/default_resource/create.haml +1 -1
- data/lib/orange-core/views/default_resource/edit.haml +1 -1
- data/lib/orange-core/views/not_found/404.haml +1 -1
- data/spec/orange-core/application_spec.rb +1 -0
- data/spec/orange-core/core_spec.rb +16 -1
- data/spec/orange-core/middleware/restful_router_spec.rb +98 -1
- data/spec/orange-core/mock/mock_mixins.rb +1 -1
- data/spec/orange-core/mock/mock_model_resource.rb +13 -0
- data/spec/orange-core/mock/mock_plugin.rb +7 -0
- data/spec/orange-core/orange_spec.rb +11 -0
- data/spec/orange-core/resources/model_resource_spec.rb +16 -7
- data/spec/orange-core/spec_helper.rb +3 -0
- data/spec/orange-core/stack_spec.rb +2 -2
- metadata +11 -72
@@ -6,6 +6,18 @@ module Orange
|
|
6
6
|
# attribute
|
7
7
|
cattr_accessor :model_class
|
8
8
|
attr_accessor :model_class
|
9
|
+
# Defines a list of exposed actions
|
10
|
+
cattr_accessor :exposed_actions
|
11
|
+
cattr_accessor :listable_actions
|
12
|
+
# Allows the resource to be nested inside other resources.
|
13
|
+
cattr_accessor :nested_in
|
14
|
+
# Allows the resource to be nest other resources.
|
15
|
+
cattr_accessor :nests
|
16
|
+
|
17
|
+
def self.listable(*args)
|
18
|
+
self.listable_actions ||= []
|
19
|
+
args.each{|arg| self.listable_actions << arg}
|
20
|
+
end
|
9
21
|
|
10
22
|
# Tells the Model resource which Carton class to scaffold
|
11
23
|
# @param [Orange::Carton] my_model_class class name of the carton class to scaffold
|
@@ -13,9 +25,39 @@ module Orange
|
|
13
25
|
self.model_class = my_model_class
|
14
26
|
end
|
15
27
|
|
28
|
+
# Allows the resource to nest other resources
|
29
|
+
def self.nests_many(*args)
|
30
|
+
self.nests ||= {}
|
31
|
+
args.each{|arg| self.nests[arg] = :many}
|
32
|
+
end
|
33
|
+
|
34
|
+
# Allows the resource to nest other resources
|
35
|
+
def self.nests_one(*args)
|
36
|
+
self.nests ||= {}
|
37
|
+
args.each{|arg| self.nests[arg] = :one}
|
38
|
+
end
|
39
|
+
|
40
|
+
def nests
|
41
|
+
self.class.nests
|
42
|
+
end
|
43
|
+
|
44
|
+
# Allows the resource to nest inside other resources
|
45
|
+
def self.nests_in(*args)
|
46
|
+
self.nested_in ||= []
|
47
|
+
args.each{|arg| self.nested_in << arg}
|
48
|
+
end
|
49
|
+
|
50
|
+
def nested_in
|
51
|
+
self.class.nested_in
|
52
|
+
end
|
53
|
+
|
16
54
|
# Overrides the instantiation of new Resource object to set instance model
|
17
55
|
# class to the class-level model class defined by #use
|
18
56
|
def self.new(*args, &block)
|
57
|
+
self.exposed_actions ||= {:all => [:show, :list], :admin => [:all], :orange => [:all]}
|
58
|
+
self.listable_actions ||= []
|
59
|
+
self.nested_in ||= []
|
60
|
+
self.nests ||= {}
|
19
61
|
me = super(*args, &block)
|
20
62
|
me.model_class = self.model_class
|
21
63
|
me
|
@@ -32,7 +74,24 @@ module Orange
|
|
32
74
|
resource_id = opts[:id] || packet['route.resource_id', false]
|
33
75
|
mode = opts[:mode] || packet['route.resource_action'] ||
|
34
76
|
(resource_id ? :show : :index)
|
35
|
-
self.
|
77
|
+
if self.respond_to?(mode)
|
78
|
+
self.__send__(mode, packet, opts)
|
79
|
+
else
|
80
|
+
viewable(packet, mode, opts)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
# Allows undefined methods to be viewed with the standard do_view method
|
85
|
+
# They must be added to the viewable or listable actions by calling
|
86
|
+
# #self.viewable or #self.listable with a set of functions to be viewable
|
87
|
+
def viewable(packet, mode, opts={})
|
88
|
+
if(self.class.viewable_actions.include?(mode))
|
89
|
+
do_view(packet, mode, opts)
|
90
|
+
elsif(self.class.listable_actions.include?(mode))
|
91
|
+
do_list_view(packet, mode, opts)
|
92
|
+
else
|
93
|
+
''
|
94
|
+
end
|
36
95
|
end
|
37
96
|
|
38
97
|
# Renders a view, with all options set for haml to access.
|
@@ -68,7 +127,7 @@ module Orange
|
|
68
127
|
# @return [Hash] hash of options to be used
|
69
128
|
def view_opts(packet, mode, is_list, *args)
|
70
129
|
opts = args.extract_options!.with_defaults({:path => ''})
|
71
|
-
props = model_class.form_props(packet['route.context'])
|
130
|
+
props = model_class.form_props(packet['route.context'], ((is_list || mode == :table_row) ? mode : :any))
|
72
131
|
resource_id = opts[:id] || packet['route.resource_id'] || false
|
73
132
|
all_opts = {:props => props, :resource => self, :model_name => @my_orange_name}.merge!(opts)
|
74
133
|
all_opts.with_defaults! :model => find_one(packet, mode, resource_id) unless is_list
|
@@ -222,6 +281,29 @@ module Orange
|
|
222
281
|
def index(packet, *opts)
|
223
282
|
do_list_view(packet, :list, *opts)
|
224
283
|
end
|
284
|
+
|
285
|
+
# Add methods to the list of exposed actions.
|
286
|
+
def self.expose(*args)
|
287
|
+
self.exposed_actions ||= {:all => [:show, :list], :admin => :all, :orange => :all}
|
288
|
+
self.exposed_actions.merge!(args.extract_options!)
|
289
|
+
self.exposed_actions[:all].concat(args)
|
290
|
+
end
|
291
|
+
|
292
|
+
# Add an exclusive list of exposed actions. List is cleared out beforehand
|
293
|
+
def self.expose_only(*args)
|
294
|
+
self.exposed_actions = {:all => []}
|
295
|
+
self.exposed_actions.merge!(args.extract_options!)
|
296
|
+
self.exposed_actions[:all].concat(args)
|
297
|
+
end
|
298
|
+
|
299
|
+
# Exposed method for helping the RestfulRouter class.
|
300
|
+
def exposed(packet)
|
301
|
+
all = self.class.exposed_actions[:all]
|
302
|
+
all = [all] unless all.is_a?(Array)
|
303
|
+
context = self.class.exposed_actions[packet['route.context']]
|
304
|
+
context = [context] unless context.is_a?(Array)
|
305
|
+
all+context
|
306
|
+
end
|
225
307
|
|
226
308
|
end
|
227
309
|
|
@@ -9,8 +9,8 @@ module Orange
|
|
9
9
|
orange.add_pulp Orange::Pulp::ParserPulp
|
10
10
|
@template_dirs = [File.join(orange.core_dir, 'templates')]
|
11
11
|
@view_dirs = [File.join(orange.core_dir, 'views')]
|
12
|
-
|
13
|
-
|
12
|
+
orange.plugins.each{|p| @template_dirs << p.templates if p.has_templates? }
|
13
|
+
orange.plugins.each{|p| @view_dirs << p.views if p.has_views? }
|
14
14
|
end
|
15
15
|
|
16
16
|
def yaml(file)
|
@@ -77,6 +77,7 @@ module Orange
|
|
77
77
|
packet_binding['parser.haml-templates', {}]["#{context}-#{resource}-#{file}"] = haml_engine
|
78
78
|
end
|
79
79
|
end
|
80
|
+
opts[:opts] = opts.dup
|
80
81
|
out = haml_engine.render(packet_binding, opts, &block)
|
81
82
|
end
|
82
83
|
|
data/lib/orange-core/stack.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
require 'orange-core/core'
|
2
2
|
require 'rack/builder'
|
3
|
-
require 'rack/abstract_format'
|
4
3
|
|
5
4
|
module Orange
|
6
5
|
# Builds an orange stack of middleware
|
@@ -127,13 +126,12 @@ module Orange
|
|
127
126
|
stack Orange::Middleware::Loader
|
128
127
|
stack Orange::Middleware::Rerouter, opts.dup
|
129
128
|
stack Orange::Middleware::Static, opts.dup
|
130
|
-
|
131
|
-
|
132
|
-
# since all orange stuff is non-destructive
|
129
|
+
stack Orange::Middleware::AbstractFormat unless opts[:no_abstract_format]
|
130
|
+
stack Orange::Middleware::RootDir, opts.dup
|
133
131
|
stack Orange::Middleware::RouteSite, opts.dup
|
134
132
|
stack Orange::Middleware::RouteContext, opts.dup
|
135
|
-
stack Orange::Middleware::Database
|
136
|
-
|
133
|
+
stack Orange::Middleware::Database unless (opts[:no_datamapper] || orange.options[:no_datamapper])
|
134
|
+
orange.plugins.each{|p| p.middleware(:prerouting).each{|m| stack m, opts.dup} if p.has_middleware?}
|
137
135
|
end
|
138
136
|
|
139
137
|
# A shortcut for routing via Orange::Middleware::RestfulRouter and any plugins
|
@@ -141,17 +139,17 @@ module Orange
|
|
141
139
|
# Any args are passed on to the middleware
|
142
140
|
def routing(opts ={})
|
143
141
|
stack Orange::Middleware::RestfulRouter, opts.dup
|
144
|
-
|
142
|
+
orange.plugins.each{|p| p.middleware(:routing).each{|m| stack m, opts.dup} if p.has_middleware?}
|
145
143
|
end
|
146
144
|
|
147
145
|
def postrouting(opts ={})
|
148
|
-
|
146
|
+
orange.plugins.each{|p| p.middleware(:postrouting).each{|m| stack m, opts.dup} if p.has_middleware?}
|
149
147
|
stack Orange::Middleware::Template
|
150
148
|
stack Orange::Middleware::FourOhFour, opts.dup # Last ditch, send route to 404 page.
|
151
149
|
end
|
152
150
|
|
153
151
|
def responders(opts ={})
|
154
|
-
|
152
|
+
orange.plugins.each{|p| p.middleware(:responders).each{|m| stack m, opts.dup} if p.has_middleware?}
|
155
153
|
end
|
156
154
|
|
157
155
|
# # A shortcut to enable Rack::OpenID and Orange::Middleware::AccessControl
|
@@ -203,14 +201,14 @@ module Orange
|
|
203
201
|
@app = false # Rebuild no matter what if autoload
|
204
202
|
end
|
205
203
|
unless @app
|
206
|
-
|
204
|
+
do_build # Build if necessary
|
207
205
|
orange.fire(:stack_loaded, @app)
|
208
206
|
end
|
209
207
|
@app
|
210
208
|
end
|
211
209
|
|
212
210
|
def do_build
|
213
|
-
@build.to_app
|
211
|
+
@app = @build.to_app
|
214
212
|
end
|
215
213
|
|
216
214
|
# Sets the core and then passes on to the stack, according to standard
|
@@ -222,7 +220,7 @@ module Orange
|
|
222
220
|
|
223
221
|
# Debug helping
|
224
222
|
def inspect
|
225
|
-
"#<Orange::Stack:0x#{self.object_id.to_s(16)} @
|
223
|
+
"#<Orange::Stack:0x#{self.object_id.to_s(16)} @app=#{@app.inspect}, @core=#{@core.inspect}>"
|
226
224
|
end
|
227
225
|
end
|
228
226
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
%form{:action => "#{packet.route_to(model_name, 'new')}", :method => 'post'}
|
1
|
+
%form{:action => "#{packet.route_to(model_name, 'new')}", :method => 'post', :"accept-charset" => "UTF-8"}
|
2
2
|
- for prop in props
|
3
3
|
%p= view_attribute(prop, model_name, :label => true)
|
4
4
|
%input{:type => 'submit', :value => 'Save New Item'}
|
@@ -1,7 +1,7 @@
|
|
1
1
|
- if model
|
2
2
|
- if resource.options[:sitemappable, false]
|
3
3
|
= orange[:sitemap, true].sitemap_links(packet, {:slug_me => orange[:sitemap, true].slug_for(model, props)})
|
4
|
-
%form{:action => packet.route_to(model_name, model[:id], 'save'), :method => 'post'}
|
4
|
+
%form{:action => packet.route_to(model_name, model[:id], 'save'), :method => 'post', :"accept-charset" => "UTF-8"}
|
5
5
|
- for prop in props
|
6
6
|
%p!= view_attribute(prop, model_name, :label => true, :value => model.attribute_get(prop[:name]), :model => model)
|
7
7
|
%input{:type => 'submit', :value => 'Save Changes'}
|
@@ -1,2 +1,2 @@
|
|
1
|
-
%h1= "#{request.request_method}: #{
|
1
|
+
%h1= "#{request.request_method}: #{packet['route.path']}"
|
2
2
|
%h2 The file you were looking for cannot be found
|
@@ -139,6 +139,21 @@ describe Orange::Core do
|
|
139
139
|
c.options.should_not have_key(:opt_3)
|
140
140
|
end
|
141
141
|
|
142
|
+
it "should have a mash options hash" do
|
143
|
+
c= Orange::Core.new(:opt_1 => true, "opt_4" => 'banana'){ opt_2 true }
|
144
|
+
c.options.should be_an_instance_of(Mash)
|
145
|
+
c.options[:opt_1].should == true
|
146
|
+
c.options[:opt_2].should == true
|
147
|
+
c.options[:opt_4].should == 'banana'
|
148
|
+
c.options["opt_1"].should == true
|
149
|
+
c.options["opt_2"].should == true
|
150
|
+
c.options["opt_4"].should == 'banana'
|
151
|
+
c.options.should have_key(:opt_1)
|
152
|
+
c.options.should have_key("opt_1")
|
153
|
+
c.options.should_not have_key(:opt_3)
|
154
|
+
c.options.should_not have_key("opt_3")
|
155
|
+
end
|
156
|
+
|
142
157
|
it "should load a resource when passed resource instance" do
|
143
158
|
c= Orange::Core.new
|
144
159
|
c.load(MockResource.new, :mock_one)
|
@@ -225,7 +240,7 @@ describe Orange::Core do
|
|
225
240
|
end
|
226
241
|
|
227
242
|
it "should have an options hash" do
|
228
|
-
Orange::Core.new.options.should
|
243
|
+
Orange::Core.new.options.should be_a_kind_of(Hash)
|
229
244
|
end
|
230
245
|
|
231
246
|
it "should allow access to the resources via []" do
|
@@ -1,3 +1,100 @@
|
|
1
1
|
describe Orange::Middleware::RestfulRouter do
|
2
|
-
|
2
|
+
before :all do
|
3
|
+
@router = Orange::Middleware::RestfulRouter.new(nil, Orange::Core.new)
|
4
|
+
end
|
5
|
+
before :each do
|
6
|
+
@index = empty_packet(@router.orange)
|
7
|
+
@index.orange.load(MockNestingResource.new, :products)
|
8
|
+
@index.orange.load(MockNestedResource.new, :photo)
|
9
|
+
@index.orange.load(MockCategoryResource.new, :category)
|
10
|
+
@index.orange.load(MockResource.new, :special)
|
11
|
+
@show_product_list = empty_packet(@index.orange)
|
12
|
+
@show_product_list['route.path'] = '/products'
|
13
|
+
@show_product_one = empty_packet(@index.orange)
|
14
|
+
@show_product_one['route.path'] = '/products/1'
|
15
|
+
@edit_product_two = empty_packet(@index.orange)
|
16
|
+
@edit_product_two['route.path'] = '/products/2/edit'
|
17
|
+
@edit_product_three_special = empty_packet(@index.orange)
|
18
|
+
@edit_product_three_special['route.path'] = '/products/3/edit/special'
|
19
|
+
@edit_product_three_photo = empty_packet(@index.orange)
|
20
|
+
@edit_product_three_photo['route.path'] = '/products/3/photo/edit'
|
21
|
+
@edit_product_very_nested = empty_packet(@index.orange)
|
22
|
+
@edit_product_very_nested['route.path'] = '/category/1/view/products/3/photo/edit'
|
23
|
+
@edit_product_three_photo_thumbnail = empty_packet(@index.orange)
|
24
|
+
@edit_product_three_photo_thumbnail['route.path'] = '/products/3/photo/1/edit/thumbnail'
|
25
|
+
@show_banana_list = empty_packet(@index.orange)
|
26
|
+
@show_banana_list['route.path'] = '/bananas'
|
27
|
+
end
|
28
|
+
it "should not route if other middleware has" do
|
29
|
+
@index['route.router'] = true
|
30
|
+
@show_product_list['route.router'].should == false
|
31
|
+
@router.should_receive(:pass).twice
|
32
|
+
@router.should_receive(:should_route?).once.and_return(true)
|
33
|
+
@router.packet_call(@index)
|
34
|
+
@router.packet_call(@show_product_list)
|
35
|
+
|
36
|
+
end
|
37
|
+
it "should set router" do
|
38
|
+
@router.should_receive(:pass).once
|
39
|
+
@router.should_receive(:should_route?).once.and_return(true)
|
40
|
+
@show_product_list['route.router'].should == false
|
41
|
+
@router.packet_call(@show_product_list)
|
42
|
+
@show_product_list['route.router'].should == @router
|
43
|
+
end
|
44
|
+
it "should set routing vars if should_route true" do
|
45
|
+
@router.should_receive(:pass).at_least(:once)
|
46
|
+
@router.should_receive(:should_route?).at_least(:once).and_return(true)
|
47
|
+
@router.packet_call(@show_product_list)
|
48
|
+
@show_product_list['route.resource'].should == :products
|
49
|
+
@show_product_list['route.resource_action'].should == :list
|
50
|
+
@show_product_list['route.resource_id'].should == false
|
51
|
+
@show_product_one['route.resource_path'].should == false
|
52
|
+
@router.packet_call(@show_product_one)
|
53
|
+
@show_product_one['route.resource'].should == :products
|
54
|
+
@show_product_one['route.resource_action'].should == :show
|
55
|
+
@show_product_one['route.resource_id'].should == "1"
|
56
|
+
@show_product_one['route.resource_path'].should == ""
|
57
|
+
@router.packet_call(@edit_product_two)
|
58
|
+
@edit_product_two['route.resource'].should == :products
|
59
|
+
@edit_product_two['route.resource_action'].should == :edit
|
60
|
+
@edit_product_two['route.resource_id'].should == "2"
|
61
|
+
@show_product_one['route.resource_path'].should == ""
|
62
|
+
@router.packet_call(@edit_product_three_special)
|
63
|
+
@edit_product_three_special['route.nesting'].should == []
|
64
|
+
@edit_product_three_special['route.resource'].should == :products
|
65
|
+
@edit_product_three_special['route.resource_action'].should == :edit
|
66
|
+
@edit_product_three_special['route.resource_id'].should == "3"
|
67
|
+
@edit_product_three_special['route.resource_path'].should == "/special"
|
68
|
+
end
|
69
|
+
it "should handle nesting correctly" do
|
70
|
+
@router.should_receive(:pass).at_least(:once)
|
71
|
+
@router.should_receive(:should_route?).at_least(:once).and_return(true)
|
72
|
+
@router.packet_call(@edit_product_three_special)
|
73
|
+
@edit_product_three_special['route.nesting'].should == []
|
74
|
+
@edit_product_three_special['route.resource'].should == :products
|
75
|
+
@edit_product_three_special['route.resource_action'].should == :edit
|
76
|
+
@edit_product_three_special['route.resource_id'].should == "3"
|
77
|
+
@edit_product_three_special['route.resource_path'].should == "/special"
|
78
|
+
@router.packet_call(@edit_product_three_photo)
|
79
|
+
@edit_product_three_photo['route.nesting'].should_not == []
|
80
|
+
@edit_product_three_photo['route.resource'].should == :photo
|
81
|
+
@edit_product_three_photo['route.resource_action'].should == :edit
|
82
|
+
@edit_product_three_photo['route.resource_path'].should == ""
|
83
|
+
@router.packet_call(@edit_product_very_nested)
|
84
|
+
@edit_product_very_nested['route.nesting'].length.should == 2
|
85
|
+
@edit_product_very_nested['route.resource'].should == :photo
|
86
|
+
@edit_product_very_nested['route.resource_action'].should == :edit
|
87
|
+
@edit_product_very_nested['route.resource_path'].should == ""
|
88
|
+
@edit_product_very_nested['route.nesting'].first[:resource].should == :category
|
89
|
+
@edit_product_very_nested['route.nesting'].first[:resource_action].should == :view
|
90
|
+
@edit_product_very_nested['route.nesting'].first[:resource_id].should == "1"
|
91
|
+
@router.packet_call(@edit_product_three_photo_thumbnail)
|
92
|
+
@edit_product_three_photo_thumbnail['route.nesting'].should_not == []
|
93
|
+
@edit_product_three_photo_thumbnail['route.resource'].should == :photo
|
94
|
+
@edit_product_three_photo_thumbnail['route.resource_action'].should == :edit
|
95
|
+
@edit_product_three_photo_thumbnail['route.resource_id'].should == "1"
|
96
|
+
@edit_product_three_photo_thumbnail['route.resource_path'].should == "/thumbnail"
|
97
|
+
end
|
98
|
+
|
99
|
+
|
3
100
|
end
|
@@ -2,6 +2,19 @@ class MockModelResource < Orange::ModelResource
|
|
2
2
|
use MockCarton
|
3
3
|
end
|
4
4
|
|
5
|
+
class MockNestedResource < Orange::ModelResource
|
6
|
+
nests_in :products
|
7
|
+
end
|
8
|
+
|
9
|
+
class MockNestingResource < Orange::ModelResource
|
10
|
+
nests_many :photo
|
11
|
+
nests_in :category
|
12
|
+
end
|
13
|
+
|
14
|
+
class MockCategoryResource < Orange::ModelResource
|
15
|
+
nests_many :products
|
16
|
+
end
|
17
|
+
|
5
18
|
class MockModelResourceOne < Orange::ModelResource
|
6
19
|
use MockCarton
|
7
20
|
def index(packet, *args)
|
@@ -16,4 +16,15 @@ describe Orange do
|
|
16
16
|
p.should respond_to(:pulp_orange_one)
|
17
17
|
p2.should respond_to(:pulp_orange_one)
|
18
18
|
end
|
19
|
+
it "should allow plugins" do
|
20
|
+
Orange.plugins.should have(0).items
|
21
|
+
Orange.plugin(MockPlugin.new)
|
22
|
+
Orange.plugins.should have(1).items
|
23
|
+
Orange.plugins([:foo, :bar]).should have(0).items
|
24
|
+
Orange.plugins([:mock_plugin]).should have(1).items
|
25
|
+
c= Orange::Core.new(:plugins => [:foo, :bar])
|
26
|
+
c.plugins.should have(0).items
|
27
|
+
c2= Orange::Core.new(:plugins => [:mock_plugin])
|
28
|
+
c2.plugins.should have(1).items
|
29
|
+
end
|
19
30
|
end
|
@@ -43,12 +43,6 @@ describe Orange::ModelResource do
|
|
43
43
|
}.should raise_error(RuntimeError, "I see you're using other")
|
44
44
|
end
|
45
45
|
|
46
|
-
it "shouldn't give a shit" do
|
47
|
-
lambda{
|
48
|
-
MockModelResource.shit
|
49
|
-
}.should raise_error(NoMethodError)
|
50
|
-
end
|
51
|
-
|
52
46
|
it "should call find_one if calling view_opts with is_list false" do
|
53
47
|
a= MockModelResourceOne.new
|
54
48
|
lambda{
|
@@ -91,11 +85,26 @@ describe Orange::ModelResource do
|
|
91
85
|
|
92
86
|
it "should call view_extras after during view_opts" do
|
93
87
|
a= MockModelResourceThree.new
|
88
|
+
c = Orange::Core.new
|
94
89
|
lambda{
|
95
|
-
a.view_opts(Orange::Packet.new(
|
90
|
+
a.view_opts(Orange::Packet.new(c, {}), :list, true)
|
96
91
|
}.should raise_error(RuntimeError, "calling find_extras")
|
97
92
|
end
|
98
93
|
|
94
|
+
it "should have nesting methods" do
|
95
|
+
MockModelResourceOne.should respond_to(:nests_in)
|
96
|
+
MockModelResourceOne.nests_in :foo
|
97
|
+
MockModelResourceOne.new.nested_in.should include(:foo)
|
98
|
+
MockModelResourceTwo.should respond_to(:nests_many)
|
99
|
+
MockModelResourceTwo.nests_many :bar
|
100
|
+
MockModelResourceTwo.new.nests.should have_key(:bar)
|
101
|
+
MockModelResourceTwo.should respond_to(:nests_one)
|
102
|
+
MockModelResourceTwo.nests_one :baz
|
103
|
+
MockModelResourceTwo.new.nests.should have_key(:baz)
|
104
|
+
MockModelResourceTwo.new.nests[:bar].should == :many
|
105
|
+
MockModelResourceTwo.new.nests[:baz].should == :one
|
106
|
+
end
|
107
|
+
|
99
108
|
it "should call haml parser with opts on do_view" do
|
100
109
|
c= Orange::Core.new
|
101
110
|
p= Orange::Packet.new(c, {})
|
@@ -13,7 +13,10 @@ require 'mock/mock_mixins'
|
|
13
13
|
require 'mock/mock_router'
|
14
14
|
require 'mock/mock_resource'
|
15
15
|
require 'mock/mock_middleware'
|
16
|
+
require 'mock/mock_plugin'
|
16
17
|
require 'rack/test'
|
18
|
+
require 'dm-sqlite-adapter'
|
19
|
+
DataMapper.setup(:default, "sqlite::memory:")
|
17
20
|
|
18
21
|
|
19
22
|
Spec::Runner.configure do |config|
|
@@ -161,7 +161,7 @@ describe Orange::Stack do
|
|
161
161
|
x.middlewarez.should have(1).middlewares
|
162
162
|
x.prerouting
|
163
163
|
x.middlewarez.should have(9).middlewares
|
164
|
-
x.middlewarez.select{|y| y.instance_of?(
|
164
|
+
x.middlewarez.select{|y| y.instance_of?(Orange::Middleware::AbstractFormat)}.should_not be_empty
|
165
165
|
x.middlewarez.select{|y| y.instance_of?(Orange::Middleware::RouteSite)}.should_not be_empty
|
166
166
|
end
|
167
167
|
|
@@ -189,7 +189,7 @@ describe Orange::Stack do
|
|
189
189
|
x.middlewarez.should have(1).middlewares
|
190
190
|
x.prerouting(:no_abstract_format => true)
|
191
191
|
x.middlewarez.should have(8).middlewares
|
192
|
-
x.middlewarez.select{|y| y.instance_of?(
|
192
|
+
x.middlewarez.select{|y| y.instance_of?(Orange::Middleware::AbstractFormat)}.should be_empty
|
193
193
|
x.middlewarez.select{|y| y.instance_of?(Orange::Middleware::RouteSite)}.should_not be_empty
|
194
194
|
end
|
195
195
|
|