hal_decorator 0.3.3 → 0.3.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1a057aea9fde00c1fece1badea0112c09a0c0d92
4
- data.tar.gz: b2d13e8db0031a61aeee53e1e4e25c3559f91e4c
3
+ metadata.gz: fd9ad6b7f80ed3d5d036ca4c7472b88e0b803989
4
+ data.tar.gz: 3977c9f47eab6816f2f7db9a2e37886ca6cee24a
5
5
  SHA512:
6
- metadata.gz: 19f2b2cc25265859f03b6fabda3518cdafa0ea1177c28c879134100f09ccdcd053676d16b19ad1f5205ad0b07d10735c6f8200b9d8b3f43598625b989a3180e4
7
- data.tar.gz: 98bfed67cd1a6d0b00e759d8506dfe83ebc853cedfc4a06ac9286899c93a90b111dc021a6260a9a5a35734cc2052c20e7355ec4360c4fb3e01d7687f52ab2008
6
+ metadata.gz: 422776e1d29392bf2f63d501cff3d68235d656c950e3964417e50ac6b333cb46e90eda5526c8048a0ebb363926c1e910b4a50941906662c44a03457ef6da20ac
7
+ data.tar.gz: 56aec582f8f8824cddbfc7d9d5db60baafb50c63f7c6c5a50d36e013726d9cff0c25865f09c3b0e21b1042db993de97ba4162acab0033ac930c87089608585f7
checksums.yaml.gz.sig CHANGED
Binary file
@@ -26,6 +26,10 @@ module HALDecorator
26
26
  @_parameters ||= init_collection_params
27
27
  end
28
28
 
29
+ def can_serialize_collection?
30
+ !collection_parameters.nil?
31
+ end
32
+
29
33
  private
30
34
 
31
35
  def init_collection_params
@@ -0,0 +1,126 @@
1
+ module HALDecorator
2
+ class << self
3
+ attr_accessor :paginate
4
+ end
5
+
6
+ # TODO: Support Kaminari and Will_paginate
7
+
8
+ class Pagination
9
+
10
+ class Uri
11
+ def self.parse(str)
12
+ uri = nil
13
+ query = nil
14
+ unless str.nil? || str.empty?
15
+ if m = str.match(%r(\A([^\?]+)\??([^\#]+)?.*\Z))
16
+ uri = m[1]
17
+ query = query_from_string m[2]
18
+ end
19
+ end
20
+ new(uri, query)
21
+ end
22
+
23
+ def self.query_from_string(str)
24
+ return {} if str.nil? || str.empty?
25
+ str.split('&').each_with_object({}) do |pair, q|
26
+ key_value = pair.split('=')
27
+ q[key_value[0]] = key_value[1];
28
+ end
29
+ end
30
+
31
+ def initialize(uri, query)
32
+ @uri = uri
33
+ @query = query
34
+ end
35
+
36
+ def +(query)
37
+ self.class.new(@uri, @query.merge(query))
38
+ end
39
+
40
+ def to_s
41
+ return if @uri.nil?
42
+ @uri.dup.tap do |uri|
43
+ next if @query.nil? || @query.empty?
44
+ uri << "?" + @query.map { |k,v| "#{k}=#{v}" }.join('&')
45
+ end
46
+ end
47
+ end
48
+
49
+ def self.paginate!(serialized, collection)
50
+ new(serialized, collection).call
51
+ end
52
+
53
+ def initialize(serialized, collection)
54
+ @serialized = serialized
55
+ @collection = collection
56
+ @self_uri = Uri.parse serialized.dig(:_links, :self, :href)
57
+ end
58
+
59
+ def call
60
+ return unless should_paginate?
61
+ add_query_to_self
62
+ add_prev_link
63
+ add_next_link
64
+ end
65
+
66
+ private
67
+
68
+ attr_accessor :serialized, :collection, :self_uri
69
+
70
+ def should_paginate?
71
+ self_uri && current_page
72
+ end
73
+
74
+ def query(page)
75
+ return {} unless page
76
+ {
77
+ page: page,
78
+ per_page: per_page,
79
+ }
80
+ end
81
+
82
+ def add_query_to_self
83
+ serialized[:_links][:self][:href] = (self_uri + query(current_page)).to_s
84
+ end
85
+
86
+ def add_prev_link
87
+ return if serialized[:_links][:prev] || !prev_page
88
+ serialized[:_links][:prev] = {
89
+ href: (self_uri + query(prev_page)).to_s
90
+ }
91
+ end
92
+
93
+ def add_next_link
94
+ return if serialized[:_links][:next] || !next_page
95
+ serialized[:_links][:next] = {
96
+ href: (self_uri + query(next_page)).to_s
97
+ }
98
+ end
99
+
100
+ # Supported by Sequel, Kaminari and will_paginate
101
+ def current_page
102
+ collection.respond_to?(:current_page) && collection.current_page
103
+ end
104
+
105
+ def prev_page
106
+ return collection.prev_page if collection.respond_to?(:prev_page) # Sequel and Kaminari
107
+ return collection.previous_page if collection.respond_to?(:previous_page) # will_paginate
108
+ end
109
+
110
+ # Supported by Sequel, Kaminari and will_paginate
111
+ def next_page
112
+ collection.respond_to?(:next_page) && collection.next_page
113
+ end
114
+
115
+ def per_page
116
+ if collection.respond_to?(:page_size)
117
+ collection.page_size # Supported by Sequel
118
+ elsif collection.respond_to?(:max_per_page)
119
+ collection.max_per_page # Supported by Kaminari
120
+ elsif collection.respond_to?(:per_page)
121
+ collection.per_page # Supported by will_paginate
122
+ end
123
+ end
124
+ end
125
+ end
126
+
@@ -1,4 +1,5 @@
1
1
  require 'json'
2
+ require 'hal_decorator/pagination'
2
3
 
3
4
  module HALDecorator
4
5
 
@@ -28,20 +29,14 @@ module HALDecorator
28
29
  end
29
30
 
30
31
  def to_collection(resources = [], options = {})
31
- parameters = collection_parameters
32
- if parameters.nil?
32
+ unless can_serialize_collection?
33
33
  raise Error,
34
34
  "Trying to serialize a collection using #{self} which has no collection info. " \
35
35
  "Add a 'collection' spec to the serializer or use another serializer"
36
36
  end
37
- links = parameters.links
38
- curies = parameters.curies
39
- serialized = _serialize_attributes(parameters.attributes, resources, nil, options)
40
- serialized.merge! _serialize_links(links, curies, resources, nil, options)
41
-
42
- serialized_resources = resources.map { |resource| to_hash(resource, options) }
43
- serialized[:_embedded] = { parameters.name => serialized_resources }
44
- JSON.generate(serialized)
37
+ options[:paginate] = HALDecorator.paginate unless options.key? :paginate
38
+ hash = to_collection_hash(resources, options)
39
+ JSON.generate(hash)
45
40
  end
46
41
 
47
42
  protected
@@ -58,6 +53,20 @@ module HALDecorator
58
53
  end
59
54
  end
60
55
 
56
+ def to_collection_hash(resources, options)
57
+ parameters = collection_parameters
58
+ links = parameters.links
59
+ curies = parameters.curies
60
+ {}.tap do |serialized|
61
+ serialized.merge! _serialize_attributes(parameters.attributes, resources, nil, options)
62
+ serialized.merge! _serialize_links(links, curies, resources, nil, options)
63
+ Pagination.paginate!(serialized, resources) if options[:paginate]
64
+
65
+ serialized_resources = resources.map { |resource| to_hash(resource, options) }
66
+ serialized[:_embedded] = { parameters.name => serialized_resources }
67
+ end
68
+ end
69
+
61
70
  def serialize_attributes(resource, policy, options)
62
71
  _serialize_attributes(attributes, resource, policy, options)
63
72
  end
@@ -121,10 +130,7 @@ module HALDecorator
121
130
  decorator = embed.decorator_class
122
131
  hash[embed.name] =
123
132
  if resource.respond_to? :each
124
- decorator ||= HALDecorator.lookup_decorator(resource.first).first
125
- resource.map do |resrc|
126
- decorator.to_hash(resrc, options)
127
- end
133
+ _serialize_embedded_collection(resource, decorator, options)
128
134
  else
129
135
  decorator ||= HALDecorator.lookup_decorator(resource).first
130
136
  decorator.to_hash(resource, options)
@@ -133,6 +139,23 @@ module HALDecorator
133
139
  return {} if serialized.empty?
134
140
  { _embedded: serialized }
135
141
  end
142
+
143
+ def _serialize_embedded_collection(resources, decorator, options)
144
+ clazz = resources.first.class
145
+ decorator ||= HALDecorator.lookup_decorator(clazz)&.first
146
+ if decorator.nil?
147
+ raise Serializer::Error,
148
+ "No decorator specified to handle serializing embedded #{clazz}"
149
+ end
150
+ if decorator.respond_to?(:can_serialize_collection?, true) &&
151
+ decorator.can_serialize_collection?
152
+ decorator.to_collection_hash(resources, options)
153
+ else
154
+ resources.map do |resrc|
155
+ decorator.to_hash(resrc, options)
156
+ end
157
+ end
158
+ end
136
159
  end
137
160
  end
138
161
 
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hal_decorator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.3
4
+ version: 0.3.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sammy Henningsson
@@ -31,7 +31,7 @@ cert_chain:
31
31
  CNZdF8Vavp6xMQbPHZwqjaeZz2WRXYS7jyYSvCunjwa3OtvXtfbIEGEWE6IM+t9k
32
32
  H1g6Q+B6qk9O6g==
33
33
  -----END CERTIFICATE-----
34
- date: 2017-09-10 00:00:00.000000000 Z
34
+ date: 2017-11-22 00:00:00.000000000 Z
35
35
  dependencies:
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rake
@@ -59,7 +59,7 @@ dependencies:
59
59
  requirements:
60
60
  - - "~>"
61
61
  - !ruby/object:Gem::Version
62
- version: '5.1'
62
+ version: '5.0'
63
63
  - - ">="
64
64
  - !ruby/object:Gem::Version
65
65
  version: '4.0'
@@ -69,7 +69,7 @@ dependencies:
69
69
  requirements:
70
70
  - - "~>"
71
71
  - !ruby/object:Gem::Version
72
- version: '5.1'
72
+ version: '5.0'
73
73
  - - ">="
74
74
  - !ruby/object:Gem::Version
75
75
  version: '4.0'
@@ -113,6 +113,46 @@ dependencies:
113
113
  - - ">="
114
114
  - !ruby/object:Gem::Version
115
115
  version: '9.0'
116
+ - !ruby/object:Gem::Dependency
117
+ name: kaminari
118
+ requirement: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - "~>"
121
+ - !ruby/object:Gem::Version
122
+ version: '1.1'
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ version: 1.1.1
126
+ type: :development
127
+ prerelease: false
128
+ version_requirements: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - "~>"
131
+ - !ruby/object:Gem::Version
132
+ version: '1.1'
133
+ - - ">="
134
+ - !ruby/object:Gem::Version
135
+ version: 1.1.1
136
+ - !ruby/object:Gem::Dependency
137
+ name: will_paginate
138
+ requirement: !ruby/object:Gem::Requirement
139
+ requirements:
140
+ - - "~>"
141
+ - !ruby/object:Gem::Version
142
+ version: '3.1'
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: 3.1.6
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '3.1'
153
+ - - ">="
154
+ - !ruby/object:Gem::Version
155
+ version: 3.1.6
116
156
  description: |
117
157
  A DSL for serializing resources according to
118
158
  HypertextApplicationLanguage.
@@ -129,6 +169,7 @@ files:
129
169
  - lib/hal_decorator/embedded.rb
130
170
  - lib/hal_decorator/links.rb
131
171
  - lib/hal_decorator/model.rb
172
+ - lib/hal_decorator/pagination.rb
132
173
  - lib/hal_decorator/policy.rb
133
174
  - lib/hal_decorator/policy/dsl.rb
134
175
  - lib/hal_decorator/property.rb
metadata.gz.sig CHANGED
Binary file