agent_user 1.0.3 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
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: