Visualize.Chart.Migration (Visualize v0.2.25)

Copy Markdown View Source

Schema versions and the migrations between them (spec/14 §9).

current/0 is the version this library writes. migrate/1 steps an older design forward one version at a time through the migration registered for each step, so a stored design never goes stale. Version 2 is the first step: a design holds its frames by name (spec/14 §2.1, §4.1, #383), so a version 1 design's singular frame becomes frames: %{main: …} and the size it may still carry is dropped, the render giving one now (§4.2, #427). A stored version 1 design therefore keeps working through Visualize.Chart.from_map/1, which migrates before it validates.

Summary

Functions

The design in the shape this library writes, within the current version: a :text given as a list of parts — the form an earlier draft wrote — becomes the string with interpolation (spec/14 §7.1), walking the map by the schema so a text is known to be one. Every other value passes through as it is.

The schema version this library writes: 2.

The type a key had in an earlier version, for a key of a kind node that the current schema no longer has; nil for any other key.

The design at the current version.

Functions

canonical(map)

@spec canonical(map()) :: map()

The design in the shape this library writes, within the current version: a :text given as a list of parts — the form an earlier draft wrote — becomes the string with interpolation (spec/14 §7.1), walking the map by the schema so a text is known to be one. Every other value passes through as it is.

iex> Visualize.Chart.Migration.canonical(%{version: 2, labels: [%{anchor: :title, text: ["u: ", Visualize.Chart.var(:unit)]}]})
%{version: 2, labels: [%{anchor: :title, text: "u: \#{var(:unit)}"}]}

current()

@spec current() :: pos_integer()

The schema version this library writes: 2.

legacy_type(arg1, arg2)

@spec legacy_type(atom(), atom()) :: Visualize.Chart.Schema.type() | nil

The type a key had in an earlier version, for a key of a kind node that the current schema no longer has; nil for any other key.

The codec reads a document by the current schema, so a key only an earlier version had would be read untyped and its values left as strings. This is what it reads such a key by instead, so a document from that version is typed before migrate/1 reshapes it (spec/14 §9, #479). Each entry belongs to the step that removed the key: version 1's design-level frame is one :frame node, which the 1 → 2 step moves to frames.main.

iex> Visualize.Chart.Migration.legacy_type(:design, :frame)
{:node, :frame}

iex> Visualize.Chart.Migration.legacy_type(:design, :frames)
nil

migrate(map)

@spec migrate(term()) ::
  {:ok, map()} | {:error, [Visualize.Chart.Validator.error(), ...]}

The design at the current version.

A design already there passes through unchanged; an older one is migrated step by step; a version above current/0, below 1, missing or not an integer is an error at [:version].