Class: MusicBox::Group
- Inherits:
-
Object
show all
- Defined in:
- lib/musicbox/group.rb
Defined Under Namespace
Classes: Item
Constant Summary
collapse
- InfoFileName =
'info.json'
Instance Attribute Summary collapse
Class Method Summary
collapse
Instance Method Summary
collapse
Constructor Details
#initialize(root:) ⇒ Group
Returns a new instance of Group.
13
14
15
16
17
|
# File 'lib/musicbox/group.rb', line 13
def initialize(root:)
@root = Path.new(root).expand_path
reset
load
end
|
Instance Attribute Details
#root ⇒ Object
Returns the value of attribute root.
5
6
7
|
# File 'lib/musicbox/group.rb', line 5
def root
@root
end
|
Class Method Details
.item_class ⇒ Object
9
10
11
|
# File 'lib/musicbox/group.rb', line 9
def self.item_class
Item
end
|
Instance Method Details
#<<(item) ⇒ Object
45
46
47
|
# File 'lib/musicbox/group.rb', line 45
def <<(item)
add_item(item)
end
|
#[](id) ⇒ Object
41
42
43
|
# File 'lib/musicbox/group.rb', line 41
def [](id)
@items[id]
end
|
#add_item(item) ⇒ Object
85
86
87
88
89
|
# 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) ⇒ Object
95
96
97
|
# File 'lib/musicbox/group.rb', line 95
def delete_item(item)
@items.delete(item.id)
end
|
#destroy! ⇒ Object
122
123
124
|
# File 'lib/musicbox/group.rb', line 122
def destroy!
@root.rmtree if @root.exist?
end
|
#destroy_item(item) ⇒ Object
116
117
118
119
120
|
# 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) ⇒ Object
70
71
72
|
# File 'lib/musicbox/group.rb', line 70
def dir_for_id(id)
@root / id
end
|
#has_item?(id) ⇒ Boolean
91
92
93
|
# File 'lib/musicbox/group.rb', line 91
def has_item?(id)
@items.has_key?(id)
end
|
#item_class ⇒ Object
23
24
25
|
# File 'lib/musicbox/group.rb', line 23
def item_class
self.class.item_class
end
|
#items ⇒ Object
19
20
21
|
# File 'lib/musicbox/group.rb', line 19
def items
@items.values
end
|
#load ⇒ Object
31
32
33
34
35
36
37
38
39
|
# 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 = {}) ⇒ Object
74
75
76
77
78
79
80
81
82
83
|
# 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 ⇒ Object
27
28
29
|
# File 'lib/musicbox/group.rb', line 27
def reset
@items = {}
end
|
#save_item(id:, item: nil, &block) ⇒ Object
99
100
101
102
103
104
105
106
107
108
|
# 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) ⇒ Object
110
111
112
113
114
|
# 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) ⇒ Object
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
# 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
|