scout-essentials 1.6.2 → 1.6.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.vimproject +5 -0
- data/VERSION +1 -1
- data/lib/scout/annotation/annotation_module.rb +5 -1
- data/lib/scout/annotation/array.rb +19 -1
- data/lib/scout/cmd.rb +4 -1
- data/lib/scout/concurrent_stream.rb +5 -1
- data/lib/scout/indiferent_hash.rb +7 -0
- data/lib/scout/log.rb +11 -6
- data/lib/scout/misc/digest.rb +0 -9
- data/lib/scout/misc/format.rb +4 -6
- data/lib/scout/misc/helper.rb +12 -3
- data/lib/scout/named_array.rb +6 -2
- data/lib/scout/open/stream.rb +8 -3
- data/lib/scout/open/util.rb +6 -1
- data/lib/scout/open.rb +4 -4
- data/lib/scout/persist/serialize.rb +2 -0
- data/lib/scout/resource/produce.rb +1 -0
- data/lib/scout/tmpfile.rb +1 -0
- data/scout-essentials.gemspec +4 -4
- data/test/scout/misc/test_helper.rb +5 -0
- data/test/scout/open/test_stream.rb +28 -0
- data/test/scout/open/test_util.rb +16 -1
- data/test/scout/test_named_array.rb +6 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 733fb62cfc8f1119cc35567f30bec3f569856a2c10e7fa4ab8dcb54fb39cf737
|
4
|
+
data.tar.gz: abc7a2a0ffa9c524da167c1f2132efb557a6ebd7debe267e014bba1269a31661
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cdd5c50d28fa8ffac0c5f1660ab5ff8b0e63c3df7d27966cb98c78928161c78270b3bab72732c5eeb5c37a1824fc101fdb2b569567b3af977404f540fb5912de
|
7
|
+
data.tar.gz: c4f4e5f5f7b276d20ea65ef22d8447c0499606a3b9c590768517808f6f226c137361b38f1dc56c5e90f2a7652d8519f9cfc591438f939ed2345de2c999f05139
|
data/.vimproject
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.6.
|
1
|
+
1.6.4
|
@@ -34,7 +34,11 @@ module Annotation
|
|
34
34
|
end
|
35
35
|
obj = block if obj.nil?
|
36
36
|
return nil if obj.nil?
|
37
|
-
|
37
|
+
begin
|
38
|
+
obj.extend self unless self === obj
|
39
|
+
rescue TypeError
|
40
|
+
return obj
|
41
|
+
end
|
38
42
|
attrs = self.instance_variable_get("@annotations")
|
39
43
|
|
40
44
|
return obj if attrs.nil? || attrs.empty?
|
@@ -9,6 +9,7 @@ module AnnotatedArray
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def annotate_item(obj, position = nil)
|
12
|
+
return obj if obj.nil?
|
12
13
|
obj = obj.dup if obj.frozen?
|
13
14
|
obj.extend AnnotatedArray if Array === obj
|
14
15
|
obj.extend AnnotatedArrayItem
|
@@ -33,8 +34,17 @@ module AnnotatedArray
|
|
33
34
|
|
34
35
|
def each_with_index(&block)
|
35
36
|
super do |item,i|
|
36
|
-
block.call annotate_item(item, i)
|
37
|
+
block.call annotate_item(item, i), i
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def select(&block)
|
42
|
+
selected = []
|
43
|
+
each do |item|
|
44
|
+
selected << item if block.call(item)
|
37
45
|
end
|
46
|
+
|
47
|
+
self.annotate(selected)
|
38
48
|
end
|
39
49
|
|
40
50
|
def each(&block)
|
@@ -60,6 +70,14 @@ module AnnotatedArray
|
|
60
70
|
end
|
61
71
|
end
|
62
72
|
|
73
|
+
def subset(list)
|
74
|
+
self.annotate(self & list)
|
75
|
+
end
|
76
|
+
|
77
|
+
def remove(list)
|
78
|
+
self.annotate(self - list)
|
79
|
+
end
|
80
|
+
|
63
81
|
%w(compact uniq flatten reverse sort_by).each do |method|
|
64
82
|
|
65
83
|
self.define_method(method) do |*args,&block|
|
data/lib/scout/cmd.rb
CHANGED
@@ -51,7 +51,7 @@ module ConcurrentStream
|
|
51
51
|
end
|
52
52
|
end
|
53
53
|
|
54
|
-
stream.filename = filename
|
54
|
+
stream.filename = filename if filename
|
55
55
|
|
56
56
|
stream.lock = lock unless lock.nil?
|
57
57
|
|
@@ -60,6 +60,10 @@ module ConcurrentStream
|
|
60
60
|
stream
|
61
61
|
end
|
62
62
|
|
63
|
+
def filename
|
64
|
+
@filename || self.inspect.split(":").last[0..-2]
|
65
|
+
end
|
66
|
+
|
63
67
|
def annotate(stream)
|
64
68
|
ConcurrentStream.setup(stream, :threads => threads, :pids => pids, :callback => callback, :abort_callback => abort_callback, :filename => filename, :autojoin => autojoin, :lock => lock)
|
65
69
|
stream
|
data/lib/scout/log.rb
CHANGED
@@ -146,7 +146,7 @@ module Log
|
|
146
146
|
else
|
147
147
|
begin
|
148
148
|
STDERR.write str
|
149
|
-
rescue
|
149
|
+
rescue IOError
|
150
150
|
end
|
151
151
|
end
|
152
152
|
end
|
@@ -252,14 +252,18 @@ module Log
|
|
252
252
|
end
|
253
253
|
|
254
254
|
def self.exception(e)
|
255
|
-
|
255
|
+
return if e.message.include?("NOLOG")
|
256
|
+
last_caller = last_caller caller
|
257
|
+
message = e.message
|
258
|
+
message = Log.fingerprint(message) if String === message && message.length > 1000
|
256
259
|
backtrace = e.backtrace || []
|
260
|
+
backtrace = [] if message.include?("NOSTACK")
|
257
261
|
if ENV["SCOUT_ORIGINAL_STACK"] == 'true'
|
258
|
-
error([e.class.to_s,
|
259
|
-
error("BACKTRACE [#{Process.pid}]: " <<
|
262
|
+
error([e.class.to_s, message].compact * ": " )
|
263
|
+
error("BACKTRACE [#{Process.pid}]: " << last_caller << "\n" + color_stack(backtrace)*"\n")
|
260
264
|
else
|
261
|
-
error("BACKTRACE [#{Process.pid}]: " <<
|
262
|
-
error([e.class.to_s,
|
265
|
+
error("BACKTRACE [#{Process.pid}]: " << last_caller << "\n" + color_stack(backtrace.reverse)*"\n")
|
266
|
+
error([e.class.to_s, message].compact * ": " )
|
263
267
|
end
|
264
268
|
end
|
265
269
|
|
@@ -355,6 +359,7 @@ def ppp(message)
|
|
355
359
|
stack = caller
|
356
360
|
puts "#{Log.color :cyan, "PRINT:"} " << stack.first
|
357
361
|
puts ""
|
362
|
+
message = message.prety_print if message.respond_to?(:prety_print)
|
358
363
|
if message.length > 200 or message.include? "\n"
|
359
364
|
puts Log.color(:cyan, "=>|") << "\n" << message.to_s
|
360
365
|
else
|
data/lib/scout/misc/digest.rb
CHANGED
@@ -6,15 +6,6 @@ module Misc
|
|
6
6
|
obj.digest_str
|
7
7
|
else
|
8
8
|
case obj
|
9
|
-
when Path
|
10
|
-
case
|
11
|
-
when File.directory?(obj)
|
12
|
-
"Directory MD5: #{digest_str(Dir.glob(File.join(obj, "*")))}"
|
13
|
-
when obj.located? && File.exist?(obj)
|
14
|
-
"File MD5: #{Misc.digest_file(obj)}"
|
15
|
-
else
|
16
|
-
'\'' << obj << '\''
|
17
|
-
end
|
18
9
|
when String
|
19
10
|
if Path.is_filename?(obj) && Open.exists?(obj)
|
20
11
|
if File.directory?(obj)
|
data/lib/scout/misc/format.rb
CHANGED
@@ -36,9 +36,7 @@ module Misc
|
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
|
-
|
40
|
-
|
41
|
-
MAX_TTY_LINE_WIDTH = 100
|
39
|
+
MAX_TTY_LINE_WIDTH = 160
|
42
40
|
def self.format_paragraph(text, size = nil, indent = nil, offset = nil)
|
43
41
|
size ||= Log.tty_size || MAX_TTY_LINE_WIDTH
|
44
42
|
size = MAX_TTY_LINE_WIDTH if size > MAX_TTY_LINE_WIDTH
|
@@ -74,7 +72,7 @@ module Misc
|
|
74
72
|
end*""
|
75
73
|
end
|
76
74
|
|
77
|
-
def self.format_definition_list_item(dt, dd, indent = nil, size = nil, color
|
75
|
+
def self.format_definition_list_item(dt, dd, indent = nil, size = nil, color: :yellow)
|
78
76
|
if size.nil?
|
79
77
|
base_size = MAX_TTY_LINE_WIDTH
|
80
78
|
base_indent = indent || (base_size / 3)
|
@@ -100,12 +98,12 @@ module Misc
|
|
100
98
|
text
|
101
99
|
end
|
102
100
|
|
103
|
-
def self.format_definition_list(defs, indent = nil, size = nil, color
|
101
|
+
def self.format_definition_list(defs, indent = nil, size = nil, color: :yellow, sep: "\n\n")
|
104
102
|
indent ||= 30
|
105
103
|
size ||= (Log.tty_size || MAX_TTY_LINE_WIDTH) - indent
|
106
104
|
entries = []
|
107
105
|
defs.each do |dt,dd|
|
108
|
-
text = format_definition_list_item(dt,dd,indent, size,color)
|
106
|
+
text = format_definition_list_item(dt,dd,indent, size, color: color)
|
109
107
|
entries << text
|
110
108
|
end
|
111
109
|
entries * sep
|
data/lib/scout/misc/helper.rb
CHANGED
@@ -28,14 +28,23 @@ module Misc
|
|
28
28
|
counts
|
29
29
|
end
|
30
30
|
|
31
|
-
|
31
|
+
# Divides the array into chunks of size +size+ by taking
|
32
|
+
# consecutive elements. If a block is given it runs it
|
33
|
+
# instead of returning the chunks
|
34
|
+
def self.chunk(array, size)
|
32
35
|
total = array.length
|
33
36
|
current = 0
|
37
|
+
res = [] unless block_given?
|
34
38
|
while current < total
|
35
|
-
last = current +
|
36
|
-
|
39
|
+
last = current + size - 1
|
40
|
+
if block_given?
|
41
|
+
yield array[current..last]
|
42
|
+
else
|
43
|
+
res << array[current..last]
|
44
|
+
end
|
37
45
|
current = last + 1
|
38
46
|
end
|
47
|
+
block_given? ? nil : res
|
39
48
|
end
|
40
49
|
|
41
50
|
# Divides the array into +num+ chunks of the same size by placing one
|
data/lib/scout/named_array.rb
CHANGED
@@ -100,8 +100,8 @@ module NamedArray
|
|
100
100
|
|
101
101
|
def to_hash
|
102
102
|
hash = {}
|
103
|
-
self.fields.
|
104
|
-
hash[field] =
|
103
|
+
self.fields.each do |field|
|
104
|
+
hash[field] = self[field]
|
105
105
|
end
|
106
106
|
IndiferentHash.setup hash
|
107
107
|
end
|
@@ -158,4 +158,8 @@ module NamedArray
|
|
158
158
|
return super(name, *args)
|
159
159
|
end
|
160
160
|
end
|
161
|
+
|
162
|
+
def prety_print
|
163
|
+
Misc.format_definition_list(self.to_hash, sep: "\n")
|
164
|
+
end
|
161
165
|
end
|
data/lib/scout/open/stream.rb
CHANGED
@@ -440,7 +440,7 @@ module Open
|
|
440
440
|
# StringIO.new stream.read.split("\n").sort.uniq * "\n"
|
441
441
|
#end
|
442
442
|
|
443
|
-
def self.collapse_stream(s, line: nil, sep: "\t", header: nil, &block)
|
443
|
+
def self.collapse_stream(s, line: nil, sep: "\t", header: nil, compact: false, &block)
|
444
444
|
sep ||= "\t"
|
445
445
|
Open.open_pipe do |sin|
|
446
446
|
|
@@ -458,8 +458,13 @@ module Open
|
|
458
458
|
current_key = key
|
459
459
|
when current_key == key
|
460
460
|
parts.each_with_index do |part,i|
|
461
|
-
if
|
462
|
-
|
461
|
+
next if compact and part.nil? || part.empty?
|
462
|
+
if current_parts[i].nil? || current_parts[i].empty?
|
463
|
+
if compact
|
464
|
+
current_parts[i] = part.dup
|
465
|
+
else
|
466
|
+
current_parts[i] = "|" << part
|
467
|
+
end
|
463
468
|
else
|
464
469
|
current_parts[i] = current_parts[i] << "|" << part
|
465
470
|
end
|
data/lib/scout/open/util.rb
CHANGED
@@ -11,7 +11,7 @@ module Open
|
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
|
-
def self.grep(stream, grep, invert = false, fixed = nil)
|
14
|
+
def self.grep(stream, grep, invert = false, fixed = nil, options = {})
|
15
15
|
case
|
16
16
|
when Array === grep
|
17
17
|
TmpFile.with_file(grep * "\n", false) do |f|
|
@@ -242,6 +242,11 @@ module Open
|
|
242
242
|
nil
|
243
243
|
end
|
244
244
|
|
245
|
+
def self.link_dir(source, target)
|
246
|
+
Log.debug "Copy with hard-links #{Log.fingerprint source}->#{Log.fingerprint target}"
|
247
|
+
FileUtils.cp_lr(source, target)
|
248
|
+
end
|
249
|
+
|
245
250
|
def self.list(file)
|
246
251
|
file = file.produce_and_find if Path === file
|
247
252
|
Open.read(file).split("\n")
|
data/lib/scout/open.rb
CHANGED
@@ -31,13 +31,13 @@ module Open
|
|
31
31
|
File.open(file, mode)
|
32
32
|
end
|
33
33
|
|
34
|
-
def self.file_open(file, grep = false, mode = 'r', invert_grep = false, options = {})
|
34
|
+
def self.file_open(file, grep = false, mode = 'r', invert_grep = false, fixed_grep = true, options = {})
|
35
35
|
Open.mkdir File.dirname(file) if mode.include? 'w'
|
36
36
|
|
37
37
|
stream = get_stream(file, mode, options)
|
38
38
|
|
39
39
|
if grep
|
40
|
-
grep(stream, grep, invert_grep)
|
40
|
+
grep(stream, grep, invert_grep, fixed_grep)
|
41
41
|
else
|
42
42
|
stream
|
43
43
|
end
|
@@ -68,11 +68,11 @@ module Open
|
|
68
68
|
|
69
69
|
options = IndiferentHash.add_defaults options, :noz => false, :mode => 'r'
|
70
70
|
|
71
|
-
mode = IndiferentHash.process_options options, :mode
|
71
|
+
mode, grep, invert_grep, fixed_grep = IndiferentHash.process_options options, :mode, :grep, :invert_grep, :fixed_grep
|
72
72
|
|
73
73
|
options[:noz] = true if mode.include? "w"
|
74
74
|
|
75
|
-
io = file_open(file,
|
75
|
+
io = file_open(file, grep, mode, invert_grep, fixed_grep, options)
|
76
76
|
|
77
77
|
io = unzip(io) if ((String === file and zip?(file)) and not options[:noz]) or options[:zip]
|
78
78
|
io = gunzip(io) if ((String === file and gzip?(file)) and not options[:noz]) or options[:gzip]
|
data/lib/scout/tmpfile.rb
CHANGED
@@ -31,6 +31,7 @@ module TmpFile
|
|
31
31
|
# Creates a random filename in the temporary directory
|
32
32
|
def self.tmp_file(prefix = 'tmp-', max = 1_000_000_000, dir = nil)
|
33
33
|
dir ||= TmpFile.tmpdir
|
34
|
+
dir = dir.find if Path === dir
|
34
35
|
File.expand_path(File.join(dir, random_name(prefix, max)))
|
35
36
|
end
|
36
37
|
|
data/scout-essentials.gemspec
CHANGED
@@ -2,16 +2,16 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: scout-essentials 1.6.
|
5
|
+
# stub: scout-essentials 1.6.4 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "scout-essentials".freeze
|
9
|
-
s.version = "1.6.
|
9
|
+
s.version = "1.6.4".freeze
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib".freeze]
|
13
13
|
s.authors = ["Miguel Vazquez".freeze]
|
14
|
-
s.date = "2024-
|
14
|
+
s.date = "2024-12-10"
|
15
15
|
s.description = "Things a scout can use anywhere".freeze
|
16
16
|
s.email = "mikisvaz@gmail.com".freeze
|
17
17
|
s.extra_rdoc_files = [
|
@@ -138,7 +138,7 @@ Gem::Specification.new do |s|
|
|
138
138
|
]
|
139
139
|
s.homepage = "http://github.com/mikisvaz/scout-essentials".freeze
|
140
140
|
s.licenses = ["MIT".freeze]
|
141
|
-
s.rubygems_version = "3.5.
|
141
|
+
s.rubygems_version = "3.5.23".freeze
|
142
142
|
s.summary = "Scout essential tools".freeze
|
143
143
|
|
144
144
|
s.specification_version = 4
|
@@ -6,6 +6,11 @@ class TestMiscHelper < Test::Unit::TestCase
|
|
6
6
|
assert_equal 2, Misc.divide(%w(1 2 3 4 5 6 7 8 9),2).length
|
7
7
|
end
|
8
8
|
|
9
|
+
def test_chunk
|
10
|
+
assert_equal %w(1 2), Misc.chunk(%w(1 2 3 4 5 6 7 8 9),2)[0]
|
11
|
+
end
|
12
|
+
|
13
|
+
|
9
14
|
def test_ordered_divide
|
10
15
|
assert_equal 5, Misc.ordered_divide(%w(1 2 3 4 5 6 7 8 9),2).length
|
11
16
|
end
|
@@ -393,6 +393,34 @@ row2 aa bb cc
|
|
393
393
|
s = StringIO.new text
|
394
394
|
assert Open.collapse_stream(s, sep: " ").read =~ /\|cc$/
|
395
395
|
end
|
396
|
+
|
397
|
+
def test_collapse_stream_compact
|
398
|
+
text=<<-EOF
|
399
|
+
row1 A B C
|
400
|
+
row1 a b c
|
401
|
+
row2 BB CC
|
402
|
+
row2 aa bb cc
|
403
|
+
row2 aaa ccc
|
404
|
+
EOF
|
405
|
+
|
406
|
+
s = StringIO.new text
|
407
|
+
stream = Open.collapse_stream(s, sep: "\t", compact: false)
|
408
|
+
txt = stream.read
|
409
|
+
assert_include txt, "A|a"
|
410
|
+
assert_include txt, "B|b"
|
411
|
+
assert_include txt, "C|c"
|
412
|
+
assert_include txt, "|aa"
|
413
|
+
|
414
|
+
s = StringIO.new text
|
415
|
+
stream = Open.collapse_stream(s, sep: "\t", compact: true)
|
416
|
+
txt = stream.read
|
417
|
+
assert_include txt, "A|a"
|
418
|
+
assert_include txt, "B|b"
|
419
|
+
assert_include txt, "C|c"
|
420
|
+
assert_not_include txt, "|aa\t"
|
421
|
+
assert_not_include txt, "bb|"
|
422
|
+
end
|
423
|
+
|
396
424
|
#
|
397
425
|
#
|
398
426
|
# def test_paste_stream
|
@@ -63,10 +63,25 @@ class TestOpenUtil < Test::Unit::TestCase
|
|
63
63
|
file1 = directory.subdir1.file
|
64
64
|
file2 = directory.subdir2.file
|
65
65
|
Open.write(file1, "TEST")
|
66
|
-
Open.
|
66
|
+
Open.ln_h file1, file2
|
67
|
+
assert_equal "TEST", Open.read(file2)
|
68
|
+
Open.write(file1, "TEST2")
|
69
|
+
assert_equal "TEST2", Open.read(file2)
|
70
|
+
assert_equal File.stat(file1).ino, File.stat(file2).ino
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_ln_recursive
|
75
|
+
TmpFile.with_file do |directory|
|
76
|
+
Path.setup(directory)
|
77
|
+
file1 = directory.subdir1.file
|
78
|
+
file2 = directory.subdir2.file
|
79
|
+
Open.write(file1, "TEST")
|
80
|
+
Open.link_dir directory.subdir1, directory.subdir2
|
67
81
|
assert_equal "TEST", Open.read(file2)
|
68
82
|
Open.write(file1, "TEST2")
|
69
83
|
assert_equal "TEST2", Open.read(file2)
|
84
|
+
assert_equal File.stat(file1).ino, File.stat(file2).ino
|
70
85
|
end
|
71
86
|
end
|
72
87
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: scout-essentials
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.6.
|
4
|
+
version: 1.6.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Miguel Vazquez
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-12-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: shoulda
|
@@ -251,7 +251,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
251
251
|
- !ruby/object:Gem::Version
|
252
252
|
version: '0'
|
253
253
|
requirements: []
|
254
|
-
rubygems_version: 3.5.
|
254
|
+
rubygems_version: 3.5.23
|
255
255
|
signing_key:
|
256
256
|
specification_version: 4
|
257
257
|
summary: Scout essential tools
|