diametric 0.1.1-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +28 -0
- data/Jarfile +20 -0
- data/LICENSE.txt +22 -0
- data/README.md +264 -0
- data/Rakefile +49 -0
- data/bin/datomic-rest +33 -0
- data/bin/download-datomic +13 -0
- data/datomic_version.yml +4 -0
- data/diametric-java.gemspec +39 -0
- data/ext/diametric/DiametricCollection.java +147 -0
- data/ext/diametric/DiametricConnection.java +113 -0
- data/ext/diametric/DiametricDatabase.java +107 -0
- data/ext/diametric/DiametricEntity.java +90 -0
- data/ext/diametric/DiametricListenableFuture.java +47 -0
- data/ext/diametric/DiametricObject.java +66 -0
- data/ext/diametric/DiametricPeer.java +414 -0
- data/ext/diametric/DiametricService.java +102 -0
- data/ext/diametric/DiametricUUID.java +61 -0
- data/ext/diametric/DiametricUtils.java +183 -0
- data/lib/boolean_type.rb +3 -0
- data/lib/diametric.rb +42 -0
- data/lib/diametric/config.rb +54 -0
- data/lib/diametric/config/environment.rb +42 -0
- data/lib/diametric/entity.rb +659 -0
- data/lib/diametric/errors.rb +13 -0
- data/lib/diametric/generators/active_model.rb +42 -0
- data/lib/diametric/persistence.rb +48 -0
- data/lib/diametric/persistence/common.rb +82 -0
- data/lib/diametric/persistence/peer.rb +154 -0
- data/lib/diametric/persistence/rest.rb +107 -0
- data/lib/diametric/query.rb +259 -0
- data/lib/diametric/railtie.rb +52 -0
- data/lib/diametric/rest_service.rb +74 -0
- data/lib/diametric/service_base.rb +77 -0
- data/lib/diametric/transactor.rb +86 -0
- data/lib/diametric/version.rb +3 -0
- data/lib/diametric_service.jar +0 -0
- data/lib/tasks/create_schema.rb +27 -0
- data/lib/tasks/diametric_config.rb +45 -0
- data/lib/value_enums.rb +8 -0
- data/spec/conf_helper.rb +55 -0
- data/spec/config/free-transactor-template.properties +73 -0
- data/spec/config/logback.xml +59 -0
- data/spec/data/seattle-data0.dtm +452 -0
- data/spec/data/seattle-data1.dtm +326 -0
- data/spec/developer_create_sample.rb +39 -0
- data/spec/developer_query_spec.rb +120 -0
- data/spec/diametric/config_spec.rb +60 -0
- data/spec/diametric/entity_spec.rb +476 -0
- data/spec/diametric/peer_api_spec.rb +147 -0
- data/spec/diametric/persistence/peer_many2many_spec.rb +76 -0
- data/spec/diametric/persistence/peer_spec.rb +27 -0
- data/spec/diametric/persistence/rest_spec.rb +30 -0
- data/spec/diametric/persistence_spec.rb +59 -0
- data/spec/diametric/query_spec.rb +118 -0
- data/spec/diametric/rest_service_spec.rb +56 -0
- data/spec/diametric/transactor_spec.rb +68 -0
- data/spec/integration_spec.rb +107 -0
- data/spec/parent_child_sample.rb +42 -0
- data/spec/peer_integration_spec.rb +121 -0
- data/spec/peer_seattle_spec.rb +200 -0
- data/spec/rc2013_seattle_big.rb +82 -0
- data/spec/rc2013_seattle_small.rb +60 -0
- data/spec/rc2013_simple_sample.rb +72 -0
- data/spec/seattle_integration_spec.rb +106 -0
- data/spec/simple_validation_sample.rb +31 -0
- data/spec/spec_helper.rb +63 -0
- data/spec/support/entities.rb +157 -0
- data/spec/support/gen_entity_class.rb +9 -0
- data/spec/support/persistence_examples.rb +104 -0
- data/spec/test_version_file.yml +4 -0
- metadata +290 -0
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Diametric::Config do
|
4
|
+
before do
|
5
|
+
Diametric::Config.configuration.clear
|
6
|
+
end
|
7
|
+
|
8
|
+
describe ".configuration" do
|
9
|
+
it "is empty by default" do
|
10
|
+
Diametric::Config.configuration.should have(0).options
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe ".configured?" do
|
15
|
+
it "is true if configuration is present" do
|
16
|
+
Diametric::Config.configuration[:uri] = 'datomic:free://sample'
|
17
|
+
Diametric::Config.should be_configured
|
18
|
+
end
|
19
|
+
|
20
|
+
it "is false if no configuration has been added" do
|
21
|
+
Diametric::Config.should_not be_configured
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe ".load_and_connect!" do
|
26
|
+
let(:path) { "/path/to/diametric.yml" }
|
27
|
+
let(:env) { :test }
|
28
|
+
let(:settings) { {'uri' => 'diametric:free://test'} }
|
29
|
+
|
30
|
+
it "loads settings from the environment" do
|
31
|
+
Diametric::Config::Environment.should_receive(:load_yaml).with(path, env).and_return(settings)
|
32
|
+
Diametric::Config.stub(:connect!)
|
33
|
+
|
34
|
+
Diametric::Config.load_and_connect!(path, env)
|
35
|
+
end
|
36
|
+
|
37
|
+
it "sets the configuration" do
|
38
|
+
Diametric::Config::Environment.stub(:load_yaml => settings)
|
39
|
+
Diametric::Config.stub(:connect!)
|
40
|
+
Diametric::Config.load_and_connect!(path, env)
|
41
|
+
|
42
|
+
Diametric::Config.configuration.should == settings
|
43
|
+
end
|
44
|
+
|
45
|
+
it "connects" do
|
46
|
+
Diametric::Config::Environment.stub(:load_yaml => settings)
|
47
|
+
Diametric::Config.should_receive(:connect!).with(settings)
|
48
|
+
|
49
|
+
Diametric::Config.load_and_connect!(path, env)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe ".connect!" do
|
54
|
+
it "establishes a base connection" do
|
55
|
+
settings = double
|
56
|
+
Diametric::Persistence.should_receive(:establish_base_connection).with(settings)
|
57
|
+
Diametric::Config.connect!(settings)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,476 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'diametric/entity'
|
3
|
+
|
4
|
+
require 'rspec/expectations'
|
5
|
+
|
6
|
+
RSpec::Matchers.define :be_an_equivalent_hash do |expected|
|
7
|
+
match do |actual|
|
8
|
+
status = true
|
9
|
+
expected.each do |k, v|
|
10
|
+
next if k == ":db/id"
|
11
|
+
status = false if actual[k].nil?
|
12
|
+
status = false unless actual[k] == v
|
13
|
+
end
|
14
|
+
status
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
RSpec::Matchers.define :be_an_equivalent_array do |expected|
|
19
|
+
match do |actual|
|
20
|
+
status = true
|
21
|
+
expected.each_with_index do |e, index|
|
22
|
+
next if e == "#db/id[:db.part/user]"
|
23
|
+
status = false unless actual[index] == e
|
24
|
+
end
|
25
|
+
status
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe Diametric::Entity do
|
30
|
+
describe "in a class" do
|
31
|
+
subject { Person }
|
32
|
+
|
33
|
+
it { should respond_to(:attribute) }
|
34
|
+
it { should respond_to(:schema) }
|
35
|
+
it { should respond_to(:from_query) }
|
36
|
+
|
37
|
+
it "should generate a schema" do
|
38
|
+
expected = [
|
39
|
+
{ :"db/id" => Person.send(:tempid, :"db.part/db"),
|
40
|
+
:"db/ident" => :"person/name",
|
41
|
+
:"db/valueType" => :"db.type/string",
|
42
|
+
:"db/cardinality" => :"db.cardinality/one",
|
43
|
+
:"db/index" => true,
|
44
|
+
:"db.install/_attribute" => :"db.part/db" },
|
45
|
+
{ :"db/id" => Person.send(:tempid, :"db.part/db"),
|
46
|
+
:"db/ident" => :"person/email",
|
47
|
+
:"db/valueType" => :"db.type/string",
|
48
|
+
:"db/cardinality" => :"db.cardinality/many",
|
49
|
+
:"db.install/_attribute" => :"db.part/db" },
|
50
|
+
{ :"db/id" => Person.send(:tempid, :"db.part/db"),
|
51
|
+
:"db/ident" => :"person/birthday",
|
52
|
+
:"db/valueType" => :"db.type/instant",
|
53
|
+
:"db/cardinality" => :"db.cardinality/one",
|
54
|
+
:"db.install/_attribute" => :"db.part/db" },
|
55
|
+
{ :"db/id" => Person.send(:tempid, :"db.part/db"),
|
56
|
+
:"db/ident" => :"person/awesome",
|
57
|
+
:"db/valueType" => :"db.type/boolean",
|
58
|
+
:"db/cardinality" => :"db.cardinality/one",
|
59
|
+
:"db/doc" => "Is this person awesome?",
|
60
|
+
:"db.install/_attribute" => :"db.part/db" },
|
61
|
+
{ :"db/id" => Person.send(:tempid, :"db.part/db"),
|
62
|
+
:"db/ident" => :"person/ssn",
|
63
|
+
:"db/valueType" => :"db.type/string",
|
64
|
+
:"db/cardinality" => :"db.cardinality/one",
|
65
|
+
:"db/unique" => :"db.unique/value",
|
66
|
+
:"db.install/_attribute" => :"db.part/db" },
|
67
|
+
{ :"db/id" => Person.send(:tempid, :"db.part/db"),
|
68
|
+
:"db/ident" => :"person/secret_name",
|
69
|
+
:"db/valueType" => :"db.type/string",
|
70
|
+
:"db/cardinality" => :"db.cardinality/one",
|
71
|
+
:"db/unique" => :"db.unique/identity",
|
72
|
+
:"db.install/_attribute" => :"db.part/db" },
|
73
|
+
{ :"db/id" => Person.send(:tempid, :"db.part/db"),
|
74
|
+
:"db/ident" => :"person/bio",
|
75
|
+
:"db/valueType" => :"db.type/string",
|
76
|
+
:"db/cardinality" => :"db.cardinality/one",
|
77
|
+
:"db/fulltext" => true,
|
78
|
+
:"db.install/_attribute" => :"db.part/db" },
|
79
|
+
{ :"db/id" => Person.send(:tempid, :"db.part/db"),
|
80
|
+
:"db/ident" => :"person/middle_name",
|
81
|
+
:"db/valueType" => :"db.type/string",
|
82
|
+
:"db/cardinality" => :"db.cardinality/one",
|
83
|
+
:"db.install/_attribute" => :"db.part/db" },
|
84
|
+
{ :"db/id" => Person.send(:tempid, :"db.part/db"),
|
85
|
+
:"db/ident" => :"person/nicknames",
|
86
|
+
:"db/valueType" => :"db.type/string",
|
87
|
+
:"db/cardinality" => :"db.cardinality/many",
|
88
|
+
:"db.install/_attribute" => :"db.part/db" },
|
89
|
+
{ :"db/id" => Person.send(:tempid, :"db.part/db"),
|
90
|
+
:"db/ident" => :"person/parent",
|
91
|
+
:"db/valueType" => :"db.type/ref",
|
92
|
+
:"db/cardinality" => :"db.cardinality/many",
|
93
|
+
:"db/doc" => "A person's parent",
|
94
|
+
:"db.install/_attribute" => :"db.part/db" }
|
95
|
+
]
|
96
|
+
Person.schema.each do |s|
|
97
|
+
s.should == expected.shift
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
describe "in an instance" do
|
103
|
+
subject { Person.new }
|
104
|
+
let(:model) { Person.new }
|
105
|
+
|
106
|
+
it_should_behave_like "ActiveModel"
|
107
|
+
|
108
|
+
it { should respond_to(:tx_data) }
|
109
|
+
|
110
|
+
it "should handle attributes correctly" do
|
111
|
+
subject.name.should be_nil
|
112
|
+
subject.name = "Clinton"
|
113
|
+
subject.name.should == "Clinton"
|
114
|
+
end
|
115
|
+
|
116
|
+
it "should return attribute names" do
|
117
|
+
subject.attribute_names.should eql(Person.attribute_names)
|
118
|
+
end
|
119
|
+
|
120
|
+
it "should return a hash of attributes" do
|
121
|
+
attributes = subject.attributes
|
122
|
+
|
123
|
+
attributes.should be_a Hash
|
124
|
+
attributes.keys.should eql(subject.attribute_names)
|
125
|
+
attributes[:middle_name].should eql("Danger")
|
126
|
+
end
|
127
|
+
|
128
|
+
it "should raise a validation error" do
|
129
|
+
expect { Robin.new.save! }.to raise_error(Diametric::Errors::ValidationError)
|
130
|
+
end
|
131
|
+
|
132
|
+
end
|
133
|
+
|
134
|
+
describe ".new" do
|
135
|
+
it "should work without arguments" do
|
136
|
+
Person.new.should be_a(Person)
|
137
|
+
end
|
138
|
+
|
139
|
+
it "should assign attributes based off argument keys" do
|
140
|
+
person = Person.new(:name => "Dashiell D", :secret_name => "Monito")
|
141
|
+
person.name.should == "Dashiell D"
|
142
|
+
person.secret_name.should == "Monito"
|
143
|
+
end
|
144
|
+
|
145
|
+
it "should defaults attributes" do
|
146
|
+
Person.new.middle_name.should == "Danger"
|
147
|
+
end
|
148
|
+
|
149
|
+
it "should transform default arrays into sets" do
|
150
|
+
Person.new.nicknames.should == Set.new(["Buddy", "Pal"])
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
describe ".from_query" do
|
155
|
+
it "should assign dbid and attributes" do
|
156
|
+
goat = Goat.from_query([1, "Beans", DateTime.parse("1976/9/4")])
|
157
|
+
goat.dbid.should == 1
|
158
|
+
goat.name.should == "Beans"
|
159
|
+
goat.birthday.should == DateTime.parse("1976/9/4")
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
describe "#tx_data" do
|
164
|
+
context "for an entity with cardinality/many attributes" do
|
165
|
+
|
166
|
+
let(:entity_class) do
|
167
|
+
gen_entity_class(named = "test") do
|
168
|
+
attribute :many, String, :cardinality => :many
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
describe "with a dbid" do
|
173
|
+
it "should generate a protraction tx for added entries" do
|
174
|
+
entity = entity_class.new(:many => %w|foo bar|)
|
175
|
+
entity.many.should == Set["foo", "bar"]
|
176
|
+
entity.dbid = 1
|
177
|
+
entity.tx_data.should == [[:"db/add", 1, :"test/many", ["foo", "bar"]]]
|
178
|
+
end
|
179
|
+
|
180
|
+
it "should generate a retraction tx for removed entries" do
|
181
|
+
entity = entity_class.new
|
182
|
+
entity.dbid = 1
|
183
|
+
entity.instance_variable_set(:"@changed_attributes", { 'many' => Set["original", "unchanged"]})
|
184
|
+
entity.many = Set["unchanged", "new"]
|
185
|
+
entity.tx_data.should == [
|
186
|
+
[:"db/retract", 1, :"test/many", ["original"]],
|
187
|
+
[:"db/add", 1, :"test/many", ["new"]]
|
188
|
+
]
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
describe "without a db/id" do
|
193
|
+
it "should generate a protraction tx" do
|
194
|
+
entity = entity_class.new(:many => %w|foo bar|)
|
195
|
+
tx = entity.tx_data.first
|
196
|
+
tx.should =~ [:"db/add", entity.send(:tempid), :"test/many", ['foo', 'bar']]
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
context "for an entity with only cardinality/one attributes" do
|
202
|
+
let(:goat) { Goat.new(:name => "Beans", :birthday => Date.parse("2002-04-15"))}
|
203
|
+
|
204
|
+
describe "without a dbid" do
|
205
|
+
it "should generate a transaction with a new tempid" do
|
206
|
+
# Equivalence is currently wrong on EDN tagged values.
|
207
|
+
tx = goat.tx_data.first
|
208
|
+
tx.keys.should =~ [:"db/id", :"goat/name", :"goat/birthday"]
|
209
|
+
tx[:"db/id"].to_edn.should match(%r"#db/id \[:db.part/user \-\d+\]")
|
210
|
+
tx[:"goat/name"].should == "Beans"
|
211
|
+
tx[:"goat/birthday"].should == goat.birthday
|
212
|
+
end
|
213
|
+
end
|
214
|
+
|
215
|
+
describe "with a dbid" do
|
216
|
+
it "should generate a transaction with the dbid" do
|
217
|
+
goat.dbid = 1
|
218
|
+
goat.tx_data.should == [
|
219
|
+
{ :"db/id" => 1,
|
220
|
+
:"goat/name" => "Beans",
|
221
|
+
:"goat/birthday" => goat.birthday
|
222
|
+
}
|
223
|
+
]
|
224
|
+
end
|
225
|
+
|
226
|
+
it "should generate a transaction with only specified attributes" do
|
227
|
+
goat.dbid = 1
|
228
|
+
goat.tx_data(:name).should == [
|
229
|
+
{ :"db/id" => 1,
|
230
|
+
:"goat/name" => "Beans"
|
231
|
+
}
|
232
|
+
]
|
233
|
+
end
|
234
|
+
end
|
235
|
+
|
236
|
+
end
|
237
|
+
|
238
|
+
end
|
239
|
+
|
240
|
+
context "boolean type" do
|
241
|
+
subject { Choice }
|
242
|
+
|
243
|
+
it "should generate a schema" do
|
244
|
+
expected = []
|
245
|
+
if is_jruby?
|
246
|
+
expected = [
|
247
|
+
{ ":db/id" => subject.send(:tempid, ":db.part/db"),
|
248
|
+
":db/ident" => ":choice/item",
|
249
|
+
":db/valueType" => ":db.type/string",
|
250
|
+
":db/cardinality" => ":db.cardinality/one",
|
251
|
+
":db.install/_attribute" => ":db.part/db" },
|
252
|
+
{ ":db/id" => subject.send(:tempid, ":db.part/db"),
|
253
|
+
":db/ident" => ":choice/checked",
|
254
|
+
":db/valueType" => ":db.type/boolean",
|
255
|
+
":db/cardinality" => ":db.cardinality/one",
|
256
|
+
":db.install/_attribute" => ":db.part/db" }
|
257
|
+
]
|
258
|
+
else
|
259
|
+
expected = [
|
260
|
+
{ :"db/id" => subject.send(:tempid, :"db.part/db"),
|
261
|
+
:"db/ident" => :"choice/item",
|
262
|
+
:"db/valueType" => :"db.type/string",
|
263
|
+
:"db/cardinality" => :"db.cardinality/one",
|
264
|
+
:"db.install/_attribute" => :"db.part/db" },
|
265
|
+
{ :"db/id" => subject.send(:tempid, :"db.part/db"),
|
266
|
+
:"db/ident" => :"choice/checked",
|
267
|
+
:"db/valueType" => :"db.type/boolean",
|
268
|
+
:"db/cardinality" => :"db.cardinality/one",
|
269
|
+
:"db.install/_attribute" => :"db.part/db" }
|
270
|
+
]
|
271
|
+
end
|
272
|
+
@created_schema = subject.schema
|
273
|
+
expected.each do |e|
|
274
|
+
@created_schema.shift.should be_an_equivalent_hash(e)
|
275
|
+
end
|
276
|
+
end
|
277
|
+
end
|
278
|
+
|
279
|
+
context "uuid type" do
|
280
|
+
subject { Customer }
|
281
|
+
|
282
|
+
it "should generate a schema" do
|
283
|
+
expected = []
|
284
|
+
if is_jruby?
|
285
|
+
expected = [
|
286
|
+
{ ":db/id" => subject.send(:tempid, ":db.part/db"),
|
287
|
+
":db/ident" => ":customer/name",
|
288
|
+
":db/valueType" => ":db.type/string",
|
289
|
+
":db/cardinality" => ":db.cardinality/one",
|
290
|
+
":db.install/_attribute" => ":db.part/db" },
|
291
|
+
{ ":db/id" => subject.send(:tempid, ":db.part/db"),
|
292
|
+
":db/ident" => ":customer/id",
|
293
|
+
":db/valueType" => ":db.type/uuid",
|
294
|
+
":db/cardinality" => ":db.cardinality/one",
|
295
|
+
":db.install/_attribute" => ":db.part/db" }
|
296
|
+
]
|
297
|
+
else
|
298
|
+
expected = [
|
299
|
+
{ :"db/id" => subject.send(:tempid, :"db.part/db"),
|
300
|
+
:"db/ident" => :"customer/name",
|
301
|
+
:"db/valueType" => :"db.type/string",
|
302
|
+
:"db/cardinality" => :"db.cardinality/one",
|
303
|
+
:"db.install/_attribute" => :"db.part/db" },
|
304
|
+
{ :"db/id" => subject.send(:tempid, :"db.part/db"),
|
305
|
+
:"db/ident" => :"customer/id",
|
306
|
+
:"db/valueType" => :"db.type/uuid",
|
307
|
+
:"db/cardinality" => :"db.cardinality/one",
|
308
|
+
:"db.install/_attribute" => :"db.part/db" }
|
309
|
+
]
|
310
|
+
end
|
311
|
+
@created_schema = subject.schema
|
312
|
+
expected.each do |e|
|
313
|
+
@created_schema.shift.should be_an_equivalent_hash(e)
|
314
|
+
end
|
315
|
+
end
|
316
|
+
end
|
317
|
+
|
318
|
+
context "Float, Double type" do
|
319
|
+
subject { Account }
|
320
|
+
|
321
|
+
it "should generate a schema" do
|
322
|
+
expected = []
|
323
|
+
if is_jruby?
|
324
|
+
expected = [
|
325
|
+
{ ":db/id" => subject.send(:tempid, ":db.part/db"),
|
326
|
+
":db/ident" => ":account/name",
|
327
|
+
":db/valueType" => ":db.type/string",
|
328
|
+
":db/cardinality" => ":db.cardinality/one",
|
329
|
+
":db.install/_attribute" => ":db.part/db" },
|
330
|
+
{ ":db/id" => subject.send(:tempid, ":db.part/db"),
|
331
|
+
":db/ident" => ":account/deposit",
|
332
|
+
":db/valueType" => ":db.type/double",
|
333
|
+
":db/cardinality" => ":db.cardinality/many",
|
334
|
+
":db.install/_attribute" => ":db.part/db" },
|
335
|
+
{ ":db/id" => subject.send(:tempid, ":db.part/db"),
|
336
|
+
":db/ident" => ":account/amount",
|
337
|
+
":db/valueType" => ":db.type/double",
|
338
|
+
":db/cardinality" => ":db.cardinality/one",
|
339
|
+
":db.install/_attribute" => ":db.part/db" }
|
340
|
+
]
|
341
|
+
else
|
342
|
+
expected = [
|
343
|
+
{ :"db/id" => subject.send(:tempid, :"db.part/db"),
|
344
|
+
:"db/ident" => :"account/name",
|
345
|
+
:"db/valueType" => :"db.type/string",
|
346
|
+
:"db/cardinality" => :"db.cardinality/one",
|
347
|
+
:"db.install/_attribute" => :"db.part/db" },
|
348
|
+
{ :"db/id" => subject.send(:tempid, :"db.part/db"),
|
349
|
+
:"db/ident" => :"account/deposit",
|
350
|
+
:"db/valueType" => :"db.type/double",
|
351
|
+
:"db/cardinality" => :"db.cardinality/many",
|
352
|
+
:"db.install/_attribute" => :"db.part/db" },
|
353
|
+
{ :"db/id" => subject.send(:tempid, :"db.part/db"),
|
354
|
+
:"db/ident" => :"account/amount",
|
355
|
+
:"db/valueType" => :"db.type/double",
|
356
|
+
:"db/cardinality" => :"db.cardinality/one",
|
357
|
+
:"db.install/_attribute" => :"db.part/db" }
|
358
|
+
]
|
359
|
+
end
|
360
|
+
@created_schema = subject.schema
|
361
|
+
expected.each do |e|
|
362
|
+
@created_schema.shift.should be_an_equivalent_hash(e)
|
363
|
+
end
|
364
|
+
end
|
365
|
+
end
|
366
|
+
|
367
|
+
context "community sample" do
|
368
|
+
subject { Organization }
|
369
|
+
|
370
|
+
it { should respond_to(:attribute) }
|
371
|
+
it { should respond_to(:enum) }
|
372
|
+
it { should respond_to(:schema) }
|
373
|
+
|
374
|
+
it "should generate a schema" do
|
375
|
+
expected = [
|
376
|
+
{ :"db/id" => subject.send(:tempid, :"db.part/db"),
|
377
|
+
:"db/ident" => :"organization/name",
|
378
|
+
:"db/valueType" => :"db.type/string",
|
379
|
+
:"db/cardinality" => :"db.cardinality/one",
|
380
|
+
:"db/fulltext" => true,
|
381
|
+
:"db/doc" => "A organization's name",
|
382
|
+
:"db.install/_attribute" => :"db.part/db" },
|
383
|
+
{ :"db/id" => subject.send(:tempid, :"db.part/db"),
|
384
|
+
:"db/ident" => :"organization/url",
|
385
|
+
:"db/valueType" => :"db.type/string",
|
386
|
+
:"db/cardinality" => :"db.cardinality/one",
|
387
|
+
:"db/doc" => "A organization's url",
|
388
|
+
:"db.install/_attribute" => :"db.part/db" },
|
389
|
+
{ :"db/id" => subject.send(:tempid, :"db.part/db"),
|
390
|
+
:"db/ident" => :"organization/neighborhood",
|
391
|
+
:"db/valueType" => :"db.type/ref",
|
392
|
+
:"db/cardinality" => :"db.cardinality/one",
|
393
|
+
:"db/doc" => "A organization's neighborhood",
|
394
|
+
:"db.install/_attribute" => :"db.part/db" },
|
395
|
+
{ :"db/id" => subject.send(:tempid, :"db.part/db"),
|
396
|
+
:"db/ident" => :"organization/category",
|
397
|
+
:"db/valueType" => :"db.type/string",
|
398
|
+
:"db/cardinality" => :"db.cardinality/many",
|
399
|
+
:"db/fulltext" => true,
|
400
|
+
:"db/doc" => "All organization categories",
|
401
|
+
:"db.install/_attribute" => :"db.part/db" },
|
402
|
+
{ :"db/id" => subject.send(:tempid, :"db.part/db"),
|
403
|
+
:"db/ident" => :"organization/orgtype",
|
404
|
+
:"db/valueType" => :"db.type/ref",
|
405
|
+
:"db/cardinality" => :"db.cardinality/one",
|
406
|
+
:"db/doc" => "A organization orgtype enum value",
|
407
|
+
:"db.install/_attribute" => :"db.part/db" },
|
408
|
+
{ :"db/id" => subject.send(:tempid, :"db.part/db"),
|
409
|
+
:"db/ident" => :"organization/type",
|
410
|
+
:"db/valueType" => :"db.type/ref",
|
411
|
+
:"db/cardinality" => :"db.cardinality/one",
|
412
|
+
:"db/doc" => "A organization type enum value",
|
413
|
+
:"db.install/_attribute" => :"db.part/db" },
|
414
|
+
[ :"db/add", subject.send(:tempid, :"db.part/user"), :"db/ident", :"organization.orgtype/community" ],
|
415
|
+
[ :"db/add", subject.send(:tempid, :"db.part/user"), :"db/ident", :"organization.orgtype/commercial" ],
|
416
|
+
[ :"db/add", subject.send(:tempid, :"db.part/user"), :"db/ident", :"organization.orgtype/nonprofit"],
|
417
|
+
[ :"db/add", subject.send(:tempid, :"db.part/user"), :"db/ident", :"organization.orgtype/personal"],
|
418
|
+
[ :"db/add", subject.send(:tempid, :"db.part/user"), :"db/ident", :"organization.type/email-list"],
|
419
|
+
[ :"db/add", subject.send(:tempid, :"db.part/user"), :"db/ident", :"organization.type/twitter"],
|
420
|
+
[ :"db/add", subject.send(:tempid, :"db.part/user"), :"db/ident", :"organization.type/facebook-page" ],
|
421
|
+
[ :"db/add", subject.send(:tempid, :"db.part/user"), :"db/ident", :"organization.type/blog" ],
|
422
|
+
[ :"db/add", subject.send(:tempid, :"db.part/user"), :"db/ident", :"organization.type/website" ],
|
423
|
+
[ :"db/add", subject.send(:tempid, :"db.part/user"), :"db/ident", :"organization.type/wiki" ],
|
424
|
+
[ :"db/add", subject.send(:tempid, :"db.part/user"), :"db/ident", :"organization.type/myspace" ],
|
425
|
+
[ :"db/add", subject.send(:tempid, :"db.part/user"), :"db/ident", :"organization.type/ning"]
|
426
|
+
]
|
427
|
+
|
428
|
+
@created_schema = Organization.schema
|
429
|
+
expected.each do |e|
|
430
|
+
@created_schema.shift.should == e
|
431
|
+
end
|
432
|
+
end
|
433
|
+
end
|
434
|
+
|
435
|
+
|
436
|
+
context "seattle sample", :jruby do
|
437
|
+
describe Diametric::Entity do
|
438
|
+
subject { District }
|
439
|
+
|
440
|
+
it "should create peer schema" do
|
441
|
+
expected = [
|
442
|
+
{ ":db/id" => subject.send(:tempid, ":db.part/db"),
|
443
|
+
":db/ident" => ":district/name",
|
444
|
+
":db/valueType" => ":db.type/string",
|
445
|
+
":db/cardinality" => ":db.cardinality/one",
|
446
|
+
":db/unique" => ":db.unique/identity",
|
447
|
+
":db/doc" => "A unique district name (upsertable)",
|
448
|
+
":db.install/_attribute" => ":db.part/db" },
|
449
|
+
{ ":db/id" => subject.send(:tempid, ":db.part/db"),
|
450
|
+
":db/ident" => ":district/region",
|
451
|
+
":db/valueType" => ":db.type/ref",
|
452
|
+
":db/cardinality" => ":db.cardinality/one",
|
453
|
+
":db/doc" => "A district region enum value",
|
454
|
+
":db.install/_attribute" => ":db.part/db" },
|
455
|
+
[ ":db/add", "#db/id[:db.part/user]", ":db/ident", ":district.region/n"],
|
456
|
+
[ ":db/add", "#db/id[:db.part/user]", ":db/ident", ":district.region/ne"],
|
457
|
+
[ ":db/add", "#db/id[:db.part/user]", ":db/ident", ":district.region/e"],
|
458
|
+
[ ":db/add", "#db/id[:db.part/user]", ":db/ident", ":district.region/se"],
|
459
|
+
[ ":db/add", "#db/id[:db.part/user]", ":db/ident", ":district.region/s"],
|
460
|
+
[ ":db/add", "#db/id[:db.part/user]", ":db/ident", ":district.region/sw"],
|
461
|
+
[ ":db/add", "#db/id[:db.part/user]", ":db/ident", ":district.region/w"],
|
462
|
+
[ ":db/add", "#db/id[:db.part/user]", ":db/ident", ":district.region/nw"]
|
463
|
+
]
|
464
|
+
@created_schema = District.schema
|
465
|
+
expected.each do |e|
|
466
|
+
if e.is_a? Hash
|
467
|
+
@created_schema.shift.should be_an_equivalent_hash(e)
|
468
|
+
else
|
469
|
+
@created_schema.shift.should be_an_equivalent_array(e)
|
470
|
+
end
|
471
|
+
end
|
472
|
+
end
|
473
|
+
end
|
474
|
+
end
|
475
|
+
|
476
|
+
end
|