opt_struct 1.2.0 → 1.4.0
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 +4 -4
- data/lib/opt_struct/class_methods.rb +28 -78
- data/lib/opt_struct/instance_methods.rb +1 -1
- data/lib/opt_struct/version.rb +1 -1
- data/lib/opt_struct.rb +3 -0
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 193867b718e2e264678a0ad084fc6ee5d76854203e74d13e6fc64404dfb042e8
|
4
|
+
data.tar.gz: b226650ae4b38741e70de40d8e0ffde6666f6e80f7b6735c316dfd303f74a435
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
|
5
|
-
|
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
|
-
[]
|
11
|
+
@required_keys ||= []
|
12
12
|
end
|
13
13
|
|
14
14
|
def required(*keys, **options)
|
15
|
-
|
15
|
+
required_keys.concat keys
|
16
16
|
option_accessor *keys, **options
|
17
17
|
end
|
18
18
|
|
19
|
-
def option_reader(*keys, **
|
19
|
+
def option_reader(*keys, **opts)
|
20
20
|
keys.each do |key|
|
21
|
-
|
22
|
-
|
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, **
|
26
|
+
def option_writer(*keys, **opts)
|
30
27
|
keys.each do |key|
|
31
|
-
|
32
|
-
|
33
|
-
|
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 =
|
40
|
+
def option(key, default = OptStruct::DEFAULT, required: false, **options)
|
46
41
|
default = options[:default] if options.key?(:default)
|
47
|
-
|
48
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
94
|
-
|
95
|
-
|
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
|
102
|
-
|
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)
|
data/lib/opt_struct/version.rb
CHANGED
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.
|
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:
|
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.
|
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: []
|