activefacts 0.7.2 → 0.7.3
Sign up to get free protection for your applications and to get access to all the features.
- data/Manifest.txt +1 -0
- data/Rakefile +3 -0
- data/bin/afgen +9 -3
- data/bin/cql +0 -0
- data/examples/CQL/Address.cql +7 -7
- data/examples/CQL/Blog.cql +8 -8
- data/examples/CQL/CompanyDirectorEmployee.cql +3 -3
- data/examples/CQL/Death.cql +2 -2
- data/examples/CQL/Genealogy.cql +21 -21
- data/examples/CQL/Marriage.cql +1 -1
- data/examples/CQL/Metamodel.cql +34 -29
- data/examples/CQL/MultiInheritance.cql +3 -3
- data/examples/CQL/OilSupply.cql +9 -9
- data/examples/CQL/Orienteering.cql +27 -27
- data/examples/CQL/PersonPlaysGame.cql +2 -2
- data/examples/CQL/SchoolActivities.cql +3 -3
- data/examples/CQL/SimplestUnary.cql +1 -1
- data/examples/CQL/SubtypePI.cql +4 -4
- data/examples/CQL/Warehousing.cql +12 -12
- data/examples/CQL/WindowInRoomInBldg.cql +4 -4
- data/lib/activefacts/api/concept.rb +3 -2
- data/lib/activefacts/api/constellation.rb +1 -1
- data/lib/activefacts/api/entity.rb +12 -1
- data/lib/activefacts/api/instance.rb +1 -1
- data/lib/activefacts/api/role.rb +1 -1
- data/lib/activefacts/api/standard_types.rb +9 -1
- data/lib/activefacts/api/support.rb +4 -0
- data/lib/activefacts/api/value.rb +1 -0
- data/lib/activefacts/api/vocabulary.rb +2 -59
- data/lib/activefacts/cql/DataTypes.treetop +10 -1
- data/lib/activefacts/cql/Expressions.treetop +1 -1
- data/lib/activefacts/cql/FactTypes.treetop +1 -1
- data/lib/activefacts/cql/Language/English.treetop +2 -2
- data/lib/activefacts/generate/absorption.rb +0 -2
- data/lib/activefacts/generate/cql.rb +6 -8
- data/lib/activefacts/generate/cql/html.rb +1 -1
- data/lib/activefacts/generate/oo.rb +60 -40
- data/lib/activefacts/generate/ordered.rb +30 -21
- data/lib/activefacts/generate/ruby.rb +38 -15
- data/lib/activefacts/generate/sql/mysql.rb +257 -0
- data/lib/activefacts/generate/sql/server.rb +0 -1
- data/lib/activefacts/input/cql.rb +0 -2
- data/lib/activefacts/persistence/columns.rb +51 -24
- data/lib/activefacts/persistence/concept.rb +158 -36
- data/lib/activefacts/persistence/reference.rb +13 -8
- data/lib/activefacts/support.rb +40 -2
- data/lib/activefacts/version.rb +1 -1
- data/lib/activefacts/vocabulary/extensions.rb +5 -6
- data/spec/absorption_spec.rb +8 -11
- data/spec/api/autocounter.rb +1 -1
- data/spec/api/constellation.rb +1 -1
- data/spec/api/entity_type.rb +1 -1
- data/spec/api/instance.rb +1 -1
- data/spec/api/roles.rb +1 -1
- data/spec/api/value_type.rb +1 -1
- data/spec/cql_cql_spec.rb +2 -4
- data/spec/cql_parse_spec.rb +2 -4
- data/spec/cql_ruby_spec.rb +2 -4
- data/spec/cql_sql_spec.rb +4 -4
- data/spec/cql_symbol_tables_spec.rb +1 -1
- data/spec/cql_unit_spec.rb +6 -6
- data/spec/cqldump_spec.rb +6 -6
- data/spec/norma_cql_spec.rb +2 -4
- data/spec/norma_ruby_spec.rb +2 -4
- data/spec/norma_sql_spec.rb +2 -4
- data/spec/norma_tables_spec.rb +4 -7
- metadata +29 -6
data/lib/activefacts/version.rb
CHANGED
@@ -88,7 +88,7 @@ module ActiveFacts
|
|
88
88
|
|
89
89
|
# Two RoleRefs are equal if they have the same role and Joins with matching roles
|
90
90
|
def ==(role_ref)
|
91
|
-
RoleRef
|
91
|
+
role_ref.is_a?(ActiveFacts::Metamodel::RoleRef) &&
|
92
92
|
role_ref.role == role &&
|
93
93
|
all_join.size == role_ref.all_join.size &&
|
94
94
|
!all_join.sort_by{|j|j.join_step}.
|
@@ -119,7 +119,6 @@ module ActiveFacts
|
|
119
119
|
end
|
120
120
|
|
121
121
|
class EntityType
|
122
|
-
include ActiveFacts
|
123
122
|
def preferred_identifier
|
124
123
|
if fact_type
|
125
124
|
|
@@ -161,7 +160,7 @@ module ActiveFacts
|
|
161
160
|
end
|
162
161
|
debug :pi, "Got PI #{pi.name||pi.object_id} for nested #{name}" if pi
|
163
162
|
debug :pi, "Looking for PI on entity that nests this fact" unless pi
|
164
|
-
raise "Oops, pi for nested fact is #{pi.class}" unless !pi || PresenceConstraint
|
163
|
+
raise "Oops, pi for nested fact is #{pi.class}" unless !pi || pi.is_a?(ActiveFacts::Metamodel::PresenceConstraint)
|
165
164
|
return pi if pi
|
166
165
|
end
|
167
166
|
end
|
@@ -228,7 +227,7 @@ module ActiveFacts
|
|
228
227
|
}
|
229
228
|
throw :pi, nil
|
230
229
|
end
|
231
|
-
raise "Oops, pi for entity is #{pi.class}" if pi && !(PresenceConstraint
|
230
|
+
raise "Oops, pi for entity is #{pi.class}" if pi && !pi.is_a?(ActiveFacts::Metamodel::PresenceConstraint)
|
232
231
|
debug :pi, "Got PI #{pi.name||pi.object_id} for #{name}" if pi
|
233
232
|
|
234
233
|
if !pi
|
@@ -332,8 +331,8 @@ module ActiveFacts
|
|
332
331
|
la = ta = nil # When using role names, don't add adjectives
|
333
332
|
end
|
334
333
|
fc = frequency_constraints[i]
|
335
|
-
fc = fc.frequency if fc && PresenceConstraint
|
336
|
-
if Array
|
334
|
+
fc = fc.frequency if fc && fc.is_a?(ActiveFacts::Metamodel::PresenceConstraint)
|
335
|
+
if fc.is_a?(Array)
|
337
336
|
fc, player_name = *fc
|
338
337
|
else
|
339
338
|
player_name = player.name
|
data/spec/absorption_spec.rb
CHANGED
@@ -12,11 +12,11 @@ require 'activefacts/persistence'
|
|
12
12
|
describe "Absorption" do
|
13
13
|
Prologue = %Q{
|
14
14
|
vocabulary Test;
|
15
|
-
DateTime is
|
16
|
-
Month is
|
17
|
-
Season is
|
18
|
-
PartyID is
|
19
|
-
ClaimID is
|
15
|
+
DateTime is written as DateAndTime();
|
16
|
+
Month is written as VariableLengthText(3);
|
17
|
+
Season is written as VariableLengthText(6);
|
18
|
+
PartyID is written as AutoCounter();
|
19
|
+
ClaimID is written as AutoCounter();
|
20
20
|
}
|
21
21
|
Claim = %Q{
|
22
22
|
Claim is identified by ClaimID where
|
@@ -51,7 +51,7 @@ describe "Absorption" do
|
|
51
51
|
#{Prologue} #{Claim} #{Incident}
|
52
52
|
Incident relates to loss on exactly one DateTime;
|
53
53
|
},
|
54
|
-
:tables => { "Claim" => [
|
54
|
+
:tables => { "Claim" => [%w{Claim ID}, %w{Incident Date Time}]}
|
55
55
|
},
|
56
56
|
|
57
57
|
{ :should => "absorb an objectified binary with single-role UC",
|
@@ -63,16 +63,13 @@ describe "Absorption" do
|
|
63
63
|
Person has exactly one birth-Date;
|
64
64
|
},
|
65
65
|
:tables => {
|
66
|
-
"Claim" => [
|
67
|
-
"Party" => [
|
66
|
+
"Claim" => [%w{Claim ID}, %w{Lodgement Date Time}, %w{Lodgement Person ID}],
|
67
|
+
"Party" => [%w{Party ID}, %w{Person Birth Date}]
|
68
68
|
}
|
69
69
|
},
|
70
70
|
|
71
71
|
]
|
72
72
|
|
73
|
-
setup do
|
74
|
-
end
|
75
|
-
|
76
73
|
Tests.each do |test|
|
77
74
|
should = test[:should]
|
78
75
|
cql = test[:cql]
|
data/spec/api/autocounter.rb
CHANGED
data/spec/api/constellation.rb
CHANGED
data/spec/api/entity_type.rb
CHANGED
data/spec/api/instance.rb
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
# Copyright (c) 2008 Clifford Heath. Read the LICENSE file.
|
4
4
|
#
|
5
5
|
describe "An instance of every type of Concept" do
|
6
|
-
|
6
|
+
before :each do
|
7
7
|
Object.send :remove_const, :Mod if Object.const_defined?("Mod")
|
8
8
|
module Mod
|
9
9
|
# These are the base value types we're going to test:
|
data/spec/api/roles.rb
CHANGED
data/spec/api/value_type.rb
CHANGED
data/spec/cql_cql_spec.rb
CHANGED
@@ -37,10 +37,8 @@ describe "CQL Loader" do
|
|
37
37
|
output.read
|
38
38
|
end
|
39
39
|
|
40
|
-
|
41
|
-
|
42
|
-
#Dir["examples/CQL/[ACG]*.cql"].each do |cql_file|
|
43
|
-
Dir["examples/CQL/*.cql"].each do |cql_file|
|
40
|
+
pattern = ENV["AFTESTS"] || "*"
|
41
|
+
Dir["examples/CQL/#{pattern}.cql"].each do |cql_file|
|
44
42
|
actual_file = cql_file.sub(%r{examples/CQL/}, 'spec/actual/')
|
45
43
|
|
46
44
|
it "should load CQL and dump valid CQL for #{cql_file}" do
|
data/spec/cql_parse_spec.rb
CHANGED
@@ -20,10 +20,8 @@ describe "CQL Parser" do
|
|
20
20
|
ServiceDirector
|
21
21
|
}
|
22
22
|
|
23
|
-
|
24
|
-
|
25
|
-
#Dir["examples/CQL/[ACG]*.cql"].each do |cql_file|
|
26
|
-
Dir["examples/CQL/*.cql"].each do |cql_file|
|
23
|
+
pattern = ENV["AFTESTS"] || "*"
|
24
|
+
Dir["examples/CQL/#{pattern}.cql"].each do |cql_file|
|
27
25
|
it "should load CQL #{cql_file} without parse errors" do
|
28
26
|
pending if CQLPARSE_FAILURES.include? File.basename(cql_file, ".cql")
|
29
27
|
lambda { vocabulary = ActiveFacts::Input::CQL.readfile(cql_file) }.should_not raise_error
|
data/spec/cql_ruby_spec.rb
CHANGED
@@ -37,10 +37,8 @@ describe "CQL Loader with Ruby output" do
|
|
37
37
|
output.read
|
38
38
|
end
|
39
39
|
|
40
|
-
|
41
|
-
|
42
|
-
#Dir["examples/CQL/[ACG]*.cql"].each do |cql_file|
|
43
|
-
Dir["examples/CQL/*.cql"].each do |cql_file|
|
40
|
+
pattern = ENV["AFTESTS"] || "*"
|
41
|
+
Dir["examples/CQL/#{pattern}.cql"].each do |cql_file|
|
44
42
|
expected_file = cql_file.sub(%r{/CQL/(.*).cql\Z}, '/ruby/\1.rb')
|
45
43
|
actual_file = cql_file.sub(%r{examples/CQL/(.*).cql\Z}, 'spec/actual/\1.rb')
|
46
44
|
|
data/spec/cql_sql_spec.rb
CHANGED
@@ -15,8 +15,10 @@ include ActiveFacts::Metamodel
|
|
15
15
|
describe "CQL Loader with SQL output" do
|
16
16
|
CQL_SQL_FAILURES = %w{
|
17
17
|
Airline
|
18
|
+
CompanyDirectorEmployee
|
18
19
|
CompanyQuery
|
19
20
|
Insurance
|
21
|
+
JoinEquality
|
20
22
|
Marriage
|
21
23
|
OrienteeringER
|
22
24
|
ServiceDirector
|
@@ -32,10 +34,8 @@ describe "CQL Loader with SQL output" do
|
|
32
34
|
output.read
|
33
35
|
end
|
34
36
|
|
35
|
-
|
36
|
-
|
37
|
-
#Dir["examples/CQL/[ACG]*.cql"].each do |cql_file|
|
38
|
-
Dir["examples/CQL/*.cql"].each do |cql_file|
|
37
|
+
pattern = ENV["AFTESTS"] || "*"
|
38
|
+
Dir["examples/CQL/#{pattern}.cql"].each do |cql_file|
|
39
39
|
actual_file = cql_file.sub(%r{examples/CQL/(.*).cql}, 'spec/actual/\1.sql')
|
40
40
|
expected_file = cql_file.sub(%r{examples/CQL/(.*).cql\Z}, 'examples/SQL/\1.sql')
|
41
41
|
|
@@ -15,7 +15,7 @@ describe "CQL Symbol table" do
|
|
15
15
|
# def initialize(constellation, vocabulary)
|
16
16
|
# def bind(words, leading_adjective = nil, trailing_adjective = nil, role_name = nil, allowed_forward = false, leading_speculative = false, trailing_speculative = false)
|
17
17
|
|
18
|
-
|
18
|
+
before :each do
|
19
19
|
include ActiveFacts::Input::CQL
|
20
20
|
@constellation = ActiveFacts::API::Constellation.new(ActiveFacts::Metamodel)
|
21
21
|
@vocabulary = @constellation.Vocabulary("Test")
|
data/spec/cql_unit_spec.rb
CHANGED
@@ -12,7 +12,7 @@ describe "Valid Numbers, Strings and Ranges" do
|
|
12
12
|
ValidNumbersEtc = [
|
13
13
|
"a=b();", # Basic data type declaration, minimal whitespace
|
14
14
|
"a = b ( ) ; ", # Basic data type declaration, maximal whitespace
|
15
|
-
"a is
|
15
|
+
"a is written as b();", # Verbally named data type declaration
|
16
16
|
"a=b() inch;", # Data type declaration with unit
|
17
17
|
"a=b() inch ; ", # Data type declaration with unit
|
18
18
|
"a=b() inch^2 ; ", # Data type declaration with unit and exponent
|
@@ -100,7 +100,7 @@ describe "Valid Numbers, Strings and Ranges" do
|
|
100
100
|
"a=b() restricted to { 'A'.. };", # String range, open end
|
101
101
|
]
|
102
102
|
|
103
|
-
|
103
|
+
before :each do
|
104
104
|
@parser = ActiveFacts::CQLParser.new
|
105
105
|
end
|
106
106
|
|
@@ -137,7 +137,7 @@ describe "Invalid Numbers and Strings" do
|
|
137
137
|
"b() restricted to { 'a'..27 };", # Cross-typed range
|
138
138
|
]
|
139
139
|
|
140
|
-
|
140
|
+
before :each do
|
141
141
|
@parser = ActiveFacts::CQLParser.new
|
142
142
|
end
|
143
143
|
|
@@ -162,7 +162,7 @@ describe "Data Types" do
|
|
162
162
|
# ],
|
163
163
|
]
|
164
164
|
|
165
|
-
|
165
|
+
before :each do
|
166
166
|
@parser = ActiveFacts::CQLParser.new
|
167
167
|
end
|
168
168
|
|
@@ -257,7 +257,7 @@ describe "Entity Types" do
|
|
257
257
|
EntityTypes_Objectified +
|
258
258
|
EntityTypes_Subtypes
|
259
259
|
|
260
|
-
|
260
|
+
before :each do
|
261
261
|
@parser = ActiveFacts::CQLParser.new
|
262
262
|
end
|
263
263
|
|
@@ -303,7 +303,7 @@ describe "Fact Types" do
|
|
303
303
|
]
|
304
304
|
]
|
305
305
|
|
306
|
-
|
306
|
+
before :each do
|
307
307
|
@parser = ActiveFacts::CQLParser.new
|
308
308
|
end
|
309
309
|
|
data/spec/cqldump_spec.rb
CHANGED
@@ -14,7 +14,7 @@ describe "CQL Dumper" do
|
|
14
14
|
def self.hide(*a,&b)
|
15
15
|
end
|
16
16
|
|
17
|
-
|
17
|
+
before :each do
|
18
18
|
@constellation = ActiveFacts::API::Constellation.new(ActiveFacts::Metamodel)
|
19
19
|
@vocabulary = @constellation.Vocabulary("TestVocab")
|
20
20
|
@string_type = @constellation.ValueType(@vocabulary, "String")
|
@@ -41,7 +41,7 @@ vocabulary TestVocab;
|
|
41
41
|
/*
|
42
42
|
* Value Types
|
43
43
|
*/
|
44
|
-
Name is
|
44
|
+
Name is written as String(20);
|
45
45
|
|
46
46
|
END
|
47
47
|
end
|
@@ -54,7 +54,7 @@ vocabulary TestVocab;
|
|
54
54
|
/*
|
55
55
|
* Value Types
|
56
56
|
*/
|
57
|
-
Count is
|
57
|
+
Count is written as Integer(32);
|
58
58
|
|
59
59
|
END
|
60
60
|
end
|
@@ -131,8 +131,8 @@ vocabulary TestVocab;
|
|
131
131
|
/*
|
132
132
|
* Value Types
|
133
133
|
*/
|
134
|
-
Count is
|
135
|
-
Name is
|
134
|
+
Count is written as Integer(32);
|
135
|
+
Name is written as String(20);
|
136
136
|
|
137
137
|
/*
|
138
138
|
* Fact Types
|
@@ -154,7 +154,7 @@ vocabulary TestVocab;
|
|
154
154
|
/*
|
155
155
|
* Value Types
|
156
156
|
*/
|
157
|
-
Name is
|
157
|
+
Name is written as String(20);
|
158
158
|
|
159
159
|
/*
|
160
160
|
* Entity Types
|
data/spec/norma_cql_spec.rb
CHANGED
@@ -25,10 +25,8 @@ describe "Norma Loader" do
|
|
25
25
|
output.readlines
|
26
26
|
end
|
27
27
|
|
28
|
-
|
29
|
-
|
30
|
-
#Dir["examples/norma/[AC]*.orm"].each do |orm_file|
|
31
|
-
Dir["examples/norma/*.orm"].each do |orm_file|
|
28
|
+
pattern = ENV["AFTESTS"] || "*"
|
29
|
+
Dir["examples/norma/#{pattern}.orm"].each do |orm_file|
|
32
30
|
expected_file = orm_file.sub(%r{/norma/(.*).orm\Z}, '/CQL/\1.cql')
|
33
31
|
|
34
32
|
actual_file = orm_file.sub(%r{examples/norma/(.*).orm\Z}, 'spec/actual/\1.cql')
|
data/spec/norma_ruby_spec.rb
CHANGED
@@ -28,10 +28,8 @@ describe "NORMA Loader with Ruby output" do
|
|
28
28
|
output.read
|
29
29
|
end
|
30
30
|
|
31
|
-
|
32
|
-
|
33
|
-
#Dir["examples/norma/[ACG]*.orm"].each do |orm_file|
|
34
|
-
Dir["examples/norma/*.orm"].each do |orm_file|
|
31
|
+
pattern = ENV["AFTESTS"] || "*"
|
32
|
+
Dir["examples/norma/#{pattern}.orm"].each do |orm_file|
|
35
33
|
expected_file = orm_file.sub(%r{examples/norma/(.*).orm\Z}, 'examples/ruby/\1.rb')
|
36
34
|
actual_file = orm_file.sub(%r{examples/norma/(.*).orm\Z}, 'spec/actual/\1.rb')
|
37
35
|
|
data/spec/norma_sql_spec.rb
CHANGED
@@ -23,10 +23,8 @@ describe "NORMA Loader with SQL output" do
|
|
23
23
|
output.read
|
24
24
|
end
|
25
25
|
|
26
|
-
|
27
|
-
|
28
|
-
#Dir["examples/norma/[ACG]*.orm"].each do |orm_file|
|
29
|
-
Dir["examples/norma/*.orm"].each do |orm_file|
|
26
|
+
pattern = ENV["AFTESTS"] || "*"
|
27
|
+
Dir["examples/norma/#{pattern}.orm"].each do |orm_file|
|
30
28
|
expected_file = orm_file.sub(%r{examples/norma/(.*).orm\Z}, 'examples/SQL/\1.sql')
|
31
29
|
actual_file = orm_file.sub(%r{examples/norma/(.*).orm\Z}, 'spec/actual/\1.sql')
|
32
30
|
|
data/spec/norma_tables_spec.rb
CHANGED
@@ -19,8 +19,8 @@ include ActiveFacts::Metamodel
|
|
19
19
|
Exceptions = {
|
20
20
|
"Blog" => ["Author", "Comment", "Paragraph", "Post", "Topic"],
|
21
21
|
"JoinEquality" => ["Event", "Seat", "Ticket", "Venue"],
|
22
|
-
"Metamodel" => ["AllowedRange", "Constraint", "
|
23
|
-
"MetamodelTerms" => ["
|
22
|
+
"Metamodel" => ["AllowedRange", "Constraint", "Derivation", "Fact", "FactType", "Feature", "Instance", "Join", "ParamValue", "Reading", "Role", "RoleRef", "RoleSequence", "RoleValue", "SetComparisonRoles", "Unit", "ValueRestriction"],
|
23
|
+
"MetamodelTerms" => ["AllowedRange", "Concept", "Constraint", "Derivation", "Fact", "FactType", "Import", "Instance", "Join", "ParamValue", "Reading", "Role", "RoleRef", "RoleSequence", "RoleValue", "SetComparisonRoles", "Term", "Unit", "ValueRestriction"],
|
24
24
|
"OilSupply" => ["AcceptableSubstitutes", "Month", "ProductionForecast", "RegionalDemand", "TransportRoute"],
|
25
25
|
"Orienteering" => ["Club", "Entry", "Event", "EventControl", "EventScoringMethod", "Map", "Person", "Punch", "PunchPlacement", "Series", "Visit"],
|
26
26
|
"SeparateSubtype" => ["Claim", "VehicleIncident"],
|
@@ -43,11 +43,8 @@ def extract_created_tables_from_sql sql_file
|
|
43
43
|
end
|
44
44
|
|
45
45
|
describe "Relational Composition from NORMA" do
|
46
|
-
|
47
|
-
|
48
|
-
#Dir["examples/norma/Meta*.orm"].each do |orm_file|
|
49
|
-
#Dir["examples/norma/W*.orm"].each do |orm_file|
|
50
|
-
Dir["examples/norma/*.orm"].each do |orm_file|
|
46
|
+
pattern = ENV["AFTESTS"] || "*"
|
47
|
+
Dir["examples/norma/#{pattern}.orm"].each do |orm_file|
|
51
48
|
expected_tables = Exceptions[File.basename(orm_file, ".orm")]
|
52
49
|
if !expected_tables
|
53
50
|
sql_file_pattern = orm_file.sub(/\.orm\Z/, '*.sql')
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activefacts
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Clifford Heath
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-05-15 00:00:00 +10:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -30,7 +30,7 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 1.1
|
33
|
+
version: 1.4.1
|
34
34
|
version:
|
35
35
|
- !ruby/object:Gem::Dependency
|
36
36
|
name: hoe
|
@@ -42,7 +42,24 @@ dependencies:
|
|
42
42
|
- !ruby/object:Gem::Version
|
43
43
|
version: 1.8.0
|
44
44
|
version:
|
45
|
-
description:
|
45
|
+
description: |-
|
46
|
+
ActiveFacts is a semantic modeling toolkit, comprising an implementation
|
47
|
+
of the Constellation Query Language, the Constellation API, and code
|
48
|
+
generators that receive CQL or ORM (Object Role Modeling files, from
|
49
|
+
NORMA) to emit CQL, Ruby and SQL.
|
50
|
+
|
51
|
+
Semantic modeling is a refinement of fact-based modeling techniques
|
52
|
+
that draw on natural language verbalisation and formal logic. Fact
|
53
|
+
based modeling is essentially the same as relational modeling in the
|
54
|
+
sixth normal form. The tools provided here automatically condense
|
55
|
+
that to third normal form for efficient storage. They also generate
|
56
|
+
object models as a Ruby module which has an effective mapping to
|
57
|
+
both the original semantic model and to the generated SQL.
|
58
|
+
|
59
|
+
The result is a formal language that reads like plain English, and
|
60
|
+
allows creation of relational and object models that are guaranteed
|
61
|
+
equivalent, and much more stable in the face of schema evolution than
|
62
|
+
SQL is.
|
46
63
|
email:
|
47
64
|
- cjh@dataconstellation.org
|
48
65
|
executables:
|
@@ -109,6 +126,7 @@ files:
|
|
109
126
|
- lib/activefacts/generate/oo.rb
|
110
127
|
- lib/activefacts/generate/ordered.rb
|
111
128
|
- lib/activefacts/generate/ruby.rb
|
129
|
+
- lib/activefacts/generate/sql/mysql.rb
|
112
130
|
- lib/activefacts/generate/sql/server.rb
|
113
131
|
- lib/activefacts/generate/text.rb
|
114
132
|
- lib/activefacts/input/cql.rb
|
@@ -149,8 +167,13 @@ files:
|
|
149
167
|
- spec/spec_helper.rb
|
150
168
|
has_rdoc: true
|
151
169
|
homepage: http://dataconstellation.com/ActiveFacts/
|
170
|
+
licenses: []
|
171
|
+
|
152
172
|
post_install_message: For more information on ActiveFacts, see http://dataconstellation.com/ActiveFacts
|
153
173
|
rdoc_options:
|
174
|
+
- -S
|
175
|
+
- -T
|
176
|
+
- hanna
|
154
177
|
- -A
|
155
178
|
- has_one
|
156
179
|
- -A
|
@@ -178,9 +201,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
178
201
|
requirements: []
|
179
202
|
|
180
203
|
rubyforge_project: cjheath@rubyforge.org
|
181
|
-
rubygems_version: 1.3.
|
204
|
+
rubygems_version: 1.3.3
|
182
205
|
signing_key:
|
183
|
-
specification_version:
|
206
|
+
specification_version: 3
|
184
207
|
summary: ActiveFacts is a semantic modeling toolkit, comprising an implementation of the Constellation Query Language, the Constellation API, and code generators that receive CQL or ORM (Object Role Modeling files, from NORMA) to emit CQL, Ruby and SQL
|
185
208
|
test_files: []
|
186
209
|
|