mongodb_logger 0.1.1 → 0.1.2

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/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) Alexey Vasiliev
2
+
3
+ Permission is hereby granted, free of charge, to any person
4
+ obtaining a copy of this software and associated documentation
5
+ files (the "Software"), to deal in the Software without
6
+ restriction, including without limitation the rights to use,
7
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ copies of the Software, and to permit persons to whom the
9
+ Software is furnished to do so, subject to the following
10
+ conditions:
11
+
12
+ The above copyright notice and this permission notice shall be
13
+ included in all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
17
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
19
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
20
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22
+ OTHER DEALINGS IN THE SOFTWARE.
data/README.md CHANGED
@@ -122,12 +122,14 @@ It:
122
122
 
123
123
  mongodb_logger_web config.yml -p 8282
124
124
 
125
- ### Passenger
125
+ ### Passenger, Unicorn, Thin, etc.
126
126
 
127
- Using Passenger? MongodbLogger ships with a `config.ru` you can use. See Phusion's guide:
127
+ Using Passenger, Unicorn, Thin, etc? MongodbLogger ships with a `config.ru` you can use. See guide:
128
128
 
129
- * Apache: <http://www.modrails.com/documentation/Users%20guide%20Apache.html#_deploying_a_rack_based_ruby_application>
130
- * Nginx: <http://www.modrails.com/documentation/Users%20guide%20Nginx.html#deploying_a_rack_app>
129
+ * Passenger Apache: <http://www.modrails.com/documentation/Users%20guide%20Apache.html#_deploying_a_rack_based_ruby_application>
130
+ * Passenger Nginx: <http://www.modrails.com/documentation/Users%20guide%20Nginx.html#deploying_a_rack_app>
131
+ * Unicorn: <http://unicorn.bogomips.org>
132
+ * Thin: <http://code.macournoyer.com/thin/usage>
131
133
 
132
134
  Don't forget setup MONGODBLOGGERCONFIG env variable, which provide information about MongodbLogger config. Example starting with unicorn:
133
135
 
data/Rakefile CHANGED
@@ -11,6 +11,34 @@ end
11
11
  require "bundler/gem_tasks"
12
12
 
13
13
 
14
+ #########################################
15
+ ### Help tasks
16
+ #########################################
17
+
18
+ require 'coffee-script'
19
+ namespace :js do
20
+ desc "compile coffee-scripts from ./lib/mongodb_logger/server/coffee to ./lib/mongodb_logger/server/public/javascripts"
21
+ task :compile do
22
+ source = "#{File.dirname(__FILE__)}/lib/mongodb_logger/server/coffee/"
23
+ javascripts = "#{File.dirname(__FILE__)}/lib/mongodb_logger/server/public/javascripts/"
24
+
25
+ Dir.foreach(source) do |cf|
26
+ unless cf == '.' || cf == '..'
27
+ js = CoffeeScript.compile File.read("#{source}#{cf}")
28
+ open "#{javascripts}#{cf.gsub('.coffee', '.js')}", 'w' do |f|
29
+ f.puts js
30
+ end
31
+ end
32
+ end
33
+
34
+ puts "All done."
35
+ end
36
+ end
37
+
38
+ #########################################
39
+ ### TESTS
40
+ #########################################
41
+
14
42
  desc 'Default: run unit tests.'
15
43
  task :default => [:test]
16
44
  #task :default => [:test, "cucumber:rails:all"]
data/config.ru CHANGED
@@ -8,9 +8,10 @@ require 'mongodb_logger/server'
8
8
  # config file you want loaded on boot.
9
9
  if ENV['MONGODBLOGGERCONFIG'] && ::File.exists?(::File.expand_path(ENV['MONGODBLOGGERCONFIG']))
10
10
  MongodbLogger::ServerConfig.set_config(::File.expand_path(ENV['MONGODBLOGGERCONFIG']))
11
+ use Rack::ShowExceptions
12
+ run MongodbLogger::Server.new
11
13
  else
12
14
  raise "Please provide config file"
15
+ exit 1
13
16
  end
14
17
 
15
- use Rack::ShowExceptions
16
- run MongodbLogger::Server.new
@@ -7,4 +7,6 @@ Feature: Install the Gem in a Rails application and test it
7
7
  When I generate a new Rails application
8
8
  And I configure my application to require the "mongodb_logger" gem
9
9
  And I setup mongodb_logger tests
10
+ And I setup all gems for rails
11
+ And I prepare rails environment for testing
10
12
  Then the tests should have run successfully
@@ -32,12 +32,19 @@ When /^I setup mongodb_logger tests$/ do
32
32
  add_routes
33
33
  end
34
34
 
35
- Then /^the tests should have run successfully$/ do
35
+ When /^I setup all gems for rails$/ do
36
36
  bundle_gem("therubyracer", nil) if rails31?
37
37
  step %{I run "bundle install"}
38
38
  @terminal.status.exitstatus.should == 0
39
+ end
40
+
41
+ When /^I prepare rails environment for testing$/ do
39
42
  step %{I run "rake db:create db:migrate RAILS_ENV=test --trace"}
40
43
  @terminal.status.exitstatus.should == 0
44
+ end
45
+
46
+
47
+ Then /^the tests should have run successfully$/ do
41
48
  step %{I run "rake test RAILS_ENV=test --trace"}
42
49
  @terminal.status.exitstatus.should == 0
43
50
  end
@@ -43,19 +43,25 @@ module MongodbLogger
43
43
  end
44
44
 
45
45
  def add(severity, message = nil, progname = nil, &block)
46
- if @level <= severity && message.present? && @mongo_record.present?
46
+ if @level && @level <= severity && message.present? && @mongo_record.present?
47
47
  # do not modify the original message used by the buffered logger
48
48
  msg = logging_colorized? ? message.to_s.gsub(/(\e(\[([\d;]*[mz]?))?)?/, '').strip : message
49
49
  @mongo_record[:messages][LOG_LEVEL_SYM[severity]] << msg
50
50
  end
51
51
  # may modify the original message
52
- disable_file_logging? ? message : super
52
+ disable_file_logging? ? message : (@level ? super : message)
53
53
  end
54
54
 
55
55
  # Drop the capped_collection and recreate it
56
56
  def reset_collection
57
- @mongo_collection.drop
58
- create_collection
57
+ if @mongo_connection && @mongo_collection
58
+ @mongo_collection.drop
59
+ create_collection
60
+ end
61
+ end
62
+
63
+ def flush
64
+ # do nothing
59
65
  end
60
66
 
61
67
  def mongoize(options={})
@@ -1,6 +1,9 @@
1
1
  require 'sinatra/base'
2
2
  require 'erubis'
3
3
  require 'json'
4
+ require 'active_support'
5
+
6
+ require 'mongodb_logger/server/view_helpers'
4
7
  require 'mongodb_logger/server/partials'
5
8
  require 'mongodb_logger/server/model/filter'
6
9
  require 'mongodb_logger/server_config'
@@ -11,6 +14,7 @@ end
11
14
 
12
15
  module MongodbLogger
13
16
  class Server < Sinatra::Base
17
+ helpers Sinatra::ViewHelpers
14
18
  helpers Sinatra::Partials
15
19
 
16
20
  dir = File.dirname(File.expand_path(__FILE__))
@@ -22,7 +26,7 @@ module MongodbLogger
22
26
  else
23
27
  set :public, "#{dir}/server/public"
24
28
  end
25
-
29
+ set :environment, :production
26
30
  set :static, true
27
31
 
28
32
  helpers do
@@ -42,19 +46,6 @@ module MongodbLogger
42
46
  request.env['SCRIPT_NAME']
43
47
  end
44
48
 
45
- def get_field_val(key)
46
- return MongodbLogger::ServerModel::Filter::DEFAULT_LIMIT if !@filter_model && "limit" == key
47
- @filter_model ? @filter_model.get_val(key) : nil
48
- end
49
-
50
- def select_tag(name, values, selected = nil)
51
- selector = ["<select name=#{name}>"]
52
- values.each do |val|
53
- selector << "<option value='#{val}' #{"selected='selected'" if val.to_s == selected.to_s}>#{val}</option>"
54
- end
55
- selector << "</select>"
56
- selector.join("\n")
57
- end
58
49
  end
59
50
 
60
51
  before do
@@ -70,10 +61,11 @@ module MongodbLogger
70
61
  erb :error, {:layout => false}, :error => "Can't connect to MongoDB!"
71
62
  return false
72
63
  end
64
+
65
+ cache_control :private, :must_revalidate, :max_age => 0
73
66
  end
74
67
 
75
68
  def show(page, layout = true)
76
- response["Cache-Control"] = "max-age=0, private, must-revalidate"
77
69
  begin
78
70
  erb page.to_sym, {:layout => layout}
79
71
  rescue => e
@@ -88,13 +80,8 @@ module MongodbLogger
88
80
 
89
81
  %w( overview ).each do |page|
90
82
  get "/#{page}/?" do
91
- if params[:f]
92
- @filter_model = MongodbLogger::ServerModel::Filter.new(params[:f])
93
- @logs = @collection.find(@filter_model.get_conditions).limit(@filter_model.get_limit)
94
- else
95
- @logs = @collection.find.limit(MongodbLogger::ServerModel::Filter::DEFAULT_LIMIT)
96
- end
97
- @logs = @logs.sort('$natural', -1)
83
+ @filter = MongodbLogger::ServerModel::Filter.new(params[:filter])
84
+ @logs = @collection.find(@filter.get_mongo_conditions).sort('$natural', -1).limit(@filter.get_mongo_limit)
98
85
  show page
99
86
  end
100
87
  end
@@ -126,11 +113,9 @@ module MongodbLogger
126
113
  partial(:"shared/log_info", :object => @log)
127
114
  end
128
115
 
129
- # application js
130
- get '/application.js' do
131
- content_type 'text/javascript'
132
- coffee :application
116
+ error do
117
+ erb :error, {:layout => false}, :error => 'Sorry there was a nasty error. Maybe no connection to MongoDB. Debug: ' + env['sinatra.error'].inspect
133
118
  end
134
119
 
135
120
  end
136
- end
121
+ end
@@ -43,12 +43,13 @@ MongodbLoggerJS =
43
43
  url: url
44
44
  dataType: "json"
45
45
  success: (data) ->
46
- if count != data.count
47
- if data.content? && data.content.length > 0
48
- $('#logs_list tr:first').after(data.content)
49
- count = data.count
50
46
  if data.time
51
47
  $('#tail_logs_time').text(data.time)
48
+ if count != data.count
49
+ count = data.count
50
+ if data.content? && data.content.length > 0
51
+ data.content += '<tr class="tail_date"><td colspan="6">' + data.time + '</td></tr>'
52
+ $('#logs_list tr:first').after(data.content).effect("highlight", {}, 1000)
52
53
  if MongodbLoggerJS.tail_log_started
53
54
  fcallback = -> MongodbLoggerJS.tail_logs(count)
54
55
  setTimeout fcallback, 2000
@@ -4,32 +4,47 @@ module MongodbLogger
4
4
 
5
5
  DEFAULT_LIMIT = 2000
6
6
  FIXED_PARAMS = ['action', 'controller', 'ip', 'application_name']
7
- attr_reader :params, :mongo_conditions
7
+ attr_reader :params, :mongo_conditions, :mongo_limit
8
8
 
9
9
  def initialize(params)
10
+ if params.nil?
11
+ params = Hash.new
12
+ FIXED_PARAMS.each do |key|
13
+ params[key] = nil
14
+ end
15
+ end
10
16
  @params = params
17
+ params.each do |k,v|
18
+ self.instance_variable_set("@#{k}", v) ## create instance variable
19
+ self.class.send(:define_method, k, proc{self.instance_variable_get("@#{k}")}) ## method to return instance variable
20
+ self.class.send(:define_method, "#{k}=", proc{|v| self.instance_variable_set("@#{k}", v)}) ## method to set instance variable
21
+ end
11
22
  build_mongo_conditions
12
23
  end
13
24
 
14
25
  def build_mongo_conditions
15
26
  @mongo_conditions = Hash.new
16
27
  FIXED_PARAMS.each do |param_key|
17
- @mongo_conditions[param_key] = @params[param_key] unless @params[param_key].blank?
28
+ if self.respond_to?(param_key)
29
+ value = self.send param_key
30
+ @mongo_conditions[param_key.to_s] = value unless value.blank?
31
+ end
18
32
  end
33
+ # set limit
34
+ @mongo_limit = DEFAULT_LIMIT
35
+ @mongo_limit = self.limit if self.respond_to?("limit")
19
36
  end
20
37
 
21
- def get_conditions
38
+ def get_mongo_conditions
22
39
  @mongo_conditions
23
40
  end
24
41
 
25
- def get_val(key)
26
- (@params[key] && !@params[key].blank?) ? @params[key] : nil
42
+ def get_mongo_limit
43
+ @mongo_limit
27
44
  end
28
45
 
29
- def get_limit
30
- limit = @params['limit'].to_i
31
- limit = DEFAULT_LIMIT if !limit || (limit && (limit < 1 || limit > 10000))
32
- limit
46
+ def form_name
47
+ "filter"
33
48
  end
34
49
 
35
50
  end
@@ -0,0 +1,80 @@
1
+ (function() {
2
+ var MongodbLoggerJS;
3
+
4
+ $(function() {
5
+ return MongodbLoggerJS.init();
6
+ });
7
+
8
+ MongodbLoggerJS = {
9
+ tail_logs_url: null,
10
+ tail_log_started: false,
11
+ init: function() {
12
+ var _this = this;
13
+ $(document).ajaxStart(function() {
14
+ return $('#ajax_loader').show();
15
+ });
16
+ $(document).ajaxStop(function() {
17
+ return $('#ajax_loader').hide();
18
+ });
19
+ $('#tail_logs_link').live('click', function(event) {
20
+ MongodbLoggerJS.tail_logs_url = $(event.target).attr('data-url');
21
+ $('#tail_logs_block').addClass('started');
22
+ MongodbLoggerJS.tail_logs(null);
23
+ return false;
24
+ });
25
+ $('#tail_logs_stop_link').live('click', function(event) {
26
+ MongodbLoggerJS.tail_log_started = false;
27
+ $('#tail_logs_block').removeClass('started');
28
+ return false;
29
+ });
30
+ return $('.log_info').live('click', function(event) {
31
+ var elm_obj, url;
32
+ elm_obj = $(event.target);
33
+ url = elm_obj.attr('data-url');
34
+ if (!(url != null)) url = elm_obj.parents('tr').attr('data-url');
35
+ if (url != null) {
36
+ elm_obj.parents('table').find('tr').removeClass('current');
37
+ elm_obj.parents('tr').addClass('current');
38
+ $('#log_info').load(url);
39
+ }
40
+ return false;
41
+ });
42
+ },
43
+ tail_logs: function(count) {
44
+ var url;
45
+ url = MongodbLoggerJS.tail_logs_url;
46
+ if (count != null) {
47
+ url = MongodbLoggerJS.tail_logs_url + "/" + count;
48
+ } else {
49
+ MongodbLoggerJS.tail_log_started = true;
50
+ count = 0;
51
+ }
52
+ if (MongodbLoggerJS.tail_log_started) {
53
+ return $.ajax({
54
+ url: url,
55
+ dataType: "json",
56
+ success: function(data) {
57
+ var fcallback;
58
+ if (data.time) {
59
+ $('#tail_logs_time').text(data.time);
60
+ if (count !== data.count) {
61
+ count = data.count;
62
+ if ((data.content != null) && data.content.length > 0) {
63
+ data.content += '<tr class="tail_date"><td colspan="6">' + data.time + '</td></tr>';
64
+ $('#logs_list tr:first').after(data.content).effect("highlight", {}, 1000);
65
+ }
66
+ }
67
+ }
68
+ if (MongodbLoggerJS.tail_log_started) {
69
+ fcallback = function() {
70
+ return MongodbLoggerJS.tail_logs(count);
71
+ };
72
+ return setTimeout(fcallback, 2000);
73
+ }
74
+ }
75
+ });
76
+ }
77
+ }
78
+ };
79
+
80
+ }).call(this);
@@ -0,0 +1,221 @@
1
+ /*
2
+ * jQuery UI Effects 1.8.16
3
+ *
4
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
5
+ * Dual licensed under the MIT or GPL Version 2 licenses.
6
+ * http://jquery.org/license
7
+ *
8
+ * http://docs.jquery.com/UI/Effects/
9
+ */
10
+ jQuery.effects||function(f,j){function m(c){var a;if(c&&c.constructor==Array&&c.length==3)return c;if(a=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(c))return[parseInt(a[1],10),parseInt(a[2],10),parseInt(a[3],10)];if(a=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(c))return[parseFloat(a[1])*2.55,parseFloat(a[2])*2.55,parseFloat(a[3])*2.55];if(a=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(c))return[parseInt(a[1],
11
+ 16),parseInt(a[2],16),parseInt(a[3],16)];if(a=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(c))return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16)];if(/rgba\(0, 0, 0, 0\)/.exec(c))return n.transparent;return n[f.trim(c).toLowerCase()]}function s(c,a){var b;do{b=f.curCSS(c,a);if(b!=""&&b!="transparent"||f.nodeName(c,"body"))break;a="backgroundColor"}while(c=c.parentNode);return m(b)}function o(){var c=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle,
12
+ a={},b,d;if(c&&c.length&&c[0]&&c[c[0]])for(var e=c.length;e--;){b=c[e];if(typeof c[b]=="string"){d=b.replace(/\-(\w)/g,function(g,h){return h.toUpperCase()});a[d]=c[b]}}else for(b in c)if(typeof c[b]==="string")a[b]=c[b];return a}function p(c){var a,b;for(a in c){b=c[a];if(b==null||f.isFunction(b)||a in t||/scrollbar/.test(a)||!/color/i.test(a)&&isNaN(parseFloat(b)))delete c[a]}return c}function u(c,a){var b={_:0},d;for(d in a)if(c[d]!=a[d])b[d]=a[d];return b}function k(c,a,b,d){if(typeof c=="object"){d=
13
+ a;b=null;a=c;c=a.effect}if(f.isFunction(a)){d=a;b=null;a={}}if(typeof a=="number"||f.fx.speeds[a]){d=b;b=a;a={}}if(f.isFunction(b)){d=b;b=null}a=a||{};b=b||a.duration;b=f.fx.off?0:typeof b=="number"?b:b in f.fx.speeds?f.fx.speeds[b]:f.fx.speeds._default;d=d||a.complete;return[c,a,b,d]}function l(c){if(!c||typeof c==="number"||f.fx.speeds[c])return true;if(typeof c==="string"&&!f.effects[c])return true;return false}f.effects={};f.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor",
14
+ "borderTopColor","borderColor","color","outlineColor"],function(c,a){f.fx.step[a]=function(b){if(!b.colorInit){b.start=s(b.elem,a);b.end=m(b.end);b.colorInit=true}b.elem.style[a]="rgb("+Math.max(Math.min(parseInt(b.pos*(b.end[0]-b.start[0])+b.start[0],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[1]-b.start[1])+b.start[1],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[2]-b.start[2])+b.start[2],10),255),0)+")"}});var n={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,
15
+ 0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,
16
+ 211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},q=["add","remove","toggle"],t={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};f.effects.animateClass=function(c,a,b,
17
+ d){if(f.isFunction(b)){d=b;b=null}return this.queue(function(){var e=f(this),g=e.attr("style")||" ",h=p(o.call(this)),r,v=e.attr("class");f.each(q,function(w,i){c[i]&&e[i+"Class"](c[i])});r=p(o.call(this));e.attr("class",v);e.animate(u(h,r),{queue:false,duration:a,easing:b,complete:function(){f.each(q,function(w,i){c[i]&&e[i+"Class"](c[i])});if(typeof e.attr("style")=="object"){e.attr("style").cssText="";e.attr("style").cssText=g}else e.attr("style",g);d&&d.apply(this,arguments);f.dequeue(this)}})})};
18
+ f.fn.extend({_addClass:f.fn.addClass,addClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{add:c},a,b,d]):this._addClass(c)},_removeClass:f.fn.removeClass,removeClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{remove:c},a,b,d]):this._removeClass(c)},_toggleClass:f.fn.toggleClass,toggleClass:function(c,a,b,d,e){return typeof a=="boolean"||a===j?b?f.effects.animateClass.apply(this,[a?{add:c}:{remove:c},b,d,e]):this._toggleClass(c,a):f.effects.animateClass.apply(this,
19
+ [{toggle:c},a,b,d])},switchClass:function(c,a,b,d,e){return f.effects.animateClass.apply(this,[{add:a,remove:c},b,d,e])}});f.extend(f.effects,{version:"1.8.16",save:function(c,a){for(var b=0;b<a.length;b++)a[b]!==null&&c.data("ec.storage."+a[b],c[0].style[a[b]])},restore:function(c,a){for(var b=0;b<a.length;b++)a[b]!==null&&c.css(a[b],c.data("ec.storage."+a[b]))},setMode:function(c,a){if(a=="toggle")a=c.is(":hidden")?"show":"hide";return a},getBaseline:function(c,a){var b;switch(c[0]){case "top":b=
20
+ 0;break;case "middle":b=0.5;break;case "bottom":b=1;break;default:b=c[0]/a.height}switch(c[1]){case "left":c=0;break;case "center":c=0.5;break;case "right":c=1;break;default:c=c[1]/a.width}return{x:c,y:b}},createWrapper:function(c){if(c.parent().is(".ui-effects-wrapper"))return c.parent();var a={width:c.outerWidth(true),height:c.outerHeight(true),"float":c.css("float")},b=f("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),
21
+ d=document.activeElement;c.wrap(b);if(c[0]===d||f.contains(c[0],d))f(d).focus();b=c.parent();if(c.css("position")=="static"){b.css({position:"relative"});c.css({position:"relative"})}else{f.extend(a,{position:c.css("position"),zIndex:c.css("z-index")});f.each(["top","left","bottom","right"],function(e,g){a[g]=c.css(g);if(isNaN(parseInt(a[g],10)))a[g]="auto"});c.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})}return b.css(a).show()},removeWrapper:function(c){var a,b=document.activeElement;
22
+ if(c.parent().is(".ui-effects-wrapper")){a=c.parent().replaceWith(c);if(c[0]===b||f.contains(c[0],b))f(b).focus();return a}return c},setTransition:function(c,a,b,d){d=d||{};f.each(a,function(e,g){unit=c.cssUnit(g);if(unit[0]>0)d[g]=unit[0]*b+unit[1]});return d}});f.fn.extend({effect:function(c){var a=k.apply(this,arguments),b={options:a[1],duration:a[2],callback:a[3]};a=b.options.mode;var d=f.effects[c];if(f.fx.off||!d)return a?this[a](b.duration,b.callback):this.each(function(){b.callback&&b.callback.call(this)});
23
+ return d.call(this,b)},_show:f.fn.show,show:function(c){if(l(c))return this._show.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="show";return this.effect.apply(this,a)}},_hide:f.fn.hide,hide:function(c){if(l(c))return this._hide.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="hide";return this.effect.apply(this,a)}},__toggle:f.fn.toggle,toggle:function(c){if(l(c)||typeof c==="boolean"||f.isFunction(c))return this.__toggle.apply(this,arguments);else{var a=k.apply(this,
24
+ arguments);a[1].mode="toggle";return this.effect.apply(this,a)}},cssUnit:function(c){var a=this.css(c),b=[];f.each(["em","px","%","pt"],function(d,e){if(a.indexOf(e)>0)b=[parseFloat(a),e]});return b}});f.easing.jswing=f.easing.swing;f.extend(f.easing,{def:"easeOutQuad",swing:function(c,a,b,d,e){return f.easing[f.easing.def](c,a,b,d,e)},easeInQuad:function(c,a,b,d,e){return d*(a/=e)*a+b},easeOutQuad:function(c,a,b,d,e){return-d*(a/=e)*(a-2)+b},easeInOutQuad:function(c,a,b,d,e){if((a/=e/2)<1)return d/
25
+ 2*a*a+b;return-d/2*(--a*(a-2)-1)+b},easeInCubic:function(c,a,b,d,e){return d*(a/=e)*a*a+b},easeOutCubic:function(c,a,b,d,e){return d*((a=a/e-1)*a*a+1)+b},easeInOutCubic:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a+b;return d/2*((a-=2)*a*a+2)+b},easeInQuart:function(c,a,b,d,e){return d*(a/=e)*a*a*a+b},easeOutQuart:function(c,a,b,d,e){return-d*((a=a/e-1)*a*a*a-1)+b},easeInOutQuart:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a+b;return-d/2*((a-=2)*a*a*a-2)+b},easeInQuint:function(c,a,b,
26
+ d,e){return d*(a/=e)*a*a*a*a+b},easeOutQuint:function(c,a,b,d,e){return d*((a=a/e-1)*a*a*a*a+1)+b},easeInOutQuint:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a*a+b;return d/2*((a-=2)*a*a*a*a+2)+b},easeInSine:function(c,a,b,d,e){return-d*Math.cos(a/e*(Math.PI/2))+d+b},easeOutSine:function(c,a,b,d,e){return d*Math.sin(a/e*(Math.PI/2))+b},easeInOutSine:function(c,a,b,d,e){return-d/2*(Math.cos(Math.PI*a/e)-1)+b},easeInExpo:function(c,a,b,d,e){return a==0?b:d*Math.pow(2,10*(a/e-1))+b},easeOutExpo:function(c,
27
+ a,b,d,e){return a==e?b+d:d*(-Math.pow(2,-10*a/e)+1)+b},easeInOutExpo:function(c,a,b,d,e){if(a==0)return b;if(a==e)return b+d;if((a/=e/2)<1)return d/2*Math.pow(2,10*(a-1))+b;return d/2*(-Math.pow(2,-10*--a)+2)+b},easeInCirc:function(c,a,b,d,e){return-d*(Math.sqrt(1-(a/=e)*a)-1)+b},easeOutCirc:function(c,a,b,d,e){return d*Math.sqrt(1-(a=a/e-1)*a)+b},easeInOutCirc:function(c,a,b,d,e){if((a/=e/2)<1)return-d/2*(Math.sqrt(1-a*a)-1)+b;return d/2*(Math.sqrt(1-(a-=2)*a)+1)+b},easeInElastic:function(c,a,b,
28
+ d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/h);return-(h*Math.pow(2,10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g))+b},easeOutElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/h);return h*Math.pow(2,-10*a)*Math.sin((a*e-c)*2*Math.PI/g)+d+b},easeInOutElastic:function(c,a,b,d,e){c=1.70158;var g=
29
+ 0,h=d;if(a==0)return b;if((a/=e/2)==2)return b+d;g||(g=e*0.3*1.5);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/h);if(a<1)return-0.5*h*Math.pow(2,10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g)+b;return h*Math.pow(2,-10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g)*0.5+d+b},easeInBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;return d*(a/=e)*a*((g+1)*a-g)+b},easeOutBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;return d*((a=a/e-1)*a*((g+1)*a+g)+1)+b},easeInOutBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;
30
+ if((a/=e/2)<1)return d/2*a*a*(((g*=1.525)+1)*a-g)+b;return d/2*((a-=2)*a*(((g*=1.525)+1)*a+g)+2)+b},easeInBounce:function(c,a,b,d,e){return d-f.easing.easeOutBounce(c,e-a,0,d,e)+b},easeOutBounce:function(c,a,b,d,e){return(a/=e)<1/2.75?d*7.5625*a*a+b:a<2/2.75?d*(7.5625*(a-=1.5/2.75)*a+0.75)+b:a<2.5/2.75?d*(7.5625*(a-=2.25/2.75)*a+0.9375)+b:d*(7.5625*(a-=2.625/2.75)*a+0.984375)+b},easeInOutBounce:function(c,a,b,d,e){if(a<e/2)return f.easing.easeInBounce(c,a*2,0,d,e)*0.5+b;return f.easing.easeOutBounce(c,
31
+ a*2-e,0,d,e)*0.5+d*0.5+b}})}(jQuery);
32
+ ;/*
33
+ * jQuery UI Effects Blind 1.8.16
34
+ *
35
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
36
+ * Dual licensed under the MIT or GPL Version 2 licenses.
37
+ * http://jquery.org/license
38
+ *
39
+ * http://docs.jquery.com/UI/Effects/Blind
40
+ *
41
+ * Depends:
42
+ * jquery.effects.core.js
43
+ */
44
+ (function(b){b.effects.blind=function(c){return this.queue(function(){var a=b(this),g=["position","top","bottom","left","right"],f=b.effects.setMode(a,c.options.mode||"hide"),d=c.options.direction||"vertical";b.effects.save(a,g);a.show();var e=b.effects.createWrapper(a).css({overflow:"hidden"}),h=d=="vertical"?"height":"width";d=d=="vertical"?e.height():e.width();f=="show"&&e.css(h,0);var i={};i[h]=f=="show"?d:0;e.animate(i,c.duration,c.options.easing,function(){f=="hide"&&a.hide();b.effects.restore(a,
45
+ g);b.effects.removeWrapper(a);c.callback&&c.callback.apply(a[0],arguments);a.dequeue()})})}})(jQuery);
46
+ ;/*
47
+ * jQuery UI Effects Bounce 1.8.16
48
+ *
49
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
50
+ * Dual licensed under the MIT or GPL Version 2 licenses.
51
+ * http://jquery.org/license
52
+ *
53
+ * http://docs.jquery.com/UI/Effects/Bounce
54
+ *
55
+ * Depends:
56
+ * jquery.effects.core.js
57
+ */
58
+ (function(e){e.effects.bounce=function(b){return this.queue(function(){var a=e(this),l=["position","top","bottom","left","right"],h=e.effects.setMode(a,b.options.mode||"effect"),d=b.options.direction||"up",c=b.options.distance||20,m=b.options.times||5,i=b.duration||250;/show|hide/.test(h)&&l.push("opacity");e.effects.save(a,l);a.show();e.effects.createWrapper(a);var f=d=="up"||d=="down"?"top":"left";d=d=="up"||d=="left"?"pos":"neg";c=b.options.distance||(f=="top"?a.outerHeight({margin:true})/3:a.outerWidth({margin:true})/
59
+ 3);if(h=="show")a.css("opacity",0).css(f,d=="pos"?-c:c);if(h=="hide")c/=m*2;h!="hide"&&m--;if(h=="show"){var g={opacity:1};g[f]=(d=="pos"?"+=":"-=")+c;a.animate(g,i/2,b.options.easing);c/=2;m--}for(g=0;g<m;g++){var j={},k={};j[f]=(d=="pos"?"-=":"+=")+c;k[f]=(d=="pos"?"+=":"-=")+c;a.animate(j,i/2,b.options.easing).animate(k,i/2,b.options.easing);c=h=="hide"?c*2:c/2}if(h=="hide"){g={opacity:0};g[f]=(d=="pos"?"-=":"+=")+c;a.animate(g,i/2,b.options.easing,function(){a.hide();e.effects.restore(a,l);e.effects.removeWrapper(a);
60
+ b.callback&&b.callback.apply(this,arguments)})}else{j={};k={};j[f]=(d=="pos"?"-=":"+=")+c;k[f]=(d=="pos"?"+=":"-=")+c;a.animate(j,i/2,b.options.easing).animate(k,i/2,b.options.easing,function(){e.effects.restore(a,l);e.effects.removeWrapper(a);b.callback&&b.callback.apply(this,arguments)})}a.queue("fx",function(){a.dequeue()});a.dequeue()})}})(jQuery);
61
+ ;/*
62
+ * jQuery UI Effects Clip 1.8.16
63
+ *
64
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
65
+ * Dual licensed under the MIT or GPL Version 2 licenses.
66
+ * http://jquery.org/license
67
+ *
68
+ * http://docs.jquery.com/UI/Effects/Clip
69
+ *
70
+ * Depends:
71
+ * jquery.effects.core.js
72
+ */
73
+ (function(b){b.effects.clip=function(e){return this.queue(function(){var a=b(this),i=["position","top","bottom","left","right","height","width"],f=b.effects.setMode(a,e.options.mode||"hide"),c=e.options.direction||"vertical";b.effects.save(a,i);a.show();var d=b.effects.createWrapper(a).css({overflow:"hidden"});d=a[0].tagName=="IMG"?d:a;var g={size:c=="vertical"?"height":"width",position:c=="vertical"?"top":"left"};c=c=="vertical"?d.height():d.width();if(f=="show"){d.css(g.size,0);d.css(g.position,
74
+ c/2)}var h={};h[g.size]=f=="show"?c:0;h[g.position]=f=="show"?0:c/2;d.animate(h,{queue:false,duration:e.duration,easing:e.options.easing,complete:function(){f=="hide"&&a.hide();b.effects.restore(a,i);b.effects.removeWrapper(a);e.callback&&e.callback.apply(a[0],arguments);a.dequeue()}})})}})(jQuery);
75
+ ;/*
76
+ * jQuery UI Effects Drop 1.8.16
77
+ *
78
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
79
+ * Dual licensed under the MIT or GPL Version 2 licenses.
80
+ * http://jquery.org/license
81
+ *
82
+ * http://docs.jquery.com/UI/Effects/Drop
83
+ *
84
+ * Depends:
85
+ * jquery.effects.core.js
86
+ */
87
+ (function(c){c.effects.drop=function(d){return this.queue(function(){var a=c(this),h=["position","top","bottom","left","right","opacity"],e=c.effects.setMode(a,d.options.mode||"hide"),b=d.options.direction||"left";c.effects.save(a,h);a.show();c.effects.createWrapper(a);var f=b=="up"||b=="down"?"top":"left";b=b=="up"||b=="left"?"pos":"neg";var g=d.options.distance||(f=="top"?a.outerHeight({margin:true})/2:a.outerWidth({margin:true})/2);if(e=="show")a.css("opacity",0).css(f,b=="pos"?-g:g);var i={opacity:e==
88
+ "show"?1:0};i[f]=(e=="show"?b=="pos"?"+=":"-=":b=="pos"?"-=":"+=")+g;a.animate(i,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){e=="hide"&&a.hide();c.effects.restore(a,h);c.effects.removeWrapper(a);d.callback&&d.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
89
+ ;/*
90
+ * jQuery UI Effects Explode 1.8.16
91
+ *
92
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
93
+ * Dual licensed under the MIT or GPL Version 2 licenses.
94
+ * http://jquery.org/license
95
+ *
96
+ * http://docs.jquery.com/UI/Effects/Explode
97
+ *
98
+ * Depends:
99
+ * jquery.effects.core.js
100
+ */
101
+ (function(j){j.effects.explode=function(a){return this.queue(function(){var c=a.options.pieces?Math.round(Math.sqrt(a.options.pieces)):3,d=a.options.pieces?Math.round(Math.sqrt(a.options.pieces)):3;a.options.mode=a.options.mode=="toggle"?j(this).is(":visible")?"hide":"show":a.options.mode;var b=j(this).show().css("visibility","hidden"),g=b.offset();g.top-=parseInt(b.css("marginTop"),10)||0;g.left-=parseInt(b.css("marginLeft"),10)||0;for(var h=b.outerWidth(true),i=b.outerHeight(true),e=0;e<c;e++)for(var f=
102
+ 0;f<d;f++)b.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-f*(h/d),top:-e*(i/c)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:h/d,height:i/c,left:g.left+f*(h/d)+(a.options.mode=="show"?(f-Math.floor(d/2))*(h/d):0),top:g.top+e*(i/c)+(a.options.mode=="show"?(e-Math.floor(c/2))*(i/c):0),opacity:a.options.mode=="show"?0:1}).animate({left:g.left+f*(h/d)+(a.options.mode=="show"?0:(f-Math.floor(d/2))*(h/d)),top:g.top+
103
+ e*(i/c)+(a.options.mode=="show"?0:(e-Math.floor(c/2))*(i/c)),opacity:a.options.mode=="show"?1:0},a.duration||500);setTimeout(function(){a.options.mode=="show"?b.css({visibility:"visible"}):b.css({visibility:"visible"}).hide();a.callback&&a.callback.apply(b[0]);b.dequeue();j("div.ui-effects-explode").remove()},a.duration||500)})}})(jQuery);
104
+ ;/*
105
+ * jQuery UI Effects Fade 1.8.16
106
+ *
107
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
108
+ * Dual licensed under the MIT or GPL Version 2 licenses.
109
+ * http://jquery.org/license
110
+ *
111
+ * http://docs.jquery.com/UI/Effects/Fade
112
+ *
113
+ * Depends:
114
+ * jquery.effects.core.js
115
+ */
116
+ (function(b){b.effects.fade=function(a){return this.queue(function(){var c=b(this),d=b.effects.setMode(c,a.options.mode||"hide");c.animate({opacity:d},{queue:false,duration:a.duration,easing:a.options.easing,complete:function(){a.callback&&a.callback.apply(this,arguments);c.dequeue()}})})}})(jQuery);
117
+ ;/*
118
+ * jQuery UI Effects Fold 1.8.16
119
+ *
120
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
121
+ * Dual licensed under the MIT or GPL Version 2 licenses.
122
+ * http://jquery.org/license
123
+ *
124
+ * http://docs.jquery.com/UI/Effects/Fold
125
+ *
126
+ * Depends:
127
+ * jquery.effects.core.js
128
+ */
129
+ (function(c){c.effects.fold=function(a){return this.queue(function(){var b=c(this),j=["position","top","bottom","left","right"],d=c.effects.setMode(b,a.options.mode||"hide"),g=a.options.size||15,h=!!a.options.horizFirst,k=a.duration?a.duration/2:c.fx.speeds._default/2;c.effects.save(b,j);b.show();var e=c.effects.createWrapper(b).css({overflow:"hidden"}),f=d=="show"!=h,l=f?["width","height"]:["height","width"];f=f?[e.width(),e.height()]:[e.height(),e.width()];var i=/([0-9]+)%/.exec(g);if(i)g=parseInt(i[1],
130
+ 10)/100*f[d=="hide"?0:1];if(d=="show")e.css(h?{height:0,width:g}:{height:g,width:0});h={};i={};h[l[0]]=d=="show"?f[0]:g;i[l[1]]=d=="show"?f[1]:0;e.animate(h,k,a.options.easing).animate(i,k,a.options.easing,function(){d=="hide"&&b.hide();c.effects.restore(b,j);c.effects.removeWrapper(b);a.callback&&a.callback.apply(b[0],arguments);b.dequeue()})})}})(jQuery);
131
+ ;/*
132
+ * jQuery UI Effects Highlight 1.8.16
133
+ *
134
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
135
+ * Dual licensed under the MIT or GPL Version 2 licenses.
136
+ * http://jquery.org/license
137
+ *
138
+ * http://docs.jquery.com/UI/Effects/Highlight
139
+ *
140
+ * Depends:
141
+ * jquery.effects.core.js
142
+ */
143
+ (function(b){b.effects.highlight=function(c){return this.queue(function(){var a=b(this),e=["backgroundImage","backgroundColor","opacity"],d=b.effects.setMode(a,c.options.mode||"show"),f={backgroundColor:a.css("backgroundColor")};if(d=="hide")f.opacity=0;b.effects.save(a,e);a.show().css({backgroundImage:"none",backgroundColor:c.options.color||"#ffff99"}).animate(f,{queue:false,duration:c.duration,easing:c.options.easing,complete:function(){d=="hide"&&a.hide();b.effects.restore(a,e);d=="show"&&!b.support.opacity&&
144
+ this.style.removeAttribute("filter");c.callback&&c.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
145
+ ;/*
146
+ * jQuery UI Effects Pulsate 1.8.16
147
+ *
148
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
149
+ * Dual licensed under the MIT or GPL Version 2 licenses.
150
+ * http://jquery.org/license
151
+ *
152
+ * http://docs.jquery.com/UI/Effects/Pulsate
153
+ *
154
+ * Depends:
155
+ * jquery.effects.core.js
156
+ */
157
+ (function(d){d.effects.pulsate=function(a){return this.queue(function(){var b=d(this),c=d.effects.setMode(b,a.options.mode||"show");times=(a.options.times||5)*2-1;duration=a.duration?a.duration/2:d.fx.speeds._default/2;isVisible=b.is(":visible");animateTo=0;if(!isVisible){b.css("opacity",0).show();animateTo=1}if(c=="hide"&&isVisible||c=="show"&&!isVisible)times--;for(c=0;c<times;c++){b.animate({opacity:animateTo},duration,a.options.easing);animateTo=(animateTo+1)%2}b.animate({opacity:animateTo},duration,
158
+ a.options.easing,function(){animateTo==0&&b.hide();a.callback&&a.callback.apply(this,arguments)});b.queue("fx",function(){b.dequeue()}).dequeue()})}})(jQuery);
159
+ ;/*
160
+ * jQuery UI Effects Scale 1.8.16
161
+ *
162
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
163
+ * Dual licensed under the MIT or GPL Version 2 licenses.
164
+ * http://jquery.org/license
165
+ *
166
+ * http://docs.jquery.com/UI/Effects/Scale
167
+ *
168
+ * Depends:
169
+ * jquery.effects.core.js
170
+ */
171
+ (function(c){c.effects.puff=function(b){return this.queue(function(){var a=c(this),e=c.effects.setMode(a,b.options.mode||"hide"),g=parseInt(b.options.percent,10)||150,h=g/100,i={height:a.height(),width:a.width()};c.extend(b.options,{fade:true,mode:e,percent:e=="hide"?g:100,from:e=="hide"?i:{height:i.height*h,width:i.width*h}});a.effect("scale",b.options,b.duration,b.callback);a.dequeue()})};c.effects.scale=function(b){return this.queue(function(){var a=c(this),e=c.extend(true,{},b.options),g=c.effects.setMode(a,
172
+ b.options.mode||"effect"),h=parseInt(b.options.percent,10)||(parseInt(b.options.percent,10)==0?0:g=="hide"?0:100),i=b.options.direction||"both",f=b.options.origin;if(g!="effect"){e.origin=f||["middle","center"];e.restore=true}f={height:a.height(),width:a.width()};a.from=b.options.from||(g=="show"?{height:0,width:0}:f);h={y:i!="horizontal"?h/100:1,x:i!="vertical"?h/100:1};a.to={height:f.height*h.y,width:f.width*h.x};if(b.options.fade){if(g=="show"){a.from.opacity=0;a.to.opacity=1}if(g=="hide"){a.from.opacity=
173
+ 1;a.to.opacity=0}}e.from=a.from;e.to=a.to;e.mode=g;a.effect("size",e,b.duration,b.callback);a.dequeue()})};c.effects.size=function(b){return this.queue(function(){var a=c(this),e=["position","top","bottom","left","right","width","height","overflow","opacity"],g=["position","top","bottom","left","right","overflow","opacity"],h=["width","height","overflow"],i=["fontSize"],f=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],k=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],
174
+ p=c.effects.setMode(a,b.options.mode||"effect"),n=b.options.restore||false,m=b.options.scale||"both",l=b.options.origin,j={height:a.height(),width:a.width()};a.from=b.options.from||j;a.to=b.options.to||j;if(l){l=c.effects.getBaseline(l,j);a.from.top=(j.height-a.from.height)*l.y;a.from.left=(j.width-a.from.width)*l.x;a.to.top=(j.height-a.to.height)*l.y;a.to.left=(j.width-a.to.width)*l.x}var d={from:{y:a.from.height/j.height,x:a.from.width/j.width},to:{y:a.to.height/j.height,x:a.to.width/j.width}};
175
+ if(m=="box"||m=="both"){if(d.from.y!=d.to.y){e=e.concat(f);a.from=c.effects.setTransition(a,f,d.from.y,a.from);a.to=c.effects.setTransition(a,f,d.to.y,a.to)}if(d.from.x!=d.to.x){e=e.concat(k);a.from=c.effects.setTransition(a,k,d.from.x,a.from);a.to=c.effects.setTransition(a,k,d.to.x,a.to)}}if(m=="content"||m=="both")if(d.from.y!=d.to.y){e=e.concat(i);a.from=c.effects.setTransition(a,i,d.from.y,a.from);a.to=c.effects.setTransition(a,i,d.to.y,a.to)}c.effects.save(a,n?e:g);a.show();c.effects.createWrapper(a);
176
+ a.css("overflow","hidden").css(a.from);if(m=="content"||m=="both"){f=f.concat(["marginTop","marginBottom"]).concat(i);k=k.concat(["marginLeft","marginRight"]);h=e.concat(f).concat(k);a.find("*[width]").each(function(){child=c(this);n&&c.effects.save(child,h);var o={height:child.height(),width:child.width()};child.from={height:o.height*d.from.y,width:o.width*d.from.x};child.to={height:o.height*d.to.y,width:o.width*d.to.x};if(d.from.y!=d.to.y){child.from=c.effects.setTransition(child,f,d.from.y,child.from);
177
+ child.to=c.effects.setTransition(child,f,d.to.y,child.to)}if(d.from.x!=d.to.x){child.from=c.effects.setTransition(child,k,d.from.x,child.from);child.to=c.effects.setTransition(child,k,d.to.x,child.to)}child.css(child.from);child.animate(child.to,b.duration,b.options.easing,function(){n&&c.effects.restore(child,h)})})}a.animate(a.to,{queue:false,duration:b.duration,easing:b.options.easing,complete:function(){a.to.opacity===0&&a.css("opacity",a.from.opacity);p=="hide"&&a.hide();c.effects.restore(a,
178
+ n?e:g);c.effects.removeWrapper(a);b.callback&&b.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
179
+ ;/*
180
+ * jQuery UI Effects Shake 1.8.16
181
+ *
182
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
183
+ * Dual licensed under the MIT or GPL Version 2 licenses.
184
+ * http://jquery.org/license
185
+ *
186
+ * http://docs.jquery.com/UI/Effects/Shake
187
+ *
188
+ * Depends:
189
+ * jquery.effects.core.js
190
+ */
191
+ (function(d){d.effects.shake=function(a){return this.queue(function(){var b=d(this),j=["position","top","bottom","left","right"];d.effects.setMode(b,a.options.mode||"effect");var c=a.options.direction||"left",e=a.options.distance||20,l=a.options.times||3,f=a.duration||a.options.duration||140;d.effects.save(b,j);b.show();d.effects.createWrapper(b);var g=c=="up"||c=="down"?"top":"left",h=c=="up"||c=="left"?"pos":"neg";c={};var i={},k={};c[g]=(h=="pos"?"-=":"+=")+e;i[g]=(h=="pos"?"+=":"-=")+e*2;k[g]=
192
+ (h=="pos"?"-=":"+=")+e*2;b.animate(c,f,a.options.easing);for(e=1;e<l;e++)b.animate(i,f,a.options.easing).animate(k,f,a.options.easing);b.animate(i,f,a.options.easing).animate(c,f/2,a.options.easing,function(){d.effects.restore(b,j);d.effects.removeWrapper(b);a.callback&&a.callback.apply(this,arguments)});b.queue("fx",function(){b.dequeue()});b.dequeue()})}})(jQuery);
193
+ ;/*
194
+ * jQuery UI Effects Slide 1.8.16
195
+ *
196
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
197
+ * Dual licensed under the MIT or GPL Version 2 licenses.
198
+ * http://jquery.org/license
199
+ *
200
+ * http://docs.jquery.com/UI/Effects/Slide
201
+ *
202
+ * Depends:
203
+ * jquery.effects.core.js
204
+ */
205
+ (function(c){c.effects.slide=function(d){return this.queue(function(){var a=c(this),h=["position","top","bottom","left","right"],f=c.effects.setMode(a,d.options.mode||"show"),b=d.options.direction||"left";c.effects.save(a,h);a.show();c.effects.createWrapper(a).css({overflow:"hidden"});var g=b=="up"||b=="down"?"top":"left";b=b=="up"||b=="left"?"pos":"neg";var e=d.options.distance||(g=="top"?a.outerHeight({margin:true}):a.outerWidth({margin:true}));if(f=="show")a.css(g,b=="pos"?isNaN(e)?"-"+e:-e:e);
206
+ var i={};i[g]=(f=="show"?b=="pos"?"+=":"-=":b=="pos"?"-=":"+=")+e;a.animate(i,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){f=="hide"&&a.hide();c.effects.restore(a,h);c.effects.removeWrapper(a);d.callback&&d.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
207
+ ;/*
208
+ * jQuery UI Effects Transfer 1.8.16
209
+ *
210
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
211
+ * Dual licensed under the MIT or GPL Version 2 licenses.
212
+ * http://jquery.org/license
213
+ *
214
+ * http://docs.jquery.com/UI/Effects/Transfer
215
+ *
216
+ * Depends:
217
+ * jquery.effects.core.js
218
+ */
219
+ (function(e){e.effects.transfer=function(a){return this.queue(function(){var b=e(this),c=e(a.options.to),d=c.offset();c={top:d.top,left:d.left,height:c.innerHeight(),width:c.innerWidth()};d=b.offset();var f=e('<div class="ui-effects-transfer"></div>').appendTo(document.body).addClass(a.options.className).css({top:d.top,left:d.left,height:b.innerHeight(),width:b.innerWidth(),position:"absolute"}).animate(c,a.duration,a.options.easing,function(){f.remove();a.callback&&a.callback.apply(b[0],arguments);
220
+ b.dequeue()})})}})(jQuery);
221
+ ;
@@ -0,0 +1,23 @@
1
+ # view helpers
2
+ module Sinatra::ViewHelpers
3
+
4
+ def text_field_tag(object, name, options = {})
5
+ value = ""
6
+ value = options.delete(:value) if options[:value]
7
+ value = object.send name if object
8
+ attr = []
9
+ options.each do |key, val|
10
+ attr << "#{key}='#{val}'"
11
+ end
12
+ "<input type='text' name='#{object.form_name}[#{name.to_s}]' value='#{value}' #{attr.join(" ")} />"
13
+ end
14
+
15
+ def submit_tag(name, value, options = {})
16
+ attr = []
17
+ options.each do |key, val|
18
+ attr << "#{key}='#{val}'"
19
+ end
20
+ "<input type='submit' name='#{name.to_s}]' value='#{value}' #{attr.join(" ")} />"
21
+ end
22
+
23
+ end
@@ -4,7 +4,8 @@
4
4
  <title>MongoDB logger</title>
5
5
  <link href="<%=u 'stylesheets/all.css' %>" media="screen" rel="stylesheet" type="text/css">
6
6
  <script src="<%=u 'javascripts/jquery-1.7.min.js' %>" type="text/javascript"></script>
7
- <script src="<%=u 'application.js' %>" type="text/javascript"></script>
7
+ <script src="<%=u 'javascripts/jquery-ui-1.8.16.effects.min.js' %>" type="text/javascript"></script>
8
+ <script src="<%=u 'javascripts/application.js' %>" type="text/javascript"></script>
8
9
  </head>
9
10
  <body>
10
11
  <div class="page">
@@ -25,22 +25,22 @@
25
25
  <div class="unit size1of3">
26
26
  <div class="unit size1of2">
27
27
  <div class="prm">
28
- <input id="f_controller" type="text" name="f[controller]" value="<%=get_field_val('controller')%>" placeholder="Controller" />
28
+ <%= text_field_tag @filter, :controller, :placeholder => "Controller" %>
29
29
  </div> <!-- prm -->
30
30
  </div>
31
31
  <div class="unit size1of2">
32
32
  <div class="prm">
33
- <input id="f_action" type="text" name="f[action]" value="<%=get_field_val('action')%>" placeholder="Action" />
33
+ <%= text_field_tag @filter, :action, :placeholder => "Action" %>
34
34
  </div>
35
35
  </div>
36
36
  </div>
37
37
  <div class="unit size1of3">
38
- <div class="unit size1of2">
39
- <%=select_tag("f[limit]", [100, 500, 1000, 2000, 5000, 10000], get_field_val('limit'))%>
38
+ <div class="unit size1of2">
39
+ <%#= select_tag @filter, :limit, :options => [100, 500, 1000, 2000, 5000, 10000] %>
40
40
  </div>
41
41
  </div>
42
42
  <div class="unit size1of3 txtR">
43
- <input type="submit" name="submit" value="Filter" class="button primary" />
43
+ <%= submit_tag :submit, "Filter", :class => "button primary" %>
44
44
  <a href="<%=h url_path("overview") %>" class="button small mls">Clear</a>
45
45
  </div>
46
46
  </div> <!-- outer -->
@@ -48,21 +48,22 @@
48
48
  <div class="unit size1of3">
49
49
  <div class="unit size1of2">
50
50
  <div class="prm">
51
- <input id="f_application_name" type="text" name="f[application_name]" value="<%=get_field_val('application_name')%>" placeholder="Application Name" />
51
+ <%= text_field_tag @filter, :application_name, :placeholder => "Application Name" %>
52
52
  </div>
53
53
  </div>
54
54
  <div class="unit size1of2">
55
55
  <div class="prm">
56
- <input id="f_ip" type="text" name="f[ip]" value="<%=get_field_val('ip')%>" placeholder="IP" />
56
+ <%= text_field_tag @filter, :ip, :placeholder => "IP" %>
57
57
  </div>
58
58
  </div>
59
59
  </div>
60
60
  <div class="unit size1of3">
61
61
  <div class="unit size1of2">
62
- <div class="prm ptxs">
63
- <input type="checkbox" id="err"><label for="err">Error</label>
64
- </div>
62
+ <div class="prm ptxs">
63
+ <%#= f.check_box :is_exception %>
64
+ <%#= f.label :is_exception, "Filter exceptions" %>
65
65
  </div>
66
+ </div>
66
67
  </div> <!-- unit -->
67
68
  </div> <!-- outer -->
68
69
  </form>
@@ -74,8 +75,8 @@
74
75
  <table id="logs_list">
75
76
  <tr>
76
77
  <th>Received</th>
77
- <th>Action</th>
78
78
  <th>Controller</th>
79
+ <th>Action</th>
79
80
  <th>IP</th>
80
81
  <th>URL</th>
81
82
  <th>Runtime</th>
@@ -1,3 +1,3 @@
1
1
  module MongodbLogger
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  end
@@ -6,15 +6,19 @@ Gem::Specification.new do |gem|
6
6
  gem.email = ["leopard.not.a@gmail.com"]
7
7
  gem.description = %q{MongoDB logger for Rails 3}
8
8
  gem.summary = %q{MongoDB logger for Rails 3}
9
- gem.homepage = ""
9
+ gem.homepage = "http://mongodb-logger.catware.org"
10
10
 
11
- gem.add_development_dependency "rspec", "~> 2.7.0"
12
- gem.add_development_dependency "shoulda", ">= 2.0.0"
13
- gem.add_development_dependency "mocha", "~> 0.10.0"
14
- gem.add_development_dependency "cucumber", "~> 1.1.2"
11
+ gem.extra_rdoc_files = [ "LICENSE", "README.md" ]
12
+ gem.rdoc_options = ["--charset=UTF-8"]
13
+
14
+ gem.add_development_dependency "rspec", "~> 2.7.0"
15
+ gem.add_development_dependency "shoulda", ">= 2.0.0"
16
+ gem.add_development_dependency "mocha", "~> 0.10.0"
17
+ gem.add_development_dependency "cucumber", "~> 1.1.2"
18
+ gem.add_development_dependency "coffee-script", "~> 2.2.0"
19
+ gem.add_development_dependency "therubyracer", "~> 0.9.9"
15
20
 
16
21
  gem.add_runtime_dependency "rake", "~> 0.9.0"
17
- gem.add_runtime_dependency "bundler", ">= 1.0.0"
18
22
  gem.add_runtime_dependency "mongo", "~> 1.4.0"
19
23
  gem.add_runtime_dependency "bson_ext", "~> 1.4.0"
20
24
  gem.add_runtime_dependency "i18n", ">= 0.4.1"
@@ -22,7 +26,6 @@ Gem::Specification.new do |gem|
22
26
  gem.add_runtime_dependency "activesupport", ">= 3.0.0"
23
27
  gem.add_runtime_dependency "sinatra", ">= 1.2.0"
24
28
  gem.add_runtime_dependency "erubis", ">= 2.6.6"
25
- gem.add_runtime_dependency "coffee-script", "~> 2.2.0"
26
29
  gem.add_runtime_dependency "vegas", "~> 0.1.2"
27
30
 
28
31
  gem.rubyforge_project = "mongodb_logger"
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.1.1
4
+ version: 0.1.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-11-13 00:00:00.000000000 Z
12
+ date: 2011-11-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &70142944021000 !ruby/object:Gem::Requirement
16
+ requirement: &70100132933360 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 2.7.0
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *70142944021000
24
+ version_requirements: *70100132933360
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: shoulda
27
- requirement: &70142944019980 !ruby/object:Gem::Requirement
27
+ requirement: &70100132931920 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 2.0.0
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *70142944019980
35
+ version_requirements: *70100132931920
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: mocha
38
- requirement: &70142944198120 !ruby/object:Gem::Requirement
38
+ requirement: &70100132942920 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 0.10.0
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *70142944198120
46
+ version_requirements: *70100132942920
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: cucumber
49
- requirement: &70142944195620 !ruby/object:Gem::Requirement
49
+ requirement: &70100132940840 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,32 +54,43 @@ dependencies:
54
54
  version: 1.1.2
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *70142944195620
57
+ version_requirements: *70100132940840
58
58
  - !ruby/object:Gem::Dependency
59
- name: rake
60
- requirement: &70142944193820 !ruby/object:Gem::Requirement
59
+ name: coffee-script
60
+ requirement: &70100132954040 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
64
64
  - !ruby/object:Gem::Version
65
- version: 0.9.0
66
- type: :runtime
65
+ version: 2.2.0
66
+ type: :development
67
67
  prerelease: false
68
- version_requirements: *70142944193820
68
+ version_requirements: *70100132954040
69
69
  - !ruby/object:Gem::Dependency
70
- name: bundler
71
- requirement: &70142944206760 !ruby/object:Gem::Requirement
70
+ name: therubyracer
71
+ requirement: &70100132952500 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
- - - ! '>='
74
+ - - ~>
75
75
  - !ruby/object:Gem::Version
76
- version: 1.0.0
76
+ version: 0.9.9
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: *70100132952500
80
+ - !ruby/object:Gem::Dependency
81
+ name: rake
82
+ requirement: &70100132950780 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ~>
86
+ - !ruby/object:Gem::Version
87
+ version: 0.9.0
77
88
  type: :runtime
78
89
  prerelease: false
79
- version_requirements: *70142944206760
90
+ version_requirements: *70100132950780
80
91
  - !ruby/object:Gem::Dependency
81
92
  name: mongo
82
- requirement: &70142944202620 !ruby/object:Gem::Requirement
93
+ requirement: &70100132948020 !ruby/object:Gem::Requirement
83
94
  none: false
84
95
  requirements:
85
96
  - - ~>
@@ -87,10 +98,10 @@ dependencies:
87
98
  version: 1.4.0
88
99
  type: :runtime
89
100
  prerelease: false
90
- version_requirements: *70142944202620
101
+ version_requirements: *70100132948020
91
102
  - !ruby/object:Gem::Dependency
92
103
  name: bson_ext
93
- requirement: &70142944200440 !ruby/object:Gem::Requirement
104
+ requirement: &70100132960200 !ruby/object:Gem::Requirement
94
105
  none: false
95
106
  requirements:
96
107
  - - ~>
@@ -98,10 +109,10 @@ dependencies:
98
109
  version: 1.4.0
99
110
  type: :runtime
100
111
  prerelease: false
101
- version_requirements: *70142944200440
112
+ version_requirements: *70100132960200
102
113
  - !ruby/object:Gem::Dependency
103
114
  name: i18n
104
- requirement: &70142944214160 !ruby/object:Gem::Requirement
115
+ requirement: &70100132957100 !ruby/object:Gem::Requirement
105
116
  none: false
106
117
  requirements:
107
118
  - - ! '>='
@@ -109,10 +120,10 @@ dependencies:
109
120
  version: 0.4.1
110
121
  type: :runtime
111
122
  prerelease: false
112
- version_requirements: *70142944214160
123
+ version_requirements: *70100132957100
113
124
  - !ruby/object:Gem::Dependency
114
125
  name: json
115
- requirement: &70142944212340 !ruby/object:Gem::Requirement
126
+ requirement: &70100132980140 !ruby/object:Gem::Requirement
116
127
  none: false
117
128
  requirements:
118
129
  - - ~>
@@ -120,10 +131,10 @@ dependencies:
120
131
  version: 1.6.1
121
132
  type: :runtime
122
133
  prerelease: false
123
- version_requirements: *70142944212340
134
+ version_requirements: *70100132980140
124
135
  - !ruby/object:Gem::Dependency
125
136
  name: activesupport
126
- requirement: &70142944209540 !ruby/object:Gem::Requirement
137
+ requirement: &70100132978380 !ruby/object:Gem::Requirement
127
138
  none: false
128
139
  requirements:
129
140
  - - ! '>='
@@ -131,10 +142,10 @@ dependencies:
131
142
  version: 3.0.0
132
143
  type: :runtime
133
144
  prerelease: false
134
- version_requirements: *70142944209540
145
+ version_requirements: *70100132978380
135
146
  - !ruby/object:Gem::Dependency
136
147
  name: sinatra
137
- requirement: &70142944223380 !ruby/object:Gem::Requirement
148
+ requirement: &70100132977100 !ruby/object:Gem::Requirement
138
149
  none: false
139
150
  requirements:
140
151
  - - ! '>='
@@ -142,10 +153,10 @@ dependencies:
142
153
  version: 1.2.0
143
154
  type: :runtime
144
155
  prerelease: false
145
- version_requirements: *70142944223380
156
+ version_requirements: *70100132977100
146
157
  - !ruby/object:Gem::Dependency
147
158
  name: erubis
148
- requirement: &70142944232560 !ruby/object:Gem::Requirement
159
+ requirement: &70100132975940 !ruby/object:Gem::Requirement
149
160
  none: false
150
161
  requirements:
151
162
  - - ! '>='
@@ -153,21 +164,10 @@ dependencies:
153
164
  version: 2.6.6
154
165
  type: :runtime
155
166
  prerelease: false
156
- version_requirements: *70142944232560
157
- - !ruby/object:Gem::Dependency
158
- name: coffee-script
159
- requirement: &70142944230460 !ruby/object:Gem::Requirement
160
- none: false
161
- requirements:
162
- - - ~>
163
- - !ruby/object:Gem::Version
164
- version: 2.2.0
165
- type: :runtime
166
- prerelease: false
167
- version_requirements: *70142944230460
167
+ version_requirements: *70100132975940
168
168
  - !ruby/object:Gem::Dependency
169
169
  name: vegas
170
- requirement: &70142944226860 !ruby/object:Gem::Requirement
170
+ requirement: &70100132974300 !ruby/object:Gem::Requirement
171
171
  none: false
172
172
  requirements:
173
173
  - - ~>
@@ -175,19 +175,22 @@ dependencies:
175
175
  version: 0.1.2
176
176
  type: :runtime
177
177
  prerelease: false
178
- version_requirements: *70142944226860
178
+ version_requirements: *70100132974300
179
179
  description: MongoDB logger for Rails 3
180
180
  email:
181
181
  - leopard.not.a@gmail.com
182
182
  executables:
183
183
  - mongodb_logger_web
184
184
  extensions: []
185
- extra_rdoc_files: []
185
+ extra_rdoc_files:
186
+ - LICENSE
187
+ - README.md
186
188
  files:
187
189
  - .gitignore
188
190
  - .rvmrc
189
191
  - .travis.yml
190
192
  - Gemfile
193
+ - LICENSE
191
194
  - README.md
192
195
  - Rakefile
193
196
  - SUPPORTED_RAILS_VERSIONS
@@ -206,6 +209,7 @@ files:
206
209
  - lib/mongodb_logger/railtie.rb
207
210
  - lib/mongodb_logger/replica_set_helper.rb
208
211
  - lib/mongodb_logger/server.rb
212
+ - lib/mongodb_logger/server/coffee/application.coffee
209
213
  - lib/mongodb_logger/server/model/filter.rb
210
214
  - lib/mongodb_logger/server/partials.rb
211
215
  - lib/mongodb_logger/server/public/images/ajax-loader.gif
@@ -214,7 +218,9 @@ files:
214
218
  - lib/mongodb_logger/server/public/images/play-icon.png
215
219
  - lib/mongodb_logger/server/public/images/stop-icon.png
216
220
  - lib/mongodb_logger/server/public/images/success.png
221
+ - lib/mongodb_logger/server/public/javascripts/application.js
217
222
  - lib/mongodb_logger/server/public/javascripts/jquery-1.7.min.js
223
+ - lib/mongodb_logger/server/public/javascripts/jquery-ui-1.8.16.effects.min.js
218
224
  - lib/mongodb_logger/server/public/stylesheets/all.css
219
225
  - lib/mongodb_logger/server/public/stylesheets/grids.css
220
226
  - lib/mongodb_logger/server/public/stylesheets/group-buttons.css
@@ -225,7 +231,7 @@ files:
225
231
  - lib/mongodb_logger/server/public/stylesheets/library.css
226
232
  - lib/mongodb_logger/server/public/stylesheets/reset.css
227
233
  - lib/mongodb_logger/server/public/stylesheets/spaces.css
228
- - lib/mongodb_logger/server/views/application.coffee
234
+ - lib/mongodb_logger/server/view_helpers.rb
229
235
  - lib/mongodb_logger/server/views/error.erb
230
236
  - lib/mongodb_logger/server/views/layout.erb
231
237
  - lib/mongodb_logger/server/views/overview.erb
@@ -252,10 +258,11 @@ files:
252
258
  - test/test_helper.rb
253
259
  - test/unit/mongodb_logger_replica_test.rb
254
260
  - test/unit/mongodb_logger_test.rb
255
- homepage: ''
261
+ homepage: http://mongodb-logger.catware.org
256
262
  licenses: []
257
263
  post_install_message:
258
- rdoc_options: []
264
+ rdoc_options:
265
+ - --charset=UTF-8
259
266
  require_paths:
260
267
  - lib
261
268
  required_ruby_version: !ruby/object:Gem::Requirement