olfactory 0.2.0 → 0.2.1
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 +7 -0
- data/README.md +110 -8
- data/lib/olfactory.rb +9 -7
- data/lib/olfactory/sequence.rb +7 -6
- data/lib/olfactory/template.rb +97 -42
- data/lib/olfactory/template_definition.rb +48 -22
- data/lib/olfactory/version.rb +1 -1
- data/olfactory.gemspec +1 -1
- data/spec/olfactory/sequence_spec.rb +23 -11
- data/spec/olfactory/template_spec.rb +411 -42
- metadata +32 -39
@@ -1,7 +1,7 @@
|
|
1
1
|
# -*- encoding : utf-8 -*-
|
2
2
|
module Olfactory
|
3
3
|
class TemplateDefinition
|
4
|
-
attr_accessor :t_items, :t_subtemplates, :t_sequences, :t_dictionaries, :t_macros, :t_presets, :
|
4
|
+
attr_accessor :t_items, :t_subtemplates, :t_sequences, :t_dictionaries, :t_macros, :t_presets, :t_befores, :t_afters, :t_instantiators
|
5
5
|
|
6
6
|
def initialize
|
7
7
|
self.t_items = {}
|
@@ -10,28 +10,29 @@ module Olfactory
|
|
10
10
|
self.t_dictionaries = {}
|
11
11
|
self.t_macros = {}
|
12
12
|
self.t_presets = {}
|
13
|
-
self.
|
14
|
-
self.
|
13
|
+
self.t_befores = {}
|
14
|
+
self.t_afters = {}
|
15
|
+
self.t_instantiators = {}
|
15
16
|
end
|
16
17
|
|
17
|
-
def
|
18
|
+
def construct(block, options = {})
|
18
19
|
if options[:preset] || options[:quantity]
|
19
|
-
self.
|
20
|
+
self.construct_preset(options[:preset], (options[:quantity] || 1), options.reject { |k,v| [:preset, :quantity].include?(k) })
|
20
21
|
else
|
21
22
|
new_template = Template.new(self, options)
|
22
|
-
new_template.
|
23
|
+
new_template.construct(block, options)
|
23
24
|
end
|
24
25
|
new_template
|
25
26
|
end
|
26
|
-
def
|
27
|
+
def construct_preset(preset_name, quantity, options = {})
|
27
28
|
raise "Quantity must be an integer!" if !(quantity.class <= Integer)
|
28
29
|
|
29
30
|
if quantity > 1
|
30
31
|
# Build multiple
|
31
32
|
if preset_name
|
32
|
-
Array.new(quantity) { self.
|
33
|
+
Array.new(quantity) { self.construct_preset(preset_name, 1, options) }
|
33
34
|
else
|
34
|
-
Array.new(quantity) { self.
|
35
|
+
Array.new(quantity) { self.construct(nil, options) }
|
35
36
|
end
|
36
37
|
elsif quantity == 1
|
37
38
|
if preset_definition = self.find_preset_definition(preset_name)
|
@@ -39,12 +40,12 @@ module Olfactory
|
|
39
40
|
new_template = Template.new(self, options)
|
40
41
|
preset_block = preset_definition[:evaluator]
|
41
42
|
if preset_definition[:regexp]
|
42
|
-
new_template.
|
43
|
+
new_template.construct(preset_block, options.merge(:value => preset_name))
|
43
44
|
else
|
44
|
-
new_template.
|
45
|
+
new_template.construct(preset_block, options)
|
45
46
|
end
|
46
47
|
elsif preset_name.nil?
|
47
|
-
self.
|
48
|
+
self.construct(nil, options)
|
48
49
|
else
|
49
50
|
raise "Missing preset matching '#{preset_name}' for template!"
|
50
51
|
end
|
@@ -157,17 +158,42 @@ module Olfactory
|
|
157
158
|
self.t_presets[name] = self.t_presets[name].merge(:regexp => name) if name.class <= Regexp
|
158
159
|
end
|
159
160
|
|
161
|
+
# Defines an instantiator
|
162
|
+
def instantiate(name, options = {}, &block)
|
163
|
+
self.t_instantiators[name] = { :type => :instantiator,
|
164
|
+
:name => name,
|
165
|
+
:evaluator => block
|
166
|
+
}.merge(options)
|
167
|
+
end
|
168
|
+
|
160
169
|
# Defines defaults
|
161
|
-
def before(options = {}, &block)
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
170
|
+
def before(context = nil, options = {}, &block)
|
171
|
+
if context.class == Hash
|
172
|
+
# Arguments need to be remapped...
|
173
|
+
options = context
|
174
|
+
context = nil
|
175
|
+
end
|
176
|
+
before_definition = { :type => :default,
|
177
|
+
:evaluator => block
|
178
|
+
}.merge(options)
|
179
|
+
before_definition.merge!(:preset => options[:preset]) if options[:preset]
|
180
|
+
context ||= :all
|
181
|
+
self.t_befores[context] ||= []
|
182
|
+
self.t_befores[context] << before_definition
|
183
|
+
end
|
184
|
+
def after(context = nil, options = {}, &block)
|
185
|
+
if context.class == Hash
|
186
|
+
# Arguments need to be remapped...
|
187
|
+
options = context
|
188
|
+
context = nil
|
189
|
+
end
|
190
|
+
after_definition = { :type => :default,
|
191
|
+
:evaluator => block
|
192
|
+
}.merge(options)
|
193
|
+
after_definition.merge!(:preset => options[:preset]) if options[:preset]
|
194
|
+
context ||= :all
|
195
|
+
self.t_afters[context] ||= []
|
196
|
+
self.t_afters[context] << after_definition
|
171
197
|
end
|
172
198
|
end
|
173
199
|
end
|
data/lib/olfactory/version.rb
CHANGED
data/olfactory.gemspec
CHANGED
@@ -16,7 +16,7 @@ Gem::Specification.new do |s|
|
|
16
16
|
s.require_paths = ['lib']
|
17
17
|
s.required_ruby_version = Gem::Requirement.new(">= 1.9.2")
|
18
18
|
|
19
|
-
s.add_development_dependency("rspec", "~> 3.
|
19
|
+
s.add_development_dependency("rspec", "~> 3.2")
|
20
20
|
s.add_development_dependency("pry", "~> 0.10")
|
21
21
|
s.add_development_dependency("pry-nav", "~> 0.2")
|
22
22
|
s.add_development_dependency("pry-stack_explorer", "~> 0.4.9")
|
@@ -4,7 +4,7 @@ describe Olfactory::Sequence do
|
|
4
4
|
context "with no seed" do
|
5
5
|
before(:example) do
|
6
6
|
Olfactory.sequence :address do |n, options|
|
7
|
-
"#{(n
|
7
|
+
"#{(2*n) + 2} #{"#{options[:prefix]} " if options[:prefix]}BROADWAY"
|
8
8
|
end
|
9
9
|
end
|
10
10
|
context "given nothing" do
|
@@ -22,7 +22,7 @@ describe Olfactory::Sequence do
|
|
22
22
|
context "given a block" do
|
23
23
|
subject do
|
24
24
|
Olfactory.generate(:address) do |n|
|
25
|
-
"#{(n
|
25
|
+
"#{(2*n) + 2} JOHN STREET"
|
26
26
|
end
|
27
27
|
end
|
28
28
|
it { expect(subject).to eq("2 JOHN STREET") }
|
@@ -30,7 +30,7 @@ describe Olfactory::Sequence do
|
|
30
30
|
context "given options and a block" do
|
31
31
|
subject do
|
32
32
|
Olfactory.generate(:address, :suffix => "ROAD") do |n, options|
|
33
|
-
"#{(n
|
33
|
+
"#{(2*n) + 2} JOHN#{options[:suffix] ? " #{options[:suffix]}" : " STREET"}"
|
34
34
|
end
|
35
35
|
end
|
36
36
|
it { expect(subject).to eq("2 JOHN ROAD") }
|
@@ -39,42 +39,54 @@ describe Olfactory::Sequence do
|
|
39
39
|
context "with a seed" do
|
40
40
|
before(:example) do
|
41
41
|
Olfactory.sequence :address, :seed => 10 do |n, options|
|
42
|
-
"#{(n
|
42
|
+
"#{(2*n)} #{"#{options[:prefix]} " if options[:prefix]}BROADWAY"
|
43
43
|
end
|
44
44
|
end
|
45
45
|
context "given nothing" do
|
46
46
|
subject do
|
47
47
|
Olfactory.generate(:address)
|
48
48
|
end
|
49
|
-
it { expect(subject).to eq("
|
49
|
+
it { expect(subject).to eq("20 BROADWAY") }
|
50
50
|
end
|
51
51
|
context "given options" do
|
52
52
|
subject do
|
53
53
|
Olfactory.generate(:address, :prefix => "WEST")
|
54
54
|
end
|
55
|
-
it { expect(subject).to eq("
|
55
|
+
it { expect(subject).to eq("20 WEST BROADWAY") }
|
56
56
|
end
|
57
57
|
context "given a block" do
|
58
58
|
subject do
|
59
59
|
Olfactory.generate(:address) do |n|
|
60
|
-
"#{(n
|
60
|
+
"#{(2*n)} JOHN STREET"
|
61
61
|
end
|
62
62
|
end
|
63
|
-
it { expect(subject).to eq("
|
63
|
+
it { expect(subject).to eq("20 JOHN STREET") }
|
64
64
|
end
|
65
65
|
context "given options and a block" do
|
66
66
|
subject do
|
67
67
|
Olfactory.generate(:address, :suffix => "ROAD") do |n, options|
|
68
|
-
"#{(n
|
68
|
+
"#{(2*n)} JOHN#{options[:suffix] ? " #{options[:suffix]}" : " STREET"}"
|
69
69
|
end
|
70
70
|
end
|
71
|
-
it { expect(subject).to eq("
|
71
|
+
it { expect(subject).to eq("20 JOHN ROAD") }
|
72
72
|
end
|
73
73
|
end
|
74
|
+
context "given a dimension" do
|
75
|
+
before(:context) do
|
76
|
+
Olfactory.sequence :address do |n|
|
77
|
+
"#{(2*n)+2} BROADWAY"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
let(:address_one) { Olfactory.generate(:address) }
|
81
|
+
let(:address_two) { Olfactory.generate(:address, :dimension => "LAS VEGAS") }
|
82
|
+
it { expect(address_one).to eq("2 BROADWAY") }
|
83
|
+
it { expect(address_two).to eq("2 BROADWAY") }
|
84
|
+
it { expect(address_one).to eq("4 BROADWAY") }
|
85
|
+
end
|
74
86
|
context "given sequential invocations" do
|
75
87
|
before(:context) do
|
76
88
|
Olfactory.sequence :address do |n, options|
|
77
|
-
"#{(n
|
89
|
+
"#{(2*n) + 2} #{"#{options[:prefix]} " if options[:prefix]}BROADWAY"
|
78
90
|
end
|
79
91
|
end
|
80
92
|
it { expect(Olfactory.generate(:address)).to eq("2 BROADWAY") }
|
@@ -395,6 +395,37 @@ describe Olfactory::Template do
|
|
395
395
|
end
|
396
396
|
end
|
397
397
|
end
|
398
|
+
# context "with a before block" do
|
399
|
+
# before do
|
400
|
+
# Olfactory.template :widget do |t|
|
401
|
+
# t.embeds_one :doodad do |w|
|
402
|
+
# w.quality :dull
|
403
|
+
# end
|
404
|
+
# t.macro :quality do |m, type|
|
405
|
+
# m.transient :attribute, type.to_s
|
406
|
+
# end
|
407
|
+
# end
|
408
|
+
# Olfactory.template :doodad do |t|
|
409
|
+
# t.has_one :gizmo
|
410
|
+
# t.after do |d|
|
411
|
+
# d.gizmo "#{d.transients[:attribute]} #{value}"
|
412
|
+
# end
|
413
|
+
# end
|
414
|
+
# end
|
415
|
+
# let(:shiny) do
|
416
|
+
# Olfactory.build :widget do |w|
|
417
|
+
# w.quality :shiny
|
418
|
+
# w.doodad
|
419
|
+
# end
|
420
|
+
# end
|
421
|
+
# let(:dull) do
|
422
|
+
# Olfactory.build :widget do |w|
|
423
|
+
# w.doodad
|
424
|
+
# end
|
425
|
+
# end
|
426
|
+
# it { expect(shiny[:doodad][:gizmo]).to eq("shiny #{value}")}
|
427
|
+
# it { expect(dull[:doodad][:gizmo]).to eq("dull #{value}")}
|
428
|
+
# end
|
398
429
|
end
|
399
430
|
context "embeds_many" do
|
400
431
|
before(:context) do
|
@@ -744,7 +775,7 @@ describe Olfactory::Template do
|
|
744
775
|
Olfactory.template :building do |t|
|
745
776
|
t.has_one :address
|
746
777
|
t.sequence :address, :scope => :template do |n, options|
|
747
|
-
"#{(n
|
778
|
+
"#{(2*n) + 2} #{"#{options[:prefix]} " if options[:prefix]}BROADWAY"
|
748
779
|
end
|
749
780
|
end
|
750
781
|
end
|
@@ -769,7 +800,7 @@ describe Olfactory::Template do
|
|
769
800
|
Olfactory.build :building do |building|
|
770
801
|
building.address do
|
771
802
|
building.generate(:address) do |n|
|
772
|
-
"#{(n
|
803
|
+
"#{(2*n) + 2} JOHN STREET"
|
773
804
|
end
|
774
805
|
end
|
775
806
|
end
|
@@ -781,20 +812,40 @@ describe Olfactory::Template do
|
|
781
812
|
Olfactory.build :building do |building|
|
782
813
|
building.address do
|
783
814
|
building.generate(:address, :suffix => "ROAD") do |n, options|
|
784
|
-
"#{(n
|
815
|
+
"#{(2*n) + 2} JOHN#{options[:suffix] ? " #{options[:suffix]}" : " STREET"}"
|
785
816
|
end
|
786
817
|
end
|
787
818
|
end
|
788
819
|
end
|
789
820
|
it { expect(subject[:address]).to eq("2 JOHN ROAD") }
|
790
821
|
end
|
822
|
+
context "given a dimension" do
|
823
|
+
let!(:building_one) do
|
824
|
+
Olfactory.build :building do |building|
|
825
|
+
building.address building.generate(:address)
|
826
|
+
end
|
827
|
+
end
|
828
|
+
let!(:building_two) do
|
829
|
+
Olfactory.build :building do |building|
|
830
|
+
building.address building.generate(:address, :dimension => "LAS VEGAS")
|
831
|
+
end
|
832
|
+
end
|
833
|
+
let!(:building_three) do
|
834
|
+
Olfactory.build :building do |building|
|
835
|
+
building.address building.generate(:address)
|
836
|
+
end
|
837
|
+
end
|
838
|
+
it { expect(building_one[:address]).to eq("2 BROADWAY") }
|
839
|
+
it { expect(building_two[:address]).to eq("2 BROADWAY") }
|
840
|
+
it { expect(building_three[:address]).to eq("4 BROADWAY") }
|
841
|
+
end
|
791
842
|
end
|
792
843
|
context "given sequential invocations" do
|
793
844
|
before(:context) do
|
794
845
|
Olfactory.template :building do |t|
|
795
846
|
t.has_one :address
|
796
847
|
t.sequence :address, :scope => :template do |n, options|
|
797
|
-
"#{(n
|
848
|
+
"#{(2*n) + 2} #{"#{options[:prefix]} " if options[:prefix]}BROADWAY"
|
798
849
|
end
|
799
850
|
end
|
800
851
|
end
|
@@ -818,7 +869,7 @@ describe Olfactory::Template do
|
|
818
869
|
Olfactory.template :building do |t|
|
819
870
|
t.has_one :address
|
820
871
|
t.sequence :address, :scope => :instance do |n, options|
|
821
|
-
"#{(n
|
872
|
+
"#{(2*n) + 2} #{"#{options[:prefix]} " if options[:prefix]}BROADWAY"
|
822
873
|
end
|
823
874
|
end
|
824
875
|
end
|
@@ -843,7 +894,7 @@ describe Olfactory::Template do
|
|
843
894
|
Olfactory.build :building do |building|
|
844
895
|
building.address do
|
845
896
|
building.generate(:address) do |n|
|
846
|
-
"#{(n
|
897
|
+
"#{(2*n) + 2} JOHN STREET"
|
847
898
|
end
|
848
899
|
end
|
849
900
|
end
|
@@ -855,13 +906,45 @@ describe Olfactory::Template do
|
|
855
906
|
Olfactory.build :building do |building|
|
856
907
|
building.address do
|
857
908
|
building.generate(:address, :suffix => "ROAD") do |n, options|
|
858
|
-
"#{(n
|
909
|
+
"#{(2*n) + 2} JOHN#{options[:suffix] ? " #{options[:suffix]}" : " STREET"}"
|
859
910
|
end
|
860
911
|
end
|
861
912
|
end
|
862
913
|
end
|
863
914
|
it { expect(subject[:address]).to eq("2 JOHN ROAD") }
|
864
915
|
end
|
916
|
+
context "given a dimension" do
|
917
|
+
before(:example) do
|
918
|
+
Olfactory.template :building do |t|
|
919
|
+
t.has_one :address
|
920
|
+
t.has_one :other_address
|
921
|
+
t.has_one :another_address
|
922
|
+
t.sequence :address, :scope => :instance do |n, options|
|
923
|
+
"#{(2*n) + 2} #{"#{options[:prefix]} " if options[:prefix]}BROADWAY"
|
924
|
+
end
|
925
|
+
end
|
926
|
+
end
|
927
|
+
let!(:building_one) do
|
928
|
+
Olfactory.build :building do |building|
|
929
|
+
building.address building.generate(:address)
|
930
|
+
building.other_address building.generate(:address, :dimension => "LAS VEGAS")
|
931
|
+
building.another_address building.generate(:address)
|
932
|
+
end
|
933
|
+
end
|
934
|
+
let!(:building_two) do
|
935
|
+
Olfactory.build :building do |building|
|
936
|
+
building.address building.generate(:address)
|
937
|
+
building.other_address building.generate(:address, :dimension => "LAS VEGAS")
|
938
|
+
building.another_address building.generate(:address)
|
939
|
+
end
|
940
|
+
end
|
941
|
+
it { expect(building_one[:address]).to eq("2 BROADWAY") }
|
942
|
+
it { expect(building_one[:other_address]).to eq("2 BROADWAY") }
|
943
|
+
it { expect(building_one[:another_address]).to eq("4 BROADWAY") }
|
944
|
+
it { expect(building_two[:address]).to eq("2 BROADWAY") }
|
945
|
+
it { expect(building_two[:other_address]).to eq("2 BROADWAY") }
|
946
|
+
it { expect(building_two[:another_address]).to eq("4 BROADWAY") }
|
947
|
+
end
|
865
948
|
end
|
866
949
|
context "given sequential invocations" do
|
867
950
|
before(:context) do
|
@@ -869,7 +952,7 @@ describe Olfactory::Template do
|
|
869
952
|
t.has_one :address
|
870
953
|
t.has_one :other_address
|
871
954
|
t.sequence :address, :scope => :instance do |n, options|
|
872
|
-
"#{(n
|
955
|
+
"#{(2*n) + 2} #{"#{options[:prefix]} " if options[:prefix]}BROADWAY"
|
873
956
|
end
|
874
957
|
end
|
875
958
|
end
|
@@ -898,10 +981,10 @@ describe Olfactory::Template do
|
|
898
981
|
t.has_one :even_count
|
899
982
|
t.has_one :odd_count
|
900
983
|
t.sequence :even, :scope => :template do |n|
|
901
|
-
(n
|
984
|
+
(2*n) + 2
|
902
985
|
end
|
903
986
|
t.sequence :odd, :scope => :template do |n|
|
904
|
-
(n
|
987
|
+
(2*n) + 1
|
905
988
|
end
|
906
989
|
end
|
907
990
|
end
|
@@ -1185,13 +1268,27 @@ describe Olfactory::Template do
|
|
1185
1268
|
end
|
1186
1269
|
let(:value) { "temporary value"}
|
1187
1270
|
context "when set" do
|
1188
|
-
|
1189
|
-
|
1190
|
-
|
1271
|
+
context "given a basic value" do
|
1272
|
+
subject do
|
1273
|
+
Olfactory.build :widget do |t|
|
1274
|
+
t.transient :foo, value
|
1275
|
+
end
|
1276
|
+
end
|
1277
|
+
it do
|
1278
|
+
expect(subject.transients[:foo]).to eq(value)
|
1191
1279
|
end
|
1192
1280
|
end
|
1193
|
-
|
1194
|
-
|
1281
|
+
context "given a block" do
|
1282
|
+
subject do
|
1283
|
+
Olfactory.build :widget do |t|
|
1284
|
+
t.transient :foo do
|
1285
|
+
value
|
1286
|
+
end
|
1287
|
+
end
|
1288
|
+
end
|
1289
|
+
it do
|
1290
|
+
expect(subject.transients[:foo]).to eq(value)
|
1291
|
+
end
|
1195
1292
|
end
|
1196
1293
|
end
|
1197
1294
|
context "when read" do
|
@@ -1228,50 +1325,322 @@ describe Olfactory::Template do
|
|
1228
1325
|
context "defaults" do
|
1229
1326
|
let(:value) { "doodad" }
|
1230
1327
|
let(:default_value) { "default doodad" }
|
1328
|
+
let(:default_after_value) { "default after doodad" }
|
1231
1329
|
context "before" do
|
1232
|
-
|
1233
|
-
|
1234
|
-
|
1235
|
-
|
1236
|
-
|
1237
|
-
|
1238
|
-
|
1330
|
+
context "all" do
|
1331
|
+
before(:context) do
|
1332
|
+
Olfactory.template :widget do |t|
|
1333
|
+
t.has_one :doodad
|
1334
|
+
t.has_one :other_doodad
|
1335
|
+
t.before do |d|
|
1336
|
+
d.doodad default_value
|
1337
|
+
d.other_doodad default_value
|
1338
|
+
end
|
1239
1339
|
end
|
1240
1340
|
end
|
1341
|
+
subject do
|
1342
|
+
Olfactory.build :widget do |t|
|
1343
|
+
t.doodad value
|
1344
|
+
end
|
1345
|
+
end
|
1346
|
+
it "values can be overriden" do
|
1347
|
+
expect(subject[:doodad]).to eq(value)
|
1348
|
+
end
|
1349
|
+
it "values can be set"do
|
1350
|
+
expect(subject[:other_doodad]).to eq(default_value)
|
1351
|
+
end
|
1241
1352
|
end
|
1242
|
-
|
1243
|
-
|
1244
|
-
|
1353
|
+
context "embedded" do
|
1354
|
+
before(:context) do
|
1355
|
+
Olfactory.template :widget do |t|
|
1356
|
+
t.embeds_one :doodad
|
1357
|
+
t.macro :quality do |m, type|
|
1358
|
+
m.transient :attribute, type.to_s
|
1359
|
+
end
|
1360
|
+
t.before(:embedded) do |d|
|
1361
|
+
d.quality :dull
|
1362
|
+
end
|
1363
|
+
t.before do |d|
|
1364
|
+
d.quality :scratched
|
1365
|
+
end
|
1366
|
+
end
|
1367
|
+
Olfactory.template :doodad do |t|
|
1368
|
+
t.has_one :gizmo
|
1369
|
+
t.after do |d|
|
1370
|
+
d.gizmo "#{d.transients[:attribute]} #{value}"
|
1371
|
+
end
|
1372
|
+
end
|
1373
|
+
end
|
1374
|
+
let(:shiny) do
|
1375
|
+
Olfactory.build :widget do |w|
|
1376
|
+
w.quality :shiny
|
1377
|
+
w.doodad
|
1378
|
+
end
|
1379
|
+
end
|
1380
|
+
let(:dull) do
|
1381
|
+
Olfactory.build :widget do |w|
|
1382
|
+
w.doodad
|
1383
|
+
end
|
1384
|
+
end
|
1385
|
+
it { expect(shiny[:doodad][:gizmo]).to eq("shiny #{value}")}
|
1386
|
+
it { expect(dull[:doodad][:gizmo]).to eq("dull #{value}")}
|
1387
|
+
context "(run once)" do
|
1388
|
+
before(:context) do
|
1389
|
+
Olfactory.template :widget do |t|
|
1390
|
+
t.embeds_many :doodads, :singular => :doodad
|
1391
|
+
t.has_one :thingamabob
|
1392
|
+
t.macro :quality do |m, type|
|
1393
|
+
m.transient :attribute, type.to_s
|
1394
|
+
end
|
1395
|
+
t.before(:embedded, :run => :once) do |d|
|
1396
|
+
d.quality :dull
|
1397
|
+
d.thingamabob "thingamabob" if d[:doodads] && d[:doodads].count > 0
|
1398
|
+
end
|
1399
|
+
end
|
1400
|
+
Olfactory.template :doodad do |t|
|
1401
|
+
t.has_one :gizmo
|
1402
|
+
t.after do |d|
|
1403
|
+
d.gizmo "#{d.transients[:attribute]} #{value}"
|
1404
|
+
end
|
1405
|
+
end
|
1406
|
+
end
|
1407
|
+
subject do
|
1408
|
+
Olfactory.build :widget do |w|
|
1409
|
+
w.doodad
|
1410
|
+
w.quality :shiny
|
1411
|
+
w.doodad
|
1412
|
+
end
|
1413
|
+
end
|
1414
|
+
it do
|
1415
|
+
expect(subject[:doodads]).to eq([{ :gizmo => "dull #{value}" }, { :gizmo => "shiny #{value}" }])
|
1416
|
+
expect(subject[:thingamabob]).to be_nil
|
1417
|
+
end
|
1245
1418
|
end
|
1246
1419
|
end
|
1247
|
-
|
1248
|
-
|
1420
|
+
end
|
1421
|
+
context "after" do
|
1422
|
+
context "values" do
|
1423
|
+
context "given a has_one" do
|
1424
|
+
before(:context) do
|
1425
|
+
Olfactory.template :widget do |t|
|
1426
|
+
t.has_one :doodad
|
1427
|
+
t.has_one :other_doodad
|
1428
|
+
t.after do |d|
|
1429
|
+
d.doodad default_value
|
1430
|
+
d.other_doodad default_value
|
1431
|
+
end
|
1432
|
+
end
|
1433
|
+
end
|
1434
|
+
subject do
|
1435
|
+
Olfactory.build :widget do |t|
|
1436
|
+
t.doodad value
|
1437
|
+
end
|
1438
|
+
end
|
1439
|
+
it "will not override existing ones" do
|
1440
|
+
expect(subject[:doodad]).to eq(value)
|
1441
|
+
end
|
1442
|
+
it "will fill in missing ones"do
|
1443
|
+
expect(subject[:other_doodad]).to eq(default_value)
|
1444
|
+
end
|
1445
|
+
end
|
1446
|
+
context "given a has_many" do
|
1447
|
+
before(:context) do
|
1448
|
+
Olfactory.template :widget do |t|
|
1449
|
+
t.has_many :doodads, :singular => :doodad
|
1450
|
+
t.has_many :other_doodads, :singular => :other_doodad
|
1451
|
+
t.after do |d|
|
1452
|
+
d.doodad default_value
|
1453
|
+
d.doodads default_value
|
1454
|
+
d.other_doodad default_value
|
1455
|
+
d.other_doodads default_value, default_value
|
1456
|
+
end
|
1457
|
+
end
|
1458
|
+
end
|
1459
|
+
subject do
|
1460
|
+
Olfactory.build :widget do |t|
|
1461
|
+
t.doodad value
|
1462
|
+
end
|
1463
|
+
end
|
1464
|
+
it "will not override existing ones" do
|
1465
|
+
expect(subject[:doodads]).to eq([value])
|
1466
|
+
end
|
1467
|
+
it "will fill in missing ones"do
|
1468
|
+
expect(subject[:other_doodads]).to eq([default_value, default_value, default_value])
|
1469
|
+
end
|
1470
|
+
end
|
1471
|
+
context "given a embeds_one" do
|
1472
|
+
before(:context) do
|
1473
|
+
Olfactory.template :widget do |t|
|
1474
|
+
t.embeds_one :doodad
|
1475
|
+
t.embeds_one :other_doodad
|
1476
|
+
t.after do |d|
|
1477
|
+
d.doodad { |doodad| doodad.gizmo default_value }
|
1478
|
+
d.other_doodad { |doodad| doodad.gizmo default_value }
|
1479
|
+
end
|
1480
|
+
end
|
1481
|
+
Olfactory.template :doodad do |t|
|
1482
|
+
t.has_one :gizmo
|
1483
|
+
end
|
1484
|
+
Olfactory.template :other_doodad do |t|
|
1485
|
+
t.has_one :gizmo
|
1486
|
+
end
|
1487
|
+
end
|
1488
|
+
subject do
|
1489
|
+
Olfactory.build :widget do |t|
|
1490
|
+
t.doodad { |doodad| doodad.gizmo value }
|
1491
|
+
end
|
1492
|
+
end
|
1493
|
+
it "will not override existing ones" do
|
1494
|
+
expect(subject[:doodad]).to eq({ :gizmo => value })
|
1495
|
+
end
|
1496
|
+
it "will fill in missing ones" do
|
1497
|
+
expect(subject[:other_doodad]).to eq({ :gizmo => default_value })
|
1498
|
+
end
|
1499
|
+
end
|
1500
|
+
context "given a embeds_many" do
|
1501
|
+
before(:context) do
|
1502
|
+
Olfactory.template :widget do |t|
|
1503
|
+
t.embeds_many :doodads, :singular => :doodad
|
1504
|
+
t.embeds_many :other_doodads, :singular => :other_doodad
|
1505
|
+
t.after do |d|
|
1506
|
+
d.doodad { |doodad| doodad.gizmo default_value }
|
1507
|
+
d.doodads 2 do |doodad| doodad.gizmo default_value end
|
1508
|
+
d.other_doodad { |doodad| doodad.gizmo default_value }
|
1509
|
+
d.other_doodads 2 do |doodad| doodad.gizmo default_value end
|
1510
|
+
end
|
1511
|
+
end
|
1512
|
+
Olfactory.template :doodad do |t|
|
1513
|
+
t.has_one :gizmo
|
1514
|
+
end
|
1515
|
+
Olfactory.template :other_doodad do |t|
|
1516
|
+
t.has_one :gizmo
|
1517
|
+
end
|
1518
|
+
end
|
1519
|
+
subject do
|
1520
|
+
Olfactory.build :widget do |t|
|
1521
|
+
t.doodad { |doodad| doodad.gizmo value }
|
1522
|
+
end
|
1523
|
+
end
|
1524
|
+
it "will not override existing ones" do
|
1525
|
+
expect(subject[:doodads]).to eq([{ :gizmo => value }])
|
1526
|
+
end
|
1527
|
+
it "will fill in missing ones"do
|
1528
|
+
expect(subject[:other_doodads]).to eq([{ :gizmo => default_value }, { :gizmo => default_value }, { :gizmo => default_value }])
|
1529
|
+
end
|
1530
|
+
end
|
1531
|
+
end
|
1532
|
+
end
|
1533
|
+
context "both before and after" do
|
1534
|
+
context "given no value" do
|
1535
|
+
before(:context) do
|
1536
|
+
Olfactory.template :widget do |t|
|
1537
|
+
t.has_one :doodad
|
1538
|
+
t.before do |d|
|
1539
|
+
d.doodad default_value
|
1540
|
+
end
|
1541
|
+
t.after do |d|
|
1542
|
+
d.doodad default_after_value
|
1543
|
+
end
|
1544
|
+
end
|
1545
|
+
end
|
1546
|
+
subject do
|
1547
|
+
Olfactory.build :widget
|
1548
|
+
end
|
1549
|
+
it "will override with a default the second time" do
|
1550
|
+
expect(subject[:doodad]).to eq(default_after_value)
|
1551
|
+
end
|
1249
1552
|
end
|
1250
|
-
|
1251
|
-
|
1553
|
+
context "given a value" do
|
1554
|
+
before(:context) do
|
1555
|
+
Olfactory.template :widget do |t|
|
1556
|
+
t.has_one :doodad
|
1557
|
+
t.before do |d|
|
1558
|
+
d.doodad default_value
|
1559
|
+
end
|
1560
|
+
t.after do |d|
|
1561
|
+
d.doodad default_value
|
1562
|
+
end
|
1563
|
+
end
|
1564
|
+
end
|
1565
|
+
subject do
|
1566
|
+
Olfactory.build :widget do |t|
|
1567
|
+
t.doodad value
|
1568
|
+
end
|
1569
|
+
end
|
1570
|
+
it "will not set override with a default the second time" do
|
1571
|
+
expect(subject[:doodad]).to eq(value)
|
1572
|
+
end
|
1252
1573
|
end
|
1253
1574
|
end
|
1254
|
-
|
1575
|
+
end
|
1576
|
+
context "instantiators" do
|
1577
|
+
context "given a symbol and block" do
|
1255
1578
|
before(:context) do
|
1256
1579
|
Olfactory.template :widget do |t|
|
1257
1580
|
t.has_one :doodad
|
1258
|
-
t.
|
1259
|
-
|
1260
|
-
d.doodad default_value
|
1261
|
-
d.other_doodad default_value
|
1581
|
+
t.instantiate :doodad do |i|
|
1582
|
+
SaveableString.new("#{i[:doodad]}-instance")
|
1262
1583
|
end
|
1263
1584
|
end
|
1264
1585
|
end
|
1265
|
-
|
1266
|
-
|
1267
|
-
|
1586
|
+
let(:value) { "doodad" }
|
1587
|
+
let(:template) { Olfactory.build :widget do |w| w.doodad "doodad" end }
|
1588
|
+
|
1589
|
+
context "invoked with #build" do
|
1590
|
+
subject do
|
1591
|
+
template.build(:doodad)
|
1592
|
+
end
|
1593
|
+
it do
|
1594
|
+
expect(subject).to eq("#{value}-instance")
|
1595
|
+
expect(subject.saved?).to be false
|
1268
1596
|
end
|
1269
1597
|
end
|
1270
|
-
|
1271
|
-
|
1272
|
-
|
1273
|
-
|
1274
|
-
|
1598
|
+
context "invoked with #create" do
|
1599
|
+
subject do
|
1600
|
+
template.create(:doodad)
|
1601
|
+
end
|
1602
|
+
context "that returns a saveable object" do
|
1603
|
+
before(:context) do
|
1604
|
+
Olfactory.template :widget do |t|
|
1605
|
+
t.has_one :doodad
|
1606
|
+
t.instantiate :doodad do |i|
|
1607
|
+
SaveableString.new("#{i[:doodad]}-instance")
|
1608
|
+
end
|
1609
|
+
end
|
1610
|
+
end
|
1611
|
+
it do
|
1612
|
+
expect(subject).to eq("#{value}-instance")
|
1613
|
+
expect(subject.saved?).to be true
|
1614
|
+
end
|
1615
|
+
end
|
1616
|
+
context "that returns an array of saveable objects" do
|
1617
|
+
before(:context) do
|
1618
|
+
Olfactory.template :widget do |t|
|
1619
|
+
t.has_one :doodad
|
1620
|
+
t.instantiate :doodad do |i|
|
1621
|
+
[SaveableString.new("#{i[:doodad]}-instance-1"), SaveableString.new("#{i[:doodad]}-instance-2")]
|
1622
|
+
end
|
1623
|
+
end
|
1624
|
+
end
|
1625
|
+
it do
|
1626
|
+
expect(subject).to eq(["#{value}-instance-1", "#{value}-instance-2"])
|
1627
|
+
expect(subject.all? { |d| d.saved? }).to be true
|
1628
|
+
end
|
1629
|
+
end
|
1630
|
+
context "that returns a hash of saveable objects" do
|
1631
|
+
before(:context) do
|
1632
|
+
Olfactory.template :widget do |t|
|
1633
|
+
t.has_one :doodad
|
1634
|
+
t.instantiate :doodad do |i|
|
1635
|
+
{ 1 => SaveableString.new("#{i[:doodad]}-instance"), 2 => SaveableString.new("#{i[:doodad]}-instance") }
|
1636
|
+
end
|
1637
|
+
end
|
1638
|
+
end
|
1639
|
+
it do
|
1640
|
+
expect(subject).to eq({ 1 => "#{value}-instance", 2 => "#{value}-instance" })
|
1641
|
+
expect(subject.values.all? { |d| d.saved? }).to be true
|
1642
|
+
end
|
1643
|
+
end
|
1275
1644
|
end
|
1276
1645
|
end
|
1277
1646
|
end
|