wurfl 1.3.1 → 1.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Examples.txt +27 -0
- data/README.rdoc +8 -0
- data/Rakefile +7 -30
- data/VERSION +1 -1
- data/lib/wurfl/command/inspector.rb +5 -7
- data/lib/wurfl/command/loader.rb +0 -13
- data/lib/wurfl/command/uamatch.rb +1 -2
- data/lib/wurfl/handset.rb +19 -34
- data/lib/wurfl/loader.rb +1 -1
- data/test/benchmark.rb +6 -4
- data/test/data/wurfl.simple.xml +17 -0
- data/test/handset_test.rb +89 -66
- data/test/loader_test.rb +58 -29
- data/test/test_helper.rb +3 -0
- data/test/user_agent_matcher_test.rb +1 -2
- data/test/utils_test.rb +1 -2
- data/wurfl.gemspec +18 -10
- metadata +25 -11
data/Examples.txt
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
First step to do anything is to merge the patch and the base wurfl
|
|
2
|
+
into a pstore database.
|
|
3
|
+
|
|
4
|
+
1 Get latest wurfl base and unzip it
|
|
5
|
+
|
|
6
|
+
wget http://jaist.dl.sourceforge.net/sourceforge/wurfl/wurfl-latest.xml.gz
|
|
7
|
+
gunzip wurfl-latest.xml.gz
|
|
8
|
+
|
|
9
|
+
2 Using the wurfltools.rb utility, merge the patch to the base wurfl
|
|
10
|
+
and output as a pstore database.
|
|
11
|
+
|
|
12
|
+
wurfltools.rb loader -f ./wurfl-latest.xml -e wurfl.patch.xml -d handsetpstore.db
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
Now we can perform various operations, such as output a csv file
|
|
16
|
+
containing japanese carrier handset uer agents and the supported flash
|
|
17
|
+
lite version.
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
wurfltools.rb inspector -d handsetpstore.db -s '{|h| puts
|
|
21
|
+
h.user_agent+","+h["flash_lite_version"] if ( h.actual_device=="true"
|
|
22
|
+
&& h.user_agent =~/^(docomo|kddi|softbank)/i) }' | sort | uniq
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
Output browser width and height
|
|
27
|
+
./bin/wurfltools.rb inspector -d handsetpstore-november.db -s '{|h| puts h["model_name"]+","+h["resolution_width"]+","+h["resolution_height"] if (h.actual_device && h.user_agent=~/^(docomo|kddi|softbank|voda)/i) }' | sort | uniq
|
data/README.rdoc
CHANGED
|
@@ -156,6 +156,14 @@ errors.
|
|
|
156
156
|
* Paul McMahon (gem installer, refactorings)
|
|
157
157
|
* Kai W. Zimmermann (uamatch)
|
|
158
158
|
|
|
159
|
+
== Contribution
|
|
160
|
+
|
|
161
|
+
All contribution is welcome. Please see the repo at http://github.com/pwim/wurfl.
|
|
162
|
+
|
|
163
|
+
== License
|
|
164
|
+
|
|
165
|
+
See LICENSE[link:files/LICENSE.html]
|
|
166
|
+
|
|
159
167
|
== Copyright
|
|
160
168
|
|
|
161
169
|
Copyright (c) 2009, mobalean (http://www.mobalean.com/)
|
data/Rakefile
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
require 'rake/rdoctask'
|
|
2
2
|
require 'rake/testtask'
|
|
3
3
|
require 'rubygems'
|
|
4
|
+
require 'shoulda/tasks'
|
|
4
5
|
|
|
5
6
|
task :default => ['test']
|
|
6
7
|
|
|
@@ -16,10 +17,13 @@ begin
|
|
|
16
17
|
s.summary = "Library and tools for manipulating the WURFL"
|
|
17
18
|
s.description = "Library and tools for manipulating the WURFL"
|
|
18
19
|
s.email = "info@mobalean.com"
|
|
19
|
-
s.homepage = "http://
|
|
20
|
-
s.description = "TODO"
|
|
20
|
+
s.homepage = "http://wurfl.rubyforge.org"
|
|
21
21
|
s.authors = ["Paul McMahon", "Zev Blut"]
|
|
22
22
|
s.rubyforge_project = 'wurfl'
|
|
23
|
+
s.add_dependency 'libxml-ruby'
|
|
24
|
+
end
|
|
25
|
+
Jeweler::RubyforgeTasks.new do |rubyforge|
|
|
26
|
+
rubyforge.doc_task = "rdoc"
|
|
23
27
|
end
|
|
24
28
|
rescue LoadError
|
|
25
29
|
puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
|
|
@@ -29,32 +33,5 @@ Rake::RDocTask.new(:rdoc) do |rdoc|
|
|
|
29
33
|
rdoc.rdoc_dir = 'rdoc'
|
|
30
34
|
rdoc.title = 'WURFL'
|
|
31
35
|
rdoc.main = "README.rdoc"
|
|
32
|
-
rdoc.rdoc_files.include("README.rdoc", "lib/**/*.rb")
|
|
36
|
+
rdoc.rdoc_files.include("README.rdoc", "LICENSE", "lib/**/*.rb")
|
|
33
37
|
end
|
|
34
|
-
|
|
35
|
-
begin
|
|
36
|
-
require 'rake/contrib/sshpublisher'
|
|
37
|
-
namespace :rubyforge do
|
|
38
|
-
|
|
39
|
-
desc "Release gem and RDoc documentation to RubyForge"
|
|
40
|
-
task :release => ["rubyforge:release:gem", "rubyforge:release:docs"]
|
|
41
|
-
|
|
42
|
-
namespace :release do
|
|
43
|
-
desc "Publish RDoc to RubyForge."
|
|
44
|
-
task :docs => [:rdoc] do
|
|
45
|
-
config = YAML.load(
|
|
46
|
-
File.read(File.expand_path('~/.rubyforge/user-config.yml'))
|
|
47
|
-
)
|
|
48
|
-
|
|
49
|
-
host = "#{config['username']}@rubyforge.org"
|
|
50
|
-
remote_dir = "/var/www/gforge-projects/wurfl/"
|
|
51
|
-
local_dir = 'rdoc'
|
|
52
|
-
|
|
53
|
-
Rake::SshDirPublisher.new(host, remote_dir, local_dir).upload
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
|
-
rescue LoadError
|
|
58
|
-
puts "Rake SshDirPublisher is unavailable or your rubyforge environment is not configured."
|
|
59
|
-
end
|
|
60
|
-
|
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
1.3.
|
|
1
|
+
1.3.5
|
|
@@ -108,13 +108,13 @@ class Wurfl::Command::Inspector < Wurfl::Command
|
|
|
108
108
|
eval("pr = proc#{procstr}")
|
|
109
109
|
|
|
110
110
|
if pr.class != Proc
|
|
111
|
-
puts "You must pass a valid ruby block!"
|
|
111
|
+
STDERR.puts "You must pass a valid ruby block!"
|
|
112
112
|
exit 1
|
|
113
113
|
end
|
|
114
114
|
|
|
115
|
-
puts "--------- Searching handsets -----------"
|
|
115
|
+
STDERR.puts "--------- Searching handsets -----------"
|
|
116
116
|
res = insp.search_handsets(pr)
|
|
117
|
-
puts "Number of results: #{res.size}"
|
|
117
|
+
STDERR.puts "Number of results: #{res.size}"
|
|
118
118
|
|
|
119
119
|
res.each { |handset| puts handset.wurfl_id }
|
|
120
120
|
exit 0
|
|
@@ -130,14 +130,12 @@ class Wurfl::Command::Inspector < Wurfl::Command
|
|
|
130
130
|
puts "Handset user agent: #{handset.user_agent}"
|
|
131
131
|
if query
|
|
132
132
|
puts "Result of handset query: #{query}"
|
|
133
|
-
|
|
134
|
-
puts "#{rez[0]} from #{rez[1]}"
|
|
133
|
+
puts "#{handset[query]} from #{handset.owner(query)}"
|
|
135
134
|
else
|
|
136
135
|
puts "Attributes of handset"
|
|
137
136
|
keys = handset.keys
|
|
138
137
|
keys.each do |key|
|
|
139
|
-
|
|
140
|
-
puts "Attr:#{key} Val:#{rez[0]} from #{rez[1]}"
|
|
138
|
+
puts "Attr:#{key} Val:#{handset[key]} from #{handset.owner(key)}"
|
|
141
139
|
end
|
|
142
140
|
end
|
|
143
141
|
exit 0
|
data/lib/wurfl/command/loader.rb
CHANGED
|
@@ -11,7 +11,6 @@ class Wurfl::Command::Loader < Wurfl::Command
|
|
|
11
11
|
puts "Usage: wurfltools.rb loader [-p -v -h -e patchfile] -f wurflfile"
|
|
12
12
|
puts " --file, -f (wurflfile): The master WURFL file to load."
|
|
13
13
|
puts " --extension, -e (patchfile): A patch file to extend the traits of the master WURLF file."
|
|
14
|
-
puts " --print, -p : Prints out handsets."
|
|
15
14
|
puts " --help, -h : Prints this message."
|
|
16
15
|
puts " --database, -d (databasename): Makes a PStore database for quick loading of data with other tools."
|
|
17
16
|
puts " --load, -l (databasename): Loads handsets from a PStore database instead of XML file."
|
|
@@ -28,7 +27,6 @@ class Wurfl::Command::Loader < Wurfl::Command
|
|
|
28
27
|
|
|
29
28
|
begin
|
|
30
29
|
options = GetoptLong.new(
|
|
31
|
-
["-p","--print", GetoptLong::NO_ARGUMENT],
|
|
32
30
|
["-h","--help", GetoptLong::NO_ARGUMENT],
|
|
33
31
|
["-f","--file", GetoptLong::REQUIRED_ARGUMENT],
|
|
34
32
|
["-e","--extension", GetoptLong::REQUIRED_ARGUMENT],
|
|
@@ -38,8 +36,6 @@ class Wurfl::Command::Loader < Wurfl::Command
|
|
|
38
36
|
|
|
39
37
|
options.each do |opt,arg|
|
|
40
38
|
case opt
|
|
41
|
-
when "-p"
|
|
42
|
-
print = true
|
|
43
39
|
when "-h"
|
|
44
40
|
usage
|
|
45
41
|
exit 1
|
|
@@ -113,14 +109,5 @@ class Wurfl::Command::Loader < Wurfl::Command
|
|
|
113
109
|
STDERR.puts err.message
|
|
114
110
|
end
|
|
115
111
|
end
|
|
116
|
-
|
|
117
|
-
if print
|
|
118
|
-
hands.each do |key,value|
|
|
119
|
-
puts "********************************************\n\n"
|
|
120
|
-
puts "#{key}\n"
|
|
121
|
-
value.each { |key,value| puts "#{key} = #{value}" }
|
|
122
|
-
end
|
|
123
|
-
end
|
|
124
|
-
|
|
125
112
|
end
|
|
126
113
|
end
|
|
@@ -72,8 +72,7 @@ class Wurfl::Command::Uamatch < Wurfl::Command
|
|
|
72
72
|
puts "User_agent found: #{handset.user_agent}"
|
|
73
73
|
if query
|
|
74
74
|
puts "Result of handset query: #{query}"
|
|
75
|
-
|
|
76
|
-
puts "#{rez[0]} from #{rez[1]}"
|
|
75
|
+
puts "#{handset[query]} from #{handset.owner(query)}"
|
|
77
76
|
end
|
|
78
77
|
end
|
|
79
78
|
exit 0
|
data/lib/wurfl/handset.rb
CHANGED
|
@@ -7,10 +7,8 @@ A class that represents a handset based on information taken from the WURFL.
|
|
|
7
7
|
=end
|
|
8
8
|
class Wurfl::Handset
|
|
9
9
|
|
|
10
|
-
extend Enumerable
|
|
11
|
-
|
|
12
10
|
attr_accessor :wurfl_id, :user_agent
|
|
13
|
-
|
|
11
|
+
attr_writer :fallback
|
|
14
12
|
|
|
15
13
|
# Constructor
|
|
16
14
|
# Parameters:
|
|
@@ -18,16 +16,20 @@ class Wurfl::Handset
|
|
|
18
16
|
# useragent: is the user agent of the handset
|
|
19
17
|
# fallback: is the fallback handset that this handset
|
|
20
18
|
# uses for missing details.
|
|
21
|
-
def initialize (wurfl_id, useragent, fallback = nil)
|
|
22
|
-
|
|
23
|
-
@capabilityhash = Hash::new
|
|
19
|
+
def initialize (wurfl_id, useragent, fallback = nil, actual_device = nil)
|
|
20
|
+
@capabilities = {}
|
|
24
21
|
@wurfl_id = wurfl_id
|
|
25
22
|
@user_agent = useragent
|
|
26
|
-
@
|
|
23
|
+
@actual_device = actual_device
|
|
24
|
+
@fallback = fallback
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def actual_device?
|
|
28
|
+
@actual_device
|
|
27
29
|
end
|
|
28
30
|
|
|
29
|
-
def fallback
|
|
30
|
-
|
|
31
|
+
def fallback
|
|
32
|
+
@fallback || NullHandset.instance
|
|
31
33
|
end
|
|
32
34
|
|
|
33
35
|
# Hash accessor
|
|
@@ -36,41 +38,24 @@ class Wurfl::Handset
|
|
|
36
38
|
# Returns:
|
|
37
39
|
# The value of the key, nil if the handset does not have the key.
|
|
38
40
|
def [] (key)
|
|
39
|
-
@
|
|
41
|
+
@capabilities.key?(key) ? @capabilities[key] : fallback[key]
|
|
40
42
|
end
|
|
41
43
|
|
|
42
|
-
# like the above accessor, but also to know who the value
|
|
43
|
-
# comes from
|
|
44
44
|
# Returns:
|
|
45
|
-
# the
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
else
|
|
50
|
-
@fallback.get_value_and_owner(key)
|
|
51
|
-
end
|
|
45
|
+
# the wurfl id of the handset from which the value of a capability is
|
|
46
|
+
# obtained
|
|
47
|
+
def owner(key)
|
|
48
|
+
@capabilities.key?(key) ? @wurfl_id : fallback.owner(key)
|
|
52
49
|
end
|
|
53
50
|
|
|
54
51
|
# Setter, A method to set a key and value of the handset.
|
|
55
52
|
def []= (key,val)
|
|
56
|
-
@
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
# A Method to iterate over all of the keys and values that the handset has.
|
|
60
|
-
# Note: this will abstract the hash iterator to handle all the lower level
|
|
61
|
-
# calls for the fallback values.
|
|
62
|
-
def each
|
|
63
|
-
self.keys.each do |key|
|
|
64
|
-
# here is the magic that gives us the key and value of the handset
|
|
65
|
-
# all the way up to the fallbacks end.
|
|
66
|
-
# Call the pass block with the key and value passed
|
|
67
|
-
yield key, self[key]
|
|
68
|
-
end
|
|
53
|
+
@capabilities[key] = val
|
|
69
54
|
end
|
|
70
55
|
|
|
71
56
|
# A method to get all of the keys that the handset has.
|
|
72
57
|
def keys
|
|
73
|
-
@
|
|
58
|
+
@capabilities.keys | fallback.keys
|
|
74
59
|
end
|
|
75
60
|
|
|
76
61
|
# A method to do a simple equality check against two handsets.
|
|
@@ -102,7 +87,7 @@ class Wurfl::Handset
|
|
|
102
87
|
end
|
|
103
88
|
|
|
104
89
|
def [](key) nil end
|
|
105
|
-
def
|
|
90
|
+
def owner(key) nil end
|
|
106
91
|
def keys; [] end
|
|
107
92
|
end
|
|
108
93
|
end
|
data/lib/wurfl/loader.rb
CHANGED
|
@@ -21,7 +21,7 @@ class Wurfl::Loader
|
|
|
21
21
|
doc = XML::Document.file(wurflfilepath)
|
|
22
22
|
doc.find("///devices/device").each do |element|
|
|
23
23
|
wurfl_id = element.attributes["id"]
|
|
24
|
-
h = @handsets[wurfl_id] ||= Wurfl::Handset.new(wurfl_id, element.attributes["user_agent"])
|
|
24
|
+
h = @handsets[wurfl_id] ||= Wurfl::Handset.new(wurfl_id, element.attributes["user_agent"], nil, element.attributes["actual_device_root"])
|
|
25
25
|
fall_back_id = element.attributes["fall_back"]
|
|
26
26
|
fallbacks[wurfl_id] = fall_back_id unless fall_back_id == "root"
|
|
27
27
|
|
data/test/benchmark.rb
CHANGED
|
@@ -2,8 +2,10 @@ $LOAD_PATH << File.join(File.dirname(__FILE__), '..', 'lib')
|
|
|
2
2
|
require 'wurfl/loader'
|
|
3
3
|
require 'benchmark'
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
if $0 == __FILE__
|
|
6
|
+
loader = Wurfl::Loader.new
|
|
7
|
+
r = Benchmark.measure do
|
|
8
|
+
loader.load_wurfl(File.join(File.dirname(__FILE__), "data", "wurfl.large.xml"))
|
|
9
|
+
end
|
|
10
|
+
puts r
|
|
8
11
|
end
|
|
9
|
-
puts r
|
data/test/data/wurfl.simple.xml
CHANGED
|
@@ -34,5 +34,22 @@
|
|
|
34
34
|
<capability name="max_image_height" value="300"/>
|
|
35
35
|
</group>
|
|
36
36
|
</device>
|
|
37
|
+
<device id="apple_iphone_ver1" user_agent="Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A538a Safari/419.3" fall_back="apple_generic" actual_device_root="true">
|
|
38
|
+
<group id="product_info">
|
|
39
|
+
<capability name="mobile_browser" value="Safari"/>
|
|
40
|
+
<capability name="pointing_method" value="touchscreen"/>
|
|
41
|
+
<capability name="model_name" value="iPhone"/>
|
|
42
|
+
<capability name="device_os_version" value="1.0"/>
|
|
43
|
+
</group>
|
|
44
|
+
<group id="display">
|
|
45
|
+
<capability name="physical_screen_height" value="74"/>
|
|
46
|
+
<capability name="dual_orientation" value="true"/>
|
|
47
|
+
<capability name="physical_screen_width" value="49"/>
|
|
48
|
+
<capability name="max_image_width" value="320"/>
|
|
49
|
+
<capability name="resolution_height" value="480"/>
|
|
50
|
+
<capability name="resolution_width" value="320"/>
|
|
51
|
+
<capability name="max_image_height" value="360"/>
|
|
52
|
+
</group>
|
|
53
|
+
</device>
|
|
37
54
|
</devices>
|
|
38
55
|
</wurfl>
|
data/test/handset_test.rb
CHANGED
|
@@ -1,87 +1,110 @@
|
|
|
1
|
-
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'test_helper')
|
|
2
2
|
require 'wurfl/handset'
|
|
3
|
-
require 'test/unit'
|
|
4
3
|
|
|
5
|
-
class
|
|
4
|
+
class HandsetTest < Test::Unit::TestCase
|
|
6
5
|
def setup
|
|
7
|
-
@
|
|
8
|
-
@
|
|
9
|
-
|
|
10
|
-
@f2 = Wurfl::Handset.new("f2", "f2_ua", nil)
|
|
11
|
-
@h2 = Wurfl::Handset.new("h2","h2_ua", @f2)
|
|
6
|
+
@fallback = Wurfl::Handset.new("fallback_id", "f", nil)
|
|
7
|
+
@handset = Wurfl::Handset.new("handset_id", "h", @fallback)
|
|
12
8
|
end
|
|
13
9
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
assert_nil @h["k"]
|
|
20
|
-
end
|
|
10
|
+
should("not be equal to nil") { assert_not_equal @handset, nil }
|
|
11
|
+
should("not be equal to 1") { assert_not_equal @handset, 1 }
|
|
12
|
+
should("not be equal to fallback") { assert_not_equal @handset, @fallback }
|
|
13
|
+
should("equal self") { assert_equal @handset, @handset }
|
|
14
|
+
should("not have differences") { assert @handset.differences(@fallback).empty? }
|
|
21
15
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
assert_equal ["v", "f"], @h.get_value_and_owner("k")
|
|
26
|
-
@h["k"] = nil
|
|
27
|
-
assert_equal [nil, "h"], @h.get_value_and_owner("k")
|
|
16
|
+
context "key not set" do
|
|
17
|
+
should("not have value") { assert_nil @handset["k"] }
|
|
18
|
+
should("not have owner") { assert_equal nil, @handset.owner("k") }
|
|
28
19
|
end
|
|
29
20
|
|
|
30
|
-
|
|
31
|
-
@
|
|
32
|
-
@f["k2"] = "v2"
|
|
33
|
-
assert_equal(["k1", "k2"], @h.keys)
|
|
34
|
-
end
|
|
21
|
+
context "fallback key set" do
|
|
22
|
+
setup { @fallback["k"] = "v" }
|
|
35
23
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
@f["k2"] = "v2"
|
|
39
|
-
a = []
|
|
40
|
-
@h.each {|k,v| a << [k,v]}
|
|
41
|
-
assert_equal [["k1","v1"], ["k2","v2"]], a
|
|
42
|
-
end
|
|
24
|
+
should("fetch value from fallback") { assert_equal "v", @handset["k"] }
|
|
25
|
+
should("have fallback as owner") { assert_equal "fallback_id", @handset.owner("k") }
|
|
43
26
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
assert @h != 1
|
|
47
|
-
assert @h != @f
|
|
48
|
-
assert @h == @h
|
|
49
|
-
h2 = Wurfl::Handset.new("h","h", @f)
|
|
50
|
-
assert @h == h2
|
|
51
|
-
h2["k"] = "v"
|
|
52
|
-
assert @h != h2
|
|
53
|
-
@f["k"] = "v"
|
|
54
|
-
assert @h == h2
|
|
55
|
-
end
|
|
27
|
+
context "and handset overwrites key" do
|
|
28
|
+
setup { @handset["k"] = nil }
|
|
56
29
|
|
|
57
|
-
|
|
58
|
-
|
|
30
|
+
should("fetch value from handset") { assert_nil @handset["k"] }
|
|
31
|
+
should("have handset as owner") { assert_equal "handset_id", @handset.owner("k") }
|
|
32
|
+
end
|
|
59
33
|
end
|
|
60
34
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
35
|
+
context "fallback and handset set different keys" do
|
|
36
|
+
setup do
|
|
37
|
+
@handset["k1"] = "v1"
|
|
38
|
+
@fallback["k2"] = "v2"
|
|
39
|
+
end
|
|
64
40
|
|
|
65
|
-
|
|
66
|
-
@h["k"] = "v"
|
|
67
|
-
assert_equal ["k"], @h.differences(@h2)
|
|
41
|
+
should("have keys from handset and fallback") { assert_equal(["k1", "k2"], @handset.keys) }
|
|
68
42
|
end
|
|
69
43
|
|
|
70
|
-
|
|
71
|
-
@
|
|
72
|
-
assert_equal ["k"], @h.differences(@h2)
|
|
73
|
-
end
|
|
44
|
+
context "another handset with same wurfl_id and fallback" do
|
|
45
|
+
setup { @another_handset = Wurfl::Handset.new("handset_id","h", @fallback) }
|
|
74
46
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
47
|
+
should("equal handset") { assert_equal @handset, @another_handset}
|
|
48
|
+
|
|
49
|
+
context "and the other handset sets a key" do
|
|
50
|
+
setup { @another_handset["k"] = "v" }
|
|
51
|
+
|
|
52
|
+
should("not equal handset") { assert_not_equal @handset, @another_handset }
|
|
53
|
+
|
|
54
|
+
context "and the fallback sets identical key" do
|
|
55
|
+
setup { @fallback["k"] = "v" }
|
|
80
56
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
assert_equal ["j"], @h.differences(@h2)
|
|
57
|
+
should("equal handset") { assert_equal @handset, @another_handset }
|
|
58
|
+
end
|
|
59
|
+
end
|
|
85
60
|
end
|
|
61
|
+
|
|
62
|
+
context "another handset with different wurfl_id and fallback" do
|
|
63
|
+
setup do
|
|
64
|
+
@another_fallback = Wurfl::Handset.new("f2", "f2_ua", nil)
|
|
65
|
+
@another_handset = Wurfl::Handset.new("h2","h2_ua", @another_fallback)
|
|
66
|
+
end
|
|
86
67
|
|
|
68
|
+
context "and no keys set" do
|
|
69
|
+
should('have no differences') {assert @handset.differences(@another_fallback).empty? }
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
context "and the other handset has a key set" do
|
|
73
|
+
setup { @another_handset["k"] = "v" }
|
|
74
|
+
|
|
75
|
+
should('have the key as a difference') do
|
|
76
|
+
assert_equal ["k"], @handset.differences(@another_handset)
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
context "and handset has a key set" do
|
|
81
|
+
setup { @handset["k"] = "v" }
|
|
82
|
+
|
|
83
|
+
should('have the key as a difference') do
|
|
84
|
+
assert_equal ["k"], @handset.differences(@another_handset)
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
context "and both handsets have different values for same key" do
|
|
89
|
+
setup do
|
|
90
|
+
@handset["k"] = "v"
|
|
91
|
+
@another_handset["k"] = "v2"
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
should 'have the key as a difference' do
|
|
95
|
+
assert_equal ["k"], @handset.differences(@another_handset)
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
context "and fallbacks have different values for same key" do
|
|
100
|
+
setup do
|
|
101
|
+
@fallback["j"] = "1"
|
|
102
|
+
@another_fallback["j"] = "2"
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
should 'have the key as a difference' do
|
|
106
|
+
assert_equal ["j"], @handset.differences(@another_handset)
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
87
110
|
end
|
data/test/loader_test.rb
CHANGED
|
@@ -1,42 +1,71 @@
|
|
|
1
|
-
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'test_helper')
|
|
2
2
|
require 'wurfl/loader'
|
|
3
|
-
require 'test/unit'
|
|
4
3
|
|
|
5
|
-
class
|
|
4
|
+
class LoaderTest < Test::Unit::TestCase
|
|
5
|
+
|
|
6
|
+
class << self
|
|
7
|
+
def should_have_correct_values(h)
|
|
8
|
+
h.each do |wurfl_id, values|
|
|
9
|
+
values.each do |key, value|
|
|
10
|
+
should "have #{key} set to #{value} for #{wurfl_id}" do
|
|
11
|
+
assert_equal value.to_s, @handsets[wurfl_id.to_s][key.to_s]
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def should_have_correct_user_agents(h)
|
|
18
|
+
h.each do |wurfl_id, user_agent|
|
|
19
|
+
should "have user agent '#{user_agent}' for #{wurfl_id}" do
|
|
20
|
+
assert_equal user_agent, @handsets[wurfl_id.to_s].user_agent
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
6
25
|
|
|
7
26
|
def setup
|
|
8
27
|
@loader = Wurfl::Loader.new
|
|
9
28
|
end
|
|
10
29
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
30
|
+
context "loaded base wurfl" do
|
|
31
|
+
setup do
|
|
32
|
+
@handsets = @loader.load_wurfl(File.join(File.dirname(__FILE__), "data", "wurfl.simple.xml"))
|
|
33
|
+
end
|
|
34
|
+
should_have_correct_values(
|
|
35
|
+
:apple_generic => { :columns => 20, :max_image_height => 300, :physical_screen_height => 27 },
|
|
36
|
+
:generic_xhtml => { :columns => 11, :max_image_height => 92, :physical_screen_height => 27 },
|
|
37
|
+
:generic => { :columns => 11, :max_image_height => 35, :physical_screen_height => 27 }
|
|
38
|
+
)
|
|
39
|
+
should_have_correct_user_agents(
|
|
40
|
+
:generic => "",
|
|
41
|
+
:apple_generic => "Mozilla/5.0 (iPhone;",
|
|
42
|
+
:generic_xhtml => "Mozz"
|
|
43
|
+
)
|
|
20
44
|
|
|
21
|
-
|
|
45
|
+
context 'and patch' do
|
|
46
|
+
setup do
|
|
47
|
+
@handsets = @loader.load_wurfl(File.join(File.dirname(__FILE__), "data", "wurfl.generic.patch.xml"))
|
|
48
|
+
end
|
|
49
|
+
should_have_correct_values(:generic => { :columns => 200, :rows => 6 })
|
|
50
|
+
end
|
|
51
|
+
should("not be actual device for generic") { assert !@handsets["generic"].actual_device? }
|
|
52
|
+
should("be actual device for apple_iphone_ver1") { assert @handsets["apple_iphone_ver1"].actual_device? }
|
|
22
53
|
end
|
|
23
54
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
assert_equal("Mozz", handsets["generic_xhtml"].user_agent)
|
|
39
|
-
assert_equal("", handsets["generic"].user_agent)
|
|
55
|
+
context "loaded wurfl with handsets in reverse order" do
|
|
56
|
+
setup do
|
|
57
|
+
@handsets = @loader.load_wurfl(File.join(File.dirname(__FILE__), "data", "wurfl.reverse.xml"))
|
|
58
|
+
end
|
|
59
|
+
should_have_correct_values(
|
|
60
|
+
:apple_generic => { :columns => 20, :max_image_height => 300, :physical_screen_height => 27 },
|
|
61
|
+
:generic_xhtml => { :columns => 11, :max_image_height => 92, :physical_screen_height => 27 },
|
|
62
|
+
:generic => { :columns => 11, :max_image_height => 35, :physical_screen_height => 27 }
|
|
63
|
+
)
|
|
64
|
+
should_have_correct_user_agents(
|
|
65
|
+
:generic => "",
|
|
66
|
+
:apple_generic => "Mozilla/5.0 (iPhone;",
|
|
67
|
+
:generic_xhtml => "Mozz"
|
|
68
|
+
)
|
|
40
69
|
end
|
|
41
70
|
|
|
42
71
|
end
|
data/test/test_helper.rb
ADDED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'test_helper')
|
|
2
2
|
require 'wurfl/user_agent_matcher'
|
|
3
3
|
require 'wurfl/loader'
|
|
4
|
-
require 'test/unit'
|
|
5
4
|
|
|
6
5
|
class UserAgentMatcherTest < Test::Unit::TestCase
|
|
7
6
|
def setup
|
data/test/utils_test.rb
CHANGED
data/wurfl.gemspec
CHANGED
|
@@ -1,14 +1,17 @@
|
|
|
1
|
+
# Generated by jeweler
|
|
2
|
+
# DO NOT EDIT THIS FILE
|
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
|
|
1
4
|
# -*- encoding: utf-8 -*-
|
|
2
5
|
|
|
3
6
|
Gem::Specification.new do |s|
|
|
4
7
|
s.name = %q{wurfl}
|
|
5
|
-
s.version = "1.3.
|
|
8
|
+
s.version = "1.3.5"
|
|
6
9
|
|
|
7
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
|
8
11
|
s.authors = ["Paul McMahon", "Zev Blut"]
|
|
9
|
-
s.date = %q{
|
|
12
|
+
s.date = %q{2010-03-18}
|
|
10
13
|
s.default_executable = %q{wurfltools.rb}
|
|
11
|
-
s.description = %q{
|
|
14
|
+
s.description = %q{Library and tools for manipulating the WURFL}
|
|
12
15
|
s.email = %q{info@mobalean.com}
|
|
13
16
|
s.executables = ["wurfltools.rb"]
|
|
14
17
|
s.extra_rdoc_files = [
|
|
@@ -17,6 +20,7 @@ Gem::Specification.new do |s|
|
|
|
17
20
|
]
|
|
18
21
|
s.files = [
|
|
19
22
|
".gitignore",
|
|
23
|
+
"Examples.txt",
|
|
20
24
|
"LICENSE",
|
|
21
25
|
"README.rdoc",
|
|
22
26
|
"Rakefile",
|
|
@@ -41,32 +45,36 @@ Gem::Specification.new do |s|
|
|
|
41
45
|
"test/data/wurfl.simple.xml",
|
|
42
46
|
"test/handset_test.rb",
|
|
43
47
|
"test/loader_test.rb",
|
|
48
|
+
"test/test_helper.rb",
|
|
44
49
|
"test/user_agent_matcher_test.rb",
|
|
45
50
|
"test/utils_test.rb",
|
|
46
51
|
"wurfl.gemspec"
|
|
47
52
|
]
|
|
48
|
-
s.
|
|
49
|
-
s.homepage = %q{http://github.com/pwim/wurfl}
|
|
53
|
+
s.homepage = %q{http://wurfl.rubyforge.org}
|
|
50
54
|
s.rdoc_options = ["--charset=UTF-8"]
|
|
51
55
|
s.require_paths = ["lib"]
|
|
52
56
|
s.rubyforge_project = %q{wurfl}
|
|
53
|
-
s.rubygems_version = %q{1.3.
|
|
57
|
+
s.rubygems_version = %q{1.3.5}
|
|
54
58
|
s.summary = %q{Library and tools for manipulating the WURFL}
|
|
55
59
|
s.test_files = [
|
|
56
|
-
"test/
|
|
60
|
+
"test/benchmark.rb",
|
|
57
61
|
"test/handset_test.rb",
|
|
58
|
-
"test/
|
|
62
|
+
"test/loader_test.rb",
|
|
63
|
+
"test/test_helper.rb",
|
|
59
64
|
"test/user_agent_matcher_test.rb",
|
|
60
|
-
"test/
|
|
65
|
+
"test/utils_test.rb"
|
|
61
66
|
]
|
|
62
67
|
|
|
63
68
|
if s.respond_to? :specification_version then
|
|
64
69
|
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
|
65
|
-
s.specification_version =
|
|
70
|
+
s.specification_version = 3
|
|
66
71
|
|
|
67
72
|
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
|
73
|
+
s.add_runtime_dependency(%q<libxml-ruby>, [">= 0"])
|
|
68
74
|
else
|
|
75
|
+
s.add_dependency(%q<libxml-ruby>, [">= 0"])
|
|
69
76
|
end
|
|
70
77
|
else
|
|
78
|
+
s.add_dependency(%q<libxml-ruby>, [">= 0"])
|
|
71
79
|
end
|
|
72
80
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: wurfl
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.3.
|
|
4
|
+
version: 1.3.5
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Paul McMahon
|
|
@@ -10,11 +10,20 @@ autorequire:
|
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
12
|
|
|
13
|
-
date:
|
|
13
|
+
date: 2010-03-18 00:00:00 +09:00
|
|
14
14
|
default_executable: wurfltools.rb
|
|
15
|
-
dependencies:
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
dependencies:
|
|
16
|
+
- !ruby/object:Gem::Dependency
|
|
17
|
+
name: libxml-ruby
|
|
18
|
+
type: :runtime
|
|
19
|
+
version_requirement:
|
|
20
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
21
|
+
requirements:
|
|
22
|
+
- - ">="
|
|
23
|
+
- !ruby/object:Gem::Version
|
|
24
|
+
version: "0"
|
|
25
|
+
version:
|
|
26
|
+
description: Library and tools for manipulating the WURFL
|
|
18
27
|
email: info@mobalean.com
|
|
19
28
|
executables:
|
|
20
29
|
- wurfltools.rb
|
|
@@ -25,6 +34,7 @@ extra_rdoc_files:
|
|
|
25
34
|
- README.rdoc
|
|
26
35
|
files:
|
|
27
36
|
- .gitignore
|
|
37
|
+
- Examples.txt
|
|
28
38
|
- LICENSE
|
|
29
39
|
- README.rdoc
|
|
30
40
|
- Rakefile
|
|
@@ -49,11 +59,14 @@ files:
|
|
|
49
59
|
- test/data/wurfl.simple.xml
|
|
50
60
|
- test/handset_test.rb
|
|
51
61
|
- test/loader_test.rb
|
|
62
|
+
- test/test_helper.rb
|
|
52
63
|
- test/user_agent_matcher_test.rb
|
|
53
64
|
- test/utils_test.rb
|
|
54
65
|
- wurfl.gemspec
|
|
55
66
|
has_rdoc: true
|
|
56
|
-
homepage: http://
|
|
67
|
+
homepage: http://wurfl.rubyforge.org
|
|
68
|
+
licenses: []
|
|
69
|
+
|
|
57
70
|
post_install_message:
|
|
58
71
|
rdoc_options:
|
|
59
72
|
- --charset=UTF-8
|
|
@@ -74,13 +87,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
74
87
|
requirements: []
|
|
75
88
|
|
|
76
89
|
rubyforge_project: wurfl
|
|
77
|
-
rubygems_version: 1.3.
|
|
90
|
+
rubygems_version: 1.3.5
|
|
78
91
|
signing_key:
|
|
79
|
-
specification_version:
|
|
92
|
+
specification_version: 3
|
|
80
93
|
summary: Library and tools for manipulating the WURFL
|
|
81
94
|
test_files:
|
|
82
|
-
- test/
|
|
95
|
+
- test/benchmark.rb
|
|
83
96
|
- test/handset_test.rb
|
|
84
|
-
- test/
|
|
97
|
+
- test/loader_test.rb
|
|
98
|
+
- test/test_helper.rb
|
|
85
99
|
- test/user_agent_matcher_test.rb
|
|
86
|
-
- test/
|
|
100
|
+
- test/utils_test.rb
|