pragma-decorator 2.1.1 → 2.2.0
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 +5 -5
- data/.gitignore +1 -0
- data/CHANGELOG.md +20 -0
- data/lib/pragma/decorator/association/adapter/active_record.rb +5 -3
- data/lib/pragma/decorator/association.rb +1 -1
- data/lib/pragma/decorator/collection.rb +19 -5
- data/lib/pragma/decorator/pagination/adapter/kaminari.rb +3 -1
- data/lib/pragma/decorator/pagination/adapter/will_paginate.rb +4 -2
- data/lib/pragma/decorator/pagination/adapter.rb +28 -20
- data/lib/pragma/decorator/pagination.rb +8 -8
- data/lib/pragma/decorator/type.rb +1 -0
- data/lib/pragma/decorator/version.rb +1 -1
- data/lib/pragma/decorator.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: '0845e95dd2b1793d4db9ddc6280f62fb9420a385416779de9d0de56573a4ba18'
|
4
|
+
data.tar.gz: 85d1bf273b7748ab953eea1861e3e9935dc548b3d90a6815ffd25fd26c255dbb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 596e58d11fc5b7e309ef09a443002d7bd79acb5aada4f7a09eb85b449f357a55995600d0f93ae003d0ef32ef8373c6038c9d187b9a074715c90a91dfa9dc2403
|
7
|
+
data.tar.gz: f36e57ae761386a60c87245182f9f186803300ec77af42c0a7893568dba99967e85258c6cdfa39bfb8d71f7de21330d7d677dec69edfecae6117bd7036a913b7
|
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
@@ -7,6 +7,25 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|
7
7
|
|
8
8
|
## [Unreleased]
|
9
9
|
|
10
|
+
## [2.2.0]
|
11
|
+
|
12
|
+
### Added
|
13
|
+
|
14
|
+
- Added support for custom pagination adapters
|
15
|
+
- Implemented STI support in `Collection`
|
16
|
+
|
17
|
+
### Changed
|
18
|
+
|
19
|
+
- Renamed `Pagination#adapter` to `#pagination_adapter`
|
20
|
+
- `Type` now replaces `::` with `/`
|
21
|
+
|
22
|
+
### Fixed
|
23
|
+
|
24
|
+
- Fixed AR association adapter not working with custom scopes
|
25
|
+
- Fixed AR association adapter not working with `has_one`
|
26
|
+
- Fixed associations inheritance
|
27
|
+
- Fixed association expansion for non-AR associations defined on AR models
|
28
|
+
|
10
29
|
## [2.1.1]
|
11
30
|
|
12
31
|
### Fixed
|
@@ -38,6 +57,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|
38
57
|
First Pragma 2 release.
|
39
58
|
|
40
59
|
[Unreleased]: https://github.com/pragmarb/pragma-decorator/compare/v2.1.1...HEAD
|
60
|
+
[2.2.0]: https://github.com/pragmarb/pragma-decorator/compare/v2.1.1...v2.2.0
|
41
61
|
[2.1.1]: https://github.com/pragmarb/pragma-decorator/compare/v2.1.0...v2.1.1
|
42
62
|
[2.1.0]: https://github.com/pragmarb/pragma-decorator/compare/v2.0.0...v2.1.0
|
43
63
|
[2.0.0]: https://github.com/pragmarb/pragma-decorator/compare/v1.2.0...v2.0.0
|
@@ -61,7 +61,8 @@ module Pragma
|
|
61
61
|
#
|
62
62
|
# @todo Allow to specify a different PK attribute when +exec_context+ is +decorator+
|
63
63
|
def primary_key
|
64
|
-
return associated_object&.id if
|
64
|
+
return associated_object&.id if association_reflection.nil? ||
|
65
|
+
reflection.options[:exec_context] == :decorator
|
65
66
|
|
66
67
|
case reflection.type
|
67
68
|
when :belongs_to
|
@@ -103,7 +104,7 @@ module Pragma
|
|
103
104
|
|
104
105
|
def compute_has_one_fk
|
105
106
|
if model.association(reflection.property).loaded?
|
106
|
-
return associated_object&.public_send(
|
107
|
+
return associated_object&.public_send(association_reflection.association_primary_key)
|
107
108
|
end
|
108
109
|
|
109
110
|
pluck_association_fk do |scope|
|
@@ -116,7 +117,7 @@ module Pragma
|
|
116
117
|
scope = association_reflection.klass.all
|
117
118
|
|
118
119
|
if association_reflection.scope
|
119
|
-
scope =
|
120
|
+
scope = scope.instance_eval(&association_reflection.scope)
|
120
121
|
end
|
121
122
|
|
122
123
|
yield(scope).pluck(association_reflection.association_primary_key).first
|
@@ -127,6 +128,7 @@ module Pragma
|
|
127
128
|
end
|
128
129
|
|
129
130
|
def check_type_consistency
|
131
|
+
return unless association_reflection
|
130
132
|
return if association_reflection.macro.to_sym == reflection.type.to_sym
|
131
133
|
|
132
134
|
fail InconsistentTypeError.new(
|
@@ -29,7 +29,7 @@ module Pragma
|
|
29
29
|
#
|
30
30
|
# @return [Hash{Symbol => Reflection}] the associations
|
31
31
|
def associations
|
32
|
-
@associations ||= {}
|
32
|
+
@associations ||= superclass.respond_to?(:associations) ? superclass.associations : {}
|
33
33
|
end
|
34
34
|
|
35
35
|
# Defines a +belongs_to+ association on this decorator.
|
@@ -35,7 +35,18 @@ module Pragma
|
|
35
35
|
klass.extend ClassMethods
|
36
36
|
|
37
37
|
klass.class_eval do
|
38
|
-
collection :
|
38
|
+
collection :data, exec_context: :decorator, getter: (lambda do |options:, **|
|
39
|
+
represented_collection = if self.class.instance_decorator.is_a?(Proc)
|
40
|
+
represented.map do |item|
|
41
|
+
self.class.instance_decorator.call(item).represent(item).to_hash(options)
|
42
|
+
end
|
43
|
+
elsif self.class.instance_decorator
|
44
|
+
self.class.instance_decorator.represent(represented.to_a).to_hash(options)
|
45
|
+
else
|
46
|
+
represented
|
47
|
+
end
|
48
|
+
represented_collection
|
49
|
+
end)
|
39
50
|
end
|
40
51
|
end
|
41
52
|
|
@@ -49,13 +60,16 @@ module Pragma
|
|
49
60
|
end
|
50
61
|
|
51
62
|
module ClassMethods # :nodoc:
|
63
|
+
# @!attribute [r]
|
64
|
+
# @return [Class\Proc] the instance decorator to use
|
65
|
+
attr_reader :instance_decorator
|
66
|
+
|
52
67
|
# Defines the decorator to use for each resource in the collection.
|
53
68
|
#
|
54
|
-
# @param decorator [Class] a decorator class
|
55
|
-
#
|
56
|
-
# @todo Accept a callable/block or document how to decorate polymorphic collections
|
69
|
+
# @param decorator [Class|Proc] a decorator class, or a callable accepting a represented
|
70
|
+
# object as argument and returning a decorator class
|
57
71
|
def decorate_with(decorator)
|
58
|
-
|
72
|
+
@instance_decorator = decorator
|
59
73
|
end
|
60
74
|
end
|
61
75
|
end
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module Pragma
|
4
4
|
module Decorator
|
5
5
|
module Pagination
|
6
|
-
module Adapter
|
6
|
+
module Adapter # :nodoc:
|
7
7
|
# This adapter provides support for retireving pagination information from collections
|
8
8
|
# paginated with {https://github.com/kaminari/kaminari Kaminari}.
|
9
9
|
#
|
@@ -65,6 +65,8 @@ module Pragma
|
|
65
65
|
collection.next_page
|
66
66
|
end
|
67
67
|
end
|
68
|
+
|
69
|
+
adapters << Kaminari
|
68
70
|
end
|
69
71
|
end
|
70
72
|
end
|
@@ -3,8 +3,8 @@
|
|
3
3
|
module Pragma
|
4
4
|
module Decorator
|
5
5
|
module Pagination
|
6
|
-
module Adapter
|
7
|
-
# This adapter provides support for
|
6
|
+
module Adapter # :nodoc:
|
7
|
+
# This adapter provides support for retrieving pagination information from collections
|
8
8
|
# paginated with {https://github.com/mislav/will_paginate will_paginate}.
|
9
9
|
#
|
10
10
|
# @api private
|
@@ -65,6 +65,8 @@ module Pragma
|
|
65
65
|
collection.next_page
|
66
66
|
end
|
67
67
|
end
|
68
|
+
|
69
|
+
adapters << WillPaginate
|
68
70
|
end
|
69
71
|
end
|
70
72
|
end
|
@@ -8,29 +8,37 @@ module Pragma
|
|
8
8
|
#
|
9
9
|
# @api private
|
10
10
|
module Adapter
|
11
|
-
|
12
|
-
|
11
|
+
class << self
|
12
|
+
# Loads the adapter for the given collection.
|
13
|
+
#
|
14
|
+
# This will try {SUPPORTED_ADAPTERS} in order until it finds an adapter that supports the
|
15
|
+
# collection. When the adapter is found, it will return a new instance of it.
|
16
|
+
#
|
17
|
+
# @param collection [Object] the collection to load the adapter for
|
18
|
+
#
|
19
|
+
# @return [Adapter::Base]
|
20
|
+
#
|
21
|
+
# @see Adapter::Base.supports?
|
22
|
+
#
|
23
|
+
# @raise [AdapterError] if no adapter supports the collection
|
24
|
+
def load_for(collection)
|
25
|
+
adapter_klass = adapters.find do |klass|
|
26
|
+
klass.supports?(collection)
|
27
|
+
end
|
13
28
|
|
14
|
-
|
15
|
-
#
|
16
|
-
# This will try {SUPPORTED_ADAPTERS} in order until it finds an adapter that supports the
|
17
|
-
# collection. When the adapter is found, it will return a new instance of it.
|
18
|
-
#
|
19
|
-
# @param collection [Object] the collection to load the adapter for
|
20
|
-
#
|
21
|
-
# @return [Adapter::Base]
|
22
|
-
#
|
23
|
-
# @see Adapter::Base.supports?
|
24
|
-
#
|
25
|
-
# @raise [AdapterError] if no adapter supports the collection
|
26
|
-
def self.load_for(collection)
|
27
|
-
adapter_klass = SUPPORTED_ADAPTERS.find do |klass|
|
28
|
-
klass.supports?(collection)
|
29
|
-
end
|
29
|
+
fail NoAdapterError unless adapter_klass
|
30
30
|
|
31
|
-
|
31
|
+
adapter_klass.new(collection)
|
32
|
+
end
|
32
33
|
|
33
|
-
|
34
|
+
# Returns the available pagination adpaters.
|
35
|
+
#
|
36
|
+
# This can be used to register new adapters: just append your class to the collection.
|
37
|
+
#
|
38
|
+
# @return [Array] an array of pagination adapters
|
39
|
+
def adapters
|
40
|
+
@adapters ||= []
|
41
|
+
end
|
34
42
|
end
|
35
43
|
|
36
44
|
# This error is raised when no adapter can be found for a collection.
|
@@ -37,7 +37,7 @@ module Pragma
|
|
37
37
|
#
|
38
38
|
# @see Adapter::Base#current_page
|
39
39
|
def current_page
|
40
|
-
|
40
|
+
pagination_adapter.current_page
|
41
41
|
end
|
42
42
|
|
43
43
|
# Returns the next page of the collection.
|
@@ -46,7 +46,7 @@ module Pragma
|
|
46
46
|
#
|
47
47
|
# @see Adapter::Base#next_page
|
48
48
|
def next_page
|
49
|
-
|
49
|
+
pagination_adapter.next_page
|
50
50
|
end
|
51
51
|
|
52
52
|
# Returns the number of items per page in the collection.
|
@@ -55,7 +55,7 @@ module Pragma
|
|
55
55
|
#
|
56
56
|
# @see Adapter::Base#per_page
|
57
57
|
def per_page
|
58
|
-
|
58
|
+
pagination_adapter.per_page
|
59
59
|
end
|
60
60
|
|
61
61
|
# Returns the previous page of the collection.
|
@@ -64,7 +64,7 @@ module Pragma
|
|
64
64
|
#
|
65
65
|
# @see Adapter::Base#previous_page
|
66
66
|
def previous_page
|
67
|
-
|
67
|
+
pagination_adapter.previous_page
|
68
68
|
end
|
69
69
|
|
70
70
|
# Returns the total number of items in the collection.
|
@@ -73,7 +73,7 @@ module Pragma
|
|
73
73
|
#
|
74
74
|
# @see Adapter::Base#total_entries
|
75
75
|
def total_entries
|
76
|
-
|
76
|
+
pagination_adapter.total_entries
|
77
77
|
end
|
78
78
|
|
79
79
|
# Returns the total number of pages in the collection.
|
@@ -82,13 +82,13 @@ module Pragma
|
|
82
82
|
#
|
83
83
|
# @see Adapter::Base#total_pages
|
84
84
|
def total_pages
|
85
|
-
|
85
|
+
pagination_adapter.total_pages
|
86
86
|
end
|
87
87
|
|
88
88
|
private
|
89
89
|
|
90
|
-
def
|
91
|
-
@
|
90
|
+
def pagination_adapter
|
91
|
+
@pagination_adapter ||= Pagination::Adapter.load_for(represented)
|
92
92
|
end
|
93
93
|
end
|
94
94
|
|
data/lib/pragma/decorator.rb
CHANGED
@@ -16,10 +16,10 @@ require 'pragma/decorator/timestamp'
|
|
16
16
|
require 'pragma/decorator/type'
|
17
17
|
require 'pragma/decorator/collection'
|
18
18
|
require 'pragma/decorator/pagination'
|
19
|
+
require 'pragma/decorator/pagination/adapter'
|
19
20
|
require 'pragma/decorator/pagination/adapter/base'
|
20
21
|
require 'pragma/decorator/pagination/adapter/kaminari'
|
21
22
|
require 'pragma/decorator/pagination/adapter/will_paginate'
|
22
|
-
require 'pragma/decorator/pagination/adapter'
|
23
23
|
|
24
24
|
module Pragma
|
25
25
|
# Represent your API resources in JSON with minimum hassle.
|
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.
|
4
|
+
version: 2.2.0
|
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-02-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: roar
|
@@ -180,7 +180,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
180
180
|
version: '0'
|
181
181
|
requirements: []
|
182
182
|
rubyforge_project:
|
183
|
-
rubygems_version: 2.
|
183
|
+
rubygems_version: 2.7.5
|
184
184
|
signing_key:
|
185
185
|
specification_version: 4
|
186
186
|
summary: Convert your API resources into JSON with minimum hassle.
|