opt_struct 1.0.2 → 1.3.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: 1a79bedcca81ddc59a72499b1f82bce3d62eab52e6114d290c9a7f3ecc30aed3
4
- data.tar.gz: c677a0a669325ff7e37020092e8e78771bd828c1ced6b4421fd9f463b0e55fe2
3
+ metadata.gz: b76ee40e5f6c8f06f6f80efdefa9a595b48f4d07a3c98d6830fd515133038399
4
+ data.tar.gz: a9643c5ee83f52613f47e6e079445cc5912853ffb17b195f00b3e6496b2cfc03
5
5
  SHA512:
6
- metadata.gz: aad59c9b29833cc340d1e31c504ab18b1b67176f54749c3cf9612f2c52daeb3e3accd9a8d6d6fdcbcdb6bd14b889574befb4071fdfb123b29acfc4bba9777e28
7
- data.tar.gz: fc8bc8a0eda420826906a256cbccaccdb358c61351dda152753f2011b2b2e4a382b6310de9a0a2313f56d0e013c24e9204e1a48749a78af978ea1ba560d5e84d
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 < OptStruct.new(email: nil, role: "member")
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 = {}, &callback)
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? || callback
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 if s_defaults.any?
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) do
22
- if options.key?(key)
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
- define_method("#{key}=") { |value| options[key] = value }
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 options[:required]
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(key)
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
@@ -1,3 +1,3 @@
1
1
  module OptStruct
2
- VERSION = "1.0.2"
2
+ VERSION = "1.3.0"
3
3
  end
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.2
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: 2019-10-06 00:00:00.000000000 Z
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.0.4
46
+ rubygems_version: 3.2.3
89
47
  signing_key:
90
48
  specification_version: 4
91
49
  summary: The Option Struct