From f9883da0be64b955f0e810269241bd838d106b54 Mon Sep 17 00:00:00 2001 From: Christian Staudt Date: Thu, 8 Sep 2022 14:16:44 +0200 Subject: [PATCH] bring back pandera schema --- requirements.txt | 1 + tuttle/calendar.py | 12 +++++------ tuttle/schema.py | 46 +++++++++++++++++++++--------------------- tuttle/timetracking.py | 28 ++++++++++++------------- 4 files changed, 44 insertions(+), 43 deletions(-) diff --git a/requirements.txt b/requirements.txt index 693d11d1..dc6f4fe6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,3 +10,4 @@ ics babel loguru pdfkit +pandera diff --git a/tuttle/calendar.py b/tuttle/calendar.py index 165571df..2024075b 100644 --- a/tuttle/calendar.py +++ b/tuttle/calendar.py @@ -9,11 +9,11 @@ import pandas import datetime -# from pandera.typing import DataFrame -# from pandera import check_io +from pandera.typing import DataFrame +from pandera import check_io from pandas import DataFrame -# from . import schema +from . import schema def parse_pyicloud_datetime(dt_list): @@ -28,7 +28,7 @@ class Calendar: def __init__(self, name: str): self.name = name - # @check_io(out=schema.time_tracking) + @check_io(out=schema.time_tracking) def to_data(self) -> DataFrame: """Convert events to dataframe.""" raise NotImplementedError("Abstract base class") @@ -72,7 +72,7 @@ def to_raw_data(self) -> DataFrame: ) return event_data_raw - # @check_io(out=schema.time_tracking) + @check_io(out=schema.time_tracking) def to_data(self) -> DataFrame: """Convert ics.Calendar to pandas.DataFrame""" event_data = pandas.DataFrame( @@ -129,7 +129,7 @@ def to_raw_data(self) -> DataFrame: event_data_raw = pandas.DataFrame(all_events) return event_data_raw - # @check_io(out=schema.time_tracking) + @check_io(out=schema.time_tracking) def to_data(self) -> DataFrame: """Convert iCloud calendar events to time tracking data format.""" diff --git a/tuttle/schema.py b/tuttle/schema.py index 2ff50364..aba3b783 100644 --- a/tuttle/schema.py +++ b/tuttle/schema.py @@ -1,26 +1,26 @@ -# """Pandera schemata.""" -# from pandera import ( -# SchemaModel, -# DataFrameSchema, -# Column, -# Index, -# DateTime, -# Timedelta, -# String, -# ) +"""Pandera schemata.""" +from pandera import ( + SchemaModel, + DataFrameSchema, + Column, + Index, + DateTime, + Timedelta, + String, +) -# time_tracking = DataFrameSchema( -# # TODO: fix datetime type -# # index=Index(DateTime, name="begin", allow_duplicates=True), -# columns={ -# # "begin": Column(Timestamp, nullable=True), -# # "end": Column(DateTime, nullable=True), -# "title": Column(String, nullable=True), -# "tag": Column(String), -# "description": Column(String, nullable=True), -# "duration": Column(Timedelta), -# }, -# ) +time_tracking = DataFrameSchema( + # TODO: fix datetime type + # index=Index(DateTime, name="begin", allow_duplicates=True), + columns={ + # "begin": Column(Timestamp, nullable=True), + # "end": Column(DateTime, nullable=True), + "title": Column(String, nullable=True), + "tag": Column(String), + "description": Column(String, nullable=True), + "duration": Column(Timedelta), + }, +) -# time_planning = time_tracking # REVIEW: identical? +time_planning = time_tracking # REVIEW: identical? diff --git a/tuttle/timetracking.py b/tuttle/timetracking.py index 672d4117..eff83632 100644 --- a/tuttle/timetracking.py +++ b/tuttle/timetracking.py @@ -8,12 +8,12 @@ import pandas -# from pandera import check_io -# from pandera.typing import DataFrame +from pandera import check_io +from pandera.typing import DataFrame from pandas import DataFrame -# from . import schema +from . import schema from .calendar import Calendar, ICloudCalendar, FileCalendar from .model import ( TimeTrackingItem, @@ -113,7 +113,7 @@ def export_timesheet( # IMPORT -# @check_io(out=schema.time_tracking) +@check_io(out=schema.time_tracking) def import_from_calendar(cal: Calendar) -> DataFrame: """Convert the raw calendar to time tracking data table.""" if issubclass(type(cal), ICloudCalendar): @@ -135,9 +135,9 @@ class Toggl: description_col = "Description" -# @check_io( -# out=schema.time_tracking, -# ) +@check_io( + out=schema.time_tracking, +) def import_from_spreadsheet( path, preset: str = None, @@ -223,9 +223,9 @@ def total_time_tracked(by: str) -> DataFrame: raise ValueError() -# @check_io( -# time_tracking_data=schema.time_tracking, -# ) +@check_io( + time_tracking_data=schema.time_tracking, +) def progress( project: Project, time_tracking_data: DataFrame, @@ -242,9 +242,9 @@ def progress( return total_time.loc[tag]["duration"] / budget -# @check_io( -# out=schema.time_planning, -# ) +@check_io( + out=schema.time_planning, +) def get_time_planning_data( source, from_date: datetime.date = None, @@ -257,6 +257,6 @@ def get_time_planning_data( planning_data = cal.to_data() elif isinstance(source, pandas.DataFrame): planning_data = source - # schema.time_tracking.validate(planning_data) + schema.time_tracking.validate(planning_data) planning_data = planning_data[str(from_date) :] return planning_data