gorillib 0.4.1pre → 0.4.2pre
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +13 -10
- data/.rspec +1 -1
- data/.yardopts +1 -0
- data/CHANGELOG.md +47 -0
- data/Gemfile +22 -19
- data/Guardfile +23 -9
- data/README.md +12 -12
- data/Rakefile +29 -40
- data/VERSION +1 -1
- data/examples/benchmark/factories_benchmark.rb +87 -0
- data/examples/builder/ironfan.rb +1 -19
- data/examples/hash/slicing_methods.rb +101 -0
- data/gorillib.gemspec +36 -35
- data/lib/gorillib/array/deep_compact.rb +4 -3
- data/lib/gorillib/array/simple_statistics.rb +76 -0
- data/lib/gorillib/base.rb +0 -1
- data/lib/gorillib/builder.rb +15 -30
- data/lib/gorillib/collection.rb +159 -57
- data/lib/gorillib/collection/model_collection.rb +136 -43
- data/lib/gorillib/datetime/parse.rb +4 -2
- data/lib/gorillib/{array → deprecated/array}/average.rb +0 -0
- data/lib/gorillib/{array → deprecated/array}/random.rb +2 -1
- data/lib/gorillib/{array → deprecated/array}/sorted_median.rb +0 -0
- data/lib/gorillib/{array → deprecated/array}/sorted_percentile.rb +0 -0
- data/lib/gorillib/deprecated/array/sorted_sample.rb +13 -0
- data/lib/gorillib/{metaprogramming → deprecated/metaprogramming}/aliasing.rb +0 -0
- data/lib/gorillib/enumerable/sum.rb +3 -3
- data/lib/gorillib/exception/raisers.rb +92 -22
- data/lib/gorillib/factories.rb +550 -0
- data/lib/gorillib/hash/mash.rb +15 -58
- data/lib/gorillib/hashlike/deep_compact.rb +2 -2
- data/lib/gorillib/hashlike/slice.rb +55 -40
- data/lib/gorillib/model.rb +5 -3
- data/lib/gorillib/model/base.rb +33 -119
- data/lib/gorillib/model/defaults.rb +58 -14
- data/lib/gorillib/model/errors.rb +10 -0
- data/lib/gorillib/model/factories.rb +1 -367
- data/lib/gorillib/model/field.rb +40 -18
- data/lib/gorillib/model/fixup.rb +16 -0
- data/lib/gorillib/model/positional_fields.rb +35 -0
- data/lib/gorillib/model/schema_magic.rb +162 -0
- data/lib/gorillib/model/serialization.rb +1 -2
- data/lib/gorillib/model/serialization/csv.rb +59 -0
- data/lib/gorillib/pathname.rb +19 -8
- data/lib/gorillib/some.rb +2 -0
- data/lib/gorillib/string/constantize.rb +17 -10
- data/lib/gorillib/string/inflector.rb +11 -7
- data/lib/gorillib/type/boolean.rb +40 -0
- data/lib/gorillib/type/extended.rb +76 -40
- data/lib/gorillib/type/url.rb +6 -4
- data/lib/gorillib/utils/console.rb +1 -18
- data/lib/gorillib/utils/edge_cases.rb +18 -0
- data/spec/examples/builder/ironfan_spec.rb +5 -10
- data/spec/gorillib/array/compact_blank_spec.rb +36 -21
- data/spec/gorillib/array/simple_statistics_spec.rb +143 -0
- data/spec/gorillib/builder_spec.rb +16 -20
- data/spec/gorillib/collection_spec.rb +131 -35
- data/spec/gorillib/exception/raisers_spec.rb +39 -0
- data/spec/gorillib/hash/deep_compact_spec.rb +3 -3
- data/spec/gorillib/model/{record/defaults_spec.rb → defaults_spec.rb} +5 -1
- data/spec/gorillib/model/factories_spec.rb +335 -0
- data/spec/gorillib/model/{record/overlay_spec.rb → overlay_spec.rb} +0 -0
- data/spec/gorillib/model/serialization_spec.rb +2 -2
- data/spec/gorillib/model_spec.rb +19 -18
- data/spec/gorillib/pathname_spec.rb +7 -7
- data/spec/gorillib/string/truncate_spec.rb +3 -13
- data/spec/gorillib/type/extended_spec.rb +50 -2
- data/spec/gorillib/utils/capture_output_spec.rb +1 -1
- data/spec/spec_helper.rb +10 -7
- data/spec/support/factory_test_helpers.rb +76 -0
- data/spec/support/gorillib_test_helpers.rb +36 -24
- data/spec/support/model_test_helpers.rb +39 -2
- metadata +86 -51
- data/lib/alt/kernel/call_stack.rb +0 -56
- data/lib/gorillib/array/sorted_sample.rb +0 -12
- data/lib/gorillib/builder/field.rb +0 -5
- data/lib/gorillib/collection/has_collection.rb +0 -31
- data/lib/gorillib/collection/list_collection.rb +0 -58
- data/lib/gorillib/exception/confidence.rb +0 -17
- data/lib/gorillib/io/system_helpers.rb +0 -30
- data/lib/gorillib/model/record_schema.rb +0 -9
- data/lib/gorillib/utils/stub_module.rb +0 -33
- data/spec/array/average_spec.rb +0 -24
- data/spec/array/sorted_median_spec.rb +0 -18
- data/spec/array/sorted_percentile_spec.rb +0 -24
- data/spec/array/sorted_sample_spec.rb +0 -28
- data/spec/gorillib/metaprogramming/aliasing_spec.rb +0 -180
- data/spec/gorillib/model/record/factories_spec.rb +0 -335
- data/spec/support/kcode_test_helper.rb +0 -16
@@ -1,17 +0,0 @@
|
|
1
|
-
module Kernel
|
2
|
-
def assert(value, message="Assertion failed", error=StandardError)
|
3
|
-
raise error, message, caller unless value
|
4
|
-
end
|
5
|
-
end
|
6
|
-
|
7
|
-
class NullObject
|
8
|
-
def method_missing(*args, &block)
|
9
|
-
self
|
10
|
-
end
|
11
|
-
|
12
|
-
def nil?; true; end
|
13
|
-
end
|
14
|
-
|
15
|
-
def Maybe(value)
|
16
|
-
value.nil? ? NullObject.new : value
|
17
|
-
end
|
@@ -1,30 +0,0 @@
|
|
1
|
-
module Gorillib::CheckedPopen
|
2
|
-
module_function
|
3
|
-
|
4
|
-
def checked_popen(command, mode, fail_action, io_class=IO)
|
5
|
-
check_child_exit_status do
|
6
|
-
io_class.popen(command, mode) do |process|
|
7
|
-
yield(process)
|
8
|
-
end
|
9
|
-
end
|
10
|
-
rescue Errno::EPIPE
|
11
|
-
fail_action.call
|
12
|
-
end
|
13
|
-
|
14
|
-
# @private
|
15
|
-
NO_EXIT_STATUS = OpenStruct.new(:exitstatus => 0)
|
16
|
-
|
17
|
-
def check_child_exit_status
|
18
|
-
result = yield
|
19
|
-
status = $? || NO_EXIT_STATUS
|
20
|
-
unless [0, 172].include?(status.exitstatus)
|
21
|
-
raise ArgumentError, "Command exited with status '#{status.exitstatus}'"
|
22
|
-
end
|
23
|
-
result
|
24
|
-
end
|
25
|
-
|
26
|
-
end
|
27
|
-
|
28
|
-
::IO.class_eval do
|
29
|
-
include Gorillib::CheckedPopen
|
30
|
-
end
|
@@ -1,33 +0,0 @@
|
|
1
|
-
# spec/spec_helper_lite.rb
|
2
|
-
|
3
|
-
# Conditionally creates empty or "stub" modules only if
|
4
|
-
# a) they are not already defined; and
|
5
|
-
# b) they are not auto-loadable.
|
6
|
-
#
|
7
|
-
# From http://objectsonrails.com/#sec-7-1
|
8
|
-
#
|
9
|
-
# @example Faking out ActiveModel
|
10
|
-
# # ...
|
11
|
-
# require_relative '../spec_helper_lite'
|
12
|
-
# stub_module 'ActiveModel::Conversion'
|
13
|
-
# stub_module 'ActiveModel::Naming'
|
14
|
-
# require_relative '../../app/models/post'
|
15
|
-
# # ...
|
16
|
-
#
|
17
|
-
def stub_module(full_name)
|
18
|
-
# Uses #const_get to attempt to reference the given module. If the module is
|
19
|
-
# defined, or if calling #const_get causes it to be auto-loaded, the method
|
20
|
-
# does nothing more. But if #const_get fails to turn up the module, it defines
|
21
|
-
# an anonymous empty module to act as a placeholder.
|
22
|
-
full_name.to_s.split(/::/).inject(Object) do |context, name|
|
23
|
-
begin
|
24
|
-
context.const_get(name)
|
25
|
-
rescue NameError
|
26
|
-
context.const_set(name, Module.new)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
|
32
|
-
# refute
|
33
|
-
# does_not_allow
|
data/spec/array/average_spec.rb
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
require File.expand_path('../spec_helper', File.dirname(__FILE__))
|
2
|
-
require 'gorillib/array/average'
|
3
|
-
|
4
|
-
describe Array do
|
5
|
-
describe '#average' do
|
6
|
-
context 'on non-float array element' do
|
7
|
-
it 'raises error' do
|
8
|
-
expect { [0.0, :b, 1.0].average }.should raise_error(ArgumentError)
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
context 'with empty' do
|
13
|
-
it 'returns nil' do
|
14
|
-
[].average.should be_nil
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
context 'given a numerical array' do
|
19
|
-
it 'returns the average of the elements' do
|
20
|
-
(1..10).to_a.average.should == 5.5
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
require File.expand_path('../spec_helper', File.dirname(__FILE__))
|
2
|
-
require 'gorillib/array/sorted_median'
|
3
|
-
|
4
|
-
describe Array do
|
5
|
-
describe '#sorted_median' do
|
6
|
-
context 'with empty' do
|
7
|
-
it 'returns nil' do
|
8
|
-
[].sorted_median.should be_nil
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
context 'given any array' do
|
13
|
-
it 'returns the middle element of odd-sized arrays' do
|
14
|
-
("a".."y").to_a.sorted_median.should == "m"
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
@@ -1,24 +0,0 @@
|
|
1
|
-
require File.expand_path('../spec_helper', File.dirname(__FILE__))
|
2
|
-
require 'gorillib/array/sorted_percentile'
|
3
|
-
|
4
|
-
describe Array do
|
5
|
-
describe '#sorted_percentile' do
|
6
|
-
context 'with empty' do
|
7
|
-
it 'returns nil' do
|
8
|
-
[].sorted_percentile(0.0).should be_nil
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
context 'given any array' do
|
13
|
-
it 'returns the element closest to the given percentile' do
|
14
|
-
("a".."y").to_a.sorted_percentile( 0.0).should == "a"
|
15
|
-
("a".."y").to_a.sorted_percentile( 50.0).should == "m"
|
16
|
-
("a".."y").to_a.sorted_percentile(100.0).should == "y"
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
# (Please do not define behavior for two elements equally close to
|
21
|
-
# a given percentile.)
|
22
|
-
|
23
|
-
end
|
24
|
-
end
|
@@ -1,28 +0,0 @@
|
|
1
|
-
require File.expand_path('../spec_helper', File.dirname(__FILE__))
|
2
|
-
require 'gorillib/array/sorted_sample'
|
3
|
-
|
4
|
-
describe Array do
|
5
|
-
describe '#sorted_median' do
|
6
|
-
context 'with empty' do
|
7
|
-
it 'returns an empty array' do
|
8
|
-
[].sorted_sample(1).should be_empty
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
context 'given an undersized array' do
|
13
|
-
it 'does not return the same element more than once' do
|
14
|
-
("a".."z").to_a.sorted_sample(27).should == ("a".."z").to_a
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
context 'given any array' do
|
19
|
-
it ('returns a sample of the given size as close to evenly ' \
|
20
|
-
'distributed over the array as possible') do
|
21
|
-
sample = (1..100).to_a.sorted_sample(26)
|
22
|
-
deltas = sample[0..-2].zip(sample[1..-1]).map{|a,b| b-a}
|
23
|
-
deltas.max.should <= 4
|
24
|
-
deltas.min.should >= 3
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
@@ -1,180 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'gorillib/metaprogramming/aliasing'
|
3
|
-
|
4
|
-
module BarMethodAliaser
|
5
|
-
def self.included(foo_class)
|
6
|
-
foo_class.class_eval do
|
7
|
-
include BarMethods
|
8
|
-
alias_method_chain :bar, :baz
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
module BarMethods
|
14
|
-
def bar_with_baz
|
15
|
-
bar_without_baz << '_with_baz'
|
16
|
-
end
|
17
|
-
|
18
|
-
def quux_with_baz!
|
19
|
-
quux_without_baz! << '_with_baz'
|
20
|
-
end
|
21
|
-
|
22
|
-
def quux_with_baz?
|
23
|
-
false
|
24
|
-
end
|
25
|
-
|
26
|
-
def quux_with_baz=(v)
|
27
|
-
send(:quux_without_baz=, v) << '_with_baz'
|
28
|
-
end
|
29
|
-
|
30
|
-
def duck_with_orange
|
31
|
-
duck_without_orange << '_with_orange'
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
describe 'metaprogramming', :metaprogramming_spec => true do
|
36
|
-
before do
|
37
|
-
Object.const_set :FooClassWithBarMethod, Class.new{ def bar() 'bar' end }
|
38
|
-
@instance = FooClassWithBarMethod.new
|
39
|
-
end
|
40
|
-
|
41
|
-
after do
|
42
|
-
Object.instance_eval { remove_const :FooClassWithBarMethod }
|
43
|
-
end
|
44
|
-
|
45
|
-
describe 'alias_method_chain' do
|
46
|
-
|
47
|
-
it 'does not have an effect if already provided by another library.' unless ENV['QUIET_RSPEC']
|
48
|
-
|
49
|
-
it 'creates a with_ and without_ method that chain' do
|
50
|
-
@instance.should respond_to(:bar)
|
51
|
-
feature_aliases = [:bar_with_baz, :bar_without_baz]
|
52
|
-
|
53
|
-
feature_aliases.each do |method|
|
54
|
-
@instance.should_not respond_to(method)
|
55
|
-
end
|
56
|
-
@instance.bar.should == 'bar'
|
57
|
-
|
58
|
-
FooClassWithBarMethod.class_eval{ include BarMethodAliaser }
|
59
|
-
feature_aliases.each do |method|
|
60
|
-
@instance.should respond_to(method)
|
61
|
-
end
|
62
|
-
@instance.bar.should == 'bar_with_baz'
|
63
|
-
@instance.bar_without_baz.should == 'bar'
|
64
|
-
end
|
65
|
-
|
66
|
-
it 'with bang' do
|
67
|
-
FooClassWithBarMethod.class_eval do
|
68
|
-
def quux!; 'quux' end
|
69
|
-
end
|
70
|
-
|
71
|
-
@instance.should_not respond_to(:quux_with_baz!)
|
72
|
-
FooClassWithBarMethod.class_eval do
|
73
|
-
include BarMethodAliaser
|
74
|
-
alias_method_chain :quux!, :baz
|
75
|
-
end
|
76
|
-
@instance.should respond_to(:quux_with_baz!)
|
77
|
-
|
78
|
-
@instance.quux!.should == 'quux_with_baz'
|
79
|
-
@instance.quux_without_baz!.should == 'quux'
|
80
|
-
end
|
81
|
-
|
82
|
-
it 'with same names between predicates and bang methods' do
|
83
|
-
FooClassWithBarMethod.class_eval do
|
84
|
-
def quux!; 'quux!' end
|
85
|
-
def quux?; true end
|
86
|
-
def quux=(v); 'quux=' end
|
87
|
-
end
|
88
|
-
|
89
|
-
@instance.should_not respond_to(:quux_with_baz!)
|
90
|
-
@instance.should_not respond_to(:quux_with_baz?)
|
91
|
-
@instance.should_not respond_to(:quux_with_baz=)
|
92
|
-
|
93
|
-
FooClassWithBarMethod.class_eval { include BarMethodAliaser }
|
94
|
-
@instance.should respond_to(:quux_with_baz!)
|
95
|
-
@instance.should respond_to(:quux_with_baz?)
|
96
|
-
@instance.should respond_to(:quux_with_baz=)
|
97
|
-
|
98
|
-
FooClassWithBarMethod.alias_method_chain :quux!, :baz
|
99
|
-
@instance.quux!.should == 'quux!_with_baz'
|
100
|
-
@instance.quux_without_baz!.should == 'quux!'
|
101
|
-
|
102
|
-
FooClassWithBarMethod.alias_method_chain :quux?, :baz
|
103
|
-
@instance.quux?.should == false
|
104
|
-
@instance.quux_without_baz?.should == true
|
105
|
-
|
106
|
-
FooClassWithBarMethod.alias_method_chain :quux=, :baz
|
107
|
-
@instance.send(:quux=, 1234).should == 'quux=_with_baz'
|
108
|
-
@instance.send(:quux_without_baz=, 1234).should == 'quux='
|
109
|
-
end
|
110
|
-
|
111
|
-
it 'with_feature_punctuation' do
|
112
|
-
FooClassWithBarMethod.class_eval do
|
113
|
-
def quux; 'quux' end
|
114
|
-
def quux?; 'quux?' end
|
115
|
-
include BarMethodAliaser
|
116
|
-
alias_method_chain :quux, :baz!
|
117
|
-
end
|
118
|
-
|
119
|
-
@instance.quux_with_baz!.should == 'quux_with_baz'
|
120
|
-
|
121
|
-
lambda{ FooClassWithBarMethod.alias_method_chain :quux?, :baz! }.should raise_error(NameError)
|
122
|
-
end
|
123
|
-
|
124
|
-
it 'yields target and punctuation' do
|
125
|
-
args = nil
|
126
|
-
FooClassWithBarMethod.class_eval do
|
127
|
-
def quux?; end
|
128
|
-
include BarMethods
|
129
|
-
|
130
|
-
FooClassWithBarMethod.alias_method_chain :quux?, :baz do |target, punctuation|
|
131
|
-
args = [target, punctuation]
|
132
|
-
end
|
133
|
-
end
|
134
|
-
|
135
|
-
args.should_not be_nil
|
136
|
-
args[0].should == 'quux'
|
137
|
-
args[1].should == '?'
|
138
|
-
end
|
139
|
-
|
140
|
-
it 'preserves private method status' do
|
141
|
-
FooClassWithBarMethod.class_eval do
|
142
|
-
def duck; 'duck' end
|
143
|
-
include BarMethodAliaser
|
144
|
-
private :duck
|
145
|
-
alias_method_chain :duck, :orange
|
146
|
-
end
|
147
|
-
|
148
|
-
lambda{ @instance.duck }.should raise_error(NoMethodError)
|
149
|
-
|
150
|
-
@instance.instance_eval{ duck }.should == 'duck_with_orange'
|
151
|
-
FooClassWithBarMethod.should be_private_method_defined(:duck)
|
152
|
-
end
|
153
|
-
|
154
|
-
it 'preserves protected method status' do
|
155
|
-
FooClassWithBarMethod.class_eval do
|
156
|
-
def duck; 'duck' end
|
157
|
-
include BarMethodAliaser
|
158
|
-
protected :duck
|
159
|
-
alias_method_chain :duck, :orange
|
160
|
-
end
|
161
|
-
|
162
|
-
lambda{ @instance.duck }.should raise_error(NoMethodError)
|
163
|
-
|
164
|
-
@instance.instance_eval{ duck }.should == 'duck_with_orange'
|
165
|
-
FooClassWithBarMethod.should be_protected_method_defined(:duck)
|
166
|
-
end
|
167
|
-
|
168
|
-
it 'preserves public method status' do
|
169
|
-
FooClassWithBarMethod.class_eval do
|
170
|
-
def duck; 'duck' end
|
171
|
-
include BarMethodAliaser
|
172
|
-
public :duck
|
173
|
-
alias_method_chain :duck, :orange
|
174
|
-
end
|
175
|
-
|
176
|
-
@instance.duck.should == 'duck_with_orange'
|
177
|
-
FooClassWithBarMethod.should be_public_method_defined(:duck)
|
178
|
-
end
|
179
|
-
end
|
180
|
-
end
|
@@ -1,335 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
require 'gorillib/object/blank'
|
4
|
-
require 'gorillib/object/try_dup'
|
5
|
-
require 'gorillib/hash/slice'
|
6
|
-
require 'gorillib/metaprogramming/class_attribute'
|
7
|
-
require 'gorillib/string/inflector'
|
8
|
-
#
|
9
|
-
require 'gorillib/collection'
|
10
|
-
require 'gorillib/model/factories'
|
11
|
-
|
12
|
-
describe '', :model_spec => true do
|
13
|
-
let(:mock_factory){ Gorillib::Factory::BaseFactory.new }
|
14
|
-
|
15
|
-
def test_factory(*args, &block)
|
16
|
-
described_class.new(*args, &block)
|
17
|
-
end
|
18
|
-
|
19
|
-
describe Gorillib::Factory do
|
20
|
-
describe 'Factory()' do
|
21
|
-
it 'turns a proc into an ApplyProcFactory' do
|
22
|
-
ff = Gorillib::Factory( ->(obj){ "bob says #{obj}" } )
|
23
|
-
ff.receive(3).should == "bob says 3"
|
24
|
-
end
|
25
|
-
it 'returns anything that responds to #receive directly' do
|
26
|
-
ff = Object.new ; ff.define_singleton_method(:receive){}
|
27
|
-
Gorillib::Factory(ff).should equal(ff)
|
28
|
-
end
|
29
|
-
it 'returns a factory directly' do
|
30
|
-
ff = Gorillib::Factory::SymbolFactory.new
|
31
|
-
Gorillib::Factory(ff).should equal(ff)
|
32
|
-
end
|
33
|
-
it 'does not look up factory **classes**' do
|
34
|
-
->{ Gorillib::Factory(Gorillib::Factory::SymbolFactory) }.should raise_error(ArgumentError, /Don\'t know which factory makes/)
|
35
|
-
end
|
36
|
-
it 'looks up factories by typename' do
|
37
|
-
Gorillib::Factory(:symbol ).should be_a(Gorillib::Factory::SymbolFactory)
|
38
|
-
Gorillib::Factory(:identical).should == (::Whatever)
|
39
|
-
end
|
40
|
-
it 'looks up factories by class' do
|
41
|
-
Gorillib::Factory(Symbol).should be_a(Gorillib::Factory::SymbolFactory)
|
42
|
-
Gorillib::Factory(String).should be_a(Gorillib::Factory::StringFactory)
|
43
|
-
end
|
44
|
-
it 'calls Gorillib::Factory.receive' do
|
45
|
-
x = mock
|
46
|
-
Gorillib::Factory.should_receive(:receive).with(x)
|
47
|
-
Gorillib::Factory(x)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
shared_examples_for :it_converts do |conversion_mapping|
|
53
|
-
non_native_ok = conversion_mapping.delete(:non_native_ok)
|
54
|
-
conversion_mapping.each do |obj, expected_result|
|
55
|
-
it "#{obj.inspect} to #{expected_result.inspect}" do
|
56
|
-
subject.native?( obj).should be_false
|
57
|
-
subject.blankish?(obj).should be_false
|
58
|
-
actual_result = subject.receive(obj)
|
59
|
-
actual_result.should eql(expected_result)
|
60
|
-
unless non_native_ok then subject.native?(actual_result).should be_true ; end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
shared_examples_for :it_considers_native do |*native_objs|
|
66
|
-
it native_objs.inspect do
|
67
|
-
native_objs.each do |obj|
|
68
|
-
subject.native?( obj).should be_true
|
69
|
-
actual_result = subject.receive(obj)
|
70
|
-
actual_result.should equal(obj)
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
shared_examples_for :it_considers_blankish do |*blankish_objs|
|
76
|
-
it blankish_objs.inspect do
|
77
|
-
blankish_objs.each do |obj|
|
78
|
-
subject.blankish?(obj).should be_true
|
79
|
-
subject.receive(obj).should be_nil
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
shared_examples_for :it_is_a_mismatch_for do |*mismatched_objs|
|
85
|
-
it mismatched_objs.inspect do
|
86
|
-
mismatched_objs.each do |obj|
|
87
|
-
->{ subject.receive(obj) }.should raise_error(Gorillib::Factory::FactoryMismatchError)
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
shared_examples_for :it_is_registered_as do |*keys|
|
93
|
-
it "the factory for #{keys}" do
|
94
|
-
keys.each do |key|
|
95
|
-
Gorillib::Factory(key).should be_a(described_class)
|
96
|
-
end
|
97
|
-
its_factory = Gorillib::Factory(keys.first)
|
98
|
-
Gorillib::Factory.send(:factories).to_hash.select{|key,val| val.equal?(its_factory) }.keys.should == keys
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
# __________________________________________________________________________
|
103
|
-
#
|
104
|
-
#
|
105
|
-
#
|
106
|
-
describe Gorillib::Factory::StringFactory do
|
107
|
-
it_behaves_like :it_considers_native, 'foo', ''
|
108
|
-
it_behaves_like :it_converts, :foo => 'foo', 3 => '3', false => "false", [] => "[]"
|
109
|
-
it_behaves_like :it_considers_blankish, nil
|
110
|
-
it_behaves_like :it_is_registered_as, :string, String
|
111
|
-
its(:typename){ should == :string }
|
112
|
-
end
|
113
|
-
|
114
|
-
describe Gorillib::Factory::SymbolFactory do
|
115
|
-
it_behaves_like :it_considers_native, :foo, :"symbol :with weird chars"
|
116
|
-
it_behaves_like :it_converts, 'foo' => :foo
|
117
|
-
it_behaves_like :it_considers_blankish, nil, ""
|
118
|
-
it_behaves_like :it_is_a_mismatch_for, 3, false, []
|
119
|
-
it_behaves_like :it_is_registered_as, :symbol, Symbol
|
120
|
-
its(:typename){ should == :symbol }
|
121
|
-
end
|
122
|
-
|
123
|
-
describe Gorillib::Factory::RegexpFactory do
|
124
|
-
it_behaves_like :it_considers_native, /foo/, //
|
125
|
-
it_behaves_like :it_converts, 'foo' => /foo/, ".*" => /.*/
|
126
|
-
it_behaves_like :it_considers_blankish, nil, ""
|
127
|
-
it_behaves_like :it_is_a_mismatch_for, :foo, 3, false, []
|
128
|
-
it_behaves_like :it_is_registered_as, :regexp, Regexp
|
129
|
-
its(:typename){ should == :regexp }
|
130
|
-
end
|
131
|
-
|
132
|
-
describe Gorillib::Factory::IntegerFactory do
|
133
|
-
it_behaves_like :it_considers_native, 1, -1
|
134
|
-
it_behaves_like :it_converts, 'one' => 0, '3blindmice' => 3, "0x10" => 0
|
135
|
-
it_behaves_like :it_converts, '1.0' => 1, '1' => 1, "0" => 0, "0L" => 0, "1_234_567" => 1234567, "1_234_567.0" => 1234567
|
136
|
-
it_behaves_like :it_converts, 1.0 => 1, 1.234567e6 => 1234567, Complex(1,0) => 1
|
137
|
-
it_behaves_like :it_considers_blankish, nil, ""
|
138
|
-
it_behaves_like :it_is_a_mismatch_for, :foo, false, [], Complex(1,3)
|
139
|
-
it_behaves_like :it_is_registered_as, :int, :integer, Integer
|
140
|
-
its(:typename){ should == :integer }
|
141
|
-
end
|
142
|
-
|
143
|
-
describe Gorillib::Factory::FloatFactory do
|
144
|
-
it_behaves_like :it_considers_native, 1.0, 1.234567e6
|
145
|
-
it_behaves_like :it_converts, 'one' => 0.0, '3blindmice' => 3.0, "0x10" => 0.0
|
146
|
-
it_behaves_like :it_converts, '1.0' => 1.0, '1' => 1.0, "0" => 0.0, "0L" => 0.0, "1_234_567" => 1234567.0, "1_234_567.0" => 1234567.0
|
147
|
-
it_behaves_like :it_converts, 1 => 1.0, -1 => -1.0, Complex(1,0) => 1.0
|
148
|
-
it_behaves_like :it_considers_blankish, nil, ""
|
149
|
-
it_behaves_like :it_is_a_mismatch_for, :foo, false, []
|
150
|
-
it_behaves_like :it_is_registered_as, :float, Float
|
151
|
-
its(:typename){ should == :float }
|
152
|
-
end
|
153
|
-
|
154
|
-
describe Gorillib::Factory::ComplexFactory do
|
155
|
-
cplx0 = Complex(0) ; cplx1 = Complex(1) ; cplx1f = Complex(1.0) ;
|
156
|
-
it_behaves_like :it_considers_native, Complex(1,3), Complex(1,0)
|
157
|
-
it_behaves_like :it_converts, 'one' => cplx0, '3blindmice' => Complex(3), "0x10" => cplx0
|
158
|
-
it_behaves_like :it_converts, '1.0' => cplx1f, '1' => cplx1, '0' => cplx0, '0L' => cplx0, '1_234_567' => Complex(1234567), '1_234_567.0' => Complex(1234567.0)
|
159
|
-
it_behaves_like :it_converts, 1.0 => cplx1f, 1 => cplx1, -1 => Complex(-1), Rational(3,2) => Complex(Rational(3,2),0)
|
160
|
-
it_behaves_like :it_considers_blankish, nil, ""
|
161
|
-
it_behaves_like :it_is_a_mismatch_for, :foo, false, []
|
162
|
-
it_behaves_like :it_is_registered_as, :complex, Complex
|
163
|
-
its(:typename){ should == :complex }
|
164
|
-
end
|
165
|
-
|
166
|
-
describe Gorillib::Factory::RationalFactory do
|
167
|
-
rat_0 = Rational(0) ; rat1 = Rational(1) ; rat3_2 = Rational(3, 2) ;
|
168
|
-
it_behaves_like :it_considers_native, Rational(1, 3), Rational(1, 7)
|
169
|
-
it_behaves_like :it_converts, 'one' => rat_0, '3blindmice' => Rational(3), "0x10" => rat_0
|
170
|
-
it_behaves_like :it_converts, '1.5' => rat3_2, '1' => rat1, '0' => rat_0, '0L' => rat_0, '1_234_567' => Rational(1234567), '1_234_567.0' => Rational(1234567)
|
171
|
-
it_behaves_like :it_converts, 1.5 => rat3_2, 1 => rat1, -1 => Rational(-1), Complex(1.5) => rat3_2
|
172
|
-
it_behaves_like :it_considers_blankish, nil, ""
|
173
|
-
it_behaves_like :it_is_a_mismatch_for, :foo, false, [], Complex(1.5,3)
|
174
|
-
it_behaves_like :it_is_registered_as, :rational, Rational
|
175
|
-
its(:typename){ should == :rational }
|
176
|
-
end
|
177
|
-
|
178
|
-
describe Gorillib::Factory::BooleanFactory do
|
179
|
-
it_behaves_like :it_considers_native, true, false
|
180
|
-
it_behaves_like :it_considers_blankish, nil
|
181
|
-
it_behaves_like :it_converts, "false" => false, :false => false
|
182
|
-
it_behaves_like :it_converts, "true" => true, :true => true, [] => true, :foo => true, [] => true, Complex(1.5,3) => true, Object.new => true
|
183
|
-
it_behaves_like :it_is_registered_as, :boolean
|
184
|
-
its(:typename){ should == :boolean }
|
185
|
-
end
|
186
|
-
|
187
|
-
describe ::Whatever do
|
188
|
-
it_behaves_like :it_considers_native, true, false, nil, 3, '', 'a string', :a_symbol, [], {}, ->(){ 'a proc' }, Module.new, Complex(1,3), Object.new
|
189
|
-
it "it is itself the factory for :identical and :whatever" do
|
190
|
-
keys = [Whatever, :identical, :whatever]
|
191
|
-
keys.each do |key|
|
192
|
-
Gorillib::Factory(key).should equal(described_class)
|
193
|
-
end
|
194
|
-
its_factory = ::Whatever
|
195
|
-
Gorillib::Factory.send(:factories).to_hash.select{|key,val| val.equal?(its_factory) }.keys.should == keys
|
196
|
-
end
|
197
|
-
end
|
198
|
-
describe Gorillib::Factory::IdenticalFactory do
|
199
|
-
it{ described_class.should equal(Whatever) }
|
200
|
-
end
|
201
|
-
|
202
|
-
describe Gorillib::Factory::ModuleFactory do
|
203
|
-
it_behaves_like :it_considers_blankish, nil
|
204
|
-
it_behaves_like :it_considers_native, Module, Module.new, Class, Class.new, Object, String, BasicObject
|
205
|
-
it_behaves_like :it_is_a_mismatch_for, true, false, 3, '', 'a string', :a_symbol, [], {}, ->(){ 'a proc' }, Complex(1,3), Object.new
|
206
|
-
it_behaves_like :it_is_registered_as, :module, Module
|
207
|
-
its(:typename){ should == :module }
|
208
|
-
end
|
209
|
-
|
210
|
-
describe Gorillib::Factory::ClassFactory do
|
211
|
-
it_behaves_like :it_considers_blankish, nil
|
212
|
-
it_behaves_like :it_considers_native, Module, Class, Class.new, Object, String, BasicObject
|
213
|
-
it_behaves_like :it_is_a_mismatch_for, true, false, 3, '', 'a string', :a_symbol, [], {}, ->(){ 'a proc' }, Module.new, Complex(1,3), Object.new
|
214
|
-
it_behaves_like :it_is_registered_as, :class, Class
|
215
|
-
its(:typename){ should == :class }
|
216
|
-
end
|
217
|
-
|
218
|
-
describe Gorillib::Factory::NilFactory do
|
219
|
-
it_behaves_like :it_considers_native, nil
|
220
|
-
it_behaves_like :it_is_a_mismatch_for, true, false, 3, '', 'a string', :a_symbol, [], {}, ->(){ 'a proc' }, Module.new, Complex(1,3), Object.new
|
221
|
-
it_behaves_like :it_is_registered_as, :nil, NilClass
|
222
|
-
its(:typename){ should == :nil_class }
|
223
|
-
end
|
224
|
-
|
225
|
-
describe Gorillib::Factory::TrueFactory do
|
226
|
-
it_behaves_like :it_considers_native, true
|
227
|
-
it_behaves_like :it_is_a_mismatch_for, false, 3, '', 'a string', :a_symbol, [], {}, ->(){ 'a proc' }, Module.new, Complex(1,3), Object.new
|
228
|
-
it_behaves_like :it_is_registered_as, :true, TrueClass
|
229
|
-
end
|
230
|
-
|
231
|
-
describe Gorillib::Factory::FalseFactory do
|
232
|
-
it_behaves_like :it_considers_native, false
|
233
|
-
it_behaves_like :it_is_a_mismatch_for, true, 3, '', 'a string', :a_symbol, [], {}, ->(){ 'a proc' }, Module.new, Complex(1,3), Object.new
|
234
|
-
it_behaves_like :it_is_registered_as, :false, FalseClass
|
235
|
-
end
|
236
|
-
|
237
|
-
describe Gorillib::Factory::RangeFactory do
|
238
|
-
it_behaves_like :it_considers_blankish, nil, []
|
239
|
-
it_behaves_like :it_considers_native, (1..2), ('a'..'z')
|
240
|
-
it_behaves_like :it_is_a_mismatch_for, true, 3, '', 'a string', :a_symbol, [1,2], {}, ->(){ 'a proc' }, Module.new, Complex(1,3), Object.new
|
241
|
-
it_behaves_like :it_is_registered_as, :range, Range
|
242
|
-
its(:typename){ should == :range }
|
243
|
-
end
|
244
|
-
|
245
|
-
# __________________________________________________________________________
|
246
|
-
|
247
|
-
# hand it a collection with entries 1, 2, 3 please
|
248
|
-
shared_examples_for :an_enumerable_factory do
|
249
|
-
it "accepts a factory for its items" do
|
250
|
-
mock_factory.should_receive(:receive).with(1)
|
251
|
-
mock_factory.should_receive(:receive).with(2)
|
252
|
-
mock_factory.should_receive(:receive).with(3)
|
253
|
-
factory = test_factory(:items => mock_factory)
|
254
|
-
factory.receive( collection_123 )
|
255
|
-
end
|
256
|
-
it "can generate an empty collection" do
|
257
|
-
subject.empty_product.should == empty_collection
|
258
|
-
end
|
259
|
-
it "lets you override the empty collection" do
|
260
|
-
ep = mock; ep.should_receive(:try_dup).and_return 'hey'
|
261
|
-
subject = test_factory(:empty_product => ep)
|
262
|
-
subject.empty_product.should == 'hey'
|
263
|
-
subject = test_factory(:empty_product => ->{ 'yo' })
|
264
|
-
subject.empty_product.should == 'yo'
|
265
|
-
end
|
266
|
-
end
|
267
|
-
|
268
|
-
describe Gorillib::Factory::HashFactory do
|
269
|
-
let(:collection_123){ { 'a' => 1, :b => 2, 'c' => 3 } }
|
270
|
-
let(:empty_collection){ {} }
|
271
|
-
|
272
|
-
it_behaves_like :it_considers_blankish, nil
|
273
|
-
it_behaves_like :it_converts, { {} => {}, { "a" => 2 } => { 'a' => 2 }, { :a => 2 } => { :a => 2 }, :non_native_ok => true }
|
274
|
-
it_behaves_like :it_is_a_mismatch_for, [1,2,3]
|
275
|
-
it_behaves_like :an_enumerable_factory
|
276
|
-
|
277
|
-
it 'follows examples' do
|
278
|
-
test_factory.receive(collection_123).should == { 'a' => 1, :b => 2, 'c' => 3}
|
279
|
-
test_factory(:keys => :symbol).receive({'a' => 'x', :b => 'y', 'c' => :z}).should == {:a => 'x', :b => 'y', :c => :z}
|
280
|
-
test_factory(:items => :symbol).receive({'a' => 'x', :b => 'y', 'c' => :z}).should == {'a' => :x, :b => :y, 'c' => :z}
|
281
|
-
autov_factory = test_factory(:empty_product => Hash.new{|h,k| h[k] = {} })
|
282
|
-
result = autov_factory.receive({:a => :b}) ; result.should == { :a => :b }
|
283
|
-
result[:flanger][:modacity] = 11 ; result.should == { :a => :b, :flanger => { :modacity => 11 }}
|
284
|
-
result2 = autov_factory.receive({:x => :y}) ; result2.should == { :x => :y } ; result.should == { :a => :b, :flanger => { :modacity => 11 }}
|
285
|
-
end
|
286
|
-
|
287
|
-
it "accepts a factory for the keys" do
|
288
|
-
mock_factory.should_receive(:receive).with(3).and_return("converted!")
|
289
|
-
factory = test_factory(:keys => mock_factory)
|
290
|
-
factory.receive( { 3 => 4 } ).should == { 'converted!' => 4 }
|
291
|
-
end
|
292
|
-
it_behaves_like :it_is_registered_as, :hash, Hash
|
293
|
-
its(:typename){ should == :hash }
|
294
|
-
end
|
295
|
-
|
296
|
-
describe Gorillib::Factory::ArrayFactory do
|
297
|
-
let(:collection_123){ [1,2,3] }
|
298
|
-
let(:empty_collection){ [] }
|
299
|
-
|
300
|
-
it 'follows examples' do
|
301
|
-
test_factory.receive([1,2,3]).should == [1,2,3]
|
302
|
-
test_factory(:items => :symbol).receive(['a', 'b', :c]).should == [:a, :b, :c]
|
303
|
-
test_factory(:empty_product => [1,2,3]).receive([:a, :b, :c]).should == [1, 2, 3, :a, :b, :c]
|
304
|
-
end
|
305
|
-
|
306
|
-
it_behaves_like :it_considers_blankish, nil
|
307
|
-
it_behaves_like :it_converts, { [] => [], {} => [], [1,2,3] => [1,2,3], {:a => :b} => [[:a, :b]], [:a] => [:a], [[]] => [[]], :non_native_ok => true }
|
308
|
-
it_behaves_like :an_enumerable_factory
|
309
|
-
it_behaves_like :it_is_registered_as, :array, Array
|
310
|
-
its(:typename){ should == :array }
|
311
|
-
end
|
312
|
-
|
313
|
-
describe Gorillib::Factory::SetFactory do
|
314
|
-
let(:collection_123){ Set.new([1,2,3]) }
|
315
|
-
let(:empty_collection){ Set.new }
|
316
|
-
|
317
|
-
it 'follows examples' do
|
318
|
-
test_factory.receive([1,2,3]).should == collection_123
|
319
|
-
test_factory(:items => :symbol).receive(['a', 'b', :c]).should == [:a, :b, :c].to_set
|
320
|
-
test_factory(:empty_product => [1,2,3].to_set).receive([:a, :b, :c]).should == [1, 2, 3, :a, :b, :c].to_set
|
321
|
-
|
322
|
-
has_an_empty_array = test_factory.receive( [[]] )
|
323
|
-
has_an_empty_array.should == Set.new( [[]] )
|
324
|
-
has_an_empty_array.first.should == []
|
325
|
-
has_an_empty_array.size.should == 1
|
326
|
-
end
|
327
|
-
|
328
|
-
it_behaves_like :it_considers_blankish, nil
|
329
|
-
it_behaves_like :it_converts, { [] => Set.new, {} => Set.new, [1,2,3] => [1,2,3].to_set, {:a => :b} => Set.new({:a => :b}), [:a] => [:a].to_set, :non_native_ok => true }
|
330
|
-
it_behaves_like :an_enumerable_factory
|
331
|
-
it_behaves_like :it_is_registered_as, :set, Set
|
332
|
-
its(:typename){ should == :set }
|
333
|
-
end
|
334
|
-
|
335
|
-
end
|