mirror of
https://github.com/gmbrax/Pilgrim.git
synced 2026-11-10 13:00:17 +00:00
Compare commits
17
Commits
@@ -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')
|
||||
@@ -0,0 +1,63 @@
|
||||
name: Pylint and SonarCloud
|
||||
on:
|
||||
push:
|
||||
branches: [ main, master, staging ]
|
||||
pull_request:
|
||||
branches: [ main, master, staging ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
python-version: ["3.10"]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0 # Necessário para SonarCloud
|
||||
|
||||
- name: Set up Python ${{ matrix.python-version }}
|
||||
uses: actions/setup-python@v4
|
||||
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 ruff coverage pytest
|
||||
|
||||
- name: Analysing the code with pylint (console output)
|
||||
run: |
|
||||
pylint --disable=C0114,C0115,C0116 --exit-zero $(git ls-files '*.py') || true
|
||||
|
||||
- name: Generate Pylint report for SonarCloud
|
||||
run: |
|
||||
pylint --disable=C0114,C0115,C0116 --output-format=json --exit-zero $(git ls-files '*.py') > pylint-report.json || true
|
||||
|
||||
- name: Run Ruff
|
||||
run: |
|
||||
ruff check --output-format=json . > ruff-report.json || true
|
||||
|
||||
- name: Run tests with coverage (if you have tests)
|
||||
run: |
|
||||
if [ -d "tests" ] || [ -f "test_*.py" ] || [ -f "*_test.py" ]; then
|
||||
coverage run -m pytest || true
|
||||
coverage xml || true
|
||||
else
|
||||
echo "No tests found, skipping coverage"
|
||||
fi
|
||||
|
||||
- name: SonarCloud Scan
|
||||
uses: SonarSource/sonarqube-scan-action@v5.0.0
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
|
||||
with:
|
||||
args: >
|
||||
-Dsonar.projectKey=gmbrax_Pilgrim
|
||||
-Dsonar.organization=gmbrax
|
||||
-Dsonar.python.pylint.reportPaths=pylint-report.json
|
||||
-Dsonar.python.ruff.reportPaths=ruff-report.json
|
||||
-Dsonar.python.coverage.reportPaths=coverage.xml
|
||||
+47
-30
@@ -1,51 +1,68 @@
|
||||
# Changelog
|
||||
|
||||
All notable changes to this project will be documented in this file.
|
||||
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
|
||||
|
||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||
## Unreleased
|
||||
|
||||
## [Unreleased]
|
||||
## Planned
|
||||
* Installation Method 1 (repository compilation)
|
||||
* Organization of trips by date, location, or theme
|
||||
* Enhanced photo management features
|
||||
* Search functionality
|
||||
* Export features
|
||||
* Testing implementation
|
||||
|
||||
### Planned
|
||||
## [0.0.4] - 2025-07-19
|
||||
|
||||
- Installation Method 1 (repository compilation)
|
||||
- Organization of trips by date, location, or theme
|
||||
- Enhanced photo management features
|
||||
- Search functionality
|
||||
- Export features
|
||||
- Testing implementation
|
||||
### Added
|
||||
* Support for creating new diaries asynchronously, with an option to automatically open the newly created diary
|
||||
* Unified "Enter" key support for saving or creating diaries across relevant modals
|
||||
* Automatic diary list refresh when returning to the diary screen
|
||||
* Application configuration management with a new centralized config system
|
||||
* Database location and initialization now configurable via the new config manager
|
||||
* Automatic migration of database file to the configuration directory
|
||||
* Display of database URL on application startup for transparency
|
||||
* Duplicate photo detection before photo creation to prevent redundant entries
|
||||
* Photo hash indexing to improve photo lookup performance
|
||||
|
||||
### Changed
|
||||
* Enhanced feedback and validation when editing or creating diary names
|
||||
* Streamlined and unified save logic for diary modals, reducing duplicated behavior
|
||||
* About screen now displays the actual installed application version dynamically
|
||||
* Sidebar and photo-related UI text updated to remove emoji icons for a cleaner appearance
|
||||
* Sidebar layout and scrolling behavior improved for better usability
|
||||
* Photo hash generation now relies on existing service-provided hashes instead of local computation
|
||||
|
||||
### Improved
|
||||
* Enhanced feedback and validation when editing or creating diary names
|
||||
* Streamlined and unified save logic for diary modals, reducing duplicated behavior
|
||||
* Sidebar layout and scrolling behavior for better usability
|
||||
|
||||
## [0.0.3] - 2025-07-07
|
||||
|
||||
### Changed
|
||||
- Removed the dependency on textual-dev from pyproject.toml
|
||||
* Removed the dependency on textual-dev from pyproject.toml
|
||||
|
||||
## [0.0.2] - 2025-07-07
|
||||
|
||||
### Changed
|
||||
- Changed the license in pyproject.toml to BSD
|
||||
* Changed the license in pyproject.toml to BSD
|
||||
|
||||
## [0.0.1] - 2025-07-06
|
||||
|
||||
### Added
|
||||
|
||||
- Initial alpha release of Pilgrim travel diary application
|
||||
- Create and edit travel diaries
|
||||
- Create and edit diary entries
|
||||
- Photo ingestion system
|
||||
- Photo addition and reference via sidebar
|
||||
- Text User Interface (TUI) built with Textual framework
|
||||
- Pre-compiled binary installation method (Method 2)
|
||||
- Support for Linux operating systems
|
||||
- Basic project documentation (README)
|
||||
* Initial alpha release of Pilgrim travel diary application
|
||||
* Create and edit travel diaries
|
||||
* Create and edit diary entries
|
||||
* Photo ingestion system
|
||||
* Photo addition and reference via sidebar
|
||||
* Text User Interface (TUI) built with Textual framework
|
||||
* Pre-compiled binary installation method (Method 2)
|
||||
* Support for Linux operating systems
|
||||
* Basic project documentation (README)
|
||||
|
||||
### Known Issues
|
||||
|
||||
- Installation Method 1 not yet implemented
|
||||
- No testing suite implemented yet
|
||||
- Some features may be unstable in an alpha version
|
||||
|
||||
[Unreleased]: https://github.com/username/pilgrim/compare/v0.0.1...HEAD
|
||||
|
||||
[0.0.1]: https://github.com/username/pilgrim/releases/tag/v0.0.1
|
||||
* Installation Method 1 not yet implemented
|
||||
* No testing suite implemented yet
|
||||
* Some features may be unstable in an alpha version
|
||||
|
||||
+29
-33
@@ -1,36 +1,32 @@
|
||||
[build-system]
|
||||
requires = ["hatchling"]
|
||||
build-backend = "hatchling.build"
|
||||
[build-system]
|
||||
requires = ["hatchling"]
|
||||
build-backend = "hatchling.build"
|
||||
|
||||
[project]
|
||||
name = "pilgrim"
|
||||
version = "0.0.4"
|
||||
authors = [
|
||||
{ name="Gustavo Henrique Santos Souza de Miranda", email="gustavohssmiranda@gmail.com" }
|
||||
]
|
||||
description = "Pilgrim's Travel Log"
|
||||
readme = "README.md"
|
||||
requires-python = ">=3.10"
|
||||
classifiers = [
|
||||
"Programming Language :: Python :: 3",
|
||||
"License :: OSI Approved :: BSD License",
|
||||
"Operating System :: OS Independent",
|
||||
]
|
||||
dependencies = [
|
||||
"sqlalchemy",
|
||||
"textual",
|
||||
"tomli",
|
||||
"tomli_w",
|
||||
"unidecode"
|
||||
]
|
||||
|
||||
[project]
|
||||
name = "Pilgrim"
|
||||
version = "0.0.4"
|
||||
authors = [
|
||||
{ name="Gustavo Henrique Santos Souza de Miranda", email="gustavohssmiranda@gmail.com" }
|
||||
]
|
||||
description = "Pilgrim's Travel Log"
|
||||
readme = "README.md"
|
||||
requires-python = ">=3.10"
|
||||
classifiers = [
|
||||
"Programming Language :: Python :: 3",
|
||||
"License :: OSI Approved :: BSD License",
|
||||
"Operating System :: OS Independent",
|
||||
]
|
||||
dependencies = [
|
||||
"sqlalchemy",
|
||||
"textual",
|
||||
"tomli",
|
||||
"tomli_w"
|
||||
[project.urls]
|
||||
Homepage = "https://github.com/gmbrax/Pilgrim/"
|
||||
Issues = "https://github.com/gmbrax/Pilgrim/issues"
|
||||
|
||||
|
||||
]
|
||||
[template.plugins.default]
|
||||
src-layout = true
|
||||
[project.urls]
|
||||
Homepage = "https://github.com/gmbrax/Pilgrim/"
|
||||
Issues = "https://github.com/gmbrax/Pilgrim/issues"
|
||||
[tool.hatch.build.targets.wheel]
|
||||
packages = ["src/pilgrim"]
|
||||
[project.scripts]
|
||||
pilgrim = "pilgrim:main"
|
||||
[project.scripts]
|
||||
pilgrim = "pilgrim.command:main"
|
||||
@@ -1,5 +1,5 @@
|
||||
from sqlalchemy import create_engine
|
||||
from sqlalchemy.ext.declarative import declarative_base
|
||||
from sqlalchemy.orm import declarative_base
|
||||
from sqlalchemy.orm import sessionmaker
|
||||
from pathlib import Path
|
||||
import os
|
||||
|
||||
@@ -4,15 +4,16 @@ from pilgrim.models.photo_in_entry import photo_entry_association
|
||||
from sqlalchemy import Column, Integer, String, ForeignKey, DateTime
|
||||
from sqlalchemy.orm import relationship
|
||||
|
||||
from ..database import Base
|
||||
from pilgrim.database import Base
|
||||
|
||||
|
||||
|
||||
class Entry(Base):
|
||||
__tablename__ = "entries"
|
||||
id = Column(Integer, primary_key=True)
|
||||
title = Column(String)
|
||||
title = Column(String,nullable=False)
|
||||
text = Column(String)
|
||||
date = Column(DateTime)
|
||||
date = Column(DateTime,nullable=False)
|
||||
photos = relationship(
|
||||
"Photo",
|
||||
secondary=photo_entry_association,
|
||||
|
||||
@@ -7,7 +7,8 @@ from sqlalchemy.orm import relationship
|
||||
from sqlalchemy.sql.schema import Index
|
||||
|
||||
from pilgrim.models.photo_in_entry import photo_entry_association
|
||||
from ..database import Base
|
||||
from pilgrim.database import Base
|
||||
|
||||
|
||||
|
||||
class Photo(Base):
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
from sqlalchemy import Table, Column, Integer, ForeignKey
|
||||
|
||||
from ..database import Base
|
||||
from pilgrim.database import Base
|
||||
|
||||
photo_entry_association = Table('photo_entry_association', Base.metadata,
|
||||
Column('id', Integer, primary_key=True, autoincrement=True),
|
||||
|
||||
@@ -3,10 +3,11 @@ from typing import Any
|
||||
from sqlalchemy import Column, Integer, String, UniqueConstraint
|
||||
from sqlalchemy.orm import relationship
|
||||
|
||||
from .. import database
|
||||
from pilgrim.database import Base
|
||||
|
||||
|
||||
class TravelDiary(database.Base):
|
||||
|
||||
class TravelDiary(Base):
|
||||
__tablename__ = "travel_diaries"
|
||||
id = Column(Integer, primary_key=True)
|
||||
name = Column(String, nullable=False)
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
from datetime import datetime
|
||||
from typing import List
|
||||
|
||||
from ..models.entry import Entry
|
||||
from ..models.travel_diary import TravelDiary
|
||||
from ..models.photo import Photo # ✨ Importe o modelo Photo
|
||||
from pilgrim.models.entry import Entry
|
||||
from pilgrim.models.travel_diary import TravelDiary
|
||||
from pilgrim.models.photo import Photo # ✨ Importe o modelo Photo
|
||||
|
||||
|
||||
class EntryService:
|
||||
|
||||
@@ -6,8 +6,8 @@ from pathlib import Path
|
||||
from pilgrim.utils import DirectoryManager
|
||||
from sqlalchemy.exc import IntegrityError
|
||||
|
||||
from ..models.travel_diary import TravelDiary
|
||||
|
||||
from pilgrim.models.travel_diary import TravelDiary
|
||||
from unidecode import unidecode
|
||||
|
||||
class TravelDiaryService:
|
||||
def __init__(self, session):
|
||||
@@ -20,8 +20,10 @@ class TravelDiaryService:
|
||||
- Replaces spaces with underscores
|
||||
- Ensures name is unique by adding a suffix if needed
|
||||
"""
|
||||
transliterated_name = unidecode(name)
|
||||
|
||||
# Remove special characters and replace spaces
|
||||
safe_name = re.sub(r'[^\w\s-]', '', name)
|
||||
safe_name = re.sub(r'[^\w\s-]', '', transliterated_name)
|
||||
safe_name = safe_name.strip().replace(' ', '_').lower()
|
||||
|
||||
# Ensure we have a valid name
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
import pytest
|
||||
from sqlalchemy import create_engine
|
||||
from sqlalchemy.orm import sessionmaker
|
||||
|
||||
from pilgrim.database import Base
|
||||
from pilgrim.models.travel_diary import TravelDiary
|
||||
|
||||
# Todos os imports necessários para as fixtures devem estar aqui
|
||||
# ...
|
||||
|
||||
@pytest.fixture(scope="function")
|
||||
def db_session():
|
||||
"""Esta fixture agora está disponível para TODOS os testes."""
|
||||
engine = create_engine("sqlite:///:memory:")
|
||||
Base.metadata.create_all(engine)
|
||||
Session = sessionmaker(bind=engine)
|
||||
session = Session()
|
||||
yield session
|
||||
session.close()
|
||||
Base.metadata.drop_all(engine)
|
||||
|
||||
@pytest.fixture
|
||||
def populated_db_session(db_session):
|
||||
"""Esta também fica disponível para todos."""
|
||||
travel_diary = TravelDiary(name="My Travel Diary", directory_name="viagem-teste")
|
||||
db_session.add(travel_diary)
|
||||
db_session.commit()
|
||||
return db_session
|
||||
Reference in New Issue
Block a user