class DeviceDetector::Parser

Constants

REGEX_CACHE
ROOT

Attributes

user_agent[R]

Public Class Methods

new(user_agent) click to toggle source
# File lib/device_detector/parser.rb, line 10
def initialize(user_agent)
  @user_agent = user_agent
end

Public Instance Methods

full_version() click to toggle source
# File lib/device_detector/parser.rb, line 22
def full_version
  from_cache(['full_version', self.class.name, user_agent]) do
    VersionExtractor.new(user_agent, regex_meta).call
  end
end
name() click to toggle source
# File lib/device_detector/parser.rb, line 16
def name
  from_cache(['name', self.class.name, user_agent]) do
    NameExtractor.new(user_agent, regex_meta).call
  end
end

Private Instance Methods

build_regex(src) click to toggle source
# File lib/device_detector/parser.rb, line 110
def build_regex(src)
  Regexp.new("(?:^|[^A-Z0-9_-]|[^A-Z0-9-]_|sprd-|MZ-)(?:#{src})", Regexp::IGNORECASE)
end
device_yml_file?(file_path) click to toggle source
# File lib/device_detector/parser.rb, line 70
def device_yml_file?(file_path)
  file_path.include?('/regexes/device/')
end
filenames() click to toggle source
# File lib/device_detector/parser.rb, line 44
def filenames
  raise NotImplementedError
end
filepaths() click to toggle source
# File lib/device_detector/parser.rb, line 48
def filepaths
  filenames.map do |filename|
    [filename.to_sym, File.join(ROOT, 'regexes', filename)]
  end
end
from_cache(key, &block) click to toggle source
# File lib/device_detector/parser.rb, line 114
def from_cache(key, &block)
  DeviceDetector.cache.get_or_set(key, &block)
end
load_regexes(file_paths) click to toggle source
# File lib/device_detector/parser.rb, line 60
def load_regexes(file_paths)
  file_paths.map do |path, full_path|
    object = YAML.load_file(full_path)
    object = rewrite_device_object!(object) if device_yml_file?(full_path)
    object = rewrite_vendor_object!(object) if vendor_yml_file?(full_path)

    [path, symbolize_keys!(object)]
  end
end
matching_regex() click to toggle source
# File lib/device_detector/parser.rb, line 34
def matching_regex
  from_cache([self.class.name, user_agent]) do
    regexes.find { |r| user_agent =~ r[:regex] }
  end
end
parse_regexes(path, raw_regexes) click to toggle source
# File lib/device_detector/parser.rb, line 99
def parse_regexes(path, raw_regexes)
  raw_regexes.map do |meta|
    raise "invalid device spec: #{meta.inspect}" unless meta[:regex].is_a? String

    meta[:regex] = build_regex(meta[:regex])
    meta[:versions].each { |v| v[:regex] = build_regex(v[:regex]) } if meta.key?(:versions)
    meta[:path] = path
    meta
  end
end
regex_meta() click to toggle source
# File lib/device_detector/parser.rb, line 30
def regex_meta
  @regex_meta ||= matching_regex || {}
end
regexes() click to toggle source
# File lib/device_detector/parser.rb, line 40
def regexes
  @regexes ||= regexes_for(filepaths)
end
regexes_for(file_paths) click to toggle source
# File lib/device_detector/parser.rb, line 54
def regexes_for(file_paths)
  REGEX_CACHE.get_or_set(file_paths) do
    load_regexes(file_paths).flat_map { |path, regex| parse_regexes(path, regex) }
  end
end
rewrite_device_object!(object) click to toggle source
# File lib/device_detector/parser.rb, line 82
def rewrite_device_object!(object)
  object.map { |key, value| [key, { 'regex_name' => key }.merge!(value)] }.to_h
end
rewrite_vendor_object!(object) click to toggle source
# File lib/device_detector/parser.rb, line 78
def rewrite_vendor_object!(object)
  object.map { |key, values| values.map { |v| { 'regex_name' => key, 'regex' => v } } }.flatten
end
symbolize_keys!(object) click to toggle source
# File lib/device_detector/parser.rb, line 86
def symbolize_keys!(object)
  case object
  when Array
    object.map! { |v| symbolize_keys!(v) }
  when Hash
    keys = object.keys
    keys.each do |k|
      object[k.to_sym] = symbolize_keys!(object.delete(k)) if k.is_a?(String)
    end
  end
  object
end
vendor_yml_file?(file_path) click to toggle source
# File lib/device_detector/parser.rb, line 74
def vendor_yml_file?(file_path)
  file_path.include?('/regexes/vendorfragments')
end