Class: Ace::Support::Items::Atoms::ItemIdFormatter

Inherits:
Object
  • Object
show all
Defined in:
lib/ace/support/items/atoms/item_id_formatter.rb

Overview

Splits and reconstructs 6-char b36ts IDs with type markers.

A raw 6-char b36ts ID “8ppq7w” becomes “8pp.t.q7w” with type marker “t”. Subtasks append a single character: “8pp.t.q7w.a”

Examples:

Split a raw ID

ItemIdFormatter.split("8ppq7w", type_marker: "t")
# => ItemId(prefix: "8pp", type_marker: "t", suffix: "q7w")

Reconstruct from formatted ID

ItemIdFormatter.reconstruct("8pp.t.q7w")
# => "8ppq7w"

Class Method Summary collapse

Class Method Details

.folder_name(formatted_id, slug) ⇒ String

Build a folder name from formatted ID and slug

Parameters:

  • formatted_id (String)

    e.g., “8pp.t.q7w”

  • slug (String)

    e.g., “fix-login”

Returns:

  • (String)

    e.g., “8pp.t.q7w-fix-login”



70
71
72
73
74
75
76
# File 'lib/ace/support/items/atoms/item_id_formatter.rb', line 70

def self.folder_name(formatted_id, slug)
  if slug.nil? || slug.empty?
    formatted_id
  else
    "#{formatted_id}-#{slug}"
  end
end

.reconstruct(formatted_id) ⇒ String

Reconstruct a raw 6-char b36ts ID from a formatted ID string

Parameters:

  • formatted_id (String)

    Formatted ID (e.g., “8pp.t.q7w” or “8pp.t.q7w.a”)

Returns:

  • (String)

    Raw 6-char b36ts ID (e.g., “8ppq7w”)

Raises:

  • (ArgumentError)

    If format is invalid



59
60
61
62
63
64
# File 'lib/ace/support/items/atoms/item_id_formatter.rb', line 59

def self.reconstruct(formatted_id)
  match = formatted_id.match(/^([0-9a-z]{3})\.([a-z])\.([0-9a-z]{3})(?:\.([0-9a-z]))?$/)
  raise ArgumentError, "Invalid formatted ID: #{formatted_id.inspect}" unless match

  "#{match[1]}#{match[3]}"
end

.split(raw_b36ts, type_marker:) ⇒ Models::ItemId

Split a 6-char b36ts ID into prefix.marker.suffix format

Parameters:

  • raw_b36ts (String)

    6-character b36ts ID

  • type_marker (String)

    Type marker (e.g., “t” for task, “i” for idea)

Returns:

Raises:

  • (ArgumentError)

    If raw_b36ts is not exactly 6 characters



27
28
29
30
31
32
33
34
35
36
37
# File 'lib/ace/support/items/atoms/item_id_formatter.rb', line 27

def self.split(raw_b36ts, type_marker:)
  raise ArgumentError, "Expected 6-char b36ts ID, got #{raw_b36ts.inspect}" unless raw_b36ts.is_a?(String) && raw_b36ts.length == 6

  Models::ItemId.new(
    raw_b36ts: raw_b36ts,
    prefix: raw_b36ts[0..2],
    type_marker: type_marker,
    suffix: raw_b36ts[3..5],
    subtask_char: nil
  )
end

.split_subtask(raw_b36ts, type_marker:, subtask_char:) ⇒ Models::ItemId

Create an ItemId with a subtask character

Parameters:

  • raw_b36ts (String)

    6-character b36ts ID

  • type_marker (String)

    Type marker

  • subtask_char (String)

    Single subtask character (e.g., “a”)

Returns:



44
45
46
47
48
49
50
51
52
53
# File 'lib/ace/support/items/atoms/item_id_formatter.rb', line 44

def self.split_subtask(raw_b36ts, type_marker:, subtask_char:)
  item_id = split(raw_b36ts, type_marker: type_marker)
  Models::ItemId.new(
    raw_b36ts: item_id.raw_b36ts,
    prefix: item_id.prefix,
    type_marker: item_id.type_marker,
    suffix: item_id.suffix,
    subtask_char: subtask_char
  )
end