Files
fil/docs/snippets/elixir/plugins/12_clear_plugins.exs
Henrik Jess Nielsen b4c07d3693
All checks were successful
Deploy fil (kreuzberg) / deploy (push) Successful in 49s
Nomad changes
2026-06-01 23:40:55 +02:00

190 lines
5.5 KiB
Elixir

```elixir title="Elixir"
# Clear all plugins from the registry - useful for testing or resetting state
# Define multiple example plugins for demonstration
defmodule MyApp.Plugins.CleanupExample do
@moduledoc """
Example plugins to demonstrate clearing the registry.
"""
# Simple post-processor
defmodule TextCleaner do
@behaviour Kreuzberg.Plugin.PostProcessor
@impl true
def name, do: "text_cleaner"
@impl true
def version, do: "1.0.0"
@impl true
def processing_stage, do: :early
@impl true
def initialize, do: :ok
@impl true
def shutdown, do: :ok
@impl true
def process(result, _config) do
Map.put(result, "cleaned", true)
end
end
# Simple validator
defmodule ContentValidator do
@behaviour Kreuzberg.Plugin.Validator
@impl true
def name, do: "content_validator"
@impl true
def version, do: "1.0.0"
@impl true
def priority, do: 50
@impl true
def initialize, do: :ok
@impl true
def shutdown, do: :ok
@impl true
def should_validate?(%{"content" => content}) do
is_binary(content) and byte_size(content) > 0
end
def should_validate?(_), do: false
@impl true
def validate(%{"content" => content}) do
if String.length(content) > 0 do
:ok
else
{:error, "Content cannot be empty"}
end
end
def validate(_), do: {:error, "Missing content field"}
end
# Simple OCR backend
defmodule MockOCRBackend do
@behaviour Kreuzberg.Plugin.OcrBackend
@impl true
def name, do: "mock_ocr"
@impl true
def version, do: "1.0.0"
@impl true
def initialize, do: :ok
@impl true
def shutdown, do: :ok
@impl true
def supported_languages, do: ["eng", "deu", "fra"]
@impl true
def process_image(_image_data, language) do
if language in supported_languages() do
{:ok, "OCR extracted text"}
else
{:error, "Unsupported language: #{language}"}
end
end
@impl true
def process_file(_path, language) do
if language in supported_languages() do
{:ok, "OCR extracted file text"}
else
{:error, "Unsupported language: #{language}"}
end
end
end
end
# Register multiple plugins
IO.puts("=== Registering Plugins ===")
:ok = Kreuzberg.Plugin.register_post_processor(:cleaner, MyApp.Plugins.CleanupExample.TextCleaner)
:ok = Kreuzberg.Plugin.register_validator(MyApp.Plugins.CleanupExample.ContentValidator)
:ok = Kreuzberg.Plugin.register_ocr_backend(MyApp.Plugins.CleanupExample.MockOCRBackend)
# List registered plugins before clearing
{:ok, post_procs} = Kreuzberg.Plugin.list_post_processors()
{:ok, validators} = Kreuzberg.Plugin.list_validators()
{:ok, ocr_backends} = Kreuzberg.Plugin.list_ocr_backends()
IO.puts("Before clearing:")
IO.puts(" Post-processors: #{length(post_procs)}")
IO.puts(" Validators: #{length(validators)}")
IO.puts(" OCR backends: #{length(ocr_backends)}")
# Clear post-processors
IO.puts("\n=== Clearing Post-Processors ===")
:ok = Kreuzberg.Plugin.clear_post_processors()
{:ok, post_procs_after} = Kreuzberg.Plugin.list_post_processors()
IO.puts("Post-processors after clearing: #{length(post_procs_after)}")
# Validators and OCR backends should still be registered
{:ok, validators_check} = Kreuzberg.Plugin.list_validators()
{:ok, ocr_backends_check} = Kreuzberg.Plugin.list_ocr_backends()
IO.puts("Validators still registered: #{length(validators_check)}")
IO.puts("OCR backends still registered: #{length(ocr_backends_check)}")
# Clear validators
IO.puts("\n=== Clearing Validators ===")
:ok = Kreuzberg.Plugin.clear_validators()
{:ok, validators_after} = Kreuzberg.Plugin.list_validators()
IO.puts("Validators after clearing: #{length(validators_after)}")
# OCR backends should still be registered
{:ok, ocr_backends_check2} = Kreuzberg.Plugin.list_ocr_backends()
IO.puts("OCR backends still registered: #{length(ocr_backends_check2)}")
# Clear OCR backends
IO.puts("\n=== Clearing OCR Backends ===")
:ok = Kreuzberg.Plugin.clear_ocr_backends()
{:ok, ocr_backends_after} = Kreuzberg.Plugin.list_ocr_backends()
IO.puts("OCR backends after clearing: #{length(ocr_backends_after)}")
# Verify all are cleared
IO.puts("\n=== Final State (All Cleared) ===")
{:ok, final_procs} = Kreuzberg.Plugin.list_post_processors()
{:ok, final_validators} = Kreuzberg.Plugin.list_validators()
{:ok, final_backends} = Kreuzberg.Plugin.list_ocr_backends()
IO.puts("Post-processors: #{length(final_procs)}")
IO.puts("Validators: #{length(final_validators)}")
IO.puts("OCR backends: #{length(final_backends)}")
# Use case: Reset plugin state for testing
IO.puts("\n=== Common Use Case: Testing Setup/Teardown ===")
# Setup for test
Kreuzberg.Plugin.register_post_processor(:test_proc, MyApp.Plugins.CleanupExample.TextCleaner)
Kreuzberg.Plugin.register_validator(MyApp.Plugins.CleanupExample.ContentValidator)
# Run test
{:ok, test_procs} = Kreuzberg.Plugin.list_post_processors()
{:ok, test_vals} = Kreuzberg.Plugin.list_validators()
IO.puts("Test setup complete: #{length(test_procs)} processors, #{length(test_vals)} validators")
# Teardown - clear everything
Kreuzberg.Plugin.clear_post_processors()
Kreuzberg.Plugin.clear_validators()
Kreuzberg.Plugin.clear_ocr_backends()
# Verify clean state for next test
{:ok, clean_procs} = Kreuzberg.Plugin.list_post_processors()
{:ok, clean_vals} = Kreuzberg.Plugin.list_validators()
{:ok, clean_backends} = Kreuzberg.Plugin.list_ocr_backends()
IO.puts("Test teardown complete: #{length(clean_procs)} processors, #{length(clean_vals)} validators, #{length(clean_backends)} backends")
```