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
@@ -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