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.
Files changed (3) hide show
  1. data/agent_user.gemspec +1 -1
  2. data/lib/agent_user.rb +99 -99
  3. metadata +1 -1
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |gem|
4
4
  gem.name = "agent_user"
5
- gem.version = "1.0.1"
5
+ gem.version = "1.0.3"
6
6
  gem.authors = ["Marc Lipovsky"]
7
7
  gem.email = ["marclipovsky@gmail.com"]
8
8
  gem.summary = "A better user agent parser."
@@ -1,115 +1,115 @@
1
1
  # encoding: UTF-8
2
2
 
3
- module AgentUser
4
- class Parser
5
-
6
- def self.parse(str)
7
- self.new(str)
8
- end
9
-
10
- def initialize (str)
11
- # Every device/browser/os name with version
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
- def mobile?
72
- # Force true or false if the based on the device name
73
- !!@mobile_device_name
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
- def mobile_device_name
79
- # Change name from user agent to more readable iOS device
80
- return 'iPad' if @mobile_device_name == 'CPU OS'
81
- return 'iPhone' if @mobile_device_name == 'CPU iPhone OS'
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
- def mobile_device_version
87
- # Replace _ in some version numbers to .
88
- @mobile_device_version.gsub(?_,?.) if @mobile_device_version
89
- end
90
-
91
- def operating_system_name
92
- # Change name from user agent to iOS if from an iPad or iPhone
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
- def browser_name
104
- return 'Internet Explorer' if @browser_name == 'MSIE'
105
-
106
- @browser_name || 'Other'
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
- def browser_version
110
- # Replace _ in some version numbers to .
111
- @browser_version.gsub(?_,?.) if @browser_version
112
- end
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
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.1
4
+ version: 1.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: