active_interaction 0.7.0 → 0.8.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: 4988ddb8d0259f53b92c2d8d81226902c0030d86
4
- data.tar.gz: 8e36ae7a40b895596de17a7b94a5e568354dd686
3
+ metadata.gz: 2f6687ab2fb463ecc05f0e785e9c05cf0b5d1172
4
+ data.tar.gz: d75174715db45471c960c5e1bb4effffb2ab9b7d
5
5
  SHA512:
6
- metadata.gz: 7af4c2ad4e2ae219859035746672c653318d7fbf9de7fe50f857c2518852cf6b78d92cbaf2161702c2c489f065f60a3af3bd2e8b9fbe205791b805cdd5b39975
7
- data.tar.gz: 6454349ce56378be4373257973c4ac710712299e963ebe165828eca0ef90d5b09f257c8ca6763ea5791f2217a95f3eac5253cd9ab7b5bc5fc8c31fc418275909
6
+ metadata.gz: 113199ae4863c2a7d78764179c9bd5caec7d516af78c921f1e788b5e9b1a2e251814b3e82786e790facc45d616f069e8a7b4e9e226a4d96b160e98e0c019e180
7
+ data.tar.gz: 5fefc55875416c15613c3edf28ca86d65996404ddb297037980360bab4f27a87bba7bad61b0eb6b9d51eaebce3fb337cee7234574b31a45d3b2356ec78514ef9
@@ -1,5 +1,9 @@
1
1
  # [Master][]
2
2
 
3
+ # [0.8.0][] (2013-11-14)
4
+
5
+ - Add ability to document interactions and filters.
6
+
3
7
  # [0.7.0][] (2013-11-14)
4
8
 
5
9
  - Add ability to chain a series of interactions together with
@@ -76,7 +80,8 @@
76
80
 
77
81
  - Initial release.
78
82
 
79
- [master]: https://github.com/orgsync/active_interaction/compare/v0.7.0...master
83
+ [master]: https://github.com/orgsync/active_interaction/compare/v0.8.0...master
84
+ [0.8.0]: https://github.com/orgsync/active_interaction/compare/v0.7.0...v0.8.0
80
85
  [0.7.0]: https://github.com/orgsync/active_interaction/compare/v0.6.1...v0.7.0
81
86
  [0.6.1]: https://github.com/orgsync/active_interaction/compare/v0.6.0...v0.6.1
82
87
  [0.6.0]: https://github.com/orgsync/active_interaction/compare/v0.5.0...v0.6.0
data/README.md CHANGED
@@ -25,7 +25,7 @@ This project uses [semantic versioning][].
25
25
  Add it to your Gemfile:
26
26
 
27
27
  ```ruby
28
- gem 'active_interaction', '~> 0.7.0'
28
+ gem 'active_interaction', '~> 0.8.0'
29
29
  ```
30
30
 
31
31
  And then execute:
@@ -2,10 +2,15 @@ require 'active_model'
2
2
 
3
3
  require 'active_interaction/version'
4
4
  require 'active_interaction/errors'
5
- require 'active_interaction/active_model'
6
- require 'active_interaction/method_missing'
7
- require 'active_interaction/overload_hash'
5
+
6
+ require 'active_interaction/modules/active_model'
7
+ require 'active_interaction/modules/core'
8
+ require 'active_interaction/modules/method_missing'
9
+ require 'active_interaction/modules/overload_hash'
10
+ require 'active_interaction/modules/validation'
11
+
8
12
  require 'active_interaction/filter'
13
+ require 'active_interaction/filters'
9
14
  require 'active_interaction/filters/abstract_date_time_filter'
10
15
  require 'active_interaction/filters/abstract_numeric_filter'
11
16
  require 'active_interaction/filters/array_filter'
@@ -20,9 +25,7 @@ require 'active_interaction/filters/model_filter'
20
25
  require 'active_interaction/filters/string_filter'
21
26
  require 'active_interaction/filters/symbol_filter'
22
27
  require 'active_interaction/filters/time_filter'
23
- require 'active_interaction/filters'
24
- require 'active_interaction/validation'
25
- require 'active_interaction/core'
28
+
26
29
  require 'active_interaction/base'
27
30
  require 'active_interaction/pipeline'
28
31
 
@@ -33,25 +33,15 @@ module ActiveInteraction
33
33
 
34
34
  validate :input_errors, :runtime_errors
35
35
 
36
- # Returns the inputs provided to {.run} or {.run!} after being cast based
37
- # on the filters in the class.
38
- #
39
- # @return [Hash{Symbol => Object}] All inputs passed to {.run} or {.run!}.
40
- #
41
- # @since 0.6.0
42
- def inputs
43
- self.class.filters.reduce({}) do |h, filter|
44
- h[filter.name] = send(filter.name)
45
- h
46
- end
47
- end
48
-
49
36
  # @param options [Hash{Symbol => Object}] Attribute values to set.
50
37
  #
51
38
  # @private
52
39
  def initialize(options = {})
53
- options = options.symbolize_keys
40
+ @_interaction_errors = Errors.new(self)
41
+ @_interaction_result = nil
42
+ @_interaction_runtime_errors = nil
54
43
 
44
+ options = options.symbolize_keys
55
45
  options.each do |key, value|
56
46
  if key.to_s.start_with?('_interaction_')
57
47
  raise InvalidValueError, key.inspect
@@ -68,6 +58,19 @@ module ActiveInteraction
68
58
  end
69
59
  end
70
60
 
61
+ # Returns the inputs provided to {.run} or {.run!} after being cast based
62
+ # on the filters in the class.
63
+ #
64
+ # @return [Hash{Symbol => Object}] All inputs passed to {.run} or {.run!}.
65
+ #
66
+ # @since 0.6.0
67
+ def inputs
68
+ self.class.filters.reduce({}) do |h, filter|
69
+ h[filter.name] = send(filter.name)
70
+ h
71
+ end
72
+ end
73
+
71
74
  # Runs the business logic associated with the interaction. The method is
72
75
  # only run when there are no validation errors. The return value is
73
76
  # placed into {#result}. This method must be overridden in the subclass.
@@ -86,17 +89,12 @@ module ActiveInteraction
86
89
  # @return [Nil] if there are validation errors.
87
90
  # @return [Object] if there are no validation errors.
88
91
  def result
89
- symbol = :'@_interaction_result'
90
- if instance_variable_defined?(symbol)
91
- instance_variable_get(symbol)
92
- else
93
- nil
94
- end
92
+ @_interaction_result
95
93
  end
96
94
 
97
95
  # @private
98
96
  def errors
99
- @_interaction_errors ||= Errors.new(self)
97
+ @_interaction_errors
100
98
  end
101
99
 
102
100
  # @private
@@ -164,7 +162,7 @@ module ActiveInteraction
164
162
  end
165
163
 
166
164
  def runtime_errors
167
- return unless instance_variable_defined?(:@_interaction_runtime_errors)
165
+ return unless @_interaction_runtime_errors
168
166
 
169
167
  @_interaction_runtime_errors.symbolic.each do |attribute, symbols|
170
168
  symbols.each { |symbol| errors.add_sym(attribute, symbol) }
@@ -6,6 +6,7 @@ module ActiveInteraction
6
6
  # @param options [Hash{Symbol => Object}]
7
7
  #
8
8
  # @option options [Object] :default fallback value if `nil` is given
9
+ # @option options [String] :desc human-readable description of this input
9
10
 
10
11
  # Describes an input filter for an interaction.
11
12
  #
@@ -164,6 +165,19 @@ module ActiveInteraction
164
165
  raise InvalidDefaultError, "#{name}: #{options[:default].inspect}"
165
166
  end
166
167
 
168
+ # Get the description.
169
+ #
170
+ # @example
171
+ # ActiveInteraction::Filter.new(:example, desc: 'description').desc
172
+ # # => "description"
173
+ #
174
+ # @return [String, nil] the description
175
+ #
176
+ # @since 0.8.0
177
+ def desc
178
+ options[:desc]
179
+ end
180
+
167
181
  # Tells if this filter has a default value.
168
182
  #
169
183
  # @example
@@ -9,6 +9,32 @@ module ActiveInteraction
9
9
  # @see Base
10
10
  # @see Pipeline
11
11
  module Core
12
+ # Get or set the description.
13
+ #
14
+ # @example
15
+ # core.desc
16
+ # # => nil
17
+ # core.desc('descriptive!')
18
+ # core.desc
19
+ # # => "descriptive!"
20
+ #
21
+ # @param desc [String, nil] what to set the description to
22
+ #
23
+ # @return [String, nil] the description
24
+ #
25
+ # @since 0.8.0
26
+ def desc(desc = nil)
27
+ if desc.nil?
28
+ unless instance_variable_defined?(:@_interaction_desc)
29
+ @_interaction_desc = nil
30
+ end
31
+ else
32
+ @_interaction_desc = desc
33
+ end
34
+
35
+ @_interaction_desc
36
+ end
37
+
12
38
  # Like {Base.run} except that it returns the value of {Base#execute} or
13
39
  # raises an exception if there were any validation errors.
14
40
  #
@@ -60,10 +60,11 @@ module ActiveInteraction
60
60
  # @raise [EmptyPipelineError] if nothing is in the pipeline
61
61
  def run(*args)
62
62
  raise EmptyPipelineError if @steps.empty?
63
+
63
64
  transaction do
64
65
  function, interaction = @steps.first
65
66
  outcome = interaction.run(function.call(*args))
66
- @steps[1..-1].reduce(outcome) { |o, (f, i)| bind(o, f, i) }
67
+ @steps.drop(1).reduce(outcome) { |o, (f, i)| bind(o, f, i) }
67
68
  end
68
69
  end
69
70
 
@@ -1,3 +1,3 @@
1
1
  module ActiveInteraction
2
- VERSION = Gem::Version.new('0.7.0')
2
+ VERSION = Gem::Version.new('0.8.0')
3
3
  end
@@ -1,33 +1,30 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe ActiveInteraction::ActiveModel do
4
- subject(:model) do
5
- Class.new do
6
- include ActiveInteraction::ActiveModel
7
- end
8
- end
4
+ let(:klass) { Class.new { include ActiveInteraction::ActiveModel } }
5
+ subject(:instance) { klass.new }
9
6
 
10
- describe '#new_record?' do
11
- it 'returns true' do
12
- expect(model.new).to be_new_record
7
+ describe '.i18n_scope' do
8
+ it 'returns the scope' do
9
+ expect(klass.i18n_scope).to eq :active_interaction
13
10
  end
14
11
  end
15
12
 
16
- describe '#persisted?' do
17
- it 'returns false' do
18
- expect(model.new).to_not be_persisted
13
+ describe '#i18n_scope' do
14
+ it 'returns the scope' do
15
+ expect(instance.i18n_scope).to eq :active_interaction
19
16
  end
20
17
  end
21
18
 
22
- describe '.i18n_scope' do
23
- it 'returns the scope' do
24
- expect(model.i18n_scope).to eq :active_interaction
19
+ describe '#new_record?' do
20
+ it 'returns true' do
21
+ expect(instance).to be_new_record
25
22
  end
26
23
  end
27
24
 
28
- describe '#i18n_scope' do
29
- it 'returns the scope' do
30
- expect(model.new.i18n_scope).to eq :active_interaction
25
+ describe '#persisted?' do
26
+ it 'returns false' do
27
+ expect(instance).to_not be_persisted
31
28
  end
32
29
  end
33
30
  end
@@ -1,13 +1,25 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe ActiveInteraction::Core do
4
- let(:model) do
5
- Class.new do
6
- include ActiveInteraction::Core
4
+ let(:klass) { Class.new { include ActiveInteraction::Core } }
5
+ subject(:instance) { klass.new }
6
+
7
+ describe '#desc' do
8
+ let(:desc) { SecureRandom.hex }
9
+
10
+ it 'returns nil' do
11
+ expect(instance.desc).to be_nil
7
12
  end
8
- end
9
13
 
10
- subject(:instance) { model.new }
14
+ it 'returns the description' do
15
+ expect(instance.desc(desc)).to eq desc
16
+ end
17
+
18
+ it 'saves the description' do
19
+ instance.desc(desc)
20
+ expect(instance.desc).to eq desc
21
+ end
22
+ end
11
23
 
12
24
  describe '#run!' do
13
25
  let(:errors) { double(full_messages: []) }
@@ -1,13 +1,8 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe ActiveInteraction::MethodMissing do
4
- let(:model) do
5
- Class.new do
6
- include ActiveInteraction::MethodMissing
7
- end
8
- end
9
-
10
- subject(:instance) { model.new }
4
+ let(:klass) { Class.new { include ActiveInteraction::MethodMissing } }
5
+ subject(:instance) { klass.new }
11
6
 
12
7
  describe '#method_missing' do
13
8
  context 'with invalid slug' do
@@ -16,7 +11,7 @@ describe ActiveInteraction::MethodMissing do
16
11
  it 'calls super' do
17
12
  expect {
18
13
  instance.method_missing(slug)
19
- }.to raise_error NoMethodError
14
+ }.to raise_error NameError
20
15
  end
21
16
  end
22
17
 
@@ -1,7 +1,8 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe ActiveInteraction::OverloadHash do
4
- subject { double.extend(described_class) }
4
+ let(:klass) { Class.new { include ActiveInteraction::OverloadHash } }
5
+ subject(:instance) { klass.new }
5
6
 
6
7
  describe '#hash(*args, &block)' do
7
8
  context 'with no arguments' do
@@ -153,6 +153,24 @@ shared_examples_for 'a filter' do
153
153
  end
154
154
  end
155
155
 
156
+ describe '#desc' do
157
+ it 'returns nil' do
158
+ expect(filter.desc).to be_nil
159
+ end
160
+
161
+ context 'with a description' do
162
+ let(:desc) { SecureRandom.hex }
163
+
164
+ before do
165
+ options.merge!(desc: desc)
166
+ end
167
+
168
+ it 'returns the description' do
169
+ expect(filter.desc).to eq desc
170
+ end
171
+ end
172
+ end
173
+
156
174
  describe '#filters' do
157
175
  it 'returns Filters' do
158
176
  expect(filter.filters).to be_an ActiveInteraction::Filters
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_interaction
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aaron Lasseigne
@@ -151,9 +151,7 @@ executables: []
151
151
  extensions: []
152
152
  extra_rdoc_files: []
153
153
  files:
154
- - lib/active_interaction/active_model.rb
155
154
  - lib/active_interaction/base.rb
156
- - lib/active_interaction/core.rb
157
155
  - lib/active_interaction/errors.rb
158
156
  - lib/active_interaction/filter.rb
159
157
  - lib/active_interaction/filters/abstract_date_time_filter.rb
@@ -171,15 +169,15 @@ files:
171
169
  - lib/active_interaction/filters/symbol_filter.rb
172
170
  - lib/active_interaction/filters/time_filter.rb
173
171
  - lib/active_interaction/filters.rb
174
- - lib/active_interaction/method_missing.rb
175
- - lib/active_interaction/overload_hash.rb
172
+ - lib/active_interaction/modules/active_model.rb
173
+ - lib/active_interaction/modules/core.rb
174
+ - lib/active_interaction/modules/method_missing.rb
175
+ - lib/active_interaction/modules/overload_hash.rb
176
+ - lib/active_interaction/modules/validation.rb
176
177
  - lib/active_interaction/pipeline.rb
177
- - lib/active_interaction/validation.rb
178
178
  - lib/active_interaction/version.rb
179
179
  - lib/active_interaction.rb
180
- - spec/active_interaction/active_model_spec.rb
181
180
  - spec/active_interaction/base_spec.rb
182
- - spec/active_interaction/core_spec.rb
183
181
  - spec/active_interaction/errors_spec.rb
184
182
  - spec/active_interaction/filter_spec.rb
185
183
  - spec/active_interaction/filters/array_filter_spec.rb
@@ -208,10 +206,12 @@ files:
208
206
  - spec/active_interaction/integration/string_interaction_spec.rb
209
207
  - spec/active_interaction/integration/symbol_interaction_spec.rb
210
208
  - spec/active_interaction/integration/time_interaction_spec.rb
211
- - spec/active_interaction/method_missing_spec.rb
212
- - spec/active_interaction/overload_hash_spec.rb
209
+ - spec/active_interaction/modules/active_model_spec.rb
210
+ - spec/active_interaction/modules/core_spec.rb
211
+ - spec/active_interaction/modules/method_missing_spec.rb
212
+ - spec/active_interaction/modules/overload_hash_spec.rb
213
+ - spec/active_interaction/modules/validation_spec.rb
213
214
  - spec/active_interaction/pipeline_spec.rb
214
- - spec/active_interaction/validation_spec.rb
215
215
  - spec/spec_helper.rb
216
216
  - spec/support/filters.rb
217
217
  - spec/support/interactions.rb
@@ -243,9 +243,7 @@ signing_key:
243
243
  specification_version: 4
244
244
  summary: Manage application specific business logic.
245
245
  test_files:
246
- - spec/active_interaction/active_model_spec.rb
247
246
  - spec/active_interaction/base_spec.rb
248
- - spec/active_interaction/core_spec.rb
249
247
  - spec/active_interaction/errors_spec.rb
250
248
  - spec/active_interaction/filter_spec.rb
251
249
  - spec/active_interaction/filters/array_filter_spec.rb
@@ -274,10 +272,12 @@ test_files:
274
272
  - spec/active_interaction/integration/string_interaction_spec.rb
275
273
  - spec/active_interaction/integration/symbol_interaction_spec.rb
276
274
  - spec/active_interaction/integration/time_interaction_spec.rb
277
- - spec/active_interaction/method_missing_spec.rb
278
- - spec/active_interaction/overload_hash_spec.rb
275
+ - spec/active_interaction/modules/active_model_spec.rb
276
+ - spec/active_interaction/modules/core_spec.rb
277
+ - spec/active_interaction/modules/method_missing_spec.rb
278
+ - spec/active_interaction/modules/overload_hash_spec.rb
279
+ - spec/active_interaction/modules/validation_spec.rb
279
280
  - spec/active_interaction/pipeline_spec.rb
280
- - spec/active_interaction/validation_spec.rb
281
281
  - spec/spec_helper.rb
282
282
  - spec/support/filters.rb
283
283
  - spec/support/interactions.rb