cmds 0.2.3 → 0.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 78e95949457351a76889d9559cace8e0d6357027
4
- data.tar.gz: 1741db7b86690a11676165ccf6941696a24a63c5
3
+ metadata.gz: 844e8c090bc1bd1fdd4c2196bb879c329497138d
4
+ data.tar.gz: e2c403e462e1f37fe2a8114101942c6ed5352bae
5
5
  SHA512:
6
- metadata.gz: 74d33994938b16b3fc3c33c4ef915e21d729efb50d80f8c303329a7d0513f382a9c29093bdb4c1deb719833b81476389444e2e65922a6249103a254c4482d8e8
7
- data.tar.gz: de650778601f8e6c1ed8faa751edc532badf978c281111c8d7e937635f1a699d1b6e265dc11ce5788e2a736f4e871fb9ebdeaee6d441f09be05616c93c7f872a
6
+ metadata.gz: cb6158b6334ac66d4497619010d8d9557abf4a5ebea68d5325c100f83b49e732289ed39105133166426867cc4a3da6e6284cadba4e82f6715ccb89f1a1065057
7
+ data.tar.gz: b24a5986c2825e9ff8c5e7f518cf713c49b3ffa93dac464f2de1ce02625a8e02c8d635fe7c321e270b46c714beb78045a7e9612c5d8f9697324c33361d47d9c2
data/lib/cmds/spawn.rb CHANGED
@@ -11,51 +11,87 @@ require 'cmds/pipe'
11
11
  require 'cmds/io_handler'
12
12
 
13
13
  class Cmds
14
- # internal core function to spawn and stream inputs and/or outputs using
14
+ # Low-level static method to spawn and stream inputs and/or outputs using
15
15
  # threads.
16
16
  #
17
- # originally inspired by
17
+ # This is the core execution functionality of the whole library - everything
18
+ # end up here.
19
+ #
20
+ # **WARNING** - This method runs the `cmd` string **AS IS** - no escaping,
21
+ # formatting, interpolation, etc. are done at this point.
22
+ #
23
+ # The whole rest of the library is built on top of this method to provide
24
+ # that stuff, and if you're using this library, you probably want to use that
25
+ # stuff.
26
+ #
27
+ # You should not need to use this method directly unless you are extending
28
+ # the library's functionality.
29
+ #
30
+ # Originally inspired by
18
31
  #
19
32
  # https://nickcharlton.net/posts/ruby-subprocesses-with-stdout-stderr-streams.html
20
33
  #
21
34
  # with major modifications from looking at Ruby's open3 module.
22
35
  #
36
+ # At the end of the day ends up calling `Process.spawn`.
37
+ #
23
38
  # @param [String] cmd
24
- # shell-ready command string.
39
+ # **SHELL-READY** command string. This is important - whatever you feed in
40
+ # here will be run **AS IS** - no escaping, formatting, etc.
25
41
  #
26
42
  # @param [nil | String | #read] input
27
- # string or readable input. here so that Cmds instances can pass their
28
- # `@input` instance variable -- `&io_block` overrides it.
43
+ # String or readable input, or `nil` (meaning no input).
44
+ #
45
+ # Allows {Cmds} instances can pass their `@input` instance variable.
46
+ #
47
+ # Don't provide input here and via `io_block`.
29
48
  #
30
- # @param [Hash{Symbol | String => Object}] env
31
- # blah
49
+ # @param [Hash{(Symbol | String) => Object}] env
50
+ # Hash of `ENV` vars to provide for the command.
51
+ #
52
+ # We convert symbol keys to strings, but other than that just pass it
53
+ # through to `Process.spawn`, which I think will `#to_s` everything.
54
+ #
55
+ # Pretty much you want to have everything be strings or symbols for this
56
+ # to make any sense but we're not checking shit at the moment.
57
+ #
58
+ # If the {Cmds#env_mode} is `:inline` it should have already prefixed
59
+ # `cmd` with the definitions and not provide this keyword (or provide
60
+ # `{}`).
32
61
  #
33
62
  # @param [#call & (#arity ∈ {0, 1})] &io_block
34
- # optional block to handle io. behavior depends on arity:
63
+ # Optional block to handle io. Behavior depends on arity:
35
64
  #
36
- # - arity `0`
37
- # - block is called and expected to return an object
65
+ # - Arity `0`
66
+ # - Block is called and expected to return an object
38
67
  # suitable for input (`nil`, `String` or `IO`-like).
39
- # - arity `1`
40
- # - block is called with the {Cmds::IOHandler} instance for the
68
+ # - Arity `1`
69
+ # - Block is called with the {Cmds::IOHandler} instance for the
41
70
  # execution, which it can use to handle input and outputs.
71
+ #
72
+ # Don't provide input here and via `input` keyword arg.
42
73
  #
43
74
  # @return [Fixnum]
44
- # command exit status.
75
+ # Command exit status.
76
+ #
77
+ # @raise [ArgumentError]
78
+ # If `&io_block` has arity greater than 1.
45
79
  #
46
80
  # @raise [ArgumentError]
47
- # if `&io_block` has arity greater than 1.
81
+ # If input is provided via the `input` keyword arg and the `io_block`.
48
82
  #
49
- def self.spawn cmd, **opts, &io_block
83
+ def self.spawn cmd,
84
+ env: {},
85
+ input: nil,
86
+ chdir: nil,
87
+ &io_block
50
88
  Cmds.debug "entering Cmds#spawn",
51
89
  cmd: cmd,
52
- opts: opts,
90
+ env: env,
91
+ input: input,
92
+ chdir: chdir,
53
93
  io_block: io_block
54
94
 
55
- env = opts[:env] || {}
56
- input = opts[:input]
57
- chdir = opts[:chdir]
58
-
59
95
  # create the handler that will be yielded to the input block
60
96
  handler = Cmds::IOHandler.new
61
97
 
@@ -63,18 +99,36 @@ class Cmds
63
99
  #
64
100
  # if a block was provided it overrides the `input` argument.
65
101
  #
66
- if io_block
102
+ if io_block
67
103
  case io_block.arity
68
104
  when 0
69
105
  # when the input block takes no arguments it returns the input
106
+
107
+ # Check that `:input` kwd wasn't provided.
108
+ unless input.nil?
109
+ raise ArgumentError,
110
+ "Don't call Cmds.spawn with `:input` keyword arg and a block"
111
+ end
112
+
70
113
  input = io_block.call
114
+
71
115
  when 1
72
116
  # when the input block takes one argument, give it the handler and
73
117
  # ignore the return value
74
118
  io_block.call handler
75
119
 
76
120
  # if input was assigned to the handler in the block, use it as input
77
- input = handler.in unless handler.in.nil?
121
+ unless handler.in.nil?
122
+
123
+ # Check that `:input` kwd wasn't provided.
124
+ unless input.nil?
125
+ raise ArgumentError,
126
+ "Don't call Cmds.spawn with `:input` keyword arg and a block"
127
+ end
128
+
129
+ input = handler.in
130
+ end
131
+
78
132
  else
79
133
  # bad block provided
80
134
  raise ArgumentError.new NRSER.squish <<-BLOCK
@@ -270,7 +324,10 @@ class Cmds
270
324
  # Internal method that simply passes through to {Cmds.spawn}, serving as
271
325
  # a hook point for subclasses.
272
326
  #
273
- # Accepts and returns the same things as
327
+ # Accepts and returns the same things as {Cmds#stream}.
328
+ #
329
+ # @param (see Cmds#stream)
330
+ # @return (see Cmds#stream)
274
331
  #
275
332
  def spawn *args, **kwds, &io_block
276
333
  Cmds.spawn prepare(*args, **kwds),
@@ -36,8 +36,6 @@ class Cmds
36
36
  # string tokens.
37
37
  #
38
38
  def self.tokenize_option name, value, **opts
39
- pp opts: opts
40
-
41
39
  opts = defaults opts, TOKENIZE_OPT_KEYS
42
40
 
43
41
  unless name.is_a?(String) && name.length > 0
data/lib/cmds/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  class Cmds
2
- VERSION = "0.2.3"
2
+ VERSION = "0.2.4"
3
3
  end
data/lib/cmds.rb CHANGED
@@ -296,7 +296,13 @@ class Cmds
296
296
  def prepare *args, **kwds
297
297
  @last_prepared_cmd = Cmds.format render(*args, **kwds), self.format
298
298
  end # #prepare
299
-
299
+
300
+
301
+ # @!group Execution Instance Methods
302
+ # ----------------------------------------------------------------------------
303
+ #
304
+ # Methods that run the command.
305
+ #
300
306
 
301
307
  # execute command and return `true` if it exited successfully.
302
308
  #
@@ -423,4 +429,7 @@ class Cmds
423
429
  def err *args, **kwds, &input_block
424
430
  capture(*args, **kwds, &input_block).err
425
431
  end
432
+
433
+ # @!endgroup Execution Instance Methods
434
+
426
435
  end # Cmds
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cmds
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.2.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - nrser
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-12-07 00:00:00.000000000 Z
11
+ date: 2017-12-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nrser
@@ -232,7 +232,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
232
232
  version: '0'
233
233
  requirements: []
234
234
  rubyforge_project:
235
- rubygems_version: 2.6.11
235
+ rubygems_version: 2.5.2
236
236
  signing_key:
237
237
  specification_version: 4
238
238
  summary: helps read, write and remember commands.