simple_json_schema_builder 0.1.0 → 0.1.1
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/.rubocop.yml +3 -0
- data/README.md +57 -76
- data/lib/simple_json_schema_builder/base.rb +15 -11
- data/lib/simple_json_schema_builder/version.rb +1 -1
- metadata +3 -6
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: ceb63169280084ce81b583dc8fa263eef9273c457e6d62256a8ce7db9e40890f
|
|
4
|
+
data.tar.gz: 2eb9a5c27784b497eb4647443a3bac3d775f77466f1cfdedc742dee727910067
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 954eff68b182a1fd45d4e74dc0e7e89400ef56756ce2a181c6095ef33c2a7a81df2eeea05a36d970f659bc9c593bea070c073a6b238a18522b59665ff6c51255
|
|
7
|
+
data.tar.gz: acbe7bcba8336e38fb8aaed3da007eb6d79392174f485181b61a364cfb183861caa1cfb2041de7d405b3792c1d651431fdc30598054a46d8b54043f7cfbda3fa
|
data/.rubocop.yml
CHANGED
data/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# SimpleJsonSchemaBuilder
|
|
2
2
|
|
|
3
|
-
A simple DSL to help you
|
|
3
|
+
A simple, yet powerful DSL to help you create JSON Schemas in Ruby effortlessly.
|
|
4
4
|
|
|
5
5
|
## Installation
|
|
6
6
|
|
|
@@ -22,134 +22,115 @@ Or install it yourself as:
|
|
|
22
22
|
gem install simple_json_schema_builder
|
|
23
23
|
```
|
|
24
24
|
|
|
25
|
-
`simple_json_schema_builder` depends on [multi_json](https://github.com/intridea/multi_json)
|
|
25
|
+
**Note:** `simple_json_schema_builder` depends on [multi_json](https://github.com/intridea/multi_json) for JSON serialization, which allows you to choose your preferred JSON library.
|
|
26
|
+
It is recommended to use `oj` as its really fast.
|
|
26
27
|
|
|
27
28
|
## Usage
|
|
28
29
|
|
|
30
|
+
Here's an example demonstrating how to use `SimpleJsonSchemaBuilder`:
|
|
31
|
+
|
|
29
32
|
```ruby
|
|
30
|
-
class
|
|
33
|
+
class UserSchema < SimpleJsonSchemaBuilder::Base
|
|
31
34
|
object do
|
|
32
|
-
string :
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
string :
|
|
36
|
-
string :
|
|
37
|
-
|
|
38
|
-
object :
|
|
39
|
-
string :
|
|
40
|
-
|
|
35
|
+
string :name, required: true, examples: ["John Doe"]
|
|
36
|
+
integer :age, required: false, examples: [30]
|
|
37
|
+
boolean :is_active, required: false, examples: [true, false]
|
|
38
|
+
string :role, enum: ["admin", "user", "guest"], examples: ["user"]
|
|
39
|
+
string :tags, array: true, examples: ["ruby", "json"]
|
|
40
|
+
|
|
41
|
+
object :contact_info, required: true do
|
|
42
|
+
string :email, required: true, examples: ["johndoe@example.com"]
|
|
43
|
+
string :phone_number, required: false, examples: ["123-456-7890"]
|
|
41
44
|
end
|
|
42
45
|
|
|
43
|
-
object :
|
|
44
|
-
string :
|
|
45
|
-
|
|
46
|
+
object :addresses, array: true do
|
|
47
|
+
string :street, required: true, examples: ["123 Main St"]
|
|
48
|
+
string :city, required: true, examples: ["Springfield"]
|
|
49
|
+
string :country, required: true, examples: ["USA"]
|
|
46
50
|
end
|
|
47
51
|
|
|
48
|
-
object :
|
|
49
|
-
object :subschema, schema: Subschema
|
|
52
|
+
object :account_preferences, schema: AccountPreferences
|
|
50
53
|
end
|
|
51
54
|
end
|
|
52
55
|
|
|
53
|
-
class
|
|
56
|
+
class AccountPreferences < SimpleJsonSchemaBuilder::Base
|
|
54
57
|
object do
|
|
55
|
-
|
|
56
|
-
|
|
58
|
+
boolean :receive_newsletter, required: false, examples: [true]
|
|
59
|
+
string :preferred_language, enum: ["en", "es", "fr"], required: true, examples: ["en"]
|
|
57
60
|
end
|
|
58
61
|
end
|
|
59
62
|
```
|
|
60
63
|
|
|
61
|
-
|
|
64
|
+
The above code will serialize `UserSchema.schema` to the following JSON Schema:
|
|
62
65
|
|
|
63
66
|
```json
|
|
64
67
|
{
|
|
65
68
|
"type": "object",
|
|
66
|
-
"required": ["
|
|
69
|
+
"required": ["name", "contact_info"],
|
|
67
70
|
"properties": {
|
|
68
|
-
"
|
|
71
|
+
"name": {
|
|
69
72
|
"type": "string",
|
|
70
|
-
"examples": ["
|
|
73
|
+
"examples": ["John Doe"]
|
|
71
74
|
},
|
|
72
|
-
"
|
|
73
|
-
"type": "
|
|
74
|
-
"examples": [
|
|
75
|
+
"age": {
|
|
76
|
+
"type": "integer",
|
|
77
|
+
"examples": [30]
|
|
75
78
|
},
|
|
76
|
-
"
|
|
77
|
-
"type": "
|
|
78
|
-
"
|
|
79
|
-
"type": "string"
|
|
80
|
-
}
|
|
79
|
+
"is_active": {
|
|
80
|
+
"type": "boolean",
|
|
81
|
+
"examples": [true, false]
|
|
81
82
|
},
|
|
82
|
-
"
|
|
83
|
+
"role": {
|
|
83
84
|
"type": "string",
|
|
84
|
-
"
|
|
85
|
+
"examples": ["user"],
|
|
86
|
+
"enum": ["admin", "user", "guest"]
|
|
85
87
|
},
|
|
86
|
-
"
|
|
88
|
+
"tags": {
|
|
87
89
|
"type": "array",
|
|
88
90
|
"items": {
|
|
89
91
|
"type": "string",
|
|
90
|
-
"
|
|
92
|
+
"examples": ["ruby", "json"]
|
|
91
93
|
}
|
|
92
94
|
},
|
|
93
|
-
"
|
|
95
|
+
"contact_info": {
|
|
94
96
|
"type": "object",
|
|
95
|
-
"required": ["
|
|
97
|
+
"required": ["email"],
|
|
96
98
|
"properties": {
|
|
97
|
-
"
|
|
98
|
-
"type": "string"
|
|
99
|
+
"email": {
|
|
100
|
+
"type": "string",
|
|
101
|
+
"examples": ["johndoe@example.com"]
|
|
99
102
|
},
|
|
100
|
-
"
|
|
101
|
-
"type": "
|
|
103
|
+
"phone_number": {
|
|
104
|
+
"type": "string",
|
|
105
|
+
"examples": ["123-456-7890"]
|
|
102
106
|
}
|
|
103
107
|
}
|
|
104
108
|
},
|
|
105
|
-
"
|
|
109
|
+
"addresses": {
|
|
106
110
|
"type": "array",
|
|
107
111
|
"items": {
|
|
108
112
|
"type": "object",
|
|
109
|
-
"required": ["
|
|
113
|
+
"required": ["street", "city", "country"],
|
|
110
114
|
"properties": {
|
|
111
|
-
"
|
|
112
|
-
"type": "string"
|
|
115
|
+
"street": {
|
|
116
|
+
"type": "string",
|
|
117
|
+
"examples": ["123 Main St"]
|
|
113
118
|
},
|
|
114
|
-
"
|
|
115
|
-
"type": "
|
|
116
|
-
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
},
|
|
120
|
-
"subschema_arr": {
|
|
121
|
-
"type": "array",
|
|
122
|
-
"items": {
|
|
123
|
-
"type": "object",
|
|
124
|
-
"required": ["test2"],
|
|
125
|
-
"properties": {
|
|
126
|
-
"test1": {
|
|
127
|
-
"type": "string"
|
|
119
|
+
"city": {
|
|
120
|
+
"type": "string",
|
|
121
|
+
"examples": ["Springfield"]
|
|
128
122
|
},
|
|
129
|
-
"
|
|
130
|
-
"type": "
|
|
123
|
+
"country": {
|
|
124
|
+
"type": "string",
|
|
125
|
+
"examples": ["USA"]
|
|
131
126
|
}
|
|
132
127
|
}
|
|
133
128
|
}
|
|
134
|
-
},
|
|
135
|
-
"subschema": {
|
|
136
|
-
"type": "object",
|
|
137
|
-
"required": ["test2"],
|
|
138
|
-
"properties": {
|
|
139
|
-
"test1": {
|
|
140
|
-
"type": "string"
|
|
141
|
-
},
|
|
142
|
-
"test2": {
|
|
143
|
-
"type": "integer"
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
129
|
}
|
|
147
130
|
}
|
|
148
131
|
}
|
|
149
132
|
```
|
|
150
133
|
|
|
151
|
-
TODO: needs sensible examples
|
|
152
|
-
|
|
153
134
|
## Development
|
|
154
135
|
|
|
155
136
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
|
@@ -4,8 +4,8 @@ require "multi_json"
|
|
|
4
4
|
|
|
5
5
|
module SimpleJsonSchemaBuilder
|
|
6
6
|
class Base
|
|
7
|
-
def self.object(&block)
|
|
8
|
-
@schema ||= Base.new
|
|
7
|
+
def self.object(description: nil, default_required: false, &block)
|
|
8
|
+
@schema ||= Base.new(description: description, default_required: default_required)
|
|
9
9
|
@schema.instance_eval(&block)
|
|
10
10
|
end
|
|
11
11
|
|
|
@@ -17,42 +17,45 @@ module SimpleJsonSchemaBuilder
|
|
|
17
17
|
MultiJson.dump(schema)
|
|
18
18
|
end
|
|
19
19
|
|
|
20
|
-
def initialize
|
|
20
|
+
def initialize(description: nil, default_required: false)
|
|
21
21
|
@properties = {}
|
|
22
22
|
@required_key_names = []
|
|
23
|
+
@description = description
|
|
24
|
+
@default_required = default_required
|
|
23
25
|
end
|
|
24
26
|
|
|
25
|
-
def string(key_name, required:
|
|
27
|
+
def string(key_name, required: nil, title: nil, description: nil, array: false, examples: [], enum: nil)
|
|
26
28
|
add_required(key_name, required)
|
|
27
29
|
add_property("string", key_name, title: title, description: description, examples: examples, enum: enum)
|
|
28
30
|
add_array(key_name, array)
|
|
29
31
|
end
|
|
30
32
|
|
|
31
|
-
def integer(key_name, required:
|
|
33
|
+
def integer(key_name, required: nil, title: nil, description: nil, array: false, examples: [], enum: nil)
|
|
32
34
|
add_required(key_name, required)
|
|
33
35
|
add_property("integer", key_name, title: title, description: description, examples: examples, enum: enum)
|
|
34
36
|
add_array(key_name, array)
|
|
35
37
|
end
|
|
36
38
|
|
|
37
|
-
def number(key_name, required:
|
|
39
|
+
def number(key_name, required: nil, title: nil, description: nil, array: false, examples: [], enum: nil)
|
|
38
40
|
add_required(key_name, required)
|
|
39
41
|
add_property("number", key_name, title: title, description: description, examples: examples, enum: enum)
|
|
40
42
|
add_array(key_name, array)
|
|
41
43
|
end
|
|
42
44
|
|
|
43
|
-
def boolean(key_name, required:
|
|
45
|
+
def boolean(key_name, required: nil, title: nil, description: nil, array: false, examples: [])
|
|
44
46
|
add_required(key_name, required)
|
|
45
47
|
add_property("boolean", key_name, title: title, description: description, examples: examples, enum: nil)
|
|
46
48
|
add_array(key_name, array)
|
|
47
49
|
end
|
|
48
50
|
|
|
49
|
-
def object(key_name = nil, required: false, array: false, schema: nil, &block)
|
|
51
|
+
def object(key_name = nil, required: nil, default_required: false, description: nil, array: false, schema: nil, &block)
|
|
52
|
+
@default_required = default_required
|
|
50
53
|
add_required(key_name, required)
|
|
51
54
|
|
|
52
55
|
if schema
|
|
53
56
|
nested_object = schema
|
|
54
57
|
else
|
|
55
|
-
nested_object = Base.new
|
|
58
|
+
nested_object = Base.new(description: description)
|
|
56
59
|
nested_object.instance_eval(&block)
|
|
57
60
|
end
|
|
58
61
|
|
|
@@ -67,6 +70,7 @@ module SimpleJsonSchemaBuilder
|
|
|
67
70
|
def schema
|
|
68
71
|
{
|
|
69
72
|
type: "object",
|
|
73
|
+
description: description,
|
|
70
74
|
required: (required_key_names unless required_key_names.empty?),
|
|
71
75
|
properties: properties,
|
|
72
76
|
}.compact
|
|
@@ -74,10 +78,10 @@ module SimpleJsonSchemaBuilder
|
|
|
74
78
|
|
|
75
79
|
private
|
|
76
80
|
|
|
77
|
-
attr_reader :properties, :required_key_names
|
|
81
|
+
attr_reader :properties, :required_key_names, :description, :default_required
|
|
78
82
|
|
|
79
83
|
def add_required(key_name, required)
|
|
80
|
-
return unless required
|
|
84
|
+
return unless default_required || required
|
|
81
85
|
|
|
82
86
|
@required_key_names << key_name
|
|
83
87
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: simple_json_schema_builder
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Mooktakim Ahmed
|
|
8
|
-
autorequire:
|
|
9
8
|
bindir: exe
|
|
10
9
|
cert_chain: []
|
|
11
|
-
date:
|
|
10
|
+
date: 2025-02-03 00:00:00.000000000 Z
|
|
12
11
|
dependencies:
|
|
13
12
|
- !ruby/object:Gem::Dependency
|
|
14
13
|
name: multi_json
|
|
@@ -49,7 +48,6 @@ metadata:
|
|
|
49
48
|
homepage_uri: https://github.com/mooktakim/simple_json_schema_builder
|
|
50
49
|
source_code_uri: https://github.com/mooktakim/simple_json_schema_builder
|
|
51
50
|
rubygems_mfa_required: 'true'
|
|
52
|
-
post_install_message:
|
|
53
51
|
rdoc_options: []
|
|
54
52
|
require_paths:
|
|
55
53
|
- lib
|
|
@@ -64,8 +62,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
64
62
|
- !ruby/object:Gem::Version
|
|
65
63
|
version: '0'
|
|
66
64
|
requirements: []
|
|
67
|
-
rubygems_version: 3.
|
|
68
|
-
signing_key:
|
|
65
|
+
rubygems_version: 3.6.1
|
|
69
66
|
specification_version: 4
|
|
70
67
|
summary: JSON Schema builder with simple DSL.
|
|
71
68
|
test_files: []
|