furnish 0.1.1 → 0.1.2
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +14 -0
- data/furnish.gemspec +1 -1
- data/lib/furnish/logger.rb +123 -13
- data/lib/furnish/protocol.rb +7 -0
- data/lib/furnish/provisioner_group.rb +0 -4
- data/lib/furnish/provisioners/api.rb +5 -1
- data/lib/furnish/provisioners/dummy.rb +9 -0
- data/lib/furnish/version.rb +1 -1
- data/test/test_api.rb +6 -6
- data/test/test_logger.rb +46 -0
- data/test/test_protocol.rb +2 -0
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 59696ae50785a0a803ebe6797e627c43230c6cfd
|
4
|
+
data.tar.gz: 3847e7e726cb5bd4a5791d5fb17e5fd00eae52ea
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 231a68d0bb0550efd3c87d337a8f1cf0419bf9af577cfc649a3e6ace96dcb17a3a1fbcd08a578b7577d605f72c5c559a3a4c8c8e6b1bc6f8b3750e321222dc59
|
7
|
+
data.tar.gz: cfba9a6a29dbdbae88f561812309739cd8738c45f71618fbff262fefd7f0bb40ac682fddc6d9d46d1f5b03f9aaf32583490130623bc7ead743f6de8289b77389
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
+
# 0.1.2 (04/27/2013)
|
2
|
+
* Logger changes:
|
3
|
+
* Fixed: Certain situations with if_debug and the IO proxy would result in
|
4
|
+
surprising behavior with stdio.
|
5
|
+
* with_tag is a new call to prefix log messages in a block with a tag.
|
6
|
+
* redirect is a new call to temporarily redirect I/O in the logger.
|
7
|
+
* Furnish::Provisioners::API now includes the logger mixin by default.
|
8
|
+
* Provisioner properties now use strings instead of symbols -- resolves a
|
9
|
+
potential memory exhaustion issue.
|
10
|
+
* Failed provisions no longer log the failure twice.
|
11
|
+
* Furnish::Protocol#accepts_from_any? is a predicate to reflect the value as
|
12
|
+
true or false.
|
1
13
|
# 0.1.1 (04/16/2013)
|
2
14
|
* #wait_for would spin forever if something got flagged as needing recovery
|
3
15
|
(threaded scheduler only). Now raises the first item's exception if
|
@@ -9,6 +21,7 @@
|
|
9
21
|
* #teardown_group is aliased to #d and #down
|
10
22
|
* New API: Furnish::Scheduler#groups can be used to more easily get at
|
11
23
|
provisioner groups the scheduler knows about.
|
24
|
+
|
12
25
|
# 0.1.0 (04/09/2013)
|
13
26
|
* Furnish requires 1.9.3 or greater -- always has been the case, now rubygems enforces that for us.
|
14
27
|
* Runtime performance increased significantly. No hard numbers, but test
|
@@ -45,6 +58,7 @@
|
|
45
58
|
* `<<` is now an alias for `schedule_provisioner_group`
|
46
59
|
* `s` and `sched` are now aliases for `schedule_provision`
|
47
60
|
* Probably some other shit I don't remember now.
|
61
|
+
|
48
62
|
# 0.0.4 (03/25/2013)
|
49
63
|
* Support for FURNISH_DEBUG environment variable for test suites.
|
50
64
|
* Ruby 2.0.0-p0 Compatibility Fixes
|
data/furnish.gemspec
CHANGED
@@ -21,7 +21,7 @@ Gem::Specification.new do |gem|
|
|
21
21
|
gem.add_dependency 'palsy', '~> 0.0.4'
|
22
22
|
|
23
23
|
gem.add_development_dependency 'rake'
|
24
|
-
gem.add_development_dependency 'minitest', '~> 4.
|
24
|
+
gem.add_development_dependency 'minitest', '~> 4.7'
|
25
25
|
gem.add_development_dependency 'guard-minitest'
|
26
26
|
gem.add_development_dependency 'guard-rake', '~> 0.0.8'
|
27
27
|
gem.add_development_dependency 'rdoc', '~> 4'
|
data/lib/furnish/logger.rb
CHANGED
@@ -45,11 +45,21 @@ module Furnish
|
|
45
45
|
# with the standard logger object set as Furnish.logger.
|
46
46
|
#
|
47
47
|
module Mixins
|
48
|
-
#
|
48
|
+
# :method: if_debug
|
49
49
|
# Delegates to Furnish::Logger#if_debug.
|
50
|
-
|
51
|
-
|
52
|
-
|
50
|
+
|
51
|
+
# :method: redirect
|
52
|
+
# Delegates to Furnish::Logger#redirect.
|
53
|
+
|
54
|
+
# :method: with_tag
|
55
|
+
# Delegates to Furnish::Logger#with_tag.
|
56
|
+
|
57
|
+
%w[if_debug redirect with_tag].each do |meth|
|
58
|
+
module_eval <<-EOF
|
59
|
+
def #{meth}(*args, &block)
|
60
|
+
Furnish.logger.#{meth}(*args, &block)
|
61
|
+
end
|
62
|
+
EOF
|
53
63
|
end
|
54
64
|
end
|
55
65
|
|
@@ -62,7 +72,12 @@ module Furnish
|
|
62
72
|
# The IO object. Probably best to not mess with this attribute directly,
|
63
73
|
# most methods will be proxied to it.
|
64
74
|
#
|
65
|
-
attr_reader
|
75
|
+
attr_reader :io
|
76
|
+
|
77
|
+
#
|
78
|
+
# Optional tag. See #with_tag for an example.
|
79
|
+
#
|
80
|
+
attr_reader :tag
|
66
81
|
|
67
82
|
#
|
68
83
|
# Create a new Furnish::Logger. Takes an IO object and an Integer debug
|
@@ -89,17 +104,112 @@ module Furnish
|
|
89
104
|
# if_debug is synchronized over the logger's mutex.
|
90
105
|
#
|
91
106
|
def if_debug(level=1, else_block=nil, &block)
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
107
|
+
hijack_stdio do
|
108
|
+
begin
|
109
|
+
run = lambda do
|
110
|
+
if debug_level >= level and block
|
111
|
+
instance_eval(&block)
|
112
|
+
elsif else_block
|
113
|
+
instance_eval(&else_block)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
@write_mutex.synchronize { run.call }
|
118
|
+
rescue ThreadError
|
119
|
+
run.call
|
97
120
|
end
|
98
121
|
end
|
122
|
+
end
|
99
123
|
|
100
|
-
|
101
|
-
|
102
|
-
|
124
|
+
#
|
125
|
+
# Makes stdio Furnish::Logger objects for the duration of the block. Used
|
126
|
+
# by #if_debug for the purposes of not breaking expectations.
|
127
|
+
#
|
128
|
+
def hijack_stdio
|
129
|
+
orig_stdout, orig_stderr = nil, nil
|
130
|
+
|
131
|
+
if io != $stdout
|
132
|
+
orig_stdout = $stdout
|
133
|
+
$stdout = self
|
134
|
+
end
|
135
|
+
|
136
|
+
if io != $stderr
|
137
|
+
orig_stderr = $stderr
|
138
|
+
$stderr = self
|
139
|
+
end
|
140
|
+
|
141
|
+
yield
|
142
|
+
ensure
|
143
|
+
$stdout = orig_stdout if orig_stdout
|
144
|
+
$stderr = orig_stderr if orig_stderr
|
145
|
+
end
|
146
|
+
|
147
|
+
#
|
148
|
+
# Temporarily redirects IO to a new IO object for the duration of the
|
149
|
+
# block. Example below:
|
150
|
+
#
|
151
|
+
# Furnish.logger.redirect($stdout) do
|
152
|
+
# Furnish.logger.if_debug do
|
153
|
+
# puts "herp" # prints to stdout
|
154
|
+
# end
|
155
|
+
# end
|
156
|
+
#
|
157
|
+
# # prints to original logger IO
|
158
|
+
# Furnish.logger.puts "hi"
|
159
|
+
#
|
160
|
+
def redirect(new_io, &block)
|
161
|
+
tmp_io = @io
|
162
|
+
@io = new_io
|
163
|
+
yield
|
164
|
+
@io = tmp_io
|
165
|
+
end
|
166
|
+
|
167
|
+
#
|
168
|
+
# Prefixes all 'puts' calls with a string of text (a "tag") provided for
|
169
|
+
# the duration of the block.
|
170
|
+
#
|
171
|
+
# Example:
|
172
|
+
#
|
173
|
+
#
|
174
|
+
# @logger.with_tag("hi") do
|
175
|
+
# @logger.if_debug do
|
176
|
+
# puts "hello" # "[hi] hello"
|
177
|
+
# end
|
178
|
+
# end
|
179
|
+
#
|
180
|
+
# @logger.puts "hello" # "hello"
|
181
|
+
#
|
182
|
+
def with_tag(new_tag, &block)
|
183
|
+
@tag = new_tag
|
184
|
+
yield
|
185
|
+
@tag = nil
|
186
|
+
end
|
187
|
+
|
188
|
+
#
|
189
|
+
# Hacky puts method to handle tags.
|
190
|
+
#
|
191
|
+
def puts(*args)
|
192
|
+
if tag
|
193
|
+
io.print("[#{tag}] ")
|
194
|
+
end
|
195
|
+
|
196
|
+
method_missing(:puts, *args)
|
197
|
+
end
|
198
|
+
|
199
|
+
#
|
200
|
+
# Makes it possible to assign this to $stdout and $stderr.
|
201
|
+
#
|
202
|
+
def write(*args)
|
203
|
+
method_missing(:write, *args)
|
204
|
+
end
|
205
|
+
|
206
|
+
#
|
207
|
+
# Hacky close method that keeps us from closing stdio.
|
208
|
+
#
|
209
|
+
def close
|
210
|
+
# XXX StringIO apparently overrides respond_to_missing for #to_i but
|
211
|
+
# doesn't implement #to_i
|
212
|
+
io.close unless io == $stdout or io == $stderr
|
103
213
|
end
|
104
214
|
|
105
215
|
#
|
data/lib/furnish/protocol.rb
CHANGED
@@ -139,6 +139,13 @@ module Furnish # :nodoc:
|
|
139
139
|
@hash[:accepts_from_any] = val
|
140
140
|
end
|
141
141
|
|
142
|
+
#
|
143
|
+
# Predicate for the value of #accepts_from_any.
|
144
|
+
#
|
145
|
+
def accepts_from_any?
|
146
|
+
!!@hash[:accepts_from_any]
|
147
|
+
end
|
148
|
+
|
142
149
|
#
|
143
150
|
# look up a rule set -- generally should not be used by consumers.
|
144
151
|
#
|
@@ -93,10 +93,6 @@ module Furnish
|
|
93
93
|
startup_args = args
|
94
94
|
|
95
95
|
unless args = this_prov.startup(startup_args)
|
96
|
-
if_debug do
|
97
|
-
puts "Could not provision #{this_prov}"
|
98
|
-
end
|
99
|
-
|
100
96
|
set_recovery(this_prov, i, startup_args)
|
101
97
|
raise "Could not provision #{this_prov}"
|
102
98
|
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'furnish/provisioner'
|
2
2
|
require 'furnish/protocol'
|
3
|
+
require 'furnish/logger'
|
3
4
|
|
4
5
|
module Furnish # :nodoc:
|
5
6
|
module Provisioner # :nodoc:
|
@@ -56,6 +57,8 @@ module Furnish # :nodoc:
|
|
56
57
|
#
|
57
58
|
class API
|
58
59
|
|
60
|
+
include Furnish::Logger::Mixins
|
61
|
+
|
59
62
|
#
|
60
63
|
# Ensures all properties are inherited by subclasses that inherit from API.
|
61
64
|
#
|
@@ -126,7 +129,7 @@ module Furnish # :nodoc:
|
|
126
129
|
# { :description => "does a foo", :type => Integer }
|
127
130
|
#
|
128
131
|
def self.furnish_property(name, description="", type=Object)
|
129
|
-
name = name.
|
132
|
+
name = name.to_s unless name.kind_of?(String)
|
130
133
|
|
131
134
|
attr_accessor name
|
132
135
|
|
@@ -278,6 +281,7 @@ module Furnish # :nodoc:
|
|
278
281
|
end
|
279
282
|
|
280
283
|
args.each do |k, v|
|
284
|
+
k = k.to_s unless k.kind_of?(String)
|
281
285
|
props = self.class.furnish_properties
|
282
286
|
|
283
287
|
if props.has_key?(k)
|
data/lib/furnish/version.rb
CHANGED
data/test/test_api.rb
CHANGED
@@ -21,12 +21,12 @@ class TestAPI < Furnish::TestCase
|
|
21
21
|
assert_respond_to(@klass, :furnish_property)
|
22
22
|
|
23
23
|
assert_kind_of(Hash, @klass.furnish_properties)
|
24
|
-
assert_includes(@klass.furnish_properties,
|
25
|
-
assert_includes(@klass.furnish_properties,
|
26
|
-
refute_includes(@klass.furnish_properties,
|
27
|
-
assert_kind_of(Hash, @klass.furnish_properties[
|
28
|
-
assert_equal("does things with foo", @klass.furnish_properties[
|
29
|
-
assert_equal(Integer, @klass.furnish_properties[
|
24
|
+
assert_includes(@klass.furnish_properties, "foo")
|
25
|
+
assert_includes(@klass.furnish_properties, "a_string")
|
26
|
+
refute_includes(@klass.furnish_properties, "bar")
|
27
|
+
assert_kind_of(Hash, @klass.furnish_properties["foo"])
|
28
|
+
assert_equal("does things with foo", @klass.furnish_properties["foo"][:description])
|
29
|
+
assert_equal(Integer, @klass.furnish_properties["foo"][:type])
|
30
30
|
|
31
31
|
obj = @klass.new(:foo => 1)
|
32
32
|
|
data/test/test_logger.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'helper'
|
2
2
|
require 'tempfile'
|
3
|
+
require 'stringio'
|
3
4
|
|
4
5
|
class TestLogger < Furnish::TestCase
|
5
6
|
def setup
|
@@ -60,6 +61,51 @@ class TestLogger < Furnish::TestCase
|
|
60
61
|
assert_equal("foo\nquux\nlevel2\n", read_logfile, "debug level is 2 and if_debug checking for 1")
|
61
62
|
end
|
62
63
|
|
64
|
+
def test_redirect
|
65
|
+
@logger.debug_level = 3
|
66
|
+
io = StringIO.new('', 'w')
|
67
|
+
@logger.redirect(io) do
|
68
|
+
@logger.if_debug do
|
69
|
+
puts "herp"
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
@logger.if_debug do
|
74
|
+
puts "derp"
|
75
|
+
end
|
76
|
+
|
77
|
+
assert_equal("derp\n", read_logfile)
|
78
|
+
assert_equal("herp\n", io.string)
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_with_tag
|
82
|
+
@logger.debug_level = 3
|
83
|
+
@logger.with_tag("fart") do
|
84
|
+
@logger.if_debug do
|
85
|
+
puts "hello"
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
@logger.if_debug do
|
90
|
+
puts "hello"
|
91
|
+
end
|
92
|
+
|
93
|
+
assert_equal("[fart] hello\nhello\n", read_logfile)
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_api_has_logger
|
97
|
+
old_logger = Furnish.logger
|
98
|
+
io = StringIO.new('', 'w')
|
99
|
+
Furnish.logger = Furnish::Logger.new(io, 3)
|
100
|
+
|
101
|
+
d = Furnish::Provisioner::Dummy.new
|
102
|
+
d.make_log
|
103
|
+
|
104
|
+
assert_equal("hello from Dummy\n", io.string)
|
105
|
+
ensure
|
106
|
+
Furnish.logger = old_logger
|
107
|
+
end
|
108
|
+
|
63
109
|
def teardown
|
64
110
|
@logger.close
|
65
111
|
@logger_file.unlink
|
data/test/test_protocol.rb
CHANGED
@@ -19,8 +19,10 @@ class TestProtocol < Furnish::TestCase
|
|
19
19
|
end
|
20
20
|
|
21
21
|
refute(proto[:accepts_from_any])
|
22
|
+
refute(proto.accepts_from_any?)
|
22
23
|
proto.accepts_from_any(true)
|
23
24
|
assert(proto[:accepts_from_any])
|
25
|
+
assert(proto.accepts_from_any?)
|
24
26
|
end
|
25
27
|
|
26
28
|
def test_configure
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: furnish
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Erik Hollensbe
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-04-
|
11
|
+
date: 2013-04-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: palsy
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - ~>
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 4.
|
47
|
+
version: '4.7'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - ~>
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 4.
|
54
|
+
version: '4.7'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: guard-minitest
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -179,7 +179,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
179
179
|
version: '0'
|
180
180
|
requirements: []
|
181
181
|
rubyforge_project:
|
182
|
-
rubygems_version: 2.0.
|
182
|
+
rubygems_version: 2.0.3
|
183
183
|
signing_key:
|
184
184
|
specification_version: 4
|
185
185
|
summary: A novel way to do virtual machine provisioning
|