@@ -30,7 +30,7 @@ def convert_to_json_type(a_type):
3030
3131
3232def pdltype_to_jsonschema ( # pylint: disable=too-many-return-statements
33- pdl_type : str | dict [str , Any ] | list
33+ pdl_type : str | dict [str , Any ] | list , additional_properties : bool
3434) -> dict [str , Any ]:
3535 match pdl_type :
3636 case {"enum" : choices }:
@@ -46,7 +46,10 @@ def pdltype_to_jsonschema( # pylint: disable=too-many-return-statements
4646 case {"int" : dict () as details }:
4747 return {"type" : "integer" , ** details }
4848 case {"list" : str () as type_name }:
49- return {"type" : "array" , "items" : pdltype_to_jsonschema (type_name )}
49+ return {
50+ "type" : "array" ,
51+ "items" : pdltype_to_jsonschema (type_name , additional_properties ),
52+ }
5053 case {"list" : dict () as details }:
5154 ikws = ["enum" , * _PDLTYPE_TO_JSONSCHEMA_NAME .keys ()]
5255 items_details = {k : v for k , v in details .items () if k in ikws }
@@ -55,43 +58,50 @@ def pdltype_to_jsonschema( # pylint: disable=too-many-return-statements
5558 other_details = {k : v for k , v in details .items () if k not in ikws }
5659 return {
5760 "type" : "array" ,
58- "items" : pdltype_to_jsonschema (items_details ),
61+ "items" : pdltype_to_jsonschema (items_details , additional_properties ),
5962 ** other_details ,
6063 }
6164 case list () as type_list :
6265 if len (type_list ) != 1 :
6366 raise ValueError (f"invalid PDL type { pdl_type } " )
6467 return {
6568 "type" : "array" ,
66- "items" : pdltype_to_jsonschema (type_list [0 ]),
69+ "items" : pdltype_to_jsonschema (type_list [0 ], additional_properties ),
6770 }
6871 case {"obj" : dict () as pdl_props }:
69- return get_json_schema_object (pdl_props )
72+ return get_json_schema_object (pdl_props , additional_properties )
7073 case dict () as pdl_props :
71- return get_json_schema_object (pdl_props )
74+ return get_json_schema_object (pdl_props , additional_properties )
7275 raise ValueError (f"invalid PDL type { pdl_type } " )
7376
7477
75- def get_json_schema_object (pdl_props : dict ) -> dict [str , Any ]:
78+ def get_json_schema_object (pdl_props : dict , additional_properties ) -> dict [str , Any ]:
7679 props = {}
7780 required = []
7881 for name , prop_type in pdl_props .items ():
7982 if isinstance (prop_type , dict ) and "optional" in prop_type :
80- props [name ] = pdltype_to_jsonschema (prop_type ["optional" ])
83+ props [name ] = pdltype_to_jsonschema (
84+ prop_type ["optional" ], additional_properties
85+ )
8186 else :
82- props [name ] = pdltype_to_jsonschema (prop_type )
87+ props [name ] = pdltype_to_jsonschema (prop_type , additional_properties )
8388 required .append (name )
84- return {
85- "type" : "object" ,
86- "properties" : props ,
87- "required" : required ,
88- "additionalProperties" : False ,
89- }
89+ if additional_properties is False :
90+ return {
91+ "type" : "object" ,
92+ "properties" : props ,
93+ "required" : required ,
94+ "additionalProperties" : False ,
95+ }
96+
97+ return {"type" : "object" , "properties" : props , "required" : required }
9098
9199
92- def get_json_schema (params : dict [str , Any ]) -> Optional [dict [str , Any ]]:
100+ def get_json_schema (
101+ params : dict [str , Any ], additional_properties
102+ ) -> Optional [dict [str , Any ]]:
93103 try :
94- result = pdltype_to_jsonschema ({"obj" : params })
104+ result = pdltype_to_jsonschema ({"obj" : params }, additional_properties )
95105 return result
96106 except ValueError as e :
97107 warnings .warn (e .args [0 ])
0 commit comments