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