spicerack 0.13.5 → 0.14.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: 68360e5269fe5fba490fbf357d063bf7b8c314806420595aaabeedd415a37bb9
4
- data.tar.gz: a1652d7650cde1e8b8f30208b89e70129e634b37718df0ce8292faa96b290af8
3
+ metadata.gz: a664105c1a345538f9e8c22264d854b877cd8b9353574694b9ad57edd558d1df
4
+ data.tar.gz: ef09c99c0590654caf6d9dbd6305b7815ba46722e96da7da2aa7cba069d70513
5
5
  SHA512:
6
- metadata.gz: 60b8b2c89f197b8a369f82fa2eb21f6a769587f05cd44ba38cdcda9d0a7f3521739bab39e479f2412fd8a3416919c113a91d4b994e1236dab4af20eb2d3620c7
7
- data.tar.gz: a1d50a8d024e1a5f23bd0b387114a135874ecce67d3c4cdb685cda2212f860be43b4538f3371c7f678ed33b6dac077e0ddb88184d7a99ff3b8f089efe00fbc1d
6
+ metadata.gz: 8e44013fced63365fdd9e477c1fc65499419c1f62a220fd9257e2eb801c6809a416add2a412676851c623c571010e573ba8bbc37fd36ef708c3bcaad8e64d73a
7
+ data.tar.gz: 32b262fd44dd16ed3d2f5e7c1c070d48845787343415ab835f2c4da0c187e99a9d0bad68afcd49fe77b946e796b958b85268420b48d609a7bd3ea5bd830b88d3
@@ -21,5 +21,6 @@ require "spicerack/root_object"
21
21
  require "spicerack/attribute_object"
22
22
  require "spicerack/input_object"
23
23
  require "spicerack/input_model"
24
+ require "spicerack/configurable"
24
25
 
25
26
  module Spicerack; end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "configurable/config_builder"
4
+ require_relative "configurable/reader"
5
+
6
+ # NOTE: This is still a pre-release feature! Use at your own risk - it may change before being released.
7
+ #
8
+ # A utility for creating read-only gem configuration singletons.
9
+ #
10
+ # Usage:
11
+ # # In your gem:
12
+ # module SomeGem
13
+ # module Configuration
14
+ # extend Spicerack::Configurable
15
+ #
16
+ # configuration_options do
17
+ # option :some_config_option
18
+ # option :some_option_with_a_default, default: "I probably know what's best"
19
+ # end
20
+ # end
21
+ # end
22
+ #
23
+ # # Then, in the application using the gem:
24
+ # SomeGem::Configuration.configure do |config|
25
+ # config.some_config_option = 12345
26
+ # config.some_option_with_a_default = "Nope, you really don't"
27
+ # end
28
+ #
29
+ # # Then, back in your gem code:
30
+ # puts Configuration.config.some_config_option
31
+ # => 12345
32
+ module Spicerack
33
+ module Configurable
34
+ delegate :configure, to: :_config_builder
35
+
36
+ def config
37
+ _config_builder.reader
38
+ end
39
+
40
+ private
41
+
42
+ def configuration_options(&block)
43
+ _config_builder.instance_exec(&block)
44
+ end
45
+
46
+ def _config_builder
47
+ @_config_builder ||= ConfigBuilder.new
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spicerack
4
+ module Configurable
5
+ class ConfigBuilder
6
+ def reader
7
+ @reader ||= Reader.new(configuration)
8
+ end
9
+
10
+ def configure
11
+ yield configuration
12
+ end
13
+
14
+ # NOTE: options must be set up before {#configure} is called
15
+ def option(*args)
16
+ config_class.__send__(:option, *args)
17
+ end
18
+
19
+ private
20
+
21
+ def configuration
22
+ @configuration ||= config_class.new
23
+ end
24
+
25
+ def config_class
26
+ @config_class ||= Class.new(InputObject)
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spicerack
4
+ module Configurable
5
+ class Reader
6
+ def initialize(config)
7
+ @config = config
8
+ end
9
+
10
+ private
11
+
12
+ attr_reader :config
13
+
14
+ def method_missing(method_name, *)
15
+ return config.public_send(method_name) if config._options.map(&:to_sym).include?(method_name.to_sym)
16
+
17
+ super
18
+ end
19
+
20
+ def respond_to_missing?(method_name, *)
21
+ config._options.map(&:to_sym).include?(method_name.to_sym) || super
22
+ end
23
+ end
24
+ end
25
+ end
@@ -4,3 +4,4 @@ require_relative "custom_matchers/define_argument"
4
4
  require_relative "custom_matchers/define_attribute"
5
5
  require_relative "custom_matchers/define_field"
6
6
  require_relative "custom_matchers/define_option"
7
+ require_relative "custom_matchers/define_config_option"
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ # RSpec matcher to test options of a Configurable class
4
+ #
5
+ # class ExampleConfiguration
6
+ # include Spicerack::Configurable
7
+ #
8
+ # option :foo
9
+ # option :bar, default: :baz
10
+ # end
11
+ #
12
+ # RSpec.describe ExampleConfiguration, type: :configuration do
13
+ # subject { described_class.new }
14
+ #
15
+ # it { is_expected.to define_config_option :foo }
16
+ # it { is_expected.to define_config_option :bar, default: :baz }
17
+ # end
18
+
19
+ RSpec::Matchers.define :define_config_option do |option, default: nil|
20
+ description { "define config option #{option}" }
21
+ failure_message { "expected #{subject} to define config option #{option} #{with_default(default)}".strip }
22
+
23
+ match do |obj|
24
+ expect(obj).to respond_to :config
25
+ expect(obj.config.instance_variable_get(:@config)).to be_present
26
+ expect(obj.config.instance_variable_get(:@config)).to define_option option, default: default
27
+ end
28
+
29
+ def with_default(default)
30
+ "with default #{default}" unless default.nil?
31
+ end
32
+ end
@@ -2,5 +2,5 @@
2
2
 
3
3
  module Spicerack
4
4
  # This constant is managed by spicerack
5
- VERSION = "0.13.5"
5
+ VERSION = "0.14.0"
6
6
  end
metadata CHANGED
@@ -1,11 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spicerack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.13.5
4
+ version: 0.14.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eric Garside
8
8
  - Allen Rettberg
9
+ - Jordan Minneti
10
+ - Aleksei Kharkov
9
11
  autorequire:
10
12
  bindir: bin
11
13
  cert_chain: []
@@ -17,70 +19,70 @@ dependencies:
17
19
  requirements:
18
20
  - - '='
19
21
  - !ruby/object:Gem::Version
20
- version: 0.13.5
22
+ version: 0.14.0
21
23
  type: :runtime
22
24
  prerelease: false
23
25
  version_requirements: !ruby/object:Gem::Requirement
24
26
  requirements:
25
27
  - - '='
26
28
  - !ruby/object:Gem::Version
27
- version: 0.13.5
29
+ version: 0.14.0
28
30
  - !ruby/object:Gem::Dependency
29
31
  name: redis_hash
30
32
  requirement: !ruby/object:Gem::Requirement
31
33
  requirements:
32
34
  - - '='
33
35
  - !ruby/object:Gem::Version
34
- version: 0.13.5
36
+ version: 0.14.0
35
37
  type: :runtime
36
38
  prerelease: false
37
39
  version_requirements: !ruby/object:Gem::Requirement
38
40
  requirements:
39
41
  - - '='
40
42
  - !ruby/object:Gem::Version
41
- version: 0.13.5
43
+ version: 0.14.0
42
44
  - !ruby/object:Gem::Dependency
43
45
  name: short_circu_it
44
46
  requirement: !ruby/object:Gem::Requirement
45
47
  requirements:
46
48
  - - '='
47
49
  - !ruby/object:Gem::Version
48
- version: 0.13.5
50
+ version: 0.14.0
49
51
  type: :runtime
50
52
  prerelease: false
51
53
  version_requirements: !ruby/object:Gem::Requirement
52
54
  requirements:
53
55
  - - '='
54
56
  - !ruby/object:Gem::Version
55
- version: 0.13.5
57
+ version: 0.14.0
56
58
  - !ruby/object:Gem::Dependency
57
59
  name: technologic
58
60
  requirement: !ruby/object:Gem::Requirement
59
61
  requirements:
60
62
  - - '='
61
63
  - !ruby/object:Gem::Version
62
- version: 0.13.5
64
+ version: 0.14.0
63
65
  type: :runtime
64
66
  prerelease: false
65
67
  version_requirements: !ruby/object:Gem::Requirement
66
68
  requirements:
67
69
  - - '='
68
70
  - !ruby/object:Gem::Version
69
- version: 0.13.5
71
+ version: 0.14.0
70
72
  - !ruby/object:Gem::Dependency
71
73
  name: tablesalt
72
74
  requirement: !ruby/object:Gem::Requirement
73
75
  requirements:
74
76
  - - '='
75
77
  - !ruby/object:Gem::Version
76
- version: 0.13.5
78
+ version: 0.14.0
77
79
  type: :runtime
78
80
  prerelease: false
79
81
  version_requirements: !ruby/object:Gem::Requirement
80
82
  requirements:
81
83
  - - '='
82
84
  - !ruby/object:Gem::Version
83
- version: 0.13.5
85
+ version: 0.14.0
84
86
  - !ruby/object:Gem::Dependency
85
87
  name: bundler
86
88
  requirement: !ruby/object:Gem::Requirement
@@ -199,33 +201,35 @@ dependencies:
199
201
  requirements:
200
202
  - - '='
201
203
  - !ruby/object:Gem::Version
202
- version: 0.13.5
204
+ version: 0.14.0
203
205
  type: :development
204
206
  prerelease: false
205
207
  version_requirements: !ruby/object:Gem::Requirement
206
208
  requirements:
207
209
  - - '='
208
210
  - !ruby/object:Gem::Version
209
- version: 0.13.5
211
+ version: 0.14.0
210
212
  - !ruby/object:Gem::Dependency
211
213
  name: spicerack-styleguide
212
214
  requirement: !ruby/object:Gem::Requirement
213
215
  requirements:
214
216
  - - '='
215
217
  - !ruby/object:Gem::Version
216
- version: 0.13.5
218
+ version: 0.14.0
217
219
  type: :development
218
220
  prerelease: false
219
221
  version_requirements: !ruby/object:Gem::Requirement
220
222
  requirements:
221
223
  - - '='
222
224
  - !ruby/object:Gem::Version
223
- version: 0.13.5
225
+ version: 0.14.0
224
226
  description: This collection of gems will spice up your rails and kick your rubies
225
227
  up a notch. Bam!
226
228
  email:
227
229
  - garside@gmail.com
228
230
  - allen.rettberg@freshly.com
231
+ - jordan.minneti@freshly.com
232
+ - aliaksei.kharkou@freshly.com
229
233
  executables: []
230
234
  extensions: []
231
235
  extra_rdoc_files: []
@@ -235,6 +239,9 @@ files:
235
239
  - lib/spicerack.rb
236
240
  - lib/spicerack/array_index.rb
237
241
  - lib/spicerack/attribute_object.rb
242
+ - lib/spicerack/configurable.rb
243
+ - lib/spicerack/configurable/config_builder.rb
244
+ - lib/spicerack/configurable/reader.rb
238
245
  - lib/spicerack/hash_model.rb
239
246
  - lib/spicerack/input_model.rb
240
247
  - lib/spicerack/input_object.rb
@@ -247,6 +254,7 @@ files:
247
254
  - lib/spicerack/rspec/custom_matchers.rb
248
255
  - lib/spicerack/rspec/custom_matchers/define_argument.rb
249
256
  - lib/spicerack/rspec/custom_matchers/define_attribute.rb
257
+ - lib/spicerack/rspec/custom_matchers/define_config_option.rb
250
258
  - lib/spicerack/rspec/custom_matchers/define_field.rb
251
259
  - lib/spicerack/rspec/custom_matchers/define_option.rb
252
260
  - lib/spicerack/rspec/shared_examples.rb