agent_user 1.0.3 → 1.1.0

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.
Files changed (3) hide show
  1. data/agent_user.gemspec +1 -1
  2. data/lib/agent_user.rb +123 -73
  3. metadata +2 -2
data/agent_user.gemspec CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |gem|
4
4
  gem.name = "agent_user"
5
- gem.version = "1.0.3"
5
+ gem.version = "1.1.0"
6
6
  gem.authors = ["Marc Lipovsky"]
7
7
  gem.email = ["marclipovsky@gmail.com"]
8
8
  gem.summary = "A better user agent parser."
data/lib/agent_user.rb CHANGED
@@ -1,115 +1,165 @@
1
1
  # encoding: UTF-8
2
2
 
3
3
  class AgentUser
4
+ attr_reader :browser_name, :browser_version
5
+ attr_reader :operating_system_name, :operating_system_version
6
+ attr_reader :mobile_device_name, :mobile_device_version
7
+ attr_reader :bot_name, :bot_version
4
8
 
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._]+)`
9
+ def initialize (str = "")
12
10
 
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)
11
+ # Device/Browser/OS name version pairs
12
+ name_version_pairs = str.scan %r`((?:[-.a-zA-Z]+\s?)+)[/. ]((?:(?:DBN)|[xi0-9._-])+)`
13
+
14
+ # Strip blacklisted names from name_version_pairs
15
+ blacklist =
16
+ %w:.NET Mozilla Trident RTC InfoPath AppleWebKit chromeframe FlipboardProxy
17
+ Gecko Media\ Center\ PC AskTbORJ Windows-Media-Player MSOffice:
18
+ name_version_pairs = name_version_pairs.reject do |name, version|
19
+ blacklist.any? {|n| name =~ /#{n}/i}
20
+ end
21
+
22
+ @operating_system_name, @operating_system_version = self.get_operating_system_data(name_version_pairs)
23
+ @browser_name, @browser_version = self.get_browser_data(name_version_pairs)
24
+ @mobile_device_name, @mobile_device_version = self.get_mobile_data(name_version_pairs)
25
+ @bot_name, @bot_version = self.get_bot_data(name_version_pairs)
16
26
 
17
27
  return true
18
28
  end
19
29
 
20
30
 
31
+ def to_s
32
+ user_agent_data = []
33
+ user_agent_data << "OS: #{self.operating_system_name} #{self.operating_system_version}" if self.operating_system_name
34
+ user_agent_data << "Browser: #{self.browser_name} #{self.browser_version}" if self.browser_name
35
+ user_agent_data << "Mobile: #{self.mobile_device_name} #{self.mobile_device_version}" if self.mobile_device_name
36
+ user_agent_data << "Bot: #{self.bot_name} #{self.bot_version}" if self.bot_name
37
+ puts user_agent_data.join(", ")
38
+ end
39
+
40
+
21
41
 
22
42
  # Parse out operating system name and version
23
- def get_browser_data(arr)
43
+ def get_browser_data(name_version_pairs)
44
+
24
45
  # 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}
46
+ b_names = %w:Safari Firefox MSIE IEMobile Opera Internet\ Explorer Chrome:
47
+ b_name, b_version = name_version_pairs.find do |name, version|
48
+ b_names.any? {|b_name| name =~ /#{b_name}/}
28
49
  end
29
50
 
30
- @browser_name, @browser_version = browser_name_and_version
51
+ # Change MSIE to Internet Explorer
52
+ b_name = 'Internet Explorer' if b_name == 'MSIE'
31
53
 
54
+ # Change underscores to periods in b_version
55
+ b_version = b_version.gsub(?_,?.) if b_version
32
56
 
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]
57
+ # The version number for Safari or Mobile Safari is located in another
58
+ # place in the user agent. This will solve that by finding that version number
59
+ version_arr = name_version_pairs.find {|name,version| name == "Version"}
60
+ if b_name =~ /Safari/ && version_arr
61
+ b_version = version_arr[1]
38
62
  end
63
+
64
+
65
+
66
+ return b_name, b_version
39
67
  end
40
68
 
41
69
  # 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}
70
+ def get_operating_system_data (name_version_pairs)
71
+
72
+ # NOTE: Reverse order of name_version_pairs to that Android and Ubuntu are
73
+ # found before Linux is if they exist in the name_version_pairs array.
74
+ os_names = %w:Windows Android Ubuntu Linux CPU\ iPhone\ OS CPU\ OS Mac\ OS:
75
+ os_name, os_version = name_version_pairs.reverse.find do |name, version|
76
+ os_names.any? {|os_name| name =~ /#{os_name}/}
47
77
  end
48
78
 
49
- @operating_system_name, @operating_system_version = os_name_and_version
79
+ # Change underscores to periods in os_version
80
+ os_version = os_version.gsub(?_,?.) if os_version
81
+
82
+ # Change name from user agent to iOS if from an iPad or iPhone
83
+ os_name = 'iOS' if ['CPU OS','CPU iPhone OS'].include?(os_name)
84
+ os_name = 'Windows' if os_name == 'Windows NT'
85
+
86
+ # Handle Windows version numbers/names
87
+ if os_name == 'Windows'
88
+ os_version = case os_version
89
+ when '6.2'
90
+ '8'
91
+ when '6.1'
92
+ '7'
93
+ when '6.0'
94
+ 'Vista'
95
+ when '5.2'
96
+ 'XP x64'
97
+ when '5.1'
98
+ 'XP'
99
+ when '5.0'
100
+ '2000'
101
+ when '4.1'
102
+ '98'
103
+ when '4.9'
104
+ 'ME'
105
+ when '4.0'
106
+ '95'
107
+ end
108
+ end
109
+
110
+
111
+
112
+ return os_name, os_version
50
113
  end
51
114
 
52
115
  # Parse out mobile device name and version
53
- def get_mobile_data(arr)
116
+ def get_mobile_data(name_version_pairs)
117
+
54
118
  # 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}
119
+ m_names = %w:Android Tablet Blackberry iPhone\ OS Zune CPU\ OS Windows\ Phone\ OS:
120
+ m_name, m_version = name_version_pairs.find do |name, version|
121
+ m_names.any? {|m_name| name =~ /#{m_name}/}
58
122
  end
59
123
 
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)
124
+ # Change underscores to periods in m_version
125
+ m_version = m_version.gsub(?_,?.) if m_version
126
+
127
+ m_name = 'iPad' if m_name == 'CPU OS'
128
+ m_name = 'iPhone' if m_name == 'CPU iPhone OS'
129
+
130
+
131
+
132
+ return m_name, m_version
73
133
  end
74
134
 
75
135
 
76
136
 
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'
137
+ # Parse out bot name and version
138
+ def get_bot_data(name_version_pairs)
139
+
140
+ # Bot name and version
141
+ bot_names = %w:bot google bing yahoo:
142
+ bot_name, bot_version = name_version_pairs.find do |name, version|
143
+ bot_names.any? {|bot_name| name =~ /#{bot_name}/i}
144
+ end
145
+
146
+ # Change underscores to periods in m_version
147
+ bot_version = bot_version.gsub(?_,?.) if bot_version
148
+
81
149
 
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
150
 
96
- @operating_system_name || 'Other'
151
+ return bot_name, bot_version
97
152
  end
98
153
 
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
154
 
104
- def browser_name
105
- return 'Internet Explorer' if @browser_name == 'MSIE'
106
-
107
- @browser_name || 'Other'
108
- end
109
155
 
110
- def browser_version
111
- # Replace underscores in some version numbers to periods
112
- @browser_version = @browser_version.gsub(?_,?.) if @browser_version
156
+ # Check if AgentUser detects a mobile device
157
+ def mobile?
158
+ !!self.mobile_device_name
113
159
  end
114
160
 
161
+ # Check if AgentUser detects a bot
162
+ def bot?
163
+ !!self.bot_name
164
+ end
115
165
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: agent_user
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-04 00:00:00.000000000 Z
12
+ date: 2012-10-05 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: .
15
15
  email: