spicerack 0.25.8 → 0.26.0.3

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: afaac8e845d5f7e66aa9af978a299d7fbaf35da838835a5548221f0857036454
4
- data.tar.gz: 87687c5774201a62f0f1f9e0afc31564900917f2729ab9a0cca9f7d491ee3fae
3
+ metadata.gz: 546ee6c890ec2b885ba4684c0e9fcc00903e78c1f31107a6de80e9552c093961
4
+ data.tar.gz: 648e8860885c803a483305db6a9c816d5ae0aca04b92505b3e99c849f062ea90
5
5
  SHA512:
6
- metadata.gz: 3b6a85beebfee388ec90192f4822d6dee67e6c9b1284143ae3fd803f13ecf556d14e6cca506611e1892a780c1ddf0eab46cc8e3e2392f39c580680763f3a9eeb
7
- data.tar.gz: 1961e87e73b9e113d0086e8ce85345030ae813f4dee57bfcbddd327b9d5cbdb2625821f452a25feab994642d660a2176df37a32fc4a4c0ce47b3d1ac87dd390b
6
+ metadata.gz: '089bf3b9d51b749efc1ad1738701e9faabc336e9865cf85e04117de638654006becc7c37e4f44115261cabdb1a735935090ec16ce164b1aa1f0a436659039bf4'
7
+ data.tar.gz: 6d4142b22881259bbcbb6da0b8acab4dfdd8b2240156a24876fe8125802dcd9120e9280920ab11b729365ff791d24c8f606f08e094d36264ed1e893289ed8fda
data/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  This collection of gems will spice up your rails and kick your rubies up a notch. Bam!
4
4
 
5
5
  [![Gem Version](https://badge.fury.io/rb/spicerack.svg)](https://badge.fury.io/rb/spicerack)
6
- [![Build Status](https://semaphoreci.com/api/v1/freshly/spicerack/branches/master/badge.svg)](https://semaphoreci.com/freshly/spicerack)
6
+ [![Build Status](https://semaphoreci.com/api/v1/freshly/spicerack/branches/main/badge.svg)](https://semaphoreci.com/freshly/spicerack)
7
7
  [![Maintainability](https://api.codeclimate.com/v1/badges/7e089c2617c530a85b17/maintainability)](https://codeclimate.com/github/Freshly/spicerack/maintainability)
8
8
  [![Test Coverage](https://api.codeclimate.com/v1/badges/7e089c2617c530a85b17/test_coverage)](https://codeclimate.com/github/Freshly/spicerack/test_coverage)
9
9
 
@@ -106,7 +106,7 @@ Then in the base directory:
106
106
 
107
107
  Next, push the code up and open a new pull request.
108
108
 
109
- Once that gets merged into master, run:
109
+ Once that gets merged into main, run:
110
110
 
111
111
  - Run `rake spicerack:release_all` to claim the new gem name with the empty build
112
112
 
@@ -129,7 +129,7 @@ rake spicerack:release_all
129
129
 
130
130
  This will build and release all dependent gems at the same time.
131
131
 
132
- Only the master branch should be released!
132
+ Only the `main` branch should be released!
133
133
 
134
134
  ### Versions
135
135
 
data/lib/spicerack.rb CHANGED
@@ -6,10 +6,10 @@ require "active_support/core_ext/object/inclusion"
6
6
 
7
7
  require "spicerack/version"
8
8
 
9
- require "tablesalt"
10
-
11
9
  require "around_the_world"
12
10
  require "short_circu_it"
11
+ require "substance"
12
+ require "tablesalt"
13
13
  require "technologic"
14
14
 
15
15
  require "redis_hash"
@@ -17,13 +17,15 @@ require "redis_hash"
17
17
  require "spicerack/array_index"
18
18
  require "spicerack/hash_model"
19
19
  require "spicerack/redis_model"
20
- require "spicerack/root_object"
21
- require "spicerack/attribute_object"
22
- require "spicerack/input_object"
23
- require "spicerack/input_model"
24
- require "spicerack/output_object"
25
20
 
26
21
  module Spicerack
27
22
  class Error < StandardError; end
28
- class NotValidatedError < Error; end
23
+
24
+ include ActiveSupport::Deprecation::DeprecatedConstantAccessor
25
+
26
+ deprecate_constant "RootObject", "Substance::RootObject"
27
+ deprecate_constant "AttributeObject", "Substance::AttributeObject"
28
+ deprecate_constant "InputModel", "Substance::InputModel"
29
+ deprecate_constant "InputObject", "Substance::InputObject"
30
+ deprecate_constant "OutputObject", "Substance::OutputObject"
29
31
  end
@@ -2,9 +2,6 @@
2
2
 
3
3
  require "rspice"
4
4
  require "redis_hash/spec_helper"
5
+ require "substance/rspec"
5
6
  require "technologic/spec_helper"
6
7
  require "tablesalt/spec_helper"
7
-
8
- require_relative "rspec/custom_matchers"
9
- require_relative "rspec/shared_examples"
10
- require_relative "rspec/shoulda_matcher_helper"
@@ -2,5 +2,5 @@
2
2
 
3
3
  module Spicerack
4
4
  # This constant is managed by spicerack
5
- VERSION = "0.25.8"
5
+ VERSION = "0.26.0.3"
6
6
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spicerack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.25.8
4
+ version: 0.26.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eric Garside
@@ -12,7 +12,7 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2021-04-12 00:00:00.000000000 Z
15
+ date: 2021-05-04 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: around_the_world
@@ -20,70 +20,98 @@ dependencies:
20
20
  requirements:
21
21
  - - '='
22
22
  - !ruby/object:Gem::Version
23
- version: 0.25.8
23
+ version: 0.26.0.3
24
24
  type: :runtime
25
25
  prerelease: false
26
26
  version_requirements: !ruby/object:Gem::Requirement
27
27
  requirements:
28
28
  - - '='
29
29
  - !ruby/object:Gem::Version
30
- version: 0.25.8
30
+ version: 0.26.0.3
31
+ - !ruby/object:Gem::Dependency
32
+ name: directive
33
+ requirement: !ruby/object:Gem::Requirement
34
+ requirements:
35
+ - - '='
36
+ - !ruby/object:Gem::Version
37
+ version: 0.26.0.3
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ requirements:
42
+ - - '='
43
+ - !ruby/object:Gem::Version
44
+ version: 0.26.0.3
31
45
  - !ruby/object:Gem::Dependency
32
46
  name: redis_hash
33
47
  requirement: !ruby/object:Gem::Requirement
34
48
  requirements:
35
49
  - - '='
36
50
  - !ruby/object:Gem::Version
37
- version: 0.25.8
51
+ version: 0.26.0.3
38
52
  type: :runtime
39
53
  prerelease: false
40
54
  version_requirements: !ruby/object:Gem::Requirement
41
55
  requirements:
42
56
  - - '='
43
57
  - !ruby/object:Gem::Version
44
- version: 0.25.8
58
+ version: 0.26.0.3
45
59
  - !ruby/object:Gem::Dependency
46
60
  name: short_circu_it
47
61
  requirement: !ruby/object:Gem::Requirement
48
62
  requirements:
49
63
  - - '='
50
64
  - !ruby/object:Gem::Version
51
- version: 0.25.8
65
+ version: 0.26.0.3
66
+ type: :runtime
67
+ prerelease: false
68
+ version_requirements: !ruby/object:Gem::Requirement
69
+ requirements:
70
+ - - '='
71
+ - !ruby/object:Gem::Version
72
+ version: 0.26.0.3
73
+ - !ruby/object:Gem::Dependency
74
+ name: substance
75
+ requirement: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - '='
78
+ - !ruby/object:Gem::Version
79
+ version: 0.26.0.3
52
80
  type: :runtime
53
81
  prerelease: false
54
82
  version_requirements: !ruby/object:Gem::Requirement
55
83
  requirements:
56
84
  - - '='
57
85
  - !ruby/object:Gem::Version
58
- version: 0.25.8
86
+ version: 0.26.0.3
59
87
  - !ruby/object:Gem::Dependency
60
88
  name: technologic
61
89
  requirement: !ruby/object:Gem::Requirement
62
90
  requirements:
63
91
  - - '='
64
92
  - !ruby/object:Gem::Version
65
- version: 0.25.8
93
+ version: 0.26.0.3
66
94
  type: :runtime
67
95
  prerelease: false
68
96
  version_requirements: !ruby/object:Gem::Requirement
69
97
  requirements:
70
98
  - - '='
71
99
  - !ruby/object:Gem::Version
72
- version: 0.25.8
100
+ version: 0.26.0.3
73
101
  - !ruby/object:Gem::Dependency
74
102
  name: tablesalt
75
103
  requirement: !ruby/object:Gem::Requirement
76
104
  requirements:
77
105
  - - '='
78
106
  - !ruby/object:Gem::Version
79
- version: 0.25.8
107
+ version: 0.26.0.3
80
108
  type: :runtime
81
109
  prerelease: false
82
110
  version_requirements: !ruby/object:Gem::Requirement
83
111
  requirements:
84
112
  - - '='
85
113
  - !ruby/object:Gem::Version
86
- version: 0.25.8
114
+ version: 0.26.0.3
87
115
  - !ruby/object:Gem::Dependency
88
116
  name: bundler
89
117
  requirement: !ruby/object:Gem::Requirement
@@ -208,28 +236,28 @@ dependencies:
208
236
  requirements:
209
237
  - - '='
210
238
  - !ruby/object:Gem::Version
211
- version: 0.25.8
239
+ version: 0.26.0.3
212
240
  type: :development
213
241
  prerelease: false
214
242
  version_requirements: !ruby/object:Gem::Requirement
215
243
  requirements:
216
244
  - - '='
217
245
  - !ruby/object:Gem::Version
218
- version: 0.25.8
246
+ version: 0.26.0.3
219
247
  - !ruby/object:Gem::Dependency
220
248
  name: spicerack-styleguide
221
249
  requirement: !ruby/object:Gem::Requirement
222
250
  requirements:
223
251
  - - '='
224
252
  - !ruby/object:Gem::Version
225
- version: 0.25.8
253
+ version: 0.26.0.3
226
254
  type: :development
227
255
  prerelease: false
228
256
  version_requirements: !ruby/object:Gem::Requirement
229
257
  requirements:
230
258
  - - '='
231
259
  - !ruby/object:Gem::Version
232
- version: 0.25.8
260
+ version: 0.26.0.3
233
261
  - !ruby/object:Gem::Dependency
234
262
  name: will_paginate
235
263
  requirement: !ruby/object:Gem::Requirement
@@ -294,27 +322,8 @@ files:
294
322
  - README.md
295
323
  - lib/spicerack.rb
296
324
  - lib/spicerack/array_index.rb
297
- - lib/spicerack/attribute_object.rb
298
325
  - lib/spicerack/hash_model.rb
299
- - lib/spicerack/input_model.rb
300
- - lib/spicerack/input_object.rb
301
- - lib/spicerack/objects/arguments.rb
302
- - lib/spicerack/objects/attributes.rb
303
- - lib/spicerack/objects/defaults.rb
304
- - lib/spicerack/objects/options.rb
305
- - lib/spicerack/objects/output.rb
306
- - lib/spicerack/objects/status.rb
307
- - lib/spicerack/output_object.rb
308
326
  - lib/spicerack/redis_model.rb
309
- - lib/spicerack/root_object.rb
310
- - lib/spicerack/rspec/custom_matchers.rb
311
- - lib/spicerack/rspec/custom_matchers/define_argument.rb
312
- - lib/spicerack/rspec/custom_matchers/define_attribute.rb
313
- - lib/spicerack/rspec/custom_matchers/define_field.rb
314
- - lib/spicerack/rspec/custom_matchers/define_option.rb
315
- - lib/spicerack/rspec/shared_examples.rb
316
- - lib/spicerack/rspec/shared_examples/an_input_object_with_a_class_collection_attribute.rb
317
- - lib/spicerack/rspec/shoulda_matcher_helper.rb
318
327
  - lib/spicerack/spec_helper.rb
319
328
  - lib/spicerack/version.rb
320
329
  homepage: https://github.com/Freshly/spicerack
@@ -323,7 +332,7 @@ licenses:
323
332
  metadata:
324
333
  homepage_uri: https://github.com/Freshly/spicerack
325
334
  source_code_uri: https://github.com/Freshly/spicerack
326
- changelog_uri: https://github.com/Freshly/spicerack/blob/master/CHANGELOG.md
335
+ changelog_uri: https://github.com/Freshly/spicerack/blob/main/CHANGELOG.md
327
336
  documentation_uri: https://www.rubydoc.info/gems/spicerack
328
337
  post_install_message:
329
338
  rdoc_options: []
@@ -340,7 +349,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
340
349
  - !ruby/object:Gem::Version
341
350
  version: '0'
342
351
  requirements: []
343
- rubygems_version: 3.1.4
352
+ rubygems_version: 3.1.6
344
353
  signing_key:
345
354
  specification_version: 4
346
355
  summary: A suite of utility gems for Ruby on Rails.
@@ -1,11 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "objects/defaults"
4
- require_relative "objects/attributes"
5
-
6
- module Spicerack
7
- class AttributeObject < Spicerack::RootObject
8
- include Spicerack::Objects::Defaults
9
- include Spicerack::Objects::Attributes
10
- end
11
- end
@@ -1,12 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Spicerack
4
- class InputModel < InputObject
5
- extend ActiveModel::Naming
6
- extend ActiveModel::Translation
7
-
8
- include ActiveModel::Conversion
9
- include ActiveModel::Validations
10
- include ActiveModel::Validations::Callbacks
11
- end
12
- end
@@ -1,24 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "objects/arguments"
4
- require_relative "objects/options"
5
-
6
- module Spicerack
7
- class InputObject < Spicerack::AttributeObject
8
- define_callbacks :initialize
9
-
10
- include Spicerack::Objects::Arguments
11
- include Spicerack::Objects::Options
12
-
13
- def initialize(**input)
14
- @input = input
15
- run_callbacks(:initialize) do
16
- input.each { |key, value| __send__("#{key}=".to_sym, value) }
17
- end
18
- end
19
-
20
- private
21
-
22
- attr_reader :input
23
- end
24
- end
@@ -1,38 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Arguments describe input that is required (which can be nil, unless otherwise specified).
4
- module Spicerack
5
- module Objects
6
- module Arguments
7
- extend ActiveSupport::Concern
8
-
9
- included do
10
- class_attribute :_arguments, instance_writer: false, default: {}
11
- set_callback :initialize, :after do
12
- missing_arguments = _arguments.reject do |argument, options|
13
- options[:allow_nil] ? input.key?(argument) : !input[argument].nil?
14
- end
15
-
16
- missing = missing_arguments.keys
17
-
18
- raise ArgumentError, "Missing #{"argument".pluralize(missing.length)}: #{missing.join(", ")}" if missing.any?
19
- end
20
- end
21
-
22
- class_methods do
23
- def inherited(base)
24
- dup = _arguments.dup
25
- base._arguments = dup.each { |k, v| dup[k] = v.dup }
26
- super
27
- end
28
-
29
- private
30
-
31
- def argument(argument, allow_nil: true)
32
- _arguments[argument] = { allow_nil: allow_nil }
33
- define_attribute argument
34
- end
35
- end
36
- end
37
- end
38
- end
@@ -1,39 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Attributes are structured data within an object.
4
- module Spicerack
5
- module Objects
6
- module Attributes
7
- extend ActiveSupport::Concern
8
-
9
- included do
10
- class_attribute :_attributes, instance_writer: false, default: []
11
- end
12
-
13
- class_methods do
14
- def inherited(base)
15
- base._attributes = _attributes.dup
16
- super
17
- end
18
-
19
- private
20
-
21
- def define_attribute(attribute)
22
- _attributes << attribute
23
- attr_accessor attribute
24
- end
25
- alias_method :attribute, :define_attribute
26
- end
27
-
28
- def to_h
29
- _attributes.each_with_object({}) { |attr, hash| hash[attr] = public_send(attr) }
30
- end
31
-
32
- private
33
-
34
- def stringable_attributes
35
- self.class._attributes
36
- end
37
- end
38
- end
39
- end
@@ -1,40 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Defaults are used as the value when then attribute is unspecified.
4
- module Spicerack
5
- module Objects
6
- module Defaults
7
- extend ActiveSupport::Concern
8
-
9
- included do
10
- class_attribute :_defaults, instance_writer: false, default: {}
11
- end
12
-
13
- class_methods do
14
- def inherited(base)
15
- dup = _defaults.dup
16
- base._defaults = dup.each { |k, v| dup[k] = v.dup }
17
- super
18
- end
19
-
20
- private
21
-
22
- def define_default(attribute, static: nil, &block)
23
- _defaults[attribute] = Value.new(static: static, &block)
24
- end
25
- end
26
-
27
- class Value
28
- include Tablesalt::Isolation
29
-
30
- def initialize(static: nil, &block)
31
- @value = (static.nil? && block_given?) ? block : static
32
- end
33
-
34
- def value
35
- isolate(@value.respond_to?(:call) ? instance_eval(&@value) : @value)
36
- end
37
- end
38
- end
39
- end
40
- end
@@ -1,37 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Options describe input which may be provided to define or override default values.
4
- module Spicerack
5
- module Objects
6
- module Options
7
- extend ActiveSupport::Concern
8
-
9
- included do
10
- class_attribute :_options, instance_writer: false, default: []
11
-
12
- set_callback :initialize, :after do
13
- _options.each do |option|
14
- next unless _defaults.key?(option)
15
-
16
- public_send("#{option}=".to_sym, _defaults[option].value) if public_send(option).nil?
17
- end
18
- end
19
- end
20
-
21
- class_methods do
22
- def inherited(base)
23
- base._options = _options.dup
24
- super
25
- end
26
-
27
- private
28
-
29
- def option(option, default: nil, &block)
30
- _options << option
31
- define_attribute option
32
- define_default option, static: default, &block
33
- end
34
- end
35
- end
36
- end
37
- end
@@ -1,63 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Spicerack
4
- module Objects
5
- module Output
6
- extend ActiveSupport::Concern
7
-
8
- included do
9
- class_attribute :_outputs, instance_writer: false, default: []
10
-
11
- delegate :_outputs, to: :class
12
-
13
- after_validation do
14
- next unless validated?
15
-
16
- _outputs.each do |key|
17
- public_send("#{key}=".to_sym, _defaults[key].value) if _defaults.key?(key) && public_send(key).nil?
18
- end
19
- end
20
- end
21
-
22
- class_methods do
23
- def inherited(base)
24
- base._outputs = _outputs.dup
25
- super
26
- end
27
-
28
- private
29
-
30
- def output(output, default: nil, &block)
31
- _outputs << output
32
- define_attribute output
33
- define_default output, static: default, &block
34
- ensure_validation_before output
35
- ensure_validation_before "#{output}=".to_sym
36
- end
37
-
38
- def ensure_validation_before(method)
39
- around_method method do |*args, **opts|
40
- raise NotValidatedError unless validated?
41
-
42
- # TODO: replace with `super(...)` when <= 2.6 support is dropped
43
- if RUBY_VERSION < "2.7" && opts.blank?
44
- super(*args)
45
- else
46
- super(*args, **opts)
47
- end
48
- end
49
- end
50
- end
51
-
52
- def outputs
53
- return {} if _outputs.empty?
54
-
55
- output_struct.new(*_outputs.map(&method(:public_send)))
56
- end
57
-
58
- def output_struct
59
- Struct.new(*_outputs)
60
- end
61
- end
62
- end
63
- end
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Spicerack
4
- module Objects
5
- module Status
6
- extend ActiveSupport::Concern
7
-
8
- included do
9
- after_validation { self.was_validated = errors.empty? }
10
-
11
- private
12
-
13
- attr_accessor :was_validated
14
- end
15
-
16
- def validated?
17
- was_validated.present?
18
- end
19
- end
20
- end
21
- end
@@ -1,11 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "objects/status"
4
- require_relative "objects/output"
5
-
6
- module Spicerack
7
- class OutputObject < InputModel
8
- include Objects::Status
9
- include Objects::Output
10
- end
11
- end
@@ -1,24 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Spicerack
4
- class RootObject
5
- include ActiveSupport::Callbacks
6
- include ShortCircuIt
7
- include Technologic
8
- include Tablesalt::StringableObject
9
-
10
- class << self
11
- private
12
-
13
- def define_callbacks_with_handler(*events, handler: :on, filter: :after)
14
- define_callbacks(*events)
15
-
16
- events.each do |event|
17
- define_singleton_method("#{handler}_#{event}".to_sym) do |*filters, &block|
18
- set_callback(event, filter, *filters, &block)
19
- end
20
- end
21
- end
22
- end
23
- end
24
- end
@@ -1,6 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "custom_matchers/define_argument"
4
- require_relative "custom_matchers/define_attribute"
5
- require_relative "custom_matchers/define_field"
6
- require_relative "custom_matchers/define_option"
@@ -1,29 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # RSpec matcher that tests usage of `.argument`
4
- #
5
- # class Example < Spicerack::InputObject
6
- # argument :foo
7
- # argument :bar, allow_nil: false
8
- # end
9
- #
10
- # RSpec.describe Example, type: :input_object do
11
- # subject { described_class.new(**input) }
12
- #
13
- # let(:input) { {} }
14
- #
15
- # it { is_expected.to define_argument :foo }
16
- # it { is_expected.to define_argument :bar, allow_nil: false }
17
- # end
18
-
19
- RSpec::Matchers.define :define_argument do |argument, allow_nil: true|
20
- match { |instance| expect(instance._arguments[argument]).to eq(allow_nil: allow_nil) }
21
- description { "define argument #{argument}" }
22
- failure_message do
23
- "expected #{described_class} to define argument #{argument} #{prohibit_nil_description unless allow_nil}"
24
- end
25
-
26
- def prohibit_nil_description
27
- "and prohibit a nil value"
28
- end
29
- end
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # RSpec matcher that tests usage of `.attribute`
4
- #
5
- # class Example < Spicerack::InputObject
6
- # attribute :foo
7
- # end
8
- #
9
- # RSpec.describe Example, type: :input_object do
10
- # subject { described_class.new(**input) }
11
- #
12
- # let(:input) { {} }
13
- #
14
- # it { is_expected.to define_attribute :foo }
15
- # end
16
-
17
- RSpec::Matchers.define :define_attribute do |attribute|
18
- match { |instance| expect(instance._attributes).to include attribute }
19
- description { "define attribute #{attribute}" }
20
- failure_message { "expected #{described_class} to defines attribute #{attribute}" }
21
- end
@@ -1,43 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # RSpec matcher that tests usage of `.field`
4
- #
5
- # class Example < Spicerack::HashModel
6
- # field :foo, :datetime
7
- # field :bar, :integer
8
- # end
9
- #
10
- # RSpec.describe Example, type: :hash_model do
11
- # subject { described_class.new.tap { |model| model.data = data } }
12
- #
13
- # let(:data) { {} }
14
- #
15
- # it { is_expected.to define_field :foo, :datetime }
16
- # it { is_expected.to define_field :bar, :integer }
17
- # end
18
-
19
- RSpec::Matchers.define :define_field do |field, type = nil, default: nil|
20
- match do
21
- expect(test_subject.attribute_types[field.to_s].type).to eq type unless type.nil?
22
- expect(test_subject._default_attributes[field.to_s].value).to eq default unless default.nil?
23
- expect(test_subject._fields).to include field.to_s
24
- end
25
- description { "define field #{field}" }
26
- failure_message { "expected #{test_subject} to define field #{field} #{with_details(type, default)}" }
27
-
28
- def with_details(type, default)
29
- [ with_type(type), with_default(default) ].compact.join(" ")
30
- end
31
-
32
- def with_type(type)
33
- "of type #{type}" unless type.nil?
34
- end
35
-
36
- def with_default(default)
37
- "with default #{default}" unless default.nil?
38
- end
39
-
40
- def test_subject
41
- subject.is_a?(Class) ? subject : subject.class
42
- end
43
- end
@@ -1,34 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # RSpec matcher that tests usage of `.option`
4
- #
5
- # class Example < Spicerack::InputObject
6
- # option :foo
7
- # option :bar, default: :baz
8
- # option(:gaz) { :haz }
9
- # end
10
- #
11
- # RSpec.describe Example, type: :input_object do
12
- # subject { described_class.new(**input) }
13
- #
14
- # let(:input) { {} }
15
- #
16
- # it { is_expected.to define_option :foo }
17
- # it { is_expected.to define_option :bar, default: :baz }
18
- # it { is_expected.to define_option :gaz, default: :haz }
19
- # end
20
-
21
- RSpec::Matchers.define :define_option do |option, default: nil|
22
- match do |instance|
23
- expect(instance._defaults[option]&.value).to eq default
24
- expect(instance._options).to include option
25
- end
26
- description { "define option #{option}" }
27
- failure_message { "expected #{described_class} to define option #{option} #{for_default(default)}" }
28
-
29
- def for_default(default)
30
- return "without a default value" if default.nil?
31
-
32
- "with default value #{default}"
33
- end
34
- end
@@ -1,3 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "shared_examples/an_input_object_with_a_class_collection_attribute"
@@ -1,63 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.shared_examples_for "an input object with a class collection attribute" do |method, collection|
4
- subject(:define) { example_input_object_class.__send__(method, value) }
5
-
6
- let(:value) { Faker::Lorem.word.to_sym }
7
-
8
- before do
9
- allow(example_input_object_class).to receive(:define_default).and_call_original
10
- allow(example_input_object_class).to receive(:define_attribute).and_call_original
11
- end
12
-
13
- describe "defines value" do
14
- let(:default) { Faker::Lorem.word }
15
-
16
- shared_examples_for "an value is defined" do
17
- it "adds to _values" do
18
- expect { define }.to change { example_input_object_class.public_send(collection) }.from([]).to([ value ])
19
- end
20
- end
21
-
22
- context "when no block is given" do
23
- subject(:define) { example_input_object_class.__send__(method, value, default: default) }
24
-
25
- it_behaves_like "an value is defined"
26
-
27
- it "defines an static default" do
28
- define
29
- expect(example_input_object_class).to have_received(:define_default).with(value, static: default)
30
- end
31
- end
32
-
33
- context "when a block is given" do
34
- subject(:define) { example_input_object_class.__send__(method, value, default: default, &block) }
35
-
36
- let(:block) do
37
- ->(_) { :block }
38
- end
39
-
40
- shared_examples_for "values are handed off to define_default" do
41
- it "calls define_default" do
42
- define
43
- expect(example_input_object_class).to have_received(:define_default).with(value, static: default, &block)
44
- end
45
- end
46
-
47
- context "with a static default" do
48
- it_behaves_like "values are handed off to define_default"
49
- end
50
-
51
- context "without a static default" do
52
- let(:default) { nil }
53
-
54
- it_behaves_like "values are handed off to define_default"
55
- end
56
- end
57
- end
58
-
59
- it "defines an attribute" do
60
- define
61
- expect(example_input_object_class).to have_received(:define_attribute).with(value)
62
- end
63
- end
@@ -1,8 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- if defined?(Shoulda::Matchers::ActiveModel)
4
- RSpec.configure do |config|
5
- config.include(Shoulda::Matchers::ActiveModel, type: :input_object)
6
- config.include(Shoulda::Matchers::ActiveModel, type: :input_model)
7
- end
8
- end