opt_struct 1.4.0 → 1.5.1

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: 193867b718e2e264678a0ad084fc6ee5d76854203e74d13e6fc64404dfb042e8
4
- data.tar.gz: b226650ae4b38741e70de40d8e0ffde6666f6e80f7b6735c316dfd303f74a435
3
+ metadata.gz: 3513e52f9bdf75f5c2f2b59e2718b3de30cbc5e9720bd6d7b8e22eb3d23975a8
4
+ data.tar.gz: '0851dbb6109b9eb2b191ae709ae08d47562e457f8dd1375084194aef3d8d00bb'
5
5
  SHA512:
6
- metadata.gz: 16565e6596e06089f3cc463917af8ee13d573ad8ded530a39f121e3d4d2b1eb05b5b5e3bf308fe770750e7067adf06d08d72b0ef438ff939bdab4ef02605f2be
7
- data.tar.gz: 942ccab03a688b1fc8b11db1d571d9cf6d8b96db49243120847f1083a7cb40bbdcedffdd38f252c483db395692f91f1dbfa275f2c876d159bcf2b5a230f533d2
6
+ metadata.gz: 40875af1558cbe95e6715d58d3dfa100f268d103a5fa1269ccbb7dcca7c2cf23b7670ff1303f5f51d6ce292320f37c7878339c7811ac810ce57ee6fa30777f2a
7
+ data.tar.gz: 576629818aa2c778194587112b7965182b53b36f346a9606f518d969a57c646d0d60edf5772537600b575d1b6452c10ef5fe28b163d33ceede2e07d99427e862
@@ -1,16 +1,30 @@
1
1
  module OptStruct
2
2
  module ClassMethods
3
3
  def inherited(subclass)
4
- instance_variables.each do |v|
5
- ivar = instance_variable_get(v)
6
- subclass.send(:instance_variable_set, v, ivar.dup) if ivar
4
+ # intersection of defined vars and the ones we care about
5
+ (instance_variables & OptStruct::CLASS_IVARS).each do |ivar|
6
+ # copy them to the child class
7
+ subclass.send(:instance_variable_set, ivar, instance_variable_get(ivar).dup)
7
8
  end
9
+ super(subclass)
10
+ end
11
+
12
+ def defined_keys
13
+ @defined_keys ||= []
8
14
  end
9
15
 
10
16
  def required_keys
11
17
  @required_keys ||= []
12
18
  end
13
19
 
20
+ def expected_arguments
21
+ @expected_arguments ||= []
22
+ end
23
+
24
+ def defaults
25
+ @defaults ||= {}
26
+ end
27
+
14
28
  def required(*keys, **options)
15
29
  required_keys.concat keys
16
30
  option_accessor *keys, **options
@@ -33,6 +47,7 @@ module OptStruct
33
47
 
34
48
  def option_accessor(*keys, **options)
35
49
  check_reserved_words(keys)
50
+ defined_keys.concat keys
36
51
  option_reader *keys, **options
37
52
  option_writer *keys, **options
38
53
  end
@@ -52,20 +67,12 @@ module OptStruct
52
67
  end
53
68
  end
54
69
 
55
- def defaults
56
- @defaults ||= {}
57
- end
58
-
59
70
  def expect_arguments(*arguments)
60
71
  required(*arguments)
61
72
  expected_arguments.concat(arguments)
62
73
  end
63
74
  alias_method :expect_argument, :expect_arguments
64
75
 
65
- def expected_arguments
66
- @expected_arguments ||= []
67
- end
68
-
69
76
  def init(meth = nil, &blk)
70
77
  add_callback(:init, meth || blk)
71
78
  end
@@ -29,27 +29,24 @@ module OptStruct
29
29
  def assign_defaults
30
30
  defaults.each do |key, default_value|
31
31
  next if options.key?(key)
32
- options[key] = read_default_value(default_value)
32
+ options[key] =
33
+ case default_value
34
+ when Proc
35
+ instance_exec(&default_value)
36
+ when Symbol
37
+ respond_to?(default_value) ? send(default_value) : default_value
38
+ else
39
+ default_value
40
+ end
33
41
  end
34
42
  end
35
43
 
36
44
  def assign_arguments(args)
37
- self.class.expected_arguments.map.with_index do |key, i|
45
+ self.class.expected_arguments.each_with_index do |key, i|
38
46
  options[key] = args[i] if args.length > i
39
47
  end
40
48
  end
41
49
 
42
- def read_default_value(default)
43
- case default
44
- when Proc
45
- instance_exec(&default)
46
- when Symbol
47
- respond_to?(default) ? send(default) : default
48
- else
49
- default
50
- end
51
- end
52
-
53
50
  def with_init_callbacks(&init_block)
54
51
  callbacks = self.class.all_callbacks
55
52
  return yield if callbacks.nil? || callbacks.empty?
@@ -23,6 +23,7 @@ module OptStruct
23
23
  expect_arguments
24
24
  ).each do |class_method|
25
25
  define_method(class_method) do |*args, **options|
26
+ @_opt_structs ||= []
26
27
  @_opt_structs << [[], {}, -> { send(class_method, *args, **options) }]
27
28
  end
28
29
  end
@@ -1,3 +1,3 @@
1
1
  module OptStruct
2
- VERSION = "1.4.0"
2
+ VERSION = "1.5.1"
3
3
  end
data/lib/opt_struct.rb CHANGED
@@ -3,17 +3,33 @@ require "opt_struct/module_methods"
3
3
  require "opt_struct/instance_methods"
4
4
 
5
5
  module OptStruct
6
- RESERVED_WORDS = %i(class defaults options fetch check_required_args check_required_keys).freeze
6
+
7
+ RESERVED_WORDS = [
8
+ :class, :options,
9
+ *OptStruct::InstanceMethods.instance_methods,
10
+ *OptStruct::InstanceMethods.protected_instance_methods,
11
+ *OptStruct::InstanceMethods.private_instance_methods,
12
+ ].freeze
13
+
14
+ # list of class instance variables defined/tracked by opt_struct
15
+ CLASS_IVARS = %i[
16
+ @defined_keys @required_keys @expected_arguments @defaults
17
+ @_callbacks @_opt_structs
18
+ ]
7
19
 
8
20
  # Default value object allows us to distinguish unspecified defaults from nil
9
21
  DEFAULT = Object.new
10
22
 
11
23
  def self._inject_struct(target, source, args = [], **defaults, &callback)
12
- structs = Array(source.instance_variable_get(:@_opt_structs)).dup
24
+ existing = source.instance_variable_get(:@_opt_structs)
25
+ structs = Array(existing).dup
26
+
13
27
  if args.any? || defaults.any? || block_given?
14
28
  structs << [args, defaults, callback]
15
29
  end
16
- target.instance_variable_set(:@_opt_structs, structs)
30
+
31
+ target.instance_variable_set(:@_opt_structs, structs) if existing || structs.any?
32
+
17
33
  if target.is_a?(Class)
18
34
  target.instance_exec do
19
35
  extend ClassMethods
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opt_struct
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.0
4
+ version: 1.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Carl Zulauf
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-02-23 00:00:00.000000000 Z
11
+ date: 2023-08-31 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Struct with support for keyword params and mixin support
14
14
  email:
@@ -43,7 +43,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
43
43
  - !ruby/object:Gem::Version
44
44
  version: '0'
45
45
  requirements: []
46
- rubygems_version: 3.3.7
46
+ rubygems_version: 3.2.33
47
47
  signing_key:
48
48
  specification_version: 4
49
49
  summary: The Option Struct