cabin 0.1.5 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELIST CHANGED
@@ -1,3 +1,12 @@
1
+ v0.1.6 (2011-11-07)
2
+ - Add 'Dragons' mixin for times when info/debug/fatal log levels don't cut it
3
+ and you'd rather deal in D&D alignments instead.
4
+ - Add Cabin::Outputs::EmStdlibLogger which wraps ruby's stdlib logger but in
5
+ a way smartly usable with EventMachine. (Contributed by Sean Porter)
6
+ - Moved mixins to Cabin::Mixins like Logger and the new Dragon mixin.
7
+
8
+ v0.1.3 through v0.1.5 were not documented here. Sad.
9
+
1
10
  v0.1.2 (2011-10-12)
2
11
  - Added file+line+method context if the logger level is debug
3
12
 
data/lib/cabin/channel.rb CHANGED
@@ -1,4 +1,4 @@
1
- require "cabin/logger"
1
+ require "cabin/mixins/logger"
2
2
  require "cabin/namespace"
3
3
  require "cabin/timer"
4
4
  require "cabin/context"
@@ -43,7 +43,7 @@ require "logger"
43
43
  # I, [2011-10-11T01:00:57.993575 #1209] INFO -- : {:timestamp=>"2011-10-11T01:00:57.993517-0700", :message=>"Done in foo", :level=>:info}
44
44
  #
45
45
  class Cabin::Channel
46
- include Cabin::Logger
46
+ include Cabin::Mixins::Logger
47
47
 
48
48
  # Create a new logging channel.
49
49
  # The default log level is 'info'
@@ -0,0 +1,34 @@
1
+ require "cabin/namespace"
2
+
3
+ # An experiment to use AD&D-style log levels, because why not? 'info' and
4
+ # 'fatal' and other log levels are pretty lame anyway.
5
+ #
6
+ # Plus, now you can 'include Dragons' in your logger, which means it
7
+ # has +2 against Knights and a special fire breathing attack..
8
+ module Cabin::Mixins::Dragons
9
+ orders = %w(lawful ambivalent chaotic)
10
+ desires = %w(good neutral evil)
11
+
12
+ orders.each do |order|
13
+ desires.each do |desire|
14
+ # alignment will be like 'lawful_good' etc
15
+ alignment = "#{order} #{desire}"
16
+ define_method(alignment.gsub(" ", "_")) do |message, data={}|
17
+ log(alignment, message, data)
18
+ end
19
+ end # desires
20
+ end # orders
21
+
22
+ private
23
+ def log(alignment, message, data={})
24
+ # Invoke 'info?' etc to ask if we should act.
25
+ if message.is_a?(Hash)
26
+ data.merge!(message)
27
+ else
28
+ data[:message] = message
29
+ end
30
+
31
+ data[:alignment] = alignment
32
+ publish(data)
33
+ end # def log
34
+ end # module Cabin::Dragons
@@ -2,7 +2,7 @@ require "cabin/namespace"
2
2
 
3
3
  # This module implements methods that act somewhat like Ruby's Logger class
4
4
  # It is included in Cabin::Channel
5
- module Cabin::Logger
5
+ module Cabin::Mixins::Logger
6
6
  attr_accessor :level
7
7
  LEVELS = {
8
8
  :fatal => 0,
@@ -79,4 +79,4 @@ module Cabin::Logger
79
79
  data[:line] = line
80
80
  data[:method] = method
81
81
  end # def debugharder
82
- end # module Cabin::Logger
82
+ end # module Cabin::Mixins::Logger
@@ -1,3 +1,4 @@
1
1
  module Cabin
2
2
  module Outputs; end
3
+ module Mixins; end
3
4
  end
@@ -0,0 +1,39 @@
1
+ require "cabin"
2
+ require "json"
3
+ require "eventmachine"
4
+
5
+ # Wrap Ruby stdlib's logger and make it EventMachine friendly. This
6
+ # allows you to output to a normal ruby logger with Cabin. Since
7
+ # Ruby's Logger has a love for strings alone, this wrapper will
8
+ # convert the data/event to json before sending it to Logger.
9
+ class Cabin::Outputs::EmStdlibLogger
10
+ public
11
+ def initialize(logger)
12
+ @logger_queue = EM::Queue.new
13
+ @logger = logger
14
+ consumer # Consume lines from a queue and send them with logger
15
+ end # def initialize
16
+
17
+ def consumer
18
+ line_sender = Proc.new do |line|
19
+ # This will call @logger.info(data) or something similar
20
+ @logger.send(line[:method], line[:message])
21
+ EM.next_tick do
22
+ # Do it again
23
+ @logger_queue.pop(&line_sender)
24
+ end
25
+ end
26
+ # Pop line off queue and send it with logger
27
+ @logger_queue.pop(&line_sender)
28
+ end
29
+
30
+ # Receive an event
31
+ public
32
+ def <<(data)
33
+ line = Hash.new
34
+ line[:method] = data[:level] || "info"
35
+ line[:message] = "#{data[:message]} #{data.to_json}"
36
+ # Push line onto queue for later sending
37
+ @logger_queue.push(line)
38
+ end # def <<
39
+ end # class Cabin::Outputs::EmStdlibLogger
data/lib/test.rb ADDED
@@ -0,0 +1,8 @@
1
+ require "cabin"
2
+ require "cabin/mixins/dragons"
3
+
4
+ logger = Cabin::Channel.new
5
+ logger.subscribe(Logger.new(STDOUT))
6
+ logger.extend(Cabin::Mixins::Dragons)
7
+
8
+ logger.chaotic_evil("Some shit is whack")
metadata CHANGED
@@ -1,75 +1,97 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: cabin
3
- version: !ruby/object:Gem::Version
4
- version: 0.1.5
3
+ version: !ruby/object:Gem::Version
4
+ hash: 23
5
5
  prerelease:
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 6
10
+ version: 0.1.6
6
11
  platform: ruby
7
- authors:
12
+ authors:
8
13
  - Jordan Sissel
9
14
  autorequire:
10
15
  bindir: bin
11
16
  cert_chain: []
12
- date: 2011-10-28 00:00:00.000000000Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
17
+
18
+ date: 2011-11-08 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
15
21
  name: json
16
- requirement: &7463400 !ruby/object:Gem::Requirement
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
17
24
  none: false
18
- requirements:
19
- - - ! '>='
20
- - !ruby/object:Gem::Version
21
- version: '0'
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ hash: 3
29
+ segments:
30
+ - 0
31
+ version: "0"
22
32
  type: :runtime
23
- prerelease: false
24
- version_requirements: *7463400
25
- description: This is an experiment to try and make logging more flexible and more
26
- consumable. Plain text logs are bullshit, let's emit structured and contextual logs.
27
- email:
33
+ version_requirements: *id001
34
+ description: This is an experiment to try and make logging more flexible and more consumable. Plain text logs are bullshit, let's emit structured and contextual logs.
35
+ email:
28
36
  - jls@semicomplete.com
29
- executables:
37
+ executables:
30
38
  - rubygems-cabin-test
31
39
  extensions: []
40
+
32
41
  extra_rdoc_files: []
33
- files:
34
- - lib/cabin.rb
42
+
43
+ files:
44
+ - lib/test.rb
45
+ - lib/cabin/context.rb
46
+ - lib/cabin/timer.rb
35
47
  - lib/cabin/outputs/stdlib-logger.rb
36
- - lib/cabin/channel.rb
48
+ - lib/cabin/outputs/em-stdlib-logger.rb
49
+ - lib/cabin/mixins/logger.rb
50
+ - lib/cabin/mixins/dragons.rb
37
51
  - lib/cabin/namespace.rb
38
- - lib/cabin/timer.rb
39
- - lib/cabin/context.rb
40
- - lib/cabin/logger.rb
52
+ - lib/cabin/channel.rb
53
+ - lib/cabin.rb
41
54
  - examples/fibonacci-timing.rb
42
55
  - examples/sinatra-logging.rb
43
56
  - examples/sample.rb
44
- - test/minitest-patch.rb
45
57
  - test/test_logging.rb
58
+ - test/minitest-patch.rb
46
59
  - LICENSE
47
60
  - CHANGELIST
48
61
  - bin/rubygems-cabin-test
49
62
  homepage: https://github.com/jordansissel/ruby-cabin
50
- licenses:
63
+ licenses:
51
64
  - Apache License (2.0)
52
65
  post_install_message:
53
66
  rdoc_options: []
54
- require_paths:
67
+
68
+ require_paths:
55
69
  - lib
56
70
  - lib
57
- required_ruby_version: !ruby/object:Gem::Requirement
71
+ required_ruby_version: !ruby/object:Gem::Requirement
58
72
  none: false
59
- requirements:
60
- - - ! '>='
61
- - !ruby/object:Gem::Version
62
- version: '0'
63
- required_rubygems_version: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ hash: 3
77
+ segments:
78
+ - 0
79
+ version: "0"
80
+ required_rubygems_version: !ruby/object:Gem::Requirement
64
81
  none: false
65
- requirements:
66
- - - ! '>='
67
- - !ruby/object:Gem::Version
68
- version: '0'
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ hash: 3
86
+ segments:
87
+ - 0
88
+ version: "0"
69
89
  requirements: []
90
+
70
91
  rubyforge_project:
71
- rubygems_version: 1.8.10
92
+ rubygems_version: 1.7.2
72
93
  signing_key:
73
94
  specification_version: 3
74
95
  summary: Experiments in structured and contextual logging
75
96
  test_files: []
97
+