Skip to content

Commit

Permalink
Merge pull request #59 from Jonak-Adipta-Kalita/main
Browse files Browse the repository at this point in the history
config shit
  • Loading branch information
Jonak-Adipta-Kalita committed Jul 23, 2024
2 parents ee879b1 + a384324 commit 7ca6268
Show file tree
Hide file tree
Showing 7 changed files with 205 additions and 24 deletions.
50 changes: 47 additions & 3 deletions flomo/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,13 @@

import flomo.config as config
import flomo.errors as errors
import flomo.helpers as helpers
import flomo.tracker as tracker
import flomo.ui as ui

# TODO: Ability for users to see message.log file.
# TODO: Change Config data from a Command


@click.group(cls=click_aliases.ClickAliasedGroup)
def flomo():
Expand All @@ -30,9 +34,22 @@ def init():
conf.create_config()


default_tag, default_name = config.get_default_session_data()


@flomo.command(aliases=["s"])
@click.option("-t", "--tag", default="Default", help="Session tag name.")
@click.option("-n", "--name", default="Work", help="Session Name")
@click.option(
"-t",
"--tag",
help="Session tag name.",
default=default_tag,
)
@click.option(
"-n",
"--name",
help="Session Name",
default=default_name,
)
def start(tag: str, name: str):
"""
Start a Flowmodoro session.
Expand All @@ -43,7 +60,12 @@ def start(tag: str, name: str):
session_id = db.create_session(tag, name, datetime.datetime.now())
db.conn.close()
ui.main(tag.lower(), name, session_id)
except (errors.DBFileNotFoundError, errors.NoConfigError) as e:
except (
errors.DBFileNotFoundError,
errors.NoConfigError,
errors.InvalidConfigKeyError,
) as e:
# TODO: print(e) isnt printing anything
print(e)


Expand All @@ -59,6 +81,7 @@ def tracking():
errors.NoSessionsError,
errors.NoSessionError,
) as e:
helpers.message_log(str(e))
print(e)


Expand All @@ -76,6 +99,27 @@ def delete(session_id: str):
errors.DBFileNotFoundError,
errors.NoSessionError,
) as e:
helpers.message_log(str(e))
print(e)


@flomo.command(aliases=["ch"])
@click.argument("session_id")
@click.option("-t", "--tag", help="Session tag name.")
@click.option("-n", "--name", help="Session Name")
def change(session_id: str, tag: str | None, name: str | None):
"""
Change session data.
"""
try:
db = tracker.Tracker()
db.update_session(int(session_id), tag, name)
db.conn.close()
except (
errors.DBFileNotFoundError,
errors.NoSessionError,
) as e:
helpers.message_log(str(e))
print(e)


Expand Down
82 changes: 78 additions & 4 deletions flomo/config.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,92 @@
import json
import os

import flomo.errors as errors
import flomo.helpers as helpers

default_session_data = {
"tag": "Work",
"name": "Working",
}

tag_colors = {"Work": "red", "Study": "blue", "Exercise": "green"}


class Config:
def __init__(self, initializing: bool = False):
def __init__(
self, initializing: bool = False, get_default_session_data: bool = False
):
self.path = helpers.get_path("config.json", in_data=True)
self.do_check = not initializing and not get_default_session_data

if not initializing and not self._config_file_exists():
if self.do_check and self._get_missing_keys() != []:
raise errors.NoConfigError()

def _config_file_exists(self):
return os.path.exists(self.path) # TODO: Check if file contents are proper.
missing_keys = self._get_missing_keys()
return os.path.exists(self.path), missing_keys

def _get_missing_keys(self):
if not os.path.exists(self.path):
return ["default_session_data", "notification_priority", "tag_colors"]

with open(self.path, "r") as f:
data = json.load(f)
missing_keys = []

if (
"default_session_data" not in data
or data["default_session_data"].keys() != default_session_data.keys()
):
missing_keys.append("default_session_data")

if "notification_priority" not in data or data[
"notification_priority"
].lower() not in ["off", "normal", "high"]:
missing_keys.append("notification_priority")

if "tag_colors" not in data:
missing_keys.append("tag_colors")

return missing_keys

def create_config(self):
pass
file_exists, missing_keys = self._config_file_exists()
if file_exists and missing_keys == []:
return

if not os.path.exists(self.path):
with open(self.path, "w") as f:
json.dump({}, f)

with open(self.path, "r+") as f:
data = json.load(f)
for missing_key in missing_keys:
if missing_key == "default_session_data":
data[missing_key] = default_session_data
if missing_key == "notification_priority":
data[missing_key] = "normal"
if missing_key == "tag_colors":
data[missing_key] = tag_colors

f.seek(0)
json.dump(data, f, indent=4)

def get_config(self, key: str):
if key == "default_session_data" and not self._config_file_exists()[0]:
return default_session_data

try:
with open(self.path, "r") as f:
data = json.load(f)
return data[key]
except KeyError:
raise errors.InvalidConfigKeyError(key)


def get_default_session_data():
try:
conf = Config(get_default_session_data=True).get_config("default_session_data")
return conf["tag"], conf["name"]
except errors.InvalidConfigKeyError:
return default_session_data["tag"], default_session_data["name"]
5 changes: 5 additions & 0 deletions flomo/errors.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,11 @@ def __init__(self):
super().__init__("No config file found. Please run `flomo init`.")


class InvalidConfigKeyError(Exception):
def __init__(self, key: str):
super().__init__(f"Invalid config key: {key}.")


class NoSessionsError(Exception):
def __init__(self):
super().__init__("No sessions were found.")
Expand Down
34 changes: 25 additions & 9 deletions flomo/helpers.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
import datetime
import os
import platform

from playsound import playsound

import flomo.config as config
import flomo.errors as errors


def get_path(file_name: str, in_data: bool = False):
# TODO: Change data folder to documents folder (and the equivalent in other OSes).
dir_path = os.path.dirname(os.path.realpath(__file__))

sign = "\\" if platform.system().lower() == "windows" else "/"
Expand All @@ -20,14 +23,27 @@ def get_path(file_name: str, in_data: bool = False):


def play_sound():
path = get_path("beep.mp3")

if not platform.system().lower() in ["windows", "darwin"]:
os.system(
"notify-send 'Flomo' 'Time to start flowing!' -u normal && paplay " + path
)
else:
playsound(path)
try:
path = get_path("beep.mp3")
conf = config.Config()

notification_priority = str(conf.get_config("notification_priority"))

if notification_priority.lower() == "off":
return

if not platform.system().lower() in ["windows", "darwin"]:
priority = (
"critical" if notification_priority.lower() == "high" else "normal"
)
os.system(
f"notify-send 'Flomo' 'Time to start flowing!' -u {priority} && paplay "
+ path
)
else:
playsound(path)
except errors.NoConfigError:
pass # Error is already getting logged from ui.py


def message_log(message: str):
Expand Down
23 changes: 20 additions & 3 deletions flomo/tracker.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ def create_session(self, tag: str, name: str, start_time: datetime.datetime) ->
self.conn.commit()
return session_id

def update_session(self, session_id: int, end_time: datetime.datetime):
def end_session(self, session_id: int, end_time: datetime.datetime):
date_time = self.get_session(session_id)[1]
total_time = end_time - datetime.datetime.strptime(
date_time, "%Y-%m-%d %H:%M:%S"
Expand Down Expand Up @@ -65,14 +65,31 @@ def delete_session(self, session_id: int):
self.cursor.execute("DELETE FROM sessions WHERE id = ?", (session_id,))
self.conn.commit()

def update_session(self, session_id: int, tag: str | None, name: str | None):
if not self.get_session(session_id):
raise errors.NoSessionError(session_id)

if tag:
self.cursor.execute(
"UPDATE sessions SET tag = ? WHERE id = ?", (tag, session_id)
)
print(f"Tag updated to {tag} for session {session_id}")
if name:
self.cursor.execute(
"UPDATE sessions SET name = ? WHERE id = ?", (name, session_id)
)
print(f"Name updated to {name} for session {session_id}")
self.conn.commit()


def update_session(session_id: int):
def end_session(session_id: int):
db = Tracker()
db.update_session(session_id, datetime.datetime.now())
db.end_session(session_id, datetime.datetime.now())
db.conn.close()


def show_sessions():
# TODO: Use a proper UI to show the sessions
db = Tracker()
sessions = db.get_sessions()
db.conn.close()
Expand Down
21 changes: 19 additions & 2 deletions flomo/ui.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from rich.panel import Panel
from rich.text import Text

import flomo.config as config
import flomo.helpers as helpers
import flomo.tracker as tracker

Expand All @@ -26,11 +27,26 @@ def __init__(
self.close_live_panel = False

self.title = "Flomo - " + ("FLOWING" if self.status == 0 else "CHILLIN")
self.border_style = "bold blue" if self.status == 0 else "bold red"
self.border_style = (
f"bold {self._border_color()}" if self.status == 0 else "bold red"
)

self.terminal = blessed.Terminal()

def _border_color(self):
tag = self.tag.split("#")[1].lower()
tag_colors: dict[str, str] = {
k.lower(): v.lower()
for k, v in config.Config().get_config("tag_colors").items()
}

if tag in [i.lower() for i in tag_colors.keys()]:
return tag_colors[tag]

return "blue"

def generate_panel(self):
# TODO: Fix UI resize issue?
stuff = f"{self.name}\n[grey70]{self.tag}[/grey70]\n\n{helpers.format_time(
self.stopwatch if (self.status == 0) else self.chilling_time or 0)}\n\n\\[q] - {'break' if self.status == 0 else 'skip?'} [Ctrl+C] - quit"
content = Text.from_markup(stuff, justify="center", style="yellow")
Expand Down Expand Up @@ -93,6 +109,7 @@ def main(tag: str, name: str, session_id: int):

chilling_ui = UI(1, tag, name, int(chilling_time))
chilling_ui.show_live_panel()
# TODO: Fix skipping break issue
# chilling_panel_thread = threading.Thread(
# target=chilling_ui.show_live_panel, daemon=True)
# chilling_panel_thread.start()
Expand Down Expand Up @@ -124,5 +141,5 @@ def main(tag: str, name: str, session_id: int):
if isinstance(e, Exception):
helpers.message_log(f"{datetime.datetime.now()} - Error: {e}")
finally:
tracker.update_session(session_id)
tracker.end_session(session_id)
sys.exit()
14 changes: 11 additions & 3 deletions setup.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,19 @@
from setuptools import find_packages, setup

AUTHOR = "Dark Circles"
VERSION = "0.1.1"
VERSION = "1.0.0"
SHORT_DESCRIPTION = "A Flowmodoro CLI for producitivity enthusiasts."
AUTHOR_EMAIL = "<nibir@nibirsan.org>"
URL = "https://github.com/moiSentineL/flomo"
INSTALL_REQUIRES = ["click", "blessed", "rich", "playsound==1.2.2", "click-aliases"]
INSTALL_REQUIRES = [
"click",
"blessed",
"rich",
"playsound==1.2.2",
"click-aliases",
"pandas",
"tabulate",
]
PROJECT_URLS = {
"Documentation": "https://github.com/moiSentineL/flomo#flomo",
"Issue tracker": "https://github.com/moiSentineL/flomo/issues",
Expand All @@ -20,7 +28,7 @@
"Programming Language :: Python :: 3",
]

with open("README.md", "r") as fh:
with open("docs/README.md", "r") as fh:
LONG_DESCRIPTION = fh.read()

if __name__ == "__main__":
Expand Down

0 comments on commit 7ca6268

Please sign in to comment.