agent_user 1.0.1 → 1.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/agent_user.gemspec +1 -1
- data/lib/agent_user.rb +99 -99
- metadata +1 -1
data/agent_user.gemspec
CHANGED
data/lib/agent_user.rb
CHANGED
@@ -1,115 +1,115 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
all_names_and_versions_arr = str.scan %r`((?:[a-zA-Z]+\s?)+)[/ ]([0-9._]+)`
|
13
|
-
|
14
|
-
self.get_operating_system_data(str)
|
15
|
-
self.get_browser_data(all_names_and_versions_arr)
|
16
|
-
self.get_mobile_data(all_names_and_versions_arr)
|
17
|
-
|
18
|
-
return true
|
19
|
-
end
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
# Parse out operating system name and version
|
24
|
-
def get_browser_data(all_names_and_versions_arr)
|
25
|
-
# Filter our browser name and version based on user agent browser names
|
26
|
-
names_and_versions_without_os_info = all_names_and_versions_arr.reject {|e| e == @os_name_and_version.last}
|
27
|
-
browser_name_and_version = names_and_versions_without_os_info.select do |e|
|
28
|
-
e.to_s.include?('Safari') ||
|
29
|
-
e.to_s.include?('Mobile Safari') ||
|
30
|
-
e.to_s.include?('Firefox') ||
|
31
|
-
e.to_s.include?('MSIE') ||
|
32
|
-
e.to_s.include?('IEMobile') ||
|
33
|
-
e.to_s.include?('Opera') ||
|
34
|
-
e.to_s.include?('Internet Explorer') ||
|
35
|
-
e.to_s.include?('Chrome')
|
36
|
-
end.first
|
37
|
-
|
38
|
-
@browser_name, @browser_version = browser_name_and_version
|
39
|
-
|
40
|
-
|
41
|
-
# The version number for Safari is located in another place in the user agent
|
42
|
-
# Below will solve that by finding that version number
|
43
|
-
version_arr = names_and_versions_without_os_info.select {|e| e[0] == "Version"}.first
|
44
|
-
if @browser_name == "Safari" && version_arr
|
45
|
-
@browser_version = version_arr[1]
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
# Parse out operating system name and version
|
50
|
-
def get_operating_system_data (str)
|
51
|
-
@os_name_and_version = str.scan %r`((?:\w+\s?)+)\s([0-9._]+)`
|
52
|
-
@operating_system_name, @operating_system_version = @os_name_and_version.last
|
53
|
-
end
|
54
|
-
|
55
|
-
# Parse out mobile device name and version
|
56
|
-
def get_mobile_data(all_names_and_versions_arr)
|
57
|
-
# Mobile device name and version
|
58
|
-
mobile_device_name_and_version = all_names_and_versions_arr.select do |e|
|
59
|
-
e.to_s.include?('Android') || # Android
|
60
|
-
e.to_s.include?('Blackberry') || # Blackberry
|
61
|
-
e.to_s.include?('iPhone OS') || # iPhone
|
62
|
-
e.to_s.include?('CPU OS') || # iPad
|
63
|
-
e.to_s.include?('Windows Phone OS') # Windows Phone
|
64
|
-
end.first
|
65
|
-
|
66
|
-
@mobile_device_name, @mobile_device_version = mobile_device_name_and_version
|
67
|
-
end
|
68
|
-
|
3
|
+
class AgentUser
|
4
|
+
|
5
|
+
def self.parse(str)
|
6
|
+
self.new(str)
|
7
|
+
end
|
8
|
+
|
9
|
+
def initialize (str)
|
10
|
+
# Every device/browser/os name with version
|
11
|
+
@name_version_pairs = str.scan %r`((?:[a-zA-Z]+\s?)+)[/ ]([xi0-9._]+)`
|
69
12
|
|
13
|
+
self.get_operating_system_data(@name_version_pairs)
|
14
|
+
self.get_browser_data(@name_version_pairs)
|
15
|
+
self.get_mobile_data(@name_version_pairs)
|
70
16
|
|
71
|
-
|
72
|
-
|
73
|
-
|
17
|
+
return true
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
|
22
|
+
# Parse out operating system name and version
|
23
|
+
def get_browser_data(arr)
|
24
|
+
# Filter our browser name and version based on user agent browser names
|
25
|
+
browser_names = %w|Mobile\ Safari Safari Firefox MSIE IEMobile bot Bot spider Spider Opera Internet\ Explorer Chrome|
|
26
|
+
browser_name_and_version = arr.find do |name, version|
|
27
|
+
browser_names.any? {|browser_name| name.include? browser_name}
|
74
28
|
end
|
75
29
|
|
30
|
+
@browser_name, @browser_version = browser_name_and_version
|
76
31
|
|
77
32
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
@mobile_device_name
|
33
|
+
# The version number for Safari is located in another place in the user agent
|
34
|
+
# Below will solve that by finding that version number
|
35
|
+
version_arr = arr.select {|name,version| name == "Version"}.first
|
36
|
+
if @browser_name == "Safari" && version_arr
|
37
|
+
@browser_version = version_arr[1]
|
84
38
|
end
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
return 'iOS' if ['CPU OS','CPU iPhone OS'].include? @operating_system_name
|
94
|
-
|
95
|
-
@operating_system_name || 'Other'
|
96
|
-
end
|
97
|
-
|
98
|
-
def operating_system_version
|
99
|
-
# Replace _ in some version numbers to .
|
100
|
-
@operating_system_version.gsub(?_,?.) if @operating_system_version
|
39
|
+
end
|
40
|
+
|
41
|
+
# Parse out operating system name and version
|
42
|
+
def get_operating_system_data (arr)
|
43
|
+
# NOTE: Make sure Android is before Linux in browser_names
|
44
|
+
operating_system_names = %w|Windows Android Linux CPU\ iPhone\ OS CPU\ OS bot Bot spider Spider Mac\ OS|
|
45
|
+
os_name_and_version = arr.find do |name, version|
|
46
|
+
operating_system_names.any? {|operating_system_name| name.include? operating_system_name}
|
101
47
|
end
|
102
48
|
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
49
|
+
@operating_system_name, @operating_system_version = os_name_and_version
|
50
|
+
end
|
51
|
+
|
52
|
+
# Parse out mobile device name and version
|
53
|
+
def get_mobile_data(arr)
|
54
|
+
# Mobile device name and version
|
55
|
+
mobile_device_names = %w|Android Blackberry iPhone\ OS Zune CPU OS Windows\ Phone\ OS|
|
56
|
+
mobile_device_name_and_version = arr.find do |name, version|
|
57
|
+
mobile_device_names.any? {|mobile_device_name| name.include? mobile_device_name}
|
107
58
|
end
|
108
59
|
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
60
|
+
@mobile_device_name, @mobile_device_version = mobile_device_name_and_version
|
61
|
+
end
|
62
|
+
|
63
|
+
|
64
|
+
|
65
|
+
def mobile?
|
66
|
+
# Force true or false if the based on the device name
|
67
|
+
!!@mobile_device_name
|
68
|
+
end
|
69
|
+
|
70
|
+
|
71
|
+
def bot?
|
72
|
+
!!(self.operating_system_name =~ /bot/i)
|
73
|
+
end
|
74
|
+
|
75
|
+
|
76
|
+
|
77
|
+
def mobile_device_name
|
78
|
+
# Change name from user agent to more readable iOS device
|
79
|
+
return 'iPad' if @mobile_device_name == 'CPU OS'
|
80
|
+
return 'iPhone' if @mobile_device_name == 'CPU iPhone OS'
|
81
|
+
|
82
|
+
@mobile_device_name
|
83
|
+
end
|
84
|
+
|
85
|
+
def mobile_device_version
|
86
|
+
# Replace underscores in some version numbers to periods
|
87
|
+
@mobile_device_version = @mobile_device_version.gsub(?_,?.) if @mobile_device_version
|
88
|
+
end
|
89
|
+
|
90
|
+
def operating_system_name
|
91
|
+
# Change name from user agent to iOS if from an iPad or iPhone
|
92
|
+
return 'iOS' if ['CPU OS','CPU iPhone OS'].include? @operating_system_name
|
93
|
+
return 'Bot' if !!(@operating_system_name =~ /bot/i)
|
94
|
+
return 'Spider' if !!(@operating_system_name =~ /spider/i)
|
95
|
+
|
96
|
+
@operating_system_name || 'Other'
|
97
|
+
end
|
98
|
+
|
99
|
+
def operating_system_version
|
100
|
+
# Replace underscores in some version numbers to periods
|
101
|
+
@operating_system_version = @operating_system_version.gsub(?_,?.) if @operating_system_version
|
102
|
+
end
|
103
|
+
|
104
|
+
def browser_name
|
105
|
+
return 'Internet Explorer' if @browser_name == 'MSIE'
|
113
106
|
|
107
|
+
@browser_name || 'Other'
|
108
|
+
end
|
109
|
+
|
110
|
+
def browser_version
|
111
|
+
# Replace underscores in some version numbers to periods
|
112
|
+
@browser_version = @browser_version.gsub(?_,?.) if @browser_version
|
114
113
|
end
|
114
|
+
|
115
115
|
end
|