Skip to content

Commit

Permalink
option to require all fields
Browse files Browse the repository at this point in the history
  • Loading branch information
mooktakim committed Feb 3, 2025
1 parent da01f6b commit 10b273c
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 10 deletions.
3 changes: 3 additions & 0 deletions .rubocop.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,6 @@ Style/Documentation:

Metrics/AbcSize:
Enabled: false

Layout/LineLength:
Enabled: false
22 changes: 12 additions & 10 deletions lib/simple_json_schema_builder/base.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@

module SimpleJsonSchemaBuilder
class Base
def self.object(description: nil, &block)
@schema ||= Base.new(description: description)
def self.object(description: nil, default_required: false, &block)
@schema ||= Base.new(description: description, default_required: default_required)
@schema.instance_eval(&block)
end

Expand All @@ -17,37 +17,39 @@ def self.to_json
MultiJson.dump(schema)
end

def initialize(description: nil)
def initialize(description: nil, default_required: false)
@properties = {}
@required_key_names = []
@description = description
@default_required = default_required
end

def string(key_name, required: false, title: nil, description: nil, array: false, examples: [], enum: nil)
def string(key_name, required: nil, title: nil, description: nil, array: false, examples: [], enum: nil)
add_required(key_name, required)
add_property("string", key_name, title: title, description: description, examples: examples, enum: enum)
add_array(key_name, array)
end

def integer(key_name, required: false, title: nil, description: nil, array: false, examples: [], enum: nil)
def integer(key_name, required: nil, title: nil, description: nil, array: false, examples: [], enum: nil)
add_required(key_name, required)
add_property("integer", key_name, title: title, description: description, examples: examples, enum: enum)
add_array(key_name, array)
end

def number(key_name, required: false, title: nil, description: nil, array: false, examples: [], enum: nil)
def number(key_name, required: nil, title: nil, description: nil, array: false, examples: [], enum: nil)
add_required(key_name, required)
add_property("number", key_name, title: title, description: description, examples: examples, enum: enum)
add_array(key_name, array)
end

def boolean(key_name, required: false, title: nil, description: nil, array: false, examples: [])
def boolean(key_name, required: nil, title: nil, description: nil, array: false, examples: [])
add_required(key_name, required)
add_property("boolean", key_name, title: title, description: description, examples: examples, enum: nil)
add_array(key_name, array)
end

def object(key_name = nil, required: false, description: nil, array: false, schema: nil, &block)
def object(key_name = nil, required: nil, default_required: false, description: nil, array: false, schema: nil, &block)
@default_required = default_required
add_required(key_name, required)

if schema
Expand Down Expand Up @@ -76,10 +78,10 @@ def schema

private

attr_reader :properties, :required_key_names, :description
attr_reader :properties, :required_key_names, :description, :default_required

def add_required(key_name, required)
return unless required
return unless default_required || required

@required_key_names << key_name
end
Expand Down
34 changes: 34 additions & 0 deletions spec/simple_json_schema_builder/base_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,20 @@ class TestSubSchema < SimpleJsonSchemaBuilder::Base
end
end

class TestDefaultRequiredTrueSchema < SimpleJsonSchemaBuilder::Base
object default_required: true do
string :test1
string :test2, required: true
end
end

class TestDefaultRequiredFalseSchema < SimpleJsonSchemaBuilder::Base
object default_required: false do
string :test1
string :test2, required: true
end
end

RSpec.describe SimpleJsonSchemaBuilder::Base do
subject { TestSchema.schema }
let(:properties) { subject[:properties] }
Expand Down Expand Up @@ -191,4 +205,24 @@ class TestSubSchema < SimpleJsonSchemaBuilder::Base
expect(hash["type"]).to eq("object")
end
end

describe "required by default" do
describe "when true" do
subject { TestDefaultRequiredTrueSchema.schema }

it "correctly formats schema" do
expect(subject[:type]).to eq("object")
expect(subject[:required]).to eq(%i[test1 test2])
end
end

describe "when false" do
subject { TestDefaultRequiredFalseSchema.schema }

it "correctly formats schema" do
expect(subject[:type]).to eq("object")
expect(subject[:required]).to eq(%i[test2])
end
end
end
end

0 comments on commit 10b273c

Please sign in to comment.