scout-gear 1.1.0

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/scout/log.rb ADDED
@@ -0,0 +1,362 @@
1
+ require_relative 'log/color'
2
+ require_relative 'log/fingerprint'
3
+ require_relative 'log/progress'
4
+
5
+ require 'io/console'
6
+
7
+ module Log
8
+ SEVERITY_NAMES ||= begin
9
+ names = %w(DEBUG LOW MEDIUM HIGH INFO WARN ERROR NONE )
10
+ names.each_with_index do |name,i|
11
+ eval "#{ name } = #{ i }"
12
+ end
13
+ names
14
+ end
15
+
16
+ class << self
17
+ attr_accessor :logfile, :severity
18
+ attr_writer :tty_size
19
+ end
20
+
21
+
22
+ def self.tty_size
23
+ @tty_size = begin
24
+ IO.console.winsize.last
25
+ rescue
26
+ begin
27
+ `tput li`
28
+ rescue
29
+ 80
30
+ end
31
+ end
32
+ end
33
+
34
+
35
+ def self.last_caller(stack)
36
+ line = nil
37
+ pos ||= 0
38
+ while line.nil? or line =~ /scout\/helper\/log\.rb/ and stack.any?
39
+ line = stack.shift
40
+ end
41
+ line ||= caller.first
42
+ line.gsub('`', "'")
43
+ end
44
+
45
+ def self.get_level(level)
46
+ case level
47
+ when Numeric
48
+ level.to_i
49
+ when String
50
+ begin
51
+ Log.const_get(level.upcase)
52
+ rescue
53
+ Log.exception $!
54
+ end
55
+ when Symbol
56
+ get_level(level.to_s)
57
+ end || 0
58
+ end
59
+
60
+ def self.with_severity(level)
61
+ orig = Log.severity
62
+ begin
63
+ Log.severity = level
64
+ yield
65
+ ensure
66
+ Log.severity = orig
67
+ end
68
+ end
69
+
70
+ def self.logfile(file=nil)
71
+ if file.nil?
72
+ @logfile ||= nil
73
+ else
74
+ case file
75
+ when String
76
+ @logfile = File.open(file, :mode => 'a')
77
+ @logfile.sync = true
78
+ when IO, File
79
+ @logfile = file
80
+ else
81
+ raise "Unkown logfile format: #{file.inspect}"
82
+ end
83
+ end
84
+ end
85
+
86
+ def self.up_lines(num = 1)
87
+ nocolor ? "" : "\033[#{num+1}F\033[2K"
88
+ end
89
+
90
+ def self.down_lines(num = 1)
91
+ nocolor ? "" : "\033[#{num+1}E"
92
+ end
93
+
94
+ def self.return_line
95
+ nocolor ? "" : "\033[1A"
96
+ end
97
+
98
+ def self.clear_line(out = STDOUT)
99
+ out.puts Log.return_line << " " * (Log.tty_size || 80) << Log.return_line unless nocolor
100
+ end
101
+
102
+ LAST = "log"
103
+ def self.logn(message = nil, severity = MEDIUM, &block)
104
+ return if severity < self.severity
105
+ message ||= block.call if block_given?
106
+ return if message.nil?
107
+
108
+ time = Time.now.strftime("%m/%d/%y-%H:%M:%S.%L")
109
+
110
+ sev_str = severity.to_s
111
+
112
+ prefix = time << color(severity) << "[" << sev_str << "]" << color(0)
113
+ message = "" << highlight << message << color(0) if severity >= INFO
114
+ str = prefix << " " << message.to_s
115
+
116
+ if logfile.nil?
117
+ STDERR.write str
118
+ else
119
+ logfile.write str
120
+ end
121
+ Log::LAST.replace "log"
122
+ nil
123
+ end
124
+
125
+ def self.log(message = nil, severity = MEDIUM, &block)
126
+ return if severity < self.severity
127
+ message ||= block.call if block_given?
128
+ return if message.nil?
129
+ message = message + "\n" unless message[-1] == "\n"
130
+ self.logn message, severity, &block
131
+ end
132
+
133
+ def self.log_obj_inspect(obj, level, file = $stdout)
134
+ stack = caller
135
+
136
+ line = Log.last_caller stack
137
+
138
+ level = Log.get_level level
139
+ name = Log::SEVERITY_NAMES[level] + ": "
140
+ Log.log Log.color(level, name, true) << line, level
141
+ Log.log "", level
142
+ Log.log Log.color(level, "=> ", true) << obj.inspect, level
143
+ Log.log "", level
144
+ end
145
+
146
+ def self.log_obj_fingerprint(obj, level, file = $stdout)
147
+ stack = caller
148
+
149
+ line = Log.last_caller stack
150
+
151
+ level = Log.get_level level
152
+ name = Log::SEVERITY_NAMES[level] + ": "
153
+ Log.log Log.color(level, name, true) << line, level
154
+ Log.log "", level
155
+ Log.log Log.color(level, "=> ", true) << Log.fingerprint(obj), level
156
+ Log.log "", level
157
+ end
158
+
159
+ def self.debug(message = nil, &block)
160
+ log(message, DEBUG, &block)
161
+ end
162
+
163
+ def self.low(message = nil, &block)
164
+ log(message, LOW, &block)
165
+ end
166
+
167
+ def self.medium(message = nil, &block)
168
+ log(message, MEDIUM, &block)
169
+ end
170
+
171
+ def self.high(message = nil, &block)
172
+ log(message, HIGH, &block)
173
+ end
174
+
175
+ def self.info(message = nil, &block)
176
+ log(message, INFO, &block)
177
+ end
178
+
179
+ def self.warn(message = nil, &block)
180
+ log(message, WARN, &block)
181
+ end
182
+
183
+ def self.error(message = nil, &block)
184
+ log(message, ERROR, &block)
185
+ end
186
+
187
+ def self.exception(e)
188
+ stack = caller
189
+ if ENV["RBBT_ORIGINAL_STACK"] == 'true'
190
+ error([e.class.to_s, e.message].compact * ": " )
191
+ error("BACKTRACE [#{Process.pid}]: " << Log.last_caller(stack) << "\n" + color_stack(e.backtrace)*"\n")
192
+ else
193
+ error("BACKTRACE [#{Process.pid}]: " << Log.last_caller(stack) << "\n" + color_stack(e.backtrace.reverse)*"\n")
194
+ error([e.class.to_s, e.message].compact * ": " )
195
+ end
196
+ end
197
+
198
+ def self.deprecated(m)
199
+ stack = caller
200
+ warn("DEPRECATED: " << Log.last_caller(stack))
201
+ warn("* " << (m || "").to_s)
202
+ end
203
+
204
+ def self.color_stack(stack)
205
+ stack.collect do |line|
206
+ line = line.sub('`',"'")
207
+ color = :green if line =~ /workflow/
208
+ color = :blue if line =~ /scout-/
209
+ Log.color color, line
210
+ end unless stack.nil?
211
+ end
212
+
213
+ def self.tsv(tsv, example = false)
214
+ STDERR.puts Log.color :magenta, "TSV log: " << Log.last_caller(caller).gsub('`',"'")
215
+ STDERR.puts Log.color(:blue, "=> "<< Log.fingerprint(tsv), true)
216
+ STDERR.puts Log.color(:cyan, "=> " << tsv.summary)
217
+ if example && ! tsv.empty?
218
+ key = case example
219
+ when TrueClass, :first, "first"
220
+ tsv.keys.first
221
+ when :random, "random"
222
+ tsv.keys.shuffle.first
223
+ else
224
+ example
225
+ end
226
+
227
+ values = tsv[key]
228
+ values = [values] if tsv.type == :flat || tsv.type == :single
229
+ if values.nil?
230
+ STDERR.puts Log.color(:blue, "Key (#{tsv.key_field}) not present: ") + key
231
+ else
232
+ STDERR.puts Log.color(:blue, "Key (#{tsv.key_field}): ") + key
233
+ tsv.fields.zip(values).each do |field,value|
234
+ STDERR.puts Log.color(:magenta, field + ": ") + (Array === value ? value * ", " : value.to_s)
235
+ end
236
+ end
237
+ end
238
+ end
239
+
240
+ def self.stack(stack)
241
+ if ENV["RBBT_ORIGINAL_STACK"] == 'true'
242
+ STDERR.puts Log.color :magenta, "Stack trace [#{Process.pid}]: " << Log.last_caller(caller)
243
+ color_stack(stack).each do |line|
244
+ STDERR.puts line
245
+ end
246
+ else
247
+ STDERR.puts Log.color :magenta, "Stack trace [#{Process.pid}]: " << Log.last_caller(caller)
248
+ color_stack(stack.reverse).each do |line|
249
+ STDERR.puts line
250
+ end
251
+ end
252
+ end
253
+
254
+ def self.count_stack
255
+ if ! $count_stacks
256
+ Log.debug "Counting stacks at: " << caller.first
257
+ return
258
+ end
259
+ $stack_counts ||= {}
260
+ head = $count_stacks_head
261
+ stack = caller[1..head+1]
262
+ stack.reverse.each do |line,i|
263
+ $stack_counts[line] ||= 0
264
+ $stack_counts[line] += 1
265
+ end
266
+ end
267
+
268
+ def self.with_stack_counts(head = 10, total = 100)
269
+ $count_stacks_head = head
270
+ $count_stacks = true
271
+ $stack_counts = {}
272
+ res = yield
273
+ $count_stacks = false
274
+ Log.debug "STACK_COUNTS:\n" + $stack_counts.sort_by{|line,c| c}.reverse.collect{|line,c| [c, line] * " - "}[0..total] * "\n"
275
+ $stack_counts = {}
276
+ res
277
+ end
278
+
279
+ case ENV['RBBT_LOG']
280
+ when 'DEBUG'
281
+ self.severity = DEBUG
282
+ when 'LOW'
283
+ self.severity = LOW
284
+ when 'MEDIUM'
285
+ self.severity = MEDIUM
286
+ when 'HIGH'
287
+ self.severity = HIGH
288
+ when nil
289
+ self.severity = INFO
290
+ else
291
+ self.severity = ENV['RBBT_LOG'].to_i
292
+ end
293
+ end
294
+
295
+ def ppp(message)
296
+ stack = caller
297
+ puts "#{Log.color :cyan, "PRINT:"} " << stack.first
298
+ puts ""
299
+ if message.length > 200 or message.include? "\n"
300
+ puts Log.color(:cyan, "=>|") << "\n" << message.to_s
301
+ else
302
+ puts Log.color(:cyan, "=> ") << message.to_s
303
+ end
304
+ puts ""
305
+ end
306
+
307
+ def fff(object)
308
+ stack = caller
309
+ Log.debug{"#{Log.color :cyan, "FINGERPRINT:"} " << stack.first}
310
+ Log.debug{""}
311
+ Log.debug{require 'scout/util/misc'; "=> " << Log.fingerprint(object) }
312
+ Log.debug{""}
313
+ end
314
+
315
+ def ddd(obj, file = $stdout)
316
+ Log.log_obj_inspect(obj, :debug, file)
317
+ end
318
+
319
+ def lll(obj, file = $stdout)
320
+ Log.log_obj_inspect(obj, :low, file)
321
+ end
322
+
323
+ def mmm(obj, file = $stdout)
324
+ Log.log_obj_inspect(obj, :medium, file)
325
+ end
326
+
327
+ def iii(obj=nil, file = $stdout)
328
+ Log.log_obj_inspect(obj, :info, file)
329
+ end
330
+
331
+ def wwww(obj=nil, file = $stdout)
332
+ Log.log_obj_inspect(obj, :warn, file)
333
+ end
334
+
335
+ def eee(obj=nil, file = $stdout)
336
+ Log.log_obj_inspect(obj, :error, file)
337
+ end
338
+
339
+ def ddf(obj=nil, file = $stdout)
340
+ Log.log_obj_fingerprint(obj, :debug, file)
341
+ end
342
+
343
+ def llf(obj=nil, file = $stdout)
344
+ Log.log_obj_fingerprint(obj, :low, file)
345
+ end
346
+
347
+ def mmf(obj=nil, file = $stdout)
348
+ Log.log_obj_fingerprint(obj, :medium, file)
349
+ end
350
+
351
+ def iif(obj=nil, file = $stdout)
352
+ Log.log_obj_fingerprint(obj, :info, file)
353
+ end
354
+
355
+ def wwwf(obj=nil, file = $stdout)
356
+ Log.log_obj_fingerprint(obj, :warn, file)
357
+ end
358
+
359
+ def eef(obj=nil, file = $stdout)
360
+ Log.log_obj_fingerprint(obj, :error, file)
361
+ end
362
+
@@ -0,0 +1,29 @@
1
+ module MetaExtension
2
+ def self.extended(base)
3
+ meta = class << base; self; end
4
+
5
+ base.class_variable_set("@@extension_attrs", [])
6
+
7
+ meta.define_method(:extension_attr) do |*attrs|
8
+ self.class_variable_get("@@extension_attrs").concat attrs
9
+ attrs.each do |a|
10
+ self.attr_accessor a
11
+ end
12
+ end
13
+
14
+ meta.define_method(:setup) do |obj,*rest|
15
+ obj.extend base
16
+ self.class_variable_get("@@extension_attrs").zip(rest).each do |name,value|
17
+ obj.instance_variable_set("@#{name}", value)
18
+ end
19
+ obj
20
+ end
21
+
22
+ base.define_method(:annotate) do |other|
23
+ attr_values = meta.class_variable_get("@@extension_attrs").collect do |a|
24
+ self.instance_variable_get("@#{a}")
25
+ end
26
+ base.setup(other, *attr_values)
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,65 @@
1
+ module Path
2
+ def _parts
3
+ @_parts ||= self.split("/")
4
+ end
5
+
6
+ def _subpath
7
+ @subpath ||= _parts.length > 1 ? _parts[1..-1] * "/" : _parts[0]
8
+ end
9
+
10
+ def _toplevel
11
+ @toplevel ||= _parts.length > 1 ? _parts[0] : nil
12
+ end
13
+
14
+ def self.follow(path, map)
15
+ map.sub('{PKGDIR}', path.pkgdir).
16
+ sub('{RESOURCE}', path.to_s).
17
+ sub('{PWD}', FileUtils.pwd).
18
+ sub('{TOPLEVEL}', path._toplevel).
19
+ sub('{SUBPATH}', path._subpath).
20
+ sub('{BASENAME}', File.basename(path)).
21
+ sub('{PATH}', path).
22
+ sub('{LIBDIR}', path.libdir).
23
+ sub('{REMOVE}/', '').
24
+ sub('{REMOVE}', '').gsub(/\/+/,'/')
25
+ end
26
+
27
+ PATH_MAPS = IndiferentHash.setup({
28
+ :current => File.join("{PWD}", "{TOPLEVEL}", "{SUBPATH}"),
29
+ :user => File.join(ENV['HOME'], ".{PKGDIR}", "{TOPLEVEL}", "{SUBPATH}"),
30
+ :global => File.join('/', "{TOPLEVEL}", "{PKGDIR}", "{SUBPATH}"),
31
+ :usr => File.join('/usr/', "{TOPLEVEL}", "{PKGDIR}", "{SUBPATH}"),
32
+ :local => File.join('/usr/local', "{TOPLEVEL}", "{PKGDIR}", "{SUBPATH}"),
33
+ :fast => File.join('/fast', "{TOPLEVEL}", "{PKGDIR}", "{SUBPATH}"),
34
+ :cache => File.join('/cache', "{TOPLEVEL}", "{PKGDIR}", "{SUBPATH}"),
35
+ :bulk => File.join('/bulk', "{TOPLEVEL}", "{PKGDIR}", "{SUBPATH}"),
36
+ :lib => File.join('{LIBDIR}', "{TOPLEVEL}", "{SUBPATH}"),
37
+ :base => File.join(Path.caller_lib_dir(__FILE__), "{TOPLEVEL}", "{SUBPATH}"),
38
+ :default => :user
39
+ })
40
+
41
+ MAP_SEARCH = %w(current workflow user local global lib fast cache bulk)
42
+
43
+ def _follow(map_name)
44
+ map = PATH_MAPS[map_name]
45
+ while Symbol === map
46
+ map = PATH_MAPS[map]
47
+ end
48
+ Path.follow(self, map)
49
+ end
50
+
51
+ def find(where = nil)
52
+ return _follow(where) if where
53
+
54
+ all_maps = PATH_MAPS.keys
55
+ search_order = MAP_SEARCH & all_maps + (all_maps - MAP_SEARCH)
56
+
57
+ search_order.each do |name|
58
+ map = PATH_MAPS[name]
59
+ real_path = _follow(map)
60
+ return real_path if File.exists?(real_path)
61
+ end
62
+
63
+ return _follow(:default)
64
+ end
65
+ end
data/lib/scout/path.rb ADDED
@@ -0,0 +1,62 @@
1
+ require_relative 'meta_extension'
2
+
3
+ module Path
4
+ extend MetaExtension
5
+ extension_attr :pkgdir, :libdir
6
+
7
+ def self.caller_lib_dir(file = nil, relative_to = ['lib', 'bin'])
8
+
9
+ if file.nil?
10
+ caller_dup = caller.dup
11
+ while file = caller_dup.shift
12
+ break unless file =~ /scout\/(?:resource\.rb|workflow\.rb)/ or
13
+ file =~ /scout\/path\.rb/ or
14
+ file =~ /scout\/persist.rb/
15
+ end
16
+ file = file.sub(/\.rb[^\w].*/,'.rb')
17
+ end
18
+
19
+ relative_to = [relative_to] unless Array === relative_to
20
+ file = File.expand_path(file)
21
+ return Path.setup(file) if relative_to.select{|d| File.exist? File.join(file, d)}.any?
22
+
23
+ while file != '/'
24
+ dir = File.dirname file
25
+
26
+ return dir if relative_to.select{|d| File.exist? File.join(dir, d)}.any?
27
+
28
+ file = File.dirname file
29
+ end
30
+
31
+ return nil
32
+ end
33
+
34
+ def self.setup(path, pkgdir = 'scout', libdir = nil)
35
+ path.extend Path
36
+ path.pkgdir = pkgdir
37
+ path.libdir = libdir || Path.caller_lib_dir
38
+ path
39
+ end
40
+
41
+ def join(subpath, prevpath = nil)
42
+ subpath = subpath.to_s if Symbol === subpath
43
+ prevpath = prevpath.to_s if Symbol === prevpath
44
+
45
+ subpath = File.join(prevpath.to_s, subpath) if prevpath
46
+ new = File.join(self, subpath)
47
+ self.annotate(new)
48
+ new
49
+ end
50
+
51
+ alias [] join
52
+ alias / join
53
+
54
+ def method_missing(name, prev = nil, *args, &block)
55
+ if block_given? || name.to_s.start_with?('to_')
56
+ super name, prev, *args, &block
57
+ else
58
+ join(name, prev)
59
+ end
60
+ end
61
+
62
+ end
@@ -0,0 +1,96 @@
1
+ require 'fileutils'
2
+
3
+ module TmpFile
4
+ def self.user_tmp(subdir = nil)
5
+ if subdir
6
+ File.join(ENV["HOME"],"/tmp/scout", subdir)
7
+ else
8
+ File.join(ENV["HOME"],"/tmp/scout")
9
+ end
10
+ end
11
+
12
+ def self.tmpdir=(tmpdir)
13
+ @tmpdir = tmpdir
14
+ end
15
+
16
+ def self.tmpdir
17
+ @tmpdir ||= self.user_tmp('tmpfiles')
18
+ end
19
+
20
+ # Creates a random file name, with the given suffix and a random number
21
+ # up to +max+
22
+ def self.random_name(prefix = 'tmp-', max = 1_000_000_000)
23
+ n = rand(max)
24
+ prefix + n.to_s
25
+ end
26
+
27
+ # Creates a random filename in the temporary directory
28
+ def self.tmp_file(prefix = 'tmp-', max = 1_000_000_000, dir = nil)
29
+ dir ||= TmpFile.tmpdir
30
+ File.expand_path(File.join(dir, random_name(prefix, max)))
31
+ end
32
+
33
+ def self.with_file(content = nil, erase = true, options = {})
34
+ if content.is_a?(Hash)
35
+ options = content
36
+ content = nil
37
+ erase = true
38
+ end
39
+ if erase.is_a?(Hash)
40
+ options = erase
41
+ erase = true
42
+ end
43
+
44
+ prefix = options[:prefix] || 'tmp-'
45
+ tmpdir = options[:tmpdir] || TmpFile.tmpdir
46
+ max = options[:max] || 1_000_000_000
47
+ tmpfile = tmp_file prefix, max, tmpdir
48
+ tmpfile += ".#{options[:extension]}" if options[:extension]
49
+
50
+ FileUtils.mkdir_p tmpdir
51
+ if IO === content
52
+ File.open(tmpfile, 'wb') do |f|
53
+ begin
54
+ while c = content.readpartial(1024)
55
+ f << c
56
+ end
57
+ rescue EOFError
58
+ end
59
+ end
60
+ elsif !content.nil?
61
+ File.open(tmpfile, 'w') { |f| f.write content }
62
+ end
63
+
64
+ result = yield(tmpfile)
65
+
66
+ FileUtils.rm_rf tmpfile if File.exist?(tmpfile) && erase
67
+
68
+ result
69
+ end
70
+
71
+ def self.with_dir(erase = true, options = {})
72
+ prefix = options[:prefix] || 'tmpdir-'
73
+ tmpdir = tmp_file prefix
74
+
75
+ FileUtils.mkdir_p tmpdir
76
+
77
+ result = yield(tmpdir)
78
+
79
+ FileUtils.rm_rf tmpdir if File.exist?(tmpdir) && erase
80
+
81
+ result
82
+ end
83
+
84
+ def self.in_dir(*args)
85
+ with_dir(*args) do |dir|
86
+ old_pwd = FileUtils.pwd
87
+ begin
88
+ FileUtils.mkdir_p dir unless File.exist?(dir)
89
+ FileUtils.cd dir
90
+ yield dir
91
+ ensure
92
+ FileUtils.cd old_pwd
93
+ end
94
+ end
95
+ end
96
+ end
data/lib/scout-gear.rb ADDED
@@ -0,0 +1,3 @@
1
+ require_relative 'scout/indiferent_hash'
2
+ require_relative 'scout/tmpfile'
3
+ require_relative 'scout/log'
@@ -0,0 +1,78 @@
1
+ # Generated by juwelier
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+ # stub: scout-gear 1.1.0 ruby lib
6
+
7
+ Gem::Specification.new do |s|
8
+ s.name = "scout-gear".freeze
9
+ s.version = "1.1.0"
10
+
11
+ s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
12
+ s.require_paths = ["lib".freeze]
13
+ s.authors = ["Miguel Vazquez".freeze]
14
+ s.date = "2023-03-24"
15
+ s.description = "Temporary files, logs, etc.".freeze
16
+ s.email = "mikisvaz@gmail.com".freeze
17
+ s.executables = ["scout".freeze]
18
+ s.extra_rdoc_files = [
19
+ "LICENSE.txt",
20
+ "README.rdoc"
21
+ ]
22
+ s.files = [
23
+ ".document",
24
+ ".vimproject",
25
+ "LICENSE.txt",
26
+ "README.rdoc",
27
+ "Rakefile",
28
+ "VERSION",
29
+ "bin/scout",
30
+ "lib/scout-gear.rb",
31
+ "lib/scout/exceptions.rb",
32
+ "lib/scout/indiferent_hash.rb",
33
+ "lib/scout/indiferent_hash/case_insensitive.rb",
34
+ "lib/scout/indiferent_hash/options.rb",
35
+ "lib/scout/log.rb",
36
+ "lib/scout/log/color.rb",
37
+ "lib/scout/log/color_class.rb",
38
+ "lib/scout/log/fingerprint.rb",
39
+ "lib/scout/log/progress.rb",
40
+ "lib/scout/log/progress/report.rb",
41
+ "lib/scout/log/progress/util.rb",
42
+ "lib/scout/meta_extension.rb",
43
+ "lib/scout/path.rb",
44
+ "lib/scout/path/find.rb",
45
+ "lib/scout/tmpfile.rb",
46
+ "scout-gear.gemspec",
47
+ "test/scout/indiferent_hash/test_options.rb",
48
+ "test/scout/log/test_progress.rb",
49
+ "test/scout/path/test_find.rb",
50
+ "test/scout/test_indiferent_hash.rb",
51
+ "test/scout/test_log.rb",
52
+ "test/scout/test_meta_extension.rb",
53
+ "test/scout/test_path.rb",
54
+ "test/scout/test_tmpfile.rb",
55
+ "test/test_helper.rb"
56
+ ]
57
+ s.homepage = "http://github.com/mikisvaz/scout-gear".freeze
58
+ s.licenses = ["MIT".freeze]
59
+ s.rubygems_version = "3.2.15".freeze
60
+ s.summary = "basic gear for scouts".freeze
61
+
62
+ if s.respond_to? :specification_version then
63
+ s.specification_version = 4
64
+ end
65
+
66
+ if s.respond_to? :add_runtime_dependency then
67
+ s.add_development_dependency(%q<rdoc>.freeze, ["~> 3.12"])
68
+ s.add_development_dependency(%q<bundler>.freeze, ["~> 1.0"])
69
+ s.add_development_dependency(%q<juwelier>.freeze, ["~> 2.1.0"])
70
+ s.add_development_dependency(%q<simplecov>.freeze, [">= 0"])
71
+ else
72
+ s.add_dependency(%q<rdoc>.freeze, ["~> 3.12"])
73
+ s.add_dependency(%q<bundler>.freeze, ["~> 1.0"])
74
+ s.add_dependency(%q<juwelier>.freeze, ["~> 2.1.0"])
75
+ s.add_dependency(%q<simplecov>.freeze, [">= 0"])
76
+ end
77
+ end
78
+