rackamole 0.2.6 → 0.2.7

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.
data/HISTORY CHANGED
@@ -33,4 +33,8 @@
33
33
  * Added options for excluding certain mole information for being logged see mole_excludes option.
34
34
  * Eliminated unwise defaults. From now, the option :app_name must be specified when initializing.
35
35
  The option :db_name must also be present if the mongo store is used.
36
- Keep in mind for rackamole to work with wackamole your db name must follow: mole_{app_name}_{environment}_mdb.
36
+ Keep in mind for rackamole to work with wackamole your db name must follow: mole_{app_name}_{environment}_mdb.
37
+
38
+ 0.2.7
39
+ * Bug fixes and cleanup
40
+ * Added user_agent parsing. now extracting os/platform/version as well as browser type and version.
@@ -280,13 +280,16 @@ module Rack
280
280
  # Optional elements...
281
281
  mole?( :software , info, env['SERVER_SOFTWARE'] )
282
282
  mole?( :ip , info, ip )
283
- mole?( :browser , info, id_browser( user_agent ) )
284
283
  mole?( :url , info, request.url )
285
284
  mole?( :path , info, request.path )
286
285
  mole?( :status , info, status )
287
286
  mole?( :headers , info, headers )
288
287
  mole?( :body , info, response.body ) if response
289
288
 
289
+ # Gather up browser and client machine info
290
+ agent_info = Rackamole::Utils::AgentDetect.parse( user_agent )
291
+ %w(browser machine).each { |type| mole?(type.to_sym, info, agent_info[type.to_sym] ) }
292
+
290
293
  # Dump request params
291
294
  unless request.params.empty?
292
295
  info[:params] = filter_params( request.params, options[:param_excludes] || [] )
@@ -324,19 +327,7 @@ module Rack
324
327
  end
325
328
  results
326
329
  end
327
-
328
- # Attempts to detect browser type from agent info.
329
- # BOZO !! Probably more efficient way to do this...
330
- def browser_types() @browsers ||= [ 'Firefox', 'Safari', 'MSIE 8.0', 'MSIE 7.0', 'MSIE 6.0', 'Opera', 'Chrome' ] end
331
-
332
- def id_browser( user_agent )
333
- return "N/A" if !user_agent or user_agent.empty?
334
- browser_types.each do |b|
335
- return b if user_agent.match( /.*?#{b.gsub(/\./,'\.')}.*?/ )
336
- end
337
- "N/A"
338
- end
339
-
330
+
340
331
  # Trim stack trace
341
332
  def trim_stack( boom )
342
333
  boom.backtrace[0...4]
@@ -197,7 +197,8 @@ module Rackamole
197
197
  :time_id => :tid,
198
198
  :user_id => :uid,
199
199
  :user_name => :una,
200
- :browser => :bro,
200
+ :browser => :bro,
201
+ :machine => :mac,
201
202
  :host => :hos,
202
203
  :software => :sof,
203
204
  :request_time => :rti,
@@ -0,0 +1,73 @@
1
+ # This agent business is a cluster fuck. Won't even pretend detection will
2
+ # be accurate. But at least an honest try...
3
+ # BOZO !! Need to handle iphone, android, etc...
4
+ module Rackamole::Utils
5
+ class AgentDetect
6
+
7
+ # browsers...
8
+ def self.browsers() %w[Opera Firefox Chrome Safari MSIE]; end
9
+
10
+ # Parses user agent to extract browser and machine info
11
+ def self.parse( agent )
12
+ browsers.each do |browser|
13
+ return extract( agent, browser ) if check?( agent, browser )
14
+ end
15
+ defaults
16
+ end
17
+
18
+ # =========================================================================
19
+ private
20
+
21
+ # Check for known browsers
22
+ def self.check?( agent, browser )
23
+ agent.match( /#{browser}/ )
24
+ end
25
+
26
+ # Pre populate info hash
27
+ def self.defaults
28
+ info = { :browser => {}, :machine => {} }
29
+ %w[name version].each { |t| info[:browser][t.to_sym] = "N/A" }
30
+ %w[platform os version local].each { |t| info[:machine][t.to_sym] = "N/A" }
31
+ info
32
+ end
33
+
34
+ # Extract machine and browser info
35
+ def self.extract( agent, browser )
36
+ @info = defaults
37
+ begin
38
+ extract_browser( agent, browser )
39
+ extract_platform( agent )
40
+ rescue => boom
41
+ $stderr.puts "Unable to parse user agent `#{agent}"
42
+ $stderr.puts boom
43
+ boom.backtrace.each { |l| $stderr.puts l }
44
+ end
45
+ @info
46
+ end
47
+
48
+ # Extract browser and version
49
+ def self.extract_browser( agent, browser )
50
+ @info[:browser][:name] = browser
51
+ match = agent.match( /#{browser}[\/|\s]([\d|\.?]+)/ )
52
+ @info[:browser][:version] = match[1] if match and match[1]
53
+ end
54
+
55
+ # Extracts machine info
56
+ def self.extract_platform( agent )
57
+ match = agent.match( /\((.*)\)/ )
58
+ return unless match and match[1]
59
+
60
+ machine_info = match[1]
61
+ tokens = machine_info.split( ";" )
62
+ unless tokens.empty?
63
+ platform = tokens[0].strip
64
+ @info[:machine][:platform] = platform
65
+ index = 1
66
+ index += 1 if tokens[1].match( /[MSIE|U]/ )
67
+ os = tokens[index].match( /(.+)\s([\w\d|\.]+)/ )
68
+ @info[:machine][:os] = os[1].strip
69
+ @info[:machine][:version] = os[2].strip
70
+ end
71
+ end
72
+ end
73
+ end
data/lib/rackamole.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  module Rackamole
2
2
 
3
3
  # :stopdoc:
4
- VERSION = '0.2.6'
4
+ VERSION = '0.2.7'
5
5
  LIBPATH = ::File.expand_path(::File.dirname(__FILE__)) + ::File::SEPARATOR
6
6
  PATH = ::File.dirname(LIBPATH) + ::File::SEPARATOR
7
7
  # :startdoc:
@@ -4,7 +4,8 @@ Type : 2
4
4
  App_name : "Test app"
5
5
  Environment : :test
6
6
  Ip : "1.1.1.1"
7
- Browser : "Ibrowse"
7
+ Browser : {"name"=>"Ibrowse", "version"=>"1.X"}
8
+ Machine : {"platform"=>"Blee", "os"=>"Windoze", "version"=>"10.0"}
8
9
  User_id : 100
9
10
  User_name : "Fernand"
10
11
  Request_time : 1.0
@@ -4,7 +4,8 @@ Type : 0
4
4
  App_name : "Test app"
5
5
  Environment : :test
6
6
  Ip : "1.1.1.1"
7
- Browser : "Ibrowse"
7
+ Browser : {"name"=>"Ibrowse", "version"=>"1.X"}
8
+ Machine : {"platform"=>"Blee", "os"=>"Windoze", "version"=>"10.0"}
8
9
  User_id : 100
9
10
  User_name : "Fernand"
10
11
  Request_time : 1.0
@@ -4,7 +4,8 @@ Type : 1
4
4
  App_name : "Test app"
5
5
  Environment : :test
6
6
  Ip : "1.1.1.1"
7
- Browser : "Ibrowse"
7
+ Browser : {"name"=>"Ibrowse", "version"=>"1.X"}
8
+ Machine : {"platform"=>"Blee", "os"=>"Windoze", "version"=>"10.0"}
8
9
  User_id : 100
9
10
  User_name : "Fernand"
10
11
  Request_time : 1.0
@@ -10,7 +10,7 @@ describe Rack::Mole do
10
10
  @test_env = {
11
11
  'rack.session' => { :user_id => 100, :username => "fernand" },
12
12
  'HTTP_X_FORWARDED_FOR' => '1.1.1.1',
13
- 'HTTP_USER_AGENT' => "Firefox"
13
+ 'HTTP_USER_AGENT' => "Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.0.12) Gecko/20080326 CentOS/1.5.0.12-14.el5.centos Firefox/1.5.0.12"
14
14
  }
15
15
  @opts = {
16
16
  :app_name => "Test App",
@@ -184,11 +184,12 @@ describe Rack::Mole do
184
184
  @test_store.mole_result[:session].should_not be_nil
185
185
  @test_store.mole_result[:session].keys.should have(2).items
186
186
  @test_store.mole_result[:status].should == 200
187
+ @test_store.mole_result[:machine].should_not be_nil
187
188
 
188
189
  # Excluded
189
190
  @test_store.mole_result[:headers].should be_nil
190
191
  @test_store.mole_result[:body].should be_nil
191
- @test_store.mole_result[:browser].should be_nil
192
+ @test_store.mole_result[:browser].should be_nil
192
193
  @test_store.mole_result[:ip].should be_nil
193
194
  @test_store.mole_result[:url].should be_nil
194
195
  end
@@ -202,23 +203,27 @@ describe Rack::Mole do
202
203
 
203
204
  it "should set the mole meta correctly" do
204
205
  get "/fred/blee", nil, @test_env
205
-
206
- @test_store.mole_result[:app_name].should == "Test App"
207
- @test_store.mole_result[:environment].should == :test
208
- @test_store.mole_result[:user_id].should be_nil
209
- @test_store.mole_result[:user_name].should == 'fernand'
210
- @test_store.mole_result[:ip].should == '1.1.1.1'
211
- @test_store.mole_result[:browser].should == 'Firefox'
212
- @test_store.mole_result[:method].should == 'GET'
213
- @test_store.mole_result[:url].should == 'http://example.org/fred/blee'
214
- @test_store.mole_result[:path].should == '/fred/blee'
215
- @test_store.mole_result[:type].should == Rackamole.feature
216
- @test_store.mole_result[:params].should be_nil
217
- @test_store.mole_result[:session].should_not be_nil
218
- @test_store.mole_result[:session].keys.should have(2).items
219
- @test_store.mole_result[:status].should == 200
220
- @test_store.mole_result[:headers].should == { "Content-Type" => "text/plain" }
221
- @test_store.mole_result[:body].should be_nil
206
+
207
+ @test_store.mole_result[:app_name].should == "Test App"
208
+ @test_store.mole_result[:environment].should == :test
209
+ @test_store.mole_result[:user_id].should be_nil
210
+ @test_store.mole_result[:user_name].should == 'fernand'
211
+ @test_store.mole_result[:ip].should == '1.1.1.1'
212
+ @test_store.mole_result[:browser][:name].should == "Firefox"
213
+ @test_store.mole_result[:browser][:version].should == '1.5.0.12'
214
+ @test_store.mole_result[:machine][:platform].should == 'X11'
215
+ @test_store.mole_result[:machine][:os].should == 'Linux'
216
+ @test_store.mole_result[:machine][:version].should == 'i686'
217
+ @test_store.mole_result[:method].should == 'GET'
218
+ @test_store.mole_result[:url].should == 'http://example.org/fred/blee'
219
+ @test_store.mole_result[:path].should == '/fred/blee'
220
+ @test_store.mole_result[:type].should == Rackamole.feature
221
+ @test_store.mole_result[:params].should be_nil
222
+ @test_store.mole_result[:session].should_not be_nil
223
+ @test_store.mole_result[:session].keys.should have(2).items
224
+ @test_store.mole_result[:status].should == 200
225
+ @test_store.mole_result[:headers].should == { "Content-Type" => "text/plain" }
226
+ @test_store.mole_result[:body].should be_nil
222
227
  end
223
228
 
224
229
  it "mole an exception correctly" do
@@ -227,12 +232,12 @@ describe Rack::Mole do
227
232
  rescue => boom
228
233
  @test_env['mole.exception'] = boom
229
234
  get "/crap/out", nil, @test_env
230
- @test_store.mole_result[:type].should == Rackamole.fault
231
- @test_store.mole_result[:stack].should have(4).items
232
- @test_store.mole_result[:fault].should == 'Oh snap!'
235
+ @test_store.mole_result[:type].should == Rackamole.fault
236
+ @test_store.mole_result[:stack].should have(4).items
237
+ @test_store.mole_result[:fault].should == 'Oh snap!'
233
238
  last_request.env['mole.stash'].should_not be_nil
234
- fault = last_request.env['mole.stash'].send( :find_fault, "/", "./spec/rackamole/mole_spec.rb:226" )
235
- fault.should_not be_nil
239
+ fault = last_request.env['mole.stash'].send( :find_fault, "/", "./spec/rackamole/mole_spec.rb:231" )
240
+ fault.should_not be_nil
236
241
  fault.count.should == 1
237
242
  end
238
243
  end
@@ -390,20 +395,35 @@ describe Rack::Mole do
390
395
  end
391
396
 
392
397
  # ---------------------------------------------------------------------------
393
- describe '#id_browser' do
394
- before :all do
395
- @rack = Rack::Mole.new( nil, :app_name => "test app" )
396
- end
397
-
398
- it "should detect a browser type correctly" do
399
- browser = @rack.send( :id_browser, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648; InfoPath.2; MS-RTC LM 8; SPC 3.1 P1 Ta)")
400
- browser.should == 'MSIE 7.0'
401
- end
402
-
403
- it "should return unknow if can't detect it" do
404
- @rack.send( :id_browser, 'IBrowse' ).should == 'N/A'
405
- end
406
- end
398
+ # describe '#id_browser' do
399
+ # before :all do
400
+ # @rack = Rack::Mole.new( nil, :app_name => "test app" )
401
+ # end
402
+ #
403
+ # it "should detect a browser type correctly" do
404
+ # agents =
405
+ # [
406
+ # "Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_0_1 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko)"
407
+ # "Opera/9.61 (Windows NT 5.1; U; ru) Presto/2.1.1"
408
+ # "Mozilla/4.0 (compatible; MSIE 5.00; Windows 98)",
409
+ # "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; (R1 1.5); .NET CLR 1.1.4322)",
410
+ # "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.49 Safari/532.5",
411
+ # "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; en-us) AppleWebKit/531.9 (KHTML, like Gecko) Version/4.0.3 Safari/531.9",
412
+ # "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648; InfoPath.2; MS-RTC LM 8; SPC 3.1 P1 Ta)",
413
+ # "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7"
414
+ # ]
415
+ # # results = ["Chrome - 4.0.249.49", "Safari - 531.9", "MSIE 7.0", "Firefox - 3.5.7"]
416
+ # # results = ["Chrome", "Safari", "MSIE 7.0", "Firefox"]
417
+ # agents.each do |agent|
418
+ # browser = @rack.send( :id_browser, agent )
419
+ # browser.should == results.shift
420
+ # end
421
+ # end
422
+ #
423
+ # it "should return unknow if can't detect it" do
424
+ # @rack.send( :id_browser, 'IBrowse' ).should == 'N/A'
425
+ # end
426
+ # end
407
427
 
408
428
  # ---------------------------------------------------------------------------
409
429
  describe 'YAML load' do
@@ -9,26 +9,32 @@ describe Rackamole::Store::Log do
9
9
  @store = Rackamole::Store::Log.new( @test_file )
10
10
 
11
11
  @args = OrderedHash.new
12
- @args[:type] = Rackamole.feature
13
- @args[:app_name] = "Test app"
14
- @args[:environment] = :test
15
- @args[:ip] = "1.1.1.1"
16
- @args[:browser] = "Ibrowse"
17
- @args[:user_id] = 100
18
- @args[:user_name] = "Fernand"
19
- @args[:request_time] = 1.0
20
- @args[:url] = "http://test_me/"
21
- @args[:path] = "/fred"
22
- @args[:method] = 'GET'
23
- @args[:params] = { :blee => "duh".to_json }
24
- @args[:session] = { :fred => 10.to_json }
12
+ @args[:type] = Rackamole.feature
13
+ @args[:app_name] = "Test app"
14
+ @args[:environment] = :test
15
+ @args[:ip] = "1.1.1.1"
16
+ @args[:browser] = OrderedHash.new
17
+ @args[:browser][:name] = "Ibrowse"
18
+ @args[:browser][:version] = "1.X"
19
+ @args[:machine] = OrderedHash.new
20
+ @args[:machine][:platform] = "Blee"
21
+ @args[:machine][:os] = "Windoze"
22
+ @args[:machine][:version] = "10.0"
23
+ @args[:user_id] = 100
24
+ @args[:user_name] = "Fernand"
25
+ @args[:request_time] = 1.0
26
+ @args[:url] = "http://test_me/"
27
+ @args[:path] = "/fred"
28
+ @args[:method] = 'GET'
29
+ @args[:params] = { :blee => "duh".to_json }
30
+ @args[:session] = { :fred => 10.to_json }
25
31
  end
26
32
 
27
33
  it "should mole a feature correctly" do
28
34
  @store.mole( @args )
29
- results = File.read( @test_file ).gsub( /.* Mole \:\s/, '' )
30
- expected = File.read( File.join( File.dirname(__FILE__), %w[.. .. expected_results mole_feature.log] ) )
31
- expected.should == results
35
+ results = File.read( @test_file ).gsub( /.* Mole \:\s/, '' )
36
+ expected = File.read( File.join( File.dirname(__FILE__), %w[.. .. expected_results mole_feature.log] ) )
37
+ expected.should == results
32
38
  end
33
39
 
34
40
  it "should mole an exception correctly" do
@@ -23,7 +23,13 @@ describe Rackamole::Store::MongoDb do
23
23
  @args[:environment] = :test
24
24
  @args[:perf_issue] = false
25
25
  @args[:ip] = "1.1.1.1"
26
- @args[:browser] = "Ibrowse"
26
+ @args[:browser] = OrderedHash.new
27
+ @args[:browser][:name] = "Ibrowse"
28
+ @args[:browser][:version] = "1.X"
29
+ @args[:machine] = OrderedHash.new
30
+ @args[:machine][:platform] = "Blee"
31
+ @args[:machine][:os] = "Windoze"
32
+ @args[:machine][:version] = "10.0"
27
33
  @args[:user_id] = 100
28
34
  @args[:user_name] = "Fernand"
29
35
  @args[:request_time] = 1.0
@@ -52,7 +58,11 @@ describe Rackamole::Store::MongoDb do
52
58
  log['fid'].should_not be_nil
53
59
  log['par'].should == { 'blee' => 'duh'.to_json }
54
60
  log['ip'].should == '1.1.1.1'
55
- log['bro'].should == 'Ibrowse'
61
+ log['bro']['name'].should == "Ibrowse"
62
+ log['bro']['version'].should == "1.X"
63
+ log['mac']['platform'].should == "Blee"
64
+ log['mac']['os'].should == "Windoze"
65
+ log['mac']['version'].should == "10.0"
56
66
  log['url'].should == 'http://test_me/'
57
67
  log['met'].should == 'GET'
58
68
  log['ses'].should == { 'fred' => '10' }
@@ -0,0 +1,105 @@
1
+ require File.join(File.dirname(__FILE__), %w[.. .. spec_helper] )
2
+
3
+ describe Rackamole::Utils::AgentDetect do
4
+
5
+ describe "os" do
6
+ it "should detect the os and version correctly" do
7
+ agents = [
8
+ "Opera/8.65 (X11; Linux i686; U; ru)",
9
+ "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) Opera 8.65 [en]",
10
+ "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.7) Gecko/2009021910 Firefox/1.5.0.12 (.NET CLR 3.5.30729)",
11
+ "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.0.6) Gecko/2009011912 Firefox/1.5.0.12 Ubiquity/0.1.5",
12
+ "Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.0.12) Gecko/20080326 CentOS/1.5.0.12-14.el5.centos Firefox/1.5.0.12",
13
+ "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.24 Safari/532.0",
14
+ "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.24 Safari/532.0",
15
+ "Mozilla/5.0 (iPod; U; CPU like Mac OS X; fr) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/4A102 Safari/522.12",
16
+ "Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/3B48b Safari/522.12",
17
+ "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)",
18
+ "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; SV1; CPT-IE401SP1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; InfoPath.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)",
19
+ "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 1.1.4322; InfoPath.2)",
20
+ "Mozilla/4.0 (compatible; MSIE 5.00; Windows 98)"
21
+ ]
22
+ expectations = [
23
+ {
24
+ :browser => { :name => "Opera", :version => "8.65" },
25
+ :machine => { :platform => "X11", :os => "Linux", :version => "i686", :local => "N/A" }
26
+ },
27
+ {
28
+ :browser => { :name => "Opera", :version => "8.65" },
29
+ :machine => { :platform => "compatible", :os => "Windows NT", :version => "5.1", :local => "N/A" }
30
+ },
31
+ {
32
+ :browser => { :name => "Firefox", :version => "1.5.0.12" },
33
+ :machine => { :platform => "Windows", :os => "Windows NT", :version => "6.0", :local => "en-US" }
34
+ },
35
+ {
36
+ :browser => { :name => "Firefox", :version => "1.5.0.12" },
37
+ :machine => { :platform => "Macintosh", :os => "Intel Mac OS X", :version => "10.5", :local => "en-US" }
38
+ },
39
+ {
40
+ :browser => { :name => "Firefox", :version => "1.5.0.12" },
41
+ :machine => { :platform => "X11", :os => "Linux", :version => "i686", :local => "en-US" }
42
+ },
43
+ {
44
+ :browser => { :name => "Chrome", :version => "3.0.195.24" },
45
+ :machine => { :platform => "Windows", :os => "Windows NT", :version => "5.1", :local => "en-US" }
46
+ },
47
+ {
48
+ :browser => { :name => "Chrome", :version => "3.0.195.24" },
49
+ :machine => { :platform => "Macintosh", :os => "Intel Mac OS X", :version => "10_5_6", :local => "en-US" }
50
+ },
51
+ {
52
+ :browser => { :name => "Safari", :version => "522.12" },
53
+ :machine => { :platform => "iPod", :os => "CPU like Mac OS", :version => "X", :local => "fr" }
54
+ },
55
+ {
56
+ :browser => { :name => "Safari", :version => "522.12" },
57
+ :machine => { :platform => "iPhone", :os => "CPU like Mac OS", :version => "X", :local => "en" }
58
+ },
59
+ {
60
+ :browser => { :name => "MSIE", :version => "8.0" },
61
+ :machine => { :platform => "compatible", :os => "Windows NT", :version => "5.1", :local => "N/A" }
62
+ },
63
+ {
64
+ :browser => { :name => "MSIE", :version => "7.0" },
65
+ :machine => { :platform => "compatible", :os => "Windows NT", :version => "5.1", :local => "N/A" }
66
+ },
67
+ {
68
+ :browser => { :name => "MSIE", :version => "6.0" },
69
+ :machine => { :platform => "compatible", :os => "Windows NT", :version => "5.1", :local => "N/A" }
70
+ },
71
+ {
72
+ :browser => { :name => "MSIE", :version => "5.00" },
73
+ :machine => { :platform => "compatible", :os => "Windows", :version => "98", :local => "N/A" }
74
+ }
75
+ ]
76
+ count = 0
77
+ agents.each do |agent|
78
+ info = Rackamole::Utils::AgentDetect.parse( agent )
79
+ expected = expectations[count]
80
+ info.should_not be_nil
81
+ %w(name version).each { |t| info[:browser][t.to_sym].should == expected[:browser][t.to_sym] }
82
+ %w(platform os version).each { |t| info[:machine][t.to_sym].should == expected[:machine][t.to_sym] }
83
+ count += 1
84
+ end
85
+ end
86
+ end
87
+
88
+ describe "failure" do
89
+ it "should not crap out if the user agent is not parsable" do
90
+ info = Rackamole::Utils::AgentDetect.parse( "Firefox" )
91
+ %w(browser machine).each { |k| info[k.to_sym].each_pair { |i,v| v.should == (i == :name ? "Firefox" : "N/A") } }
92
+ end
93
+
94
+ it "should produce an empty info object if nothing can be detected" do
95
+ agents = [
96
+ "Oper/8.65 (X11 Linux i686 U ru)",
97
+ ]
98
+ agents.each do |agent|
99
+ info = Rackamole::Utils::AgentDetect.parse( agent )
100
+ info.should_not be_nil
101
+ %w(browser machine).each { |k| info[k.to_sym].each_pair { |i,v| v.should == "N/A" } }
102
+ end
103
+ end
104
+ end
105
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rackamole
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.6
4
+ version: 0.2.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fernand Galiana
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-01-21 00:00:00 -07:00
12
+ date: 2010-01-28 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -130,6 +130,7 @@ files:
130
130
  - lib/rackamole/store.rb
131
131
  - lib/rackamole/store/log.rb
132
132
  - lib/rackamole/store/mongo_db.rb
133
+ - lib/rackamole/utils/agent_detect.rb
133
134
  - spec/expected_results/mole_exception.log
134
135
  - spec/expected_results/mole_feature.log
135
136
  - spec/expected_results/mole_perf.log
@@ -143,6 +144,7 @@ files:
143
144
  - spec/rackamole/stash/perf_spec.rb
144
145
  - spec/rackamole/store/log_spec.rb
145
146
  - spec/rackamole/store/mongo_db_spec.rb
147
+ - spec/rackamole/utils/agent_detect_spec.rb
146
148
  - spec/rackamole_spec.rb
147
149
  - spec/spec_helper.rb
148
150
  - spec/test_configs/flawed_config.yml