hal_decorator 0.3.0 → 0.3.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 17e8c82477966a527d6a2f9d51120641f2b6bb11
4
- data.tar.gz: 8a4043e183c059f458c5495cb4eb287e7b3e6278
3
+ metadata.gz: 8343a995eb8b48575002dae6dd95cb7537403209
4
+ data.tar.gz: c1547111bfdec4083e4fdd4048eba42b32a79e8d
5
5
  SHA512:
6
- metadata.gz: 674b6c85ae4dc3b1498bb0386d24903504aa7a026a2fc6592891c098117b08ba2f7c696ce26161ddf88009bed66c02e9d5dcfe18c74ead3a7d9f430515ce05d2
7
- data.tar.gz: 5ad6702a98818ab1fde31b646cb77b766cc60688dfc5858bf3105a43cbcda1db6509d6f1d4506ff89f9fae18801f2d7464c1fc6e241c7be2a04dff5f39f4531d
6
+ metadata.gz: d168ffdf32bdb764797f3eb82b5145459976efeff5b8121a7485ea8eeea594b01439f9fc8270948d280e491c48361491f7da8a09e3a4f4e627a885fec59a2dc4
7
+ data.tar.gz: 7f5217f70e6ef567590d423987c1b07e94ae23cee953f629c0084ba2c02bbab1147139998bff8d538959e120c6bca63eaea9526b731adeb7189011eddb458824
checksums.yaml.gz.sig CHANGED
Binary file
@@ -0,0 +1,59 @@
1
+ module HALDecorator
2
+ module Policy
3
+ module DSL
4
+
5
+ module ClassMethods
6
+ attr_reader :rules
7
+
8
+ def attribute(name, &block)
9
+ @rules ||= {}
10
+ @rules[:attributes] ||= {}
11
+ @rules[:attributes][name] = block
12
+ end
13
+
14
+ def link(rel, &block)
15
+ @rules ||= {}
16
+ @rules[:links] ||= {}
17
+ @rules[:links][rel] = block
18
+ end
19
+
20
+ def embed(name, &block)
21
+ @rules ||= {}
22
+ @rules[:embeds] ||= {}
23
+ @rules[:embeds][name] = block
24
+ end
25
+ end
26
+
27
+ def self.included(mod)
28
+ mod.extend(ClassMethods)
29
+ end
30
+
31
+ def initialize(current_user = nil, resource)
32
+ @current_user = current_user
33
+ @resource = resource
34
+ end
35
+
36
+ def attribute?(name)
37
+ run self.class.rules&.dig(:attributes, name)
38
+ end
39
+
40
+ def link?(rel)
41
+ run self.class.rules&.dig(:links, rel)
42
+ end
43
+
44
+ def embed?(name)
45
+ run self.class.rules&.dig(:embeds, name)
46
+ end
47
+
48
+ private
49
+
50
+ attr_reader :current_user, :resource
51
+
52
+ def run(block)
53
+ return false unless block && block.respond_to?(:call)
54
+ instance_eval(&block) && true || false
55
+ end
56
+
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,22 @@
1
+ module HALDecorator
2
+ module Policy
3
+
4
+ def policy(clazz)
5
+ @_policy = clazz
6
+ end
7
+
8
+ protected
9
+
10
+ def policy_class
11
+ @_policy ||= init_policy
12
+ end
13
+
14
+ private
15
+
16
+ def init_policy
17
+ return unless is_a? Class
18
+ return unless superclass.respond_to?(:policy_class, true)
19
+ superclass.policy_class
20
+ end
21
+ end
22
+ end
@@ -36,8 +36,8 @@ module HALDecorator
36
36
  end
37
37
  links = parameters.links
38
38
  curies = parameters.curies
39
- serialized = _serialize_attributes(parameters.attributes, resources, options)
40
- serialized.merge! _serialize_links(links, curies, resources, options)
39
+ serialized = _serialize_attributes(parameters.attributes, resources, nil, options)
40
+ serialized.merge! _serialize_links(links, curies, resources, nil, options)
41
41
 
42
42
  serialized_resources = resources.map { |resource| to_hash(resource, options) }
43
43
  serialized[:_embedded] = { parameters.name => serialized_resources }
@@ -47,29 +47,31 @@ module HALDecorator
47
47
  protected
48
48
 
49
49
  def to_hash(resource, options)
50
+ policy = policy_class&.new(options[:current_user], resource)
51
+
50
52
  {}.tap do |serialized|
51
- serialized.merge! serialize_attributes(resource, options)
52
- serialized.merge! serialize_links(resource, options)
53
- serialized.merge! serialize_embedded(resource, options)
53
+ serialized.merge! serialize_attributes(resource, policy, options)
54
+ serialized.merge! serialize_links(resource, policy, options)
55
+ serialized.merge! serialize_embedded(resource, policy, options)
54
56
 
55
57
  run_post_serialize_hook!(resource, options, serialized)
56
58
  end
57
59
  end
58
60
 
59
- def serialize_attributes(resource, options)
60
- _serialize_attributes(attributes, resource, options)
61
+ def serialize_attributes(resource, policy, options)
62
+ _serialize_attributes(attributes, resource, policy, options)
61
63
  end
62
64
 
63
- def serialize_links(resource, options)
64
- _serialize_links(links, curies, resource, options)
65
+ def serialize_links(resource, policy, options)
66
+ _serialize_links(links, curies, resource, policy, options)
65
67
  end
66
68
 
67
- def serialize_curies(resource, options)
68
- _serialize_curies(curies, resource, options)
69
+ def serialize_curies(resource, policy, options)
70
+ _serialize_curies(curies, resource, policy, options)
69
71
  end
70
72
 
71
- def serialize_embedded(resource, options)
72
- _serialize_embedded(embedded, resource, options)
73
+ def serialize_embedded(resource, policy, options)
74
+ _serialize_embedded(embedded, resource, policy, options)
73
75
  end
74
76
 
75
77
  def run_post_serialize_hook!(resource, options, serialized)
@@ -79,27 +81,30 @@ module HALDecorator
79
81
 
80
82
  private
81
83
 
82
- def _serialize_attributes(attributes, resource, options)
84
+ def _serialize_attributes(attributes, resource, policy, options)
83
85
  attributes.each_with_object({}) do |attribute, hash|
86
+ next if policy && !policy.attribute?(attribute.name)
84
87
  hash[attribute.name] = attribute.value(resource, options)
85
88
  end
86
89
  end
87
90
 
88
- def _serialize_links(links, curies, resource, options)
91
+ def _serialize_links(links, curies, resource, policy, options)
89
92
  serialized = links.each_with_object({}) do |link, hash|
93
+ next if policy && !policy.link?(link.rel)
90
94
  href = link.value(resource, options) or next
91
95
  hash[link.rel] = { href: HALDecorator.href(href) }.tap do |s|
92
96
  s[:method] = link.http_method if link.http_method
93
97
  end
94
98
  end
95
- curies = _serialize_curies(curies, resource, options)
99
+ curies = _serialize_curies(curies, resource, policy, options)
96
100
  serialized[:curies] = curies if curies.any?
97
101
  return {} if serialized.empty?
98
102
  { _links: serialized }
99
103
  end
100
104
 
101
- def _serialize_curies(curies, resource, options)
105
+ def _serialize_curies(curies, resource, policy, options)
102
106
  curies.each_with_object([]) do |curie, array|
107
+ next if policy && !policy.link?(curie.name)
103
108
  href = curie.value(resource, options) or next
104
109
  array << {
105
110
  name: curie.name,
@@ -109,8 +114,9 @@ module HALDecorator
109
114
  end
110
115
  end
111
116
 
112
- def _serialize_embedded(embedded, object, options)
117
+ def _serialize_embedded(embedded, object, policy, options)
113
118
  serialized = embedded.each_with_object({}) do |embed, hash|
119
+ next if policy && !policy.embed?(embed.name)
114
120
  resource = embed.value(object, options) or next
115
121
  decorator = embed.decorator_class
116
122
  hash[embed.name] =
data/lib/hal_decorator.rb CHANGED
@@ -1,8 +1,10 @@
1
+ require 'hal_decorator/model'
2
+ require 'hal_decorator/policy'
3
+ require 'hal_decorator/policy/dsl'
1
4
  require 'hal_decorator/attributes'
2
- require 'hal_decorator/embedded'
3
5
  require 'hal_decorator/links'
6
+ require 'hal_decorator/embedded'
4
7
  require 'hal_decorator/curies'
5
- require 'hal_decorator/model'
6
8
  require 'hal_decorator/serializer'
7
9
  require 'hal_decorator/deserializer'
8
10
  require 'hal_decorator/collection'
@@ -18,4 +20,5 @@ module HALDecorator
18
20
  include HALDecorator::Model
19
21
  include HALDecorator::Serializer
20
22
  include HALDecorator::Deserializer
23
+ include HALDecorator::Policy
21
24
  end
data.tar.gz.sig CHANGED
@@ -1 +1 @@
1
- �^�^��YN܅�@�Bn@d�S�`��� $� "��&�&0fH
1
+ �Bpo:r�����(1�a���)����iD�#���_ȍ>S�]�<5P�<���23��USVZ���13oԔ�˾��%��Eg�Q괸H����Dcq�P_�Eֈȵ>�.Y��+��'�S����k)���+���v��Q�i2�ӖQ|�bfG�Փ.��P��9Wx7� ��Ʉ����=�+���DŇ�[����� twm›,������8���-������甋4��e�[Lś�z�νѨ֬(q.c
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.0
4
+ version: 0.3.1
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-08-29 00:00:00.000000000 Z
34
+ date: 2017-09-03 00:00:00.000000000 Z
35
35
  dependencies:
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rake
@@ -114,7 +114,7 @@ dependencies:
114
114
  - !ruby/object:Gem::Version
115
115
  version: '9.0'
116
116
  description: |
117
- Serialize resources according to
117
+ A DSL for serializing resources according to
118
118
  HypertextApplicationLanguage.
119
119
  email: sammy.henningsson@gmail.com
120
120
  executables: []
@@ -129,6 +129,8 @@ files:
129
129
  - lib/hal_decorator/embedded.rb
130
130
  - lib/hal_decorator/links.rb
131
131
  - lib/hal_decorator/model.rb
132
+ - lib/hal_decorator/policy.rb
133
+ - lib/hal_decorator/policy/dsl.rb
132
134
  - lib/hal_decorator/property.rb
133
135
  - lib/hal_decorator/serialize_hooks.rb
134
136
  - lib/hal_decorator/serializer.rb
@@ -152,7 +154,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
152
154
  version: '0'
153
155
  requirements: []
154
156
  rubyforge_project:
155
- rubygems_version: 2.6.11
157
+ rubygems_version: 2.6.13
156
158
  signing_key:
157
159
  specification_version: 4
158
160
  summary: HAL serializer
metadata.gz.sig CHANGED
Binary file