yaks 0.7.7 → 0.8.0.alpha
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/.rspec +1 -0
- data/Rakefile +1 -1
- data/lib/yaks/attributes.rb +17 -11
- data/lib/yaks/builder.rb +43 -0
- data/lib/yaks/changelog.rb +2 -2
- data/lib/yaks/collection_mapper.rb +0 -2
- data/lib/yaks/config.rb +52 -32
- data/lib/yaks/configurable.rb +43 -14
- data/lib/yaks/errors.rb +1 -0
- data/lib/yaks/format/collection_json.rb +37 -5
- data/lib/yaks/format/hal.rb +8 -2
- data/lib/yaks/format/halo.rb +16 -9
- data/lib/yaks/format/json_api.rb +21 -2
- data/lib/yaks/format.rb +21 -15
- data/lib/yaks/html5_forms.rb +3 -2
- data/lib/yaks/identifier/link_relation.rb +17 -0
- data/lib/yaks/mapper/attribute.rb +2 -2
- data/lib/yaks/mapper/config.rb +1 -15
- data/lib/yaks/mapper/form/config.rb +21 -0
- data/lib/yaks/mapper/form/field/option.rb +20 -0
- data/lib/yaks/mapper/form/field.rb +13 -26
- data/lib/yaks/mapper/form/fieldset.rb +43 -0
- data/lib/yaks/mapper/form.rb +41 -16
- data/lib/yaks/mapper/link.rb +9 -7
- data/lib/yaks/mapper.rb +15 -7
- data/lib/yaks/null_resource.rb +2 -1
- data/lib/yaks/pipeline.rb +42 -0
- data/lib/yaks/primitivize.rb +0 -1
- data/lib/yaks/reader/hal.rb +63 -0
- data/lib/yaks/resource/form/field.rb +19 -0
- data/lib/yaks/resource/form/fieldset.rb +13 -0
- data/lib/yaks/resource/form.rb +6 -10
- data/lib/yaks/resource.rb +19 -2
- data/lib/yaks/runner.rb +13 -38
- data/lib/yaks/serializer.rb +34 -1
- data/lib/yaks/util.rb +8 -2
- data/lib/yaks/version.rb +1 -1
- data/lib/yaks.rb +37 -10
- data/resources/iana-link-relations.csv +152 -0
- data/spec/acceptance/acceptance_spec.rb +4 -3
- data/spec/acceptance/json_shared_examples.rb +11 -0
- data/spec/acceptance/models.rb +1 -1
- data/spec/integration/dynamic_form_fields_spec.rb +36 -0
- data/spec/integration/fieldset_spec.rb +62 -0
- data/spec/integration/map_to_resource_spec.rb +0 -2
- data/spec/json/confucius.halo.json +0 -1
- data/spec/sanity_spec.rb +0 -2
- data/spec/spec_helper.rb +3 -3
- data/spec/unit/yaks/attributes_spec.rb +3 -5
- data/spec/unit/yaks/{stateful_builder_spec.rb → builder_spec.rb} +8 -10
- data/spec/unit/yaks/collection_mapper_spec.rb +0 -2
- data/spec/unit/yaks/collection_resource_spec.rb +0 -2
- data/spec/unit/yaks/config_spec.rb +9 -15
- data/spec/unit/yaks/default_policy/derive_mapper_from_object_spec.rb +0 -2
- data/spec/unit/yaks/default_policy_spec.rb +0 -2
- data/spec/unit/yaks/format/collection_json_spec.rb +195 -3
- data/spec/unit/yaks/format/hal_spec.rb +0 -2
- data/spec/unit/yaks/format/halo_spec.rb +0 -1
- data/spec/unit/yaks/format/html_spec.rb +0 -2
- data/spec/unit/yaks/format/json_api_spec.rb +0 -2
- data/spec/unit/yaks/format_spec.rb +4 -6
- data/spec/unit/yaks/fp/callable_spec.rb +0 -2
- data/spec/unit/yaks/fp_spec.rb +0 -2
- data/spec/unit/yaks/mapper/association_mapper_spec.rb +0 -2
- data/spec/unit/yaks/mapper/association_spec.rb +0 -2
- data/spec/unit/yaks/mapper/attribute_spec.rb +0 -2
- data/spec/unit/yaks/mapper/config_spec.rb +6 -167
- data/spec/unit/yaks/mapper/form/field_spec.rb +0 -2
- data/spec/unit/yaks/mapper/form_spec.rb +2 -26
- data/spec/unit/yaks/mapper/has_many_spec.rb +0 -2
- data/spec/unit/yaks/mapper/has_one_spec.rb +0 -2
- data/spec/unit/yaks/mapper/link_spec.rb +13 -2
- data/spec/unit/yaks/mapper_spec.rb +2 -10
- data/spec/unit/yaks/null_resource_spec.rb +2 -4
- data/spec/unit/yaks/pipeline_spec.rb +140 -0
- data/spec/unit/yaks/primitivize_spec.rb +0 -2
- data/spec/unit/yaks/resource/link_spec.rb +0 -2
- data/spec/unit/yaks/resource_spec.rb +2 -4
- data/spec/unit/yaks/runner_spec.rb +52 -92
- data/spec/unit/yaks/serializer_spec.rb +0 -2
- data/spec/unit/yaks/util_spec.rb +12 -2
- metadata +58 -23
- data/lib/yaks/config/dsl.rb +0 -174
- data/lib/yaks/mapper/class_methods.rb +0 -47
- data/lib/yaks/stateful_builder.rb +0 -63
- data/spec/unit/yaks/config/dsl_spec.rb +0 -92
- data/spec/unit/yaks/configurable_spec.rb +0 -55
- data/spec/unit/yaks/mapper/class_methods_spec.rb +0 -83
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ae9407b2b6c0f2f15c86276063e02ea2d7f9a4f7
|
4
|
+
data.tar.gz: 776d6202349cbf8854506a3d89f06134f2bee12f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 23ec9ff975f4a4da763720f8ce5d11d8346c1e23f592070e9517dc340605d5221adad9e9a9c64db38158fc88af4b03d21717fc478137dbf4a2f85836a99dd417
|
7
|
+
data.tar.gz: 64f8c4e3078416d4ccffdd572c8eadd0606d5e11c950085f16d5fede07aea162e3338c038284d92c2bbc1974c0a32e98fda97aa4a8d17d1a0d40755c17ba49ad
|
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
-r spec_helper
|
data/Rakefile
CHANGED
@@ -33,13 +33,13 @@ task :mutant_chunked do
|
|
33
33
|
# Yaks::Attributes::InstanceMethods,
|
34
34
|
# Yaks::Configurable,
|
35
35
|
# Yaks::NullResource,
|
36
|
+
# Yaks::Runner,
|
36
37
|
|
37
38
|
[
|
38
39
|
# Yaks::Resource::Form, # no explicit coverage
|
39
40
|
# Yaks::Resource::Form::Field, # no explicit coverage
|
40
41
|
# Yaks::Mapper::Form::Field::Option, # no explicit coverage
|
41
42
|
# Yaks::Format::HTML, # no explicit coverage
|
42
|
-
Yaks::Runner, # 56/509 # 89.55%
|
43
43
|
Yaks::Resource, # 35/206 # 83.01%
|
44
44
|
Yaks::StatefulBuilder, # 25/192 # 86.98%
|
45
45
|
Yaks::Format::Halo, # 24/232 # 89.66%
|
data/lib/yaks/attributes.rb
CHANGED
@@ -12,19 +12,21 @@ module Yaks
|
|
12
12
|
self.class.new(*[*(names+attrs), @defaults.merge(defaults)])
|
13
13
|
end
|
14
14
|
|
15
|
+
def remove(*attrs)
|
16
|
+
self.class.new(*[*(names-attrs), @defaults.reject {|k,v| attrs.include?(k) }])
|
17
|
+
end
|
18
|
+
|
15
19
|
def included(descendant)
|
16
20
|
descendant.module_exec(self) do |this|
|
17
21
|
include InstanceMethods,
|
18
22
|
Anima.new(*this.names),
|
19
23
|
Anima::Update
|
20
24
|
|
25
|
+
alias with update
|
26
|
+
|
21
27
|
this.names.each do |attr|
|
22
|
-
define_method attr do |value
|
23
|
-
|
24
|
-
instance_variable_get("@#{attr}")
|
25
|
-
else
|
26
|
-
update(attr => value)
|
27
|
-
end
|
28
|
+
define_method "with_#{attr}" do |value|
|
29
|
+
with(attr => value)
|
28
30
|
end
|
29
31
|
end
|
30
32
|
|
@@ -38,17 +40,21 @@ module Yaks
|
|
38
40
|
end
|
39
41
|
|
40
42
|
def append_to(type, *objects)
|
41
|
-
|
43
|
+
with(type => instance_variable_get("@#{type}") + objects)
|
44
|
+
end
|
45
|
+
|
46
|
+
def to_h_compact
|
47
|
+
defaults = self.class.attributes.defaults
|
48
|
+
to_h.reject do |attr, value|
|
49
|
+
value.equal?(defaults[attr])
|
50
|
+
end
|
42
51
|
end
|
43
52
|
|
44
53
|
def pp
|
45
54
|
indent = ->(str) { str.lines.map {|l| " #{l}"}.join }
|
46
55
|
format = ->(val) { val.respond_to?(:pp) ? val.pp : val.inspect }
|
47
56
|
|
48
|
-
|
49
|
-
values = to_h.reject do |attr, value|
|
50
|
-
value.equal?(defaults[attr])
|
51
|
-
end
|
57
|
+
values = to_h_compact
|
52
58
|
|
53
59
|
fmt_attrs = values.map do |attr, value|
|
54
60
|
fmt_val = case value
|
data/lib/yaks/builder.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
module Yaks
|
2
|
+
# State monad-ish thing.
|
3
|
+
#
|
4
|
+
# Generate a DSL syntax for immutable classes.
|
5
|
+
#
|
6
|
+
# @example
|
7
|
+
#
|
8
|
+
# # This code
|
9
|
+
# Form.create(:search)
|
10
|
+
# .method("POST")
|
11
|
+
# .action("/search")
|
12
|
+
#
|
13
|
+
# # Can be written as
|
14
|
+
# Builder.new(Form, [:method, :action]).create(:search) do
|
15
|
+
# method "POST"
|
16
|
+
# action "/search"
|
17
|
+
# end
|
18
|
+
#
|
19
|
+
class Builder
|
20
|
+
include Configurable
|
21
|
+
|
22
|
+
def create(*args, &block)
|
23
|
+
build(@klass.create(*args), &block)
|
24
|
+
end
|
25
|
+
|
26
|
+
def build(init_state, *extra_args, &block)
|
27
|
+
@config = init_state
|
28
|
+
instance_exec(*extra_args, &block) if block
|
29
|
+
@config
|
30
|
+
end
|
31
|
+
|
32
|
+
def initialize(klass, methods = [], &block)
|
33
|
+
@klass = klass
|
34
|
+
@methods = methods
|
35
|
+
def_forward *methods if methods.any?
|
36
|
+
instance_eval(&block) if block
|
37
|
+
end
|
38
|
+
|
39
|
+
def inspect
|
40
|
+
"#<Builder #{@klass} #{@methods.inspect}>"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/lib/yaks/changelog.rb
CHANGED
@@ -7,8 +7,8 @@ module Yaks
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def versions
|
10
|
-
markdown.split(/(?=###\s*[\d\.]+\n)/).each_with_object({}) do |section, hsh|
|
11
|
-
version = section.each_line.first[/[\d\.]+/]
|
10
|
+
markdown.split(/(?=###\s*[\d\w\.]+\n)/).each_with_object({}) do |section, hsh|
|
11
|
+
version = section.each_line.first[/[\d\w\.]+/]
|
12
12
|
log = section.each_line.drop(1).join.strip
|
13
13
|
hsh[version] = log
|
14
14
|
end
|
data/lib/yaks/config.rb
CHANGED
@@ -1,45 +1,61 @@
|
|
1
1
|
module Yaks
|
2
2
|
class Config
|
3
|
-
|
3
|
+
extend Yaks::Util::Deprecated
|
4
|
+
include Yaks::FP::Callable,
|
5
|
+
Attributes.new(
|
6
|
+
format_options_hash: Hash.new({}),
|
7
|
+
default_format: :hal,
|
8
|
+
policy_options: {},
|
9
|
+
policy_class: DefaultPolicy,
|
10
|
+
primitivize: Primitivize.create,
|
11
|
+
serializers: Serializer.all,
|
12
|
+
hooks: []
|
13
|
+
)
|
4
14
|
|
5
|
-
|
6
|
-
|
7
|
-
|
15
|
+
class << self
|
16
|
+
alias create new
|
17
|
+
end
|
8
18
|
|
9
|
-
|
10
|
-
# @return [Symbol]
|
11
|
-
attr_accessor :default_format
|
19
|
+
deprecated_alias :namespace, :mapper_namespace
|
12
20
|
|
13
|
-
|
14
|
-
|
15
|
-
|
21
|
+
def format_options(format = Undefined, options = Undefined)
|
22
|
+
with(format_options_hash: format_options_hash.merge(format => options))
|
23
|
+
end
|
16
24
|
|
17
|
-
|
18
|
-
|
19
|
-
|
25
|
+
def serializer(type, &serializer)
|
26
|
+
with(serializers: serializers.merge(type => serializer))
|
27
|
+
end
|
20
28
|
|
21
|
-
|
22
|
-
|
23
|
-
|
29
|
+
def json_serializer(&serializer)
|
30
|
+
with(serializer: :json, &serializer)
|
31
|
+
end
|
24
32
|
|
25
|
-
|
26
|
-
|
27
|
-
|
33
|
+
%w[before after around skip].map(&:intern).each do |hook_type|
|
34
|
+
define_method hook_type do |step, name = :"#{hook_type}_#{step}", &block|
|
35
|
+
append_to(:hooks, [hook_type, step, name, block])
|
36
|
+
end
|
37
|
+
end
|
28
38
|
|
29
|
-
|
30
|
-
|
31
|
-
|
39
|
+
def rel_template(template)
|
40
|
+
with(policy_options: policy_options.merge(:rel_template => template))
|
41
|
+
end
|
32
42
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
@hooks = []
|
43
|
+
def mapper_namespace(namespace)
|
44
|
+
with(policy_options: policy_options.merge(:namespace => namespace))
|
45
|
+
end
|
46
|
+
|
47
|
+
def map_to_primitive(*args, &block)
|
48
|
+
with(primitivize: primitivize.dup.tap { |prim| prim.map(*args, &block) })
|
49
|
+
end
|
41
50
|
|
42
|
-
|
51
|
+
DefaultPolicy.public_instance_methods(false).each do |method|
|
52
|
+
define_method method do |&block|
|
53
|
+
with(
|
54
|
+
policy_class: Class.new(policy_class) do
|
55
|
+
define_method method, &block
|
56
|
+
end
|
57
|
+
)
|
58
|
+
end
|
43
59
|
end
|
44
60
|
|
45
61
|
# @return [Yaks::DefaultPolicy]
|
@@ -67,7 +83,11 @@ module Yaks
|
|
67
83
|
alias serialize call
|
68
84
|
|
69
85
|
def map(object, options = {})
|
70
|
-
runner(object, options).map
|
86
|
+
runner(object, options).map
|
87
|
+
end
|
88
|
+
|
89
|
+
def read(data, options = {})
|
90
|
+
runner(data, options).read
|
71
91
|
end
|
72
92
|
end
|
73
93
|
end
|
data/lib/yaks/configurable.rb
CHANGED
@@ -1,23 +1,52 @@
|
|
1
1
|
module Yaks
|
2
2
|
module Configurable
|
3
|
-
|
4
|
-
|
3
|
+
attr_accessor :config
|
4
|
+
|
5
|
+
def self.extended(child)
|
6
|
+
child.config = child::Config.new
|
7
|
+
end
|
8
|
+
|
9
|
+
def inherited(child)
|
10
|
+
child.config = config
|
11
|
+
end
|
12
|
+
|
13
|
+
def def_set(*method_names)
|
14
|
+
method_names.each do |method_name|
|
15
|
+
define_singleton_method method_name do |arg|
|
16
|
+
self.config = config.update(method_name => arg)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def def_forward(method_names, *args)
|
22
|
+
unless method_names.is_a? Hash
|
23
|
+
def_forward([method_names, *args].map{|name| {name => name}}.inject(:merge))
|
24
|
+
return
|
25
|
+
end
|
26
|
+
method_names.each do |method_name, target|
|
27
|
+
define_singleton_method method_name do |*args, &block|
|
28
|
+
self.config = config.public_send(target, *args, &block)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def def_add(name, options)
|
34
|
+
define_singleton_method name do |*args, &block|
|
5
35
|
defaults = options.fetch(:defaults, {})
|
6
36
|
klass = options.fetch(:create)
|
7
37
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
append_to(options.fetch(:append_to), instance)
|
38
|
+
if args.last.instance_of?(Hash)
|
39
|
+
args[-1] = defaults.merge(args[-1])
|
40
|
+
else
|
41
|
+
args << defaults
|
42
|
+
end
|
43
|
+
|
44
|
+
self.config = config.append_to(
|
45
|
+
options.fetch(:append_to),
|
46
|
+
klass.create(*args, &block)
|
47
|
+
)
|
20
48
|
end
|
21
49
|
end
|
50
|
+
|
22
51
|
end
|
23
52
|
end
|
data/lib/yaks/errors.rb
CHANGED
@@ -13,7 +13,8 @@ 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
|
16
|
+
result[:links] = serialize_links(resource) if links? resource
|
17
|
+
result[:queries] = serialize_queries(resource) if queries? resource
|
17
18
|
{collection: result}
|
18
19
|
end
|
19
20
|
|
@@ -40,11 +41,42 @@ module Yaks
|
|
40
41
|
end
|
41
42
|
|
42
43
|
def serialize_links(resource)
|
43
|
-
|
44
|
-
|
45
|
-
result << {href: link.uri, rel: link.rel}
|
44
|
+
resource.links.each_with_object([]) do |link, result|
|
45
|
+
result << { href: link.uri, rel: link.rel }
|
46
46
|
end
|
47
|
-
|
47
|
+
end
|
48
|
+
|
49
|
+
def serialize_queries(resource)
|
50
|
+
resource.forms.each_with_object([]) do |form, result|
|
51
|
+
next unless form_is_query? form
|
52
|
+
|
53
|
+
result << { rel: form.name, href: form.action }
|
54
|
+
result.last[:prompt] = form.title if form.title
|
55
|
+
|
56
|
+
form.fields_flat.each do |field|
|
57
|
+
result.last[:data] = [] unless result.last.key? :data
|
58
|
+
result.last[:data] << { name: field.name, value: nil.to_s }
|
59
|
+
result.last[:data].last[:prompt] = field.label if field.label
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def queries?(resource)
|
65
|
+
resource.forms.any? { |f| form_is_query? f }
|
66
|
+
end
|
67
|
+
|
68
|
+
def links?(resource)
|
69
|
+
resource.collection? && resource.links.any?
|
70
|
+
end
|
71
|
+
|
72
|
+
protected
|
73
|
+
|
74
|
+
def form_is_query?(form)
|
75
|
+
method_is_get?(form.method) && !form.action.nil?
|
76
|
+
end
|
77
|
+
|
78
|
+
def method_is_get?(method)
|
79
|
+
method.downcase.to_sym === :get
|
48
80
|
end
|
49
81
|
end
|
50
82
|
end
|
data/lib/yaks/format/hal.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
2
|
-
|
3
1
|
module Yaks
|
4
2
|
class Format
|
5
3
|
# Hypertext Application Language (http://stateless.co/hal_specification.html)
|
@@ -23,6 +21,14 @@ module Yaks
|
|
23
21
|
class Hal < self
|
24
22
|
register :hal, :json, 'application/hal+json'
|
25
23
|
|
24
|
+
def transitive?
|
25
|
+
true
|
26
|
+
end
|
27
|
+
|
28
|
+
def inverse
|
29
|
+
Yaks::Reader::Hal.new
|
30
|
+
end
|
31
|
+
|
26
32
|
protected
|
27
33
|
|
28
34
|
# @param [Yaks::Resource] resource
|
data/lib/yaks/format/halo.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
2
|
-
|
3
1
|
module Yaks
|
4
2
|
class Format
|
5
3
|
# Extension of Hal loosely based on the example by Mike Kelly given at
|
@@ -22,20 +20,29 @@ module Yaks
|
|
22
20
|
end
|
23
21
|
|
24
22
|
def serialize_form(form)
|
25
|
-
raw = form.
|
26
|
-
raw[:href] = raw.delete(:action)
|
27
|
-
raw[:fields] = form.fields.map
|
28
|
-
|
29
|
-
|
23
|
+
raw = form.to_h_compact
|
24
|
+
raw[:href] = raw.delete(:action) if raw[:action]
|
25
|
+
raw[:fields] = form.fields.map(&method(:serialize_form_field))
|
26
|
+
raw
|
27
|
+
end
|
28
|
+
|
29
|
+
def serialize_form_field(field)
|
30
|
+
if field.type == :fieldset
|
31
|
+
{
|
32
|
+
type: :fieldset,
|
33
|
+
fields: field.fields.map(&method(:serialize_form_field))
|
34
|
+
}
|
35
|
+
else
|
36
|
+
field.to_h_compact.each_with_object({}) do |(attr,value), hsh|
|
37
|
+
if attr == :options # <option>s of a <select>
|
30
38
|
if !value.empty?
|
31
39
|
hsh[:options] = value.map(&:to_h)
|
32
40
|
end
|
33
|
-
|
41
|
+
else
|
34
42
|
hsh[attr] = value
|
35
43
|
end
|
36
44
|
end
|
37
45
|
end
|
38
|
-
raw
|
39
46
|
end
|
40
47
|
end
|
41
48
|
end
|
data/lib/yaks/format/json_api.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
2
|
-
|
3
1
|
module Yaks
|
4
2
|
class Format
|
5
3
|
class JsonAPI < self
|
@@ -81,6 +79,27 @@ module Yaks
|
|
81
79
|
linked[key] = (set << serialize_resource(resource))
|
82
80
|
serialize_linked_subresources(resource.subresources, linked)
|
83
81
|
end
|
82
|
+
|
83
|
+
def inverse
|
84
|
+
JsonApi::Reader.new
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
class Reader
|
89
|
+
def call(data, env)
|
90
|
+
type = data.detect do |key, value|
|
91
|
+
key unless key == "links"
|
92
|
+
end
|
93
|
+
|
94
|
+
CollectionResource.new(
|
95
|
+
type: type,
|
96
|
+
members: map_to_resource(data[type], )
|
97
|
+
)
|
98
|
+
end
|
99
|
+
|
100
|
+
def inverse
|
101
|
+
JsonApi.new
|
102
|
+
end
|
84
103
|
end
|
85
104
|
end
|
86
105
|
end
|
data/lib/yaks/format.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
module Yaks
|
2
2
|
class Format
|
3
3
|
extend Forwardable
|
4
|
-
include Util
|
5
|
-
|
4
|
+
include Util,
|
5
|
+
FP::Callable
|
6
6
|
|
7
7
|
# @!attribute [r] options
|
8
8
|
# @return [Hash]
|
@@ -26,7 +26,11 @@ module Yaks
|
|
26
26
|
alias serialize call
|
27
27
|
|
28
28
|
class << self
|
29
|
-
|
29
|
+
extend Util::Deprecated
|
30
|
+
|
31
|
+
attr_reader :format_name, :serializer, :media_type
|
32
|
+
|
33
|
+
deprecated_alias :mime_type, :media_type
|
30
34
|
|
31
35
|
def all
|
32
36
|
@formats ||= []
|
@@ -34,12 +38,12 @@ module Yaks
|
|
34
38
|
|
35
39
|
# @param [Constant] klass
|
36
40
|
# @param [Symbol] format_name
|
37
|
-
# @param [String]
|
41
|
+
# @param [String] media_type
|
38
42
|
# @return [Array]
|
39
|
-
def register(format_name, serializer,
|
43
|
+
def register(format_name, serializer, media_type)
|
40
44
|
@format_name = format_name
|
41
45
|
@serializer = serializer
|
42
|
-
@
|
46
|
+
@media_type = media_type
|
43
47
|
|
44
48
|
Format.all << self
|
45
49
|
end
|
@@ -51,30 +55,32 @@ module Yaks
|
|
51
55
|
find(:format_name, format_name)
|
52
56
|
end
|
53
57
|
|
54
|
-
# @param [Symbol]
|
58
|
+
# @param [Symbol] media_type
|
55
59
|
# @return [Constant]
|
56
60
|
# @raise [KeyError]
|
57
|
-
def
|
58
|
-
find(:
|
61
|
+
def by_media_type(media_type)
|
62
|
+
find(:media_type, media_type)
|
59
63
|
end
|
64
|
+
deprecated_alias :by_mime_type, :by_media_type
|
60
65
|
|
61
66
|
def by_accept_header(accept_header)
|
62
|
-
|
63
|
-
if
|
64
|
-
|
67
|
+
media_type = Rack::Accept::Charset.new(accept_header).best_of(media_types.values)
|
68
|
+
if media_type
|
69
|
+
by_media_type(media_type)
|
65
70
|
else
|
66
71
|
yield if block_given?
|
67
72
|
end
|
68
73
|
end
|
69
74
|
|
70
|
-
def
|
75
|
+
def media_types
|
71
76
|
Format.all.each_with_object({}) do
|
72
|
-
|format, memo| memo[format.format_name] = format.
|
77
|
+
|format, memo| memo[format.format_name] = format.media_type
|
73
78
|
end
|
74
79
|
end
|
80
|
+
deprecated_alias :mime_types, :media_types
|
75
81
|
|
76
82
|
def names
|
77
|
-
|
83
|
+
media_types.keys
|
78
84
|
end
|
79
85
|
|
80
86
|
private
|
data/lib/yaks/html5_forms.rb
CHANGED
@@ -0,0 +1,17 @@
|
|
1
|
+
module Yaks
|
2
|
+
module Identifier
|
3
|
+
module LinkRelation
|
4
|
+
def self.iana_registry
|
5
|
+
@iana_registry ||= CSV.read(Yaks::Root.join('resources/iana-link-relations.csv'))
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.registered_names
|
9
|
+
@registered_names = iana_registry.drop(1).map(&:first)
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.iana?(name)
|
13
|
+
registered_names.include?(name.to_s)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -4,11 +4,11 @@ module Yaks
|
|
4
4
|
include Attributes.new(:name)
|
5
5
|
|
6
6
|
def initialize(name)
|
7
|
-
|
7
|
+
super(name: name)
|
8
8
|
end
|
9
9
|
|
10
10
|
def add_to_resource(resource, mapper, _context)
|
11
|
-
resource.
|
11
|
+
resource.merge_attributes(name => mapper.load_attribute(name))
|
12
12
|
end
|
13
13
|
end
|
14
14
|
end
|
data/lib/yaks/mapper/config.rb
CHANGED
@@ -1,27 +1,13 @@
|
|
1
1
|
module Yaks
|
2
2
|
class Mapper
|
3
3
|
class Config
|
4
|
-
extend Configurable
|
5
|
-
|
6
4
|
include Attributes.new(
|
7
5
|
type: nil, attributes: [], links: [], associations: [], forms: []
|
8
6
|
)
|
9
7
|
|
10
|
-
def
|
11
|
-
return @type if type.equal?(Undefined)
|
12
|
-
update(type: type)
|
13
|
-
end
|
14
|
-
|
15
|
-
def attributes(*attrs)
|
16
|
-
return @attributes if attrs.empty?
|
8
|
+
def add_attributes(*attrs)
|
17
9
|
append_to(:attributes, *attrs.map(&Attribute.method(:new)))
|
18
10
|
end
|
19
|
-
|
20
|
-
config_method :link, create: Link, append_to: :links
|
21
|
-
config_method :has_one, create: HasOne, append_to: :associations
|
22
|
-
config_method :has_many, create: HasMany, append_to: :associations
|
23
|
-
config_method :attribute, create: Attribute, append_to: :attributes
|
24
|
-
config_method :form, create: Form, append_to: :forms
|
25
11
|
end
|
26
12
|
end
|
27
13
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Yaks
|
2
|
+
class Mapper
|
3
|
+
class Form
|
4
|
+
class Config
|
5
|
+
include Attributes.new(
|
6
|
+
name: nil,
|
7
|
+
action: nil,
|
8
|
+
title: nil,
|
9
|
+
method: nil,
|
10
|
+
media_type: nil,
|
11
|
+
fields: [],
|
12
|
+
dynamic_blocks: []
|
13
|
+
)
|
14
|
+
|
15
|
+
def dynamic(&blk)
|
16
|
+
append_to(:dynamic_blocks, blk)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|