pyarchinit-mini 0.1.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pyarchinit_mini-0.1.1/CLAUDE.md +234 -0
- pyarchinit_mini-0.1.1/MANIFEST.in +39 -0
- pyarchinit_mini-0.1.1/PKG-INFO +372 -0
- pyarchinit_mini-0.1.1/README.md +285 -0
- pyarchinit_mini-0.1.1/cli_interface/cli_app.py +497 -0
- pyarchinit_mini-0.1.1/data/pyarchinit_mini_sample.db +0 -0
- pyarchinit_mini-0.1.1/desktop_gui/__init__.py +52 -0
- pyarchinit_mini-0.1.1/desktop_gui/dialogs.py +1980 -0
- pyarchinit_mini-0.1.1/desktop_gui/gui_app.py +109 -0
- pyarchinit_mini-0.1.1/desktop_gui/harris_matrix_editor.py +970 -0
- pyarchinit_mini-0.1.1/desktop_gui/icons.py +70 -0
- pyarchinit_mini-0.1.1/desktop_gui/inventario_dialog_extended.py +966 -0
- pyarchinit_mini-0.1.1/desktop_gui/main_window.py +1695 -0
- pyarchinit_mini-0.1.1/desktop_gui/media_manager_advanced.py +112 -0
- pyarchinit_mini-0.1.1/desktop_gui/postgres_installer_dialog.py +357 -0
- pyarchinit_mini-0.1.1/desktop_gui/thesaurus_dialog.py +463 -0
- pyarchinit_mini-0.1.1/desktop_gui/us_dialog_extended.py +1975 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/__init__.py +30 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/api/__init__.py +87 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/api/dependencies.py +63 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/api/inventario.py +107 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/api/schemas.py +186 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/api/site.py +220 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/api/us.py +107 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/database/__init__.py +13 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/database/connection.py +167 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/database/manager.py +231 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/database/migrations.py +136 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/database/postgres_installer.py +375 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/database/schemas.py +177 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/dto/__init__.py +16 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/dto/inventario_dto.py +57 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/dto/site_dto.py +62 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/dto/us_dto.py +237 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/exceptions.py +23 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/harris_matrix/__init__.py +11 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/harris_matrix/enhanced_visualizer.py +465 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/harris_matrix/matrix_generator.py +449 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/harris_matrix/matrix_visualizer.py +366 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/harris_matrix/pyarchinit_visualizer.py +473 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/media_manager/__init__.py +9 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/media_manager/media_handler.py +276 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/models/__init__.py +28 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/models/base.py +32 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/models/harris_matrix.py +117 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/models/inventario_materiali.py +98 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/models/media.py +109 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/models/site.py +32 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/models/thesaurus.py +179 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/models/us.py +104 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/pdf_export/__init__.py +9 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/pdf_export/pdf_generator.py +1036 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/pdf_export/pdf_generator_backup.py +1013 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/pdf_export/pyarchinit_finds_template.py +404 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/pdf_export/pyarchinit_inventory_template.py +353 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/pdf_export/usm_implementation.py +465 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/scripts/__init__.py +3 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/scripts/setup_user_env.py +315 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/services/__init__.py +13 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/services/inventario_service.py +347 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/services/media_service.py +451 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/services/periodizzazione_service.py +417 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/services/site_service.py +254 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/services/thesaurus_service.py +358 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/services/us_service.py +446 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/utils/__init__.py +27 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/utils/exceptions.py +38 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/utils/stratigraphic_validator.py +347 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini/utils/validators.py +219 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini.egg-info/PKG-INFO +372 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini.egg-info/SOURCES.txt +81 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini.egg-info/dependency_links.txt +1 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini.egg-info/entry_points.txt +6 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini.egg-info/not-zip-safe +1 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini.egg-info/requires.txt +65 -0
- pyarchinit_mini-0.1.1/pyarchinit_mini.egg-info/top_level.txt +4 -0
- pyarchinit_mini-0.1.1/pyproject.toml +188 -0
- pyarchinit_mini-0.1.1/requirements.txt +44 -0
- pyarchinit_mini-0.1.1/setup.cfg +4 -0
- pyarchinit_mini-0.1.1/setup.py +89 -0
- pyarchinit_mini-0.1.1/web_interface/app.py +404 -0
- pyarchinit_mini-0.1.1/web_interface/templates/base.html +187 -0
- pyarchinit_mini-0.1.1/web_interface/templates/dashboard.html +226 -0
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
# CLAUDE.md
|
|
2
|
+
|
|
3
|
+
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
|
4
|
+
|
|
5
|
+
## Project Overview
|
|
6
|
+
|
|
7
|
+
PyArchInit-Mini is a lightweight archaeological data management system focused on core functionality without GIS dependencies. It provides multiple interfaces (REST API, Web UI, Desktop GUI, CLI) for managing archaeological sites, stratigraphic units (US), and material inventories.
|
|
8
|
+
|
|
9
|
+
## Architecture
|
|
10
|
+
|
|
11
|
+
### Layered Architecture
|
|
12
|
+
The codebase follows a clean, service-oriented architecture:
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
pyarchinit_mini/
|
|
16
|
+
├── models/ # SQLAlchemy ORM models (Site, US, InventarioMateriali, etc.)
|
|
17
|
+
├── database/ # Connection management, migrations, DatabaseManager
|
|
18
|
+
├── services/ # Business logic layer (SiteService, USService, etc.)
|
|
19
|
+
├── dto/ # Data Transfer Objects for clean API boundaries
|
|
20
|
+
├── api/ # FastAPI REST endpoints with Pydantic schemas
|
|
21
|
+
├── utils/ # Validators, exceptions, utilities
|
|
22
|
+
├── harris_matrix/ # Harris Matrix generation and visualization
|
|
23
|
+
├── pdf_export/ # PDF report generation
|
|
24
|
+
└── media_manager/ # Media file handling
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### Key Design Patterns
|
|
28
|
+
|
|
29
|
+
**Session Management**: All database operations use context managers via `DatabaseConnection.get_session()`. The session automatically commits on success and rolls back on errors. Never manually create sessions outside this pattern.
|
|
30
|
+
|
|
31
|
+
**Service Layer**: Business logic lives in services (e.g., `SiteService`, `USService`). Services use `DatabaseManager` for CRUD operations and contain validation logic. API endpoints should be thin wrappers around service calls.
|
|
32
|
+
|
|
33
|
+
**DTO Pattern**: Models are converted to DTOs before leaving the service layer to avoid SQLAlchemy lazy loading issues outside sessions. Use `SiteDTO.from_model(site)` while still in session context.
|
|
34
|
+
|
|
35
|
+
**Multi-Database Support**: Code supports both PostgreSQL and SQLite. Database-specific logic is isolated in `DatabaseConnection`. Test with both databases when making schema changes.
|
|
36
|
+
|
|
37
|
+
## Common Development Commands
|
|
38
|
+
|
|
39
|
+
### Running the Application
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
# Start REST API server (FastAPI)
|
|
43
|
+
python main.py
|
|
44
|
+
# Access API docs at http://localhost:8000/docs
|
|
45
|
+
|
|
46
|
+
# Start Web Interface (Flask)
|
|
47
|
+
python web_interface/app.py
|
|
48
|
+
# Access at http://localhost:5000
|
|
49
|
+
|
|
50
|
+
# Start Desktop GUI (Tkinter)
|
|
51
|
+
python desktop_gui/gui_app.py
|
|
52
|
+
# OR
|
|
53
|
+
python run_gui.py
|
|
54
|
+
|
|
55
|
+
# Start CLI Interface
|
|
56
|
+
python cli_interface/cli_app.py
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Testing
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
# Run all tests
|
|
63
|
+
pytest
|
|
64
|
+
|
|
65
|
+
# Run specific test file
|
|
66
|
+
pytest tests/unit/test_site_service.py
|
|
67
|
+
|
|
68
|
+
# Run with coverage
|
|
69
|
+
pytest --cov=pyarchinit_mini
|
|
70
|
+
|
|
71
|
+
# Run with verbose output
|
|
72
|
+
pytest -v
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### Database Operations
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
# Run migrations (creates/updates schema)
|
|
79
|
+
python -c "from pyarchinit_mini.database import DatabaseConnection, DatabaseManager; \
|
|
80
|
+
db = DatabaseConnection('sqlite:///./pyarchinit_mini.db'); \
|
|
81
|
+
DatabaseManager(db).run_migrations()"
|
|
82
|
+
|
|
83
|
+
# Migrate existing database
|
|
84
|
+
python migrate_database.py
|
|
85
|
+
|
|
86
|
+
# Load sample data for testing
|
|
87
|
+
python launch_with_sample_data.py
|
|
88
|
+
python scripts/populate_sample_data.py
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Code Quality
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
# Format code with Black
|
|
95
|
+
black pyarchinit_mini/
|
|
96
|
+
|
|
97
|
+
# Sort imports
|
|
98
|
+
isort pyarchinit_mini/
|
|
99
|
+
|
|
100
|
+
# Lint with flake8
|
|
101
|
+
flake8 pyarchinit_mini/
|
|
102
|
+
|
|
103
|
+
# Type checking
|
|
104
|
+
mypy pyarchinit_mini/
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## Critical Implementation Details
|
|
108
|
+
|
|
109
|
+
### Database Sessions
|
|
110
|
+
|
|
111
|
+
**ALWAYS** use the session context manager pattern:
|
|
112
|
+
|
|
113
|
+
```python
|
|
114
|
+
# CORRECT
|
|
115
|
+
with self.db_manager.connection.get_session() as session:
|
|
116
|
+
site = session.query(Site).filter(Site.id_sito == site_id).first()
|
|
117
|
+
dto = SiteDTO.from_model(site) # Convert to DTO while in session
|
|
118
|
+
return dto
|
|
119
|
+
|
|
120
|
+
# WRONG - Never do this
|
|
121
|
+
session = self.db_manager.connection.SessionLocal()
|
|
122
|
+
site = session.query(Site).get(site_id)
|
|
123
|
+
# Missing rollback/commit handling, resource leak
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### Service Methods
|
|
127
|
+
|
|
128
|
+
Services have two patterns for CRUD operations:
|
|
129
|
+
|
|
130
|
+
1. **Model-returning methods** (legacy): Return SQLAlchemy models
|
|
131
|
+
2. **DTO-returning methods** (preferred): Return DTOs, suffix with `_dto`
|
|
132
|
+
|
|
133
|
+
When adding new endpoints, prefer DTO-returning service methods to avoid detached instance errors.
|
|
134
|
+
|
|
135
|
+
### Foreign Key Relationships
|
|
136
|
+
|
|
137
|
+
SQLite requires explicit foreign key enforcement. This is configured in `DatabaseConnection`:
|
|
138
|
+
|
|
139
|
+
```python
|
|
140
|
+
@event.listens_for(self.engine, "connect")
|
|
141
|
+
def set_sqlite_pragma(dbapi_connection, connection_record):
|
|
142
|
+
cursor.execute("PRAGMA foreign_keys=ON")
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
When defining relationships in models, ensure proper cascade settings for deletions.
|
|
146
|
+
|
|
147
|
+
### Harris Matrix Generation
|
|
148
|
+
|
|
149
|
+
The Harris Matrix system uses NetworkX for graph operations:
|
|
150
|
+
|
|
151
|
+
```python
|
|
152
|
+
from pyarchinit_mini.harris_matrix import HarrisMatrixGenerator, MatrixVisualizer
|
|
153
|
+
|
|
154
|
+
generator = HarrisMatrixGenerator(db_manager)
|
|
155
|
+
graph = generator.generate_matrix(site_name) # Returns NetworkX DiGraph
|
|
156
|
+
levels = generator.get_matrix_levels(graph) # Topological ordering
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
US relationships are defined via `rapporti_stratigrafici` field (e.g., "Covers 1002, 1003").
|
|
160
|
+
|
|
161
|
+
## Environment Configuration
|
|
162
|
+
|
|
163
|
+
### Database Configuration
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
# SQLite (default)
|
|
167
|
+
export DATABASE_URL="sqlite:///./pyarchinit_mini.db"
|
|
168
|
+
|
|
169
|
+
# PostgreSQL
|
|
170
|
+
export DATABASE_URL="postgresql://user:password@localhost:5432/pyarchinit"
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### FastAPI Server Configuration
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
# Server settings
|
|
177
|
+
export HOST="0.0.0.0"
|
|
178
|
+
export PORT="8000"
|
|
179
|
+
export RELOAD="true" # Auto-reload on code changes
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
## Important Files
|
|
183
|
+
|
|
184
|
+
- `main.py`: FastAPI application entry point
|
|
185
|
+
- `pyarchinit_mini/__init__.py`: Package exports (DatabaseManager, services)
|
|
186
|
+
- `pyarchinit_mini/database/manager.py`: Generic CRUD operations, query builder
|
|
187
|
+
- `pyarchinit_mini/database/connection.py`: Session management, DB connection
|
|
188
|
+
- `pyarchinit_mini/api/dependencies.py`: FastAPI dependency injection for DB
|
|
189
|
+
- `requirements.txt`: Python dependencies
|
|
190
|
+
- `pyproject.toml`: Project metadata, tool configuration (black, mypy, pytest)
|
|
191
|
+
|
|
192
|
+
## Common Gotchas
|
|
193
|
+
|
|
194
|
+
1. **Detached Instance Errors**: Always convert models to DTOs within session context before returning from services
|
|
195
|
+
2. **Foreign Key Constraints**: Remember SQLite needs PRAGMA foreign_keys=ON (already configured)
|
|
196
|
+
3. **Session Lifecycle**: Never store SQLAlchemy model instances beyond session scope
|
|
197
|
+
4. **Relationship Loading**: Use eager loading (joinedload) for relationships accessed outside sessions
|
|
198
|
+
5. **Database URL Format**: PostgreSQL uses `postgresql://` not `postgres://`
|
|
199
|
+
|
|
200
|
+
## Adding New Features
|
|
201
|
+
|
|
202
|
+
### Adding a New Model
|
|
203
|
+
|
|
204
|
+
1. Create model in `pyarchinit_mini/models/your_model.py` extending `BaseModel`
|
|
205
|
+
2. Add DTO in `pyarchinit_mini/dto/your_dto.py`
|
|
206
|
+
3. Create service in `pyarchinit_mini/services/your_service.py`
|
|
207
|
+
4. Add API router in `pyarchinit_mini/api/your_router.py`
|
|
208
|
+
5. Register router in `pyarchinit_mini/api/__init__.py` `create_app()`
|
|
209
|
+
6. Run migrations to create table
|
|
210
|
+
7. Add tests in `tests/unit/test_your_service.py`
|
|
211
|
+
|
|
212
|
+
### Adding a New API Endpoint
|
|
213
|
+
|
|
214
|
+
1. Use dependency injection for database access:
|
|
215
|
+
```python
|
|
216
|
+
from .dependencies import get_db_manager
|
|
217
|
+
|
|
218
|
+
@router.get("/")
|
|
219
|
+
async def list_items(db_manager: DatabaseManager = Depends(get_db_manager)):
|
|
220
|
+
service = YourService(db_manager)
|
|
221
|
+
return service.get_all_items_dto()
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
2. Use Pydantic schemas for request/response validation
|
|
225
|
+
3. Follow REST conventions (GET for read, POST for create, PUT for update, DELETE for delete)
|
|
226
|
+
4. Return DTOs, not raw SQLAlchemy models
|
|
227
|
+
|
|
228
|
+
## Testing Guidelines
|
|
229
|
+
|
|
230
|
+
- Use pytest fixtures from `tests/conftest.py` for database setup
|
|
231
|
+
- Each test should use a fresh database session
|
|
232
|
+
- Test both SQLite and PostgreSQL code paths for schema changes
|
|
233
|
+
- Mock external dependencies (file system, network) in unit tests
|
|
234
|
+
- Integration tests should test full service layer operations
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# MANIFEST.in - Specifies additional files to include in the distribution
|
|
2
|
+
|
|
3
|
+
# Include documentation
|
|
4
|
+
include README.md
|
|
5
|
+
include LICENSE
|
|
6
|
+
include CHANGELOG.md
|
|
7
|
+
include CLAUDE.md
|
|
8
|
+
|
|
9
|
+
# Include configuration files
|
|
10
|
+
include pyproject.toml
|
|
11
|
+
include setup.py
|
|
12
|
+
include requirements.txt
|
|
13
|
+
|
|
14
|
+
# Include data files
|
|
15
|
+
recursive-include data *.db *.sql
|
|
16
|
+
recursive-include pyarchinit_mini/data *.db *.sql
|
|
17
|
+
|
|
18
|
+
# Include web interface templates and static files
|
|
19
|
+
recursive-include web_interface/templates *.html
|
|
20
|
+
recursive-include web_interface/static *.css *.js *.png *.jpg *.ico
|
|
21
|
+
|
|
22
|
+
# Include desktop GUI assets
|
|
23
|
+
recursive-include desktop_gui *.png *.ico *.gif
|
|
24
|
+
|
|
25
|
+
# Include CLI configurations
|
|
26
|
+
recursive-include cli_interface *.json *.yaml
|
|
27
|
+
|
|
28
|
+
# Include package configs
|
|
29
|
+
recursive-include pyarchinit_mini *.yaml *.yml *.json
|
|
30
|
+
|
|
31
|
+
# Exclude unnecessary files
|
|
32
|
+
recursive-exclude * __pycache__
|
|
33
|
+
recursive-exclude * *.py[co]
|
|
34
|
+
recursive-exclude * .DS_Store
|
|
35
|
+
recursive-exclude tests *
|
|
36
|
+
recursive-exclude docs *
|
|
37
|
+
recursive-exclude examples *
|
|
38
|
+
recursive-exclude .venv *
|
|
39
|
+
recursive-exclude .git *
|
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: pyarchinit-mini
|
|
3
|
+
Version: 0.1.1
|
|
4
|
+
Summary: Lightweight archaeological data management system with REST API, Web UI, Desktop GUI, and CLI
|
|
5
|
+
Home-page: https://github.com/pyarchinit/pyarchinit-mini
|
|
6
|
+
Author: PyArchInit Team
|
|
7
|
+
Author-email: PyArchInit Team <enzo.ccc@gmail.com>
|
|
8
|
+
License: GPL-2.0
|
|
9
|
+
Project-URL: Homepage, https://github.com/pyarchinit/pyarchinit-mini
|
|
10
|
+
Project-URL: Documentation, https://pyarchinit-mini.readthedocs.io/
|
|
11
|
+
Project-URL: Repository, https://github.com/pyarchinit/pyarchinit-mini
|
|
12
|
+
Project-URL: Bug Tracker, https://github.com/pyarchinit/pyarchinit-mini/issues
|
|
13
|
+
Keywords: archaeology,archaeological data,heritage,cultural heritage,database,api,stratigraphy,excavation,harris matrix,finds inventory
|
|
14
|
+
Classifier: Development Status :: 3 - Alpha
|
|
15
|
+
Classifier: Intended Audience :: Science/Research
|
|
16
|
+
Classifier: Topic :: Scientific/Engineering :: GIS
|
|
17
|
+
Classifier: Topic :: Database :: Database Engines/Servers
|
|
18
|
+
Classifier: License :: OSI Approved :: GNU General Public License v2 (GPLv2)
|
|
19
|
+
Classifier: Programming Language :: Python :: 3
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.8
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
23
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
24
|
+
Classifier: Operating System :: OS Independent
|
|
25
|
+
Classifier: Framework :: FastAPI
|
|
26
|
+
Requires-Python: >=3.8
|
|
27
|
+
Description-Content-Type: text/markdown
|
|
28
|
+
Requires-Dist: fastapi>=0.104.0
|
|
29
|
+
Requires-Dist: uvicorn[standard]>=0.24.0
|
|
30
|
+
Requires-Dist: sqlalchemy>=2.0.0
|
|
31
|
+
Requires-Dist: psycopg2-binary>=2.9.0
|
|
32
|
+
Requires-Dist: pydantic>=2.0.0
|
|
33
|
+
Requires-Dist: pydantic-settings>=2.0.0
|
|
34
|
+
Requires-Dist: python-multipart>=0.0.6
|
|
35
|
+
Requires-Dist: alembic>=1.12.0
|
|
36
|
+
Requires-Dist: networkx>=3.0.0
|
|
37
|
+
Requires-Dist: reportlab>=4.0.0
|
|
38
|
+
Requires-Dist: pillow>=10.0.0
|
|
39
|
+
Provides-Extra: cli
|
|
40
|
+
Requires-Dist: click>=8.1.0; extra == "cli"
|
|
41
|
+
Requires-Dist: rich>=13.0.0; extra == "cli"
|
|
42
|
+
Requires-Dist: inquirer>=3.0.0; extra == "cli"
|
|
43
|
+
Provides-Extra: web
|
|
44
|
+
Requires-Dist: flask>=3.0.0; extra == "web"
|
|
45
|
+
Requires-Dist: flask-wtf>=1.2.0; extra == "web"
|
|
46
|
+
Requires-Dist: wtforms>=3.1.0; extra == "web"
|
|
47
|
+
Requires-Dist: jinja2>=3.1.0; extra == "web"
|
|
48
|
+
Provides-Extra: gui
|
|
49
|
+
Requires-Dist: pillow>=10.0.0; extra == "gui"
|
|
50
|
+
Provides-Extra: harris
|
|
51
|
+
Requires-Dist: matplotlib>=3.7.0; extra == "harris"
|
|
52
|
+
Requires-Dist: graphviz>=0.20.0; extra == "harris"
|
|
53
|
+
Provides-Extra: pdf
|
|
54
|
+
Requires-Dist: weasyprint>=60.0.0; extra == "pdf"
|
|
55
|
+
Provides-Extra: media
|
|
56
|
+
Requires-Dist: python-magic>=0.4.0; extra == "media"
|
|
57
|
+
Requires-Dist: moviepy>=1.0.0; extra == "media"
|
|
58
|
+
Provides-Extra: all
|
|
59
|
+
Requires-Dist: click>=8.1.0; extra == "all"
|
|
60
|
+
Requires-Dist: rich>=13.0.0; extra == "all"
|
|
61
|
+
Requires-Dist: inquirer>=3.0.0; extra == "all"
|
|
62
|
+
Requires-Dist: flask>=3.0.0; extra == "all"
|
|
63
|
+
Requires-Dist: flask-wtf>=1.2.0; extra == "all"
|
|
64
|
+
Requires-Dist: wtforms>=3.1.0; extra == "all"
|
|
65
|
+
Requires-Dist: jinja2>=3.1.0; extra == "all"
|
|
66
|
+
Requires-Dist: matplotlib>=3.7.0; extra == "all"
|
|
67
|
+
Requires-Dist: graphviz>=0.20.0; extra == "all"
|
|
68
|
+
Requires-Dist: weasyprint>=60.0.0; extra == "all"
|
|
69
|
+
Requires-Dist: python-magic>=0.4.0; extra == "all"
|
|
70
|
+
Requires-Dist: moviepy>=1.0.0; extra == "all"
|
|
71
|
+
Provides-Extra: dev
|
|
72
|
+
Requires-Dist: pytest>=7.0.0; extra == "dev"
|
|
73
|
+
Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
|
|
74
|
+
Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
|
|
75
|
+
Requires-Dist: httpx>=0.25.0; extra == "dev"
|
|
76
|
+
Requires-Dist: black>=23.0.0; extra == "dev"
|
|
77
|
+
Requires-Dist: flake8>=6.0.0; extra == "dev"
|
|
78
|
+
Requires-Dist: isort>=5.12.0; extra == "dev"
|
|
79
|
+
Requires-Dist: mypy>=1.0.0; extra == "dev"
|
|
80
|
+
Provides-Extra: docs
|
|
81
|
+
Requires-Dist: sphinx>=6.0.0; extra == "docs"
|
|
82
|
+
Requires-Dist: sphinx-rtd-theme>=1.2.0; extra == "docs"
|
|
83
|
+
Requires-Dist: myst-parser>=1.0.0; extra == "docs"
|
|
84
|
+
Dynamic: author
|
|
85
|
+
Dynamic: home-page
|
|
86
|
+
Dynamic: requires-python
|
|
87
|
+
|
|
88
|
+
# PyArchInit-Mini
|
|
89
|
+
|
|
90
|
+
**Lightweight Archaeological Data Management System**
|
|
91
|
+
|
|
92
|
+
PyArchInit-Mini is a standalone, modular version of PyArchInit focused on core archaeological data management functionality without GIS dependencies. It provides multiple interfaces and a clean, scalable API for managing archaeological sites, stratigraphic units, and material inventories.
|
|
93
|
+
|
|
94
|
+
## Features
|
|
95
|
+
|
|
96
|
+
### Core Data Management
|
|
97
|
+
- 🏛️ **Site Management**: Complete CRUD operations for archaeological sites
|
|
98
|
+
- 📋 **Stratigraphic Units (US)**: Manage stratigraphic contexts and excavation data
|
|
99
|
+
- 📦 **Material Inventory**: Track and catalog archaeological finds
|
|
100
|
+
- 🗄️ **Multi-Database Support**: Works with both PostgreSQL and SQLite
|
|
101
|
+
|
|
102
|
+
### Advanced Archaeological Tools
|
|
103
|
+
- 🔗 **Harris Matrix**: Generate and visualize stratigraphic relationships
|
|
104
|
+
- 📄 **PDF Export**: Create comprehensive archaeological reports
|
|
105
|
+
- 🖼️ **Media Management**: Handle images, documents, and multimedia files
|
|
106
|
+
- 📊 **Statistics & Reports**: Comprehensive data analysis and reporting
|
|
107
|
+
|
|
108
|
+
### Multiple User Interfaces
|
|
109
|
+
- 🌐 **Web Interface**: Modern Flask-based web application with Bootstrap UI
|
|
110
|
+
- 🖥️ **Desktop GUI**: Complete Tkinter desktop application
|
|
111
|
+
- 💻 **CLI Interface**: Rich-based interactive command-line interface
|
|
112
|
+
- 🚀 **REST API**: FastAPI-based scalable API with automatic documentation
|
|
113
|
+
|
|
114
|
+
### Technical Features
|
|
115
|
+
- 📊 **Data Validation**: Comprehensive validation using Pydantic schemas
|
|
116
|
+
- 🔍 **Search & Filtering**: Advanced search and filtering capabilities
|
|
117
|
+
- 📖 **Auto Documentation**: Interactive API docs via Swagger/OpenAPI
|
|
118
|
+
- 🔄 **Session Management**: Proper database session handling and connection pooling
|
|
119
|
+
|
|
120
|
+
## Quick Start
|
|
121
|
+
|
|
122
|
+
### Installation
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
pip install pyarchinit-mini
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Interface Options
|
|
129
|
+
|
|
130
|
+
PyArchInit-Mini provides multiple ways to interact with your archaeological data:
|
|
131
|
+
|
|
132
|
+
#### 1. Web Interface (Flask)
|
|
133
|
+
Modern web application with responsive Bootstrap UI:
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
cd pyarchinit-mini
|
|
137
|
+
python web_interface/app.py
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
Visit `http://localhost:5000` to access the web interface.
|
|
141
|
+
|
|
142
|
+
#### 2. Desktop GUI (Tkinter)
|
|
143
|
+
Complete desktop application with rich interface:
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
cd pyarchinit-mini
|
|
147
|
+
python desktop_gui/gui_app.py
|
|
148
|
+
# OR use the quick launcher:
|
|
149
|
+
python run_gui.py
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
#### 3. CLI Interface (Rich)
|
|
153
|
+
Interactive command-line interface:
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
cd pyarchinit-mini
|
|
157
|
+
python cli_interface/cli_app.py
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
#### 4. REST API Server (FastAPI)
|
|
161
|
+
Scalable API server with automatic documentation:
|
|
162
|
+
|
|
163
|
+
```bash
|
|
164
|
+
cd pyarchinit-mini
|
|
165
|
+
python main.py
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
Visit `http://localhost:8000/docs` for interactive API documentation.
|
|
169
|
+
|
|
170
|
+
### Basic Usage
|
|
171
|
+
|
|
172
|
+
#### As a Python Library
|
|
173
|
+
|
|
174
|
+
```python
|
|
175
|
+
from pyarchinit_mini import DatabaseManager, SiteService
|
|
176
|
+
from pyarchinit_mini.database import DatabaseConnection
|
|
177
|
+
|
|
178
|
+
# Connect to database
|
|
179
|
+
db_conn = DatabaseConnection.sqlite("archaeological_data.db")
|
|
180
|
+
db_manager = DatabaseManager(db_conn)
|
|
181
|
+
|
|
182
|
+
# Use services
|
|
183
|
+
site_service = SiteService(db_manager)
|
|
184
|
+
|
|
185
|
+
# Create a new site
|
|
186
|
+
site_data = {
|
|
187
|
+
"sito": "Pompei",
|
|
188
|
+
"nazione": "Italia",
|
|
189
|
+
"regione": "Campania",
|
|
190
|
+
"comune": "Pompei",
|
|
191
|
+
"provincia": "NA",
|
|
192
|
+
"descrizione": "Ancient Roman city"
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
site = site_service.create_site(site_data)
|
|
196
|
+
print(f"Created site: {site.display_name}")
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
#### Database Configuration
|
|
200
|
+
|
|
201
|
+
All interfaces support both SQLite and PostgreSQL. Configure via environment variable:
|
|
202
|
+
|
|
203
|
+
```bash
|
|
204
|
+
# SQLite (default)
|
|
205
|
+
export DATABASE_URL="sqlite:///./pyarchinit_mini.db"
|
|
206
|
+
|
|
207
|
+
# PostgreSQL
|
|
208
|
+
export DATABASE_URL="postgresql://user:password@localhost:5432/pyarchinit"
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
## API Endpoints
|
|
212
|
+
|
|
213
|
+
### Sites
|
|
214
|
+
- `GET /api/v1/sites/` - List sites with pagination and filtering
|
|
215
|
+
- `POST /api/v1/sites/` - Create new site
|
|
216
|
+
- `GET /api/v1/sites/{site_id}` - Get site by ID
|
|
217
|
+
- `PUT /api/v1/sites/{site_id}` - Update site
|
|
218
|
+
- `DELETE /api/v1/sites/{site_id}` - Delete site
|
|
219
|
+
|
|
220
|
+
### Stratigraphic Units (US)
|
|
221
|
+
- `GET /api/v1/us/` - List stratigraphic units
|
|
222
|
+
- `POST /api/v1/us/` - Create new US
|
|
223
|
+
- `GET /api/v1/us/{us_id}` - Get US by ID
|
|
224
|
+
- `PUT /api/v1/us/{us_id}` - Update US
|
|
225
|
+
- `DELETE /api/v1/us/{us_id}` - Delete US
|
|
226
|
+
|
|
227
|
+
### Material Inventory
|
|
228
|
+
- `GET /api/v1/inventario/` - List inventory items
|
|
229
|
+
- `POST /api/v1/inventario/` - Create new inventory item
|
|
230
|
+
- `GET /api/v1/inventario/{item_id}` - Get item by ID
|
|
231
|
+
- `PUT /api/v1/inventario/{item_id}` - Update item
|
|
232
|
+
- `DELETE /api/v1/inventario/{item_id}` - Delete item
|
|
233
|
+
|
|
234
|
+
## Special Features
|
|
235
|
+
|
|
236
|
+
### Harris Matrix Generation
|
|
237
|
+
PyArchInit-Mini includes advanced Harris Matrix functionality:
|
|
238
|
+
|
|
239
|
+
```python
|
|
240
|
+
from pyarchinit_mini.harris_matrix import HarrisMatrixGenerator, MatrixVisualizer
|
|
241
|
+
|
|
242
|
+
# Generate Harris Matrix for a site
|
|
243
|
+
matrix_generator = HarrisMatrixGenerator(db_manager)
|
|
244
|
+
graph = matrix_generator.generate_matrix("Pompei")
|
|
245
|
+
levels = matrix_generator.get_matrix_levels(graph)
|
|
246
|
+
stats = matrix_generator.get_matrix_statistics(graph)
|
|
247
|
+
|
|
248
|
+
# Visualize and export
|
|
249
|
+
visualizer = MatrixVisualizer()
|
|
250
|
+
exports = visualizer.export_to_formats(graph, levels, "pompei_matrix")
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
### PDF Report Generation
|
|
254
|
+
Create comprehensive archaeological reports:
|
|
255
|
+
|
|
256
|
+
```python
|
|
257
|
+
from pyarchinit_mini.pdf_export import PDFGenerator
|
|
258
|
+
|
|
259
|
+
pdf_generator = PDFGenerator()
|
|
260
|
+
site_data = site_service.get_site_by_id(1).to_dict()
|
|
261
|
+
us_data = [us.to_dict() for us in us_service.get_us_by_site("Pompei")]
|
|
262
|
+
inventory_data = [inv.to_dict() for inv in inventario_service.get_inventario_by_site("Pompei")]
|
|
263
|
+
|
|
264
|
+
pdf_bytes = pdf_generator.generate_site_report(site_data, us_data, inventory_data)
|
|
265
|
+
|
|
266
|
+
with open("site_report.pdf", "wb") as f:
|
|
267
|
+
f.write(pdf_bytes)
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
### Media Management
|
|
271
|
+
Handle multimedia files with automatic organization:
|
|
272
|
+
|
|
273
|
+
```python
|
|
274
|
+
from pyarchinit_mini.media_manager import MediaHandler
|
|
275
|
+
|
|
276
|
+
media_handler = MediaHandler()
|
|
277
|
+
metadata = media_handler.store_file(
|
|
278
|
+
"/path/to/photo.jpg",
|
|
279
|
+
"site",
|
|
280
|
+
1, # site ID
|
|
281
|
+
"Excavation photo of area A"
|
|
282
|
+
)
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
## Database Support
|
|
286
|
+
|
|
287
|
+
### SQLite (Default)
|
|
288
|
+
```python
|
|
289
|
+
from pyarchinit_mini.database import DatabaseConnection
|
|
290
|
+
|
|
291
|
+
db_conn = DatabaseConnection.sqlite("path/to/database.db")
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
### PostgreSQL
|
|
295
|
+
```python
|
|
296
|
+
from pyarchinit_mini.database import DatabaseConnection
|
|
297
|
+
|
|
298
|
+
db_conn = DatabaseConnection.postgresql(
|
|
299
|
+
host="localhost",
|
|
300
|
+
port=5432,
|
|
301
|
+
database="pyarchinit",
|
|
302
|
+
username="user",
|
|
303
|
+
password="password"
|
|
304
|
+
)
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
## Data Models
|
|
308
|
+
|
|
309
|
+
### Site
|
|
310
|
+
Core information about archaeological sites including location, description, and metadata.
|
|
311
|
+
|
|
312
|
+
### Stratigraphic Unit (US)
|
|
313
|
+
Represents stratigraphic contexts with excavation data, relationships, measurements, and dating information.
|
|
314
|
+
|
|
315
|
+
### Material Inventory
|
|
316
|
+
Catalog of archaeological finds with classification, measurements, conservation data, and contextual information.
|
|
317
|
+
|
|
318
|
+
## Architecture
|
|
319
|
+
|
|
320
|
+
PyArchInit-Mini follows a clean, modular architecture:
|
|
321
|
+
|
|
322
|
+
- **Models**: SQLAlchemy entities defining database structure
|
|
323
|
+
- **Services**: Business logic layer with validation and operations
|
|
324
|
+
- **API**: FastAPI REST endpoints with Pydantic schemas
|
|
325
|
+
- **Database**: Connection management and query abstractions
|
|
326
|
+
|
|
327
|
+
## Development
|
|
328
|
+
|
|
329
|
+
### Setup Development Environment
|
|
330
|
+
|
|
331
|
+
```bash
|
|
332
|
+
git clone https://github.com/pyarchinit/pyarchinit-mini.git
|
|
333
|
+
cd pyarchinit-mini
|
|
334
|
+
pip install -e ".[dev]"
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
### Run Tests
|
|
338
|
+
|
|
339
|
+
```bash
|
|
340
|
+
pytest
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
### Code Quality
|
|
344
|
+
|
|
345
|
+
```bash
|
|
346
|
+
black pyarchinit_mini/
|
|
347
|
+
flake8 pyarchinit_mini/
|
|
348
|
+
mypy pyarchinit_mini/
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
## Contributing
|
|
352
|
+
|
|
353
|
+
Contributions are welcome! Please read our contributing guidelines and submit pull requests to the main repository.
|
|
354
|
+
|
|
355
|
+
## License
|
|
356
|
+
|
|
357
|
+
PyArchInit-Mini is licensed under the GNU General Public License v2.0. See [LICENSE](LICENSE) for details.
|
|
358
|
+
|
|
359
|
+
## Related Projects
|
|
360
|
+
|
|
361
|
+
- [PyArchInit](https://github.com/pyarchinit/pyarchinit3) - Full QGIS plugin version
|
|
362
|
+
- [PyArchInit Documentation](https://pyarchinit.github.io/pyarchinit_doc/)
|
|
363
|
+
|
|
364
|
+
## Support
|
|
365
|
+
|
|
366
|
+
- 📧 Email: enzo.ccc@gmail.com
|
|
367
|
+
- 🐛 Issue Tracker: [GitHub Issues](https://github.com/pyarchinit/pyarchinit-mini/issues)
|
|
368
|
+
- 📖 Documentation: [Read the Docs](https://pyarchinit-mini.readthedocs.io/)
|
|
369
|
+
|
|
370
|
+
---
|
|
371
|
+
|
|
372
|
+
Made with ❤️ by the PyArchInit Team
|