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 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