wurfl_device 0.1.10 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/wurfldevice_rpc_server +10 -2
- data/lib/wurfl_device.rb +1 -26
- data/lib/wurfl_device/cache.rb +65 -72
- data/lib/wurfl_device/cli.rb +22 -22
- data/lib/wurfl_device/rpc_server.rb +0 -5
- data/lib/wurfl_device/user_agent.rb +3 -3
- data/lib/wurfl_device/user_agent_matcher.rb +33 -32
- data/lib/wurfl_device/version.rb +1 -1
- data/lib/wurfl_device/xml_loader.rb +13 -4
- metadata +29 -29
data/bin/wurfldevice_rpc_server
CHANGED
@@ -7,12 +7,20 @@ require 'daemons'
|
|
7
7
|
require 'wurfl_device'
|
8
8
|
require 'msgpack/rpc'
|
9
9
|
|
10
|
+
$rpc_socket = File.join(ENV['HOME'], 'var', 'run', 'wurfldevice_rpc_server.sock')
|
11
|
+
$socket_only = false
|
10
12
|
$rpc_host = '0.0.0.0'
|
11
13
|
$rpc_port = 8090
|
12
|
-
$state_dir = File.join(ENV['HOME'], '
|
13
|
-
$log_dir = File.join(ENV['HOME'], '
|
14
|
+
$state_dir = File.join(ENV['HOME'], 'var', 'run')
|
15
|
+
$log_dir = File.join(ENV['HOME'], 'log')
|
14
16
|
|
15
17
|
args = OptionParser.new do |opts|
|
18
|
+
opts.on("-s", "--socket=PATH", "set socket file to to PATH (default: #{$rpc_socket})") do |t|
|
19
|
+
$rpc_socket = t
|
20
|
+
end
|
21
|
+
opts.on("-t", "--socket-only", "listen using socket only (default: #{$socket_only})") do |t|
|
22
|
+
$socket_only = t
|
23
|
+
end
|
16
24
|
opts.on("-o", "--host=HOST", "listen on HOST (default: #{$rpc_host})") do |t|
|
17
25
|
$rpc_host = t
|
18
26
|
end
|
data/lib/wurfl_device.rb
CHANGED
@@ -1,16 +1,6 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
require 'wurfl_device/version'
|
3
|
-
|
4
|
-
class Object
|
5
|
-
def to_actual_value
|
6
|
-
return self unless self.kind_of?(String)
|
7
|
-
return false if self =~ /^false/i
|
8
|
-
return true if self =~ /^true/i
|
9
|
-
return self.to_i if (self == self.to_i.to_s)
|
10
|
-
return self.to_f if (self == self.to_f.to_s)
|
11
|
-
self
|
12
|
-
end
|
13
|
-
end
|
3
|
+
require 'msgpack'
|
14
4
|
|
15
5
|
module WurflDevice
|
16
6
|
autoload :UI, 'wurfl_device/ui'
|
@@ -45,21 +35,6 @@ module WurflDevice
|
|
45
35
|
capabilities
|
46
36
|
end
|
47
37
|
|
48
|
-
def capability_from_user_agent(capability, user_agent)
|
49
|
-
capability_key = capability
|
50
|
-
if Settings::CAPABILITY_GROUPS.include?(capability)
|
51
|
-
group_keys = Array.new
|
52
|
-
Settings::CAPABILITY_TO_GROUP.select { |k, v| v == capability }.each_pair { |k, v| group_keys << "#{v}:#{k}" }
|
53
|
-
group_vals = Cache.storage.hmget(Cache::UserAgents.build_cache_id(user_agent), *group_keys)
|
54
|
-
return Cache.parse_actual_capabilities(Hash[*group_keys.zip(group_vals).flatten])[capability] if (group_vals.select { |v| v.nil? }.empty?)
|
55
|
-
elsif Settings::CAPABILITY_TO_GROUP.key?(capability)
|
56
|
-
capability_key = "#{Settings::CAPABILITY_TO_GROUP[capability]}:#{capability}"
|
57
|
-
end
|
58
|
-
actual_capability = WurflDevice::Cache::UserAgents.get(user_agent, capability_key)
|
59
|
-
return actual_capability.to_actual_value unless actual_capability.nil?
|
60
|
-
return nil
|
61
|
-
end
|
62
|
-
|
63
38
|
def capabilities_from_user_agent(user_agent)
|
64
39
|
matcher = UserAgentMatcher.new
|
65
40
|
matcher.match(user_agent)
|
data/lib/wurfl_device/cache.rb
CHANGED
@@ -9,19 +9,31 @@ module WurflDevice
|
|
9
9
|
entries.each { |key| Cache.storage.del(build_cache_id(key)) }
|
10
10
|
end
|
11
11
|
|
12
|
-
def set(id,
|
12
|
+
def set(id, value)
|
13
|
+
Cache.storage.set(build_cache_id(id), value)
|
14
|
+
end
|
15
|
+
|
16
|
+
def get(id)
|
17
|
+
Cache.storage.get(build_cache_id(id))
|
18
|
+
end
|
19
|
+
|
20
|
+
def del(id)
|
21
|
+
Cache.storage.del(build_cache_id(id))
|
22
|
+
end
|
23
|
+
|
24
|
+
def hset(id, key, value)
|
13
25
|
Cache.storage.hset(build_cache_id(id), key, value)
|
14
26
|
end
|
15
27
|
|
16
|
-
def
|
28
|
+
def hget(id, key)
|
17
29
|
Cache.storage.hget(build_cache_id(id), key)
|
18
30
|
end
|
19
31
|
|
20
|
-
def
|
32
|
+
def hkeys(id)
|
21
33
|
Cache.storage.hkeys(build_cache_id(id))
|
22
34
|
end
|
23
35
|
|
24
|
-
def
|
36
|
+
def hgetall(id)
|
25
37
|
Cache.storage.hgetall(build_cache_id(id))
|
26
38
|
end
|
27
39
|
|
@@ -33,14 +45,6 @@ module WurflDevice
|
|
33
45
|
entry_ids
|
34
46
|
end
|
35
47
|
|
36
|
-
def get_value(id)
|
37
|
-
Cache.storage.get(build_cache_id(id))
|
38
|
-
end
|
39
|
-
|
40
|
-
def set_value(id, value)
|
41
|
-
Cache.storage.set(build_cache_id(id), value)
|
42
|
-
end
|
43
|
-
|
44
48
|
def build_cache_id(id)
|
45
49
|
"#{self.name}:#{id}"
|
46
50
|
end
|
@@ -49,15 +53,28 @@ module WurflDevice
|
|
49
53
|
|
50
54
|
class Devices < Entries; end
|
51
55
|
class UserAgents < Entries; end
|
56
|
+
class UserAgentsMatched < Entries; end
|
52
57
|
class UserAgentsManufacturers < Entries; end
|
53
58
|
|
54
59
|
class Status < Entries
|
60
|
+
def self.last_updated
|
61
|
+
get('last_updated') || ''
|
62
|
+
end
|
63
|
+
|
55
64
|
def self.version
|
56
|
-
|
65
|
+
hkeys 'version'
|
57
66
|
end
|
58
67
|
|
59
|
-
def self.
|
60
|
-
|
68
|
+
def self.initialized?
|
69
|
+
get 'initialized'
|
70
|
+
end
|
71
|
+
|
72
|
+
def self.initialize!
|
73
|
+
set 'initialized', 1
|
74
|
+
end
|
75
|
+
|
76
|
+
def self.uninitialize!
|
77
|
+
del 'initialized'
|
61
78
|
end
|
62
79
|
end
|
63
80
|
|
@@ -76,106 +93,80 @@ module WurflDevice
|
|
76
93
|
end
|
77
94
|
|
78
95
|
def initialized?
|
79
|
-
Status.
|
96
|
+
Status.initialized?
|
80
97
|
end
|
81
98
|
|
82
99
|
def initialize_cache(xml_file)
|
83
100
|
version_list = Array.new
|
84
101
|
|
102
|
+
Status.uninitialize!
|
85
103
|
XmlLoader.load_xml_file(xml_file) do |capabilities|
|
86
104
|
version = capabilities.delete(:version)
|
87
105
|
version_list << version unless version.nil?
|
88
106
|
|
89
|
-
device_id = capabilities
|
107
|
+
device_id = capabilities['id']
|
90
108
|
next if device_id.nil? || device_id.empty?
|
91
109
|
|
92
|
-
user_agent = capabilities
|
110
|
+
user_agent = capabilities['user_agent']
|
93
111
|
user_agent = Settings::GENERIC if user_agent.nil? || user_agent.empty?
|
94
112
|
user_agent.strip!
|
95
113
|
|
96
|
-
fall_back = capabilities
|
114
|
+
fall_back = capabilities['fall_back']
|
97
115
|
fall_back = '' if fall_back.nil?
|
98
116
|
fall_back.strip!
|
99
117
|
|
100
|
-
Devices.set device_id, 'id', device_id
|
101
|
-
Devices.set device_id, 'user_agent', user_agent
|
102
|
-
Devices.set device_id, 'fall_back', fall_back
|
103
|
-
|
104
118
|
user_agent = UserAgent.new user_agent
|
105
|
-
UserAgents.set user_agent,
|
119
|
+
UserAgents.set user_agent, device_id
|
106
120
|
unless user_agent =~ /^DO_NOT_MATCH/i
|
107
|
-
UserAgentsManufacturers.
|
121
|
+
UserAgentsManufacturers.hset user_agent.manufacturer, user_agent, device_id
|
108
122
|
end
|
109
123
|
|
110
|
-
|
111
|
-
if value.is_a?(Hash)
|
112
|
-
value.each_pair do |k, v|
|
113
|
-
Devices.set device_id, "#{key.to_s}:#{k.to_s}", v
|
114
|
-
end
|
115
|
-
else
|
116
|
-
Devices.set device_id, key.to_s, value
|
117
|
-
end
|
118
|
-
end
|
124
|
+
Devices.set device_id, capabilities.to_msgpack
|
119
125
|
end
|
120
126
|
|
121
127
|
version_list.each do |ver|
|
122
|
-
Status.
|
128
|
+
Status.hset 'version', ver, 1
|
123
129
|
end
|
124
|
-
Status.
|
125
|
-
|
130
|
+
Status.set 'last_updated', Time.now
|
131
|
+
|
132
|
+
Status.initialize!
|
126
133
|
end
|
127
134
|
|
128
135
|
def rebuild_user_agents
|
129
136
|
UserAgents.clear
|
130
137
|
UserAgentsManufacturers.clear
|
131
138
|
Devices.entries.each do |device_id|
|
132
|
-
device = Devices.
|
139
|
+
device = MessagePack.unpack(Devices.get(device_id))
|
133
140
|
user_agent = UserAgent.new device['user_agent']
|
134
|
-
UserAgents.set user_agent,
|
141
|
+
UserAgents.set user_agent, device_id
|
135
142
|
unless user_agent =~ /^DO_NOT_MATCH/i
|
136
|
-
UserAgentsManufacturers.
|
143
|
+
UserAgentsManufacturers.hset user_agent.manufacturer, user_agent, device_id
|
137
144
|
end
|
138
145
|
end
|
139
|
-
Status.
|
146
|
+
Status.set 'last_updated', Time.now
|
140
147
|
end
|
141
148
|
|
142
149
|
def update_actual_capabilities(user_agent, capabilities)
|
143
150
|
capabilities.each_pair do |key, value|
|
144
151
|
if value.kind_of?(Hash)
|
145
152
|
value.each_pair do |k, v|
|
146
|
-
UserAgents.set user_agent, "#{key}:#{k}", v
|
147
|
-
end
|
148
|
-
elsif value.is_a?(Array)
|
149
|
-
value.each_with_index do |v, i|
|
150
|
-
UserAgents.set user_agent, "#{key}:#{i}", v
|
153
|
+
UserAgents.set user_agent, "#{key}:#{k}", MessagePack.pack(v)
|
151
154
|
end
|
152
155
|
else
|
153
|
-
|
156
|
+
if ['user_agent', 'fall_back', 'id'].include?(key)
|
157
|
+
UserAgents.set user_agent, key, value
|
158
|
+
else
|
159
|
+
UserAgents.set user_agent, key, MessagePack.pack(value)
|
160
|
+
end
|
154
161
|
end
|
155
162
|
end
|
156
163
|
end
|
157
164
|
|
158
|
-
def
|
165
|
+
def build_capabilities(device_id)
|
159
166
|
capabilities = Capability.new
|
160
167
|
|
161
|
-
actual_capabilities.
|
162
|
-
if key =~ /^(.+)\:(\d+)$/i
|
163
|
-
capabilities[$1] ||= Array.new
|
164
|
-
capabilities[$1][$2.to_i] = value.to_actual_value
|
165
|
-
elsif key =~ /^(.+)\:(.+)$/i
|
166
|
-
capabilities[$1] ||= Capability.new
|
167
|
-
capabilities[$1][$2] = value.to_actual_value
|
168
|
-
else
|
169
|
-
capabilities[key] = value.to_actual_value
|
170
|
-
end
|
171
|
-
end
|
172
|
-
|
173
|
-
capabilities
|
174
|
-
end
|
168
|
+
actual_capabilities = MessagePack.unpack(Devices.get(device_id)) rescue nil
|
175
169
|
|
176
|
-
def build_capabilities(device_id)
|
177
|
-
capabilities = Capability.new
|
178
|
-
actual_capabilities = Devices.keys_values(device_id)
|
179
170
|
return capabilities if actual_capabilities.nil?
|
180
171
|
|
181
172
|
capabilities['fall_back_tree'] ||= Array.new
|
@@ -188,24 +179,26 @@ module WurflDevice
|
|
188
179
|
if value.kind_of?(Hash)
|
189
180
|
capabilities[key] ||= Capability.new
|
190
181
|
value.each_pair do |k, v|
|
191
|
-
capabilities[key][k] = v
|
182
|
+
capabilities[key][k] = v
|
192
183
|
end
|
193
184
|
elsif value.is_a?(Array)
|
194
185
|
capabilities[key] ||= Array.new
|
195
|
-
capabilities[key] |= value
|
186
|
+
capabilities[key] |= value
|
196
187
|
else
|
197
|
-
capabilities[key] = value
|
188
|
+
capabilities[key] = value
|
198
189
|
end
|
199
190
|
end
|
200
191
|
end
|
201
192
|
end
|
202
193
|
|
203
194
|
actual_capabilities.each_pair do |key, value|
|
204
|
-
if
|
205
|
-
capabilities[
|
206
|
-
|
195
|
+
if value.kind_of?(Hash)
|
196
|
+
capabilities[key] ||= Capability.new
|
197
|
+
value.each_pair do |k, v|
|
198
|
+
capabilities[key][k] = v
|
199
|
+
end
|
207
200
|
else
|
208
|
-
capabilities[key] = value
|
201
|
+
capabilities[key] = value
|
209
202
|
end
|
210
203
|
end
|
211
204
|
|
data/lib/wurfl_device/cli.rb
CHANGED
@@ -48,10 +48,16 @@ module WurflDevice
|
|
48
48
|
method_option "matched-only", :type => :boolean, :banner => "show user agents that were matched", :aliases => "-m"
|
49
49
|
def list
|
50
50
|
matched_only = options['matched-only']
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
51
|
+
if matched_only
|
52
|
+
Cache::UserAgentsMatched.entries.each do |user_agent|
|
53
|
+
capabilities = WurflDevice.capabilities_from_user_agent(user_agent)
|
54
|
+
WurflDevice.ui.info "#{user_agent}:#{capabilities.id}"
|
55
|
+
end
|
56
|
+
else
|
57
|
+
Cache::UserAgents.entries.each do |user_agent|
|
58
|
+
device_id = Cache::UserAgents.get(user_agent)
|
59
|
+
WurflDevice.ui.info "#{user_agent}:#{device_id}"
|
60
|
+
end
|
55
61
|
end
|
56
62
|
end
|
57
63
|
|
@@ -61,14 +67,14 @@ module WurflDevice
|
|
61
67
|
xml_file ||= Settings.default_wurfl_xml_file
|
62
68
|
unless options.update?
|
63
69
|
WurflDevice.ui.info "clearing existing device cache."
|
64
|
-
|
70
|
+
Cache.clear
|
65
71
|
end
|
66
72
|
WurflDevice.ui.info "initializing wurfl device cache."
|
67
|
-
|
73
|
+
Cache.initialize_cache(xml_file)
|
68
74
|
|
69
75
|
if options.update?
|
70
76
|
WurflDevice.ui.info "rebuilding user agent cache."
|
71
|
-
|
77
|
+
Cache.rebuild_user_agents
|
72
78
|
end
|
73
79
|
|
74
80
|
status true
|
@@ -77,31 +83,25 @@ module WurflDevice
|
|
77
83
|
desc "status", "show wurfl cache information"
|
78
84
|
def status(skip_version=false)
|
79
85
|
version unless skip_version
|
80
|
-
unless
|
86
|
+
unless Cache.initialized?
|
81
87
|
WurflDevice.ui.info "cache is not initialized"
|
82
88
|
return
|
83
89
|
end
|
84
90
|
WurflDevice.ui.info "cache info:"
|
85
|
-
WurflDevice.ui.info " wurfl-xml version: " +
|
86
|
-
WurflDevice.ui.info " cache last updated: " +
|
87
|
-
devices =
|
88
|
-
user_agents =
|
91
|
+
WurflDevice.ui.info " wurfl-xml version: " + Cache::Status.version.join(' ')
|
92
|
+
WurflDevice.ui.info " cache last updated: " + Cache::Status.last_updated
|
93
|
+
devices = Cache::Devices.entries
|
94
|
+
user_agents = Cache::UserAgents.entries
|
89
95
|
user_agents_message = ''
|
90
96
|
user_agents_message = " (warning count should be greater than or equal to devices count)" if user_agents.length < devices.length
|
91
97
|
|
92
|
-
matched_count = 0
|
93
|
-
WurflDevice::Cache::UserAgents.entries.each do |user_agent|
|
94
|
-
kv = WurflDevice::Cache::UserAgents.keys_values user_agent
|
95
|
-
next if kv.count == 1
|
96
|
-
matched_count = matched_count + 1
|
97
|
-
end
|
98
98
|
WurflDevice.ui.info " " + commify(devices.length) + " device id's"
|
99
99
|
WurflDevice.ui.info " " + commify(user_agents.length) + " user agents in cache" + user_agents_message
|
100
|
-
WurflDevice.ui.info " " + commify(
|
100
|
+
WurflDevice.ui.info " " + commify(Cache::UserAgentsMatched.entries.count) + " user agents matched"
|
101
101
|
|
102
102
|
user_agent_manufacturers = Array.new
|
103
|
-
|
104
|
-
user_agent_manufacturers << "#{index}(" + commify(
|
103
|
+
Cache::UserAgentsManufacturers.entries.each do |index|
|
104
|
+
user_agent_manufacturers << "#{index}(" + commify(Cache::UserAgentsManufacturers.hkeys(index).length) + ")"
|
105
105
|
end
|
106
106
|
user_agent_manufacturers.sort!
|
107
107
|
WurflDevice.ui.info "wurfl user agent manufacturers:"
|
@@ -115,7 +115,7 @@ module WurflDevice
|
|
115
115
|
|
116
116
|
desc "version", "show the wurfl_device version information"
|
117
117
|
def version
|
118
|
-
WurflDevice.ui.info "wurfl_device version #{
|
118
|
+
WurflDevice.ui.info "wurfl_device version #{VERSION.freeze}"
|
119
119
|
end
|
120
120
|
map %w(-v --version) => :version
|
121
121
|
|
@@ -10,10 +10,5 @@ module WurflDevice
|
|
10
10
|
capabilities = WurflDevice.capabilities_from_user_agent(user_agent)
|
11
11
|
yield(capabilities)
|
12
12
|
end
|
13
|
-
|
14
|
-
def capability_from_user_agent(capability, user_agent)
|
15
|
-
capabilities = WurflDevice.capability_from_user_agent(capability, user_agent)
|
16
|
-
yield(capabilities)
|
17
|
-
end
|
18
13
|
end
|
19
14
|
end
|
@@ -14,7 +14,7 @@ module WurflDevice
|
|
14
14
|
|
15
15
|
def is_desktop_browser?
|
16
16
|
ua = self.downcase
|
17
|
-
|
17
|
+
Settings::DESKTOP_BROWSERS.each do |sig|
|
18
18
|
return true if ua.index(sig)
|
19
19
|
end
|
20
20
|
return false
|
@@ -24,7 +24,7 @@ module WurflDevice
|
|
24
24
|
ua = self.downcase
|
25
25
|
return false if self.is_desktop_browser?
|
26
26
|
return true if ua =~ /[^\d]\d{3}x\d{3}/
|
27
|
-
|
27
|
+
Settings::DESKTOP_BROWSERS.each do |sig|
|
28
28
|
return true if ua.index(sig)
|
29
29
|
end
|
30
30
|
return false
|
@@ -32,7 +32,7 @@ module WurflDevice
|
|
32
32
|
|
33
33
|
def is_robot?
|
34
34
|
ua = self.downcase
|
35
|
-
|
35
|
+
Settings::ROBOTS.each do |sig|
|
36
36
|
return true if ua.index(sig)
|
37
37
|
end
|
38
38
|
return false
|
@@ -11,46 +11,47 @@ module WurflDevice
|
|
11
11
|
@user_agent = user_agent
|
12
12
|
|
13
13
|
# exact match
|
14
|
-
|
14
|
+
matched_data = Cache::UserAgentsMatched.get(user_agent)
|
15
|
+
unless matched_data.nil?
|
16
|
+
@capabilities = Capability.new(MessagePack.unpack(matched_data))
|
17
|
+
return self
|
18
|
+
end
|
15
19
|
|
16
20
|
matched_ua = nil
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
+
matcher = "matcher_#{user_agent.manufacturer.downcase}"
|
22
|
+
user_agent = user_agent.cleaned
|
23
|
+
if self.respond_to?(matcher)
|
24
|
+
matched_ua = self.send(matcher, user_agent)
|
25
|
+
else
|
26
|
+
if user_agent =~ /^Mozilla/i
|
27
|
+
tolerance = 5
|
28
|
+
matched_ua = ld_match(user_agent, tolerance)
|
21
29
|
else
|
22
|
-
|
23
|
-
|
24
|
-
matched_ua = ld_match(user_agent, tolerance)
|
25
|
-
else
|
26
|
-
tolerance = @user_agent.first_slash
|
27
|
-
matched_ua = ris_match(@user_agent, tolerance)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
unless matched_ua.nil?
|
32
|
-
capabilities = WurflDevice::Cache::UserAgents.keys_values(matched_ua)
|
30
|
+
tolerance = user_agent.first_slash
|
31
|
+
matched_ua = ris_match(user_agent, tolerance)
|
33
32
|
end
|
34
33
|
end
|
35
34
|
|
36
|
-
|
37
|
-
|
35
|
+
unless matched_ua.nil?
|
36
|
+
device_id = Cache::UserAgents.get(matched_ua)
|
37
|
+
@capabilities = Cache.build_capabilities(device_id)
|
38
38
|
end
|
39
39
|
|
40
|
-
if capabilities.
|
41
|
-
|
42
|
-
Cache.
|
43
|
-
|
44
|
-
@capabilities = WurflDevice::Cache.parse_actual_capabilities(capabilities)
|
40
|
+
if @capabilities.nil?
|
41
|
+
user_agent = user_agent.cleaned
|
42
|
+
device_id = Cache::UserAgents.get(last_attempts(user_agent))
|
43
|
+
@capabilities = Cache.build_capabilities(device_id)
|
45
44
|
end
|
46
45
|
|
46
|
+
Cache::UserAgentsMatched.set @user_agent, MessagePack.pack(@capabilities)
|
47
|
+
|
47
48
|
return self
|
48
49
|
end
|
49
50
|
|
50
51
|
def ris_match(user_agent, tolerance=nil)
|
51
|
-
tolerance =
|
52
|
+
tolerance = Settings::WORST_MATCH if tolerance.nil?
|
52
53
|
device = nil
|
53
|
-
user_agent_list =
|
54
|
+
user_agent_list = Cache::UserAgentsManufacturers.hkeys(user_agent.manufacturer).sort
|
54
55
|
curlen = user_agent.length
|
55
56
|
while curlen >= tolerance
|
56
57
|
user_agent_list.each do |ua|
|
@@ -66,8 +67,8 @@ module WurflDevice
|
|
66
67
|
end
|
67
68
|
|
68
69
|
def ld_match(user_agent, tolerance=nil)
|
69
|
-
tolerance =
|
70
|
-
user_agent_list =
|
70
|
+
tolerance = Settings::WORST_MATCH if tolerance.nil?
|
71
|
+
user_agent_list = Cache::UserAgentsManufacturers.hkeys(user_agent.manufacturer).sort
|
71
72
|
length = user_agent.length
|
72
73
|
best = tolerance
|
73
74
|
current = 0
|
@@ -134,7 +135,7 @@ module WurflDevice
|
|
134
135
|
when user_agent.contains(['Mozilla/4.0', 'Mozilla/5.0', 'Mozilla/6.0'])
|
135
136
|
'DO_NOT_MATCH_GENERIC_WEB_BROWSER'
|
136
137
|
else
|
137
|
-
|
138
|
+
Settings::GENERIC
|
138
139
|
end
|
139
140
|
|
140
141
|
return device_ua
|
@@ -260,7 +261,7 @@ module WurflDevice
|
|
260
261
|
when user_agent.contains('iPhone')
|
261
262
|
'Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A538a Safari/419.3'
|
262
263
|
else
|
263
|
-
|
264
|
+
Settings::GENERIC
|
264
265
|
end
|
265
266
|
end
|
266
267
|
return matched_ua
|
@@ -388,7 +389,7 @@ module WurflDevice
|
|
388
389
|
end
|
389
390
|
|
390
391
|
def matcher_portalmmm(user_agent)
|
391
|
-
return
|
392
|
+
return Settings::GENERIC
|
392
393
|
end
|
393
394
|
|
394
395
|
def matcher_qtek(user_agent)
|
@@ -512,7 +513,7 @@ module WurflDevice
|
|
512
513
|
if user_agent.contains(['SLCC1', 'Media Center PC', '.NET CLR', 'OfficeLiveConnector'])
|
513
514
|
matched_ua'DO_NOT_MATCH_GENERIC_WEB_BROWSER'
|
514
515
|
else
|
515
|
-
matched_ua =
|
516
|
+
matched_ua = Settings::GENERIC
|
516
517
|
end
|
517
518
|
end
|
518
519
|
return matched_ua
|
@@ -582,7 +583,7 @@ module WurflDevice
|
|
582
583
|
when user_agent.contains('Macintosh') || user_agent.contains('Windows')
|
583
584
|
'DO_NOT_MATCH_GENERIC_WEB_BROWSER'
|
584
585
|
else
|
585
|
-
|
586
|
+
Settings::GENERIC
|
586
587
|
end
|
587
588
|
end
|
588
589
|
return matched_ua
|
data/lib/wurfl_device/version.rb
CHANGED
@@ -3,6 +3,15 @@ require 'ox'
|
|
3
3
|
|
4
4
|
module WurflDevice
|
5
5
|
class XmlLoader
|
6
|
+
def self.to_actual_value(value)
|
7
|
+
return value unless value.kind_of?(String)
|
8
|
+
return false if value =~ /^false/i
|
9
|
+
return true if value =~ /^true/i
|
10
|
+
return value.to_i if (value == value.to_i.to_s)
|
11
|
+
return value.to_f if (value == value.to_f.to_s)
|
12
|
+
value
|
13
|
+
end
|
14
|
+
|
6
15
|
def self.load_xml_file(wurfl_file, &blk)
|
7
16
|
begin
|
8
17
|
file_contents = File.open(wurfl_file).read.force_encoding('UTF-8')
|
@@ -34,16 +43,16 @@ module WurflDevice
|
|
34
43
|
elem2.nodes.map do |device|
|
35
44
|
next unless device.value =~ /device/i
|
36
45
|
capabilities = Hash.new
|
37
|
-
capabilities['id'] = device.attributes[:id] || ''
|
38
|
-
capabilities['user_agent'] = device.attributes[:user_agent] || ''
|
39
|
-
capabilities['fall_back'] = device.attributes[:fall_back] || ''
|
46
|
+
capabilities['id'] = (device.attributes[:id] || '')
|
47
|
+
capabilities['user_agent'] = (device.attributes[:user_agent] || '')
|
48
|
+
capabilities['fall_back'] = (device.attributes[:fall_back] || '')
|
40
49
|
|
41
50
|
device.nodes.map do |group|
|
42
51
|
next unless group.value =~ /group/i
|
43
52
|
group.nodes.map do |capability|
|
44
53
|
capabilities[group.attributes[:id]] ||= Hash.new
|
45
54
|
next unless capability.value =~ /capability/i
|
46
|
-
capabilities[group.attributes[:id]][capability.attributes[:name]] = capability.attributes[:value]
|
55
|
+
capabilities[group.attributes[:id]][capability.attributes[:name]] = to_actual_value(capability.attributes[:value])
|
47
56
|
end
|
48
57
|
end
|
49
58
|
yield capabilities if block_given?
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wurfl_device
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2011-11-21 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: msgpack-rpc
|
16
|
-
requirement: &
|
16
|
+
requirement: &227074280 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *227074280
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: daemons
|
27
|
-
requirement: &
|
27
|
+
requirement: &227073240 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *227073240
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: hiredis
|
38
|
-
requirement: &
|
38
|
+
requirement: &227072160 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *227072160
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: redis
|
49
|
-
requirement: &
|
49
|
+
requirement: &227071320 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *227071320
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: thor
|
60
|
-
requirement: &
|
60
|
+
requirement: &227070660 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :runtime
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *227070660
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: ox
|
71
|
-
requirement: &
|
71
|
+
requirement: &227070000 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: '0'
|
77
77
|
type: :runtime
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *227070000
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: text
|
82
|
-
requirement: &
|
82
|
+
requirement: &227069080 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ! '>='
|
@@ -87,10 +87,10 @@ dependencies:
|
|
87
87
|
version: '0'
|
88
88
|
type: :runtime
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *227069080
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: bundler
|
93
|
-
requirement: &
|
93
|
+
requirement: &227058420 !ruby/object:Gem::Requirement
|
94
94
|
none: false
|
95
95
|
requirements:
|
96
96
|
- - ! '>='
|
@@ -98,10 +98,10 @@ dependencies:
|
|
98
98
|
version: 1.0.10
|
99
99
|
type: :development
|
100
100
|
prerelease: false
|
101
|
-
version_requirements: *
|
101
|
+
version_requirements: *227058420
|
102
102
|
- !ruby/object:Gem::Dependency
|
103
103
|
name: rake
|
104
|
-
requirement: &
|
104
|
+
requirement: &227057900 !ruby/object:Gem::Requirement
|
105
105
|
none: false
|
106
106
|
requirements:
|
107
107
|
- - ! '>='
|
@@ -109,10 +109,10 @@ dependencies:
|
|
109
109
|
version: 0.9.2
|
110
110
|
type: :development
|
111
111
|
prerelease: false
|
112
|
-
version_requirements: *
|
112
|
+
version_requirements: *227057900
|
113
113
|
- !ruby/object:Gem::Dependency
|
114
114
|
name: rspec-core
|
115
|
-
requirement: &
|
115
|
+
requirement: &227057420 !ruby/object:Gem::Requirement
|
116
116
|
none: false
|
117
117
|
requirements:
|
118
118
|
- - ~>
|
@@ -120,10 +120,10 @@ dependencies:
|
|
120
120
|
version: '2.0'
|
121
121
|
type: :development
|
122
122
|
prerelease: false
|
123
|
-
version_requirements: *
|
123
|
+
version_requirements: *227057420
|
124
124
|
- !ruby/object:Gem::Dependency
|
125
125
|
name: rspec-expectations
|
126
|
-
requirement: &
|
126
|
+
requirement: &227056840 !ruby/object:Gem::Requirement
|
127
127
|
none: false
|
128
128
|
requirements:
|
129
129
|
- - ~>
|
@@ -131,10 +131,10 @@ dependencies:
|
|
131
131
|
version: '2.0'
|
132
132
|
type: :development
|
133
133
|
prerelease: false
|
134
|
-
version_requirements: *
|
134
|
+
version_requirements: *227056840
|
135
135
|
- !ruby/object:Gem::Dependency
|
136
136
|
name: rr
|
137
|
-
requirement: &
|
137
|
+
requirement: &227056380 !ruby/object:Gem::Requirement
|
138
138
|
none: false
|
139
139
|
requirements:
|
140
140
|
- - ~>
|
@@ -142,10 +142,10 @@ dependencies:
|
|
142
142
|
version: '1.0'
|
143
143
|
type: :development
|
144
144
|
prerelease: false
|
145
|
-
version_requirements: *
|
145
|
+
version_requirements: *227056380
|
146
146
|
- !ruby/object:Gem::Dependency
|
147
147
|
name: simplecov
|
148
|
-
requirement: &
|
148
|
+
requirement: &227055880 !ruby/object:Gem::Requirement
|
149
149
|
none: false
|
150
150
|
requirements:
|
151
151
|
- - ~>
|
@@ -153,10 +153,10 @@ dependencies:
|
|
153
153
|
version: 0.5.3
|
154
154
|
type: :development
|
155
155
|
prerelease: false
|
156
|
-
version_requirements: *
|
156
|
+
version_requirements: *227055880
|
157
157
|
- !ruby/object:Gem::Dependency
|
158
158
|
name: fakeredis
|
159
|
-
requirement: &
|
159
|
+
requirement: &227055380 !ruby/object:Gem::Requirement
|
160
160
|
none: false
|
161
161
|
requirements:
|
162
162
|
- - ~>
|
@@ -164,7 +164,7 @@ dependencies:
|
|
164
164
|
version: 0.2.2
|
165
165
|
type: :development
|
166
166
|
prerelease: false
|
167
|
-
version_requirements: *
|
167
|
+
version_requirements: *227055380
|
168
168
|
description: Ruby client library for mobile handset detection
|
169
169
|
email:
|
170
170
|
- ahutalla@gmail.com
|