vcdry 1.0.0 → 1.1.1

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: 185f278d99a71c67953d1453a9b2c62ee2afac0c914d3a4c8793c5677396b232
4
- data.tar.gz: 84290611068e8991a71164cdd11ca4d2e318ce364975905b1ece0c75e5a2dada
3
+ metadata.gz: 23e7e6597fb4e286a35c06290cce1efbc90421cf7b9272e6927060ec7afa1836
4
+ data.tar.gz: 1d85c66ceaa4402ba2b2132cf0659c45e8d28aafa99ec9297a925ecee2c1c860
5
5
  SHA512:
6
- metadata.gz: 95dd05bd5d0654374b46a99d43cb0029e9302a3b38a0d60e4278b64a2e0edb2e5dce528a91a0c732ab494fafa9e2cf287977960f31cc4d4411ec19947f80eb7b
7
- data.tar.gz: c47f92e3d43e7b96f7901b37a4633d6a8e9a96a787e8fc9e2ad0d4d922d76bcfe532eb623059305b3c7c348f629e22bf580baafaba39cba3737927bf45a2b7c1
6
+ metadata.gz: 5100e330ab5256cdc3bc7449543265f6334034be7876370f0f007b3cc5f51f96dd5ad99e98efa5d7a75029fc7a01487d2285b9294ea180cfb6329abf808085e1
7
+ data.tar.gz: c09be2d8cbc5188d80c82ebd693530ee9cc51e12018f08ea388d662ce9fd93a8d27b3e2b629094e089eb3371c16a11a2fdb3cf099ff1a561749ee83e1f16fe07
data/CHANGELOG.md CHANGED
@@ -1,4 +1,15 @@
1
- ## [Unreleased]
1
+ ## [1.1.1] - 2023-05-25
2
+
3
+ - Breakout `VCDry::Core` from `VCDry::DSL` to better support mixing in `keyword`
4
+ behavior in other gems like `vcfb`.
5
+
6
+ ## [1.0.1] - 2023-04-28
7
+
8
+ - Added initializer callbacks.
9
+ - Treat `default: nil` and `optional: true` identically.
10
+ - Fix for `other_keywords` to accept the optional type as intended.
11
+ - Fix for inheritance issues when including VCDry::DSL on a parent component.
12
+ - Fix to allow passing `nil` to an optional keyword.
2
13
 
3
14
  ## [1.0.0] - 2023-04-16
4
15
 
data/README.md CHANGED
@@ -40,6 +40,7 @@ end
40
40
  - [other_keywords](#other_keywords)
41
41
  - [strict_keywords](#strict_keywords)
42
42
  - [remove_keyword](#remove_keyword)
43
+ - [Callbacks](#callbacks)
43
44
  - [Types](#types)
44
45
  - [Development](#development)
45
46
  - [Contributing](#contributing)
@@ -260,6 +261,25 @@ class MyOtherComponent < MyComponent
260
261
  end
261
262
  ```
262
263
 
264
+ ### Callbacks
265
+
266
+ Including `VCDry::DSL` adds support through `ActiveModel::Callbacks` for the
267
+ `before_initialize`, `after_initialization`, and `around_initialize` callbacks
268
+ to minimize the need to override the initlialize method.
269
+
270
+ ```ruby
271
+ class MyComponent < MyComponent
272
+ before_initialize ->() { @links = [] }
273
+ after_intialize :some_method
274
+
275
+ private
276
+
277
+ def some_method
278
+ # do something fancy
279
+ end
280
+ end
281
+ ```
282
+
263
283
  ## Types
264
284
 
265
285
  The following types are built-in to `vcdry`.
@@ -280,6 +300,32 @@ VCDry::Types.add_type(:boolean, ->(value) { ActiveRecord::Type::Boolean.new.cast
280
300
  VCDry::Types.add_type(:custom_hash, ->(value) { CustomHash.new(value) })
281
301
  ```
282
302
 
303
+ ## Mix-in Behavior
304
+
305
+ To mix-in the `keyword` behavior without using the `VCDry::DSL` (and its
306
+ initialize method), you can call include `VCDry::Core` instead and then call
307
+ `vcdry_parse_keywords` against the hash you wish to parse out keywords from.
308
+
309
+ The `vcdry_parse_keywords` accepts a hash and returns a hash of all key/value
310
+ pairs that were not pulled out as a `keyword`.
311
+
312
+ > **Note**: Including `VCDry::Core` does not include support for
313
+ > `other_keywords`, `strict_keywords`, or enable support for callbacks.
314
+
315
+ ```ruby
316
+ class HeadingComponent
317
+ include VCDry::Core
318
+
319
+ keyword :size, :symbol, default: :md
320
+ other_keywords :options
321
+
322
+ def initialize(text, **options)
323
+ @text = text
324
+ @options = vcdry_parse_keywords(options)
325
+ end
326
+ end
327
+ ```
328
+
283
329
  ## Development
284
330
 
285
331
  After checking out the repo, run `bin/setup` to install dependencies. Then, run
data/lib/vcdry/config.rb CHANGED
@@ -13,6 +13,12 @@ module VCDry
13
13
  @name = name.to_sym
14
14
  @type = (type.nil? || type.respond_to?(:call)) ? type : VCDry::Types[type]
15
15
  @options = options
16
+
17
+ # Translate default: nil to optional: true
18
+ if @options.key?(:default) && @options[:default].nil?
19
+ @options.delete(:default)
20
+ @options[:optional] = true
21
+ end
16
22
  end
17
23
 
18
24
  def array?
@@ -48,7 +54,7 @@ module VCDry
48
54
  end
49
55
 
50
56
  def optional?
51
- default? || !!@options[:optional]
57
+ default? || @options[:optional]
52
58
  end
53
59
 
54
60
  def required?
@@ -72,6 +78,7 @@ module VCDry
72
78
  def type_cast_value(value)
73
79
  return if value == NOT_DEFINED
74
80
  return value if @type.nil?
81
+ return if value.nil? && @options[:optional]
75
82
 
76
83
  value = @type.call(value)
77
84
  if enum? && enum_values.exclude?(value)
data/lib/vcdry/core.rb ADDED
@@ -0,0 +1,59 @@
1
+ require "active_support/concern"
2
+ require "active_support/core_ext/hash"
3
+ require "active_support/core_ext/module/delegation"
4
+
5
+ require_relative "error"
6
+ require_relative "registry"
7
+
8
+ module VCDry
9
+ module Core
10
+ extend ActiveSupport::Concern
11
+
12
+ def vcdry_parse_keywords(kwargs = {})
13
+ kwargs = kwargs.symbolize_keys
14
+ self.class.vcdry.keyword_configs.each do |config|
15
+ if config.required? && !kwargs.key?(config.name)
16
+ raise MissingRequiredKeywordError.new(config.name)
17
+ end
18
+
19
+ value = kwargs.fetch(config.name, config.default)
20
+ instance_variable_set(config.instance_variable, config.type_cast(value))
21
+ end
22
+ kwargs.except(*self.class.vcdry.keywords)
23
+ end
24
+
25
+ class_methods do
26
+ delegate :remove_keyword, to: :vcdry
27
+
28
+ def inherited(subclass)
29
+ subclass.instance_variable_set(:@vcdry, @vcdry&.dup)
30
+ super
31
+ end
32
+
33
+ def keyword(name, type = nil, **options)
34
+ name = name.to_sym
35
+ config = vcdry.keyword(name, type, options)
36
+ vcutils_define_helper_methods(config)
37
+ end
38
+
39
+ def vcdry
40
+ @vcdry ||= Registry.new
41
+ end
42
+
43
+ def vcutils_define_helper_methods(config)
44
+ if config.enum?
45
+ config.enum_values.each do |value|
46
+ define_method "#{config.name}_#{value}?" do
47
+ instance_variable_get(config.instance_variable) == value
48
+ end
49
+ end
50
+ end
51
+ if config.optional?
52
+ define_method "#{config.name}?" do
53
+ instance_variable_get(config.instance_variable).present?
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
data/lib/vcdry/dsl.rb CHANGED
@@ -1,33 +1,29 @@
1
+ require "active_model/callbacks"
1
2
  require "active_support/concern"
2
- require "active_support/core_ext/hash"
3
- require "active_support/core_ext/module/delegation"
4
3
 
4
+ require_relative "core"
5
5
  require_relative "error"
6
- require_relative "registry"
7
6
 
8
7
  module VCDry
9
8
  module DSL
10
9
  extend ActiveSupport::Concern
10
+ include Core
11
11
 
12
- def initialize(**kwargs)
13
- kwargs = kwargs.symbolize_keys
14
- vcdry_parse_keywords(**kwargs)
15
- vcdry_parse_unknown_keywords(**kwargs)
16
- end
12
+ included do
13
+ extend ActiveModel::Callbacks
17
14
 
18
- def vcdry_parse_keywords(**kwargs)
19
- self.class.vcdry.keyword_configs.each do |config|
20
- if config.required? && !kwargs.key?(config.name)
21
- raise MissingRequiredKeywordError.new(config.name)
22
- end
15
+ define_model_callbacks :initialize
16
+ end
23
17
 
24
- value = kwargs.fetch(config.name, config.default)
25
- instance_variable_set(config.instance_variable, config.type_cast(value))
18
+ def initialize(**kwargs)
19
+ run_callbacks :initialize do
20
+ unknown_kwargs = vcdry_parse_keywords(kwargs)
21
+ vcdry_parse_unknown_keywords(unknown_kwargs)
22
+ super
26
23
  end
27
24
  end
28
25
 
29
- def vcdry_parse_unknown_keywords(**kwargs)
30
- unknown_kwargs = kwargs.except(*self.class.vcdry.keywords)
26
+ def vcdry_parse_unknown_keywords(unknown_kwargs = {})
31
27
  raise UnknownArgumentError.new(*unknown_kwargs.keys) if self.class.vcdry.strict? && unknown_kwargs.present?
32
28
  return unless self.class.vcdry.gather_unknown_keywords?
33
29
 
@@ -36,36 +32,7 @@ module VCDry
36
32
  end
37
33
 
38
34
  class_methods do
39
- delegate :other_keywords, :remove_keyword, :strict_keywords, to: :vcdry
40
-
41
- def inherited(subclass)
42
- subclass.instance_variable_set(:@vcdry, @vcdry&.dup)
43
- end
44
-
45
- def keyword(name, type = nil, **options)
46
- name = name.to_sym
47
- config = vcdry.keyword(name, type, options)
48
- vcutils_define_helper_methods(config)
49
- end
50
-
51
- def vcdry
52
- @vcdry ||= Registry.new
53
- end
54
-
55
- def vcutils_define_helper_methods(config)
56
- if config.enum?
57
- config.enum_values.each do |value|
58
- define_method "#{config.name}_#{value}?" do
59
- instance_variable_get(config.instance_variable) == value
60
- end
61
- end
62
- end
63
- if config.optional?
64
- define_method "#{config.name}?" do
65
- instance_variable_get(config.instance_variable).present?
66
- end
67
- end
68
- end
35
+ delegate :other_keywords, :strict_keywords, to: :vcdry
69
36
  end
70
37
  end
71
38
  end
@@ -41,7 +41,7 @@ module VCDry
41
41
  @keywords.keys
42
42
  end
43
43
 
44
- def other_keywords(name, type: :hash)
44
+ def other_keywords(name, type = :hash)
45
45
  @other_keywords_config = Config.new(name, type)
46
46
  end
47
47
 
data/lib/vcdry/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module VCDry
2
- VERSION = "1.0.0"
2
+ VERSION = "1.1.1"
3
3
  end
data/lib/vcdry.rb CHANGED
@@ -1,9 +1,7 @@
1
+ require_relative "vcdry/config"
2
+ require_relative "vcdry/core"
1
3
  require_relative "vcdry/dsl"
2
4
  require_relative "vcdry/error"
3
- require_relative "vcdry/config"
4
5
  require_relative "vcdry/registry"
5
6
  require_relative "vcdry/types"
6
7
  require_relative "vcdry/version"
7
-
8
- module VCDry
9
- end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vcdry
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex Monroe
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-04-16 00:00:00.000000000 Z
11
+ date: 2023-05-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -76,6 +76,7 @@ files:
76
76
  - Rakefile
77
77
  - lib/vcdry.rb
78
78
  - lib/vcdry/config.rb
79
+ - lib/vcdry/core.rb
79
80
  - lib/vcdry/dsl.rb
80
81
  - lib/vcdry/error.rb
81
82
  - lib/vcdry/registry.rb