Milo
3 years ago
committed by
GitHub
9 changed files with 835 additions and 476 deletions
@ -0,0 +1,112 @@ |
|||||||
|
{ |
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#", |
||||||
|
"$id": "https://example.com/product.schema.json", |
||||||
|
"title": "Form", |
||||||
|
"description": "A form", |
||||||
|
"type": "object", |
||||||
|
"required": ["form_type", "start_year", "end_year", "sections"], |
||||||
|
"properties": { |
||||||
|
"form_type": { |
||||||
|
"description": "", |
||||||
|
"type": "string" |
||||||
|
}, |
||||||
|
"start_year": { |
||||||
|
"description": "", |
||||||
|
"type": "integer" |
||||||
|
}, |
||||||
|
"end_year": { |
||||||
|
"description": "", |
||||||
|
"type": "integer" |
||||||
|
}, |
||||||
|
"sections": { |
||||||
|
"type": "object", |
||||||
|
"patternProperties": { |
||||||
|
"[a-z_]+": { |
||||||
|
"description": "", |
||||||
|
"type": "object", |
||||||
|
"properties": { |
||||||
|
"label": { |
||||||
|
"description": "", |
||||||
|
"type": "string" |
||||||
|
}, |
||||||
|
"subsections": { |
||||||
|
"type": "object", |
||||||
|
"patternProperties": { |
||||||
|
"[a-z_]+": { |
||||||
|
"description": "", |
||||||
|
"type": "object", |
||||||
|
"required": ["label"], |
||||||
|
"properties": { |
||||||
|
"label": { |
||||||
|
"description": "", |
||||||
|
"type": "string" |
||||||
|
}, |
||||||
|
"pages": { |
||||||
|
"type": "object", |
||||||
|
"patternProperties": { |
||||||
|
"[a-z_]+": { |
||||||
|
"description": "", |
||||||
|
"type": "object", |
||||||
|
"properties": { |
||||||
|
"header": { |
||||||
|
"description": "", |
||||||
|
"type": "string" |
||||||
|
}, |
||||||
|
"description": { |
||||||
|
"description": "", |
||||||
|
"type": "string" |
||||||
|
}, |
||||||
|
"questions": { |
||||||
|
"type": "object", |
||||||
|
"patternProperties": { |
||||||
|
"[a-z_]+": { |
||||||
|
"description": "", |
||||||
|
"type": "object", |
||||||
|
"required": ["header", "check_answer_label"], |
||||||
|
"properties": { |
||||||
|
"check_answer_label": { |
||||||
|
"description": "", |
||||||
|
"type": "string" |
||||||
|
}, |
||||||
|
"header": { |
||||||
|
"description": "", |
||||||
|
"type": "string" |
||||||
|
}, |
||||||
|
"type": { |
||||||
|
"description": "", |
||||||
|
"type": "string" |
||||||
|
}, |
||||||
|
"hint_text": { |
||||||
|
"description": "", |
||||||
|
"type": "string" |
||||||
|
}, |
||||||
|
"answer_options": { |
||||||
|
"description": "", |
||||||
|
"type": "object" |
||||||
|
}, |
||||||
|
"conditional_for": { |
||||||
|
"description": "", |
||||||
|
"type": "object" |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
"minProperties": 1 |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
"minProperties": 1 |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
"minProperties": 2 |
||||||
|
} |
||||||
|
}, |
||||||
|
"minProperties": 1 |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,129 @@ |
|||||||
|
{ |
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#", |
||||||
|
"$id": "https://example.com/product.schema.json", |
||||||
|
"title": "Form", |
||||||
|
"description": "A form", |
||||||
|
"type": "object", |
||||||
|
"required": ["form_type", "start_year", "end_year", "sections"], |
||||||
|
"properties": { |
||||||
|
"form_type": { |
||||||
|
"description": "", |
||||||
|
"type": "string" |
||||||
|
}, |
||||||
|
"start_year": { |
||||||
|
"description": "", |
||||||
|
"type": "integer" |
||||||
|
}, |
||||||
|
"end_year": { |
||||||
|
"description": "", |
||||||
|
"type": "integer" |
||||||
|
}, |
||||||
|
"sections": { |
||||||
|
"type": "object", |
||||||
|
"patternProperties": { |
||||||
|
"[a-z_]+": { |
||||||
|
"description": "Section Name", |
||||||
|
"type": "object", |
||||||
|
"properties": { |
||||||
|
"label": { |
||||||
|
"description": "", |
||||||
|
"type": "string" |
||||||
|
}, |
||||||
|
"subsections": { |
||||||
|
"type": "object", |
||||||
|
"patternProperties": { |
||||||
|
"[a-z_]+": { |
||||||
|
"description": "SubSection Name", |
||||||
|
"type": "object", |
||||||
|
"required": ["label"], |
||||||
|
"properties": { |
||||||
|
"label": { |
||||||
|
"description": "", |
||||||
|
"type": "string" |
||||||
|
}, |
||||||
|
"pages": { |
||||||
|
"type": "object", |
||||||
|
"patternProperties": { |
||||||
|
"^(?!(conditional_route_to))[a-z_]+$": { |
||||||
|
"description": "Page Name", |
||||||
|
"type": "object", |
||||||
|
"required": ["header", "questions"], |
||||||
|
"properties": { |
||||||
|
"header": { |
||||||
|
"description": "", |
||||||
|
"type": "string" |
||||||
|
}, |
||||||
|
"description": { |
||||||
|
"description": "", |
||||||
|
"type": "string" |
||||||
|
}, |
||||||
|
"questions": { |
||||||
|
"type": "object", |
||||||
|
"patternProperties": { |
||||||
|
"[a-z_]+": { |
||||||
|
"description": "Question Name", |
||||||
|
"type": "object", |
||||||
|
"required": ["header", "type"], |
||||||
|
"properties": { |
||||||
|
"header": { |
||||||
|
"description": "", |
||||||
|
"type": "string" |
||||||
|
}, |
||||||
|
"type": { |
||||||
|
"description": "", |
||||||
|
"type": "string" |
||||||
|
}, |
||||||
|
"check_answer_label": { |
||||||
|
"description": "", |
||||||
|
"type": "string", |
||||||
|
"optional": "true" |
||||||
|
} |
||||||
|
}, |
||||||
|
"additionalProperties": { |
||||||
|
"hint_text": { |
||||||
|
"optional": "true", |
||||||
|
"description": "", |
||||||
|
"type": "string" |
||||||
|
}, |
||||||
|
"answer_options": { |
||||||
|
"optional": "true", |
||||||
|
"description": "", |
||||||
|
"type": "object" |
||||||
|
}, |
||||||
|
"check_answer_label": { |
||||||
|
"description": "", |
||||||
|
"type": "string" |
||||||
|
}, |
||||||
|
"conditional_for": { |
||||||
|
"description": "", |
||||||
|
"type": "object" |
||||||
|
} |
||||||
|
}, |
||||||
|
"minProperties": 1 |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
"additionalProperties": { |
||||||
|
"conditional_route_to": { |
||||||
|
"description": "", |
||||||
|
"type": "object" |
||||||
|
} |
||||||
|
}, |
||||||
|
"minProperties": 1 |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
"minProperties": 1 |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
"minProperties": 2 |
||||||
|
} |
||||||
|
}, |
||||||
|
"minProperties": 1 |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,50 @@ |
|||||||
|
require "json" |
||||||
|
require "json-schema" |
||||||
|
|
||||||
|
def get_all_form_paths(directories) |
||||||
|
form_paths = [] |
||||||
|
directories.each do |directory| |
||||||
|
Dir.glob("#{directory}/*.json").each do |form_path| |
||||||
|
form_paths.push(form_path) |
||||||
|
end |
||||||
|
end |
||||||
|
form_paths |
||||||
|
end |
||||||
|
|
||||||
|
namespace :form_definition do |
||||||
|
desc "Validate JSON against Generic Form Schema" |
||||||
|
task :validate do |
||||||
|
puts "#{Rails.root}" |
||||||
|
path = "config/forms/schema/generic.json" |
||||||
|
|
||||||
|
file = File.open(path) |
||||||
|
schema = JSON.parse(file.read) |
||||||
|
metaschema = JSON::Validator.validator_for_name("draft4").metaschema |
||||||
|
|
||||||
|
puts path |
||||||
|
|
||||||
|
if JSON::Validator.validate(metaschema, schema) |
||||||
|
puts "schema valid" |
||||||
|
else |
||||||
|
puts "schema not valid" |
||||||
|
return |
||||||
|
end |
||||||
|
|
||||||
|
directories = ["config/forms", "spec/fixtures/forms"] |
||||||
|
# directories = ["config/forms"] |
||||||
|
|
||||||
|
get_all_form_paths(directories).each do |path| |
||||||
|
puts path |
||||||
|
file = File.open(path) |
||||||
|
data = JSON.parse(file.read) |
||||||
|
|
||||||
|
puts JSON::Validator.fully_validate(schema, data, :strict => true) |
||||||
|
|
||||||
|
begin |
||||||
|
JSON::Validator.validate!(schema, data) |
||||||
|
rescue JSON::Schema::ValidationError => e |
||||||
|
e.message |
||||||
|
end |
||||||
|
end |
||||||
|
end |
||||||
|
end |
@ -0,0 +1,48 @@ |
|||||||
|
{ |
||||||
|
"form_type": "lettings", |
||||||
|
"start_year": 2021, |
||||||
|
"end_year": 2022, |
||||||
|
"sections": { |
||||||
|
"household": { |
||||||
|
"label": "About the household", |
||||||
|
"subsections": { |
||||||
|
"household_characteristics": { |
||||||
|
"label": "Household characteristics", |
||||||
|
"ShouldThrowError": "Shouldn't be here but what you gonna do?", |
||||||
|
"pages": { |
||||||
|
"tenant_code": { |
||||||
|
"header": "", |
||||||
|
"description": "", |
||||||
|
"ShouldThrowError": "Shouldn't be here but what you gonna do?", |
||||||
|
"questions": { |
||||||
|
"tenant_code": { |
||||||
|
"check_answer_label": "Tenant code", |
||||||
|
"header": "What is the tenant code?", |
||||||
|
"description": "", |
||||||
|
"type": "text" |
||||||
|
} |
||||||
|
}, |
||||||
|
"conditional_route_to": {"test": "Yes"} |
||||||
|
}, |
||||||
|
"conditional_route_to": {"test": "Yes"}, |
||||||
|
"person_1_age": { |
||||||
|
"header": "", |
||||||
|
"description": "", |
||||||
|
"questions": { |
||||||
|
"person_1_age": { |
||||||
|
"check_answer_label": "Tenant's age", |
||||||
|
"header": "What is the tenant's age?", |
||||||
|
"hint_text": "", |
||||||
|
"type": "numeric", |
||||||
|
"min": 0, |
||||||
|
"max": 120, |
||||||
|
"step": 1 |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue