(
self,
properties: List[Tuple[str, Any]],
required: set[str],
name: str,
additional_properties: Union[bool, Any],
)
| 676 | return rule_name |
| 677 | |
| 678 | def _build_object_rule( |
| 679 | self, |
| 680 | properties: List[Tuple[str, Any]], |
| 681 | required: set[str], |
| 682 | name: str, |
| 683 | additional_properties: Union[bool, Any], |
| 684 | ) -> str: |
| 685 | prop_order = self._prop_order |
| 686 | sorted_props = [ |
| 687 | key |
| 688 | for _, (key, _) in sorted( |
| 689 | enumerate(properties), |
| 690 | key=lambda indexed_key: ( |
| 691 | prop_order.get(indexed_key[1][0], len(prop_order)), |
| 692 | indexed_key[0], |
| 693 | ), |
| 694 | ) |
| 695 | ] |
| 696 | |
| 697 | property_kv_rule_names: Dict[str, str] = {} |
| 698 | for prop_name, prop_schema in properties: |
| 699 | prop_rule_name = self.visit( |
| 700 | cast(Dict[str, Any], prop_schema), |
| 701 | f"{name}{'-' if name else ''}{prop_name}", |
| 702 | ) |
| 703 | property_kv_rule_names[prop_name] = self._add_rule( |
| 704 | f"{name}{'-' if name else ''}{prop_name}-kv", |
| 705 | rf'{self._format_literal(json.dumps(prop_name))} space ":" space {prop_rule_name}', |
| 706 | ) |
| 707 | |
| 708 | required_props = [key for key in sorted_props if key in required] |
| 709 | optional_props = [key for key in sorted_props if key not in required] |
| 710 | |
| 711 | if additional_properties is True or isinstance(additional_properties, dict): |
| 712 | sub_name = f"{name}{'-' if name else ''}additional" |
| 713 | value_rule = self.visit( |
| 714 | {} if additional_properties is True else cast(Dict[str, Any], additional_properties), |
| 715 | f"{sub_name}-value", |
| 716 | ) |
| 717 | property_kv_rule_names["*"] = self._add_rule( |
| 718 | f"{sub_name}-kv", |
| 719 | self._add_primitive("string", self._primitive_rules()["string"]) |
| 720 | + f' ":" space {value_rule}', |
| 721 | ) |
| 722 | optional_props.append("*") |
| 723 | |
| 724 | rule = '"{" space ' |
| 725 | rule += ' "," space '.join(property_kv_rule_names[key] for key in required_props) |
| 726 | |
| 727 | if optional_props: |
| 728 | if required_props: |
| 729 | rule += ' ( "," space ( ' |
| 730 | else: |
| 731 | rule += "( " |
| 732 | |
| 733 | def get_recursive_refs(keys: List[str], first_is_optional: bool) -> str: |
| 734 | head, *rest = keys |
| 735 | kv_rule_name = property_kv_rule_names[head] |
no test coverage detected