cowtech-lib 1.9.0 → 1.9.1

Sign up to get free protection for your applications and to get access to all the features.
data/cowtech-lib.gemspec CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{cowtech-lib}
8
- s.version = "1.9.0"
8
+ s.version = "1.9.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Shogun"]
@@ -18,8 +18,6 @@ Gem::Specification.new do |s|
18
18
  ]
19
19
  s.files = [
20
20
  ".document",
21
- "Gemfile",
22
- "Gemfile.lock",
23
21
  "LICENSE.txt",
24
22
  "README.rdoc",
25
23
  "Rakefile",
@@ -42,15 +40,9 @@ Gem::Specification.new do |s|
42
40
  s.specification_version = 3
43
41
 
44
42
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
45
- s.add_development_dependency(%q<jeweler>, ["~> 1.5.1"])
46
- s.add_development_dependency(%q<rcov>, [">= 0"])
47
43
  else
48
- s.add_dependency(%q<jeweler>, ["~> 1.5.1"])
49
- s.add_dependency(%q<rcov>, [">= 0"])
50
44
  end
51
45
  else
52
- s.add_dependency(%q<jeweler>, ["~> 1.5.1"])
53
- s.add_dependency(%q<rcov>, [">= 0"])
54
46
  end
55
47
  end
56
48
 
data/lib/cowtech-lib.rb CHANGED
@@ -22,8 +22,12 @@
22
22
  # A copy of the GNU General Public License is available at: http://www.gnu.org/licenses/gpl.txt
23
23
  #
24
24
 
25
- require "rubygems"
26
- require "CowtechLib/Console"
27
- require "CowtechLib/OptionParser"
28
- require "CowtechLib/Shell"
29
- require "CowtechLib/Script"
25
+ module Cowtech
26
+ module Lib
27
+ autoload :Version, 'cowtech-lib/version'
28
+ autoload :Console, 'cowtech-lib/console'
29
+ autoload :OptionParser, 'cowtech-lib/option_parser'
30
+ autoload :Shell, 'cowtech-lib/shell'
31
+ autoload :Script, 'cowtech-lib/script'
32
+ end
33
+ end
@@ -26,289 +26,331 @@
26
26
  #
27
27
 
28
28
  require "rexml/document"
29
- require "open4"
30
- require "find"
31
- require "fileutils"
32
29
 
33
30
  class String
34
31
  def to_a
35
32
  [self]
36
33
  end
37
34
  end
35
+
36
+ class Hash
37
+ def method_missing(method, *arg)
38
+ # PER ORA SUPPORTIAMO SOLO I GETTER
39
+ self[method.to_sym]
40
+ end
38
41
 
39
- module CowtechLib
40
- =begin rdoc
41
- A class which provides some method to operate with files and to format pretty messages.
42
- =end
43
- class Console
44
- public
45
-
46
- # Indentation level
47
- attr :indent_level
48
-
49
- # Whether show executed commands
50
- attr :show_commands
51
-
52
- # Whether show output of executed commands
53
- attr :show_outputs
54
-
55
- # Whether simply print commands rather than executing them
56
- attr :skip_commands
57
-
58
- # Exit status for commands
59
- attr_reader :statuses
60
-
61
- # Indentation string(s)
62
- attr :indentator, true
63
-
64
- # Sets indentation level.
65
- # Arguments:
66
- # * <em>indent</em>: The new indentation level
67
- # * <em></em>: If the level is absolute or relative to the current level
68
- def indent_set(level, absolute = false)
69
- @indent_level = Math.max((!absolute ? @indent_level : 0) + level, 0)
70
- end
71
-
72
- # Resets indentation level to 0.
73
- def indent_reset
74
- @indent_level = 0
75
- end
42
+ def respond_to?(method)
43
+ self.has_key?(method.to_sym)
44
+ end
45
+ end
76
46
 
77
- # Execute codes in an indented block
78
- def indent_region(level, absolute = false, &block)
79
- old_level = @indent_level
80
- self.indent_set(level, absolute)
81
- yield
82
- @indent_level = old_level
83
- end
84
-
85
- # Indents a message.
86
- #
87
- # Arguments:
88
- # * <em>msg</em>: The message to indent
89
- # * <em>add_additional</em>: Whether add extra space to align to initial message "*"
90
- # Returns: The indentated message
91
- def indent(msg, level = nil)
92
- (@@indentator * (level || @indent_level)) + msg
93
- end
94
-
95
- =begin rdoc
96
- Substitute tag with color.
97
-
98
- Arguments:
99
- * <em>node</em>: The node which operate on
100
- * <em>stack</em>: The stack of old styles. <b>Do not set this by yourself!</b>
101
-
102
- Returns: The new text
103
- =end
104
- def subst_color(node, stack = [])
105
- rv = ""
106
- styles = (node.name == "text" and node.attributes["style"]) ? node.attributes["style"].split(" ") : nil
107
-
108
- # Add style of current tag
109
- if styles then
110
- styles.each do |style|
111
- rv += @@styles[style] || ""
112
- end
47
+ module Cowtech
48
+ module Lib
49
+ # A class which provides some method to operate with files and to format pretty messages.
50
+ # @author Shogun
51
+ class Console
52
+ # Indentation level
53
+ attr_accessor :indent_level
54
+
55
+ # Whether show executed commands
56
+ attr_accessor :show_commands
57
+
58
+ # Whether show output of executed commands
59
+ attr_accessor :show_outputs
113
60
 
114
- stack.push(styles)
61
+ # Whether simply print commands rather than executing them
62
+ attr_accessor :skip_commands
63
+
64
+ # Exit status for commands
65
+ attr_reader :statuses
66
+
67
+ # Indentation string(s)
68
+ attr_accessor :indentator
69
+
70
+ # Sets indentation level.
71
+ # Arguments:
72
+ # * <em>indent</em>: The new indentation level
73
+ # * <em></em>: If the level is absolute or relative to the current level
74
+ def indent_set(level, absolute = false)
75
+ @indent_level = [(!absolute ? @indent_level : 0) + level, 0].max
115
76
  end
116
77
 
117
- # Now parse subnodes
118
- node.children.each do |child|
119
- if child.node_type == :text then
120
- rv += child.to_s
121
- elsif child.name == "text" then
122
- rv += self.subst_color(child, stack)
123
- end
78
+ # Resets indentation level to 0.
79
+ def indent_reset
80
+ @indent_level = 0
81
+ end
82
+
83
+ # Execute codes in an indented block
84
+ def indent_region(level, absolute = false)
85
+ old_level = @indent_level
86
+ self.indent_set(level, absolute)
87
+ yield
88
+ @indent_level = old_level
124
89
  end
125
90
 
126
- # Remove style of current tag
127
- if styles then
128
- stack.pop()
91
+ # Indents a message.
92
+ #
93
+ # Arguments:
94
+ # * <em>msg</em>: The message to indent
95
+ # * <em>add_additional</em>: Whether add extra space to align to initial message "*"
96
+ # Returns: The indentated message
97
+ def indent(msg, level = nil)
98
+ (@@indentator * (level || @indent_level)) + msg
99
+ end
100
+
101
+ # Substitute tag with color.
102
+ #
103
+ # Arguments:
104
+ # * <em>node</em>: The node which operate on
105
+ # * <em>stack</em>: The stack of old styles. <b>Do not set this by yourself!</b>
106
+ #
107
+ # Returns: The new text
108
+ def parse_message(node, stack = [])
109
+ rv = ""
110
+ styles = (node.name == "text" and node.attributes["style"]) ? node.attributes["style"].split(" ") : nil
111
+
112
+ # Add style of current tag
113
+ if styles then
114
+ styles.each do |style|
115
+ rv += @@styles[style] || ""
116
+ end
117
+
118
+ stack.push(styles)
119
+ end
120
+
121
+ # Now parse subnodes
122
+ node.children.each do |child|
123
+ if child.node_type == :text then
124
+ rv += child.to_s
125
+ elsif child.name == "text" then
126
+ rv += self.parse_message(child, stack)
127
+ end
128
+ end
129
+
130
+ # Remove style of current tag
131
+ if styles then
132
+ stack.pop()
129
133
 
130
- # Restore previous style
131
- (stack.pop || ["default"]).each do |style|
132
- rv += @@styles[style]
134
+ # Restore previous style
135
+ (stack.pop || ["default"]).each do |style|
136
+ rv += @@styles[style]
137
+ end
133
138
  end
139
+
140
+ rv
134
141
  end
135
-
136
- rv
137
- end
138
142
 
139
- # Prints a message.
140
- # Arguments:
141
- # * <em>msg</em>: The message to print
142
- # * <em>dots</em>: Whether add "..." to the message
143
- # * <em>newline</em>: Whether add a newline to the message
144
- # * <em>plain</em>: Whether ignore tags
145
- # * <em>must_indent</em>: Whether indent the message
146
- # * <em>internal</em>: If the method is called by another method. <b>Do not set this by yourself!</b>
147
- def write(*args)
148
- msg = args[:msg]
149
-
150
- # Check some alternative syntax
151
- [:begin, :warn, :error, :debug, :info, :right, :end].each do |t|
152
- if args[t] then
153
- msg = args[t]
154
- args[:type] = :t
155
- args[t] = nil
143
+ # Prints a message.
144
+ # Arguments:
145
+ # * <em>msg</em>: The message to print
146
+ # * <em>dots</em>: Whether add "..." to the message
147
+ # * <em>newline</em>: Whether add a newline to the message
148
+ # * <em>plain</em>: Whether ignore tags
149
+ # * <em>must_indent</em>: Whether indent the message
150
+ # * <em>internal</em>: If the method is called by another method. <b>Do not set this by yourself!</b>
151
+ def write(args)
152
+ msg = args[:msg]
153
+
154
+ # Check some alternative syntax
155
+ [:begin, :warn, :error, :debug, :info, :right, :end].each do |t|
156
+ if args[t] then
157
+ msg = args[t]
158
+ args[:type] = t
159
+ args[t] = nil
160
+ end
161
+ end
162
+ args[:fatal] = true if args[:status] == :fail
163
+
164
+ # Check for specific msg type
165
+ if [:begin, :warn, :error, :debug, :info].include?(args[:type]) then
166
+ mc = {:begin => "bold green", :warn => "bold yellow", :error => "bold red", :debug => "magenta", :info => "bold cyan"}
167
+ color = args[:color] || mc[args[:type]]
168
+ msg = !args[:full_color] ? "<text style=\"#{color}\">*</text> #{self.indent(msg)}" : "<text style=\"#{color}\">* #{self.indent(msg)}</text>"
169
+ end
170
+
171
+ # Add dots and indentation if needed
172
+ msg = self.indent(msg + (args.fetch(:dots, true) ? "..." : ""), args[:indent] ? @indent_level : 0)
173
+
174
+ # Parse the message
175
+ unless args[:plain] then
176
+ begin
177
+ xml = "<text>#{msg}</text>"
178
+ msg = self.parse_message(REXML::Document.new(xml).root)
179
+ rescue Exception => e
180
+ print "[ERROR] Invalid message tagging, check XML syntax (or color requested) of the following message:\n\n\t#{xml}\n\n"
181
+ print "\tThe errors was: #{e.message} (#{e.class.to_s})\n\n"
182
+ exit(1)
183
+ end
184
+ end
185
+
186
+ # Add newline if needed
187
+ msg += "\n" if args.fetch(:newline, true)
188
+
189
+ if args[:internal] then
190
+ msg
191
+ else
192
+ if [:end, :right].include?(args[:type]) then
193
+ # Get screen width
194
+ @tty_width = `tput cols`.to_i if @tty_width < 0
195
+
196
+ # Get padding
197
+ pad = @tty_width - msg.inspect.gsub(/(\\e\[[0-9]+m)|(\")|(\\n)/, "").length
198
+
199
+ print "\033[A" if args[:up]
200
+ print "\033[0G\033[#{pad}C"
201
+ end
202
+
203
+ print(msg)
204
+ end
205
+
206
+ exit(args[:code] || 0) if args[:exit_after] || args[:fatal]
156
207
  end
157
- args[:fatal] = true if args[:status] == :fail
158
-
159
- # Check for specific msg type
160
- if [:begin, :warn, :error, :debug, :info].include?(args[:type]) then
161
- mc = {:begin => "bold green", :warn => "bold yellow", :error => "bold red", :debug => "magenta", :info => "bold cyan"}
162
- color = args[:color] || mc[args[:type]]
208
+
209
+ # Syntatic sugar
210
+ # Prints a warning message.
211
+ def warn(msg, args = nil)
212
+ args ||= {}
163
213
 
164
- if args[:full_color] then
165
- msg = "<text style=\"#{color}\">*</text> #{self.indent(msg)}"
214
+ if msg.is_a?(Hash) then
215
+ args.merge!(msg)
166
216
  else
167
- msg = "<text style=\"#{color}\">* #{self.indent(msg)}</text>"
217
+ args[:msg] = msg
168
218
  end
219
+
220
+ args[:warn] = args[:msg]
221
+
222
+ self.write(args)
169
223
  end
170
-
171
- # Add dots and indentation if needed
172
- msg = self.indent(msg + (args[:trailing_dots] ? "..." : ""), args[:indent] ? @indent_level : -1)
173
-
174
- # Parse the message
175
- unless args[:plain] then
176
- begin
177
- msg = self.parse_message(REXML::Document.new("<text>#{msg}</text>").root)
178
- rescue Exception => e
179
- print "[ERROR] Invalid message tagging, check XML syntax (or color requested) of the following message:\n\n\t#{msg}\n\n"
180
- exit(1)
224
+
225
+ # Prints an error message.
226
+ def error(msg, args = nil)
227
+ args ||= {}
228
+
229
+ if msg.is_a?(Hash) then
230
+ args.merge!(msg)
231
+ else
232
+ args[:msg] = msg
181
233
  end
234
+
235
+ args[:error] = args[:msg]
236
+
237
+ self.write(args)
182
238
  end
183
239
 
184
- # Add newline if needed
185
- msg += "\n" if args[:newline]
186
-
187
- if args[:internal] then
188
- msg
189
- else
190
- if [:end, :right].include?(args[:type]) then
191
- # Get screen width
192
- @tty_width = `tput cols`.to_i if @tty_width < 0
193
-
194
- # Get padding
195
- pad = @tty_width - msg.inspect.gsub(/(\\e\[[0-9]+m)|(\")|(\\n)/, "").length
196
-
197
- print "\033[A" if args[:up]
198
- print "\033[0G\033[#{pad}C"
240
+ # Prints and error message then abort.
241
+ def fatal(msg, args = nil)
242
+ args ||= {}
243
+
244
+ if msg.is_a?(Hash) then
245
+ args.merge!(msg)
246
+ else
247
+ args[:msg] = msg
199
248
  end
200
-
201
- print(msg)
249
+
250
+ args[:error] = args[:msg]
251
+ args[:exit_after] = true
252
+ args[:code] ||= 1
253
+
254
+ self.write(args)
202
255
  end
203
-
204
- exit(args[:code] || 0) if args[:exit_after] || args[:fatal]
205
- end
206
256
 
207
- # Syntatic sugar
208
- # Prints a warning message.
209
- def warn(msg, *args)
210
- args[:warn] = msg
211
- self.write(*args)
212
- end
257
+ # Prints an error status
258
+ def status(status, args = nil)
259
+ args ||= {}
213
260
 
214
- # Prints an error message.
215
- def error(msg, *args)
216
- args[:error] = msg
217
- self.write(*args)
218
- end
219
-
220
- # Prints and error message then abort.
221
- def fatal(msg, *args)
222
- args[:error] = msg
223
- args[:exit_after] = true
224
- args[:code] ||= 1
225
- self.write(*args)
226
- end
227
-
228
- # Prints an error status
229
- def status(*args)
230
- args[:end] = @@statuses[status] || @@statuses[:ok]
231
- self.write(*args)
232
- end
233
-
234
- # Read input from the user.
235
- #
236
- # Arguments:
237
- # * <em>msg</em>: The prompt to show
238
- # * <em>valids</em>: A list of regexp to validate the input
239
- # * <em>case_sensitive</em>: Wheter the validation is case_sensitive
240
- #
241
- # Returns: The read input
242
- def read(*args)
243
- # Adjust prompt
244
- msg = args[:msg] + (msg !~ /([:?](\s*))$/) ? ":" : "")
245
- msg += " " unless msg =~ / ^/
246
-
247
- # Turn choices into regular expressions
248
- regexps = (args[:valids] || []).to_a.collect do |valid|
249
- unless valid.is_a?(Regexp) then
250
- valid = Regexp.new((valid !~ /^\^/ ? "^" : "") + valid + (valid !~ /\$$/ ? "$" : ""), Regexp::EXTENDED + (args[:case_sensitive] ? Regexp::IGNORECASE : 0), "U")
261
+ if status.is_a?(Hash) then
262
+ args.merge!(status)
251
263
  else
252
- valid
264
+ args[:status] = status
253
265
  end
266
+
267
+ status = status.is_a?(Hash) ? status[:status] : status
268
+ args[:end] = @@statuses[status] || @@statuses[:ok]
269
+ args[:dots] = false
270
+ args[:up] = true if args[:up] == nil
271
+ self.write(args)
254
272
  end
255
273
 
256
- rv = nil
257
-
258
- # Read input
259
- while true do
260
- # Show message
261
- print(msg)
262
-
263
- # Get reply
264
- bufs = gets.chop()
265
-
266
- # If we don't have any regexp
267
- if regexps.length == 0 then
268
- rv = bufs
269
- break
274
+ # Read input from the user.
275
+ #
276
+ # Arguments:
277
+ # * <em>msg</em>: The prompt to show
278
+ # * <em>valids</em>: A list of regexp to validate the input
279
+ # * <em>case_sensitive</em>: Wheter the validation is case_sensitive
280
+ #
281
+ # Returns: The read input
282
+ def read(args)
283
+ # Adjust prompt
284
+ msg = args[:msg] + ((msg !~ /([:?](\s*))$/) ? ":" : "")
285
+ msg += " " unless msg =~ / ^/
286
+
287
+ # Turn choices into regular expressions
288
+ regexps = (args[:valids] || []).to_a.collect do |valid|
289
+ unless valid.is_a?(Regexp) then
290
+ valid = Regexp.new((valid !~ /^\^/ ? "^" : "") + valid + (valid !~ /\$$/ ? "$" : ""), Regexp::EXTENDED + (args[:case_sensitive] ? Regexp::IGNORECASE : 0), "U")
291
+ else
292
+ valid
293
+ end
270
294
  end
271
-
272
- # Validate inputs
273
- regexps.each do |re|
274
- if bufs =~ re then
295
+
296
+ rv = nil
297
+
298
+ # Read input
299
+ while true do
300
+ # Show message
301
+ print(msg)
302
+
303
+ # Get reply
304
+ bufs = gets.chop()
305
+
306
+ # If we don't have any regexp
307
+ if regexps.length == 0 then
275
308
  rv = bufs
276
309
  break
277
310
  end
311
+
312
+ # Validate inputs
313
+ regexps.each do |re|
314
+ if bufs =~ re then
315
+ rv = bufs
316
+ break
317
+ end
318
+ end
319
+
320
+ break if rv
321
+ self.write(:warn => "Sorry, your reply was not understood. Please try again")
278
322
  end
279
-
280
- break if rv
281
- self.write(:warn => "Sorry, your reply was not understood. Please try again")
323
+
324
+ rv
325
+ end
326
+
327
+ # Create a new Console.
328
+ def initialize
329
+ @indent_level = 0
330
+ @show_commands = false
331
+ @show_outputs = false
332
+ @skip_commands = false
333
+ @tty_width = -1
334
+ @@indentator= " "
335
+
336
+ @@styles = {
337
+ # Default color
338
+ "default" => "\33[0m",
339
+ # Text style
340
+ "bold" => "\33[1m", "underline" => "\33[4m", "blink" => "\33[5m", "reverse" => "\33[7m", "concealed" => "\33[8m",
341
+ # Foreground colors
342
+ "black" => "\33[30m", "red" => "\33[31m", "green" => "\33[32m", "yellow" => "\33[33m", "blue" => "\33[34m", "magenta" => "\33[35m", "cyan" => "\33[36m", "white" => "\33[37m",
343
+ # Background colors
344
+ "bg_black" => "\33[40m", "bg_red" => "\33[41m", "bg_green" => "\33[42m", "bg_yellow" => "\33[43m", "bg_blue" => "\33[44m", "bg_magenta" => "\33[45m", "bg_cyan" => "\33[46m", "bg_white" => "\33[47m"
345
+ }
346
+
347
+ @@statuses = {
348
+ :ok => '<text style="bold blue">[ <text style="bold green">OK</text> ]</text> ',
349
+ :pass => '<text style="bold blue">[<text style="bold cyan">PASS</text>]</text> ',
350
+ :fail => '<text style="bold blue">[<text style="bold red">FAIL</text>]</text> ',
351
+ :warn => '<text style="bold blue">[<text style="bold yellow">WARN</text>]</text> ',
352
+ }
282
353
  end
283
- end
284
-
285
- # Create a new Console.
286
- def initialize
287
- @indent_level = 0
288
- @show_commands = false
289
- @show_outputs = false
290
- @skip_commands = false
291
- @tty_width = -1
292
- @@indentator= " "
293
-
294
- @@styles = {
295
- # Default color
296
- "default" => "\33[0m",
297
- # Text style
298
- "bold" => "\33[1m", "underline" => "\33[4m", "blink" => "\33[5m", "reverse" => "\33[7m", "concealed" => "\33[8m",
299
- # Foreground colors
300
- "black" => "\33[30m", "red" => "\33[31m", "green" => "\33[32m", "yellow" => "\33[33m", "blue" => "\33[34m", "magenta" => "\33[35m", "cyan" => "\33[36m", "white" => "\33[37m",
301
- # Background colors
302
- "bg_black" => "\33[40m", "bg_red" => "\33[41m", "bg_green" => "\33[42m", "bg_yellow" => "\33[43m", "bg_blue" => "\33[44m", "bg_magenta" => "\33[45m", "bg_cyan" => "\33[46m", "bg_white" => "\33[47m"
303
- }
304
-
305
- @@statuses = {
306
- :ok => '<text style="bold blue">[ <text style="bold green">OK</text> ]</text> ',
307
- :pass => '<text style="bold blue">[<text style="bold cyan">PASS</text>]</text> ',
308
- :fail => '<text style="bold blue">[<text style="bold red">FAIL</text>]</text> ',
309
- :warn => '<text style="bold blue">[<text style="bold yellow">WARN</text>]</text> ',
310
- }
311
354
  end
312
355
  end
313
- end
314
-
356
+ end
@@ -25,9 +25,7 @@
25
25
  # THE SOFTWARE.
26
26
  #
27
27
 
28
- require "ostruct"
29
28
  require "getoptlong"
30
- require "CowtechLib/Console"
31
29
 
32
30
  module Cowtech
33
31
  module Lib
@@ -35,7 +33,7 @@ module Cowtech
35
33
  # @author Shogun
36
34
  class OptionParser
37
35
  # The specified options
38
- attr :options
36
+ attr_accessor :options
39
37
 
40
38
  # The full command line provided
41
39
  attr_reader :cmdline
@@ -68,10 +66,10 @@ module Cowtech
68
66
  # * <em>:required</em>: Whether the option is required
69
67
  # * <em>:priority</em>: Priority for the option. Used only on the help message to sort (by increasing priority) the options.
70
68
  def <<(options)
71
- options = options.to_a
69
+ options = [options] unless options.is_a?(Array)
72
70
 
73
71
  options.each do |option|
74
- @console.fatal(:msg => "Every attribute must be an Hash.") unless option.kind_of?(Hash)
72
+ @console.fatal(:msg => "Every attribute must be an Hash.", :dots => false) unless option.is_a?(Hash)
75
73
 
76
74
  # Use symbols for names
77
75
  option[:name] = option[:name].to_sym
@@ -80,7 +78,7 @@ module Cowtech
80
78
  option[:type] ||= :string
81
79
 
82
80
  # Check if type is valid
83
- @console.fatal(:msg => "Invalid option type #{option[:type]} for option #{option[:name]}. Valid type are the following:\n\t#{@@valid_types.keys.join(", ")}.") unless @valid_types.keys.include?(option[:type])
81
+ @console.fatal(:msg => "Invalid option type #{option[:type]} for option #{option[:name]}. Valid type are the following:\n\t#{@@valid_types.keys.join(", ")}.", :dots => false) unless @@valid_types.keys.include?(option[:type])
84
82
 
85
83
  # Adjust the default value
86
84
  case option[:type]
@@ -93,13 +91,13 @@ module Cowtech
93
91
  end
94
92
 
95
93
  # Adjust priority
96
- option[:priority] = option[:priority].to_s.to_i unless option[:priority].is_a(Integer)
94
+ option[:priority] = option[:priority].to_s.to_i unless option[:priority].is_a?(Integer)
97
95
 
98
96
  # Prepend dashes
99
- option[:short] = "-" + option[:short] unless option[:short][0][1] == "-"
97
+ option[:short] = "-" + option[:short] unless option[:short] =~ /^-/
100
98
  while not option[:long] =~ /^--/ do option[:long] = "-" + option[:long] end
101
- @console.fatal(:msg > "Invalid short form \"#{option[:short]}\"") unless option[:short] =~ /^-[0-9a-z]$/i
102
- @console.fatal(:msg > "Invalid long form \"#{option[:long]}\"") unless option[:loing] =~ /^--([0-9a-z-]+)$/i
99
+ @console.fatal(:msg => "Invalid short form \"#{option[:short]}\".", :dots => false) unless option[:short] =~ /^-[0-9a-z]$/i
100
+ @console.fatal(:msg => "Invalid long form \"#{option[:long]}\".", :dots => false) unless option[:long] =~ /^--([0-9a-z-]+)$/i
103
101
 
104
102
  # Check for choices if the type is choices
105
103
  if option[:type] == :choice then
@@ -111,16 +109,16 @@ module Cowtech
111
109
  end
112
110
 
113
111
  # Check that action is a block if the type is action
114
- @console.fatal(:msg => "Option \"#{option[:name]}\" of type action requires a action block.") if option[:type] == :action && (option[:action] == nil || !option[:action].kind_of?(Proc.class))
112
+ @console.fatal("Option \"#{option[:name]}\" of type action requires a action block.") if option[:type] == :action && (option[:action] == nil || !option[:action].is_a?(Proc.class))
115
113
 
116
114
  # Check for uniqueness of option and its forms
117
- @console.fatal(:msg => "An option with name \"#{option[:name]}\" already exists.", false, false, true, 1) if @inserted[:name].include?(option[:name])
118
- @console.fatal(:msg => "An option with short or long form \"#{option[:short]}\" already exists.") if @inserted[:short].include?(option[:short])
119
- @console.fatal(:msg => "An option with short or long form \"#{option[:long]}\" already exists.") if @inserted[:long].include?(option[:long])
115
+ @console.fatal("An option with name \"#{option[:name]}\" already exists.", :dots => false) if @inserted[:name].include?(option[:name])
116
+ @console.fatal("An option with short or long form \"#{option[:short]}\" already exists.", :dots => false) if @inserted[:short].include?(option[:short])
117
+ @console.fatal("An option with short or long form \"#{option[:long]}\" already exists.", :dots => false) if @inserted[:long].include?(option[:long])
120
118
 
121
119
  # Save
122
120
  @options[option[:name]] = option
123
- @options_map[options[:long]] = option[:name]
121
+ @options_map[option[:long]] = option[:name]
124
122
  @inserted[:name].push(option[:name])
125
123
  @inserted[:short].push(option[:short])
126
124
  @inserted[:long].push(option[:long])
@@ -132,7 +130,8 @@ module Cowtech
132
130
  # Arguments:
133
131
  # * <em>ignore_unknown</em>: Whether ignore unknown options
134
132
  # * <em>ignore_unknown</em>: Whether ignore help options
135
- def parse(*arg)
133
+ def parse(args = nil)
134
+ args ||= {}
136
135
  # Create options
137
136
  noat = [:bool, :action]
138
137
  sopts = @options.each_value.collect do |option| [option[:long], option[:short], noat.include?(option[:type]) ? GetoptLong::NO_ARGUMENT : GetoptLong::REQUIRED_ARGUMENT] end
@@ -146,34 +145,34 @@ module Cowtech
146
145
  optname = @options_map[given]
147
146
  option = @options[optname]
148
147
  value = nil
148
+
149
149
 
150
150
  # VALIDATE ARGUMENT DUE TO CASE
151
151
  case option[:type]
152
152
  when :string then
153
153
  value = arg
154
154
  when :int then
155
- if arg.strip =~ /^(-?)(\d+)$/ then value = arg.to_i(10) else @console.fatal(:msg => "Argument of option \"#{given}\" must be an integer.") end
155
+ if arg.strip =~ /^(-?)(\d+)$/ then value = arg.to_i(10) else @console.fatal(:msg => "Argument of option \"#{given}\" must be an integer.", :dots => false) end
156
156
  when :float then
157
- if arg.strip =~ /^(-?)(\d*)(\.(\d+))?$/ and arg.strip() != "." then value = arg.to_f else @console.fatal(:msg => "Argument of option \"#{given}\" must be a float.") end
157
+ if arg.strip =~ /^(-?)(\d*)(\.(\d+))?$/ and arg.strip() != "." then value = arg.to_f else @console.fatal(:msg => "Argument of option \"#{given}\" must be a float.", :dots => false) end
158
158
  when :choice then
159
- if @options[optname].choices.find_index { |choice| arg =~ choice } then value = arg else @console.fatal(:msg => "Invalid argument (invalid choice) for option \"#{given}\".")
159
+ if @options[optname].choices.find_index { |choice| arg =~ choice } then value = arg else @console.fatal(:msg => "Invalid argument (invalid choice) for option \"#{given}\".", :dots => false) end
160
160
  when :list then
161
161
  value = arg.split(",")
162
162
  else
163
163
  value = true
164
164
  end
165
165
 
166
- @options[optname] = value
166
+ @options[optname][:value] = value
167
167
  end
168
168
  rescue StandardError => exception
169
- mo = exception.message =~ /.+-- (.+)/
170
- if mo then
171
- given = "-" * $1.length
169
+ if exception.message =~ /.+-- (.+)$/ then
170
+ given = $1
172
171
 
173
- if exception.kind_of?(GetoptLong::InvalidOption) then
174
- @console.fatal(:msg => "Unknown option \"#{given}\".") unless args[:ignore_unknown]
175
- elsif exception.kind_of?(GetoptLong::MissingArgument) then
176
- @console.fatal(:msg => "Option \"#{given}\" requires an argument.")
172
+ if exception.is_a?(GetoptLong::InvalidOption) then
173
+ @console.fatal(:msg => "Unknown option \"#{given}\".", :dots => false) unless args[:ignore_unknown]
174
+ elsif exception.is_a?(GetoptLong::MissingArgument) then
175
+ @console.fatal(:msg => "Option \"-#{given}\" requires an argument.", :dots => false)
177
176
  end
178
177
  else
179
178
  @console.fatal("Unexpected error: #{exc.message}.")
@@ -184,7 +183,7 @@ module Cowtech
184
183
  @args = ARGV
185
184
 
186
185
  # CHECK IF HELP WAS REQUESTED
187
- if self.provided?("help") and args[:ignore_help] == false then
186
+ if self.provided?("help") and !args[:ignore_help] then
188
187
  self.print_help
189
188
  exit(0)
190
189
  end
@@ -192,10 +191,11 @@ module Cowtech
192
191
  # NOW CHECK IF SOME REQUIRED OPTION WAS NOT SPECIFIED OR IF WE HAVE TO EXECUTE AN ACTION
193
192
  @inserted[:name].each do |key|
194
193
  option = @options[key]
194
+
195
195
  if option[:required] == true and option[:value] == nil then
196
- @console.fatal(:msg => "Required option \"#{opt.name}\" not specified.")
196
+ @console.fatal(:msg => "Required option \"#{opt.name}\" not specified.", :dots => false)
197
197
  elsif option[:value] == true and option[:type] == :action then
198
- opt.action.call
198
+ option.action.call
199
199
  end
200
200
  end
201
201
  end
@@ -205,6 +205,7 @@ module Cowtech
205
205
  # * <em>name</em>: Option name
206
206
  # Returns: <em>true</em> if options is defined, <em>false</em> otherwise.
207
207
  def exists?(name)
208
+ name = name.to_sym
208
209
  @options.keys.include?(name)
209
210
  end
210
211
 
@@ -213,7 +214,8 @@ module Cowtech
213
214
  # * <em>name</em>: Option name
214
215
  # Returns: <em>true</em> if options was provided, <em>false</em> otherwise.
215
216
  def provided?(name)
216
- @options[:name][:value] != nil
217
+ name = name.to_sym
218
+ (@options[name] || {})[:value] != nil
217
219
  end
218
220
 
219
221
  # Get a list of value for the requested options.
@@ -238,15 +240,15 @@ module Cowtech
238
240
  # * <em>options</em>: Options list
239
241
  # Returns: If a single argument is provided, only a value is returned, else an hash (name => value). If no argument is provided, return every option
240
242
  def [](*options)
241
- options = [options] unless options.kind_of?(Array)
242
- options = @options.keys if opts.length == 0
243
+ options = [options] unless options.is_a?(Array)
244
+ options = @options.keys if options.length == 0
243
245
 
244
246
  if options.length == 1 then
245
247
  self.get(options[0])
246
248
  else
247
249
  rv = {}
248
250
  options.each do |option|
249
- rv[option] = self.get(option) if self.exists?(option)
251
+ rv[option.to_s] = self.get(option) if self.exists?(option)
250
252
  end
251
253
  rv
252
254
  end
@@ -263,21 +265,21 @@ module Cowtech
263
265
  if @app_name then
264
266
  print "#{@app_name}"
265
267
  if @app_version > 0 then print " #{@app_version}" end
266
- if @info then print " - #{@info}" end
268
+ if @description then print " - #{@description}" end
267
269
  print "\n"
268
270
  end
269
271
 
270
272
  # Print usage
271
273
  if @messages["pre_usage"] then print "#{@messages["pre_usage"]}\n" end
272
- print "#{if @usage then @usage else "Usage: #{$0} [OPTIONS]" end}\n"
274
+ print "#{if @usage then @usage else "Usage: #{ARGV[0]} [OPTIONS]" end}\n"
273
275
 
274
276
  # Print pre_options
275
277
  if @messages["pre_options"] then print "#{@messages["pre_options"]}\n" end
276
278
  print "\nValid options are:\n"
277
279
 
278
280
  # Order options for printing
279
- @sorted_opts = @inserted[0].sort do |first, second|
280
- @options[first].priority != @options[second].priority ? @options[first].priority <=> @options[second].priority : @inserted[0].index(first) <=> @inserted[0].index(second) end
281
+ @sorted_opts = @inserted[:name].sort do |first, second|
282
+ @options[first][:priority] != @options[second][:priority] ? @options[first][:priority] <=> @options[second][:priority] : @inserted[:name].index(first) <=> @inserted[:name].index(second)
281
283
  end
282
284
 
283
285
  # Add options, saving max length
@@ -286,9 +288,8 @@ module Cowtech
286
288
  @sorted_opts.each do |key|
287
289
  opt = @options[key]
288
290
 
289
- popt = "#{[opt.short, opt.long].join(", ")}"
290
- popt += ("=" + (if opt.meta then opt.meta else "ARG" end)) unless opt.opt_type == :bool or opt.opt_type == :action
291
-
291
+ popt = "#{[opt[:short], opt[:long]].join(", ")}"
292
+ popt += ("=" + (if opt[:meta] then opt[:meta] else "ARG" end)) unless [:bool, :action].include?(opt[:type])
292
293
  popts[key] = popt
293
294
  maxlen = popt.length if popt.length > maxlen
294
295
  end
@@ -296,7 +297,7 @@ module Cowtech
296
297
  # Print options
297
298
  @sorted_opts.each do |key|
298
299
  val = popts[key]
299
- print "\t#{val}#{" " * (5 + (maxlen - val.length))}#{@options[key].help}\n"
300
+ print "\t#{val}#{" " * (5 + (maxlen - val.length))}#{@options[key][:help]}\n"
300
301
  end
301
302
 
302
303
  # Print post_options
@@ -314,22 +315,23 @@ module Cowtech
314
315
  # * <em>:pre_usage</em>: Message to print before the usage string
315
316
  # * <em>:pre_options</em>: Message to print before the options list
316
317
  # * <em>:post_options</em>: Message to print after the options list
317
- def initialize(*args)
318
- msgs = if msgs.length > 0 then msgs[0] else {} end
319
-
318
+ def initialize(args)
320
319
  # Initialize types
321
320
  @@valid_types = {:bool => [], :string => [String, ""], :int => [Integer, 0], :float => [Float, 0.0], :choice => [String, ""], :list => [Array, []], :action => []}
322
321
 
323
322
  # Copy arguments
324
323
  @app_name = args[:name]
325
- @app_name = args[:version]
326
- @info = args[:info]
324
+ @app_version = args[:version]
325
+ @description = args[:description]
327
326
  @usage = args[:usage]
328
- if msgs.kind_of?(Hash) then @messages = args[:messages] else @console.fatal(:msg => "CowtechLib::OptionParser::initialize msgs argument must be an hash.") end
327
+
328
+ # Copy messages
329
+ messages = args[:messages] || {}
330
+ if messages.is_a?(Hash) then @messages = messages else @console.fatal(:msg => "CowtechLib::OptionParser::initialize msgs argument must be an hash.") end
329
331
 
330
332
  # Initialize variables
331
- @console = CowtechLib::Console.new
332
- @inserted = {:name => [], :short => [], :long => []]
333
+ @console = Console.new
334
+ @inserted = {:name => [], :short => [], :long => []}
333
335
  @options = {}
334
336
  @options_map = {}
335
337
  @args = []
@@ -25,18 +25,11 @@
25
25
  # THE SOFTWARE.
26
26
  #
27
27
 
28
- require "pp"
29
- require "rexml/document"
30
- require "rubygems"
31
- require "open4"
32
- require "find"
33
- require "CowtechLib/Console"
34
- require "CowtechLib/OptionParser"
35
-
36
28
  module Cowtech
37
29
  module Lib
38
30
  # Class which implements a script to execute general tasks.
39
31
  # @author Shogun
32
+
40
33
  class Script
41
34
  # Console object
42
35
  attr_reader :console
@@ -58,25 +51,25 @@ module Cowtech
58
51
  # * <em>pre_usage</em>: Message to print before the usage string
59
52
  # * <em>pre_options</em>: Message to print before the options list
60
53
  # * <em>post_options</em>: Message to print after the options list
61
- def initialize(*args)
54
+ def initialize(args)
62
55
  @console = Console.new
63
- @shell = Console.new(@console)
64
- @options_parser = OptionParser.new(*args)
56
+ @shell = Shell.new(@console)
57
+ @options_parser = OptionParser.new(args)
65
58
 
66
59
  self.add_options()
67
60
  @options_parser << [
68
- {:name => "command-echo", :short => "-z", :long => "--command-echo", :type => :bool, :help => "Show executed commands."}
69
- {:name => "command-show", :short => "-V", :long => "--command-show", :type => :bool, :help => "Show executed commands' output."}
61
+ {:name => "command-echo", :short => "-z", :long => "--command-echo", :type => :bool, :help => "Show executed commands."},
62
+ {:name => "command-show", :short => "-V", :long => "--command-show", :type => :bool, :help => "Show executed commands' output."},
70
63
  {:name => "command-skip", :short => "-Z", :long => "--command-skip", :type => :bool, :help => "Don't really execut commands, only print them."}
71
64
  ]
72
65
 
73
- @options_parser.parse()
66
+ @options_parser.parse
74
67
 
75
68
  @console.show_commands = @options_parser["command-echo"]
76
69
  @console.show_outputs = @options_parser["command-show"]
77
70
  @console.skip_commands = @options_parser["command-skip"]
78
71
 
79
- self.run()
72
+ self.run
80
73
  end
81
74
 
82
75
  # Execute a task, showing a message.
@@ -87,36 +80,41 @@ module Cowtech
87
80
  # * <em>show_end</em>: If show message exit status
88
81
  # * <em>go_up</em>: If go up one line to show exit status
89
82
  # * <em>dots</em>: If show dots after message
90
- def task(*args)
91
- if args[:show_msg] then
92
- @console.msg(:msg => msg, :dots => args[:dots], :begin => true) if args[:show_msg]
93
- @console.indent(3)
83
+ def task(args)
84
+ if args.fetch(:show_msg, true) then
85
+ @console.write(:begin => args[:msg], :dots => args[:dots]) if args.fetch(:show_msg, true)
86
+ @console.indent_set(3)
94
87
  end
95
88
 
96
89
  # Run the block
97
- rv = yield || :ok
90
+ rv = yield
91
+ rv = :ok unless rv.is_a?(Symbol)
92
+ rv = [rv, true] unless rv.is_a?(Array)
98
93
 
99
94
  # Show the result
100
- @console.result(:result = rv.try("[]", 0) || rv, :fatal => rv.try("[]", 1) == nil ? true : rv.try("[]", 1)) if args[:show_result]
101
- @console.indent(-3)
95
+ if args.fetch(:show_result, true) then
96
+ @console.status(:status => rv[0], :fatal => false) if args.fetch(:show_result, true)
97
+ @console.indent_set(-3)
98
+ end
99
+
100
+ exit(1) if rv[0] != :ok && rv[1]
102
101
  end
103
102
 
104
103
  # Run the script.
105
104
  #<b> MUST BY OVERRIDEN BY SUBCLASSES!</b>
106
105
  def run
107
- self.console.fatal("Script::run() must be overidden by subclass")
106
+ self.console.fatal("Cowtech::Lib::Script#run must be overidden by subclasses.")
108
107
  end
109
108
 
110
109
  # Adds the command line options.
111
110
  # <b>MUST BE OVERRIDEN BY SUBCLASSES!</b>
112
111
  def add_options
113
- self.console.fatal("Cowtech::Lib::Script::add_options must be overidden by subclass.")
112
+ self.console.fatal("Cowtech::Lib::Script#add_options must be overidden by subclasses.")
114
113
  end
115
114
 
116
- # Executes the script
117
- def self.execute!
118
- self.new.run
115
+ def get_binding
116
+ binding
119
117
  end
120
118
  end
121
119
  end
122
- end
120
+ end
@@ -25,12 +25,11 @@
25
25
  # THE SOFTWARE.
26
26
  #
27
27
 
28
- require "rexml/document"
29
28
  require "open4"
30
29
  require "find"
31
30
  require "fileutils"
32
31
 
33
- module CowtechLib
32
+ module Cowtech
34
33
  module Lib
35
34
  # A class which provides some useful method for interaction with files and processes.
36
35
  # @author Shogun
@@ -45,11 +44,11 @@ module CowtechLib
45
44
  # * <em>fatal</em>: If abort on failure
46
45
  #
47
46
  # Returns: An object which the status attribute is the exit status of the process, and the output attribute is the output of the command
48
- def run(msg, cmd, show_msg = true, show_exit = true, fatal = false)
47
+ def run(args)
49
48
  rv = {:status => 0, :output => []}
50
49
  command = args[:command]
51
50
 
52
- @console.write(:begin => args[:msg]) if args[:msg]
51
+ @console.write(:begin => args[:msg]) if args[:show_msg]
53
52
 
54
53
  if @console.show_commands then
55
54
  @console.warn("Will run command: \"#{command}\"", :dots => false)
@@ -66,7 +65,8 @@ module CowtechLib
66
65
  end
67
66
  rv[:output] = rv[:output].join("\n")
68
67
 
69
- self.status(rv[:status] == 0 ? :ok : :fail) if args[:show_exit]
68
+ self.status(:status => rv[:status] == 0 ? :ok : :fail, :fatal => false) if args[:show_exit]
69
+ exit(1) if args[:fatal] and rv[:status] != 0
70
70
  rv
71
71
  end
72
72
 
@@ -78,9 +78,9 @@ module CowtechLib
78
78
  # * <em>codec</em>: The encoding used to open the file. <b>UNUSED FOR NOW!</b>
79
79
  #
80
80
  # Returns: A new <em>File</em> object
81
- def open_file(*args)
81
+ def open_file(args)
82
82
  begin
83
- File.new(args[:name], args[:mode] || "r" + (args[:codec] : ? ":#{args[:codce]}" : ""))
83
+ File.new(args[:name], (args[:mode] || "r") + (args[:codec] ? ":#{args[:codec]}" : ""))
84
84
  rescue Exception => e
85
85
  @console.write(:error => "Unable to open file #{name}: #{e}")
86
86
  nil
@@ -103,9 +103,9 @@ module CowtechLib
103
103
  # * <em>:fc_symlink</em>: Check if the file is symbolic link
104
104
  #
105
105
  # Returns: <em>true</em> if any of tests had success, <em>false</em> otherwise
106
- def file_check?(*args)
106
+ def file_check?(args)
107
107
  rv = false
108
- tests = args[:tests].to_a
108
+ tests = (args[:tests] || [:exists]).to_a
109
109
 
110
110
  if args[:file] then
111
111
  rv = true
@@ -125,7 +125,7 @@ module CowtechLib
125
125
  # * <em>show_error</em>: Whether show errors occurred
126
126
  #
127
127
  # Returns: <em>true</em> if operation had success, <em>false</em> otherwise.
128
- def delete_files!(*args)
128
+ def delete_files!(args)
129
129
  rv = true
130
130
  files = args[:files].to_a
131
131
 
@@ -135,7 +135,7 @@ module CowtechLib
135
135
  if args[:show_errors] == true then
136
136
  if e.message =~ /^Permission denied - (.+)/ then
137
137
  @console.error("Cannot remove following non writable entry: #{$1}", :dots => false, :fatal => args[:fatal])
138
- elsif e.message =~ /^No such file or directory - (.+)/) then
138
+ elsif e.message =~ /^No such file or directory - (.+)/ then
139
139
  @console.error("Cannot remove following non existent entry: #{$1}", :dots => false, :fatal => args[:fatal])
140
140
  end
141
141
  end
@@ -167,7 +167,7 @@ module CowtechLib
167
167
  # * <em>show_error</em>: Whether show errors occurred
168
168
  #
169
169
  # Returns: <em>true</em> if operation had success, <em>false</em> otherwise.
170
- def create_directories(*args)
170
+ def create_directories(args)
171
171
  rv = true
172
172
  files = args[:files].to_a
173
173
 
@@ -223,7 +223,7 @@ module CowtechLib
223
223
  # * <em>show_error</em>: Whether show errors occurred
224
224
  #
225
225
  # Returns: <em>true</em> if operation had success, <em>false</em> otherwise.
226
- def copy(*args)
226
+ def copy(args)
227
227
  rv = true
228
228
  move = args[:move]
229
229
 
@@ -248,7 +248,6 @@ module CowtechLib
248
248
  rv = false
249
249
  rescue Exception => e
250
250
  if args[:show_errors] then
251
- self.error(, false)
252
251
  @console.error("Cannot #{if move then "move" else "copy" end} following entries to <text style=\"bold white\">#{dest}</text>:", :dots => false)
253
252
  @console.indent_region(3) do
254
253
  files.each do |afile|
@@ -302,7 +301,7 @@ module CowtechLib
302
301
  # * <em>show_error</em>: Whether show errors occurred
303
302
  #
304
303
  # Returns: <em>true</em> if operation had success, <em>false</em> otherwise.
305
- def rename(*args)
304
+ def rename(args)
306
305
  rv = true
307
306
 
308
307
  if src.is_a?(String) and dst.is_a?(String) then
@@ -322,7 +321,7 @@ module CowtechLib
322
321
  # * <em>patterns</em>: List of requested patterns
323
322
  #
324
323
  # Returns: List of found files.
325
- def find_by_pattern(*args)
324
+ def find_by_pattern(args)
326
325
  # TODO: E se patterns è vuoto?
327
326
  rv = []
328
327
 
@@ -362,12 +361,18 @@ module CowtechLib
362
361
  # * <em>extensions</em>: List of requested extensions
363
362
  #
364
363
  # Returns: List of found files.
365
- def find_by_extension(*args)
364
+ def find_by_extension(args)
366
365
  args[:patterns] = (args[:extensions] || "").to_a.collect do |extension|
367
366
  Regexp.new(extension + "$", Regexp::IGNORECASE)
368
367
  end
369
368
 
370
- self.find_by_pattern(*args)
369
+ self.find_by_pattern(args)
370
+ end
371
+
372
+ # Creates a new shell
373
+ def initialize(console = nil)
374
+ console ||= Console.new
375
+ @console = console
371
376
  end
372
377
  end
373
378
  end
@@ -3,10 +3,10 @@ module Cowtech
3
3
  module Version
4
4
  MAJOR = 1
5
5
  MINOR = 9
6
- PATCH = 0
6
+ PATCH = 1
7
7
  BUILD = nil
8
8
 
9
9
  STRING = [MAJOR, MINOR, PATCH, BUILD].compact.join('.')
10
10
  end
11
11
  end
12
- end
12
+ end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 1
7
7
  - 9
8
- - 0
9
- version: 1.9.0
8
+ - 1
9
+ version: 1.9.1
10
10
  platform: ruby
11
11
  authors:
12
12
  - Shogun
@@ -16,35 +16,8 @@ cert_chain: []
16
16
 
17
17
  date: 2011-02-21 00:00:00 +01:00
18
18
  default_executable:
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
21
- name: jeweler
22
- requirement: &id001 !ruby/object:Gem::Requirement
23
- none: false
24
- requirements:
25
- - - ~>
26
- - !ruby/object:Gem::Version
27
- segments:
28
- - 1
29
- - 5
30
- - 1
31
- version: 1.5.1
32
- type: :development
33
- prerelease: false
34
- version_requirements: *id001
35
- - !ruby/object:Gem::Dependency
36
- name: rcov
37
- requirement: &id002 !ruby/object:Gem::Requirement
38
- none: false
39
- requirements:
40
- - - ">="
41
- - !ruby/object:Gem::Version
42
- segments:
43
- - 0
44
- version: "0"
45
- type: :development
46
- prerelease: false
47
- version_requirements: *id002
19
+ dependencies: []
20
+
48
21
  description: A general purpose utility library.
49
22
  email: shogun_panda@me.com
50
23
  executables: []
@@ -56,8 +29,6 @@ extra_rdoc_files:
56
29
  - README.rdoc
57
30
  files:
58
31
  - .document
59
- - Gemfile
60
- - Gemfile.lock
61
32
  - LICENSE.txt
62
33
  - README.rdoc
63
34
  - Rakefile
data/Gemfile DELETED
@@ -1,6 +0,0 @@
1
- source "http://rubygems.org"
2
-
3
- group :development do
4
- gem "jeweler", "~> 1.5.1"
5
- gem "rcov", ">= 0"
6
- end
data/Gemfile.lock DELETED
@@ -1,17 +0,0 @@
1
- GEM
2
- remote: http://rubygems.org/
3
- specs:
4
- git (1.2.5)
5
- jeweler (1.5.1)
6
- bundler (~> 1.0.0)
7
- git (>= 1.2.5)
8
- rake
9
- rake (0.8.7)
10
- rcov (0.9.9)
11
-
12
- PLATFORMS
13
- ruby
14
-
15
- DEPENDENCIES
16
- jeweler (~> 1.5.1)
17
- rcov