puffer 0.0.29 → 0.0.30

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 (85) hide show
  1. data/Gemfile +1 -0
  2. data/Gemfile.lock +56 -52
  3. data/README.md +51 -43
  4. data/VERSION +1 -1
  5. data/app/assets/javascripts/puffer/application.js +3 -1
  6. data/app/assets/stylesheets/puffer/application.css +2 -0
  7. data/app/assets/stylesheets/puffer/puffer.css +5 -9
  8. data/app/components/base_component.rb +0 -1
  9. data/app/components/boolean/index.html.erb +1 -1
  10. data/app/components/boolean_component.rb +1 -1
  11. data/app/components/references_many/index.html.erb +1 -0
  12. data/app/components/references_many_component.rb +8 -0
  13. data/app/components/references_one_component.rb +6 -1
  14. data/app/components/select/filter.html.erb +2 -0
  15. data/app/components/select/form.html.erb +1 -1
  16. data/app/components/select_component.rb +13 -2
  17. data/app/controllers/admin/puffer_users_controller.rb +5 -1
  18. data/app/controllers/admin/sessions_controller.rb +4 -1
  19. data/app/controllers/puffer/base.rb +1 -1
  20. data/app/controllers/puffer/sessions_base.rb +3 -0
  21. data/app/controllers/puffer/tree_base.rb +4 -4
  22. data/app/helpers/puffer_helper.rb +16 -15
  23. data/app/models/puffer/puffer_user.rb +11 -10
  24. data/app/models/puffer_user.rb +14 -2
  25. data/app/views/layouts/puffer.html.erb +16 -17
  26. data/app/views/layouts/puffer_base.html.erb +1 -2
  27. data/app/views/layouts/puffer_dashboard.html.erb +2 -2
  28. data/app/views/puffer/base/edit.html.erb +12 -3
  29. data/app/views/puffer/base/new.html.erb +12 -3
  30. data/app/views/puffer/dashboard_base/index.html.erb +5 -5
  31. data/lib/generators/puffer/component/component_generator.rb +0 -1
  32. data/lib/generators/puffer/controller/controller_generator.rb +1 -1
  33. data/lib/generators/puffer/controller/templates/controller.rb +8 -0
  34. data/lib/puffer.rb +77 -13
  35. data/lib/puffer/component.rb +14 -9
  36. data/lib/puffer/controller/auth.rb +41 -2
  37. data/lib/puffer/controller/config.rb +1 -1
  38. data/lib/puffer/controller/mutate.rb +15 -6
  39. data/lib/puffer/extensions/core.rb +4 -0
  40. data/lib/puffer/extensions/directive_processor.rb +36 -0
  41. data/lib/puffer/extensions/form.rb +1 -1
  42. data/lib/puffer/extensions/mapper.rb +74 -149
  43. data/lib/puffer/field.rb +2 -4
  44. data/lib/puffer/field_set.rb +3 -15
  45. data/lib/puffer/filters.rb +105 -0
  46. data/lib/puffer/orm_adapter/active_record.rb +33 -0
  47. data/lib/puffer/orm_adapter/base.rb +4 -0
  48. data/lib/puffer/orm_adapter/mongoid.rb +29 -0
  49. data/lib/puffer/resource.rb +63 -62
  50. data/lib/puffer/resource/node.rb +71 -0
  51. data/lib/puffer/resource/routing.rb +4 -4
  52. data/lib/puffer/resource/tree.rb +36 -0
  53. data/puffer.gemspec +28 -8
  54. data/spec/dummy/app/controllers/admin/posts_controller.rb +1 -1
  55. data/spec/dummy/app/controllers/admin/users_controller.rb +1 -0
  56. data/spec/dummy/app/controllers/application_controller.rb +4 -0
  57. data/spec/dummy/app/controllers/orms/active_record_orm_primals_controller.rb +36 -0
  58. data/spec/dummy/app/controllers/orms/mongoid_orm_primals_controller.rb +42 -0
  59. data/spec/dummy/app/models/active_record_orm.rb +5 -0
  60. data/spec/dummy/app/models/active_record_orm/primal.rb +2 -0
  61. data/spec/dummy/app/models/{mongoid_test.rb → mongoid_orm.rb} +1 -1
  62. data/spec/dummy/app/models/mongoid_orm/primal.rb +46 -0
  63. data/spec/dummy/config/environments/development.rb +3 -0
  64. data/spec/dummy/config/routes.rb +2 -1
  65. data/spec/dummy/db/migrate/20110930183902_create_active_record_orm_primals.rb +17 -0
  66. data/spec/dummy/db/schema.rb +15 -1
  67. data/spec/fabricators/active_record_orm/primal.rb +13 -0
  68. data/spec/fabricators/mongoid_orm/primal.rb +12 -0
  69. data/spec/generators/puffer/component/component_generator_spec.rb +32 -0
  70. data/spec/generators/puffer/controller/controller_generator_spec.rb +31 -0
  71. data/spec/helpers/puffer_helper_spec.rb +62 -0
  72. data/spec/lib/filters_spec.rb +21 -0
  73. data/spec/lib/orm_adapter/active_record_spec.rb +33 -0
  74. data/spec/lib/orm_adapter/base_shared.rb +97 -0
  75. data/spec/lib/orm_adapter/mongoid_spec.rb +46 -0
  76. data/spec/lib/resource/routing_spec.rb +5 -5
  77. data/spec/lib/resource/tree_spec.rb +31 -0
  78. data/spec/lib/resource_spec.rb +36 -37
  79. data/spec/spec_helper.rb +3 -2
  80. metadata +71 -43
  81. data/app/views/puffer/base/_form.html.erb +0 -11
  82. data/lib/generators/puffer/component/templates/component_spec.rb +0 -19
  83. data/lib/puffer/resource/scoping.rb +0 -19
  84. data/spec/dummy/app/controllers/orms/mongoid_tests_controller.rb +0 -19
  85. data/spec/lib/params_spec.rb +0 -120
@@ -0,0 +1,12 @@
1
+ Fabricator :mongoid_orm_primal, :class_name => 'mongoid_orm/primal' do
2
+ string_field { Forgery::LoremIpsum.sentence }
3
+ symbol_filed { Forgery::LoremIpsum.word.to_sym }
4
+ select_field { sequence(:select_field) {|i| "option #{i}" } }
5
+ integer_field { sequence :integer_field }
6
+ float_field { sequence :float_field }
7
+ decimal_field { sequence :decimal_field }
8
+ datetime_field { sequence(:datetime_field) {|i| DateTime.now + i.days } }
9
+ time_field { sequence(:time_field) {|i| DateTime.now + i.hours } }
10
+ date_field { sequence(:date_field) {|i| DateTime.now + i.days } }
11
+ boolean_field { rand 2 }
12
+ end
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+
3
+ # Generators are not automatically loaded by Rails
4
+ require 'generators/puffer/component/component_generator'
5
+
6
+ describe Puffer::ComponentGenerator do
7
+ before { run_generator %w(password) }
8
+
9
+ describe 'app/components/password_component.rb' do
10
+ subject { file('app/components/password_component.rb') }
11
+ it { should exist }
12
+ it { should contain "class PasswordComponent < Puffer::Component::Base" }
13
+ end
14
+
15
+ describe 'app/components/password/index.html.erb' do
16
+ subject { file('app/components/password/index.html.erb') }
17
+ it { should exist }
18
+ it { should contain "# I'm index" }
19
+ end
20
+
21
+ describe 'app/components/password/form.html.erb' do
22
+ subject { file('app/components/password/form.html.erb') }
23
+ it { should exist }
24
+ it { should contain "# I'm form" }
25
+ end
26
+
27
+ describe 'app/components/password/filter.html.erb' do
28
+ subject { file('app/components/password/filter.html.erb') }
29
+ it { should exist }
30
+ it { should contain "# I'm filter" }
31
+ end
32
+ end
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ # Generators are not automatically loaded by Rails
4
+ require 'generators/puffer/controller/controller_generator'
5
+
6
+ describe Puffer::ControllerGenerator do
7
+ describe 'controller namespaced in admin module added by default' do
8
+ before { run_generator %w(User name:string email:string) }
9
+
10
+ describe 'app/controllers/admin/users_controller.rb' do
11
+ subject { file('app/controllers/admin/users_controller.rb') }
12
+ it { should exist }
13
+ it { should contain "class Admin::UsersController < Puffer::Base" }
14
+ it { should contain "# field :id" }
15
+ it { should contain "field :email" }
16
+ it { should contain "field :password" }
17
+ it { should contain "# field :created_at" }
18
+ it { should contain "# field :updated_at" }
19
+ end
20
+ end
21
+
22
+ describe 'controller namespace can be specified in admin module added by default' do
23
+ before { run_generator %w(Moderator::User name:string email:string) }
24
+
25
+ describe 'app/controllers/moderator/users_controller.rb' do
26
+ subject { file('app/controllers/moderator/users_controller.rb') }
27
+ it { should exist }
28
+ it { should contain "class Moderator::UsersController < Puffer::Base" }
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,62 @@
1
+ require 'spec_helper'
2
+
3
+ # Specs in this file have access to a helper object that includes
4
+ # the PufferHelper. For example:
5
+ #
6
+ # describe PufferHelper do
7
+ # describe "string concat" do
8
+ # it "concats two strings with spaces" do
9
+ # helper.concat_strings("this","that").should == "this that"
10
+ # end
11
+ # end
12
+ # end
13
+ describe PufferHelper do
14
+
15
+ it "generates scopes navigation" do
16
+ helper.stub(:puffer_namespace).and_return(:admin)
17
+
18
+ navigation = []
19
+ helper.puffer_scopes_navigation do |*args|
20
+ navigation.push args
21
+ end
22
+
23
+ navigation.should == [
24
+ [:admin, "/admin", true],
25
+ [:orms, "/orms", false]
26
+ ]
27
+ end
28
+
29
+ it "generates groups navigation" do
30
+ helper.stub(:puffer_namespace).and_return(:admin)
31
+ helper.stub(:resource).and_return mock(:resource_node => mock, :root => mock(:resource_node => mock(:group => :posting)))
32
+
33
+ navigation = []
34
+ helper.puffer_groups_navigation do |*args|
35
+ navigation.push args
36
+ end
37
+
38
+ navigation.should == [
39
+ [:users, "/admin/users", false],
40
+ [:posting, "/admin/posts", true],
41
+ [:news, "/admin/news", false]
42
+ ]
43
+ end
44
+
45
+ it "generates resources navigation" do
46
+ helper.stub(:puffer_namespace).and_return(:admin)
47
+ helper.stub(:configuration).and_return mock(:group => :posting)
48
+ helper.stub(:resource).and_return mock(:resource_node => mock, :root => mock(:resource_node => Rails.application.routes.resources_tree[15]))
49
+
50
+ navigation = []
51
+ helper.puffer_resources_navigation do |*args|
52
+ navigation.push args
53
+ end
54
+
55
+ navigation.should == [
56
+ ["Post", "/admin/posts", false],
57
+ ["Tagged post", "/admin/tagged_posts", false],
58
+ ["Category", "/admin/categories", true]
59
+ ]
60
+ end
61
+
62
+ end
@@ -0,0 +1,21 @@
1
+ require 'spec_helper'
2
+
3
+ describe Puffer::Filters do
4
+
5
+ describe 'controller filters class generation' do
6
+
7
+ it 'should generate class with proper name' do
8
+ Puffer::Filters.controller_filters(Admin::UsersController).should == Admin::UsersControllerFilters
9
+ end
10
+
11
+ it 'should return Puffer::Filters subclass' do
12
+ Puffer::Filters.controller_filters(Admin::UsersController).superclass.should == Puffer::Filters
13
+ end
14
+
15
+ it 'should set proper attributes' do
16
+ Puffer::Filters.controller_filters(Admin::PostsController).new.attributes.keys.should == %w(user.email status title body puffer_search puffer_order)
17
+ end
18
+
19
+ end
20
+
21
+ end
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+ require 'lib/orm_adapter/base_shared'
3
+
4
+ describe "ActiveRecordOrm" do
5
+
6
+ describe 'columns_hash' do
7
+ it 'should be proper' do
8
+ ActiveRecordOrm::Primal.to_adapter.columns_hash.should == {
9
+ "id" => {:type => :integer},
10
+ "string_field" => {:type => :string},
11
+ "text_field" => {:type => :text},
12
+ "select_field" => {:type => :string},
13
+ "integer_field" => {:type => :integer},
14
+ "float_field" => {:type => :float},
15
+ "decimal_field" => {:type => :decimal},
16
+ "datetime_field" => {:type => :datetime},
17
+ "timestamp_field" => {:type => :datetime},
18
+ "time_field" => {:type => :time},
19
+ "date_field" => {:type => :date},
20
+ "boolean_field" => {:type => :boolean}
21
+ }
22
+ end
23
+ end
24
+
25
+ describe 'filter' do
26
+ it_should_behave_like "an adapter" do
27
+ let(:model) {ActiveRecordOrm::Primal}
28
+ let(:fabric) {:active_record_orm_primal}
29
+ let(:controller) {Orms::ActiveRecordOrmPrimalsController}
30
+ end
31
+ end
32
+
33
+ end
@@ -0,0 +1,97 @@
1
+ require 'spec_helper'
2
+
3
+ shared_examples "an adapter" do
4
+
5
+ def filter options = {}
6
+ model.to_adapter.filter(model, controller.index_fields, options).all.to_a
7
+ end
8
+
9
+
10
+ def nth *indexes
11
+ model.all.to_a.values_at *indexes
12
+ end
13
+
14
+ context 'without params' do
15
+
16
+ before do
17
+ 5.times { Fabricate fabric }
18
+ end
19
+
20
+ it 'should return all records' do
21
+ filter.should == model.all.to_a
22
+ end
23
+
24
+ end
25
+
26
+ context 'search' do
27
+
28
+ before do
29
+ string_fields = %w(hello hello world hello world)
30
+ select_fields = %w(hello world helloworld hello world)
31
+ 5.times { |i|
32
+ Fabricate fabric, :string_field => string_fields[i], :select_field => select_fields[i]
33
+ }
34
+ end
35
+
36
+ it 'should return all searched records' do
37
+ filter(:search => 'hel').should == nth(0, 1, 2, 3)
38
+ end
39
+
40
+ it 'should return searched records without conditioned' do
41
+ filter(:search => 'hel', :conditions => {'select_field' => 'hello'}).should == nth(0, 3)
42
+ end
43
+
44
+ it 'should return searched records without conditioned' do
45
+ filter(:search => 'hel', :conditions => {'select_field' => 'world'}).should == nth(1)
46
+ end
47
+
48
+ end
49
+
50
+ context 'select' do
51
+
52
+ before do
53
+ select_fields = %w(hello world hello hello world)
54
+ boolean_fields = %w(true false false true false)
55
+ 5.times { |i|
56
+ Fabricate fabric, :select_field => select_fields[i], :boolean_field => boolean_fields[i]
57
+ }
58
+ end
59
+
60
+ it 'should return all conditioned records' do
61
+ filter(:conditions => {'select_field' => 'hello'}).should == nth(0, 2, 3)
62
+ end
63
+
64
+ it 'should return all conditioned records' do
65
+ filter(:conditions => {'boolean_field' => false}).should == nth(1, 2, 4)
66
+ end
67
+
68
+ it 'should stack conditions with end' do
69
+ filter(:conditions => {'select_field' => 'hello', 'boolean_field' => true}).should == nth(0, 3)
70
+ end
71
+
72
+ end
73
+
74
+ context 'order' do
75
+
76
+ before do
77
+ integer_fields = %w(2, 3, 5, 4, 1)
78
+ 5.times { |i|
79
+ Fabricate fabric, :integer_field => integer_fields[i]
80
+ }
81
+ end
82
+
83
+ it 'should order records asc' do
84
+ filter(:order => 'integer_field').should == nth(4, 0, 1, 3, 2)
85
+ end
86
+
87
+ it 'should order records asc' do
88
+ filter(:order => ['integer_field', :asc]).should == nth(4, 0, 1, 3, 2)
89
+ end
90
+
91
+ it 'should order records desc' do
92
+ filter(:order => ['integer_field', :desc]).should == nth(2, 3, 1, 0, 4)
93
+ end
94
+
95
+ end
96
+
97
+ end
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+ require 'lib/orm_adapter/base_shared'
3
+
4
+ describe "MongoidOrm" do
5
+
6
+ describe 'columns_hash' do
7
+ it 'should be proper' do
8
+ MongoidOrm::Primal.to_adapter.columns_hash.should == {
9
+ "_type" => {:type => :string},
10
+ "_id" => {:type => :"bson/object_id"},
11
+ "string_field" => {:type => :string},
12
+ "symbol_field" => {:type => :symbol},
13
+ "select_field" => {:type => :string},
14
+ "integer_field" => {:type => :integer},
15
+ "float_field" => {:type => :float},
16
+ "decimal_field" => {:type => :big_decimal},
17
+ "datetime_field" => {:type => :date_time},
18
+ "time_field" => {:type => :time},
19
+ "date_field" => {:type => :date},
20
+ "boolean_field" => {:type => :boolean},
21
+ "array_field" => {:type => :array},
22
+ "hash_field" => {:type => :hash},
23
+ "set_field" => {:type => :set},
24
+ "range_field" => {:type => :range}
25
+ }
26
+ end
27
+ end
28
+
29
+ describe 'filter' do
30
+ it_should_behave_like "an adapter" do
31
+ def filter options = {}
32
+ model.to_adapter.filter(model, controller.index_fields, options).order([:_id, :asc]).all.to_a
33
+ end
34
+
35
+
36
+ def nth *indexes
37
+ model.where.order([:_id, :asc]).all.to_a.values_at *indexes
38
+ end
39
+
40
+ let(:model) {MongoidOrm::Primal}
41
+ let(:fabric) {:mongoid_orm_primal}
42
+ let(:controller) {Orms::MongoidOrmPrimalsController}
43
+ end
44
+ end
45
+
46
+ end
@@ -9,7 +9,7 @@ describe Puffer::Resource do
9
9
  @mock_category = mock_model Category, :id => 42
10
10
 
11
11
  get admin_category_path(@category)
12
- resource = Puffer::Resource.new request.params.merge(:controller => 'admin/categories', :action => 'show'), controller
12
+ resource = controller.resource
13
13
 
14
14
  resource.collection_path.should == admin_categories_path
15
15
  resource.member_path.should == admin_category_path(@category)
@@ -24,7 +24,7 @@ describe Puffer::Resource do
24
24
  @mock_news = mock_model News, :id => 42
25
25
 
26
26
  get admin_news_path(@news)
27
- resource = Puffer::Resource.new request.params.merge(:controller => 'admin/news', :action => 'show'), controller
27
+ resource = controller.resource
28
28
 
29
29
  resource.collection_path.should == admin_news_index_path
30
30
  resource.member_path.should == admin_news_path(@news)
@@ -40,7 +40,7 @@ describe Puffer::Resource do
40
40
  @mock_category = mock_model Category, :id => 42
41
41
 
42
42
  get admin_post_category_path(@post, @category)
43
- resource = Puffer::Resource.new request.params.merge(:controller => 'admin/categories', :action => 'show'), controller
43
+ resource = controller.resource
44
44
 
45
45
  resource.collection_path.should == admin_post_categories_path(@post)
46
46
  resource.member_path.should == admin_post_category_path(@post, @category)
@@ -55,7 +55,7 @@ describe Puffer::Resource do
55
55
  @profile = @user.profile
56
56
 
57
57
  get admin_user_profile_path(@user)
58
- resource = Puffer::Resource.new request.params.merge(:controller => 'admin/profiles', :action => 'show'), controller
58
+ resource = controller.resource
59
59
 
60
60
  resource.collection_path.should == admin_user_profile_path(@user)
61
61
  resource.member_path.should == admin_user_profile_path(@user)
@@ -69,7 +69,7 @@ describe Puffer::Resource do
69
69
  @mock_tag = mock_model Tag, :id => 42
70
70
 
71
71
  get admin_user_profile_tag_path(@user, @tag)
72
- resource = Puffer::Resource.new request.params.merge(:controller => 'admin/tags', :action => 'show'), controller
72
+ resource = controller.resource
73
73
 
74
74
  resource.collection_path.should == admin_user_profile_tags_path(@user)
75
75
  resource.member_path.should == admin_user_profile_tag_path(@user, @tag)
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Tree" do
4
+
5
+ it "should generate proper tree" do
6
+ Rails.application.routes.resources_tree.map(&:to_struct).should == [
7
+ {:scope => :admin, :current => :users, :children => [:profile, :posts], :ancestors => []},
8
+ {:scope => :admin, :current => :profile, :children => [:tags], :ancestors => [:users]},
9
+ {:scope => :admin, :current => :tags, :children => [], :ancestors => [:users, :profile]},
10
+ {:scope => :admin, :current => :posts, :children => [:categories, :tags], :ancestors => [:users]},
11
+ {:scope => :admin, :current => :categories, :children => [], :ancestors => [:users, :posts]},
12
+ {:scope => :admin, :current => :tags, :children => [], :ancestors => [:users, :posts]},
13
+ {:scope => :admin, :current => :profiles, :children => [:tags], :ancestors => []},
14
+ {:scope => :admin, :current => :tags, :children => [], :ancestors => [:profiles]},
15
+ {:scope => :admin, :current => :posts, :children => [:user, :categories], :ancestors => []},
16
+ {:scope => :admin, :current => :user, :children => [], :ancestors => [:posts]},
17
+ {:scope => :admin, :current => :categories, :children => [], :ancestors => [:posts]},
18
+ {:scope => :admin, :current => :tagged_posts, :children => [:user, :categories, :tags], :ancestors => []},
19
+ {:scope => :admin, :current => :user, :children => [], :ancestors => [:tagged_posts]},
20
+ {:scope => :admin, :current => :categories, :children => [], :ancestors => [:tagged_posts]},
21
+ {:scope => :admin, :current => :tags, :children => [], :ancestors => [:tagged_posts]},
22
+ {:scope => :admin, :current => :categories, :children => [:posts], :ancestors => []},
23
+ {:scope => :admin, :current => :posts, :children => [], :ancestors => [:categories]},
24
+ {:scope => :admin, :current => :news, :children => [], :ancestors => []},
25
+ {:scope => :admin, :current => :puffer_users, :children => [], :ancestors => []},
26
+ {:scope => :orms, :current => :active_record_orm_primals, :children => [], :ancestors => []},
27
+ {:scope => :orms, :current => :mongoid_orm_primals, :children => [], :ancestors => []},
28
+ {:scope => :admin, :current => :session, :children => [], :ancestors => []}
29
+ ]
30
+ end
31
+ end
@@ -2,22 +2,20 @@ require 'spec_helper'
2
2
 
3
3
  describe Puffer::Resource do
4
4
 
5
- def default_params
6
- ActiveSupport::HashWithIndifferentAccess.new(:controller => 'admin/categories', :action => 'index', :plural => true, :ancestors => [], :children => [])
7
- end
8
-
9
- def plain_params
10
- ActiveSupport::HashWithIndifferentAccess.new(:plural => true, :ancestors => [], :children => [])
5
+ def tree_node id, params = {}
6
+ ActiveSupport::HashWithIndifferentAccess.new(:puffer => Rails.application.routes.resources_tree[id]).merge(params)
11
7
  end
12
8
 
13
9
  it "no tree" do
14
- resource = Puffer::Resource.new default_params
10
+ resource = Puffer::Resource.new tree_node(17)
11
+
15
12
  resource.parent.should be_nil
16
13
  resource.children.should be_empty
17
14
  end
18
15
 
19
16
  it "full tree" do
20
- resource = Puffer::Resource.new default_params.merge(:ancestors => [:posts], :children => [:users, :posts])
17
+ resource = Puffer::Resource.new tree_node(3)
18
+
21
19
  resource.parent.should_not be_nil
22
20
  resource.ancestors.count.should == 1
23
21
  resource.children.count.should == 2
@@ -26,11 +24,10 @@ describe Puffer::Resource do
26
24
  describe "#parent" do
27
25
 
28
26
  it "common params" do
29
- resource = Puffer::Resource.new default_params.merge(:ancestors => [:users, :posts], :user_id => 37, :post_id => 42)
30
- parent = resource.parent
27
+ resource = Puffer::Resource.new tree_node(4, :user_id => 37, :post_id => 42)
31
28
 
32
- parent.params.should == plain_params.merge(:ancestors => [:users], :user_id => 37, :id => 42)
33
- parent.controller_name.should == 'posts'
29
+ resource.parent.params.should == tree_node(3, :user_id => 37, :id => 42)
30
+ resource.parent.name.should == :posts
34
31
  end
35
32
 
36
33
  end
@@ -38,31 +35,32 @@ describe Puffer::Resource do
38
35
  describe "#children" do
39
36
 
40
37
  it "common params" do
41
- resource = Puffer::Resource.new default_params.merge(:controller => 'admin/posts', :ancestors => [:users], :children => [:categories], :user_id => 37)
38
+ resource = Puffer::Resource.new tree_node(3, :user_id => 37)
42
39
  child = resource.children.first
43
40
 
44
- child.params.should == plain_params.merge(:ancestors => [:users, :posts], :user_id => 37)
45
- child.controller_name.should == 'categories'
41
+ child.params.should == tree_node(4, :user_id => 37)
42
+ child.name.should == :categories
46
43
  end
47
44
 
48
45
  it "plural params" do
49
- resource = Puffer::Resource.new default_params.merge(:controller => 'admin/users', :children => [:profile])
46
+ resource = Puffer::Resource.new tree_node(0)
50
47
  child = resource.children.first
51
48
 
52
- child.params.should == plain_params.merge(:ancestors => [:users], :plural => false)
53
- child.controller_name.should == 'profiles'
49
+ child.params.should == tree_node(1)
50
+ child.name.should == :profile
54
51
  end
55
52
 
56
53
  it "params with :id" do
57
- resource = Puffer::Resource.new default_params.merge(:controller => 'admin/posts', :ancestors => [:users], :children => [:categories], :user_id => 37, :id => 42)
54
+ resource = Puffer::Resource.new tree_node(3, :user_id => 37, :id => 42)
58
55
  child = resource.children.first
59
56
 
60
- child.params.should == plain_params.merge(:ancestors => [:users, :posts], :user_id => 37, :post_id => 42)
61
- child.controller_name.should == 'categories'
57
+ child.params.should == tree_node(4, :user_id => 37, :post_id => 42)
58
+ child.name.should == :categories
62
59
  end
63
60
 
64
61
  end
65
-
62
+
63
+ =begin
66
64
  describe "#collection" do
67
65
 
68
66
  before do
@@ -71,21 +69,22 @@ describe Puffer::Resource do
71
69
  end
72
70
 
73
71
  it "no parent" do
74
- resource = Puffer::Resource.new default_params
72
+ resource = Puffer::Resource.new tree_node(15)
75
73
  resource.collection.should == Category.limit(25).all
76
74
  end
77
75
 
78
76
  it "plural parent" do
79
- resource = Puffer::Resource.new default_params.merge(:ancestors => [:posts], :post_id => @post.id)
77
+ resource = Puffer::Resource.new tree_node(10, :post_id => @post.id)
80
78
  resource.collection.should == @post.categories.limit(25).all
81
79
  end
82
80
 
83
81
  it "singular parent" do
84
- resource = Puffer::Resource.new default_params.merge(:controller => 'admin/tags', :ancestors => [:users, :profile], :user_id => @user.id)
82
+ resource = Puffer::Resource.new tree_node(2, :user_id => @user.id)
85
83
  resource.collection.should == @user.profile.tags.limit(25).all
86
84
  end
87
85
 
88
86
  end
87
+ =end
89
88
 
90
89
  describe "#member" do
91
90
 
@@ -96,22 +95,22 @@ describe Puffer::Resource do
96
95
  end
97
96
 
98
97
  it "no parent" do
99
- resource = Puffer::Resource.new default_params.merge(:id => @category.id)
98
+ resource = Puffer::Resource.new tree_node(15, :id => @category.id)
100
99
  resource.member.should == @category
101
100
  end
102
101
 
103
102
  it "plural parent" do
104
- resource = Puffer::Resource.new default_params.merge(:ancestors => [:posts], :post_id => @post.id, :id => @post.categories.first.id)
103
+ resource = Puffer::Resource.new tree_node(10, :post_id => @post.id, :id => @post.categories.first.id)
105
104
  resource.member.should == @post.categories.first
106
105
  end
107
106
 
108
107
  it "singular" do
109
- resource = Puffer::Resource.new default_params.merge(:controller => 'admin/profiles', :plural => false, :ancestors => [:users], :user_id => @user.id)
108
+ resource = Puffer::Resource.new tree_node(1, :user_id => @user.id)
110
109
  resource.member.should == @user.profile
111
110
  end
112
111
 
113
112
  it "singular parent" do
114
- resource = Puffer::Resource.new default_params.merge(:controller => 'admin/tags', :ancestors => [:users, :profile], :user_id => @user.id, :id => @user.profile.tags.first.id)
113
+ resource = Puffer::Resource.new tree_node(2, :user_id => @user.id, :id => @user.profile.tags.first.id)
115
114
  resource.member.should == @user.profile.tags.first
116
115
  end
117
116
 
@@ -125,52 +124,52 @@ describe Puffer::Resource do
125
124
  end
126
125
 
127
126
  it "no parent" do
128
- resource = Puffer::Resource.new default_params
127
+ resource = Puffer::Resource.new tree_node(15)
129
128
  resource.new_member.should be_new_record
130
129
  resource.new_member.should be_instance_of(Category)
131
130
  end
132
131
 
133
132
  it "no parent with attributes" do
134
- resource = Puffer::Resource.new default_params.merge(:category => {:title => 'my new title'})
133
+ resource = Puffer::Resource.new tree_node(15, :category => {:title => 'my new title'})
135
134
  resource.new_member.should be_new_record
136
135
  resource.new_member.should be_instance_of(Category)
137
136
  resource.new_member.title.should == 'my new title'
138
137
  end
139
138
 
140
139
  it "plural parent" do
141
- resource = Puffer::Resource.new default_params.merge(:ancestors => [:posts], :post_id => @post.id)
140
+ resource = Puffer::Resource.new tree_node(10, :post_id => @post.id)
142
141
  resource.new_member.should be_new_record
143
142
  resource.new_member.should be_instance_of(Category)
144
143
  end
145
144
 
146
145
  it "plural parent with attributes" do
147
- resource = Puffer::Resource.new default_params.merge(:ancestors => [:posts], :post_id => @post.id, :category => {:title => 'my new title'})
146
+ resource = Puffer::Resource.new tree_node(10, :post_id => @post.id, :category => {:title => 'my new title'})
148
147
  resource.new_member.should be_new_record
149
148
  resource.new_member.should be_instance_of(Category)
150
149
  resource.new_member.title.should == 'my new title'
151
150
  end
152
151
 
153
152
  it "singular" do
154
- resource = Puffer::Resource.new default_params.merge(:controller => 'admin/profiles', :plural => false, :ancestors => [:users], :user_id => @user.id)
153
+ resource = Puffer::Resource.new tree_node(1, :user_id => @user.id)
155
154
  resource.new_member.should be_new_record
156
155
  resource.new_member.should be_instance_of(Profile)
157
156
  end
158
157
 
159
158
  it "singular with attributes" do
160
- resource = Puffer::Resource.new default_params.merge(:controller => 'admin/profiles', :plural => false, :ancestors => [:users], :user_id => @user.id, :profile => {:name => 'my new name'})
159
+ resource = Puffer::Resource.new tree_node(1, :user_id => @user.id, :profile => {:name => 'my new name'})
161
160
  resource.new_member.should be_new_record
162
161
  resource.new_member.should be_instance_of(Profile)
163
162
  resource.new_member.name.should == 'my new name'
164
163
  end
165
164
 
166
165
  it "singular parent" do
167
- resource = Puffer::Resource.new default_params.merge(:controller => 'admin/tags', :ancestors => [:users, :profile], :user_id => @user.id)
166
+ resource = Puffer::Resource.new tree_node(2, :user_id => @user.id)
168
167
  resource.new_member.should be_new_record
169
168
  resource.new_member.should be_instance_of(Tag)
170
169
  end
171
170
 
172
171
  it "singular parent with attributes" do
173
- resource = Puffer::Resource.new default_params.merge(:controller => 'admin/tags', :ancestors => [:users, :profile], :user_id => @user.id, :tag => {:name => 'my new name'})
172
+ resource = Puffer::Resource.new tree_node(2, :user_id => @user.id, :tag => {:name => 'my new name'})
174
173
  resource.new_member.should be_new_record
175
174
  resource.new_member.should be_instance_of(Tag)
176
175
  resource.new_member.name.should == 'my new name'