From 321b6690eac41e9d5a6dd15cfe27bcb2073c066c Mon Sep 17 00:00:00 2001 From: Sina Atalay Date: Wed, 3 Jul 2024 02:10:35 +0300 Subject: [PATCH] reader: sort imports --- rendercv/reader/__init__.py | 16 ++++---- rendercv/reader/models/__init__.py | 5 ++- rendercv/reader/models/base.py | 10 +++++ rendercv/reader/models/computers.py | 2 +- rendercv/reader/models/curriculum_vitae.py | 27 ++++++------- rendercv/reader/models/design.py | 13 +++---- rendercv/reader/models/entry_types.py | 39 ++++++++----------- rendercv/reader/models/locale_catalog.py | 4 +- rendercv/reader/models/rendercv_data_model.py | 11 +++--- rendercv/reader/reader.py | 4 +- 10 files changed, 63 insertions(+), 68 deletions(-) create mode 100644 rendercv/reader/models/base.py diff --git a/rendercv/reader/__init__.py b/rendercv/reader/__init__.py index f039383a..f50ad232 100644 --- a/rendercv/reader/__init__.py +++ b/rendercv/reader/__init__.py @@ -12,30 +12,29 @@ The validators and data format of RenderCV are written using """ from .models import ( - CurriculumVitae, - SocialNetwork, - available_theme_options, BulletEntry, + CurriculumVitae, EducationEntry, + Entry, ExperienceEntry, + LocaleCatalog, NormalEntry, OneLineEntry, PublicationEntry, - LocaleCatalog, RenderCVDataModel, + SocialNetwork, + available_theme_options, format_date, ) - from .reader import ( create_a_sample_data_model, create_a_sample_yaml_input_file, - generate_json_schema_file, generate_json_schema, - set_or_update_a_value, + generate_json_schema_file, read_input_file, + set_or_update_a_value, ) - __all__ = [ "OneLineEntry", "BulletEntry", @@ -56,4 +55,5 @@ __all__ = [ "set_or_update_a_value", "read_input_file", "format_date", + "Entry", ] diff --git a/rendercv/reader/models/__init__.py b/rendercv/reader/models/__init__.py index 068d97df..84bcd644 100644 --- a/rendercv/reader/models/__init__.py +++ b/rendercv/reader/models/__init__.py @@ -1,8 +1,10 @@ +from .computers import format_date from .curriculum_vitae import CurriculumVitae, SocialNetwork from .design import available_theme_options from .entry_types import ( BulletEntry, EducationEntry, + Entry, ExperienceEntry, NormalEntry, OneLineEntry, @@ -10,8 +12,6 @@ from .entry_types import ( ) from .locale_catalog import LocaleCatalog from .rendercv_data_model import RenderCVDataModel -from .computers import format_date - __all__ = [ "OneLineEntry", @@ -26,4 +26,5 @@ __all__ = [ "RenderCVDataModel", "available_theme_options", "format_date", + "Entry" ] diff --git a/rendercv/reader/models/base.py b/rendercv/reader/models/base.py new file mode 100644 index 00000000..b4e9523c --- /dev/null +++ b/rendercv/reader/models/base.py @@ -0,0 +1,10 @@ +import pydantic + + +class RenderCVBaseModel(pydantic.BaseModel): + """This class is the parent class of all the data models in RenderCV. It has only + one difference from the default `pydantic.BaseModel`: It raises an error if an + unknown key is provided in the input file. + """ + + model_config = pydantic.ConfigDict(extra="forbid") diff --git a/rendercv/reader/models/computers.py b/rendercv/reader/models/computers.py index 02d83197..2e4de48b 100644 --- a/rendercv/reader/models/computers.py +++ b/rendercv/reader/models/computers.py @@ -5,9 +5,9 @@ calculate the time span between two dates, the date string, the URL of a social etc. """ +import re from datetime import date as Date from typing import Optional -import re from .locale_catalog import locale_catalog diff --git a/rendercv/reader/models/curriculum_vitae.py b/rendercv/reader/models/curriculum_vitae.py index 4c62520d..3ea50ed0 100644 --- a/rendercv/reader/models/curriculum_vitae.py +++ b/rendercv/reader/models/curriculum_vitae.py @@ -1,25 +1,20 @@ -from typing import Annotated, Any, Optional, get_args +import functools +import re +from typing import Annotated, Any, Literal, Optional, Type, get_args import pydantic -import functools - -from . import entry_types -from . import computers as cf - -from typing import Type, Literal -import re - import pydantic_extra_types.phone_numbers as pydantic_phone_numbers -from . import utilities as util -from . import entry_validators +from . import computers as computers +from . import entry_types +from .base import RenderCVBaseModel # ====================================================================================== # Create validator functions: ========================================================== # ====================================================================================== -class SectionBase(entry_types.RenderCVBaseModel): +class SectionBase(RenderCVBaseModel): """This class is the parent class of all the section types. It is being used in RenderCV internally, and it is not meant to be used directly by the users. It is used by `rendercv.data_models.utilities.create_a_section_model` function to @@ -296,7 +291,7 @@ available_social_networks = get_args(SocialNetworkName) # ====================================================================================== -class SocialNetwork(entry_types.RenderCVBaseModel): +class SocialNetwork(RenderCVBaseModel): """This class is the data model of a social network.""" network: SocialNetworkName = pydantic.Field( @@ -339,10 +334,10 @@ class SocialNetwork(entry_types.RenderCVBaseModel): """Return the URL of the social network and cache `url` as an attribute of the instance. """ - return cf.compute_social_network_url(self.network, self.username) + return computers.compute_social_network_url(self.network, self.username) -class CurriculumVitae(entry_validators.RenderCVBaseModel): +class CurriculumVitae(RenderCVBaseModel): """This class is the data model of the `cv` field.""" name: Optional[str] = pydantic.Field( @@ -394,7 +389,7 @@ class CurriculumVitae(entry_validators.RenderCVBaseModel): """Return all the connections of the person as a list of dictionaries and cache `connections` as an attribute of the instance. """ - connections = cf.compute_connections(self) + connections = computers.compute_connections(self) return connections diff --git a/rendercv/reader/models/design.py b/rendercv/reader/models/design.py index b632732d..111d2794 100644 --- a/rendercv/reader/models/design.py +++ b/rendercv/reader/models/design.py @@ -1,3 +1,6 @@ +import importlib +import importlib.util +import pathlib from typing import Annotated, Any, Type import pydantic @@ -6,14 +9,8 @@ from ...themes.classic import ClassicThemeOptions from ...themes.engineeringresumes import EngineeringresumesThemeOptions from ...themes.moderncv import ModerncvThemeOptions from ...themes.sb2nov import Sb2novThemeOptions - - -import pathlib -import importlib -import importlib.util - from . import entry_types - +from .base import RenderCVBaseModel # ====================================================================================== # Create validator functions: ========================================================== @@ -127,7 +124,7 @@ def validate_design_options( else: # Then it means there is no __init__.py file in the custom theme folder. # Create a dummy data model and use that instead. - class ThemeOptionsAreNotProvided(entry_types.RenderCVBaseModel): + class ThemeOptionsAreNotProvided(RenderCVBaseModel): theme: str = theme_name theme_data_model = ThemeOptionsAreNotProvided(theme=theme_name) diff --git a/rendercv/reader/models/entry_types.py b/rendercv/reader/models/entry_types.py index 28b2c8f6..3f2cfa2e 100644 --- a/rendercv/reader/models/entry_types.py +++ b/rendercv/reader/models/entry_types.py @@ -1,11 +1,12 @@ -from typing import Annotated, Literal, Optional -import pydantic import functools import re from datetime import date as Date -from .. import utilities as util -from . import computers as cf +from typing import Annotated, Literal, Optional +import pydantic + +from . import computers +from .base import RenderCVBaseModel # ====================================================================================== # Create validator functions: ========================================================== @@ -27,7 +28,7 @@ def validate_date_field(date: Optional[int | str]) -> Optional[int | str]: if re.fullmatch(r"\d{4}-\d{2}(-\d{2})?", date): # Then it is in YYYY-MM-DD or YYYY-MMY format # Check if it is a valid date: - util.get_date_object(date) + computers.get_date_object(date) elif re.fullmatch(r"\d{4}", date): # Then it is in YYYY format, so, convert it to an integer: @@ -64,7 +65,7 @@ def validate_start_and_end_date_fields( elif date != "present": # Validate the date: - util.get_date_object(date) + computers.get_date_object(date) return date @@ -98,14 +99,14 @@ def validate_and_adjust_dates_for_an_entry( start_date = None end_date = None elif start_date_is_provided: - start_date = util.get_date_object(start_date) + start_date = computers.get_date_object(start_date) if not end_date_is_provided: # If only start_date is provided, assume it is an ongoing event, i.e., # the end_date is present: end_date = "present" if end_date != "present": - end_date = util.get_date_object(end_date) + end_date = computers.get_date_object(end_date) if start_date > end_date: raise ValueError( @@ -159,16 +160,6 @@ EndDate = Annotated[ # Create the entry models: ============================================================= # ====================================================================================== - -class RenderCVBaseModel(pydantic.BaseModel): - """This class is the parent class of all the data models in RenderCV. It has only - one difference from the default `pydantic.BaseModel`: It raises an error if an - unknown key is provided in the input file. - """ - - model_config = pydantic.ConfigDict(extra="forbid") - - class OneLineEntry(RenderCVBaseModel): """This class is the data model of `OneLineEntry`.""" @@ -211,7 +202,9 @@ class EntryWithDate(RenderCVBaseModel): """Return a date string based on the `date` field and cache `date_string` as an attribute of the instance. """ - return cf.compute_date_string(start_date=None, end_date=None, date=self.date) + return computers.compute_date_string( + start_date=None, end_date=None, date=self.date + ) class PublicationEntryBase(RenderCVBaseModel): @@ -272,7 +265,7 @@ class PublicationEntryBase(RenderCVBaseModel): url_is_provided = self.url is not None if url_is_provided: - return util.make_a_url_clean(self.url) + return computers.make_a_url_clean(self.url) else: return "" @@ -347,7 +340,7 @@ class EntryBase(EntryWithDate): returns `#!python "Nov 2020 to Apr 2021"` """ - return cf.compute_date_string( + return computers.compute_date_string( start_date=self.start_date, end_date=self.end_date, date=self.date ) @@ -364,7 +357,7 @@ class EntryBase(EntryWithDate): returns `#!python "2020 to 2021"` """ - return cf.compute_date_string( + return computers.compute_date_string( start_date=self.start_date, end_date=self.end_date, date=self.date, @@ -376,7 +369,7 @@ class EntryBase(EntryWithDate): """Return a time span string based on the `date`, `start_date`, and `end_date` fields and cache `time_span_string` as an attribute of the instance. """ - return cf.compute_time_span_string( + return computers.compute_time_span_string( start_date=self.start_date, end_date=self.end_date, date=self.date ) diff --git a/rendercv/reader/models/locale_catalog.py b/rendercv/reader/models/locale_catalog.py index b3994c87..ff3f6608 100644 --- a/rendercv/reader/models/locale_catalog.py +++ b/rendercv/reader/models/locale_catalog.py @@ -3,10 +3,10 @@ from typing import Annotated, Optional import annotated_types as at import pydantic -from . import entry_types +from .base import RenderCVBaseModel -class LocaleCatalog(entry_types.RenderCVBaseModel): +class LocaleCatalog(RenderCVBaseModel): """This class is the data model of the locale catalog. The values of each field updates the `locale_catalog` dictionary. """ diff --git a/rendercv/reader/models/rendercv_data_model.py b/rendercv/reader/models/rendercv_data_model.py index ff9e0e1c..1fcdbe94 100644 --- a/rendercv/reader/models/rendercv_data_model.py +++ b/rendercv/reader/models/rendercv_data_model.py @@ -8,18 +8,17 @@ from typing import Optional import pydantic -from . import entry_types from ...themes.classic import ClassicThemeOptions -from .design import RenderCVDesign -from .curriculum_vitae import CurriculumVitae -from .locale_catalog import LocaleCatalog - # Disable Pydantic warnings: # warnings.filterwarnings("ignore") +from .base import RenderCVBaseModel +from .curriculum_vitae import CurriculumVitae +from .design import RenderCVDesign +from .locale_catalog import LocaleCatalog -class RenderCVDataModel(entry_types.RenderCVBaseModel): +class RenderCVDataModel(RenderCVBaseModel): """This class binds both the CV and the design information together.""" cv: CurriculumVitae = pydantic.Field( diff --git a/rendercv/reader/reader.py b/rendercv/reader/reader.py index af214dd3..24442f9f 100644 --- a/rendercv/reader/reader.py +++ b/rendercv/reader/reader.py @@ -4,12 +4,12 @@ generate a sample YAML input file and the JSON schema of RenderCV based on the d models defined in `rendercv.data_models.models`. """ +import io import json import pathlib from typing import Any, Optional -import io -import pydantic +import pydantic import ruamel.yaml from . import models