From de77b6ea9c495c0c305a095fd95122985cfd209a Mon Sep 17 00:00:00 2001 From: Mark Baggett Date: Mon, 6 Jan 2025 16:27:44 -0600 Subject: [PATCH 01/10] Init add_rendering() on everything according to skeleton. --- docs/recipes/0046-rendering.md | 7 +++++++ iiif_prezi3/helpers/__init__.py | 1 + iiif_prezi3/helpers/add_rendering.py | 23 +++++++++++++++++++++++ 3 files changed, 31 insertions(+) create mode 100644 docs/recipes/0046-rendering.md create mode 100644 iiif_prezi3/helpers/add_rendering.py diff --git a/docs/recipes/0046-rendering.md b/docs/recipes/0046-rendering.md new file mode 100644 index 0000000..a8813c7 --- /dev/null +++ b/docs/recipes/0046-rendering.md @@ -0,0 +1,7 @@ +# Providing Alternative Representations +| | **Cookbook URLs** | +|--------------|-------------------| +| **Recipe:** | [https://iiif.io/api/cookbook/recipe/0046-rendering/](https://iiif.io/api/cookbook/recipe/0046-rendering/) | +| **JSON-LD:** | [https://iiif.io/api/cookbook/recipe/0046-rendering/manifest.json](https://iiif.io/api/cookbook/recipe/0046-rendering/manifest.json) | + +### Method 1 - diff --git a/iiif_prezi3/helpers/__init__.py b/iiif_prezi3/helpers/__init__.py index 2093398..3a57cf5 100644 --- a/iiif_prezi3/helpers/__init__.py +++ b/iiif_prezi3/helpers/__init__.py @@ -3,6 +3,7 @@ from .add_label import AddLabel # noqa: F401 from .add_metadata import AddMetadata # noqa: F401 from .add_range import AddRange # noqa: F401 +from .add_rendering import AddRendering # noqa: F401 from .add_service import AddService # noqa: F401 from .add_thumbnail import AddThumbnail # noqa: F401 from .annotation_helpers import AnnotationHelpers # noqa: F401 diff --git a/iiif_prezi3/helpers/add_rendering.py b/iiif_prezi3/helpers/add_rendering.py new file mode 100644 index 0000000..8ed879c --- /dev/null +++ b/iiif_prezi3/helpers/add_rendering.py @@ -0,0 +1,23 @@ +from ..loader import monkeypatch_schema +from ..skeleton import (ExternalItem, AnnotationPage, AccompanyingCanvas, Annotation, AnnotationCollection, Canvas, + PlaceholderCanvas, Range, ResourceItem, Collection, Manifest) + + +class AddRendering: + def add_rendering(self, external_item): + """Add an external item to a rendering list. + + Args: + external_item (ExternalItem): An ExternalItem instance. + """ + if isinstance(external_item, (ExternalItem)): + if not hasattr(self, 'rendering') or self.rendering is None: + self.rendering = [] + self.rendering.append(external_item) + self.rendering = self.rendering + else: + raise TypeError("Not a valid ExternalItem instance.") + + +monkeypatch_schema([ AnnotationPage, AccompanyingCanvas, Annotation, AnnotationCollection, Canvas, + PlaceholderCanvas, Range, ResourceItem, Collection, Manifest ], AddRendering) From 2438c884ef8ae7c9adeae13a2c7e8a76f612b8a6 Mon Sep 17 00:00:00 2001 From: Mark Baggett Date: Mon, 6 Jan 2025 16:28:43 -0600 Subject: [PATCH 02/10] Add solution to 0046. --- docs/recipes/0046-rendering.md | 3 + .../scripts/0046-rendering-method-1.py | 55 +++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 docs/recipes/scripts/0046-rendering-method-1.py diff --git a/docs/recipes/0046-rendering.md b/docs/recipes/0046-rendering.md index a8813c7..fd7eee6 100644 --- a/docs/recipes/0046-rendering.md +++ b/docs/recipes/0046-rendering.md @@ -5,3 +5,6 @@ | **JSON-LD:** | [https://iiif.io/api/cookbook/recipe/0046-rendering/manifest.json](https://iiif.io/api/cookbook/recipe/0046-rendering/manifest.json) | ### Method 1 - +```python +--8<-- "docs/recipes/scripts/0047-homepage-method1.py" +``` \ No newline at end of file diff --git a/docs/recipes/scripts/0046-rendering-method-1.py b/docs/recipes/scripts/0046-rendering-method-1.py new file mode 100644 index 0000000..d739e7f --- /dev/null +++ b/docs/recipes/scripts/0046-rendering-method-1.py @@ -0,0 +1,55 @@ +from iiif_prezi3 import Manifest, ExternalItem, config + +config.configs['helpers.auto_fields.AutoLang'].auto_lang = "en" +base_url = "https://iiif.io/api/cookbook/recipe/0046-rendering" + +rendering = ExternalItem( + id="https://fixtures.iiif.io/other/UCLA/kabuki_ezukushi_rtl.pdf", + type="Text", + label="PDF version", + format="application/pdf" +) +manifest = Manifest( + id=f"{base_url}/manifest.json", + label="Alternative Representations Through Rendering", + summary="Playbill for \"Akiba gongen kaisen-banashi,\" \"Futatsu chōchō kuruwa nikki\" and \"Godairiki koi no fūjime\" performed at the Chikugo Theater in Osaka from the fifth month of Kaei 2 (May, 1849); main actors: Gadō Kataoka II, Ebizō Ichikawa VI, Kitō Sawamura II, Daigorō Mimasu IV and Karoku Nakamura I; on front cover: producer Mominosuke Ichikawa's crest.", + viewingDirection="right-to-left", +) +manifest.add_rendering(rendering) +canvas_front = manifest.make_canvas_from_iiif( + url="https://iiif.io/api/image/3.0/example/reference/4f92cceb12dd53b52433425ce44308c7-ucla_bib1987273_no001_rs_001", + id=f"{base_url}/canvas/p1", + label="front cover", + anno_id=f"{base_url}/annotation/p0001-image", + anno_page_id=f"{base_url}/page/p1/1" +) +canvas_one_two = manifest.make_canvas_from_iiif( + url="https://iiif.io/api/image/3.0/example/reference/4f92cceb12dd53b52433425ce44308c7-ucla_bib1987273_no001_rs_002", + id=f"{base_url}/canvas/p2", + label="pages 1–2", + anno_id=f"{base_url}/annotation/p0002-image", + anno_page_id=f"{base_url}/page/p2/1" +) +canvas_three_four = manifest.make_canvas_from_iiif( + url="https://iiif.io/api/image/3.0/example/reference/4f92cceb12dd53b52433425ce44308c7-ucla_bib1987273_no001_rs_003", + id=f"{base_url}/canvas/p3", + label="pages 3–4", + anno_id=f"{base_url}/annotation/p0003-image", + anno_page_id=f"{base_url}/page/p3/1" +) +canvas_five_six = manifest.make_canvas_from_iiif( + url="https://iiif.io/api/image/3.0/example/reference/4f92cceb12dd53b52433425ce44308c7-ucla_bib1987273_no001_rs_004", + id=f"{base_url}/canvas/p4", + label="pages 5–6", + anno_id=f"{base_url}/annotation/p0004-image", + anno_page_id=f"{base_url}/page/p4/1" +) +canvas_back_cover = manifest.make_canvas_from_iiif( + url="https://iiif.io/api/image/3.0/example/reference/4f92cceb12dd53b52433425ce44308c7-ucla_bib1987273_no001_rs_005", + id=f"{base_url}/canvas/p5", + label="back cover", + anno_id=f"{base_url}/annotation/p0005-image", + anno_page_id=f"{base_url}/page/p5/1" +) + +print(manifest.json(indent=2)) \ No newline at end of file From 306bad62b5eb7db6960da5a0280ea3d734d769a3 Mon Sep 17 00:00:00 2001 From: Mark Baggett Date: Mon, 6 Jan 2025 16:49:28 -0600 Subject: [PATCH 03/10] Init tests. --- tests/test_add_rendering.py | 54 +++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 tests/test_add_rendering.py diff --git a/tests/test_add_rendering.py b/tests/test_add_rendering.py new file mode 100644 index 0000000..3866972 --- /dev/null +++ b/tests/test_add_rendering.py @@ -0,0 +1,54 @@ +import unittest + +from iiif_prezi3 import (AccompanyingCanvas, Annotation, AnnotationCollection, + AnnotationPage, Canvas, Collection, ExternalItem, + Manifest, PlaceholderCanvas, Range, ResourceItem) + + +class AddRenderingTest(unittest.TestCase): + + def setUp(self): + self.base = "https://example.org/iiif" + self.external_item = ExternalItem(format="application/pdf", + id="https://fixtures.iiif.io/other/UCLA/kabuki_ezukushi_rtl.pdf", + type="Text") + self.canvas = Canvas(id=f"{self.base}/canvas/1") + self.annotation = Annotation(target=f"{self.base}/canvas/1") + self.anno_page = AnnotationPage() + self.ac_canvas = AccompanyingCanvas(type="Canvas") + self.ph_canvas = PlaceholderCanvas() + self.anno_collection = AnnotationCollection() + self.manifest = Manifest(label='test label') + self.range = Range() + self.resource = ResourceItem(id=f"{self.base}/resource/1", type="Image") + self.collection = Collection() + + def test_add_rendering_to_collection(self): + self.collection.add_rendering(self.external_item) + + def test_add_rendering_to_anno_collection(self): + self.anno_collection.add_rendering(self.external_item) + + def test_add_rendering_to_annotation(self): + self.annotation.add_rendering(self.external_item) + + def test_add_rendering_to_canvas(self): + self.canvas.add_rendering(self.external_item) + + def test_add_rendering_to_annotation_page(self): + self.anno_page.add_rendering(self.external_item) + + def test_add_rendering_to_annotation(self): + self.annotation.add_rendering(self.external_item) + + def test_add_rendering_to_ac_canvas(self): + self.ac_canvas.add_rendering(self.external_item) + + def test_add_rendering_to_ph_canvas(self): + self.ph_canvas.add_rendering(self.external_item) + + def test_add_rendering_to_resource(self): + self.resource.add_rendering(self.external_item) + + def test_add_rendering_to_manifest(self): + self.manifest.add_rendering(self.external_item) From 3d2f7e4e4350886335fa159d690b44dc15e067d0 Mon Sep 17 00:00:00 2001 From: Mark Baggett Date: Mon, 6 Jan 2025 17:20:06 -0600 Subject: [PATCH 04/10] Fix docs. --- docs/recipes/0046-rendering.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/recipes/0046-rendering.md b/docs/recipes/0046-rendering.md index fd7eee6..642708f 100644 --- a/docs/recipes/0046-rendering.md +++ b/docs/recipes/0046-rendering.md @@ -4,7 +4,7 @@ | **Recipe:** | [https://iiif.io/api/cookbook/recipe/0046-rendering/](https://iiif.io/api/cookbook/recipe/0046-rendering/) | | **JSON-LD:** | [https://iiif.io/api/cookbook/recipe/0046-rendering/manifest.json](https://iiif.io/api/cookbook/recipe/0046-rendering/manifest.json) | -### Method 1 - +### Method 1 - Add External Item with add_rendering_helper ```python ---8<-- "docs/recipes/scripts/0047-homepage-method1.py" +--8<-- "docs/recipes/scripts/0046-rendering-method1.py" ``` \ No newline at end of file From e549d218f1e85d48d9fc458e816a0e0cc40139a1 Mon Sep 17 00:00:00 2001 From: Mark Baggett Date: Mon, 6 Jan 2025 17:24:04 -0600 Subject: [PATCH 05/10] Initialize helper. --- iiif_prezi3/helpers/__init__.py | 2 +- iiif_prezi3/helpers/add_rendering.py | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/iiif_prezi3/helpers/__init__.py b/iiif_prezi3/helpers/__init__.py index 3a57cf5..e7685fd 100644 --- a/iiif_prezi3/helpers/__init__.py +++ b/iiif_prezi3/helpers/__init__.py @@ -3,7 +3,7 @@ from .add_label import AddLabel # noqa: F401 from .add_metadata import AddMetadata # noqa: F401 from .add_range import AddRange # noqa: F401 -from .add_rendering import AddRendering # noqa: F401 +from .add_rendering import AddRendering # noqa: F401 from .add_service import AddService # noqa: F401 from .add_thumbnail import AddThumbnail # noqa: F401 from .annotation_helpers import AnnotationHelpers # noqa: F401 diff --git a/iiif_prezi3/helpers/add_rendering.py b/iiif_prezi3/helpers/add_rendering.py index 8ed879c..19f0bed 100644 --- a/iiif_prezi3/helpers/add_rendering.py +++ b/iiif_prezi3/helpers/add_rendering.py @@ -1,6 +1,7 @@ from ..loader import monkeypatch_schema -from ..skeleton import (ExternalItem, AnnotationPage, AccompanyingCanvas, Annotation, AnnotationCollection, Canvas, - PlaceholderCanvas, Range, ResourceItem, Collection, Manifest) +from ..skeleton import (AccompanyingCanvas, Annotation, AnnotationCollection, + AnnotationPage, Canvas, Collection, ExternalItem, + Manifest, PlaceholderCanvas, Range, ResourceItem) class AddRendering: From 73d19448d411c7186be06cf0ef3b730b0253c982 Mon Sep 17 00:00:00 2001 From: Mark Baggett Date: Mon, 6 Jan 2025 17:28:46 -0600 Subject: [PATCH 06/10] Fix script name. --- .../{0046-rendering-method-1.py => 0046-rendering-method1.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/recipes/scripts/{0046-rendering-method-1.py => 0046-rendering-method1.py} (100%) diff --git a/docs/recipes/scripts/0046-rendering-method-1.py b/docs/recipes/scripts/0046-rendering-method1.py similarity index 100% rename from docs/recipes/scripts/0046-rendering-method-1.py rename to docs/recipes/scripts/0046-rendering-method1.py From e6810804a9f28ad643934bbdc2ea87d51b805ff2 Mon Sep 17 00:00:00 2001 From: Mark Baggett Date: Mon, 6 Jan 2025 17:41:57 -0600 Subject: [PATCH 07/10] Test range and if invalid instance is passed. --- tests/test_add_rendering.py | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/tests/test_add_rendering.py b/tests/test_add_rendering.py index 3866972..d59a9f6 100644 --- a/tests/test_add_rendering.py +++ b/tests/test_add_rendering.py @@ -25,30 +25,44 @@ def setUp(self): def test_add_rendering_to_collection(self): self.collection.add_rendering(self.external_item) + self.assertEqual(self.collection.rendering, [self.external_item]) def test_add_rendering_to_anno_collection(self): self.anno_collection.add_rendering(self.external_item) + self.assertEqual(self.anno_collection.rendering, [self.external_item]) def test_add_rendering_to_annotation(self): self.annotation.add_rendering(self.external_item) + self.assertEqual(self.annotation.rendering, [self.external_item]) def test_add_rendering_to_canvas(self): self.canvas.add_rendering(self.external_item) + self.assertEqual(self.canvas.rendering, [self.external_item]) def test_add_rendering_to_annotation_page(self): self.anno_page.add_rendering(self.external_item) - - def test_add_rendering_to_annotation(self): - self.annotation.add_rendering(self.external_item) + self.assertEqual(self.anno_page.rendering, [self.external_item]) def test_add_rendering_to_ac_canvas(self): self.ac_canvas.add_rendering(self.external_item) + self.assertEqual(self.ac_canvas.rendering, [self.external_item]) def test_add_rendering_to_ph_canvas(self): self.ph_canvas.add_rendering(self.external_item) + self.assertEqual(self.ph_canvas.rendering, [self.external_item]) def test_add_rendering_to_resource(self): self.resource.add_rendering(self.external_item) + self.assertEqual(self.resource.rendering, [self.external_item]) def test_add_rendering_to_manifest(self): self.manifest.add_rendering(self.external_item) + self.assertEqual(self.manifest.rendering, [self.external_item]) + + def test_add_rendering_to_range(self): + self.range.add_rendering(self.external_item) + self.assertEqual(self.range.rendering, [self.external_item]) + + def test_pass_invalid_instance_to_add_rendering(self): + with self.assertRaises(TypeError): + self.canvas.add_rendering(self.manifest) \ No newline at end of file From 016f78185f214fade7780a804cb4ca156a9ea921 Mon Sep 17 00:00:00 2001 From: Mark Baggett Date: Thu, 16 Jan 2025 18:08:39 -0600 Subject: [PATCH 08/10] Remove helper. --- docs/recipes/scripts/0046-rendering-method1.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/recipes/scripts/0046-rendering-method1.py b/docs/recipes/scripts/0046-rendering-method1.py index d739e7f..be42b30 100644 --- a/docs/recipes/scripts/0046-rendering-method1.py +++ b/docs/recipes/scripts/0046-rendering-method1.py @@ -14,8 +14,8 @@ label="Alternative Representations Through Rendering", summary="Playbill for \"Akiba gongen kaisen-banashi,\" \"Futatsu chōchō kuruwa nikki\" and \"Godairiki koi no fūjime\" performed at the Chikugo Theater in Osaka from the fifth month of Kaei 2 (May, 1849); main actors: Gadō Kataoka II, Ebizō Ichikawa VI, Kitō Sawamura II, Daigorō Mimasu IV and Karoku Nakamura I; on front cover: producer Mominosuke Ichikawa's crest.", viewingDirection="right-to-left", + rendering=rendering, ) -manifest.add_rendering(rendering) canvas_front = manifest.make_canvas_from_iiif( url="https://iiif.io/api/image/3.0/example/reference/4f92cceb12dd53b52433425ce44308c7-ucla_bib1987273_no001_rs_001", id=f"{base_url}/canvas/p1", From c3d4f8153356189681597b2ee7eae68837c3daa8 Mon Sep 17 00:00:00 2001 From: Mark Baggett Date: Sun, 19 Jan 2025 20:32:07 -0600 Subject: [PATCH 09/10] Rebase changes. --- iiif_prezi3/helpers/__init__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/iiif_prezi3/helpers/__init__.py b/iiif_prezi3/helpers/__init__.py index e7685fd..2093398 100644 --- a/iiif_prezi3/helpers/__init__.py +++ b/iiif_prezi3/helpers/__init__.py @@ -3,7 +3,6 @@ from .add_label import AddLabel # noqa: F401 from .add_metadata import AddMetadata # noqa: F401 from .add_range import AddRange # noqa: F401 -from .add_rendering import AddRendering # noqa: F401 from .add_service import AddService # noqa: F401 from .add_thumbnail import AddThumbnail # noqa: F401 from .annotation_helpers import AnnotationHelpers # noqa: F401 From 4e99d2c7dceed2a06ca9876a041dd2ce2d519faa Mon Sep 17 00:00:00 2001 From: Mark Baggett Date: Sun, 19 Jan 2025 20:34:24 -0600 Subject: [PATCH 10/10] Remove helper and test. --- iiif_prezi3/helpers/add_rendering.py | 24 ---------- tests/test_add_rendering.py | 68 ---------------------------- 2 files changed, 92 deletions(-) delete mode 100644 iiif_prezi3/helpers/add_rendering.py delete mode 100644 tests/test_add_rendering.py diff --git a/iiif_prezi3/helpers/add_rendering.py b/iiif_prezi3/helpers/add_rendering.py deleted file mode 100644 index 19f0bed..0000000 --- a/iiif_prezi3/helpers/add_rendering.py +++ /dev/null @@ -1,24 +0,0 @@ -from ..loader import monkeypatch_schema -from ..skeleton import (AccompanyingCanvas, Annotation, AnnotationCollection, - AnnotationPage, Canvas, Collection, ExternalItem, - Manifest, PlaceholderCanvas, Range, ResourceItem) - - -class AddRendering: - def add_rendering(self, external_item): - """Add an external item to a rendering list. - - Args: - external_item (ExternalItem): An ExternalItem instance. - """ - if isinstance(external_item, (ExternalItem)): - if not hasattr(self, 'rendering') or self.rendering is None: - self.rendering = [] - self.rendering.append(external_item) - self.rendering = self.rendering - else: - raise TypeError("Not a valid ExternalItem instance.") - - -monkeypatch_schema([ AnnotationPage, AccompanyingCanvas, Annotation, AnnotationCollection, Canvas, - PlaceholderCanvas, Range, ResourceItem, Collection, Manifest ], AddRendering) diff --git a/tests/test_add_rendering.py b/tests/test_add_rendering.py deleted file mode 100644 index d59a9f6..0000000 --- a/tests/test_add_rendering.py +++ /dev/null @@ -1,68 +0,0 @@ -import unittest - -from iiif_prezi3 import (AccompanyingCanvas, Annotation, AnnotationCollection, - AnnotationPage, Canvas, Collection, ExternalItem, - Manifest, PlaceholderCanvas, Range, ResourceItem) - - -class AddRenderingTest(unittest.TestCase): - - def setUp(self): - self.base = "https://example.org/iiif" - self.external_item = ExternalItem(format="application/pdf", - id="https://fixtures.iiif.io/other/UCLA/kabuki_ezukushi_rtl.pdf", - type="Text") - self.canvas = Canvas(id=f"{self.base}/canvas/1") - self.annotation = Annotation(target=f"{self.base}/canvas/1") - self.anno_page = AnnotationPage() - self.ac_canvas = AccompanyingCanvas(type="Canvas") - self.ph_canvas = PlaceholderCanvas() - self.anno_collection = AnnotationCollection() - self.manifest = Manifest(label='test label') - self.range = Range() - self.resource = ResourceItem(id=f"{self.base}/resource/1", type="Image") - self.collection = Collection() - - def test_add_rendering_to_collection(self): - self.collection.add_rendering(self.external_item) - self.assertEqual(self.collection.rendering, [self.external_item]) - - def test_add_rendering_to_anno_collection(self): - self.anno_collection.add_rendering(self.external_item) - self.assertEqual(self.anno_collection.rendering, [self.external_item]) - - def test_add_rendering_to_annotation(self): - self.annotation.add_rendering(self.external_item) - self.assertEqual(self.annotation.rendering, [self.external_item]) - - def test_add_rendering_to_canvas(self): - self.canvas.add_rendering(self.external_item) - self.assertEqual(self.canvas.rendering, [self.external_item]) - - def test_add_rendering_to_annotation_page(self): - self.anno_page.add_rendering(self.external_item) - self.assertEqual(self.anno_page.rendering, [self.external_item]) - - def test_add_rendering_to_ac_canvas(self): - self.ac_canvas.add_rendering(self.external_item) - self.assertEqual(self.ac_canvas.rendering, [self.external_item]) - - def test_add_rendering_to_ph_canvas(self): - self.ph_canvas.add_rendering(self.external_item) - self.assertEqual(self.ph_canvas.rendering, [self.external_item]) - - def test_add_rendering_to_resource(self): - self.resource.add_rendering(self.external_item) - self.assertEqual(self.resource.rendering, [self.external_item]) - - def test_add_rendering_to_manifest(self): - self.manifest.add_rendering(self.external_item) - self.assertEqual(self.manifest.rendering, [self.external_item]) - - def test_add_rendering_to_range(self): - self.range.add_rendering(self.external_item) - self.assertEqual(self.range.rendering, [self.external_item]) - - def test_pass_invalid_instance_to_add_rendering(self): - with self.assertRaises(TypeError): - self.canvas.add_rendering(self.manifest) \ No newline at end of file