operatic 0.3.0 → 0.5.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3d2d761cb5faa5c2c3033b701c7a716390cdefba8ebf2c13bbd20086375c81ff
4
- data.tar.gz: 854bfdfc81e9c54866dc70f1c8773d11a664648e20d3bb33bab2a5fd4ca093fd
3
+ metadata.gz: 79842e69c42fad058cef240224911da273e0b801b51762bb4edc062590b1db1c
4
+ data.tar.gz: d3262c93d6332c3833b3688425f09d1168bc961fc084b67bcaa148f2700ff60c
5
5
  SHA512:
6
- metadata.gz: cd7219716eaf92d39c26a9bd7072a90eb45a3d95c86fc784c2c94de6645b4bd1c3b7dc8fb7d802fafd59db93532b96cb3ee4f5a93cd1e4a30973146244fd165e
7
- data.tar.gz: 139a4f9bf2cddaec695fed7095b6460aa2b3cf5433980e327a05fa0ebeddedab7d53df934c07fe5c835eb57f935d2c5153fdc5e6c3cdd2bd5a22e630c86097a9
6
+ metadata.gz: 212c3d737d571164069bacb305fe196008cbf27d1b81e440c230025715032a84c5df6e1dd2d2d6dc3a9073a5a9ebf010dff712e2f1577b68564f0d0d9594ca33
7
+ data.tar.gz: 42d76bcf9a9e5ecef9ebb9e22d5eaa1378ed93bbbc164ac589acf134803b250c2ba8c6b461ef74e6927c6794d78c791d58811316c76ad6bc66fc0f44692326a2
@@ -1,6 +1,6 @@
1
1
  name: Ruby
2
2
 
3
- on: [push]
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.x'
12
- - '2.6.x'
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@v1
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 CHANGED
@@ -1,5 +1,19 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## Version 0.5.0 - 2022-06-23
4
+
5
+ - Support custom initialize method to aid compatibility with other libraries. <https://github.com/benpickles/operatic/pull/11>
6
+ - Rename to `Operatic.result_attr` to be more specific about its functionality. <https://github.com/benpickles/operatic/pull/10>
7
+ - Get and set Result data with `#[]` / `#[]=`. <https://github.com/benpickles/operatic/pull/9>
8
+
9
+ ## Version 0.4.0 - 2022-05-25
10
+
11
+ - Switch to keyword arguments. <https://github.com/benpickles/operatic/pull/8>
12
+
13
+ ## Version 0.3.1 - 2020-01-05
14
+
15
+ - Less specific Rake dependency. <https://github.com/benpickles/operatic/pull/6>
16
+
3
17
  ## Version 0.3.0 - 2019-11-27
4
18
 
5
19
  - Implement `#to_h` not `#to_hash`. <https://github.com/benpickles/operatic/pull/4>
data/README.md CHANGED
@@ -24,7 +24,7 @@ class SayHello
24
24
  attr_reader :name
25
25
 
26
26
  # Declare convenience accessors on the result.
27
- result :message
27
+ result_attr :message
28
28
 
29
29
  def call
30
30
  # Exit the method and mark the result as a failure.
@@ -36,15 +36,17 @@ class SayHello
36
36
  end
37
37
 
38
38
  result = SayHello.call(name: 'Dave')
39
- result.success? # => true
40
- result.message # => "Hello Dave"
41
- result.to_h # => {:message=>"Hello Dave"}
39
+ result.success? # => true
40
+ result.message # => "Hello Dave"
41
+ result[:message] # => "Hello Dave"
42
+ result.to_h # => {:message=>"Hello Dave"}
42
43
 
43
44
  result = SayHello.call
44
- result.failure? # => true
45
- result.success? # => false
46
- result.message # => nil
47
- result.to_h # => {}
45
+ result.failure? # => true
46
+ result.success? # => false
47
+ result.message # => nil
48
+ result[:message] # => nil
49
+ result.to_h # => {}
48
50
  ```
49
51
 
50
52
  A Rails controller might use Operatic like this:
@@ -1,10 +1,10 @@
1
1
  module Operatic
2
2
  class Result
3
3
  # Generate a subclass of {Result} with named +attrs+ accessors. This
4
- # wouldn't normally be called directly, see {ClassMethods#result} for
4
+ # wouldn't normally be called directly, see {ClassMethods#result_attr} for
5
5
  # example usage.
6
6
  #
7
- # @param attrs [Array<Symbol>] a list of accessors to the result's data.
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,23 @@ module Operatic
24
24
  @success = true
25
25
  end
26
26
 
27
- # Mark the result as a failure, optionally attach data, and freeze the
28
- # object so it cannot be modified further.
29
- #
30
- # *Note*: After calling this method calling {#success!} or {#failure!}
31
- # again will raise a +FrozenError+.
27
+ # Read data that's attached to the result.
28
+ def [](key)
29
+ @data[key]
30
+ end
31
+
32
+ # Set data on the result.
33
+ def []=(key, value)
34
+ @data[key] = value
35
+ end
36
+
37
+ # Mark the result as a failure, optionally attach +data+ via kwargs, and
38
+ # freeze the object so it cannot be modified further.
32
39
  #
33
- # @param data [Hash<Symbol, anything>] an optional hash of data to attach
34
- # to the result.
35
- def failure!(data = nil)
36
- set_data(data) if data
40
+ # *Note*: Calling {#success!} or {#failure!} more than once will raise a
41
+ # +FrozenError+.
42
+ def failure!(**data)
43
+ set_data(**data)
37
44
  @success = false
38
45
  freeze
39
46
  end
@@ -47,20 +54,17 @@ module Operatic
47
54
  super
48
55
  end
49
56
 
50
- # Mark the result as a success, optionally attach data, and freeze the
51
- # object so it cannot be modified further.
57
+ # Mark the result as a success, optionally attach +data+ via kwargs, and
58
+ # freeze the object so it cannot be modified further.
52
59
  #
53
- # Calling this is not strictly necessary as a result defaults to being a
60
+ # Calling this is not strictly necessary as a +Result+ defaults to being a
54
61
  # success, but it's a convenient means of attaching data and of indicating
55
62
  # intent in the consuming code.
56
63
  #
57
- # *Note*: After calling this method calling {#success!} or {#failure!}
58
- # again will raise a +FrozenError+.
59
- #
60
- # @param data [Hash<Symbol, anything>] an optional hash of data to attach
61
- # to the result.
62
- def success!(data = nil)
63
- set_data(data) if data
64
+ # *Note*: Calling {#success!} or {#failure!} more than once will raise a
65
+ # +FrozenError+.
66
+ def success!(**data)
67
+ set_data(**data)
64
68
  @success = true
65
69
  freeze
66
70
  end
@@ -72,13 +76,13 @@ module Operatic
72
76
  # Returns the full (frozen) hash of data attached to the result via
73
77
  # {#success!}, {#failure!}, or convenience accessors added with {.generate}.
74
78
  #
75
- # @return [Hash]
79
+ # @return [Hash<Symbol, anything>]
76
80
  def to_h
77
81
  @data
78
82
  end
79
83
 
80
84
  private
81
- def set_data(data)
85
+ def set_data(**data)
82
86
  data.each do |key, value|
83
87
  @data[key] = value
84
88
  end
@@ -1,3 +1,3 @@
1
1
  module Operatic
2
- VERSION = '0.3.0'
2
+ VERSION = '0.5.0'
3
3
  end
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+ and calls {Operatic#call}
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
- # @param attrs [Hash<Symbol, anything>] an optional hash of key/values to
18
- # to the result. The class must have corresponding +attr_reader+s
19
- #
20
- # @return a [Result]
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 = nil)
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
@@ -45,7 +42,7 @@ module Operatic
45
42
  #
46
43
  # attr_reader :name
47
44
  #
48
- # result :message
45
+ # result_attr :message
49
46
  #
50
47
  # def call
51
48
  # success!(message: "Hello #{name}")
@@ -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
- def result(*args)
59
- @result_class = Result.generate(*args)
55
+ #
56
+ # @param attrs [Array<Symbol>] a list of convenience data accessors to
57
+ # define on the {Result}.
58
+ def result_attr(*attrs)
59
+ @result_class = Result.generate(*attrs)
60
60
  end
61
61
 
62
62
  def result_class
@@ -64,22 +64,16 @@ module Operatic
64
64
  end
65
65
  end
66
66
 
67
- # An instance of {Result} or a subclass generated by {ClassMethods#result}.
68
- #
69
- # @return [Result]
70
- attr_reader :result
71
-
72
- def initialize(attrs = nil)
73
- @result = self.class.result_class.new
74
-
67
+ def initialize(**attrs)
75
68
  attrs.each do |key, value|
76
69
  instance_variable_set("@#{key}", value)
77
- end if attrs
70
+ end
78
71
  end
79
72
 
80
73
  # Override this method with your implementation. Use {#success!} or
81
74
  # {#failure!} methods to communicate the {#result}'s status and to attach
82
- # data it. Define convenience result accessors with {ClassMethods#result}.
75
+ # data to it. Define convenience result accessors with
76
+ # {ClassMethods#result_attr}.
83
77
  #
84
78
  # @example
85
79
  # class SayHello
@@ -87,6 +81,8 @@ module Operatic
87
81
  #
88
82
  # attr_reader :name
89
83
  #
84
+ # result_attr :message
85
+ #
90
86
  # def call
91
87
  # return failure! unless name
92
88
  # success!(message: "Hello #{name}")
@@ -94,23 +90,34 @@ module Operatic
94
90
  # end
95
91
  #
96
92
  # result = SayHello.call(name: 'Dave')
93
+ # result.failure? # => false
97
94
  # result.success? # => true
95
+ # result.message # => "Hello Dave"
98
96
  # result.to_h # => {:message=>"Hello Dave"}
99
97
  #
100
98
  # result = SayHello.call
101
99
  # result.failure? # => true
102
100
  # result.success? # => false
101
+ # result.message # => nil
103
102
  # result.to_h # => {}
104
103
  def call
105
104
  end
106
105
 
107
106
  # Convenience shortcut to the operation's {Result#failure!}.
108
- def failure!(data = nil)
109
- result.failure!(data)
107
+ def failure!(**data)
108
+ result.failure!(**data)
109
+ end
110
+
111
+ # An instance of {Result} or a subclass generated by
112
+ # {ClassMethods#result_attr}.
113
+ #
114
+ # @return [Result]
115
+ def result
116
+ @result ||= self.class.result_class.new
110
117
  end
111
118
 
112
119
  # Convenience shortcut to the operation's {Result#success!}.
113
- def success!(data = nil)
114
- result.success!(data)
120
+ def success!(**data)
121
+ result.success!(**data)
115
122
  end
116
123
  end
data/operatic.gemspec CHANGED
@@ -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', '~> 10.0'
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.3.0
4
+ version: 0.5.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: 2019-11-27 00:00:00.000000000 Z
11
+ date: 2022-06-23 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: '10.0'
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: '10.0'
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -82,7 +82,7 @@ metadata:
82
82
  changelog_uri: https://github.com/benpickles/operatic/blob/master/CHANGELOG.md
83
83
  documentation_uri: https://rubydoc.info/gems/operatic
84
84
  source_code_uri: https://github.com/benpickles/operatic
85
- post_install_message:
85
+ post_install_message:
86
86
  rdoc_options: []
87
87
  require_paths:
88
88
  - lib
@@ -97,8 +97,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
97
97
  - !ruby/object:Gem::Version
98
98
  version: '0'
99
99
  requirements: []
100
- rubygems_version: 3.0.3
101
- signing_key:
100
+ rubygems_version: 3.3.7
101
+ signing_key:
102
102
  specification_version: 4
103
103
  summary: A minimal standard interface for your operations
104
104
  test_files: []