Commit 4ecfeb625d4ddb8a58b1357a4a3b0d460689099e

Authored by Daniela Feitosa
2 parents c4b1d0eb e414cf56

Merge commit 'refs/merge-requests/17' of git://gitorious.org/noosfero/noosfero i…

…nto merge-requests/17
app/helpers/application_helper.rb
@@ -255,30 +255,47 @@ module ApplicationHelper @@ -255,30 +255,47 @@ module ApplicationHelper
255 concat(content_tag('div', capture(&block) + tag('br', :style => 'clear: left;'), { :class => 'button-bar' }.merge(options)), block.binding) 255 concat(content_tag('div', capture(&block) + tag('br', :style => 'clear: left;'), { :class => 'button-bar' }.merge(options)), block.binding)
256 end 256 end
257 257
258 - def partial_for_class(klass)  
259 - if klass.nil?  
260 - raise ArgumentError, 'No partial for object. Is there a partial for any class in the inheritance hierarchy?'  
261 - end 258 + VIEW_EXTENSIONS = %w[.rhtml .html.erb]
262 259
  260 + def partial_for_class_in_view_path(klass, view_path)
  261 + return nil if klass.nil?
263 name = klass.name.underscore 262 name = klass.name.underscore
264 - if File.exists?(File.join(RAILS_ROOT, 'app', 'views', params[:controller], "_#{name}.rhtml"))  
265 - name 263 +
  264 + search_name = String.new(name)
  265 + if search_name.include?("/")
  266 + search_name.gsub!(/(\/)([^\/]*)$/,'\1_\2')
  267 + name = File.join(params[:controller], name)
266 else 268 else
267 - partial_for_class(klass.superclass) 269 + search_name = "_" + search_name
  270 + end
  271 +
  272 + VIEW_EXTENSIONS.each do |ext|
  273 + return name if File.exists?(File.join(view_path, params[:controller], search_name+ext))
268 end 274 end
  275 +
  276 + partial_for_class_in_view_path(klass.superclass, view_path)
269 end 277 end
270 278
271 - def partial_for_task_class(klass, action)  
272 - if klass.nil?  
273 - raise ArgumentError, 'No partial for object. Is there a partial for any class in the inheritance hierarchy?' 279 + def partial_for_class(klass)
  280 + raise ArgumentError, 'No partial for object. Is there a partial for any class in the inheritance hierarchy?' if klass.nil?
  281 + name = klass.name.underscore
  282 + @controller.view_paths.each do |view_path|
  283 + partial = partial_for_class_in_view_path(klass, view_path)
  284 + return partial if partial
274 end 285 end
275 286
  287 + raise ArgumentError, 'No partial for object. Is there a partial for any class in the inheritance hierarchy?'
  288 + end
  289 +
  290 + def partial_for_task_class(klass, action)
  291 + raise ArgumentError, 'No partial for object. Is there a partial for any class in the inheritance hierarchy?' if klass.nil?
  292 +
276 name = "#{klass.name.underscore}_#{action.to_s}" 293 name = "#{klass.name.underscore}_#{action.to_s}"
277 - if File.exists?(File.join(RAILS_ROOT, 'app', 'views', params[:controller], "_#{name}.rhtml"))  
278 - name  
279 - else  
280 - partial_for_task_class(klass.superclass, action) 294 + VIEW_EXTENSIONS.each do |ext|
  295 + return name if File.exists?(File.join(RAILS_ROOT, 'app', 'views', params[:controller], '_'+name+ext))
281 end 296 end
  297 +
  298 + partial_for_task_class(klass.superclass, action)
282 end 299 end
283 300
284 def user 301 def user
test/unit/application_helper_test.rb
@@ -8,16 +8,49 @@ class ApplicationHelperTest < Test::Unit::TestCase @@ -8,16 +8,49 @@ class ApplicationHelperTest < Test::Unit::TestCase
8 self.stubs(:session).returns({}) 8 self.stubs(:session).returns({})
9 end 9 end
10 10
11 - should 'calculate correctly partial for object' do 11 + should 'calculate correctly partial for models' do
  12 + p1 = 'path1/'
  13 + p2 = 'path2/'
  14 + @controller = mock()
  15 + @controller.stubs(:view_paths).returns([p1,p2])
  16 +
12 self.stubs(:params).returns({:controller => 'test'}) 17 self.stubs(:params).returns({:controller => 'test'})
13 18
14 - File.expects(:exists?).with("#{RAILS_ROOT}/app/views/test/_float.rhtml").returns(false)  
15 - File.expects(:exists?).with("#{RAILS_ROOT}/app/views/test/_numeric.rhtml").returns(true).times(2)  
16 - File.expects(:exists?).with("#{RAILS_ROOT}/app/views/test/_runtime_error.rhtml").returns(true).at_least_once 19 + File.expects(:exists?).with(p1+"test/_integer.rhtml").returns(true)
  20 +
  21 + File.expects(:exists?).with(p1+"test/_float.rhtml").returns(false)
  22 + File.expects(:exists?).with(p1+"test/_float.html.erb").returns(false)
  23 + File.expects(:exists?).with(p2+"test/_float.rhtml").returns(false)
  24 + File.expects(:exists?).with(p2+"test/_float.html.erb").returns(false)
  25 + File.expects(:exists?).with(p1+"test/_numeric.rhtml").returns(false)
  26 + File.expects(:exists?).with(p1+"test/_object.rhtml").returns(false)
  27 + File.expects(:exists?).with(p1+"test/_object.html.erb").returns(false)
  28 + File.expects(:exists?).with(p1+"test/_numeric.html.erb").returns(false)
  29 + File.expects(:exists?).with(p2+"test/_numeric.rhtml").returns(true)
  30 +
  31 + File.expects(:exists?).with(p1+"test/_object.rhtml").returns(false)
  32 + File.expects(:exists?).with(p1+"test/_object.html.erb").returns(false)
  33 + File.expects(:exists?).with(p2+"test/_object.rhtml").returns(false)
  34 + File.expects(:exists?).with(p2+"test/_object.html.erb").returns(false)
17 35
  36 + assert_equal 'integer', partial_for_class(Integer)
18 assert_equal 'numeric', partial_for_class(Float) 37 assert_equal 'numeric', partial_for_class(Float)
19 - assert_equal 'numeric', partial_for_class(Numeric)  
20 - assert_equal 'runtime_error', partial_for_class(RuntimeError) 38 + assert_raises ArgumentError do
  39 + partial_for_class(Object)
  40 + end
  41 + end
  42 +
  43 + should 'calculate correctly partial for namespaced models' do
  44 + p = 'path/'
  45 + @controller = mock()
  46 + @controller.stubs(:view_paths).returns([p])
  47 + self.stubs(:params).returns({:controller => 'test'})
  48 +
  49 + class School; class Project; end; end
  50 +
  51 + File.expects(:exists?).with(p+"test/application_helper_test/school/_project.rhtml").returns(true)
  52 +
  53 + assert_equal 'test/application_helper_test/school/project', partial_for_class(School::Project)
21 end 54 end
22 55
23 should 'give error when there is no partial for class' do 56 should 'give error when there is no partial for class' do