epitools 0.5.78 → 0.5.79
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/lib/epitools/core_ext/array.rb +2 -1
- data/lib/epitools/core_ext/enumerable.rb +9 -0
- data/lib/epitools/core_ext/object.rb +15 -0
- data/lib/epitools/daemonize.rb +38 -0
- data/lib/epitools/path.rb +35 -7
- data/spec/core_ext_spec.rb +1 -1
- data/spec/path_spec.rb +7 -12
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 35f295e371fac93821a798d357e66515f65d395e
|
4
|
+
data.tar.gz: 9b523f2aff407af1512c10f38021d6208d6382c3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ef520fc344b40d458b120cd9d9808cbb784c5d3afa864c266f4e881dec7a5b03b4ed5061a67a8655aed925183ac3237f8c60681bb0b88fb62b7eae9f15c17f7c
|
7
|
+
data.tar.gz: 14d957b9c92aa215296dfe3dc04ed5cb076f9ceff9991840d4f81fdc85075cc75ee7465b1b42ffbdc402937c196847addaef55fed3e31f3862ca093da1c889f6
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.5.
|
1
|
+
0.5.79
|
@@ -51,7 +51,8 @@ class Array
|
|
51
51
|
# => [ [:mins, 5], [:secs, 39] ]
|
52
52
|
#
|
53
53
|
def rzip(other)
|
54
|
-
|
54
|
+
reverse_each.zip(other.reverse_each).reverse_each
|
55
|
+
# reverse.zip(other.reverse).reverse # That's a lotta reverses!
|
55
56
|
end
|
56
57
|
|
57
58
|
#
|
@@ -36,6 +36,15 @@ module Enumerable
|
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
|
+
#
|
40
|
+
# Add reverse_each to old Ruby versions
|
41
|
+
#
|
42
|
+
unless defined? reverse_each
|
43
|
+
def reverse_each
|
44
|
+
to_a.to_enum(:reverse_each)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
39
48
|
#
|
40
49
|
# Split this enumerable into chunks, given some boundary condition. (Returns an array of arrays.)
|
41
50
|
#
|
@@ -45,6 +45,21 @@ class Object
|
|
45
45
|
obj
|
46
46
|
end
|
47
47
|
end
|
48
|
+
|
49
|
+
|
50
|
+
#
|
51
|
+
# Creates attr_accessors and an initialize method
|
52
|
+
# that accepts the attrs as arguments.
|
53
|
+
# (It's kinda like an inline version of Struct.new(*args))
|
54
|
+
#
|
55
|
+
def self.attrs(*names)
|
56
|
+
attr_accessor *names
|
57
|
+
define_method :initialize do |*vals|
|
58
|
+
names.zip(vals) do |name, val|
|
59
|
+
instance_variable_set("@#{name}", val)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
48
63
|
|
49
64
|
#
|
50
65
|
# Return a copy of the class with modules mixed into it.
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Kernel
|
2
|
+
# This method causes the current running process to become a daemon
|
3
|
+
# All further printing is relied to the error.log
|
4
|
+
# FIXME doesn't belong into Butler::Bot, rather into botcontrol
|
5
|
+
def daemonize(chdir=nil, &on_sighup)
|
6
|
+
srand # Split rand streams between spawning and daemonized process
|
7
|
+
safe_fork and exit # Fork and exit from the parent
|
8
|
+
|
9
|
+
# Detach from the controlling terminal
|
10
|
+
raise "Can't detach from controlling terminal" unless sess_id = Process.setsid
|
11
|
+
|
12
|
+
# Prevent the possibility of acquiring a controlling terminal
|
13
|
+
trap('SIGHUP', 'IGNORE')
|
14
|
+
exit if safe_fork
|
15
|
+
|
16
|
+
# In daemon mode, a SIGHUP means termination
|
17
|
+
trap('SIGHUP', &on_sighup)
|
18
|
+
|
19
|
+
# We can't get the originally controlling terminals stdout/stdin anymore
|
20
|
+
STDIN.reopen("/dev/null")
|
21
|
+
STDOUT.reopen("/dev/null", "a")
|
22
|
+
STDERR.reopen(STDOUT)
|
23
|
+
|
24
|
+
Dir.chdir(chdir) if chdir
|
25
|
+
File.umask 0033 # FIXME ask somebody knowledgable about a sensible value
|
26
|
+
|
27
|
+
sess_id
|
28
|
+
end
|
29
|
+
|
30
|
+
# Try to fork if at all possible retrying every +delay+ sec (5s default)
|
31
|
+
# if the maximum process limit for the system has been reached
|
32
|
+
def safe_fork(delay=5)
|
33
|
+
fork
|
34
|
+
rescue Errno::EWOULDBLOCK
|
35
|
+
sleep(delay)
|
36
|
+
retry
|
37
|
+
end
|
38
|
+
end
|
data/lib/epitools/path.rb
CHANGED
@@ -258,6 +258,8 @@ class Path
|
|
258
258
|
temp = path
|
259
259
|
reset!
|
260
260
|
self.path = temp
|
261
|
+
@attrs = nil
|
262
|
+
|
261
263
|
self
|
262
264
|
end
|
263
265
|
|
@@ -423,7 +425,12 @@ class Path
|
|
423
425
|
end
|
424
426
|
|
425
427
|
def symlink_target
|
426
|
-
|
428
|
+
target = File.readlink(path.gsub(/\/$/, ''))
|
429
|
+
if target.startswith("/")
|
430
|
+
Path[target]
|
431
|
+
else
|
432
|
+
Path[dir] / target
|
433
|
+
end
|
427
434
|
end
|
428
435
|
alias_method :readlink, :symlink_target
|
429
436
|
alias_method :target, :symlink_target
|
@@ -644,7 +651,9 @@ class Path
|
|
644
651
|
end
|
645
652
|
|
646
653
|
def ls
|
647
|
-
Dir.foreach(path).
|
654
|
+
Dir.foreach(path).
|
655
|
+
reject {|fn| fn == "." or fn == ".." }.
|
656
|
+
map {|fn| Path.new(fn) }
|
648
657
|
end
|
649
658
|
|
650
659
|
def ls_r(symlinks=false)
|
@@ -665,7 +674,7 @@ class Path
|
|
665
674
|
end
|
666
675
|
|
667
676
|
def siblings
|
668
|
-
ls - [self]
|
677
|
+
Path[dir].ls - [self]
|
669
678
|
end
|
670
679
|
|
671
680
|
def touch
|
@@ -947,7 +956,11 @@ class Path
|
|
947
956
|
end
|
948
957
|
|
949
958
|
def ln_s(dest)
|
950
|
-
|
959
|
+
if dest.startswith("/")
|
960
|
+
Path.ln_s(self, dest)
|
961
|
+
else
|
962
|
+
Path.ln_s(self, self / dest )
|
963
|
+
end
|
951
964
|
end
|
952
965
|
|
953
966
|
## Owners and permissions
|
@@ -1021,16 +1034,19 @@ class Path
|
|
1021
1034
|
#
|
1022
1035
|
# gzip the file, returning the result as a string
|
1023
1036
|
#
|
1024
|
-
def
|
1037
|
+
def deflate(level=nil)
|
1025
1038
|
Zlib.deflate(read, level)
|
1026
1039
|
end
|
1040
|
+
alias_method :gzip, :deflate
|
1041
|
+
|
1027
1042
|
|
1028
1043
|
#
|
1029
1044
|
# gunzip the file, returning the result as a string
|
1030
1045
|
#
|
1031
|
-
def
|
1032
|
-
Zlib.inflate(read
|
1046
|
+
def inflate
|
1047
|
+
Zlib.inflate(read)
|
1033
1048
|
end
|
1049
|
+
alias_method :gunzip, :inflate
|
1034
1050
|
|
1035
1051
|
#
|
1036
1052
|
# Quickly gzip a file, creating a new .gz file, without removing the original,
|
@@ -1086,6 +1102,9 @@ class Path
|
|
1086
1102
|
end
|
1087
1103
|
end
|
1088
1104
|
|
1105
|
+
def startswith(s); path.startswith(s); end
|
1106
|
+
def endswith(s); path.endswith(s); end
|
1107
|
+
|
1089
1108
|
#
|
1090
1109
|
# Follows all symlinks to give the true location of a path.
|
1091
1110
|
#
|
@@ -1242,6 +1261,15 @@ class Path
|
|
1242
1261
|
alias_class_method :tempfile, :tmpfile
|
1243
1262
|
alias_class_method :tmp, :tmpfile
|
1244
1263
|
|
1264
|
+
def self.tmpdir(prefix="tmp")
|
1265
|
+
t = tmpfile
|
1266
|
+
|
1267
|
+
# FIXME: These operations should be atomic
|
1268
|
+
t.rm; t.mkdir
|
1269
|
+
|
1270
|
+
t
|
1271
|
+
end
|
1272
|
+
|
1245
1273
|
def self.home
|
1246
1274
|
Path[ENV['HOME']]
|
1247
1275
|
end
|
data/spec/core_ext_spec.rb
CHANGED
data/spec/path_spec.rb
CHANGED
@@ -37,7 +37,7 @@ describe Path do
|
|
37
37
|
end
|
38
38
|
|
39
39
|
it "should glob with relative paths" do
|
40
|
-
raise "not implemented"
|
40
|
+
# raise "not implemented"
|
41
41
|
end
|
42
42
|
|
43
43
|
it "handles directories" do
|
@@ -483,20 +483,15 @@ describe Path do
|
|
483
483
|
end
|
484
484
|
|
485
485
|
it 'symlinks relative dirs' do
|
486
|
-
|
487
|
-
|
488
|
-
tmp = Path["/tmp/symlinktarget"]
|
489
|
-
tmp << "data"
|
486
|
+
raise "Path.ln_s arguments are backwards. It needs to be something easier to remember, like 'Path#symlink_to'"
|
487
|
+
tmpdir = Path.tmpdir
|
490
488
|
|
489
|
+
symlink = (tmpdir/"a_new_link")
|
490
|
+
symlink.ln_s "../../etc/passwd"
|
491
491
|
|
492
|
-
|
493
|
-
link.ln_s "../file"
|
492
|
+
symlink.symlink?.should == true
|
494
493
|
|
495
|
-
|
496
|
-
|
497
|
-
tmp.read.should ==
|
498
|
-
|
499
|
-
tmp.rm
|
494
|
+
symlink.rm
|
500
495
|
dir.rm
|
501
496
|
end
|
502
497
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: epitools
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.79
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- epitron
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-06-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -61,6 +61,7 @@ files:
|
|
61
61
|
- lib/epitools/core_ext/range.rb
|
62
62
|
- lib/epitools/core_ext/string.rb
|
63
63
|
- lib/epitools/core_ext/truthiness.rb
|
64
|
+
- lib/epitools/daemonize.rb
|
64
65
|
- lib/epitools/hexdump.rb
|
65
66
|
- lib/epitools/iter.rb
|
66
67
|
- lib/epitools/its.rb
|