expressir 1.2.5-aarch64-linux → 1.2.6-aarch64-linux

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 29754234e47e9db9651b0a156e670667b0e7bd670685919bc5ef2a71e672e2b8
4
- data.tar.gz: 42d6b2bd9da41bfab0055fae8214c4c58a017b3a551f78c1e4f04657b3abde71
3
+ metadata.gz: '01769cae2fc1e22f5bb8e52524bf7d0a0285d105f85b34c98b5381bee71ac97e'
4
+ data.tar.gz: 33619ec66228a87dab43e3131fce3e3295a12836c67a8133d1f60c6275a8b8e7
5
5
  SHA512:
6
- metadata.gz: 17f9a5ba1d53bb9870ab53076474a15890f0d2c49f7f9ea10f6a5c211fc91d8bba5eef773f0d2c2647ac921324086ea6bd9df79387acd7d208cd39cdff59d3a2
7
- data.tar.gz: 331705f2327f8b82c925ddb22dba975ad90a85bd27ec864bcf4d8d2e13bf5867eeaf182eeb511719e8e9775a384724e3808c58657066cd29c6d0dba4b31d5344
6
+ metadata.gz: e60c3325e809f664d9cca4a5e47af6a19ea60ceb3648ff0ab5b65a37ba094ee3f5a2708fcf188b5fb8695ff9a1884541709790f1ba6d50e400376b80bcda6bf9
7
+ data.tar.gz: c4394cef99759fc793ee902ffe3724d96acf99f0b96a2acee877006f6080c173bfc28b556de7e510149b5a6b8a7218e754d95934ea5972f8dc48130a6b11e48a
@@ -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`:
@@ -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 netive (C++) extension
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 theu are not freed
40
- @parser = ::ExpressParser::Parser.parse(@input)
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)
@@ -1,3 +1,3 @@
1
1
  module Expressir
2
- VERSION = "1.2.5".freeze
2
+ VERSION = "1.2.6".freeze
3
3
  end
@@ -2,34 +2,138 @@ require "fileutils"
2
2
  require "antlr4-native"
3
3
  require "rake"
4
4
 
5
- def create_tokens_api(parser_source_lines)
6
- # - add ParserProxy tokens method, simple compensation for missing exposed BufferedTokenStream
7
- i = parser_source_lines.index { |x| x == " Object syntax() {" }
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
- Array getTokens() {
11
- Array a;
9
+ Class rb_cParserExt;
10
+ Class rb_cTokenExt;
12
11
 
13
- std::vector<Token*> tokens = this -> tokens -> getTokens();
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
- for (auto &token : tokens) {
16
- a.push(token);
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 create_tokens_method(parser_source_lines)
26
- i = parser_source_lines.index { |x| x == ' .define_method("syntax", &ParserProxy::syntax, Return().keepAlive())' }
27
- parser_source_lines[i] += <<~CPP.split("\n").map { |x| x == "" ? x : " #{x}" }.join("\n")
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
- # fix issues with generated parser
55
- parser_source_file = File.join("ext", "express-parser", "express_parser.cpp")
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
@@ -14,4 +14,11 @@ RSpec.configure do |config|
14
14
  config.expect_with :rspec do |c|
15
15
  c.syntax = :expect
16
16
  end
17
+
18
+ config.around(:example) do |ex|
19
+ ex.run
20
+ rescue SystemExit => e
21
+ puts "Got SystemExit: #{e.inspect}."
22
+ raise
23
+ end
17
24
  end
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.5
4
+ version: 1.2.6
5
5
  platform: aarch64-linux
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-05-17 00:00:00.000000000 Z
11
+ date: 2022-05-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor