def main(args: Optional[Sequence[str]] = None) -> Exit: """Main function.""" # add cli completion support argcomplete.autocomplete(arg_parser) if args is None: args = sys.argv[1:] namespace: Namespace = arg_parser.parse_args(args) if namespace.version: # pragma: no cover from datamodel_code_generator.version import version print(version) exit(0) if namespace.debug: # pragma: no cover enable_debug_message() extra_template_data: Optional[DefaultDict[str, Dict[str, Any]]] if namespace.extra_template_data is not None: with namespace.extra_template_data as data: extra_template_data = json.load( data, object_hook=lambda d: defaultdict(dict, **d)) else: extra_template_data = None try: generate( input_name=namespace.input.name, input_text=namespace.input.read(), input_file_type=InputFileType(namespace.input_file_type), output=Path(namespace.output) if namespace.output is not None else None, target_python_version=PythonVersion( namespace.target_python_version), base_class=namespace.base_class, custom_template_dir=namespace.custom_template_dir, extra_template_data=extra_template_data, validation=namespace.validation, field_constraints=namespace.field_constraints, ) return Exit.OK except Error as e: print(str(e), file=sys.stderr) return Exit.ERROR except Exception: import traceback print(traceback.format_exc(), file=sys.stderr) return Exit.ERROR
def main(args: Optional[Sequence[str]] = None) -> Exit: """Main function.""" # add cli completion support argcomplete.autocomplete(arg_parser) if args is None: args = sys.argv[1:] namespace: Namespace = arg_parser.parse_args(args) if namespace.debug: # pragma: no cover enable_debug_message() from datamodel_code_generator.parser.openapi import OpenAPIParser parser = OpenAPIParser( BaseModel, CustomRootType, base_class=namespace.base_class, target_python_version=PythonVersion(namespace.target_python_version), text=namespace.input.read(), dump_resolve_reference_action=dump_resolve_reference_action, ) body = parser.parse() timestamp = datetime.now(timezone.utc).replace(microsecond=0).isoformat() header = f'''\ # generated by datamodel-codegen: # filename: {os.path.split(namespace.input.name)[1]} # timestamp: {timestamp} ''' with namespace.output as file: print(header, file=file) print(body, file=file) return Exit.OK
def main(args: Optional[Sequence[str]] = None) -> Exit: """Main function.""" # add cli completion support argcomplete.autocomplete(arg_parser) if args is None: args = sys.argv[1:] namespace: Namespace = arg_parser.parse_args(args) if namespace.version: # pragma: no cover from datamodel_code_generator.version import version print(version) exit(0) root = black.find_project_root((Path().resolve(), )) pyproject_toml_path = root / "pyproject.toml" if pyproject_toml_path.is_file(): pyproject_toml: Dict[str, Any] = { k.replace('-', '_'): v for k, v in toml.load(str(pyproject_toml_path)).get( 'tool', {}).get('datamodel-codegen', {}).items() } else: pyproject_toml = {} try: config = Config.parse_obj(pyproject_toml) config.merge_args(namespace) except Error as e: print(e.message, file=sys.stderr) return Exit.ERROR if not is_supported_in_black( config.target_python_version): # pragma: no cover print( f"Installed black doesn't support Python version {config.target_python_version.value}.\n" f"You have to install a newer black.\n" f"Installed black version: {black.__version__}", file=sys.stderr, ) return Exit.ERROR if config.debug: # pragma: no cover enable_debug_message() extra_template_data: Optional[DefaultDict[str, Dict[str, Any]]] if config.extra_template_data is None: extra_template_data = None else: with config.extra_template_data as data: try: extra_template_data = json.load( data, object_hook=lambda d: defaultdict(dict, **d)) except json.JSONDecodeError as e: print(f"Unable to load extra template data: {e}", file=sys.stderr) return Exit.ERROR if config.aliases is None: aliases = None else: with config.aliases as data: try: aliases = json.load(data) except json.JSONDecodeError as e: print(f"Unable to load alias mapping: {e}", file=sys.stderr) return Exit.ERROR if not isinstance(aliases, dict) or not all( isinstance(k, str) and isinstance(v, str) for k, v in aliases.items()): print( 'Alias mapping must be a JSON string mapping (e.g. {"from": "to", ...})', file=sys.stderr, ) return Exit.ERROR try: generate( input_=config.url or config.input or sys.stdin.read(), input_file_type=config.input_file_type, output=config.output, target_python_version=config.target_python_version, base_class=config.base_class, custom_template_dir=config.custom_template_dir, validation=config.validation, field_constraints=config.field_constraints, snake_case_field=config.snake_case_field, strip_default_none=config.strip_default_none, extra_template_data=extra_template_data, aliases=aliases, disable_timestamp=config.disable_timestamp, allow_population_by_field_name=config. allow_population_by_field_name, apply_default_values_for_required_fields=config.use_default, force_optional_for_required_fields=config.force_optional, class_name=config.class_name, use_standard_collections=config.use_standard_collections, use_schema_description=config.use_schema_description, reuse_model=config.reuse_model, encoding=config.encoding, enum_field_as_literal=config.enum_field_as_literal, set_default_enum_member=config.set_default_enum_member, strict_nullable=config.strict_nullable, use_generic_container_types=config.use_generic_container_types, enable_faux_immutability=config.enable_faux_immutability, disable_appending_item_suffix=config.disable_appending_item_suffix, strict_types=config.strict_types, empty_enum_field_name=config.empty_enum_field_name, field_extra_keys=config.field_extra_keys, field_include_all_keys=config.field_include_all_keys, ) return Exit.OK except InvalidClassNameError as e: print(f'{e} You have to set `--class-name` option', file=sys.stderr) return Exit.ERROR except Error as e: print(str(e), file=sys.stderr) return Exit.ERROR except Exception: import traceback print(traceback.format_exc(), file=sys.stderr) return Exit.ERROR
def main(args: Optional[Sequence[str]] = None) -> Exit: """Main function.""" # add cli completion support argcomplete.autocomplete(arg_parser) if args is None: args = sys.argv[1:] namespace: Namespace = arg_parser.parse_args(args) if namespace.version: # pragma: no cover from datamodel_code_generator.version import version print(version) exit(0) if namespace.debug: # pragma: no cover enable_debug_message() extra_template_data: Optional[DefaultDict[str, Dict]] if namespace.extra_template_data is not None: with namespace.extra_template_data as data: extra_template_data = json.load( data, object_hook=lambda d: defaultdict(dict, **d)) else: extra_template_data = None text: str = namespace.input.read() input_file_type: str = namespace.input_file_type if input_file_type == 'auto': try: input_file_type = 'openapi' if is_openapi(text) else 'jsonschema' except: print('Invalid file format') return Exit.ERROR if input_file_type == 'openapi': from datamodel_code_generator.parser.openapi import OpenAPIParser parser_class: Type[Parser] = OpenAPIParser else: from datamodel_code_generator.parser.jsonschema import JsonSchemaParser parser_class = JsonSchemaParser parser = parser_class( BaseModel, CustomRootType, base_class=namespace.base_class, custom_template_dir=namespace.custom_template_dir, extra_template_data=extra_template_data, target_python_version=PythonVersion(namespace.target_python_version), text=text, dump_resolve_reference_action=dump_resolve_reference_action, ) output = Path(namespace.output) if namespace.output is not None else None with chdir(output): result = parser.parse() if isinstance(result, str): modules = {output: result} else: if output is None: print('Modular references require an output directory') return Exit.ERROR if output.suffix: print('Modular references require an output directory, not a file') return Exit.ERROR modules = { output.joinpath(*name): body for name, body in result.items() } timestamp = datetime.now(timezone.utc).replace(microsecond=0).isoformat() header = f'''\ # generated by datamodel-codegen: # filename: {Path(namespace.input.name).name} # timestamp: {timestamp}''' file: Optional[IO[Any]] for path, body in modules.items(): if path is not None: if not path.parent.exists(): path.parent.mkdir() file = path.open('wt') else: file = None print(header, file=file) if body: print('', file=file) print(body.rstrip(), file=file) if file is not None: file.close() return Exit.OK
def main(args: Optional[Sequence[str]] = None) -> Exit: """Main function.""" # add cli completion support argcomplete.autocomplete(arg_parser) if args is None: args = sys.argv[1:] namespace: Namespace = arg_parser.parse_args(args) if namespace.version: # pragma: no cover from datamodel_code_generator.version import version print(version) exit(0) root = black.find_project_root((Path().resolve(),)) pyproject_toml_path = root / "pyproject.toml" if pyproject_toml_path.is_file(): pyproject_toml: Dict[str, Any] = { k.replace('-', '_'): v for k, v in toml.load(str(pyproject_toml_path)) .get('tool', {}) .get('datamodel-codegen', {}) .items() } else: pyproject_toml = {} config = Config.parse_obj(pyproject_toml) config.merge_args(namespace) if config.input is not None: input_name: str = config.input.name # type: ignore input_text: str = config.input.read() else: input_name = '<stdin>' input_text = sys.stdin.read() if config.debug: # pragma: no cover enable_debug_message() extra_template_data: Optional[DefaultDict[str, Dict[str, Any]]] if config.extra_template_data is not None: with config.extra_template_data as data: try: extra_template_data = json.load( data, object_hook=lambda d: defaultdict(dict, **d) ) except json.JSONDecodeError as e: print(f"Unable to load extra template data: {e}", file=sys.stderr) return Exit.ERROR else: extra_template_data = None if config.aliases is not None: with config.aliases as data: try: aliases = json.load(data) except json.JSONDecodeError as e: print(f"Unable to load alias mapping: {e}", file=sys.stderr) return Exit.ERROR if not isinstance(aliases, Dict) or not all( isinstance(k, str) and isinstance(v, str) for k, v in aliases.items() ): print( 'Alias mapping must be a JSON string mapping (e.g. {"from": "to", ...})', file=sys.stderr, ) return Exit.ERROR else: aliases = None try: generate( input_name=input_name, input_text=input_text, input_file_type=config.input_file_type, output=config.output, target_python_version=config.target_python_version, base_class=config.base_class, custom_template_dir=config.custom_template_dir, validation=config.validation, field_constraints=config.field_constraints, snake_case_field=config.snake_case_field, strip_default_none=config.strip_default_none, extra_template_data=extra_template_data, aliases=aliases, disable_timestamp=config.disable_timestamp, allow_population_by_field_name=config.allow_population_by_field_name, use_default_on_required_field=config.use_default, ) return Exit.OK except Error as e: print(str(e), file=sys.stderr) return Exit.ERROR except Exception: import traceback print(traceback.format_exc(), file=sys.stderr) return Exit.ERROR
def main(args: Optional[Sequence[str]] = None) -> Exit: """Main function.""" # add cli completion support argcomplete.autocomplete(arg_parser) if args is None: args = sys.argv[1:] namespace: Namespace = arg_parser.parse_args(args) if namespace.version: # pragma: no cover from datamodel_code_generator.version import version print(version) exit(0) if namespace.debug: # pragma: no cover enable_debug_message() extra_template_data: Optional[DefaultDict[str, Dict[str, Any]]] if namespace.extra_template_data is not None: with namespace.extra_template_data as data: try: extra_template_data = json.load( data, object_hook=lambda d: defaultdict(dict, **d)) except json.JSONDecodeError as e: print(f"Unable to load extra template data: {e}", file=sys.stderr) return Exit.ERROR else: extra_template_data = None if namespace.aliases is not None: with namespace.aliases as data: try: aliases = json.load(data) except json.JSONDecodeError as e: print(f"Unable to load alias mapping: {e}", file=sys.stderr) return Exit.ERROR if not isinstance(aliases, Dict) or not all( isinstance(k, str) and isinstance(v, str) for k, v in aliases.items()): print( 'Alias mapping must be a JSON string mapping (e.g. {"from": "to", ...})', file=sys.stderr, ) return Exit.ERROR else: aliases = None try: generate( input_name=namespace.input.name, input_text=namespace.input.read(), input_file_type=InputFileType(namespace.input_file_type), output=Path(namespace.output) if namespace.output is not None else None, target_python_version=PythonVersion( namespace.target_python_version), base_class=namespace.base_class, custom_template_dir=namespace.custom_template_dir, extra_template_data=extra_template_data, validation=namespace.validation, field_constraints=namespace.field_constraints, aliases=aliases, ) return Exit.OK except Error as e: print(str(e), file=sys.stderr) return Exit.ERROR except Exception: import traceback print(traceback.format_exc(), file=sys.stderr) return Exit.ERROR