From ffc90edab51916096f7e3c810741df2a463df20d Mon Sep 17 00:00:00 2001 From: Ned Twigg Date: Mon, 16 Dec 2024 09:46:21 -0800 Subject: [PATCH] Fixup docs for the python cache. --- selfie.dev/public/dalle-3-py.webp | Bin 0 -> 51474 bytes selfie.dev/src/pages/py/cache.mdx | 145 +++++++++++++++--------------- 2 files changed, 70 insertions(+), 75 deletions(-) create mode 100644 selfie.dev/public/dalle-3-py.webp diff --git a/selfie.dev/public/dalle-3-py.webp b/selfie.dev/public/dalle-3-py.webp new file mode 100644 index 0000000000000000000000000000000000000000..5111e33b30fd98cdfc40474fad8e8a2479ec1fcd GIT binary patch literal 51474 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%0DeQ|#-V(WMXDc+?}6 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 literal 0 HcmV?d00001 diff --git a/selfie.dev/src/pages/py/cache.mdx b/selfie.dev/src/pages/py/cache.mdx index 9f0fe12a..3c8bcc25 100644 --- a/selfie.dev/src/pages/py/cache.mdx +++ b/selfie.dev/src/pages/py/cache.mdx @@ -7,27 +7,18 @@ export const imageUrl = "https://selfie.dev/cache.webp"; -**_THIS IS BROKEN. [WE ARE WORKING ON THIS](https://github.com/diffplug/selfie/issues/302)._** - -**_THIS IS BROKEN. [WE ARE WORKING ON THIS](https://github.com/diffplug/selfie/issues/302)._** - -**_THIS IS BROKEN. [WE ARE WORKING ON THIS](https://github.com/diffplug/selfie/issues/302)._** - -**TODO: CacheSelfie is currently being implemented!** -`cacheSelfie` helps you build fast deterministic tests even if they contain slow non-deterministic components. A generative AI example is available [here](https://github.com/diffplug/selfie/issues/319) - -**TODO: We don't currently have an example of cache selfie for python [yet](https://github.com/diffplug/selfie/issues/319)**. +*`cacheSelfie` helps you build fast deterministic tests even if they contain slow non-deterministic components. A generative AI example is available [here](https://github.com/diffplug/selfie/blob/main/python/example-pytest-selfie/tests/cache_selfie_test.py).* To use `expect_selfie`, you pass a _value_ that you want to snapshot. ```python -expect_selfie(customer.firstName).to_be("Fred") +expect_selfie(customer.first_name).to_be("Fred") ``` -To use `cache_selfie`, you pass a **\*function** that **returns a value\*** to snapshot. +To use `cache_selfie`, you pass a ***function** that **returns a value*** to snapshot. ```python -cache_selfie(lambda: customer.firstName).to_be("Fred") +cache_selfie(lambda: customer.first_name).to_be("Fred") ``` When selfie is in read mode, it can ignore the function and just return the value within the `to_be` call. When selfie is in write mode, it calls the function and sets the snapshot to that result. @@ -41,13 +32,13 @@ In the examples above, we aren't doing anything with the return value, which is The hazard is that the cached result _is not testing the function call anymore_. It is just a convenient way to generate sample data for testing _other_ parts of the system. ```python -var brittleAssumption = cache_selfie(lambda: expensiveOperation()).to_be("sand") -buildStuffOn(brittleAssumption) +brittle_assumption = cache_selfie(lambda: expensive_operation()).to_be("sand") +build_stuff_on(brittle_assumption) ``` -Perhaps the `to_be` snapshot was recorded a year ago, and the `expensiveOperation` has changed since then. Perhaps someone manually edited the recorded snapshot, and `expensiveOperation` has never returned a value anything like the snapshot. **_The function being cached is not being tested._** +Perhaps the `to_be` snapshot was recorded a year ago, and the `expensive_operation` has changed since then. Perhaps someone manually edited the recorded snapshot, and `expensive_operation` has never returned a value anything like the snapshot. ***The function being cached is not being tested.*** -If you have a test with multiple `cache_selfie` calls, avoid using `_TODO`. You can have a situation where you recorded the ending of a test, and then later changed the beginning with `_TODO`. The ending won't update itself automatically, so you might cache an inconsistent state. You can avoid this problem by only using `//selfieonce` and `//SELFIEWRITE`. +If you have a test with multiple `cache_selfie` calls, avoid using `_TODO`. You can have a situation where you recorded the ending of a test, and then later changed the beginning with `_TODO`. The ending won't update itself automatically, so you might cache an inconsistent state. You can avoid this problem by only using `#selfieonce` and `#SELFIEWRITE`. ## Strings and binary @@ -65,80 +56,84 @@ The `to_match_disk` method is nice because Selfie will garbage-collect the snaps ## Roundtripping typed data -**TODO: We don't have Roundtrip in the Python, are we going to implement this? [PRs welcomed](https://github.com/diffplug/selfie)!** - Oftentimes you want to snapshot something besides just a string or binary. For that there is: -```java -interface Roundtrip { - SerializedForm serialize(T value) - T parse(serialized: SerializedForm) -} -T cache_selfie(Roundtrip roundtrip, () -> someT()) -T cache_selfie_binary(Roundtrip roundtrip, () -> someT()) +```python +class Roundtrip(Generic[T, SerializedForm]): + def serialize(self, value: T) -> SerializedForm: + """Serialize a value of type T to its SerializedForm.""" + raise NotImplementedError + + def parse(self, serialized: SerializedForm) -> T: + """Parse the SerializedForm back to type T.""" + raise NotImplementedError ``` -But you don't have to implement `Roundtrip` yourself. - -**TODO: Change once correct example is made** - -If you're using the `@kotlinx.serialization.Serializable` framework (where you annotate model classes with `@Serializable`), then you can use `cache_selfie_json(() -> T)` and selfie will use Kotlin's built-in json serialization to implement the roundtrip. - -If you're using Java's `java.io.Serializable` (where model classes must implement `Serializable`) then you can use `cacheSelfieBinarySerializable(() -> T)` and selfie will use Java's built-in binary serialization mechanism to implement the roundtrip. +But you don't have to implement `Roundtrip` yourself. You can do `cache_selfie_json`, and `Roundtrip` will be implemented by `json.dumps` and `json.loads`. And of course, you can also write your own `Roundtrip` implementation, it's only two functions. ## Example -**TODO: We don't currently have an example of cache selfie for Python [yet](https://github.com/diffplug/selfie/issues/319)**. -Excerpted from [here](https://github.com/diffplug/selfie/issues/319) - -**TODO: We need a [Python implementation](https://github.com/diffplug/selfie/issues/319)**: +```python +# Fetch the chat response with caching +chat = cache_selfie_json(lambda: openai.chat.completions.create( + model="gpt-4o", + messages=[ + {"role": "user", "content": "Expressive but brief language describing a robot creating a self portrait."} + ] +).to_dict()).to_be("""{ +"id": "chatcmpl-Af1Nf34netAfGW7ZIQArEHavfuYtg", +"choices": [ + { + "finish_reason": "stop", + "index": 0, + "logprobs": null, + "message": { + "content": "A sleek robot, its mechanical fingers dancing with precision, deftly wields a brush against the canvas. Whirs and clicks echo softly as vibrant strokes emerge, each infused with an unexpected soulfulness. Metal meets art as synthetic imagination captures its own intricate reflection\\u2014a symphony of circuitry bathed in delicate hues.", + "refusal": null, + "role": "assistant" + } + } +], +"created": 1734340119, +"model": "gpt-4o-2024-08-06", +"object": "chat.completion", +"system_fingerprint": "fp_9faba9f038", +"usage": { + "completion_tokens": 62, + "prompt_tokens": 20, + "total_tokens": 82, + "completion_tokens_details": { + "accepted_prediction_tokens": 0, + "audio_tokens": 0, + "reasoning_tokens": 0, + "rejected_prediction_tokens": 0 + }, + "prompt_tokens_details": { + "audio_tokens": 0, + "cached_tokens": 0 + } +} +}""") -```kotlin -val chatCompletionRequest = ChatCompletionRequest( - model = ModelId("gpt-4-turbo-preview"), - messages = listOf(ChatMessage(role = ChatRole.User, - content = "Expressive language describing a robot creating a self portrait."))) -val chat = cache_selfie_json { openAI().chatCompletion(chatCompletionRequest) }.to_be("""{ - "id": "chatcmpl-8sOV0z7DDfvVdj1jaru6Cv2Geq3Dj", - "created": 1707974578, - "model": "gpt-4-0125-preview", - "choices": [ +image_url = cache_selfie_json(lambda: openai.images.generate(model="dall-e-3",prompt=chat['choices'][0]['message']['content']).to_dict()).to_be("""{ +"created": 1734340142, +"data": [ { - "index": 0, - "message": { - "role": "assistant", - "content": "In an atmosphere where the whispers of technology blend with the essence of creativity, a remarkable event unfolds—a robot, born from the marriage of steel and intellect, embarks on a quest to capture its essence through a self-portrait. This is not just an act of programming; it is the ballet of bits and bytes pirouetting towards self-awareness.\n\nAt first glance, the scene seems borrowed from a future where machines tread the fine line between fabrication and inspiration. The studio, lit by the sterile glow of fluorescent lights, becomes a sanctuary where metal meets muse. At the center of this confluence stands the robot, its form an intricate lattice of servos and sensors, each component a testament to human ingenuity, now poised to explore the realm of artistic creation.\n\nThe robot’s arm, a marvel of precision engineering, hovers over the canvas with the grace of a seasoned artist. It is not merely a limb, but a conductor’s baton, orchestrating a symphony of colors and forms. With every motion, it challenges the preconceived boundaries between creator and creation, weaving the fabric of its digital soul into the tangible world.\n\nAs the portrait takes shape, it becomes evident that this is not a mere replication of components and circuits. Through the algorithmic alchemy of its programming, the robot infuses each brushstroke with a search for identity. The portrait emerges as a mosaic of self-reflection, each pixel and paint stroke a question in the quest for understanding. What is depicted is not just a physical form, but an introspective journey rendered in hues and contours.\n\nThis creative endeavor transcends the act of painting. It is a dialogue between the robot and its inner being, mediated by the brush and canvas. The colors chosen do not just adhere to the spectrum seen by its cameras; they are imbued with the weight of introspection, the shades nuanced by the robot’s processing of its own existence.\n\nObservers, human or otherwise, may find themselves pondering a question of profound implications: in the brushstrokes of a robot, do we not only see a reflection of its programming but also a mirror to our own search for meaning and identity? The portrait, thus, becomes more than a visual artifact; it is a bridge between the mechanical and the philosophical, a nexus where circuits and souls dialogue in the silent language of art.\n\nIn completion, the self-portrait stands as a testament not to the autonomy of machines, but to their potential to echo the human condition, to participate in the centuries-old tradition of self-exploration through art. It challenges viewers to reconsider the nature of creativity, blurring the lines between the animate and inanimate, urging a redefinition of what it means to be an artist, to be a creator, to be alive.\n\nThus, in this enclosed universe where technology hums a tune of evolution, a robot creating a self-portrait becomes a poignant emblem of the future—where machine and muse dance in an infinite embrace, exploring the kaleidoscope of existence through the lens of artistry." - }, - "finish_reason": "stop" + "revised_prompt": "Visualize a sleek robot adorned in a metallic shell. Its highly precise mechanical digits engage rhythmically with a paintbrush, swirling it flawlessly over a robust canvas. The environment is immersed in resonating mechanical sounds blended with the aura of creativity unfurling. Strikingly vivid strokes of paint materialize from the robot's calculated artistry, each stroke conveying a depth and emotion unanticipated of a mechanical entity. This metallic artist exhibits its self-inspired art by meticulously crafting its own intricate reflection\\u2014an orchestra of electronics bathed in a palette of gentle colors.", + "url": "https://oaidalleapiprodscus.blob.core.windows.net/private/org-SUepmbCtftBix3RViJYKuYKY/user-KFRqcsnjZPSTulNaxrY5wjL3/img-JVxDCOAuLoIky3ucNNJWo7fG.png?st=2024-12-16T08%3A09%3A02Z&se=2024-12-16T10%3A09%3A02Z&sp=r&sv=2024-08-04&sr=b&rscd=inline&rsct=image/png&skoid=d505667d-d6c1-4a0a-bac7-5c84a87759f8&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2024-12-16T00%3A47%3A43Z&ske=2024-12-17T00%3A47%3A43Z&sks=b&skv=2024-08-04&sig=nIiMMZBNnqPO2jblJ8pDvWS2AFTOaicAWAD6BDqP9jU%3D" } - ], - "usage": { - "prompt_tokens": 18, - "completion_tokens": 613, - "total_tokens": 631 - }, - "system_fingerprint": "fp_f084bcfc79" +] }""") -val images = cache_selfie_json { - openAI().imageURL(ImageCreation( - prompt = chat.choices[0].message.content!!, - model = ModelId("dall-e-3"))) }.to_be("""[ - { - "url": "https://oaidalleapiprodscus.blob.core.windows.net/private/org-SUepmbCtftBix3RViJYKuYKY/user-KFRqcsnjZPSTulNaxrY5wjL3/img-sK3P5fuisDfpdelbFwiR0wtP.png?st=2024-02-15T04%3A23%3A32Z&se=2024-02-15T06%3A23%3A32Z&sp=r&sv=2021-08-06&sr=b&rscd=inline&rsct=image/png&skoid=6aaadede-4fb3-4698-a8f6-684d7786b067&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2024-02-15T02%3A25%3A24Z&ske=2024-02-16T02%3A25%3A24Z&sks=b&skv=2021-08-06&sig=Q0CfpGchXx9NoSEtsk3TT0TuX2Rb8QTk8HiR57I1kUU%3D", - "revised_prompt": "In a technologically advanced studio bathed in the stark light of fluorescent lamps, observe an intricate robot, built from a complex lattice of servos and sensors. This robot is on a unique quest - to paint its own portrait. Its arm, a masterpiece of precise engineering, hovers gracefully over the canvas, ready to begin its creation. As the robot paints, it doesn't simply replicate its physical form, but the end result is a multi-colored mosaic of self-reflection that embodies its digital soul on canvas. Remarkably, the portrait is a deep exploration of its quest for identity. Marvel at how this machine interprets its programming to venture into the realm of artistic expression, challenging what it means to be creative and alive." - } -]""") -cache_selfie_binary { HttpClient().request(images[0].url).readBytes() } - .to_be_file("com/example/kotest/dalle-3.png") -``` -**TODO: Update once example is done** +url = image_url["data"][0]["url"] +cache_selfie_binary(lambda: requests.get(url).content).to_be_file("self-portrait.png") +``` -Since we used `to_be_file`, we can open `com/example/kotest/dalle-3.png` in Mac Preview / Windows Explorer. +Since we used `to_be_file`, we can open `self-portrait.png` in Mac Preview / Windows Explorer. -Robot self portrait +Robot self portrait _Pull requests to improve the landing page and documentation are greatly appreciated, you can find the [source code here](https://github.com/diffplug/selfie)._