yaks 0.0.0 → 0.1.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.
Files changed (67) hide show
  1. checksums.yaml +13 -5
  2. data/.gitignore +1 -0
  3. data/.travis.yml +23 -0
  4. data/Gemfile +1 -1
  5. data/Gemfile.lock +32 -6
  6. data/README.md +182 -80
  7. data/examples/hal01.rb +126 -0
  8. data/examples/jsonapi01.rb +68 -0
  9. data/examples/jsonapi02.rb +62 -0
  10. data/examples/jsonapi03.rb +86 -0
  11. data/lib/yaks.rb +55 -25
  12. data/lib/yaks/collection_mapper.rb +33 -0
  13. data/lib/yaks/collection_resource.rb +65 -0
  14. data/lib/yaks/default_policy.rb +13 -0
  15. data/lib/yaks/hal_serializer.rb +59 -0
  16. data/lib/yaks/json_api_serializer.rb +59 -0
  17. data/lib/yaks/link_lookup.rb +23 -0
  18. data/lib/yaks/mapper.rb +59 -0
  19. data/lib/yaks/mapper/association.rb +43 -0
  20. data/lib/yaks/mapper/class_methods.rb +36 -0
  21. data/lib/yaks/mapper/config.rb +79 -0
  22. data/lib/yaks/mapper/has_many.rb +15 -0
  23. data/lib/yaks/mapper/has_one.rb +10 -0
  24. data/lib/yaks/mapper/link.rb +74 -0
  25. data/lib/yaks/mapper/lookup.rb +19 -0
  26. data/lib/yaks/mapper/map_links.rb +17 -0
  27. data/lib/yaks/null_resource.rb +28 -0
  28. data/lib/yaks/primitivize.rb +34 -15
  29. data/lib/yaks/profile_registry.rb +60 -0
  30. data/lib/yaks/rel_registry.rb +20 -0
  31. data/lib/yaks/resource.rb +28 -0
  32. data/lib/yaks/resource/link.rb +21 -0
  33. data/lib/yaks/serializer.rb +11 -53
  34. data/lib/yaks/shared_options.rb +15 -0
  35. data/lib/yaks/util.rb +76 -5
  36. data/lib/yaks/version.rb +1 -1
  37. data/spec/integration/map_to_resource_spec.rb +30 -0
  38. data/spec/json/hal_plant_collection.json +34 -0
  39. data/spec/spec_helper.rb +10 -1
  40. data/spec/support/friends_mapper.rb +29 -0
  41. data/spec/support/pet_mapper.rb +5 -0
  42. data/spec/support/pet_peeve_mapper.rb +3 -0
  43. data/spec/support/serializers.rb +11 -11
  44. data/spec/support/shared_contexts.rb +47 -0
  45. data/spec/support/shorthands.rb +22 -0
  46. data/spec/yaks/collection_resource_spec.rb +9 -0
  47. data/spec/yaks/hal_serializer_spec.rb +9 -0
  48. data/spec/yaks/mapper/association_spec.rb +21 -0
  49. data/spec/yaks/mapper/class_methods_spec.rb +28 -0
  50. data/spec/yaks/mapper/config_spec.rb +77 -0
  51. data/spec/yaks/mapper/has_one_spec.rb +16 -0
  52. data/spec/yaks/mapper/link_spec.rb +42 -0
  53. data/spec/yaks/mapper/map_links_spec.rb +46 -0
  54. data/spec/yaks/mapper_spec.rb +47 -0
  55. data/spec/yaks/resource_spec.rb +23 -0
  56. data/yaks.gemspec +6 -3
  57. metadata +115 -27
  58. data/lib/yaks/dumper.rb +0 -23
  59. data/lib/yaks/fold_ams_compat.rb +0 -33
  60. data/lib/yaks/fold_json_api.rb +0 -61
  61. data/lib/yaks/serializable_association.rb +0 -21
  62. data/lib/yaks/serializable_collection.rb +0 -10
  63. data/lib/yaks/serializable_object.rb +0 -18
  64. data/lib/yaks/serializer/class_methods.rb +0 -76
  65. data/spec/integration_spec.rb +0 -57
  66. data/spec/yaks/json_api_folder_spec.rb +0 -63
  67. data/spec/yaks/serializer_spec.rb +0 -12
@@ -0,0 +1,47 @@
1
+ require 'spec_helper'
2
+
3
+ describe Yaks::Mapper do
4
+ include_context 'shorthands'
5
+
6
+ let(:mapper_class) { Class.new(Yaks::Mapper) }
7
+ let(:model) { Struct.new(:foo, :bar) }
8
+ let(:instance) { model.new('hello', 'world') }
9
+
10
+ context 'with attributes' do
11
+ before do
12
+ mapper_class.attributes :foo, :bar
13
+ end
14
+
15
+ it 'should make the configured attributes available on the instance' do
16
+ expect(mapper_class.new(Object.new).attributes).to eq Yaks::List(:foo, :bar)
17
+ end
18
+
19
+ describe 'mapping attributes' do
20
+ it 'should load them from the model' do
21
+ expect(mapper_class.new(instance).map_attributes).to eq Yaks::List([:foo, 'hello'], [:bar, 'world'])
22
+ end
23
+ end
24
+ end
25
+
26
+ describe 'profile links' do
27
+ before do
28
+ mapper_class.profile :show
29
+ end
30
+
31
+ context 'with a dummy registry' do
32
+ it 'should create a link with the profile name as the uri' do
33
+ expect(mapper_class.new(instance).map_links).to eq Yaks::List(resource_link[:profile, 'show'])
34
+ end
35
+ end
36
+
37
+ context 'with a registered profile' do
38
+ let(:registry) { Yaks::ProfileRegistry.create { profile :show, 'http://my.api/docs/show' } }
39
+
40
+ let(:mapper) { mapper_class.new(instance, profile_registry:registry) }
41
+
42
+ it 'should look up and use the correct uri' do
43
+ expect(mapper.map_links).to eq Yaks::List(resource_link[:profile, 'http://my.api/docs/show'])
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe Yaks::Resource do
4
+ include_context 'shorthands'
5
+
6
+ let(:object) { described_class.new(attributes, links, subresources) }
7
+ let(:attributes) { {} }
8
+ let(:links) { [] }
9
+ let(:subresources) { {} }
10
+
11
+ describe '#uri' do
12
+ subject { object.uri }
13
+
14
+ context 'without a self link' do
15
+ it { should be_nil }
16
+ end
17
+
18
+ context 'with a self link' do
19
+ let(:links) { [ resource_link[:self, '/foo/this_is_me/7'] ] }
20
+ it { should eq '/foo/this_is_me/7' }
21
+ end
22
+ end
23
+ end
data/yaks.gemspec CHANGED
@@ -17,12 +17,15 @@ Gem::Specification.new do |gem|
17
17
  gem.test_files = `git ls-files -- spec`.split($/)
18
18
  gem.extra_rdoc_files = %w[README.md]
19
19
 
20
- gem.add_runtime_dependency 'hamster' , '~> 0.4.3' # 128k , flog: 1851.8
21
- gem.add_runtime_dependency 'inflection' , '~> 1.0.0' # 12k , flog: 226.8
22
- gem.add_runtime_dependency 'concord' , '~> 0.1.4' # 8k , flog: 62.3
20
+ gem.add_runtime_dependency 'hamster' , '~> 0.4.3' # 128k , flog: 1851.8
21
+ gem.add_runtime_dependency 'inflection' , '~> 1.0.0' # 12k , flog: 226.8
22
+ gem.add_runtime_dependency 'concord' , '~> 0.1.4' # 8k , flog: 62.3
23
+ gem.add_runtime_dependency 'uri_template' , '~> 0.6.0' # 104k , flog: 1521.4
23
24
 
24
25
  # For comparison, ActiveSupport has a flog score of 11134.7
25
26
 
26
27
  gem.add_development_dependency 'virtus'
27
28
  gem.add_development_dependency 'rspec'
29
+ gem.add_development_dependency 'coveralls'
30
+ gem.add_development_dependency 'rake'
28
31
  end
metadata CHANGED
@@ -1,16 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yaks
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Arne Brasseur
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-12-11 00:00:00.000000000 Z
11
+ date: 2014-03-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
+ prerelease: false
14
15
  name: hamster
15
16
  requirement: !ruby/object:Gem::Requirement
16
17
  requirements:
@@ -18,13 +19,13 @@ dependencies:
18
19
  - !ruby/object:Gem::Version
19
20
  version: 0.4.3
20
21
  type: :runtime
21
- prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ~>
25
25
  - !ruby/object:Gem::Version
26
26
  version: 0.4.3
27
27
  - !ruby/object:Gem::Dependency
28
+ prerelease: false
28
29
  name: inflection
29
30
  requirement: !ruby/object:Gem::Requirement
30
31
  requirements:
@@ -32,13 +33,13 @@ dependencies:
32
33
  - !ruby/object:Gem::Version
33
34
  version: 1.0.0
34
35
  type: :runtime
35
- prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ~>
39
39
  - !ruby/object:Gem::Version
40
40
  version: 1.0.0
41
41
  - !ruby/object:Gem::Dependency
42
+ prerelease: false
42
43
  name: concord
43
44
  requirement: !ruby/object:Gem::Requirement
44
45
  requirements:
@@ -46,38 +47,79 @@ dependencies:
46
47
  - !ruby/object:Gem::Version
47
48
  version: 0.1.4
48
49
  type: :runtime
49
- prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - ~>
53
53
  - !ruby/object:Gem::Version
54
54
  version: 0.1.4
55
55
  - !ruby/object:Gem::Dependency
56
+ prerelease: false
57
+ name: uri_template
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ~>
61
+ - !ruby/object:Gem::Version
62
+ version: 0.6.0
63
+ type: :runtime
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: 0.6.0
69
+ - !ruby/object:Gem::Dependency
70
+ prerelease: false
56
71
  name: virtus
57
72
  requirement: !ruby/object:Gem::Requirement
58
73
  requirements:
59
- - - '>='
74
+ - - ! '>='
60
75
  - !ruby/object:Gem::Version
61
76
  version: '0'
62
77
  type: :development
63
- prerelease: false
64
78
  version_requirements: !ruby/object:Gem::Requirement
65
79
  requirements:
66
- - - '>='
80
+ - - ! '>='
67
81
  - !ruby/object:Gem::Version
68
82
  version: '0'
69
83
  - !ruby/object:Gem::Dependency
84
+ prerelease: false
70
85
  name: rspec
71
86
  requirement: !ruby/object:Gem::Requirement
72
87
  requirements:
73
- - - '>='
88
+ - - ! '>='
74
89
  - !ruby/object:Gem::Version
75
90
  version: '0'
76
91
  type: :development
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ! '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ prerelease: false
99
+ name: coveralls
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ! '>='
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ type: :development
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ! '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
77
112
  prerelease: false
113
+ name: rake
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ! '>='
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ type: :development
78
120
  version_requirements: !ruby/object:Gem::Requirement
79
121
  requirements:
80
- - - '>='
122
+ - - ! '>='
81
123
  - !ruby/object:Gem::Version
82
124
  version: '0'
83
125
  description: Serialize to JSON-API and similar
@@ -89,28 +131,61 @@ extra_rdoc_files:
89
131
  - README.md
90
132
  files:
91
133
  - .gitignore
134
+ - .travis.yml
92
135
  - Gemfile
93
136
  - Gemfile.lock
94
137
  - README.md
138
+ - examples/hal01.rb
139
+ - examples/jsonapi01.rb
140
+ - examples/jsonapi02.rb
141
+ - examples/jsonapi03.rb
95
142
  - lib/yaks.rb
96
- - lib/yaks/dumper.rb
97
- - lib/yaks/fold_ams_compat.rb
98
- - lib/yaks/fold_json_api.rb
143
+ - lib/yaks/collection_mapper.rb
144
+ - lib/yaks/collection_resource.rb
145
+ - lib/yaks/default_policy.rb
146
+ - lib/yaks/hal_serializer.rb
147
+ - lib/yaks/json_api_serializer.rb
148
+ - lib/yaks/link_lookup.rb
149
+ - lib/yaks/mapper.rb
150
+ - lib/yaks/mapper/association.rb
151
+ - lib/yaks/mapper/class_methods.rb
152
+ - lib/yaks/mapper/config.rb
153
+ - lib/yaks/mapper/has_many.rb
154
+ - lib/yaks/mapper/has_one.rb
155
+ - lib/yaks/mapper/link.rb
156
+ - lib/yaks/mapper/lookup.rb
157
+ - lib/yaks/mapper/map_links.rb
158
+ - lib/yaks/null_resource.rb
99
159
  - lib/yaks/primitivize.rb
100
- - lib/yaks/serializable_association.rb
101
- - lib/yaks/serializable_collection.rb
102
- - lib/yaks/serializable_object.rb
160
+ - lib/yaks/profile_registry.rb
161
+ - lib/yaks/rel_registry.rb
162
+ - lib/yaks/resource.rb
163
+ - lib/yaks/resource/link.rb
103
164
  - lib/yaks/serializer.rb
104
- - lib/yaks/serializer/class_methods.rb
165
+ - lib/yaks/shared_options.rb
105
166
  - lib/yaks/util.rb
106
167
  - lib/yaks/version.rb
107
- - spec/integration_spec.rb
168
+ - spec/integration/map_to_resource_spec.rb
169
+ - spec/json/hal_plant_collection.json
108
170
  - spec/spec_helper.rb
109
171
  - spec/support/fixtures.rb
172
+ - spec/support/friends_mapper.rb
110
173
  - spec/support/models.rb
174
+ - spec/support/pet_mapper.rb
175
+ - spec/support/pet_peeve_mapper.rb
111
176
  - spec/support/serializers.rb
112
- - spec/yaks/json_api_folder_spec.rb
113
- - spec/yaks/serializer_spec.rb
177
+ - spec/support/shared_contexts.rb
178
+ - spec/support/shorthands.rb
179
+ - spec/yaks/collection_resource_spec.rb
180
+ - spec/yaks/hal_serializer_spec.rb
181
+ - spec/yaks/mapper/association_spec.rb
182
+ - spec/yaks/mapper/class_methods_spec.rb
183
+ - spec/yaks/mapper/config_spec.rb
184
+ - spec/yaks/mapper/has_one_spec.rb
185
+ - spec/yaks/mapper/link_spec.rb
186
+ - spec/yaks/mapper/map_links_spec.rb
187
+ - spec/yaks/mapper_spec.rb
188
+ - spec/yaks/resource_spec.rb
114
189
  - yaks.gemspec
115
190
  homepage: https://github.com/plexus/yaks
116
191
  licenses:
@@ -122,26 +197,39 @@ require_paths:
122
197
  - lib
123
198
  required_ruby_version: !ruby/object:Gem::Requirement
124
199
  requirements:
125
- - - '>='
200
+ - - ! '>='
126
201
  - !ruby/object:Gem::Version
127
202
  version: '0'
128
203
  required_rubygems_version: !ruby/object:Gem::Requirement
129
204
  requirements:
130
- - - '>='
205
+ - - ! '>='
131
206
  - !ruby/object:Gem::Version
132
207
  version: '0'
133
208
  requirements: []
134
209
  rubyforge_project:
135
- rubygems_version: 2.0.3
210
+ rubygems_version: 2.2.1
136
211
  signing_key:
137
212
  specification_version: 4
138
213
  summary: Serialize to JSON-API and similar
139
214
  test_files:
140
- - spec/integration_spec.rb
215
+ - spec/integration/map_to_resource_spec.rb
216
+ - spec/json/hal_plant_collection.json
141
217
  - spec/spec_helper.rb
142
218
  - spec/support/fixtures.rb
219
+ - spec/support/friends_mapper.rb
143
220
  - spec/support/models.rb
221
+ - spec/support/pet_mapper.rb
222
+ - spec/support/pet_peeve_mapper.rb
144
223
  - spec/support/serializers.rb
145
- - spec/yaks/json_api_folder_spec.rb
146
- - spec/yaks/serializer_spec.rb
147
- has_rdoc:
224
+ - spec/support/shared_contexts.rb
225
+ - spec/support/shorthands.rb
226
+ - spec/yaks/collection_resource_spec.rb
227
+ - spec/yaks/hal_serializer_spec.rb
228
+ - spec/yaks/mapper/association_spec.rb
229
+ - spec/yaks/mapper/class_methods_spec.rb
230
+ - spec/yaks/mapper/config_spec.rb
231
+ - spec/yaks/mapper/has_one_spec.rb
232
+ - spec/yaks/mapper/link_spec.rb
233
+ - spec/yaks/mapper/map_links_spec.rb
234
+ - spec/yaks/mapper_spec.rb
235
+ - spec/yaks/resource_spec.rb
data/lib/yaks/dumper.rb DELETED
@@ -1,23 +0,0 @@
1
- module Yaks
2
- class Dumper
3
- include Util
4
-
5
- def initialize(options = {})
6
- @lookup = options.fetch(:serializer_lookup) { Yaks.default_serializer_lookup }
7
- format = options.fetch(:format) { :json_api }
8
- @format = Yaks.const_get("Fold#{camelize(format.to_s)}") if format.is_a?(Symbol)
9
- @options = options
10
- end
11
-
12
- def dump(type, objects)
13
- serializer = @lookup.(type).new(@options.merge(root_key: type))
14
- Primitivize.(
15
- @format.new(
16
- serializer.serializable_collection(objects)
17
- ).fold
18
- )
19
- end
20
- alias call dump
21
-
22
- end
23
- end
@@ -1,33 +0,0 @@
1
- module Yaks
2
- class FoldAmsCompat < FoldJsonApi
3
- include Concord.new(:collection)
4
- include Util
5
- extend Forwardable
6
-
7
- def_delegator :collection, :root_key
8
-
9
- def fold
10
- Hamster.hash(
11
- root_key => collection.map(&method(:fold_object)),
12
- ).merge(
13
- fold_associated_objects
14
- )
15
- end
16
-
17
- private
18
-
19
- def fold_object(object)
20
- object.attributes.merge(link_ids(object))
21
- end
22
-
23
- def fold_association_ids(hash, association)
24
- name = singular(association.name.to_s)
25
- if association.one?
26
- hash.put(name + '_id', association.identities.first)
27
- else
28
- hash.put(name + '_ids', association.identities)
29
- end
30
- end
31
-
32
- end
33
- end
@@ -1,61 +0,0 @@
1
- module Yaks
2
- class FoldJsonApi
3
- include Concord.new(:collection)
4
- include Util
5
- extend Forwardable
6
-
7
- def_delegator :collection, :root_key
8
-
9
- def fold
10
- Hamster.hash(
11
- root_key => collection.map(&method(:fold_object)),
12
- "linked" => fold_associated_objects
13
- )
14
- end
15
-
16
- private
17
-
18
- def fold_object(object)
19
- if object.has_associated_objects?
20
- object.attributes.merge(Hamster.hash(links: link_ids(object)))
21
- else
22
- object.attributes
23
- end
24
- end
25
-
26
- def link_ids(object)
27
- object.associations.reduce(
28
- Hamster.hash,
29
- &method(:fold_association_ids)
30
- )
31
- end
32
-
33
- def fold_association_ids(hash, association)
34
- if association.one?
35
- hash.put(association.name, association.identities.first)
36
- else
37
- hash.put(association.name, association.identities)
38
- end
39
- end
40
-
41
- def fold_associated_objects
42
- association_names = Hamster.set(*
43
- collection.flat_map do |object|
44
- object.associations.map{|ass| [ass.name, ass.one?] }
45
- end
46
- )
47
- Hamster.hash(
48
- association_names.map do |name, one|
49
- [
50
- one ? pluralize(name.to_s) : name,
51
- Hamster.set(*
52
- collection.flat_map do |object|
53
- object.associated_objects(name)
54
- end
55
- ).map(&method(:fold_object))
56
- ]
57
- end
58
- )
59
- end
60
- end
61
- end