opt_struct 1.2.0 → 1.4.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: 824012017028badde180165fa6280f398cbf138f09f8600319625e92fbaf67ed
4
- data.tar.gz: 2c612d601c220eb88aaaf656917cd06d0edc7a87b70f84c67cda6b17e6cbbe94
3
+ metadata.gz: 193867b718e2e264678a0ad084fc6ee5d76854203e74d13e6fc64404dfb042e8
4
+ data.tar.gz: b226650ae4b38741e70de40d8e0ffde6666f6e80f7b6735c316dfd303f74a435
5
5
  SHA512:
6
- metadata.gz: f7cf9e8c1d9e0b9c40a2f08c1f32784fa61b38a14edac39f4bef3f887845827a57f9b813e2f8df6dbb0436734c8f5895d7b25f45adb2bff3fa82eb7e87766fee
7
- data.tar.gz: aea1084efba08f15951e7d8629c1a8211d66bddd720dfee19a1c1ec5a8eb52d6c73f047ac4ae8c5b7a969912113b0093249f48f991415ca932170d64e69b956d
6
+ metadata.gz: 16565e6596e06089f3cc463917af8ee13d573ad8ded530a39f121e3d4d2b1eb05b5b5e3bf308fe770750e7067adf06d08d72b0ef438ff939bdab4ef02605f2be
7
+ data.tar.gz: 942ccab03a688b1fc8b11db1d571d9cf6d8b96db49243120847f1083a7cb40bbdcedffdd38f252c483db395692f91f1dbfa275f2c876d159bcf2b5a230f533d2
@@ -1,38 +1,33 @@
1
1
  module OptStruct
2
2
  module ClassMethods
3
3
  def inherited(subclass)
4
- opt_struct_class_constants.each do |c|
5
- subclass.const_set(c, const_get(c)) if const_defined?(c)
4
+ instance_variables.each do |v|
5
+ ivar = instance_variable_get(v)
6
+ subclass.send(:instance_variable_set, v, ivar.dup) if ivar
6
7
  end
7
8
  end
8
9
 
9
- # overwritten if `required` is called
10
10
  def required_keys
11
- [].freeze
11
+ @required_keys ||= []
12
12
  end
13
13
 
14
14
  def required(*keys, **options)
15
- add_required_keys *keys
15
+ required_keys.concat keys
16
16
  option_accessor *keys, **options
17
17
  end
18
18
 
19
- def option_reader(*keys, **options)
19
+ def option_reader(*keys, **opts)
20
20
  keys.each do |key|
21
- class_eval <<~RUBY
22
- #{options[:private] ? "private" : ""} def #{key}
23
- options[:#{key}]
24
- end
25
- RUBY
21
+ define_method(key) { options[key] }
22
+ private key if opts[:private]
26
23
  end
27
24
  end
28
25
 
29
- def option_writer(*keys, **options)
26
+ def option_writer(*keys, **opts)
30
27
  keys.each do |key|
31
- class_eval <<~RUBY
32
- #{options[:private] ? "private" : ""} def #{key}=(value)
33
- options[:#{key}] = value
34
- end
35
- RUBY
28
+ meth = "#{key}=".to_sym
29
+ define_method(meth) { |value| options[key] = value }
30
+ private meth if opts[:private]
36
31
  end
37
32
  end
38
33
 
@@ -42,41 +37,35 @@ module OptStruct
42
37
  option_writer *keys, **options
43
38
  end
44
39
 
45
- def option(key, default = nil, required: false, **options)
40
+ def option(key, default = OptStruct::DEFAULT, required: false, **options)
46
41
  default = options[:default] if options.key?(:default)
47
- add_defaults key => default
48
- add_required_keys key if required
42
+ defaults[key] = default unless default == OptStruct::DEFAULT
43
+ required_keys << key if required
49
44
  option_accessor key, **options
50
45
  end
51
46
 
52
47
  def options(*keys, **keys_defaults)
53
48
  option_accessor *keys if keys.any?
54
49
  if keys_defaults.any?
55
- add_defaults keys_defaults
50
+ defaults.merge!(keys_defaults)
56
51
  option_accessor *(keys_defaults.keys - expected_arguments)
57
52
  end
58
53
  end
59
54
 
60
55
  def defaults
61
- const_defined?(:OPT_DEFAULTS) ? const_get(:OPT_DEFAULTS) : {}
62
- end
63
-
64
- # overwritten if `expect_arguments` is called
65
- def expected_arguments
66
- [].freeze
56
+ @defaults ||= {}
67
57
  end
68
58
 
69
59
  def expect_arguments(*arguments)
70
60
  required(*arguments)
71
- combined = expected_arguments + arguments
72
- class_eval <<~EVAL
73
- def self.expected_arguments
74
- #{combined.inspect}.freeze
75
- end
76
- EVAL
61
+ expected_arguments.concat(arguments)
77
62
  end
78
63
  alias_method :expect_argument, :expect_arguments
79
64
 
65
+ def expected_arguments
66
+ @expected_arguments ||= []
67
+ end
68
+
80
69
  def init(meth = nil, &blk)
81
70
  add_callback(:init, meth || blk)
82
71
  end
@@ -90,57 +79,18 @@ module OptStruct
90
79
  add_callback(:around_init, meth || blk)
91
80
  end
92
81
 
93
- def all_callbacks
94
- const_defined?(:OPT_CALLBACKS) ? const_get(:OPT_CALLBACKS) : {}.freeze
95
- end
96
-
97
- def shareable?
98
- const_defined?(:SHAREABLE) && const_get(:SHAREABLE)
82
+ def add_callback(name, callback)
83
+ @_callbacks ||= {}
84
+ @_callbacks[name] ||= []
85
+ @_callbacks[name] << callback
99
86
  end
100
87
 
101
- def shareable!
102
- return if shareable?
103
- const_set(:SHAREABLE, true)
88
+ def all_callbacks
89
+ @_callbacks
104
90
  end
105
91
 
106
92
  private
107
93
 
108
- def share(value)
109
- return value unless shareable?
110
- defined?(Ractor) ? Ractor.make_shareable(value) : value
111
- end
112
-
113
- def add_required_keys(*keys)
114
- combined = required_keys + keys
115
- class_eval <<~RUBY
116
- def self.required_keys
117
- #{combined.inspect}.freeze
118
- end
119
- RUBY
120
- end
121
-
122
- def add_defaults(defaults_to_add)
123
- freezer = defaults.dup
124
- defaults_to_add.each { |k, v| freezer[k] = share(v) }
125
- remove_const(:OPT_DEFAULTS) if const_defined?(:OPT_DEFAULTS)
126
- const_set(:OPT_DEFAULTS, freezer.freeze)
127
- end
128
-
129
- def add_callback(name, callback)
130
- if const_defined?(:OPT_CALLBACKS)
131
- callbacks_for_name = (all_callbacks[name] || []) + [callback]
132
- callbacks_hash = all_callbacks.merge(name => callbacks_for_name).freeze
133
- remove_const(:OPT_CALLBACKS)
134
- const_set(:OPT_CALLBACKS, callbacks_hash)
135
- else
136
- const_set(:OPT_CALLBACKS, { name => [ callback ] })
137
- end
138
- end
139
-
140
- def opt_struct_class_constants
141
- [:OPT_DEFAULTS, :OPT_CALLBACKS]
142
- end
143
-
144
94
  def check_reserved_words(words)
145
95
  Array(words).each do |word|
146
96
  if OptStruct::RESERVED_WORDS.member?(word)
@@ -28,7 +28,7 @@ module OptStruct
28
28
 
29
29
  def assign_defaults
30
30
  defaults.each do |key, default_value|
31
- next if options.key?(key) # || default_value.nil?
31
+ next if options.key?(key)
32
32
  options[key] = read_default_value(default_value)
33
33
  end
34
34
  end
@@ -1,3 +1,3 @@
1
1
  module OptStruct
2
- VERSION = "1.2.0"
2
+ VERSION = "1.4.0"
3
3
  end
data/lib/opt_struct.rb CHANGED
@@ -5,6 +5,9 @@ require "opt_struct/instance_methods"
5
5
  module OptStruct
6
6
  RESERVED_WORDS = %i(class defaults options fetch check_required_args check_required_keys).freeze
7
7
 
8
+ # Default value object allows us to distinguish unspecified defaults from nil
9
+ DEFAULT = Object.new
10
+
8
11
  def self._inject_struct(target, source, args = [], **defaults, &callback)
9
12
  structs = Array(source.instance_variable_get(:@_opt_structs)).dup
10
13
  if args.any? || defaults.any? || block_given?
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.2.0
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Carl Zulauf
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-03-30 00:00:00.000000000 Z
11
+ date: 2022-02-23 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Struct with support for keyword params and mixin support
14
14
  email:
@@ -28,7 +28,7 @@ homepage: https://github.com/carlzulauf/opt_struct
28
28
  licenses:
29
29
  - MIT
30
30
  metadata: {}
31
- post_install_message:
31
+ post_install_message:
32
32
  rdoc_options: []
33
33
  require_paths:
34
34
  - lib
@@ -43,8 +43,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
43
43
  - !ruby/object:Gem::Version
44
44
  version: '0'
45
45
  requirements: []
46
- rubygems_version: 3.1.4
47
- signing_key:
46
+ rubygems_version: 3.3.7
47
+ signing_key:
48
48
  specification_version: 4
49
49
  summary: The Option Struct
50
50
  test_files: []