surrealist 1.2.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
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