prepor-ologger 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,6 @@
1
+ *.sw?
2
+ .DS_Store
3
+ coverage
4
+ rdoc
5
+ pkg
6
+
data/Rakefile ADDED
@@ -0,0 +1,15 @@
1
+ begin
2
+ require 'jeweler'
3
+ Jeweler::Tasks.new do |gemspec|
4
+ gemspec.name = "ologger"
5
+ gemspec.summary = "Object separated logs"
6
+ gemspec.description = ""
7
+ gemspec.email = "ceo@prepor.ru"
8
+ gemspec.homepage = "http://github.com/prepor/olog"
9
+ gemspec.authors = ["Andrew Rudenko"]
10
+ gemspec.add_dependency('prepor-artester')
11
+ gemspec.add_dependency('activesupport')
12
+ end
13
+ rescue LoadError
14
+ puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
15
+ end
data/Readme.rdoc ADDED
@@ -0,0 +1,26 @@
1
+ = Usage
2
+
3
+ # Initializer
4
+ require 'ologger'
5
+ Object.send :include OLogger
6
+
7
+ # Controller
8
+ around_filter OLogger
9
+
10
+ # Daemon
11
+ OLogger.enable do
12
+ loop do
13
+ bla bla
14
+ end
15
+ end
16
+
17
+ # Configs
18
+ OLogger.path = Pathname('log/ologs')
19
+
20
+ # In objects
21
+ def start!(character)
22
+ ologger "Starting project", character
23
+ end
24
+
25
+
26
+
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.2
data/bin/ologger ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ require File.dirname(__FILE__) + "/../lib/ologger"
3
+
4
+ ARGV.each do |path|
5
+ OLogger.gc_dir(Pathname.new(path))
6
+ end
@@ -0,0 +1,36 @@
1
+ module OLogger
2
+ class Buffer
3
+ attr_accessor :messages
4
+
5
+ def initialize
6
+ self.messages = []
7
+ end
8
+
9
+ def flush
10
+ self.messages = []
11
+ end
12
+
13
+ def add(options = {})
14
+ messages << options
15
+ end
16
+
17
+ def grouped_messages
18
+ messages.group_by { |b| "#{b[:logger_module]}.#{b[:logger_id]}"}
19
+ end
20
+
21
+ def write
22
+ grouped_messages.each do |k, game_module_messages|
23
+ logger_module = game_module_messages.first[:logger_module] || 'unknown'
24
+ logger_id = game_module_messages.first[:logger_id] || 'unknown'
25
+ OLogger.create_module(logger_module)
26
+ (OLogger.path + logger_module + (logger_id.to_s + '.log')).open('a+') do |file|
27
+ game_module_messages.each do |message|
28
+ file.puts "#{Time.now.strftime('%d.%m.%Y %H:%M:%S')}: #{message[:message]}"
29
+ message[:objs].each { |obj| PP.pp(obj, file) } if message[:objs]
30
+ end
31
+ end
32
+ end
33
+ end
34
+
35
+ end
36
+ end
@@ -0,0 +1,23 @@
1
+ module OLogger
2
+ class Middleware
3
+ def initialize(app)
4
+ @app = app
5
+ end
6
+
7
+ def call(env)
8
+ dup._call(env)
9
+ end
10
+
11
+ def _call(env)
12
+ OLogger.buffer.flush
13
+ @status, @headers, @response = @app.call(env)
14
+ OLogger.buffer.write
15
+ [@status, @headers, self]
16
+ end
17
+
18
+ def each(&block)
19
+ @response.each(&block)
20
+ end
21
+
22
+ end
23
+ end
@@ -0,0 +1,34 @@
1
+ module OLogger
2
+ module ObjectMethods
3
+ def ologger_module
4
+ self.class.name.tableize
5
+ end
6
+
7
+ def ologger_id
8
+ if defined?(ActiveRecord::Base) && self.is_a?(ActiveRecord::Base)
9
+ self.id
10
+ else
11
+ self.object_id
12
+ end
13
+ end
14
+ # g#group_fight.123#
15
+ def ologger(message, *objs)
16
+ parsed_objs = objs.map { |o| ologger_object_format(o) }
17
+ OLogger.buffer.add :message => message, :objs => parsed_objs, :logger_module => ologger_module, :logger_id => ologger_id
18
+ end
19
+ def ologger_object_format(obj)
20
+ if defined?(ActiveRecord::Base) && obj.is_a?(ActiveRecord::Base)
21
+ if obj == self
22
+ obj.attributes
23
+ elsif obj.ologger_id
24
+ OLogger.buffer.add :message => 'Self:', :objs => [obj.attributes], :logger_module => obj.ologger_module, :logger_id => obj.ologger_id
25
+ "g##{obj.ologger_module}.#{obj.ologger_id}#"
26
+ else
27
+ obj
28
+ end
29
+ else
30
+ obj
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,9 @@
1
+ module OLogger
2
+ module Parser
3
+ def self.parse(str)
4
+ str.gsub(/g#([\d\w.]+)\.([\d\w.]+)#/i, "<a href=\"#{OLogger::LOG_URL}\\1/\\2\">\\1/\\2</a>")
5
+ end
6
+ end
7
+
8
+ end
9
+
@@ -0,0 +1,18 @@
1
+ class StandardError
2
+ attr_accessor :obj
3
+ end
4
+ module Kernel
5
+ def ologger_raise(*argv)
6
+ if Thread.current[:ologger_raiser]
7
+ ex = StandardError.new(*argv)
8
+ ex.obj = self
9
+ ologger_old_raise ex
10
+ else
11
+ ologger_old_raise(*argv)
12
+ end
13
+ end
14
+
15
+ alias_method :ologger_old_raise, :raise
16
+ alias_method :raise, :ologger_raise
17
+
18
+ end
data/lib/ologger/tags ADDED
@@ -0,0 +1,2 @@
1
+ add buffer.rb /^ def add(options = {})$/
2
+ open buffer.rb /^ (OLogger.path + logger_module + (logger_id/
data/lib/ologger.rb ADDED
@@ -0,0 +1,112 @@
1
+ require 'rubygems'
2
+ require 'pp'
3
+ require 'pathname'
4
+ require 'activesupport'
5
+
6
+
7
+
8
+ require 'ologger/raise_patch'
9
+ module OLogger
10
+ LOG_URL = '/game_logs/'
11
+
12
+ require 'ologger/parser'
13
+ require 'ologger/buffer'
14
+ require 'ologger/object_methods'
15
+ require 'ologger/middleware'
16
+
17
+ class << self
18
+ attr_accessor :path, :on_raise
19
+ def path
20
+ @path ||= defined?(RAILS_ROOT) ? Pathname.new(File.join(RAILS_ROOT, 'log/o_logs')) : nil
21
+ end
22
+ def gc
23
+ gc_dir
24
+ end
25
+
26
+ def gc_dir(dir_path = OLogger.path)
27
+ if dir_path.directory?
28
+ dir_path.each_entry do |path|
29
+ if not_self_and_parent path
30
+ gc_dir(dir_path + path)
31
+ end
32
+ end
33
+ else
34
+ if needed_to_remove?(dir_path)
35
+ dir_path.delete
36
+ end
37
+ end
38
+ end
39
+
40
+ def not_self_and_parent(path)
41
+ path.to_s != '.' && path.to_s != '..'
42
+ end
43
+
44
+ def needed_to_remove?(path)
45
+ path.mtime < 1.day.ago || path.size > 300.kilobytes
46
+ end
47
+
48
+ def get_log(log_id)
49
+ name = parse_log_id(log_id)
50
+ path = OLogger.path + name[:module] + name[:file]
51
+ if File.exist?(path)
52
+ OLogger::Parser.parse(File.read(path))
53
+ else
54
+ nil
55
+ end
56
+ end
57
+
58
+ def list_of_modules
59
+ OLogger.path.entries.select { |v| not_self_and_parent v }
60
+ end
61
+
62
+ def get_logs(log_module)
63
+ path = OLogger.path + log_module
64
+ path.entries.select { |v| not_self_and_parent v }.map{ |v| v.to_s.gsub /\.log$/, '' }
65
+ end
66
+
67
+ def parse_log_id(log_id)
68
+ p = log_id.match(/(.+)\.(.+)/i)
69
+ {:module => p[1], :file => p[2] + '.log'}
70
+ end
71
+
72
+ def create_module(log_module)
73
+ path = OLogger.path + log_module
74
+ unless path.exist?
75
+ path.mkpath
76
+ end
77
+ end
78
+
79
+ def logger(logger_module, logger)
80
+ Logger.new('logfile.log')
81
+ end
82
+
83
+ def buffer
84
+ @buffer ||= Buffer.new
85
+ end
86
+
87
+ def enable(&block)
88
+ buffer.flush
89
+ Thread.current[:ologger_raiser] = true
90
+ begin
91
+ yield
92
+ rescue StandardError => e
93
+ e.obj.ologger "Exception:", :objs => [e, e.backtrace]
94
+ on_raise.call(e) if on_raise && on_raise.is_a?(Proc)
95
+ ensure
96
+ Thread.current[:ologger_raiser] = false
97
+ buffer.write
98
+ end
99
+ end
100
+
101
+ def filter(controller, &block)
102
+ enable(&block)
103
+ end
104
+ end
105
+
106
+ def self.included(receiver)
107
+ receiver.send :include, ObjectMethods
108
+ receiver.extend ObjectMethods
109
+ end
110
+
111
+
112
+ end
data/memory ADDED
Binary file
data/ologger.gemspec ADDED
@@ -0,0 +1,60 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{ologger}
8
+ s.version = "0.1.2"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Andrew Rudenko"]
12
+ s.date = %q{2009-09-14}
13
+ s.default_executable = %q{ologger}
14
+ s.description = %q{}
15
+ s.email = %q{ceo@prepor.ru}
16
+ s.executables = ["ologger"]
17
+ s.files = [
18
+ ".gitignore",
19
+ "Rakefile",
20
+ "Readme.rdoc",
21
+ "VERSION",
22
+ "bin/ologger",
23
+ "lib/ologger.rb",
24
+ "lib/ologger/buffer.rb",
25
+ "lib/ologger/middleware.rb",
26
+ "lib/ologger/object_methods.rb",
27
+ "lib/ologger/parser.rb",
28
+ "lib/ologger/raise_patch.rb",
29
+ "lib/ologger/tags",
30
+ "memory",
31
+ "ologger.gemspec",
32
+ "test/test.rb",
33
+ "test/test_helper.rb"
34
+ ]
35
+ s.homepage = %q{http://github.com/prepor/olog}
36
+ s.rdoc_options = ["--charset=UTF-8"]
37
+ s.require_paths = ["lib"]
38
+ s.rubygems_version = %q{1.3.5}
39
+ s.summary = %q{Object separated logs}
40
+ s.test_files = [
41
+ "test/test.rb",
42
+ "test/test_helper.rb"
43
+ ]
44
+
45
+ if s.respond_to? :specification_version then
46
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
47
+ s.specification_version = 3
48
+
49
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
50
+ s.add_runtime_dependency(%q<prepor-artester>, [">= 0"])
51
+ s.add_runtime_dependency(%q<activesupport>, [">= 0"])
52
+ else
53
+ s.add_dependency(%q<prepor-artester>, [">= 0"])
54
+ s.add_dependency(%q<activesupport>, [">= 0"])
55
+ end
56
+ else
57
+ s.add_dependency(%q<prepor-artester>, [">= 0"])
58
+ s.add_dependency(%q<activesupport>, [">= 0"])
59
+ end
60
+ end
data/test/test.rb ADDED
@@ -0,0 +1,97 @@
1
+ require 'test/test_helper'
2
+
3
+ describe OLogger do
4
+ describe "Object with game logger" do
5
+ before(:each) do
6
+ OLogger.buffer.flush
7
+ Object.send :include, OLogger
8
+ @obj = Object.new
9
+
10
+ end
11
+ it "should add message to buffer" do
12
+ mock(OLogger.buffer).add(hash_including(:message => 'hi!'))
13
+ @obj.ologger 'hi!'
14
+ end
15
+
16
+ it "should add objects to buffer" do
17
+ mock(OLogger.buffer).add(hash_including(:message => 'hi!', :objs => [{ :foo => :bar}, { :bar => :foo}]))
18
+ @obj.ologger 'hi!', { :foo => :bar}, { :bar => :foo}
19
+ end
20
+ end
21
+
22
+ describe "ActiveRecord object with game logger" do
23
+ before(:each) do
24
+ Artester[:game_logger].reload
25
+ OLogger.buffer.flush
26
+ Object.send :include, OLogger
27
+ @obj = Object.new
28
+ @ar_obj = Foo.create :name => 'tester', :bar => 'hi!'
29
+ end
30
+
31
+ it "should insert link to ar object" do
32
+ mock(OLogger.buffer).add(hash_including(:message => 'Self:', :objs => [{"name"=>"tester", "id"=>1, "bar"=>"hi!"}]))
33
+ mock(OLogger.buffer).add(hash_including(:message => 'hi!', :objs => ["g#foos.#{@ar_obj.id}#"]))
34
+ stub(OLogger.buffer).add
35
+ @obj.ologger 'hi!', @ar_obj
36
+ end
37
+
38
+ it "should insert itsel description to ar object log" do
39
+ mock(OLogger.buffer).add(hash_including(:message => 'Self:', :objs => [{"name"=>"tester", "id"=>1, "bar"=>"hi!"}]))
40
+ stub(OLogger.buffer).add
41
+
42
+ @obj.ologger 'hi!', @ar_obj
43
+ end
44
+
45
+ it "should raise exceptions" do
46
+ mock(OLogger.buffer).add(hash_including(:message => "Exception:"))
47
+ OLogger.enable do
48
+ Foo.find(10)
49
+ end
50
+ end
51
+
52
+ describe "writing" do
53
+
54
+ before(:all) do
55
+ OLogger.path = Pathname.new('test/ologs')
56
+ OLogger.path.rmtree if OLogger.path.exist?
57
+ end
58
+
59
+ after(:each) do
60
+ OLogger.path.rmtree if OLogger.path.exist?
61
+ end
62
+
63
+ it 'should call raise callback' do
64
+ raiser = lambda { |e| 0 }
65
+ mock(raiser).call(is_a(StandardError))
66
+ OLogger.on_raise = raiser
67
+ OLogger.enable do
68
+ Foo.find(10)
69
+ end
70
+ end
71
+ it "should write logs to file" do
72
+ path = OLogger.path + 'foos' + "#{@ar_obj.id}.log"
73
+ path.exist?.should be_false
74
+ OLogger.enable do
75
+ @ar_obj.ologger 'hi!'
76
+ end
77
+ path.exist?.should be_true
78
+ end
79
+
80
+ describe "garbage collecting" do
81
+ before(:each) do
82
+ OLogger.enable do
83
+ @ar_obj.ologger 'hi!'
84
+ end
85
+ end
86
+ it "should remove all big and old logs" do
87
+ stub(OLogger).needed_to_remove? { true }
88
+ (OLogger.path + 'foos' + "#{@ar_obj.id}.log").exist?.should be_true
89
+ OLogger.gc
90
+ (OLogger.path + 'foos' + "#{@ar_obj.id}.log").exist?.should be_false
91
+ end
92
+ end
93
+ end
94
+
95
+ end
96
+
97
+ end
@@ -0,0 +1,24 @@
1
+ require 'rubygems'
2
+ require 'test/unit'
3
+ require 'spec'
4
+ require 'rr'
5
+ require 'artester'
6
+
7
+ $LOAD_PATH.unshift('lib')
8
+
9
+ require 'lib/ologger'
10
+
11
+ Spec::Runner.configure do |config|
12
+ config.mock_with :rr
13
+ end
14
+
15
+ Artester.init
16
+
17
+ Artester.def :game_logger do
18
+ model :foo do
19
+ definition do |t|
20
+ t.string :name
21
+ t.string :bar
22
+ end
23
+ end
24
+ end
metadata ADDED
@@ -0,0 +1,89 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: prepor-ologger
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.2
5
+ platform: ruby
6
+ authors:
7
+ - Andrew Rudenko
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-09-14 00:00:00 -07:00
13
+ default_executable: ologger
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: prepor-artester
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: activesupport
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: "0"
34
+ version:
35
+ description: ""
36
+ email: ceo@prepor.ru
37
+ executables:
38
+ - ologger
39
+ extensions: []
40
+
41
+ extra_rdoc_files: []
42
+
43
+ files:
44
+ - .gitignore
45
+ - Rakefile
46
+ - Readme.rdoc
47
+ - VERSION
48
+ - bin/ologger
49
+ - lib/ologger.rb
50
+ - lib/ologger/buffer.rb
51
+ - lib/ologger/middleware.rb
52
+ - lib/ologger/object_methods.rb
53
+ - lib/ologger/parser.rb
54
+ - lib/ologger/raise_patch.rb
55
+ - lib/ologger/tags
56
+ - memory
57
+ - ologger.gemspec
58
+ - test/test.rb
59
+ - test/test_helper.rb
60
+ has_rdoc: false
61
+ homepage: http://github.com/prepor/olog
62
+ licenses:
63
+ post_install_message:
64
+ rdoc_options:
65
+ - --charset=UTF-8
66
+ require_paths:
67
+ - lib
68
+ required_ruby_version: !ruby/object:Gem::Requirement
69
+ requirements:
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: "0"
73
+ version:
74
+ required_rubygems_version: !ruby/object:Gem::Requirement
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ version: "0"
79
+ version:
80
+ requirements: []
81
+
82
+ rubyforge_project:
83
+ rubygems_version: 1.3.5
84
+ signing_key:
85
+ specification_version: 3
86
+ summary: Object separated logs
87
+ test_files:
88
+ - test/test.rb
89
+ - test/test_helper.rb