fix: cleaned up file format handling to stop constant mapping

This commit is contained in:
2026-04-25 13:01:38 +02:00
parent b90a4569da
commit 00a997293b
6 changed files with 71 additions and 142 deletions

View File

@@ -72,10 +72,10 @@ defmodule BDS.Maintenance do
diff_field("author", post.author, Map.get(fields, "author")), diff_field("author", post.author, Map.get(fields, "author")),
diff_field("language", post.language, Map.get(fields, "language")), diff_field("language", post.language, Map.get(fields, "language")),
diff_field("status", post.status, Map.get(fields, "status")), diff_field("status", post.status, Map.get(fields, "status")),
diff_field("template_slug", post.template_slug, Map.get(fields, "template_slug")), diff_field("template_slug", post.template_slug, Map.get(fields, "templateSlug")),
diff_field("created_at", post.created_at, Map.get(fields, "created_at")), diff_field("created_at", post.created_at, Map.get(fields, "createdAt")),
diff_field("updated_at", post.updated_at, Map.get(fields, "updated_at")), diff_field("updated_at", post.updated_at, Map.get(fields, "updatedAt")),
diff_field("published_at", post.published_at, Map.get(fields, "published_at")), diff_field("published_at", post.published_at, Map.get(fields, "publishedAt")),
diff_field("tags", post.tags, Map.get(fields, "tags", [])), diff_field("tags", post.tags, Map.get(fields, "tags", [])),
diff_field("categories", post.categories, Map.get(fields, "categories", [])) diff_field("categories", post.categories, Map.get(fields, "categories", []))
] ]
@@ -110,8 +110,8 @@ defmodule BDS.Maintenance do
diff_field("caption", media.caption, Map.get(fields, "caption")), diff_field("caption", media.caption, Map.get(fields, "caption")),
diff_field("author", media.author, Map.get(fields, "author")), diff_field("author", media.author, Map.get(fields, "author")),
diff_field("language", media.language, Map.get(fields, "language")), diff_field("language", media.language, Map.get(fields, "language")),
diff_field("created_at", media.created_at, Map.get(fields, "created_at")), diff_field("created_at", media.created_at, Map.get(fields, "createdAt")),
diff_field("updated_at", media.updated_at, Map.get(fields, "updated_at")), diff_field("updated_at", media.updated_at, Map.get(fields, "updatedAt")),
diff_field("tags", media.tags, Map.get(fields, "tags", [])) diff_field("tags", media.tags, Map.get(fields, "tags", []))
] ]
|> Enum.reject(&is_nil/1) |> Enum.reject(&is_nil/1)
@@ -147,14 +147,14 @@ defmodule BDS.Maintenance do
diff_field( diff_field(
"translation_for", "translation_for",
translation.translation_for, translation.translation_for,
Map.get(fields, "translation_for") Map.get(fields, "translationFor")
), ),
diff_field("created_at", translation.created_at, Map.get(fields, "created_at")), diff_field("created_at", translation.created_at, Map.get(fields, "createdAt")),
diff_field("updated_at", translation.updated_at, Map.get(fields, "updated_at")), diff_field("updated_at", translation.updated_at, Map.get(fields, "updatedAt")),
diff_field( diff_field(
"published_at", "published_at",
translation.published_at, translation.published_at,
Map.get(fields, "published_at") Map.get(fields, "publishedAt")
) )
] ]
|> Enum.reject(&is_nil/1) |> Enum.reject(&is_nil/1)
@@ -193,7 +193,7 @@ defmodule BDS.Maintenance do
diff_field( diff_field(
"translation_for", "translation_for",
translation.translation_for, translation.translation_for,
Map.get(fields, "translation_for") Map.get(fields, "translationFor")
) )
] ]
|> Enum.reject(&is_nil/1) |> Enum.reject(&is_nil/1)
@@ -231,8 +231,8 @@ defmodule BDS.Maintenance do
diff_field("title", script.title, Map.get(fields, "title")), diff_field("title", script.title, Map.get(fields, "title")),
diff_field("entrypoint", script.entrypoint, Map.get(fields, "entrypoint")), diff_field("entrypoint", script.entrypoint, Map.get(fields, "entrypoint")),
diff_field("enabled", script.enabled, Map.get(fields, "enabled")), diff_field("enabled", script.enabled, Map.get(fields, "enabled")),
diff_field("created_at", script.created_at, Map.get(fields, "created_at")), diff_field("created_at", script.created_at, Map.get(fields, "createdAt")),
diff_field("updated_at", script.updated_at, Map.get(fields, "updated_at")) diff_field("updated_at", script.updated_at, Map.get(fields, "updatedAt"))
] ]
|> Enum.reject(&is_nil/1) |> Enum.reject(&is_nil/1)
@@ -262,8 +262,8 @@ defmodule BDS.Maintenance do
[ [
diff_field("title", template.title, Map.get(fields, "title")), diff_field("title", template.title, Map.get(fields, "title")),
diff_field("enabled", template.enabled, Map.get(fields, "enabled")), diff_field("enabled", template.enabled, Map.get(fields, "enabled")),
diff_field("created_at", template.created_at, Map.get(fields, "created_at")), diff_field("created_at", template.created_at, Map.get(fields, "createdAt")),
diff_field("updated_at", template.updated_at, Map.get(fields, "updated_at")) diff_field("updated_at", template.updated_at, Map.get(fields, "updatedAt"))
] ]
|> Enum.reject(&is_nil/1) |> Enum.reject(&is_nil/1)

View File

@@ -341,7 +341,6 @@ defmodule BDS.Media do
defp upsert_media_from_sidecar(project, sidecar_path) do defp upsert_media_from_sidecar(project, sidecar_path) do
{:ok, fields} = sidecar_path |> File.read!() |> Sidecar.parse_document() {:ok, fields} = sidecar_path |> File.read!() |> Sidecar.parse_document()
fields = normalize_media_sidecar_fields(fields)
relative_sidecar_path = Path.relative_to(sidecar_path, Projects.project_data_dir(project)) relative_sidecar_path = Path.relative_to(sidecar_path, Projects.project_data_dir(project))
relative_file_path = String.trim_trailing(relative_sidecar_path, ".meta") relative_file_path = String.trim_trailing(relative_sidecar_path, ".meta")
filename = Path.basename(relative_file_path) filename = Path.basename(relative_file_path)
@@ -351,8 +350,8 @@ defmodule BDS.Media do
id: Map.get(fields, "id") || Ecto.UUID.generate(), id: Map.get(fields, "id") || Ecto.UUID.generate(),
project_id: project.id, project_id: project.id,
filename: filename, filename: filename,
original_name: Map.get(fields, "original_name") || filename, original_name: Map.get(fields, "originalName") || filename,
mime_type: Map.get(fields, "mime_type") || detect_mime(filename), mime_type: Map.get(fields, "mimeType") || detect_mime(filename),
size: Map.get(fields, "size", 0), size: Map.get(fields, "size", 0),
width: blank_to_nil(Map.get(fields, "width")), width: blank_to_nil(Map.get(fields, "width")),
height: blank_to_nil(Map.get(fields, "height")), height: blank_to_nil(Map.get(fields, "height")),
@@ -365,8 +364,8 @@ defmodule BDS.Media do
sidecar_path: relative_sidecar_path, sidecar_path: relative_sidecar_path,
checksum: nil, checksum: nil,
tags: Map.get(fields, "tags", []), tags: Map.get(fields, "tags", []),
created_at: Map.get(fields, "created_at", now), created_at: Map.get(fields, "createdAt", now),
updated_at: Map.get(fields, "updated_at", now) updated_at: Map.get(fields, "updatedAt", now)
} }
media = media =
@@ -436,7 +435,6 @@ defmodule BDS.Media do
media -> media ->
{:ok, fields} = sidecar_path |> File.read!() |> Sidecar.parse_document() {:ok, fields} = sidecar_path |> File.read!() |> Sidecar.parse_document()
fields = normalize_media_sidecar_fields(fields)
now = Persistence.now_ms() now = Persistence.now_ms()
language = Map.fetch!(fields, "language") language = Map.fetch!(fields, "language")
@@ -610,23 +608,6 @@ defmodule BDS.Media do
Persistence.atomic_write(path, contents) Persistence.atomic_write(path, contents)
end end
defp normalize_media_sidecar_fields(fields) when is_map(fields) do
[
{"originalName", "original_name"},
{"mimeType", "mime_type"},
{"createdAt", "created_at"},
{"updatedAt", "updated_at"},
{"translationFor", "translation_for"},
{"linkedPostIds", "linked_post_ids"}
]
|> Enum.reduce(fields, fn {file_key, current_key}, acc ->
case Map.fetch(acc, file_key) do
{:ok, value} -> Map.put_new(acc, current_key, value)
:error -> acc
end
end)
end
defp linked_post_ids(media_id) do defp linked_post_ids(media_id) do
case Repo.query("SELECT post_id FROM post_media WHERE media_id = ? ORDER BY sort_order ASC, post_id ASC", [media_id]) do case Repo.query("SELECT post_id FROM post_media WHERE media_id = ? ORDER BY sort_order ASC, post_id ASC", [media_id]) do
{:ok, %{rows: rows}} -> Enum.map(rows, fn [post_id] -> post_id end) {:ok, %{rows: rows}} -> Enum.map(rows, fn [post_id] -> post_id end)

View File

@@ -658,16 +658,16 @@ defmodule BDS.Posts do
content: nil, content: nil,
status: parse_post_status(Map.get(fields, "status", "published")), status: parse_post_status(Map.get(fields, "status", "published")),
author: Map.get(fields, "author"), author: Map.get(fields, "author"),
created_at: Map.get(fields, "created_at", now), created_at: Map.get(fields, "createdAt", now),
updated_at: Map.get(fields, "updated_at", now), updated_at: Map.get(fields, "updatedAt", now),
published_at: Map.get(fields, "published_at"), published_at: Map.get(fields, "publishedAt"),
file_path: rebuild_file.relative_path, file_path: rebuild_file.relative_path,
checksum: nil, checksum: nil,
tags: Map.get(fields, "tags", []), tags: Map.get(fields, "tags", []),
categories: Map.get(fields, "categories", []), categories: Map.get(fields, "categories", []),
template_slug: Map.get(fields, "template_slug"), template_slug: Map.get(fields, "templateSlug"),
language: Map.get(fields, "language"), language: Map.get(fields, "language"),
do_not_translate: Map.get(fields, "do_not_translate", false), do_not_translate: Map.get(fields, "doNotTranslate", false),
published_title: nil, published_title: nil,
published_content: nil, published_content: nil,
published_tags: nil, published_tags: nil,
@@ -686,7 +686,7 @@ defmodule BDS.Posts do
defp upsert_post_translation_from_rebuild_file(project_id, rebuild_file) do defp upsert_post_translation_from_rebuild_file(project_id, rebuild_file) do
fields = rebuild_file.fields fields = rebuild_file.fields
source_post_id = Map.fetch!(fields, "translation_for") source_post_id = Map.fetch!(fields, "translationFor")
source_post = Repo.get!(Post, source_post_id) source_post = Repo.get!(Post, source_post_id)
now = Persistence.now_ms() now = Persistence.now_ms()
language = normalize_language(Map.fetch!(fields, "language")) language = normalize_language(Map.fetch!(fields, "language"))
@@ -703,9 +703,9 @@ defmodule BDS.Posts do
excerpt: Map.get(fields, "excerpt"), excerpt: Map.get(fields, "excerpt"),
content: nil, content: nil,
status: parse_translation_status(Map.get(fields, "status", "published")), status: parse_translation_status(Map.get(fields, "status", "published")),
created_at: Map.get(fields, "created_at", source_post.created_at || now), created_at: Map.get(fields, "createdAt", source_post.created_at || now),
updated_at: Map.get(fields, "updated_at", source_post.updated_at || source_post.created_at || now), updated_at: Map.get(fields, "updatedAt", source_post.updated_at || source_post.created_at || now),
published_at: Map.get(fields, "published_at", source_post.published_at), published_at: Map.get(fields, "publishedAt", source_post.published_at),
file_path: rebuild_file.relative_path, file_path: rebuild_file.relative_path,
checksum: nil checksum: nil
} }
@@ -731,38 +731,14 @@ defmodule BDS.Posts do
%{ %{
path: path, path: path,
relative_path: Path.relative_to(path, Projects.project_data_dir(project)), relative_path: Path.relative_to(path, Projects.project_data_dir(project)),
fields: normalize_rebuild_fields(fields) fields: fields
} }
end end
defp translation_rebuild_file?(%{fields: fields}) do defp translation_rebuild_file?(%{fields: fields}) do
Map.has_key?(fields, "translation_for") and not Map.has_key?(fields, "slug") Map.has_key?(fields, "translationFor") and not Map.has_key?(fields, "slug")
end end
defp normalize_rebuild_fields(fields) when is_map(fields) do
[
{"translationFor", "translation_for"},
{"doNotTranslate", "do_not_translate"},
{"templateSlug", "template_slug"},
{"createdAt", "created_at"},
{"updatedAt", "updated_at"},
{"publishedAt", "published_at"}
]
|> Enum.reduce(fields, fn {file_key, current_key}, acc ->
case Map.fetch(acc, file_key) do
{:ok, value} -> Map.put_new(acc, current_key, normalize_rebuild_field_value(current_key, value))
:error -> acc
end
end)
end
defp normalize_rebuild_field_value(key, value)
when key in ["created_at", "updated_at", "published_at"] do
Persistence.parse_timestamp(value) || value
end
defp normalize_rebuild_field_value(_key, value), do: value
defp list_matching_files(dir, pattern) do defp list_matching_files(dir, pattern) do
if File.dir?(dir) do if File.dir?(dir) do
Path.join([dir, "**", pattern]) Path.join([dir, "**", pattern])

View File

@@ -204,7 +204,6 @@ defmodule BDS.Scripts do
defp upsert_script_from_file(project_id, project, path) do defp upsert_script_from_file(project_id, project, path) do
contents = File.read!(path) contents = File.read!(path)
{:ok, %{fields: fields}} = Frontmatter.parse_document(contents) {:ok, %{fields: fields}} = Frontmatter.parse_document(contents)
fields = normalize_script_fields(fields)
relative_path = Path.relative_to(path, Projects.project_data_dir(project)) relative_path = Path.relative_to(path, Projects.project_data_dir(project))
now = Persistence.now_ms() now = Persistence.now_ms()
@@ -220,8 +219,8 @@ defmodule BDS.Scripts do
file_path: relative_path, file_path: relative_path,
status: :published, status: :published,
content: nil, content: nil,
created_at: Map.get(fields, "created_at", now), created_at: Map.get(fields, "createdAt", now),
updated_at: Map.get(fields, "updated_at", now) updated_at: Map.get(fields, "updatedAt", now)
} }
script = Repo.get_by(Script, project_id: project_id, slug: attrs.slug) || %Script{} script = Repo.get_by(Script, project_id: project_id, slug: attrs.slug) || %Script{}
@@ -236,20 +235,6 @@ defmodule BDS.Scripts do
defp parse_script_kind("utility"), do: :utility defp parse_script_kind("utility"), do: :utility
defp parse_script_kind("transform"), do: :transform defp parse_script_kind("transform"), do: :transform
defp normalize_script_fields(fields) when is_map(fields) do
[
{"createdAt", "created_at"},
{"updatedAt", "updated_at"},
{"projectId", "project_id"}
]
|> Enum.reduce(fields, fn {file_key, current_key}, acc ->
case Map.fetch(acc, file_key) do
{:ok, value} -> Map.put_new(acc, current_key, value)
:error -> acc
end
end)
end
defp list_matching_files(dir, pattern) do defp list_matching_files(dir, pattern) do
if File.dir?(dir) do if File.dir?(dir) do
Path.join(dir, pattern) Path.join(dir, pattern)

View File

@@ -343,7 +343,6 @@ defmodule BDS.Templates do
defp upsert_template_from_file(project_id, project, path) do defp upsert_template_from_file(project_id, project, path) do
contents = File.read!(path) contents = File.read!(path)
{:ok, %{fields: fields}} = Frontmatter.parse_document(contents) {:ok, %{fields: fields}} = Frontmatter.parse_document(contents)
fields = normalize_template_fields(fields)
relative_path = Path.relative_to(path, Projects.project_data_dir(project)) relative_path = Path.relative_to(path, Projects.project_data_dir(project))
now = Persistence.now_ms() now = Persistence.now_ms()
@@ -358,8 +357,8 @@ defmodule BDS.Templates do
file_path: relative_path, file_path: relative_path,
status: :published, status: :published,
content: nil, content: nil,
created_at: Map.get(fields, "created_at", now), created_at: Map.get(fields, "createdAt", now),
updated_at: Map.get(fields, "updated_at", now) updated_at: Map.get(fields, "updatedAt", now)
} }
template = Repo.get_by(Template, project_id: project_id, slug: attrs.slug) || %Template{} template = Repo.get_by(Template, project_id: project_id, slug: attrs.slug) || %Template{}
@@ -375,20 +374,6 @@ defmodule BDS.Templates do
defp parse_template_kind("not_found"), do: :not_found defp parse_template_kind("not_found"), do: :not_found
defp parse_template_kind("partial"), do: :partial defp parse_template_kind("partial"), do: :partial
defp normalize_template_fields(fields) when is_map(fields) do
[
{"createdAt", "created_at"},
{"updatedAt", "updated_at"},
{"projectId", "project_id"}
]
|> Enum.reduce(fields, fn {file_key, current_key}, acc ->
case Map.fetch(acc, file_key) do
{:ok, value} -> Map.put_new(acc, current_key, value)
:error -> acc
end
end)
end
defp list_matching_files(dir, pattern) do defp list_matching_files(dir, pattern) do
if File.dir?(dir) do if File.dir?(dir) do
Path.join(dir, pattern) Path.join(dir, pattern)

View File

@@ -36,9 +36,9 @@ defmodule BDS.MaintenanceTest do
"title: Dispatch Post", "title: Dispatch Post",
"slug: dispatch-post", "slug: dispatch-post",
"status: published", "status: published",
"created_at: 1711843200", "createdAt: 1711843200",
"updated_at: 1711929600", "updatedAt: 1711929600",
"published_at: 1712016000", "publishedAt: 1712016000",
"tags:", "tags:",
"categories:", "categories:",
"---", "---",
@@ -56,11 +56,11 @@ defmodule BDS.MaintenanceTest do
Path.join(media_dir, "asset.txt.meta"), Path.join(media_dir, "asset.txt.meta"),
[ [
"id: dispatch-media", "id: dispatch-media",
"original_name: original.txt", "originalName: original.txt",
"mime_type: text/plain", "mimeType: text/plain",
"size: 11", "size: 11",
"created_at: 1711843200", "createdAt: 1711843200",
"updated_at: 1711929600", "updatedAt: 1711929600",
"tags:", "tags:",
"" ""
] ]
@@ -80,8 +80,8 @@ defmodule BDS.MaintenanceTest do
"kind: list", "kind: list",
"enabled: true", "enabled: true",
"version: 1", "version: 1",
"created_at: 101", "createdAt: 101",
"updated_at: 202", "updatedAt: 202",
"---", "---",
"<section>Template</section>", "<section>Template</section>",
"" ""
@@ -103,8 +103,8 @@ defmodule BDS.MaintenanceTest do
"entrypoint: main", "entrypoint: main",
"enabled: true", "enabled: true",
"version: 1", "version: 1",
"created_at: 301", "createdAt: 301",
"updated_at: 404", "updatedAt: 404",
"---", "---",
"function main() return true end", "function main() return true end",
"" ""
@@ -253,11 +253,11 @@ defmodule BDS.MaintenanceTest do
"status: published", "status: published",
"author: Editor", "author: Editor",
"language: de", "language: de",
"do_not_translate: false", "doNotTranslate: false",
"template_slug: ", "templateSlug: ",
"created_at: #{published_post.created_at + 10}", "createdAt: #{published_post.created_at + 10}",
"updated_at: #{published_post.updated_at + 20}", "updatedAt: #{published_post.updated_at + 20}",
"published_at: #{published_post.published_at + 30}", "publishedAt: #{published_post.published_at + 30}",
"tags:", "tags:",
" - beta", " - beta",
"categories:", "categories:",
@@ -276,14 +276,14 @@ defmodule BDS.MaintenanceTest do
[ [
"---", "---",
"id: #{published_post_translation.id}", "id: #{published_post_translation.id}",
"translation_for: #{published_post_translation.translation_for}", "translationFor: #{published_post_translation.translation_for}",
"language: #{published_post_translation.language}", "language: #{published_post_translation.language}",
"title: Bearbeiteter Beitrag", "title: Bearbeiteter Beitrag",
"excerpt: Bearbeitete Zusammenfassung", "excerpt: Bearbeitete Zusammenfassung",
"status: published", "status: published",
"created_at: #{published_post_translation.created_at}", "createdAt: #{published_post_translation.created_at}",
"updated_at: #{published_post_translation.updated_at}", "updatedAt: #{published_post_translation.updated_at}",
"published_at: #{published_post_translation.published_at}", "publishedAt: #{published_post_translation.published_at}",
"---", "---",
"Bearbeiteter Inhalt", "Bearbeiteter Inhalt",
"" ""
@@ -297,16 +297,16 @@ defmodule BDS.MaintenanceTest do
media_sidecar_path, media_sidecar_path,
[ [
"id: #{media.id}", "id: #{media.id}",
"original_name: #{media.original_name}", "originalName: #{media.original_name}",
"mime_type: #{media.mime_type}", "mimeType: #{media.mime_type}",
"size: #{media.size}", "size: #{media.size}",
"title: Edited media title", "title: Edited media title",
"alt: Edited alt", "alt: Edited alt",
"caption: Edited caption", "caption: Edited caption",
"author: Editor", "author: Editor",
"language: de", "language: de",
"created_at: #{media.created_at}", "createdAt: #{media.created_at}",
"updated_at: #{media.updated_at}", "updatedAt: #{media.updated_at}",
"tags:", "tags:",
" - beta", " - beta",
"" ""
@@ -320,7 +320,7 @@ defmodule BDS.MaintenanceTest do
File.write!( File.write!(
media_translation_sidecar_path, media_translation_sidecar_path,
[ [
"translation_for: #{media.id}", "translationFor: #{media.id}",
"language: #{media_translation.language}", "language: #{media_translation.language}",
"title: Bearbeiteter Medientitel", "title: Bearbeiteter Medientitel",
"alt: Bearbeiteter Alt-Text", "alt: Bearbeiteter Alt-Text",
@@ -337,14 +337,15 @@ defmodule BDS.MaintenanceTest do
[ [
"---", "---",
"id: #{published_script.id}", "id: #{published_script.id}",
"projectId: #{project.id}",
"slug: #{published_script.slug}", "slug: #{published_script.slug}",
"title: Edited Script", "title: Edited Script",
"kind: utility", "kind: utility",
"entrypoint: run", "entrypoint: run",
"enabled: false", "enabled: false",
"version: #{published_script.version}", "version: #{published_script.version}",
"created_at: #{published_script.created_at}", "createdAt: #{published_script.created_at}",
"updated_at: #{published_script.updated_at}", "updatedAt: #{published_script.updated_at}",
"---", "---",
"function run() return false end", "function run() return false end",
"" ""
@@ -359,13 +360,14 @@ defmodule BDS.MaintenanceTest do
[ [
"---", "---",
"id: #{published_template.id}", "id: #{published_template.id}",
"projectId: #{project.id}",
"slug: #{published_template.slug}", "slug: #{published_template.slug}",
"title: Edited Template", "title: Edited Template",
"kind: list", "kind: list",
"enabled: false", "enabled: false",
"version: #{published_template.version}", "version: #{published_template.version}",
"created_at: #{published_template.created_at}", "createdAt: #{published_template.created_at}",
"updated_at: #{published_template.updated_at}", "updatedAt: #{published_template.updated_at}",
"---", "---",
"<section>Edited</section>", "<section>Edited</section>",
"" ""
@@ -375,34 +377,34 @@ defmodule BDS.MaintenanceTest do
File.write!( File.write!(
Path.join([temp_dir, "posts", "2026", "04", "orphan-post.md"]), Path.join([temp_dir, "posts", "2026", "04", "orphan-post.md"]),
"---\nid: orphan\ntitle: Orphan\nslug: orphan\nstatus: published\ncreated_at: 1\nupdated_at: 1\npublished_at: 1\ntags:\ncategories:\n---\nBody\n" "---\nid: orphan\ntitle: Orphan\nslug: orphan\nstatus: published\ncreatedAt: 1\nupdatedAt: 1\npublishedAt: 1\ntags:\ncategories:\n---\nBody\n"
) )
File.write!( File.write!(
Path.join([temp_dir, "posts", "2026", "04", "orphan-post.es.md"]), Path.join([temp_dir, "posts", "2026", "04", "orphan-post.es.md"]),
"---\nid: orphan-post-translation\ntranslation_for: orphan\nlanguage: es\ntitle: Huerfano\nstatus: published\ncreated_at: 1\nupdated_at: 1\npublished_at: 1\n---\nCuerpo\n" "---\nid: orphan-post-translation\ntranslationFor: orphan\nlanguage: es\ntitle: Huerfano\nstatus: published\ncreatedAt: 1\nupdatedAt: 1\npublishedAt: 1\n---\nCuerpo\n"
) )
File.write!(Path.join([temp_dir, "media", "2026", "04", "orphan.txt"]), "orphan") File.write!(Path.join([temp_dir, "media", "2026", "04", "orphan.txt"]), "orphan")
File.write!( File.write!(
Path.join([temp_dir, "media", "2026", "04", "orphan.txt.meta"]), Path.join([temp_dir, "media", "2026", "04", "orphan.txt.meta"]),
"id: orphan-media\noriginal_name: orphan.txt\nmime_type: text/plain\nsize: 6\ncreated_at: 1\nupdated_at: 1\ntags:\n" "id: orphan-media\noriginalName: orphan.txt\nmimeType: text/plain\nsize: 6\ncreatedAt: 1\nupdatedAt: 1\ntags:\n"
) )
File.write!( File.write!(
Path.join([temp_dir, "media", "2026", "04", "orphan.txt.es.meta"]), Path.join([temp_dir, "media", "2026", "04", "orphan.txt.es.meta"]),
"translation_for: orphan-media\nlanguage: es\ntitle: Huerfano\nalt: Texto\ncaption: Leyenda\n" "translationFor: orphan-media\nlanguage: es\ntitle: Huerfano\nalt: Texto\ncaption: Leyenda\n"
) )
File.write!( File.write!(
Path.join([temp_dir, "scripts", "orphan.lua"]), Path.join([temp_dir, "scripts", "orphan.lua"]),
"---\nid: orphan-script\nslug: orphan-script\ntitle: Orphan Script\nkind: utility\nentrypoint: main\nenabled: true\nversion: 1\ncreated_at: 1\nupdated_at: 1\n---\nfunction main() return true end\n" "---\nid: orphan-script\nprojectId: #{project.id}\nslug: orphan-script\ntitle: Orphan Script\nkind: utility\nentrypoint: main\nenabled: true\nversion: 1\ncreatedAt: 1\nupdatedAt: 1\n---\nfunction main() return true end\n"
) )
File.write!( File.write!(
Path.join([temp_dir, "templates", "orphan-view.liquid"]), Path.join([temp_dir, "templates", "orphan-view.liquid"]),
"---\nid: orphan-template\nslug: orphan-view\ntitle: Orphan View\nkind: list\nenabled: true\nversion: 1\ncreated_at: 1\nupdated_at: 1\n---\n<section>Orphan</section>\n" "---\nid: orphan-template\nprojectId: #{project.id}\nslug: orphan-view\ntitle: Orphan View\nkind: list\nenabled: true\nversion: 1\ncreatedAt: 1\nupdatedAt: 1\n---\n<section>Orphan</section>\n"
) )
assert {:ok, %{diff_reports: diff_reports, orphan_reports: orphan_reports}} = assert {:ok, %{diff_reports: diff_reports, orphan_reports: orphan_reports}} =