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 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: []