Class: Kagu::Finder

Inherits:
Object
  • Object
show all
Defined in:
lib/kagu/finder.rb

Constant Summary collapse

MANDATORY_ATTRIBUTES =
[].freeze

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ Finder

Returns a new instance of Finder.



21
22
23
24
# File 'lib/kagu/finder.rb', line 21

def initialize(options = {})
  @semaphore = Mutex.new
  reload(options)
end

Class Method Details

.replace(value, replacements = {}) ⇒ Object



9
10
11
12
13
14
15
# File 'lib/kagu/finder.rb', line 9

def self.replace(value, replacements = {})
  replaced = value.to_s.dup
  replacements.each do |pattern, replacement|
    replaced.gsub!(pattern, replacement)
  end
  replaced.presence
end

.transliterate(value) ⇒ Object



17
18
19
# File 'lib/kagu/finder.rb', line 17

def self.transliterate(value)
  ActiveSupport::Inflector.transliterate(value.to_s).squish.downcase.presence
end

Instance Method Details

#find(attributes = {}) ⇒ Object



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/kagu/finder.rb', line 26

def find(attributes = {})
  attributes.stringify_keys!
  results = [].tap do |matches|
    tracks_digests.each_with_index do |hash, digests_index|
      digests(attributes).each_with_index do |digest, digest_index|
        tracks = hash[digest].presence || next
        tracks = tracks.reject { |track| matches.any? { |match| match.try(:include?, track) } }
        next if tracks.empty?
        index = [digests_index, digest_index].max
        matches[index] ||= []
        matches[index].push(*tracks)
      end
    end
  end
  results.compact!
  replacements.any? ? results : results.flatten
end

#ignoredObject



44
45
46
# File 'lib/kagu/finder.rb', line 44

def ignored
  @ignored ||= []
end

#ignored?(track) ⇒ Boolean

Returns:

  • (Boolean)


48
49
50
# File 'lib/kagu/finder.rb', line 48

def ignored?(track)
  track.present? && digests(track).any? { |digest| ignored.include?(digest) }
end

#reload(options = {}) ⇒ Object



52
53
54
55
56
57
58
59
60
# File 'lib/kagu/finder.rb', line 52

def reload(options = {})
  @ignored = nil
  @replacements = nil
  @tracks_digests = nil
  options.each do |name, value|
    send("#{name}=", value) if respond_to?("#{name}=", true)
  end
  self
end

#reload!(options = {}) ⇒ Object



62
63
64
65
# File 'lib/kagu/finder.rb', line 62

def reload!(options = {})
  @tracks = nil
  reload(options)
end

#replacementsObject



67
68
69
# File 'lib/kagu/finder.rb', line 67

def replacements
  @replacements ||= []
end