Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 8 additions & 7 deletions src/poly/resources/documents.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
)
from poly.resources.resource import Resource, register_resource

PLATFORM_CONTEXT_FILE = "CONTEXT.MD"


@register_resource("documents")
@dataclass
Expand All @@ -23,10 +25,6 @@ class Document(Resource):
path: str
contents: str

def __post_init__(self) -> None:
"""Normalize path to uppercase to match platform convention."""
self.path = self.path.upper()

@cached_property
def file_path(self) -> str:
"""Get the file path for the Document resource."""
Expand All @@ -49,7 +47,10 @@ def from_pretty(cls, contents: str, **kwargs) -> str:

def validate(self, **kwargs) -> None:
"""Validate the resource."""
pass
if self.path.upper() == PLATFORM_CONTEXT_FILE and self.path != PLATFORM_CONTEXT_FILE:
raise ValueError(
f"Document path must be {PLATFORM_CONTEXT_FILE} (case-sensitive) for the platform context file."
)
Comment on lines +50 to +53

@classmethod
def read_local_resource(
Expand Down Expand Up @@ -118,7 +119,7 @@ def discover_resources(base_path: str) -> list[str]:
for file_name in os.listdir(context_path):
if not file_name.upper().endswith(".MD"):
continue
file_path = os.path.join(context_path, file_name.upper())
file_path = os.path.join(context_path, file_name)
file_paths.append(file_path)
Comment on lines 119 to 123

return file_paths
Expand All @@ -134,7 +135,7 @@ def from_projection(cls, projection: dict) -> dict[str, "Document"]:
if "content" not in document_data:
continue
path = document_data.get("path", "") or ""
name = path.removesuffix(".md")
name = path.removesuffix(".md").removesuffix(".MD")
documents[document_id] = Document(
resource_id=document_id,
name=name,
Expand Down
10 changes: 5 additions & 5 deletions src/poly/tests/project_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -208,9 +208,8 @@ def test_document_round_trip(self):
restored = Document(**serialized)
self.assertEqual(restored.resource_id, "test.md")
self.assertEqual(restored.name, "test")
self.assertEqual(restored.path, "TEST.MD")
self.assertEqual(restored.contents, "hello world\n")
self.assertEqual(restored.file_path, os.path.join("context", "TEST.MD"))
self.assertEqual(restored.path, "test.md")
self.assertEqual(restored.file_path, os.path.join("context", "test.md"))
self.assertEqual(restored.compute_hash(), doc.compute_hash())
Comment on lines 209 to 213

def test_flow_step_round_trip_excludes_sub_resource_internals(self):
Expand Down Expand Up @@ -429,11 +428,12 @@ def test_discover_local_resources(self):
)

# Find Documents
self.assertEqual(len(local_resources[Document]), 1)
self.assertEqual(len(local_resources[Document]), 2)
self.assertCountEqual(
local_resources[Document],
[
os.path.join(TEST_DIR, "context", "TEST_DOCUMENT.MD"),
os.path.join(TEST_DIR, "context", "test_document.md"),
os.path.join(TEST_DIR, "context", "CONTEXT.MD"),
],
)

Expand Down
37 changes: 23 additions & 14 deletions src/poly/tests/resources_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -8620,7 +8620,7 @@ class DocumentTests(unittest.TestCase):

def test_file_path(self):
doc = Document(resource_id="test.md", name="test", path="test.md", contents="hello")
self.assertEqual(doc.file_path, os.path.join("context", "TEST.MD"))
self.assertEqual(doc.file_path, os.path.join("context", "test.md"))

def test_raw(self):
doc = Document(resource_id="test.md", name="test", path="test.md", contents="some content")
Expand Down Expand Up @@ -8648,7 +8648,7 @@ def test_read_local_resource(self):
)
self.assertEqual(doc.resource_id, "doc.md")
self.assertEqual(doc.name, "doc")
self.assertEqual(doc.path, "DOC.MD")
self.assertEqual(doc.path, "doc.md")
self.assertEqual(doc.contents, "file contents\n")

def test_save_and_read_round_trip(self):
Expand All @@ -8663,12 +8663,12 @@ def test_save_and_read_round_trip(self):
)
doc.save(tmpdir)

file_path = os.path.join(tmpdir, "context", "ROUND_TRIP.MD")
file_path = os.path.join(tmpdir, "context", "round_trip.md")
self.assertTrue(os.path.exists(file_path))

restored = Document.read_local_resource(
file_path=file_path,
resource_id="ROUND_TRIP.MD",
resource_id="round_trip.md",
resource_name="round_trip",
)
self.assertEqual(restored.contents, doc.contents)
Expand All @@ -8691,8 +8691,8 @@ def test_discover_resources(self):
self.assertCountEqual(
discovered,
[
os.path.join(context_dir, "DOC1.MD"),
os.path.join(context_dir, "DOC2.MD"),
os.path.join(context_dir, "doc1.md"),
os.path.join(context_dir, "doc2.md"),
],
)

Expand All @@ -8703,16 +8703,25 @@ def test_discover_resources_no_context_dir(self):
discovered = Document.discover_resources(tmpdir)
self.assertEqual(discovered, [])

def test_path_normalized_to_uppercase(self):
"""Documents with different-case paths produce the same normalized path."""
def test_path_case_preserved(self):
"""Document paths are stored as given, not forced to a fixed case."""
doc_lower = Document(resource_id="ctx.md", name="ctx", path="context.md", contents="hello")
doc_upper = Document(resource_id="ctx.md", name="ctx", path="CONTEXT.MD", contents="hello")
doc_mixed = Document(resource_id="ctx.md", name="ctx", path="Context.Md", contents="hello")
self.assertEqual(doc_lower.path, "CONTEXT.MD")
self.assertEqual(doc_upper.path, "CONTEXT.MD")
self.assertEqual(doc_mixed.path, "CONTEXT.MD")
self.assertEqual(doc_lower.file_path, doc_upper.file_path)
self.assertEqual(doc_lower.file_path, doc_mixed.file_path)
self.assertEqual(doc_lower.path, "context.md")
self.assertEqual(doc_mixed.path, "Context.Md")

def test_validate_allows_non_context_paths_in_any_case(self):
doc = Document(resource_id="notes.md", name="notes", path="Notes.Md", contents="hello")
doc.validate()

def test_validate_allows_exact_case_platform_context_file(self):
doc = Document(resource_id="ctx.md", name="ctx", path="CONTEXT.MD", contents="hello")
doc.validate()

def test_validate_rejects_wrong_case_platform_context_file(self):
doc = Document(resource_id="ctx.md", name="ctx", path="context.md", contents="hello")
with self.assertRaises(ValueError):
doc.validate()


class DocumentFromProjection(unittest.TestCase):
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
This is platform context file.
6 changes: 6 additions & 0 deletions src/poly/tests/test_projects/test_project/test_project.json
Original file line number Diff line number Diff line change
Expand Up @@ -1304,6 +1304,12 @@
"name": "test_document",
"path": "test_document.md",
"contents": "This is a test document.\nIt has multiple lines.\n"
},
"CONTEXT.MD": {
"resource_id": "CONTEXT.MD",
"name": "CONTEXT",
"path": "CONTEXT.MD",
"contents": "This is platform context file.\n"
}
}
},
Expand Down
2 changes: 1 addition & 1 deletion uv.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading