expressir 1.2.5-x86_64-linux → 1.2.6-x86_64-linux
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/rake.yml +0 -12
- data/README.adoc +8 -0
- data/lib/expressir/express/2.7/express_parser.so +0 -0
- data/lib/expressir/express/3.0/express_parser.so +0 -0
- data/lib/expressir/express/3.1/express_parser.so +0 -0
- data/lib/expressir/express/parser.rb +3 -4
- data/lib/expressir/version.rb +1 -1
- data/rakelib/antlr4-native.rake +122 -24
- data/spec/acceptance/version_spec.rb +10 -0
- data/spec/expressir/express/cache_spec.rb +15 -0
- data/spec/expressir/express/formatter_spec.rb +38 -0
- data/spec/expressir/express/parser_spec.rb +30 -0
- data/spec/expressir/model/model_element_spec.rb +44 -0
- data/spec/spec_helper.rb +7 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 03e481ebfeda970cbf8896742c748656f4c8301cde155b1c2cc4c95977523e12
|
4
|
+
data.tar.gz: '049a6c297c3929c70e024b838d360276490ec96caa328f964e6f51fa8fac3a5f'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 837a7b01d89cb8dd1164edba3f199a4871ab3fb6e1a10f588c9239e9f40e2ef3c6003675e31df2ce1055f9620b309fd824abd4c2743d1eb480f231f950480ffe
|
7
|
+
data.tar.gz: 1aee92803dbd53930b1add42ba208d99df258185205f6ac67a22cc8140ecc9ba34869b6dff60b441581d4cd88b5881bb29dde3c0026b7abe9c6d07cc822cebf7
|
data/.github/workflows/rake.yml
CHANGED
@@ -29,23 +29,11 @@ jobs:
|
|
29
29
|
rake:
|
30
30
|
name: test on ruby-${{ matrix.ruby }} ${{ matrix.os }}
|
31
31
|
runs-on: ${{ matrix.os }}
|
32
|
-
continue-on-error: ${{ matrix.experimental }}
|
33
32
|
strategy:
|
34
33
|
fail-fast: false
|
35
34
|
matrix:
|
36
35
|
ruby: [ '3.1', '3.0', '2.7' ]
|
37
36
|
os: [ ubuntu-latest, windows-latest, macos-latest ]
|
38
|
-
experimental: [ false ]
|
39
|
-
include:
|
40
|
-
- ruby: 'head'
|
41
|
-
os: 'ubuntu-latest'
|
42
|
-
experimental: true
|
43
|
-
- ruby: 'head'
|
44
|
-
os: 'windows-latest'
|
45
|
-
experimental: true
|
46
|
-
- ruby: 'head'
|
47
|
-
os: 'macos-latest'
|
48
|
-
experimental: true
|
49
37
|
|
50
38
|
steps:
|
51
39
|
- name: Checkout
|
data/README.adoc
CHANGED
@@ -75,6 +75,14 @@ Run the test suite
|
|
75
75
|
bin/rspec
|
76
76
|
----
|
77
77
|
|
78
|
+
=== Grammar updates
|
79
|
+
EXPRESS grammar is lined as git submodule to ext/express-grammar
|
80
|
+
Shoudl you update it, run ```rake generate```. This command will generate source code for updated native extension using antlr4-native gem.
|
81
|
+
Please note that we create several classes on top of antlr4-native output so using embedded rake task is a real requirement.
|
82
|
+
|
83
|
+
When new extension is gnerated and tested plase check in updated C++ files to git (```rake generate``` is NOT a CI step,
|
84
|
+
extension source files are pulled from the repo).
|
85
|
+
|
78
86
|
== Installation
|
79
87
|
|
80
88
|
Add this line to your application's `Gemfile`:
|
Binary file
|
Binary file
|
Binary file
|
@@ -31,13 +31,12 @@ module Expressir
|
|
31
31
|
# @param [Boolean] include_source attach original source code to model elements
|
32
32
|
# @return [Model::Repository]
|
33
33
|
def self.from_file(file, skip_references: nil, include_source: nil)
|
34
|
-
@input = File.read(file)
|
35
34
|
|
36
35
|
# An important note re memory management
|
37
|
-
# parse, syntax, visitor methods return complex tree structures created in
|
36
|
+
# parse, syntax, visitor methods return complex tree structures created in native (C++) extension
|
38
37
|
# visit method references nodes and leaves of this structures but it is totally untransparent for Ruby GarbageCllector
|
39
|
-
# so in this class we keep those C++ structure marked for GC so
|
40
|
-
@parser = ::ExpressParser::
|
38
|
+
# so in this class we keep those C++ structure marked for GC so they are not freed
|
39
|
+
@parser = ::ExpressParser::ParserExt.new(file.to_s)
|
41
40
|
@parse_tree = @parser.syntax()
|
42
41
|
|
43
42
|
@visitor = Visitor.new(@parser.tokens, include_source: include_source)
|
data/lib/expressir/version.rb
CHANGED
data/rakelib/antlr4-native.rake
CHANGED
@@ -2,34 +2,138 @@ require "fileutils"
|
|
2
2
|
require "antlr4-native"
|
3
3
|
require "rake"
|
4
4
|
|
5
|
-
def
|
6
|
-
|
7
|
-
i
|
8
|
-
parser_source_lines[i + 6] += <<~CPP.split("\n").map { |x| x == "" ? x : " #{x}" }.join("\n")
|
5
|
+
def create_class_declarations(parser_source_lines)
|
6
|
+
i = parser_source_lines.index { |x| x == "Class rb_cContextProxy;" }
|
7
|
+
parser_source_lines[i] += <<~CPP.split("\n").map { |x| x == "" ? x : x.to_s }.join("\n")
|
9
8
|
|
10
|
-
|
11
|
-
|
9
|
+
Class rb_cParserExt;
|
10
|
+
Class rb_cTokenExt;
|
12
11
|
|
13
|
-
|
12
|
+
CPP
|
13
|
+
end
|
14
|
+
|
15
|
+
def create_tp_class_definition(parser_source_lines)
|
16
|
+
i = parser_source_lines.index { |x| x == "class ContextProxy {" }
|
17
|
+
parser_source_lines[i - 2] += <<~CPP.split("\n").map { |x| x == "" ? x : x.to_s }.join("\n")
|
18
|
+
|
19
|
+
|
20
|
+
class TokenProxy : public Object {
|
21
|
+
public:
|
22
|
+
TokenProxy(Token* orig) {
|
23
|
+
this -> orig = orig;
|
24
|
+
}
|
25
|
+
|
26
|
+
std::string getText() {
|
27
|
+
return orig->getText();
|
28
|
+
}
|
29
|
+
|
30
|
+
size_t getChannel() {
|
31
|
+
return orig->getChannel();
|
32
|
+
}
|
33
|
+
|
34
|
+
size_t getTokenIndex() {
|
35
|
+
return orig->getTokenIndex();
|
36
|
+
}
|
37
|
+
|
38
|
+
private:
|
39
|
+
Token * orig = nullptr;
|
40
|
+
};
|
41
|
+
|
42
|
+
CPP
|
43
|
+
end
|
44
|
+
|
45
|
+
def create_pp_class_definition(parser_source_lines)
|
46
|
+
i = parser_source_lines.index { |x| x == "extern \"C\"" }
|
47
|
+
parser_source_lines[i - 2] += <<~CPP.split("\n").map { |x| x == "" ? x : x.to_s }.join("\n")
|
48
|
+
|
49
|
+
class ParserProxyExt : public Object {
|
50
|
+
public:
|
51
|
+
ParserProxyExt(Object self, string file) {
|
52
|
+
ifstream stream;
|
53
|
+
stream.open(file);
|
54
|
+
input = new ANTLRInputStream(stream);
|
55
|
+
lexer = new ExpressLexer(input);
|
56
|
+
tokens = new CommonTokenStream(lexer);
|
57
|
+
parser = new ExpressParser(tokens);
|
58
|
+
stream.close();
|
59
|
+
};
|
60
|
+
|
61
|
+
~ParserProxyExt() {
|
62
|
+
delete parser;
|
63
|
+
delete tokens;
|
64
|
+
delete lexer;
|
65
|
+
delete input;
|
66
|
+
}
|
67
|
+
|
68
|
+
Object syntax() {
|
69
|
+
auto ctx = parser -> syntax();
|
70
|
+
|
71
|
+
SyntaxContextProxy proxy((ExpressParser::SyntaxContext*) ctx);
|
72
|
+
return detail::To_Ruby<SyntaxContextProxy>().convert(proxy);
|
73
|
+
}
|
14
74
|
|
15
|
-
|
16
|
-
|
17
|
-
|
75
|
+
Array getTokens() {
|
76
|
+
Array a;
|
77
|
+
for (auto token : tokens -> getTokens()) {
|
78
|
+
a.push(new TokenProxy(token));
|
79
|
+
}
|
80
|
+
return a;
|
81
|
+
}
|
82
|
+
|
83
|
+
Object visit(VisitorProxy* visitor) {
|
84
|
+
auto result = visitor -> visit(parser -> syntax());
|
85
|
+
|
86
|
+
lexer -> reset();
|
87
|
+
parser -> reset();
|
88
|
+
|
89
|
+
try {
|
90
|
+
return std::any_cast<Object>(result);
|
91
|
+
} catch(std::bad_cast) {
|
92
|
+
return Qnil;
|
93
|
+
}
|
94
|
+
}
|
95
|
+
|
96
|
+
private:
|
97
|
+
ANTLRInputStream* input;
|
98
|
+
ExpressLexer* lexer;
|
99
|
+
CommonTokenStream* tokens;
|
100
|
+
ExpressParser* parser;
|
101
|
+
};
|
18
102
|
|
19
|
-
return a;
|
20
|
-
}
|
21
103
|
|
22
104
|
CPP
|
23
105
|
end
|
24
106
|
|
25
|
-
def
|
26
|
-
i = parser_source_lines.index { |x| x ==
|
27
|
-
parser_source_lines[i] += <<~CPP.split("\n").map { |x| x == "" ? x : "
|
107
|
+
def create_class_api(parser_source_lines)
|
108
|
+
i = parser_source_lines.index { |x| x == " .define_method(\"visit\", &ParserProxy::visit, Return().keepAlive());" }
|
109
|
+
parser_source_lines[i] += <<~CPP.split("\n").map { |x| x == "" ? x : " #{x}" }.join("\n")
|
110
|
+
|
111
|
+
|
112
|
+
rb_cTokenExt = define_class_under<TokenProxy>(rb_mExpressParser, "TokenExt")
|
113
|
+
.define_method("text", &TokenProxy::getText)
|
114
|
+
.define_method("channel", &TokenProxy::getChannel)
|
115
|
+
.define_method("token_index", &TokenProxy::getTokenIndex);
|
116
|
+
|
117
|
+
rb_cParserExt = define_class_under<ParserProxyExt>(rb_mExpressParser, "ParserExt")
|
118
|
+
.define_constructor(Constructor<ParserProxyExt, Object, string>())
|
119
|
+
.define_method("syntax", &ParserProxyExt::syntax, Return().keepAlive())
|
120
|
+
.define_method("tokens", &ParserProxyExt::getTokens)
|
121
|
+
.define_method("visit", &ParserProxyExt::visit, Return().keepAlive());
|
28
122
|
|
29
|
-
.define_method("tokens", &ParserProxy::getTokens)
|
30
123
|
CPP
|
31
124
|
end
|
32
125
|
|
126
|
+
def generate_extended_parser
|
127
|
+
# Generate extended parser that provide Ruby access to token stream
|
128
|
+
parser_source_file = File.join("ext", "express-parser", "express_parser.cpp")
|
129
|
+
parser_source_lines = File.read(parser_source_file).split("\n")
|
130
|
+
create_class_declarations(parser_source_lines)
|
131
|
+
create_tp_class_definition(parser_source_lines)
|
132
|
+
create_pp_class_definition(parser_source_lines)
|
133
|
+
create_class_api(parser_source_lines)
|
134
|
+
File.write(parser_source_file, "#{parser_source_lines.join("\n")}\n")
|
135
|
+
end
|
136
|
+
|
33
137
|
desc "Generate parser (Usage: 'rake generate <grammar_file>')"
|
34
138
|
task "generate" do
|
35
139
|
grammar_file = ARGV[1]
|
@@ -38,7 +142,6 @@ task "generate" do
|
|
38
142
|
end
|
39
143
|
|
40
144
|
puts "Generating parser from '#{grammar_file}'"
|
41
|
-
|
42
145
|
# ANTLR does weird things if the grammar file isn't in the current working directory
|
43
146
|
temp_grammar_file = File.join(FileUtils.pwd, File.basename(grammar_file))
|
44
147
|
FileUtils.cp(grammar_file, temp_grammar_file)
|
@@ -51,13 +154,8 @@ task "generate" do
|
|
51
154
|
)
|
52
155
|
generator.generate
|
53
156
|
|
54
|
-
|
55
|
-
|
56
|
-
parser_source_lines = File.read(parser_source_file).split("\n")
|
57
|
-
create_tokens_api(parser_source_lines)
|
58
|
-
create_tokens_method(parser_source_lines)
|
59
|
-
File.write(parser_source_file, "#{parser_source_lines.join("\n")}\n")
|
60
|
-
|
157
|
+
puts "Generating extended parser"
|
158
|
+
generate_extended_parser
|
61
159
|
# cleanup
|
62
160
|
FileUtils.rm(temp_grammar_file)
|
63
161
|
end
|
@@ -5,6 +5,11 @@ RSpec.describe "Expressir" do
|
|
5
5
|
it "has a version number" do |example|
|
6
6
|
print "\n[#{example.description}] "
|
7
7
|
expect(Expressir::VERSION).not_to be nil
|
8
|
+
|
9
|
+
# Validate Object Space
|
10
|
+
GC.start
|
11
|
+
GC.verify_compaction_references
|
12
|
+
GC.verify_internal_consistency
|
8
13
|
end
|
9
14
|
|
10
15
|
it "displays the current verison" do |example|
|
@@ -12,6 +17,11 @@ RSpec.describe "Expressir" do
|
|
12
17
|
command = %w(version)
|
13
18
|
output = capture_stdout { Expressir::Cli.start(command) }
|
14
19
|
expect(output).to include("Version #{Expressir::VERSION}")
|
20
|
+
|
21
|
+
# Validate Object Space
|
22
|
+
GC.start
|
23
|
+
GC.verify_compaction_references
|
24
|
+
GC.verify_internal_consistency
|
15
25
|
end
|
16
26
|
end
|
17
27
|
end
|
@@ -24,6 +24,11 @@ RSpec.describe Expressir::Express::Cache do
|
|
24
24
|
temp_file.close
|
25
25
|
temp_file.unlink
|
26
26
|
end
|
27
|
+
|
28
|
+
# Validate Object Space
|
29
|
+
GC.start
|
30
|
+
GC.verify_compaction_references
|
31
|
+
GC.verify_internal_consistency
|
27
32
|
end
|
28
33
|
end
|
29
34
|
|
@@ -44,6 +49,11 @@ RSpec.describe Expressir::Express::Cache do
|
|
44
49
|
temp_file.close
|
45
50
|
temp_file.unlink
|
46
51
|
end
|
52
|
+
|
53
|
+
# Validate Object Space
|
54
|
+
GC.start
|
55
|
+
GC.verify_compaction_references
|
56
|
+
GC.verify_internal_consistency
|
47
57
|
end
|
48
58
|
|
49
59
|
it "fails parsing a file from a different Expressir version" do |example|
|
@@ -62,6 +72,11 @@ RSpec.describe Expressir::Express::Cache do
|
|
62
72
|
temp_file.close
|
63
73
|
temp_file.unlink
|
64
74
|
end
|
75
|
+
|
76
|
+
# Validate Object Space
|
77
|
+
GC.start
|
78
|
+
GC.verify_compaction_references
|
79
|
+
GC.verify_internal_consistency
|
65
80
|
end
|
66
81
|
end
|
67
82
|
end
|
@@ -19,6 +19,11 @@ RSpec.describe Expressir::Express::Formatter do
|
|
19
19
|
expected_result = File.read(formatted_exp_file)
|
20
20
|
|
21
21
|
expect(result).to eq(expected_result)
|
22
|
+
|
23
|
+
# Validate Object Space
|
24
|
+
GC.start
|
25
|
+
GC.verify_compaction_references
|
26
|
+
GC.verify_internal_consistency
|
22
27
|
end
|
23
28
|
|
24
29
|
it "exports an object (multiple.exp)" do |example|
|
@@ -33,6 +38,9 @@ RSpec.describe Expressir::Express::Formatter do
|
|
33
38
|
expected_result = File.read(formatted_exp_file)
|
34
39
|
|
35
40
|
expect(result).to eq(expected_result)
|
41
|
+
GC.start
|
42
|
+
GC.verify_compaction_references
|
43
|
+
GC.verify_internal_consistency
|
36
44
|
end
|
37
45
|
|
38
46
|
it "exports an object (remark.exp)" do |example|
|
@@ -47,6 +55,11 @@ RSpec.describe Expressir::Express::Formatter do
|
|
47
55
|
expected_result = File.read(formatted_exp_file)
|
48
56
|
|
49
57
|
expect(result).to eq(expected_result)
|
58
|
+
|
59
|
+
# Validate Object Space
|
60
|
+
GC.start
|
61
|
+
GC.verify_compaction_references
|
62
|
+
GC.verify_internal_consistency
|
50
63
|
end
|
51
64
|
|
52
65
|
it "exports an object (syntax.exp)" do |example|
|
@@ -61,6 +74,11 @@ RSpec.describe Expressir::Express::Formatter do
|
|
61
74
|
expected_result = File.read(formatted_exp_file)
|
62
75
|
|
63
76
|
expect(result).to eq(expected_result)
|
77
|
+
|
78
|
+
# Validate Object Space
|
79
|
+
GC.start
|
80
|
+
GC.verify_compaction_references
|
81
|
+
GC.verify_internal_consistency
|
64
82
|
end
|
65
83
|
|
66
84
|
it "exports an object with schema head formatter (syntax.exp)" do |example|
|
@@ -78,6 +96,11 @@ RSpec.describe Expressir::Express::Formatter do
|
|
78
96
|
expected_result = File.read(formatted_exp_file)
|
79
97
|
|
80
98
|
expect(result).to eq(expected_result)
|
99
|
+
|
100
|
+
# Validate Object Space
|
101
|
+
GC.start
|
102
|
+
GC.verify_compaction_references
|
103
|
+
GC.verify_internal_consistency
|
81
104
|
end
|
82
105
|
|
83
106
|
it "exports an object with hyperlink formatter (syntax.exp)" do |example|
|
@@ -95,6 +118,11 @@ RSpec.describe Expressir::Express::Formatter do
|
|
95
118
|
expected_result = File.read(formatted_exp_file)
|
96
119
|
|
97
120
|
expect(result).to eq(expected_result)
|
121
|
+
|
122
|
+
# Validate Object Space
|
123
|
+
GC.start
|
124
|
+
GC.verify_compaction_references
|
125
|
+
GC.verify_internal_consistency
|
98
126
|
end
|
99
127
|
|
100
128
|
it "exports an object with hyperlink formatter (multiple.exp)" do |example|
|
@@ -112,6 +140,11 @@ RSpec.describe Expressir::Express::Formatter do
|
|
112
140
|
expected_result = File.read(formatted_exp_file)
|
113
141
|
|
114
142
|
expect(result).to eq(expected_result)
|
143
|
+
|
144
|
+
# Validate Object Space
|
145
|
+
GC.start
|
146
|
+
GC.verify_compaction_references
|
147
|
+
GC.verify_internal_consistency
|
115
148
|
end
|
116
149
|
|
117
150
|
it "exports an object with schema head and hyperlink formatter (multiple.exp)" do |example|
|
@@ -130,6 +163,11 @@ RSpec.describe Expressir::Express::Formatter do
|
|
130
163
|
expected_result = File.read(formatted_exp_file)
|
131
164
|
|
132
165
|
expect(result).to eq(expected_result)
|
166
|
+
|
167
|
+
# Validate Object Space
|
168
|
+
GC.start
|
169
|
+
GC.verify_compaction_references
|
170
|
+
GC.verify_internal_consistency
|
133
171
|
end
|
134
172
|
end
|
135
173
|
end
|
@@ -15,6 +15,11 @@ RSpec.describe Expressir::Express::Parser do
|
|
15
15
|
expected_result = File.read(yaml_file)
|
16
16
|
|
17
17
|
expect(result).to eq(expected_result)
|
18
|
+
|
19
|
+
# Validate Object Space
|
20
|
+
GC.start
|
21
|
+
GC.verify_compaction_references
|
22
|
+
GC.verify_internal_consistency
|
18
23
|
end
|
19
24
|
|
20
25
|
it "parses a file (multiple.exp)" do |example|
|
@@ -28,6 +33,11 @@ RSpec.describe Expressir::Express::Parser do
|
|
28
33
|
expected_result = File.read(yaml_file)
|
29
34
|
|
30
35
|
expect(result).to eq(expected_result)
|
36
|
+
|
37
|
+
# Validate Object Space
|
38
|
+
GC.start
|
39
|
+
GC.verify_compaction_references
|
40
|
+
GC.verify_internal_consistency
|
31
41
|
end
|
32
42
|
|
33
43
|
it "parses a file (syntax.exp)" do |example|
|
@@ -41,6 +51,11 @@ RSpec.describe Expressir::Express::Parser do
|
|
41
51
|
expected_result = File.read(yaml_file)
|
42
52
|
|
43
53
|
expect(result).to eq(expected_result)
|
54
|
+
|
55
|
+
# Validate Object Space
|
56
|
+
GC.start
|
57
|
+
GC.verify_compaction_references
|
58
|
+
GC.verify_internal_consistency
|
44
59
|
end
|
45
60
|
|
46
61
|
it "parses a file (remark.exp)" do |example|
|
@@ -54,6 +69,11 @@ RSpec.describe Expressir::Express::Parser do
|
|
54
69
|
expected_result = File.read(yaml_file)
|
55
70
|
|
56
71
|
expect(result).to eq(expected_result)
|
72
|
+
|
73
|
+
# Validate Object Space
|
74
|
+
GC.start
|
75
|
+
GC.verify_compaction_references
|
76
|
+
GC.verify_internal_consistency
|
57
77
|
end
|
58
78
|
|
59
79
|
it "parses a file including original source (multiple.exp)" do |example|
|
@@ -74,6 +94,11 @@ RSpec.describe Expressir::Express::Parser do
|
|
74
94
|
stop_index = input.index("END_ENTITY;") + "END_ENTITY;".length - 1
|
75
95
|
expected_result = input[start_index..stop_index]
|
76
96
|
expect(entity.source).to eq(expected_result)
|
97
|
+
|
98
|
+
# Validate Object Space
|
99
|
+
GC.start
|
100
|
+
GC.verify_compaction_references
|
101
|
+
GC.verify_internal_consistency
|
77
102
|
end
|
78
103
|
end
|
79
104
|
|
@@ -99,6 +124,11 @@ RSpec.describe Expressir::Express::Parser do
|
|
99
124
|
expect(schemas[3].id).to eq("multiple_schema3")
|
100
125
|
expect(schemas[4].file).to eq(exp_files[1].to_s)
|
101
126
|
expect(schemas[4].id).to eq("multiple_schema4")
|
127
|
+
|
128
|
+
# Validate Object Space
|
129
|
+
GC.start
|
130
|
+
GC.verify_compaction_references
|
131
|
+
GC.verify_internal_consistency
|
102
132
|
end
|
103
133
|
end
|
104
134
|
end
|
@@ -17,6 +17,11 @@ RSpec.describe Expressir::Model::ModelElement do
|
|
17
17
|
expected_result = File.read(yaml_file)
|
18
18
|
|
19
19
|
expect(result).to eq(expected_result)
|
20
|
+
|
21
|
+
# Validate Object Space
|
22
|
+
GC.start
|
23
|
+
GC.verify_compaction_references
|
24
|
+
GC.verify_internal_consistency
|
20
25
|
end
|
21
26
|
end
|
22
27
|
|
@@ -32,6 +37,11 @@ RSpec.describe Expressir::Model::ModelElement do
|
|
32
37
|
expected_result = File.read(yaml_file)
|
33
38
|
|
34
39
|
expect(result).to eq(expected_result)
|
40
|
+
|
41
|
+
# Validate Object Space
|
42
|
+
GC.start
|
43
|
+
GC.verify_compaction_references
|
44
|
+
GC.verify_internal_consistency
|
35
45
|
end
|
36
46
|
|
37
47
|
it "parses an object (multiple.yaml)" do |example|
|
@@ -45,6 +55,11 @@ RSpec.describe Expressir::Model::ModelElement do
|
|
45
55
|
expected_result = File.read(yaml_file)
|
46
56
|
|
47
57
|
expect(result).to eq(expected_result)
|
58
|
+
|
59
|
+
# Validate Object Space
|
60
|
+
GC.start
|
61
|
+
GC.verify_compaction_references
|
62
|
+
GC.verify_internal_consistency
|
48
63
|
end
|
49
64
|
|
50
65
|
it "parses an object (syntax.yaml)" do |example|
|
@@ -58,6 +73,10 @@ RSpec.describe Expressir::Model::ModelElement do
|
|
58
73
|
expected_result = File.read(yaml_file)
|
59
74
|
|
60
75
|
expect(result).to eq(expected_result)
|
76
|
+
|
77
|
+
GC.start
|
78
|
+
GC.verify_compaction_references
|
79
|
+
GC.verify_internal_consistency
|
61
80
|
end
|
62
81
|
|
63
82
|
it "parses an object (remark.yaml)" do |example|
|
@@ -71,6 +90,11 @@ RSpec.describe Expressir::Model::ModelElement do
|
|
71
90
|
expected_result = File.read(yaml_file)
|
72
91
|
|
73
92
|
expect(result).to eq(expected_result)
|
93
|
+
|
94
|
+
# Validate Object Space
|
95
|
+
GC.start
|
96
|
+
GC.verify_compaction_references
|
97
|
+
GC.verify_internal_consistency
|
74
98
|
end
|
75
99
|
end
|
76
100
|
|
@@ -88,6 +112,11 @@ RSpec.describe Expressir::Model::ModelElement do
|
|
88
112
|
# schema scope
|
89
113
|
schema = repo.schemas.first
|
90
114
|
expect(schema.find("empty_entity")).to be_instance_of(Expressir::Model::Declarations::Entity)
|
115
|
+
|
116
|
+
# Validate Object Space
|
117
|
+
GC.start
|
118
|
+
GC.verify_compaction_references
|
119
|
+
GC.verify_internal_consistency
|
91
120
|
end
|
92
121
|
|
93
122
|
it "finds an object (multiple.exp)" do |example|
|
@@ -111,6 +140,11 @@ RSpec.describe Expressir::Model::ModelElement do
|
|
111
140
|
expect(schema.find("attribute_entity2")).to be_instance_of(Expressir::Model::Declarations::Entity)
|
112
141
|
expect(schema.find("attribute_entity3")).to be_instance_of(Expressir::Model::Declarations::Entity)
|
113
142
|
expect(schema.find("attribute_entity4")).to be_instance_of(Expressir::Model::Declarations::Entity)
|
143
|
+
|
144
|
+
# Validate Object Space
|
145
|
+
GC.start
|
146
|
+
GC.verify_compaction_references
|
147
|
+
GC.verify_internal_consistency
|
114
148
|
end
|
115
149
|
|
116
150
|
it "finds an object (syntax.exp)" do |example|
|
@@ -126,6 +160,11 @@ RSpec.describe Expressir::Model::ModelElement do
|
|
126
160
|
# schema scope
|
127
161
|
schema = repo.schemas.first
|
128
162
|
expect(schema.find("empty_entity")).to be_instance_of(Expressir::Model::Declarations::Entity)
|
163
|
+
|
164
|
+
# Validate Object Space
|
165
|
+
GC.start
|
166
|
+
GC.verify_compaction_references
|
167
|
+
GC.verify_internal_consistency
|
129
168
|
end
|
130
169
|
|
131
170
|
it "finds an object (remark.exp)" do |example|
|
@@ -269,6 +308,11 @@ RSpec.describe Expressir::Model::ModelElement do
|
|
269
308
|
expect(entity.find("remark_type.wr:WR1")).to be_instance_of(Expressir::Model::Declarations::WhereRule)
|
270
309
|
expect(entity.find("remark_type.IP1")).to be_instance_of(Expressir::Model::Declarations::RemarkItem)
|
271
310
|
expect(entity.find("remark_type.ip:IP1")).to be_instance_of(Expressir::Model::Declarations::RemarkItem)
|
311
|
+
|
312
|
+
# Validate Object Space
|
313
|
+
GC.start
|
314
|
+
GC.verify_compaction_references
|
315
|
+
GC.verify_internal_consistency
|
272
316
|
end
|
273
317
|
end
|
274
318
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: expressir
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.6
|
5
5
|
platform: x86_64-linux
|
6
6
|
authors:
|
7
7
|
- Ribose Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-05-
|
11
|
+
date: 2022-05-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|