surrealist 1.2.0 → 1.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6470fa2a8f31edfdb08c858e7f74bb92add85aa887bf5a3e968521b88585adec
4
- data.tar.gz: 703ce5280e32c246d5c51bd6be1d4a0e0688d01dcaaeb195aa1a5867e762e86e
3
+ metadata.gz: 4029b143bcc01a58f0b5a38d64a457f9a781ef7da37eaa3bc335be8d2ddafcfa
4
+ data.tar.gz: 4f88b4c0b4224fddfe8fa7f6d16f2d0d2618609f280a7fdfd7bea2e4f46aa2b8
5
5
  SHA512:
6
- metadata.gz: 3f95d432d163188e66ae51cea051db55cf9fbfb05ae43b0e8096c0275a3d78f317a1a716fb2dc6900b3dc2deae82216ef2b9f09d062db0c00301c0cd2f2459a6
7
- data.tar.gz: 71575656f64a1d6110f56623ecaa04d186478702c46f777967a17478fc180c4b6a326e4221a1c48f0def25036d68f307fd6eba2c62881120444b042808c32514
6
+ metadata.gz: 369823e9f4d78b1c48aa7878f76e69f7381bfacffd79653ba667f747f8c2c23802dc2126eab7ba3b2e0ab6a3ce04878745b12f42c5dbcdb36ac307e953c9b259
7
+ data.tar.gz: 8c7f310b4150ce62e568bfb8d0d4c0e5da187fff1fbbb11f338098ca17cf1c4e83646bbb6b05e9c0ff6d5d9790a7bcc59a00d6dd70d07fa1e61014f0dc4be0d9
data/.rubocop.yml CHANGED
@@ -33,6 +33,9 @@ Layout/MultilineOperationIndentation:
33
33
  Layout/SpaceInLambdaLiteral:
34
34
  EnforcedStyle: require_space
35
35
 
36
+ Layout/ClosingParenthesisIndentation:
37
+ Enabled: true
38
+
36
39
  # Lint
37
40
  Lint/AmbiguousBlockAssociation:
38
41
  Enabled: false
@@ -98,6 +101,9 @@ Performance/UnfreezeString:
98
101
  Style/AsciiComments:
99
102
  Enabled: false
100
103
 
104
+ Style/AccessModifierDeclarations:
105
+ Enabled: false
106
+
101
107
  Style/MixinUsage:
102
108
  Exclude:
103
109
  - spec/**/*rb
@@ -154,9 +160,15 @@ Style/TrailingCommaInArrayLiteral:
154
160
  Style/TrailingCommaInHashLiteral:
155
161
  EnforcedStyleForMultiline: comma
156
162
 
157
- Style/MethodMissing:
163
+ Style/MissingRespondToMissing:
164
+ Enabled: false
165
+
166
+ Style/MethodMissingSuper:
158
167
  Enabled: false
159
168
 
160
169
  Style/EvalWithLocation:
161
170
  Exclude:
162
171
  - spec/**/*.rb
172
+
173
+ Style/AccessModifierDeclarations:
174
+ Enabled: false
data/.travis.yml CHANGED
@@ -8,12 +8,12 @@ matrix:
8
8
  include:
9
9
  - rvm: ruby-head
10
10
  gemfile: Gemfile
11
- - rvm: 2.5.0
11
+ - rvm: 2.5
12
12
  gemfile: Gemfile
13
- - rvm: 2.4.3
13
+ - rvm: 2.4
14
14
  gemfile: Gemfile
15
- - rvm: 2.3.6
15
+ - rvm: 2.3
16
16
  gemfile: Gemfile
17
- - rvm: 2.2.9
17
+ - rvm: 2.2
18
18
  gemfile: gemfiles/activerecord42.gemfile
19
19
 
data/CHANGELOG.md CHANGED
@@ -1,3 +1,14 @@
1
+ # 1.3.0
2
+
3
+ ## Added
4
+
5
+ * Hash serialization ([@stefkin][]) [#106](https://github.com/nesaulov/surrealist/pull/106)
6
+
7
+ ## Fixed
8
+
9
+ * Conflict when root and object property share the same name ([@akxcv][]) [#99](https://github.com/nesaulov/surrealist/pull/99)
10
+ * Precedence was given to object method instead of serializer one ([@gjhenrique][] & [@nesaulov][]) [#110](https://github.com/nesaulov/surrealist/pull/110) & [#111](https://github.com/nesaulov/surrealist/pull/111)
11
+
1
12
  # 1.2.0
2
13
 
3
14
  ## Added
@@ -102,4 +113,5 @@
102
113
  [@azhi]: https://github.com/azhi
103
114
  [@chrisatanasian]: https://github.com/chrisatanasian
104
115
  [@past-one]: https://github.com/past-one
105
-
116
+ [@stefkin]: https://github.com/stefkin
117
+ [@gjhenrique]: https://github.com/gjhenrique
data/Gemfile CHANGED
@@ -10,7 +10,7 @@ group :development, :test do
10
10
  gem 'blueprinter'
11
11
  gem 'coveralls', require: false
12
12
  gem 'dry-struct'
13
- gem 'dry-types', '= 0.12.2'
13
+ gem 'dry-types'
14
14
  gem 'rom', '~> 4.0'
15
15
  gem 'rom-repository'
16
16
  gem 'rom-sql'
data/README.md CHANGED
@@ -40,6 +40,7 @@ to serialize nested objects and structures. [Introductory blogpost.](https://med
40
40
  * [Root](#root)
41
41
  * [Include namespaces](#include-namespaces)
42
42
  * [Configuration](#configuration)
43
+ * [Hash serialization](#hash-serialization)
43
44
  * [Bool and Any](#bool-and-any)
44
45
  * [Type errors](#type-errors)
45
46
  * [Undefined methods in schema](#undefined-methods-in-schema)
@@ -687,7 +688,7 @@ withdraws.surrealize(include_namespaces: true, namespaces_nesting_level: 2)
687
688
 
688
689
  There are two ways of setting default arguments for serialization,
689
690
  by passing a block to `Surrealist.configure`:
690
- ```ruby
691
+ ``` ruby
691
692
  Surrealist.configure do |config|
692
693
  config.camelize = true
693
694
  config.namespaces_nesting_level = 2
@@ -700,13 +701,28 @@ And by passing a hash:
700
701
  These arguments will be applied to all calls of `#build_schema` and `#surrealize`.
701
702
  If these methods will be called with arguments, they will be merged with respect to explicitly passed ones:
702
703
 
703
- ```ruby
704
+ ``` ruby
704
705
  Surrealist.configure(camelize: true, include_root: true)
705
706
 
706
707
  Something.new.surrealize(camelize: false)
707
708
  # will result in Something.new.surrealize(camelize: false, include_root: true)
708
709
  ```
709
710
 
711
+ ### Hash serialization
712
+
713
+ You can pass a hash to serializer and it will use the keys instead of methods.
714
+
715
+ ``` ruby
716
+ class HashSerializer < Surrealist::Serializer
717
+ json_schema { { string: String, int: Integer } }
718
+ end
719
+
720
+ HashSerializer.new(string: 'string', int: 4).surrealize
721
+ # => '{ "string": "string", "int": 4}'
722
+
723
+ HashSerializer.new(string: 'string', int: 'not int').surrealize
724
+ # => Surrealist::InvalidTypeError: Wrong type for key `int`. Expected Integer, got String.
725
+ ```
710
726
 
711
727
  ### Bool and Any
712
728
  If you have a parameter that is of boolean type, or if you don't care about the type, you
@@ -769,7 +785,8 @@ type check will be passed. If you want to be strict about `nil`s consider using
769
785
 
770
786
  ## Roadmap
771
787
  Here is a list of features that are not implemented yet (contributions are welcome):
772
- * Memoization/caching
788
+ * Automatic endpoint documentation
789
+ * API for validating (contracts) without actually serializing to JSON (maybe with deserialization from JSON)
773
790
 
774
791
  ## Contributing
775
792
  Bug reports and pull requests are welcome on GitHub at https://github.com/nesaulov/surrealist.
data/lib/surrealist.rb CHANGED
@@ -18,6 +18,7 @@ require_relative 'surrealist/string_utils'
18
18
  require_relative 'surrealist/type_helper'
19
19
  require_relative 'surrealist/value_assigner'
20
20
  require_relative 'surrealist/vars_helper'
21
+ require_relative 'surrealist/wrapper'
21
22
 
22
23
  # Main module that provides the +json_schema+ class method and +surrealize+ instance method.
23
24
  module Surrealist
@@ -128,10 +129,13 @@ module Surrealist
128
129
  Surrealist::ExceptionRaiser.raise_unknown_schema!(instance) if schema.nil?
129
130
 
130
131
  parameters = config ? config.merge(args) : args
132
+
133
+ # TODO: Refactor (something pipeline-like would do here, perhaps a builder of some sort)
131
134
  carrier = Surrealist::Carrier.call(parameters)
132
- normalized_schema = Surrealist::Copier.deep_copy(schema, carrier, instance.class.name)
133
- hash = Builder.new(carrier, normalized_schema, instance).call
134
- carrier.camelize ? Surrealist::HashUtils.camelize_hash(hash) : hash
135
+ copied_schema = Surrealist::Copier.deep_copy(schema)
136
+ built_schema = Builder.new(carrier, copied_schema, instance).call
137
+ wrapped_schema = Surrealist::Wrapper.wrap(built_schema, carrier, instance.class.name)
138
+ carrier.camelize ? Surrealist::HashUtils.camelize_hash(wrapped_schema) : wrapped_schema
135
139
  end
136
140
  # rubocop:enable Metrics/AbcSize
137
141
 
@@ -139,7 +143,7 @@ module Surrealist
139
143
  #
140
144
  # @return [Hash] default arguments (@see Surrealist::Carrier)
141
145
  def config
142
- @default_args || Surrealist::Copier::EMPTY_HASH
146
+ @default_args || Surrealist::HashUtils::EMPTY_HASH
143
147
  end
144
148
 
145
149
  # Sets default serialization arguments with a block
@@ -158,7 +162,7 @@ module Surrealist
158
162
  yield(carrier)
159
163
  @default_args = carrier.parameters
160
164
  else
161
- @default_args = hash.nil? ? Surrealist::Copier::EMPTY_HASH : hash
165
+ @default_args = hash.nil? ? Surrealist::HashUtils::EMPTY_HASH : hash
162
166
  end
163
167
  end
164
168
 
@@ -80,7 +80,7 @@ module Surrealist
80
80
  # @return [Hash] the schema hash
81
81
  def construct_collection(schema, instance, key, value)
82
82
  schema[key] = instance.send(key).map do |inst|
83
- call(Copier.deep_copy(value, carrier), inst)
83
+ call(Copier.deep_copy(value), inst)
84
84
  end
85
85
  end
86
86
  end
@@ -3,113 +3,16 @@
3
3
  module Surrealist
4
4
  # A helper class for deep copying and wrapping hashes.
5
5
  module Copier
6
- EMPTY_HASH = {}.freeze
7
-
8
6
  class << self
9
- # Deeply copies the schema hash and wraps it if there is a need to.
10
- #
11
- # @param [Object] hash object to be copied.
12
- # @param [String] klass instance's class name.
13
- # @param [Object] carrier instance of Carrier class that carries arguments passed to +surrealize+
14
- #
15
- # @return [Hash] a copied hash.
16
- def deep_copy(hash, carrier, klass = false)
17
- namespaces_condition = carrier.include_namespaces || carrier.namespaces_nesting_level != DEFAULT_NESTING_LEVEL # rubocop:disable Metrics/LineLength
18
-
19
- if !klass && (carrier.include_root || namespaces_condition)
20
- Surrealist::ExceptionRaiser.raise_unknown_root!
21
- end
22
-
23
- copied_and_possibly_wrapped_hash(hash, klass, carrier, namespaces_condition)
24
- end
25
-
26
- private
27
-
28
- # Deeply copies the schema hash and wraps it if there is a need to.
29
- #
30
- # @param [Object] hash object to be copied.
31
- # @param [String] klass instance's class name.
32
- # @param [Object] carrier instance of Carrier class that carries arguments passed to +surrealize+
33
- # @param [Bool] namespaces_condition whether to wrap into namespace.
34
- #
35
- # @return [Hash] deeply copied hash, possibly wrapped.
36
- def copied_and_possibly_wrapped_hash(hash, klass, carrier, namespaces_condition)
37
- return copy_hash(hash) if carrier.no_args_provided?
38
-
39
- if carrier.root
40
- wrap_schema_into_root(hash, carrier, carrier.root.to_s)
41
- elsif namespaces_condition
42
- wrap_schema_into_namespace(hash, carrier, klass)
43
- elsif carrier.include_root
44
- actual_class = Surrealist::StringUtils.extract_class(klass)
45
- wrap_schema_into_root(hash, carrier, actual_class)
46
- else
47
- copy_hash(hash)
48
- end
49
- end
50
-
51
7
  # Goes through the hash recursively and deeply copies it.
52
8
  #
53
9
  # @param [Hash] hash the hash to be copied.
54
10
  # @param [Hash] wrapper the wrapper of the resulting hash.
55
11
  #
56
12
  # @return [Hash] deeply copied hash.
57
- def copy_hash(hash, wrapper = {})
13
+ def deep_copy(hash, wrapper = {})
58
14
  hash.each_with_object(wrapper) do |(key, value), new|
59
- new[key] = value.is_a?(Hash) ? copy_hash(value) : value
60
- end
61
- end
62
-
63
- # Wraps schema into a root key if `include_root` is passed to Surrealist.
64
- #
65
- # @param [Hash] schema schema hash.
66
- # @param [Object] carrier instance of Carrier class that carries arguments passed to +surrealize+
67
- # @param [String] root what the schema will be wrapped into
68
- #
69
- # @return [Hash] a hash with schema wrapped inside a root key.
70
- def wrap_schema_into_root(schema, carrier, root)
71
- root_key = if carrier.camelize
72
- Surrealist::StringUtils.camelize(root, false).to_sym
73
- else
74
- Surrealist::StringUtils.underscore(root).to_sym
75
- end
76
- result = Hash[root_key => {}]
77
- copy_hash(schema, result[root_key])
78
-
79
- result
80
- end
81
-
82
- # Wraps schema into a nested hash of namespaces.
83
- #
84
- # @param [Hash] schema main schema.
85
- # @param [String] klass name of the class where schema is defined.
86
- # @param [Object] carrier instance of Carrier class that carries arguments passed to +surrealize+
87
- #
88
- # @return [Hash] nested hash (see +inject_schema+)
89
- def wrap_schema_into_namespace(schema, carrier, klass)
90
- nested_hash = Surrealist::StringUtils.break_namespaces(
91
- klass, carrier.camelize, carrier.namespaces_nesting_level
92
- )
93
-
94
- inject_schema(nested_hash, copy_hash(schema))
95
- end
96
-
97
- # Injects one hash into another nested hash.
98
- #
99
- # @param [Hash] hash wrapper-hash.
100
- # @param [Hash] sub_hash hash to be injected.
101
- #
102
- # @example wrapping hash
103
- # hash = { one: { two: { three: {} } } }
104
- # sub_hash = { four: '4' }
105
- #
106
- # inject_schema(hash, sub_hash)
107
- # # => { one: { two: { three: { four: '4' } } } }
108
- #
109
- # @return [Hash] resulting hash.
110
- def inject_schema(hash, sub_hash)
111
- hash.each do |k, v|
112
- v == EMPTY_HASH ? hash[k] = sub_hash : inject_schema(v, sub_hash)
15
+ new[key] = value.is_a?(Hash) ? deep_copy(value) : value
113
16
  end
114
17
  end
115
18
  end
@@ -3,6 +3,8 @@
3
3
  module Surrealist
4
4
  # A helper class for hashes transformations.
5
5
  module HashUtils
6
+ EMPTY_HASH = {}.freeze
7
+
6
8
  class << self
7
9
  # Converts hash's keys to camelBack keys.
8
10
  #
@@ -16,7 +16,7 @@ module Surrealist
16
16
  # 4.2 AR relation object did not include Enumerable (it defined
17
17
  # all necessary method through ActiveRecord::Delegation module),
18
18
  # so we need to explicitly check for this
19
- object.is_a?(Enumerable) || ar_relation?(object)
19
+ (object.is_a?(Enumerable) && !object.instance_of?(Hash)) || ar_relation?(object)
20
20
  end
21
21
 
22
22
  def self.ar_relation?(object)
@@ -54,7 +54,7 @@ module Surrealist
54
54
  # e.g `CatSerializer.new(Cat.new(3), food: CatFood.new)`
55
55
  # And then food will be available inside serializer via `context[:food]`
56
56
  def initialize(object, **context)
57
- @object = object
57
+ @object = wrap_hash_into_struct(object)
58
58
  @context = context
59
59
  end
60
60
 
@@ -87,12 +87,16 @@ module Surrealist
87
87
 
88
88
  # Methods not found inside serializer will be invoked on the object
89
89
  def method_missing(method, *args, &block)
90
- object.public_send(method, *args, &block)
90
+ object.public_send(method, *args, &block) || super
91
91
  end
92
92
 
93
93
  # Methods not found inside serializer will be invoked on the object
94
94
  def respond_to_missing?(method, include_private = false)
95
95
  object.respond_to?(method) || super
96
96
  end
97
+
98
+ def wrap_hash_into_struct(object)
99
+ object.instance_of?(Hash) ? OpenStruct.new(object) : object
100
+ end
97
101
  end
98
102
  end
@@ -39,7 +39,7 @@ module Surrealist
39
39
  end
40
40
 
41
41
  # Checks if there is a custom serializer defined for the object and invokes the method
42
- # on it first.
42
+ # on it first only if the serializer has not defined the same method.
43
43
  #
44
44
  # @param [Object] instance an instance of a model or a serializer
45
45
  # @param [Symbol] method the schema key that represents the method to be invoked
@@ -47,8 +47,10 @@ module Surrealist
47
47
  # @return [Object] the return value of the method
48
48
  def invoke_method(instance, method)
49
49
  object = instance.instance_variable_get(:@object)
50
-
51
- object && object.respond_to?(method) ? object.send(method) : instance.send(method)
50
+ instance_method = instance.class.instance_methods(false).include?(method) ||
51
+ instance.class.private_instance_methods(false).include?(method)
52
+ invoke_object = !instance_method && object && object.respond_to?(method, true)
53
+ invoke_object ? object.send(method) : instance.send(method)
52
54
  end
53
55
 
54
56
  # Coerces value if type check is passed
@@ -2,5 +2,5 @@
2
2
 
3
3
  module Surrealist
4
4
  # Defines the version of Surrealist
5
- VERSION = '1.2.0'.freeze
5
+ VERSION = '1.3.0'.freeze
6
6
  end
@@ -0,0 +1,102 @@
1
+ module Surrealist
2
+ # A helper class for wrapphing hashes.
3
+ module Wrapper
4
+ class << self
5
+ # Wraps the schema hash into root/namespaces if there is a need to.
6
+ #
7
+ # @param [Object] hash to be wrapped.
8
+ # @param [Object] carrier instance of Carrier class that carries arguments passed to +surrealize+
9
+ # @param [String] klass instance's class name.
10
+ #
11
+ # @return [Hash] a wrapped hash.
12
+ def wrap(hash, carrier, klass = false)
13
+ namespaces_condition = carrier.include_namespaces || carrier.namespaces_nesting_level != DEFAULT_NESTING_LEVEL # rubocop:disable Metrics/LineLength
14
+
15
+ if !klass && (carrier.include_root || namespaces_condition)
16
+ Surrealist::ExceptionRaiser.raise_unknown_root!
17
+ end
18
+
19
+ possibly_wrapped_hash(hash, klass, carrier, namespaces_condition)
20
+ end
21
+
22
+ private
23
+
24
+ # Deeply copies the schema hash and wraps it if there is a need to.
25
+ # TODO: refactor
26
+ #
27
+ # @param [Object] hash object to be copied.
28
+ # @param [String] klass instance's class name.
29
+ # @param [Object] carrier instance of Carrier class that carries arguments passed to +surrealize+
30
+ # @param [Bool] namespaces_condition whether to wrap into namespace.
31
+ #
32
+ # @return [Hash] deeply copied hash, possibly wrapped.
33
+ def possibly_wrapped_hash(hash, klass, carrier, namespaces_condition)
34
+ return hash if carrier.no_args_provided?
35
+
36
+ if carrier.root
37
+ wrap_schema_into_root(hash, carrier, carrier.root.to_s)
38
+ elsif namespaces_condition
39
+ wrap_schema_into_namespace(hash, carrier, klass)
40
+ elsif carrier.include_root
41
+ actual_class = Surrealist::StringUtils.extract_class(klass)
42
+ wrap_schema_into_root(hash, carrier, actual_class)
43
+ else
44
+ hash
45
+ end
46
+ end
47
+
48
+ # Wraps schema into a root key if `include_root` is passed to Surrealist.
49
+ #
50
+ # @param [Hash] schema schema hash.
51
+ # @param [Object] carrier instance of Carrier class that carries arguments passed to +surrealize+
52
+ # @param [String] root what the schema will be wrapped into
53
+ #
54
+ # @return [Hash] a hash with schema wrapped inside a root key.
55
+ def wrap_schema_into_root(schema, carrier, root)
56
+ root_key = if carrier.camelize
57
+ Surrealist::StringUtils.camelize(root, false).to_sym
58
+ else
59
+ Surrealist::StringUtils.underscore(root).to_sym
60
+ end
61
+ result = Hash[root_key => {}]
62
+ Surrealist::Copier.deep_copy(schema, result[root_key])
63
+
64
+ result
65
+ end
66
+
67
+ # Wraps schema into a nested hash of namespaces.
68
+ #
69
+ # @param [Hash] schema main schema.
70
+ # @param [String] klass name of the class where schema is defined.
71
+ # @param [Object] carrier instance of Carrier class that carries arguments passed to +surrealize+
72
+ #
73
+ # @return [Hash] nested hash (see +inject_schema+)
74
+ def wrap_schema_into_namespace(schema, carrier, klass)
75
+ nested_hash = Surrealist::StringUtils.break_namespaces(
76
+ klass, carrier.camelize, carrier.namespaces_nesting_level
77
+ )
78
+
79
+ inject_schema(nested_hash, Surrealist::Copier.deep_copy(schema))
80
+ end
81
+
82
+ # Injects one hash into another nested hash.
83
+ #
84
+ # @param [Hash] hash wrapper-hash.
85
+ # @param [Hash] sub_hash hash to be injected.
86
+ #
87
+ # @example wrapping hash
88
+ # hash = { one: { two: { three: {} } } }
89
+ # sub_hash = { four: '4' }
90
+ #
91
+ # inject_schema(hash, sub_hash)
92
+ # # => { one: { two: { three: { four: '4' } } } }
93
+ #
94
+ # @return [Hash] resulting hash.
95
+ def inject_schema(hash, sub_hash)
96
+ hash.each do |k, v|
97
+ v == Surrealist::HashUtils::EMPTY_HASH ? hash[k] = sub_hash : inject_schema(v, sub_hash)
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
data/surrealist.gemspec CHANGED
@@ -30,5 +30,5 @@ Gem::Specification.new do |spec|
30
30
  spec.add_development_dependency 'pry', '~> 0.11'
31
31
  spec.add_development_dependency 'rake', '~> 12.3'
32
32
  spec.add_development_dependency 'rspec', '~> 3.7'
33
- spec.add_development_dependency 'rubocop', '~> 0.54'
33
+ spec.add_development_dependency 'rubocop', '~> 0.57'
34
34
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: surrealist
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nikita Esaulov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-05-13 00:00:00.000000000 Z
11
+ date: 2018-07-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: oj
@@ -86,14 +86,14 @@ dependencies:
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '0.54'
89
+ version: '0.57'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '0.54'
96
+ version: '0.57'
97
97
  description: A gem that provides DSL for serialization of plain old Ruby objects to
98
98
  JSON in a declarative style by defining a `schema`. It also provides a trivial type
99
99
  checking in the runtime before serialization.
@@ -136,6 +136,7 @@ files:
136
136
  - lib/surrealist/value_assigner.rb
137
137
  - lib/surrealist/vars_helper.rb
138
138
  - lib/surrealist/version.rb
139
+ - lib/surrealist/wrapper.rb
139
140
  - surrealist-icon.png
140
141
  - surrealist.gemspec
141
142
  homepage: https://github.com/nesaulov/surrealist