josevalim-inherited_resources 0.9.0 → 0.9.1

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,9 @@
1
+ # Version 0.9
2
+
3
+ * Backported ActionController::Responder from Rails 3;
4
+ * Added parent_url helper;
5
+ * Added association_chain helper (as suggested by http://github.com/emmanuel);
6
+
1
7
  # Version 0.8
2
8
 
3
9
  * Fixed a small bug on optional belongs to with namespaced controllers.
@@ -1,13 +1,8 @@
1
1
  Inherited Resources
2
2
  License: MIT
3
- Version: 0.9.0
3
+ Version: 0.9.1
4
4
 
5
- You can also read this README in pretty html at the GitHub project Wiki page:
6
-
7
- http://wiki.github.com/josevalim/inherited_resources
8
-
9
- Description
10
- -----------
5
+ == Description
11
6
 
12
7
  Inherited Resources speeds up development by making your controllers inherit
13
8
  all restful actions so you just have to focus on what is important. It makes
@@ -20,8 +15,7 @@ Inherited Resources is tested and compatible with Rails 2.2.x and Rails 2.3.x.
20
15
 
21
16
  keywords: resources, controller, singleton, belongs_to, polymorphic, named_scope and I18n
22
17
 
23
- Installation
24
- ------------
18
+ == Installation
25
19
 
26
20
  Install Inherited Resources is very easy. It is stored in GitHub, so just run
27
21
  the following:
@@ -33,8 +27,7 @@ If you want it as plugin, just do:
33
27
 
34
28
  script/plugin install git://github.com/josevalim/inherited_resources.git
35
29
 
36
- Basic Usage
37
- -----------
30
+ == Basic Usage
38
31
 
39
32
  To use Inherited Resources you just have to inherit (duh) it:
40
33
 
@@ -92,8 +85,7 @@ call inherit_resources in your controller class scope:
92
85
  inherit_resources
93
86
  end
94
87
 
95
- Overwriting defaults
96
- --------------------
88
+ == Overwriting defaults
97
89
 
98
90
  Whenever you inherit from InheritedResources, several defaults are assumed.
99
91
  For example you can have an AccountsController to account management while the
@@ -146,8 +138,7 @@ You can deal with it just doing:
146
138
  end
147
139
  end
148
140
 
149
- Overwriting actions
150
- -------------------
141
+ == Overwriting actions
151
142
 
152
143
  Let's suppose that after destroying a project you want to redirect to your
153
144
  root url instead of redirecting to projects url. You just have to do:
@@ -228,8 +219,7 @@ give a block that expects two arguments, the first will be executed only in
228
219
  success scenarios and the second in failure scenarios. You keep everything
229
220
  clean and organized inside the same action.
230
221
 
231
- Some DSL
232
- --------
222
+ == Some DSL
233
223
 
234
224
  For those DSL lovers, InheritedResources won't leave you alone. You can overwrite
235
225
  your success/failure blocks straight from your class binding. For it, you just
@@ -247,8 +237,7 @@ And then you can rewrite the last example as:
247
237
  end
248
238
  end
249
239
 
250
- Flash messages and I18n
251
- -----------------------
240
+ == Flash messages and I18n
252
241
 
253
242
  Flash messages are powered by I18n api. It checks for messages in the following
254
243
  order:
@@ -311,8 +300,7 @@ the messages will be checked in the following order:
311
300
  flash.projects.create.notice
312
301
  flash.actions.create.notice
313
302
 
314
- Has Scope
315
- ---------
303
+ == Has Scope
316
304
 
317
305
  InheritedResources tries to integrate nicely with your model. In order to do so,
318
306
  it also is named_scope fluent. Let's suppose our Project model with the scopes:
@@ -352,8 +340,7 @@ per page. In such cases, you can give a proc as default value:
352
340
 
353
341
  has_scope :limit, :default => proc{|c| c.session[:limit] || 10 }
354
342
 
355
- Belongs to
356
- ----------
343
+ == Belongs to
357
344
 
358
345
  Finally, our Projects are going to get some Tasks. Then you create a
359
346
  TasksController and do:
@@ -373,8 +360,7 @@ customize how InheritedResources find your projects:
373
360
  It also accepts :route_name, :parent_class and :instance_name as options.
374
361
  Check the lib/inherited_resources/class_methods.rb for more.
375
362
 
376
- Nested belongs to
377
- -----------------
363
+ == Nested belongs to
378
364
 
379
365
  Now, our Tasks get some Comments and you need to nest even deeper. Good
380
366
  practices says that you should never nest more than two resources, but sometimes
@@ -401,8 +387,7 @@ Warning: calling several belongs_to is the same as nesting them:
401
387
 
402
388
  In other words, the code above is the same as calling nested_belongs_to.
403
389
 
404
- Polymorphic belongs to
405
- ----------------------
390
+ == Polymorphic belongs to
406
391
 
407
392
  We can go even further. Let's suppose our Projects can now have Files, Messages
408
393
  and Tasks, and they are all commentable. In this case, the best solution is to
@@ -434,8 +419,7 @@ When using polymorphic associations, you get some free helpers:
434
419
  parent_class #=> Task
435
420
  parent #=> @task
436
421
 
437
- Optional belongs to
438
- -------------------
422
+ == Optional belongs to
439
423
 
440
424
  Later you decide to create a view to show all comments, independent if they belong
441
425
  to a task, file or message. You can reuse your polymorphic controller just doing:
@@ -460,8 +444,7 @@ are available. As you expect, when no parent is found, the helpers return:
460
444
  parent_class #=> nil
461
445
  parent #=> nil
462
446
 
463
- Singletons
464
- ----------
447
+ == Singletons
465
448
 
466
449
  Now we are going to add manager to projects. We say that Manager is a singleton
467
450
  resource because a Project has just one manager. You should declare it as
@@ -477,8 +460,7 @@ option.
477
460
 
478
461
  It will deal with everything again and hide the action :index from you.
479
462
 
480
- URL Helpers
481
- -----------
463
+ == URL Helpers
482
464
 
483
465
  When you use InheritedResources it creates some URL helpers.
484
466
  And they handle everything for you. :)
@@ -490,6 +472,7 @@ And they handle everything for you. :)
490
472
  edit_resource_url # => /posts/1/comments/#{@comment.to_param}/edit
491
473
  edit_resource_url(comment) #=> /posts/1/comments/#{comment.to_param}/edit
492
474
  collection_url # => /posts/1/comments
475
+ parent_url # => /posts/1
493
476
 
494
477
  # /projects/1/tasks
495
478
  resource_url # => /projects/1/tasks/#{@task.to_param}
@@ -498,6 +481,7 @@ And they handle everything for you. :)
498
481
  edit_resource_url # => /projects/1/tasks/#{@task.to_param}/edit
499
482
  edit_resource_url(task) # => /projects/1/tasks/#{task.to_param}/edit
500
483
  collection_url # => /projects/1/tasks
484
+ parent_url # => /projects/1
501
485
 
502
486
  # /users
503
487
  resource_url # => /users/#{@user.to_param}
@@ -506,6 +490,7 @@ And they handle everything for you. :)
506
490
  edit_resource_url # => /users/#{@user.to_param}/edit
507
491
  edit_resource_url(user) # => /users/#{user.to_param}/edit
508
492
  collection_url # => /users
493
+ parent_url # => /
509
494
 
510
495
  Those urls helpers also accepts a hash as options, just as in named routes.
511
496
 
@@ -518,11 +503,10 @@ Another nice thing is that those urls are not guessed during runtime. They are
518
503
  all created when your application is loaded (except for polymorphic
519
504
  associations, that relies on Rails polymorphic_url).
520
505
 
521
- Bugs and Feedback
522
- -----------------
506
+ == Bugs and Feedback
523
507
 
524
508
  If you discover any bugs, please send an e-mail to jose.valim@plataformatec.com.br
525
509
  If you just want to give some positive feedback or drop a line, that's fine too!
526
510
 
527
- Copyright (c) 2009 José Valim
511
+ Copyright (c) 2009 José Valim<br />
528
512
  http://blog.plataformatec.com.br/
data/Rakefile CHANGED
@@ -31,7 +31,7 @@ Rake::RDocTask.new(:rdoc) do |rdoc|
31
31
  rdoc.rdoc_dir = 'rdoc'
32
32
  rdoc.title = 'InheritedResources'
33
33
  rdoc.options << '--line-numbers' << '--inline-source'
34
- rdoc.rdoc_files.include('README')
34
+ rdoc.rdoc_files.include('README.rdoc')
35
35
  rdoc.rdoc_files.include('MIT-LICENSE')
36
36
  rdoc.rdoc_files.include('lib/**/*.rb')
37
37
  end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.9.0
1
+ 0.9.1
@@ -25,7 +25,7 @@ module InheritedResources
25
25
 
26
26
  helper_method :collection_url, :collection_path, :resource_url, :resource_path,
27
27
  :new_resource_url, :new_resource_path, :edit_resource_url, :edit_resource_path,
28
- :resource, :collection, :resource_class
28
+ :parent_url, :parent_path, :resource, :collection, :resource_class, :association_chain
29
29
 
30
30
  base.with_options :instance_writer => false do |c|
31
31
  c.class_inheritable_accessor :resource_class
@@ -82,6 +82,16 @@ module InheritedResources
82
82
  false
83
83
  end
84
84
 
85
+ # Returns the association chain, with all parents (does not include the
86
+ # current resource).
87
+ #
88
+ def association_chain
89
+ @association_chain ||=
90
+ symbols_for_association_chain.inject([begin_of_association_chain]) do |chain, symbol|
91
+ chain << evaluate_parent(symbol, resources_configuration[symbol], chain.last)
92
+ end.compact.freeze
93
+ end
94
+
85
95
  # Overwrite this method to provide other interpolation options when
86
96
  # the flash message is going to be set.
87
97
  #
@@ -107,11 +117,7 @@ module InheritedResources
107
117
  # parents chain and returns the scoped association.
108
118
  #
109
119
  def end_of_association_chain #:nodoc:
110
- chain = symbols_for_association_chain.inject(begin_of_association_chain) do |chain, symbol|
111
- evaluate_parent(symbol, resources_configuration[symbol], chain)
112
- end
113
-
114
- if chain
120
+ if chain = association_chain.last
115
121
  if method_for_association_chain
116
122
  apply_scope_to(chain.send(method_for_association_chain))
117
123
  else
@@ -115,8 +115,8 @@ module InheritedResources
115
115
  #
116
116
  # * <tt>:except</tt> - In which actions the scope is not applied. By default is :none.
117
117
  #
118
- # * <tt>:key</tt> - The key in the params hash expected to find the scope.
119
- # Defaults to the scope name.
118
+ # * <tt>:as</tt> - The key in the params hash expected to find the scope.
119
+ # Defaults to the scope name.
120
120
  #
121
121
  # * <tt>:default</tt> - Default value for the scope. Whenever supplied the scope
122
122
  # is always called. This is useful to add easy pagination.
@@ -125,7 +125,12 @@ module InheritedResources
125
125
  options = scopes.extract_options!
126
126
 
127
127
  options.symbolize_keys!
128
- options.assert_valid_keys(:boolean, :key, :only, :except, :default)
128
+ options.assert_valid_keys(:boolean, :key, :only, :except, :default, :as)
129
+
130
+ if options[:key]
131
+ ActiveSupport::Deprecation.warn "has_scope :key is deprecated, use :as instead"
132
+ options[:as] ||= options[:key]
133
+ end
129
134
 
130
135
  if self.scopes_configuration.empty?
131
136
  include HasScopeHelpers
@@ -134,7 +139,7 @@ module InheritedResources
134
139
 
135
140
  scopes.each do |scope|
136
141
  self.scopes_configuration[scope] ||= {}
137
- self.scopes_configuration[scope][:key] = options[:key] || scope
142
+ self.scopes_configuration[scope][:as] = options[:as] || scope
138
143
  self.scopes_configuration[scope][:only] = Array(options[:only])
139
144
  self.scopes_configuration[scope][:except] = Array(options[:except])
140
145
  self.scopes_configuration[scope][:boolean] = options[:boolean] if options.key?(:boolean)
@@ -0,0 +1,26 @@
1
+ module InheritedResources
2
+ # Allows controllers to write actions using a class method DSL.
3
+ #
4
+ # class MyController < InheritedResources::Base
5
+ # create! do |success, failure|
6
+ # success.html { render :text => "It works!" }
7
+ # end
8
+ # end
9
+ #
10
+ module DSL
11
+ def self.included(base)
12
+ ACTIONS.each do |action|
13
+ base.class_eval <<-WRITTER
14
+ def self.#{action}!(options={}, &block)
15
+ define_method #{action.inspect}!, &block
16
+ class_eval <<-ACTION
17
+ def #{action}
18
+ super(\#{options.inspect}, &method(#{action.inspect}!))
19
+ end
20
+ ACTION
21
+ end
22
+ WRITTER
23
+ end
24
+ end
25
+ end
26
+ end
@@ -17,7 +17,7 @@ module InheritedResources
17
17
 
18
18
  self.scopes_configuration.each do |scope, options|
19
19
  next unless apply_scope_to_action?(options)
20
- key = options[:key]
20
+ key = options[:as]
21
21
 
22
22
  if params.key?(key)
23
23
  value, call_scope = params[key], true
@@ -53,32 +53,17 @@ module ActionController #:nodoc:
53
53
 
54
54
  def respond_to(*mimes, &block)
55
55
  raise ArgumentError, "respond_to takes either types or a block, never both" if mimes.any? && block_given?
56
-
57
- responder = ActionController::MimeResponds::Responder.new(self)
58
- mimes = collect_mimes_from_class_level if mimes.empty?
59
- mimes.each { |mime| responder.send(mime) }
60
- block.call(responder) if block_given?
61
-
62
- if format = responder.negotiate_mime
63
- self.response.template.template_format = format.to_sym
64
- self.response.content_type = format.to_s
65
- self.formats = [ format.to_sym ]
66
-
67
- if response = responder.response_for(format)
68
- response.call
69
- else
70
- default_render
71
- end
72
- else
73
- head :not_acceptable
56
+ if response = retrieve_response_from_mimes(mimes, &block)
57
+ response.call
74
58
  end
75
59
  end
76
60
 
77
61
  def respond_with(*resources, &block)
78
- respond_to(&block)
79
- rescue ActionView::MissingTemplate
80
- options = resources.extract_options!
81
- (options.delete(:responder) || responder).call(self, resources, options)
62
+ if response = retrieve_response_from_mimes([], &block)
63
+ options = resources.extract_options!
64
+ options.merge!(:default_response => response)
65
+ (options.delete(:responder) || responder).call(self, resources, options)
66
+ end
82
67
  end
83
68
 
84
69
  def responder
@@ -105,6 +90,26 @@ module ActionController #:nodoc:
105
90
  end
106
91
  end
107
92
  end
93
+
94
+ # Collects mimes and return the response for the negotiated format. Returns
95
+ # nil if :not_acceptable was sent to the client.
96
+ #
97
+ def retrieve_response_from_mimes(mimes, &block)
98
+ responder = ActionController::MimeResponds::Responder.new(self)
99
+ mimes = collect_mimes_from_class_level if mimes.empty?
100
+ mimes.each { |mime| responder.send(mime) }
101
+ block.call(responder) if block_given?
102
+
103
+ if format = responder.negotiate_mime
104
+ self.response.template.template_format = format.to_sym
105
+ self.response.content_type = format.to_s
106
+ self.formats = [ format.to_sym ]
107
+ responder.response_for(format) || proc { default_render }
108
+ else
109
+ head :not_acceptable
110
+ nil
111
+ end
112
+ end
108
113
  end
109
114
 
110
115
  module MimeResponds
@@ -79,15 +79,16 @@ module ActionController #:nodoc:
79
79
  # Check polymorphic_url documentation for more examples.
80
80
  #
81
81
  class Responder
82
- attr_reader :controller, :request, :format, :resource, :resource_location, :options
82
+ attr_reader :controller, :request, :format, :resource, :resources, :options
83
83
 
84
84
  def initialize(controller, resources, options={})
85
85
  @controller = controller
86
86
  @request = controller.request
87
87
  @format = controller.formats.first
88
88
  @resource = resources.is_a?(Array) ? resources.last : resources
89
- @resource_location = options[:location] || resources
89
+ @resources = resources
90
90
  @options = options
91
+ @default_response = options.delete(:default_response)
91
92
  end
92
93
 
93
94
  delegate :head, :render, :redirect_to, :to => :controller
@@ -109,8 +110,10 @@ module ActionController #:nodoc:
109
110
  # template.
110
111
  #
111
112
  def to_html
113
+ default_render
114
+ rescue ActionView::MissingTemplate
112
115
  if get?
113
- render
116
+ raise
114
117
  elsif has_errors?
115
118
  render :action => default_action
116
119
  else
@@ -118,12 +121,14 @@ module ActionController #:nodoc:
118
121
  end
119
122
  end
120
123
 
121
- # All others formats try to render the resource given instead. For this
122
- # purpose a helper called display as a shortcut to render a resource with
123
- # the current format.
124
+ # All others formats follow the procedure below. First we try to render a
125
+ # template, if the template is not available, we verify if the resource
126
+ # responds to :to_format and display it.
124
127
  #
125
128
  def to_format
126
- return render unless resourceful?
129
+ default_render
130
+ rescue ActionView::MissingTemplate
131
+ raise unless resourceful?
127
132
 
128
133
  if get?
129
134
  display resource
@@ -144,6 +149,20 @@ module ActionController #:nodoc:
144
149
  resource.respond_to?(:"to_#{format}")
145
150
  end
146
151
 
152
+ # Returns the resource location by retrieving it from the options or
153
+ # returning the resources array.
154
+ #
155
+ def resource_location
156
+ options[:location] || resources
157
+ end
158
+
159
+ # If a given response block was given, use it, otherwise call render on
160
+ # controller.
161
+ #
162
+ def default_render
163
+ @default_response.call
164
+ end
165
+
147
166
  # display is just a shortcut to render a resource with the current format.
148
167
  #
149
168
  # display @user, :status => :ok
@@ -10,13 +10,15 @@ module InheritedResources
10
10
  # new_resource_url # => /posts/1/comments/new
11
11
  # edit_resource_url # => /posts/1/comments/#{@comment.to_param}/edit
12
12
  # collection_url # => /posts/1/comments
13
+ # parent_url # => /posts/1
13
14
  #
14
15
  # # /projects/1/tasks
15
- # resource_url # => /products/1/tasks/#{@task.to_param}
16
- # resource_url(task) # => /products/1/tasks/#{task.to_param}
17
- # new_resource_url # => /products/1/tasks/new
18
- # edit_resource_url # => /products/1/tasks/#{@task.to_param}/edit
19
- # collection_url # => /products/1/tasks
16
+ # resource_url # => /projects/1/tasks/#{@task.to_param}
17
+ # resource_url(task) # => /projects/1/tasks/#{task.to_param}
18
+ # new_resource_url # => /projects/1/tasks/new
19
+ # edit_resource_url # => /projects/1/tasks/#{@task.to_param}/edit
20
+ # collection_url # => /projects/1/tasks
21
+ # parent_url # => /projects/1
20
22
  #
21
23
  # # /users
22
24
  # resource_url # => /users/#{@user.to_param}
@@ -24,6 +26,7 @@ module InheritedResources
24
26
  # new_resource_url # => /users/new
25
27
  # edit_resource_url # => /users/#{@user.to_param}/edit
26
28
  # collection_url # => /users
29
+ # parent_url # => /
27
30
  #
28
31
  # The nice thing is that those urls are not guessed during runtime. They are
29
32
  # all created when you inherit.
@@ -72,6 +75,9 @@ module InheritedResources
72
75
  collection_ivars = resource_ivars.dup
73
76
  collection_segments = resource_segments.dup
74
77
 
78
+ # Generate parent url before we add resource instances.
79
+ generate_url_and_path_helpers nil, :parent, resource_segments, resource_ivars
80
+
75
81
  # This is the default route configuration, later we have to deal with
76
82
  # exception from polymorphic and singleton cases.
77
83
  #
@@ -126,7 +132,7 @@ module InheritedResources
126
132
  # If it's not a singleton, ivars are not empty, not a collection or
127
133
  # not a "new" named route, we can pass a resource as argument.
128
134
  #
129
- unless singleton || ivars.empty? || name == :collection || prefix == :new
135
+ unless (singleton && name != :parent) || ivars.empty? || name == :collection || prefix == :new
130
136
  ivars.push "(given_args.first || #{ivars.pop})"
131
137
  end
132
138
 
@@ -0,0 +1,125 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ class Pet
4
+ def self.human_name; 'Pet'; end
5
+ end
6
+
7
+ class Puppet
8
+ def self.human_name; 'Puppet'; end
9
+ end
10
+
11
+ class PetsController < InheritedResources::Base
12
+ attr_accessor :current_user
13
+
14
+ def edit
15
+ @pet = 'new pet'
16
+ edit!
17
+ end
18
+
19
+ protected
20
+ def collection
21
+ @pets ||= end_of_association_chain.all
22
+ end
23
+
24
+ def begin_of_association_chain
25
+ @current_user
26
+ end
27
+ end
28
+
29
+ class BeginOfAssociationChainTest < ActionController::TestCase
30
+ tests PetsController
31
+
32
+ def setup
33
+ @controller.current_user = mock()
34
+ end
35
+
36
+ def test_begin_of_association_chain_is_called_on_index
37
+ @controller.current_user.expects(:pets).returns(Pet)
38
+ Pet.expects(:all).returns(mock_pet)
39
+ get :index
40
+ assert_response :success
41
+ assert_equal 'Index HTML', @response.body.strip
42
+ end
43
+
44
+ def test_begin_of_association_chain_is_called_on_new
45
+ @controller.current_user.expects(:pets).returns(Pet)
46
+ Pet.expects(:build).returns(mock_pet)
47
+ get :new
48
+ assert_response :success
49
+ assert_equal 'New HTML', @response.body.strip
50
+ end
51
+
52
+ def test_begin_of_association_chain_is_called_on_show
53
+ @controller.current_user.expects(:pets).returns(Pet)
54
+ Pet.expects(:find).with('47').returns(mock_pet)
55
+ get :show, :id => '47'
56
+ assert_response :success
57
+ assert_equal 'Show HTML', @response.body.strip
58
+ end
59
+
60
+ def test_instance_variable_should_not_be_set_if_already_defined
61
+ @controller.current_user.expects(:pets).never
62
+ Pet.expects(:find).never
63
+ get :edit
64
+ assert_response :success
65
+ assert_equal 'new pet', assigns(:pet)
66
+ end
67
+
68
+ def test_model_is_not_initialized_with_nil
69
+ @controller.current_user.expects(:pets).returns(Pet)
70
+ Pet.expects(:build).with({}).returns(mock_pet)
71
+ get :new
72
+ assert_equal mock_pet, assigns(:pet)
73
+ end
74
+
75
+ def test_begin_of_association_chain_is_included_in_chain
76
+ @controller.current_user.expects(:pets).returns(Pet)
77
+ Pet.expects(:build).with({}).returns(mock_pet)
78
+ get :new
79
+ assert_equal [@controller.current_user], @controller.send(:association_chain)
80
+ end
81
+
82
+ protected
83
+ def mock_pet(stubs={})
84
+ @mock_pet ||= mock(stubs)
85
+ end
86
+
87
+ end
88
+
89
+ class PuppetsController < InheritedResources::Base
90
+ optional_belongs_to :pet
91
+ end
92
+
93
+ class AssociationChainTest < ActionController::TestCase
94
+ tests PuppetsController
95
+
96
+ def setup
97
+ @controller.stubs(:resource_url).returns('/')
98
+ @controller.stubs(:collection_url).returns('/')
99
+ end
100
+
101
+ def test_parent_is_added_to_association_chain
102
+ Pet.expects(:find).with('37').returns(mock_pet)
103
+ mock_pet.expects(:puppets).returns(Puppet)
104
+ Puppet.expects(:find).with('42').returns(mock_puppet)
105
+ mock_puppet.expects(:destroy)
106
+ delete :destroy, :id => '42', :pet_id => '37'
107
+ assert_equal [mock_pet], @controller.send(:association_chain)
108
+ end
109
+
110
+ def test_parent_is_added_to_association_chain_if_not_available
111
+ Puppet.expects(:find).with('42').returns(mock_puppet)
112
+ mock_puppet.expects(:destroy)
113
+ delete :destroy, :id => '42'
114
+ assert_equal [], @controller.send(:association_chain)
115
+ end
116
+
117
+ protected
118
+ def mock_pet(stubs={})
119
+ @mock_pet ||= mock(stubs)
120
+ end
121
+
122
+ def mock_puppet(stubs={})
123
+ @mock_puppet ||= mock(stubs)
124
+ end
125
+ end
@@ -131,7 +131,7 @@ class HasScopeClassMethods < ActiveSupport::TestCase
131
131
  assert config.key?(:by_city)
132
132
  assert config.key?(:featured)
133
133
 
134
- assert_equal config[:by_city], { :key => :by_city, :only => [], :except => [] }
135
- assert_equal config[:featured], { :key => :by_featured, :only => [ :index ], :except => [], :boolean => true }
134
+ assert_equal config[:by_city], { :as => :by_city, :only => [], :except => [] }
135
+ assert_equal config[:featured], { :as => :by_featured, :only => [ :index ], :except => [], :boolean => true }
136
136
  end
137
137
  end
@@ -8,7 +8,7 @@ class TreesController < InheritedResources::Base
8
8
  has_scope :color
9
9
  has_scope :only_tall, :boolean => true, :only => :index
10
10
  has_scope :shadown_range, :default => 10, :except => [ :index, :show, :destroy, :new ]
11
- has_scope :root_type, :key => :root
11
+ has_scope :root_type, :as => :root
12
12
  has_scope :calculate_height, :default => proc {|c| c.session[:height] || 20 }, :only => :new
13
13
  end
14
14
 
@@ -82,6 +82,9 @@ class UrlHelpersTest < ActiveSupport::TestCase
82
82
  controller.expects("edit_house_#{path_or_url}").with(:house, {}).once
83
83
  controller.send("edit_resource_#{path_or_url}")
84
84
 
85
+ controller.expects("root_#{path_or_url}").with({}).once
86
+ controller.send("parent_#{path_or_url}")
87
+
85
88
  # With arg
86
89
  controller.expects("house_#{path_or_url}").with(:arg, {}).once
87
90
  controller.send("resource_#{path_or_url}", :arg)
@@ -114,6 +117,9 @@ class UrlHelpersTest < ActiveSupport::TestCase
114
117
  controller.expects("edit_admin_backpack_#{path_or_url}").with(:backpack, {}).once
115
118
  controller.send("edit_resource_#{path_or_url}")
116
119
 
120
+ controller.expects("admin_#{path_or_url}").with({}).once
121
+ controller.send("parent_#{path_or_url}")
122
+
117
123
  # With arg
118
124
  controller.expects("admin_backpack_#{path_or_url}").with(:arg, {}).once
119
125
  controller.send("resource_#{path_or_url}", :arg)
@@ -144,6 +150,9 @@ class UrlHelpersTest < ActiveSupport::TestCase
144
150
  controller.expects("edit_universum_#{path_or_url}").with({}).once
145
151
  controller.send("edit_resource_#{path_or_url}")
146
152
 
153
+ controller.expects("root_#{path_or_url}").with({}).once
154
+ controller.send("parent_#{path_or_url}")
155
+
147
156
  # With options
148
157
  # Also tests that argument sent are not used
149
158
  controller.expects("universum_#{path_or_url}").with(:page => 1).once
@@ -169,6 +178,9 @@ class UrlHelpersTest < ActiveSupport::TestCase
169
178
  controller.expects("edit_house_table_#{path_or_url}").with(:house, :table, {}).once
170
179
  controller.send("edit_resource_#{path_or_url}")
171
180
 
181
+ controller.expects("house_#{path_or_url}").with(:house, {}).once
182
+ controller.send("parent_#{path_or_url}")
183
+
172
184
  # With arg
173
185
  controller.expects("house_table_#{path_or_url}").with(:house, :arg, {}).once
174
186
  controller.send("resource_#{path_or_url}", :arg)
@@ -176,6 +188,9 @@ class UrlHelpersTest < ActiveSupport::TestCase
176
188
  controller.expects("edit_house_table_#{path_or_url}").with(:house, :arg, {}).once
177
189
  controller.send("edit_resource_#{path_or_url}", :arg)
178
190
 
191
+ controller.expects("house_#{path_or_url}").with(:arg, {}).once
192
+ controller.send("parent_#{path_or_url}", :arg)
193
+
179
194
  # With options
180
195
  controller.expects("house_table_#{path_or_url}").with(:house, :arg, :page => 1).once
181
196
  controller.send("resource_#{path_or_url}", :arg, :page => 1)
@@ -200,6 +215,9 @@ class UrlHelpersTest < ActiveSupport::TestCase
200
215
  controller.expects("edit_big_house_room_#{path_or_url}").with(:house, :room, {}).once
201
216
  controller.send("edit_resource_#{path_or_url}")
202
217
 
218
+ controller.expects("big_house_#{path_or_url}").with(:house, {}).once
219
+ controller.send("parent_#{path_or_url}")
220
+
203
221
  # With args
204
222
  controller.expects("big_house_room_#{path_or_url}").with(:house, :arg, {}).once
205
223
  controller.send("resource_#{path_or_url}", :arg)
@@ -207,6 +225,9 @@ class UrlHelpersTest < ActiveSupport::TestCase
207
225
  controller.expects("edit_big_house_room_#{path_or_url}").with(:house, :arg, {}).once
208
226
  controller.send("edit_resource_#{path_or_url}", :arg)
209
227
 
228
+ controller.expects("big_house_#{path_or_url}").with(:arg, {}).once
229
+ controller.send("parent_#{path_or_url}", :arg)
230
+
210
231
  # With options
211
232
  controller.expects("big_house_room_#{path_or_url}").with(:house, :arg, :page => 1).once
212
233
  controller.send("resource_#{path_or_url}", :arg, :page => 1)
@@ -232,6 +253,9 @@ class UrlHelpersTest < ActiveSupport::TestCase
232
253
  controller.expects("edit_house_table_chair_#{path_or_url}").with(:house, :table, :chair, {}).once
233
254
  controller.send("edit_resource_#{path_or_url}")
234
255
 
256
+ controller.expects("house_table_#{path_or_url}").with(:house, :table, {}).once
257
+ controller.send("parent_#{path_or_url}")
258
+
235
259
  # With args
236
260
  controller.expects("edit_house_table_chair_#{path_or_url}").with(:house, :table, :arg, {}).once
237
261
  controller.send("edit_resource_#{path_or_url}", :arg)
@@ -239,6 +263,9 @@ class UrlHelpersTest < ActiveSupport::TestCase
239
263
  controller.expects("house_table_chair_#{path_or_url}").with(:house, :table, :arg, {}).once
240
264
  controller.send("resource_#{path_or_url}", :arg)
241
265
 
266
+ controller.expects("house_table_#{path_or_url}").with(:house, :arg, {}).once
267
+ controller.send("parent_#{path_or_url}", :arg)
268
+
242
269
  # With options
243
270
  controller.expects("edit_house_table_chair_#{path_or_url}").with(:house, :table, :arg, :page => 1).once
244
271
  controller.send("edit_resource_#{path_or_url}", :arg, :page => 1)
@@ -263,6 +290,9 @@ class UrlHelpersTest < ActiveSupport::TestCase
263
290
  controller.expects("edit_house_owner_#{path_or_url}").with(:house, {}).once
264
291
  controller.send("edit_resource_#{path_or_url}")
265
292
 
293
+ controller.expects("house_#{path_or_url}").with(:house, {}).once
294
+ controller.send("parent_#{path_or_url}")
295
+
266
296
  # With options
267
297
  # Also tests that argument sent are not used
268
298
  controller.expects("house_owner_#{path_or_url}").with(:house, :page => 1).once
@@ -295,12 +325,18 @@ class UrlHelpersTest < ActiveSupport::TestCase
295
325
 
296
326
  controller.expects("edit_house_bed_#{path_or_url}").with(house, bed).once
297
327
  controller.send("edit_resource_#{path_or_url}")
328
+
329
+ controller.expects("house_#{path_or_url}").with(house).once
330
+ controller.send("parent_#{path_or_url}")
298
331
  end
299
332
 
300
333
  # With options
301
334
  controller.expects("house_bed_url").with(house, bed, :page => 1).once
302
335
  controller.send("resource_url", :page => 1)
303
336
 
337
+ controller.expects("house_url").with(house, :page => 1).once
338
+ controller.send("parent_url", :page => 1)
339
+
304
340
  # With args
305
341
  controller.expects("polymorphic_url").with([:arg, new_bed], {}).once
306
342
  controller.send("collection_url", :arg)
@@ -310,6 +346,9 @@ class UrlHelpersTest < ActiveSupport::TestCase
310
346
 
311
347
  controller.expects("edit_polymorphic_url").with([house, :arg], {}).once
312
348
  controller.send("edit_resource_url", :arg)
349
+
350
+ controller.expects("polymorphic_url").with([:arg], {}).once
351
+ controller.send("parent_url", :arg)
313
352
  end
314
353
 
315
354
  def test_url_helpers_on_namespaced_polymorphic_belongs_to
@@ -337,12 +376,18 @@ class UrlHelpersTest < ActiveSupport::TestCase
337
376
 
338
377
  controller.expects("edit_admin_house_desk_#{path_or_url}").with(house, desk).once
339
378
  controller.send("edit_resource_#{path_or_url}")
379
+
380
+ controller.expects("admin_house_#{path_or_url}").with(house).once
381
+ controller.send("parent_#{path_or_url}")
340
382
  end
341
383
 
342
384
  # With options
343
385
  controller.expects("admin_house_desk_url").with(house, desk, :page => 1).once
344
386
  controller.send("resource_url", :page => 1)
345
387
 
388
+ controller.expects("admin_house_url").with(house, :page => 1).once
389
+ controller.send("parent_url", :page => 1)
390
+
346
391
  # With args
347
392
  controller.expects("polymorphic_url").with(['admin', :arg, new_desk], {}).once
348
393
  controller.send("collection_url", :arg)
@@ -352,6 +397,9 @@ class UrlHelpersTest < ActiveSupport::TestCase
352
397
 
353
398
  controller.expects("edit_polymorphic_url").with(['admin', house, :arg], {}).once
354
399
  controller.send("edit_resource_url", :arg)
400
+
401
+ controller.expects("polymorphic_url").with(['admin', :arg], {}).once
402
+ controller.send("parent_url", :arg)
355
403
  end
356
404
 
357
405
  def test_url_helpers_on_nested_polymorphic_belongs_to
@@ -381,18 +429,27 @@ class UrlHelpersTest < ActiveSupport::TestCase
381
429
 
382
430
  controller.expects("edit_house_table_dish_#{path_or_url}").with(house, table, dish).once
383
431
  controller.send("edit_resource_#{path_or_url}")
432
+
433
+ controller.expects("house_table_#{path_or_url}").with(house, table).once
434
+ controller.send("parent_#{path_or_url}")
384
435
  end
385
436
 
386
437
  # With options
387
438
  controller.expects("house_table_dish_url").with(house, table, dish, :page => 1).once
388
439
  controller.send("resource_url", :page => 1)
389
440
 
441
+ controller.expects("house_table_url").with(house, table, :page => 1).once
442
+ controller.send("parent_url", :page => 1)
443
+
390
444
  # With args
391
445
  controller.expects("polymorphic_url").with([house, table, :arg], {}).once
392
446
  controller.send("resource_url", :arg)
393
447
 
394
448
  controller.expects("edit_polymorphic_url").with([house, table, :arg], {}).once
395
449
  controller.send("edit_resource_url", :arg)
450
+
451
+ controller.expects("polymorphic_url").with([house, :arg], {}).once
452
+ controller.send("parent_url", :arg)
396
453
  end
397
454
 
398
455
  def test_url_helpers_on_singleton_nested_polymorphic_belongs_to
@@ -421,15 +478,24 @@ class UrlHelpersTest < ActiveSupport::TestCase
421
478
 
422
479
  controller.expects("edit_house_table_center_#{path_or_url}").with(house, table).once
423
480
  controller.send("edit_resource_#{path_or_url}")
481
+
482
+ controller.expects("house_table_#{path_or_url}").with(house, table).once
483
+ controller.send("parent_#{path_or_url}")
424
484
  end
425
485
 
426
486
  # With options
427
487
  controller.expects("house_table_center_url").with(house, table, :page => 1)
428
488
  controller.send("resource_url", :page => 1)
429
489
 
490
+ controller.expects("house_table_url").with(house, table, :page => 1)
491
+ controller.send("parent_url", :page => 1)
492
+
430
493
  # With args
431
494
  controller.expects("polymorphic_url").with([house, table, :center], {}).once
432
495
  controller.send("resource_url", :arg)
496
+
497
+ controller.expects("polymorphic_url").with([house, :arg], {}).once
498
+ controller.send("parent_url", :arg)
433
499
  end
434
500
 
435
501
  def test_url_helpers_on_optional_polymorphic_belongs_to
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: josevalim-inherited_resources
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 0.9.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - "Jos\xC3\xA9 Valim"
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-08-25 00:00:00 -07:00
12
+ date: 2009-09-01 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -20,11 +20,11 @@ executables: []
20
20
  extensions: []
21
21
 
22
22
  extra_rdoc_files:
23
- - README
23
+ - README.rdoc
24
24
  files:
25
25
  - CHANGELOG
26
26
  - MIT-LICENSE
27
- - README
27
+ - README.rdoc
28
28
  - Rakefile
29
29
  - VERSION
30
30
  - lib/inherited_resources.rb
@@ -33,6 +33,7 @@ files:
33
33
  - lib/inherited_resources/base_helpers.rb
34
34
  - lib/inherited_resources/belongs_to_helpers.rb
35
35
  - lib/inherited_resources/class_methods.rb
36
+ - lib/inherited_resources/dsl.rb
36
37
  - lib/inherited_resources/dumb_responder.rb
37
38
  - lib/inherited_resources/has_scope_helpers.rb
38
39
  - lib/inherited_resources/legacy/respond_to.rb
@@ -40,8 +41,9 @@ files:
40
41
  - lib/inherited_resources/polymorphic_helpers.rb
41
42
  - lib/inherited_resources/singleton_helpers.rb
42
43
  - lib/inherited_resources/url_helpers.rb
43
- has_rdoc: true
44
+ has_rdoc: false
44
45
  homepage: http://github.com/josevalim/inherited_resources
46
+ licenses:
45
47
  post_install_message:
46
48
  rdoc_options:
47
49
  - --charset=UTF-8
@@ -62,7 +64,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
62
64
  requirements: []
63
65
 
64
66
  rubyforge_project: inherited_resources
65
- rubygems_version: 1.2.0
67
+ rubygems_version: 1.3.5
66
68
  signing_key:
67
69
  specification_version: 3
68
70
  summary: Inherited Resources speeds up development by making your controllers inherit all restful actions so you just have to focus on what is important.
@@ -74,10 +76,10 @@ test_files:
74
76
  - test/redirect_to_test.rb
75
77
  - test/has_scope_test.rb
76
78
  - test/class_methods_test.rb
79
+ - test/association_chain_test.rb
77
80
  - test/aliases_test.rb
78
81
  - test/flash_test.rb
79
82
  - test/url_helpers_test.rb
80
- - test/base_helpers_test.rb
81
83
  - test/belongs_to_test.rb
82
84
  - test/polymorphic_test.rb
83
85
  - test/defaults_test.rb
@@ -1,77 +0,0 @@
1
- require File.dirname(__FILE__) + '/test_helper'
2
-
3
- class Pet
4
- def self.human_name; 'Pet'; end
5
- end
6
-
7
- class PetsController < InheritedResources::Base
8
- attr_accessor :current_user
9
-
10
- def edit
11
- @pet = 'new pet'
12
- edit!
13
- end
14
-
15
- protected
16
- def collection
17
- @pets ||= end_of_association_chain.all
18
- end
19
-
20
- def begin_of_association_chain
21
- @current_user
22
- end
23
- end
24
-
25
- class AssociationChainBaseHelpersTest < ActionController::TestCase
26
- tests PetsController
27
-
28
- def setup
29
- @controller.current_user = mock()
30
- end
31
-
32
- def test_begin_of_association_chain_is_called_on_index
33
- @controller.current_user.expects(:pets).returns(Pet)
34
- Pet.expects(:all).returns(mock_pet)
35
- get :index
36
- assert_response :success
37
- assert 'Index HTML', @response.body.strip
38
- end
39
-
40
- def test_begin_of_association_chain_is_called_on_new
41
- @controller.current_user.expects(:pets).returns(Pet)
42
- Pet.expects(:build).returns(mock_pet)
43
- get :new
44
- assert_response :success
45
- assert 'New HTML', @response.body.strip
46
- end
47
-
48
- def test_begin_of_association_chain_is_called_on_show
49
- @controller.current_user.expects(:pets).returns(Pet)
50
- Pet.expects(:find).with('47').returns(mock_pet)
51
- get :show, :id => '47'
52
- assert_response :success
53
- assert 'Show HTML', @response.body.strip
54
- end
55
-
56
- def test_instance_variable_should_not_be_set_if_already_defined
57
- @controller.current_user.expects(:pets).never
58
- Pet.expects(:find).never
59
- get :edit
60
- assert_response :success
61
- assert_equal 'new pet', assigns(:pet)
62
- end
63
-
64
- def test_model_is_not_initialized_with_nil
65
- @controller.current_user.expects(:pets).returns(Pet)
66
- Pet.expects(:build).with({}).returns(mock_pet)
67
- get :new
68
- assert mock_pet, assigns(:pet)
69
- end
70
-
71
- protected
72
- def mock_pet(stubs={})
73
- @mock_pet ||= mock(stubs)
74
- end
75
-
76
- end
77
-