yaks 0.8.0.alpha → 0.8.0.beta1
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 +4 -4
- data/README.md +19 -1
- data/Rakefile +59 -25
- data/lib/yaks/format/collection_json.rb +22 -3
- data/lib/yaks/format/halo.rb +1 -1
- data/lib/yaks/html5_forms.rb +2 -1
- data/lib/yaks/mapper/form/field/option.rb +1 -1
- data/lib/yaks/resource/form/field/option.rb +11 -0
- data/lib/yaks/resource/form/field.rb +3 -4
- data/lib/yaks/resource/form.rb +3 -3
- data/lib/yaks/resource.rb +1 -1
- data/lib/yaks/util.rb +4 -0
- data/lib/yaks/version.rb +1 -1
- data/lib/yaks.rb +1 -0
- data/spec/integration/map_to_resource_spec.rb +21 -24
- data/spec/spec_helper.rb +3 -3
- data/spec/unit/yaks/format/collection_json_spec.rb +152 -0
- data/spec/unit/yaks/resource/form/field_sepc.rb +37 -0
- data/spec/unit/yaks/resource/form_spec.rb +51 -0
- data/spec/unit/yaks/resource_spec.rb +46 -2
- data/yaks.gemspec +0 -3
- metadata +8 -43
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ad5b36d2206adbc6ccc3a79eb484d70eb6a56f62
|
4
|
+
data.tar.gz: e902f2b6b88e269d4dc788e3e19969f881ec107c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 38efaa84bb8b2ae036fd7bc04aae45da7d9ecd8cb386f7dfbe95ee0470c52ffdf1bbf62c81893f599fa030a9859fe1496c764bc744a3d44ddaceecc36f1de619
|
7
|
+
data.tar.gz: 93e074f082306f8a8bbd6f36a0564a3d30c3b056c2b29061506155ffaec1725268170d427f751fda58959ece321fa625fc00f712877d5040a9727cb88bf01b0e
|
data/README.md
CHANGED
@@ -394,11 +394,29 @@ end
|
|
394
394
|
|
395
395
|
### Collection+JSON
|
396
396
|
|
397
|
+
Collection+JSON has support for write templates. To use them, the `:template`
|
398
|
+
option can be used. It will map the specified form to a CJ template. Please
|
399
|
+
notice that CJ only allows one template per representation.
|
400
|
+
|
397
401
|
```ruby
|
398
402
|
default_format :collection_json
|
403
|
+
|
404
|
+
collection_json = Yaks.new do
|
405
|
+
format_options :collection_json, template: :my_template_form
|
406
|
+
end
|
407
|
+
|
408
|
+
class PostMapper < Yaks::Mapper
|
409
|
+
form :my_template_form do
|
410
|
+
# This will be used for template
|
411
|
+
end
|
412
|
+
|
413
|
+
form :not_my_template do
|
414
|
+
# This won't be used for template
|
415
|
+
end
|
416
|
+
end
|
399
417
|
```
|
400
418
|
|
401
|
-
Subresources aren't mapped because Collection+JSON doesn't really have that concept
|
419
|
+
Subresources aren't mapped because Collection+JSON doesn't really have that concept.
|
402
420
|
|
403
421
|
## Hooks
|
404
422
|
|
data/Rakefile
CHANGED
@@ -36,31 +36,65 @@ task :mutant_chunked do
|
|
36
36
|
# Yaks::Runner,
|
37
37
|
|
38
38
|
[
|
39
|
-
# Yaks::
|
40
|
-
# Yaks::
|
41
|
-
# Yaks::
|
42
|
-
# Yaks::
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
Yaks::
|
50
|
-
|
51
|
-
|
52
|
-
Yaks::
|
53
|
-
|
54
|
-
Yaks::Format::
|
55
|
-
Yaks::Format
|
56
|
-
|
57
|
-
Yaks::
|
58
|
-
Yaks::
|
59
|
-
|
60
|
-
|
61
|
-
# Yaks::
|
62
|
-
# Yaks::
|
63
|
-
# Yaks::
|
39
|
+
# >> Yaks::Attributes
|
40
|
+
# >> Yaks::Attributes::InstanceMethods
|
41
|
+
# >> Yaks::Builder
|
42
|
+
# >> Yaks::CollectionMapper
|
43
|
+
# >> Yaks::CollectionResource
|
44
|
+
# >> Yaks::Config
|
45
|
+
# >> Yaks::Configurable
|
46
|
+
# >> Yaks::DefaultPolicy
|
47
|
+
# >> Yaks::Error
|
48
|
+
# >> Yaks::FP
|
49
|
+
# >> Yaks::FP::Callable
|
50
|
+
# >> Yaks::Format
|
51
|
+
# >> Yaks::Format::CollectionJson
|
52
|
+
# >> Yaks::Format::HTML
|
53
|
+
# >> Yaks::Format::Hal
|
54
|
+
# >> Yaks::Format::Halo
|
55
|
+
# >> Yaks::Format::JsonAPI
|
56
|
+
# >> Yaks::Format::Reader
|
57
|
+
# >> Yaks::Format::Transit
|
58
|
+
# >> Yaks::Format::Transit::ReadHandler
|
59
|
+
# >> Yaks::Format::Transit::WriteHandler
|
60
|
+
# >> Yaks::HTML5Forms
|
61
|
+
# >> Yaks::Identifier
|
62
|
+
# >> Yaks::Identifier::LinkRelation
|
63
|
+
# >> Yaks::IllegalStateError
|
64
|
+
# >> Yaks::Mapper
|
65
|
+
# >> Yaks::Mapper::Association
|
66
|
+
# >> Yaks::Mapper::AssociationMapper
|
67
|
+
# >> Yaks::Mapper::Attribute
|
68
|
+
# >> Yaks::Mapper::Config
|
69
|
+
# >> Yaks::Mapper::Form
|
70
|
+
# >> Yaks::Mapper::Form::Config
|
71
|
+
# >> Yaks::Mapper::Form::Field
|
72
|
+
# >> Yaks::Mapper::Form::Field::Option
|
73
|
+
# >> Yaks::Mapper::Form::Fieldset
|
74
|
+
# >> Yaks::Mapper::HasMany
|
75
|
+
# >> Yaks::Mapper::HasOne
|
76
|
+
# >> Yaks::Mapper::Link
|
77
|
+
# >> Yaks::NullResource
|
78
|
+
# >> Yaks::Pipeline
|
79
|
+
# >> Yaks::Primitivize
|
80
|
+
# >> Yaks::PrimitivizeError
|
81
|
+
# >> Yaks::Reader
|
82
|
+
# >> Yaks::Reader::Hal
|
83
|
+
# Yaks::Resource,
|
84
|
+
# Yaks::Resource::Form,
|
85
|
+
Yaks::Resource::Form::Field,
|
86
|
+
Yaks::Resource::Form::Field::Option,
|
87
|
+
Yaks::Resource::Form::Fieldset,
|
88
|
+
Yaks::Resource::Link,
|
89
|
+
# >> Yaks::Runner
|
90
|
+
# >> Yaks::RuntimeError
|
91
|
+
# >> Yaks::Serializer
|
92
|
+
# >> Yaks::Serializer::JSONReader
|
93
|
+
# >> Yaks::Serializer::JSONWriter
|
94
|
+
# >> Yaks::Undefined
|
95
|
+
# >> Yaks::UnsupportedOperationError
|
96
|
+
# >> Yaks::Util
|
97
|
+
# >> Yaks::Util::Deprecated
|
64
98
|
].each do |space|
|
65
99
|
puts space
|
66
100
|
ENV['PATTERN'] = "#{space}"
|
@@ -13,8 +13,9 @@ module Yaks
|
|
13
13
|
items: serialize_items(resource)
|
14
14
|
}
|
15
15
|
result[:href] = resource.self_link.uri if resource.self_link
|
16
|
-
result[:links] = serialize_links(resource) if links?
|
17
|
-
result[:queries] = serialize_queries(resource) if queries?
|
16
|
+
result[:links] = serialize_links(resource) if links?(resource)
|
17
|
+
result[:queries] = serialize_queries(resource) if queries?(resource)
|
18
|
+
result[:template] = serialize_template(resource) if template?(resource)
|
18
19
|
{collection: result}
|
19
20
|
end
|
20
21
|
|
@@ -69,6 +70,10 @@ module Yaks
|
|
69
70
|
resource.collection? && resource.links.any?
|
70
71
|
end
|
71
72
|
|
73
|
+
def template?(resource)
|
74
|
+
options.key?(:template) && template_form_exists?(resource)
|
75
|
+
end
|
76
|
+
|
72
77
|
protected
|
73
78
|
|
74
79
|
def form_is_query?(form)
|
@@ -76,7 +81,21 @@ module Yaks
|
|
76
81
|
end
|
77
82
|
|
78
83
|
def method_is_get?(method)
|
79
|
-
method.downcase.to_sym === :get
|
84
|
+
!method.nil? && method.downcase.to_sym === :get
|
85
|
+
end
|
86
|
+
|
87
|
+
def template_form_exists?(resource)
|
88
|
+
!resource.find_form(options.fetch(:template)).nil?
|
89
|
+
end
|
90
|
+
|
91
|
+
def serialize_template(resource)
|
92
|
+
fields = resource.find_form(options.fetch(:template)).fields
|
93
|
+
result = {data: []}
|
94
|
+
fields.each do |field|
|
95
|
+
result[:data] << {name: field.name, value: nil.to_s}
|
96
|
+
result[:data].last[:prompt] = field.label if field.label
|
97
|
+
end
|
98
|
+
result
|
80
99
|
end
|
81
100
|
end
|
82
101
|
end
|
data/lib/yaks/format/halo.rb
CHANGED
@@ -36,7 +36,7 @@ module Yaks
|
|
36
36
|
field.to_h_compact.each_with_object({}) do |(attr,value), hsh|
|
37
37
|
if attr == :options # <option>s of a <select>
|
38
38
|
if !value.empty?
|
39
|
-
hsh[:options] = value.map(&:
|
39
|
+
hsh[:options] = value.map(&:to_h_compact)
|
40
40
|
end
|
41
41
|
else
|
42
42
|
hsh[attr] = value
|
data/lib/yaks/html5_forms.rb
CHANGED
@@ -4,13 +4,12 @@ module Yaks
|
|
4
4
|
class Field
|
5
5
|
include Yaks::Mapper::Form::Field.attributes.add(:error => nil)
|
6
6
|
|
7
|
-
def value
|
8
|
-
|
9
|
-
if type == :select
|
7
|
+
def value
|
8
|
+
if type.equal? :select
|
10
9
|
selected = options.find { |option| option.selected }
|
11
10
|
selected.value if selected
|
12
11
|
else
|
13
|
-
|
12
|
+
@value
|
14
13
|
end
|
15
14
|
end
|
16
15
|
end
|
data/lib/yaks/resource/form.rb
CHANGED
@@ -4,18 +4,18 @@ module Yaks
|
|
4
4
|
include Yaks::Mapper::Form::Config.attributes.remove(:dynamic_blocks)
|
5
5
|
|
6
6
|
def [](name)
|
7
|
-
fields.find {|field| field.name
|
7
|
+
fields.find {|field| field.name.equal? name}.value
|
8
8
|
end
|
9
9
|
|
10
10
|
def values
|
11
|
-
|
11
|
+
fields_flat.each_with_object({}) do |field, values|
|
12
12
|
values[field.name] = field.value
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
16
|
def fields_flat(fields = fields)
|
17
17
|
fields.each_with_object([]) do |field, acc|
|
18
|
-
if field.type
|
18
|
+
if field.type.equal? :fieldset
|
19
19
|
acc.concat(fields_flat field.fields)
|
20
20
|
else
|
21
21
|
acc << field
|
data/lib/yaks/resource.rb
CHANGED
data/lib/yaks/util.rb
CHANGED
@@ -21,6 +21,10 @@ module Yaks
|
|
21
21
|
keys.each_with_object({}) {|k,dest| dest[k] = hash[k] if hash.key?(k) }
|
22
22
|
end
|
23
23
|
|
24
|
+
def reject_keys(hash, *keys)
|
25
|
+
hash.keys.each_with_object({}) {|k,dest| dest[k] = hash[k] unless keys.include?(k) }
|
26
|
+
end
|
27
|
+
|
24
28
|
def symbolize_keys(hash)
|
25
29
|
hash.each_with_object({}) {|(k,v), hsh| hsh[k.to_sym] = v}
|
26
30
|
end
|
data/lib/yaks/version.rb
CHANGED
data/lib/yaks.rb
CHANGED
@@ -11,30 +11,27 @@ RSpec.describe 'Mapping domain models to Resource objects' do
|
|
11
11
|
its(:links) { should eql [ Yaks::Resource::Link.new(rel: :copyright, uri: '/api/copyright/2024') ] }
|
12
12
|
|
13
13
|
specify {
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
]
|
36
|
-
|
37
|
-
|
14
|
+
subject.subresources == [
|
15
|
+
Yaks::Resource.new(
|
16
|
+
type:'pet_peeve',
|
17
|
+
rels: ['rel:pet_peeve'],
|
18
|
+
attributes: {id: 4, type: 'parsing with regexps'}
|
19
|
+
),
|
20
|
+
Yaks::CollectionResource.new(
|
21
|
+
type: 'pet',
|
22
|
+
rels: ['rel:pets'],
|
23
|
+
members: [
|
24
|
+
Yaks::Resource.new(
|
25
|
+
type: 'pet',
|
26
|
+
attributes: {:id => 2, :species => 'dog', :name => 'boingboing'}
|
27
|
+
),
|
28
|
+
Yaks::Resource.new(
|
29
|
+
type: 'pet',
|
30
|
+
attributes: {:id => 3, :species => 'cat', :name => 'wassup'}
|
31
|
+
)
|
32
|
+
]
|
33
|
+
)
|
34
|
+
]
|
38
35
|
}
|
39
36
|
|
40
37
|
its(:subresources) {
|
data/spec/spec_helper.rb
CHANGED
@@ -24,9 +24,9 @@ RSpec.configure do |rspec|
|
|
24
24
|
rspec.backtrace_exclusion_patterns = [] if ENV['FULLSTACK']
|
25
25
|
rspec.disable_monkey_patching!
|
26
26
|
rspec.raise_errors_for_deprecations!
|
27
|
-
|
28
|
-
|
29
|
-
|
27
|
+
rspec.around(:each) do |example|
|
28
|
+
Timeout.timeout(1, &example)
|
29
|
+
end
|
30
30
|
end
|
31
31
|
|
32
32
|
Bogus.configure do |bogus|
|
@@ -93,6 +93,20 @@ RSpec.describe Yaks::Format::CollectionJson do
|
|
93
93
|
expect(cj.queries?(resource)).to eq false
|
94
94
|
end
|
95
95
|
end
|
96
|
+
|
97
|
+
context 'and form has no method' do
|
98
|
+
let(:full_args) {
|
99
|
+
{
|
100
|
+
name: :search,
|
101
|
+
action: '/foo'
|
102
|
+
}
|
103
|
+
}
|
104
|
+
|
105
|
+
it 'should return false' do
|
106
|
+
cj = Yaks::Format::CollectionJson.new(resource)
|
107
|
+
expect(cj.queries?(resource)).to eq false
|
108
|
+
end
|
109
|
+
end
|
96
110
|
end
|
97
111
|
|
98
112
|
context 'when resource has not GET forms' do
|
@@ -110,6 +124,65 @@ RSpec.describe Yaks::Format::CollectionJson do
|
|
110
124
|
end
|
111
125
|
end
|
112
126
|
|
127
|
+
context '#template?' do
|
128
|
+
context 'when no template form has been specified' do
|
129
|
+
let(:format) {
|
130
|
+
described_class.new
|
131
|
+
}
|
132
|
+
|
133
|
+
let(:resource) {
|
134
|
+
Yaks::Resource.new(
|
135
|
+
attributes: {foo: 'fooval', bar: 'barval'},
|
136
|
+
forms: [Yaks::Resource::Form.new(name: :just_a_form)]
|
137
|
+
)
|
138
|
+
}
|
139
|
+
|
140
|
+
it 'should return false' do
|
141
|
+
expect(format.template?(resource)).to eq false
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
context 'when a template form has been specified' do
|
146
|
+
let(:format) {
|
147
|
+
described_class.new(:template => :template_form_name)
|
148
|
+
}
|
149
|
+
|
150
|
+
context 'and the form is not present' do
|
151
|
+
let(:resource) {
|
152
|
+
Yaks::Resource.new(
|
153
|
+
attributes: {foo: 'fooval', bar: 'barval'},
|
154
|
+
forms: [Yaks::Resource::Form.new(name: :not_the_form_name)]
|
155
|
+
)
|
156
|
+
}
|
157
|
+
|
158
|
+
subject {
|
159
|
+
Yaks::Primitivize.create.call(format.call(resource))
|
160
|
+
}
|
161
|
+
|
162
|
+
it 'should return false' do
|
163
|
+
expect(format.template?(resource)).to eq false
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
context 'and the form is present' do
|
168
|
+
let(:resource) {
|
169
|
+
Yaks::Resource.new(
|
170
|
+
attributes: {foo: 'fooval', bar: 'barval'},
|
171
|
+
forms: [Yaks::Resource::Form.new(name: :template_form_name)]
|
172
|
+
)
|
173
|
+
}
|
174
|
+
|
175
|
+
subject {
|
176
|
+
Yaks::Primitivize.create.call(format.call(resource))
|
177
|
+
}
|
178
|
+
|
179
|
+
it 'should return true' do
|
180
|
+
expect(format.template?(resource)).to eq true
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
113
186
|
context 'serialize_links' do
|
114
187
|
context 'without title' do
|
115
188
|
let(:resource) {
|
@@ -262,4 +335,83 @@ RSpec.describe Yaks::Format::CollectionJson do
|
|
262
335
|
end
|
263
336
|
end
|
264
337
|
end
|
338
|
+
|
339
|
+
context 'serialize_template' do
|
340
|
+
let(:format) {
|
341
|
+
described_class.new(:template => :form_for_new)
|
342
|
+
}
|
343
|
+
|
344
|
+
let(:resource) {
|
345
|
+
Yaks::Resource.new(
|
346
|
+
attributes: {foo: 'fooval', bar: 'barval'},
|
347
|
+
forms: [Yaks::Resource::Form.new(name: :form_for_new, fields: fields)]
|
348
|
+
)
|
349
|
+
}
|
350
|
+
|
351
|
+
subject {
|
352
|
+
Yaks::Primitivize.create.call(format.call(resource))
|
353
|
+
}
|
354
|
+
|
355
|
+
context "template uses prompts" do
|
356
|
+
let(:fields) {
|
357
|
+
[
|
358
|
+
Yaks::Resource::Form::Field.new(name: 'foo', label: 'My Foo Field'),
|
359
|
+
Yaks::Resource::Form::Field.new(name: 'bar', label: 'My Bar Field')
|
360
|
+
]
|
361
|
+
}
|
362
|
+
|
363
|
+
it 'should render a template' do
|
364
|
+
should deep_eql(
|
365
|
+
"collection" => {
|
366
|
+
"version" => "1.0",
|
367
|
+
"items" => [
|
368
|
+
{
|
369
|
+
"data" => [
|
370
|
+
{ "name"=>"foo", "value"=>"fooval" },
|
371
|
+
{ "name"=>"bar", "value"=>"barval" }
|
372
|
+
]
|
373
|
+
}
|
374
|
+
],
|
375
|
+
"template" => {
|
376
|
+
"data" => [
|
377
|
+
{ "name"=>"foo", "value"=>"", "prompt"=>"My Foo Field" },
|
378
|
+
{ "name"=>"bar", "value"=>"", "prompt"=>"My Bar Field" }
|
379
|
+
]
|
380
|
+
}
|
381
|
+
}
|
382
|
+
)
|
383
|
+
end
|
384
|
+
end
|
385
|
+
|
386
|
+
context "template does not use prompts" do
|
387
|
+
let(:fields) {
|
388
|
+
[
|
389
|
+
Yaks::Resource::Form::Field.new(name: 'foo'),
|
390
|
+
Yaks::Resource::Form::Field.new(name: 'bar')
|
391
|
+
]
|
392
|
+
}
|
393
|
+
|
394
|
+
it 'should render a template without prompts' do
|
395
|
+
should deep_eql(
|
396
|
+
"collection" => {
|
397
|
+
"version" => "1.0",
|
398
|
+
"items" => [
|
399
|
+
{
|
400
|
+
"data" => [
|
401
|
+
{ "name"=>"foo", "value"=>"fooval" },
|
402
|
+
{ "name"=>"bar", "value"=>"barval" }
|
403
|
+
]
|
404
|
+
}
|
405
|
+
],
|
406
|
+
"template" => {
|
407
|
+
"data" => [
|
408
|
+
{ "name"=>"foo", "value"=>"" },
|
409
|
+
{ "name"=>"bar", "value"=>"" }
|
410
|
+
]
|
411
|
+
}
|
412
|
+
}
|
413
|
+
)
|
414
|
+
end
|
415
|
+
end
|
416
|
+
end
|
265
417
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
RSpec.describe Yaks::Resource::Form::Field do
|
2
|
+
subject do
|
3
|
+
described_class.new(value: 123)
|
4
|
+
end
|
5
|
+
|
6
|
+
describe '#value' do
|
7
|
+
its(:value) { should eql 123 }
|
8
|
+
|
9
|
+
context 'with a select box - with selection' do
|
10
|
+
subject do
|
11
|
+
described.class.new(type: :select, options: [
|
12
|
+
Yaks::Resource::Form::Field::Option.new(selected: false, value: 1),
|
13
|
+
Yaks::Resource::Form::Field::Option.new(selected: true, value: 2),
|
14
|
+
Yaks::Resource::Form::Field::Option.new(selected: false, value: 3),
|
15
|
+
])
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'should return the selected value' do
|
19
|
+
expect( subject.value ).to eql 2
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context 'with a select box - no selection' do
|
24
|
+
subject do
|
25
|
+
described.class.new(type: :select, options: [
|
26
|
+
Yaks::Resource::Form::Field::Option.new(selected: false, value: 1),
|
27
|
+
Yaks::Resource::Form::Field::Option.new(selected: false, value: 2),
|
28
|
+
Yaks::Resource::Form::Field::Option.new(selected: false, value: 3),
|
29
|
+
])
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'should return nothing' do
|
33
|
+
expect( subject.value ).to be nil
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
RSpec.describe Yaks::Resource::Form do
|
2
|
+
let(:fields) {
|
3
|
+
[
|
4
|
+
Yaks::Resource::Form::Field.new(name: :foo, value: '123', type: 'text'),
|
5
|
+
Yaks::Resource::Form::Field.new(name: :bar, value: '+32 477 123 123', type: 'tel')
|
6
|
+
]
|
7
|
+
}
|
8
|
+
|
9
|
+
subject(:form) {
|
10
|
+
described_class.new(name: :create_foo, fields: fields)
|
11
|
+
}
|
12
|
+
|
13
|
+
describe '#[]' do
|
14
|
+
it 'should find a field value by field name' do
|
15
|
+
expect(subject[:bar])
|
16
|
+
.to eq '+32 477 123 123'
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe '#values' do
|
21
|
+
it 'should return all field values in a hash' do
|
22
|
+
expect(subject.values).to eql(foo: '123', bar: '+32 477 123 123')
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe '#fields_flat' do
|
27
|
+
let(:fields) do
|
28
|
+
[
|
29
|
+
Yaks::Resource::Form::Fieldset.new(fields: [
|
30
|
+
Yaks::Resource::Form::Field.new(name: :foo, value: '123', type: 'text'),
|
31
|
+
Yaks::Resource::Form::Field.new(name: :bar, value: '+32 477 123 123', type: 'tel')
|
32
|
+
]),
|
33
|
+
Yaks::Resource::Form::Fieldset.new(fields: [
|
34
|
+
Yaks::Resource::Form::Fieldset.new(fields: [
|
35
|
+
Yaks::Resource::Form::Field.new(name: :qux, value: '777', type: 'text'),
|
36
|
+
]),
|
37
|
+
Yaks::Resource::Form::Field.new(name: :quux, value: '999', type: 'tel')
|
38
|
+
])
|
39
|
+
]
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'should flatten fieldsets' do
|
43
|
+
expect(subject.fields_flat).to eql [
|
44
|
+
Yaks::Resource::Form::Field.new(name: :foo, value: '123', type: 'text'),
|
45
|
+
Yaks::Resource::Form::Field.new(name: :bar, value: '+32 477 123 123', type: 'tel'),
|
46
|
+
Yaks::Resource::Form::Field.new(name: :qux, value: '777', type: 'text'),
|
47
|
+
Yaks::Resource::Form::Field.new(name: :quux, value: '999', type: 'tel')
|
48
|
+
]
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -88,6 +88,26 @@ RSpec.describe Yaks::Resource do
|
|
88
88
|
end
|
89
89
|
end
|
90
90
|
|
91
|
+
describe '#initialize' do
|
92
|
+
it 'should verify subresources is an array' do
|
93
|
+
expect { Yaks::Resource.new(subresources: { '/rel/comments' => []}) }
|
94
|
+
.to raise_exception /comments/
|
95
|
+
end
|
96
|
+
|
97
|
+
it 'should verify subresources is an array' do
|
98
|
+
expect { Yaks::Resource.new(subresources: []) }
|
99
|
+
.to_not raise_exception
|
100
|
+
end
|
101
|
+
|
102
|
+
it 'should work without args' do
|
103
|
+
expect( Yaks::Resource.new ).to be_a Yaks::Resource
|
104
|
+
end
|
105
|
+
|
106
|
+
it 'should take defaults when no args are passed' do
|
107
|
+
expect( Yaks::Resource.new.rels ).to eq []
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
91
111
|
describe '#self_link' do
|
92
112
|
let(:init_opts) {
|
93
113
|
{ links:
|
@@ -103,10 +123,27 @@ RSpec.describe Yaks::Resource do
|
|
103
123
|
end
|
104
124
|
end
|
105
125
|
|
126
|
+
describe '#add_rel' do
|
127
|
+
it 'should add to the rels' do
|
128
|
+
expect(resource.add_rel(:foo).add_rel(:bar))
|
129
|
+
.to eql Yaks::Resource.new(rels: [:foo, :bar])
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
106
133
|
describe '#add_form' do
|
107
134
|
it 'should append to the forms' do
|
108
|
-
expect(resource.add_form(:a_form))
|
109
|
-
.to eq Yaks::Resource.new(forms: [:a_form])
|
135
|
+
expect(resource.add_form(Yaks::Resource::Form.new(name: :a_form)))
|
136
|
+
.to eq Yaks::Resource.new(forms: [Yaks::Resource::Form.new(name: :a_form)])
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
describe '#find_form' do
|
141
|
+
it 'should find a form by name' do
|
142
|
+
expect(resource
|
143
|
+
.add_form(Yaks::Resource::Form.new(name: :a_form))
|
144
|
+
.add_form(Yaks::Resource::Form.new(name: :b_form))
|
145
|
+
.find_form(:b_form))
|
146
|
+
.to eq Yaks::Resource::Form.new(name: :b_form)
|
110
147
|
end
|
111
148
|
end
|
112
149
|
|
@@ -118,4 +155,11 @@ RSpec.describe Yaks::Resource do
|
|
118
155
|
end
|
119
156
|
end
|
120
157
|
|
158
|
+
describe '#with_collection' do
|
159
|
+
it 'should be a no-op' do
|
160
|
+
expect(Yaks::Resource.new.with_collection([:foo])).to eql Yaks::Resource.new
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
121
164
|
end
|
165
|
+
# ~> -:1:in `<main>': uninitialized constant RSpec (NameError)
|
data/yaks.gemspec
CHANGED
@@ -2,7 +2,6 @@
|
|
2
2
|
|
3
3
|
require File.expand_path('../lib/yaks/version', __FILE__)
|
4
4
|
require File.expand_path('../lib/yaks/breaking_changes', __FILE__)
|
5
|
-
require File.expand_path('../lib/yaks/changelog', __FILE__)
|
6
5
|
|
7
6
|
Gem::Specification.new do |gem|
|
8
7
|
gem.name = 'yaks'
|
@@ -19,8 +18,6 @@ Gem::Specification.new do |gem|
|
|
19
18
|
gem.test_files = gem.files.grep(/^spec/)
|
20
19
|
gem.extra_rdoc_files = %w[README.md]
|
21
20
|
|
22
|
-
gem.metadata = {'changelog' => Yaks::Changelog.current[0...1000]}
|
23
|
-
|
24
21
|
if Yaks::BreakingChanges.key? Yaks::VERSION
|
25
22
|
gem.post_install_message = Yaks::BreakingChanges[Yaks::VERSION]
|
26
23
|
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.8.0.
|
4
|
+
version: 0.8.0.beta1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Arne Brasseur
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-01-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: inflection
|
@@ -285,6 +285,7 @@ files:
|
|
285
285
|
- lib/yaks/resource.rb
|
286
286
|
- lib/yaks/resource/form.rb
|
287
287
|
- lib/yaks/resource/form/field.rb
|
288
|
+
- lib/yaks/resource/form/field/option.rb
|
288
289
|
- lib/yaks/resource/form/fieldset.rb
|
289
290
|
- lib/yaks/resource/link.rb
|
290
291
|
- lib/yaks/runner.rb
|
@@ -346,6 +347,8 @@ files:
|
|
346
347
|
- spec/unit/yaks/null_resource_spec.rb
|
347
348
|
- spec/unit/yaks/pipeline_spec.rb
|
348
349
|
- spec/unit/yaks/primitivize_spec.rb
|
350
|
+
- spec/unit/yaks/resource/form/field_sepc.rb
|
351
|
+
- spec/unit/yaks/resource/form_spec.rb
|
349
352
|
- spec/unit/yaks/resource/link_spec.rb
|
350
353
|
- spec/unit/yaks/resource_spec.rb
|
351
354
|
- spec/unit/yaks/runner_spec.rb
|
@@ -357,47 +360,7 @@ files:
|
|
357
360
|
homepage: https://github.com/plexus/yaks
|
358
361
|
licenses:
|
359
362
|
- MIT
|
360
|
-
metadata:
|
361
|
-
changelog: |-
|
362
|
-
Improved Collection+JSON support, dynamically generated form fields.
|
363
|
-
|
364
|
-
#### Collection+JSON
|
365
|
-
|
366
|
-
Carles Jove i Buxeda has done some great work to improve support for Collection+JSON, GET forms are now rendered as CJ queries.
|
367
|
-
|
368
|
-
#### Dynamic Form Fields
|
369
|
-
|
370
|
-
A new introduction are "dynamic" form fields. Up to now it was hard to generate forms based on the object being serialized. Now it's possible to add dynamic sections to a Form definition. These will be evaluated at map-time, they receive the object being mapped, and inside the syntax for defining form fields can be used.
|
371
|
-
|
372
|
-
```
|
373
|
-
form :checkout do
|
374
|
-
text :name
|
375
|
-
text :lastname
|
376
|
-
|
377
|
-
dynamic do |object|
|
378
|
-
object.shipping_options.each do |shipping|
|
379
|
-
radio shipping.type_name, title: shipping.description
|
380
|
-
end
|
381
|
-
end
|
382
|
-
end
|
383
|
-
```
|
384
|
-
|
385
|
-
#### Fieldset and Legend
|
386
|
-
|
387
|
-
Support for the fieldset element type has been added, which works as you would expect
|
388
|
-
|
389
|
-
```
|
390
|
-
form :foo do
|
391
|
-
fieldset do
|
392
|
-
legend "Hello"
|
393
|
-
text :field_1
|
394
|
-
end
|
395
|
-
end
|
396
|
-
```
|
397
|
-
|
398
|
-
#### Remove links
|
399
|
-
|
400
|
-
A link de
|
363
|
+
metadata: {}
|
401
364
|
post_install_message:
|
402
365
|
rdoc_options: []
|
403
366
|
require_paths:
|
@@ -473,6 +436,8 @@ test_files:
|
|
473
436
|
- spec/unit/yaks/null_resource_spec.rb
|
474
437
|
- spec/unit/yaks/pipeline_spec.rb
|
475
438
|
- spec/unit/yaks/primitivize_spec.rb
|
439
|
+
- spec/unit/yaks/resource/form/field_sepc.rb
|
440
|
+
- spec/unit/yaks/resource/form_spec.rb
|
476
441
|
- spec/unit/yaks/resource/link_spec.rb
|
477
442
|
- spec/unit/yaks/resource_spec.rb
|
478
443
|
- spec/unit/yaks/runner_spec.rb
|