yaks 0.6.0.alpha.1 → 0.6.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 (65) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +46 -0
  3. data/lib/yaks/attributes.rb +45 -0
  4. data/lib/yaks/collection_resource.rb +1 -45
  5. data/lib/yaks/config/dsl.rb +15 -6
  6. data/lib/yaks/config.rb +1 -1
  7. data/lib/yaks/configurable.rb +20 -0
  8. data/lib/yaks/default_policy.rb +0 -8
  9. data/lib/yaks/errors.rb +3 -0
  10. data/lib/yaks/format/hal.rb +13 -2
  11. data/lib/yaks/format/halo.rb +29 -0
  12. data/lib/yaks/mapper/association.rb +18 -13
  13. data/lib/yaks/mapper/association_mapper.rb +1 -1
  14. data/lib/yaks/mapper/attribute.rb +1 -3
  15. data/lib/yaks/mapper/class_methods.rb +24 -16
  16. data/lib/yaks/mapper/config.rb +13 -28
  17. data/lib/yaks/mapper/control.rb +38 -0
  18. data/lib/yaks/mapper/has_many.rb +4 -8
  19. data/lib/yaks/mapper/link.rb +10 -2
  20. data/lib/yaks/mapper.rb +11 -2
  21. data/lib/yaks/resource/control.rb +11 -0
  22. data/lib/yaks/resource/link.rb +1 -7
  23. data/lib/yaks/resource.rb +9 -13
  24. data/lib/yaks/runner.rb +2 -4
  25. data/lib/yaks/serializer.rb +12 -0
  26. data/lib/yaks/stateful_builder.rb +54 -0
  27. data/lib/yaks/version.rb +1 -1
  28. data/lib/yaks.rb +16 -7
  29. data/spec/acceptance/acceptance_spec.rb +14 -4
  30. data/spec/acceptance/models.rb +9 -0
  31. data/spec/integration/map_to_resource_spec.rb +1 -1
  32. data/spec/json/confucius.halo.json +80 -0
  33. data/spec/spec_helper.rb +5 -0
  34. data/spec/support/shared_contexts.rb +1 -1
  35. data/spec/unit/yaks/attributes_spec.rb +65 -0
  36. data/spec/unit/yaks/collection_mapper_spec.rb +1 -1
  37. data/spec/unit/yaks/collection_resource_spec.rb +7 -25
  38. data/spec/unit/yaks/config/dsl_spec.rb +5 -0
  39. data/spec/unit/yaks/config_spec.rb +2 -1
  40. data/spec/unit/yaks/configurable_spec.rb +25 -0
  41. data/spec/unit/yaks/default_policy_spec.rb +1 -7
  42. data/spec/unit/yaks/format/collection_json_spec.rb +1 -1
  43. data/spec/unit/yaks/format/hal_spec.rb +2 -2
  44. data/spec/unit/yaks/format/html_spec.rb +5 -0
  45. data/spec/unit/yaks/format/json_api_spec.rb +1 -1
  46. data/spec/unit/yaks/format_spec.rb +1 -5
  47. data/spec/unit/yaks/mapper/association_mapper_spec.rb +2 -2
  48. data/spec/unit/yaks/mapper/association_spec.rb +27 -3
  49. data/spec/unit/yaks/mapper/class_methods_spec.rb +17 -1
  50. data/spec/unit/yaks/mapper/config_spec.rb +16 -8
  51. data/spec/unit/yaks/mapper/has_many_spec.rb +15 -2
  52. data/spec/unit/yaks/mapper/has_one_spec.rb +1 -1
  53. data/spec/unit/yaks/mapper/link_spec.rb +12 -2
  54. data/spec/unit/yaks/mapper_spec.rb +51 -22
  55. data/spec/unit/yaks/resource/link_spec.rb +2 -1
  56. data/spec/unit/yaks/resource_spec.rb +16 -9
  57. data/spec/unit/yaks/runner_spec.rb +22 -2
  58. data/spec/unit/yaks/serializer_spec.rb +20 -0
  59. data/spec/unit/yaks/stateful_builder_spec.rb +41 -0
  60. data/yaks.gemspec +1 -0
  61. metadata +39 -11
  62. data/lib/yaks/fp/hash_updatable.rb +0 -19
  63. data/lib/yaks/fp/updatable.rb +0 -17
  64. data/spec/unit/yaks/fp/hash_updatable_spec.rb +0 -22
  65. data/spec/unit/yaks/fp/updatable_spec.rb +0 -22
@@ -4,6 +4,7 @@ RSpec.describe Yaks::Mapper::ClassMethods do
4
4
  subject(:mapper_class) do
5
5
  Class.new do
6
6
  extend Yaks::Mapper::ClassMethods
7
+ config Yaks::Mapper::Config.new
7
8
  attributes :foo, :bar
8
9
  link :some_rel, 'http://some_link'
9
10
  has_one :thing
@@ -53,7 +54,7 @@ RSpec.describe Yaks::Mapper::ClassMethods do
53
54
 
54
55
  it 'should register links' do
55
56
  expect(mapper_class.config.links).to eq [
56
- Yaks::Mapper::Link.new(:some_rel, 'http://some_link', {})
57
+ Yaks::Mapper::Link.new(rel: :some_rel, template: 'http://some_link')
57
58
  ]
58
59
  end
59
60
 
@@ -64,4 +65,19 @@ RSpec.describe Yaks::Mapper::ClassMethods do
64
65
  ]
65
66
  end
66
67
 
68
+ describe '#config' do
69
+ it 'should allow getting the config' do
70
+ expect(subject.config).to be_a Yaks::Mapper::Config
71
+ end
72
+
73
+ it 'should allow setting the config' do
74
+ subject.config(:foo)
75
+ expect(subject.config).to be :foo
76
+ end
77
+
78
+ it 'raise an exception when the config is nil' do
79
+ expect { subject.config(nil) }.to raise_exception
80
+ end
81
+ end
82
+
67
83
  end
@@ -3,10 +3,18 @@ require 'spec_helper'
3
3
  RSpec.describe Yaks::Mapper::Config do
4
4
  Undefined = Yaks::Undefined
5
5
 
6
- subject(:config) { described_class.new(nil, [], [], []) }
6
+ subject(:config) { described_class.new }
7
7
 
8
8
  describe '#initialize' do
9
- subject(:config) { described_class.new('foo', [:a], [:b], [:c]) }
9
+ subject(:config) do
10
+ described_class.new(
11
+ type: 'foo',
12
+ attributes: [:a],
13
+ links: [:b],
14
+ associations: [:c]
15
+ )
16
+ end
17
+
10
18
 
11
19
  its(:type) { should eql 'foo' }
12
20
  its(:attributes) { should eql [:a] }
@@ -58,8 +66,8 @@ RSpec.describe Yaks::Mapper::Config do
58
66
  }
59
67
 
60
68
  it 'should have the links in the link list' do
61
- expect(config.links).to include Yaks::Mapper::Link.new(:profile, '/profile/foo', {})
62
- expect(config.links).to include Yaks::Mapper::Link.new(:self, '/foo/bar/{id}', {})
69
+ expect(config.links).to include Yaks::Mapper::Link.new(rel: :profile, template: '/profile/foo')
70
+ expect(config.links).to include Yaks::Mapper::Link.new(rel: :self, template: '/foo/bar/{id}')
63
71
  end
64
72
  end
65
73
 
@@ -72,8 +80,8 @@ RSpec.describe Yaks::Mapper::Config do
72
80
 
73
81
  it 'should have the links in the defined order' do
74
82
  expect(config.links).to eql [
75
- Yaks::Mapper::Link.new(:self, '/foo/self', {}),
76
- Yaks::Mapper::Link.new(:self, '/foo/me', {})
83
+ Yaks::Mapper::Link.new(rel: :self, template: '/foo/self'),
84
+ Yaks::Mapper::Link.new(rel: :self, template: '/foo/me')
77
85
  ]
78
86
  end
79
87
  end
@@ -85,7 +93,7 @@ RSpec.describe Yaks::Mapper::Config do
85
93
 
86
94
  it 'should have the association configured' do
87
95
  expect(config.associations).to eq [
88
- Yaks::Mapper::HasOne.new(name: :mother, mapper: Yaks::Mapper)
96
+ Yaks::Mapper::HasOne.new(name: :mother, item_mapper: Yaks::Mapper)
89
97
  ]
90
98
  end
91
99
  end
@@ -118,7 +126,7 @@ RSpec.describe Yaks::Mapper::Config do
118
126
 
119
127
  it 'should have the association configured' do
120
128
  expect(config.associations).to eq [
121
- Yaks::Mapper::HasMany.new(name: :shoes, mapper: Yaks::Mapper)
129
+ Yaks::Mapper::HasMany.new(name: :shoes, item_mapper: Yaks::Mapper)
122
130
  ]
123
131
  end
124
132
  end
@@ -10,7 +10,7 @@ RSpec.describe Yaks::Mapper::HasMany do
10
10
  type 'closet'
11
11
  has_many :shoes,
12
12
  rel: 'http://foo/shoes',
13
- mapper: Class.new(Yaks::Mapper) { type 'shoe' ; attributes :size, :color }
13
+ item_mapper: Class.new(Yaks::Mapper) { type 'shoe' ; attributes :size, :color }
14
14
  end
15
15
  end
16
16
 
@@ -70,12 +70,25 @@ RSpec.describe Yaks::Mapper::HasMany do
70
70
 
71
71
  describe '#collection_mapper' do
72
72
  let(:collection_mapper) { Yaks::Undefined }
73
- subject(:has_many) { described_class.new(name: :name, mapper: :mapper, rel: :rel, collection_mapper: collection_mapper) }
73
+
74
+ subject(:has_many) { described_class.new(name: :name, item_mapper: :mapper, rel: :rel, collection_mapper: collection_mapper) }
74
75
 
75
76
  context 'when the collection mapper is undefined' do
76
77
  it 'should derive one from collection and policy' do
77
78
  expect(has_many.collection_mapper([], Yaks::DefaultPolicy.new)).to equal Yaks::CollectionMapper
78
79
  end
80
+
81
+ it 'should return nil if no policy is given' do
82
+ expect(has_many.collection_mapper([])).to be_nil
83
+ end
84
+
85
+ it 'should return nil if no collection is given' do
86
+ expect(has_many.collection_mapper(nil, Yaks::DefaultPolicy.new)).to be_nil
87
+ end
88
+
89
+ it 'should return nil if no params are given' do
90
+ expect(has_many.collection_mapper).to be_nil
91
+ end
79
92
  end
80
93
 
81
94
  context 'when the collection mapper is specified' do
@@ -8,7 +8,7 @@ RSpec.describe Yaks::Mapper::HasOne do
8
8
  subject(:has_one) do
9
9
  described_class.new(
10
10
  name: :author,
11
- mapper: association_mapper,
11
+ item_mapper: association_mapper,
12
12
  rel: 'http://rel'
13
13
  )
14
14
  end
@@ -3,7 +3,7 @@ require 'spec_helper'
3
3
  RSpec.describe Yaks::Mapper::Link do
4
4
  include_context 'yaks context'
5
5
 
6
- subject(:link) { described_class.new(rel, template, options) }
6
+ subject(:link) { described_class.create(rel, template, options) }
7
7
 
8
8
  let(:rel) { :next }
9
9
  let(:template) { '/foo/bar/{x}/{y}' }
@@ -29,7 +29,7 @@ RSpec.describe Yaks::Mapper::Link do
29
29
  describe '#add_to_resource' do
30
30
  it 'should add itself to the resource' do
31
31
  expect(link.add_to_resource(Yaks::Resource.new, mapper, yaks_context)).to eql(
32
- Yaks::Resource.new(links: [Yaks::Resource::Link.new(:next, "/foo/bar/3/4", {})])
32
+ Yaks::Resource.new(links: [Yaks::Resource::Link.new(rel: :next, uri: "/foo/bar/3/4")])
33
33
  )
34
34
  end
35
35
 
@@ -193,4 +193,14 @@ RSpec.describe Yaks::Mapper::Link do
193
193
  end
194
194
  end
195
195
 
196
+ describe '.create' do
197
+ it 'should take positional arguments' do
198
+ expect(Yaks::Mapper::Link.create(:foo, :bar, {baz: 3}))
199
+ .to eql Yaks::Mapper::Link.new(rel: :foo, template: :bar, options: {baz: 3})
200
+ end
201
+
202
+ it 'should default options' do
203
+ expect(Yaks::Mapper::Link.create(:foo, :bar).options).to eql({})
204
+ end
205
+ end
196
206
  end
@@ -51,12 +51,12 @@ RSpec.describe Yaks::Mapper do
51
51
 
52
52
  it 'should map the link' do
53
53
  expect(resource.links).to eq [
54
- Yaks::Resource::Link.new(:profile, 'http://foo/bar', {})
54
+ Yaks::Resource::Link.new(rel: :profile, uri: 'http://foo/bar')
55
55
  ]
56
56
  end
57
57
 
58
58
  it 'should use the link in the resource' do
59
- expect(resource.links).to include Yaks::Resource::Link.new(:profile, 'http://foo/bar', {})
59
+ expect(resource.links).to include Yaks::Resource::Link.new(rel: :profile, uri: 'http://foo/bar')
60
60
  end
61
61
 
62
62
  context 'with the same link rel defined multiple times' do
@@ -70,10 +70,10 @@ RSpec.describe Yaks::Mapper do
70
70
 
71
71
  it 'should map all the links' do
72
72
  expect(resource.links).to eq [
73
- Yaks::Resource::Link.new(:profile, 'http://foo/bar', {}),
74
- Yaks::Resource::Link.new(:self, 'http://foo/bam', {}),
75
- Yaks::Resource::Link.new(:self, 'http://foo/baz', {}),
76
- Yaks::Resource::Link.new(:self, 'http://foo/baq', {})
73
+ Yaks::Resource::Link.new(rel: :profile, uri: 'http://foo/bar'),
74
+ Yaks::Resource::Link.new(rel: :self, uri: 'http://foo/bam'),
75
+ Yaks::Resource::Link.new(rel: :self, uri: 'http://foo/baz'),
76
+ Yaks::Resource::Link.new(rel: :self, uri: 'http://foo/baq')
77
77
  ]
78
78
  end
79
79
  end
@@ -201,7 +201,34 @@ RSpec.describe Yaks::Mapper do
201
201
  )
202
202
  end
203
203
  end
204
- end
204
+
205
+ context 'with a control' do
206
+ before do
207
+ mapper_class.module_eval do
208
+ control :foo_control do
209
+ field :bar_field, label: 'a label', type: 'number', value: 7
210
+ end
211
+ end
212
+ end
213
+
214
+ it 'should render the control' do
215
+ expect(mapper.call(fake))
216
+ .to eql Yaks::Resource.new(
217
+ type: 'foo',
218
+ controls: [
219
+ Yaks::Resource::Control.new(
220
+ name: :foo_control,
221
+ fields: [
222
+ Yaks::Resource::Control::Field.new(
223
+ name: :bar_field,
224
+ label: 'a label',
225
+ type: 'number',
226
+ value: 7
227
+ )])])
228
+ end
229
+ end
230
+
231
+ end # describe '#call'
205
232
 
206
233
  describe '.mapper_name' do
207
234
  context 'with a type configured' do
@@ -267,30 +294,32 @@ RSpec.describe Yaks::Mapper do
267
294
  end
268
295
  end
269
296
 
270
- describe '#map_links' do
271
- let(:link) { fake('Link') }
272
-
297
+ shared_examples 'something that can be added to a resource' do
273
298
  it 'should receive a context' do
274
- stub(link).add_to_resource(any_args) {|r,_,_| Yaks::Resource.new}
299
+ stub(object).add_to_resource(any_args) {|r,_,_| Yaks::Resource.new}
275
300
 
276
- mapper.config.links[0..-1] = [link]
277
301
  mapper.call(instance)
278
302
 
279
- expect(link).to have_received.add_to_resource(any(Yaks::Resource), mapper, yaks_context)
303
+ expect(object).to have_received.add_to_resource(any(Yaks::Resource), mapper, yaks_context)
280
304
  end
281
305
  end
282
306
 
283
- describe '#map_subresources' do
284
- let(:association) { fake('Association') }
285
-
286
- it 'should receive a context' do
287
- stub(association).add_to_resource(any_args) {|r,_,_| Yaks::Resource.new}
307
+ describe '#map_links' do
308
+ let(:object) { fake('Link') }
309
+ before { mapper.config(mapper.config.append_to(:links, object)) }
310
+ it_should_behave_like 'something that can be added to a resource'
311
+ end
288
312
 
289
- mapper.config.associations[0..-1] = [association]
290
- mapper.call(instance)
313
+ describe '#map_subresources' do
314
+ let(:object) { fake('Association') }
315
+ before { mapper.config(mapper.config.append_to(:associations, object)) }
316
+ it_should_behave_like 'something that can be added to a resource'
317
+ end
291
318
 
292
- expect(association).to have_received.add_to_resource(any(Yaks::Resource), mapper, yaks_context)
293
- end
319
+ describe '#map_controls' do
320
+ let(:object) { fake('Control') }
321
+ before { mapper.config(mapper.config.append_to(:controls, object)) }
322
+ it_should_behave_like 'something that can be added to a resource'
294
323
  end
295
324
 
296
325
  describe '#mapper_stack' do
@@ -1,7 +1,8 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  RSpec.describe Yaks::Resource::Link do
4
- subject(:link) { described_class.new(rel, uri, options) }
4
+ subject(:link) { described_class.new(rel: rel, uri: uri, options: options) }
5
+
5
6
  let(:rel) { :foo_rel }
6
7
  let(:uri) { 'http://api.example.org/rel/foo' }
7
8
  let(:options) { { title: 'mr. spectacular' } }
@@ -33,18 +33,18 @@ RSpec.describe Yaks::Resource do
33
33
  let(:init_opts) {
34
34
  {
35
35
  links: [
36
- Yaks::Resource::Link.new(:profile, '/foo/bar/profile', {}),
37
- Yaks::Resource::Link.new(:self, '/foo/bar', {})
36
+ Yaks::Resource::Link.new(rel: :profile, uri: '/foo/bar/profile'),
37
+ Yaks::Resource::Link.new(rel: :self, uri: '/foo/bar')
38
38
  ]
39
39
  }
40
40
  }
41
41
  its(:links) { should eql [
42
- Yaks::Resource::Link.new(:profile, '/foo/bar/profile', {}),
43
- Yaks::Resource::Link.new(:self, '/foo/bar', {})
42
+ Yaks::Resource::Link.new(rel: :profile, uri: '/foo/bar/profile'),
43
+ Yaks::Resource::Link.new(rel: :self, uri: '/foo/bar')
44
44
  ]
45
45
  }
46
46
 
47
- its(:self_link) { should eql Yaks::Resource::Link.new(:self, '/foo/bar', {}) }
47
+ its(:self_link) { should eql Yaks::Resource::Link.new(rel: :self, uri: '/foo/bar') }
48
48
  end
49
49
 
50
50
  context 'with subresources' do
@@ -95,14 +95,21 @@ RSpec.describe Yaks::Resource do
95
95
  let(:init_opts) {
96
96
  { links:
97
97
  [
98
- Yaks::Resource::Link.new(:self, 'foo', {}),
99
- Yaks::Resource::Link.new(:self, 'bar', {}),
100
- Yaks::Resource::Link.new(:profile, 'baz', {})
98
+ Yaks::Resource::Link.new(rel: :self, uri: 'foo'),
99
+ Yaks::Resource::Link.new(rel: :self, uri: 'bar'),
100
+ Yaks::Resource::Link.new(rel: :profile, uri: 'baz')
101
101
  ]
102
102
  }
103
103
  }
104
104
  it 'should return the last self link' do
105
- expect(resource.self_link).to eql Yaks::Resource::Link.new(:self, 'bar', {})
105
+ expect(resource.self_link).to eql Yaks::Resource::Link.new(rel: :self, uri: 'bar')
106
+ end
107
+ end
108
+
109
+ describe '#add_control' do
110
+ it 'should append to the controls' do
111
+ expect(resource.add_control(:a_control))
112
+ .to eq Yaks::Resource.new(controls: [:a_control])
106
113
  end
107
114
  end
108
115
  end
@@ -69,13 +69,13 @@ RSpec.describe Yaks::Runner do
69
69
  end
70
70
 
71
71
  it 'should pick the one given in the options if no header matches' do
72
- rack_env = { 'HTTP_ACCEPT' => 'text/html, application/json' }
72
+ rack_env = { 'HTTP_ACCEPT' => 'text/xml, application/json' }
73
73
  runner = described_class.new(object: nil, config: config, options: { format: :hal, env: rack_env })
74
74
  expect(runner.format_class).to equal Yaks::Format::Hal
75
75
  end
76
76
 
77
77
  it 'should fall back to the default when no mime type is recognized' do
78
- rack_env = { 'HTTP_ACCEPT' => 'text/html, application/json' }
78
+ rack_env = { 'HTTP_ACCEPT' => 'text/xml, application/json' }
79
79
  runner = described_class.new(object: nil, config: config, options: { env: rack_env })
80
80
  expect(runner.format_class).to equal Yaks::Format::CollectionJson
81
81
  end
@@ -253,6 +253,26 @@ RSpec.describe Yaks::Runner do
253
253
  end
254
254
  end
255
255
 
256
+ describe '#primitivizer' do
257
+ describe 'with a non json based format' do
258
+ let(:config) do
259
+ Yaks::Config.new do
260
+ default_format :html
261
+ end
262
+ end
263
+
264
+ it 'should return the identity function' do
265
+ expect(runner.primitivizer.call(:foo)).to eql :foo
266
+ end
267
+ end
268
+
269
+ describe 'with a json based format' do
270
+ it 'should return the primitivizer' do
271
+ expect(runner.primitivizer.call(:foo)).to eql "foo"
272
+ end
273
+ end
274
+ end
275
+
256
276
  it 'should memoize' do
257
277
  expect(runner.formatter).to be runner.formatter
258
278
  end
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Yaks::Serializer do
4
+ after do
5
+ Yaks::Serializer.instance_variable_set("@serializers", nil)
6
+ end
7
+
8
+ it 'allows registering serializers' do
9
+ Yaks::Serializer.register(:some_format, :some_serializer)
10
+ expect(Yaks::Serializer.all[:some_format]).to equal :some_serializer
11
+ end
12
+
13
+ it 'should by default have a serializer for JSON' do
14
+ expect(Yaks::Serializer.all[:json].call([1,2,3])).to eql "[\n 1,\n 2,\n 3\n]"
15
+ end
16
+
17
+ it 'should warn when registering a key again' do
18
+ expect { Yaks::Serializer.register(:json, :foo) }.to raise_exception /Serializer for json already registered/
19
+ end
20
+ end
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Yaks::StatefulBuilder do
4
+ class Buildable
5
+ include Yaks::Attributes.new(:foo, :bar)
6
+
7
+ def self.create(foo, bar)
8
+ new(foo: foo, bar: bar)
9
+ end
10
+
11
+ def finalize
12
+ update(foo: 7, bar: 8)
13
+ end
14
+
15
+ def wrong_type(x, y)
16
+ "foo #{x} #{y}"
17
+ end
18
+
19
+ end
20
+
21
+ subject { Yaks::StatefulBuilder.new(Buildable, [:foo, :bar, :update, :finalize, :wrong_type]) }
22
+
23
+ it 'should keep state' do
24
+ expect(
25
+ subject.create(3, 4) do
26
+ foo 7
27
+ update bar: 6
28
+ end.to_h
29
+ ).to eql(foo: 7, bar: 6)
30
+ end
31
+
32
+ it 'should unwrap again' do
33
+ expect( subject.create(3, 4) { finalize } ).to eql Buildable.new(foo: 7, bar: 8)
34
+ end
35
+
36
+ describe 'kind_of?' do
37
+ it 'should test if the returned thing is of the right type' do
38
+ expect { subject.create(3, 4) { wrong_type(1,'2') }}.to raise_exception Yaks::IllegalState, 'Buildable#wrong_type(1, "2") returned "foo 1 2". Expected instance of Buildable'
39
+ end
40
+ end
41
+ end
data/yaks.gemspec CHANGED
@@ -38,4 +38,5 @@ Gem::Specification.new do |gem|
38
38
  gem.add_development_dependency 'mutant'
39
39
  gem.add_development_dependency 'rspec-its'
40
40
  gem.add_development_dependency 'benchmark-ips'
41
+ gem.add_development_dependency 'yaks-html'
41
42
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yaks
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0.alpha.1
4
+ version: 0.6.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: 2014-10-19 00:00:00.000000000 Z
11
+ date: 2014-10-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: inflection
@@ -220,6 +220,20 @@ dependencies:
220
220
  - - ">="
221
221
  - !ruby/object:Gem::Version
222
222
  version: '0'
223
+ - !ruby/object:Gem::Dependency
224
+ name: yaks-html
225
+ requirement: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - ">="
228
+ - !ruby/object:Gem::Version
229
+ version: '0'
230
+ type: :development
231
+ prerelease: false
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - ">="
235
+ - !ruby/object:Gem::Version
236
+ version: '0'
223
237
  description: Serialize to hypermedia. HAL, JSON-API, etc.
224
238
  email:
225
239
  - arne@arnebrasseur.net
@@ -231,34 +245,40 @@ files:
231
245
  - README.md
232
246
  - Rakefile
233
247
  - lib/yaks.rb
248
+ - lib/yaks/attributes.rb
234
249
  - lib/yaks/breaking_changes.rb
235
250
  - lib/yaks/collection_mapper.rb
236
251
  - lib/yaks/collection_resource.rb
237
252
  - lib/yaks/config.rb
238
253
  - lib/yaks/config/dsl.rb
254
+ - lib/yaks/configurable.rb
239
255
  - lib/yaks/default_policy.rb
256
+ - lib/yaks/errors.rb
240
257
  - lib/yaks/format.rb
241
258
  - lib/yaks/format/collection_json.rb
242
259
  - lib/yaks/format/hal.rb
260
+ - lib/yaks/format/halo.rb
243
261
  - lib/yaks/format/json_api.rb
244
262
  - lib/yaks/fp.rb
245
263
  - lib/yaks/fp/callable.rb
246
- - lib/yaks/fp/hash_updatable.rb
247
- - lib/yaks/fp/updatable.rb
248
264
  - lib/yaks/mapper.rb
249
265
  - lib/yaks/mapper/association.rb
250
266
  - lib/yaks/mapper/association_mapper.rb
251
267
  - lib/yaks/mapper/attribute.rb
252
268
  - lib/yaks/mapper/class_methods.rb
253
269
  - lib/yaks/mapper/config.rb
270
+ - lib/yaks/mapper/control.rb
254
271
  - lib/yaks/mapper/has_many.rb
255
272
  - lib/yaks/mapper/has_one.rb
256
273
  - lib/yaks/mapper/link.rb
257
274
  - lib/yaks/null_resource.rb
258
275
  - lib/yaks/primitivize.rb
259
276
  - lib/yaks/resource.rb
277
+ - lib/yaks/resource/control.rb
260
278
  - lib/yaks/resource/link.rb
261
279
  - lib/yaks/runner.rb
280
+ - lib/yaks/serializer.rb
281
+ - lib/yaks/stateful_builder.rb
262
282
  - lib/yaks/util.rb
263
283
  - lib/yaks/version.rb
264
284
  - spec/acceptance/acceptance_spec.rb
@@ -268,6 +288,7 @@ files:
268
288
  - spec/integration/map_to_resource_spec.rb
269
289
  - spec/json/confucius.collection.json
270
290
  - spec/json/confucius.hal.json
291
+ - spec/json/confucius.halo.json
271
292
  - spec/json/confucius.json_api.json
272
293
  - spec/json/john.hal.json
273
294
  - spec/json/plant_collection.collection.json
@@ -283,19 +304,20 @@ files:
283
304
  - spec/support/pet_peeve_mapper.rb
284
305
  - spec/support/shared_contexts.rb
285
306
  - spec/support/youtypeit_models_mappers.rb
307
+ - spec/unit/yaks/attributes_spec.rb
286
308
  - spec/unit/yaks/collection_mapper_spec.rb
287
309
  - spec/unit/yaks/collection_resource_spec.rb
288
310
  - spec/unit/yaks/config/dsl_spec.rb
289
311
  - spec/unit/yaks/config_spec.rb
312
+ - spec/unit/yaks/configurable_spec.rb
290
313
  - spec/unit/yaks/default_policy/derive_mapper_from_object_spec.rb
291
314
  - spec/unit/yaks/default_policy_spec.rb
292
315
  - spec/unit/yaks/format/collection_json_spec.rb
293
316
  - spec/unit/yaks/format/hal_spec.rb
317
+ - spec/unit/yaks/format/html_spec.rb
294
318
  - spec/unit/yaks/format/json_api_spec.rb
295
319
  - spec/unit/yaks/format_spec.rb
296
320
  - spec/unit/yaks/fp/callable_spec.rb
297
- - spec/unit/yaks/fp/hash_updatable_spec.rb
298
- - spec/unit/yaks/fp/updatable_spec.rb
299
321
  - spec/unit/yaks/fp_spec.rb
300
322
  - spec/unit/yaks/mapper/association_mapper_spec.rb
301
323
  - spec/unit/yaks/mapper/association_spec.rb
@@ -311,6 +333,8 @@ files:
311
333
  - spec/unit/yaks/resource/link_spec.rb
312
334
  - spec/unit/yaks/resource_spec.rb
313
335
  - spec/unit/yaks/runner_spec.rb
336
+ - spec/unit/yaks/serializer_spec.rb
337
+ - spec/unit/yaks/stateful_builder_spec.rb
314
338
  - spec/unit/yaks/util_spec.rb
315
339
  - spec/yaml/confucius.yaml
316
340
  - spec/yaml/youtypeitwepostit.yaml
@@ -330,12 +354,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
330
354
  version: '0'
331
355
  required_rubygems_version: !ruby/object:Gem::Requirement
332
356
  requirements:
333
- - - ">"
357
+ - - ">="
334
358
  - !ruby/object:Gem::Version
335
- version: 1.3.1
359
+ version: '0'
336
360
  requirements: []
337
361
  rubyforge_project:
338
- rubygems_version: 2.4.2
362
+ rubygems_version: 2.2.2
339
363
  signing_key:
340
364
  specification_version: 4
341
365
  summary: Serialize to hypermedia. HAL, JSON-API, etc.
@@ -347,6 +371,7 @@ test_files:
347
371
  - spec/integration/map_to_resource_spec.rb
348
372
  - spec/json/confucius.collection.json
349
373
  - spec/json/confucius.hal.json
374
+ - spec/json/confucius.halo.json
350
375
  - spec/json/confucius.json_api.json
351
376
  - spec/json/john.hal.json
352
377
  - spec/json/plant_collection.collection.json
@@ -362,19 +387,20 @@ test_files:
362
387
  - spec/support/pet_peeve_mapper.rb
363
388
  - spec/support/shared_contexts.rb
364
389
  - spec/support/youtypeit_models_mappers.rb
390
+ - spec/unit/yaks/attributes_spec.rb
365
391
  - spec/unit/yaks/collection_mapper_spec.rb
366
392
  - spec/unit/yaks/collection_resource_spec.rb
367
393
  - spec/unit/yaks/config/dsl_spec.rb
368
394
  - spec/unit/yaks/config_spec.rb
395
+ - spec/unit/yaks/configurable_spec.rb
369
396
  - spec/unit/yaks/default_policy/derive_mapper_from_object_spec.rb
370
397
  - spec/unit/yaks/default_policy_spec.rb
371
398
  - spec/unit/yaks/format/collection_json_spec.rb
372
399
  - spec/unit/yaks/format/hal_spec.rb
400
+ - spec/unit/yaks/format/html_spec.rb
373
401
  - spec/unit/yaks/format/json_api_spec.rb
374
402
  - spec/unit/yaks/format_spec.rb
375
403
  - spec/unit/yaks/fp/callable_spec.rb
376
- - spec/unit/yaks/fp/hash_updatable_spec.rb
377
- - spec/unit/yaks/fp/updatable_spec.rb
378
404
  - spec/unit/yaks/fp_spec.rb
379
405
  - spec/unit/yaks/mapper/association_mapper_spec.rb
380
406
  - spec/unit/yaks/mapper/association_spec.rb
@@ -390,6 +416,8 @@ test_files:
390
416
  - spec/unit/yaks/resource/link_spec.rb
391
417
  - spec/unit/yaks/resource_spec.rb
392
418
  - spec/unit/yaks/runner_spec.rb
419
+ - spec/unit/yaks/serializer_spec.rb
420
+ - spec/unit/yaks/stateful_builder_spec.rb
393
421
  - spec/unit/yaks/util_spec.rb
394
422
  - spec/yaml/confucius.yaml
395
423
  - spec/yaml/youtypeitwepostit.yaml
@@ -1,19 +0,0 @@
1
- module Yaks
2
- module FP
3
-
4
- class HashUpdatable < Module
5
- # @param [Array] attributes
6
- # @return [Symbol]
7
- def initialize(*attributes)
8
- define_method :update do |updates|
9
- self.class.new(
10
- attributes.each_with_object({}) {|attr, hsh|
11
- hsh[attr] = updates.fetch(attr) { send(attr) }
12
- }
13
- )
14
- end
15
- end
16
- end
17
-
18
- end
19
- end
@@ -1,17 +0,0 @@
1
- module Yaks
2
- module FP
3
-
4
- class Updatable < Module
5
- # @param [Array] attributes
6
- # @return [Symbol]
7
- def initialize(*attributes)
8
- define_method :update do |updates|
9
- self.class.new(
10
- *attributes.map {|attr| updates.fetch(attr) { send(attr) }}
11
- )
12
- end
13
- end
14
- end
15
-
16
- end
17
- end