22# Generate it instead with the provided metadata.json
33# for them to be able to report invalid prop
44
5+ import json
56import os
67import re
78
9+ from dash .development ._py_prop_typing import get_custom_ignore
10+
811
912init_check_re = re .compile ("proptypes.js" )
1013
2528
2629prop_type_file_template = """// AUTOGENERATED FILE - DO NOT EDIT
2730
28- var PropTypes = window.PropTypes;
29-
31+ var pt = window.PropTypes;
32+ var pk = window['{package_name}'];
3033
3134{components_prop_types}
3235"""
3336
34- component_prop_types_template = (
35- "window['{package_name}'].{component_name}.propTypes = {prop_types}"
36- )
37+ component_prop_types_template = "pk.{component_name}.propTypes = {prop_types};"
3738
3839
3940def generate_type (type_name ):
4041 def wrap (* _ ):
41- return f"PropTypes .{ type_name } "
42+ return f"pt .{ type_name } "
4243
4344 return wrap
4445
4546
4647def generate_union (prop_info ):
4748 types = [generate_prop_type (t ) for t in prop_info ["value" ]]
48- return f"PropTypes .oneOfType([{ ',' .join (types )} ])"
49+ return f"pt .oneOfType([{ ',' .join (types )} ])"
4950
5051
5152def generate_shape (prop_info ):
5253 props = []
5354 for key , value in prop_info ["value" ].items ():
5455 props .append (f"{ key } :{ generate_prop_type (value )} " )
5556 inner = "{" + "," .join (props ) + "}"
56- return f"PropTypes .shape({ inner } )"
57+ return f"pt .shape({ inner } )"
5758
5859
5960def generate_array_of (prop_info ):
6061 inner_type = generate_prop_type (prop_info ["value" ])
61- return f"PropTypes .arrayOf({ inner_type } )"
62+ return f"pt .arrayOf({ inner_type } )"
6263
6364
6465def generate_any (* _ ):
65- return "PropTypes .any"
66+ return "pt .any"
6667
6768
6869def generate_enum (prop_info ):
6970 values = str ([v ["value" ] for v in prop_info ["value" ]])
70- return f"PropTypes .oneOf({ values } )"
71+ return f"pt .oneOf({ values } )"
7172
7273
7374def generate_object_of (prop_info ):
74- return f"PropTypes .objectOf({ generate_prop_type (prop_info ['value' ])} )"
75+ return f"pt .objectOf({ generate_prop_type (prop_info ['value' ])} )"
7576
7677
7778def generate_tuple (* _ ):
7879 # PropTypes don't have a tuple... just generate an array.
79- return "PropTypes.array"
80+ return "pt.array"
81+
82+
83+ def generate_literal (prop_info ):
84+ return f"pt.oneOf([{ json .dumps (prop_info ['value' ])} ])"
8085
8186
8287prop_types = {
@@ -97,6 +102,7 @@ def generate_tuple(*_):
97102 "enum" : generate_enum ,
98103 "objectOf" : generate_object_of ,
99104 "tuple" : generate_tuple ,
105+ "literal" : generate_literal ,
100106}
101107
102108
@@ -122,9 +128,12 @@ def check_init(namespace):
122128def generate_prop_types (
123129 metadata ,
124130 package_name ,
131+ custom_typing_module ,
125132):
126133 patched = []
127134
135+ custom_ignore = get_custom_ignore (custom_typing_module )
136+
128137 for component_path , data in metadata .items ():
129138 filename = component_path .split ("/" )[- 1 ]
130139 extension = filename .split ("/" )[- 1 ].split ("." )[- 1 ]
@@ -135,13 +144,17 @@ def generate_prop_types(
135144
136145 props = []
137146 for prop_name , prop_data in data .get ("props" , {}).items ():
138- props .append (f" { prop_name } :{ generate_prop_type (prop_data ['type' ])} " )
147+ if prop_name in custom_ignore :
148+ prop_type = "pt.any"
149+ else :
150+ prop_type = generate_prop_type (prop_data ["type" ])
151+ props .append (f"{ prop_name } :{ prop_type } " )
139152
140153 patched .append (
141154 component_prop_types_template .format (
142155 package_name = package_name ,
143156 component_name = component_name ,
144- prop_types = "{" + ",\n " .join (props ) + "}" ,
157+ prop_types = "{" + ",\n " .join (props ) + "}" ,
145158 )
146159 )
147160
@@ -151,7 +164,7 @@ def generate_prop_types(
151164 ) as f :
152165 f .write (
153166 prop_type_file_template .format (
154- components_prop_types = "\n \n " .join (patched )
167+ package_name = package_name , components_prop_types = "\n " .join (patched )
155168 )
156169 )
157170
0 commit comments