garcun 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/lib/garcon/chef/chef_helpers.rb +9 -12
  3. data/lib/garcon/chef/coerce/coercer.rb +3 -0
  4. data/lib/garcon/chef/node.rb +7 -5
  5. data/lib/garcon/chef/provider/download.rb +2 -30
  6. data/lib/garcon/chef/resource/base_dsl.rb +53 -0
  7. data/lib/garcon/chef/secret_bag.rb +2 -1
  8. data/lib/garcon/chef_inclusions.rb +1 -9
  9. data/lib/garcon/core_ext/array.rb +1 -1
  10. data/lib/garcon/core_ext/binding.rb +0 -1
  11. data/lib/garcon/core_ext/boolean.rb +2 -0
  12. data/lib/garcon/core_ext/hash.rb +1 -2
  13. data/lib/garcon/core_ext/kernel.rb +0 -2
  14. data/lib/garcon/core_ext/module.rb +0 -1
  15. data/lib/garcon/core_ext/object.rb +0 -3
  16. data/lib/garcon/core_ext/string.rb +9 -15
  17. data/lib/garcon/core_ext/struct.rb +0 -1
  18. data/lib/garcon/core_ext/symbol.rb +0 -1
  19. data/lib/garcon/core_ext/time.rb +0 -1
  20. data/lib/garcon/core_ext.rb +0 -4
  21. data/lib/garcon/exceptions.rb +0 -35
  22. data/lib/garcon/task/executor.rb +0 -1
  23. data/lib/garcon/task/ivar.rb +0 -2
  24. data/lib/garcon/utility/file_helper.rb +88 -1
  25. data/lib/garcon/utility/retry.rb +0 -3
  26. data/lib/garcon/utility/timeout.rb +0 -3
  27. data/lib/garcon/utils.rb +0 -1
  28. data/lib/garcon/version.rb +1 -1
  29. data/lib/garcon.rb +1 -4
  30. data/lib/garcun.rb +1 -3
  31. metadata +2 -11
  32. data/lib/garcon/chef/handler/devreporter.rb +0 -127
  33. data/lib/garcon/chef/resource/resource_name.rb +0 -109
  34. data/lib/garcon/core_ext/file.rb +0 -127
  35. data/lib/garcon/core_ext/filetest.rb +0 -62
  36. data/lib/garcon/core_ext/lazy.rb +0 -222
  37. data/lib/garcon/core_ext/process.rb +0 -41
  38. data/lib/garcon/utility/ansi.rb +0 -199
  39. data/lib/garcon/utility/equalizer.rb +0 -146
  40. data/lib/garcon/utility/msg_from_god.rb +0 -62
@@ -1,222 +0,0 @@
1
- # encoding: UTF-8
2
- #
3
- # Author: Stefano Harding <riddopic@gmail.com>
4
- # License: Apache License, Version 2.0
5
- # Copyright: (C) 2014-2015 Stefano Harding
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
- # Lazy ass Ruby.
21
- #
22
- module Lazy
23
- # Raised when a demanded computation diverges (e.g. if it tries to directly
24
- # use its own result)
25
- #
26
- class DivergenceError < Exception
27
- def initialize(message = 'Computation diverges')
28
- super(message)
29
- end
30
- end
31
-
32
- # Wraps an exception raised by a lazy computation.
33
- #
34
- # The reason we wrap such exceptions in LazyException is that they need to
35
- # be distinguishable from similar exceptions which might normally be raised
36
- # by whatever strict code we happen to be in at the time.
37
- #
38
- class LazyException < DivergenceError
39
- attr_reader :reason
40
-
41
- def initialize(reason)
42
- @reason = reason
43
- super "Exception in lazy computation: #{reason} (#{reason.class})"
44
- set_backtrace(reason.backtrace.dup) if reason
45
- end
46
- end
47
-
48
- # A handle for a promised computation. They are transparent, so that in
49
- # most cases, a promise can be used as a proxy for the computation's result
50
- # object. The one exception is truth testing -- a promise will always look
51
- # true to Ruby, even if the actual result object is nil or false.
52
- #
53
- # If you want to test the result for truth, get the unwrapped result object
54
- # via Kernel.demand.
55
- #
56
- class Promise
57
- alias __class__ class
58
- instance_methods.each do |method|
59
- undef_method method unless method =~ /^(__|object_|instance_)/
60
- end
61
-
62
- def initialize(&computation)
63
- @computation = computation
64
- end
65
-
66
- def __synchronize__
67
- yield
68
- end
69
-
70
- # Create this once here, rather than creating a proc object for every
71
- # evaluation.
72
- DIVERGES = lambda { raise DivergenceError.new }
73
-
74
- # Differentiate inspection of DIVERGES lambda.
75
- def DIVERGES.inspect
76
- 'DIVERGES'
77
- end
78
-
79
- def __result__
80
- __synchronize__ do
81
- if @computation
82
- raise LazyException.new(@exception) if @exception
83
-
84
- computation = @computation
85
- @computation = DIVERGES
86
-
87
- begin
88
- @result = demand(computation.call(self))
89
- @computation = nil
90
- rescue DivergenceError
91
- raise
92
- rescue Exception => e
93
- @exception = e
94
- raise LazyException.new(@exception)
95
- end
96
- end
97
-
98
- @result
99
- end
100
- end
101
-
102
- def inspect
103
- __synchronize__ do
104
- if @computation
105
- "#<#{__class__} computation=#{@computation.inspect}>"
106
- else
107
- @result.inspect
108
- end
109
- end
110
- end
111
-
112
- def respond_to?(message)
113
- message = message.to_sym
114
- message == :__result__ or
115
- message == :inspect or
116
- __result__.respond_to? message
117
- end
118
-
119
- def method_missing(*args, &block)
120
- __result__.__send__(*args, &block)
121
- end
122
- end
123
-
124
- # Thread safe version of Promise class.
125
- #
126
- class PromiseSafe < Promise
127
- def __synchronize__
128
- current = Thread.current
129
-
130
- Thread.critical = true
131
- unless @computation
132
- Thread.critical = false
133
- yield
134
- else
135
- if @owner == current
136
- Thread.critical = false
137
- raise DivergenceError.new
138
- end
139
- while @owner
140
- Thread.critical = false
141
- Thread.pass
142
- Thread.critical = true
143
- end
144
- @owner = current
145
- Thread.critical = false
146
-
147
- begin
148
- yield
149
- ensure
150
- @owner = nil
151
- end
152
- end
153
- end
154
- end
155
-
156
- # Future class subclasses PromiseSafe.
157
- #
158
- class Future < PromiseSafe
159
- def initialize(&computation)
160
- result = nil
161
- exception = nil
162
- thread = Thread.new do
163
- begin
164
- result = computation.call(self)
165
- rescue Exception => exception
166
- end
167
- end
168
-
169
- super do
170
- raise DivergenceError.new if Thread.current == thread
171
- thread.join
172
- raise exception if exception
173
- result
174
- end
175
- end
176
- end
177
- end
178
-
179
- module Kernel
180
- # The promise() function is used together with demand() to implement
181
- # lazy evaluation. It returns a promise to evaluate the provided
182
- # block at a future time. Evaluation can be demanded and the block's
183
- # result obtained via the demand() function.
184
- #
185
- # Implicit evaluation is also supported: the first message sent to it will
186
- # demand evaluation, after which that message and any subsequent messages
187
- # will be forwarded to the result object.
188
- #
189
- # As an aid to circular programming, the block will be passed a promise
190
- # for its own result when it is evaluated. Be careful not to force
191
- # that promise during the computation, lest the computation diverge.
192
- #
193
- def promise(&computation)
194
- Lazy::Promise.new(&computation)
195
- end
196
-
197
- # Forces the result of a promise to be computed (if necessary) and returns
198
- # the bare result object. Once evaluated, the result of the promise will
199
- # be cached. Nested promises will be evaluated together, until the first
200
- # non-promise result.
201
- #
202
- # If called on a value that is not a promise, it will simply return it.
203
- #
204
- def demand(promise)
205
- if promise.respond_to? :__result__
206
- promise.__result__
207
- else
208
- promise
209
- end
210
- end
211
-
212
- # Schedules a computation to be run asynchronously in a background thread
213
- # and returns a promise for its result. An attempt to demand the result of
214
- # the promise will block until the computation finishes.
215
- #
216
- # As with Kernel.promise, this passes the block a promise for its own result.
217
- # Use wisely.
218
- #
219
- def future(&computation)
220
- Lazy::Future.new(&computation)
221
- end
222
- end
@@ -1,41 +0,0 @@
1
- # encoding: UTF-8
2
- #
3
- # Author: Stefano Harding <riddopic@gmail.com>
4
- # License: Apache License, Version 2.0
5
- # Copyright: (C) 2014-2015 Stefano Harding
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
- module Process
21
-
22
- # Turns the current script into a daemon process
23
- # that detaches from the console. It can be shut
24
- # down with a TERM signal.
25
- #
26
- def self.daemon(nochdir = nil, noclose = nil)
27
- exit if fork
28
- Process.setsid
29
- exit if fork
30
- Dir.chdir '/' unless nochdir
31
- File.umask 0000
32
- unless noclose
33
- STDIN.reopen '/dev/null'
34
- STDOUT.reopen '/dev/null', 'a'
35
- STDERR.reopen '/dev/null', 'a'
36
- end
37
- trap('TERM') { exit }
38
- return 0
39
- end unless respond_to?(:daemon)
40
- end
41
-
@@ -1,199 +0,0 @@
1
- # encoding: UTF-8
2
- #
3
- # Author: Stefano Harding <riddopic@gmail.com>
4
- # License: Apache License, Version 2.0
5
- # Copyright: (C) 2014-2015 Stefano Harding
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
- module Garcon
21
-
22
- # ANSI Mixin Module
23
- #
24
- # Standard use is to mix this module into String.
25
- #
26
- # @example Mix this module into String to enable easy ANSI coloring methods
27
- # like:
28
- # "bold red".red.bold
29
- #
30
- # @example Or
31
- # "green".green
32
- #
33
- module ANSI
34
- extend self
35
-
36
- # Defines our ANSI color codes
37
- ANSI_COLORS = {
38
- black: 30,
39
- red: 31,
40
- green: 32,
41
- yellow: 33,
42
- blue: 34,
43
- magenta: 35,
44
- cyan: 36,
45
- white: 37
46
- }
47
-
48
- # @!method black(string=nil, &block)
49
- # Sets the foreground color to black for the supplied string.
50
- # @param [String] string The string to operate on.
51
- # @yieldreturn [String] The string to operate on.
52
- # @return [String] The colored string.
53
- #
54
- # @!method red(string=nil, &block)
55
- # Sets the foreground color to red for the supplied string.
56
- # @param [String] string The string to operate on.
57
- # @yieldreturn [String] The string to operate on.
58
- # @return [String] The colored string.
59
- #
60
- # @!method green(string=nil, &block)
61
- # Sets the foreground color to green for the supplied string.
62
- # @param [String] string The string to operate on.
63
- # @yieldreturn [String] The string to operate on.
64
- # @return [String] The colored string.
65
- #
66
- # @!method yellow(string=nil, &block)
67
- # Sets the foreground color to yellow for the supplied string.
68
- # @param [String] string The string to operate on.
69
- # @yieldreturn [String] The string to operate on.
70
- # @return [String] The colored string.
71
- #
72
- # @!method blue(string=nil, &block)
73
- # Sets the foreground color to blue for the supplied string.
74
- # @param [String] string The string to operate on.
75
- # @yieldreturn [String] The string to operate on.
76
- # @return [String] The colored string.
77
- #
78
- # @!method magenta(string=nil, &block)
79
- # Sets the foreground color to magenta for the supplied string.
80
- # @param [String] string The string to operate on.
81
- # @yieldreturn [String] The string to operate on.
82
- # @return [String] The colored string.
83
- #
84
- # @!method cyan(string=nil, &block)
85
- # Sets the foreground color to cyan for the supplied string.
86
- # @param [String] string The string to operate on.
87
- # @yieldreturn [String] The string to operate on.
88
- # @return [String] The colored string.
89
- #
90
- # @!method white(string=nil, &block)
91
- # Sets the foreground color to white for the supplied string.
92
- # @param [String] string The string to operate on.
93
- # @yieldreturn [String] The string to operate on.
94
- # @return [String] The colored string.
95
-
96
- # Defines our ANSI attribute codes
97
- ANSI_ATTRIBUTES = {
98
- normal: 0,
99
- bold: 1
100
- }
101
-
102
- # @!method normal(string=nil, &block)
103
- # Sets the foreground color to normal for the supplied string.
104
- # @param [String] string The string to operate on.
105
- # @yieldreturn [String] The string to operate on.
106
- # @return [String] The colored string.
107
- #
108
- # @!method bold(string=nil, &block)
109
- # Sets the foreground color to bold for the supplied string.
110
- # @param [String] string The string to operate on.
111
- # @yieldreturn [String] The string to operate on.
112
- # @return [String] The colored string.
113
-
114
- # Defines a RegEx for stripping ANSI codes from strings
115
- ANSI_REGEX = /\e\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]/
116
-
117
- # Dynamicly constructs ANSI methods for the color methods based on the ANSI
118
- # code hash passed in.
119
- #
120
- # @param [Hash] hash
121
- # A hash where the keys represent the method names and the values are the
122
- # ANSI codes.
123
- #
124
- # @return [Boolean]
125
- # True if successful.
126
- #
127
- def build_ansi_methods(hash)
128
- hash.each do |key, value|
129
-
130
- define_method(key) do |string=nil, &block|
131
- result = Array.new
132
-
133
- result << %(\e[#{value}m)
134
- if block_given?
135
- result << block.call
136
- elsif string.respond_to?(:to_str)
137
- result << string.to_str
138
- elsif respond_to?(:to_str)
139
- result << to_str
140
- else
141
- return result
142
- end
143
- result << %(\e[0m)
144
-
145
- result.join
146
- end
147
- end
148
-
149
- true
150
- end
151
-
152
- # Removes ANSI code sequences from a string.
153
- #
154
- # @param [String] string
155
- # The string to operate on.
156
- #
157
- # @yieldreturn [String]
158
- # The string to operate on.
159
- #
160
- # @return [String]
161
- # The supplied string stripped of ANSI codes.
162
- #
163
- def uncolor(string = nil, &block)
164
- if block_given?
165
- block.call.to_str.gsub(ANSI_REGEX, '')
166
- elsif string.respond_to?(:to_str)
167
- string.to_str.gsub(ANSI_REGEX, '')
168
- elsif respond_to?(:to_str)
169
- to_str.gsub(ANSI_REGEX, '')
170
- else
171
- ''
172
- end
173
- end
174
-
175
- def reset(string = nil, &block)
176
- result = Array.new
177
-
178
- result << %(\e[2J)
179
- if block_given?
180
- result << block.call
181
- elsif string.respond_to?(:to_str)
182
- result << string.to_str
183
- elsif respond_to?(:to_str)
184
- result << to_str
185
- else
186
- return result
187
- end
188
-
189
- result.join
190
- end
191
-
192
- def goto(x=0, y=0)
193
- %(\e[#{x};#{y}H)
194
- end
195
-
196
- build_ansi_methods(ANSI_COLORS)
197
- build_ansi_methods(ANSI_ATTRIBUTES)
198
- end
199
- end
@@ -1,146 +0,0 @@
1
- # encoding: UTF-8
2
- #
3
- # Author: Stefano Harding <riddopic@gmail.com>
4
- # License: Apache License, Version 2.0
5
- # Copyright: (C) 2014-2015 Stefano Harding
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
- module Garcon
21
- # Define equality, equivalence and inspection methods.
22
- #
23
- class Equalizer
24
-
25
- # Initialize an Equalizer with the given keys.
26
- #
27
- # Will use the keys with which it is initialized to define #cmp?,
28
- # #hash, and #inspect
29
- #
30
- # @param [String] name
31
- #
32
- # @param [Array<Symbol>] keys
33
- #
34
- # @return [undefined]
35
- #
36
- # @api private
37
- def initialize(name, keys = [])
38
- @name = name.dup.freeze
39
- @keys = keys.dup
40
- define_methods
41
- include_comparison_methods
42
- end
43
-
44
- # Append a key and compile the equality methods.
45
- #
46
- # @return [Equalizer] self
47
- #
48
- # @api private
49
- def <<(key)
50
- @keys << key
51
- self
52
- end
53
-
54
- private # P R O P R I E T À P R I V A T A Vietato L'accesso
55
-
56
- # Define the equalizer methods based on #keys.
57
- #
58
- # @return [undefined]
59
- #
60
- # @api private
61
- def define_methods
62
- define_cmp_method
63
- define_hash_method
64
- define_inspect_method
65
- end
66
-
67
- # Define an #cmp? method based on the instance's values identified by #keys.
68
- #
69
- # @return [undefined]
70
- #
71
- # @api private
72
- def define_cmp_method
73
- keys = @keys
74
- define_method(:cmp?) do |comparator, other|
75
- keys.all? { |key| send(key).send(comparator, other.send(key)) }
76
- end
77
- end
78
-
79
- # Define a #hash method based on the instance's values identified by #keys.
80
- #
81
- # @return [undefined]
82
- #
83
- # @api private
84
- def define_hash_method
85
- keys = @keys
86
- define_method(:hash) do
87
- keys.map { |key| send(key) }.push(self.class).hash
88
- end
89
- end
90
-
91
- # Define an inspect method that reports the values of the instance's keys.
92
- #
93
- # @return [undefined]
94
- #
95
- # @api private
96
- def define_inspect_method
97
- name, keys = @name, @keys
98
- define_method(:inspect) do
99
- "#<#{name}#{keys.map { |key| " #{key}=#{send(key).inspect}" }.join}>"
100
- end
101
- end
102
-
103
- # Include the #eql? and #== methods
104
- #
105
- # @return [undefined]
106
- #
107
- # @api private
108
- def include_comparison_methods
109
- module_eval { include Methods }
110
- end
111
-
112
- # The comparison methods
113
- module Methods
114
-
115
- # Compare the object with other object for equality.
116
- #
117
- # @example
118
- # object.eql?(other) # => true or false
119
- #
120
- # @param [Object] other
121
- # the other object to compare with
122
- #
123
- # @return [Boolean]
124
- #
125
- # @api public
126
- def eql?(other)
127
- instance_of?(other.class) && cmp?(__method__, other)
128
- end
129
-
130
- # Compare the object with other object for equivalency.
131
- #
132
- # @example
133
- # object == other # => true or false
134
- #
135
- # @param [Object] other
136
- # the other object to compare with
137
- #
138
- # @return [Boolean]
139
- #
140
- # @api public
141
- def ==(other)
142
- other.kind_of?(self.class) && cmp?(__method__, other)
143
- end
144
- end
145
- end
146
- end
@@ -1,62 +0,0 @@
1
-
2
- # God speaks in Ruby, not Python!! MsgFromGod is an implementation of a
3
- # Higher-Order-Message. Essentally, a MsgFromGod can vary its behavior
4
- # accorrding to the operation applied to it.
5
- #
6
- # @example
7
- # g = MsgFromGod.new { |op, x| x.send(op, x) }
8
- # (g + 1) # => 2
9
- # (g + 2) # => 4
10
- # (g + 3) # => 6
11
- # (g * 1) # => 1
12
- # (g * 2) # => 4
13
- # (g * 3) # => 9
14
- #
15
- class MsgFromGod
16
-
17
- # MsgFromGod can be somewhat inefficient if a new MsgFromGod is frequently
18
- # recreated for the same use. So this cache can be used to speed things up.
19
- #
20
- # The key will always be an array, wich makes it easier to cache MsgFromGod
21
- # for multiple factors.
22
- #
23
- def self.cache(*key, &function)
24
- @cache ||= {}
25
- if function
26
- @cache[key] = new(&function)
27
- else
28
- @cache[key]
29
- end
30
- end
31
-
32
- EXCEPTIONS = [:binding, :inspect, :object_id]
33
- if defined?(::BasicObject)
34
- EXCEPTIONS.concat(::BasicObject.instance_methods)
35
- EXCEPTIONS.uniq!
36
- EXCEPTIONS.map! { |m| m.to_sym }
37
- end
38
-
39
- alias :__class__ :class
40
-
41
- # Privatize all methods except vital methods and #binding.
42
- instance_methods(true).each do |m|
43
- next if m.to_s =~ /^__/
44
- next if EXCEPTIONS.include?(m.to_sym)
45
- undef_method(m)
46
- end
47
-
48
- def initialize(&function)
49
- @function = function
50
- end
51
-
52
- def to_proc
53
- @function
54
- end
55
-
56
- private # P R O P R I E T À P R I V A T A Vietato L'accesso
57
-
58
- # Any action against the MsgFromGod is processesd by the function.
59
- def method_missing(op, *args, &blk)
60
- @function.call(op, *args, &blk)
61
- end
62
- end