opt_struct 1.0.2 → 1.3.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/README.md +1 -1
- data/lib/opt_struct.rb +6 -5
- data/lib/opt_struct/class_methods.rb +16 -19
- data/lib/opt_struct/instance_methods.rb +12 -13
- data/lib/opt_struct/module_methods.rb +2 -2
- data/lib/opt_struct/version.rb +1 -1
- data/opt_struct.gemspec +0 -4
- metadata +4 -46
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b76ee40e5f6c8f06f6f80efdefa9a595b48f4d07a3c98d6830fd515133038399
|
4
|
+
data.tar.gz: a9643c5ee83f52613f47e6e079445cc5912853ffb17b195f00b3e6496b2cfc03
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5d420f43e4cbc3571545846b6ee5275c32e86e5f79de7d2063564ef63f1cfc2c6857092256ee2d74a05bfce3fec9a9da7b1e5ada92ad50e3ceb69488310e8419
|
7
|
+
data.tar.gz: 8b059ca5bfab302e0515c90e49650723174cc91eb42b93d104de4fa79cf86fe6e42aea3bdc50c1612cdef36ae690538e221b9338c683d5851e88e9688c546731
|
data/README.md
CHANGED
@@ -153,7 +153,7 @@ end
|
|
153
153
|
Passing a Hash to `.new` or `.build` is equivalent to passing the same hash to `options`
|
154
154
|
|
155
155
|
```ruby
|
156
|
-
User
|
156
|
+
User = OptStruct.new(email: nil, role: "member")
|
157
157
|
```
|
158
158
|
|
159
159
|
Default blocks can also be used and are late evaluated on the each struct instance.
|
data/lib/opt_struct.rb
CHANGED
@@ -3,10 +3,11 @@ 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
|
|
7
|
-
def self._inject_struct(target, source, args = [], defaults
|
8
|
+
def self._inject_struct(target, source, args = [], **defaults, &callback)
|
8
9
|
structs = Array(source.instance_variable_get(:@_opt_structs)).dup
|
9
|
-
if args.any? || defaults.any? ||
|
10
|
+
if args.any? || defaults.any? || block_given?
|
10
11
|
structs << [args, defaults, callback]
|
11
12
|
end
|
12
13
|
target.instance_variable_set(:@_opt_structs, structs)
|
@@ -18,7 +19,7 @@ module OptStruct
|
|
18
19
|
end
|
19
20
|
structs.each do |s_args, s_defaults, s_callback|
|
20
21
|
target.expect_arguments *s_args if s_args.any?
|
21
|
-
target.options s_defaults
|
22
|
+
target.options **s_defaults if s_defaults.any?
|
22
23
|
target.class_exec(&s_callback) if s_callback
|
23
24
|
end
|
24
25
|
else
|
@@ -38,10 +39,10 @@ module OptStruct
|
|
38
39
|
end
|
39
40
|
|
40
41
|
def self.new(*args, **defaults, &callback)
|
41
|
-
_inject_struct(Class.new, self, args.map(&:to_sym), defaults, &callback)
|
42
|
+
_inject_struct(Class.new, self, args.map(&:to_sym), **defaults, &callback)
|
42
43
|
end
|
43
44
|
|
44
45
|
def self.build(*args, **defaults, &callback)
|
45
|
-
_inject_struct(Module.new, self, args.map(&:to_sym), defaults, &callback)
|
46
|
+
_inject_struct(Module.new, self, args.map(&:to_sym), **defaults, &callback)
|
46
47
|
end
|
47
48
|
end
|
@@ -11,40 +11,37 @@ module OptStruct
|
|
11
11
|
@required_keys ||= []
|
12
12
|
end
|
13
13
|
|
14
|
-
def required(*keys)
|
14
|
+
def required(*keys, **options)
|
15
15
|
required_keys.concat keys
|
16
|
-
option_accessor *keys
|
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
|
-
define_method(key)
|
22
|
-
|
23
|
-
options[key]
|
24
|
-
elsif defaults.key?(key)
|
25
|
-
options[key] = read_default_value(key)
|
26
|
-
end
|
27
|
-
end
|
21
|
+
define_method(key) { options[key] }
|
22
|
+
private key if opts[:private]
|
28
23
|
end
|
29
24
|
end
|
30
25
|
|
31
|
-
def option_writer(*keys)
|
26
|
+
def option_writer(*keys, **opts)
|
32
27
|
keys.each do |key|
|
33
|
-
|
28
|
+
meth = "#{key}=".to_sym
|
29
|
+
define_method(meth) { |value| options[key] = value }
|
30
|
+
private meth if opts[:private]
|
34
31
|
end
|
35
32
|
end
|
36
33
|
|
37
|
-
def option_accessor(*keys)
|
34
|
+
def option_accessor(*keys, **options)
|
38
35
|
check_reserved_words(keys)
|
39
|
-
option_reader *keys
|
40
|
-
option_writer *keys
|
36
|
+
option_reader *keys, **options
|
37
|
+
option_writer *keys, **options
|
41
38
|
end
|
42
39
|
|
43
|
-
def option(key, default = nil, **options)
|
40
|
+
def option(key, default = nil, required: false, **options)
|
44
41
|
default = options[:default] if options.key?(:default)
|
45
|
-
defaults[key] = default
|
46
|
-
required_keys << key if
|
47
|
-
option_accessor key
|
42
|
+
defaults[key] = default if default
|
43
|
+
required_keys << key if required
|
44
|
+
option_accessor key, **options
|
48
45
|
end
|
49
46
|
|
50
47
|
def options(*keys, **keys_defaults)
|
@@ -4,6 +4,7 @@ module OptStruct
|
|
4
4
|
with_init_callbacks do
|
5
5
|
@options = options
|
6
6
|
assign_arguments(arguments)
|
7
|
+
assign_defaults
|
7
8
|
check_required_keys
|
8
9
|
end
|
9
10
|
end
|
@@ -24,23 +25,21 @@ module OptStruct
|
|
24
25
|
raise ArgumentError, "missing required keywords: #{missing.inspect}"
|
25
26
|
end
|
26
27
|
end
|
27
|
-
|
28
|
+
|
29
|
+
def assign_defaults
|
30
|
+
defaults.each do |key, default_value|
|
31
|
+
next if options.key?(key)
|
32
|
+
options[key] = read_default_value(default_value)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
28
36
|
def assign_arguments(args)
|
29
37
|
self.class.expected_arguments.map.with_index do |key, i|
|
30
|
-
if args.length > i
|
31
|
-
options[key] = args[i]
|
32
|
-
elsif !options.key?(key)
|
33
|
-
if defaults.key?(key)
|
34
|
-
options[key] = read_default_value(key)
|
35
|
-
else
|
36
|
-
raise ArgumentError, "missing required argument: #{key}"
|
37
|
-
end
|
38
|
-
end
|
38
|
+
options[key] = args[i] if args.length > i
|
39
39
|
end
|
40
40
|
end
|
41
|
-
|
42
|
-
def read_default_value(
|
43
|
-
default = defaults[key]
|
41
|
+
|
42
|
+
def read_default_value(default)
|
44
43
|
case default
|
45
44
|
when Proc
|
46
45
|
instance_exec(&default)
|
@@ -22,8 +22,8 @@ module OptStruct
|
|
22
22
|
options
|
23
23
|
expect_arguments
|
24
24
|
).each do |class_method|
|
25
|
-
define_method(class_method) do |*args|
|
26
|
-
@_opt_structs << [[], {}, -> { send(class_method, *args) }]
|
25
|
+
define_method(class_method) do |*args, **options|
|
26
|
+
@_opt_structs << [[], {}, -> { send(class_method, *args, **options) }]
|
27
27
|
end
|
28
28
|
end
|
29
29
|
end
|
data/lib/opt_struct/version.rb
CHANGED
data/opt_struct.gemspec
CHANGED
@@ -16,8 +16,4 @@ Gem::Specification.new do |spec|
|
|
16
16
|
spec.files = `git ls-files`.split("\n").grep(/^lib/)
|
17
17
|
spec.files += %w(README.md opt_struct.gemspec)
|
18
18
|
spec.require_paths = ["lib"]
|
19
|
-
|
20
|
-
spec.add_development_dependency "bundler", ">= 1.14"
|
21
|
-
spec.add_development_dependency "rake", ">= 10.0"
|
22
|
-
spec.add_development_dependency "rspec", ">= 3.0"
|
23
19
|
end
|
metadata
CHANGED
@@ -1,57 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: opt_struct
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Carl Zulauf
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
12
|
-
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: bundler
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - ">="
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '1.14'
|
20
|
-
type: :development
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - ">="
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '1.14'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: rake
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ">="
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '10.0'
|
34
|
-
type: :development
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - ">="
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '10.0'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: rspec
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - ">="
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '3.0'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - ">="
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '3.0'
|
11
|
+
date: 2021-05-17 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
55
13
|
description: Struct with support for keyword params and mixin support
|
56
14
|
email:
|
57
15
|
- carl@linkleaf.com
|
@@ -85,7 +43,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
85
43
|
- !ruby/object:Gem::Version
|
86
44
|
version: '0'
|
87
45
|
requirements: []
|
88
|
-
rubygems_version: 3.
|
46
|
+
rubygems_version: 3.2.3
|
89
47
|
signing_key:
|
90
48
|
specification_version: 4
|
91
49
|
summary: The Option Struct
|