mirror of
https://github.com/babysor/MockingBird.git
synced 2024-03-22 13:11:31 +08:00
136 lines
3.7 KiB
Python
136 lines
3.7 KiB
Python
from typing import Dict
|
|
|
|
|
|
def resolve_reference(reference: str, references: Dict) -> Dict:
|
|
return references[reference.split("/")[-1]]
|
|
|
|
|
|
def get_single_reference_item(property: Dict, references: Dict) -> Dict:
|
|
# Ref can either be directly in the properties or the first element of allOf
|
|
reference = property.get("$ref")
|
|
if reference is None:
|
|
reference = property["allOf"][0]["$ref"]
|
|
return resolve_reference(reference, references)
|
|
|
|
|
|
def is_single_string_property(property: Dict) -> bool:
|
|
return property.get("type") == "string"
|
|
|
|
|
|
def is_single_datetime_property(property: Dict) -> bool:
|
|
if property.get("type") != "string":
|
|
return False
|
|
return property.get("format") in ["date-time", "time", "date"]
|
|
|
|
|
|
def is_single_boolean_property(property: Dict) -> bool:
|
|
return property.get("type") == "boolean"
|
|
|
|
|
|
def is_single_number_property(property: Dict) -> bool:
|
|
return property.get("type") in ["integer", "number"]
|
|
|
|
|
|
def is_single_file_property(property: Dict) -> bool:
|
|
if property.get("type") != "string":
|
|
return False
|
|
# TODO: binary?
|
|
return property.get("format") == "byte"
|
|
|
|
def is_single_autio_property(property: Dict) -> bool:
|
|
if property.get("type") != "string":
|
|
return False
|
|
# TODO: binary?
|
|
return property.get("format") == "bytes"
|
|
|
|
|
|
def is_single_directory_property(property: Dict) -> bool:
|
|
if property.get("type") != "string":
|
|
return False
|
|
return property.get("format") == "path"
|
|
|
|
def is_multi_enum_property(property: Dict, references: Dict) -> bool:
|
|
if property.get("type") != "array":
|
|
return False
|
|
|
|
if property.get("uniqueItems") is not True:
|
|
# Only relevant if it is a set or other datastructures with unique items
|
|
return False
|
|
|
|
try:
|
|
_ = resolve_reference(property["items"]["$ref"], references)["enum"]
|
|
return True
|
|
except Exception:
|
|
return False
|
|
|
|
|
|
def is_single_enum_property(property: Dict, references: Dict) -> bool:
|
|
try:
|
|
_ = get_single_reference_item(property, references)["enum"]
|
|
return True
|
|
except Exception:
|
|
return False
|
|
|
|
|
|
def is_single_dict_property(property: Dict) -> bool:
|
|
if property.get("type") != "object":
|
|
return False
|
|
return "additionalProperties" in property
|
|
|
|
|
|
def is_single_reference(property: Dict) -> bool:
|
|
if property.get("type") is not None:
|
|
return False
|
|
|
|
return bool(property.get("$ref"))
|
|
|
|
|
|
def is_multi_file_property(property: Dict) -> bool:
|
|
if property.get("type") != "array":
|
|
return False
|
|
|
|
if property.get("items") is None:
|
|
return False
|
|
|
|
try:
|
|
# TODO: binary
|
|
return property["items"]["format"] == "byte"
|
|
except Exception:
|
|
return False
|
|
|
|
|
|
def is_single_object(property: Dict, references: Dict) -> bool:
|
|
try:
|
|
object_reference = get_single_reference_item(property, references)
|
|
if object_reference["type"] != "object":
|
|
return False
|
|
return "properties" in object_reference
|
|
except Exception:
|
|
return False
|
|
|
|
|
|
def is_property_list(property: Dict) -> bool:
|
|
if property.get("type") != "array":
|
|
return False
|
|
|
|
if property.get("items") is None:
|
|
return False
|
|
|
|
try:
|
|
return property["items"]["type"] in ["string", "number", "integer"]
|
|
except Exception:
|
|
return False
|
|
|
|
|
|
def is_object_list_property(property: Dict, references: Dict) -> bool:
|
|
if property.get("type") != "array":
|
|
return False
|
|
|
|
try:
|
|
object_reference = resolve_reference(property["items"]["$ref"], references)
|
|
if object_reference["type"] != "object":
|
|
return False
|
|
return "properties" in object_reference
|
|
except Exception:
|
|
return False
|