activefacts-api 1.8.1 → 1.8.3
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 +4 -4
- data/.gitignore +28 -0
- data/.rspec +0 -1
- data/Gemfile +1 -10
- data/Rakefile +3 -27
- data/VERSION +1 -1
- data/activefacts-api.gemspec +35 -95
- data/lib/activefacts/api/version.rb +5 -0
- data/lib/activefacts/tracer.rb +13 -9
- metadata +23 -68
- data/spec/constellation/constellation_spec.rb +0 -577
- data/spec/constellation/instance_index_spec.rb +0 -91
- data/spec/constellation/instance_spec.rb +0 -441
- data/spec/fact_type/role_values_spec.rb +0 -439
- data/spec/fact_type/roles_spec.rb +0 -283
- data/spec/fixtures/tax.rb +0 -45
- data/spec/identification_scheme/identification_spec.rb +0 -420
- data/spec/identification_scheme/identity_change_spec.rb +0 -119
- data/spec/identification_scheme/identity_supertype_change_spec.rb +0 -63
- data/spec/metadata_spec.rb +0 -267
- data/spec/object_type/entity_type/entity_type_spec.rb +0 -102
- data/spec/object_type/entity_type/multipart_identification_spec.rb +0 -82
- data/spec/object_type/value_type/autocounter_spec.rb +0 -87
- data/spec/object_type/value_type/date_time_spec.rb +0 -38
- data/spec/object_type/value_type/guid_spec.rb +0 -71
- data/spec/object_type/value_type/numeric_spec.rb +0 -63
- data/spec/object_type/value_type/value_type_spec.rb +0 -124
- data/spec/simplecov_helper.rb +0 -9
- data/spec/spec_helper.rb +0 -13
- data/spec/support/reduce_exceptions_helper.rb +0 -29
data/spec/fixtures/tax.rb
DELETED
@@ -1,45 +0,0 @@
|
|
1
|
-
require 'activefacts/api'
|
2
|
-
|
3
|
-
module Tax
|
4
|
-
|
5
|
-
class Name < String
|
6
|
-
value_type
|
7
|
-
end
|
8
|
-
|
9
|
-
class Person
|
10
|
-
identified_by :name
|
11
|
-
one_to_one :name
|
12
|
-
end
|
13
|
-
|
14
|
-
class Australian < Person
|
15
|
-
end
|
16
|
-
|
17
|
-
class TaxPayer < Person
|
18
|
-
end
|
19
|
-
|
20
|
-
class TFN < Int
|
21
|
-
value_type
|
22
|
-
end
|
23
|
-
|
24
|
-
class AustralianTaxPayer < Australian
|
25
|
-
supertypes TaxPayer
|
26
|
-
identified_by :tfn
|
27
|
-
one_to_one :tfn, :class => TFN # Capitalisation rules!
|
28
|
-
end
|
29
|
-
|
30
|
-
class YearNr < Int
|
31
|
-
value_type
|
32
|
-
end
|
33
|
-
|
34
|
-
class Year
|
35
|
-
identified_by :year_nr
|
36
|
-
one_to_one :year_nr
|
37
|
-
end
|
38
|
-
|
39
|
-
class AustralianTaxReturn
|
40
|
-
identified_by :australian_tax_payer, :year
|
41
|
-
has_one :australian_tax_payer
|
42
|
-
has_one :year
|
43
|
-
end
|
44
|
-
|
45
|
-
end
|
@@ -1,420 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# ActiveFacts tests: Value instances in the Runtime API
|
3
|
-
# Copyright (c) 2008 Clifford Heath. Read the LICENSE file.
|
4
|
-
#
|
5
|
-
|
6
|
-
describe "An Entity Type" do
|
7
|
-
before :all do
|
8
|
-
module ModIS
|
9
|
-
class Name < String
|
10
|
-
value_type
|
11
|
-
end
|
12
|
-
|
13
|
-
class Number < Int
|
14
|
-
value_type
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
before :each do
|
19
|
-
@c = ActiveFacts::API::Constellation.new(ModIS)
|
20
|
-
end
|
21
|
-
|
22
|
-
describe "whose instances are identified by a single value role" do
|
23
|
-
before :all do
|
24
|
-
module ModIS
|
25
|
-
class Business
|
26
|
-
identified_by :name
|
27
|
-
one_to_one :name
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
it "should fail if the role isn't one-to-one" do
|
33
|
-
proc do
|
34
|
-
module ModIS
|
35
|
-
class Cat
|
36
|
-
identified_by :name
|
37
|
-
has_one :name
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end.should raise_error(ActiveFacts::API::InvalidIdentificationException)
|
41
|
-
end
|
42
|
-
|
43
|
-
describe "when asserted" do
|
44
|
-
before :each do
|
45
|
-
@bus = @c.Business
|
46
|
-
@bus = @c.Business('Acme')
|
47
|
-
@acme = @c.Name['Acme']
|
48
|
-
end
|
49
|
-
|
50
|
-
it "should return a new instance if not previously present" do
|
51
|
-
@bus.should be_a(ModIS::Business)
|
52
|
-
end
|
53
|
-
|
54
|
-
it "should assert the identifying value" do
|
55
|
-
@acme.should be_a(ModIS::Name)
|
56
|
-
end
|
57
|
-
|
58
|
-
it "should be found in the constellation using the value" do
|
59
|
-
@c.Business[['Acme']].should == @bus
|
60
|
-
@c.Business[[@acme]].should == @bus
|
61
|
-
end
|
62
|
-
|
63
|
-
it "should belong to the constellation" do
|
64
|
-
@bus.constellation.should == @c
|
65
|
-
end
|
66
|
-
|
67
|
-
it "should be assigned to the value's counterpart role" do
|
68
|
-
@acme.business.should == @bus
|
69
|
-
end
|
70
|
-
|
71
|
-
it "should return a previously-existing instance" do
|
72
|
-
@c.Business[['Acme']].should == @bus
|
73
|
-
@c.Business.size.should == 1
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
describe "when the value is changed" do
|
78
|
-
before :each do
|
79
|
-
@fly = @c.Business('Fly')
|
80
|
-
@bus = @c.Business('Acme')
|
81
|
-
@acme = @c.Name['Acme']
|
82
|
-
end
|
83
|
-
|
84
|
-
it "should fail if the new value already exists" do
|
85
|
-
proc do
|
86
|
-
@fly.name = 'Acme'
|
87
|
-
end.should raise_error(ActiveFacts::API::DuplicateIdentifyingValueException)
|
88
|
-
end
|
89
|
-
|
90
|
-
it "should not fail if the new value is self" do
|
91
|
-
lambda { @bus.name = 'Acme' }.should_not raise_error
|
92
|
-
end
|
93
|
-
|
94
|
-
describe "to a previously-nonexistent value" do
|
95
|
-
before :each do
|
96
|
-
@bus.name = 'Bloggs'
|
97
|
-
end
|
98
|
-
|
99
|
-
it "should assert the new identifier" do
|
100
|
-
@c.Name['Bloggs'].should be_a(ModIS::Name)
|
101
|
-
end
|
102
|
-
|
103
|
-
it "should allow the change" do
|
104
|
-
@bus.name.should == 'Bloggs'
|
105
|
-
@c.Business.size.should == 2
|
106
|
-
end
|
107
|
-
|
108
|
-
it "should be found under the new identifier" do
|
109
|
-
@c.Business[['Bloggs']].should == @bus
|
110
|
-
end
|
111
|
-
|
112
|
-
it "should be in the constellation's index under the new identifier" do
|
113
|
-
@c.Business.keys.should include ['Bloggs']
|
114
|
-
end
|
115
|
-
|
116
|
-
it "should be the counterpart of the new identifier" do
|
117
|
-
@c.Name['Bloggs'].business.should == @bus
|
118
|
-
end
|
119
|
-
|
120
|
-
it "should not be found in the constellation using the old value" do
|
121
|
-
@c.Business[['Acme']].should be_nil
|
122
|
-
end
|
123
|
-
|
124
|
-
it "the old value's back-reference is set to nil" do
|
125
|
-
@acme.business.should be_nil
|
126
|
-
end
|
127
|
-
|
128
|
-
#describe "and the old identifying value plays no other roles" do
|
129
|
-
# describe "and the player of the identifying role is not independent" do
|
130
|
-
# it "should retract the previous value" do
|
131
|
-
# pending "All value types default to independent" do
|
132
|
-
# @c.Name['Acme'].should be_nil
|
133
|
-
# end
|
134
|
-
# end
|
135
|
-
# end
|
136
|
-
#end
|
137
|
-
|
138
|
-
end
|
139
|
-
end
|
140
|
-
|
141
|
-
describe "when retracted" do
|
142
|
-
before :each do
|
143
|
-
@bus = @c.Business('Acme')
|
144
|
-
@acme = @c.Name['Acme']
|
145
|
-
end
|
146
|
-
|
147
|
-
it "should disappear from the constellation" do
|
148
|
-
@bus.retract
|
149
|
-
@c.Business[['Acme']].should be_nil
|
150
|
-
end
|
151
|
-
|
152
|
-
describe "and the identifying value plays no other roles" do
|
153
|
-
describe "and the player of the identifying role is not independent" do
|
154
|
-
before :each do
|
155
|
-
@bus.retract
|
156
|
-
end
|
157
|
-
|
158
|
-
#it "should retract the identifying value also" do
|
159
|
-
# pending "All value types default to independent" do
|
160
|
-
# @c.Name['Acme'].should be_nil
|
161
|
-
# end
|
162
|
-
#end
|
163
|
-
|
164
|
-
it "should not appear as the value's counterpart role" do
|
165
|
-
@acme.business.should be_nil
|
166
|
-
end
|
167
|
-
end
|
168
|
-
|
169
|
-
describe "and the identifying value plays other roles" do
|
170
|
-
before :all do
|
171
|
-
module ModIS
|
172
|
-
class Dog
|
173
|
-
identified_by :name
|
174
|
-
one_to_one :name
|
175
|
-
end
|
176
|
-
end
|
177
|
-
end
|
178
|
-
before :each do
|
179
|
-
@c.Dog("Acme")
|
180
|
-
@bus.retract
|
181
|
-
end
|
182
|
-
|
183
|
-
it "should retain the identifying value, but with a nil counterpart role" do
|
184
|
-
@c.Name['Acme'].should == @acme
|
185
|
-
@acme.business.should be_nil
|
186
|
-
end
|
187
|
-
end
|
188
|
-
end
|
189
|
-
end
|
190
|
-
end
|
191
|
-
|
192
|
-
describe "identified by two values" do
|
193
|
-
before :all do
|
194
|
-
module ModIS
|
195
|
-
class Building
|
196
|
-
identified_by :name
|
197
|
-
one_to_one :name
|
198
|
-
end
|
199
|
-
|
200
|
-
class Room
|
201
|
-
identified_by :building, :number
|
202
|
-
has_one :building
|
203
|
-
has_one :number
|
204
|
-
end
|
205
|
-
|
206
|
-
class OwnershipId < Int
|
207
|
-
value_type
|
208
|
-
end
|
209
|
-
|
210
|
-
class Owner
|
211
|
-
identified_by :ownership_id, :building
|
212
|
-
has_one :ownership_id
|
213
|
-
has_one :building
|
214
|
-
end
|
215
|
-
|
216
|
-
class OwnerRoom
|
217
|
-
identified_by :owner, :room
|
218
|
-
has_one :owner
|
219
|
-
has_one :room
|
220
|
-
end
|
221
|
-
end
|
222
|
-
end
|
223
|
-
|
224
|
-
before :each do
|
225
|
-
@c = ActiveFacts::API::Constellation.new(ModIS)
|
226
|
-
end
|
227
|
-
|
228
|
-
it "should fail if any role is one-to-one" do
|
229
|
-
proc do
|
230
|
-
module ModIS
|
231
|
-
class Floor
|
232
|
-
identified_by :building, :number
|
233
|
-
has_one :building
|
234
|
-
one_to_one :number # Error, invalid identifier
|
235
|
-
end
|
236
|
-
end
|
237
|
-
end.should raise_error(ActiveFacts::API::InvalidIdentificationException)
|
238
|
-
end
|
239
|
-
|
240
|
-
describe "when asserted" do
|
241
|
-
before :each do
|
242
|
-
@b = @c.Building('Mackay')
|
243
|
-
@mackay = @c.Name['Mackay']
|
244
|
-
@r = @c.Room(@b, 101)
|
245
|
-
@rn = @r.number
|
246
|
-
|
247
|
-
@o = @c.Owner(1_001, @b)
|
248
|
-
@or = @c.OwnerRoom(@o, @r)
|
249
|
-
end
|
250
|
-
|
251
|
-
it "should return a new instance if not previously present" do
|
252
|
-
@r.should be_a(ModIS::Room)
|
253
|
-
end
|
254
|
-
|
255
|
-
it "should assert the identifying values" do
|
256
|
-
@rn.should be_a(ModIS::Number)
|
257
|
-
@c.Number[@rn.identifying_role_values].should == @rn # Yes
|
258
|
-
@c.Number[101].should == @rn # No
|
259
|
-
@c.Number[101].should be_eql 101 # No
|
260
|
-
end
|
261
|
-
|
262
|
-
it "should be found in the constellation using the value" do
|
263
|
-
@c.Room[[@b.identifying_role_values, @rn.identifying_role_values]].should == @r
|
264
|
-
@c.Room[[@b.identifying_role_values, 101]].should == @r
|
265
|
-
@c.Room[[['Mackay'], 101]].should == @r
|
266
|
-
end
|
267
|
-
|
268
|
-
it "should belong to the constellation" do
|
269
|
-
@r.constellation.should == @c
|
270
|
-
end
|
271
|
-
|
272
|
-
it "should be added to the values' counterpart roles" do
|
273
|
-
@rn.all_room.to_a.should == [@r]
|
274
|
-
@b.all_room.to_a.should == [@r]
|
275
|
-
end
|
276
|
-
|
277
|
-
it "should return a previously-existing instance" do
|
278
|
-
@c.Room(@b, 101).should == @r
|
279
|
-
@c.Room(['Mackay'], 101).should == @r
|
280
|
-
@c.Room.size.should == 1
|
281
|
-
end
|
282
|
-
end
|
283
|
-
|
284
|
-
describe "when the value is changed" do
|
285
|
-
before :each do
|
286
|
-
@b = @c.Building('Mackay')
|
287
|
-
@mackay = @c.Name['Mackay']
|
288
|
-
@r = @c.Room(@b, 101)
|
289
|
-
@rn = @r.number
|
290
|
-
|
291
|
-
@o = @c.Owner(1_001, @b)
|
292
|
-
@or = @c.OwnerRoom(@o, @r)
|
293
|
-
end
|
294
|
-
|
295
|
-
it "should fail if the new value already exists" do
|
296
|
-
@c.Room(@b, 102)
|
297
|
-
lambda { @r.number = 102 }.should raise_error(ActiveFacts::API::DuplicateIdentifyingValueException)
|
298
|
-
end
|
299
|
-
|
300
|
-
describe "to a previously-nonexistent value" do
|
301
|
-
before :each do
|
302
|
-
@r.number = 103
|
303
|
-
@new_number = @r.number
|
304
|
-
end
|
305
|
-
|
306
|
-
it "should assert the new identifier" do
|
307
|
-
@new_number.should_not be_nil
|
308
|
-
end
|
309
|
-
|
310
|
-
it "should allow the change" do
|
311
|
-
@r.number.should == @new_number
|
312
|
-
@r.number.should be_eql(103)
|
313
|
-
end
|
314
|
-
|
315
|
-
it "should be found under the new identifier" do
|
316
|
-
@c.Room[[@b.identifying_role_values, 103]].should == @r
|
317
|
-
@c.Room[[['Mackay'], 101]].should be_nil
|
318
|
-
end
|
319
|
-
|
320
|
-
it "should be found under the new identifier even on deep associations" do
|
321
|
-
# p @c.OwnerRoom.keys[0]
|
322
|
-
# p @new_number
|
323
|
-
# p [@o.identifying_role_values, @r.identifying_role_values]
|
324
|
-
@c.OwnerRoom[[@o.identifying_role_values, @r.identifying_role_values]].should == @or
|
325
|
-
@c.OwnerRoom[[[1_001, ['Mackay']], [['Mackay'], 103]]].should == @or
|
326
|
-
@c.OwnerRoom[[[1_001, ['Mackay']], [['Mackay'], 101]]].should be_nil
|
327
|
-
end
|
328
|
-
|
329
|
-
it "should be in the constellation's index under the new identifier" do
|
330
|
-
@c.Room(['Mackay'], @r.number).should_not be_nil
|
331
|
-
end
|
332
|
-
|
333
|
-
it "should be included in the counterparts of the new identifier roles" do
|
334
|
-
@b.all_room.to_a.should == [@r]
|
335
|
-
@new_number.all_room.to_a.should == [@r]
|
336
|
-
end
|
337
|
-
|
338
|
-
it "should not be found in the constellation using the old value" do
|
339
|
-
@c.Room.keys[0].should_not == [['Mackay'],101]
|
340
|
-
end
|
341
|
-
|
342
|
-
it "the old value's back-reference is set to nil" do
|
343
|
-
# @rn.all_room.should_not include @r
|
344
|
-
@rn.all_room.to_a.should_not include @r
|
345
|
-
end
|
346
|
-
|
347
|
-
#describe "and the old identifying value plays no other roles" do
|
348
|
-
# describe "and the player of the identifying role is not independent" do
|
349
|
-
# it "should retract the previous value" do
|
350
|
-
# pending "All value types default to independent" do
|
351
|
-
# @c.Number[101].should be_nil
|
352
|
-
# end
|
353
|
-
# end
|
354
|
-
# end
|
355
|
-
#end
|
356
|
-
end
|
357
|
-
end
|
358
|
-
|
359
|
-
=begin
|
360
|
-
describe "when retracted" do
|
361
|
-
it "should disappear from the constellation"
|
362
|
-
describe "and the identifying value plays no other roles" do
|
363
|
-
describe "and the player of the identifying role is not independent" do
|
364
|
-
it "should retract the identifying value also"
|
365
|
-
it "should not appear as the value's counterpart role"
|
366
|
-
end
|
367
|
-
describe "and the identifying value plays other roles" do
|
368
|
-
it "should retain the identifying value, but with a nil counterpart role"
|
369
|
-
end
|
370
|
-
end
|
371
|
-
end
|
372
|
-
=end
|
373
|
-
|
374
|
-
end
|
375
|
-
|
376
|
-
=begin
|
377
|
-
describe "which inherits its identification from a supertype" do
|
378
|
-
describe "which also has a secondary supertype" do
|
379
|
-
end
|
380
|
-
end
|
381
|
-
|
382
|
-
describe "which has a supertype that has separate identification" do
|
383
|
-
before :each do
|
384
|
-
module ModIS
|
385
|
-
class Animal
|
386
|
-
identified_by :number
|
387
|
-
one_to_one :neumber
|
388
|
-
end
|
389
|
-
class Dog < Animal
|
390
|
-
identified_by :name
|
391
|
-
one_to_one :name
|
392
|
-
end
|
393
|
-
end
|
394
|
-
end
|
395
|
-
|
396
|
-
describe "when asserted" do
|
397
|
-
describe "and both identifiers are new" do
|
398
|
-
it "should be found using the respective identifiers"
|
399
|
-
end
|
400
|
-
describe "and only the supertype identifier is new" do
|
401
|
-
it "should be rejected because of the duplicate subtype identifier"
|
402
|
-
end
|
403
|
-
describe "and only the subtype identifier is new" do
|
404
|
-
it "should be rejected because of the duplicate supertype identifier"
|
405
|
-
end
|
406
|
-
end
|
407
|
-
|
408
|
-
describe "when the subtype identifier is changed" do
|
409
|
-
it "should fail if the new subtype value already exists"
|
410
|
-
it "should allow the change if the new subtype value doesn't already exist"
|
411
|
-
end
|
412
|
-
|
413
|
-
describe "when the supertype identifier is changed" do
|
414
|
-
it "should fail if the new supertype value already exists"
|
415
|
-
it "should allow the change if the new supertype value doesn't already exist"
|
416
|
-
end
|
417
|
-
|
418
|
-
end
|
419
|
-
=end
|
420
|
-
end
|