class MusicBox::Group

Constants

InfoFileName

Attributes

root[RW]

Public Class Methods

item_class() click to toggle source
# File lib/musicbox/group.rb, line 9
def self.item_class
  Item
end
new(root:) click to toggle source
# File lib/musicbox/group.rb, line 13
def initialize(root:)
  @root = Path.new(root).expand_path
  reset
  load
end

Public Instance Methods

<<(item) click to toggle source
# File lib/musicbox/group.rb, line 45
def <<(item)
  add_item(item)
end
[](id) click to toggle source
# File lib/musicbox/group.rb, line 41
def [](id)
  @items[id]
end
add_item(item) click to toggle source
# File lib/musicbox/group.rb, line 85
def add_item(item)
  raise Error, "Item does not have ID" if item.id.nil?
  raise Error, "Item already exists in #{@root}: #{item.id.inspect}" if @items[item.id]
  @items[item.id] = item
end
delete_item(item) click to toggle source
# File lib/musicbox/group.rb, line 95
def delete_item(item)
  @items.delete(item.id)
end
destroy!() click to toggle source
# File lib/musicbox/group.rb, line 122
def destroy!
  @root.rmtree if @root.exist?
end
destroy_item(item) click to toggle source
# File lib/musicbox/group.rb, line 116
def destroy_item(item)
  dir = dir_for_id(id)
  dir.rmtree if dir.exist?
  delete_item(item)
end
dir_for_id(id) click to toggle source
# File lib/musicbox/group.rb, line 70
def dir_for_id(id)
  @root / id
end
has_item?(id) click to toggle source
# File lib/musicbox/group.rb, line 91
def has_item?(id)
  @items.has_key?(id)
end
item_class() click to toggle source
# File lib/musicbox/group.rb, line 23
def item_class
  self.class.item_class
end
items() click to toggle source
# File lib/musicbox/group.rb, line 19
def items
  @items.values
end
load() click to toggle source
# File lib/musicbox/group.rb, line 31
def load
  reset
  if @root.exist?
    @root.glob("*/#{InfoFileName}").each do |info_file|
      add_item(item_class.load(info_file.dirname))
    end
    ;;warn "* loaded #{@items.length} items from #{@root}"
  end
end
new_item(id, args={}) click to toggle source
# File lib/musicbox/group.rb, line 74
def new_item(id, args={})
  item = item_class.new(
    {
      id: id,
      dir: dir_for_id(id),
    }.merge(args)
  )
  add_item(item)
  item
end
reset() click to toggle source
# File lib/musicbox/group.rb, line 27
def reset
  @items = {}
end
save_item(id:, item: nil) { || ... } click to toggle source
# File lib/musicbox/group.rb, line 99
    def save_item(id:, item: nil, &block)
      raise Error, "ID is nil" unless id
      item = yield if block_given?
      raise Error, "Item is nil" unless item
      dir = dir_for_id(id)
      info_file = dir / InfoFileName
      dir.mkpath unless dir.exist?
;;warn "writing to #{info_file}"
      info_file.write(JSON.pretty_generate(item))
    end
save_item_if_new(id:, item: nil, &block) click to toggle source
# File lib/musicbox/group.rb, line 110
def save_item_if_new(id:, item: nil, &block)
  unless has_item?(id)
    save_item(id: id, item: item, &block)
  end
end