Skip to content

Commit 269f227

Browse files
author
Peter
committed
Phase 4/5 nav fixes: store method signatures, add associated items storage; wire parser to emit _associated_item and resolve method IDs via rustdoc index; improve trait path FQN resolution via cached paths; synthesize methods for resolve_method fallback; add robust error catalog already present. Includes ingestion wiring and logging.
1 parent 1e33ab0 commit 269f227

File tree

23 files changed

+6748
-54
lines changed

23 files changed

+6748
-54
lines changed

.code/agents/07d7fe10-6be7-42e8-935f-43f4663236f9/result.txt

Lines changed: 1718 additions & 0 deletions
Large diffs are not rendered by default.

.code/agents/144b1295-5223-4411-9387-30264685cd53/result.txt

Lines changed: 651 additions & 0 deletions
Large diffs are not rendered by default.

.code/agents/37d52e90-e0a7-4870-86a3-9657c8b16a3e/result.txt

Lines changed: 422 additions & 0 deletions
Large diffs are not rendered by default.

.code/agents/7bf4d79e-7689-4e39-8e11-7959ddff93bb/result.txt

Lines changed: 1004 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
I will start by examining the files to confirm the analysis and then propose the necessary changes. I'll begin with the Pydantic models and the cross-reference service.
2+
Based on the analysis, I will now apply the necessary code modifications to align the Pydantic models with the service layer and ensure the tests pass.
3+
4+
First, I'll update the data models in `src/docsrs_mcp/models/cross_references.py`.Acknowledged. I am in a read-only environment and cannot apply file modifications directly. As requested, here is the patch to fix the schema validation issue, along with implementation notes.
5+
6+
### Implementation Notes
7+
8+
The following changes address the Pydantic schema mismatch and service layer inconsistencies:
9+
10+
1. **`src/docsrs_mcp/models/cross_references.py`**:
11+
* **`MigrationSuggestion`**: Added an optional `notes: str | None` field to accommodate the migration guidance generated by the service. The `old_path` and `new_path` fields are now optional (`str | None`) to correctly handle cases where a database query returns `NULL` (e.g., for 'added' or 'removed' changes).
12+
* **`ImportAlternative`**: Added an optional `alias: str | None` field to prevent validation errors when the `resolve_import` service includes an alias in its response.
13+
14+
2. **`src/docsrs_mcp/services/cross_reference_service.py`**:
15+
* **`suggest_migrations`**:
16+
* The method's return type was changed from `MigrationSuggestionsResponse` to `list[dict]` to align with test expectations.
17+
* It now converts `MigrationSuggestion` model instances to dictionaries using `.model_dump()` before returning them.
18+
* **`_generate_migration_notes`**: Implemented this missing helper method to generate descriptive notes for each migration suggestion based on the change type.
19+
* **`_get_pattern_based_suggestions`**: Implemented this missing `async` helper, which acts as a wrapper around the existing synchronous `_pattern_based_migrations` method. This fixes the `AttributeError` that occurred during the fallback logic.
20+
21+
These changes ensure that the service layer produces data in the shape expected by both the API handlers (which wrap results in Pydantic models) and the test suite, resolving the `ValidationError` and `AttributeError` bugs.
22+
23+
---
24+
25+
### Patch
26+
27+
Here are the changes in diff format that you can apply.
28+
29+
**`src/docsrs_mcp/models/cross_references.py`**
30+
31+
```diff
32+
--- a/src/docsrs_mcp/models/cross_references.py
33+
+++ b/src/docsrs_mcp/models/cross_references.py
34+
@@ -13,6 +13,7 @@
35+
path: str = Field(..., description="Alternative import path")
36+
confidence: float = Field(..., description="Confidence score (0.0-1.0)")
37+
link_type: str = Field(..., validation_alias=AliasChoices("link_type", "type"), serialization_alias="link_type", description="Type of link (reexport, crossref, etc.)")
38+
+ alias: str | None = Field(None, description="Alias path if re-exported")
39+
40+
model_config = strict_config
41+
42+
@@ -55,12 +56,13 @@
43+
class MigrationSuggestion(BaseModel):
44+
"""Suggestion for migrating between versions."""
45+
46+
- old_path: str = Field(..., description="Path in old version")
47+
- new_path: str = Field(..., description="Path in new version")
48+
+ old_path: str | None = Field(..., description="Path in old version")
49+
+ new_path: str | None = Field(..., description="Path in new version")
50+
change_type: str = Field(
51+
..., description="Type of change (renamed, moved, removed, added)"
52+
)
53+
confidence: float = Field(..., description="Suggestion confidence (0.0-1.0)")
54+
+ notes: str | None = Field(None, description="Additional migration guidance")
55+
56+
model_config = strict_config
57+
58+
59+
```
60+
61+
**`src/docsrs_mcp/services/cross_reference_service.py`**
62+
63+
```diff
64+
--- a/src/docsrs_mcp/services/cross_reference_service.py
65+
+++ b/src/docsrs_mcp/services/cross_reference_service.py
66+
@@ -342,16 +342,16 @@
67+
68+
async def suggest_migrations(
69+
self, crate_name: str, from_version: str, to_version: str
70+
- ) -> MigrationSuggestionsResponse:
71+
+ ) -> list[dict]:
72+
"""Suggest migration paths between versions.
73+
-
74+
+
75+
Args:
76+
crate_name: Name of the crate
77+
from_version: Source version
78+
to_version: Target version
79+
-
80+
+
81+
Returns:
82+
- Migration suggestions with confidence scores
83+
+ A list of migration suggestion dictionaries.
84+
"""
85+
suggestions = []
86+
87+
@@ -420,22 +420,41 @@
88+
new_path=new_path,
89+
change_type=change_type,
90+
confidence=confidence,
91+
- notes=self._generate_migration_notes(change_type, old_path, new_path)
92+
+ notes=self._generate_migration_notes(
93+
+ change_type, old_path, new_path
94+
+ ),
95+
)
96+
- suggestions.append(suggestion)
97+
+ suggestions.append(suggestion.model_dump())
98+
99+
except Exception as e:
100+
logger.warning(f"Database query failed, using pattern-based fallback: {e}")
101+
# Fallback to pattern-based suggestions
102+
suggestions = await self._get_pattern_based_suggestions(
103+
crate_name, from_version, to_version
104+
)
105+
-
106+
- return MigrationSuggestionsResponse(
107+
- crate_name=crate_name,
108+
- from_version=from_version,
109+
- to_version=to_version,
110+
- suggestions=suggestions
111+
- )
112+
+
113+
+ return suggestions
114+
+
115+
+ def _generate_migration_notes(
116+
+ self, change_type: str, old_path: str | None, new_path: str | None
117+
+ ) -> str:
118+
+ """Generate helpful notes for a migration suggestion."""
119+
+ if change_type == "removed":
120+
+ return f"The item `{old_path}` was removed. Consider finding a replacement or removing its usage."
121+
+ if change_type == "added":
122+
+ return f"A new item `{new_path}` was added. You may be able to use it."
123+
+ if change_type == "renamed" or change_type == "moved":
124+
+ return f"The item `{old_path}` was moved or renamed to `{new_path}`. Update your import paths."
125+
+ if change_type == "modified":
126+
+ return f"The signature of `{old_path}` has changed. Please review the new API."
127+
+ return "A change was detected, please review."
128+
+
129+
+ async def _get_pattern_based_suggestions(
130+
+ self, crate_name: str, from_version: str, to_version: str
131+
+ ) -> list[dict]:
132+
+ """Async wrapper for pattern-based migration suggestions."""
133+
+ return self._pattern_based_migrations(crate_name, from_version, to_version)
134+
135+
def _pattern_based_migrations(
136+
self, crate_name: str, from_version: str, to_version: str
137+
138+
```

0 commit comments

Comments
 (0)