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.
Files changed (83) hide show
  1. pyarchinit_mini-0.1.1/CLAUDE.md +234 -0
  2. pyarchinit_mini-0.1.1/MANIFEST.in +39 -0
  3. pyarchinit_mini-0.1.1/PKG-INFO +372 -0
  4. pyarchinit_mini-0.1.1/README.md +285 -0
  5. pyarchinit_mini-0.1.1/cli_interface/cli_app.py +497 -0
  6. pyarchinit_mini-0.1.1/data/pyarchinit_mini_sample.db +0 -0
  7. pyarchinit_mini-0.1.1/desktop_gui/__init__.py +52 -0
  8. pyarchinit_mini-0.1.1/desktop_gui/dialogs.py +1980 -0
  9. pyarchinit_mini-0.1.1/desktop_gui/gui_app.py +109 -0
  10. pyarchinit_mini-0.1.1/desktop_gui/harris_matrix_editor.py +970 -0
  11. pyarchinit_mini-0.1.1/desktop_gui/icons.py +70 -0
  12. pyarchinit_mini-0.1.1/desktop_gui/inventario_dialog_extended.py +966 -0
  13. pyarchinit_mini-0.1.1/desktop_gui/main_window.py +1695 -0
  14. pyarchinit_mini-0.1.1/desktop_gui/media_manager_advanced.py +112 -0
  15. pyarchinit_mini-0.1.1/desktop_gui/postgres_installer_dialog.py +357 -0
  16. pyarchinit_mini-0.1.1/desktop_gui/thesaurus_dialog.py +463 -0
  17. pyarchinit_mini-0.1.1/desktop_gui/us_dialog_extended.py +1975 -0
  18. pyarchinit_mini-0.1.1/pyarchinit_mini/__init__.py +30 -0
  19. pyarchinit_mini-0.1.1/pyarchinit_mini/api/__init__.py +87 -0
  20. pyarchinit_mini-0.1.1/pyarchinit_mini/api/dependencies.py +63 -0
  21. pyarchinit_mini-0.1.1/pyarchinit_mini/api/inventario.py +107 -0
  22. pyarchinit_mini-0.1.1/pyarchinit_mini/api/schemas.py +186 -0
  23. pyarchinit_mini-0.1.1/pyarchinit_mini/api/site.py +220 -0
  24. pyarchinit_mini-0.1.1/pyarchinit_mini/api/us.py +107 -0
  25. pyarchinit_mini-0.1.1/pyarchinit_mini/database/__init__.py +13 -0
  26. pyarchinit_mini-0.1.1/pyarchinit_mini/database/connection.py +167 -0
  27. pyarchinit_mini-0.1.1/pyarchinit_mini/database/manager.py +231 -0
  28. pyarchinit_mini-0.1.1/pyarchinit_mini/database/migrations.py +136 -0
  29. pyarchinit_mini-0.1.1/pyarchinit_mini/database/postgres_installer.py +375 -0
  30. pyarchinit_mini-0.1.1/pyarchinit_mini/database/schemas.py +177 -0
  31. pyarchinit_mini-0.1.1/pyarchinit_mini/dto/__init__.py +16 -0
  32. pyarchinit_mini-0.1.1/pyarchinit_mini/dto/inventario_dto.py +57 -0
  33. pyarchinit_mini-0.1.1/pyarchinit_mini/dto/site_dto.py +62 -0
  34. pyarchinit_mini-0.1.1/pyarchinit_mini/dto/us_dto.py +237 -0
  35. pyarchinit_mini-0.1.1/pyarchinit_mini/exceptions.py +23 -0
  36. pyarchinit_mini-0.1.1/pyarchinit_mini/harris_matrix/__init__.py +11 -0
  37. pyarchinit_mini-0.1.1/pyarchinit_mini/harris_matrix/enhanced_visualizer.py +465 -0
  38. pyarchinit_mini-0.1.1/pyarchinit_mini/harris_matrix/matrix_generator.py +449 -0
  39. pyarchinit_mini-0.1.1/pyarchinit_mini/harris_matrix/matrix_visualizer.py +366 -0
  40. pyarchinit_mini-0.1.1/pyarchinit_mini/harris_matrix/pyarchinit_visualizer.py +473 -0
  41. pyarchinit_mini-0.1.1/pyarchinit_mini/media_manager/__init__.py +9 -0
  42. pyarchinit_mini-0.1.1/pyarchinit_mini/media_manager/media_handler.py +276 -0
  43. pyarchinit_mini-0.1.1/pyarchinit_mini/models/__init__.py +28 -0
  44. pyarchinit_mini-0.1.1/pyarchinit_mini/models/base.py +32 -0
  45. pyarchinit_mini-0.1.1/pyarchinit_mini/models/harris_matrix.py +117 -0
  46. pyarchinit_mini-0.1.1/pyarchinit_mini/models/inventario_materiali.py +98 -0
  47. pyarchinit_mini-0.1.1/pyarchinit_mini/models/media.py +109 -0
  48. pyarchinit_mini-0.1.1/pyarchinit_mini/models/site.py +32 -0
  49. pyarchinit_mini-0.1.1/pyarchinit_mini/models/thesaurus.py +179 -0
  50. pyarchinit_mini-0.1.1/pyarchinit_mini/models/us.py +104 -0
  51. pyarchinit_mini-0.1.1/pyarchinit_mini/pdf_export/__init__.py +9 -0
  52. pyarchinit_mini-0.1.1/pyarchinit_mini/pdf_export/pdf_generator.py +1036 -0
  53. pyarchinit_mini-0.1.1/pyarchinit_mini/pdf_export/pdf_generator_backup.py +1013 -0
  54. pyarchinit_mini-0.1.1/pyarchinit_mini/pdf_export/pyarchinit_finds_template.py +404 -0
  55. pyarchinit_mini-0.1.1/pyarchinit_mini/pdf_export/pyarchinit_inventory_template.py +353 -0
  56. pyarchinit_mini-0.1.1/pyarchinit_mini/pdf_export/usm_implementation.py +465 -0
  57. pyarchinit_mini-0.1.1/pyarchinit_mini/scripts/__init__.py +3 -0
  58. pyarchinit_mini-0.1.1/pyarchinit_mini/scripts/setup_user_env.py +315 -0
  59. pyarchinit_mini-0.1.1/pyarchinit_mini/services/__init__.py +13 -0
  60. pyarchinit_mini-0.1.1/pyarchinit_mini/services/inventario_service.py +347 -0
  61. pyarchinit_mini-0.1.1/pyarchinit_mini/services/media_service.py +451 -0
  62. pyarchinit_mini-0.1.1/pyarchinit_mini/services/periodizzazione_service.py +417 -0
  63. pyarchinit_mini-0.1.1/pyarchinit_mini/services/site_service.py +254 -0
  64. pyarchinit_mini-0.1.1/pyarchinit_mini/services/thesaurus_service.py +358 -0
  65. pyarchinit_mini-0.1.1/pyarchinit_mini/services/us_service.py +446 -0
  66. pyarchinit_mini-0.1.1/pyarchinit_mini/utils/__init__.py +27 -0
  67. pyarchinit_mini-0.1.1/pyarchinit_mini/utils/exceptions.py +38 -0
  68. pyarchinit_mini-0.1.1/pyarchinit_mini/utils/stratigraphic_validator.py +347 -0
  69. pyarchinit_mini-0.1.1/pyarchinit_mini/utils/validators.py +219 -0
  70. pyarchinit_mini-0.1.1/pyarchinit_mini.egg-info/PKG-INFO +372 -0
  71. pyarchinit_mini-0.1.1/pyarchinit_mini.egg-info/SOURCES.txt +81 -0
  72. pyarchinit_mini-0.1.1/pyarchinit_mini.egg-info/dependency_links.txt +1 -0
  73. pyarchinit_mini-0.1.1/pyarchinit_mini.egg-info/entry_points.txt +6 -0
  74. pyarchinit_mini-0.1.1/pyarchinit_mini.egg-info/not-zip-safe +1 -0
  75. pyarchinit_mini-0.1.1/pyarchinit_mini.egg-info/requires.txt +65 -0
  76. pyarchinit_mini-0.1.1/pyarchinit_mini.egg-info/top_level.txt +4 -0
  77. pyarchinit_mini-0.1.1/pyproject.toml +188 -0
  78. pyarchinit_mini-0.1.1/requirements.txt +44 -0
  79. pyarchinit_mini-0.1.1/setup.cfg +4 -0
  80. pyarchinit_mini-0.1.1/setup.py +89 -0
  81. pyarchinit_mini-0.1.1/web_interface/app.py +404 -0
  82. pyarchinit_mini-0.1.1/web_interface/templates/base.html +187 -0
  83. 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