agent_user 1.0.1 → 1.0.3
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/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
|