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