cuprum 0.1.0 → 0.2.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
  SHA1:
3
- metadata.gz: bea85b3d71780b913660e164e106f5d996c36218
4
- data.tar.gz: 256bcdf2ac7b383c060c812d004f8b45d491e907
3
+ metadata.gz: 457807ef9d8b39d6980467ad264972081f01b9ec
4
+ data.tar.gz: 92fedf44dfd331ef25e1429c8f35c2af7ede6180
5
5
  SHA512:
6
- metadata.gz: a0dbaddff3b7672ee4dc4cfd4ce06f27d958b2f816643aa2db13ee3704b8717e28f93c446130a104476bcda2991ac9963b2fc768b983a2d468cdc7b883545841
7
- data.tar.gz: 8a465d71bcb45eb32b7cfb60a26e09e91be3736b0346c7b60f786d99371c09d8fa913c6ae2c9ad817a62cb837b15fae4c24d1545a00f05cd0e9dfc6a697de4ff
6
+ metadata.gz: ef543f82ad31ce828f01d4bfea7805da392ea524f4477af24ca77cb80b77ad623d9439af35ef2f8f5ef6d25b119e03dec104b73db966e287f2ebfc8141ab70de
7
+ data.tar.gz: 73c642f2383e11273184ec3145ab61808cd80646bdf1687ca9abb94a439d3f9bfbc12fceb4806845c49ac7b91eda570997a2e2d669a2c566da5dbca88a9e4df4
data/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.2.0
4
+
5
+ The "Fully Armed and Operational" Update.
6
+
7
+ ### Operations
8
+
9
+ Implemented `Cuprum::Operation`. As a Function, but with an additional trick of tracking its own most recent execution result.
10
+
3
11
  ## 0.1.0
4
12
 
5
13
  Initial version.
data/DEVELOPMENT.md CHANGED
@@ -8,10 +8,6 @@
8
8
 
9
9
  - Chaining with #then, #else, etc.
10
10
 
11
- ## Operation
12
-
13
- - Wraps a function and tracks the last result object.
14
-
15
11
  ## Result
16
12
 
17
13
  - Force success or failure status with #success!, #failure! methods.
data/README.md CHANGED
@@ -104,6 +104,46 @@ In addition, the result object defines `#success?` and `#failure?` predicates. I
104
104
  result.failure? #=> true
105
105
  result.value #=> nil
106
106
 
107
+ ### Operations
108
+
109
+ An Operation is like a Function, but with an additional trick of tracking its own most recent execution result. This allows us to simplify some conditional logic, especially boilerplate code used to interact with frameworks.
110
+
111
+ class CreateBookOperation < Cuprum::Operation
112
+ def process
113
+ # Implementation here.
114
+ end # method process
115
+ end # class
116
+
117
+ def create
118
+ operation = CreateBookOperation.new.call(book_params)
119
+
120
+ if operation.success?
121
+ redirect_to(operation.value)
122
+ else
123
+ @book = operation.value
124
+
125
+ render :new
126
+ end # if-else
127
+ end # create
128
+
129
+ Like a Function, an Operation can be defined directly by passing an implementation block to the constructor or by creating a subclass that overwrites the #process method.
130
+
131
+ An operation inherits the `#call` method from Cuprum::Function (see above), and delegates the `#value`, `#errors`, `#success?`, and `#failure` methods to the most recent result (see below). If the operation has not been called, the operation will return default values.
132
+
133
+ In addition, an operation defines the following methods:
134
+
135
+ #### `#result`
136
+
137
+ The most recent result, from the previous time `#call` was executed for the operation.
138
+
139
+ #### `#called?`
140
+
141
+ True if the operation has been called and there is a result available by calling `#result` or one of the delegated methods, otherwise false.
142
+
143
+ #### `#reset!`
144
+
145
+ Clears the most recent result and resets `#called?` to false. This frees the result and any linked data for garbage collection. It also clears any internal state from the operation.
146
+
107
147
  ### Results
108
148
 
109
149
  A Cuprum::Result is a data object that encapsulates the result of calling a Cuprum function - the returned value, the success or failure status, and any errors generated by the function. It defines the following methods:
data/lib/cuprum.rb CHANGED
@@ -1,6 +1,10 @@
1
1
  # A lightweight, functional-lite toolkit for making business logic a first-class
2
2
  # citizen of your application.
3
3
  module Cuprum
4
+ autoload :Function, 'cuprum/function'
5
+ autoload :Operation, 'cuprum/operation'
6
+ autoload :Result, 'cuprum/result'
7
+
4
8
  # @return [String] The current version of the gem.
5
9
  def self.version
6
10
  VERSION
@@ -1,5 +1,3 @@
1
- # lib/cuprum/function.rb
2
-
3
1
  require 'cuprum/result'
4
2
 
5
3
  module Cuprum
@@ -0,0 +1,85 @@
1
+ require 'cuprum/function'
2
+
3
+ module Cuprum
4
+ # Functional object that with syntactic sugar for tracking the last result.
5
+ #
6
+ # An Operation is like a Function, but with an additional trick of tracking
7
+ # its own most recent execution result. This allows us to simplify some
8
+ # conditional logic, especially boilerplate code used to interact with
9
+ # frameworks.
10
+ #
11
+ # @example
12
+ # def create
13
+ # operation = CreateBookOperation.new.call(book_params)
14
+ #
15
+ # if operation.success?
16
+ # redirect_to(operation.value)
17
+ # else
18
+ # @book = operation.value
19
+ #
20
+ # render :new
21
+ # end # if-else
22
+ # end # create
23
+ #
24
+ # Like a Function, an Operation can be defined directly by passing an
25
+ # implementation block to the constructor or by creating a subclass that
26
+ # overwrites the #process method.
27
+ #
28
+ # @see Cuprum::Function
29
+ class Operation < Cuprum::Function
30
+ # @return [Cuprum::Result] The result from the most recent call of the
31
+ # operation.
32
+ attr_reader :result
33
+
34
+ # (see Cuprum::Function#call)
35
+ def call *args, &block
36
+ reset! if called? # Clear reference to most recent result.
37
+
38
+ @result = super
39
+ end # method call
40
+
41
+ # @return [Boolean] true if the operation has been called and has a
42
+ # reference to the most recent result; otherwise false.
43
+ def called?
44
+ !result.nil?
45
+ end # method called?
46
+
47
+ # @return [Array] the errors from the most recent result, or nil if the
48
+ # operation has not been called.
49
+ def errors
50
+ super || (called? ? result.errors : nil)
51
+ end # method errors
52
+
53
+ # @return [Boolean] true if the most recent result had errors, or false if
54
+ # the most recent result had no errors or if the operation has not been
55
+ # called.
56
+ def failure?
57
+ called? ? result.failure? : false
58
+ end # method success?
59
+
60
+ # Clears the reference to the most recent call of the operation, if any.
61
+ # This allows the result and any referenced data to be garbage collected.
62
+ # Use this method to clear any instance variables or state internal to the
63
+ # operation (an operation should never have external state apart from the
64
+ # last result).
65
+ #
66
+ # If the operation cannot be run more than once, this method should raise an
67
+ # error.
68
+ def reset!
69
+ @result = nil
70
+ end # method reset
71
+
72
+ # @return [Boolean] true if the most recent result had no errors, or false
73
+ # if the most recent result had errors or if the operation has not been
74
+ # called.
75
+ def success?
76
+ called? ? result.success? : false
77
+ end # method success?
78
+
79
+ # @return [Object] the value of the most recent result, or nil if the
80
+ # operation has not been called.
81
+ def value
82
+ called? ? result.value : nil
83
+ end # method value
84
+ end # class
85
+ end # module
@@ -8,7 +8,7 @@ module Cuprum
8
8
  # Major version.
9
9
  MAJOR = 0
10
10
  # Minor version.
11
- MINOR = 1
11
+ MINOR = 2
12
12
  # Patch version.
13
13
  PATCH = 0
14
14
  # Prerelease version.
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cuprum
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rob "Merlin" Smith
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-08-17 00:00:00.000000000 Z
11
+ date: 2017-08-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -28,16 +28,16 @@ dependencies:
28
28
  name: rspec-sleeping_king_studios
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 2.3.0
33
+ version: '2.3'
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: 2.3.0
40
+ version: '2.3'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rubocop
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -58,14 +58,14 @@ dependencies:
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 1.15.1
61
+ version: '1.15'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 1.15.1
68
+ version: '1.15'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: simplecov
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -94,6 +94,7 @@ files:
94
94
  - README.md
95
95
  - lib/cuprum.rb
96
96
  - lib/cuprum/function.rb
97
+ - lib/cuprum/operation.rb
97
98
  - lib/cuprum/result.rb
98
99
  - lib/cuprum/version.rb
99
100
  homepage: http://sleepingkingstudios.com