opt_struct 0.6.0 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/opt_struct.rb +13 -23
- data/lib/opt_struct/class_methods.rb +18 -0
- data/lib/opt_struct/module_methods.rb +30 -0
- data/opt_struct.gemspec +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 97cdaee22a1c74440c23a4107a054b31be14e14c
|
4
|
+
data.tar.gz: 103a25d331444af311700ee23efa51fcc3526c82
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6a62a3d36c523e61e0c470ce3e9549d7a9991b2f621906f3c932d215fb4c8227fc1ad55a38b7f24839dc943f0dc3cd0d30e58c2a49e3f87d26acd58fbefa5a63
|
7
|
+
data.tar.gz: 6e52a658e7250f1f1ff142c1b9ab83eedf8460d7bacfc2ff9d8dad9272421b78a1aab572a6d51b311abacfe85f638a1970452d3f7695d0d3b5846f8cf5639f29
|
data/lib/opt_struct.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
require "opt_struct/class_methods"
|
2
|
+
require "opt_struct/module_methods"
|
2
3
|
require "opt_struct/instance_methods"
|
3
4
|
|
4
5
|
module OptStruct
|
6
|
+
|
5
7
|
def self._inject_struct(target, source, args = [], defaults = {}, &callback)
|
6
8
|
structs = Array(source.instance_variable_get(:@_opt_structs)).dup
|
7
9
|
if args.any? || defaults.any? || callback
|
@@ -15,19 +17,12 @@ module OptStruct
|
|
15
17
|
include InstanceMethods
|
16
18
|
end
|
17
19
|
structs.each do |s_args, s_defaults, s_callback|
|
18
|
-
target.
|
19
|
-
|
20
|
-
|
21
|
-
end
|
22
|
-
target.class_exec(&s_callback) if s_callback
|
20
|
+
target.expect_arguments *s_args if s_args.any?
|
21
|
+
target.options s_defaults if s_defaults.any?
|
22
|
+
target.class_exec(&s_callback) if s_callback
|
23
23
|
end
|
24
24
|
else
|
25
|
-
target.
|
26
|
-
def self.included(klass)
|
27
|
-
OptStruct._inject_struct(klass, self)
|
28
|
-
super(klass)
|
29
|
-
end
|
30
|
-
end
|
25
|
+
target.singleton_class.prepend ModuleMethods
|
31
26
|
end
|
32
27
|
target
|
33
28
|
end
|
@@ -37,21 +32,16 @@ module OptStruct
|
|
37
32
|
super(klass)
|
38
33
|
end
|
39
34
|
|
40
|
-
def self.
|
41
|
-
|
42
|
-
|
43
|
-
_inject_struct(Class.new, self, args, defaults, &callback)
|
35
|
+
def self.prepended(klass)
|
36
|
+
_inject_struct(klass, self)
|
37
|
+
super(klass)
|
44
38
|
end
|
45
39
|
|
46
|
-
def self.
|
47
|
-
|
48
|
-
args.map!(&:to_sym)
|
49
|
-
_inject_struct(Module.new, self, args, defaults, &callback)
|
40
|
+
def self.new(*args, **defaults, &callback)
|
41
|
+
_inject_struct(Class.new, self, args.map(&:to_sym), defaults, &callback)
|
50
42
|
end
|
51
43
|
|
52
|
-
|
53
|
-
|
54
|
-
def self.check_for_invalid_args(args)
|
55
|
-
|
44
|
+
def self.build(*args, **defaults, &callback)
|
45
|
+
_inject_struct(Module.new, self, args.map(&:to_sym), defaults, &callback)
|
56
46
|
end
|
57
47
|
end
|
@@ -16,12 +16,16 @@ module OptStruct
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def option_reader(*keys)
|
19
|
+
check_reserved_words(keys)
|
20
|
+
|
19
21
|
keys.each do |key|
|
20
22
|
define_method(key) { options[key] }
|
21
23
|
end
|
22
24
|
end
|
23
25
|
|
24
26
|
def option_writer(*keys)
|
27
|
+
check_reserved_words(keys)
|
28
|
+
|
25
29
|
keys.each do |key|
|
26
30
|
define_method("#{key}=") { |value| options[key] = value }
|
27
31
|
end
|
@@ -52,6 +56,8 @@ module OptStruct
|
|
52
56
|
end
|
53
57
|
|
54
58
|
def expect_arguments(*arguments)
|
59
|
+
check_reserved_words(arguments)
|
60
|
+
|
55
61
|
existing = expected_arguments.count
|
56
62
|
expected_arguments.concat(arguments)
|
57
63
|
|
@@ -66,5 +72,17 @@ module OptStruct
|
|
66
72
|
def expected_arguments
|
67
73
|
@expected_arguments ||= []
|
68
74
|
end
|
75
|
+
|
76
|
+
private
|
77
|
+
|
78
|
+
RESERVED_WORDS = %i(class options fetch check_required_args check_required_keys)
|
79
|
+
|
80
|
+
def check_reserved_words(words)
|
81
|
+
Array(words).each do |word|
|
82
|
+
if RESERVED_WORDS.member?(word)
|
83
|
+
raise ArgumentError, "Use of reserved word is not permitted: #{word.inspect}"
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
69
87
|
end
|
70
88
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module OptStruct
|
2
|
+
module ModuleMethods
|
3
|
+
|
4
|
+
def included(klass)
|
5
|
+
OptStruct._inject_struct(klass, self)
|
6
|
+
super(klass)
|
7
|
+
end
|
8
|
+
|
9
|
+
def prepended(klass)
|
10
|
+
OptStruct._inject_struct(klass, self)
|
11
|
+
super(klass)
|
12
|
+
end
|
13
|
+
|
14
|
+
# These methods are meant to duplicate the macro methods in ClassMethods
|
15
|
+
# When they are called in a module the action is deferred by adding a block to the struct chain
|
16
|
+
%i(
|
17
|
+
required
|
18
|
+
option_reader
|
19
|
+
option_writer
|
20
|
+
option_accessor
|
21
|
+
option
|
22
|
+
options
|
23
|
+
expect_arguments
|
24
|
+
).each do |class_method|
|
25
|
+
define_method(class_method) do |*args|
|
26
|
+
@_opt_structs << [[], {}, -> { send(class_method, *args) }]
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/opt_struct.gemspec
CHANGED
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: 0.
|
4
|
+
version: 0.7.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: 2017-06-
|
11
|
+
date: 2017-06-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -63,6 +63,7 @@ files:
|
|
63
63
|
- lib/opt_struct.rb
|
64
64
|
- lib/opt_struct/class_methods.rb
|
65
65
|
- lib/opt_struct/instance_methods.rb
|
66
|
+
- lib/opt_struct/module_methods.rb
|
66
67
|
- opt_struct.gemspec
|
67
68
|
homepage: https://github.com/carlzulauf/opt_struct
|
68
69
|
licenses:
|