simple_json_schema_builder 0.1.0 → 0.1.1

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: e007353b4f32e8f76ef3cc0914939fcffeaef49499cd5c96dcd6b443a80b435c
4
- data.tar.gz: 5385a0965b5d1e18eb888b18fb3c50b6587fd618bdb472cdc62b5c30e2a64565
3
+ metadata.gz: ceb63169280084ce81b583dc8fa263eef9273c457e6d62256a8ce7db9e40890f
4
+ data.tar.gz: 2eb9a5c27784b497eb4647443a3bac3d775f77466f1cfdedc742dee727910067
5
5
  SHA512:
6
- metadata.gz: '08baab95d4660c0edeb074da049d54a659745e1cdd778c161394e8e80b404ead2cd3ec99c0c6d9373365d350d276aca3667e462a7aa45d63016e473f9f94d88f'
7
- data.tar.gz: 99b14030c752ef914c7c732b2682f75bdac0631513bc1e1ebc76406aa09eef002f86d1abc417b3e5b89e7a2bed2e50f79420d2f65e8e276af40d6ac424d4307d
6
+ metadata.gz: 954eff68b182a1fd45d4e74dc0e7e89400ef56756ce2a181c6095ef33c2a7a81df2eeea05a36d970f659bc9c593bea070c073a6b238a18522b59665ff6c51255
7
+ data.tar.gz: acbe7bcba8336e38fb8aaed3da007eb6d79392174f485181b61a364cfb183861caa1cfb2041de7d405b3792c1d651431fdc30598054a46d8b54043f7cfbda3fa
data/.rubocop.yml CHANGED
@@ -32,3 +32,6 @@ Style/Documentation:
32
32
 
33
33
  Metrics/AbcSize:
34
34
  Enabled: false
35
+
36
+ Layout/LineLength:
37
+ Enabled: false
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # SimpleJsonSchemaBuilder
2
2
 
3
- A simple DSL to help you write JSON Schema in ruby.
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) to serialize to JSON, which allows you to pick your favourite JSON library, `oj` is recommended as its fast.
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 MySchema < SimpleJsonSchemaBuilder::Base
33
+ class UserSchema < SimpleJsonSchemaBuilder::Base
31
34
  object do
32
- string :string_test, required: false, examples: "blue while"
33
- boolean :boolean_test, examples: [ "blah", "bleh" ]
34
- string :str_array_test, array: true
35
- string :string_enums, enum: [ "test1", "test2" ]
36
- string :string_enum_arrays, array: true, enum: [ "test1", "test2" ]
37
-
38
- object :other_info, required: true do
39
- string :string_test, required: true
40
- boolean :boolean_test
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 :other_info_arr, array: true do
44
- string :string_test, required: true
45
- boolean :boolean_test
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 :subschema_arr, array: true, schema: Subschema
49
- object :subschema, schema: Subschema
52
+ object :account_preferences, schema: AccountPreferences
50
53
  end
51
54
  end
52
55
 
53
- class Subschema < SimpleJsonSchemaBuilder::Base
56
+ class AccountPreferences < SimpleJsonSchemaBuilder::Base
54
57
  object do
55
- string :test1
56
- integer :test2, required: true
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
- Will serialize to:
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": ["other_info"],
69
+ "required": ["name", "contact_info"],
67
70
  "properties": {
68
- "string_test": {
71
+ "name": {
69
72
  "type": "string",
70
- "examples": ["blue while"]
73
+ "examples": ["John Doe"]
71
74
  },
72
- "boolean_test": {
73
- "type": "boolean",
74
- "examples": ["blah", "bleh"]
75
+ "age": {
76
+ "type": "integer",
77
+ "examples": [30]
75
78
  },
76
- "str_array_test": {
77
- "type": "array",
78
- "items": {
79
- "type": "string"
80
- }
79
+ "is_active": {
80
+ "type": "boolean",
81
+ "examples": [true, false]
81
82
  },
82
- "string_enums": {
83
+ "role": {
83
84
  "type": "string",
84
- "enum": ["test1", "test2"]
85
+ "examples": ["user"],
86
+ "enum": ["admin", "user", "guest"]
85
87
  },
86
- "string_enum_arrays": {
88
+ "tags": {
87
89
  "type": "array",
88
90
  "items": {
89
91
  "type": "string",
90
- "enum": ["test1", "test2"]
92
+ "examples": ["ruby", "json"]
91
93
  }
92
94
  },
93
- "other_info": {
95
+ "contact_info": {
94
96
  "type": "object",
95
- "required": ["string_test"],
97
+ "required": ["email"],
96
98
  "properties": {
97
- "string_test": {
98
- "type": "string"
99
+ "email": {
100
+ "type": "string",
101
+ "examples": ["johndoe@example.com"]
99
102
  },
100
- "boolean_test": {
101
- "type": "boolean"
103
+ "phone_number": {
104
+ "type": "string",
105
+ "examples": ["123-456-7890"]
102
106
  }
103
107
  }
104
108
  },
105
- "other_info_arr": {
109
+ "addresses": {
106
110
  "type": "array",
107
111
  "items": {
108
112
  "type": "object",
109
- "required": ["string_test"],
113
+ "required": ["street", "city", "country"],
110
114
  "properties": {
111
- "string_test": {
112
- "type": "string"
115
+ "street": {
116
+ "type": "string",
117
+ "examples": ["123 Main St"]
113
118
  },
114
- "boolean_test": {
115
- "type": "boolean"
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
- "test2": {
130
- "type": "integer"
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: false, title: nil, description: nil, array: false, examples: [], enum: nil)
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: false, title: nil, description: nil, array: false, examples: [], enum: nil)
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: false, title: nil, description: nil, array: false, examples: [], enum: nil)
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: false, title: nil, description: nil, array: false, examples: [])
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SimpleJsonSchemaBuilder
4
- VERSION = "0.1.0"
4
+ VERSION = "0.1.1"
5
5
  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.0
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: 2024-09-20 00:00:00.000000000 Z
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.5.18
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: []