rley 0.7.07 → 0.7.08

Sign up to get free protection for your applications and to get access to all the features.
Files changed (139) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +348 -54
  3. data/LICENSE.txt +1 -1
  4. data/README.md +3 -2
  5. data/examples/NLP/engtagger.rb +193 -190
  6. data/examples/NLP/nano_eng/nano_grammar.rb +5 -5
  7. data/examples/data_formats/JSON/cli_options.rb +1 -1
  8. data/examples/data_formats/JSON/json_ast_builder.rb +12 -9
  9. data/examples/data_formats/JSON/json_ast_nodes.rb +12 -21
  10. data/examples/data_formats/JSON/json_grammar.rb +2 -2
  11. data/examples/data_formats/JSON/json_lexer.rb +8 -8
  12. data/examples/data_formats/JSON/json_minifier.rb +1 -1
  13. data/examples/general/calc_iter1/calc_ast_builder.rb +13 -10
  14. data/examples/general/calc_iter1/calc_ast_nodes.rb +23 -37
  15. data/examples/general/calc_iter1/calc_grammar.rb +2 -2
  16. data/examples/general/calc_iter1/calc_lexer.rb +6 -4
  17. data/examples/general/calc_iter1/spec/calculator_spec.rb +5 -5
  18. data/examples/general/calc_iter2/calc_ast_builder.rb +5 -3
  19. data/examples/general/calc_iter2/calc_ast_nodes.rb +27 -43
  20. data/examples/general/calc_iter2/calc_grammar.rb +3 -3
  21. data/examples/general/calc_iter2/calc_lexer.rb +11 -10
  22. data/examples/general/calc_iter2/spec/calculator_spec.rb +26 -26
  23. data/examples/general/left.rb +2 -2
  24. data/examples/general/right.rb +2 -2
  25. data/lib/rley/base/dotted_item.rb +23 -31
  26. data/lib/rley/constants.rb +2 -2
  27. data/lib/rley/engine.rb +20 -23
  28. data/lib/rley/formatter/asciitree.rb +3 -3
  29. data/lib/rley/formatter/bracket_notation.rb +1 -8
  30. data/lib/rley/formatter/debug.rb +6 -6
  31. data/lib/rley/formatter/json.rb +2 -2
  32. data/lib/rley/gfg/call_edge.rb +1 -1
  33. data/lib/rley/gfg/edge.rb +5 -5
  34. data/lib/rley/gfg/end_vertex.rb +2 -6
  35. data/lib/rley/gfg/epsilon_edge.rb +1 -5
  36. data/lib/rley/gfg/grm_flow_graph.rb +27 -23
  37. data/lib/rley/gfg/item_vertex.rb +10 -10
  38. data/lib/rley/gfg/non_terminal_vertex.rb +4 -4
  39. data/lib/rley/gfg/scan_edge.rb +1 -1
  40. data/lib/rley/gfg/shortcut_edge.rb +2 -2
  41. data/lib/rley/gfg/start_vertex.rb +4 -8
  42. data/lib/rley/gfg/vertex.rb +43 -39
  43. data/lib/rley/lexical/token_range.rb +6 -6
  44. data/lib/rley/parse_forest_visitor.rb +5 -5
  45. data/lib/rley/parse_rep/ast_base_builder.rb +9 -11
  46. data/lib/rley/parse_rep/cst_builder.rb +5 -6
  47. data/lib/rley/parse_rep/parse_forest_builder.rb +20 -18
  48. data/lib/rley/parse_rep/parse_forest_factory.rb +3 -3
  49. data/lib/rley/parse_rep/parse_rep_creator.rb +11 -13
  50. data/lib/rley/parse_rep/parse_tree_builder.rb +4 -4
  51. data/lib/rley/parse_rep/parse_tree_factory.rb +27 -27
  52. data/lib/rley/parse_tree_visitor.rb +1 -1
  53. data/lib/rley/parser/error_reason.rb +4 -5
  54. data/lib/rley/parser/gfg_chart.rb +20 -22
  55. data/lib/rley/parser/gfg_parsing.rb +16 -30
  56. data/lib/rley/parser/parse_entry.rb +25 -31
  57. data/lib/rley/parser/parse_entry_set.rb +18 -15
  58. data/lib/rley/parser/parse_entry_tracker.rb +4 -4
  59. data/lib/rley/parser/parse_state.rb +16 -21
  60. data/lib/rley/parser/parse_state_tracker.rb +4 -4
  61. data/lib/rley/parser/parse_tracer.rb +13 -13
  62. data/lib/rley/parser/parse_walker_factory.rb +23 -28
  63. data/lib/rley/parser/state_set.rb +9 -10
  64. data/lib/rley/ptree/non_terminal_node.rb +7 -5
  65. data/lib/rley/ptree/parse_tree.rb +3 -3
  66. data/lib/rley/ptree/parse_tree_node.rb +5 -5
  67. data/lib/rley/ptree/terminal_node.rb +7 -7
  68. data/lib/rley/rley_error.rb +12 -12
  69. data/lib/rley/sppf/alternative_node.rb +6 -6
  70. data/lib/rley/sppf/composite_node.rb +7 -7
  71. data/lib/rley/sppf/epsilon_node.rb +3 -3
  72. data/lib/rley/sppf/leaf_node.rb +3 -3
  73. data/lib/rley/sppf/parse_forest.rb +16 -16
  74. data/lib/rley/sppf/sppf_node.rb +7 -8
  75. data/lib/rley/sppf/token_node.rb +3 -3
  76. data/lib/rley/syntax/grammar.rb +5 -5
  77. data/lib/rley/syntax/grammar_builder.rb +9 -9
  78. data/lib/rley/syntax/grm_symbol.rb +6 -6
  79. data/lib/rley/syntax/non_terminal.rb +9 -15
  80. data/lib/rley/syntax/production.rb +10 -10
  81. data/lib/rley/syntax/symbol_seq.rb +7 -9
  82. data/lib/rley/syntax/terminal.rb +4 -5
  83. data/lib/rley/syntax/verbatim_symbol.rb +3 -3
  84. data/lib/support/base_tokenizer.rb +19 -18
  85. data/spec/rley/base/dotted_item_spec.rb +2 -2
  86. data/spec/rley/engine_spec.rb +17 -15
  87. data/spec/rley/formatter/asciitree_spec.rb +7 -7
  88. data/spec/rley/formatter/bracket_notation_spec.rb +13 -13
  89. data/spec/rley/formatter/json_spec.rb +1 -1
  90. data/spec/rley/gfg/end_vertex_spec.rb +5 -5
  91. data/spec/rley/gfg/item_vertex_spec.rb +10 -10
  92. data/spec/rley/gfg/non_terminal_vertex_spec.rb +3 -3
  93. data/spec/rley/gfg/shortcut_edge_spec.rb +1 -1
  94. data/spec/rley/gfg/start_vertex_spec.rb +5 -5
  95. data/spec/rley/gfg/vertex_spec.rb +3 -3
  96. data/spec/rley/lexical/token_range_spec.rb +16 -16
  97. data/spec/rley/lexical/token_spec.rb +2 -2
  98. data/spec/rley/parse_forest_visitor_spec.rb +165 -163
  99. data/spec/rley/parse_rep/ambiguous_parse_spec.rb +44 -44
  100. data/spec/rley/parse_rep/ast_builder_spec.rb +6 -6
  101. data/spec/rley/parse_rep/cst_builder_spec.rb +5 -5
  102. data/spec/rley/parse_rep/groucho_spec.rb +21 -21
  103. data/spec/rley/parse_rep/parse_forest_builder_spec.rb +26 -26
  104. data/spec/rley/parse_rep/parse_forest_factory_spec.rb +6 -6
  105. data/spec/rley/parse_rep/parse_tree_factory_spec.rb +2 -2
  106. data/spec/rley/parse_tree_visitor_spec.rb +10 -8
  107. data/spec/rley/parser/error_reason_spec.rb +6 -6
  108. data/spec/rley/parser/gfg_earley_parser_spec.rb +4 -2
  109. data/spec/rley/parser/gfg_parsing_spec.rb +4 -8
  110. data/spec/rley/parser/parse_entry_spec.rb +19 -19
  111. data/spec/rley/parser/parse_state_spec.rb +5 -5
  112. data/spec/rley/parser/parse_walker_factory_spec.rb +1 -1
  113. data/spec/rley/parser/state_set_spec.rb +22 -22
  114. data/spec/rley/ptree/non_terminal_node_spec.rb +5 -3
  115. data/spec/rley/ptree/parse_tree_node_spec.rb +4 -4
  116. data/spec/rley/ptree/terminal_node_spec.rb +6 -6
  117. data/spec/rley/sppf/alternative_node_spec.rb +6 -6
  118. data/spec/rley/sppf/non_terminal_node_spec.rb +3 -3
  119. data/spec/rley/sppf/token_node_spec.rb +4 -4
  120. data/spec/rley/support/ambiguous_grammar_helper.rb +3 -4
  121. data/spec/rley/support/grammar_abc_helper.rb +2 -4
  122. data/spec/rley/support/grammar_ambig01_helper.rb +4 -5
  123. data/spec/rley/support/grammar_arr_int_helper.rb +4 -5
  124. data/spec/rley/support/grammar_b_expr_helper.rb +4 -5
  125. data/spec/rley/support/grammar_l0_helper.rb +10 -11
  126. data/spec/rley/support/grammar_pb_helper.rb +6 -5
  127. data/spec/rley/support/grammar_sppf_helper.rb +1 -1
  128. data/spec/rley/syntax/grammar_builder_spec.rb +5 -5
  129. data/spec/rley/syntax/grammar_spec.rb +6 -6
  130. data/spec/rley/syntax/grm_symbol_spec.rb +1 -1
  131. data/spec/rley/syntax/non_terminal_spec.rb +8 -8
  132. data/spec/rley/syntax/production_spec.rb +13 -13
  133. data/spec/rley/syntax/symbol_seq_spec.rb +2 -2
  134. data/spec/rley/syntax/terminal_spec.rb +5 -5
  135. data/spec/rley/syntax/verbatim_symbol_spec.rb +1 -1
  136. data/spec/spec_helper.rb +0 -12
  137. data/spec/support/base_tokenizer_spec.rb +7 -2
  138. metadata +21 -62
  139. data/.simplecov +0 -8
@@ -20,7 +20,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
20
20
  expect(subject.name).to eq(sample_name)
21
21
  end
22
22
  end # context
23
-
23
+
24
24
  context 'Provided services:' do
25
25
  it 'should give its text representation' do
26
26
  expect(subject.to_s).to eq(sample_name)
@@ -19,28 +19,28 @@ module Rley # Open this namespace to avoid module qualifier prefixes
19
19
  it 'should know its name' do
20
20
  expect(subject.name).to eq(sample_name)
21
21
  end
22
-
22
+
23
23
  it 'should know that is a not a terminal' do
24
24
  expect(subject).not_to be_terminal
25
25
  end
26
26
  end # context
27
27
 
28
-
29
- context 'Provided services:' do
28
+
29
+ context 'Provided services:' do
30
30
  it 'should know whether it is nullable' do
31
31
  expect(subject.nullable?).to be_nil
32
32
  subject.nullable = true
33
33
  expect(subject).to be_nullable
34
34
  subject.nullable = false
35
- expect(subject).not_to be_nullable
35
+ expect(subject).not_to be_nullable
36
36
  end
37
-
37
+
38
38
  it 'should know whether it is defined' do
39
39
  expect(subject.undefined?).to be_nil
40
40
  subject.undefined = true
41
41
  expect(subject).to be_undefined
42
42
  subject.undefined = false
43
- expect(subject).not_to be_undefined
43
+ expect(subject).not_to be_undefined
44
44
  end
45
45
 
46
46
  it 'should know whether it is generative' do
@@ -48,8 +48,8 @@ module Rley # Open this namespace to avoid module qualifier prefixes
48
48
  subject.generative = true
49
49
  expect(subject).to be_generative
50
50
  subject.generative = false
51
- expect(subject).not_to be_generative
52
- end
51
+ expect(subject).not_to be_generative
52
+ end
53
53
  end # context
54
54
  end # describe
55
55
  end # module
@@ -24,11 +24,11 @@ module Rley # Open this namespace to avoid module qualifier prefixes
24
24
  it 'should be created with a non-terminal and a symbol sequence' do
25
25
  expect { Production.new(sentence, sequence) }.not_to raise_error
26
26
  end
27
-
27
+
28
28
  it 'should complain when its rhs is nil' do
29
29
  err = StandardError
30
30
  msg_prefix = 'Right side of a production of the kind '
31
- msg_suffix = "'Sentence' => ... is nil."
31
+ msg_suffix = "'Sentence' => ... is nil."
32
32
  msg = msg_prefix + msg_suffix
33
33
  expect { Production.new(sentence, nil) }.to raise_error(err, msg)
34
34
  end
@@ -49,42 +49,42 @@ module Rley # Open this namespace to avoid module qualifier prefixes
49
49
  instance = Production.new(sentence, [])
50
50
  expect(instance).to be_empty
51
51
  end
52
-
52
+
53
53
  it 'should be anonymous at creation' do
54
54
  expect(subject.name).to be_nil
55
55
  end
56
-
56
+
57
57
  it 'should complain if its lhs is not a non-terminal' do
58
58
  err = StandardError
59
59
  msg_prefix = 'Left side of production must be a non-terminal symbol'
60
- msg_suffix = ", found a #{String} instead."
60
+ msg_suffix = ", found a #{String} instead."
61
61
  msg = msg_prefix + msg_suffix
62
62
  expect { Production.new('wrong', sequence) }.to raise_error(err, msg)
63
63
  end
64
64
  end # context
65
-
65
+
66
66
  context 'Provided services:' do
67
67
  it 'should accept a name (i)' do
68
68
  a_name = 'nominem'
69
69
  subject.name = a_name
70
70
  expect(subject.name).to eq(a_name)
71
71
  end
72
-
72
+
73
73
  it 'should accept a name (ii)' do
74
74
  a_name = 'nominem'
75
75
  subject.as(a_name)
76
- expect(subject.name).to eq(a_name)
76
+ expect(subject.name).to eq(a_name)
77
77
  end
78
-
78
+
79
79
  it 'should provide human-readable representation of itself' do
80
80
  subject.name = 'some name'
81
81
  prefix = /^#<Rley::Syntax::Production:\d+ @name="some name"/
82
82
  expect(subject.inspect).to match(prefix)
83
- pattern = /@lhs=Sentence @rhs=#<Rley::Syntax::SymbolSeq/
83
+ pattern = /@lhs=Sentence @rhs=#<Rley::Syntax::SymbolSeq/
84
84
  expect(subject.inspect).to match(pattern)
85
- suffix = /> @generative=>$/
86
- expect(subject.inspect).to match(suffix)
87
- end
85
+ suffix = /> @generative=>$/
86
+ expect(subject.inspect).to match(suffix)
87
+ end
88
88
  end # context
89
89
  end # describe
90
90
  end # module
@@ -57,13 +57,13 @@ module Rley # Open this namespace to avoid module qualifier prefixes
57
57
  unequal_one = SymbolSeq.new([verb, pp, np])
58
58
  expect(subject == unequal_one).not_to eq(true)
59
59
  end
60
-
60
+
61
61
  it 'should complain when unable to compare' do
62
62
  err = StandardError
63
63
  msg = 'Cannot compare a SymbolSeq with a String'
64
64
  expect { subject == 'dummy-text' }.to raise_error(err, msg)
65
65
  end
66
-
66
+
67
67
  it 'should provide human-readable representation of itself' do
68
68
  suffix = /::SymbolSeq:\d+ @members=\["Verb", "NP", "PP"\]>$/
69
69
  expect(subject.inspect).to match(suffix)
@@ -19,18 +19,18 @@ module Rley # Open this namespace to avoid module qualifier prefixes
19
19
  it 'should know its name' do
20
20
  expect(subject.name).to eq(sample_name)
21
21
  end
22
-
22
+
23
23
  it 'should know that is a terminal symbol' do
24
24
  expect(subject).to be_terminal
25
- end
26
-
25
+ end
26
+
27
27
  it "should know that isn't nullable" do
28
28
  expect(subject).not_to be_nullable
29
29
  end
30
-
30
+
31
31
  it 'should know that it is generative' do
32
32
  expect(subject).to be_generative
33
- end
33
+ end
34
34
  end # context
35
35
  end # describe
36
36
  end # module
@@ -24,7 +24,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
24
24
  expect(subject.text).to eq(sample_name)
25
25
  end
26
26
  end # context
27
-
27
+
28
28
  context 'Provided services:' do
29
29
  it 'should give its text representation' do
30
30
  expected = "'#{sample_name}'"
data/spec/spec_helper.rb CHANGED
@@ -3,18 +3,6 @@
3
3
  # File: spec_helper.rb
4
4
  # Purpose: utility file that is loaded by all our RSpec files
5
5
 
6
- require 'simplecov'
7
- require 'coveralls'
8
-
9
- Coveralls.wear!
10
-
11
- SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new(
12
- [
13
- SimpleCov::Formatter::HTMLFormatter,
14
- Coveralls::SimpleCov::Formatter
15
- ]
16
- )
17
-
18
6
  require 'pp' # Use pretty-print for debugging purposes
19
7
  require 'rspec' # Use the RSpec framework
20
8
 
@@ -25,6 +25,8 @@ describe BaseTokenizer do
25
25
 
26
26
 
27
27
  context 'Provided services:' do
28
+ # Simplistic tokenizer.
29
+ # rubocop: disable Lint/ConstantDefinitionInBlock
28
30
  class PB_Tokenizer < BaseTokenizer
29
31
  @@lexeme2name = {
30
32
  '(' => 'LPAREN',
@@ -34,8 +36,9 @@ describe BaseTokenizer do
34
36
 
35
37
  protected
36
38
 
37
- def recognize_token()
38
- if (lexeme = scanner.scan(/[\(\)]/)) # Single characters
39
+ # rubocop: disable Lint/DuplicateBranch
40
+ def recognize_token
41
+ if (lexeme = scanner.scan(/[()]/)) # Single characters
39
42
  # Delimiters, separators => single character token
40
43
  build_token(@@lexeme2name[lexeme], lexeme)
41
44
  elsif (lexeme = scanner.scan(/(?:\+)(?=\s)/)) # Isolated char
@@ -44,7 +47,9 @@ describe BaseTokenizer do
44
47
  build_token('int', lexeme)
45
48
  end
46
49
  end
50
+ # rubocop: enable Lint/DuplicateBranch
47
51
  end # class
52
+ # rubocop: enable Lint/ConstantDefinitionInBlock
48
53
 
49
54
  # Basic tokenizer
50
55
  # @return [Array<Rley::Lexical::Token>]
metadata CHANGED
@@ -1,115 +1,75 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rley
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.07
4
+ version: 0.7.08
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dimitri Geshef
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-10-16 00:00:00.000000000 Z
11
+ date: 2021-05-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: coveralls
14
+ name: rake
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: 0.7.0
20
17
  - - "~>"
21
18
  - !ruby/object:Gem::Version
22
- version: '0.7'
23
- type: :development
24
- prerelease: false
25
- version_requirements: !ruby/object:Gem::Requirement
26
- requirements:
27
- - - ">="
28
- - !ruby/object:Gem::Version
29
- version: 0.7.0
30
- - - "~>"
31
- - !ruby/object:Gem::Version
32
- version: '0.7'
33
- - !ruby/object:Gem::Dependency
34
- name: rake
35
- requirement: !ruby/object:Gem::Requirement
36
- requirements:
19
+ version: '10.0'
37
20
  - - ">="
38
21
  - !ruby/object:Gem::Version
39
22
  version: 10.0.0
40
- - - "~>"
41
- - !ruby/object:Gem::Version
42
- version: '10.0'
43
23
  type: :development
44
24
  prerelease: false
45
25
  version_requirements: !ruby/object:Gem::Requirement
46
26
  requirements:
47
- - - ">="
48
- - !ruby/object:Gem::Version
49
- version: 10.0.0
50
27
  - - "~>"
51
28
  - !ruby/object:Gem::Version
52
29
  version: '10.0'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 10.0.0
53
33
  - !ruby/object:Gem::Dependency
54
34
  name: rspec
55
35
  requirement: !ruby/object:Gem::Requirement
56
36
  requirements:
57
- - - ">="
58
- - !ruby/object:Gem::Version
59
- version: 3.5.0
60
37
  - - "~>"
61
38
  - !ruby/object:Gem::Version
62
39
  version: '3.5'
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 3.5.0
63
43
  type: :development
64
44
  prerelease: false
65
45
  version_requirements: !ruby/object:Gem::Requirement
66
46
  requirements:
67
- - - ">="
68
- - !ruby/object:Gem::Version
69
- version: 3.5.0
70
47
  - - "~>"
71
48
  - !ruby/object:Gem::Version
72
49
  version: '3.5'
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 3.5.0
73
53
  - !ruby/object:Gem::Dependency
74
54
  name: rubygems
75
55
  requirement: !ruby/object:Gem::Requirement
76
56
  requirements:
77
- - - ">="
78
- - !ruby/object:Gem::Version
79
- version: 2.0.0
80
57
  - - "~>"
81
58
  - !ruby/object:Gem::Version
82
59
  version: '2.0'
83
- type: :development
84
- prerelease: false
85
- version_requirements: !ruby/object:Gem::Requirement
86
- requirements:
87
60
  - - ">="
88
61
  - !ruby/object:Gem::Version
89
62
  version: 2.0.0
90
- - - "~>"
91
- - !ruby/object:Gem::Version
92
- version: '2.0'
93
- - !ruby/object:Gem::Dependency
94
- name: simplecov
95
- requirement: !ruby/object:Gem::Requirement
96
- requirements:
97
- - - ">="
98
- - !ruby/object:Gem::Version
99
- version: 0.1.0
100
- - - "~>"
101
- - !ruby/object:Gem::Version
102
- version: '0.1'
103
63
  type: :development
104
64
  prerelease: false
105
65
  version_requirements: !ruby/object:Gem::Requirement
106
66
  requirements:
107
- - - ">="
108
- - !ruby/object:Gem::Version
109
- version: 0.1.0
110
67
  - - "~>"
111
68
  - !ruby/object:Gem::Version
112
- version: '0.1'
69
+ version: '2.0'
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: 2.0.0
113
73
  description: A general parser using the Earley algorithm.
114
74
  email: famished.tiger@yahoo.com
115
75
  executables: []
@@ -120,7 +80,6 @@ files:
120
80
  - ".rspec"
121
81
  - ".rubocop.yml"
122
82
  - ".ruby-gemset"
123
- - ".simplecov"
124
83
  - ".travis.yml"
125
84
  - ".yardopts"
126
85
  - CHANGELOG.md
@@ -307,15 +266,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
307
266
  requirements:
308
267
  - - ">="
309
268
  - !ruby/object:Gem::Version
310
- version: 2.4.0
269
+ version: 2.5.0
311
270
  required_rubygems_version: !ruby/object:Gem::Requirement
312
271
  requirements:
313
272
  - - ">="
314
273
  - !ruby/object:Gem::Version
315
274
  version: '0'
316
275
  requirements: []
317
- rubygems_version: 3.0.3
318
- signing_key:
276
+ rubygems_version: 3.1.4
277
+ signing_key:
319
278
  specification_version: 4
320
279
  summary: Ruby implementation of the Earley's parsing algorithm
321
280
  test_files:
data/.simplecov DELETED
@@ -1,8 +0,0 @@
1
- # frozen_string_literal: true
2
- # .simplecov
3
- # Configuration
4
-
5
- SimpleCov.start do
6
- # Remove all files that match /spec/ in their path
7
- add_filter '/spec/'
8
- end