flnt 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 11f597c1c684124be6cbbc17b8b2fa388aa68ea6
4
- data.tar.gz: 1f2b8774e99a066dcafd5032b1e0fd2d9447c109
3
+ metadata.gz: b571a4742a35bac7d8b9b94fdd9f764ba19d3f95
4
+ data.tar.gz: 6795af010a0846ef8250a3a27fb64b292cc4baab
5
5
  SHA512:
6
- metadata.gz: 7dd93d150a0e618ca658560ae9b98d13b5c58c345899dfbda1f2d3c590a223850ed613333c00aaf0bbc89c32af27fb520b0b5e1c9596f406d0edc552bcab637e
7
- data.tar.gz: b3d4a5c6cd88a13509e93a8351d6393966cecced7b23016c9ee0b754500ad9baf2c0c796e13564f91b8c0fbecc1da799a6c58443fb1d8d8df8233e639b95add1
6
+ metadata.gz: 04d5b1811f70c88b598ad5690565dff3a259dd741543c885848f7cc91f2f93467bedce0282003ac55a21cb6e0ba73d3f313f434ddd929fef24184f61d49efc0d
7
+ data.tar.gz: f1f7dedc3d305b4a255a72fa53479a2ad70c3d848369b70f79b8a5c3c678757ed5c9573f2188d3bd53b9ecff5e82906a79253343d1b7c47dd2cd4b96f84ef03a
data/flnt.gemspec CHANGED
@@ -24,5 +24,6 @@ Gem::Specification.new do |spec|
24
24
  spec.add_development_dependency "rake"
25
25
  spec.add_development_dependency "pry"
26
26
 
27
- spec.add_development_dependency "rspec"
27
+ spec.add_development_dependency "rspec", ">= 3.1"
28
+ spec.add_development_dependency "rspec-mocks"
28
29
  end
data/lib/flnt.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require "flnt/version"
2
2
  require "flnt/logger"
3
+ require "flnt/teeable_logger"
3
4
  require "flnt/configuration"
4
5
 
5
6
  module Flnt
@@ -10,7 +11,9 @@ module Flnt
10
11
  (BasicObject.instance_methods + BasicObject.private_instance_methods)).
11
12
  delete_if {|method_name| method_name.to_s =~ /([\-\[\]\/~=+*&|%<>!?])/}.
12
13
  each do |target_method|
13
- if target_method.to_sym != :object_id
14
+
15
+ # Also pass the :singleton_class to avoid rspec stubbing errors
16
+ unless [:singleton_class, :object_id].include?(target_method.to_sym)
14
17
  eval %Q(undef #{target_method})
15
18
  end
16
19
  end
data/lib/flnt/logger.rb CHANGED
@@ -1,4 +1,6 @@
1
1
  require 'fluent/logger'
2
+ require 'logger'
3
+ require 'pathname'
2
4
 
3
5
  module Flnt
4
6
  class Logger < BasicObject
@@ -17,7 +19,36 @@ module Flnt
17
19
  return self
18
20
  end
19
21
 
22
+ # method caching for common log level name
23
+ %w(debug info warn error fatal).each do |log_level|
24
+ define_method log_level do |*args|
25
+ @tag << "." << log_level.to_s
26
+ unless args.empty?
27
+ emit! args.first
28
+ end
29
+
30
+ return self
31
+ end
32
+ end
33
+
20
34
  def emit!(arg)
35
+ ::Fluent::Logger.post @tag, to_info!(arg)
36
+ end
37
+
38
+ def tee!(logger_or_path)
39
+ new_self = TeeableLogger.new(@tag)
40
+ case
41
+ when logger_or_path.respond_to?(:info)
42
+ new_self.teed_logger = logger_or_path
43
+ when [::String, ::Pathname].include?(logger_or_path.class)
44
+ l = ::Logger.new(logger_or_path)
45
+ new_self.teed_logger = l
46
+ end
47
+ new_self
48
+ end
49
+
50
+ private
51
+ def to_info!(arg)
21
52
  info = {}
22
53
  case arg
23
54
  when ::Hash
@@ -31,7 +62,8 @@ module Flnt
31
62
  else
32
63
  info[:info] = arg
33
64
  end
34
- ::Fluent::Logger.post @tag, info
65
+
66
+ info
35
67
  end
36
68
  end
37
69
  end
@@ -0,0 +1,20 @@
1
+ require 'logger'
2
+ require 'flnt/logger'
3
+
4
+ module Flnt
5
+ class TeeableLogger < Flnt::Logger
6
+ attr_accessor :teed_logger
7
+
8
+ def emit!(arg)
9
+ level = __get_last_tag!
10
+ level = 'info' unless %w(debug info warn error fatal).include?(level)
11
+ teed_logger.send(level, arg)
12
+ super
13
+ end
14
+
15
+ private
16
+ def __get_last_tag!
17
+ @tag.split('.').last
18
+ end
19
+ end
20
+ end
data/lib/flnt/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Flnt
2
- VERSION = "0.1.1"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -3,6 +3,7 @@ require "spec_helper"
3
3
  describe "Flnt::Logger" do
4
4
  before do
5
5
  allow(Fluent::Logger::FluentLogger).to receive(:open).with(nil, an_instance_of(Hash))
6
+ .and_return(instance_double("Fluent::Logger::FluentLogger", :post => true))
6
7
  end
7
8
 
8
9
  def tag_of(flnt_logger)
@@ -0,0 +1,53 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Flnt::TeeableLogger' do
4
+ before do
5
+ allow(Fluent::Logger::FluentLogger).to receive(:open).with(nil, an_instance_of(Hash))
6
+ .and_return(instance_double("Fluent::Logger::FluentLogger", :post => true))
7
+ end
8
+
9
+ describe '#tee!' do
10
+ let(:flnt) { Flnt.cool_log }
11
+ let(:logger) { Logger.new('/dev/null') }
12
+ let(:new_logger) { flnt.tee!(logger) }
13
+
14
+ it 'should set the teed logger' do
15
+ expect(new_logger.teed_logger).to be(logger)
16
+ end
17
+
18
+ it 'should tee the log to another logger' do
19
+ expect(Fluent::Logger).to receive(:post).with("cool_log.info", {message: "Hello from Hell"})
20
+ expect(logger).to receive(:info).with("Hello from Hell")
21
+
22
+ new_logger.info "Hello from Hell"
23
+ end
24
+
25
+ context 'passed just a path' do
26
+ let(:path) { "/tmp/log-#{$$}.log" }
27
+ let(:new_logger) { flnt.tee!(path) }
28
+
29
+ it 'should create a logger pointing to the path' do
30
+ expect(new_logger.teed_logger).to be_an_instance_of(Logger)
31
+ logdev = new_logger.teed_logger.instance_eval { @logdev }
32
+ expect(logdev.dev.path).to eq path
33
+ end
34
+ end
35
+
36
+ context 'passed just a pathname' do
37
+ let(:path) do
38
+ p = Pathname.new("/tmp/log-#{$$}")
39
+ p.join("app.log")
40
+ p
41
+ end
42
+ let(:new_logger) { flnt.tee!(path) }
43
+
44
+ it 'should create a logger pointing to the path' do
45
+ expect(new_logger.teed_logger).to be_an_instance_of(Logger)
46
+ logdev = new_logger.teed_logger.instance_eval { @logdev }
47
+ expect(logdev.dev.path).to eq path.to_s
48
+ end
49
+ end
50
+ end
51
+
52
+ # FIXME using fakefs to test real log file
53
+ end
@@ -12,30 +12,37 @@ describe "Flnt" do
12
12
  Flnt.init_foo
13
13
  end
14
14
 
15
- it "should initialize fluentd connection just once" do
16
- allow(Flnt).to receive(:initialized?).and_return(true)
17
-
18
- expect(Fluent::Logger::FluentLogger).not_to receive(:open)
19
- expect(Flnt).not_to receive(:Configuration)
20
- Flnt.init_foo
21
- end
22
-
23
- it "should return Flnt::Logger tagged with called method name" do
24
- ret = Flnt.init_foo
25
- expect(ret.instance_eval { @tag }).to eq "init_foo"
26
-
27
- expect { ret.chain_bar }.not_to raise_error
28
- expect { ret.respond_to? }.to raise_error NoMethodError
29
- end
30
-
31
- it "should create a new logger for each call" do
32
- logger1 = Flnt.foo_tag
33
- logger2 = Flnt.foo_tag
34
- expect(logger1.__id__).not_to eq logger2.__id__
35
- end
36
-
37
- it "should create a new logger with custom tag" do
38
- logger = Flnt.tag!("foo.bar.buz")
39
- expect(logger.instance_eval { @tag }).to eq "foo.bar.buz"
15
+ describe 'on connection ok' do
16
+ before do
17
+ allow(Fluent::Logger::FluentLogger).to receive(:open).with(nil, an_instance_of(Hash))
18
+ .and_return(instance_double("Fluent::Logger::FluentLogger", :post => true))
19
+ end
20
+
21
+ it "should initialize fluentd connection just once" do
22
+ allow(Flnt).to receive(:initialized?).and_return(true)
23
+
24
+ expect(Fluent::Logger::FluentLogger).not_to receive(:open)
25
+ expect(Flnt).not_to receive(:Configuration)
26
+ Flnt.init_foo
27
+ end
28
+
29
+ it "should return Flnt::Logger tagged with called method name" do
30
+ ret = Flnt.init_foo
31
+ expect(ret.instance_eval { @tag }).to eq "init_foo"
32
+
33
+ expect { ret.chain_bar }.not_to raise_error
34
+ expect { ret.respond_to? }.to raise_error NoMethodError
35
+ end
36
+
37
+ it "should create a new logger for each call" do
38
+ logger1 = Flnt.foo_tag
39
+ logger2 = Flnt.foo_tag
40
+ expect(logger1.__id__).not_to eq logger2.__id__
41
+ end
42
+
43
+ it "should create a new logger with custom tag" do
44
+ logger = Flnt.tag!("foo.bar.buz")
45
+ expect(logger.instance_eval { @tag }).to eq "foo.bar.buz"
46
+ end
40
47
  end
41
48
  end
data/spec/spec_helper.rb CHANGED
@@ -7,7 +7,6 @@
7
7
  require 'flnt'
8
8
 
9
9
  RSpec.configure do |config|
10
- config.treat_symbols_as_metadata_keys_with_true_values = true
11
10
  config.run_all_when_everything_filtered = true
12
11
  config.filter_run :focus if ENV['FOCUS']
13
12
 
@@ -16,4 +15,10 @@ RSpec.configure do |config|
16
15
  # the seed, which is printed after each run.
17
16
  # --seed 1234
18
17
  config.order = 'random'
18
+
19
+ config.after :each do
20
+ Flnt.instance_eval {
21
+ @initialized = false
22
+ }
23
+ end
19
24
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flnt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Uchio KONDO
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-20 00:00:00.000000000 Z
11
+ date: 2014-12-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fluent-logger
@@ -68,6 +68,20 @@ dependencies:
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '3.1'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '3.1'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec-mocks
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
87
  - - '>='
@@ -97,9 +111,11 @@ files:
97
111
  - lib/flnt.rb
98
112
  - lib/flnt/configuration.rb
99
113
  - lib/flnt/logger.rb
114
+ - lib/flnt/teeable_logger.rb
100
115
  - lib/flnt/version.rb
101
116
  - spec/lib/flnt/configuration_spec.rb
102
117
  - spec/lib/flnt/logger_spec.rb
118
+ - spec/lib/flnt/teeable_logger_spec.rb
103
119
  - spec/lib/flnt_spec.rb
104
120
  - spec/spec_helper.rb
105
121
  - wercker.yml
@@ -130,5 +146,6 @@ summary: Gentle post-to-fluentd log solution
130
146
  test_files:
131
147
  - spec/lib/flnt/configuration_spec.rb
132
148
  - spec/lib/flnt/logger_spec.rb
149
+ - spec/lib/flnt/teeable_logger_spec.rb
133
150
  - spec/lib/flnt_spec.rb
134
151
  - spec/spec_helper.rb