spicerack 0.13.5 → 0.14.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|