operatic 0.2.0 → 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 +4 -4
- data/.github/workflows/ruby.yml +10 -18
- data/CHANGELOG.md +17 -0
- data/README.md +4 -2
- data/lib/operatic/result.rb +19 -25
- data/lib/operatic/version.rb +1 -1
- data/lib/operatic.rb +26 -21
- data/operatic.gemspec +9 -9
- metadata +16 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: aeb2128119d4f471de6cd2ef4bc70e7d2a5ad73bf3a21867cbd8ead4d6e2a387
|
4
|
+
data.tar.gz: 53ba7951114c31a60a360f95c801b4900603daf010e9f8d4f8aeded22ea657db
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2f50a0a06fc96f281822f2ccc5696e2608d387b7720c49bf861f735a566e6d717fe90c3d57aed36ffcd09ddfebe9501c27d8e8cc7abfb7c1fb28c9e349a25972
|
7
|
+
data.tar.gz: f47a4fb2db7a8facc43235ae6bbd9d8c0f86e3a55c998a73666e360caee833227c1385a64b4c6b47212c41ecd640832f3248fc16f68db09745a75cf1ecce5c1f
|
data/.github/workflows/ruby.yml
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
name: Ruby
|
2
2
|
|
3
|
-
on:
|
3
|
+
on: push
|
4
4
|
|
5
5
|
jobs:
|
6
6
|
rspec:
|
@@ -8,24 +8,16 @@ jobs:
|
|
8
8
|
strategy:
|
9
9
|
matrix:
|
10
10
|
ruby:
|
11
|
-
- '2.5
|
12
|
-
- '2.6
|
13
|
-
|
11
|
+
- '2.5'
|
12
|
+
- '2.6'
|
13
|
+
- '2.7'
|
14
|
+
- '3.0'
|
15
|
+
- '3.1'
|
14
16
|
name: Ruby ${{ matrix.ruby }} RSpec
|
15
|
-
|
16
17
|
steps:
|
17
|
-
- uses: actions/checkout@
|
18
|
-
|
19
|
-
- name: Set up Ruby
|
20
|
-
uses: actions/setup-ruby@v1
|
18
|
+
- uses: actions/checkout@v2
|
19
|
+
- uses: ruby/setup-ruby@v1
|
21
20
|
with:
|
21
|
+
bundler-cache: true
|
22
22
|
ruby-version: ${{ matrix.ruby }}
|
23
|
-
|
24
|
-
- name: Install latest bundler
|
25
|
-
run: gem install bundler
|
26
|
-
|
27
|
-
- name: Install operatic dependencies
|
28
|
-
run: bundle install --jobs 4
|
29
|
-
|
30
|
-
- name: Run RSpec
|
31
|
-
run: bundle exec rspec
|
23
|
+
- run: bundle exec rspec
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# CHANGELOG
|
2
|
+
|
3
|
+
## Version 0.4.0 - 2022-05-25
|
4
|
+
|
5
|
+
- Switch to keyword arguments. <https://github.com/benpickles/operatic/pull/8>
|
6
|
+
|
7
|
+
## Version 0.3.1 - 2020-01-05
|
8
|
+
|
9
|
+
- Less specific Rake dependency. <https://github.com/benpickles/operatic/pull/6>
|
10
|
+
|
11
|
+
## Version 0.3.0 - 2019-11-27
|
12
|
+
|
13
|
+
- Implement `#to_h` not `#to_hash`. <https://github.com/benpickles/operatic/pull/4>
|
14
|
+
|
15
|
+
## Version 0.2.0 - 2019-11-23
|
16
|
+
|
17
|
+
First official version hosted on [RubyGems.org](https://rubygems.org/gems/operatic).
|
data/README.md
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
[](https://github.com/benpickles/operatic)
|
4
4
|
|
5
|
+
A minimal standard interface for your operations.
|
6
|
+
|
5
7
|
## Installation
|
6
8
|
|
7
9
|
Add Operatic to your application's Gemfile and run `bundle install`.
|
@@ -36,13 +38,13 @@ end
|
|
36
38
|
result = SayHello.call(name: 'Dave')
|
37
39
|
result.success? # => true
|
38
40
|
result.message # => "Hello Dave"
|
39
|
-
result.
|
41
|
+
result.to_h # => {:message=>"Hello Dave"}
|
40
42
|
|
41
43
|
result = SayHello.call
|
42
44
|
result.failure? # => true
|
43
45
|
result.success? # => false
|
44
46
|
result.message # => nil
|
45
|
-
result.
|
47
|
+
result.to_h # => {}
|
46
48
|
```
|
47
49
|
|
48
50
|
A Rails controller might use Operatic like this:
|
data/lib/operatic/result.rb
CHANGED
@@ -4,7 +4,7 @@ module Operatic
|
|
4
4
|
# wouldn't normally be called directly, see {ClassMethods#result} for
|
5
5
|
# example usage.
|
6
6
|
#
|
7
|
-
# @param attrs [Array<Symbol>] a list of
|
7
|
+
# @param attrs [Array<Symbol>] a list of convenience data accessors.
|
8
8
|
def self.generate(*attrs)
|
9
9
|
Class.new(self) do
|
10
10
|
attrs.each do |name|
|
@@ -24,16 +24,13 @@ module Operatic
|
|
24
24
|
@success = true
|
25
25
|
end
|
26
26
|
|
27
|
-
# Mark the result as a failure, optionally attach data, and
|
28
|
-
# object so it cannot be modified further.
|
27
|
+
# Mark the result as a failure, optionally attach +data+ via kwargs, and
|
28
|
+
# freeze the object so it cannot be modified further.
|
29
29
|
#
|
30
|
-
# *Note*:
|
31
|
-
#
|
32
|
-
|
33
|
-
|
34
|
-
# to the result.
|
35
|
-
def failure!(data = nil)
|
36
|
-
set_data(data) if data
|
30
|
+
# *Note*: Calling {#success!} or {#failure!} more than once will raise a
|
31
|
+
# +FrozenError+.
|
32
|
+
def failure!(**data)
|
33
|
+
set_data(**data)
|
37
34
|
@success = false
|
38
35
|
freeze
|
39
36
|
end
|
@@ -47,20 +44,17 @@ module Operatic
|
|
47
44
|
super
|
48
45
|
end
|
49
46
|
|
50
|
-
# Mark the result as a success, optionally attach data, and
|
51
|
-
# object so it cannot be modified further.
|
47
|
+
# Mark the result as a success, optionally attach +data+ via kwargs, and
|
48
|
+
# freeze the object so it cannot be modified further.
|
52
49
|
#
|
53
|
-
# Calling this is not strictly necessary as a
|
50
|
+
# Calling this is not strictly necessary as a +Result+ defaults to being a
|
54
51
|
# success, but it's a convenient means of attaching data and of indicating
|
55
52
|
# intent in the consuming code.
|
56
53
|
#
|
57
|
-
# *Note*:
|
58
|
-
#
|
59
|
-
|
60
|
-
|
61
|
-
# to the result.
|
62
|
-
def success!(data = nil)
|
63
|
-
set_data(data) if data
|
54
|
+
# *Note*: Calling {#success!} or {#failure!} more than once will raise a
|
55
|
+
# +FrozenError+.
|
56
|
+
def success!(**data)
|
57
|
+
set_data(**data)
|
64
58
|
@success = true
|
65
59
|
freeze
|
66
60
|
end
|
@@ -69,16 +63,16 @@ module Operatic
|
|
69
63
|
@success
|
70
64
|
end
|
71
65
|
|
72
|
-
# Returns the full hash of data attached to the result via
|
73
|
-
# {#failure!}, or convenience accessors added with {.generate}.
|
66
|
+
# Returns the full (frozen) hash of data attached to the result via
|
67
|
+
# {#success!}, {#failure!}, or convenience accessors added with {.generate}.
|
74
68
|
#
|
75
|
-
# @return [Hash]
|
76
|
-
def
|
69
|
+
# @return [Hash<Symbol, anything>]
|
70
|
+
def to_h
|
77
71
|
@data
|
78
72
|
end
|
79
73
|
|
80
74
|
private
|
81
|
-
def set_data(data)
|
75
|
+
def set_data(**data)
|
82
76
|
data.each do |key, value|
|
83
77
|
@data[key] = value
|
84
78
|
end
|
data/lib/operatic/version.rb
CHANGED
data/lib/operatic.rb
CHANGED
@@ -11,15 +11,12 @@ module Operatic
|
|
11
11
|
module ClassMethods
|
12
12
|
# The main way of calling an operation.
|
13
13
|
#
|
14
|
-
# The class is instantiated with supplied +attrs+
|
15
|
-
# returning a frozen {Result} instance.
|
14
|
+
# The class is instantiated with the supplied +attrs+ keyword arguments and
|
15
|
+
# calls {Operatic#call} returning a frozen {Result} instance.
|
16
16
|
#
|
17
|
-
# @
|
18
|
-
|
19
|
-
|
20
|
-
# @return a [Result] which is fro
|
21
|
-
def call(attrs = nil)
|
22
|
-
new(attrs)
|
17
|
+
# @return [Result]
|
18
|
+
def call(**attrs)
|
19
|
+
new(**attrs)
|
23
20
|
.tap(&:call)
|
24
21
|
.result
|
25
22
|
.freeze
|
@@ -30,8 +27,8 @@ module Operatic
|
|
30
27
|
# test setups, etc.
|
31
28
|
#
|
32
29
|
# @return [Result]
|
33
|
-
def call!(attrs
|
34
|
-
call(attrs).tap { |result|
|
30
|
+
def call!(**attrs)
|
31
|
+
call(**attrs).tap { |result|
|
35
32
|
raise FailureError if result.failure?
|
36
33
|
}
|
37
34
|
end
|
@@ -55,8 +52,11 @@ module Operatic
|
|
55
52
|
# result = SayHello.call(name: 'Dave')
|
56
53
|
# result.success? # => true
|
57
54
|
# result.message # => "Hello Dave"
|
58
|
-
|
59
|
-
|
55
|
+
#
|
56
|
+
# @param attrs [Array<Symbol>] a list of convenience data accessors to
|
57
|
+
# define on the {Result}.
|
58
|
+
def result(*attrs)
|
59
|
+
@result_class = Result.generate(*attrs)
|
60
60
|
end
|
61
61
|
|
62
62
|
def result_class
|
@@ -69,17 +69,17 @@ module Operatic
|
|
69
69
|
# @return [Result]
|
70
70
|
attr_reader :result
|
71
71
|
|
72
|
-
def initialize(attrs
|
72
|
+
def initialize(**attrs)
|
73
73
|
@result = self.class.result_class.new
|
74
74
|
|
75
75
|
attrs.each do |key, value|
|
76
76
|
instance_variable_set("@#{key}", value)
|
77
|
-
end
|
77
|
+
end
|
78
78
|
end
|
79
79
|
|
80
80
|
# Override this method with your implementation. Use {#success!} or
|
81
81
|
# {#failure!} methods to communicate the {#result}'s status and to attach
|
82
|
-
# data it. Define convenience result accessors with {ClassMethods#result}.
|
82
|
+
# data to it. Define convenience result accessors with {ClassMethods#result}.
|
83
83
|
#
|
84
84
|
# @example
|
85
85
|
# class SayHello
|
@@ -87,6 +87,8 @@ module Operatic
|
|
87
87
|
#
|
88
88
|
# attr_reader :name
|
89
89
|
#
|
90
|
+
# result :message
|
91
|
+
#
|
90
92
|
# def call
|
91
93
|
# return failure! unless name
|
92
94
|
# success!(message: "Hello #{name}")
|
@@ -94,23 +96,26 @@ module Operatic
|
|
94
96
|
# end
|
95
97
|
#
|
96
98
|
# result = SayHello.call(name: 'Dave')
|
99
|
+
# result.failure? # => false
|
97
100
|
# result.success? # => true
|
98
|
-
# result.
|
101
|
+
# result.message # => "Hello Dave"
|
102
|
+
# result.to_h # => {:message=>"Hello Dave"}
|
99
103
|
#
|
100
104
|
# result = SayHello.call
|
101
105
|
# result.failure? # => true
|
102
106
|
# result.success? # => false
|
103
|
-
# result.
|
107
|
+
# result.message # => nil
|
108
|
+
# result.to_h # => {}
|
104
109
|
def call
|
105
110
|
end
|
106
111
|
|
107
112
|
# Convenience shortcut to the operation's {Result#failure!}.
|
108
|
-
def failure!(data
|
109
|
-
result.failure!(data)
|
113
|
+
def failure!(**data)
|
114
|
+
result.failure!(**data)
|
110
115
|
end
|
111
116
|
|
112
117
|
# Convenience shortcut to the operation's {Result#success!}.
|
113
|
-
def success!(data
|
114
|
-
result.success!(data)
|
118
|
+
def success!(**data)
|
119
|
+
result.success!(**data)
|
115
120
|
end
|
116
121
|
end
|
data/operatic.gemspec
CHANGED
@@ -8,22 +8,22 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.authors = ['Ben Pickles']
|
9
9
|
spec.email = ['spideryoung@gmail.com']
|
10
10
|
|
11
|
-
spec.summary = '
|
12
|
-
spec.description =
|
11
|
+
spec.summary = 'A minimal standard interface for your operations'
|
12
|
+
spec.description = spec.summary
|
13
13
|
spec.homepage = 'https://github.com/benpickles/operatic'
|
14
14
|
spec.license = 'MIT'
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
16
|
+
spec.metadata = {
|
17
|
+
'changelog_uri' => 'https://github.com/benpickles/operatic/blob/master/CHANGELOG.md',
|
18
|
+
'documentation_uri' => 'https://rubydoc.info/gems/operatic',
|
19
|
+
'source_code_uri' => 'https://github.com/benpickles/operatic',
|
20
|
+
}
|
21
21
|
|
22
22
|
spec.required_ruby_version = '>= 2.5.0'
|
23
23
|
|
24
24
|
# Specify which files should be added to the gem when it is released.
|
25
25
|
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
26
|
-
spec.files = Dir.chdir(
|
26
|
+
spec.files = Dir.chdir(__dir__) do
|
27
27
|
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
28
28
|
end
|
29
29
|
spec.bindir = 'exe'
|
@@ -31,6 +31,6 @@ Gem::Specification.new do |spec|
|
|
31
31
|
spec.require_paths = ['lib']
|
32
32
|
|
33
33
|
spec.add_development_dependency 'bundler'
|
34
|
-
spec.add_development_dependency 'rake'
|
34
|
+
spec.add_development_dependency 'rake'
|
35
35
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
36
36
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: operatic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ben Pickles
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-05-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -28,16 +28,16 @@ dependencies:
|
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,7 +52,7 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '3.0'
|
55
|
-
description:
|
55
|
+
description: A minimal standard interface for your operations
|
56
56
|
email:
|
57
57
|
- spideryoung@gmail.com
|
58
58
|
executables: []
|
@@ -62,6 +62,7 @@ files:
|
|
62
62
|
- ".github/workflows/ruby.yml"
|
63
63
|
- ".gitignore"
|
64
64
|
- ".rspec"
|
65
|
+
- CHANGELOG.md
|
65
66
|
- CODE_OF_CONDUCT.md
|
66
67
|
- Gemfile
|
67
68
|
- LICENSE.txt
|
@@ -78,8 +79,10 @@ homepage: https://github.com/benpickles/operatic
|
|
78
79
|
licenses:
|
79
80
|
- MIT
|
80
81
|
metadata:
|
81
|
-
|
82
|
-
|
82
|
+
changelog_uri: https://github.com/benpickles/operatic/blob/master/CHANGELOG.md
|
83
|
+
documentation_uri: https://rubydoc.info/gems/operatic
|
84
|
+
source_code_uri: https://github.com/benpickles/operatic
|
85
|
+
post_install_message:
|
83
86
|
rdoc_options: []
|
84
87
|
require_paths:
|
85
88
|
- lib
|
@@ -94,8 +97,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
94
97
|
- !ruby/object:Gem::Version
|
95
98
|
version: '0'
|
96
99
|
requirements: []
|
97
|
-
rubygems_version: 3.
|
98
|
-
signing_key:
|
100
|
+
rubygems_version: 3.1.6
|
101
|
+
signing_key:
|
99
102
|
specification_version: 4
|
100
|
-
summary:
|
103
|
+
summary: A minimal standard interface for your operations
|
101
104
|
test_files: []
|