opt_struct 0.6.0 → 0.7.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 86875cc60a9f0c8baa956deb6b0f262ec19bab4e
4
- data.tar.gz: bfa7c755fc3a9f33fcf4f75be7c9a3a4d94d350b
3
+ metadata.gz: 97cdaee22a1c74440c23a4107a054b31be14e14c
4
+ data.tar.gz: 103a25d331444af311700ee23efa51fcc3526c82
5
5
  SHA512:
6
- metadata.gz: 8382e279bf7d34c822df3ce74b6dad5f99f5a39a3300110eac6ad5009ddfbd14ba0ffe83a2ff2e83e7348c2505add8ff5b01cb804ede7c120c9534d07cbb7191
7
- data.tar.gz: 30ad8a248b2eb6cae7284f947fe2fe629799f47b34e80985329b6560c358d72f8a7be8a70b5f8e14b686fbf0cf1ff9c9dce3efd51ff94c801a416cef913fc3b5
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.class_exec do
19
- expect_arguments *s_args if s_args.any?
20
- options s_defaults if s_defaults.any?
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.instance_exec do
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.new(*args, **defaults, &callback)
41
- check_for_invalid_args(args)
42
- args.map!(&:to_sym)
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.build(*args, **defaults, &callback)
47
- check_for_invalid_args(args)
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
- private
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
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |spec|
2
2
  spec.name = "opt_struct"
3
- spec.version = "0.6.0"
3
+ spec.version = "0.7.0"
4
4
  spec.authors = ["Carl Zulauf"]
5
5
  spec.email = ["carl@linkleaf.com"]
6
6
 
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.6.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-10 00:00:00.000000000 Z
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: