cabin 0.1.5 → 0.1.6

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/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
+