htmlgraph 0.20.1__py3-none-any.whl → 0.27.5__py3-none-any.whl
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.
- htmlgraph/.htmlgraph/.session-warning-state.json +6 -0
- htmlgraph/.htmlgraph/agents.json +72 -0
- htmlgraph/.htmlgraph/htmlgraph.db +0 -0
- htmlgraph/__init__.py +51 -1
- htmlgraph/__init__.pyi +123 -0
- htmlgraph/agent_detection.py +26 -10
- htmlgraph/agent_registry.py +2 -1
- htmlgraph/analytics/__init__.py +8 -1
- htmlgraph/analytics/cli.py +86 -20
- htmlgraph/analytics/cost_analyzer.py +391 -0
- htmlgraph/analytics/cost_monitor.py +664 -0
- htmlgraph/analytics/cost_reporter.py +675 -0
- htmlgraph/analytics/cross_session.py +617 -0
- htmlgraph/analytics/dependency.py +10 -6
- htmlgraph/analytics/pattern_learning.py +771 -0
- htmlgraph/analytics/session_graph.py +707 -0
- htmlgraph/analytics/strategic/__init__.py +80 -0
- htmlgraph/analytics/strategic/cost_optimizer.py +611 -0
- htmlgraph/analytics/strategic/pattern_detector.py +876 -0
- htmlgraph/analytics/strategic/preference_manager.py +709 -0
- htmlgraph/analytics/strategic/suggestion_engine.py +747 -0
- htmlgraph/analytics/work_type.py +67 -27
- htmlgraph/analytics_index.py +53 -20
- htmlgraph/api/__init__.py +3 -0
- htmlgraph/api/cost_alerts_websocket.py +416 -0
- htmlgraph/api/main.py +2498 -0
- htmlgraph/api/static/htmx.min.js +1 -0
- htmlgraph/api/static/style-redesign.css +1344 -0
- htmlgraph/api/static/style.css +1079 -0
- htmlgraph/api/templates/dashboard-redesign.html +1366 -0
- htmlgraph/api/templates/dashboard.html +794 -0
- htmlgraph/api/templates/partials/activity-feed-hierarchical.html +326 -0
- htmlgraph/api/templates/partials/activity-feed.html +1100 -0
- htmlgraph/api/templates/partials/agents-redesign.html +317 -0
- htmlgraph/api/templates/partials/agents.html +317 -0
- htmlgraph/api/templates/partials/event-traces.html +373 -0
- htmlgraph/api/templates/partials/features-kanban-redesign.html +509 -0
- htmlgraph/api/templates/partials/features.html +578 -0
- htmlgraph/api/templates/partials/metrics-redesign.html +346 -0
- htmlgraph/api/templates/partials/metrics.html +346 -0
- htmlgraph/api/templates/partials/orchestration-redesign.html +443 -0
- htmlgraph/api/templates/partials/orchestration.html +198 -0
- htmlgraph/api/templates/partials/spawners.html +375 -0
- htmlgraph/api/templates/partials/work-items.html +613 -0
- htmlgraph/api/websocket.py +538 -0
- htmlgraph/archive/__init__.py +24 -0
- htmlgraph/archive/bloom.py +234 -0
- htmlgraph/archive/fts.py +297 -0
- htmlgraph/archive/manager.py +583 -0
- htmlgraph/archive/search.py +244 -0
- htmlgraph/atomic_ops.py +560 -0
- htmlgraph/attribute_index.py +2 -1
- htmlgraph/bounded_paths.py +539 -0
- htmlgraph/builders/base.py +57 -2
- htmlgraph/builders/bug.py +19 -3
- htmlgraph/builders/chore.py +19 -3
- htmlgraph/builders/epic.py +19 -3
- htmlgraph/builders/feature.py +27 -3
- htmlgraph/builders/insight.py +2 -1
- htmlgraph/builders/metric.py +2 -1
- htmlgraph/builders/pattern.py +2 -1
- htmlgraph/builders/phase.py +19 -3
- htmlgraph/builders/spike.py +29 -3
- htmlgraph/builders/track.py +42 -1
- htmlgraph/cigs/__init__.py +81 -0
- htmlgraph/cigs/autonomy.py +385 -0
- htmlgraph/cigs/cost.py +475 -0
- htmlgraph/cigs/messages_basic.py +472 -0
- htmlgraph/cigs/messaging.py +365 -0
- htmlgraph/cigs/models.py +771 -0
- htmlgraph/cigs/pattern_storage.py +427 -0
- htmlgraph/cigs/patterns.py +503 -0
- htmlgraph/cigs/posttool_analyzer.py +234 -0
- htmlgraph/cigs/reporter.py +818 -0
- htmlgraph/cigs/tracker.py +317 -0
- htmlgraph/cli/.htmlgraph/.session-warning-state.json +6 -0
- htmlgraph/cli/.htmlgraph/agents.json +72 -0
- htmlgraph/cli/.htmlgraph/htmlgraph.db +0 -0
- htmlgraph/cli/__init__.py +42 -0
- htmlgraph/cli/__main__.py +6 -0
- htmlgraph/cli/analytics.py +1424 -0
- htmlgraph/cli/base.py +685 -0
- htmlgraph/cli/constants.py +206 -0
- htmlgraph/cli/core.py +954 -0
- htmlgraph/cli/main.py +147 -0
- htmlgraph/cli/models.py +475 -0
- htmlgraph/cli/templates/__init__.py +1 -0
- htmlgraph/cli/templates/cost_dashboard.py +399 -0
- htmlgraph/cli/work/__init__.py +239 -0
- htmlgraph/cli/work/browse.py +115 -0
- htmlgraph/cli/work/features.py +568 -0
- htmlgraph/cli/work/orchestration.py +676 -0
- htmlgraph/cli/work/report.py +728 -0
- htmlgraph/cli/work/sessions.py +466 -0
- htmlgraph/cli/work/snapshot.py +559 -0
- htmlgraph/cli/work/tracks.py +486 -0
- htmlgraph/cli_commands/__init__.py +1 -0
- htmlgraph/cli_commands/feature.py +195 -0
- htmlgraph/cli_framework.py +115 -0
- htmlgraph/collections/__init__.py +2 -0
- htmlgraph/collections/base.py +197 -14
- htmlgraph/collections/bug.py +2 -1
- htmlgraph/collections/chore.py +2 -1
- htmlgraph/collections/epic.py +2 -1
- htmlgraph/collections/feature.py +2 -1
- htmlgraph/collections/insight.py +2 -1
- htmlgraph/collections/metric.py +2 -1
- htmlgraph/collections/pattern.py +2 -1
- htmlgraph/collections/phase.py +2 -1
- htmlgraph/collections/session.py +194 -0
- htmlgraph/collections/spike.py +13 -2
- htmlgraph/collections/task_delegation.py +241 -0
- htmlgraph/collections/todo.py +14 -1
- htmlgraph/collections/traces.py +487 -0
- htmlgraph/config/cost_models.json +56 -0
- htmlgraph/config.py +190 -0
- htmlgraph/context_analytics.py +2 -1
- htmlgraph/converter.py +116 -7
- htmlgraph/cost_analysis/__init__.py +5 -0
- htmlgraph/cost_analysis/analyzer.py +438 -0
- htmlgraph/dashboard.html +2246 -248
- htmlgraph/dashboard.html.backup +6592 -0
- htmlgraph/dashboard.html.bak +7181 -0
- htmlgraph/dashboard.html.bak2 +7231 -0
- htmlgraph/dashboard.html.bak3 +7232 -0
- htmlgraph/db/__init__.py +38 -0
- htmlgraph/db/queries.py +790 -0
- htmlgraph/db/schema.py +1788 -0
- htmlgraph/decorators.py +317 -0
- htmlgraph/dependency_models.py +2 -1
- htmlgraph/deploy.py +26 -27
- htmlgraph/docs/API_REFERENCE.md +841 -0
- htmlgraph/docs/HTTP_API.md +750 -0
- htmlgraph/docs/INTEGRATION_GUIDE.md +752 -0
- htmlgraph/docs/ORCHESTRATION_PATTERNS.md +717 -0
- htmlgraph/docs/README.md +532 -0
- htmlgraph/docs/__init__.py +77 -0
- htmlgraph/docs/docs_version.py +55 -0
- htmlgraph/docs/metadata.py +93 -0
- htmlgraph/docs/migrations.py +232 -0
- htmlgraph/docs/template_engine.py +143 -0
- htmlgraph/docs/templates/_sections/cli_reference.md.j2 +52 -0
- htmlgraph/docs/templates/_sections/core_concepts.md.j2 +29 -0
- htmlgraph/docs/templates/_sections/sdk_basics.md.j2 +69 -0
- htmlgraph/docs/templates/base_agents.md.j2 +78 -0
- htmlgraph/docs/templates/example_user_override.md.j2 +47 -0
- htmlgraph/docs/version_check.py +163 -0
- htmlgraph/edge_index.py +2 -1
- htmlgraph/error_handler.py +544 -0
- htmlgraph/event_log.py +86 -37
- htmlgraph/event_migration.py +2 -1
- htmlgraph/file_watcher.py +12 -8
- htmlgraph/find_api.py +2 -1
- htmlgraph/git_events.py +67 -9
- htmlgraph/hooks/.htmlgraph/.session-warning-state.json +6 -0
- htmlgraph/hooks/.htmlgraph/agents.json +72 -0
- htmlgraph/hooks/.htmlgraph/index.sqlite +0 -0
- htmlgraph/hooks/__init__.py +8 -0
- htmlgraph/hooks/bootstrap.py +169 -0
- htmlgraph/hooks/cigs_pretool_enforcer.py +354 -0
- htmlgraph/hooks/concurrent_sessions.py +208 -0
- htmlgraph/hooks/context.py +350 -0
- htmlgraph/hooks/drift_handler.py +525 -0
- htmlgraph/hooks/event_tracker.py +790 -99
- htmlgraph/hooks/git_commands.py +175 -0
- htmlgraph/hooks/installer.py +5 -1
- htmlgraph/hooks/orchestrator.py +327 -76
- htmlgraph/hooks/orchestrator_reflector.py +31 -4
- htmlgraph/hooks/post_tool_use_failure.py +32 -7
- htmlgraph/hooks/post_tool_use_handler.py +257 -0
- htmlgraph/hooks/posttooluse.py +92 -19
- htmlgraph/hooks/pretooluse.py +527 -7
- htmlgraph/hooks/prompt_analyzer.py +637 -0
- htmlgraph/hooks/session_handler.py +668 -0
- htmlgraph/hooks/session_summary.py +395 -0
- htmlgraph/hooks/state_manager.py +504 -0
- htmlgraph/hooks/subagent_detection.py +202 -0
- htmlgraph/hooks/subagent_stop.py +369 -0
- htmlgraph/hooks/task_enforcer.py +99 -4
- htmlgraph/hooks/validator.py +212 -91
- htmlgraph/ids.py +2 -1
- htmlgraph/learning.py +125 -100
- htmlgraph/mcp_server.py +2 -1
- htmlgraph/models.py +217 -18
- htmlgraph/operations/README.md +62 -0
- htmlgraph/operations/__init__.py +79 -0
- htmlgraph/operations/analytics.py +339 -0
- htmlgraph/operations/bootstrap.py +289 -0
- htmlgraph/operations/events.py +244 -0
- htmlgraph/operations/fastapi_server.py +231 -0
- htmlgraph/operations/hooks.py +350 -0
- htmlgraph/operations/initialization.py +597 -0
- htmlgraph/operations/initialization.py.backup +228 -0
- htmlgraph/operations/server.py +303 -0
- htmlgraph/orchestration/__init__.py +58 -0
- htmlgraph/orchestration/claude_launcher.py +179 -0
- htmlgraph/orchestration/command_builder.py +72 -0
- htmlgraph/orchestration/headless_spawner.py +281 -0
- htmlgraph/orchestration/live_events.py +377 -0
- htmlgraph/orchestration/model_selection.py +327 -0
- htmlgraph/orchestration/plugin_manager.py +140 -0
- htmlgraph/orchestration/prompts.py +137 -0
- htmlgraph/orchestration/spawner_event_tracker.py +383 -0
- htmlgraph/orchestration/spawners/__init__.py +16 -0
- htmlgraph/orchestration/spawners/base.py +194 -0
- htmlgraph/orchestration/spawners/claude.py +173 -0
- htmlgraph/orchestration/spawners/codex.py +435 -0
- htmlgraph/orchestration/spawners/copilot.py +294 -0
- htmlgraph/orchestration/spawners/gemini.py +471 -0
- htmlgraph/orchestration/subprocess_runner.py +36 -0
- htmlgraph/{orchestration.py → orchestration/task_coordination.py} +16 -8
- htmlgraph/orchestration.md +563 -0
- htmlgraph/orchestrator-system-prompt-optimized.txt +863 -0
- htmlgraph/orchestrator.py +2 -1
- htmlgraph/orchestrator_config.py +357 -0
- htmlgraph/orchestrator_mode.py +115 -4
- htmlgraph/parallel.py +2 -1
- htmlgraph/parser.py +86 -6
- htmlgraph/path_query.py +608 -0
- htmlgraph/pattern_matcher.py +636 -0
- htmlgraph/pydantic_models.py +476 -0
- htmlgraph/quality_gates.py +350 -0
- htmlgraph/query_builder.py +2 -1
- htmlgraph/query_composer.py +509 -0
- htmlgraph/reflection.py +443 -0
- htmlgraph/refs.py +344 -0
- htmlgraph/repo_hash.py +512 -0
- htmlgraph/repositories/__init__.py +292 -0
- htmlgraph/repositories/analytics_repository.py +455 -0
- htmlgraph/repositories/analytics_repository_standard.py +628 -0
- htmlgraph/repositories/feature_repository.py +581 -0
- htmlgraph/repositories/feature_repository_htmlfile.py +668 -0
- htmlgraph/repositories/feature_repository_memory.py +607 -0
- htmlgraph/repositories/feature_repository_sqlite.py +858 -0
- htmlgraph/repositories/filter_service.py +620 -0
- htmlgraph/repositories/filter_service_standard.py +445 -0
- htmlgraph/repositories/shared_cache.py +621 -0
- htmlgraph/repositories/shared_cache_memory.py +395 -0
- htmlgraph/repositories/track_repository.py +552 -0
- htmlgraph/repositories/track_repository_htmlfile.py +619 -0
- htmlgraph/repositories/track_repository_memory.py +508 -0
- htmlgraph/repositories/track_repository_sqlite.py +711 -0
- htmlgraph/sdk/__init__.py +398 -0
- htmlgraph/sdk/__init__.pyi +14 -0
- htmlgraph/sdk/analytics/__init__.py +19 -0
- htmlgraph/sdk/analytics/engine.py +155 -0
- htmlgraph/sdk/analytics/helpers.py +178 -0
- htmlgraph/sdk/analytics/registry.py +109 -0
- htmlgraph/sdk/base.py +484 -0
- htmlgraph/sdk/constants.py +216 -0
- htmlgraph/sdk/core.pyi +308 -0
- htmlgraph/sdk/discovery.py +120 -0
- htmlgraph/sdk/help/__init__.py +12 -0
- htmlgraph/sdk/help/mixin.py +699 -0
- htmlgraph/sdk/mixins/__init__.py +15 -0
- htmlgraph/sdk/mixins/attribution.py +113 -0
- htmlgraph/sdk/mixins/mixin.py +410 -0
- htmlgraph/sdk/operations/__init__.py +12 -0
- htmlgraph/sdk/operations/mixin.py +427 -0
- htmlgraph/sdk/orchestration/__init__.py +17 -0
- htmlgraph/sdk/orchestration/coordinator.py +203 -0
- htmlgraph/sdk/orchestration/spawner.py +204 -0
- htmlgraph/sdk/planning/__init__.py +19 -0
- htmlgraph/sdk/planning/bottlenecks.py +93 -0
- htmlgraph/sdk/planning/mixin.py +211 -0
- htmlgraph/sdk/planning/parallel.py +186 -0
- htmlgraph/sdk/planning/queue.py +210 -0
- htmlgraph/sdk/planning/recommendations.py +87 -0
- htmlgraph/sdk/planning/smart_planning.py +319 -0
- htmlgraph/sdk/session/__init__.py +19 -0
- htmlgraph/sdk/session/continuity.py +57 -0
- htmlgraph/sdk/session/handoff.py +110 -0
- htmlgraph/sdk/session/info.py +309 -0
- htmlgraph/sdk/session/manager.py +103 -0
- htmlgraph/sdk/strategic/__init__.py +26 -0
- htmlgraph/sdk/strategic/mixin.py +563 -0
- htmlgraph/server.py +295 -107
- htmlgraph/session_hooks.py +300 -0
- htmlgraph/session_manager.py +285 -3
- htmlgraph/session_registry.py +587 -0
- htmlgraph/session_state.py +436 -0
- htmlgraph/session_warning.py +2 -1
- htmlgraph/sessions/__init__.py +23 -0
- htmlgraph/sessions/handoff.py +756 -0
- htmlgraph/system_prompts.py +450 -0
- htmlgraph/templates/orchestration-view.html +350 -0
- htmlgraph/track_builder.py +33 -1
- htmlgraph/track_manager.py +38 -0
- htmlgraph/transcript.py +18 -5
- htmlgraph/validation.py +115 -0
- htmlgraph/watch.py +2 -1
- htmlgraph/work_type_utils.py +2 -1
- {htmlgraph-0.20.1.data → htmlgraph-0.27.5.data}/data/htmlgraph/dashboard.html +2246 -248
- {htmlgraph-0.20.1.dist-info → htmlgraph-0.27.5.dist-info}/METADATA +95 -64
- htmlgraph-0.27.5.dist-info/RECORD +337 -0
- {htmlgraph-0.20.1.dist-info → htmlgraph-0.27.5.dist-info}/entry_points.txt +1 -1
- htmlgraph/cli.py +0 -4839
- htmlgraph/sdk.py +0 -2359
- htmlgraph-0.20.1.dist-info/RECORD +0 -118
- {htmlgraph-0.20.1.data → htmlgraph-0.27.5.data}/data/htmlgraph/styles.css +0 -0
- {htmlgraph-0.20.1.data → htmlgraph-0.27.5.data}/data/htmlgraph/templates/AGENTS.md.template +0 -0
- {htmlgraph-0.20.1.data → htmlgraph-0.27.5.data}/data/htmlgraph/templates/CLAUDE.md.template +0 -0
- {htmlgraph-0.20.1.data → htmlgraph-0.27.5.data}/data/htmlgraph/templates/GEMINI.md.template +0 -0
- {htmlgraph-0.20.1.dist-info → htmlgraph-0.27.5.dist-info}/WHEEL +0 -0
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Repository Pattern Implementation for HtmlGraph.
|
|
3
|
+
|
|
4
|
+
Provides abstract interfaces and implementations for data access.
|
|
5
|
+
Unifies access patterns across SDK, CLI, Collections, and Analytics.
|
|
6
|
+
|
|
7
|
+
## Core Concepts
|
|
8
|
+
|
|
9
|
+
**Repository**: Abstract interface for data access
|
|
10
|
+
- Hides storage implementation details
|
|
11
|
+
- Provides consistent query/filter API
|
|
12
|
+
- Manages caching and lifecycle
|
|
13
|
+
|
|
14
|
+
**Compliance Tests**: Every implementation must pass these
|
|
15
|
+
- Identity invariants (object caching)
|
|
16
|
+
- ACID properties
|
|
17
|
+
- Error handling contracts
|
|
18
|
+
- Performance characteristics
|
|
19
|
+
|
|
20
|
+
## Components
|
|
21
|
+
|
|
22
|
+
### FeatureRepository
|
|
23
|
+
Abstract interface for Feature data access.
|
|
24
|
+
|
|
25
|
+
```python
|
|
26
|
+
from htmlgraph.repositories import FeatureRepository
|
|
27
|
+
|
|
28
|
+
# Usage (implemented by SDK/Collections)
|
|
29
|
+
repo = sdk.features # Implements FeatureRepository
|
|
30
|
+
|
|
31
|
+
# Get single feature
|
|
32
|
+
feature = repo.get("feat-001")
|
|
33
|
+
|
|
34
|
+
# List with filters
|
|
35
|
+
todo_features = repo.list({"status": "todo"})
|
|
36
|
+
|
|
37
|
+
# Build complex queries
|
|
38
|
+
repo.where(status="todo").where(priority="high").execute()
|
|
39
|
+
|
|
40
|
+
# Batch operations
|
|
41
|
+
repo.batch_update(["f1", "f2"], {"status": "done"})
|
|
42
|
+
|
|
43
|
+
# Advanced queries
|
|
44
|
+
deps = repo.find_dependencies("feat-auth")
|
|
45
|
+
blocking = repo.find_blocking("feat-db-migration")
|
|
46
|
+
|
|
47
|
+
# Cache management
|
|
48
|
+
repo.invalidate_cache("feat-001")
|
|
49
|
+
repo.reload()
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Implementation Guide
|
|
53
|
+
|
|
54
|
+
To implement FeatureRepository:
|
|
55
|
+
|
|
56
|
+
1. **Inherit from FeatureRepository**:
|
|
57
|
+
```python
|
|
58
|
+
class MyFeatureRepository(FeatureRepository):
|
|
59
|
+
def __init__(self, ...):
|
|
60
|
+
self._cache = {} # Object identity cache
|
|
61
|
+
# ...
|
|
62
|
+
|
|
63
|
+
def get(self, feature_id):
|
|
64
|
+
if feature_id in self._cache:
|
|
65
|
+
return self._cache[feature_id] # Return cached instance
|
|
66
|
+
# Load from storage
|
|
67
|
+
feature = self._load(feature_id)
|
|
68
|
+
if feature:
|
|
69
|
+
self._cache[feature_id] = feature
|
|
70
|
+
return feature
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
2. **Implement all abstract methods** with proper signatures
|
|
74
|
+
|
|
75
|
+
3. **Pass compliance tests**:
|
|
76
|
+
```python
|
|
77
|
+
class TestMyFeatureRepository(FeatureRepositoryComplianceTests):
|
|
78
|
+
@pytest.fixture
|
|
79
|
+
def repo(self):
|
|
80
|
+
return MyFeatureRepository()
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
4. **Contract enforcement**:
|
|
84
|
+
- Identity invariant: `get(id)` returns same instance
|
|
85
|
+
- Atomicity: writes are all-or-nothing
|
|
86
|
+
- Cache sync: cached objects stay in sync with storage
|
|
87
|
+
- Error handling: all exceptions properly raised
|
|
88
|
+
|
|
89
|
+
## Design Patterns
|
|
90
|
+
|
|
91
|
+
### Lazy Loading
|
|
92
|
+
Features loaded on-demand, not all at once:
|
|
93
|
+
```python
|
|
94
|
+
feature = repo.get("feat-001") # Loads only this feature
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Caching
|
|
98
|
+
Object instances cached for identity:
|
|
99
|
+
```python
|
|
100
|
+
f1 = repo.get("feat-001")
|
|
101
|
+
f2 = repo.get("feat-001")
|
|
102
|
+
assert f1 is f2 # Same instance, not copy
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### Query Building
|
|
106
|
+
Fluent interface for complex queries:
|
|
107
|
+
```python
|
|
108
|
+
results = repo.where(status="todo") \
|
|
109
|
+
.where(priority="high") \
|
|
110
|
+
.execute()
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### Batch Operations
|
|
114
|
+
Vectorized bulk operations for efficiency:
|
|
115
|
+
```python
|
|
116
|
+
# More efficient than N individual saves
|
|
117
|
+
repo.batch_update(["f1", "f2", "f3"], {"status": "done"})
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### Cache Invalidation
|
|
121
|
+
When external processes modify storage:
|
|
122
|
+
```python
|
|
123
|
+
repo.invalidate_cache() # Force reload on next access
|
|
124
|
+
repo.reload() # Immediate reload
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## Contract Invariants
|
|
128
|
+
|
|
129
|
+
Every FeatureRepository implementation MUST maintain:
|
|
130
|
+
|
|
131
|
+
1. **Identity Invariant**
|
|
132
|
+
- `get(id)` returns same object instance for same feature
|
|
133
|
+
- Multiple calls return identical object (is, not ==)
|
|
134
|
+
- Supports weak references for memory efficiency
|
|
135
|
+
|
|
136
|
+
2. **Atomicity**
|
|
137
|
+
- Write operations are atomic (all or nothing)
|
|
138
|
+
- No partial updates on failure
|
|
139
|
+
- Rollback on exception
|
|
140
|
+
|
|
141
|
+
3. **Consistency**
|
|
142
|
+
- Cache stays in sync with storage
|
|
143
|
+
- Invalidate when external changes detected
|
|
144
|
+
- Reload reconciles state
|
|
145
|
+
|
|
146
|
+
4. **Isolation**
|
|
147
|
+
- Concurrent reads allowed
|
|
148
|
+
- Concurrent writes serialized
|
|
149
|
+
- No data corruption on race conditions
|
|
150
|
+
|
|
151
|
+
5. **Error Handling**
|
|
152
|
+
- All errors preserve full context
|
|
153
|
+
- Proper exception types raised
|
|
154
|
+
- No silent failures
|
|
155
|
+
|
|
156
|
+
## Performance Characteristics
|
|
157
|
+
|
|
158
|
+
| Operation | Time | Notes |
|
|
159
|
+
|-----------|------|-------|
|
|
160
|
+
| get(id) | O(1) cached, O(log n) uncached | Identity caching |
|
|
161
|
+
| list() | O(n) | Full scan, early termination possible |
|
|
162
|
+
| where() | O(n) | Chain builds filters |
|
|
163
|
+
| batch_get(k) | O(k) | Vectorized, k = batch size |
|
|
164
|
+
| batch_update(k) | O(k) | Vectorized |
|
|
165
|
+
| batch_delete(k) | O(k) | Vectorized |
|
|
166
|
+
| find_dependencies() | O(n) | Graph traversal |
|
|
167
|
+
| count() | O(n) or O(1) | Depends on implementation |
|
|
168
|
+
| exists() | O(1) | Optimized check |
|
|
169
|
+
|
|
170
|
+
## Testing
|
|
171
|
+
|
|
172
|
+
Run compliance tests:
|
|
173
|
+
```bash
|
|
174
|
+
pytest tests/unit/repositories/test_feature_repository_compliance.py -v
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
Test concrete implementation:
|
|
178
|
+
```bash
|
|
179
|
+
pytest tests/unit/repositories/test_my_feature_repository.py -v
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
## See Also
|
|
183
|
+
|
|
184
|
+
- `feature_repository.py` - Interface definition
|
|
185
|
+
- `test_feature_repository_compliance.py` - Compliance test suite
|
|
186
|
+
- `src/python/htmlgraph/collections/base.py` - Current implementation
|
|
187
|
+
- `src/python/htmlgraph/sdk/collections/features.py` - SDK usage
|
|
188
|
+
"""
|
|
189
|
+
|
|
190
|
+
# Analytics Repository
|
|
191
|
+
from .analytics_repository import (
|
|
192
|
+
AnalysisError,
|
|
193
|
+
AnalyticsRepository,
|
|
194
|
+
AnalyticsRepositoryError,
|
|
195
|
+
DependencyAnalysis,
|
|
196
|
+
InvalidItemError,
|
|
197
|
+
WorkRecommendation,
|
|
198
|
+
)
|
|
199
|
+
from .analytics_repository_standard import StandardAnalyticsRepository
|
|
200
|
+
from .feature_repository import (
|
|
201
|
+
FeatureConcurrencyError,
|
|
202
|
+
FeatureNotFoundError,
|
|
203
|
+
FeatureRepository,
|
|
204
|
+
FeatureRepositoryError,
|
|
205
|
+
FeatureValidationError,
|
|
206
|
+
RepositoryQuery,
|
|
207
|
+
)
|
|
208
|
+
from .feature_repository_htmlfile import HTMLFileFeatureRepository
|
|
209
|
+
|
|
210
|
+
# Concrete implementations - Features
|
|
211
|
+
from .feature_repository_memory import MemoryFeatureRepository
|
|
212
|
+
from .feature_repository_sqlite import SQLiteFeatureRepository
|
|
213
|
+
|
|
214
|
+
# Filter Service
|
|
215
|
+
from .filter_service import (
|
|
216
|
+
Filter,
|
|
217
|
+
FilterLogic,
|
|
218
|
+
FilterOperator,
|
|
219
|
+
FilterService,
|
|
220
|
+
FilterServiceError,
|
|
221
|
+
InvalidFilterError,
|
|
222
|
+
)
|
|
223
|
+
from .filter_service_standard import StandardFilterService
|
|
224
|
+
|
|
225
|
+
# Shared Cache
|
|
226
|
+
from .shared_cache import (
|
|
227
|
+
CacheCapacityError,
|
|
228
|
+
CacheKeyError,
|
|
229
|
+
SharedCache,
|
|
230
|
+
SharedCacheError,
|
|
231
|
+
get_shared_cache,
|
|
232
|
+
)
|
|
233
|
+
from .shared_cache_memory import MemorySharedCache
|
|
234
|
+
from .track_repository import (
|
|
235
|
+
TrackConcurrencyError,
|
|
236
|
+
TrackNotFoundError,
|
|
237
|
+
TrackRepository,
|
|
238
|
+
TrackRepositoryError,
|
|
239
|
+
TrackValidationError,
|
|
240
|
+
)
|
|
241
|
+
from .track_repository_htmlfile import HTMLFileTrackRepository
|
|
242
|
+
|
|
243
|
+
# Concrete implementations - Tracks
|
|
244
|
+
from .track_repository_memory import MemoryTrackRepository
|
|
245
|
+
from .track_repository_sqlite import SQLiteTrackRepository
|
|
246
|
+
|
|
247
|
+
__all__ = [
|
|
248
|
+
# Feature Repository
|
|
249
|
+
"FeatureRepository",
|
|
250
|
+
"FeatureRepositoryError",
|
|
251
|
+
"FeatureNotFoundError",
|
|
252
|
+
"FeatureValidationError",
|
|
253
|
+
"FeatureConcurrencyError",
|
|
254
|
+
"RepositoryQuery",
|
|
255
|
+
# Feature implementations
|
|
256
|
+
"MemoryFeatureRepository",
|
|
257
|
+
"HTMLFileFeatureRepository",
|
|
258
|
+
"SQLiteFeatureRepository",
|
|
259
|
+
# Track Repository
|
|
260
|
+
"TrackRepository",
|
|
261
|
+
"TrackRepositoryError",
|
|
262
|
+
"TrackNotFoundError",
|
|
263
|
+
"TrackValidationError",
|
|
264
|
+
"TrackConcurrencyError",
|
|
265
|
+
# Track implementations
|
|
266
|
+
"MemoryTrackRepository",
|
|
267
|
+
"HTMLFileTrackRepository",
|
|
268
|
+
"SQLiteTrackRepository",
|
|
269
|
+
# Analytics Repository
|
|
270
|
+
"AnalyticsRepository",
|
|
271
|
+
"DependencyAnalysis",
|
|
272
|
+
"WorkRecommendation",
|
|
273
|
+
"AnalyticsRepositoryError",
|
|
274
|
+
"AnalysisError",
|
|
275
|
+
"InvalidItemError",
|
|
276
|
+
"StandardAnalyticsRepository",
|
|
277
|
+
# Filter Service
|
|
278
|
+
"FilterService",
|
|
279
|
+
"Filter",
|
|
280
|
+
"FilterOperator",
|
|
281
|
+
"FilterLogic",
|
|
282
|
+
"FilterServiceError",
|
|
283
|
+
"InvalidFilterError",
|
|
284
|
+
"StandardFilterService",
|
|
285
|
+
# Shared Cache
|
|
286
|
+
"SharedCache",
|
|
287
|
+
"SharedCacheError",
|
|
288
|
+
"CacheKeyError",
|
|
289
|
+
"CacheCapacityError",
|
|
290
|
+
"get_shared_cache",
|
|
291
|
+
"MemorySharedCache",
|
|
292
|
+
]
|