teckel 0.7.0 → 0.9.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.
@@ -11,8 +11,8 @@ module Teckel
11
11
  # @param klass [Class] The +input+ class
12
12
  # @return [Class] The +input+ class
13
13
  def input(klass = nil)
14
- @config.for(:input, klass) { self::Input if const_defined?(:Input) } ||
15
- raise(Teckel::MissingConfigError, "Missing input config for #{self}")
14
+ @config.get_or_set(:input, klass) { self::Input if const_defined?(:Input) } ||
15
+ raise(MissingConfigError, "Missing input config for #{self}")
16
16
  end
17
17
 
18
18
  # @overload input_constructor()
@@ -57,8 +57,7 @@ module Teckel
57
57
  #
58
58
  # MyOperation.input_constructor.is_a?(Proc) #=> true
59
59
  def input_constructor(sym_or_proc = nil)
60
- get_set_constructor(:input_constructor, input, sym_or_proc) ||
61
- raise(MissingConfigError, "Missing input_constructor config for #{self}")
60
+ get_or_set_constructor(:input_constructor, input, sym_or_proc)
62
61
  end
63
62
 
64
63
  # @overload output()
@@ -71,8 +70,8 @@ module Teckel
71
70
  # @param klass [Class] The +output+ class
72
71
  # @return [Class] The +output+ class
73
72
  def output(klass = nil)
74
- @config.for(:output, klass) { self::Output if const_defined?(:Output) } ||
75
- raise(Teckel::MissingConfigError, "Missing output config for #{self}")
73
+ @config.get_or_set(:output, klass) { self::Output if const_defined?(:Output) } ||
74
+ raise(MissingConfigError, "Missing output config for #{self}")
76
75
  end
77
76
 
78
77
  # @overload output_constructor()
@@ -103,8 +102,7 @@ module Teckel
103
102
  # output_constructor ->(name, options) { Output.new(name: name, **options) }
104
103
  # end
105
104
  def output_constructor(sym_or_proc = nil)
106
- get_set_constructor(:output_constructor, output, sym_or_proc) ||
107
- raise(MissingConfigError, "Missing output_constructor config for #{self}")
105
+ get_or_set_constructor(:output_constructor, output, sym_or_proc)
108
106
  end
109
107
 
110
108
  # @overload error()
@@ -116,8 +114,8 @@ module Teckel
116
114
  # @param klass [Class] The +error+ class
117
115
  # @return [Class,nil] The +error+ class or +nil+ if it does not error
118
116
  def error(klass = nil)
119
- @config.for(:error, klass) { self::Error if const_defined?(:Error) } ||
120
- raise(Teckel::MissingConfigError, "Missing error config for #{self}")
117
+ @config.get_or_set(:error, klass) { self::Error if const_defined?(:Error) } ||
118
+ raise(MissingConfigError, "Missing error config for #{self}")
121
119
  end
122
120
 
123
121
  # @overload error_constructor()
@@ -148,8 +146,7 @@ module Teckel
148
146
  # error_constructor ->(name, options) { Error.new(name: name, **options) }
149
147
  # end
150
148
  def error_constructor(sym_or_proc = nil)
151
- get_set_constructor(:error_constructor, error, sym_or_proc) ||
152
- raise(MissingConfigError, "Missing error_constructor config for #{self}")
149
+ get_or_set_constructor(:error_constructor, error, sym_or_proc)
153
150
  end
154
151
 
155
152
  # @!endgroup
@@ -163,7 +160,7 @@ module Teckel
163
160
  # @param klass [Class] The +settings+ class
164
161
  # @return [Class] The +settings+ class configured
165
162
  def settings(klass = nil)
166
- @config.for(:settings, klass) { const_defined?(:Settings) ? self::Settings : none }
163
+ @config.get_or_set(:settings, klass) { const_defined?(:Settings) ? self::Settings : none }
167
164
  end
168
165
 
169
166
  # @overload settings_constructor()
@@ -190,7 +187,7 @@ module Teckel
190
187
  # settings_constructor :new
191
188
  # end
192
189
  def settings_constructor(sym_or_proc = nil)
193
- get_set_constructor(:settings_constructor, settings, sym_or_proc) ||
190
+ get_or_set_constructor(:settings_constructor, settings, sym_or_proc) ||
194
191
  raise(MissingConfigError, "Missing settings_constructor config for #{self}")
195
192
  end
196
193
 
@@ -219,22 +216,20 @@ module Teckel
219
216
  #
220
217
  # (Like calling +MyOperation.with(arg1, arg2, ...)+)
221
218
  def default_settings!(*args)
222
- callable =
223
- if args.empty?
224
- -> { settings_constructor.call }
225
- elsif args.length == 1
226
- build_constructor(settings, args.first)
227
- end
219
+ callable = if args.size.equal?(1)
220
+ build_constructor(settings, args.first)
221
+ end
228
222
 
229
223
  callable ||= -> { settings_constructor.call(*args) }
230
224
 
231
- @config.for(:default_settings, callable)
225
+ @config.get_or_set(:default_settings, callable)
232
226
  end
233
227
 
234
228
  # Getter for configured default settings
235
- # @return [nil|#call] The callable constructor
229
+ # @return [NilClass]
230
+ # @return [#call] The callable constructor
236
231
  def default_settings
237
- @config.for(:default_settings)
232
+ @config.get_or_set(:default_settings)
238
233
  end
239
234
 
240
235
  # @overload runner()
@@ -246,12 +241,12 @@ module Teckel
246
241
  # @param klass [Class] A class like the {Runner}
247
242
  # @!visibility protected
248
243
  def runner(klass = nil)
249
- @config.for(:runner, klass) { Teckel::Operation::Runner }
244
+ @config.get_or_set(:runner, klass) { Runner }
250
245
  end
251
246
 
252
247
  # @overload result()
253
248
  # Get the configured result object class wrapping {error} or {output}.
254
- # The {ValueResult} default will act as a pass-through and does. Any error
249
+ # The {ValueResult} default will act as a pass-through. Any error
255
250
  # or output will just returned as-is.
256
251
  # @return [Class] The +result+ class, or {ValueResult} as default
257
252
  #
@@ -260,9 +255,12 @@ module Teckel
260
255
  # @param klass [Class] The +result+ class
261
256
  # @return [Class] The +result+ class configured
262
257
  def result(klass = nil)
263
- @config.for(:result, klass) { const_defined?(:Result, false) ? self::Result : ValueResult }
258
+ @config.get_or_set(:result, klass) { const_defined?(:Result, false) ? self::Result : ValueResult }
264
259
  end
265
260
 
261
+ # @param sym_or_proc [Symbol,Proc,NilClass]
262
+ # @return [#call]
263
+ #
266
264
  # @overload result_constructor()
267
265
  # The callable constructor to build an instance of the +result+ class.
268
266
  # Defaults to {Teckel::DEFAULT_CONSTRUCTOR}
@@ -288,7 +286,7 @@ module Teckel
288
286
  # result_constructor ->(value, success) { result.new(value, success, {foo: :bar}) }
289
287
  # end
290
288
  def result_constructor(sym_or_proc = nil)
291
- get_set_constructor(:result_constructor, result, sym_or_proc) ||
289
+ get_or_set_constructor(:result_constructor, result, sym_or_proc) ||
292
290
  raise(MissingConfigError, "Missing result_constructor config for #{self}")
293
291
  end
294
292
 
@@ -299,14 +297,15 @@ module Teckel
299
297
  #
300
298
  # @!visibility protected
301
299
  # @note Don't use in conjunction with {result} or {result_constructor}
302
- # @return [nil]
300
+ # @return [void]
303
301
  def result!
304
- @config.for(:result, Teckel::Operation::Result)
305
- @config.for(:result_constructor, Teckel::Operation::Result.method(:new))
302
+ @config.get_or_set(:result, Result)
303
+ @config.get_or_set(:result_constructor, Result.method(:new))
306
304
  nil
307
305
  end
308
306
 
309
307
  # @!visibility private
308
+ # @return [Array<Symbol>]
310
309
  REQUIRED_CONFIGS = %i[
311
310
  input input_constructor
312
311
  output output_constructor
@@ -340,9 +339,7 @@ module Teckel
340
339
  # @return [self]
341
340
  # @!visibility public
342
341
  def dup
343
- super.tap do |copy|
344
- copy.instance_variable_set(:@config, @config.dup)
345
- end
342
+ dup_config(super()) # standard:disable Style/SuperArguments
346
343
  end
347
344
 
348
345
  # Produces a clone of this operation and all it's configuration
@@ -351,18 +348,24 @@ module Teckel
351
348
  # @!visibility public
352
349
  def clone
353
350
  if frozen?
354
- super
351
+ super() # standard:disable Style/SuperArguments
355
352
  else
356
- super.tap do |copy|
357
- copy.instance_variable_set(:@config, @config.dup)
358
- end
353
+ dup_config(super()) # standard:disable Style/SuperArguments
359
354
  end
360
355
  end
361
356
 
357
+ # Prevents further modifications to this operation and its config
358
+ #
359
+ # @return [self]
360
+ # @!visibility public
361
+ def freeze
362
+ @config.freeze
363
+ super() # standard:disable Style/SuperArguments
364
+ end
365
+
362
366
  # @!visibility private
363
367
  def inherited(subclass)
364
- subclass.instance_variable_set(:@config, @config.dup)
365
- super subclass
368
+ super(dup_config(subclass))
366
369
  end
367
370
 
368
371
  # @!visibility private
@@ -374,21 +377,25 @@ module Teckel
374
377
  end
375
378
  end
376
379
 
377
- private
380
+ private def dup_config(other_class)
381
+ other_class.instance_variable_set(:@config, @config.dup)
382
+ other_class
383
+ end
378
384
 
379
- def get_set_constructor(name, on, sym_or_proc)
380
- constructor = build_constructor(on, sym_or_proc) unless sym_or_proc.nil?
385
+ private def get_or_set_constructor(name, on, sym_or_proc)
386
+ constructor = build_constructor(on, sym_or_proc)
381
387
 
382
- @config.for(name, constructor) {
383
- build_constructor(on, Teckel::DEFAULT_CONSTRUCTOR)
388
+ @config.get_or_set(name, constructor) {
389
+ build_constructor(on, DEFAULT_CONSTRUCTOR)
384
390
  }
385
391
  end
386
392
 
387
- def build_constructor(on, sym_or_proc)
388
- if sym_or_proc.is_a?(Symbol) && on.respond_to?(sym_or_proc)
389
- on.public_method(sym_or_proc)
390
- elsif sym_or_proc.respond_to?(:call)
393
+ private def build_constructor(on, sym_or_proc)
394
+ case sym_or_proc
395
+ when Proc
391
396
  sym_or_proc
397
+ when Symbol
398
+ on.public_method(sym_or_proc) if on.respond_to?(sym_or_proc)
392
399
  end
393
400
  end
394
401
  end
@@ -38,40 +38,40 @@ module Teckel
38
38
  include Teckel::Result
39
39
 
40
40
  # @param value [Object] The result value
41
- # @param success [Boolean] whether this is a successful result
42
- def initialize(value, success)
41
+ # @param successful [Boolean] whether this is a successful result
42
+ def initialize(value, successful)
43
43
  @value = value
44
- @success = (!!success).freeze
44
+ @successful = successful
45
45
  end
46
46
 
47
47
  # Whether this is a success result
48
48
  # @return [Boolean]
49
49
  def successful?
50
- @success
50
+ @successful
51
51
  end
52
52
 
53
53
  # @!attribute [r] value
54
- # @return [Mixed] the value/payload
54
+ # @return [Object] the value/payload
55
55
  attr_reader :value
56
56
 
57
57
  # Get the error/failure value
58
- # @yield [Mixed] If a block is given and this is not a failure result, the value is yielded to the block
59
- # @param default [Mixed] return this default value if it's not a failure result
60
- # @return [Mixed] the value/payload
58
+ # @yield [Object] If a block is given and this is not a failure result, the value is yielded to the block
59
+ # @param default [Object] return this default value if it's not a failure result
60
+ # @return [Object] the value/payload
61
61
  def failure(default = nil, &block)
62
- return @value unless @success
63
- return yield(@value) if block
62
+ return value unless @successful
63
+ return yield(value) if block
64
64
 
65
65
  default
66
66
  end
67
67
 
68
68
  # Get the success value
69
- # @yield [Mixed] If a block is given and this is not a success result, the value is yielded to the block
70
- # @param default [Mixed] return this default value if it's not a success result
71
- # @return [Mixed] the value/payload
69
+ # @yield [Object] If a block is given and this is not a success result, the value is yielded to the block
70
+ # @param default [Object] return this default value if it's not a success result
71
+ # @return [Object] the value/payload
72
72
  def success(default = nil, &block)
73
- return @value if @success
74
- return yield(@value) if block
73
+ return value if @successful
74
+ return yield(value) if block
75
75
 
76
76
  default
77
77
  end
@@ -85,7 +85,7 @@ module Teckel
85
85
  value
86
86
  end
87
87
 
88
- alias :new :[]
88
+ alias_method :new, :[]
89
89
  end
90
90
  end
91
91
  end
@@ -8,7 +8,7 @@ module Teckel
8
8
  # @!visibility protected
9
9
  class Runner
10
10
  # @!visibility private
11
- UNDEFINED = Object.new.freeze
11
+ UNDEFINED = Teckel::UNDEFINED
12
12
 
13
13
  def initialize(operation, settings = UNDEFINED)
14
14
  @operation, @settings = operation, settings
@@ -29,7 +29,7 @@ module Teckel
29
29
 
30
30
  op = operation.new
31
31
  op.runner = self
32
- op.settings = settings if settings != UNDEFINED
32
+ op.settings = settings unless settings.eql?(UNDEFINED)
33
33
 
34
34
  @instance = op
35
35
  end
@@ -37,7 +37,7 @@ module Teckel
37
37
  # This is just here to raise a meaningful error.
38
38
  # @!visibility private
39
39
  def with(*)
40
- raise Teckel::Error, "Operation already has settings assigned."
40
+ raise Error, "Operation already has settings assigned."
41
41
  end
42
42
 
43
43
  # Halt any further execution with a output value
@@ -46,7 +46,7 @@ module Teckel
46
46
  # @!visibility protected
47
47
  def success!(*args)
48
48
  value =
49
- if args.size == 1 && operation.output === args.first # rubocop:disable Style/CaseEquality
49
+ if args.size.equal?(1) && operation.output === args.first # rubocop:disable Style/CaseEquality
50
50
  args.first
51
51
  else
52
52
  operation.output_constructor.call(*args)
@@ -61,7 +61,7 @@ module Teckel
61
61
  # @!visibility protected
62
62
  def fail!(*args)
63
63
  value =
64
- if args.size == 1 && operation.error === args.first # rubocop:disable Style/CaseEquality
64
+ if args.size.equal?(1) && operation.error === args.first # rubocop:disable Style/CaseEquality
65
65
  args.first
66
66
  else
67
67
  operation.error_constructor.call(*args)
@@ -58,29 +58,26 @@ module Teckel
58
58
  # @!visibility public
59
59
  module Operation
60
60
  module ClassMethods
61
+ # @!visibility private
62
+ UNDEFINED = Teckel::UNDEFINED
63
+
61
64
  # Invoke the Operation
62
65
  #
63
- # @param input Any form of input your {Teckel::Operation::Config#input input} class can handle via the given
66
+ # @param input [Object,nil] Any form of input your {Teckel::Operation::Config#input input} class can handle via the given
64
67
  # {Teckel::Operation::Config#input_constructor input_constructor}
65
68
  # @return Either An instance of your defined {Teckel::Operation::Config#error error} class or
66
69
  # {Teckel::Operation::Config#output output} class
67
70
  # @!visibility public
68
71
  def call(input = nil)
69
- default_settings = self.default_settings
70
-
71
- if default_settings
72
- runner.new(self, default_settings.call)
73
- else
74
- runner.new(self)
75
- end.call(input)
72
+ runable.call(input)
76
73
  end
77
74
 
78
- # Provide {InstanceMethods#settings() settings} to the running operation.
75
+ # Provide {InstanceMethods#settings() settings} to the operation.
79
76
  #
80
77
  # This method is intended to be called on the operation class outside of
81
- # it's definition, prior to running {#call}.
78
+ # it's definition, prior to invoking {#call}.
82
79
  #
83
- # @param input Any form of input your {Teckel::Operation::Config#settings settings} class can handle via the given
80
+ # @param settings Any form of settings your {Teckel::Operation::Config#settings settings} class can handle via the given
84
81
  # {Teckel::Operation::Config#settings_constructor settings_constructor}
85
82
  # @return [Class] The configured {Teckel::Operation::Config#runner runner}
86
83
  # @!visibility public
@@ -111,10 +108,30 @@ module Teckel
111
108
  # MyOperation.with(false).call
112
109
  # MyOperation.call
113
110
  # LOG #=> []
114
- def with(input)
115
- runner.new(self, settings_constructor.call(input))
111
+ def with(settings)
112
+ runable(settings_constructor.call(settings))
113
+ end
114
+ alias_method :set, :with
115
+
116
+ # Constructs a Runner instance for {call} and {with}.
117
+ #
118
+ # @note This method is public to make testing, stubbing and mocking easier.
119
+ # Your normal application code should use {with} and/or {call}
120
+ #
121
+ # @param settings Optional. Any form of settings your
122
+ # {Teckel::Operation::Config#settings settings} class can handle via the
123
+ # given {Teckel::Operation::Config#settings_constructor settings_constructor}
124
+ # @return [Class] The configured {Teckel::Operation::Config#runner runner}
125
+ # @!visibility public
126
+ def runable(settings = UNDEFINED)
127
+ if settings != UNDEFINED
128
+ runner.new(self, settings)
129
+ elsif default_settings
130
+ runner.new(self, default_settings.call)
131
+ else
132
+ runner.new(self)
133
+ end
116
134
  end
117
- alias :set :with
118
135
 
119
136
  # Convenience method for setting {Teckel::Operation::Config#input input},
120
137
  # {Teckel::Operation::Config#output output} or
@@ -145,7 +162,7 @@ module Teckel
145
162
  #
146
163
  # MyOperation.call #=> nil
147
164
  def none
148
- Teckel::Contracts::None
165
+ Contracts::None
149
166
  end
150
167
  end
151
168
 
@@ -187,9 +204,11 @@ module Teckel
187
204
  end
188
205
 
189
206
  def self.included(receiver)
190
- receiver.extend Config
191
- receiver.extend ClassMethods
192
- receiver.send :include, InstanceMethods
207
+ receiver.class_eval do
208
+ extend Config
209
+ extend ClassMethods
210
+ include InstanceMethods
211
+ end
193
212
  end
194
213
  end
195
214
  end
data/lib/teckel/result.rb CHANGED
@@ -37,7 +37,7 @@ module Teckel
37
37
  end
38
38
 
39
39
  # @!attribute [r] value
40
- # @return [Mixed] the value/payload
40
+ # @return [Object] the value/payload
41
41
  def value
42
42
  raise NotImplementedError, "Result object does not implement `value`"
43
43
  end
@@ -55,8 +55,10 @@ module Teckel
55
55
  end
56
56
 
57
57
  def self.included(receiver)
58
- receiver.extend ClassMethods
59
- receiver.send :include, InstanceMethods
58
+ receiver.class_eval do
59
+ extend ClassMethods
60
+ include InstanceMethods
61
+ end
60
62
  end
61
63
  end
62
64
  end
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Teckel
4
- VERSION = "0.7.0"
4
+ # @return [String]
5
+ VERSION = "0.9.0"
5
6
  end
data/lib/teckel.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "teckel/version"
3
+ require_relative "teckel/version"
4
4
 
5
5
  module Teckel
6
6
  # Base error class for this lib
@@ -13,6 +13,9 @@ module Teckel
13
13
  class MissingConfigError < Teckel::Error; end
14
14
 
15
15
  DEFAULT_CONSTRUCTOR = :[]
16
+
17
+ # @!visibility private
18
+ UNDEFINED = Object.new.freeze
16
19
  end
17
20
 
18
21
  require_relative "teckel/config"
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: teckel
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robert Schulze
8
- autorequire:
9
8
  bindir: exe
10
9
  cert_chain: []
11
- date: 2021-01-03 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: bundler
@@ -52,6 +51,34 @@ dependencies:
52
51
  - - "~>"
53
52
  - !ruby/object:Gem::Version
54
53
  version: '3.0'
54
+ - !ruby/object:Gem::Dependency
55
+ name: mutant-rspec
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ type: :development
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ - !ruby/object:Gem::Dependency
69
+ name: standard
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ type: :development
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
55
82
  - !ruby/object:Gem::Dependency
56
83
  name: yard
57
84
  requirement: !ruby/object:Gem::Requirement
@@ -107,38 +134,15 @@ files:
107
134
  - lib/teckel/operation/runner.rb
108
135
  - lib/teckel/result.rb
109
136
  - lib/teckel/version.rb
110
- - spec/chain/around_hook_spec.rb
111
- - spec/chain/default_settings_spec.rb
112
- - spec/chain/inheritance_spec.rb
113
- - spec/chain/none_input_spec.rb
114
- - spec/chain/results_spec.rb
115
- - spec/chain_spec.rb
116
- - spec/config_spec.rb
117
- - spec/doctest_helper.rb
118
- - spec/operation/contract_trace_spec.rb
119
- - spec/operation/default_settings_spec.rb
120
- - spec/operation/fail_on_input_spec.rb
121
- - spec/operation/inheritance_spec.rb
122
- - spec/operation/result_spec.rb
123
- - spec/operation/results_spec.rb
124
- - spec/operation_spec.rb
125
- - spec/rb27/pattern_matching_spec.rb
126
- - spec/result_spec.rb
127
- - spec/spec_helper.rb
128
- - spec/support/dry_base.rb
129
- - spec/support/fake_db.rb
130
- - spec/support/fake_models.rb
131
- - spec/teckel_spec.rb
132
137
  homepage: https://github.com/fnordfish/teckel
133
138
  licenses:
134
139
  - Apache-2.0
135
140
  metadata:
136
- changelog_uri: https://github.com/fnordfish/teckel/blob/master/CHANGELOG.md
141
+ changelog_uri: https://github.com/fnordfish/teckel/blob/main/CHANGELOG.md
137
142
  source_code_uri: https://github.com/fnordfish/teckel
138
143
  bug_tracker_uri: https://github.com/fnordfish/teckel/issues
139
- documentation_uri: https://www.rubydoc.info/gems/teckel/0.7.0
144
+ documentation_uri: https://www.rubydoc.info/gems/teckel/0.9.0
140
145
  user_docs_uri: https://fnordfish.github.io/teckel/
141
- post_install_message:
142
146
  rdoc_options: []
143
147
  require_paths:
144
148
  - lib
@@ -153,30 +157,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
153
157
  - !ruby/object:Gem::Version
154
158
  version: '0'
155
159
  requirements: []
156
- rubygems_version: 3.2.3
157
- signing_key:
160
+ rubygems_version: 3.6.9
158
161
  specification_version: 4
159
162
  summary: Operations with enforced in/out/err data structures
160
- test_files:
161
- - spec/chain/around_hook_spec.rb
162
- - spec/chain/default_settings_spec.rb
163
- - spec/chain/inheritance_spec.rb
164
- - spec/chain/none_input_spec.rb
165
- - spec/chain/results_spec.rb
166
- - spec/chain_spec.rb
167
- - spec/config_spec.rb
168
- - spec/doctest_helper.rb
169
- - spec/operation/contract_trace_spec.rb
170
- - spec/operation/default_settings_spec.rb
171
- - spec/operation/fail_on_input_spec.rb
172
- - spec/operation/inheritance_spec.rb
173
- - spec/operation/result_spec.rb
174
- - spec/operation/results_spec.rb
175
- - spec/operation_spec.rb
176
- - spec/rb27/pattern_matching_spec.rb
177
- - spec/result_spec.rb
178
- - spec/spec_helper.rb
179
- - spec/support/dry_base.rb
180
- - spec/support/fake_db.rb
181
- - spec/support/fake_models.rb
182
- - spec/teckel_spec.rb
163
+ test_files: []