zertico 1.3.0 → 2.0.0.alpha.1

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 (83) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -1
  3. data/.hound.yml +17 -0
  4. data/.travis.yml +36 -23
  5. data/CHANGELOG.md +103 -0
  6. data/README.md +39 -19
  7. data/gemfiles/Gemfile.rails3-ruby1.8.7 +7 -0
  8. data/gemfiles/Gemfile.rails3-ruby1.9.2+ +6 -0
  9. data/gemfiles/Gemfile.rails4-ruby1.9.2+ +5 -0
  10. data/lib/zertico.rb +1 -0
  11. data/lib/zertico/controller.rb +24 -16
  12. data/lib/zertico/delegator.rb +12 -5
  13. data/lib/zertico/exceptions.rb +1 -0
  14. data/lib/zertico/exceptions/missing_strong_parameters.rb +9 -0
  15. data/lib/zertico/interactor.rb +15 -2
  16. data/lib/zertico/organizer.rb +7 -5
  17. data/lib/zertico/permitted_params.rb +21 -0
  18. data/lib/zertico/responder.rb +16 -31
  19. data/lib/zertico/responder/force_redirect.rb +34 -0
  20. data/lib/zertico/responder/pjax.rb +13 -0
  21. data/lib/zertico/service.rb +5 -62
  22. data/lib/zertico/service/class_methods.rb +29 -0
  23. data/lib/zertico/service/instance_methods.rb +60 -0
  24. data/lib/zertico/version.rb +1 -1
  25. data/spec/fake_app/app/controllers/admin/user_controller.rb +6 -0
  26. data/spec/fake_app/app/controllers/application_controller.rb +7 -0
  27. data/spec/fake_app/app/controllers/person/gifts_controller.rb +6 -0
  28. data/spec/fake_app/app/controllers/person/profile_controller.rb +6 -0
  29. data/spec/fake_app/app/controllers/user_controller.rb +2 -0
  30. data/spec/fake_app/app/controllers/users_controller.rb +7 -0
  31. data/spec/fake_app/{delegators → app/delegators}/admin/user_delegator.rb +0 -0
  32. data/spec/fake_app/{delegators → app/delegators}/profile/profile_delegator.rb +0 -0
  33. data/spec/fake_app/{delegators → app/delegators}/user_delegator.rb +0 -0
  34. data/spec/fake_app/{interactors → app/interactors}/create_invoice_interactor.rb +0 -0
  35. data/spec/fake_app/{interactors → app/interactors}/create_product_interactor.rb +0 -0
  36. data/spec/fake_app/{interactors → app/interactors}/create_user_interactor.rb +0 -0
  37. data/spec/fake_app/{interactors → app/interactors}/send_welcome_email_interactor.rb +0 -0
  38. data/spec/fake_app/{interfaces → app/interfaces}/invoice.rb +0 -0
  39. data/spec/fake_app/{interfaces → app/interfaces}/person/profile.rb +0 -0
  40. data/spec/fake_app/{interfaces → app/interfaces}/product.rb +0 -0
  41. data/spec/fake_app/app/interfaces/user.rb +32 -0
  42. data/spec/fake_app/{organizers → app/organizers}/buy_product_organizer.rb +0 -0
  43. data/spec/fake_app/{organizers → app/organizers}/register_organizer.rb +0 -0
  44. data/spec/fake_app/app/permitted_params/users_permitted_params.rb +9 -0
  45. data/spec/fake_app/app/responders/users_responder.rb +5 -0
  46. data/spec/fake_app/app/services/admin/user_service.rb +6 -0
  47. data/spec/fake_app/app/services/person/gifts_service.rb +4 -0
  48. data/spec/fake_app/app/services/person/profile_service.rb +4 -0
  49. data/spec/fake_app/app/services/user_service.rb +5 -0
  50. data/spec/fake_app/app/services/users_service.rb +3 -0
  51. data/spec/fake_app/app/views/layouts/application.html.erb +1 -0
  52. data/spec/fake_app/app/views/users/edit.html.erb +0 -0
  53. data/spec/fake_app/app/views/users/index.html.erb +0 -0
  54. data/spec/fake_app/app/views/users/new.html.erb +0 -0
  55. data/spec/fake_app/app/views/users/show.html.erb +0 -0
  56. data/spec/fake_app/config/application.rb +10 -0
  57. data/spec/fake_app/config/routes.rb +3 -0
  58. data/spec/fake_app/config/secrets.yml +4 -0
  59. data/spec/spec_helper.rb +17 -3
  60. data/spec/zertico/controller_integration_spec.rb +92 -0
  61. data/spec/zertico/controller_spec.rb +14 -151
  62. data/spec/zertico/delegator_spec.rb +60 -11
  63. data/spec/zertico/interactor_spec.rb +41 -1
  64. data/spec/zertico/organizer_spec.rb +21 -4
  65. data/spec/zertico/permitted_params_spec.rb +25 -0
  66. data/spec/zertico/responder_spec.rb +234 -0
  67. data/spec/zertico/service/class_methods_spec.rb +36 -0
  68. data/spec/zertico/service/instance_methods_spec.rb +218 -0
  69. data/zertico.gemspec +10 -2
  70. metadata +139 -55
  71. data/gemfiles/Gemfile.rails3.1 +0 -5
  72. data/gemfiles/Gemfile.rails3.2 +0 -5
  73. data/gemfiles/Gemfile.rails4.0 +0 -5
  74. data/gemfiles/Gemfile.rails4.1 +0 -5
  75. data/spec/fake_app/controllers/admin/user_controller.rb +0 -4
  76. data/spec/fake_app/controllers/profile/profile_controller.rb +0 -4
  77. data/spec/fake_app/controllers/user_controller.rb +0 -2
  78. data/spec/fake_app/controllers/users_controller.rb +0 -2
  79. data/spec/fake_app/interfaces/user.rb +0 -9
  80. data/spec/fake_app/services/admin/user_service.rb +0 -8
  81. data/spec/fake_app/services/person/profile_service.rb +0 -5
  82. data/spec/fake_app/services/user_service.rb +0 -6
  83. data/spec/zertico/service_spec.rb +0 -162
@@ -0,0 +1,32 @@
1
+ class User < ActiveRecord::Base
2
+ attr_reader :updated, :destroyed
3
+ attr_accessor :name, :id
4
+
5
+ def initialize
6
+ @updated = false
7
+ @destroyed = false
8
+ super
9
+ end
10
+
11
+ def self.all
12
+ [new, new]
13
+ end
14
+
15
+ def self.find(id)
16
+ new
17
+ end
18
+
19
+ def self.create(params)
20
+ new
21
+ end
22
+
23
+ def update_attributes(params)
24
+ @updated = true
25
+ true
26
+ end
27
+
28
+ def destroy
29
+ @destroyed = true
30
+ true
31
+ end
32
+ end
@@ -0,0 +1,9 @@
1
+ class UsersPermittedParams < Zertico::PermittedParams
2
+ def create
3
+ params.require(:user).permit(:name)
4
+ end
5
+
6
+ def update
7
+ params.require(:user).permit(:id)
8
+ end
9
+ end
@@ -0,0 +1,5 @@
1
+ class UsersResponder < Zertico::Responder
2
+ include Pjax
3
+
4
+ self.update_options = lambda { |controller| { :location => user_path(controller.user) } }
5
+ end
@@ -0,0 +1,6 @@
1
+ module Admin
2
+ class UserService < Zertico::Service
3
+ def admin_user
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,4 @@
1
+ module Person
2
+ class GiftsService < Zertico::Service
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Person
2
+ class ProfileService < Zertico::Service
3
+ end
4
+ end
@@ -0,0 +1,5 @@
1
+ class UserService < Zertico::Service
2
+ use_interface Product
3
+ use_as_id 'great_id'
4
+ use_as_variable_name 'great_name'
5
+ end
@@ -0,0 +1,3 @@
1
+ class UsersService < Zertico::Service
2
+ attr_reader :user, :users
3
+ end
@@ -0,0 +1 @@
1
+ <%= yield %>
File without changes
File without changes
File without changes
File without changes
@@ -0,0 +1,10 @@
1
+ require 'rails'
2
+ require 'action_controller/railtie'
3
+
4
+ module RailsApplication
5
+ class Application < Rails::Application
6
+ config.root = "#{config.root}/spec/fake_app"
7
+ config.logger = nil
8
+ config.secret_key_base = YAML.load(File.open("#{Rails.root}/config/secrets.yml"))[Rails.env]['secret_key_base']
9
+ end
10
+ end
@@ -0,0 +1,3 @@
1
+ Rails.application.routes.draw do
2
+ resources :users
3
+ end
@@ -0,0 +1,4 @@
1
+ development:
2
+ secret_key_base: cf8a9ddeff8bc751c177a6c9fd892f23442e94ada03ca27ceeaefd5639bfe882fbba6b79ee4181d8dba71949f3642f56c3427102c4f1659fc023bddf56fee5dc
3
+ test:
4
+ secret_key_base: 477d9a34cbff7bb338134fa8b9a5aa9e672949a1532f6949f5f69bc950c94ff9b463d035c1c20f008c66508fda1f62454814e8ad6e5b2105bf6fb24a56395845
data/spec/spec_helper.rb CHANGED
@@ -1,8 +1,22 @@
1
1
  require 'rspec'
2
- require 'coveralls'
2
+ require 'active_record'
3
3
 
4
- Coveralls.wear!
4
+ ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', :database => ':memory:')
5
+ ActiveRecord::Migration.create_table :users
6
+
7
+ if ENV['COVERAGE']
8
+ require 'simplecov'
9
+ require 'coveralls'
10
+
11
+ SimpleCov.formatter = Coveralls::SimpleCov::Formatter
12
+ SimpleCov.start do
13
+ add_filter "#{File.dirname(__FILE__)}/fake_app"
14
+ end
15
+
16
+ Coveralls.wear!
17
+ end
5
18
 
6
19
  require "#{File.dirname(__FILE__)}/../lib/zertico"
7
20
 
8
- Dir["#{File.dirname(__FILE__)}/fake_app/**/*.rb"].sort.each { |f| require f }
21
+ Dir["#{File.dirname(__FILE__)}/fake_app/config/**/*.rb"].sort.each { |f| require f }
22
+ Dir["#{File.dirname(__FILE__)}/fake_app/app/**/*.rb"].sort.each { |f| require f }
@@ -0,0 +1,92 @@
1
+ require 'spec_helper'
2
+ require 'rspec/rails'
3
+
4
+ describe UsersController, :type => :controller do
5
+ let(:user) { User.new }
6
+
7
+ context '#index' do
8
+ before :each do
9
+ get :index
10
+ end
11
+
12
+ it 'should initialize a collection of users' do
13
+ expect(assigns(:users)).to be_an_instance_of(Array)
14
+ end
15
+
16
+ it 'should initialize a collection with two itens' do
17
+ expect(assigns(:users).size).to be_equal 2
18
+ end
19
+ end
20
+
21
+ context '#new' do
22
+ before :each do
23
+ get :new
24
+ end
25
+
26
+ it 'should initialize an user' do
27
+ expect(assigns(:user)).to be_an_instance_of(User)
28
+ end
29
+ end
30
+
31
+ context '#show' do
32
+ before :each do
33
+ get :show, :id => 1
34
+ end
35
+
36
+ it 'should find and initialize an user' do
37
+ expect(assigns(:user)).to be_an_instance_of(User)
38
+ end
39
+ end
40
+
41
+ context '#edit' do
42
+ before :each do
43
+ get :edit, :id => 1
44
+ end
45
+
46
+ it 'should find and initialize an user' do
47
+ expect(assigns(:user)).to be_an_instance_of(User)
48
+ end
49
+ end
50
+
51
+ context '#create' do
52
+ before :each do
53
+ post :create, :user => { :name => 'name' }
54
+ end
55
+
56
+ it 'should pass the right parameters to the model' do
57
+ expect(User).to receive(:create).with(:name => 'name').and_return(user)
58
+ post :create, :user => { :name => 'name' }
59
+ end
60
+
61
+ it 'should create a new user' do
62
+ expect(assigns(:user)).to be_an_instance_of(User)
63
+ end
64
+ end
65
+
66
+ context '#update' do
67
+ before :each do
68
+ allow(User).to receive(:find).and_return(user)
69
+ allow(user).to receive(:id).and_return(3)
70
+ put :update, :id => 1, :user => { :id => 23 }
71
+ end
72
+
73
+ it 'should pass the right parameters to the model' do
74
+ expect(user).to receive(:update_attributes).with('id' => '23').and_return(true)
75
+ put :update, :id => 1, :user => { :id => 23 }
76
+ end
77
+
78
+ it 'should update an user' do
79
+ expect(assigns(:user)).to be_an_instance_of(User)
80
+ end
81
+ end
82
+
83
+ context '#destroy' do
84
+ before :each do
85
+ delete :destroy, :id => 1
86
+ end
87
+
88
+ it 'should destroy the user' do
89
+ expect(assigns(:user)).to be_an_instance_of(User)
90
+ end
91
+ end
92
+ end
@@ -1,168 +1,31 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Zertico::Controller do
4
- let(:controller) { Zertico::Controller.new }
5
- let(:user_controller) { UserController.new }
6
- let(:admin_controller) { Admin::UserController.new }
7
-
8
- context 'not being nested' do
9
- it 'should find on the correct id' do
10
- user_controller.send(:interface_id).should == 'id'
11
- end
12
- end
13
-
14
- context 'being nested' do
15
- it 'should find on the correct id' do
16
- admin_controller.send(:interface_id).should == 'user_id'
17
- end
18
- end
4
+ let(:controller) { UsersController.new }
5
+ let(:zertico_controller) { Zertico::Controller.new }
6
+ let(:service) { Zertico::Service.new }
19
7
 
20
8
  context 'without a custom service' do
21
- it 'should extend Zertico::Service' do
22
- controller.should respond_to :all
9
+ it 'should initialize Zertico::Service' do
10
+ expect(zertico_controller.service).to be_an_instance_of(Zertico::Service)
23
11
  end
24
12
  end
25
13
 
26
14
  context 'with a custom service' do
27
- it 'should extend Zertico::Service' do
28
- user_controller.should respond_to :all
29
- end
30
-
31
- it 'should extend it!' do
32
- user_controller.should respond_to :user
15
+ it 'should initialize it!' do
16
+ expect(controller.service).to be_an_instance_of(UsersService)
33
17
  end
34
18
  end
35
19
 
36
- context 'actions' do
37
- before :each do
38
- controller.instance_variable_set('@options', 'options')
39
- controller.stub(:respond_with).with('responder', 'options')
40
- end
41
-
42
- context '#index' do
43
- before :each do
44
- controller.stub(:all => 'responder')
45
- end
46
-
47
- after :each do
48
- controller.index
49
- end
50
-
51
- it 'should initialize a collection of objects' do
52
- controller.should_receive(:all)
53
- end
54
-
55
- it 'should respond correctly' do
56
- controller.should_receive(:respond_with).with('responder', 'options')
57
- end
58
- end
59
-
60
- context '#new' do
61
- before :each do
62
- controller.stub(:build => 'responder')
63
- end
64
-
65
- after :each do
66
- controller.new
67
- end
68
-
69
- it 'should initialize an object' do
70
- controller.should_receive(:build)
71
- end
72
-
73
- it 'should respond correctly' do
74
- controller.should_receive(:respond_with).with('responder', 'options')
75
- end
76
- end
77
-
78
- context '#show' do
79
- before :each do
80
- controller.stub(:find => 'responder')
81
- end
82
-
83
- after :each do
84
- controller.show
85
- end
86
-
87
- it 'should initialize an object' do
88
- controller.should_receive(:find)
89
- end
90
-
91
- it 'should respond correctly' do
92
- controller.should_receive(:respond_with).with('responder', 'options')
93
- end
20
+ context 'without a custom responder' do
21
+ it 'should initialize Zertico::Responder' do
22
+ expect(zertico_controller.responder).to be == Zertico::Responder
94
23
  end
24
+ end
95
25
 
96
- context '#edit' do
97
- before :each do
98
- controller.stub(:find => 'responder')
99
- end
100
-
101
- after :each do
102
- controller.edit
103
- end
104
-
105
- it 'should initialize an object' do
106
- controller.should_receive(:find)
107
- end
108
-
109
- it 'should respond correctly' do
110
- controller.should_receive(:respond_with).with('responder', 'options')
111
- end
112
- end
113
-
114
- context '#create' do
115
- before :each do
116
- controller.stub(:generate => 'responder')
117
- end
118
-
119
- after :each do
120
- controller.create
121
- end
122
-
123
- it 'should initialize an object' do
124
- controller.should_receive(:generate)
125
- end
126
-
127
- it 'should respond correctly' do
128
- controller.should_receive(:respond_with).with('responder', 'options')
129
- end
130
- end
131
-
132
- context '#update' do
133
- before :each do
134
- controller.stub(:modify => 'responder')
135
- end
136
-
137
- after :each do
138
- controller.update
139
- end
140
-
141
- it 'should initialize an object' do
142
- controller.should_receive(:modify)
143
- end
144
-
145
- it 'should respond correctly' do
146
- controller.should_receive(:respond_with).with('responder', 'options')
147
- end
148
- end
149
-
150
- context '#destroy' do
151
- before :each do
152
- controller.stub(:delete => 'responder')
153
- end
154
-
155
- after :each do
156
- controller.destroy
157
- end
158
-
159
- it 'should initialize an object' do
160
- controller.should_receive(:delete)
161
- end
162
-
163
- it 'should respond correctly' do
164
- controller.should_receive(:respond_with).with('responder', 'options')
165
- end
26
+ context 'with a custom responder' do
27
+ it 'should initialize it!' do
28
+ expect(controller.responder).to be == UsersResponder
166
29
  end
167
30
  end
168
31
  end
@@ -2,55 +2,104 @@ require 'spec_helper'
2
2
 
3
3
  describe Zertico::Delegator do
4
4
  let(:user) { User.new }
5
- let(:user_delegator) { UserDelegator.new(user) }
5
+ let(:product) { Product.new }
6
+ let(:user_delegator) { UserDelegator.new }
6
7
 
7
8
  context 'on a namespaced delegator and interface model' do
8
9
  it 'should find the interface model' do
9
- Person::ProfileDelegator.send(:interface_class).should == Person::Profile
10
+ expect(Person::ProfileDelegator.send(:interface_class)).to eq(Person::Profile)
10
11
  end
11
12
 
12
13
  it 'should return a valid instance variable name' do
13
- Person::ProfileDelegator.send(:interface_name).should == 'profile'
14
+ expect(Person::ProfileDelegator.send(:interface_name)).to eq('profile')
14
15
  end
15
16
  end
16
17
 
17
18
  context 'on a namespaced delegator and non namespaced interface model' do
18
19
  it 'should find the interface model' do
19
- Admin::UserDelegator.send(:interface_class).should == User
20
+ expect(Admin::UserDelegator.send(:interface_class)).to eq(User)
20
21
  end
21
22
 
22
23
  it 'should return a valid instance variable name' do
23
- Admin::UserDelegator.send(:interface_name).should == 'user'
24
+ expect(Admin::UserDelegator.send(:interface_name)).to eq('user')
24
25
  end
25
26
  end
26
27
 
27
28
  context 'on a non namespaced delegator and non namespaced interface model' do
28
29
  it 'should find the interface model' do
29
- UserDelegator.send(:interface_class).should == User
30
+ expect(UserDelegator.send(:interface_class)).to eq(User)
30
31
  end
31
32
 
32
33
  it 'should return a valid instance variable name' do
33
- UserDelegator.send(:interface_name).should == 'user'
34
+ expect(UserDelegator.send(:interface_name)).to eq('user')
35
+ end
36
+ end
37
+
38
+ describe '.new' do
39
+ context 'without params' do
40
+ it "should initialize an object based on delegator's name" do
41
+ expect(UserDelegator.new.interface).to be_an_instance_of(User)
42
+ end
43
+ end
44
+
45
+ context 'with an object as param' do
46
+ it 'use this object' do
47
+ expect(UserDelegator.new(product).interface).to be_an_instance_of(Product)
48
+ end
34
49
  end
35
50
  end
36
51
 
37
52
  describe '.find' do
38
53
  before :each do
39
- User.stub(:find => user)
54
+ allow(User).to receive(:find).and_return(user)
40
55
  end
41
56
 
42
57
  it 'should return an delegator' do
43
- UserDelegator.find(3).should be_an_instance_of(UserDelegator)
58
+ expect(UserDelegator.find(3)).to be_an_instance_of(UserDelegator)
44
59
  end
45
60
  end
46
61
 
47
62
  describe '#interface' do
48
63
  before :each do
49
- User.stub(:find => user)
64
+ allow(User).to receive(:find).and_return(user)
50
65
  end
51
66
 
52
67
  it 'should return the interface object' do
53
- UserDelegator.find(3).interface.should == user
68
+ expect(UserDelegator.find(3).interface).to eq(user)
69
+ end
70
+ end
71
+
72
+ describe '#interface=' do
73
+ before :each do
74
+ user_delegator.interface = product
75
+ end
76
+
77
+ it 'should set the interface object' do
78
+ expect(user_delegator.interface).to eq(product)
79
+ end
80
+ end
81
+
82
+ describe '.interface_name' do
83
+ it 'should return the interface name' do
84
+ expect(UserDelegator.interface_name).to eq('user')
85
+ end
86
+ end
87
+
88
+ describe '.interface_class' do
89
+ it 'should return the interface name' do
90
+ expect(UserDelegator.interface_class).to eq(User)
91
+ end
92
+ end
93
+
94
+ describe '#interface_name' do
95
+ it 'should return the interface name' do
96
+ expect(user_delegator.send(:interface_name)).to eq('user')
97
+ end
98
+ end
99
+
100
+ describe '#interface_class' do
101
+ it 'should return the interface name' do
102
+ expect(user_delegator.send(:interface_class)).to eq(User)
54
103
  end
55
104
  end
56
105
  end