opt_struct 1.5.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: 29701f52f41c942f328cc7a9303a72baa59d96cc1b0b8d9e803e9a80bac6aef3
4
- data.tar.gz: 91c84c884b3a4ea3833db8c80083217efb8d942983aa0cb1072fd0b177c135b5
3
+ metadata.gz: 3513e52f9bdf75f5c2f2b59e2718b3de30cbc5e9720bd6d7b8e22eb3d23975a8
4
+ data.tar.gz: '0851dbb6109b9eb2b191ae709ae08d47562e457f8dd1375084194aef3d8d00bb'
5
5
  SHA512:
6
- metadata.gz: 27ceba23b7146f571232215d3228c59d9d6632e0628b694ded56fb8f308ad9257182c0f29edf41bbb9dc151570e5b855f40412ad066b33abfe042d18a3342344
7
- data.tar.gz: 74f73309afd32192f9ea1b7d48f193e209f0e056381d20762001f57ec6b113387d11a8e9532a713b28855e2e052f210a8f0cff1df9b1c1319e8701934e9d0687
6
+ metadata.gz: 40875af1558cbe95e6715d58d3dfa100f268d103a5fa1269ccbb7dcca7c2cf23b7670ff1303f5f51d6ce292320f37c7878339c7811ac810ce57ee6fa30777f2a
7
+ data.tar.gz: 576629818aa2c778194587112b7965182b53b36f346a9606f518d969a57c646d0d60edf5772537600b575d1b6452c10ef5fe28b163d33ceede2e07d99427e862
@@ -1,10 +1,12 @@
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)
8
10
  end
9
11
 
10
12
  def defined_keys
@@ -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.5.0"
2
+ VERSION = "1.5.1"
3
3
  end
data/lib/opt_struct.rb CHANGED
@@ -11,15 +11,25 @@ module OptStruct
11
11
  *OptStruct::InstanceMethods.private_instance_methods,
12
12
  ].freeze
13
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
+ ]
19
+
14
20
  # Default value object allows us to distinguish unspecified defaults from nil
15
21
  DEFAULT = Object.new
16
22
 
17
23
  def self._inject_struct(target, source, args = [], **defaults, &callback)
18
- structs = Array(source.instance_variable_get(:@_opt_structs)).dup
24
+ existing = source.instance_variable_get(:@_opt_structs)
25
+ structs = Array(existing).dup
26
+
19
27
  if args.any? || defaults.any? || block_given?
20
28
  structs << [args, defaults, callback]
21
29
  end
22
- target.instance_variable_set(:@_opt_structs, structs)
30
+
31
+ target.instance_variable_set(:@_opt_structs, structs) if existing || structs.any?
32
+
23
33
  if target.is_a?(Class)
24
34
  target.instance_exec do
25
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.5.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: 2023-08-25 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: