ztk 0.0.3 → 0.0.4

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/lib/ztk/logger.rb CHANGED
@@ -41,7 +41,7 @@ module ZTK
41
41
  file = Regexp.last_match[1]
42
42
  line = Regexp.last_match[2]
43
43
  method = Regexp.last_match[3]
44
- "#{File.basename(file)}:#{line}:#{method} | "
44
+ "#{File.basename(file)}:#{line}:#{method}|"
45
45
  else
46
46
  ""
47
47
  end
@@ -54,9 +54,9 @@ module ZTK
54
54
 
55
55
  called_by = parse_caller(caller[1])
56
56
  msg = (block && block.call)
57
- return if (msg.nil? || msg.strip.empty?)
58
- message = [message, progname, msg].delete_if{|i| i == nil}.join(": ")
59
- message = "%19s.%06d+%05d|%5s|%s%s\n" % [Time.now.utc.strftime("%Y-%m-%d %H:%M:%S"), Time.now.utc.usec, Process.pid, SEVERITIES[severity], called_by, message]
57
+ (msg.nil? || msg.strip.empty?) and return
58
+ message = [message, progname, msg].delete_if{ |i| i.nil? }.join(": ")
59
+ message = "%19s.%06d|%05d|%5s|%s%s\n" % [Time.now.utc.strftime("%Y-%m-%d|%H:%M:%S"), Time.now.utc.usec, Process.pid, SEVERITIES[severity], called_by, message]
60
60
 
61
61
  @logdev.write(message)
62
62
 
data/lib/ztk/parallel.rb CHANGED
@@ -2,9 +2,9 @@
2
2
  #
3
3
  # Author: Zachary Patten <zachary@jovelabs.com>
4
4
  # Copyright: Copyright (c) Jove Labs
5
- # License: Apache License, Version 2.0
5
+ # License: Apache License, Vers::IOn 2.0
6
6
  #
7
- # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # Licensed under the Apache License, Vers::IOn 2.0 (the "License");
8
8
  # you may not use this file except in compliance with the License.
9
9
  # You may obtain a copy of the License at
10
10
  #
@@ -12,61 +12,81 @@
12
12
  #
13
13
  # Unless required by applicable law or agreed to in writing, software
14
14
  # distributed under the License is distributed on an "AS IS" BASIS,
15
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
- # See the License for the specific language governing permissions and
17
- # limitations under the License.
15
+ # WITHOUT WARRANTIES OR CONDIT::IONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permiss::IOns and
17
+ # limitat::IOns under the License.
18
18
  #
19
19
  ################################################################################
20
+ require "base64"
21
+ require "ostruct"
20
22
 
21
23
  module ZTK
22
24
  class Parallel
23
25
 
24
26
  ################################################################################
25
27
 
26
- attr_accessor :results
28
+ attr_accessor :config, :results
27
29
 
28
30
  ################################################################################
29
31
 
30
- def initialize(options={})
31
- GC.copy_on_write_friendly = true if GC.respond_to?(:copy_on_write_friendly=)
32
-
33
- options.reverse_merge!(
34
- :max_forks => `grep -c processor /proc/cpuinfo`.strip.to_i,
35
- :one_shot => false
36
- )
32
+ def initialize(config={})
33
+ @config = OpenStruct.new({
34
+ :stdout => $stdout,
35
+ :stderr => $stderr,
36
+ :stdin => $stdin,
37
+ :logger => $logger,
38
+ :max_forks => `grep -c processor /proc/cpuinfo`.chomp.to_i,
39
+ :one_shot => false,
40
+ :before_fork => nil,
41
+ :after_fork => nil
42
+ }.merge(config))
43
+ @config.stdout.sync = true if @config.stdout.respond_to?(:sync=)
44
+ @config.stderr.sync = true if @config.stderr.respond_to?(:sync=)
45
+ @config.stdin.sync = true if @config.stdin.respond_to?(:sync=)
46
+ @config.logger.sync = true if @config.logger.respond_to?(:sync=)
47
+
48
+ @forks = ::Array.new
49
+ @results = ::Array.new
50
+ ::GC.respond_to?(:copy_on_write_friendly=) and ::GC.copy_on_write_friendly = true
51
+ end
37
52
 
38
- @max_forks = options[:max_forks]
39
- @one_shot = options[:one_shot]
53
+ ################################################################################
40
54
 
41
- @forks = Array.new
42
- @results = Array.new
55
+ def config(&block)
56
+ if block_given?
57
+ yield(@config)
58
+ else
59
+ @config
60
+ end
43
61
  end
44
62
 
45
63
  ################################################################################
46
64
 
47
- def process
65
+ def process(*args)
66
+ @config.logger.debug{ "FORKS #{@forks.inspect}" }
48
67
  pid = nil
49
- return pid if (@forks.count >= @max_forks)
68
+ return pid if (@forks.count >= @config.max_forks)
50
69
 
51
- child_reader, parent_writer = IO.pipe
52
- parent_reader, child_writer = IO.pipe
70
+ child_reader, parent_writer = ::IO.pipe
71
+ parent_reader, child_writer = ::IO.pipe
53
72
 
54
- ActiveRecord::Base.connection.disconnect!
55
- pid = Process.fork do
56
- ActiveRecord::Base.establish_connection
73
+ @config.before_fork and @config.before_fork.call(::Process.pid)
74
+ pid = ::Process.fork do
75
+ @config.after_fork and @config.after_fork.call(::Process.pid)
57
76
 
58
77
  parent_writer.close
59
78
  parent_reader.close
60
79
 
61
- if (data = yield).present?
62
- child_writer.write(Base64.encode64(Marshal.dump(data)))
80
+ if !(data = yield).nil?
81
+ @config.logger.debug{ "WRITE #{data.inspect}" }
82
+ child_writer.write(::Base64.encode64(::Marshal.dump(data)))
63
83
  end
64
84
 
65
85
  child_reader.close
66
86
  child_writer.close
67
- Process.exit!(0)
87
+ ::Process.exit!(0)
68
88
  end
69
- ActiveRecord::Base.establish_connection
89
+ @config.after_fork and @config.after_fork.call(::Process.pid)
70
90
 
71
91
  child_reader.close
72
92
  child_writer.close
@@ -80,18 +100,17 @@ module ZTK
80
100
  ################################################################################
81
101
 
82
102
  def wait
83
- pid, status = (Process.wait2(-1, Process::WNOHANG) rescue nil)
84
- if pid.present? && status.present?
85
- if (fork = @forks.select{ |f| f[:pid] == pid }.first).present?
86
- data = (Marshal.load(Base64.decode64(fork[:reader].read.to_s)) rescue nil)
87
- @results.push(data) if (data.present? && !@one_shot)
88
-
89
- fork[:reader].close
90
- fork[:writer].close
91
-
92
- @forks -= [fork]
93
- return [pid, status, data]
94
- end
103
+ @config.logger.debug{ "FORKS #{@forks.inspect}" }
104
+ pid, status = (::Process.wait2(-1, ::Process::WNOHANG) rescue nil)
105
+ if !pid.nil? && !status.nil? && !(fork = @forks.select{ |f| f[:pid] == pid }.first).nil?
106
+ data = (::Marshal.load(::Base64.decode64(fork[:reader].read.to_s)) rescue nil)
107
+ @config.logger.debug{ "READ #{data.inspect}" }
108
+ @results.push(data) if (!data.nil? && !@config.one_shot)
109
+ fork[:reader].close
110
+ fork[:writer].close
111
+
112
+ @forks -= [fork]
113
+ return [pid, status, data]
95
114
  end
96
115
  nil
97
116
  end
@@ -99,11 +118,11 @@ module ZTK
99
118
  ################################################################################
100
119
 
101
120
  def waitall
102
- results = Array.new
121
+ data = ::Array.new
103
122
  while @forks.count > 0
104
- results << wait
123
+ data << self.wait
105
124
  end
106
- results
125
+ data
107
126
  end
108
127
 
109
128
  ################################################################################
data/lib/ztk/ssh.rb CHANGED
@@ -17,6 +17,7 @@
17
17
  # limitations under the License.
18
18
  #
19
19
  ################################################################################
20
+ require "ostruct"
20
21
 
21
22
  module ZTK
22
23
  class SSHError < Error; end
@@ -28,21 +29,24 @@ module ZTK
28
29
 
29
30
  ################################################################################
30
31
 
31
- def initialize(logger=$logger, stdout=$stdout, stderr=$stderr, stdin=$stdin)
32
- @logger, @stdout, @stderr, @stdin = logger, stdout, stderr, stdin
33
-
34
- @logger.sync = true if @logger.respond_to?(:sync=)
35
- @stdout.sync = true if @stdout.respond_to?(:sync=)
36
- @stderr.sync = true if @stderr.respond_to?(:sync=)
37
- @stdin.sync = true if @stdin.respond_to?(:sync=)
38
-
39
- @config = Hash.new(nil)
32
+ def initialize(config={})
33
+ @config = OpenStruct.new({
34
+ :stdout => $stdout,
35
+ :stderr => $stderr,
36
+ :stdin => $stdin,
37
+ :logger => $logger,
38
+ :ssh => Hash.new(nil)
39
+ }.merge(config))
40
+ @config.stdout.sync = true if @config.stdout.respond_to?(:sync=)
41
+ @config.stderr.sync = true if @config.stderr.respond_to?(:sync=)
42
+ @config.stdin.sync = true if @config.stdin.respond_to?(:sync=)
43
+ @config.logger.sync = true if @config.logger.respond_to?(:sync=)
40
44
  end
41
45
 
42
46
  ################################################################################
43
47
 
44
48
  def console
45
- @logger and @logger.debug { "config(#{@config.inspect})" }
49
+ @config.logger and @config.logger.debug { "config(#{@config.ssh.inspect})" }
46
50
 
47
51
  command = [ "ssh" ]
48
52
  command << [ "-q" ]
@@ -50,47 +54,47 @@ module ZTK
50
54
  command << [ "-o", "StrictHostKeyChecking=no" ]
51
55
  command << [ "-o", "KeepAlive=yes" ]
52
56
  command << [ "-o", "ServerAliveInterval=60" ]
53
- command << [ "-i", @config[:identity_file] ] if @config[:identity_file]
54
- command << [ "-o", "ProxyCommand=\"#{proxy_command}\"" ] if @config[:proxy]
55
- command << "#{@config[:ssh_user]}@#{@config[:host]}"
57
+ command << [ "-i", @config.ssh[:identity_file] ] if @config.ssh[:identity_file]
58
+ command << [ "-o", "ProxyCommand=\"#{proxy_command}\"" ] if @config.ssh[:proxy]
59
+ command << "#{@config.ssh[:ssh_user]}@#{@config.ssh[:host]}"
56
60
  command = command.flatten.compact.join(" ")
57
- @logger and @logger.info { "command(#{command})" }
61
+ @config.logger and @config.logger.info { "command(#{command})" }
58
62
  Kernel.exec(command)
59
63
  end
60
64
 
61
65
  ################################################################################
62
66
 
63
67
  def exec(command, options={})
64
- @ssh ||= Net::SSH.start(@config[:host], @config[:ssh_user], ssh_options)
68
+ @ssh ||= Net::SSH.start(@config.ssh[:host], @config.ssh[:ssh_user], ssh_options)
65
69
 
66
70
  options = { :silence => false }.merge(options)
67
71
  silence = options[:silence]
68
72
  output = ""
69
73
 
70
- @logger and @logger.debug { "config(#{@config.inspect})" }
71
- @logger and @logger.debug { "options(#{options.inspect})" }
72
- @logger and @logger.info { "command(#{command})" }
74
+ @config.logger and @config.logger.debug { "config(#{@config.ssh.inspect})" }
75
+ @config.logger and @config.logger.debug { "options(#{options.inspect})" }
76
+ @config.logger and @config.logger.info { "command(#{command})" }
73
77
  channel = @ssh.open_channel do |chan|
74
- @logger and @logger.debug { "channel opened" }
78
+ @config.logger and @config.logger.debug { "channel opened" }
75
79
  chan.exec(command) do |ch, success|
76
80
  raise SSHError, "Could not execute '#{command}'." unless success
77
81
 
78
82
  ch.on_data do |c, data|
79
83
  output += data
80
- @logger and @logger.debug { data.chomp.strip }
81
- @stdout.print(data) if !silence
84
+ @config.logger and @config.logger.debug { data.chomp.strip }
85
+ @config.stdout.print(data) if !silence
82
86
  end
83
87
 
84
88
  ch.on_extended_data do |c, type, data|
85
89
  output += data
86
- @logger and @logger.debug { data.chomp.strip }
87
- @stderr.print(data) if !silence
90
+ @config.logger and @config.logger.debug { data.chomp.strip }
91
+ @config.stderr.print(data) if !silence
88
92
  end
89
93
 
90
94
  end
91
95
  end
92
96
  channel.wait
93
- @logger and @logger.debug { "channel closed" }
97
+ @config.logger and @config.logger.debug { "channel closed" }
94
98
 
95
99
  output
96
100
  end
@@ -98,22 +102,22 @@ module ZTK
98
102
  ################################################################################
99
103
 
100
104
  def upload(local, remote)
101
- @sftp ||= Net::SFTP.start(@config[:host], @config[:ssh_user], ssh_options)
105
+ @sftp ||= Net::SFTP.start(@config.ssh[:host], @config.ssh[:ssh_user], ssh_options)
102
106
 
103
- @logger and @logger.debug { "config(#{@config.inspect})" }
104
- @logger and @logger.info { "parameters(#{local},#{remote})" }
107
+ @config.logger and @config.logger.debug { "config(#{@config.ssh.inspect})" }
108
+ @config.logger and @config.logger.info { "parameters(#{local},#{remote})" }
105
109
  @sftp.upload!(local.to_s, remote.to_s) do |event, uploader, *args|
106
110
  case event
107
111
  when :open
108
- @logger and @logger.info { "upload(#{args[0].local} -> #{args[0].remote})" }
112
+ @config.logger and @config.logger.info { "upload(#{args[0].local} -> #{args[0].remote})" }
109
113
  when :close
110
- @logger and @logger.debug { "close(#{args[0].remote})" }
114
+ @config.logger and @config.logger.debug { "close(#{args[0].remote})" }
111
115
  when :mkdir
112
- @logger and @logger.debug { "mkdir(#{args[0]})" }
116
+ @config.logger and @config.logger.debug { "mkdir(#{args[0]})" }
113
117
  when :put
114
- @logger and @logger.debug { "put(#{args[0].remote}, size #{args[2].size} bytes, offset #{args[1]})" }
118
+ @config.logger and @config.logger.debug { "put(#{args[0].remote}, size #{args[2].size} bytes, offset #{args[1]})" }
115
119
  when :finish
116
- @logger and @logger.info { "finish" }
120
+ @config.logger and @config.logger.info { "finish" }
117
121
  end
118
122
  end
119
123
  end
@@ -121,22 +125,22 @@ module ZTK
121
125
  ################################################################################
122
126
 
123
127
  def download(remote, local)
124
- @sftp ||= Net::SFTP.start(@config[:host], @config[:ssh_user], ssh_options)
128
+ @sftp ||= Net::SFTP.start(@config.ssh[:host], @config.ssh[:ssh_user], ssh_options)
125
129
 
126
- @logger and @logger.debug { "config(#{@config.inspect})" }
127
- @logger and @logger.info { "parameters(#{remote},#{local})" }
130
+ @config.logger and @config.logger.debug { "config(#{@config.ssh.inspect})" }
131
+ @config.logger and @config.logger.info { "parameters(#{remote},#{local})" }
128
132
  @sftp.download!(remote.to_s, local.to_s) do |event, downloader, *args|
129
133
  case event
130
134
  when :open
131
- @logger and @logger.info { "download(#{args[0].remote} -> #{args[0].local})" }
135
+ @config.logger and @config.logger.info { "download(#{args[0].remote} -> #{args[0].local})" }
132
136
  when :close
133
- @logger and @logger.debug { "close(#{args[0].local})" }
137
+ @config.logger and @config.logger.debug { "close(#{args[0].local})" }
134
138
  when :mkdir
135
- @logger and @logger.debug { "mkdir(#{args[0]})" }
139
+ @config.logger and @config.logger.debug { "mkdir(#{args[0]})" }
136
140
  when :get
137
- @logger and @logger.debug { "get(#{args[0].remote}, size #{args[2].size} bytes, offset #{args[1]})" }
141
+ @config.logger and @config.logger.debug { "get(#{args[0].remote}, size #{args[2].size} bytes, offset #{args[1]})" }
138
142
  when :finish
139
- @logger and @logger.info { "finish" }
143
+ @config.logger and @config.logger.info { "finish" }
140
144
  end
141
145
  end
142
146
  end
@@ -147,11 +151,11 @@ module ZTK
147
151
  ################################################################################
148
152
 
149
153
  def proxy_command
150
- @logger and @logger.debug { "config(#{@config.inspect})" }
154
+ @config.logger and @config.logger.debug { "config(#{@config.ssh.inspect})" }
151
155
 
152
- if !@config[:identity_file]
156
+ if !@config.ssh[:identity_file]
153
157
  message = "You must specify an identity file in order to SSH proxy."
154
- @logger and @logger.fatal { message }
158
+ @config.logger and @config.logger.fatal { message }
155
159
  raise SSHError, message
156
160
  end
157
161
 
@@ -161,25 +165,25 @@ module ZTK
161
165
  command << [ "-o", "StrictHostKeyChecking=no" ]
162
166
  command << [ "-o", "KeepAlive=yes" ]
163
167
  command << [ "-o", "ServerAliveInterval=60" ]
164
- command << [ "-i", @config[:proxy_identity_file] ] if @config[:proxy_identity_file]
165
- command << "#{@config[:proxy_ssh_user]}@#{@config[:proxy_host]}"
168
+ command << [ "-i", @config.ssh[:proxy_identity_file] ] if @config.ssh[:proxy_identity_file]
169
+ command << "#{@config.ssh[:proxy_ssh_user]}@#{@config.ssh[:proxy_host]}"
166
170
  command << "nc %h %p"
167
171
  command = command.flatten.compact.join(" ")
168
- @logger and @logger.debug { "command(#{command})" }
172
+ @config.logger and @config.logger.debug { "command(#{command})" }
169
173
  command
170
174
  end
171
175
 
172
176
  ################################################################################
173
177
 
174
178
  def ssh_options
175
- @logger and @logger.debug { "config(#{@config.inspect})" }
179
+ @config.logger and @config.logger.debug { "config(#{@config.ssh.inspect})" }
176
180
  options = {}
177
- options.merge!(:password => @config[:ssh_password]) if @config[:ssh_password]
178
- options.merge!(:keys => @config[:identity_file]) if @config[:identity_file]
179
- options.merge!(:timeout => @config[:timeout]) if @config[:timeout]
180
- options.merge!(:user_known_hosts_file => '/dev/null') if !@config[:host_key_verify]
181
- options.merge!(:proxy => Net::SSH::Proxy::Command.new(proxy_command)) if @config[:proxy]
182
- @logger and @logger.debug { "options(#{options.inspect})" }
181
+ options.merge!(:password => @config.ssh[:ssh_password]) if @config.ssh[:ssh_password]
182
+ options.merge!(:keys => @config.ssh[:identity_file]) if @config.ssh[:identity_file]
183
+ options.merge!(:timeout => @config.ssh[:timeout]) if @config.ssh[:timeout]
184
+ options.merge!(:user_known_hosts_file => '/dev/null') if !@config.ssh[:host_key_verify]
185
+ options.merge!(:proxy => Net::SSH::Proxy::Command.new(proxy_command)) if @config.ssh[:proxy]
186
+ @config.logger and @config.logger.debug { "options(#{options.inspect})" }
183
187
  options
184
188
  end
185
189
 
data/lib/ztk/version.rb CHANGED
@@ -19,5 +19,5 @@
19
19
  ################################################################################
20
20
 
21
21
  module ZTK
22
- VERSION = "0.0.3" unless const_defined?(:VERSION)
22
+ VERSION = "0.0.4" unless const_defined?(:VERSION)
23
23
  end
@@ -0,0 +1,38 @@
1
+ ################################################################################
2
+ #
3
+ # Author: Zachary Patten <zachary@jovelabs.com>
4
+ # Copyright: Copyright (c) Jove Labs
5
+ # License: Apache License, Version 2.0
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+ ################################################################################
20
+
21
+ require "ztk"
22
+
23
+ ################################################################################
24
+
25
+ $logger = ZTK::Logger.new("/dev/null")
26
+
27
+ dev_null = File.open("/dev/null", "w")
28
+ $stdout = dev_null
29
+ $stderr = dev_null
30
+
31
+ ################################################################################
32
+
33
+ require 'simplecov'
34
+ SimpleCov.start do
35
+ add_filter '/spec/'
36
+ end if ENV["COVERAGE"]
37
+
38
+ ################################################################################
@@ -0,0 +1,133 @@
1
+ ################################################################################
2
+ #
3
+ # Author: Zachary Patten <zachary@jovelabs.com>
4
+ # Copyright: Copyright (c) Jove Labs
5
+ # License: Apache License, Version 2.0
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+ ################################################################################
20
+
21
+ require "spec_helper"
22
+
23
+ describe ZTK::Logger do
24
+
25
+ before(:all) do
26
+ ENV["LOG_LEVEL"] = "DEBUG"
27
+ @messages = {
28
+ :debug => "This is a test debug message",
29
+ :info => "This is a test info message",
30
+ :warn => "This is a test warn message",
31
+ :error => "This is a test error message",
32
+ :fatal => "This is a test fatal message"
33
+ }
34
+ @logfile = "/tmp/test.log"
35
+ File.exists?(@logfile) && File.delete(@logfile)
36
+ end
37
+
38
+ subject { ZTK::Logger.new(@logfile) }
39
+
40
+ it "should be of kind ZTK::Logger class" do
41
+ subject.should be_an_instance_of ZTK::Logger
42
+ end
43
+
44
+ describe "general logging functionality" do
45
+
46
+ it "should accept debug log messages" do
47
+ subject.debug { @messages[:debug] }
48
+ IO.read(@logfile).match(@messages[:debug]).should_not be nil
49
+ end
50
+
51
+ it "should accept info log messages" do
52
+ subject.info { @messages[:info] }
53
+ IO.read(@logfile).match(@messages[:info]).should_not be nil
54
+ end
55
+
56
+ it "should accept warn log messages" do
57
+ subject.warn { @messages[:warn] }
58
+ IO.read(@logfile).match(@messages[:warn]).should_not be nil
59
+ end
60
+
61
+ it "should accept error log messages" do
62
+ subject.error { @messages[:error] }
63
+ IO.read(@logfile).match(@messages[:error]).should_not be nil
64
+ end
65
+
66
+ it "should accept fatal log messages" do
67
+ subject.fatal { @messages[:fatal] }
68
+ IO.read(@logfile).match(@messages[:fatal]).should_not be nil
69
+ end
70
+
71
+ end
72
+
73
+ describe "log message" do
74
+
75
+ before(:all) do
76
+ subject.debug { @messages[:debug] }
77
+ end
78
+
79
+ it "should contain the date (YYYY-MM-DD)" do
80
+ IO.read(@logfile).match(Time.now.utc.strftime("%Y-%m-%d")).should_not be nil
81
+ end
82
+
83
+ it "should contain the time (HH:MM)" do
84
+ IO.read(@logfile).match(Time.now.utc.strftime("%H:%M")).should_not be nil
85
+ end
86
+
87
+ it "should contain the current process ID" do
88
+ IO.read(@logfile).match(Process.pid.to_s).should_not be nil
89
+ end
90
+
91
+ it "should contain the current log level" do
92
+ IO.read(@logfile).match("DEBUG").should_not be nil
93
+ end
94
+
95
+ it "should contain the basename of the file containing the method call" do
96
+ IO.read(@logfile).match(File.basename(__FILE__)).should_not be nil
97
+ end
98
+
99
+ it "should contain the log message itself" do
100
+ IO.read(@logfile).match(@messages[:debug]).should_not be nil
101
+ end
102
+
103
+ end
104
+
105
+ describe "log level" do
106
+
107
+ LOG_LEVEL_STEPS = [:debug, :info, :warn, :error, :fatal]
108
+
109
+ LOG_LEVEL_STEPS.each do |current_log_level_step|
110
+
111
+ it "should allow setting log level to #{current_log_level_step.to_s.upcase} via ENV[\"#{current_log_level_step.to_s.upcase}\"]" do
112
+
113
+ ENV["LOG_LEVEL"] = current_log_level_step.to_s.upcase
114
+ File.exists?(@logfile) && File.delete(@logfile)
115
+ subject = ZTK::Logger.new(@logfile)
116
+
117
+ LOG_LEVEL_STEPS.each do |log_level_step|
118
+ subject.send(log_level_step) { @messages[log_level_step] }
119
+ if LOG_LEVEL_STEPS.index(log_level_step) >= LOG_LEVEL_STEPS.index(current_log_level_step)
120
+ IO.read(@logfile).match(@messages[log_level_step]).should_not be nil
121
+ IO.read(@logfile).match(log_level_step.to_s.upcase).should_not be nil
122
+ else
123
+ IO.read(@logfile).match(@messages[log_level_step]).should be nil
124
+ IO.read(@logfile).match(log_level_step.to_s.upcase).should be nil
125
+ end
126
+ end
127
+
128
+ end
129
+
130
+ end
131
+ end
132
+
133
+ end