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 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: