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.
- checksums.yaml +4 -4
- data/.gitignore +2 -1
- data/.hound.yml +17 -0
- data/.travis.yml +36 -23
- data/CHANGELOG.md +103 -0
- data/README.md +39 -19
- data/gemfiles/Gemfile.rails3-ruby1.8.7 +7 -0
- data/gemfiles/Gemfile.rails3-ruby1.9.2+ +6 -0
- data/gemfiles/Gemfile.rails4-ruby1.9.2+ +5 -0
- data/lib/zertico.rb +1 -0
- data/lib/zertico/controller.rb +24 -16
- data/lib/zertico/delegator.rb +12 -5
- data/lib/zertico/exceptions.rb +1 -0
- data/lib/zertico/exceptions/missing_strong_parameters.rb +9 -0
- data/lib/zertico/interactor.rb +15 -2
- data/lib/zertico/organizer.rb +7 -5
- data/lib/zertico/permitted_params.rb +21 -0
- data/lib/zertico/responder.rb +16 -31
- data/lib/zertico/responder/force_redirect.rb +34 -0
- data/lib/zertico/responder/pjax.rb +13 -0
- data/lib/zertico/service.rb +5 -62
- data/lib/zertico/service/class_methods.rb +29 -0
- data/lib/zertico/service/instance_methods.rb +60 -0
- data/lib/zertico/version.rb +1 -1
- data/spec/fake_app/app/controllers/admin/user_controller.rb +6 -0
- data/spec/fake_app/app/controllers/application_controller.rb +7 -0
- data/spec/fake_app/app/controllers/person/gifts_controller.rb +6 -0
- data/spec/fake_app/app/controllers/person/profile_controller.rb +6 -0
- data/spec/fake_app/app/controllers/user_controller.rb +2 -0
- data/spec/fake_app/app/controllers/users_controller.rb +7 -0
- data/spec/fake_app/{delegators → app/delegators}/admin/user_delegator.rb +0 -0
- data/spec/fake_app/{delegators → app/delegators}/profile/profile_delegator.rb +0 -0
- data/spec/fake_app/{delegators → app/delegators}/user_delegator.rb +0 -0
- data/spec/fake_app/{interactors → app/interactors}/create_invoice_interactor.rb +0 -0
- data/spec/fake_app/{interactors → app/interactors}/create_product_interactor.rb +0 -0
- data/spec/fake_app/{interactors → app/interactors}/create_user_interactor.rb +0 -0
- data/spec/fake_app/{interactors → app/interactors}/send_welcome_email_interactor.rb +0 -0
- data/spec/fake_app/{interfaces → app/interfaces}/invoice.rb +0 -0
- data/spec/fake_app/{interfaces → app/interfaces}/person/profile.rb +0 -0
- data/spec/fake_app/{interfaces → app/interfaces}/product.rb +0 -0
- data/spec/fake_app/app/interfaces/user.rb +32 -0
- data/spec/fake_app/{organizers → app/organizers}/buy_product_organizer.rb +0 -0
- data/spec/fake_app/{organizers → app/organizers}/register_organizer.rb +0 -0
- data/spec/fake_app/app/permitted_params/users_permitted_params.rb +9 -0
- data/spec/fake_app/app/responders/users_responder.rb +5 -0
- data/spec/fake_app/app/services/admin/user_service.rb +6 -0
- data/spec/fake_app/app/services/person/gifts_service.rb +4 -0
- data/spec/fake_app/app/services/person/profile_service.rb +4 -0
- data/spec/fake_app/app/services/user_service.rb +5 -0
- data/spec/fake_app/app/services/users_service.rb +3 -0
- data/spec/fake_app/app/views/layouts/application.html.erb +1 -0
- data/spec/fake_app/app/views/users/edit.html.erb +0 -0
- data/spec/fake_app/app/views/users/index.html.erb +0 -0
- data/spec/fake_app/app/views/users/new.html.erb +0 -0
- data/spec/fake_app/app/views/users/show.html.erb +0 -0
- data/spec/fake_app/config/application.rb +10 -0
- data/spec/fake_app/config/routes.rb +3 -0
- data/spec/fake_app/config/secrets.yml +4 -0
- data/spec/spec_helper.rb +17 -3
- data/spec/zertico/controller_integration_spec.rb +92 -0
- data/spec/zertico/controller_spec.rb +14 -151
- data/spec/zertico/delegator_spec.rb +60 -11
- data/spec/zertico/interactor_spec.rb +41 -1
- data/spec/zertico/organizer_spec.rb +21 -4
- data/spec/zertico/permitted_params_spec.rb +25 -0
- data/spec/zertico/responder_spec.rb +234 -0
- data/spec/zertico/service/class_methods_spec.rb +36 -0
- data/spec/zertico/service/instance_methods_spec.rb +218 -0
- data/zertico.gemspec +10 -2
- metadata +139 -55
- data/gemfiles/Gemfile.rails3.1 +0 -5
- data/gemfiles/Gemfile.rails3.2 +0 -5
- data/gemfiles/Gemfile.rails4.0 +0 -5
- data/gemfiles/Gemfile.rails4.1 +0 -5
- data/spec/fake_app/controllers/admin/user_controller.rb +0 -4
- data/spec/fake_app/controllers/profile/profile_controller.rb +0 -4
- data/spec/fake_app/controllers/user_controller.rb +0 -2
- data/spec/fake_app/controllers/users_controller.rb +0 -2
- data/spec/fake_app/interfaces/user.rb +0 -9
- data/spec/fake_app/services/admin/user_service.rb +0 -8
- data/spec/fake_app/services/person/profile_service.rb +0 -5
- data/spec/fake_app/services/user_service.rb +0 -6
- data/spec/zertico/service_spec.rb +0 -162
data/lib/zertico/exceptions.rb
CHANGED
data/lib/zertico/interactor.rb
CHANGED
@@ -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.
|
14
|
-
self.
|
26
|
+
def self.interface_name
|
27
|
+
self.to_s.chomp('Interactor').split('::').last
|
15
28
|
end
|
16
29
|
|
17
30
|
private
|
data/lib/zertico/organizer.rb
CHANGED
@@ -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.
|
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
|
data/lib/zertico/responder.rb
CHANGED
@@ -1,40 +1,25 @@
|
|
1
|
+
require 'action_controller/metal/responder'
|
2
|
+
|
1
3
|
module Zertico
|
2
|
-
|
3
|
-
|
4
|
-
|
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
|
-
|
8
|
+
class << self
|
9
|
+
include Rails.application.routes.url_helpers
|
9
10
|
|
10
|
-
|
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
|
-
|
19
|
-
|
20
|
-
|
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
|
-
|
36
|
-
|
37
|
-
|
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
|
data/lib/zertico/service.rb
CHANGED
@@ -1,66 +1,9 @@
|
|
1
1
|
module Zertico
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
end
|
2
|
+
class Service
|
3
|
+
autoload :ClassMethods, 'zertico/service/class_methods'
|
4
|
+
autoload :InstanceMethods, 'zertico/service/instance_methods'
|
6
5
|
|
7
|
-
|
8
|
-
|
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
|
data/lib/zertico/version.rb
CHANGED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|