Module: Textus::Manifest::Entry::Publish

Defined in:
lib/textus/manifest/entry/publish.rb,
lib/textus/manifest/entry/publish/each.rb,
lib/textus/manifest/entry/publish/mode.rb,
lib/textus/manifest/entry/publish/none.rb,
lib/textus/manifest/entry/publish/tree.rb,
lib/textus/manifest/entry/publish/each_dir.rb,
lib/textus/manifest/entry/publish/template.rb,
lib/textus/manifest/entry/publish/to_paths.rb,
lib/textus/manifest/entry/publish/each_file.rb,
lib/textus/manifest/entry/publish/subtree_mirror.rb

Overview

ADR 0049: the publish design is a three-key concept (ADR 0047 table) realized as one resolved sum type. Each directory entry resolves, once, to one Publish::* mode that owns its publish algorithm — no nil-cascade, no pairwise exclusivity guards, one shared subtree mirror.

None      — nothing to publish
ToPaths   — publish_to: 1 stored file -> N fixed repo paths
EachFile  — publish_each (file leaves): 1 leaf file -> 1 templated path
EachDir   — publish_each + index_filename: 1 leaf subtree -> 1 templated dir
Tree      — publish_tree: whole entry subtree -> 1 dir, no keys

Defined Under Namespace

Modules: Template Classes: Each, EachDir, EachFile, Mode, None, SubtreeMirror, ToPaths, Tree

Class Method Summary collapse

Class Method Details

.resolve(entry) ⇒ Object

Resolve an entry to its single publish mode. Raises one UsageError if more than one of publish_each, publish_tree is set —exclusivity is structural here, not four scattered pairwise guards.



18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/textus/manifest/entry/publish.rb', line 18

def self.resolve(entry)
  set = []
  set << "publish_to"   unless Array(entry.publish_to).empty?
  set << "publish_each" unless entry.publish_each.nil?
  set << "publish_tree" unless entry.publish_tree.nil?

  if set.length > 1
    raise Textus::UsageError.new(
      "entry '#{entry.key}': #{set.join(", ")} are mutually exclusive — an entry publishes exactly one way",
    )
  end

  mode_for(entry, set.first)
end