ns-options 0.4.1 → 1.0.0.rc1
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.
- data/.gitignore +3 -0
- data/Gemfile +2 -1
- data/LICENSE +1 -1
- data/README.md +187 -301
- data/Rakefile +1 -1
- data/lib/ns-options/assert_macros.rb +9 -12
- data/lib/ns-options/boolean.rb +2 -0
- data/lib/ns-options/namespace.rb +34 -134
- data/lib/ns-options/namespace_advisor.rb +35 -0
- data/lib/ns-options/namespace_data.rb +166 -0
- data/lib/ns-options/namespaces.rb +23 -12
- data/lib/ns-options/option.rb +50 -24
- data/lib/ns-options/options.rb +23 -49
- data/lib/ns-options/proxy.rb +40 -53
- data/lib/ns-options/proxy_method.rb +54 -0
- data/lib/ns-options/root_methods.rb +77 -0
- data/lib/ns-options/version.rb +1 -1
- data/lib/ns-options.rb +18 -8
- data/ns-options.gemspec +3 -4
- data/test/helper.rb +3 -10
- data/test/support/app.rb +3 -1
- data/test/support/proxy.rb +4 -0
- data/test/support/type_class_proxy.rb +29 -0
- data/test/support/user.rb +5 -5
- data/test/{integration/app_test.rb → system/app_tests.rb} +8 -6
- data/test/{integration/proxy_test.rb → system/proxy_tests.rb} +12 -0
- data/test/system/type_class_proxy_tests.rb +108 -0
- data/test/system/user_tests.rb +146 -0
- data/test/unit/{ns-options/boolean_test.rb → boolean_tests.rb} +5 -4
- data/test/unit/namespace_advisor_tests.rb +69 -0
- data/test/unit/namespace_data_tests.rb +336 -0
- data/test/unit/namespace_tests.rb +205 -0
- data/test/unit/namespaces_tests.rb +99 -0
- data/test/unit/{ns-options/option_test.rb → option_tests.rb} +155 -93
- data/test/unit/options_tests.rb +152 -0
- data/test/unit/proxy_method_tests.rb +87 -0
- data/test/unit/{ns-options/proxy_test.rb → proxy_tests.rb} +52 -0
- data/test/unit/root_methods_tests.rb +126 -0
- metadata +58 -63
- data/lib/ns-options/errors/invalid_name.rb +0 -15
- data/lib/ns-options/has_options.rb +0 -53
- data/lib/ns-options/helper/advisor.rb +0 -88
- data/lib/ns-options/helper.rb +0 -87
- data/test/integration/user_test.rb +0 -94
- data/test/unit/ns-options/has_options_test.rb +0 -90
- data/test/unit/ns-options/helper/advisor_test.rb +0 -148
- data/test/unit/ns-options/helper_test.rb +0 -56
- data/test/unit/ns-options/namespace_test.rb +0 -432
- data/test/unit/ns-options/namespaces_test.rb +0 -55
- data/test/unit/ns-options/options_test.rb +0 -221
- /data/test/unit/{ns-options/assert_macros_test.rb → assert_macros_tests.rb} +0 -0
data/lib/ns-options/options.rb
CHANGED
@@ -1,76 +1,50 @@
|
|
1
|
+
require 'ns-options/option'
|
2
|
+
|
1
3
|
module NsOptions
|
2
4
|
|
3
|
-
class Options
|
4
|
-
attr_accessor :key, :parent, :namespaces
|
5
|
+
class Options
|
5
6
|
|
6
|
-
def initialize
|
7
|
-
|
8
|
-
self.parent = parent
|
9
|
-
self.namespaces = NsOptions::Namespaces.new
|
7
|
+
def initialize
|
8
|
+
@hash = Hash.new
|
10
9
|
end
|
11
10
|
|
12
|
-
|
13
|
-
|
14
|
-
end
|
15
|
-
def []=(name, value)
|
16
|
-
super(name.to_sym, value)
|
17
|
-
end
|
11
|
+
# for hash with indifferent access behavior
|
12
|
+
def [](name); @hash[name.to_s]; end
|
13
|
+
def []=(name, value); @hash[name.to_s] = value; end
|
18
14
|
|
19
|
-
def
|
20
|
-
|
21
|
-
|
15
|
+
def keys(*args, &block); @hash.keys(*args, &block); end
|
16
|
+
def each(*args, &block); @hash.each(*args, &block); end
|
17
|
+
def empty?(*args, &block); @hash.empty?(*args, &block); end
|
18
|
+
|
19
|
+
def add(name, opt)
|
20
|
+
self[name] = opt
|
22
21
|
end
|
23
22
|
|
24
|
-
def
|
25
|
-
|
23
|
+
def rm(name)
|
24
|
+
@hash.delete(name.to_s)
|
26
25
|
end
|
27
|
-
alias :remove :del
|
28
26
|
|
29
27
|
def get(name)
|
30
|
-
option = self[name]
|
31
|
-
option and option.value
|
28
|
+
(option = self[name]) ? option.value : nil
|
32
29
|
end
|
33
30
|
|
34
31
|
def set(name, new_value)
|
35
32
|
self[name].value = new_value
|
36
|
-
self[name]
|
37
|
-
end
|
38
|
-
|
39
|
-
def is_defined?(name)
|
40
|
-
!!self[name]
|
41
33
|
end
|
42
34
|
|
43
35
|
def required_set?
|
44
|
-
|
45
|
-
bool && option.is_set?
|
46
|
-
end
|
36
|
+
are_all_these_options_set? required_options
|
47
37
|
end
|
48
38
|
|
49
|
-
|
50
|
-
key ||= name
|
51
|
-
self.namespaces.add(name, key, parent, &block)
|
52
|
-
end
|
39
|
+
private
|
53
40
|
|
54
|
-
def
|
55
|
-
|
41
|
+
def are_all_these_options_set?(options)
|
42
|
+
options.inject(true) {|bool, opt| bool && opt.is_set?}
|
56
43
|
end
|
57
44
|
|
58
|
-
def
|
59
|
-
|
60
|
-
end
|
61
|
-
|
62
|
-
def build_from(options, namespace)
|
63
|
-
options.each do |key, option|
|
64
|
-
self.add(option.name, option.type_class, option.rules)
|
65
|
-
NsOptions::Helper.find_and_define_option(namespace, option.name)
|
66
|
-
end
|
67
|
-
options.namespaces.each do |name, ns|
|
68
|
-
new_namespace = self.add_namespace(name, ns.options.key, ns.options.parent)
|
69
|
-
NsOptions::Helper.find_and_define_namespace(namespace, name)
|
70
|
-
new_namespace.options.build_from(ns.options, new_namespace)
|
71
|
-
end
|
45
|
+
def required_options
|
46
|
+
@hash.values.reject{|opt| !opt.required? }
|
72
47
|
end
|
73
48
|
|
74
49
|
end
|
75
|
-
|
76
50
|
end
|
data/lib/ns-options/proxy.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'ns-options'
|
2
|
+
require 'ns-options/proxy_method'
|
2
3
|
|
3
4
|
module NsOptions::Proxy
|
4
5
|
|
@@ -8,89 +9,75 @@ module NsOptions::Proxy
|
|
8
9
|
|
9
10
|
NAMESPACE = "__proxy_options__"
|
10
11
|
|
11
|
-
|
12
|
+
def self.included(receiver)
|
13
|
+
NsOptions::RootMethods.new(receiver, NAMESPACE).define
|
14
|
+
receiver.class_eval { extend ProxyMethods }
|
15
|
+
receiver.class_eval { include ProxyMethods } if receiver.kind_of?(Class)
|
12
16
|
|
13
|
-
|
14
|
-
|
15
|
-
receiver.class_eval { extend ProxyMethods }
|
16
|
-
receiver.class_eval { include ProxyMethods } if receiver.kind_of?(Class)
|
17
|
+
if receiver.kind_of?(Class)
|
18
|
+
receiver.class_eval do
|
17
19
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
def initialize(configs={})
|
23
|
-
self.apply(configs || {})
|
24
|
-
end
|
20
|
+
# This hook copies the proxy definition to any subclasses
|
21
|
+
def self.inherited(subclass)
|
22
|
+
subclass.__proxy_options__.build_from(self.__proxy_options__)
|
23
|
+
end
|
25
24
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
25
|
+
# default initializer method
|
26
|
+
def initialize(configs=nil)
|
27
|
+
self.apply(configs || {})
|
28
|
+
end
|
30
29
|
|
30
|
+
# equality method override for class-instance proxies
|
31
|
+
def ==(other_proxy_instance)
|
32
|
+
__proxy_options__ == other_proxy_instance.__proxy_options__
|
31
33
|
end
|
32
|
-
else # Module
|
33
|
-
receiver.class_eval do
|
34
34
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
end
|
35
|
+
end
|
36
|
+
else # Module
|
37
|
+
receiver.class_eval do
|
39
38
|
|
39
|
+
# default initializer method
|
40
|
+
def self.new(configs=nil)
|
41
|
+
self.apply(configs || {})
|
40
42
|
end
|
43
|
+
|
41
44
|
end
|
42
45
|
end
|
43
|
-
|
44
46
|
end
|
45
47
|
|
46
48
|
module ProxyMethods
|
47
49
|
|
48
50
|
# pass thru namespace methods to the proxied NAMESPACE handler
|
49
51
|
|
50
|
-
def option(*args, &block)
|
51
|
-
__proxy_options__.option(*args, &block)
|
52
|
+
def option(name, *args, &block)
|
53
|
+
__proxy_options__.option(name, *args, &block)
|
54
|
+
NsOptions::ProxyMethod.new(self, name, 'an option').define($stdout, caller)
|
52
55
|
end
|
53
56
|
alias_method :opt, :option
|
54
57
|
|
55
|
-
def namespace(*args, &block)
|
56
|
-
__proxy_options__.namespace(*args, &block)
|
58
|
+
def namespace(name, *args, &block)
|
59
|
+
__proxy_options__.namespace(name, *args, &block)
|
60
|
+
NsOptions::ProxyMethod.new(self, name, 'a namespace').define($stdout, caller)
|
57
61
|
end
|
58
62
|
alias_method :ns, :namespace
|
59
63
|
|
60
|
-
def apply(*args, &block)
|
61
|
-
|
62
|
-
end
|
63
|
-
|
64
|
-
def to_hash(*args, &block)
|
65
|
-
__proxy_options__.to_hash(*args, &block)
|
66
|
-
end
|
67
|
-
|
68
|
-
def each(*args, &block)
|
69
|
-
__proxy_options__.each(*args, &block)
|
70
|
-
end
|
71
|
-
|
72
|
-
def define(*args, &block)
|
73
|
-
__proxy_options__.define(*args, &block)
|
74
|
-
end
|
75
|
-
|
76
|
-
def required_set?(*args, &block)
|
77
|
-
__proxy_options__.required_set?(*args, &block)
|
78
|
-
end
|
64
|
+
def apply(*args, &block); __proxy_options__.apply(*args, &block); end
|
65
|
+
def to_hash(*args, &block); __proxy_options__.to_hash(*args, &block); end
|
66
|
+
def each(*args, &block); __proxy_options__.each(*args, &block); end
|
67
|
+
def define(*args, &block); __proxy_options__.define(*args, &block); end
|
79
68
|
|
80
|
-
def
|
81
|
-
|
82
|
-
end
|
69
|
+
def required_set?(*args, &block); __proxy_options__.required_set?(*args, &block); end
|
70
|
+
def valid?(*args, &block); __proxy_options__.valid?(*args, &block); end
|
83
71
|
|
84
72
|
def inspect(*args, &block)
|
85
|
-
|
86
|
-
"#<#{self.class}:#{'0x%x' % (self.object_id << 1)}:#{__proxy_options__.options.key} #{__proxy_options__.to_hash.inspect}>"
|
73
|
+
"#<#{self.class}:#{'0x%x' % (self.object_id << 1)}:#{__proxy_options__.__name__} #{__proxy_options__.to_hash.inspect}>"
|
87
74
|
end
|
88
75
|
|
89
76
|
# for everything else, send to the proxied NAMESPACE handler
|
90
|
-
# at this point it really just enables
|
77
|
+
# at this point it really just enables dynamic options writers
|
91
78
|
|
92
79
|
def method_missing(meth, *args, &block)
|
93
|
-
if (po =
|
80
|
+
if (po = __proxy_options__) && po.respond_to?(meth.to_s)
|
94
81
|
po.send(meth.to_s, *args, &block)
|
95
82
|
else
|
96
83
|
super
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'ns-options/namespace'
|
2
|
+
require 'ns-options/option'
|
3
|
+
|
4
|
+
module NsOptions
|
5
|
+
class ProxyMethod
|
6
|
+
|
7
|
+
# This class handles defining proxy class methods for classes or modules
|
8
|
+
# and an additional instance method for classes.
|
9
|
+
|
10
|
+
def initialize(define_on, name, kind)
|
11
|
+
@define_on, @name, @kind = define_on, name, kind
|
12
|
+
@meth_extension_mixin = Module.new
|
13
|
+
@meth_extension_mixin.class_eval proxy_meth_code
|
14
|
+
end
|
15
|
+
|
16
|
+
def define_on_class?
|
17
|
+
!!@define_on.kind_of?(::Class)
|
18
|
+
end
|
19
|
+
|
20
|
+
def define(io=nil, from_caller=nil)
|
21
|
+
validate(io || $stdout, from_caller || caller)
|
22
|
+
|
23
|
+
# covers defining the class-level method on Modules or Classes
|
24
|
+
@define_on.send :extend, @meth_extension_mixin
|
25
|
+
|
26
|
+
# covers defining the instance-level method on Classes
|
27
|
+
@define_on.send :include, @meth_extension_mixin if define_on_class?
|
28
|
+
end
|
29
|
+
|
30
|
+
def validate(io, from_caller)
|
31
|
+
return true unless not_recommended_meth_names.include?(@name.to_sym)
|
32
|
+
|
33
|
+
io.puts "WARNING: Defining #{@kind} with the name `#{@name}' overwrites a"\
|
34
|
+
" method NsOptions::Proxy depends on and may cause it to not"\
|
35
|
+
" behave correctly."
|
36
|
+
io.puts from_caller.first
|
37
|
+
false
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def proxy_meth_code
|
43
|
+
"def #{@name}(*args, &block); __proxy_options__.#{@name}(*args, &block); end"
|
44
|
+
end
|
45
|
+
|
46
|
+
def not_recommended_meth_names
|
47
|
+
[ :option, :opt, :namespace, :ns,
|
48
|
+
:define, :inspect, :method_missing, :respond_to?,
|
49
|
+
:apply, :to_hash, :each, :required_set?, :valid?,
|
50
|
+
]
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'ns-options/namespace'
|
2
|
+
|
3
|
+
module NsOptions
|
4
|
+
class RootMethods
|
5
|
+
|
6
|
+
# This class handles defining a root namespace class method for classes
|
7
|
+
# or modules and an additional instance method for classes. For classes, the
|
8
|
+
# instance method will build an entirely new namespace, distinct from the
|
9
|
+
# class level namespace but with an identical definition
|
10
|
+
|
11
|
+
def initialize(define_on, name)
|
12
|
+
@define_on, @name = define_on, name
|
13
|
+
@class_meth_extension = Module.new
|
14
|
+
@instance_meth_mixin = Module.new
|
15
|
+
end
|
16
|
+
|
17
|
+
def define_on_class?
|
18
|
+
!!@define_on.kind_of?(::Class)
|
19
|
+
end
|
20
|
+
|
21
|
+
def define(io=nil, from_caller=nil)
|
22
|
+
validate(io || $stdout, from_caller || caller)
|
23
|
+
|
24
|
+
# covers defining the class-level method on Modules or Classes
|
25
|
+
@class_meth_extension.class_eval class_meth_extension_code
|
26
|
+
@define_on.send :extend, @class_meth_extension
|
27
|
+
|
28
|
+
if define_on_class?
|
29
|
+
# covers defining the instance-level method on Classes
|
30
|
+
@instance_meth_mixin.class_eval instance_meth_mixin_code
|
31
|
+
@define_on.send :include, @instance_meth_mixin
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def validate(io, from_caller)
|
36
|
+
return true unless [:options, :opts, :namespace, :ns].include?(@name.to_sym)
|
37
|
+
|
38
|
+
io.puts "WARNING: Defining an option namespace with the name `#{@name}'"\
|
39
|
+
" overwrites a method NsOptions depends on. You won't be able to"\
|
40
|
+
" define any additional option namespaces using the `#{@name}'"\
|
41
|
+
" method."
|
42
|
+
io.puts from_caller.first
|
43
|
+
false
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def class_meth_extension_code
|
49
|
+
%{
|
50
|
+
def #{@name}(*args, &block)
|
51
|
+
unless @#{@name}
|
52
|
+
@#{@name} = NsOptions::Namespace.new('#{@name}', *args, &block)
|
53
|
+
if respond_to?('superclass') && superclass &&
|
54
|
+
superclass.respond_to?('#{@name}') &&
|
55
|
+
superclass.#{@name}.kind_of?(NsOptions::Namespace)
|
56
|
+
@#{@name}.build_from(superclass.#{@name})
|
57
|
+
end
|
58
|
+
end
|
59
|
+
@#{@name}
|
60
|
+
end
|
61
|
+
}
|
62
|
+
end
|
63
|
+
|
64
|
+
def instance_meth_mixin_code
|
65
|
+
%{
|
66
|
+
def #{@name}(*args, &block)
|
67
|
+
unless @#{@name}
|
68
|
+
@#{@name} = NsOptions::Namespace.new('#{@name}', *args, &block)
|
69
|
+
@#{@name}.build_from(self.class.#{@name})
|
70
|
+
end
|
71
|
+
@#{@name}
|
72
|
+
end
|
73
|
+
}
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
end
|
data/lib/ns-options/version.rb
CHANGED
data/lib/ns-options.rb
CHANGED
@@ -1,16 +1,26 @@
|
|
1
|
-
require 'ns-options/
|
2
|
-
require 'ns-options/helper'
|
3
|
-
require 'ns-options/namespace'
|
4
|
-
require 'ns-options/namespaces'
|
5
|
-
require 'ns-options/option'
|
6
|
-
require 'ns-options/options'
|
1
|
+
require 'ns-options/root_methods'
|
7
2
|
require 'ns-options/proxy'
|
8
|
-
require 'ns-options/version' if !defined?(NsOptions::VERSION)
|
9
3
|
|
10
4
|
module NsOptions
|
11
5
|
|
12
6
|
def self.included(receiver)
|
13
|
-
receiver.
|
7
|
+
receiver.class_eval { extend NsOptions::DSL }
|
8
|
+
end
|
9
|
+
|
10
|
+
module DSL
|
11
|
+
|
12
|
+
# This is the main DSL method for creating a namespace of options for your
|
13
|
+
# class/module. This will define a class method for classes/modules and
|
14
|
+
# an additional instance method for classes.
|
15
|
+
|
16
|
+
def options(name, *args, &block)
|
17
|
+
NsOptions::RootMethods.new(self, name).define($stdout, caller)
|
18
|
+
self.send(name, *args, &block)
|
19
|
+
end
|
20
|
+
alias_method :opts, :options
|
21
|
+
alias_method :namespace, :options
|
22
|
+
alias_method :ns, :options
|
23
|
+
|
14
24
|
end
|
15
25
|
|
16
26
|
end
|
data/ns-options.gemspec
CHANGED
@@ -4,8 +4,8 @@ require File.expand_path('../lib/ns-options/version', __FILE__)
|
|
4
4
|
Gem::Specification.new do |gem|
|
5
5
|
gem.authors = ["Collin Redding"]
|
6
6
|
gem.email = ["collin.redding@reelfx.com"]
|
7
|
-
gem.description = %q{
|
8
|
-
gem.summary = %q{
|
7
|
+
gem.description = %q{A DSL for defining, organizing and accessing options.}
|
8
|
+
gem.summary = %q{A DSL for defining, organizing and accessing options.}
|
9
9
|
|
10
10
|
gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
11
11
|
gem.files = `git ls-files`.split("\n")
|
@@ -14,6 +14,5 @@ Gem::Specification.new do |gem|
|
|
14
14
|
gem.require_paths = ["lib"]
|
15
15
|
gem.version = NsOptions::VERSION
|
16
16
|
|
17
|
-
gem.add_development_dependency("assert",
|
18
|
-
gem.add_development_dependency("assert-mocha", ["~>0.1"])
|
17
|
+
gem.add_development_dependency("assert", ["~>0.8"])
|
19
18
|
end
|
data/test/helper.rb
CHANGED
@@ -1,21 +1,14 @@
|
|
1
1
|
$LOAD_PATH.unshift(File.expand_path("../..", __FILE__))
|
2
2
|
|
3
|
-
require 'logger'
|
4
|
-
require 'ns-options'
|
5
|
-
|
6
|
-
require 'test/support/app'
|
7
|
-
require 'test/support/user'
|
8
|
-
|
9
|
-
require 'assert-mocha'
|
10
|
-
|
11
3
|
module NsOptions
|
12
4
|
module TestOutput
|
13
5
|
|
14
6
|
module_function
|
15
7
|
|
16
8
|
def capture
|
17
|
-
out =
|
18
|
-
|
9
|
+
out = ""
|
10
|
+
io = StringIO.new(out)
|
11
|
+
$stdout = io
|
19
12
|
yield
|
20
13
|
return out
|
21
14
|
ensure
|
data/test/support/app.rb
CHANGED
@@ -1,11 +1,13 @@
|
|
1
|
+
require 'ns-options'
|
1
2
|
require 'ns-options/boolean'
|
3
|
+
require 'logger'
|
2
4
|
|
3
5
|
module App
|
4
6
|
|
5
7
|
# mixin on just the top-level NsOptions variant
|
6
8
|
include NsOptions
|
7
9
|
|
8
|
-
options(:settings
|
10
|
+
options(:settings) do
|
9
11
|
option :root, Pathname
|
10
12
|
option :stage
|
11
13
|
option :logger, Logger
|
data/test/support/proxy.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'ns-options'
|
2
|
+
|
1
3
|
module SomeProxy
|
2
4
|
include NsOptions::Proxy
|
3
5
|
|
@@ -14,6 +16,8 @@ module SomeProxy
|
|
14
16
|
|
15
17
|
end
|
16
18
|
|
19
|
+
class SomeOtherThing < SomeThing; end
|
20
|
+
|
17
21
|
opt :some, SomeThing, :default => { :value1 => 1 }
|
18
22
|
opt :some_prime, SomeThing, :default => { :value1 => 'one' }
|
19
23
|
opt :stuff, :default => []
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'ns-options'
|
2
|
+
|
3
|
+
class DefaultTypeClass < Struct.new(:value); end
|
4
|
+
|
5
|
+
class TypeClassProxy
|
6
|
+
include NsOptions::Proxy
|
7
|
+
|
8
|
+
option_type_class DefaultTypeClass
|
9
|
+
|
10
|
+
opt :value1 # test that DefaultTypeClass is used
|
11
|
+
|
12
|
+
ns :more do
|
13
|
+
opt :more1 # that it is used recursively
|
14
|
+
end
|
15
|
+
|
16
|
+
ns :strings do
|
17
|
+
opt_type_class String
|
18
|
+
opt :string1 # that it can be over written
|
19
|
+
end
|
20
|
+
|
21
|
+
ns :objs, Object do
|
22
|
+
type_class Object
|
23
|
+
opt :obj1 # and that it can be reset to the default
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
class InheritedTypeClassProxy < TypeClassProxy; end
|
29
|
+
class DoubleInheritedTypeClassProxy < InheritedTypeClassProxy; end
|
data/test/support/user.rb
CHANGED
@@ -1,14 +1,14 @@
|
|
1
|
+
require 'ns-options'
|
1
2
|
require 'ns-options/boolean'
|
2
3
|
|
3
4
|
class User
|
4
5
|
|
5
|
-
|
6
|
-
include NsOptions::HasOptions
|
6
|
+
include NsOptions
|
7
7
|
|
8
|
-
options(:preferences
|
8
|
+
options(:preferences) do
|
9
9
|
option :home_url
|
10
|
-
option :show_messages, NsOptions::Boolean, :
|
11
|
-
option :font_size, Integer, :default
|
10
|
+
option :show_messages, NsOptions::Boolean, :required => true
|
11
|
+
option :font_size, Integer, :default => 12
|
12
12
|
|
13
13
|
namespace :view do
|
14
14
|
option :color
|
@@ -1,8 +1,9 @@
|
|
1
1
|
require 'assert'
|
2
|
+
require 'test/support/app'
|
2
3
|
|
3
4
|
module App
|
4
5
|
|
5
|
-
class
|
6
|
+
class BaseTests < Assert::Context
|
6
7
|
desc "the App module"
|
7
8
|
setup do
|
8
9
|
@module = App
|
@@ -13,7 +14,7 @@ module App
|
|
13
14
|
|
14
15
|
end
|
15
16
|
|
16
|
-
class
|
17
|
+
class DefineTests < BaseTests
|
17
18
|
desc "defined"
|
18
19
|
setup do
|
19
20
|
stage = @stage = "test"
|
@@ -32,9 +33,9 @@ module App
|
|
32
33
|
end
|
33
34
|
subject{ @module.settings }
|
34
35
|
|
35
|
-
should have_instance_methods :namespace, :option, :define
|
36
|
+
should have_instance_methods :namespace, :option, :define
|
36
37
|
should have_accessors :stage, :root, :logger
|
37
|
-
should
|
38
|
+
should have_readers :sub
|
38
39
|
|
39
40
|
should "have set the stage to 'test'" do
|
40
41
|
assert_equal @stage, subject.stage
|
@@ -46,7 +47,7 @@ module App
|
|
46
47
|
|
47
48
|
should "have set the logger to the passed logger" do
|
48
49
|
assert_equal @logger, subject.logger
|
49
|
-
assert_same
|
50
|
+
assert_same @logger, subject.logger
|
50
51
|
end
|
51
52
|
|
52
53
|
should "have set its self_stage option to its stage" do
|
@@ -56,13 +57,14 @@ module App
|
|
56
57
|
|
57
58
|
end
|
58
59
|
|
59
|
-
class
|
60
|
+
class SubNamespaceTests < DefineTests
|
60
61
|
desc "the sub namespace"
|
61
62
|
subject{ @module.settings.sub }
|
62
63
|
|
63
64
|
should "have set the run_commands option" do
|
64
65
|
assert_equal @run, subject.run_commands
|
65
66
|
end
|
67
|
+
|
66
68
|
end
|
67
69
|
|
68
70
|
end
|
@@ -39,3 +39,15 @@ class SomeProxySomeThingTests < SomeProxyIntTests
|
|
39
39
|
end
|
40
40
|
|
41
41
|
end
|
42
|
+
|
43
|
+
class SomeProxySomeOtherThingTests < SomeProxyIntTests
|
44
|
+
desc "that has a class inherited from another proxy object"
|
45
|
+
setup do
|
46
|
+
@proxy = SomeProxy::SomeOtherThing.new
|
47
|
+
end
|
48
|
+
|
49
|
+
# should "have the same definition as its superclass"
|
50
|
+
should have_namespace :more
|
51
|
+
should have_options :value1, :value2
|
52
|
+
|
53
|
+
end
|