zertico 1.3.0 → 2.0.0.alpha.1

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -1,5 +1,6 @@
1
1
  module Zertico
2
2
  module Exceptions
3
+ autoload :MissingStrongParameters, 'zertico/exceptions/missing_strong_parameters'
3
4
  autoload :RollbackException, 'zertico/exceptions/rollback_exception'
4
5
  end
5
6
  end
@@ -0,0 +1,9 @@
1
+ module Zertico
2
+ module Exceptions
3
+ class MissingStrongParameters < Exception
4
+ def initialize
5
+ super('This class depends of strong_parameters gem!')
6
+ end
7
+ end
8
+ end
9
+ end
@@ -8,10 +8,23 @@ module Zertico
8
8
  true
9
9
  end
10
10
 
11
+ def inject_instances(instances = {})
12
+ instances.each do |instance_name, instance_variable|
13
+ instance_variable_set("@#{instance_name}", instance_variable)
14
+ end
15
+ end
16
+
17
+ def get_instances
18
+ instance_variables.inject({}) do |instances, instance_variable|
19
+ instances[instance_variable.to_s.gsub('@', '')] = instance_variable_get(instance_variable)
20
+ instances
21
+ end
22
+ end
23
+
11
24
  protected
12
25
 
13
- def self.instance_name
14
- self.class.to_s.chomp('Interactor').split('::').last
26
+ def self.interface_name
27
+ self.to_s.chomp('Interactor').split('::').last
15
28
  end
16
29
 
17
30
  private
@@ -1,17 +1,19 @@
1
1
  module Zertico
2
2
  module Organizer
3
- attr_reader :interactors_classes, :performed
3
+ attr_reader :interactors_classes, :instances, :performed
4
4
 
5
5
  def organize(interactors)
6
- @performed = []
7
6
  @interactors_classes = Array(interactors)
7
+ @performed = []
8
+ @instances = {}
8
9
  end
9
10
 
10
11
  def perform(params)
11
- @params = params
12
12
  interactors_classes.each do |interactor_class|
13
13
  interactor = interactor_class.new
14
- interactor.perform(@params)
14
+ interactor.inject_instances(instances)
15
+ interactor.perform(params)
16
+ instances.merge!(interactor.get_instances)
15
17
  performed << interactor
16
18
  end
17
19
  true
@@ -20,7 +22,7 @@ module Zertico
20
22
  end
21
23
 
22
24
  def rollback
23
- performed.map(&:rollback)
25
+ performed.reverse.map(&:rollback)
24
26
  end
25
27
  end
26
28
  end
@@ -0,0 +1,21 @@
1
+ begin
2
+ if Rails.version >= '4'
3
+ require 'action_controller/metal/strong_parameters'
4
+ else
5
+ require 'action_controller/parameters'
6
+ end
7
+ rescue LoadError
8
+ raise Zertico::Exceptions::MissingStrongParameters
9
+ end
10
+
11
+ module Zertico
12
+ class PermittedParams < Delegator
13
+ alias_method :params, :interface
14
+
15
+ def self.interface_class
16
+ name.chomp('PermittedParams').singularize.constantize
17
+ rescue NameError
18
+ name.chomp('PermittedParams').split('::').last.singularize.constantize
19
+ end
20
+ end
21
+ end
@@ -1,40 +1,25 @@
1
+ require 'action_controller/metal/responder'
2
+
1
3
  module Zertico
2
- module Responder
3
- def initialize(controller, resources, options={})
4
- super
5
- @force_redirect = options.delete(:force_redirect)
6
- end
4
+ class Responder < ActionController::Responder
5
+ autoload :ForceRedirect, 'zertico/responder/force_redirect'
6
+ autoload :Pjax, 'zertico/responder/pjax'
7
7
 
8
- protected
8
+ class << self
9
+ include Rails.application.routes.url_helpers
9
10
 
10
- def default_render
11
- if request.headers['X-PJAX']
12
- render layout: false
13
- else
14
- super
15
- end
16
- end
11
+ def default_url_options; {} end
17
12
 
18
- def navigation_behavior(error)
19
- if get?
20
- raise error
21
- elsif has_errors? && default_action
22
- if @force_redirect
23
- controller.flash.keep
24
- redirect_to navigation_location
25
- else
26
- controller.flash.clear
27
- render :action => default_action
13
+ %w(index new edit create update show destroy).each do |method_name|
14
+ define_method("#{method_name}_options=") do |options|
15
+ instance_variable_set("@#{method_name}_options", options)
28
16
  end
29
- else
30
- controller.flash.keep
31
- redirect_to navigation_location
32
- end
33
- end
34
17
 
35
- def set_flash_message?
36
- return @force_redirect unless @force_redirect.nil?
37
- super
18
+ define_method("#{method_name}_options") do |controller|
19
+ return {} unless instance_variable_defined?("@#{method_name}_options")
20
+ instance_variable_get("@#{method_name}_options").call(controller)
21
+ end
22
+ end
38
23
  end
39
24
  end
40
25
  end
@@ -0,0 +1,34 @@
1
+ module Zertico
2
+ class Responder
3
+ module ForceRedirect
4
+ def initialize(controller, resources, options={})
5
+ super
6
+ @force_redirect = options.delete(:force_redirect)
7
+ end
8
+
9
+ protected
10
+
11
+ def navigation_behavior(error)
12
+ if get?
13
+ raise error
14
+ elsif has_errors? && default_action
15
+ if @force_redirect
16
+ controller.flash.keep
17
+ redirect_to navigation_location
18
+ else
19
+ controller.flash.clear
20
+ render :action => default_action
21
+ end
22
+ else
23
+ controller.flash.keep
24
+ redirect_to navigation_location
25
+ end
26
+ end
27
+
28
+ def set_flash_message?
29
+ return @force_redirect unless @force_redirect.nil?
30
+ super
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,13 @@
1
+ module Zertico
2
+ class Responder
3
+ module Pjax
4
+ def default_render
5
+ if request.headers['X-PJAX']
6
+ render :layout => false
7
+ else
8
+ super
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,66 +1,9 @@
1
1
  module Zertico
2
- module Service
3
- def all
4
- instance_variable_set("@#{interface_name.pluralize}", resource_source.all)
5
- end
2
+ class Service
3
+ autoload :ClassMethods, 'zertico/service/class_methods'
4
+ autoload :InstanceMethods, 'zertico/service/instance_methods'
6
5
 
7
- def build
8
- instance_variable_set("@#{interface_name}", resource_source.new)
9
- end
10
-
11
- def find
12
- instance_variable_set("@#{interface_name}", resource_source.find(params[interface_id.to_sym]))
13
- end
14
-
15
- def generate
16
- instance_variable_set("@#{interface_name}", resource_source.create(params[interface_name.to_sym]))
17
- end
18
-
19
- def modify
20
- find
21
- instance_variable_get("@#{interface_name}").update_attributes(params[interface_name.to_sym])
22
- instance_variable_get("@#{interface_name}")
23
- end
24
-
25
- def delete
26
- find
27
- instance_variable_get("@#{interface_name}").destroy
28
- instance_variable_get("@#{interface_name}")
29
- end
30
-
31
- def resource_source
32
- @resource_source ||= interface_class
33
- end
34
-
35
- def resource_source=(resource_chain = [])
36
- @resource_source = resource_chain.shift
37
- @resource_source = @resource_source.constantize if @resource_source.respond_to?(:constantize)
38
- resource_chain.each do |resource|
39
- @resource_source = @resource_source.send(resource)
40
- end
41
- end
42
-
43
- protected
44
-
45
- def interface_id
46
- begin
47
- return "#{interface_name}_id" if self.class.name.chomp('Controller').split('::').size > 1
48
- rescue NameError
49
- 'id'
50
- end
51
- 'id'
52
- end
53
-
54
- def interface_name
55
- self.interface_class.name.singularize.underscore
56
- end
57
-
58
- def interface_class
59
- begin
60
- self.class.name.chomp('Controller').singularize.constantize
61
- rescue NameError
62
- self.class.name.chomp('Controller').split('::').last.singularize.constantize
63
- end
64
- end
6
+ extend ClassMethods
7
+ include InstanceMethods
65
8
  end
66
9
  end
@@ -0,0 +1,29 @@
1
+ module Zertico
2
+ class Service
3
+ module ClassMethods
4
+ attr_reader :interface_id, :interface_name, :interface_class, :resource_source
5
+
6
+ def use_as_id(id)
7
+ @interface_id = id
8
+ end
9
+
10
+ def use_as_variable_name(variable_name)
11
+ @interface_name = variable_name
12
+ end
13
+
14
+ def use_interface(interface)
15
+ @interface_class = interface
16
+ end
17
+
18
+ alias_method :use_model, :use_interface
19
+
20
+ def resource_source=(resource_chain = [])
21
+ @resource_source = Array(resource_chain).shift
22
+ @resource_source = @resource_source.constantize if @resource_source.respond_to?(:constantize)
23
+ resource_chain.each do |resource|
24
+ @resource_source = @resource_source.send(resource)
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,60 @@
1
+ module Zertico
2
+ class Service
3
+ module InstanceMethods
4
+ def index
5
+ instance_variable_set("@#{interface_name.pluralize}", resource_source.all)
6
+ end
7
+
8
+ def new
9
+ instance_variable_set("@#{interface_name}", resource_source.new)
10
+ end
11
+
12
+ def show(params)
13
+ instance_variable_set("@#{interface_name}", resource_source.find(params[interface_id.to_sym]))
14
+ end
15
+
16
+ def create(params)
17
+ instance_variable_set("@#{interface_name}", resource_source.create(params))
18
+ end
19
+
20
+ def update(params)
21
+ show(params)
22
+ instance_variable_get("@#{interface_name}").update_attributes(params)
23
+ instance_variable_get("@#{interface_name}")
24
+ end
25
+
26
+ def destroy(params)
27
+ show(params)
28
+ instance_variable_get("@#{interface_name}").destroy
29
+ instance_variable_get("@#{interface_name}")
30
+ end
31
+
32
+ def resource_source
33
+ self.class.resource_source || interface_class
34
+ end
35
+
36
+ def interface_id
37
+ return self.class.interface_id if self.class.interface_id
38
+ if self.class.name.chomp('Controller').split('::').size > 1
39
+ "#{interface_name.gsub('/', '_')}_id"
40
+ else
41
+ 'id'
42
+ end
43
+ rescue NameError
44
+ 'id'
45
+ end
46
+
47
+ def interface_name
48
+ return self.class.interface_name if self.class.interface_name
49
+ interface_class.name.singularize.underscore
50
+ end
51
+
52
+ def interface_class
53
+ return self.class.interface_class if self.class.interface_class
54
+ self.class.name.chomp('Service').singularize.constantize
55
+ rescue NameError
56
+ self.class.name.chomp('Service').split('::').last.singularize.constantize
57
+ end
58
+ end
59
+ end
60
+ end
@@ -1,3 +1,3 @@
1
1
  module Zertico
2
- VERSION = '1.3.0'
2
+ VERSION = '2.0.0.alpha.1'
3
3
  end
@@ -0,0 +1,6 @@
1
+ require "#{File.join(File.dirname(__FILE__), '../application_controller')}"
2
+
3
+ module Admin
4
+ class UserController < ::ApplicationController
5
+ end
6
+ end
@@ -0,0 +1,7 @@
1
+ class ApplicationController < Zertico::Controller
2
+ include Rails.application.routes.url_helpers
3
+
4
+ respond_to :html
5
+
6
+ prepend_view_path 'spec/fake_app/app/views'
7
+ end
@@ -0,0 +1,6 @@
1
+ require "#{File.join(File.dirname(__FILE__), '../application_controller')}"
2
+
3
+ module Person
4
+ class GiftsController < ::ApplicationController
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ require "#{File.join(File.dirname(__FILE__), '../application_controller')}"
2
+
3
+ module Person
4
+ class ProfileController < ::ApplicationController
5
+ end
6
+ end
@@ -0,0 +1,2 @@
1
+ class UserController < ApplicationController
2
+ end
@@ -0,0 +1,7 @@
1
+ require File.join(File.dirname(__FILE__), '../responders/users_responder')
2
+
3
+ class UsersController < ApplicationController
4
+ self.responder = UsersResponder
5
+
6
+ attr_reader :user, :users
7
+ end