activefacts 0.7.3 → 0.8.5
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +19 -0
- data/Manifest.txt +24 -2
- data/Rakefile +25 -3
- data/bin/afgen +1 -1
- data/bin/cql +13 -2
- data/css/offline.css +3 -0
- data/css/orm2.css +24 -0
- data/css/print.css +8 -0
- data/css/style-print.css +357 -0
- data/css/style.css +387 -0
- data/download.html +85 -0
- data/examples/CQL/Address.cql +3 -3
- data/examples/CQL/Blog.cql +13 -14
- data/examples/CQL/CompanyDirectorEmployee.cql +4 -4
- data/examples/CQL/Death.cql +3 -2
- data/examples/CQL/Genealogy.cql +13 -11
- data/examples/CQL/Marriage.cql +2 -2
- data/examples/CQL/Metamodel.cql +136 -93
- data/examples/CQL/MultiInheritance.cql +2 -2
- data/examples/CQL/OilSupply.cql +14 -10
- data/examples/CQL/Orienteering.cql +22 -19
- data/examples/CQL/PersonPlaysGame.cql +3 -2
- data/examples/CQL/SchoolActivities.cql +4 -2
- data/examples/CQL/SimplestUnary.cql +1 -1
- data/examples/CQL/SubtypePI.cql +6 -7
- data/examples/CQL/Warehousing.cql +16 -19
- data/examples/CQL/unit.cql +584 -0
- data/examples/index.html +276 -0
- data/examples/intro.html +497 -0
- data/examples/local.css +20 -0
- data/index.html +96 -0
- data/lib/activefacts/api/concept.rb +48 -46
- data/lib/activefacts/api/constellation.rb +43 -23
- data/lib/activefacts/api/entity.rb +2 -2
- data/lib/activefacts/api/instance.rb +6 -2
- data/lib/activefacts/api/instance_index.rb +5 -0
- data/lib/activefacts/api/value.rb +8 -2
- data/lib/activefacts/api/vocabulary.rb +15 -10
- data/lib/activefacts/cql/CQLParser.treetop +109 -88
- data/lib/activefacts/cql/Concepts.treetop +32 -10
- data/lib/activefacts/cql/Context.treetop +34 -0
- data/lib/activefacts/cql/Expressions.treetop +9 -9
- data/lib/activefacts/cql/FactTypes.treetop +30 -31
- data/lib/activefacts/cql/Language/English.treetop +50 -0
- data/lib/activefacts/cql/LexicalRules.treetop +2 -1
- data/lib/activefacts/cql/Terms.treetop +117 -0
- data/lib/activefacts/cql/ValueTypes.treetop +152 -0
- data/lib/activefacts/cql/compiler.rb +1718 -0
- data/lib/activefacts/cql/parser.rb +124 -57
- data/lib/activefacts/generate/absorption.rb +1 -1
- data/lib/activefacts/generate/cql.rb +111 -100
- data/lib/activefacts/generate/cql/html.rb +5 -5
- data/lib/activefacts/generate/oo.rb +3 -3
- data/lib/activefacts/generate/ordered.rb +51 -19
- data/lib/activefacts/generate/ruby.rb +10 -8
- data/lib/activefacts/generate/sql/mysql.rb +14 -10
- data/lib/activefacts/generate/sql/server.rb +29 -24
- data/lib/activefacts/input/cql.rb +9 -1264
- data/lib/activefacts/input/orm.rb +213 -200
- data/lib/activefacts/persistence/columns.rb +11 -10
- data/lib/activefacts/persistence/index.rb +15 -18
- data/lib/activefacts/persistence/reference.rb +17 -17
- data/lib/activefacts/persistence/tables.rb +50 -51
- data/lib/activefacts/version.rb +1 -1
- data/lib/activefacts/vocabulary/extensions.rb +79 -8
- data/lib/activefacts/vocabulary/metamodel.rb +183 -114
- data/spec/absorption_ruby_spec.rb +99 -0
- data/spec/absorption_spec.rb +3 -4
- data/spec/api/constellation.rb +1 -1
- data/spec/api/entity_type.rb +3 -1
- data/spec/api/instance.rb +4 -2
- data/spec/api/roles.rb +8 -6
- data/spec/api_spec.rb +1 -2
- data/spec/cql/context_spec.rb +71 -0
- data/spec/cql/samples_spec.rb +154 -0
- data/spec/cql/unit_spec.rb +375 -0
- data/spec/cql_cql_spec.rb +31 -21
- data/spec/cql_mysql_spec.rb +70 -0
- data/spec/cql_parse_spec.rb +15 -9
- data/spec/cql_ruby_spec.rb +27 -13
- data/spec/cql_sql_spec.rb +42 -16
- data/spec/cql_symbol_tables_spec.rb +2 -3
- data/spec/cqldump_spec.rb +7 -7
- data/spec/helpers/file_matcher.rb +39 -0
- data/spec/norma_cql_spec.rb +20 -12
- data/spec/norma_ruby_spec.rb +6 -3
- data/spec/norma_sql_spec.rb +6 -3
- data/spec/norma_tables_spec.rb +6 -4
- data/spec/spec_helper.rb +27 -8
- data/status.html +69 -0
- data/why.html +60 -0
- metadata +34 -11
- data/lib/activefacts/cql/DataTypes.treetop +0 -81
- data/spec/cql_unit_spec.rb +0 -330
@@ -0,0 +1,70 @@
|
|
1
|
+
#
|
2
|
+
# ActiveFacts tests: Parse all CQL files and check the generated SQL.
|
3
|
+
# Copyright (c) 2008 Clifford Heath. Read the LICENSE file.
|
4
|
+
#
|
5
|
+
|
6
|
+
require 'spec/spec_helper'
|
7
|
+
require 'stringio'
|
8
|
+
require 'activefacts/vocabulary'
|
9
|
+
require 'activefacts/support'
|
10
|
+
require 'activefacts/input/cql'
|
11
|
+
require 'activefacts/generate/sql/mysql'
|
12
|
+
|
13
|
+
include ActiveFacts
|
14
|
+
include ActiveFacts::Metamodel
|
15
|
+
|
16
|
+
describe "CQL Loader with SQL output" do
|
17
|
+
cql_failures = {
|
18
|
+
"Airline" => "Contains queries, unsupported",
|
19
|
+
"CompanyQuery" => "Contains queries, unsupported",
|
20
|
+
"OrienteeringER" => "Doesn't parse due to difficult fact type match",
|
21
|
+
"ServiceDirector" => "Doesn't parse some constraints due to mis-matched adjectives"
|
22
|
+
}
|
23
|
+
cql_mysql_failures = {
|
24
|
+
"Metamodel" => "An index to enforce uniqueness on the nesting fact type isn't emitted",
|
25
|
+
}
|
26
|
+
|
27
|
+
# Generate and return the SQL for the given vocabulary
|
28
|
+
def sql(vocabulary)
|
29
|
+
output = StringIO.new
|
30
|
+
@dumper = ActiveFacts::Generate::SQL::MYSQL.new(vocabulary.constellation, "norma")
|
31
|
+
@dumper.generate(output)
|
32
|
+
output.rewind
|
33
|
+
output.read
|
34
|
+
end
|
35
|
+
|
36
|
+
pattern = ENV["AFTESTS"] || "*"
|
37
|
+
Dir["examples/CQL/#{pattern}.cql"].each do |cql_file|
|
38
|
+
actual_file = cql_file.sub(%r{examples/CQL/(.*).cql}, 'spec/actual/\1.my.sql')
|
39
|
+
expected_file = cql_file.sub(%r{examples/CQL/(.*).cql\Z}, 'examples/MySQL/\1.sql')
|
40
|
+
|
41
|
+
it "should load #{cql_file} and dump MySQL matching #{expected_file}" do
|
42
|
+
broken = cql_failures[File.basename(cql_file, ".cql")]
|
43
|
+
vocabulary = nil
|
44
|
+
if broken
|
45
|
+
pending(broken) {
|
46
|
+
lambda { vocabulary = ActiveFacts::Input::CQL.readfile(cql_file) }.should_not raise_error
|
47
|
+
}
|
48
|
+
else
|
49
|
+
lambda { vocabulary = ActiveFacts::Input::CQL.readfile(cql_file) }.should_not raise_error
|
50
|
+
end
|
51
|
+
|
52
|
+
# Build and save the actual file:
|
53
|
+
sql_text = sql(vocabulary)
|
54
|
+
File.open(actual_file, "w") { |f| f.write sql_text }
|
55
|
+
|
56
|
+
pending("expected output file #{expected_file} not found") unless File.exists? expected_file
|
57
|
+
|
58
|
+
expected_text = File.open(expected_file) {|f| f.read }
|
59
|
+
broken = cql_mysql_failures[File.basename(actual_file, ".cql")]
|
60
|
+
if broken
|
61
|
+
pending(broken) {
|
62
|
+
sql_text.should_not differ_from(expected_text)
|
63
|
+
}
|
64
|
+
else
|
65
|
+
sql_text.should_not differ_from(expected_text)
|
66
|
+
File.delete(actual_file) # It succeeded, we don't need the file.
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
data/spec/cql_parse_spec.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
# ActiveFacts tests: Parse all NORMA files and check the generated CQL.
|
3
3
|
# Copyright (c) 2008 Clifford Heath. Read the LICENSE file.
|
4
4
|
#
|
5
|
-
|
5
|
+
|
6
6
|
require 'stringio'
|
7
7
|
require 'activefacts/vocabulary'
|
8
8
|
require 'activefacts/support'
|
@@ -12,19 +12,25 @@ require 'activefacts/generate/cql'
|
|
12
12
|
include ActiveFacts
|
13
13
|
|
14
14
|
describe "CQL Parser" do
|
15
|
-
|
16
|
-
Airline
|
17
|
-
CompanyQuery
|
18
|
-
|
19
|
-
|
20
|
-
ServiceDirector
|
15
|
+
cql_failures = {
|
16
|
+
"Airline" => "Contains queries, unsupported",
|
17
|
+
"CompanyQuery" => "Contains queries, unsupported",
|
18
|
+
"OrienteeringER" => "Contains a long fact type that can't be matched properly",
|
19
|
+
"ServiceDirector" => "Contains constraints with mismatched adjectives",
|
21
20
|
}
|
22
21
|
|
23
22
|
pattern = ENV["AFTESTS"] || "*"
|
24
23
|
Dir["examples/CQL/#{pattern}.cql"].each do |cql_file|
|
25
24
|
it "should load CQL #{cql_file} without parse errors" do
|
26
|
-
|
27
|
-
|
25
|
+
broken = cql_failures[File.basename(cql_file, ".cql")]
|
26
|
+
|
27
|
+
if broken
|
28
|
+
pending(broken) {
|
29
|
+
lambda { vocabulary = ActiveFacts::Input::CQL.readfile(cql_file) }.should_not raise_error
|
30
|
+
}
|
31
|
+
else
|
32
|
+
lambda { vocabulary = ActiveFacts::Input::CQL.readfile(cql_file) }.should_not raise_error
|
33
|
+
end
|
28
34
|
end
|
29
35
|
end
|
30
36
|
end
|
data/spec/cql_ruby_spec.rb
CHANGED
@@ -2,7 +2,8 @@
|
|
2
2
|
# ActiveFacts tests: Parse all CQL files and check the generated Ruby.
|
3
3
|
# Copyright (c) 2008 Clifford Heath. Read the LICENSE file.
|
4
4
|
#
|
5
|
-
|
5
|
+
|
6
|
+
require 'spec/spec_helper'
|
6
7
|
require 'stringio'
|
7
8
|
require 'activefacts/vocabulary'
|
8
9
|
require 'activefacts/support'
|
@@ -19,13 +20,11 @@ class String
|
|
19
20
|
end
|
20
21
|
|
21
22
|
describe "CQL Loader with Ruby output" do
|
22
|
-
|
23
|
-
Airline
|
24
|
-
CompanyQuery
|
25
|
-
|
26
|
-
|
27
|
-
Orienteering
|
28
|
-
ServiceDirector
|
23
|
+
cql_failures = {
|
24
|
+
"Airline" => "Contains queries, not supported",
|
25
|
+
"CompanyQuery" => "Contains queries, not supported",
|
26
|
+
"OrienteeringER" => "Large fact type reading cannot be matched",
|
27
|
+
"ServiceDirector" => "Constraints contain adjectives that require looser matching",
|
29
28
|
}
|
30
29
|
|
31
30
|
# Generate and return the Ruby for the given vocabulary
|
@@ -43,16 +42,31 @@ describe "CQL Loader with Ruby output" do
|
|
43
42
|
actual_file = cql_file.sub(%r{examples/CQL/(.*).cql\Z}, 'spec/actual/\1.rb')
|
44
43
|
|
45
44
|
it "should load #{cql_file} and dump Ruby matching #{expected_file}" do
|
46
|
-
|
47
|
-
|
45
|
+
vocabulary = nil
|
46
|
+
broken = cql_failures[File.basename(cql_file, ".cql")]
|
47
|
+
if broken
|
48
|
+
pending(broken) {
|
49
|
+
vocabulary = ActiveFacts::Input::CQL.readfile(cql_file)
|
50
|
+
}
|
51
|
+
else
|
52
|
+
vocabulary = ActiveFacts::Input::CQL.readfile(cql_file)
|
53
|
+
end
|
48
54
|
|
49
55
|
# Build and save the actual file:
|
50
56
|
ruby_text = ruby(vocabulary)
|
51
57
|
File.open(actual_file, "w") { |f| f.write ruby_text }
|
52
58
|
|
53
|
-
pending unless File.exists? expected_file
|
54
|
-
|
55
|
-
File.
|
59
|
+
pending("expected output file #{expected_file} not found") unless File.exists? expected_file
|
60
|
+
|
61
|
+
expected_text = File.open(expected_file) {|f| f.read }
|
62
|
+
# if broken
|
63
|
+
# pending(broken) {
|
64
|
+
# ruby_text.should == File.open(expected_file) {|f| f.read }
|
65
|
+
# }
|
66
|
+
# else
|
67
|
+
ruby_text.should_not differ_from(expected_text)
|
68
|
+
File.delete(actual_file) # It succeeded, we don't need the file.
|
69
|
+
# end
|
56
70
|
end
|
57
71
|
end
|
58
72
|
end
|
data/spec/cql_sql_spec.rb
CHANGED
@@ -2,7 +2,8 @@
|
|
2
2
|
# ActiveFacts tests: Parse all CQL files and check the generated SQL.
|
3
3
|
# Copyright (c) 2008 Clifford Heath. Read the LICENSE file.
|
4
4
|
#
|
5
|
-
|
5
|
+
|
6
|
+
require 'spec/spec_helper'
|
6
7
|
require 'stringio'
|
7
8
|
require 'activefacts/vocabulary'
|
8
9
|
require 'activefacts/support'
|
@@ -13,16 +14,25 @@ include ActiveFacts
|
|
13
14
|
include ActiveFacts::Metamodel
|
14
15
|
|
15
16
|
describe "CQL Loader with SQL output" do
|
16
|
-
|
17
|
-
Airline
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
17
|
+
cql_failures = {
|
18
|
+
"Airline" => "Contains unsupported queries",
|
19
|
+
"CompanyQuery" => "Contains unsupported queries",
|
20
|
+
"OrienteeringER" => "Large fact type reading cannot be matched",
|
21
|
+
"ServiceDirector" => "Constraints contain adjectives that require looser matching",
|
22
|
+
}
|
23
|
+
cql_sql_failures = {
|
24
|
+
"Blog" => "Drops uniqueness constraints",
|
25
|
+
"CompanyDirectorEmployee" => "Names an index automatically from CQL, but explicitly from NORMA",
|
26
|
+
"Insurance" => "CQL doesn't have an option for subtype separation",
|
27
|
+
"Metamodel" =>
|
28
|
+
"Names an index automatically from CQL, but explicitly from NORMA" + " " +
|
29
|
+
"Drops uniqueness constraints",
|
30
|
+
"Orienteering" =>
|
31
|
+
"Names an index automatically from CQL, but explicitly from NORMA" + " " +
|
32
|
+
"Drops uniqueness constraints",
|
33
|
+
"RedundantDependency" => "Drops uniqueness constraints",
|
34
|
+
"SubtypePI" => "Names an index automatically from CQL, but explicitly from NORMA",
|
35
|
+
"Tests.Test5.Load" => "Names an index automatically from CQL, but explicitly from NORMA",
|
26
36
|
}
|
27
37
|
|
28
38
|
# Generate and return the SQL for the given vocabulary
|
@@ -40,16 +50,32 @@ describe "CQL Loader with SQL output" do
|
|
40
50
|
expected_file = cql_file.sub(%r{examples/CQL/(.*).cql\Z}, 'examples/SQL/\1.sql')
|
41
51
|
|
42
52
|
it "should load #{cql_file} and dump SQL matching #{expected_file}" do
|
43
|
-
|
44
|
-
|
53
|
+
vocabulary = nil
|
54
|
+
broken = cql_failures[File.basename(cql_file, ".cql")]
|
55
|
+
if broken
|
56
|
+
pending(broken) {
|
57
|
+
vocabulary = ActiveFacts::Input::CQL.readfile(cql_file)
|
58
|
+
}
|
59
|
+
else
|
60
|
+
vocabulary = ActiveFacts::Input::CQL.readfile(cql_file)
|
61
|
+
end
|
45
62
|
|
46
63
|
# Build and save the actual file:
|
47
64
|
sql_text = sql(vocabulary)
|
48
65
|
File.open(actual_file, "w") { |f| f.write sql_text }
|
49
66
|
|
50
|
-
pending unless File.exists? expected_file
|
51
|
-
|
52
|
-
File.
|
67
|
+
pending("expected output file #{expected_file} not found") unless File.exists? expected_file
|
68
|
+
|
69
|
+
expected_text = File.open(expected_file) {|f| f.read }
|
70
|
+
broken = cql_sql_failures[File.basename(cql_file, ".cql")]
|
71
|
+
if broken
|
72
|
+
pending(broken) {
|
73
|
+
sql_text.should_not differ_from(expected_text)
|
74
|
+
}
|
75
|
+
else
|
76
|
+
sql_text.should_not differ_from(expected_text)
|
77
|
+
File.delete(actual_file) # It succeeded, we don't need the file.
|
78
|
+
end
|
53
79
|
end
|
54
80
|
end
|
55
81
|
end
|
@@ -2,8 +2,7 @@
|
|
2
2
|
# ActiveFacts tests: Test the CQL parser by looking at its parse trees.
|
3
3
|
# Copyright (c) 2008 Clifford Heath. Read the LICENSE file.
|
4
4
|
#
|
5
|
-
|
6
|
-
require 'treetop'
|
5
|
+
|
7
6
|
require 'activefacts/support'
|
8
7
|
require 'activefacts/api/support'
|
9
8
|
require 'activefacts/input/cql'
|
@@ -19,7 +18,7 @@ describe "CQL Symbol table" do
|
|
19
18
|
include ActiveFacts::Input::CQL
|
20
19
|
@constellation = ActiveFacts::API::Constellation.new(ActiveFacts::Metamodel)
|
21
20
|
@vocabulary = @constellation.Vocabulary("Test")
|
22
|
-
@symbols = ActiveFacts::
|
21
|
+
@symbols = ActiveFacts::CQL::Compiler::SymbolTable.new(@constellation, @vocabulary)
|
23
22
|
end
|
24
23
|
|
25
24
|
Definitions = [
|
data/spec/cqldump_spec.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
# ActiveFacts tests: Test the generated CQL for some simple cases.
|
3
3
|
# Copyright (c) 2008 Clifford Heath. Read the LICENSE file.
|
4
4
|
#
|
5
|
-
|
5
|
+
|
6
6
|
require 'stringio'
|
7
7
|
require 'activefacts/support'
|
8
8
|
require 'activefacts/vocabulary'
|
@@ -70,8 +70,8 @@ END
|
|
70
70
|
def one_to_many(one, many, reading)
|
71
71
|
# Join them with a fact type:
|
72
72
|
ft = @constellation.FactType(:new)
|
73
|
-
role0 = @constellation.Role(ft, 0, one)
|
74
|
-
role1 = @constellation.Role(ft, 1, many)
|
73
|
+
role0 = @constellation.Role(ft, 0, :concept => one)
|
74
|
+
role1 = @constellation.Role(ft, 1, :concept => many)
|
75
75
|
|
76
76
|
# Make a role sequence:
|
77
77
|
rs = @constellation.RoleSequence(:new)
|
@@ -84,7 +84,7 @@ END
|
|
84
84
|
pc = @constellation.PresenceConstraint(:new, :is_mandatory => false, :is_preferred_identifier => false, :max_frequency => 1, :min_frequency => 0, :role_sequence => pcrs)
|
85
85
|
|
86
86
|
# Make a new reading:
|
87
|
-
reading = @constellation.Reading(ft, ft.all_reading.size, :role_sequence => rs, :
|
87
|
+
reading = @constellation.Reading(ft, ft.all_reading.size, :role_sequence => rs, :text => reading)
|
88
88
|
|
89
89
|
ft
|
90
90
|
end
|
@@ -92,8 +92,8 @@ END
|
|
92
92
|
def one_to_one(first, second, reading)
|
93
93
|
# Join them with a fact type:
|
94
94
|
ft = @constellation.FactType(:new)
|
95
|
-
role0 = @constellation.Role(ft, 0, first)
|
96
|
-
role1 = @constellation.Role(ft, 1, second)
|
95
|
+
role0 = @constellation.Role(ft, 0, :concept => first)
|
96
|
+
role1 = @constellation.Role(ft, 1, :concept => second)
|
97
97
|
|
98
98
|
# Make a role sequence for the reading
|
99
99
|
rs = @constellation.RoleSequence(:new)
|
@@ -101,7 +101,7 @@ END
|
|
101
101
|
rr1 = @constellation.RoleRef(rs, 1, :role => role1)
|
102
102
|
|
103
103
|
# Make a new reading:
|
104
|
-
reading = @constellation.Reading(ft, ft.all_reading.size, :role_sequence => rs, :
|
104
|
+
reading = @constellation.Reading(ft, ft.all_reading.size, :role_sequence => rs, :text => reading)
|
105
105
|
|
106
106
|
# Make a uniqueness constraint for the first role
|
107
107
|
first_rs = @constellation.RoleSequence(:new)
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'diff/lcs'
|
2
|
+
|
3
|
+
module FileMatcher
|
4
|
+
class BeDifferent
|
5
|
+
def initialize(expected)
|
6
|
+
@expected = expected.scan(/[^\n]+/)
|
7
|
+
end
|
8
|
+
|
9
|
+
def matches?(actual)
|
10
|
+
actual_lines = actual.scan(/[^\n]+/)
|
11
|
+
differences = Diff::LCS::diff(@expected, actual_lines)
|
12
|
+
@diff = differences.map do |chunk|
|
13
|
+
added_at = (add = chunk.detect{|d| d.action == '+'}) && add.position+1
|
14
|
+
removed_at = (remove = chunk.detect{|d| d.action == '-'}) && remove.position+1
|
15
|
+
"Line #{added_at}/#{removed_at}:\n"+
|
16
|
+
chunk.map do |change|
|
17
|
+
"#{change.action} #{change.element}"
|
18
|
+
end*"\n"
|
19
|
+
end*"\n"
|
20
|
+
@diff != ''
|
21
|
+
end
|
22
|
+
|
23
|
+
def failure_message
|
24
|
+
"expected a difference, but got none"
|
25
|
+
end
|
26
|
+
|
27
|
+
def negative_failure_message
|
28
|
+
"expected no difference, but got:\n#{@diff}"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def differ_from(expected)
|
33
|
+
BeDifferent.new(expected)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
Spec::Runner.configure do |config|
|
38
|
+
config.include(FileMatcher)
|
39
|
+
end
|
data/spec/norma_cql_spec.rb
CHANGED
@@ -2,7 +2,8 @@
|
|
2
2
|
# ActiveFacts tests: Parse all NORMA files and check the generated CQL.
|
3
3
|
# Copyright (c) 2008 Clifford Heath. Read the LICENSE file.
|
4
4
|
#
|
5
|
-
|
5
|
+
|
6
|
+
require 'spec/spec_helper'
|
6
7
|
require 'stringio'
|
7
8
|
require 'activefacts/vocabulary'
|
8
9
|
require 'activefacts/support'
|
@@ -12,9 +13,8 @@ require 'activefacts/generate/cql'
|
|
12
13
|
include ActiveFacts
|
13
14
|
|
14
15
|
describe "Norma Loader" do
|
15
|
-
|
16
|
-
OddIdentifier
|
17
|
-
ServiceDirector
|
16
|
+
orm_cql_failures = {
|
17
|
+
# "OddIdentifier" => "Strange identification pattern is incorrectly verbalised to CQL", # Fixed
|
18
18
|
}
|
19
19
|
# Generate and return the CQL for the given vocabulary
|
20
20
|
def cql(vocabulary)
|
@@ -22,26 +22,34 @@ describe "Norma Loader" do
|
|
22
22
|
@dumper = ActiveFacts::Generate::CQL.new(vocabulary.constellation)
|
23
23
|
@dumper.generate(output)
|
24
24
|
output.rewind
|
25
|
-
output.
|
25
|
+
output.read
|
26
26
|
end
|
27
27
|
|
28
28
|
pattern = ENV["AFTESTS"] || "*"
|
29
29
|
Dir["examples/norma/#{pattern}.orm"].each do |orm_file|
|
30
30
|
expected_file = orm_file.sub(%r{/norma/(.*).orm\Z}, '/CQL/\1.cql')
|
31
|
-
|
32
31
|
actual_file = orm_file.sub(%r{examples/norma/(.*).orm\Z}, 'spec/actual/\1.cql')
|
33
32
|
|
34
33
|
it "should load #{orm_file} and dump CQL matching #{expected_file}" do
|
35
|
-
pending if ORM_CQL_FAILURES.include? File.basename(orm_file, ".orm")
|
36
34
|
vocabulary = ActiveFacts::Input::ORM.readfile(orm_file)
|
37
35
|
|
38
|
-
|
36
|
+
cql_text = cql(vocabulary)
|
39
37
|
# Save the actual file:
|
40
|
-
File.open(actual_file, "w") { |f| f.write
|
38
|
+
File.open(actual_file, "w") { |f| f.write cql_text }
|
39
|
+
|
40
|
+
pending("expected output file #{expected_file} not found") unless File.exists? expected_file
|
41
|
+
|
42
|
+
expected_text = File.open(expected_file) {|f| f.read }
|
41
43
|
|
42
|
-
|
43
|
-
|
44
|
-
|
44
|
+
broken = orm_cql_failures[File.basename(orm_file, ".orm")]
|
45
|
+
if broken
|
46
|
+
pending(broken) {
|
47
|
+
cql_text.should_not differ_from(expected_text)
|
48
|
+
}
|
49
|
+
else
|
50
|
+
cql_text.should_not differ_from(expected_text)
|
51
|
+
File.delete(actual_file)
|
52
|
+
end
|
45
53
|
end
|
46
54
|
end
|
47
55
|
end
|
data/spec/norma_ruby_spec.rb
CHANGED
@@ -2,7 +2,8 @@
|
|
2
2
|
# ActiveFacts tests: Parse all CQL files and check the generated Ruby.
|
3
3
|
# Copyright (c) 2008 Clifford Heath. Read the LICENSE file.
|
4
4
|
#
|
5
|
-
|
5
|
+
|
6
|
+
require 'spec/spec_helper'
|
6
7
|
require 'stringio'
|
7
8
|
require 'activefacts/vocabulary'
|
8
9
|
require 'activefacts/support'
|
@@ -40,8 +41,10 @@ describe "NORMA Loader with Ruby output" do
|
|
40
41
|
ruby_text = ruby(vocabulary)
|
41
42
|
File.open(actual_file, "w") { |f| f.write ruby_text }
|
42
43
|
|
43
|
-
pending unless File.exists? expected_file
|
44
|
-
|
44
|
+
pending("expected output file #{expected_file} not found") unless File.exists? expected_file
|
45
|
+
|
46
|
+
expected_text = File.open(expected_file) {|f| f.read }
|
47
|
+
ruby_text.should_not differ_from(expected_text)
|
45
48
|
File.delete(actual_file) # It succeeded, we don't need the file.
|
46
49
|
end
|
47
50
|
end
|