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
search(query:, fields:, limit: nil)
click to toggle source
# File lib/musicbox/group.rb, line 49 def search(query:, fields:, limit: nil) found = [] words = [query].flatten.join(' ').tokenize.sort.uniq - ['-'] words.each do |word| regexp = Regexp.new(Regexp.quote(word), true) found += @items.values.select do |item| fields.find do |field| case (value = item.send(field)) when Array value.find { |v| v.to_s =~ regexp } else value.to_s =~ regexp end end end end found = found.flatten.compact.uniq found = found[0..limit - 1] if limit found end