active_form_objects 0.1.2 → 1.0.0.beta
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/lib/active_form_objects.rb +24 -85
- data/lib/dsl/attributes.rb +44 -0
- data/lib/dsl/delegates.rb +18 -0
- data/lib/dsl/polymorphs.rb +35 -0
- data/lib/dsl/relations.rb +39 -0
- data/lib/dsl/resource.rb +18 -0
- data/lib/dsl/savings.rb +27 -0
- data/lib/handlers/attributes.rb +52 -0
- data/lib/handlers/base.rb +18 -0
- data/lib/handlers/delegates.rb +33 -0
- data/lib/handlers/initializer.rb +8 -0
- data/lib/handlers/polymorphs.rb +53 -0
- data/lib/handlers/relations.rb +12 -0
- data/lib/handlers/resource.rb +12 -0
- data/lib/handlers/savings.rb +42 -0
- metadata +31 -5
- data/lib/concerns/relations.rb +0 -35
- data/lib/concerns/savings.rb +0 -71
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '03871811ee607637a50a7c85d85985dea846a563709f4d1b803aa681589e5517'
|
4
|
+
data.tar.gz: d6fb754563a486d09e99cb09dc183dc276d83f0d1ab9b8a11c83003a8920340e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f041ee7728861ab7112f9202284bb1d133c877fe42def63e9ba437efb2ebc87efb8ffab77f5a7d519001eba7639c51b03b87371e5c35d5586bde821dc7a18ce4
|
7
|
+
data.tar.gz: 362e0149393a0fd88f129e4169e16c3f037ec506610de8469fe6d33a5478f540c7fda66da8aafebe8be0981f17a200c58a011c94f0d695925ec1a5ff565bf194
|
data/lib/active_form_objects.rb
CHANGED
@@ -1,97 +1,36 @@
|
|
1
|
-
require 'active_support'
|
2
1
|
require 'active_model'
|
3
|
-
|
4
|
-
|
5
|
-
require_relative '
|
6
|
-
require_relative '
|
2
|
+
|
3
|
+
require_relative 'dsl/relations'
|
4
|
+
require_relative 'dsl/attributes'
|
5
|
+
require_relative 'dsl/delegates'
|
6
|
+
require_relative 'dsl/savings'
|
7
|
+
require_relative 'dsl/resource'
|
8
|
+
require_relative 'dsl/polymorphs'
|
9
|
+
|
10
|
+
require_relative 'handlers/initializer'
|
11
|
+
require_relative 'handlers/relations'
|
12
|
+
require_relative 'handlers/resource'
|
13
|
+
require_relative 'handlers/attributes'
|
7
14
|
|
8
15
|
module ActiveFormObjects
|
9
16
|
class Base
|
10
17
|
include ActiveModel::Model
|
11
|
-
include Relations
|
12
|
-
include Savings
|
13
|
-
|
14
|
-
@@authorized_params = {}
|
15
|
-
@@overrided_params = {}
|
16
|
-
@@default_params = {}
|
17
|
-
@@preparers = {}
|
18
|
-
@@resource = {}
|
19
|
-
|
20
|
-
attr_reader :resource
|
21
|
-
|
22
|
-
def self.resource(resource = nil, &block)
|
23
|
-
bloc_to_call = block || proc { resource }
|
24
|
-
@@resource[name] = bloc_to_call
|
25
|
-
end
|
26
|
-
|
27
|
-
def self.prepare(*params)
|
28
|
-
method_to_call = params.last[:with]
|
29
|
-
@@preparers[name] = (@@preparers[name] || []) + [{
|
30
|
-
key: params.first,
|
31
|
-
method_to_call: method_to_call
|
32
|
-
}]
|
33
|
-
end
|
34
|
-
|
35
|
-
def self.attributes(*params)
|
36
|
-
@@authorized_params[name] = (@@authorized_params[name] || []) + params
|
37
|
-
send(:attr_accessor, *params)
|
38
|
-
end
|
39
|
-
|
40
|
-
def self.delegate(*params)
|
41
|
-
delegator = params.last
|
42
|
-
params.pop
|
43
|
-
send(:attributes, *params)
|
44
|
-
define_method("#{delegator[:to]}_params") do
|
45
|
-
attrs_only(params)
|
46
|
-
end
|
47
|
-
end
|
48
18
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
end
|
56
|
-
|
57
|
-
def self.ensure_value(param, value)
|
58
|
-
@@overrided_params[name] ||= {}
|
59
|
-
@@overrided_params[name][param] = value
|
60
|
-
|
61
|
-
send(:attributes, param)
|
62
|
-
end
|
19
|
+
include Dsl::Resource
|
20
|
+
include Dsl::Attributes
|
21
|
+
include Dsl::Relations
|
22
|
+
include Dsl::Polymorphs
|
23
|
+
include Dsl::Delegates
|
24
|
+
include Dsl::Savings
|
63
25
|
|
64
26
|
def initialize(params, resource = nil)
|
65
|
-
@
|
66
|
-
|
67
|
-
params = affect_relation_values(params)
|
68
|
-
resource_params(params || {})
|
69
|
-
|
70
|
-
params_with_resource_attrs = @resource.respond_to?(:attributes) ? @resource.attributes.symbolize_keys.slice(*@authorized_params).merge(@params) : @params
|
71
|
-
params_with_preprared_value = affect_prepared_values(params_with_resource_attrs)
|
72
|
-
super(params_with_preprared_value)
|
73
|
-
end
|
74
|
-
|
75
|
-
def affect_prepared_values(params)
|
76
|
-
(@@preparers[self.class.name] || []).each do |preparer|
|
77
|
-
params[preparer[:key]] = params[preparer[:key]].try(preparer[:method_to_call])
|
78
|
-
end
|
79
|
-
params
|
80
|
-
end
|
81
|
-
|
82
|
-
def resource_params(params)
|
83
|
-
@default_params = @@default_params[self.class.name] || {}
|
84
|
-
@overrided_params = @@overrided_params[self.class.name] || {}
|
85
|
-
@authorized_params = @@authorized_params[self.class.name] || {}
|
86
|
-
@params = @default_params.merge(params.to_h.symbolize_keys).merge(@overrided_params).slice(*@authorized_params)
|
87
|
-
end
|
88
|
-
|
89
|
-
def attrs_only(params)
|
90
|
-
attributes.slice(*params)
|
91
|
-
end
|
27
|
+
@params = params
|
28
|
+
@resource = resource
|
92
29
|
|
93
|
-
|
94
|
-
|
30
|
+
Handlers::Initializer.handle(self)
|
31
|
+
Handlers::Resource.handle(self)
|
32
|
+
Handlers::Attributes.handle(self)
|
33
|
+
super(@params)
|
95
34
|
end
|
96
35
|
end
|
97
36
|
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'active_support'
|
2
|
+
|
3
|
+
module Dsl
|
4
|
+
module Attributes
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
@@attributes = {}
|
8
|
+
@@overrided_params = {}
|
9
|
+
@@default_params = {}
|
10
|
+
@@preparers = {}
|
11
|
+
|
12
|
+
included do
|
13
|
+
attr_accessor :params
|
14
|
+
|
15
|
+
def self.attributes(*params)
|
16
|
+
@@attributes[name] = (@@attributes[name] || []) + params
|
17
|
+
attr_accessor(*params)
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.set_default(params)
|
21
|
+
[params[:to]].flatten.each do |param|
|
22
|
+
@@default_params[name] ||= {}
|
23
|
+
@@default_params[name][param] = params[:value]
|
24
|
+
end
|
25
|
+
send(:attributes, *params[:to])
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.ensure_value(param, value)
|
29
|
+
@@overrided_params[name] ||= {}
|
30
|
+
@@overrided_params[name][param] = value
|
31
|
+
|
32
|
+
send(:attributes, param)
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.prepare(*params)
|
36
|
+
method_to_call = params.last[:with]
|
37
|
+
@@preparers[name] = (@@preparers[name] || []) + [{
|
38
|
+
key: params.first,
|
39
|
+
method_to_call: method_to_call
|
40
|
+
}]
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'active_support'
|
2
|
+
|
3
|
+
module Dsl
|
4
|
+
module Delegates
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
@@delegators = {}
|
8
|
+
|
9
|
+
included do
|
10
|
+
def self.delegate(*params)
|
11
|
+
delegator = params.last[:to].merge(attributes: params)
|
12
|
+
params.pop
|
13
|
+
|
14
|
+
@@delegators[name] = (@@delegators[name] || []) << delegator
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'active_support'
|
2
|
+
require 'active_model'
|
3
|
+
|
4
|
+
module Dsl
|
5
|
+
module Polymorphs
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
@@polymorphic_keys = {}
|
9
|
+
|
10
|
+
class_methods do
|
11
|
+
# Allows to declare a polymorphic relationship
|
12
|
+
#
|
13
|
+
# Params:
|
14
|
+
# +key+:: the corresponding key in the params hash
|
15
|
+
# +possible_types+:: A hash that follows the below format
|
16
|
+
#
|
17
|
+
# polymorph(:content, :program_id, {
|
18
|
+
# foo: Bar
|
19
|
+
# })
|
20
|
+
#
|
21
|
+
# Int the above example the possible_types hash :
|
22
|
+
# scannable => key
|
23
|
+
# Scannable => model class
|
24
|
+
#
|
25
|
+
def polymorph(key, possible_types)
|
26
|
+
@@polymorphic_keys[name] ||= []
|
27
|
+
@@polymorphic_keys[name] << {
|
28
|
+
key: key,
|
29
|
+
types: possible_types
|
30
|
+
}
|
31
|
+
send(:attributes, key)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'active_support'
|
2
|
+
require 'active_model'
|
3
|
+
|
4
|
+
module Dsl
|
5
|
+
module Relations
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
@@relation_keys = {}
|
9
|
+
|
10
|
+
class RelationValidator < ActiveModel::EachValidator
|
11
|
+
def validate_each(record, attribute, _)
|
12
|
+
record.errors.add(attribute, "#{attribute} or #{attribute}_id is required") unless record.try(attribute).present? || record.try("#{attribute}_id".to_sym).present?
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class_methods do
|
17
|
+
# Allows to receive a relation as an input params.
|
18
|
+
# Relation can then be received either as :
|
19
|
+
# - relation_id => The key to the corresponding relation
|
20
|
+
# - relation => An instance of the object
|
21
|
+
#
|
22
|
+
# Params:
|
23
|
+
# +params+:: the list of relations to declare
|
24
|
+
#
|
25
|
+
# Example :
|
26
|
+
# relations(:entity, :user)
|
27
|
+
#
|
28
|
+
def relations(*params)
|
29
|
+
validates(*params, relation: true)
|
30
|
+
|
31
|
+
params.each do |param|
|
32
|
+
relation_key = "#{param}_id".to_sym
|
33
|
+
send(:attributes, param, relation_key)
|
34
|
+
@@relation_keys[name] = (@@relation_keys[name] || []) + [param]
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/lib/dsl/resource.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'active_support'
|
2
|
+
|
3
|
+
module Dsl
|
4
|
+
module Resource
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
@@resource = {}
|
8
|
+
|
9
|
+
included do
|
10
|
+
attr_reader :resource
|
11
|
+
|
12
|
+
def self.resource(resource = nil, &block)
|
13
|
+
bloc_to_call = block || proc { resource }
|
14
|
+
@@resource[name] = bloc_to_call
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/dsl/savings.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'active_support'
|
2
|
+
require 'active_record'
|
3
|
+
require_relative '../handlers/savings'
|
4
|
+
|
5
|
+
module Dsl
|
6
|
+
module Savings
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
class_methods do
|
10
|
+
def save(&block)
|
11
|
+
define_method(:save!) do
|
12
|
+
Handlers::Savings.new(self).save!(&block)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def save!
|
18
|
+
Handlers::Savings.new(self).save!
|
19
|
+
end
|
20
|
+
|
21
|
+
def save
|
22
|
+
save!
|
23
|
+
rescue
|
24
|
+
false
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'active_support/core_ext/hash/reverse_merge'
|
2
|
+
require_relative 'base'
|
3
|
+
require_relative 'relations'
|
4
|
+
require_relative 'delegates'
|
5
|
+
|
6
|
+
module Handlers
|
7
|
+
class Attributes < Base
|
8
|
+
def handle
|
9
|
+
start_with_default_params!
|
10
|
+
affect_prepared_values!
|
11
|
+
merge_with_resource_attributes!
|
12
|
+
affect_relation_values!
|
13
|
+
merge_overrided_params!
|
14
|
+
slice_unauthorized_attributes!
|
15
|
+
end
|
16
|
+
|
17
|
+
# DSL method : set_default
|
18
|
+
def start_with_default_params!
|
19
|
+
default_params = upper(:@@default_params) || {}
|
20
|
+
@params.reverse_merge!(default_params)
|
21
|
+
end
|
22
|
+
|
23
|
+
# DSL method : prepare
|
24
|
+
def affect_prepared_values!
|
25
|
+
(upper(:@@preparers) || []).each do |preparer|
|
26
|
+
@params[preparer[:key]] = @params[preparer[:key]].try(preparer[:method_to_call])
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def merge_with_resource_attributes!
|
31
|
+
return unless @resource.respond_to?(:attributes)
|
32
|
+
@params.reverse_merge!(@resource.attributes.symbolize_keys)
|
33
|
+
end
|
34
|
+
|
35
|
+
# DSL method : ensure_value
|
36
|
+
def merge_overrided_params!
|
37
|
+
overrided_params = upper(:@@overrided_params) || {}
|
38
|
+
@params.merge!(overrided_params)
|
39
|
+
end
|
40
|
+
|
41
|
+
# DSL method : relation
|
42
|
+
def affect_relation_values!
|
43
|
+
Relations.new(@klass).affect_relation_values!
|
44
|
+
end
|
45
|
+
|
46
|
+
# DSL method : attributes
|
47
|
+
def slice_unauthorized_attributes!
|
48
|
+
authorized_attributes = upper(:@@attributes) || {}
|
49
|
+
@params.slice!(*authorized_attributes)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Handlers
|
2
|
+
class Base
|
3
|
+
def initialize(klass)
|
4
|
+
@klass = klass
|
5
|
+
@raw_params = @klass.instance_variable_get(:@raw_params)
|
6
|
+
@params = @klass.instance_variable_get(:@params)
|
7
|
+
@resource = @klass.instance_variable_get(:@resource)
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.handle(klass)
|
11
|
+
new(klass).handle
|
12
|
+
end
|
13
|
+
|
14
|
+
def upper(var)
|
15
|
+
@klass.class.class_variable_get(var)[@klass.class.name]
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require_relative 'base'
|
2
|
+
|
3
|
+
module Handlers
|
4
|
+
class Delegates < Base
|
5
|
+
def handle
|
6
|
+
delegates = upper :@@delegators
|
7
|
+
(delegates || []).each do |delegate|
|
8
|
+
Delegate.new(@klass, delegate).handle
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class Delegate < Base
|
14
|
+
def initialize(klass, delegate)
|
15
|
+
@delegate = delegate
|
16
|
+
|
17
|
+
@form = @delegate[:form]
|
18
|
+
@foreign_key = @delegate[:foreign_key]
|
19
|
+
@relation = @delegate[:relation]
|
20
|
+
@attributes = @delegate[:attributes]
|
21
|
+
|
22
|
+
super(klass)
|
23
|
+
end
|
24
|
+
|
25
|
+
def handle
|
26
|
+
@attributes = @raw_params.slice(*@attributes).merge({
|
27
|
+
@foreign_key => @resource.id
|
28
|
+
})
|
29
|
+
|
30
|
+
@form.new(@attributes, @resource.send(@relation)).save!
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require_relative 'base'
|
2
|
+
|
3
|
+
module Handlers
|
4
|
+
class Polymorphs < Base
|
5
|
+
def handle
|
6
|
+
polymorphs = upper :@@polymorphic_keys
|
7
|
+
(polymorphs || []).each do |polymorph|
|
8
|
+
Polymorph.new(@klass, polymorph).handle
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class Polymorph < Base
|
14
|
+
# Handle either the retrieving of the associated relation
|
15
|
+
# or
|
16
|
+
# the creation of the resource based on this possible input and the params
|
17
|
+
#
|
18
|
+
# Params:
|
19
|
+
# +klass+:: ActiveFormObject::Base instance
|
20
|
+
# +polymorph+:: The param specified in the dsl, example :
|
21
|
+
# {
|
22
|
+
# key: :content,
|
23
|
+
# foreign_key: :program_id,
|
24
|
+
# types: {
|
25
|
+
# polymorph: Dsl::PolymorphsTest::PolymorphForeignForm
|
26
|
+
# }
|
27
|
+
# }
|
28
|
+
#
|
29
|
+
def initialize(klass, polymorph)
|
30
|
+
@polymorph = polymorph
|
31
|
+
super(klass)
|
32
|
+
end
|
33
|
+
|
34
|
+
def handle
|
35
|
+
@params_to_send = @params[@polymorph[:key]] || {}
|
36
|
+
polymorph_instance = form_class.new(@params_to_send, @resource.try(@polymorph[:key])).save!
|
37
|
+
|
38
|
+
@params["#{@polymorph[:key]}_id".to_sym] = polymorph_instance.id
|
39
|
+
@params["#{@polymorph[:key]}_type".to_sym] = polymorph_instance.class.name
|
40
|
+
@params.delete(@polymorph[:key])
|
41
|
+
end
|
42
|
+
|
43
|
+
def form_class
|
44
|
+
@polymorph[:types][
|
45
|
+
@resource.try("#{@polymorph[:key]}_type".to_sym) || clean_params.try(:to_sym)
|
46
|
+
]
|
47
|
+
end
|
48
|
+
|
49
|
+
def clean_params
|
50
|
+
@params_to_send.delete(:type)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require_relative 'base'
|
2
|
+
|
3
|
+
module Handlers
|
4
|
+
class Relations < Base
|
5
|
+
def affect_relation_values!
|
6
|
+
relation_keys = upper(:@@relation_keys) || {}
|
7
|
+
{}.merge(@params).each_key do |key|
|
8
|
+
@params["#{key}_id".to_sym] = @params[key.to_sym].id if relation_keys.include?(key)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'active_support'
|
2
|
+
require 'active_record'
|
3
|
+
|
4
|
+
require_relative 'base'
|
5
|
+
require_relative 'polymorphs'
|
6
|
+
require_relative 'delegates'
|
7
|
+
|
8
|
+
module Handlers
|
9
|
+
class Savings < Base
|
10
|
+
def save!(&block)
|
11
|
+
# ActiveRecord::Base.transaction do
|
12
|
+
@klass.validate!
|
13
|
+
|
14
|
+
before_save_hooks!
|
15
|
+
block ? save_with_block!(block) : save_without_block!
|
16
|
+
after_save_hooks!
|
17
|
+
|
18
|
+
@resource
|
19
|
+
# end
|
20
|
+
rescue ActiveRecord::RecordInvalid => e
|
21
|
+
e.record.errors.add(e.record.class.name, '')
|
22
|
+
raise ActiveRecord::RecordInvalid.new(e.record)
|
23
|
+
end
|
24
|
+
|
25
|
+
def after_save_hooks!
|
26
|
+
Delegates.handle(@klass)
|
27
|
+
end
|
28
|
+
|
29
|
+
def save_with_block!(block)
|
30
|
+
@klass.instance_eval(&block)
|
31
|
+
@resource.try(:save!)
|
32
|
+
end
|
33
|
+
|
34
|
+
def save_without_block!
|
35
|
+
@resource.update!(@params)
|
36
|
+
end
|
37
|
+
|
38
|
+
def before_save_hooks!
|
39
|
+
Polymorphs.handle(@klass)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_form_objects
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0.beta
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michaël Villeneuve
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '4.2'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: activerecord
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '4.2'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '4.2'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: activemodel
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -45,8 +59,20 @@ extensions: []
|
|
45
59
|
extra_rdoc_files: []
|
46
60
|
files:
|
47
61
|
- lib/active_form_objects.rb
|
48
|
-
- lib/
|
49
|
-
- lib/
|
62
|
+
- lib/dsl/attributes.rb
|
63
|
+
- lib/dsl/delegates.rb
|
64
|
+
- lib/dsl/polymorphs.rb
|
65
|
+
- lib/dsl/relations.rb
|
66
|
+
- lib/dsl/resource.rb
|
67
|
+
- lib/dsl/savings.rb
|
68
|
+
- lib/handlers/attributes.rb
|
69
|
+
- lib/handlers/base.rb
|
70
|
+
- lib/handlers/delegates.rb
|
71
|
+
- lib/handlers/initializer.rb
|
72
|
+
- lib/handlers/polymorphs.rb
|
73
|
+
- lib/handlers/relations.rb
|
74
|
+
- lib/handlers/resource.rb
|
75
|
+
- lib/handlers/savings.rb
|
50
76
|
homepage: https://github.com/fidme/active_form_objects
|
51
77
|
licenses:
|
52
78
|
- MIT
|
@@ -62,9 +88,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
62
88
|
version: '0'
|
63
89
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
64
90
|
requirements:
|
65
|
-
- - "
|
91
|
+
- - ">"
|
66
92
|
- !ruby/object:Gem::Version
|
67
|
-
version:
|
93
|
+
version: 1.3.1
|
68
94
|
requirements: []
|
69
95
|
rubyforge_project:
|
70
96
|
rubygems_version: 2.7.3
|
data/lib/concerns/relations.rb
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
require 'active_support'
|
2
|
-
require 'active_model'
|
3
|
-
|
4
|
-
module Relations
|
5
|
-
extend ActiveSupport::Concern
|
6
|
-
|
7
|
-
@@relation_keys = {}
|
8
|
-
|
9
|
-
class RelationValidator < ActiveModel::EachValidator
|
10
|
-
def validate_each(record, attribute, value)
|
11
|
-
record.errors.add(attribute, "#{attribute} or #{attribute}_id is required") unless record.try(attribute).present? || record.try("#{attribute}_id".to_sym).present?
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
def affect_relation_values(params)
|
16
|
-
@relation_keys = @@relation_keys[self.class.name] || []
|
17
|
-
params.keys.each do |key|
|
18
|
-
params["#{key}_id".to_sym] = params[key.to_sym].id if @relation_keys.include?(key)
|
19
|
-
end
|
20
|
-
|
21
|
-
params
|
22
|
-
end
|
23
|
-
|
24
|
-
class_methods do
|
25
|
-
def relations(*params)
|
26
|
-
validates *params, relation: true
|
27
|
-
|
28
|
-
params.each do |param|
|
29
|
-
relation_key = "#{param}_id".to_sym
|
30
|
-
send(:attributes, param, relation_key)
|
31
|
-
@@relation_keys[name] = (@@relation_keys[name] || []) + [param]
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
data/lib/concerns/savings.rb
DELETED
@@ -1,71 +0,0 @@
|
|
1
|
-
require 'active_support'
|
2
|
-
|
3
|
-
module Savings
|
4
|
-
extend ActiveSupport::Concern
|
5
|
-
|
6
|
-
@@associated_forms = {}
|
7
|
-
|
8
|
-
class_methods do
|
9
|
-
def associated(key, form, params = nil)
|
10
|
-
@@associated_forms[name] ||= []
|
11
|
-
@@associated_forms[name] << { name: key, form: form, params: params }
|
12
|
-
|
13
|
-
set_default value: {}, to: key
|
14
|
-
end
|
15
|
-
|
16
|
-
def save(&block)
|
17
|
-
define_method(:save!) do
|
18
|
-
with_rescue do
|
19
|
-
ActiveRecord::Base.transaction do
|
20
|
-
validate!
|
21
|
-
instance_eval(&block)
|
22
|
-
@resource.try(:save!)
|
23
|
-
end
|
24
|
-
@resource
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
def save!
|
31
|
-
with_rescue do
|
32
|
-
if @@associated_forms[self.class.name].nil?
|
33
|
-
validate!
|
34
|
-
@resource.update!(@params)
|
35
|
-
@resource
|
36
|
-
else
|
37
|
-
save_associated_forms!
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
def save
|
43
|
-
save!
|
44
|
-
rescue
|
45
|
-
false
|
46
|
-
end
|
47
|
-
|
48
|
-
def save_associated_forms!
|
49
|
-
(@@associated_forms[self.class.name] || []).each do |associated|
|
50
|
-
params = associated[:params].nil? ? @params[associated[:name]] : send(associated[:params])
|
51
|
-
resource_to_save = send("#{associated[:name]}_to_update") rescue nil
|
52
|
-
@TheForm = associated[:form]
|
53
|
-
|
54
|
-
saved_form = @TheForm.new(params, resource_to_save).save!
|
55
|
-
instance_variable_set("@#{associated[:name]}", saved_form)
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
def set_associated_forms
|
60
|
-
(@@associated_forms[self.class.name] || []).each do |form|
|
61
|
-
instance_variable_set("@#{form[:name]}_form", form[:form])
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
def with_rescue
|
66
|
-
yield
|
67
|
-
rescue ActiveRecord::RecordInvalid => e
|
68
|
-
e.record.errors.add(e.record.class.name, '')
|
69
|
-
raise ActiveRecord::RecordInvalid.new(e.record)
|
70
|
-
end
|
71
|
-
end
|