hysh 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.rdoc +21 -3
- data/lib/hysh.rb +88 -39
- data/spec/hysh_spec.rb +29 -0
- data/test/dpkg_test.rb +16 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d86830d2aaa21d1050bd816890f6c360a3d83030
|
4
|
+
data.tar.gz: bc9daeed25ab30da69434e3e4d403aa0a6326f9e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b49c4784afa508b78886932e8bc804978d3f1995ea16964f89b3922ad1af193d3507add307b5dfb0b1519b3678c0d2ca83bfd255b10c97e59ffa9057ae3a2c8d
|
7
|
+
data.tar.gz: 5f36ac3189789678578268614b5ca6f3aba0536d80001deb2c7449e4fa21d60cf46b9ef8ca5b6d5464b43a0d93d535fdfc1f93d928a75fb98e1a7a41b6754140
|
data/README.rdoc
CHANGED
@@ -9,7 +9,7 @@ Common Lisp: https://github.com/hying-caritas/hysh).
|
|
9
9
|
|
10
10
|
== Example
|
11
11
|
|
12
|
-
def
|
12
|
+
def dpkg_installed1(package_names = nil)
|
13
13
|
Hysh.out_lines ->{
|
14
14
|
Hysh.pipe ['dpkg', '-l'],
|
15
15
|
if package_names
|
@@ -20,9 +20,9 @@ Common Lisp: https://github.com/hying-caritas/hysh).
|
|
20
20
|
}
|
21
21
|
end
|
22
22
|
|
23
|
-
or write the filter in Ruby
|
23
|
+
or write the filter in Ruby,
|
24
24
|
|
25
|
-
def
|
25
|
+
def dpkg_installed2(package_names = nil)
|
26
26
|
Hysh.out_lines ->{
|
27
27
|
Hysh.pipe ['dpkg', '-l'] {
|
28
28
|
proc_line = if package_names
|
@@ -41,6 +41,24 @@ or write the filter in Ruby.
|
|
41
41
|
}
|
42
42
|
end
|
43
43
|
|
44
|
+
or use the hysh_script,
|
45
|
+
|
46
|
+
def dpkg_installed3(package_names = nil)
|
47
|
+
hysh_script {
|
48
|
+
if package_names
|
49
|
+
pipe ['dpkg', '-l'] {
|
50
|
+
filter_line { |l|
|
51
|
+
package_names.any? { |pkg|
|
52
|
+
l.index pkg
|
53
|
+
} && l
|
54
|
+
}
|
55
|
+
}
|
56
|
+
else
|
57
|
+
dpkg '-l'
|
58
|
+
end
|
59
|
+
}
|
60
|
+
end
|
61
|
+
|
44
62
|
Compared with Kernel.system, HYSH provides different coding style for
|
45
63
|
IO redirection, Environment manipulating, Setting current directory,
|
46
64
|
pipe line support without shell, and writing pipeline filter in Ruby.
|
data/lib/hysh.rb
CHANGED
@@ -23,6 +23,8 @@ module Hysh
|
|
23
23
|
@@on_command_error = IGNORE
|
24
24
|
# :startdoc:
|
25
25
|
|
26
|
+
module_function
|
27
|
+
|
26
28
|
# :section: Common Utilities
|
27
29
|
|
28
30
|
# :call-seq:
|
@@ -32,7 +34,7 @@ module Hysh
|
|
32
34
|
# +val+, then run the block, return the return value of the block.
|
33
35
|
# Restore the original value of the variable upon returning.
|
34
36
|
# Multiple pairs of +var_name+ and +val+ can be specified.
|
35
|
-
def
|
37
|
+
def with_set_globals(*var_vals)
|
36
38
|
orig_var_vals = var_vals.each_slice(2).map { |var, val|
|
37
39
|
svar = var.to_s
|
38
40
|
unless svar.start_with? '$'
|
@@ -64,7 +66,7 @@ module Hysh
|
|
64
66
|
# programs, then run the block, return the return value of the
|
65
67
|
# block. Restore the original value of the variable and cancel the
|
66
68
|
# arrangement to external program redirections upon returning.
|
67
|
-
def
|
69
|
+
def with_redirect_to(fd, var, io, &b)
|
68
70
|
@@redirections.push([fd, io]) if fd
|
69
71
|
if var
|
70
72
|
with_set_globals(var, io, &b)
|
@@ -83,7 +85,7 @@ module Hysh
|
|
83
85
|
# then run the block, return the return value of the block. Restore
|
84
86
|
# the original value of the $stdin and cancel the arrangement to
|
85
87
|
# external program redirections upon returning.
|
86
|
-
def
|
88
|
+
def with_redirect_stdin_to(io, &b)
|
87
89
|
with_redirect_to(0, :$stdin, io, &b)
|
88
90
|
end
|
89
91
|
|
@@ -95,7 +97,7 @@ module Hysh
|
|
95
97
|
# then run the block, return the return value of the block. Restore
|
96
98
|
# the original value of the $stdout and cancel the arrangement to
|
97
99
|
# external program redirections upon returning.
|
98
|
-
def
|
100
|
+
def with_redirect_stdout_to(io, &b)
|
99
101
|
with_redirect_to(1, :$stdout, io, &b)
|
100
102
|
end
|
101
103
|
|
@@ -107,7 +109,7 @@ module Hysh
|
|
107
109
|
# then run the block, return the return value of the block. Restore
|
108
110
|
# the original value of the $stderr and cancel the arrangement to
|
109
111
|
# external program redirections upon returning.
|
110
|
-
def
|
112
|
+
def with_redirect_stderr_to(io, &b)
|
111
113
|
with_redirect_to(2, :$stderr, io, &b)
|
112
114
|
end
|
113
115
|
|
@@ -121,7 +123,7 @@ module Hysh
|
|
121
123
|
# block, return the return value of the block. Restore the original
|
122
124
|
# value of the $stdin and cancel the arrangement to external program
|
123
125
|
# redirections upon returning.
|
124
|
-
def
|
126
|
+
def with_redirect_stdin_to_file(*args, &b)
|
125
127
|
File.open(*args) { |f|
|
126
128
|
with_redirect_stdin_to f, &b
|
127
129
|
}
|
@@ -137,7 +139,7 @@ module Hysh
|
|
137
139
|
# block, return the return value of the block. Restore the original
|
138
140
|
# value of the $stdout and cancel the arrangement to external
|
139
141
|
# program redirections upon returning.
|
140
|
-
def
|
142
|
+
def with_redirect_stdout_to_file(*args, &b)
|
141
143
|
if args.size == 1
|
142
144
|
args.push "w"
|
143
145
|
end
|
@@ -156,7 +158,7 @@ module Hysh
|
|
156
158
|
# block, return the return value of the block. Restore the original
|
157
159
|
# value of the $stderr and cancel the arrangement to external
|
158
160
|
# program redirections upon returning.
|
159
|
-
def
|
161
|
+
def with_redirect_stderr_to_file(*args, &b)
|
160
162
|
if args.size == 1
|
161
163
|
args.push "w"
|
162
164
|
end
|
@@ -165,7 +167,7 @@ module Hysh
|
|
165
167
|
}
|
166
168
|
end
|
167
169
|
|
168
|
-
def
|
170
|
+
def __out_io(args, options, proc_arg) # :nodoc:
|
169
171
|
Tempfile.open(TEMP_BASE) { |tempf|
|
170
172
|
tempf.unlink
|
171
173
|
ret = nil
|
@@ -190,7 +192,7 @@ module Hysh
|
|
190
192
|
# collected output string and the return value of the block or the
|
191
193
|
# function or exit success status of the external program as a two
|
192
194
|
# element array. Restore stdout redirection upon returning.
|
193
|
-
def
|
195
|
+
def out_s(*args, &blk)
|
194
196
|
__out_io(*__parse_args(args, blk)) { |tempf|
|
195
197
|
tempf.read
|
196
198
|
}
|
@@ -203,7 +205,7 @@ module Hysh
|
|
203
205
|
#
|
204
206
|
# Same as out_s, except the collected output string are right
|
205
207
|
# stripped before return.
|
206
|
-
def
|
208
|
+
def out_ss(*args_in, &blk)
|
207
209
|
s, ret = out_s(*args_in, &blk)
|
208
210
|
[s.rstrip, ret]
|
209
211
|
end
|
@@ -229,7 +231,7 @@ module Hysh
|
|
229
231
|
# +Process.spawn+. Feed each line of output to the block as +line+.
|
230
232
|
# Return the exit success status of the forked sub-process or the
|
231
233
|
# external program. Restore stdout redirection upon returning.
|
232
|
-
def
|
234
|
+
def out_lines(*args_in, &blk)
|
233
235
|
args, options, proc_arg = __parse_args args_in
|
234
236
|
if block_given?
|
235
237
|
__popen(nil, true, nil, args, options, proc_arg) { |pid, stdin, stdout, stderr|
|
@@ -250,7 +252,7 @@ module Hysh
|
|
250
252
|
# out_err_s(command...[, options]) -> [string, true or false]
|
251
253
|
#
|
252
254
|
# Same as out_s, except collect output of stderr too.
|
253
|
-
def
|
255
|
+
def out_err_s(*args_in, &blk)
|
254
256
|
args, options, proc_arg = __parse_args args_in, blk
|
255
257
|
Tempfile.open(TEMP_BASE) { |tempf|
|
256
258
|
tempf.unlink
|
@@ -273,12 +275,12 @@ module Hysh
|
|
273
275
|
#
|
274
276
|
# Same as out_err_s, except the collected output string are right
|
275
277
|
# stripped before return.
|
276
|
-
def
|
278
|
+
def out_err_ss(*args_in, &blk)
|
277
279
|
s, ret = out_err_s(*args_in, &blk)
|
278
280
|
[s.rstrip. ret]
|
279
281
|
end
|
280
282
|
|
281
|
-
def
|
283
|
+
def __in_io(args, options, proc_arg) # :nodoc:
|
282
284
|
Tempfile.open(TEMP_BASE) { |tempf|
|
283
285
|
tempf.unlink
|
284
286
|
yield tempf
|
@@ -301,7 +303,7 @@ module Hysh
|
|
301
303
|
# +Process.spawn+. Return the return value of the block or the
|
302
304
|
# function or the exit success status of the external program.
|
303
305
|
# Restore stdin redirection upon returning.
|
304
|
-
def
|
306
|
+
def in_s(s, *args_in, &blk)
|
305
307
|
args, options, proc_arg = __parse_args args_in, blk
|
306
308
|
__in_io(args, options, proc_arg) { |tempf|
|
307
309
|
tempf.write s
|
@@ -315,7 +317,7 @@ module Hysh
|
|
315
317
|
#
|
316
318
|
# Same as +in_s+, except input string are specified via +lines+
|
317
319
|
# (Array of String).
|
318
|
-
def
|
320
|
+
def in_lines(lines, *args_in, &blk)
|
319
321
|
args, options, proc_arg = __parse_args args_in, blk
|
320
322
|
__in_io(args, options, proc_arg) { |tempf|
|
321
323
|
lines.each { |line| tempf.write line }
|
@@ -329,7 +331,7 @@ module Hysh
|
|
329
331
|
#
|
330
332
|
# Redirect the stdin and stdout like that of +in_s+ and +out_s+,
|
331
333
|
# return value is same of +out_s+.
|
332
|
-
def
|
334
|
+
def io_s(s, *args_in, &blk)
|
333
335
|
in_s(s) {
|
334
336
|
out_s {
|
335
337
|
run *args_in, &blk
|
@@ -344,7 +346,7 @@ module Hysh
|
|
344
346
|
#
|
345
347
|
# Same as +io_s+, except the output string is right stripped before
|
346
348
|
# returning.
|
347
|
-
def
|
349
|
+
def io_ss(s, *args_in, &blk)
|
348
350
|
s = io_s(s, *args_in, &blk)
|
349
351
|
s.rstrip
|
350
352
|
end
|
@@ -357,7 +359,7 @@ module Hysh
|
|
357
359
|
# When running the block, the non-zero exit status of running
|
358
360
|
# external program are ignored. The original behavior is restored
|
359
361
|
# upon returning.
|
360
|
-
def
|
362
|
+
def ignore_on_command_error(&b)
|
361
363
|
with_set_globals(:@@on_command_error, IGNORE, &b)
|
362
364
|
end
|
363
365
|
|
@@ -367,7 +369,7 @@ module Hysh
|
|
367
369
|
# When running the block, the warning message will be print to
|
368
370
|
# $stderr when the external program exited with non-zero status.
|
369
371
|
# The original behavior is restored upon returning.
|
370
|
-
def
|
372
|
+
def warn_on_command_error(&b)
|
371
373
|
with_set_globals(:@@on_command_error, WARN, &b)
|
372
374
|
end
|
373
375
|
|
@@ -377,11 +379,11 @@ module Hysh
|
|
377
379
|
# When running the block, an +Hysh::CommandError+ exception will be
|
378
380
|
# raised when the external program exited with non-zero status. The
|
379
381
|
# original behavior is restored upon returning.
|
380
|
-
def
|
382
|
+
def raise_on_command_error(&b)
|
381
383
|
with_set_globals(:@@on_command_error, RAISE, &b)
|
382
384
|
end
|
383
385
|
|
384
|
-
def
|
386
|
+
def __parse_args(args, blk = nil) # :nodoc:
|
385
387
|
args = [args] unless args.is_a? Array
|
386
388
|
if args.last.is_a?(Hash)
|
387
389
|
options = args.pop
|
@@ -410,7 +412,7 @@ module Hysh
|
|
410
412
|
# nil, the envioronment variable will be removed. Multiple pairs of
|
411
413
|
# the environment variable names and values can be specified. The
|
412
414
|
# changes to the environment are restored upon returning.
|
413
|
-
def
|
415
|
+
def with_change_env(*var_vals)
|
414
416
|
orig_var_vals = var_vals.each_slice(2).map { |var, val|
|
415
417
|
orig_val = ENV[var]
|
416
418
|
[var, orig_val]
|
@@ -431,11 +433,11 @@ module Hysh
|
|
431
433
|
# chdir(dir) { ... }
|
432
434
|
#
|
433
435
|
# Same as +Dir.chdir+.
|
434
|
-
def
|
436
|
+
def chdir(dir, &b)
|
435
437
|
Dir.chdir(dir, &b)
|
436
438
|
end
|
437
439
|
|
438
|
-
def
|
440
|
+
def __spawn(args, options_in, proc_arg) # :nodoc:
|
439
441
|
if proc_arg
|
440
442
|
Process.fork {
|
441
443
|
fclose = options_in[:close] || []
|
@@ -473,7 +475,7 @@ module Hysh
|
|
473
475
|
# sub-process, or run external program specified via +command+ and
|
474
476
|
# +options+, +command+ and +options+ are same as that of
|
475
477
|
# Process.spawn. Return the +pid+.
|
476
|
-
def
|
478
|
+
def spawn(*args_in, &blk)
|
477
479
|
__spawn *__parse_args(args_in, blk)
|
478
480
|
end
|
479
481
|
|
@@ -504,7 +506,7 @@ module Hysh
|
|
504
506
|
attr_reader :status
|
505
507
|
end
|
506
508
|
|
507
|
-
def
|
509
|
+
def __check_command_status(cmd) # :nodoc:
|
508
510
|
unless $?.success?
|
509
511
|
if @@on_command_error != IGNORE
|
510
512
|
err = CommandError.new(cmd, $?)
|
@@ -521,7 +523,7 @@ module Hysh
|
|
521
523
|
end
|
522
524
|
end
|
523
525
|
|
524
|
-
def
|
526
|
+
def __run(args, options, proc_arg) #:nodoc:
|
525
527
|
if proc_arg
|
526
528
|
args.first.()
|
527
529
|
else
|
@@ -543,11 +545,11 @@ module Hysh
|
|
543
545
|
# 0. All IO redirections, environment change, current directory
|
544
546
|
# change, etc. will take effect when running the block, the function
|
545
547
|
# and the external program.
|
546
|
-
def
|
548
|
+
def run(*args_in, &blk)
|
547
549
|
__run *__parse_args(args_in, blk)
|
548
550
|
end
|
549
551
|
|
550
|
-
def
|
552
|
+
def __check_close(*ios) # :nodoc:
|
551
553
|
ios.each { |io|
|
552
554
|
if io && !io.closed?
|
553
555
|
io.close
|
@@ -555,7 +557,7 @@ module Hysh
|
|
555
557
|
}
|
556
558
|
end
|
557
559
|
|
558
|
-
def
|
560
|
+
def __popen(stdin, stdout, stderr, args, options, proc_arg) # :nodoc:
|
559
561
|
options[:close] = [] if proc_arg
|
560
562
|
|
561
563
|
stdin_in = stdin_out = nil
|
@@ -624,7 +626,7 @@ module Hysh
|
|
624
626
|
#
|
625
627
|
# If no block is given, the pid and stdin, stdout and stderr pipe
|
626
628
|
# will be returned.
|
627
|
-
def
|
629
|
+
def popen(stdin, stdout, stderr, *args_in, &blk)
|
628
630
|
args, options, proc_arg = __parse_args args_in
|
629
631
|
options[:close] = [] if proc_arg
|
630
632
|
|
@@ -655,7 +657,7 @@ module Hysh
|
|
655
657
|
# command # command without argument
|
656
658
|
# [function] # function in an array
|
657
659
|
# function # function
|
658
|
-
def
|
660
|
+
def pipe(*cmds, &blk)
|
659
661
|
if block_given?
|
660
662
|
cmds.push [blk]
|
661
663
|
end
|
@@ -734,7 +736,7 @@ module Hysh
|
|
734
736
|
# +command_line+, and the block if given, from left to right.
|
735
737
|
# +command_line+ is same as that of +pipe+. Return the return value
|
736
738
|
# or exit success status of the last function or external command.
|
737
|
-
def
|
739
|
+
def run_seq(*cmds, &blk)
|
738
740
|
if block_given?
|
739
741
|
cmds.push blk
|
740
742
|
end
|
@@ -757,7 +759,7 @@ module Hysh
|
|
757
759
|
# program and return the value. If all failed, false or nil will be
|
758
760
|
# returned. If no function, external program, or block is given,
|
759
761
|
# return false.
|
760
|
-
def
|
762
|
+
def run_or(*cmds, &blk)
|
761
763
|
if block_given?
|
762
764
|
cmds.push blk
|
763
765
|
end
|
@@ -787,7 +789,7 @@ module Hysh
|
|
787
789
|
# last function, the block or the exit success status of the
|
788
790
|
# external program. If no function, external program, or block is
|
789
791
|
# provided, return true.
|
790
|
-
def
|
792
|
+
def run_and(*cmds, &blk)
|
791
793
|
if block_given?
|
792
794
|
cmds.push blk
|
793
795
|
end
|
@@ -811,7 +813,7 @@ module Hysh
|
|
811
813
|
#
|
812
814
|
# Feed each line from $stdin to the block, if non-nil/false
|
813
815
|
# returned, write the return value to the $stdout.
|
814
|
-
def
|
816
|
+
def filter_line
|
815
817
|
$stdin.each_line { |line|
|
816
818
|
if ret_line = yield(line)
|
817
819
|
$stdout.write ret_line
|
@@ -825,7 +827,7 @@ module Hysh
|
|
825
827
|
#
|
826
828
|
# Feed each character from $stdin to the block, if non-nil/false
|
827
829
|
# returned, write the return value to the $stdout.
|
828
|
-
def
|
830
|
+
def filter_char
|
829
831
|
$stdin.each_char { |ch|
|
830
832
|
if ret_ch = yield(ch)
|
831
833
|
$stdout.write ret_ch
|
@@ -833,4 +835,51 @@ module Hysh
|
|
833
835
|
}
|
834
836
|
true
|
835
837
|
end
|
838
|
+
|
839
|
+
def __with_add_hysh_to_self(s, &blk) # :nodoc:
|
840
|
+
sclass = s.singleton_class
|
841
|
+
mm_defined = sclass.instance_methods(false).include? :method_missing
|
842
|
+
mm_defined ||= sclass.private_instance_methods(false).include? :method_missing
|
843
|
+
class << s
|
844
|
+
alias __hysh_origin_method_missing__ method_missing
|
845
|
+
def method_missing(m, *args, &blk)
|
846
|
+
__hysh_origin_method_missing__ m, args, &blk
|
847
|
+
rescue NoMethodError
|
848
|
+
if Hysh.singleton_class.public_method_defined? m
|
849
|
+
Hysh.send m, *args, &blk
|
850
|
+
else
|
851
|
+
Hysh.run m.to_s, *args.map { |a| a.to_s }, &blk
|
852
|
+
end
|
853
|
+
end
|
854
|
+
end
|
855
|
+
s.instance_eval &blk
|
856
|
+
ensure
|
857
|
+
class << s
|
858
|
+
remove_method :method_missing
|
859
|
+
end
|
860
|
+
if mm_defined
|
861
|
+
class << s
|
862
|
+
alias method_missing __hysh_origin_method_missing__
|
863
|
+
end
|
864
|
+
end
|
865
|
+
class << s
|
866
|
+
remove_method :__hysh_origin_method_missing__
|
867
|
+
end
|
868
|
+
end
|
869
|
+
end
|
870
|
+
|
871
|
+
# :call-seq:
|
872
|
+
# hysh_script { ... }
|
873
|
+
#
|
874
|
+
# Call the block, in addition to the methods, variables reference of
|
875
|
+
# current self object, the public methods in Hysh module can be called
|
876
|
+
# directly too, and all other method callings are regarded as external
|
877
|
+
# program running. That is, if there is no ls method defined for
|
878
|
+
# self, you can run it via
|
879
|
+
#
|
880
|
+
# hysh_script {
|
881
|
+
# ls
|
882
|
+
# }
|
883
|
+
def hysh_script(&blk)
|
884
|
+
Hysh.__with_add_hysh_to_self(self, &blk)
|
836
885
|
end
|
data/spec/hysh_spec.rb
CHANGED
@@ -37,3 +37,32 @@ describe Hysh do
|
|
37
37
|
end
|
38
38
|
end
|
39
39
|
end
|
40
|
+
|
41
|
+
class TestScript
|
42
|
+
def test
|
43
|
+
@x = 4
|
44
|
+
hysh_script {
|
45
|
+
pipe ['echo', '1', '2'], ['wc', '-w']
|
46
|
+
}
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_script
|
51
|
+
t = TestScript.new
|
52
|
+
class << t
|
53
|
+
def method_missing(m, *args)
|
54
|
+
raise NoMethodError
|
55
|
+
end
|
56
|
+
end
|
57
|
+
t
|
58
|
+
end
|
59
|
+
|
60
|
+
describe "hysh_script" do
|
61
|
+
it "run Hysh methods directly" do
|
62
|
+
expect(hysh_script { out_ss { run "echo", "12" } }).to eql(["12", true])
|
63
|
+
end
|
64
|
+
it "run commands as function" do
|
65
|
+
expect(hysh_script { out_ss { echo 12 } }).to eql(["12", true])
|
66
|
+
expect(Hysh.out_ss { test_script.test }).to eql(["2", true])
|
67
|
+
end
|
68
|
+
end
|
data/test/dpkg_test.rb
CHANGED
@@ -31,3 +31,19 @@ def dpkg_installed2(package_names = nil)
|
|
31
31
|
}
|
32
32
|
}
|
33
33
|
end
|
34
|
+
|
35
|
+
def dpkg_installed3(package_names = nil)
|
36
|
+
hysh_script {
|
37
|
+
if package_names
|
38
|
+
pipe ['dpkg', '-l'] {
|
39
|
+
filter_line { |l|
|
40
|
+
package_names.any? { |pkg|
|
41
|
+
l.index pkg
|
42
|
+
} && l
|
43
|
+
}
|
44
|
+
}
|
45
|
+
else
|
46
|
+
dpkg '-l'
|
47
|
+
end
|
48
|
+
}
|
49
|
+
end
|
metadata
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hysh
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Huang, Ying
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-10-04 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
|
-
description: IO redirection and command glue
|
13
|
+
description: Shell scripting in Ruby, including IO redirection and command glue, etc.
|
14
14
|
email: huang.ying.caritas@gmail.com
|
15
15
|
executables: []
|
16
16
|
extensions: []
|