surrealist 0.0.7 → 0.1.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/CHANGELOG.md +6 -2
- data/README.md +5 -5
- data/lib/surrealist/builder.rb +1 -0
- data/lib/surrealist/class_methods.rb +3 -3
- data/lib/surrealist/schema_definer.rb +3 -7
- data/lib/surrealist/version.rb +1 -1
- data/lib/surrealist.rb +18 -8
- data/surrealist.gemspec +4 -6
- metadata +12 -26
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '091867794245edb01f2db4525118b6bd26ca2282'
|
4
|
+
data.tar.gz: 00e8caac256b36ecb436c83adec4337381ffafdf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6f58c5d69d760da83b2e87c480d679791d908944abcbc5c027187e473b45bf1124d6a50c416501fb547a38f0e9c1c1585f03ed0157e1b6d2044a455579b4a135
|
7
|
+
data.tar.gz: 6f47c88860840afa21276c62d17bf56dd8845f1867d598fdbbe2594d12dfe39b24ee05d8b9ffe32a3c30c75c2fb4739ae39850867e720f6db6d898ffbfe1b152
|
data/CHANGELOG.md
CHANGED
@@ -1,4 +1,8 @@
|
|
1
1
|
# 0.0.6
|
2
2
|
* Add `build_schema` instance method that builds hash from the schema without serializing it to json.
|
3
|
-
* Allow nil values by default
|
4
|
-
* Allow nested objects
|
3
|
+
* Allow nil values by default.
|
4
|
+
* Allow nested objects.
|
5
|
+
|
6
|
+
# 0.1.0
|
7
|
+
* Change `schema` class method to `json_schema` due to compatibility issues with other gems.
|
8
|
+
* Fix schema mutability issue
|
data/README.md
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
[](https://rubygems.org/gems/surrealist)
|
6
6
|
|
7
7
|
A gem that provides DSL for serialization of plain old Ruby objects to JSON in a declarative style
|
8
|
-
by defining a `
|
8
|
+
by defining a `json_schema`. It also provides a trivial type checking in the runtime before serialization.
|
9
9
|
[Yard documentation](http://www.rubydoc.info/github/nesaulov/surrealist/master)
|
10
10
|
|
11
11
|
## Current status
|
@@ -48,7 +48,7 @@ that will be used for type-checks.
|
|
48
48
|
class Person
|
49
49
|
include Surrealist
|
50
50
|
|
51
|
-
|
51
|
+
json_schema do
|
52
52
|
{
|
53
53
|
foo: String,
|
54
54
|
bar: Integer,
|
@@ -78,7 +78,7 @@ Person.new.surrealize
|
|
78
78
|
class Person
|
79
79
|
include Surrealist
|
80
80
|
|
81
|
-
|
81
|
+
json_schema do
|
82
82
|
{
|
83
83
|
foo: String,
|
84
84
|
name: String,
|
@@ -105,7 +105,7 @@ Person.find_by(email: 'example@email.com').surrealize
|
|
105
105
|
class CreditCard
|
106
106
|
include Surrealist
|
107
107
|
|
108
|
-
|
108
|
+
json_schema do
|
109
109
|
{ number: Integer }
|
110
110
|
end
|
111
111
|
|
@@ -125,7 +125,7 @@ a corresponding method defined in the object.
|
|
125
125
|
class Car
|
126
126
|
include Surrealist
|
127
127
|
|
128
|
-
|
128
|
+
json_schema do
|
129
129
|
{ weight: Integer }
|
130
130
|
end
|
131
131
|
end
|
data/lib/surrealist/builder.rb
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
module Surrealist
|
4
4
|
# A class that builds a hash from the schema and type-checks the values.
|
5
5
|
class Builder
|
6
|
+
# TODO: refactor methods so they don't take so much arguments
|
6
7
|
class << self
|
7
8
|
# A method that goes recursively through the schema hash, defines the values and type-checks them.
|
8
9
|
#
|
@@ -19,7 +19,7 @@ module Surrealist
|
|
19
19
|
# class User
|
20
20
|
# include Surrealist
|
21
21
|
#
|
22
|
-
#
|
22
|
+
# json_schema do
|
23
23
|
# {
|
24
24
|
# foo: String,
|
25
25
|
# bar: Integer,
|
@@ -38,7 +38,7 @@ module Surrealist
|
|
38
38
|
# class Person
|
39
39
|
# include Surrealist
|
40
40
|
#
|
41
|
-
#
|
41
|
+
# json_schema do
|
42
42
|
# {
|
43
43
|
# foo: String,
|
44
44
|
# nested: {
|
@@ -54,7 +54,7 @@ module Surrealist
|
|
54
54
|
# Person.new.surrealize
|
55
55
|
# # => "{\"foo\":\"A string\",\"nested\":{\"bar\":42}}"
|
56
56
|
# # For more examples see README
|
57
|
-
def
|
57
|
+
def json_schema(&_block)
|
58
58
|
SchemaDefiner.call(self, yield)
|
59
59
|
end
|
60
60
|
end
|
@@ -3,23 +3,19 @@
|
|
3
3
|
module Surrealist
|
4
4
|
# A class that defines a method on the object that stores the schema.
|
5
5
|
class SchemaDefiner
|
6
|
-
# Defines
|
6
|
+
# Defines an instance variable on the object that stores the schema.
|
7
7
|
#
|
8
8
|
# @param [Object] klass class of the object that needs to be surrealized.
|
9
9
|
#
|
10
10
|
# @param [Hash] hash the schema defined in the object's class.
|
11
11
|
#
|
12
|
-
# @return [
|
12
|
+
# @return [Hash] +@__surrealist_schema+ variable that stores the schema of the object.
|
13
13
|
#
|
14
14
|
# @raise +Surrealist::InvalidSchemaError+ if schema was defined not through a hash.
|
15
15
|
def self.call(klass, hash)
|
16
16
|
raise Surrealist::InvalidSchemaError, 'Schema should be defined as a hash' unless hash.is_a?(Hash)
|
17
17
|
|
18
|
-
klass.
|
19
|
-
define_method '__surrealist_schema' do
|
20
|
-
hash
|
21
|
-
end
|
22
|
-
end
|
18
|
+
klass.instance_variable_set('@__surrealist_schema', hash)
|
23
19
|
end
|
24
20
|
end
|
25
21
|
end
|
data/lib/surrealist/version.rb
CHANGED
data/lib/surrealist.rb
CHANGED
@@ -3,14 +3,14 @@
|
|
3
3
|
require_relative 'surrealist/class_methods'
|
4
4
|
require_relative 'surrealist/instance_methods'
|
5
5
|
require_relative 'surrealist/boolean'
|
6
|
-
require '
|
6
|
+
require 'json'
|
7
7
|
|
8
|
-
# Main module that provides the +
|
8
|
+
# Main module that provides the +json_schema+ class method and +surrealize+ instance method.
|
9
9
|
module Surrealist
|
10
10
|
# Error class for classes without defined +schema+.
|
11
11
|
class UnknownSchemaError < RuntimeError; end
|
12
12
|
|
13
|
-
# Error class for classes with +
|
13
|
+
# Error class for classes with +json_schema+ defined not as a hash.
|
14
14
|
class InvalidSchemaError < RuntimeError; end
|
15
15
|
|
16
16
|
# Error class for +NoMethodError+.
|
@@ -45,7 +45,7 @@ module Surrealist
|
|
45
45
|
# class User
|
46
46
|
# include Surrealist
|
47
47
|
#
|
48
|
-
#
|
48
|
+
# json_schema do
|
49
49
|
# {
|
50
50
|
# name: String,
|
51
51
|
# age: Integer,
|
@@ -65,7 +65,7 @@ module Surrealist
|
|
65
65
|
# # => "{\"name\":\"Nikita\",\"age\":23}"
|
66
66
|
# # For more examples see README
|
67
67
|
def self.surrealize(instance)
|
68
|
-
::
|
68
|
+
::JSON.dump(build_schema(instance))
|
69
69
|
end
|
70
70
|
|
71
71
|
# Builds hash from schema provided in the object's class and type-checks the values.
|
@@ -87,7 +87,7 @@ module Surrealist
|
|
87
87
|
# class User
|
88
88
|
# include Surrealist
|
89
89
|
#
|
90
|
-
#
|
90
|
+
# json_schema do
|
91
91
|
# {
|
92
92
|
# name: String,
|
93
93
|
# age: Integer,
|
@@ -107,12 +107,22 @@ module Surrealist
|
|
107
107
|
# # => { name: 'Nikita', age: 23 }
|
108
108
|
# # For more examples see README
|
109
109
|
def self.build_schema(instance)
|
110
|
-
schema = instance.__surrealist_schema
|
110
|
+
schema = instance.class.instance_variable_get('@__surrealist_schema')
|
111
111
|
|
112
112
|
if schema.nil?
|
113
113
|
raise Surrealist::UnknownSchemaError, "Can't serialize #{instance.class} - no schema was provided."
|
114
114
|
end
|
115
115
|
|
116
|
-
|
116
|
+
|
117
|
+
Builder.call(schema: deep_copy(schema), instance: instance)
|
118
|
+
end
|
119
|
+
|
120
|
+
# Deep copies the schema hash.
|
121
|
+
#
|
122
|
+
# @param [Object] obj object to be coopied
|
123
|
+
#
|
124
|
+
# @return [Object] a copied object
|
125
|
+
def self.deep_copy(obj)
|
126
|
+
Marshal.load(Marshal.dump(obj))
|
117
127
|
end
|
118
128
|
end
|
data/surrealist.gemspec
CHANGED
@@ -23,10 +23,8 @@ Gem::Specification.new do |spec|
|
|
23
23
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
24
24
|
spec.require_paths = ['lib']
|
25
25
|
|
26
|
-
spec.add_development_dependency 'bundler', '~> 1.
|
27
|
-
spec.add_development_dependency 'rake', '~>
|
28
|
-
spec.add_development_dependency 'pry'
|
29
|
-
spec.add_development_dependency 'rspec', '~> 3.6
|
30
|
-
|
31
|
-
spec.add_runtime_dependency 'multi_json', '~> 1.0'
|
26
|
+
spec.add_development_dependency 'bundler', '~> 1.15'
|
27
|
+
spec.add_development_dependency 'rake', '~> 12.0'
|
28
|
+
spec.add_development_dependency 'pry', '~> 0.11'
|
29
|
+
spec.add_development_dependency 'rspec', '~> 3.6'
|
32
30
|
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: 0.0
|
4
|
+
version: 0.1.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: 2017-09-
|
11
|
+
date: 2017-09-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -16,70 +16,56 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '1.
|
19
|
+
version: '1.15'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '1.
|
26
|
+
version: '1.15'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '12.0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '12.0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: pry
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - ">="
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '0'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - ">="
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: rspec
|
57
43
|
requirement: !ruby/object:Gem::Requirement
|
58
44
|
requirements:
|
59
45
|
- - "~>"
|
60
46
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
47
|
+
version: '0.11'
|
62
48
|
type: :development
|
63
49
|
prerelease: false
|
64
50
|
version_requirements: !ruby/object:Gem::Requirement
|
65
51
|
requirements:
|
66
52
|
- - "~>"
|
67
53
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
54
|
+
version: '0.11'
|
69
55
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
56
|
+
name: rspec
|
71
57
|
requirement: !ruby/object:Gem::Requirement
|
72
58
|
requirements:
|
73
59
|
- - "~>"
|
74
60
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
76
|
-
type: :
|
61
|
+
version: '3.6'
|
62
|
+
type: :development
|
77
63
|
prerelease: false
|
78
64
|
version_requirements: !ruby/object:Gem::Requirement
|
79
65
|
requirements:
|
80
66
|
- - "~>"
|
81
67
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
68
|
+
version: '3.6'
|
83
69
|
description: A gem that provides DSL for serialization of plain old Ruby objects to
|
84
70
|
JSON in a declarative style by defining a `schema`. It also provides a trivial type
|
85
71
|
checking in the runtime before serialization.
|