em_logger 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 032c8a3cd33d96de73fb75b23c08cad8a60ee8e3
4
+ data.tar.gz: e241e3b0bedbd54d6bc87e044cc820d837a7c0f5
5
+ SHA512:
6
+ metadata.gz: ed8f34da9959074d17935d17f81c66a39f3b5d76d31acf5e9ed785476cc51e407067365ecdd3d009d7cb72e3a9baa5ca76a9d58e3c3b079f95a0676de56e4721
7
+ data.tar.gz: 77f2ec37dd4f176edcc8dbecaa3e69cb56a99fffb06f534e6758aa0ca42428306a45184c4f6c8b26364bbf92e1162178b2c7260a64c274d27b1d0371233a2e64
data/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ .idea/
2
+ coverage
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --color
2
+ --format=progress
3
+ --backtrace
data/Gemfile ADDED
@@ -0,0 +1,11 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'rake'
4
+ gem 'yard'
5
+
6
+ group :test do
7
+ gem 'rspec'
8
+ gem 'simplecov'
9
+ end
10
+
11
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,47 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ em_logger (1.0)
5
+ eventmachine (>= 0.12.10)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ diff-lcs (1.2.5)
11
+ docile (1.1.5)
12
+ eventmachine (1.0.9.1)
13
+ json (1.8.3)
14
+ rake (10.5.0)
15
+ rspec (3.4.0)
16
+ rspec-core (~> 3.4.0)
17
+ rspec-expectations (~> 3.4.0)
18
+ rspec-mocks (~> 3.4.0)
19
+ rspec-core (3.4.1)
20
+ rspec-support (~> 3.4.0)
21
+ rspec-expectations (3.4.0)
22
+ diff-lcs (>= 1.2.0, < 2.0)
23
+ rspec-support (~> 3.4.0)
24
+ rspec-mocks (3.4.1)
25
+ diff-lcs (>= 1.2.0, < 2.0)
26
+ rspec-support (~> 3.4.0)
27
+ rspec-support (3.4.1)
28
+ simplecov (0.11.1)
29
+ docile (~> 1.1.0)
30
+ json (~> 1.8)
31
+ simplecov-html (~> 0.10.0)
32
+ simplecov-html (0.10.0)
33
+ yard (0.8.7.6)
34
+
35
+ PLATFORMS
36
+ ruby
37
+
38
+ DEPENDENCIES
39
+ bundler (~> 1.0)
40
+ em_logger!
41
+ rake
42
+ rspec
43
+ simplecov
44
+ yard
45
+
46
+ BUNDLED WITH
47
+ 1.10.6
data/LICENSE.md ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) Valery Mayatsky
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,36 @@
1
+ # EventMachine Logger
2
+
3
+ EM::Logger is a simple async wrapper around the ruby logger class. It responds to all the log levels you are familiar with
4
+ from existing loggers (info, debug, warn, etc.). The only difference is that it's instantiated by passing an existing logger in when initializing.
5
+
6
+ Getting started
7
+ ---------------
8
+ 1. Add SimpleCov to your `Gemfile` and `bundle install`:
9
+
10
+ ```ruby
11
+ gem 'em_logger'
12
+ ```
13
+
14
+ 2. Require it in code and use:
15
+
16
+ ```ruby
17
+ require 'eventmachine'
18
+ require 'logger'
19
+ require 'em_logger'
20
+
21
+ logger = EM::Logger.new(Logger.new(STDOUT))
22
+
23
+ EM.run do
24
+ logger.debug('Wow!')
25
+
26
+ EM.stop
27
+ end
28
+ ```
29
+
30
+ 3. How does it work?
31
+
32
+ It pushes all your log requests into queue and the separate thread pops them and delegates to the standard Ruby logger.
33
+
34
+ ## Copyright
35
+
36
+ Copyright (c) Valery Mayatsky. See LICENSE for details.
data/Rakefile ADDED
@@ -0,0 +1,15 @@
1
+ require 'bundler/gem_tasks'
2
+
3
+ require 'rspec/core/rake_task'
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
7
+ task :test => :spec
8
+
9
+ require 'yard'
10
+ namespace :doc do
11
+ YARD::Rake::YardocTask.new do |task|
12
+ task.files = ['LICENSE.md', 'lib/**/*.rb']
13
+ task.options = ['--markup', 'markdown']
14
+ end
15
+ end
data/em_logger.gemspec ADDED
@@ -0,0 +1,24 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'em_logger/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = 'em_logger'
8
+ gem.version = EventMachine::Logger::VERSION
9
+ gem.homepage = 'https://github.com/Arugin/em_logger'
10
+
11
+ gem.author = 'Valery Mayatsky'
12
+ gem.email = 'valerymayatsky@gmail.com'
13
+ gem.description = 'An async wrapper for ruby logger for EventMachine applications.'
14
+ gem.summary = 'An async wrapper for ruby logger for EventMachine applications.'
15
+
16
+ gem.add_dependency 'eventmachine', '>= 0.12.10'
17
+ gem.add_development_dependency 'bundler', '~> 1.0'
18
+
19
+ gem.executables = `git ls-files -- bin/*`.split("\n").map{|f| File.basename(f)}
20
+ gem.files = `git ls-files`.split("\n")
21
+ gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
22
+
23
+ gem.require_paths = ['lib']
24
+ end
data/lib/em_logger.rb ADDED
@@ -0,0 +1 @@
1
+ require 'em_logger/logger'
@@ -0,0 +1,111 @@
1
+ require 'eventmachine'
2
+ require 'logger'
3
+
4
+ module EventMachine
5
+ class LogMessage
6
+ attr_accessor :severity, :message, :progname
7
+
8
+ def initialize(severity, message = nil, progname = nil)
9
+ @severity = severity
10
+ @message = message
11
+ @progname = progname
12
+ end
13
+
14
+ end
15
+
16
+ class Logger
17
+
18
+ attr_reader :logger
19
+ attr_reader :logger_queue
20
+
21
+ def self.logger(logger = nil)
22
+ @logger ||= new(logger || ::Logger.new(STDOUT))
23
+ end
24
+
25
+ def initialize(logger)
26
+ @logger = logger
27
+ @logger_queue = ::Queue.new
28
+
29
+ start_worker
30
+
31
+ EM.add_shutdown_hook { drain } if EM.reactor_running?
32
+ end
33
+
34
+ def add(severity, message = nil, progname = nil)
35
+ return true if severity < @logger.level
36
+ if message.nil?
37
+ if block_given?
38
+ message = yield
39
+ else
40
+ message = progname
41
+ progname = @logger.progname
42
+ end
43
+ end
44
+ @logger_queue.push(LogMessage.new(severity, message, progname))
45
+ @worker.wakeup
46
+ end
47
+
48
+ alias log add
49
+
50
+ def debug(progname = nil, &block)
51
+ add(::Logger::DEBUG, nil, progname, &block)
52
+ end
53
+
54
+ def info(progname = nil, &block)
55
+ add(::Logger::INFO, nil, progname, &block)
56
+ end
57
+
58
+ def warn(progname = nil, &block)
59
+ add(::Logger::WARN, nil, progname, &block)
60
+ end
61
+
62
+ def error(progname = nil, &block)
63
+ add(::Logger::ERROR, nil, progname, &block)
64
+ end
65
+
66
+ def fatal(progname = nil, &block)
67
+ add(::Logger::FATAL, nil, progname, &block)
68
+ end
69
+
70
+ def unknown(progname = nil, &block)
71
+ add(::Logger::UNKNOWN, nil, progname, &block)
72
+ end
73
+
74
+ def <<(data)
75
+ @logger_queue.push(LogMessage.new(nil, data))
76
+ end
77
+
78
+ def method_missing(method, *args, &block)
79
+ return super unless @logger.respond_to?(method)
80
+ @logger.send(method, *args, &block)
81
+ end
82
+
83
+ def respond_to?(method, include_private = false)
84
+ @logger.respond_to?(method, include_private) || super(method, include_private)
85
+ end
86
+
87
+ private
88
+
89
+ def drain
90
+ until @worker.stop?
91
+
92
+ end
93
+ end
94
+
95
+ def start_worker
96
+ @worker = Thread.new do
97
+
98
+ loop do
99
+ until @logger_queue.empty?
100
+ log_message = @logger_queue.pop(true)
101
+ @logger.add(log_message.severity, log_message.message, log_message.progname)
102
+ end
103
+ Thread.stop
104
+ end
105
+
106
+ end
107
+ @worker.abort_on_exception = true
108
+ end
109
+
110
+ end
111
+ end
@@ -0,0 +1,5 @@
1
+ module EventMachine
2
+ class Logger
3
+ VERSION = '1.0.0'
4
+ end
5
+ end
@@ -0,0 +1,111 @@
1
+ require 'spec_helper'
2
+
3
+ describe EventMachine::Logger do
4
+ let(:logger) { ::Logger.new(STDOUT) }
5
+
6
+ describe 'creating' do
7
+ subject { EventMachine::Logger.new(logger) }
8
+
9
+ it 'instantiates with a logger' do
10
+ EM.run_block do
11
+ expect(subject.logger).to eq(logger)
12
+ end
13
+ end
14
+
15
+ it 'adds a shutdown hook when the reactor is running' do
16
+ EM.run_block do
17
+ expect(EM).to receive(:add_shutdown_hook).and_yield
18
+ subject
19
+ end
20
+ end
21
+
22
+ it 'starts the queue worker' do
23
+ expect(logger).to receive('add').once
24
+
25
+ EM.run_block do
26
+ subject.debug('this is a test')
27
+ EM.stop
28
+ end
29
+ end
30
+ end
31
+
32
+ describe 'log statements' do
33
+ let(:em_logger) { EventMachine::Logger.new(logger) }
34
+
35
+ %w(debug info warn error fatal).each do |l|
36
+ describe "##{l}" do
37
+ it 'pushes the log message onto the logger_queue' do
38
+ expect(em_logger.logger_queue).to receive('push').once
39
+ em_logger.send("#{l}", 'this is a test')
40
+ end
41
+ end
42
+ end
43
+
44
+ describe '#unknown' do
45
+ it 'pushes the log message onto the logger_queue' do
46
+ expect(em_logger.logger_queue).to receive('push').once
47
+ em_logger.unknown('this is a test')
48
+ end
49
+ end
50
+
51
+ describe '#<<' do
52
+ it 'pushes the log message onto the logger_queue' do
53
+ expect(em_logger.logger_queue).to receive('push').once
54
+ em_logger << 'this is a test'
55
+ end
56
+ end
57
+ end
58
+
59
+ describe 'queuing' do
60
+ describe '#add' do
61
+ context 'when logging below the defined level' do
62
+ it 'pushes the log message onto the logger_queue' do
63
+ logger.level = ::Logger::WARN
64
+ em_logger = EventMachine::Logger.new(logger)
65
+ expect(em_logger.logger_queue).to_not receive('push')
66
+ expect(em_logger.add(::Logger::INFO, 'this is a test')).to be_truthy
67
+ end
68
+ end
69
+
70
+ context 'when logging above the defined level' do
71
+ it 'pushes the log message onto the logger_queue' do
72
+ em_logger = EventMachine::Logger.new(logger)
73
+ expect(em_logger.logger_queue).to receive('push').once
74
+ em_logger.add(::Logger::INFO, 'this is a test')
75
+ end
76
+ end
77
+
78
+ context 'when using a block' do
79
+ it 'evaluates the block' do
80
+ em_logger = EventMachine::Logger.new(logger)
81
+ expect(em_logger.logger_queue).to receive('push').once
82
+ em_logger.add(::Logger::INFO) { 'ohai' }
83
+ end
84
+ end
85
+ end
86
+ end
87
+
88
+ describe 'delegating to logger' do
89
+ describe 'method_missing' do
90
+ it 'passes through to the underlying logger' do
91
+ em_logger = EventMachine::Logger.new(logger)
92
+ expect(logger).to receive('level').once
93
+ em_logger.level
94
+ end
95
+
96
+ it 'returns the underlying loggers value' do
97
+ logger.level = ::Logger::WARN
98
+ em_logger = EventMachine::Logger.new(logger)
99
+ expect(em_logger.level).to eq(::Logger::WARN)
100
+ end
101
+ end
102
+
103
+ describe 'respond_to?' do
104
+ it 'responds to methods defined on the logger' do
105
+ em_logger = EventMachine::Logger.new(logger)
106
+ expect(em_logger.respond_to?('level')).to be_truthy
107
+ end
108
+ end
109
+ end
110
+
111
+ end
@@ -0,0 +1,6 @@
1
+ require 'simplecov'
2
+ SimpleCov.start
3
+
4
+ require 'em_logger'
5
+ require 'rspec'
6
+ require 'logger'
metadata ADDED
@@ -0,0 +1,84 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: em_logger
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Valery Mayatsky
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-01-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: eventmachine
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 0.12.10
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 0.12.10
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.0'
41
+ description: An async wrapper for ruby logger for EventMachine applications.
42
+ email: valerymayatsky@gmail.com
43
+ executables: []
44
+ extensions: []
45
+ extra_rdoc_files: []
46
+ files:
47
+ - ".gitignore"
48
+ - ".rspec"
49
+ - Gemfile
50
+ - Gemfile.lock
51
+ - LICENSE.md
52
+ - README.md
53
+ - Rakefile
54
+ - em_logger.gemspec
55
+ - lib/em_logger.rb
56
+ - lib/em_logger/logger.rb
57
+ - lib/em_logger/version.rb
58
+ - spec/logger_spec.rb
59
+ - spec/spec_helper.rb
60
+ homepage: https://github.com/Arugin/em_logger
61
+ licenses: []
62
+ metadata: {}
63
+ post_install_message:
64
+ rdoc_options: []
65
+ require_paths:
66
+ - lib
67
+ required_ruby_version: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ version: '0'
72
+ required_rubygems_version: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ requirements: []
78
+ rubyforge_project:
79
+ rubygems_version: 2.4.8
80
+ signing_key:
81
+ specification_version: 4
82
+ summary: An async wrapper for ruby logger for EventMachine applications.
83
+ test_files: []
84
+ has_rdoc: