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 +4 -4
- data/lib/spicerack.rb +1 -0
- data/lib/spicerack/configurable.rb +50 -0
- data/lib/spicerack/configurable/config_builder.rb +30 -0
- data/lib/spicerack/configurable/reader.rb +25 -0
- data/lib/spicerack/rspec/custom_matchers.rb +1 -0
- data/lib/spicerack/rspec/custom_matchers/define_config_option.rb +32 -0
- data/lib/spicerack/version.rb +1 -1
- metadata +23 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a664105c1a345538f9e8c22264d854b877cd8b9353574694b9ad57edd558d1df
|
4
|
+
data.tar.gz: ef09c99c0590654caf6d9dbd6305b7815ba46722e96da7da2aa7cba069d70513
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8e44013fced63365fdd9e477c1fc65499419c1f62a220fd9257e2eb801c6809a416add2a412676851c623c571010e573ba8bbc37fd36ef708c3bcaad8e64d73a
|
7
|
+
data.tar.gz: 32b262fd44dd16ed3d2f5e7c1c070d48845787343415ab835f2c4da0c187e99a9d0bad68afcd49fe77b946e796b958b85268420b48d609a7bd3ea5bd830b88d3
|
data/lib/spicerack.rb
CHANGED
@@ -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
|
@@ -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
|
data/lib/spicerack/version.rb
CHANGED
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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
|