Revert "Refactor/refactoring basics"

This commit is contained in:
Gustavo Henrique Miranda 2025-06-25 18:35:13 -03:00 committed by GitHub
parent cad6a93dd4
commit 5ca035ac7d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
28 changed files with 179 additions and 480 deletions

View File

@ -1,11 +0,0 @@
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file
version: 2
updates:
- package-ecosystem: "pip" # See documentation for possible values
directory: "/" # Location of package manifests
schedule:
interval: "weekly"

View File

@ -1,24 +0,0 @@
name: Pylint
on: [push]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.10"]
steps:
- uses: actions/checkout@v4
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v3
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: |
python -m pip install --upgrade pip
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
pip install pylint
- name: Analysing the code with pylint
run: |
pylint --disable=C0114,C0115,C0116 --exit-zero $(git ls-files '*.py')

144
.gitignore vendored
View File

@ -1,144 +1,2 @@
# Database files
database.db
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
cover/
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
build/
temp/
# PyBuilder
target/
# Jupyter Notebook
.ipynb_checkpoints
# IPython
profile_default/
ipython_config.py
# pyenv
.python-version
# pipenv
Pipfile.lock
# poetry
poetry.lock
# PEP 582; used by e.g. github.com/David-OConnor/pyflow
__pypackages__/
# Celery stuff
celerybeat-schedule
celerybeat.pid
# SageMath parsed files
*.sage.py
# Environments
.env
.env.*
.venv
venv/
ENV/
env/
env.bak/
venv.bak/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
.dmypy.json
dmypy.json
# Pyre type checker
.pyre/
# pytype static type analyzer
.pytype/
# Cython debug symbols
cython_debug/
# IDE settings
.vscode/
.idea/
__pycache__

10
.idea/Pilgrim.iml Normal file
View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/.venv" />
</content>
<orderEntry type="jdk" jdkName="Python 3.10 (Pilgrim)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

View File

@ -0,0 +1,6 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>

8
.idea/modules.xml Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/Pilgrim.iml" filepath="$PROJECT_DIR$/.idea/Pilgrim.iml" />
</modules>
</component>
</project>

6
.idea/vcs.xml Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

117
.idea/workspace.xml Normal file
View File

@ -0,0 +1,117 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AutoImportSettings">
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="ChangeListManager">
<list default="true" id="0a7f92e2-b44a-4dfe-8e01-136d1c0c18be" name="Changes" comment="">
<change afterPath="$PROJECT_DIR$/.idea/Pilgrim.iml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/inspectionProfiles/profiles_settings.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/modules.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/vcs.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/Application/Application.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/Application/__init__.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/Database/Database.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/Database/__init__.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/Models/TravelDiary/TravelDiary.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/Models/TravelDiary/__init__.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/Models/__init__.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main.py" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="FileTemplateManagerImpl">
<option name="RECENT_TEMPLATES">
<list>
<option value="Python Script" />
</list>
</option>
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="ProjectColorInfo"><![CDATA[{
"associatedIndex": 0
}]]></component>
<component name="ProjectId" id="2y0y1J9RlHT6m1qL5RuCBf0Ramp" />
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent"><![CDATA[{
"keyToString": {
"ModuleVcsDetector.initialDetectionPerformed": "true",
"Python.Database.executor": "Run",
"Python.main.executor": "Run",
"RunOnceActivity.ShowReadmeOnStart": "true",
"RunOnceActivity.git.unshallow": "true",
"git-widget-placeholder": "master",
"node.js.detected.package.eslint": "true",
"node.js.detected.package.tslint": "true",
"node.js.selected.package.eslint": "(autodetect)",
"node.js.selected.package.tslint": "(autodetect)",
"nodejs_package_manager_path": "npm",
"vue.rearranger.settings.migration": "true"
}
}]]></component>
<component name="RunManager">
<configuration name="main" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
<module name="Pilgrim" />
<option name="ENV_FILES" value="" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/src" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/src/main.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<recent_temporary>
<list>
<item itemvalue="Python.main" />
</list>
</recent_temporary>
</component>
<component name="SharedIndexes">
<attachedChunks>
<set>
<option value="bundled-js-predefined-d6986cc7102b-6a121458b545-JavaScript-PY-251.25410.159" />
<option value="bundled-python-sdk-e0ed3721d81e-36ea0e71a18c-com.jetbrains.pycharm.pro.sharedIndexes.bundled-PY-251.25410.159" />
</set>
</attachedChunks>
</component>
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="0a7f92e2-b44a-4dfe-8e01-136d1c0c18be" name="Changes" comment="" />
<created>1748985568579</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1748985568579</updated>
<workItem from="1748985569621" duration="2124000" />
</task>
<servers />
</component>
<component name="TypeScriptGeneratedFilesManager">
<option name="version" value="3" />
</component>
<component name="com.intellij.coverage.CoverageDataManagerImpl">
<SUITE FILE_PATH="coverage/Pilgrim$Database.coverage" NAME="Database Coverage Results" MODIFIED="1748987101492" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/src/Database" />
<SUITE FILE_PATH="coverage/Pilgrim$main.coverage" NAME="main Coverage Results" MODIFIED="1748987594893" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/src" />
</component>
</project>

View File

@ -1,50 +1,3 @@
# Python_Pilgrim
## Overview
**Python_Pilgrim** is a Python-based travel diary application designed to help users document and manage their travel experiences. The project provides tools for recording trips, organizing travel notes, and storing memories in a structured and accessible format.
## Features
- Create and manage travel diaries
- Add, edit, and delete travel entries
- Organize trips by date, location, or theme
- Store photos, notes, and other media
- Export and share travel logs
## Requirements
- Python 3.8 or higher
- Linux operating system (tested on Ubuntu 20.04+)
- Visual Studio Code (VSCode) for development (optional but strongly recommended)
- pip (Python package installer)
- Optional: virtualenv for isolated environments
## Installation
1. Clone the repository:
```bash
git clone https://github.com/gmbrax/Pilgrim.git
```
2. Navigate to the project directory:
```bash
cd Pilgrim
```
3. Create a virtual environment and, then, activate it:
```bash
python -m venv .venv
source .venv/bin/activate
```
4. Install the required dependencies:
```bash
pip install -r requirements.txt
```
## Usage
To run the main application, execute:
```bash
python <???>.py
```
This will start the Python_Pilgrim application. Follow the on-screen instructions to create and manage your travel diaries.
Python Based Travel Diary

View File

@ -26,6 +26,6 @@ src-layout = true
Homepage = "https://git.gustavomiranda.xyz/GHMiranda/Pilgrim"
Issues = "https://git.gustavomiranda.xyz/GHMiranda/Pilgrim"
[tool.hatch.build.targets.wheel]
packages = ["src/pilgrim"]
packages = ["src/Pilgrim"]
[project.scripts]
pilgrim = "pilgrim:main"
pilgrim = "Pilgrim:main"

View File

@ -1,3 +0,0 @@
greenlet==3.2.3
SQLAlchemy==2.0.41
typing_extensions==4.14.0

View File

@ -0,0 +1,9 @@
from Pilgrim.Database import Database
class Application:
def __init__(self):
self.database = Database()
def run(self):
self.database.create()

View File

@ -4,6 +4,7 @@ from sqlalchemy.orm import sessionmaker
Base = declarative_base()
class Database:
def __init__(self):
self.engine = create_engine(
@ -11,10 +12,10 @@ class Database:
echo=False,
connect_args={"check_same_thread": False},
)
self.session = sessionmaker(bind=self.engine, autoflush=False, autocommit=False)
self.Session = sessionmaker(bind=self.engine, autoflush=False, autocommit=False)
def create(self):
Base.metadata.create_all(self.engine)
def get_db(self):
return self.session()
return self.Session()

View File

@ -0,0 +1,9 @@
from sqlalchemy import Column, String, Integer
from Pilgrim import Application, Base
class TravelDiary(Base):
__tablename__ = "TravelDiary"
id = Column(Integer, primary_key=True)
name = Column(String)

6
src/Pilgrim/__init__.py Normal file
View File

@ -0,0 +1,6 @@
from Pilgrim.Application import Application
from Pilgrim.command import main
from Pilgrim.Database import Database, Base
from Pilgrim.TravelDiary import TravelDiary
__all__ = ["Application", "Database", "TravelDiary", "main", "Base"]

View File

@ -1,4 +1,4 @@
from src.application import Application
from Pilgrim import Application
def main():

View File

View File

@ -1,16 +0,0 @@
from src.database import Database
from src.service.servicemanager import ServiceManager
class Application:
def __init__(self):
self.database = Database()
def run(self):
self.database.create()
def get_service_manager(self):
session = self.database.session()
session_manager = ServiceManager()
session_manager.set_session(session)
return session_manager

View File

View File

@ -1,26 +0,0 @@
from typing import Any
from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship
from src.models.photo_in_entry import photo_entry_association
from src.database import Base
class Entry(Base):
__tablename__ = "entries"
id = Column(Integer, primary_key=True)
title = Column(String)
text = Column(String)
date = Column(String)
photos = relationship(
"Photo",
secondary=photo_entry_association,
back_populates="entries")
fk_travel_diary_id = Column(Integer, ForeignKey("travel_diaries.id"),nullable=False)
def __init__(self, title: str, text: str, date: str, travel_diary_id: int, **kw: Any):
super().__init__(**kw)
self.title = title
self.text = text
self.date = date
self.fk_travel_diary_id = travel_diary_id

View File

@ -1,31 +0,0 @@
from typing import Any
from sqlalchemy.orm import relationship
from sqlalchemy import Column, Integer, String, ForeignKey
from src.models.photo_in_entry import photo_entry_association
from src.database import Base
class Photo(Base):
__tablename__ = "photos"
id = Column(Integer, primary_key=True)
filepath = Column(String)
name = Column(String)
addition_date = Column(String)
caption = Column(String)
entries = relationship(
"Entry",
secondary=photo_entry_association,
back_populates="photos"
)
fk_travel_diary_id = Column(Integer, ForeignKey("travel_diaries.id"),nullable=False)
def __init__(self, filepath, name, addition_date=None, caption=None, entries=None, **kw: Any):
super().__init__(**kw)
self.filepath = filepath
self.name = name
self.addition_date = addition_date
self.caption = caption
self.entries = entries

View File

@ -1,8 +0,0 @@
from sqlalchemy import Table, Column, Integer, ForeignKey
from src.database import Base
photo_entry_association = Table('photo_entry_association', Base.metadata,
Column('id', Integer, primary_key=True, autoincrement=True),
Column('fk_photo_id', Integer, ForeignKey('photos.id'),nullable=False),
Column('fk_entry_id', Integer, ForeignKey('entries.id'),nullable=False))

View File

@ -1,15 +0,0 @@
from typing import Any
from src.database import Base
from sqlalchemy import Column, String, Integer
class TravelDiary(Base):
__tablename__ = "travel_diaries"
id = Column(Integer, primary_key=True)
name = Column(String)
def __init__(self, name: str, **kw: Any):
super().__init__(**kw)
self.name = name

View File

@ -1,48 +0,0 @@
from typing import List
from src.models.entry import Entry
from src.models.travel_diary import TravelDiary
class EntryService:
def __init__(self,session):
self.session = session
def create(self, travel_diary_id:int, title: str, text: str, date: str, ):
travel_diary = self.session.query(TravelDiary).filter(TravelDiary.id == travel_diary_id).first()
if not travel_diary:
return None
new_entry = Entry(title,text,date,travel_diary_id)
self.session.add(new_entry)
self.session.commit()
self.session.refresh(new_entry)
return new_entry
def read_by_id(self,entry_id:int)->Entry:
entry = self.session.query(Entry).filter(Entry.id == entry_id).first()
return entry
def read_all(self)-> List[Entry]:
entries = self.session.query(Entry).all()
return entries
def update(self,entry_src:Entry,entry_dst:Entry) -> Entry | None:
original:Entry = self.read_by_id(entry_src.id)
if original:
original.title = entry_dst.title
original.text = entry_dst.text
original.date = entry_dst.date
original.fk_travel_diary_id = entry_dst.fk_travel_diary_id
original.photos = entry_dst.photos
self.session.commit()
self.session.refresh(original)
return original
return None
def delete(self,entry_src:Entry)-> Entry | None:
excluded = self.read_by_id(entry_src.id)
if excluded is not None:
self.session.delete(excluded)
self.session.commit()
return excluded
return None

View File

@ -1,48 +0,0 @@
from pathlib import Path
from typing import List
from src.models.photo import Photo
from src.models.travel_diary import TravelDiary
class PhotoService:
def __init__(self, session):
self.session = session
def create(self, filepath:Path, name:str, travel_diary_id, addition_date=None, caption=None, ) -> Photo | None:
travel_diary = self.session.query(TravelDiary).filter(TravelDiary.id == travel_diary_id).first()
if not travel_diary:
return None
new_photo = Photo(filepath, name, addition_date=addition_date, caption=caption)
self.session.add(new_photo)
self.session.commit()
self.session.refresh(new_photo)
return new_photo
def read_by_id(self, photo_id:int) -> Photo:
return self.session.query(Photo).get(photo_id)
def read_all(self) -> List[Photo]:
return self.session.query(Photo).all()
def update(self,photo_src:Photo,photo_dst:Photo) -> Photo | None:
original:Photo = self.read_by_id(photo_src.id)
if original:
original.filepath = photo_dst.filepath
original.name = photo_dst.name
original.addition_date = photo_dst.addition_date
original.caption = photo_dst.caption
original.entries.extend(photo_dst.entries)
self.session.commit()
self.session.refresh(original)
return original
return None
def delete(self, photo_src:Photo) -> Photo | None:
excluded = self.read_by_id(photo_src.id)
if excluded:
self.session.delete(excluded)
self.session.commit()
self.session.refresh(excluded)
return excluded
return None

View File

@ -1,19 +0,0 @@
from src.service.entry_service import EntryService
from src.service.travel_diary_service import TravelDiaryService
class ServiceManager:
def __init__(self):
self.session = None
def set_session(self, session):
self.session = session
def get_session(self):
return self.session
def get_entry_service(self):
if self.session is not None:
return EntryService(self.session)
return None
def get_travel_diary_service(self):
if self.session is not None:
return TravelDiaryService(self.session)
return None

View File

@ -1,35 +0,0 @@
from src.models.travel_diary import TravelDiary
class TravelDiaryService:
def __init__(self,session):
self.session = session
def create(self, name:str):
new_travel_diary = TravelDiary(name)
self.session.add(new_travel_diary)
self.session.commit()
self.session.refresh(new_travel_diary)
return new_travel_diary
def read_by_id(self, travel_id:int):
return self.session.query(TravelDiary).get(travel_id)
def read_all(self):
return self.session.query(TravelDiary).all()
def update(self, travel_diary_src:TravelDiary,travel_diary_dst:TravelDiary):
original = self.read_by_id(travel_diary_src.id)
if original is not None:
original.name = travel_diary_dst.name
self.session.commit()
self.session.refresh(original)
return original
def delete(self, travel_diary_src:TravelDiary):
excluded = self.read_by_id(travel_diary_src.id)
if excluded is not None:
self.session.delete(travel_diary_src)
self.session.commit()
return excluded
return None