mirror of
https://github.com/gmbrax/Pilgrim.git
synced 2026-11-10 03:40:16 +00:00
Compare commits
9
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bdaa37e355 | ||
|
|
a540347127 | ||
|
|
fe35cb93bd | ||
|
|
3843be6e13 | ||
|
|
0adb230dd7 | ||
|
|
167c2d8928 | ||
|
|
5b0f894c88 | ||
|
|
2b851fc7c7 | ||
|
|
a3123fe322 |
+4
-1
@@ -5,7 +5,7 @@
|
||||
|
||||
[project]
|
||||
name = "Pilgrim"
|
||||
version = "0.0.3"
|
||||
version = "0.0.4"
|
||||
authors = [
|
||||
{ name="Gustavo Henrique Santos Souza de Miranda", email="gustavohssmiranda@gmail.com" }
|
||||
]
|
||||
@@ -20,6 +20,9 @@
|
||||
dependencies = [
|
||||
"sqlalchemy",
|
||||
"textual",
|
||||
"tomli",
|
||||
"tomli_w"
|
||||
|
||||
|
||||
]
|
||||
[template.plugins.default]
|
||||
|
||||
@@ -1,19 +1,20 @@
|
||||
from pilgrim.database import Database
|
||||
from pilgrim.service.servicemanager import ServiceManager
|
||||
from pilgrim.ui.ui import UIApp
|
||||
from pilgrim.utils import DirectoryManager
|
||||
from pilgrim.utils import ConfigManager
|
||||
|
||||
|
||||
class Application:
|
||||
def __init__(self):
|
||||
self.config_dir = DirectoryManager.get_config_directory()
|
||||
self.database = Database()
|
||||
self.config_manager = ConfigManager()
|
||||
self.database = Database(self.config_manager)
|
||||
session = self.database.session()
|
||||
session_manager = ServiceManager()
|
||||
session_manager.set_session(session)
|
||||
self.ui = UIApp(session_manager)
|
||||
self.ui = UIApp(session_manager,self.config_manager)
|
||||
|
||||
def run(self):
|
||||
self.config_manager.read_config()
|
||||
self.database.create()
|
||||
self.ui.run()
|
||||
|
||||
|
||||
+6
-27
@@ -5,38 +5,17 @@ from pathlib import Path
|
||||
import os
|
||||
import shutil
|
||||
|
||||
from pilgrim.utils import ConfigManager
|
||||
|
||||
Base = declarative_base()
|
||||
|
||||
def get_database_path() -> Path:
|
||||
"""
|
||||
Get the database file path following XDG Base Directory specification.
|
||||
Creates the directory if it doesn't exist.
|
||||
"""
|
||||
# Get home directory
|
||||
home = Path.home()
|
||||
|
||||
# Create .pilgrim directory if it doesn't exist
|
||||
pilgrim_dir = home / ".pilgrim"
|
||||
pilgrim_dir.mkdir(exist_ok=True)
|
||||
|
||||
# Database file path
|
||||
db_path = pilgrim_dir / "database.db"
|
||||
|
||||
# If database doesn't exist in new location but exists in current directory,
|
||||
# migrate it
|
||||
if not db_path.exists():
|
||||
current_db = Path("database.db")
|
||||
if current_db.exists():
|
||||
shutil.copy2(current_db, db_path)
|
||||
print(f"Database migrated from {current_db} to {db_path}")
|
||||
|
||||
return db_path
|
||||
|
||||
|
||||
class Database:
|
||||
def __init__(self):
|
||||
db_path = get_database_path()
|
||||
def __init__(self,config_manager:ConfigManager):
|
||||
db_path = config_manager.database_url
|
||||
self.engine = create_engine(
|
||||
f"sqlite:///{db_path}",
|
||||
f"sqlite:///{config_manager.database_url}",
|
||||
echo=False,
|
||||
connect_args={"check_same_thread": False},
|
||||
)
|
||||
|
||||
@@ -3,7 +3,7 @@ from textual.binding import Binding
|
||||
from textual.screen import Screen
|
||||
from textual.widgets import Header, Footer, Button, Label, TextArea
|
||||
from textual.containers import Container
|
||||
|
||||
from importlib.metadata import version
|
||||
class AboutScreen(Screen[bool]):
|
||||
"""Screen to display application information."""
|
||||
|
||||
@@ -20,7 +20,7 @@ class AboutScreen(Screen[bool]):
|
||||
self.app_title = Label("Pilgrim", id="AboutScreen_AboutTitle",classes="AboutScreen_AboutTitle")
|
||||
self.content = Label("A TUI Based Travel Diary Application", id="AboutScreen_AboutContent",
|
||||
classes="AboutScreen_AboutContent")
|
||||
self.version = Label("Version: 0.0.1", id="AboutScreen_AboutVersion",
|
||||
self.version = Label(f"Version: {version('Pilgrim')}", id="AboutScreen_AboutVersion",
|
||||
classes="AboutScreen_AboutVersion")
|
||||
self.developer = Label("Developed By: Gustavo Henrique Miranda ", id="AboutScreen_AboutAuthor")
|
||||
self.contact = Label("git.gustavomiranda.xyz", id="AboutScreen_AboutContact",
|
||||
|
||||
@@ -216,6 +216,7 @@ class DiaryListScreen(Screen):
|
||||
self.notify(f"Creation canceled...")
|
||||
|
||||
def _on_screen_resume(self) -> None:
|
||||
super()._on_screen_resume()
|
||||
self.refresh_diaries()
|
||||
|
||||
def action_edit_selected_diary(self):
|
||||
|
||||
@@ -9,6 +9,7 @@ from pilgrim.service.servicemanager import ServiceManager
|
||||
from pilgrim.ui.screens.about_screen import AboutScreen
|
||||
from pilgrim.ui.screens.diary_list_screen import DiaryListScreen
|
||||
from pilgrim.ui.screens.edit_entry_screen import EditEntryScreen
|
||||
from pilgrim.utils import ConfigManager
|
||||
|
||||
CSS_FILE_PATH = Path(__file__).parent / "styles" / "pilgrim.css"
|
||||
|
||||
@@ -16,9 +17,10 @@ CSS_FILE_PATH = Path(__file__).parent / "styles" / "pilgrim.css"
|
||||
class UIApp(App):
|
||||
CSS_PATH = CSS_FILE_PATH
|
||||
|
||||
def __init__(self,service_manager: ServiceManager, **kwargs):
|
||||
def __init__(self,service_manager: ServiceManager, config_manager: ConfigManager, **kwargs):
|
||||
super().__init__(**kwargs)
|
||||
self.service_manager = service_manager
|
||||
self.config_manager = config_manager
|
||||
|
||||
|
||||
def on_mount(self) -> None:
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
from .directory_manager import DirectoryManager
|
||||
from .config_manager import ConfigManager
|
||||
|
||||
__all__ = ['DirectoryManager']
|
||||
__all__ = ['DirectoryManager', 'ConfigManager']
|
||||
|
||||
@@ -0,0 +1,96 @@
|
||||
import os.path
|
||||
from os import PathLike
|
||||
from threading import Lock
|
||||
|
||||
import tomli
|
||||
import tomli_w
|
||||
|
||||
from pilgrim.utils import DirectoryManager
|
||||
|
||||
|
||||
class SingletonMeta(type):
|
||||
_instances = {}
|
||||
_lock: Lock = Lock()
|
||||
|
||||
def __call__(cls, *args, **kwargs):
|
||||
with cls._lock:
|
||||
if cls not in cls._instances:
|
||||
instance = super().__call__(*args, **kwargs)
|
||||
cls._instances[cls] = instance
|
||||
return cls._instances[cls]
|
||||
|
||||
|
||||
class ConfigManager(metaclass=SingletonMeta):
|
||||
def __init__(self):
|
||||
self.database_url = None
|
||||
self.database_type = None
|
||||
self.auto_open_diary = None
|
||||
self.auto_open_new_diary = None
|
||||
self.config_dir = DirectoryManager.get_config_directory()
|
||||
self.__data = None
|
||||
|
||||
def read_config(self):
|
||||
if os.path.exists(f"{DirectoryManager.get_config_directory()}/config.toml"):
|
||||
try:
|
||||
with open(f"{DirectoryManager.get_config_directory()}/config.toml", "rb") as f:
|
||||
data = tomli.load(f)
|
||||
print(data)
|
||||
except FileNotFoundError:
|
||||
print("Error: config.toml not found.")
|
||||
except tomli.TOMLDecodeError as e:
|
||||
print(f"Error decoding TOML: {e}")
|
||||
|
||||
self.__data = data
|
||||
self.database_url = self.__data["database"]["url"]
|
||||
self.database_type = self.__data["database"]["type"]
|
||||
|
||||
if self.__data["settings"]["diary"]["auto_open_diary_on_startup"] == "":
|
||||
self.auto_open_diary = None
|
||||
self.auto_open_new_diary = self.__data["settings"]["diary"]["auto_open_on_creation"]
|
||||
else:
|
||||
print("Error: config.toml not found.")
|
||||
self.create_config()
|
||||
self.read_config()
|
||||
|
||||
def create_config(self, config: dict = None):
|
||||
default = {
|
||||
"database": {
|
||||
"url": f"{DirectoryManager.get_config_directory()}/database.db",
|
||||
"type": "sqlite"
|
||||
},
|
||||
"settings": {
|
||||
"diary": {
|
||||
"auto_open_diary_on_startup": "",
|
||||
"auto_open_on_creation": False
|
||||
}
|
||||
}
|
||||
}
|
||||
if config is None:
|
||||
config = default
|
||||
try:
|
||||
with open(f"{DirectoryManager.get_config_directory()}/config.toml", "wb") as f:
|
||||
tomli_w.dump(config, f)
|
||||
except FileNotFoundError:
|
||||
print("Error: config.toml not found.")
|
||||
|
||||
def save_config(self):
|
||||
if self.__data is None:
|
||||
self.read_config()
|
||||
self.__data["database"]["url"] = self.database_url
|
||||
self.__data["database"]["type"] = self.database_type
|
||||
self.__data["settings"]["diary"]["auto_open_diary_on_startup"] = self.auto_open_diary or ""
|
||||
self.__data["settings"]["diary"]["auto_open_on_creation"] = self.auto_open_new_diary
|
||||
|
||||
self.create_config(self.__data)
|
||||
|
||||
def set_config_dir(self, value):
|
||||
self.config_dir = value
|
||||
|
||||
def set_database_url(self, value: str):
|
||||
self.database_url = value
|
||||
|
||||
def set_auto_open_diary(self, value: str):
|
||||
self.auto_open_diary = value
|
||||
|
||||
def set_auto_open_new_diary(self, value: bool):
|
||||
self.auto_open_new_diary = value
|
||||
@@ -1,4 +1,5 @@
|
||||
import os
|
||||
import shutil
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
@@ -37,3 +38,26 @@ class DirectoryManager:
|
||||
def get_diary_images_directory(directory_name: str) -> Path:
|
||||
"""Returns the images directory path for a specific diary."""
|
||||
return DirectoryManager.get_diary_data_directory(directory_name) / "images"
|
||||
|
||||
@staticmethod
|
||||
def get_database_path() -> Path:
|
||||
"""
|
||||
Get the database file path following XDG Base Directory specification.
|
||||
Creates the directory if it doesn't exist.
|
||||
"""
|
||||
|
||||
pilgrim_dir = DirectoryManager.get_config_directory()
|
||||
pilgrim_dir.mkdir(exist_ok=True)
|
||||
|
||||
# Database file path
|
||||
db_path = pilgrim_dir / "database.db"
|
||||
|
||||
# If database doesn't exist in new location but exists in current directory,
|
||||
# migrate it
|
||||
if not db_path.exists():
|
||||
current_db = Path("database.db")
|
||||
if current_db.exists():
|
||||
shutil.copy2(current_db, db_path)
|
||||
print(f"Database migrated from {current_db} to {db_path}")
|
||||
|
||||
return db_path
|
||||
|
||||
Reference in New Issue
Block a user