opt_struct 1.4.0 → 1.5.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: 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