prepor-ologger 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/.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