pragma-decorator 2.2.4 → 2.2.6
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/.rubocop.yml +3 -2
- data/CHANGELOG.md +17 -2
- data/README.md +22 -3
- data/lib/pragma/decorator/association.rb +22 -15
- data/lib/pragma/decorator/association/adapter/active_record.rb +3 -3
- data/lib/pragma/decorator/association/bond.rb +4 -4
- data/lib/pragma/decorator/association/errors.rb +1 -1
- data/lib/pragma/decorator/association/reflection.rb +10 -6
- data/lib/pragma/decorator/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 98b91700778dde7caf78fca62ad944dd136d8c2ce8d48bb598b085ad8567c741
|
4
|
+
data.tar.gz: 9d428e1e9e9c0c6eb00a0e128728da271375d939c60230fe67f7c62466086cc2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 72b88fd97948adf0f682469ab5854cb302fd967d09da55afc04974d5a2200748dbf70d36699b810eb4d9999723b72e7088d5a0074846b64d17639ad6167becdb
|
7
|
+
data.tar.gz: c7c96cce6da9dff0946e003a0ab990013ccf1dfc02e77656b31e4ebd747007e79341c7fc8d042f981c14e8e3d6cc80e6a0dc6ce345bb9fec8fd58d43dc7c71bb
|
data/.rubocop.yml
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
require: rubocop-rspec
|
2
2
|
|
3
3
|
AllCops:
|
4
|
-
TargetRubyVersion: 2.
|
4
|
+
TargetRubyVersion: 2.5
|
5
5
|
Include:
|
6
6
|
- '**/Gemfile'
|
7
7
|
- '**/Rakefile'
|
8
|
+
- '**/*.rb'
|
8
9
|
Exclude:
|
9
10
|
- 'bin/*'
|
10
11
|
- 'db/**/*'
|
@@ -53,7 +54,7 @@ Style/SignalException:
|
|
53
54
|
Style/BracesAroundHashParameters:
|
54
55
|
EnforcedStyle: context_dependent
|
55
56
|
|
56
|
-
|
57
|
+
Layout/EndAlignment:
|
57
58
|
EnforcedStyleAlignWith: variable
|
58
59
|
AutoCorrect: true
|
59
60
|
|
data/CHANGELOG.md
CHANGED
@@ -7,11 +7,24 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|
7
7
|
|
8
8
|
## [Unreleased]
|
9
9
|
|
10
|
+
## [2.2.6]
|
11
|
+
|
12
|
+
### Fixed
|
13
|
+
|
14
|
+
- Fixed an issue with association definition
|
15
|
+
|
16
|
+
## [2.2.5] (yanked)
|
17
|
+
|
18
|
+
### Fixed
|
19
|
+
|
20
|
+
- Fixed the expansion of associations with custom names requiring the original name to be used
|
21
|
+
|
10
22
|
## [2.2.4]
|
11
23
|
|
12
24
|
### Fixed
|
13
25
|
|
14
|
-
- Fixed an issue where expanding a property would expand properties with the same name in associated
|
26
|
+
- Fixed an issue where expanding a property would expand properties with the same name in associated
|
27
|
+
objects
|
15
28
|
|
16
29
|
## [2.2.3]
|
17
30
|
|
@@ -80,7 +93,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|
80
93
|
|
81
94
|
First Pragma 2 release.
|
82
95
|
|
83
|
-
[Unreleased]: https://github.com/pragmarb/pragma-decorator/compare/v2.2.
|
96
|
+
[Unreleased]: https://github.com/pragmarb/pragma-decorator/compare/v2.2.6...HEAD
|
97
|
+
[2.2.6]: https://github.com/pragmarb/pragma-decorator/compare/v2.2.5...v2.2.6
|
98
|
+
[2.2.5]: https://github.com/pragmarb/pragma-decorator/compare/v2.2.4...v2.2.5
|
84
99
|
[2.2.4]: https://github.com/pragmarb/pragma-decorator/compare/v2.2.3...v2.2.4
|
85
100
|
[2.2.3]: https://github.com/pragmarb/pragma-decorator/compare/v2.2.2...v2.2.3
|
86
101
|
[2.2.2]: https://github.com/pragmarb/pragma-decorator/compare/v2.2.1...v2.2.2
|
data/README.md
CHANGED
@@ -96,7 +96,7 @@ This would result in the following representation:
|
|
96
96
|
```json
|
97
97
|
{
|
98
98
|
"type": "user",
|
99
|
-
"...": "..."
|
99
|
+
"...": "..."
|
100
100
|
}
|
101
101
|
```
|
102
102
|
|
@@ -167,7 +167,7 @@ module API
|
|
167
167
|
class Instance < Pragma::Decorator::Base
|
168
168
|
include Pragma::Decorator::Association
|
169
169
|
|
170
|
-
belongs_to :customer, decorator: API::V1::Customer::Decorator
|
170
|
+
belongs_to :customer, decorator: API::V1::Customer::Decorator::Instance
|
171
171
|
end
|
172
172
|
end
|
173
173
|
end
|
@@ -211,7 +211,26 @@ decorator.to_json(user_options: {
|
|
211
211
|
Needless to say, this is done automatically for you when you use all components together through
|
212
212
|
the [pragma](https://github.com/pragmarb/pragma) gem! :)
|
213
213
|
|
214
|
-
Associations support all the options supported by `#property`.
|
214
|
+
Associations support all the options supported by `#property`. Additionally, `decorator` can be a
|
215
|
+
callable object, which is useful for polymorphic associations:
|
216
|
+
|
217
|
+
```ruby
|
218
|
+
module API
|
219
|
+
module V1
|
220
|
+
module Discount
|
221
|
+
module Decorator
|
222
|
+
class Instance < Pragma::Decorator::Base
|
223
|
+
include Pragma::Decorator::Association
|
224
|
+
|
225
|
+
belongs_to :discountable, decorator: -> (discountable) {
|
226
|
+
"API::V1::#{discountable.class}::Decorator::Instance".constantize
|
227
|
+
}
|
228
|
+
end
|
229
|
+
end
|
230
|
+
end
|
231
|
+
end
|
232
|
+
end
|
233
|
+
```
|
215
234
|
|
216
235
|
### Collection
|
217
236
|
|
@@ -39,10 +39,10 @@ module Pragma
|
|
39
39
|
#
|
40
40
|
# This method supports all the usual options accepted by +#property+.
|
41
41
|
#
|
42
|
-
# @param
|
42
|
+
# @param attribute_name [Symbol] name of the association
|
43
43
|
# @param options [Hash] the association's options
|
44
|
-
def belongs_to(
|
45
|
-
define_association :belongs_to,
|
44
|
+
def belongs_to(attribute_name, options = {})
|
45
|
+
define_association :belongs_to, attribute_name, options
|
46
46
|
end
|
47
47
|
|
48
48
|
# Defines a +has_one+ association on this decorator.
|
@@ -52,36 +52,43 @@ module Pragma
|
|
52
52
|
#
|
53
53
|
# This method supports all the usual options accepted by +#property+.
|
54
54
|
#
|
55
|
-
# @param
|
55
|
+
# @param attribute_name [Symbol] name of the association
|
56
56
|
# @param options [Hash] the association's options
|
57
|
-
def has_one(
|
58
|
-
define_association :has_one,
|
57
|
+
def has_one(attribute_name, options = {}) # rubocop:disable Naming/PredicateName
|
58
|
+
define_association :has_one, attribute_name, options
|
59
59
|
end
|
60
60
|
|
61
61
|
private
|
62
62
|
|
63
|
-
def define_association(type,
|
64
|
-
create_association_definition(type,
|
65
|
-
create_association_property(
|
63
|
+
def define_association(type, attribute_name, options = {})
|
64
|
+
create_association_definition(type, attribute_name, options)
|
65
|
+
create_association_property(attribute_name, options)
|
66
66
|
end
|
67
67
|
|
68
|
-
def create_association_definition(type,
|
69
|
-
|
68
|
+
def create_association_definition(type, attribute_name, options)
|
69
|
+
association_name = options.fetch(:as, attribute_name.to_sym)
|
70
|
+
associations[association_name] = Reflection.new(options.merge(
|
71
|
+
type: type,
|
72
|
+
name: association_name,
|
73
|
+
attribute: attribute_name
|
74
|
+
))
|
70
75
|
end
|
71
76
|
|
72
|
-
def create_association_property(
|
77
|
+
def create_association_property(attribute_name, options)
|
78
|
+
association_name = options.fetch(:as, attribute_name.to_sym)
|
79
|
+
|
73
80
|
property_options = options.dup.tap { |po| po.delete(:decorator) }.merge(
|
74
81
|
exec_context: :decorator,
|
75
|
-
as: options[:as] ||
|
82
|
+
as: options[:as] || attribute_name,
|
76
83
|
getter: (lambda do |decorator:, user_options:, **_args|
|
77
84
|
Bond.new(
|
78
|
-
reflection: decorator.class.associations[
|
85
|
+
reflection: decorator.class.associations[association_name],
|
79
86
|
decorator: decorator
|
80
87
|
).render(user_options)
|
81
88
|
end)
|
82
89
|
)
|
83
90
|
|
84
|
-
property("_#{
|
91
|
+
property("_#{association_name}_association", property_options)
|
85
92
|
end
|
86
93
|
end
|
87
94
|
|
@@ -97,7 +97,7 @@ module Pragma
|
|
97
97
|
association_reflection.association_primary_key
|
98
98
|
end
|
99
99
|
|
100
|
-
if model.association(reflection.
|
100
|
+
if model.association(reflection.attribute).loaded?
|
101
101
|
return associated_object&.public_send(primary_key)
|
102
102
|
end
|
103
103
|
|
@@ -112,7 +112,7 @@ module Pragma
|
|
112
112
|
end
|
113
113
|
|
114
114
|
def compute_has_one_fk
|
115
|
-
if model.association(reflection.
|
115
|
+
if model.association(reflection.attribute).loaded?
|
116
116
|
return associated_object&.public_send(association_reflection.association_primary_key)
|
117
117
|
end
|
118
118
|
|
@@ -133,7 +133,7 @@ module Pragma
|
|
133
133
|
end
|
134
134
|
|
135
135
|
def association_reflection
|
136
|
-
@association_reflection ||= model.class.reflect_on_association(reflection.
|
136
|
+
@association_reflection ||= model.class.reflect_on_association(reflection.attribute)
|
137
137
|
end
|
138
138
|
|
139
139
|
def check_type_consistency
|
@@ -29,9 +29,9 @@ module Pragma
|
|
29
29
|
def associated_object
|
30
30
|
case reflection.options[:exec_context]
|
31
31
|
when :decorated
|
32
|
-
model.public_send(reflection.
|
32
|
+
model.public_send(reflection.attribute)
|
33
33
|
when :decorator
|
34
|
-
decorator.public_send(reflection.
|
34
|
+
decorator.public_send(reflection.attribute)
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
@@ -81,7 +81,7 @@ module Pragma
|
|
81
81
|
#
|
82
82
|
# @return [Hash|Pragma::Decorator::Base]
|
83
83
|
def render(user_options)
|
84
|
-
if user_options[:expand]&.any? { |value| value.to_s == reflection.
|
84
|
+
if user_options[:expand]&.any? { |value| value.to_s == reflection.name.to_s }
|
85
85
|
expanded_value(user_options)
|
86
86
|
else
|
87
87
|
unexpanded_value
|
@@ -104,7 +104,7 @@ module Pragma
|
|
104
104
|
def flatten_expand(expand)
|
105
105
|
expand ||= []
|
106
106
|
|
107
|
-
expected_beginning = "#{reflection.
|
107
|
+
expected_beginning = "#{reflection.name}."
|
108
108
|
|
109
109
|
expand.select { |value| value.start_with?(expected_beginning) }.map do |value|
|
110
110
|
value.sub(expected_beginning, '')
|
@@ -55,7 +55,7 @@ module Pragma
|
|
55
55
|
# @param model_type [Symbol|String] the real type of the association
|
56
56
|
def initialize(decorator:, reflection:, model_type:)
|
57
57
|
message = <<~MSG.tr("\n", ' ')
|
58
|
-
#{decorator.class}: Association #{reflection.
|
58
|
+
#{decorator.class}: Association #{reflection.attribute} is defined as #{model_type} on
|
59
59
|
the model, but as #{reflection.type} in the decorator.
|
60
60
|
MSG
|
61
61
|
|
@@ -10,17 +10,20 @@ module Pragma
|
|
10
10
|
# @!attribute [r] type
|
11
11
|
# @return [Symbol] the type of the association
|
12
12
|
#
|
13
|
-
# @!attribute [r]
|
14
|
-
# @return [Symbol] the
|
13
|
+
# @!attribute [r] name
|
14
|
+
# @return [Symbol] the name of the association property
|
15
|
+
#
|
16
|
+
# @!attribute [r] attribute
|
17
|
+
# @return [Symbol] the attribute holding the associated object
|
15
18
|
#
|
16
19
|
# @!attribute [r] options
|
17
20
|
# @return [Hash] additional options for the association
|
18
|
-
attr_reader :type, :
|
21
|
+
attr_reader :type, :name, :attribute, :options
|
19
22
|
|
20
23
|
# Initializes the association.
|
21
24
|
#
|
22
25
|
# @param type [Symbol] the type of the association
|
23
|
-
# @param
|
26
|
+
# @param attribute [Symbol] the attribute holding the associated object
|
24
27
|
# @param options [Hash] additional options
|
25
28
|
#
|
26
29
|
# @option options [Class|Proc] :decorator the decorator to use for the associated object
|
@@ -28,9 +31,10 @@ module Pragma
|
|
28
31
|
# @option options [Boolean] :render_nil (`true`) whether to render a +nil+ association
|
29
32
|
# @option options [Symbol] :exec_context (`decorated`) whether to call the getter on the
|
30
33
|
# decorator (+decorator+) or the decorated object (+decorated+)
|
31
|
-
def initialize(type
|
34
|
+
def initialize(type:, name:, attribute:, **options)
|
32
35
|
@type = type
|
33
|
-
@
|
36
|
+
@name = name
|
37
|
+
@attribute = attribute
|
34
38
|
@options = options
|
35
39
|
|
36
40
|
normalize_options
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pragma-decorator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.2.
|
4
|
+
version: 2.2.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alessandro Desantis
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-08-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: roar
|