66
77import codegen .packages as packages
88from codegen .code_builder import CodeBuilder
9- from codegen .jsonschema import Property , Schema
9+ from codegen .jsonschema import Property , Schema , Stage
1010from codegen .packages import is_resource
1111
1212
@@ -96,6 +96,12 @@ class GeneratedField:
9696 Factory method for creating a default value, used for lists and dicts.
9797 """
9898
99+ experimental : bool
100+ """
101+ If true, the field is experimental and should not be indexed in docs, and
102+ be marked as experimental in docstring.
103+ """
104+
99105 def __post_init__ (self ):
100106 if self .default_factory is not None and self .default is not None :
101107 raise ValueError ("Can't have both default and default_factory" , self )
@@ -124,6 +130,7 @@ class GeneratedDataclass:
124130
125131 fields : list [GeneratedField ]
126132 extends : list [GeneratedType ]
133+ experimental : bool
127134
128135
129136def generate_field (
@@ -147,6 +154,7 @@ def generate_field(
147154 default = None ,
148155 default_factory = "dict" ,
149156 create_func_default = "None" ,
157+ experimental = prop .stage == Stage .PRIVATE ,
150158 )
151159 elif field_type .name == "VariableOrList" :
152160 return GeneratedField (
@@ -158,6 +166,7 @@ def generate_field(
158166 default = None ,
159167 default_factory = "list" ,
160168 create_func_default = "None" ,
169+ experimental = prop .stage == Stage .PRIVATE ,
161170 )
162171 elif is_required :
163172 return GeneratedField (
@@ -169,6 +178,7 @@ def generate_field(
169178 default = None ,
170179 default_factory = None ,
171180 create_func_default = None ,
181+ experimental = prop .stage == Stage .PRIVATE ,
172182 )
173183 else :
174184 return GeneratedField (
@@ -180,6 +190,7 @@ def generate_field(
180190 default = "None" ,
181191 default_factory = None ,
182192 create_func_default = "None" ,
193+ experimental = prop .stage == Stage .PRIVATE ,
183194 )
184195
185196
@@ -308,6 +319,7 @@ def generate_dataclass(schema_name: str, schema: Schema) -> GeneratedDataclass:
308319 description = schema .description ,
309320 fields = fields ,
310321 extends = extends ,
322+ experimental = schema .stage == Stage .PRIVATE ,
311323 )
312324
313325
@@ -347,10 +359,10 @@ def _append_dataclass(b: CodeBuilder, generated: GeneratedDataclass):
347359 b .append (":" ).newline ()
348360
349361 # FIXME should contain class docstring
350- if not generated .description :
362+ if not generated .description and not generated . experimental :
351363 b .indent ().append_triple_quote ().append_triple_quote ().newline ().newline ()
352364 else :
353- _append_description (b , generated .description )
365+ _append_description (b , generated .description , generated . experimental )
354366
355367
356368def _append_field (b : CodeBuilder , field : GeneratedField ):
@@ -428,11 +440,16 @@ def _append_typed_dict(b: CodeBuilder, generated: GeneratedDataclass):
428440 b .indent ().append_triple_quote ().append_triple_quote ().newline ().newline ()
429441
430442
431- def _append_description (b : CodeBuilder , description : Optional [str ]):
432- if description :
443+ def _append_description (b : CodeBuilder , description : Optional [str ], experimental : bool ):
444+ if description or experimental :
433445 b .indent ().append_triple_quote ().newline ()
434- for line in description .split ("\n " ):
435- b .indent ().append (line ).newline ()
446+ if experimental :
447+ b .indent ().append (":meta private: [EXPERIMENTAL]" ).newline ()
448+ if description :
449+ b .indent ().newline ()
450+ if description :
451+ for line in description .split ("\n " ):
452+ b .indent ().append (line ).newline ()
436453 b .indent ().append_triple_quote ().newline ()
437454
438455
@@ -449,7 +466,7 @@ def get_code(generated: GeneratedDataclass) -> str:
449466
450467 for field in generated .fields :
451468 _append_field (b , field )
452- _append_description (b , field .description )
469+ _append_description (b , field .description , field . experimental )
453470
454471 b .newline ()
455472
@@ -462,7 +479,7 @@ def get_code(generated: GeneratedDataclass) -> str:
462479
463480 for field in generated .fields :
464481 _append_typed_dict_field (b , field )
465- _append_description (b , field .description )
482+ _append_description (b , field .description , field . experimental )
466483
467484 b .newline ()
468485
0 commit comments