mongodb_logger 0.2.3 → 0.2.4

Sign up to get free protection for your applications and to get access to all the features.
data/.travis.yml CHANGED
@@ -1,6 +1,6 @@
1
- #before_script:
2
- # - "rake vendor_test_gems"
3
- script: "sh -c 'test/test.sh'"
1
+ before_script:
2
+ - "sh -e /etc/init.d/xvfb start"
3
+ script: "sh -c 'export DISPLAY=:99.0 && test/test.sh'"
4
4
  rvm:
5
5
  - 1.8.7
6
6
  - ree
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ ## v0.2.4
2
+
3
+ * Move on logs list by using arrows on keybords
4
+
1
5
  ## v0.2.3
2
6
 
3
7
  * Fix storage log with attachments (save it for search by "original\_filename" and "content\_type")
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # MongodbLogger [![Build Status](https://secure.travis-ci.org/le0pard/mongodb_logger.png)](http://travis-ci.org/le0pard/mongodb_logger)
1
+ # MongodbLogger [![Build Status](https://secure.travis-ci.org/le0pard/mongodb_logger.png)](http://travis-ci.org/le0pard/mongodb_logger) [![Dependency Status](https://gemnasium.com/le0pard/mongodb_logger.png)](https://gemnasium.com/le0pard/mongodb_logger)
2
2
 
3
3
  MongodbLogger is a alternative logger for Rails 3, which log all requests of you application into MongoDB database.
4
4
  It:
@@ -17,6 +17,11 @@ It:
17
17
  1. Add the following line to your ApplicationController:
18
18
 
19
19
  include MongodbLogger::Base
20
+
21
+ 1. For use with Heroku you need to prevent the rails\_log\_stdout plugin from being added by Heroku:
22
+
23
+ mkdir vendor/plugins/rails_log_stdout
24
+ touch vendor/plugins/rails_log_stdout/.gitkeep
20
25
 
21
26
  1. Add MongodbLogger settings to database.yml for each environment in which you want to use the MongodbLogger. The MongodbLogger will also
22
27
  look for a separate mongodb\_logger.yml or mongoid.yml (if you are using mongoid) before looking in database.yml.
@@ -136,6 +141,13 @@ It:
136
141
 
137
142
  MONGODBLOGGERCONFIG=examples/server_config.yml unicorn
138
143
 
144
+ ## Demo Application with MongodbLogger
145
+
146
+ Demo: [http://demo-mongodb-logger.catware.org/](http://demo-mongodb-logger.catware.org/)
147
+
148
+ Demo Sources: [https://github.com/le0pard/mongodb_logger_example_heroku](https://github.com/le0pard/mongodb_logger_example_heroku)
149
+
150
+
139
151
  ## Querying via the Rails console
140
152
 
141
153
  And now, for a couple quick examples on getting ahold of this log data...
data/Rakefile CHANGED
@@ -25,7 +25,8 @@ namespace :js do
25
25
 
26
26
  Dir.foreach(source) do |cf|
27
27
  unless cf == '.' || cf == '..'
28
- js = Uglifier.compile(CoffeeScript.compile File.read("#{source}#{cf}"))
28
+ js_compiled = CoffeeScript.compile File.read("#{source}#{cf}")
29
+ js = Uglifier.compile js_compiled
29
30
  open "#{javascripts}#{cf.gsub('.coffee', '.js')}", 'w' do |f|
30
31
  f.puts js
31
32
  end
@@ -49,10 +50,10 @@ task :clean do
49
50
  exec "rm -rf tmp"
50
51
  end
51
52
 
52
- desc 'Test the airbrake gem.'
53
+ desc 'Test unit.'
53
54
  Rake::TestTask.new(:test) do |test|
54
55
  test.libs << 'lib' << 'test'
55
- test.pattern = 'test/unit/mongodb_logger_test.rb'
56
+ test.test_files = ['test/unit/mongodb_logger_test.rb']
56
57
  test.verbose = true
57
58
  end
58
59
 
@@ -142,6 +143,24 @@ def define_rails_cucumber_tasks(additional_cucumber_args = '')
142
143
  end
143
144
  end
144
145
 
146
+ def define_web_cucumber_tasks(additional_cucumber_args = '')
147
+ desc "Test web of the gem"
148
+ task :web do
149
+ puts "Testing Web"
150
+ system("cucumber --format #{ENV['CUCUMBER_FORMAT'] || 'progress'} #{additional_cucumber_args} features/mongodb_logger_web.feature")
151
+ end
152
+ end
153
+
145
154
  namespace :cucumber do
146
155
  define_rails_cucumber_tasks
156
+ define_web_cucumber_tasks
157
+ end
158
+
159
+ begin
160
+ require 'jasmine'
161
+ load 'jasmine/tasks/jasmine.rake'
162
+ rescue LoadError
163
+ task :jasmine do
164
+ abort "Jasmine is not available. In order to run jasmine, you must: (sudo) gem install jasmine"
165
+ end
147
166
  end
@@ -0,0 +1,14 @@
1
+ Feature: Install MongodbLogger Web and test it
2
+
3
+ Scenario: Main page
4
+ Given homepage
5
+ Then I should see text that no logs in system
6
+
7
+ Scenario: Tail logs buttons
8
+ Given homepage
9
+ And I should see start tail button
10
+ When I click on start tail button
11
+ Then I should see stop tails button
12
+ And box with time of last log tail
13
+ When I click on stop tail button
14
+ Then I should see start tail button
@@ -0,0 +1,45 @@
1
+ require 'active_support/core_ext/string/inflections'
2
+ require 'mongodb_logger/server'
3
+ require 'capybara/cucumber'
4
+
5
+ include Capybara::DSL
6
+
7
+ Before do
8
+ MongodbLogger::ServerConfig.set_config_for_testing(File.join(PROJECT_ROOT, 'test/config/samples/server_config.yml'))
9
+ Capybara.app = MongodbLogger::Server
10
+ end
11
+
12
+ After do
13
+ MongodbLogger::ServerConfig.collection.drop
14
+ end
15
+
16
+ Given /^homepage$/ do
17
+ visit "/"
18
+ end
19
+
20
+ Then /^I should see text that no logs in system$/ do
21
+ page.has_selector?('div', :text => 'No logs found, try to filter out the other parameters', :visible => true)
22
+ end
23
+
24
+ Given /^I should see start tail button$/ do
25
+ page.has_link?('tail_logs_link', :visible => true)
26
+ page.has_link?('tail_logs_stop_link', :visible => false)
27
+ end
28
+
29
+ When /^I click on start tail button$/ do
30
+ click_link('tail_logs_link')
31
+ end
32
+
33
+ Then /^I should see stop tails button$/ do
34
+ page.has_link?('tail_logs_link', :visible => false)
35
+ page.has_link?('tail_logs_stop_link', :visible => true)
36
+ end
37
+
38
+ Then /^box with time of last log tail$/ do
39
+ page.has_selector?('span', :id => 'tail_logs_time', :visible => true)
40
+ end
41
+
42
+ When /^I click on stop tail button$/ do
43
+ click_link('tail_logs_stop_link')
44
+ end
45
+
@@ -1,7 +1,7 @@
1
1
  $ ->
2
- MongodbLoggerJS.init()
2
+ MongodbLoggerMain.init()
3
3
 
4
- MongodbLoggerJS =
4
+ window.MongodbLoggerMain =
5
5
  tail_logs_url: null
6
6
  tail_log_started: false
7
7
  log_info_offset: null
@@ -14,22 +14,22 @@ MongodbLoggerJS =
14
14
  $('#ajax_loader').hide()
15
15
 
16
16
  $(document).on 'click', '#tail_logs_link', (event) =>
17
- MongodbLoggerJS.tail_logs_url = $(event.target).attr('data-url')
17
+ MongodbLoggerMain.tail_logs_url = $(event.target).attr('data-url')
18
18
  $('#tail_logs_block').addClass('started')
19
- MongodbLoggerJS.tail_logs(null)
19
+ MongodbLoggerMain.tail_logs(null)
20
20
  return false
21
21
  $(document).on 'click', '#tail_logs_stop_link', (event) =>
22
- MongodbLoggerJS.tail_log_started = false
22
+ MongodbLoggerMain.tail_log_started = false
23
23
  $('#tail_logs_block').removeClass('started')
24
24
  return false
25
25
 
26
26
  $(document).on 'click', '.log_info', (event) =>
27
27
  elm_obj = $(event.target)
28
- url = elm_obj.attr('data-url')
29
- url = elm_obj.parents('tr').attr('data-url') if !url?
28
+ url = elm_obj.data('url')
29
+ url = elm_obj.parent('tr').data('url') if !url?
30
30
  if url?
31
31
  elm_obj.parents('table').find('tr').removeClass('current')
32
- elm_obj.parents('tr').addClass('current')
32
+ elm_obj.parent('tr').addClass('current')
33
33
  $('#log_info').load(url)
34
34
  return false
35
35
  # filter tougle
@@ -89,12 +89,26 @@ MongodbLoggerJS =
89
89
  elm_obj.addClass('active')
90
90
  $('.' + tab).removeClass('hidden')
91
91
 
92
+ # analytic form
92
93
  $(document).on 'submit', '#analyticForm', (event) =>
93
94
  element = $('#analyticForm')
94
95
  url = element.attr('action')
95
96
  data = element.serializeArray()
96
97
  $('#analyticData').load url, data
97
98
  return false
99
+
100
+ # keydown log
101
+ $(document).on 'keydown', '*', (event) =>
102
+ console.log event.keyCode
103
+ switch event.keyCode
104
+ when 37 # left
105
+ MongodbLoggerMain.move_by_logs('begin')
106
+ when 38 # up
107
+ MongodbLoggerMain.move_by_logs('up')
108
+ when 39 # right
109
+ MongodbLoggerMain.move_by_logs('end')
110
+ when 40 # down
111
+ MongodbLoggerMain.move_by_logs('down')
98
112
 
99
113
  # init pjax
100
114
  this.init_pjax()
@@ -107,12 +121,12 @@ MongodbLoggerJS =
107
121
  $('body').bind 'pjax:end', () =>
108
122
  $('#ajax_loader').hide()
109
123
  # stop tailing
110
- MongodbLoggerJS.tail_log_started = false
124
+ MongodbLoggerMain.tail_log_started = false
111
125
  # scroll on top
112
126
  if ($(window).scrollTop() > 100)
113
127
  $('html, body').stop().animate({ scrollTop: 0 }, 'slow')
114
128
  # init pages
115
- MongodbLoggerJS.init_on_pages()
129
+ MongodbLoggerMain.init_on_pages()
116
130
 
117
131
  init_on_pages: ->
118
132
  # code highlight
@@ -127,23 +141,23 @@ MongodbLoggerJS =
127
141
 
128
142
  # log info window
129
143
  if $("#log_info").length > 0
130
- MongodbLoggerJS.log_info_offset = $("#log_info").offset()
144
+ MongodbLoggerMain.log_info_offset = $("#log_info").offset()
131
145
  $(window).scroll =>
132
- if $(window).scrollTop() > MongodbLoggerJS.log_info_offset.top
146
+ if $(window).scrollTop() > MongodbLoggerMain.log_info_offset.top
133
147
  $("#log_info").stop().animate
134
- marginTop: $(window).scrollTop() - MongodbLoggerJS.log_info_offset.top + MongodbLoggerJS.log_info_padding
148
+ marginTop: $(window).scrollTop() - MongodbLoggerMain.log_info_offset.top + MongodbLoggerMain.log_info_padding
135
149
  else
136
150
  $("#log_info").stop().animate
137
151
  marginTop: 0
138
152
 
139
153
  tail_logs: (log_last_id) ->
140
- url = MongodbLoggerJS.tail_logs_url
154
+ url = MongodbLoggerMain.tail_logs_url
141
155
  if log_last_id? && log_last_id.length > 0
142
- url = MongodbLoggerJS.tail_logs_url + "/" + log_last_id
156
+ url = MongodbLoggerMain.tail_logs_url + "/" + log_last_id
143
157
  else
144
- MongodbLoggerJS.tail_log_started = true
158
+ MongodbLoggerMain.tail_log_started = true
145
159
  log_last_id = ""
146
- if MongodbLoggerJS.tail_log_started
160
+ if MongodbLoggerMain.tail_log_started
147
161
  $.ajax
148
162
  url: url
149
163
  dataType: "json"
@@ -158,6 +172,48 @@ MongodbLoggerJS =
158
172
  $('#logs_list tr:first').after(elements).effect("highlight", {}, 1000)
159
173
  if data.collection_stats && $("#collection_stats").length > 0
160
174
  $("#collection_stats").html(data.collection_stats)
161
- if MongodbLoggerJS.tail_log_started
162
- fcallback = -> MongodbLoggerJS.tail_logs(log_last_id)
175
+ if MongodbLoggerMain.tail_log_started
176
+ fcallback = -> MongodbLoggerMain.tail_logs(log_last_id)
163
177
  setTimeout fcallback, 2000
178
+
179
+ move_by_logs: (direction) ->
180
+ if $('#logs_list').length > 0 && $('#logs_list').find('tr.current').length > 0
181
+ current_element = $('#logs_list').find('tr.current')
182
+ switch direction
183
+ when 'begin'
184
+ element = $('#logs_list tr:first').next("tr")
185
+ if element.length > 0
186
+ element.find('td:first').trigger('click')
187
+ $(window).scrollTop(element.height() + element.offset().top - 100)
188
+ return false
189
+ when 'end'
190
+ element = $('#logs_list tr:last')
191
+ if element.length > 0
192
+ element.find('td:first').trigger('click')
193
+ $(window).scrollTop(element.height() + element.offset().top - 100)
194
+ return false
195
+ when 'down'
196
+ element = current_element.next("tr")
197
+ if element.length > 0
198
+ element.find('td:first').trigger('click')
199
+ if MongodbLoggerMain.is_scrolled_into_view(element)
200
+ $(window).scrollTop($(window).scrollTop() + element.height())
201
+ else
202
+ $(window).scrollTop(element.height() + element.offset().top - 100)
203
+ return false
204
+ when 'up'
205
+ element = current_element.prev("tr")
206
+ if element.length > 0
207
+ element.find('td:first').trigger('click')
208
+ if MongodbLoggerMain.is_scrolled_into_view(element)
209
+ $(window).scrollTop($(window).scrollTop() - element.height())
210
+ else
211
+ $(window).scrollTop(element.height() + element.offset().top - 100)
212
+ return false
213
+
214
+ is_scrolled_into_view: (elem) ->
215
+ docViewTop = $(window).scrollTop()
216
+ docViewBottom = docViewTop + $(window).height()
217
+ elemTop = $(elem).offset().top
218
+ elemBottom = elemTop + $(elem).height()
219
+ return ((docViewTop < elemTop) && (docViewBottom > elemBottom))
@@ -1 +1 @@
1
- ((function(){var a;$(function(){return a.init()}),a={tail_logs_url:null,tail_log_started:!1,log_info_offset:null,log_info_padding:15,init:function(){var b=this;return $(document).ajaxStart(function(){return $("#ajax_loader").show()}),$(document).ajaxStop(function(){return $("#ajax_loader").hide()}),$(document).on("click","#tail_logs_link",function(b){return a.tail_logs_url=$(b.target).attr("data-url"),$("#tail_logs_block").addClass("started"),a.tail_logs(null),!1}),$(document).on("click","#tail_logs_stop_link",function(b){return a.tail_log_started=!1,$("#tail_logs_block").removeClass("started"),!1}),$(document).on("click",".log_info",function(a){var b,c;return b=$(a.target),c=b.attr("data-url"),c==null&&(c=b.parents("tr").attr("data-url")),c!=null&&(b.parents("table").find("tr").removeClass("current"),b.parents("tr").addClass("current"),$("#log_info").load(c)),!1}),$(document).on("click","div.filter-toggle",function(a){return $("div.filter").slideToggle(),$("div.filter-toggle span.arrow-down").toggleClass("rotate")}),$(document).on("click","#add_more_filter",function(a){var b;return b=$(a.target).attr("href"),$.ajax({url:b,success:function(a){var b;return b=$("<li></li>").html(a),$("#more_filter_list").append(b)}}),!1}),$(document).on("change","select.filter_type",function(a){var b,c;return b=$(a.target),c=b.attr("rel")+"/"+b.val(),$.ajax({url:c,dataType:"json",success:function(a){var c,d,e=this;c="",d="",$.each(a.conditions,function(a,b){return c+='<option value="'+b+'">'+b+"</option>"}),b.parents("div.filter_block").find("select.filter_conditions").empty().append(c),a.values.length>0?(d='<select id="filter[more][]_value" name="filter[more][][value]">',$.each(a.values,function(a,b){return d+='<option value="'+b+'">'+b+"</option>"}),d+="</select>"):d='<input type="text" name="filter[more][][value]" value="" placeholder="value">',b.parents("div.filter_block").find("div.filter_values").html(d);if("date"===b.val())return b.parents("div.filter_block").find("div.filter_values input").datepicker({dateFormat:"yy-mm-dd",changeMonth:!0,changeYear:!0,yearRange:"c-50:c+10"})}}),!1}),$(document).on("click",".close_more_filter",function(a){return $(a.target).parents("li").remove(),!1}),$(document).on("click","li.message_tab",function(a){var b,c;b=$(a.target),c=b.attr("data-tab");if(c!=null)return $("li.message_tab").removeClass("active"),$("pre.tab_content").addClass("hidden"),b.addClass("active"),$("."+c).removeClass("hidden")}),$(document).on("submit","#analyticForm",function(a){var b,c,d;return c=$("#analyticForm"),d=c.attr("action"),b=c.serializeArray(),$("#analyticData").load(d,b),!1}),this.init_pjax(),this.init_on_pages()},init_pjax:function(){var b=this;return $("a[data-pjax]").pjax(),$("body").bind("pjax:start",function(){return $("#ajax_loader").show()}),$("body").bind("pjax:end",function(){return $("#ajax_loader").hide(),a.tail_log_started=!1,$(window).scrollTop()>100&&$("html, body").stop().animate({scrollTop:0},"slow"),a.init_on_pages()})},init_on_pages:function(){var b=this;$("pre code").each(function(a,b){return hljs.highlightBlock(b," ")}),$(".datepicker, .filter_values input.date").datepicker({dateFormat:"yy-mm-dd",changeMonth:!0,changeYear:!0,yearRange:"c-50:c+10"});if($("#log_info").length>0)return a.log_info_offset=$("#log_info").offset(),$(window).scroll(function(){return $(window).scrollTop()>a.log_info_offset.top?$("#log_info").stop().animate({marginTop:$(window).scrollTop()-a.log_info_offset.top+a.log_info_padding}):$("#log_info").stop().animate({marginTop:0})})},tail_logs:function(b){var c;c=a.tail_logs_url,b!=null&&b.length>0?c=a.tail_logs_url+"/"+b:(a.tail_log_started=!0,b="");if(a.tail_log_started)return $.ajax({url:c,dataType:"json",success:function(c){var d,e;c.time&&($("#tail_logs_time").text(c.time),c.log_last_id!=null&&(b=c.log_last_id),c.content!=null&&c.content.length>0&&(d=$(c.content),d.addClass("newlog"),$("#logs_list tr:first").after(d).effect("highlight",{},1e3)),c.collection_stats&&$("#collection_stats").length>0&&$("#collection_stats").html(c.collection_stats));if(a.tail_log_started)return e=function(){return a.tail_logs(b)},setTimeout(e,2e3)}})}}})).call(this)
1
+ $(function(){return MongodbLoggerMain.init()}),window.MongodbLoggerMain={tail_logs_url:null,tail_log_started:!1,log_info_offset:null,log_info_padding:15,init:function(){var a=this;return $(document).ajaxStart(function(){return $("#ajax_loader").show()}),$(document).ajaxStop(function(){return $("#ajax_loader").hide()}),$(document).on("click","#tail_logs_link",function(a){return MongodbLoggerMain.tail_logs_url=$(a.target).attr("data-url"),$("#tail_logs_block").addClass("started"),MongodbLoggerMain.tail_logs(null),!1}),$(document).on("click","#tail_logs_stop_link",function(a){return MongodbLoggerMain.tail_log_started=!1,$("#tail_logs_block").removeClass("started"),!1}),$(document).on("click",".log_info",function(a){var b,c;return b=$(a.target),c=b.data("url"),c==null&&(c=b.parent("tr").data("url")),c!=null&&(b.parents("table").find("tr").removeClass("current"),b.parent("tr").addClass("current"),$("#log_info").load(c)),!1}),$(document).on("click","div.filter-toggle",function(a){return $("div.filter").slideToggle(),$("div.filter-toggle span.arrow-down").toggleClass("rotate")}),$(document).on("click","#add_more_filter",function(a){var b;return b=$(a.target).attr("href"),$.ajax({url:b,success:function(a){var b;return b=$("<li></li>").html(a),$("#more_filter_list").append(b)}}),!1}),$(document).on("change","select.filter_type",function(a){var b,c;return b=$(a.target),c=b.attr("rel")+"/"+b.val(),$.ajax({url:c,dataType:"json",success:function(a){var c,d,e=this;c="",d="",$.each(a.conditions,function(a,b){return c+='<option value="'+b+'">'+b+"</option>"}),b.parents("div.filter_block").find("select.filter_conditions").empty().append(c),a.values.length>0?(d='<select id="filter[more][]_value" name="filter[more][][value]">',$.each(a.values,function(a,b){return d+='<option value="'+b+'">'+b+"</option>"}),d+="</select>"):d='<input type="text" name="filter[more][][value]" value="" placeholder="value">',b.parents("div.filter_block").find("div.filter_values").html(d);if("date"===b.val())return b.parents("div.filter_block").find("div.filter_values input").datepicker({dateFormat:"yy-mm-dd",changeMonth:!0,changeYear:!0,yearRange:"c-50:c+10"})}}),!1}),$(document).on("click",".close_more_filter",function(a){return $(a.target).parents("li").remove(),!1}),$(document).on("click","li.message_tab",function(a){var b,c;b=$(a.target),c=b.attr("data-tab");if(c!=null)return $("li.message_tab").removeClass("active"),$("pre.tab_content").addClass("hidden"),b.addClass("active"),$("."+c).removeClass("hidden")}),$(document).on("submit","#analyticForm",function(a){var b,c,d;return c=$("#analyticForm"),d=c.attr("action"),b=c.serializeArray(),$("#analyticData").load(d,b),!1}),$(document).on("keydown","*",function(a){console.log(a.keyCode);switch(a.keyCode){case 37:return MongodbLoggerMain.move_by_logs("begin");case 38:return MongodbLoggerMain.move_by_logs("up");case 39:return MongodbLoggerMain.move_by_logs("end");case 40:return MongodbLoggerMain.move_by_logs("down")}}),this.init_pjax(),this.init_on_pages()},init_pjax:function(){var a=this;return $("a[data-pjax]").pjax(),$("body").bind("pjax:start",function(){return $("#ajax_loader").show()}),$("body").bind("pjax:end",function(){return $("#ajax_loader").hide(),MongodbLoggerMain.tail_log_started=!1,$(window).scrollTop()>100&&$("html, body").stop().animate({scrollTop:0},"slow"),MongodbLoggerMain.init_on_pages()})},init_on_pages:function(){var a=this;$("pre code").each(function(a,b){return hljs.highlightBlock(b," ")}),$(".datepicker, .filter_values input.date").datepicker({dateFormat:"yy-mm-dd",changeMonth:!0,changeYear:!0,yearRange:"c-50:c+10"});if($("#log_info").length>0)return MongodbLoggerMain.log_info_offset=$("#log_info").offset(),$(window).scroll(function(){return $(window).scrollTop()>MongodbLoggerMain.log_info_offset.top?$("#log_info").stop().animate({marginTop:$(window).scrollTop()-MongodbLoggerMain.log_info_offset.top+MongodbLoggerMain.log_info_padding}):$("#log_info").stop().animate({marginTop:0})})},tail_logs:function(a){var b;b=MongodbLoggerMain.tail_logs_url,a!=null&&a.length>0?b=MongodbLoggerMain.tail_logs_url+"/"+a:(MongodbLoggerMain.tail_log_started=!0,a="");if(MongodbLoggerMain.tail_log_started)return $.ajax({url:b,dataType:"json",success:function(b){var c,d;b.time&&($("#tail_logs_time").text(b.time),b.log_last_id!=null&&(a=b.log_last_id),b.content!=null&&b.content.length>0&&(c=$(b.content),c.addClass("newlog"),$("#logs_list tr:first").after(c).effect("highlight",{},1e3)),b.collection_stats&&$("#collection_stats").length>0&&$("#collection_stats").html(b.collection_stats));if(MongodbLoggerMain.tail_log_started)return d=function(){return MongodbLoggerMain.tail_logs(a)},setTimeout(d,2e3)}})},move_by_logs:function(a){var b,c;if($("#logs_list").length>0&&$("#logs_list").find("tr.current").length>0){b=$("#logs_list").find("tr.current");switch(a){case"begin":c=$("#logs_list tr:first").next("tr");if(c.length>0)return c.find("td:first").trigger("click"),$(window).scrollTop(c.height()+c.offset().top-100),!1;break;case"end":c=$("#logs_list tr:last");if(c.length>0)return c.find("td:first").trigger("click"),$(window).scrollTop(c.height()+c.offset().top-100),!1;break;case"down":c=b.next("tr");if(c.length>0)return c.find("td:first").trigger("click"),MongodbLoggerMain.is_scrolled_into_view(c)?$(window).scrollTop($(window).scrollTop()+c.height()):$(window).scrollTop(c.height()+c.offset().top-100),!1;break;case"up":c=b.prev("tr");if(c.length>0)return c.find("td:first").trigger("click"),MongodbLoggerMain.is_scrolled_into_view(c)?$(window).scrollTop($(window).scrollTop()-c.height()):$(window).scrollTop(c.height()+c.offset().top-100),!1}}},is_scrolled_into_view:function(a){var b,c,d,e;return c=$(window).scrollTop(),b=c+$(window).height(),e=$(a).offset().top,d=e+$(a).height(),c<e&&b>d}}
@@ -3,9 +3,14 @@ require 'erb'
3
3
  require 'active_support'
4
4
  require 'active_support/core_ext'
5
5
 
6
+ # TODO: Dry this class with logger class
6
7
  module MongodbLogger
7
8
  class ServerConfig
9
+
10
+ DEFAULT_COLLECTION_SIZE = 250.megabytes
11
+
8
12
  class << self
13
+
9
14
  def set_config(config_path)
10
15
  if File.file?(config_path)
11
16
  config_file = File.new(config_path)
@@ -26,13 +31,40 @@ module MongodbLogger
26
31
  @authenticated = @db.authenticate(@db_configuration['username'],
27
32
  @db_configuration['password'])
28
33
  end
29
- @collection = @db[@db_configuration["collection"]]
34
+
35
+ set_collection
36
+ end
37
+
38
+ def set_config_for_testing(config_path)
39
+ set_config(config_path)
40
+ create_collection unless @db.collection_names.include?(@db_configuration["collection"])
41
+ set_collection
42
+ end
43
+
44
+ def create_collection
45
+ capsize = DEFAULT_COLLECTION_SIZE
46
+ capsize = @db_configuration['capsize'].to_i if @db_configuration['capsize']
47
+ @db.create_collection(@db_configuration["collection"],
48
+ {:capped => true, :size => capsize})
30
49
  end
31
50
 
51
+
52
+ def set_collection
53
+ @collection = @db[@db_configuration["collection"]]
54
+ end
55
+
32
56
  def get_config
33
57
  @db_configuration
34
58
  end
35
59
 
60
+ def authenticated?
61
+ @authenticated
62
+ end
63
+
64
+ def collection_name
65
+ @db_configuration["collection"]
66
+ end
67
+
36
68
  def db
37
69
  @db
38
70
  end
@@ -1,3 +1,3 @@
1
1
  module MongodbLogger
2
- VERSION = "0.2.3"
2
+ VERSION = "0.2.4"
3
3
  end
@@ -11,17 +11,19 @@ Gem::Specification.new do |gem|
11
11
  gem.extra_rdoc_files = [ "LICENSE", "README.md" ]
12
12
  gem.rdoc_options = ["--charset=UTF-8"]
13
13
 
14
- gem.add_development_dependency "rspec", "~> 2.7.0"
14
+ gem.add_development_dependency "jasmine", ">= 1.0.0"
15
+ gem.add_development_dependency "rspec", ">= 2.7.0"
15
16
  gem.add_development_dependency "shoulda", ">= 2.0.0"
16
- gem.add_development_dependency "mocha", "~> 0.10.0"
17
+ gem.add_development_dependency "mocha", ">= 0.10.0"
17
18
  gem.add_development_dependency "cucumber", "~> 1.1.2"
19
+ gem.add_development_dependency "capybara", "~> 1.1.2"
18
20
  gem.add_development_dependency "coffee-script", "~> 2.2.0"
19
- gem.add_development_dependency "uglifier", "~> 1.1.0"
20
- gem.add_development_dependency "therubyracer", "~> 0.9.9"
21
+ gem.add_development_dependency "uglifier", ">= 1.2.0"
22
+ gem.add_development_dependency "therubyracer", ">= 0.9.9"
21
23
 
22
24
  gem.add_runtime_dependency "rake", "~> 0.9.0"
23
- gem.add_runtime_dependency "mongo", "~> 1.4.0"
24
- gem.add_runtime_dependency "bson_ext", "~> 1.4.0"
25
+ gem.add_runtime_dependency "mongo", "~> 1.5.2"
26
+ gem.add_runtime_dependency "bson_ext", "~> 1.5.2"
25
27
  gem.add_runtime_dependency "i18n", ">= 0.4.1"
26
28
  gem.add_runtime_dependency "json", "~> 1.6.1"
27
29
  gem.add_runtime_dependency "activesupport", ">= 3.0.0"
@@ -0,0 +1,13 @@
1
+ describe("MongodbLoggerMain", function() {
2
+
3
+ beforeEach(function() {
4
+ MongodbLoggerMain.init();
5
+ });
6
+
7
+ describe("log_info_padding", function() {
8
+ it("should be 15", function() {
9
+ expect(MongodbLoggerMain.log_info_padding).toEqual(15);
10
+ });
11
+ });
12
+
13
+ });
@@ -0,0 +1,3 @@
1
+ beforeEach(function() {
2
+ /**/
3
+ });
@@ -0,0 +1,77 @@
1
+ # src_files
2
+ #
3
+ # Return an array of filepaths relative to src_dir to include before jasmine specs.
4
+ # Default: []
5
+ #
6
+ # EXAMPLE:
7
+ #
8
+ # src_files:
9
+ # - lib/source1.js
10
+ # - lib/source2.js
11
+ # - dist/**/*.js
12
+ #
13
+ src_files:
14
+ - lib/mongodb_logger/server/public/javascripts/vendors/jquery-1.7.1.min.js
15
+ - lib/mongodb_logger/server/public/javascripts/vendors/jquery-ui-1.8.16.min.js
16
+ - lib/mongodb_logger/server/public/javascripts/vendors/jquery.pjax.min.js
17
+ - lib/mongodb_logger/server/public/javascripts/vendors/highlight.pack.js
18
+ - lib/mongodb_logger/server/public/javascripts/logs.js
19
+
20
+ # stylesheets
21
+ #
22
+ # Return an array of stylesheet filepaths relative to src_dir to include before jasmine specs.
23
+ # Default: []
24
+ #
25
+ # EXAMPLE:
26
+ #
27
+ # stylesheets:
28
+ # - css/style.css
29
+ # - stylesheets/*.css
30
+ #
31
+ stylesheets:
32
+
33
+ # helpers
34
+ #
35
+ # Return an array of filepaths relative to spec_dir to include before jasmine specs.
36
+ # Default: ["helpers/**/*.js"]
37
+ #
38
+ # EXAMPLE:
39
+ #
40
+ # helpers:
41
+ # - helpers/**/*.js
42
+ #
43
+ helpers:
44
+
45
+ # spec_files
46
+ #
47
+ # Return an array of filepaths relative to spec_dir to include.
48
+ # Default: ["**/*[sS]pec.js"]
49
+ #
50
+ # EXAMPLE:
51
+ #
52
+ # spec_files:
53
+ # - **/*[sS]pec.js
54
+ #
55
+ spec_files:
56
+
57
+ # src_dir
58
+ #
59
+ # Source directory path. Your src_files must be returned relative to this path. Will use root if left blank.
60
+ # Default: project root
61
+ #
62
+ # EXAMPLE:
63
+ #
64
+ # src_dir: public
65
+ #
66
+ src_dir:
67
+
68
+ # spec_dir
69
+ #
70
+ # Spec directory path. Your spec_files must be returned relative to this path.
71
+ # Default: spec/javascripts
72
+ #
73
+ # EXAMPLE:
74
+ #
75
+ # spec_dir: spec/javascripts
76
+ #
77
+ spec_dir:
@@ -0,0 +1,23 @@
1
+ module Jasmine
2
+ class Config
3
+
4
+ # Add your overrides or custom config code here
5
+
6
+ end
7
+ end
8
+
9
+
10
+ # Note - this is necessary for rspec2, which has removed the backtrace
11
+ module Jasmine
12
+ class SpecBuilder
13
+ def declare_spec(parent, spec)
14
+ me = self
15
+ example_name = spec["name"]
16
+ @spec_ids << spec["id"]
17
+ backtrace = @example_locations[parent.description + " " + example_name]
18
+ parent.it example_name, {} do
19
+ me.report_spec(spec["id"])
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,32 @@
1
+ $:.unshift(ENV['JASMINE_GEM_PATH']) if ENV['JASMINE_GEM_PATH'] # for gem testing purposes
2
+
3
+ require 'rubygems'
4
+ require 'jasmine'
5
+ jasmine_config_overrides = File.expand_path(File.join(File.dirname(__FILE__), 'jasmine_config.rb'))
6
+ require jasmine_config_overrides if File.exist?(jasmine_config_overrides)
7
+ if Jasmine::Dependencies.rspec2?
8
+ require 'rspec'
9
+ else
10
+ require 'spec'
11
+ end
12
+
13
+ jasmine_config = Jasmine::Config.new
14
+ spec_builder = Jasmine::SpecBuilder.new(jasmine_config)
15
+
16
+ should_stop = false
17
+
18
+ if Jasmine::Dependencies.rspec2?
19
+ RSpec.configuration.after(:suite) do
20
+ spec_builder.stop if should_stop
21
+ end
22
+ else
23
+ Spec::Runner.configure do |config|
24
+ config.after(:suite) do
25
+ spec_builder.stop if should_stop
26
+ end
27
+ end
28
+ end
29
+
30
+ spec_builder.start
31
+ should_stop = true
32
+ spec_builder.declare_suites
@@ -0,0 +1,3 @@
1
+ database: test_database
2
+ host: localhost
3
+ port: 27017
data/test/test.sh CHANGED
@@ -1,4 +1,6 @@
1
1
  #!/bin/bash
2
- rake vendor_test_gems
3
- rake test
4
- rake cucumber:rails:all
2
+ rake vendor_test_gems && \
3
+ rake test && \
4
+ rake cucumber:web && \
5
+ rake jasmine:ci && \
6
+ rake cucumber:rails:all
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongodb_logger
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.2.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,22 +9,33 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-12-14 00:00:00.000000000 Z
12
+ date: 2011-12-20 00:00:00.000000000 Z
13
13
  dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: jasmine
16
+ requirement: &70120329105120 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 1.0.0
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *70120329105120
14
25
  - !ruby/object:Gem::Dependency
15
26
  name: rspec
16
- requirement: &7406740 !ruby/object:Gem::Requirement
27
+ requirement: &70120329104620 !ruby/object:Gem::Requirement
17
28
  none: false
18
29
  requirements:
19
- - - ~>
30
+ - - ! '>='
20
31
  - !ruby/object:Gem::Version
21
32
  version: 2.7.0
22
33
  type: :development
23
34
  prerelease: false
24
- version_requirements: *7406740
35
+ version_requirements: *70120329104620
25
36
  - !ruby/object:Gem::Dependency
26
37
  name: shoulda
27
- requirement: &6984860 !ruby/object:Gem::Requirement
38
+ requirement: &70120329104160 !ruby/object:Gem::Requirement
28
39
  none: false
29
40
  requirements:
30
41
  - - ! '>='
@@ -32,21 +43,21 @@ dependencies:
32
43
  version: 2.0.0
33
44
  type: :development
34
45
  prerelease: false
35
- version_requirements: *6984860
46
+ version_requirements: *70120329104160
36
47
  - !ruby/object:Gem::Dependency
37
48
  name: mocha
38
- requirement: &6983620 !ruby/object:Gem::Requirement
49
+ requirement: &70120329103700 !ruby/object:Gem::Requirement
39
50
  none: false
40
51
  requirements:
41
- - - ~>
52
+ - - ! '>='
42
53
  - !ruby/object:Gem::Version
43
54
  version: 0.10.0
44
55
  type: :development
45
56
  prerelease: false
46
- version_requirements: *6983620
57
+ version_requirements: *70120329103700
47
58
  - !ruby/object:Gem::Dependency
48
59
  name: cucumber
49
- requirement: &6981880 !ruby/object:Gem::Requirement
60
+ requirement: &70120328557240 !ruby/object:Gem::Requirement
50
61
  none: false
51
62
  requirements:
52
63
  - - ~>
@@ -54,10 +65,21 @@ dependencies:
54
65
  version: 1.1.2
55
66
  type: :development
56
67
  prerelease: false
57
- version_requirements: *6981880
68
+ version_requirements: *70120328557240
69
+ - !ruby/object:Gem::Dependency
70
+ name: capybara
71
+ requirement: &70120328549720 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ~>
75
+ - !ruby/object:Gem::Version
76
+ version: 1.1.2
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: *70120328549720
58
80
  - !ruby/object:Gem::Dependency
59
81
  name: coffee-script
60
- requirement: &6980620 !ruby/object:Gem::Requirement
82
+ requirement: &70120329142340 !ruby/object:Gem::Requirement
61
83
  none: false
62
84
  requirements:
63
85
  - - ~>
@@ -65,32 +87,32 @@ dependencies:
65
87
  version: 2.2.0
66
88
  type: :development
67
89
  prerelease: false
68
- version_requirements: *6980620
90
+ version_requirements: *70120329142340
69
91
  - !ruby/object:Gem::Dependency
70
92
  name: uglifier
71
- requirement: &6978960 !ruby/object:Gem::Requirement
93
+ requirement: &70120329141880 !ruby/object:Gem::Requirement
72
94
  none: false
73
95
  requirements:
74
- - - ~>
96
+ - - ! '>='
75
97
  - !ruby/object:Gem::Version
76
- version: 1.1.0
98
+ version: 1.2.0
77
99
  type: :development
78
100
  prerelease: false
79
- version_requirements: *6978960
101
+ version_requirements: *70120329141880
80
102
  - !ruby/object:Gem::Dependency
81
103
  name: therubyracer
82
- requirement: &6672600 !ruby/object:Gem::Requirement
104
+ requirement: &70120329141420 !ruby/object:Gem::Requirement
83
105
  none: false
84
106
  requirements:
85
- - - ~>
107
+ - - ! '>='
86
108
  - !ruby/object:Gem::Version
87
109
  version: 0.9.9
88
110
  type: :development
89
111
  prerelease: false
90
- version_requirements: *6672600
112
+ version_requirements: *70120329141420
91
113
  - !ruby/object:Gem::Dependency
92
114
  name: rake
93
- requirement: &6671100 !ruby/object:Gem::Requirement
115
+ requirement: &70120329140960 !ruby/object:Gem::Requirement
94
116
  none: false
95
117
  requirements:
96
118
  - - ~>
@@ -98,32 +120,32 @@ dependencies:
98
120
  version: 0.9.0
99
121
  type: :runtime
100
122
  prerelease: false
101
- version_requirements: *6671100
123
+ version_requirements: *70120329140960
102
124
  - !ruby/object:Gem::Dependency
103
125
  name: mongo
104
- requirement: &6668340 !ruby/object:Gem::Requirement
126
+ requirement: &70120329140500 !ruby/object:Gem::Requirement
105
127
  none: false
106
128
  requirements:
107
129
  - - ~>
108
130
  - !ruby/object:Gem::Version
109
- version: 1.4.0
131
+ version: 1.5.2
110
132
  type: :runtime
111
133
  prerelease: false
112
- version_requirements: *6668340
134
+ version_requirements: *70120329140500
113
135
  - !ruby/object:Gem::Dependency
114
136
  name: bson_ext
115
- requirement: &6663080 !ruby/object:Gem::Requirement
137
+ requirement: &70120329140040 !ruby/object:Gem::Requirement
116
138
  none: false
117
139
  requirements:
118
140
  - - ~>
119
141
  - !ruby/object:Gem::Version
120
- version: 1.4.0
142
+ version: 1.5.2
121
143
  type: :runtime
122
144
  prerelease: false
123
- version_requirements: *6663080
145
+ version_requirements: *70120329140040
124
146
  - !ruby/object:Gem::Dependency
125
147
  name: i18n
126
- requirement: &6661080 !ruby/object:Gem::Requirement
148
+ requirement: &70120329139580 !ruby/object:Gem::Requirement
127
149
  none: false
128
150
  requirements:
129
151
  - - ! '>='
@@ -131,10 +153,10 @@ dependencies:
131
153
  version: 0.4.1
132
154
  type: :runtime
133
155
  prerelease: false
134
- version_requirements: *6661080
156
+ version_requirements: *70120329139580
135
157
  - !ruby/object:Gem::Dependency
136
158
  name: json
137
- requirement: &6658000 !ruby/object:Gem::Requirement
159
+ requirement: &70120329139120 !ruby/object:Gem::Requirement
138
160
  none: false
139
161
  requirements:
140
162
  - - ~>
@@ -142,10 +164,10 @@ dependencies:
142
164
  version: 1.6.1
143
165
  type: :runtime
144
166
  prerelease: false
145
- version_requirements: *6658000
167
+ version_requirements: *70120329139120
146
168
  - !ruby/object:Gem::Dependency
147
169
  name: activesupport
148
- requirement: &6653380 !ruby/object:Gem::Requirement
170
+ requirement: &70120329138660 !ruby/object:Gem::Requirement
149
171
  none: false
150
172
  requirements:
151
173
  - - ! '>='
@@ -153,10 +175,10 @@ dependencies:
153
175
  version: 3.0.0
154
176
  type: :runtime
155
177
  prerelease: false
156
- version_requirements: *6653380
178
+ version_requirements: *70120329138660
157
179
  - !ruby/object:Gem::Dependency
158
180
  name: actionpack
159
- requirement: &6651760 !ruby/object:Gem::Requirement
181
+ requirement: &70120329138200 !ruby/object:Gem::Requirement
160
182
  none: false
161
183
  requirements:
162
184
  - - ! '>='
@@ -164,10 +186,10 @@ dependencies:
164
186
  version: 3.0.0
165
187
  type: :runtime
166
188
  prerelease: false
167
- version_requirements: *6651760
189
+ version_requirements: *70120329138200
168
190
  - !ruby/object:Gem::Dependency
169
191
  name: sinatra
170
- requirement: &6650220 !ruby/object:Gem::Requirement
192
+ requirement: &70120329137740 !ruby/object:Gem::Requirement
171
193
  none: false
172
194
  requirements:
173
195
  - - ! '>='
@@ -175,10 +197,10 @@ dependencies:
175
197
  version: 1.2.0
176
198
  type: :runtime
177
199
  prerelease: false
178
- version_requirements: *6650220
200
+ version_requirements: *70120329137740
179
201
  - !ruby/object:Gem::Dependency
180
202
  name: erubis
181
- requirement: &6649140 !ruby/object:Gem::Requirement
203
+ requirement: &70120329137280 !ruby/object:Gem::Requirement
182
204
  none: false
183
205
  requirements:
184
206
  - - ! '>='
@@ -186,10 +208,10 @@ dependencies:
186
208
  version: 2.6.6
187
209
  type: :runtime
188
210
  prerelease: false
189
- version_requirements: *6649140
211
+ version_requirements: *70120329137280
190
212
  - !ruby/object:Gem::Dependency
191
213
  name: vegas
192
- requirement: &6648360 !ruby/object:Gem::Requirement
214
+ requirement: &70120329136820 !ruby/object:Gem::Requirement
193
215
  none: false
194
216
  requirements:
195
217
  - - ~>
@@ -197,7 +219,7 @@ dependencies:
197
219
  version: 0.1.2
198
220
  type: :runtime
199
221
  prerelease: false
200
- version_requirements: *6648360
222
+ version_requirements: *70120329136820
201
223
  description: MongoDB logger for Rails 3
202
224
  email:
203
225
  - leopard.not.a@gmail.com
@@ -221,7 +243,9 @@ files:
221
243
  - bin/mongodb_logger_web
222
244
  - config.ru
223
245
  - examples/server_config.yml
246
+ - features/mongodb_logger_web.feature
224
247
  - features/rails.feature
248
+ - features/step_definitions/mongodb_logger_web_steps.rb
225
249
  - features/step_definitions/rails_application_steps.rb
226
250
  - features/support/env.rb
227
251
  - features/support/rails.rb
@@ -300,6 +324,11 @@ files:
300
324
  - lib/mongodb_logger/server_config.rb
301
325
  - lib/mongodb_logger/version.rb
302
326
  - mongodb_logger.gemspec
327
+ - spec/javascripts/MongodbLoggerMainSpec.js
328
+ - spec/javascripts/helpers/SpecHelper.js
329
+ - spec/javascripts/support/jasmine.yml
330
+ - spec/javascripts/support/jasmine_config.rb
331
+ - spec/javascripts/support/jasmine_runner.rb
303
332
  - test/active_record.rb
304
333
  - test/config/samples/database.yml
305
334
  - test/config/samples/database_no_file_logging.yml
@@ -308,6 +337,7 @@ files:
308
337
  - test/config/samples/database_with_collection.yml
309
338
  - test/config/samples/mongodb_logger.yml
310
339
  - test/config/samples/mongoid.yml
340
+ - test/config/samples/server_config.yml
311
341
  - test/rails.rb
312
342
  - test/rails/app/controllers/order_controller.rb
313
343
  - test/rails/test/functional/order_controller_test.rb
@@ -342,4 +372,34 @@ rubygems_version: 1.8.10
342
372
  signing_key:
343
373
  specification_version: 3
344
374
  summary: MongoDB logger for Rails 3
345
- test_files: []
375
+ test_files:
376
+ - features/mongodb_logger_web.feature
377
+ - features/rails.feature
378
+ - features/step_definitions/mongodb_logger_web_steps.rb
379
+ - features/step_definitions/rails_application_steps.rb
380
+ - features/support/env.rb
381
+ - features/support/rails.rb
382
+ - features/support/terminal.rb
383
+ - spec/javascripts/MongodbLoggerMainSpec.js
384
+ - spec/javascripts/helpers/SpecHelper.js
385
+ - spec/javascripts/support/jasmine.yml
386
+ - spec/javascripts/support/jasmine_config.rb
387
+ - spec/javascripts/support/jasmine_runner.rb
388
+ - test/active_record.rb
389
+ - test/config/samples/database.yml
390
+ - test/config/samples/database_no_file_logging.yml
391
+ - test/config/samples/database_replica_set.yml
392
+ - test/config/samples/database_with_auth.yml
393
+ - test/config/samples/database_with_collection.yml
394
+ - test/config/samples/mongodb_logger.yml
395
+ - test/config/samples/mongoid.yml
396
+ - test/config/samples/server_config.yml
397
+ - test/rails.rb
398
+ - test/rails/app/controllers/order_controller.rb
399
+ - test/rails/test/functional/order_controller_test.rb
400
+ - test/rails/test/test_helper.rb
401
+ - test/shoulda_macros/log_macros.rb
402
+ - test/test.sh
403
+ - test/test_helper.rb
404
+ - test/unit/mongodb_logger_replica_test.rb
405
+ - test/unit/mongodb_logger_test.rb