agent_orange 0.0.9 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +2 -0
- data/bin/agent_orange_example +3 -1
- data/lib/agent_orange/browser.rb +10 -10
- data/lib/agent_orange/device.rb +15 -15
- data/lib/agent_orange/engine.rb +10 -10
- data/lib/agent_orange/operating_system.rb +9 -9
- data/lib/agent_orange/platform.rb +11 -11
- data/lib/agent_orange/user_agent.rb +12 -12
- data/lib/agent_orange/version.rb +12 -8
- data/lib/agent_orange.rb +1 -1
- metadata +25 -46
- data/.gitignore +0 -4
- data/agent_orange.gemspec +0 -20
data/Rakefile
CHANGED
data/bin/agent_orange_example
CHANGED
@@ -14,7 +14,9 @@ user_agent_strings = [
|
|
14
14
|
"Mozilla/5.0 (Windows NT 6.1; rv:6.0) Gecko/20110814 Firefox/6.0",
|
15
15
|
"Mozilla/5.0 (X11; U; Linux i586; de; rv:5.0) Gecko/20100101 Firefox/5.0",
|
16
16
|
"Opera/9.80 (Windows NT 6.1; U; es-ES) Presto/2.9.181 Version/12.00",
|
17
|
-
"Opera/9.80 (X11; Linux i686; U; ru) Presto/2.8.131 Version/11.11"
|
17
|
+
"Opera/9.80 (X11; Linux i686; U; ru) Presto/2.8.131 Version/11.11",
|
18
|
+
"ia_archiver (+http://www.alexa.com/site/help/webmasters; crawler@alexa.com)",
|
19
|
+
"Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
|
18
20
|
]
|
19
21
|
|
20
22
|
def process_user_agent(ua_str)
|
data/lib/agent_orange/browser.rb
CHANGED
@@ -5,17 +5,17 @@ module AgentOrange
|
|
5
5
|
class Browser < Base
|
6
6
|
attr_accessor :type, :name, :version
|
7
7
|
attr_accessor :security
|
8
|
-
|
8
|
+
|
9
9
|
BROWSERS = {
|
10
10
|
:ie => 'MSIE|Internet Explorer|IE',
|
11
11
|
:firefox => 'Firefox',
|
12
12
|
:opera => 'Opera',
|
13
13
|
:safari => 'Safari'
|
14
14
|
}
|
15
|
-
|
15
|
+
|
16
16
|
def parse(user_agent)
|
17
17
|
AgentOrange.debug "BROWSER PARSING", 2
|
18
|
-
|
18
|
+
|
19
19
|
groups = parse_user_agent_string_into_groups(user_agent)
|
20
20
|
groups.each_with_index do |content,i|
|
21
21
|
if content[:name] =~ /(#{BROWSERS.collect{|cat,regex| regex}.join(')|(')})/i
|
@@ -30,32 +30,32 @@ module AgentOrange
|
|
30
30
|
chosen_content = additional_content
|
31
31
|
end
|
32
32
|
end
|
33
|
-
|
33
|
+
|
34
34
|
self.populate(chosen_content)
|
35
35
|
end
|
36
36
|
end
|
37
|
-
|
37
|
+
|
38
38
|
self.analysis
|
39
39
|
end
|
40
|
-
|
40
|
+
|
41
41
|
def populate(content={})
|
42
42
|
self.debug_raw_content(content)
|
43
43
|
AgentOrange.debug "", 2
|
44
|
-
|
44
|
+
|
45
45
|
self.type = self.determine_type(BROWSERS, content[:name])
|
46
46
|
self.name = content[:name]
|
47
47
|
self.version = AgentOrange::Version.new(content[:version])
|
48
48
|
self
|
49
49
|
end
|
50
|
-
|
50
|
+
|
51
51
|
def analysis
|
52
52
|
AgentOrange.debug "BROWSER ANALYSIS", 2
|
53
53
|
self.debug_content(:type => self.type, :name => self.name, :version => self.version)
|
54
54
|
AgentOrange.debug "", 2
|
55
55
|
end
|
56
|
-
|
56
|
+
|
57
57
|
def to_s
|
58
58
|
[self.name, self.version].compact.join(' ')
|
59
59
|
end
|
60
60
|
end
|
61
|
-
end
|
61
|
+
end
|
data/lib/agent_orange/device.rb
CHANGED
@@ -10,16 +10,16 @@ module AgentOrange
|
|
10
10
|
attr_accessor :platform
|
11
11
|
attr_accessor :operating_system
|
12
12
|
attr_accessor :engine
|
13
|
-
|
13
|
+
|
14
14
|
DEVICES = {
|
15
15
|
:computer => 'windows|macintosh|x11|linux',
|
16
16
|
:mobile => 'ipod|ipad|iphone|palm|android|opera mini|hiptop|windows ce|smartphone|mobile|treo|psp',
|
17
|
-
:bot => 'bot'
|
17
|
+
:bot => 'bot|googlebot|crawler|spider|robot|crawling'
|
18
18
|
}
|
19
|
-
|
19
|
+
|
20
20
|
def parse(user_agent)
|
21
21
|
AgentOrange.debug "DEVICE PARSING", 2
|
22
|
-
|
22
|
+
|
23
23
|
groups = parse_user_agent_string_into_groups(user_agent)
|
24
24
|
groups.each_with_index do |content,i|
|
25
25
|
if content[:comment] =~ /(#{DEVICES.collect{|cat,regex| regex}.join(')|(')})/i
|
@@ -27,30 +27,30 @@ module AgentOrange
|
|
27
27
|
self.populate(content)
|
28
28
|
end
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
self.analysis
|
32
|
-
|
32
|
+
|
33
33
|
self.platform = AgentOrange::Platform.new(user_agent)
|
34
34
|
self.operating_system = AgentOrange::OperatingSystem.new(user_agent)
|
35
35
|
self.engine = AgentOrange::Engine.new(user_agent)
|
36
36
|
end
|
37
|
-
|
37
|
+
|
38
38
|
def populate(content={})
|
39
39
|
self.debug_raw_content(content)
|
40
40
|
AgentOrange.debug "", 2
|
41
|
-
|
41
|
+
|
42
42
|
self.type = self.determine_type(DEVICES, content[:comment])
|
43
43
|
self.name = self.type.to_s.capitalize
|
44
44
|
self.version = nil
|
45
45
|
self
|
46
46
|
end
|
47
|
-
|
47
|
+
|
48
48
|
def analysis
|
49
49
|
AgentOrange.debug "DEVICE ANALYSIS", 2
|
50
50
|
self.debug_content(:type => self.type, :name => self.name, :version => self.version)
|
51
51
|
AgentOrange.debug "", 2
|
52
52
|
end
|
53
|
-
|
53
|
+
|
54
54
|
def is_computer?(name=nil)
|
55
55
|
if name
|
56
56
|
case name
|
@@ -63,9 +63,9 @@ module AgentOrange
|
|
63
63
|
(self.type == :computer)
|
64
64
|
end
|
65
65
|
end
|
66
|
-
|
66
|
+
|
67
67
|
def is_mobile?(name=nil)
|
68
|
-
if !name.nil?
|
68
|
+
if !name.nil? && !self.platform.name.nil?
|
69
69
|
case name
|
70
70
|
when String
|
71
71
|
return self.platform.name.downcase.include?(name.downcase) || self.platform.version.downcase.include?(name.downcase)
|
@@ -76,7 +76,7 @@ module AgentOrange
|
|
76
76
|
(self.type == :mobile)
|
77
77
|
end
|
78
78
|
end
|
79
|
-
|
79
|
+
|
80
80
|
def is_bot?(name=nil)
|
81
81
|
if name
|
82
82
|
case name
|
@@ -89,9 +89,9 @@ module AgentOrange
|
|
89
89
|
(self.type == :bot)
|
90
90
|
end
|
91
91
|
end
|
92
|
-
|
92
|
+
|
93
93
|
def to_s
|
94
94
|
[self.name, self.version].compact.join(' ')
|
95
95
|
end
|
96
96
|
end
|
97
|
-
end
|
97
|
+
end
|
data/lib/agent_orange/engine.rb
CHANGED
@@ -7,7 +7,7 @@ module AgentOrange
|
|
7
7
|
class Engine < Base
|
8
8
|
attr_accessor :type, :name, :version
|
9
9
|
attr_accessor :browser
|
10
|
-
|
10
|
+
|
11
11
|
ENGINES = {
|
12
12
|
:gecko => 'Gecko',
|
13
13
|
:presto => 'Presto',
|
@@ -15,10 +15,10 @@ module AgentOrange
|
|
15
15
|
:webkit => 'AppleWebKit',
|
16
16
|
:other => 'Other'
|
17
17
|
}
|
18
|
-
|
18
|
+
|
19
19
|
def parse(user_agent)
|
20
20
|
AgentOrange.debug "ENGINE PARSING", 2
|
21
|
-
|
21
|
+
|
22
22
|
groups = parse_user_agent_string_into_groups(user_agent)
|
23
23
|
groups.each_with_index do |content,i|
|
24
24
|
if content[:name] =~ /(#{ENGINES.collect{|cat,regex| regex}.join(')|(')})/i
|
@@ -33,33 +33,33 @@ module AgentOrange
|
|
33
33
|
chosen_content = additional_content
|
34
34
|
end
|
35
35
|
end
|
36
|
-
|
36
|
+
|
37
37
|
self.populate(chosen_content)
|
38
38
|
end
|
39
39
|
end
|
40
|
-
|
40
|
+
|
41
41
|
self.analysis
|
42
42
|
self.browser = AgentOrange::Browser.new(user_agent)
|
43
43
|
end
|
44
|
-
|
44
|
+
|
45
45
|
def populate(content={})
|
46
46
|
self.debug_raw_content(content)
|
47
47
|
AgentOrange.debug "", 2
|
48
|
-
|
48
|
+
|
49
49
|
self.type = self.determine_type(ENGINES, content[:name])
|
50
50
|
self.name = ENGINES[self.type.to_sym]
|
51
51
|
self.version = AgentOrange::Version.new(content[:version])
|
52
52
|
self
|
53
53
|
end
|
54
|
-
|
54
|
+
|
55
55
|
def analysis
|
56
56
|
AgentOrange.debug "ENGINE ANALYSIS", 2
|
57
57
|
self.debug_content(:type => self.type, :name => self.name, :version => self.version)
|
58
58
|
AgentOrange.debug "", 2
|
59
59
|
end
|
60
|
-
|
60
|
+
|
61
61
|
def to_s
|
62
62
|
[self.name, self.version].compact.join(' ') || "Unknown"
|
63
63
|
end
|
64
64
|
end
|
65
|
-
end
|
65
|
+
end
|
@@ -3,7 +3,7 @@ require 'agent_orange/base'
|
|
3
3
|
module AgentOrange
|
4
4
|
class OperatingSystem < Base
|
5
5
|
attr_accessor :type, :name, :version
|
6
|
-
|
6
|
+
|
7
7
|
OPERATING_SYSTEMS = {
|
8
8
|
:android => 'android',
|
9
9
|
:freebsd => 'freebsd',
|
@@ -26,7 +26,7 @@ module AgentOrange
|
|
26
26
|
|
27
27
|
def parse(user_agent)
|
28
28
|
AgentOrange.debug "OPERATING SYSTEM PARSING", 2
|
29
|
-
|
29
|
+
|
30
30
|
groups = parse_user_agent_string_into_groups(user_agent)
|
31
31
|
groups.each_with_index do |content,i|
|
32
32
|
if content[:comment] =~ /(#{OPERATING_SYSTEMS.collect{|cat,regex| regex}.join(')|(')})/i
|
@@ -38,32 +38,32 @@ module AgentOrange
|
|
38
38
|
chosen_content = additional_content
|
39
39
|
end
|
40
40
|
end
|
41
|
-
|
41
|
+
|
42
42
|
self.populate(chosen_content)
|
43
43
|
end
|
44
44
|
end
|
45
|
-
|
45
|
+
|
46
46
|
self.analysis
|
47
47
|
end
|
48
|
-
|
48
|
+
|
49
49
|
def populate(content={})
|
50
50
|
self.debug_raw_content(content)
|
51
51
|
AgentOrange.debug "", 2
|
52
|
-
|
52
|
+
|
53
53
|
self.type = self.determine_type(OPERATING_SYSTEMS, content[:name])
|
54
54
|
self.name = OPERATING_SYSTEM_NAMES[self.type.to_sym]
|
55
55
|
self.version = AgentOrange::Version.new(content[:version])
|
56
56
|
self
|
57
57
|
end
|
58
|
-
|
58
|
+
|
59
59
|
def analysis
|
60
60
|
AgentOrange.debug "OPERATING SYSTEM ANALYSIS", 2
|
61
61
|
self.debug_content(:type => self.type, :name => self.name, :version => self.version)
|
62
62
|
AgentOrange.debug "", 2
|
63
63
|
end
|
64
|
-
|
64
|
+
|
65
65
|
def to_s
|
66
66
|
[self.name, self.version].compact.join(' ')
|
67
67
|
end
|
68
68
|
end
|
69
|
-
end
|
69
|
+
end
|
@@ -10,7 +10,7 @@ module AgentOrange
|
|
10
10
|
:mac => 'macintosh',
|
11
11
|
:pc => 'freebsd|linux|netbsd|windows|x11'
|
12
12
|
}
|
13
|
-
|
13
|
+
|
14
14
|
PLATFORM_NAMES = {
|
15
15
|
:android => 'Android',
|
16
16
|
:apple => 'Apple',
|
@@ -22,10 +22,10 @@ module AgentOrange
|
|
22
22
|
:iphone => 'iphone',
|
23
23
|
:ipod => 'ipod'
|
24
24
|
}
|
25
|
-
|
25
|
+
|
26
26
|
def parse(user_agent)
|
27
27
|
AgentOrange.debug "PLATFORM PARSING", 2
|
28
|
-
|
28
|
+
|
29
29
|
groups = parse_user_agent_string_into_groups(user_agent)
|
30
30
|
groups.each_with_index do |content,i|
|
31
31
|
if content[:comment] =~ /(#{PLATFORMS.collect{|cat,regex| regex}.join(')|(')})/i
|
@@ -33,17 +33,17 @@ module AgentOrange
|
|
33
33
|
self.populate(content)
|
34
34
|
end
|
35
35
|
end
|
36
|
-
|
36
|
+
|
37
37
|
self.analysis
|
38
38
|
end
|
39
|
-
|
39
|
+
|
40
40
|
def populate(content={})
|
41
41
|
self.debug_raw_content(content)
|
42
42
|
AgentOrange.debug "", 2
|
43
|
-
|
43
|
+
|
44
44
|
self.type = self.determine_type(PLATFORMS, content[:comment])
|
45
45
|
self.name = PLATFORM_NAMES[self.type.to_sym]
|
46
|
-
|
46
|
+
|
47
47
|
if self.type == :apple
|
48
48
|
self.version = case self.determine_type(PLATFORM_VERSIONS, content[:comment])
|
49
49
|
when :ipad
|
@@ -58,18 +58,18 @@ module AgentOrange
|
|
58
58
|
else
|
59
59
|
self.version = nil
|
60
60
|
end
|
61
|
-
|
61
|
+
|
62
62
|
self
|
63
63
|
end
|
64
|
-
|
64
|
+
|
65
65
|
def analysis
|
66
66
|
AgentOrange.debug "PLATFORM ANALYSIS", 2
|
67
67
|
self.debug_content(:type => self.type, :name => self.name, :version => self.version)
|
68
68
|
AgentOrange.debug "", 2
|
69
69
|
end
|
70
|
-
|
70
|
+
|
71
71
|
def to_s
|
72
72
|
[self.name, self.version].compact.join(' ')
|
73
73
|
end
|
74
74
|
end
|
75
|
-
end
|
75
|
+
end
|
@@ -3,17 +3,17 @@ require 'agent_orange/device'
|
|
3
3
|
module AgentOrange
|
4
4
|
DEBUG = false
|
5
5
|
DEBUG_LEVEL = 1
|
6
|
-
|
6
|
+
|
7
7
|
class UserAgent
|
8
8
|
attr_accessor :user_agent_string
|
9
9
|
attr_accessor :user_language
|
10
10
|
attr_accessor :device
|
11
|
-
|
11
|
+
|
12
12
|
def initialize(user_agent_string)
|
13
13
|
self.parse(user_agent_string)
|
14
14
|
end
|
15
15
|
|
16
|
-
def parse(user_agent)
|
16
|
+
def parse(user_agent)
|
17
17
|
self.user_agent_string = user_agent
|
18
18
|
self.device = AgentOrange::Device.new(self.user_agent_string)
|
19
19
|
|
@@ -25,7 +25,7 @@ module AgentOrange
|
|
25
25
|
|
26
26
|
self.summary
|
27
27
|
end
|
28
|
-
|
28
|
+
|
29
29
|
def is_computer?(type=nil)
|
30
30
|
self.device.is_computer?(type)
|
31
31
|
end
|
@@ -39,14 +39,14 @@ module AgentOrange
|
|
39
39
|
end
|
40
40
|
|
41
41
|
def to_s
|
42
|
-
[self.device,
|
43
|
-
self.device.platform,
|
44
|
-
self.device.operating_system,
|
45
|
-
self.device.engine,
|
42
|
+
[self.device,
|
43
|
+
self.device.platform,
|
44
|
+
self.device.operating_system,
|
45
|
+
self.device.engine,
|
46
46
|
self.device.engine.browser
|
47
47
|
].compact.join(", ")
|
48
48
|
end
|
49
|
-
|
49
|
+
|
50
50
|
def to_human_string
|
51
51
|
if self.device && self.device.engine && self.device.engine.browser
|
52
52
|
"User has a #{self.device} running #{self.device.engine.browser} (which is based on #{self.device.engine})."
|
@@ -74,9 +74,9 @@ module AgentOrange
|
|
74
74
|
AgentOrange.debug
|
75
75
|
end
|
76
76
|
end
|
77
|
-
|
77
|
+
|
78
78
|
def self.debug(str="", level=1)
|
79
79
|
puts str if DEBUG && (DEBUG_LEVEL >= level)
|
80
80
|
end
|
81
|
-
|
82
|
-
end
|
81
|
+
|
82
|
+
end
|
data/lib/agent_orange/version.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module AgentOrange
|
2
|
-
VERSION = "0.0
|
3
|
-
|
2
|
+
VERSION = "0.1.0" # This is for the gem and does not conflict with the rest of the functionality
|
3
|
+
|
4
4
|
class Version
|
5
5
|
attr_accessor :major, :minor, :patch_level, :build_number
|
6
6
|
|
@@ -13,21 +13,25 @@ module AgentOrange
|
|
13
13
|
|
14
14
|
pieces = version_string.split('.')
|
15
15
|
pieces_count = pieces.count
|
16
|
-
|
16
|
+
|
17
17
|
self.major = pieces[0] if pieces_count >= 1
|
18
18
|
self.minor = pieces[1] if pieces_count >= 2
|
19
19
|
self.patch_level = pieces[2] if pieces_count >= 3
|
20
20
|
self.build_number = pieces[3] if pieces_count >= 4
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
23
|
def to_s
|
24
24
|
[self.major, self.minor, self.patch_level, self.build_number].compact.join('.')
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
27
|
private
|
28
|
-
|
28
|
+
|
29
29
|
def sanitize_version_string(version_string)
|
30
|
-
version_string.
|
30
|
+
unless version_string.nil?
|
31
|
+
version_string.gsub('_','.')
|
32
|
+
else
|
33
|
+
""
|
34
|
+
end
|
31
35
|
end
|
32
36
|
end
|
33
|
-
end
|
37
|
+
end
|
data/lib/agent_orange.rb
CHANGED
metadata
CHANGED
@@ -1,40 +1,24 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: agent_orange
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 0
|
9
|
-
- 9
|
10
|
-
version: 0.0.9
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Kevin Elliott
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
date: 2011-09-16 00:00:00 Z
|
12
|
+
date: 2011-10-21 00:00:00.000000000Z
|
19
13
|
dependencies: []
|
20
|
-
|
21
14
|
description: Parse and process User Agents like a secret one
|
22
|
-
email:
|
15
|
+
email:
|
23
16
|
- kevin@welikeinc.com
|
24
|
-
executables:
|
17
|
+
executables:
|
25
18
|
- agent_orange_example
|
26
19
|
extensions: []
|
27
|
-
|
28
20
|
extra_rdoc_files: []
|
29
|
-
|
30
|
-
files:
|
31
|
-
- .gitignore
|
32
|
-
- Gemfile
|
33
|
-
- README.rdoc
|
34
|
-
- Rakefile
|
35
|
-
- agent_orange.gemspec
|
36
|
-
- bin/agent_orange_example
|
37
|
-
- lib/agent_orange.rb
|
21
|
+
files:
|
38
22
|
- lib/agent_orange/base.rb
|
39
23
|
- lib/agent_orange/browser.rb
|
40
24
|
- lib/agent_orange/device.rb
|
@@ -43,38 +27,33 @@ files:
|
|
43
27
|
- lib/agent_orange/platform.rb
|
44
28
|
- lib/agent_orange/user_agent.rb
|
45
29
|
- lib/agent_orange/version.rb
|
30
|
+
- lib/agent_orange.rb
|
31
|
+
- bin/agent_orange_example
|
32
|
+
- Gemfile
|
33
|
+
- Rakefile
|
34
|
+
- README.rdoc
|
46
35
|
homepage: http://github.com/kevinelliott/agent_orange
|
47
36
|
licenses: []
|
48
|
-
|
49
37
|
post_install_message:
|
50
38
|
rdoc_options: []
|
51
|
-
|
52
|
-
require_paths:
|
39
|
+
require_paths:
|
53
40
|
- lib
|
54
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
41
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
55
42
|
none: false
|
56
|
-
requirements:
|
57
|
-
- -
|
58
|
-
- !ruby/object:Gem::Version
|
59
|
-
|
60
|
-
|
61
|
-
- 0
|
62
|
-
version: "0"
|
63
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ! '>='
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0'
|
47
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
64
48
|
none: false
|
65
|
-
requirements:
|
66
|
-
- -
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
|
69
|
-
segments:
|
70
|
-
- 0
|
71
|
-
version: "0"
|
49
|
+
requirements:
|
50
|
+
- - ! '>='
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '0'
|
72
53
|
requirements: []
|
73
|
-
|
74
54
|
rubyforge_project: agent_orange
|
75
|
-
rubygems_version: 1.8.
|
55
|
+
rubygems_version: 1.8.10
|
76
56
|
signing_key:
|
77
57
|
specification_version: 3
|
78
58
|
summary: Parse and process User Agents like a secret one
|
79
59
|
test_files: []
|
80
|
-
|
data/.gitignore
DELETED
data/agent_orange.gemspec
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
2
|
-
$:.push File.expand_path("../lib", __FILE__)
|
3
|
-
require "agent_orange/version"
|
4
|
-
|
5
|
-
Gem::Specification.new do |s|
|
6
|
-
s.name = "agent_orange"
|
7
|
-
s.version = AgentOrange::VERSION
|
8
|
-
s.authors = ["Kevin Elliott"]
|
9
|
-
s.email = ["kevin@welikeinc.com"]
|
10
|
-
s.homepage = "http://github.com/kevinelliott/agent_orange"
|
11
|
-
s.summary = %q{Parse and process User Agents like a secret one}
|
12
|
-
s.description = %q{Parse and process User Agents like a secret one}
|
13
|
-
|
14
|
-
s.rubyforge_project = "agent_orange"
|
15
|
-
|
16
|
-
s.files = `git ls-files`.split("\n")
|
17
|
-
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
-
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
-
s.require_paths = ["lib"]
|
20
|
-
end
|