commande 0.3.1 → 0.4.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.
- checksums.yaml +5 -5
- data/CHANGELOG.md +3 -0
- data/README.md +55 -0
- data/commande.gemspec +44 -44
- data/lib/command/chain.rb +3 -0
- data/lib/command/minitest.rb +1 -3
- data/lib/commande/chain.rb +51 -0
- data/lib/commande/version.rb +1 -1
- data/lib/commande.rb +1 -1
- metadata +7 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 5334f1b703da19aebef8ef78454df5c22b1579200e4c6081849f1838c9590e09
|
4
|
+
data.tar.gz: 19e06efbfed90cf386054ac5c012f023e21f50f6ed770e88cabfb06544798195
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '0392aa643a831494eb0ff6cfc1dbc9bd07b282a9a6d0394ee4d1d0a6c1d7eaa430b517a4baac6424f885ab7ed17da93525c6acef75e2c2ba6af14b64dbad822a'
|
7
|
+
data.tar.gz: 356fe5f2f6d97beecd770f11dfe7ba3cad4f4f4705786c1f4fb9a349cab2ec3492ac855b11ae09a82c0e7d1dedc42193a14fad5a9e1d58ebf72e1ce8785ed1fa
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -78,6 +78,61 @@ result.successful? # => false
|
|
78
78
|
result.fetched # => nil
|
79
79
|
```
|
80
80
|
|
81
|
+
### Chaining
|
82
|
+
|
83
|
+
If you opt-in to chaining `require 'commande/chain'`, you can create a call chain that chains multiple `Commande`. The
|
84
|
+
only limitation is that you can _only_ use named arguments. This is to ensure breakage on unexpected output, name
|
85
|
+
mismatches and collisions.
|
86
|
+
|
87
|
+
```ruby
|
88
|
+
require 'command'
|
89
|
+
require 'command/chain'
|
90
|
+
|
91
|
+
class StartCommand
|
92
|
+
include Commande
|
93
|
+
|
94
|
+
output :foo, :baz
|
95
|
+
|
96
|
+
def valid?(test:)
|
97
|
+
error! 'test must at least be 3' if test < 3
|
98
|
+
|
99
|
+
true
|
100
|
+
end
|
101
|
+
|
102
|
+
def call(test:)
|
103
|
+
self.foo = 'foo' * test
|
104
|
+
self.not_an_output = 'not_an_output'
|
105
|
+
end
|
106
|
+
|
107
|
+
private
|
108
|
+
|
109
|
+
attr_accessor :foo, :baz, :not_an_output
|
110
|
+
end
|
111
|
+
|
112
|
+
class SecondCommand
|
113
|
+
include Commande
|
114
|
+
|
115
|
+
output :result
|
116
|
+
|
117
|
+
def call(foo:, **_opts)
|
118
|
+
self.result = foo
|
119
|
+
end
|
120
|
+
|
121
|
+
private
|
122
|
+
|
123
|
+
attr_accessor :result
|
124
|
+
end
|
125
|
+
|
126
|
+
chained = Chain.new(StartCommand, SecondCommand).call(test: 3)
|
127
|
+
# => result is successful, and output matches `SecondCommand`
|
128
|
+
chained.chain_result.result
|
129
|
+
# => 'foofoofoo'
|
130
|
+
|
131
|
+
boomed = Chain.new(StartCommand, SecondCommand).call(test: 2)
|
132
|
+
# => boomed has failed, and output matches nil
|
133
|
+
boomed.error
|
134
|
+
# => 'test must at least be 3'
|
135
|
+
```
|
81
136
|
## Testing
|
82
137
|
|
83
138
|
There are some `Minitest` assertions included in this library.
|
data/commande.gemspec
CHANGED
@@ -1,44 +1,44 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
lib = File.expand_path('lib', __dir__)
|
4
|
-
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
-
require 'commande/version'
|
6
|
-
|
7
|
-
Gem::Specification.new do |spec|
|
8
|
-
spec.name = 'commande'
|
9
|
-
spec.version = Commande::VERSION
|
10
|
-
spec.authors = ['Derk-Jan Karrenbeld']
|
11
|
-
spec.email = ['derk-jan+github@karrenbeld.info']
|
12
|
-
|
13
|
-
spec.summary = 'Allows for Command pattern style POROs'
|
14
|
-
spec.license = 'MIT'
|
15
|
-
|
16
|
-
spec.metadata = {
|
17
|
-
'bug_tracker_uri' => 'https://github.com/SleeplessByte/command/issues',
|
18
|
-
'changelog_uri' => 'https://github.com/SleeplessByte/command/CHANGELOG.md',
|
19
|
-
'homepage_uri' => 'https://github.com/SleeplessByte/command',
|
20
|
-
'source_code_uri' => 'https://github.com/SleeplessByte/command'
|
21
|
-
}
|
22
|
-
|
23
|
-
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
24
|
-
# to allow pushing to a single host or delete this section to allow pushing to any host.
|
25
|
-
if spec.respond_to?(:metadata)
|
26
|
-
# spec.metadata['allowed_push_host'] = 'https://gems.sleeplessbyte.technology'
|
27
|
-
else
|
28
|
-
raise 'RubyGems 2.0 or newer is required to protect against ' \
|
29
|
-
'public gem pushes.'
|
30
|
-
end
|
31
|
-
|
32
|
-
# Specify which files should be added to the gem when it is released.
|
33
|
-
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
34
|
-
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
35
|
-
f.match(%r{^(test|spec|features)/})
|
36
|
-
end
|
37
|
-
spec.bindir = 'exe'
|
38
|
-
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
39
|
-
spec.require_paths = ['lib']
|
40
|
-
|
41
|
-
spec.add_development_dependency 'bundler', '~> 1.16'
|
42
|
-
spec.add_development_dependency 'minitest', '~> 5.0'
|
43
|
-
spec.add_development_dependency 'rake', '~>
|
44
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
lib = File.expand_path('lib', __dir__)
|
4
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
+
require 'commande/version'
|
6
|
+
|
7
|
+
Gem::Specification.new do |spec|
|
8
|
+
spec.name = 'commande'
|
9
|
+
spec.version = Commande::VERSION
|
10
|
+
spec.authors = ['Derk-Jan Karrenbeld']
|
11
|
+
spec.email = ['derk-jan+github@karrenbeld.info']
|
12
|
+
|
13
|
+
spec.summary = 'Allows for Command pattern style POROs'
|
14
|
+
spec.license = 'MIT'
|
15
|
+
|
16
|
+
spec.metadata = {
|
17
|
+
'bug_tracker_uri' => 'https://github.com/SleeplessByte/command/issues',
|
18
|
+
'changelog_uri' => 'https://github.com/SleeplessByte/command/CHANGELOG.md',
|
19
|
+
'homepage_uri' => 'https://github.com/SleeplessByte/command',
|
20
|
+
'source_code_uri' => 'https://github.com/SleeplessByte/command'
|
21
|
+
}
|
22
|
+
|
23
|
+
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
24
|
+
# to allow pushing to a single host or delete this section to allow pushing to any host.
|
25
|
+
if spec.respond_to?(:metadata)
|
26
|
+
# spec.metadata['allowed_push_host'] = 'https://gems.sleeplessbyte.technology'
|
27
|
+
else
|
28
|
+
raise 'RubyGems 2.0 or newer is required to protect against ' \
|
29
|
+
'public gem pushes.'
|
30
|
+
end
|
31
|
+
|
32
|
+
# Specify which files should be added to the gem when it is released.
|
33
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
34
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
35
|
+
f.match(%r{^(test|spec|features)/})
|
36
|
+
end
|
37
|
+
spec.bindir = 'exe'
|
38
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
39
|
+
spec.require_paths = ['lib']
|
40
|
+
|
41
|
+
spec.add_development_dependency 'bundler', '~> 1.16'
|
42
|
+
spec.add_development_dependency 'minitest', '~> 5.0'
|
43
|
+
spec.add_development_dependency 'rake', '~> 12.3'
|
44
|
+
end
|
data/lib/command/minitest.rb
CHANGED
@@ -0,0 +1,51 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Commande
|
4
|
+
class Chain
|
5
|
+
include Commande
|
6
|
+
|
7
|
+
output :chain_result
|
8
|
+
|
9
|
+
def initialize(*commands)
|
10
|
+
self.commands = commands
|
11
|
+
end
|
12
|
+
|
13
|
+
def chain(*commands)
|
14
|
+
new(*self.commands, *commands)
|
15
|
+
end
|
16
|
+
|
17
|
+
def valid(**_args)
|
18
|
+
error! 'needs at least one command' if commands.empty?
|
19
|
+
|
20
|
+
true
|
21
|
+
end
|
22
|
+
|
23
|
+
def call(**args)
|
24
|
+
self.chain_result = commands.inject(InitialCommandResult.new(args)) do |last_result, current_command|
|
25
|
+
current_result = current_command.call(**last_result.payload.dup)
|
26
|
+
|
27
|
+
transfer_logs current_result
|
28
|
+
transfer_errors current_result
|
29
|
+
|
30
|
+
fail! unless transfer_success? current_result
|
31
|
+
current_result
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
attr_accessor :commands, :chain_result
|
38
|
+
|
39
|
+
class InitialCommandResult
|
40
|
+
def initialize(**args)
|
41
|
+
self.payload = args
|
42
|
+
end
|
43
|
+
|
44
|
+
attr_reader :payload
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
attr_writer :payload
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
data/lib/commande/version.rb
CHANGED
data/lib/commande.rb
CHANGED
@@ -360,7 +360,7 @@ module Commande
|
|
360
360
|
source.valid? && source.persisted?
|
361
361
|
end
|
362
362
|
|
363
|
-
def transfer_errors(source, header:)
|
363
|
+
def transfer_errors(source, header: nil)
|
364
364
|
errors = source.errors
|
365
365
|
errors = source.errors.full_messages if errors.respond_to?(:full_messages)
|
366
366
|
Array(errors).each do |e|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: commande
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Derk-Jan Karrenbeld
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-02-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '12.3'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '12.3'
|
55
55
|
description:
|
56
56
|
email:
|
57
57
|
- derk-jan+github@karrenbeld.info
|
@@ -72,11 +72,13 @@ files:
|
|
72
72
|
- bin/setup
|
73
73
|
- commande.gemspec
|
74
74
|
- lib/command.rb
|
75
|
+
- lib/command/chain.rb
|
75
76
|
- lib/command/minitest.rb
|
76
77
|
- lib/command/minitest/assertions/assert_successful.rb
|
77
78
|
- lib/command/minitest/assertions/assert_valid.rb
|
78
79
|
- lib/command/minitest/assertions/assert_with_error.rb
|
79
80
|
- lib/commande.rb
|
81
|
+
- lib/commande/chain.rb
|
80
82
|
- lib/commande/minitest.rb
|
81
83
|
- lib/commande/minitest/assertions/assert_successful.rb
|
82
84
|
- lib/commande/minitest/assertions/assert_valid.rb
|
@@ -106,7 +108,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
106
108
|
version: '0'
|
107
109
|
requirements: []
|
108
110
|
rubyforge_project:
|
109
|
-
rubygems_version: 2.
|
111
|
+
rubygems_version: 2.7.8
|
110
112
|
signing_key:
|
111
113
|
specification_version: 4
|
112
114
|
summary: Allows for Command pattern style POROs
|