representable 3.1.1 → 3.2.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.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +10 -4
- data/CHANGES.md +4 -0
- data/README.md +8 -9
- data/lib/representable/version.rb +1 -1
- data/lib/representable/xml/binding.rb +3 -3
- metadata +7 -68
- data/lib/representable/virtus_coercion.rb +0 -38
- data/test/virtus_coercion_test.rb +0 -52
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f3a1388b7570e31d62c555a87d6165793e9d095cf1bed18c04cb8cbe86bc2ba2
|
4
|
+
data.tar.gz: 43e418db52478d3d4fc33f505ce86d840fcb666a8abc83e20269bbfab4c53a3a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 39e957975d24f76894ef9a7186fff69155525e5f777c120a77e2ecee8a7dcdccee62b2140ed8ab34ebc9de916a9098d9da846e0befda2c90fa32e4a9ff470ecc
|
7
|
+
data.tar.gz: cf309756f2470854283c09bbca25b3200b26ba1702b75e533573382dabd2f33a6f3eeaee963c2cc2bb0ddb9d3bdf026bf7dacba6da3f22f44dc805bc8d1ca505
|
data/.github/workflows/ci.yml
CHANGED
@@ -1,17 +1,23 @@
|
|
1
1
|
name: CI
|
2
|
-
on:
|
2
|
+
on:
|
3
|
+
push:
|
4
|
+
branches:
|
5
|
+
- master
|
6
|
+
pull_request:
|
7
|
+
branches:
|
8
|
+
- master
|
9
|
+
|
3
10
|
jobs:
|
4
11
|
test:
|
5
12
|
strategy:
|
6
13
|
fail-fast: false
|
7
14
|
matrix:
|
8
|
-
|
9
|
-
ruby: [2.5, 2.6, 2.7, '3.0', head]
|
15
|
+
ruby: [2.5, 2.6, 2.7, '3.0', "3.1"]
|
10
16
|
runs-on: ubuntu-latest
|
11
17
|
steps:
|
12
18
|
- uses: actions/checkout@v2
|
13
19
|
- uses: ruby/setup-ruby@v1
|
14
20
|
with:
|
15
21
|
ruby-version: ${{ matrix.ruby }}
|
16
|
-
bundler-cache: true
|
22
|
+
bundler-cache: true
|
17
23
|
- run: bundle exec rake
|
data/CHANGES.md
CHANGED
data/README.md
CHANGED
@@ -2,20 +2,19 @@
|
|
2
2
|
|
3
3
|
Representable maps Ruby objects to documents and back.
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
[](https://travis-ci.org/trailblazer/representable)
|
5
|
+

|
9
7
|
[](http://badge.fury.io/rb/representable)
|
10
8
|
|
9
|
+
|
11
10
|
In other words: Take an object and decorate it with a representer module. This will allow you to render a JSON, XML or YAML document from that object. But that's only half of it! You can also use representers to parse a document and create or populate an object.
|
12
11
|
|
13
|
-
Representable is helpful for all kind of mappings, rendering and parsing workflows. However, it is mostly useful in API code. Are you planning to write a real REST API with representable? Then check out the [Roar](
|
12
|
+
Representable is helpful for all kind of mappings, rendering and parsing workflows. However, it is mostly useful in API code. Are you planning to write a real REST API with representable? Then check out the [Roar](https://github.com/trailblazer/roar) gem first, save work and time and make the world a better place instead.
|
14
13
|
|
15
14
|
|
16
15
|
## Full Documentation
|
17
16
|
|
18
|
-
Representable comes with a rich set of options and semantics for parsing and rendering documents. Its [full documentation](
|
17
|
+
Representable comes with a rich set of options and semantics for parsing and rendering documents. Its [full documentation](https://trailblazer.to/2.1/docs/representable.html) can be found on the Trailblazer site.
|
19
18
|
|
20
19
|
## Example
|
21
20
|
|
@@ -64,7 +63,7 @@ song = SongRepresenter.new(song).from_json(%{ {"title":"Roxanne"} })
|
|
64
63
|
#=> #<Song title="Roxanne", track=nil>
|
65
64
|
```
|
66
65
|
|
67
|
-
Note that parsing hashes per default does [require string keys](
|
66
|
+
Note that parsing hashes per default does [require string keys](https://trailblazer.to/2.1/docs/representable.html#representable-api-symbol-keys) and does _not_ pick up symbol keys.
|
68
67
|
|
69
68
|
|
70
69
|
## Collections
|
@@ -137,7 +136,7 @@ end
|
|
137
136
|
|
138
137
|
Representable has many more features and can literally parse and render any kind of document to an arbitrary Ruby object graph.
|
139
138
|
|
140
|
-
Please check the [official documentation for more](
|
139
|
+
Please check the [official documentation for more](https://trailblazer.to/2.1/docs/representable.html#representable-api).
|
141
140
|
|
142
141
|
|
143
142
|
## Installation
|
@@ -172,4 +171,4 @@ Representable started as a heavily simplified fork of the ROXML gem. Big thanks
|
|
172
171
|
* Copyright (c) 2011-2020 Nick Sutterer <apotonick@gmail.com>
|
173
172
|
* ROXML is Copyright (c) 2004-2009 Ben Woosley, Zak Mandhro and Anders Engstrom.
|
174
173
|
|
175
|
-
Representable is released under the [MIT License](
|
174
|
+
Representable is released under the [MIT License](https://www.opensource.org/licenses/MIT).
|
@@ -24,7 +24,7 @@ module Representable
|
|
24
24
|
wrap_node = parent
|
25
25
|
|
26
26
|
if wrap = self[:wrap]
|
27
|
-
parent << wrap_node = XML::Node(parent, wrap)
|
27
|
+
parent << wrap_node = XML::Node(parent.document, wrap)
|
28
28
|
end
|
29
29
|
|
30
30
|
wrap_node << serialize_for(fragments, parent, as)
|
@@ -39,7 +39,7 @@ module Representable
|
|
39
39
|
|
40
40
|
# Creates wrapped node for the property.
|
41
41
|
def serialize_for(value, parent, as)
|
42
|
-
node = XML::Node(parent, as) # node doesn't have attr="" attributes!!!
|
42
|
+
node = XML::Node(parent.document, as) # node doesn't have attr="" attributes!!!
|
43
43
|
serialize_node(node, value, as)
|
44
44
|
end
|
45
45
|
|
@@ -106,7 +106,7 @@ module Representable
|
|
106
106
|
class Hash < Collection
|
107
107
|
def serialize_for(value, parent, as)
|
108
108
|
set_for(parent, value.collect do |k, v|
|
109
|
-
node = XML::Node(parent, k)
|
109
|
+
node = XML::Node(parent.document, k)
|
110
110
|
serialize_node(node, v, as)
|
111
111
|
end)
|
112
112
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: representable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nick Sutterer
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-05-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: uber
|
@@ -188,7 +188,6 @@ files:
|
|
188
188
|
- lib/representable/represent.rb
|
189
189
|
- lib/representable/serializer.rb
|
190
190
|
- lib/representable/version.rb
|
191
|
-
- lib/representable/virtus_coercion.rb
|
192
191
|
- lib/representable/xml.rb
|
193
192
|
- lib/representable/xml/binding.rb
|
194
193
|
- lib/representable/xml/collection.rb
|
@@ -250,7 +249,6 @@ files:
|
|
250
249
|
- test/test_helper_test.rb
|
251
250
|
- test/uncategorized_test.rb
|
252
251
|
- test/user_options_test.rb
|
253
|
-
- test/virtus_coercion_test.rb
|
254
252
|
- test/wrap_test.rb
|
255
253
|
- test/xml_bindings_test.rb
|
256
254
|
- test/xml_namespace_test.rb
|
@@ -260,7 +258,7 @@ homepage: https://github.com/trailblazer/representable/
|
|
260
258
|
licenses:
|
261
259
|
- MIT
|
262
260
|
metadata: {}
|
263
|
-
post_install_message:
|
261
|
+
post_install_message:
|
264
262
|
rdoc_options: []
|
265
263
|
require_paths:
|
266
264
|
- lib
|
@@ -275,68 +273,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
275
273
|
- !ruby/object:Gem::Version
|
276
274
|
version: '0'
|
277
275
|
requirements: []
|
278
|
-
rubygems_version: 3.0.
|
279
|
-
signing_key:
|
276
|
+
rubygems_version: 3.0.3.1
|
277
|
+
signing_key:
|
280
278
|
specification_version: 4
|
281
279
|
summary: Renders and parses JSON/XML/YAML documents from and to Ruby objects. Includes
|
282
280
|
plain properties, collections, nesting, coercion and more.
|
283
|
-
test_files:
|
284
|
-
- test/as_test.rb
|
285
|
-
- test/benchmarking.rb
|
286
|
-
- test/binding_test.rb
|
287
|
-
- test/cached_test.rb
|
288
|
-
- test/class_test.rb
|
289
|
-
- test/coercion_test.rb
|
290
|
-
- test/config/inherit_test.rb
|
291
|
-
- test/config_test.rb
|
292
|
-
- test/decorator_scope_test.rb
|
293
|
-
- test/decorator_test.rb
|
294
|
-
- test/default_test.rb
|
295
|
-
- test/defaults_options_test.rb
|
296
|
-
- test/definition_test.rb
|
297
|
-
- test/examples/example.rb
|
298
|
-
- test/examples/object.rb
|
299
|
-
- test/exec_context_test.rb
|
300
|
-
- test/features_test.rb
|
301
|
-
- test/filter_test.rb
|
302
|
-
- test/for_collection_test.rb
|
303
|
-
- test/generic_test.rb
|
304
|
-
- test/getter_setter_test.rb
|
305
|
-
- test/hash_bindings_test.rb
|
306
|
-
- test/hash_test.rb
|
307
|
-
- test/heritage_test.rb
|
308
|
-
- test/if_test.rb
|
309
|
-
- test/include_exclude_test.rb
|
310
|
-
- test/inherit_test.rb
|
311
|
-
- test/inline_test.rb
|
312
|
-
- test/instance_test.rb
|
313
|
-
- test/is_representable_test.rb
|
314
|
-
- test/json_test.rb
|
315
|
-
- test/lonely_test.rb
|
316
|
-
- test/nested_test.rb
|
317
|
-
- test/object_test.rb
|
318
|
-
- test/option_test.rb
|
319
|
-
- test/parse_pipeline_test.rb
|
320
|
-
- test/pipeline_test.rb
|
321
|
-
- test/populator_test.rb
|
322
|
-
- test/prepare_test.rb
|
323
|
-
- test/private_options_test.rb
|
324
|
-
- test/reader_writer_test.rb
|
325
|
-
- test/realistic_benchmark.rb
|
326
|
-
- test/render_nil_test.rb
|
327
|
-
- test/represent_test.rb
|
328
|
-
- test/representable_test.rb
|
329
|
-
- test/schema_test.rb
|
330
|
-
- test/serialize_deserialize_test.rb
|
331
|
-
- test/skip_test.rb
|
332
|
-
- test/stringify_hash_test.rb
|
333
|
-
- test/test_helper.rb
|
334
|
-
- test/test_helper_test.rb
|
335
|
-
- test/uncategorized_test.rb
|
336
|
-
- test/user_options_test.rb
|
337
|
-
- test/virtus_coercion_test.rb
|
338
|
-
- test/wrap_test.rb
|
339
|
-
- test/xml_bindings_test.rb
|
340
|
-
- test/xml_namespace_test.rb
|
341
|
-
- test/xml_test.rb
|
342
|
-
- test/yaml_test.rb
|
281
|
+
test_files: []
|
@@ -1,38 +0,0 @@
|
|
1
|
-
gem 'virtus'
|
2
|
-
require "virtus"
|
3
|
-
|
4
|
-
module Representable
|
5
|
-
module VirtusCoercion
|
6
|
-
class Coercer
|
7
|
-
def initialize(type)
|
8
|
-
@type = type
|
9
|
-
end
|
10
|
-
|
11
|
-
# This gets called when the :render_filter or :parse_filter option is evaluated.
|
12
|
-
# Usually the Coercer instance is an element in a Pipeline to allow >1 filters per property.
|
13
|
-
def call(input, options)
|
14
|
-
Virtus::Attribute.build(@type).coerce(input)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
|
19
|
-
def self.included(base)
|
20
|
-
base.class_eval do
|
21
|
-
extend ClassMethods
|
22
|
-
register_feature VirtusCoercion
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
|
27
|
-
module ClassMethods
|
28
|
-
def property(name, options={}, &block)
|
29
|
-
super.tap do |definition|
|
30
|
-
return definition unless type = options[:type]
|
31
|
-
|
32
|
-
definition.merge!(render_filter: coercer = Coercer.new(type))
|
33
|
-
definition.merge!(parse_filter: coercer)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
@@ -1,52 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
require 'representable/virtus_coercion'
|
3
|
-
|
4
|
-
class VirtusCoercionTest < MiniTest::Spec
|
5
|
-
representer! do
|
6
|
-
include Representable::VirtusCoercion
|
7
|
-
|
8
|
-
property :title # no coercion.
|
9
|
-
property :length, :type => Float
|
10
|
-
|
11
|
-
property :band, :class => OpenStruct do
|
12
|
-
property :founded, :type => Integer
|
13
|
-
end
|
14
|
-
|
15
|
-
collection :songs, :class => OpenStruct do
|
16
|
-
property :ok, :type => Virtus::Attribute::Boolean
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
let(:album) { OpenStruct.new(:title => "Dire Straits", :length => 41.34,
|
21
|
-
:band => OpenStruct.new(:founded => "1977"),
|
22
|
-
:songs => [OpenStruct.new(:ok => 1), OpenStruct.new(:ok => 0)]) }
|
23
|
-
|
24
|
-
it { _(album.extend(representer).to_hash).must_equal({"title"=>"Dire Straits", "length"=>41.34, "band"=>{"founded"=>1977}, "songs"=>[{"ok"=>true}, {"ok"=>false}]}) }
|
25
|
-
|
26
|
-
it {
|
27
|
-
album = OpenStruct.new
|
28
|
-
album.extend(representer)
|
29
|
-
album.from_hash({"title"=>"Dire Straits", "length"=>"41.34", "band"=>{"founded"=>"1977"}, "songs"=>[{"ok"=>1}, {"ok"=>0}]})
|
30
|
-
|
31
|
-
# it
|
32
|
-
_(album.length).must_equal 41.34
|
33
|
-
_(album.band.founded).must_equal 1977
|
34
|
-
_(album.songs[0].ok).must_equal true
|
35
|
-
}
|
36
|
-
|
37
|
-
|
38
|
-
describe "with user :parse_filter and :render_filter" do
|
39
|
-
representer! do
|
40
|
-
include Representable::VirtusCoercion
|
41
|
-
|
42
|
-
property :length, :type => Float,
|
43
|
-
:parse_filter => lambda { |input, options| "#{input}.1" }, # happens BEFORE coercer.
|
44
|
-
:render_filter => lambda { |fragment,*| "#{fragment}.1" }
|
45
|
-
end
|
46
|
-
|
47
|
-
# user's :parse_filter(s) are run before coercion.
|
48
|
-
it { _(OpenStruct.new.extend(representer).from_hash("length"=>"1").length).must_equal 1.1 }
|
49
|
-
# user's :render_filter(s) are run before coercion.
|
50
|
-
it { _(OpenStruct.new(:length=>1).extend(representer).to_hash).must_equal({"length" => 1.1}) }
|
51
|
-
end
|
52
|
-
end
|