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.
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: