defmastership 1.0.5 → 1.0.6

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.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -1
  3. data/bin/defmastership +21 -15
  4. data/cucumber.yml +1 -1
  5. data/defmastership.gemspec +12 -6
  6. data/features/changeref.feature +82 -129
  7. data/features/export.feature +88 -34
  8. data/features/modify.feature +143 -0
  9. data/features/rename_included_files.feature +121 -0
  10. data/lib/defmastership.rb +11 -3
  11. data/lib/defmastership/batch_modifier.rb +33 -0
  12. data/lib/defmastership/{ref_changer.rb → change_ref_line_modifier.rb} +18 -35
  13. data/lib/defmastership/change_ref_modifier.rb +15 -0
  14. data/lib/defmastership/constants.rb +14 -1
  15. data/lib/defmastership/csv_formatter.rb +15 -16
  16. data/lib/defmastership/csv_formatter_body.rb +11 -6
  17. data/lib/defmastership/csv_formatter_header.rb +11 -10
  18. data/lib/defmastership/definition.rb +11 -0
  19. data/lib/defmastership/definition_parser.rb +46 -0
  20. data/lib/defmastership/document.rb +43 -75
  21. data/lib/defmastership/filters.rb +30 -0
  22. data/lib/defmastership/line_modifier_base.rb +29 -0
  23. data/lib/defmastership/modifier_base.rb +29 -0
  24. data/lib/defmastership/rename_included_files_line_modifier.rb +126 -0
  25. data/lib/defmastership/rename_included_files_modifier.rb +30 -0
  26. data/lib/defmastership/version.rb +1 -1
  27. data/spec/spec_helper.rb +1 -0
  28. data/spec/unit/defmastership/batch_modifier_spec.rb +115 -0
  29. data/spec/unit/defmastership/{ref_changer_spec.rb → change_ref_line_modifier_spec.rb} +48 -26
  30. data/spec/unit/defmastership/change_ref_modifier_spec.rb +76 -0
  31. data/spec/unit/defmastership/comment_filter_spec.rb +8 -4
  32. data/spec/unit/defmastership/csv_formatter_body_spec.rb +61 -37
  33. data/spec/unit/defmastership/csv_formatter_header_spec.rb +46 -22
  34. data/spec/unit/defmastership/csv_formatter_spec.rb +65 -104
  35. data/spec/unit/defmastership/definition_parser_spec.rb +63 -0
  36. data/spec/unit/defmastership/definition_spec.rb +30 -4
  37. data/spec/unit/defmastership/document_spec.rb +112 -35
  38. data/spec/unit/defmastership/rename_included_files_line_modifier_spec.rb +203 -0
  39. data/spec/unit/defmastership/rename_included_files_modifier_spec.rb +67 -0
  40. metadata +34 -9
  41. data/lib/defmastership/batch_changer.rb +0 -41
  42. data/lib/defmastership/project_ref_changer.rb +0 -28
  43. data/spec/unit/defmastership/batch_changer_spec.rb +0 -109
  44. data/spec/unit/defmastership/project_ref_changer_spec.rb +0 -80
data/lib/defmastership.rb CHANGED
@@ -7,10 +7,18 @@ require('defmastership/version')
7
7
  # you just need to require this one file in your bin file
8
8
  require('defmastership/constants')
9
9
  require('defmastership/definition')
10
+ require('defmastership/definition_parser')
11
+ require('defmastership/filters')
10
12
  require('defmastership/document')
11
13
  require('defmastership/comment_filter')
12
14
  require('defmastership/csv_formatter')
13
15
 
14
- require('defmastership/ref_changer')
15
- require('defmastership/batch_changer')
16
- require('defmastership/project_ref_changer')
16
+ require('defmastership/modifier_base')
17
+ require('defmastership/line_modifier_base')
18
+ require('defmastership/batch_modifier')
19
+
20
+ require('defmastership/change_ref_modifier')
21
+ require('defmastership/change_ref_line_modifier')
22
+
23
+ require('defmastership/rename_included_files_modifier')
24
+ require('defmastership/rename_included_files_line_modifier')
@@ -0,0 +1,33 @@
1
+ # Copyright (c) 2020 Jerome Arbez-Gindre
2
+ # frozen_string_literal: true
3
+
4
+ module DefMastership
5
+ # Change references from temporary to definitive with multiple RefChangers
6
+ class BatchModifier
7
+ attr_reader :config, :adoc_texts, :changes
8
+
9
+ def initialize(config, adoc_texts)
10
+ @config = config
11
+ @adoc_texts = adoc_texts
12
+ @changes = []
13
+ end
14
+
15
+ def apply(modifs)
16
+ modifs.split(/\s*,\s*/).each do |modif|
17
+ modifier = modifier_from(modif)
18
+ @adoc_texts = modifier.do_modifications(@adoc_texts)
19
+ @config[modif.to_sym][:config] = modifier.config
20
+ modifier.changes.each do |change|
21
+ @changes << [modif] + change
22
+ end
23
+ end
24
+ end
25
+
26
+ private
27
+
28
+ def modifier_from(modif)
29
+ class_name = "#{@config[modif.to_sym][:type].split('_').map(&:capitalize).join}Modifier"
30
+ DefMastership.const_get(class_name).new(@config[modif.to_sym][:config])
31
+ end
32
+ end
33
+ end
@@ -2,12 +2,10 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module DefMastership
5
- # Change references from temporary to definitive
6
- class RefChanger
7
- attr_reader :changes
8
-
9
- def self.from_h(hash)
10
- new.from_h(hash)
5
+ # Change references from temporary to definitive with multiple RefChangers
6
+ class ChangeRefLineModifier < LineModifierBase
7
+ def self.from_config(hash)
8
+ new.from_config(hash)
11
9
  end
12
10
 
13
11
  REGEXP_FROM = {
@@ -24,32 +22,17 @@ module DefMastership
24
22
  private_constant :REGEXP_FROM
25
23
 
26
24
  def initialize
27
- @h = {
25
+ super
26
+ @config = {
28
27
  from_regexp: '',
29
28
  to_template: '',
30
29
  next_ref: 0
31
30
  }
32
- @changes = []
33
31
  @in_literal = false
34
32
  end
35
33
 
36
- def method_missing(method_name, *args, &block)
37
- return @h[method_name] if @h[method_name]
38
-
39
- super
40
- end
41
-
42
- def respond_to_missing?(method_name, *args)
43
- @h[method_name] || super
44
- end
45
-
46
- def from_h(hash)
47
- @h.merge!(hash)
48
- self
49
- end
50
-
51
- def to_h
52
- @h
34
+ def replace(method, line)
35
+ public_send("replace_#{method}".to_sym, line)
53
36
  end
54
37
 
55
38
  def replace_refdef(line)
@@ -70,6 +53,15 @@ module DefMastership
70
53
 
71
54
  private
72
55
 
56
+ def do_replace_refdef(line)
57
+ line.gsub(regexp_from(:definition, from_regexp)) do
58
+ replacement = to_template % hmerge(Regexp.last_match)
59
+ changes << [Regexp.last_match[:from], replacement]
60
+ @config[:next_ref] += 1
61
+ text_with(Regexp.last_match, replacement)
62
+ end
63
+ end
64
+
73
65
  def regexp_from(const, from)
74
66
  regexp_str =
75
67
  "(?<before>#{REGEXP_FROM[const][:before]})" \
@@ -83,21 +75,12 @@ module DefMastership
83
75
  end
84
76
 
85
77
  def hmerge(match)
86
- @h.merge(Hash[match.names.map(&:to_sym).zip(match.captures)])
78
+ @config.merge(match.names.map(&:to_sym).zip(match.captures).to_h)
87
79
  end
88
80
 
89
81
  def in_literal(line)
90
82
  @in_literal ^= true if line.chomp == '....'
91
83
  @in_literal
92
84
  end
93
-
94
- def do_replace_refdef(line)
95
- line.gsub(regexp_from(:definition, from_regexp)) do
96
- replacement = to_template % hmerge(Regexp.last_match)
97
- changes << [Regexp.last_match[:from], replacement]
98
- @h[:next_ref] += 1
99
- text_with(Regexp.last_match, replacement)
100
- end
101
- end
102
85
  end
103
86
  end
@@ -0,0 +1,15 @@
1
+ # Copyright (c) 2020 Jerome Arbez-Gindre
2
+ # frozen_string_literal: true
3
+
4
+ module DefMastership
5
+ # Change all refs of a given project
6
+ class ChangeRefModifier < ModifierBase
7
+ def replacements
8
+ %i[replace_refdef replace_irefs]
9
+ end
10
+
11
+ def line_modifier_class
12
+ ChangeRefLineModifier
13
+ end
14
+ end
15
+ end
@@ -19,8 +19,11 @@ module DefMastership
19
19
  \s*
20
20
  (,\s*\[\s*(?<labels>.*?)\s*\])?\s*\]
21
21
  AFT
22
+
23
+ DEF_CHECKSUM = '(\((?<explicit_checksum>[[:alnum:]]+)\))?'
24
+
22
25
  DEFINITION = Regexp.new(
23
- "#{DEF_BEFORE_REF}(?<reference>[\\w:_-]+)#{DEF_AFTER_REF}",
26
+ "#{DEF_BEFORE_REF}(?<reference>[\\w:_-]+)#{DEF_CHECKSUM}#{DEF_AFTER_REF}",
24
27
  Regexp::EXTENDED
25
28
  )
26
29
 
@@ -56,6 +59,16 @@ module DefMastership
56
59
 
57
60
  WHATEVER = //.freeze
58
61
 
62
+ INCLUDE_KEYWORD = '\binclude::'
63
+ INCLUDE_PATH = '(?<path>.*/)?'
64
+ INCLUDE_FILENAME = '(?<filename>[^\\/]+)'
65
+ INCLUDE_OPTIONS = '\[(?<options>[\]]*)\]'
66
+
67
+ INCLUDE = Regexp.new(
68
+ INCLUDE_KEYWORD + INCLUDE_PATH + INCLUDE_FILENAME + INCLUDE_OPTIONS,
69
+ Regexp::EXTENDED
70
+ )
71
+
59
72
  public_constant :SINGLE_LINE_COMMENT,
60
73
  :MULTI_LINE_COMMENT_DELIM,
61
74
  :DEF_BEFORE_REF,
@@ -8,36 +8,35 @@ require('defmastership/csv_formatter_body')
8
8
  module DefMastership
9
9
  # to export a CSV file
10
10
  class CSVFormatter
11
- COLUMN_LIST = %w[fixed labels eref iref attributes].freeze
12
- private_constant :COLUMN_LIST
11
+ COLUMN_LIST1 = %i[fixed wrong_explicit_checksum labels eref iref attributes].freeze
12
+ COLUMN_LIST2 = %i[fixed labels eref iref attributes].freeze
13
+ private_constant :COLUMN_LIST1
14
+ private_constant :COLUMN_LIST2
13
15
 
14
16
  def initialize(doc, sep = ',')
15
17
  @doc = doc
16
18
  @sep = sep
17
- @header_formatter = CSVFormatterHeader.new(@doc)
18
- @body_formatter = CSVFormatterBody.new(@doc)
19
19
  end
20
20
 
21
21
  def export_to(output_file)
22
+ column_list = @doc.wrong_explicit_checksum? ? COLUMN_LIST1 : COLUMN_LIST2
22
23
  CSV.open(output_file, 'w:ISO-8859-1', { col_sep: @sep }) do |csv|
23
- csv << header
24
- @doc.definitions.each { |definition| csv << body(definition) }
24
+ csv << header(column_list)
25
+ @doc.definitions.each { |definition| csv << body(definition, column_list) }
25
26
  end
26
27
  end
27
28
 
28
- def header
29
- header_line =
30
- COLUMN_LIST.map do |part|
31
- @header_formatter.public_send("#{part}_header".to_sym)
32
- end
29
+ private
30
+
31
+ def header(column_list)
32
+ header_formatter = CSVFormatterHeader.new(@doc)
33
+ header_line = column_list.map { |part| header_formatter.public_send(part) }
33
34
  header_line.reduce(:+)
34
35
  end
35
36
 
36
- def body(definition)
37
- body_line =
38
- COLUMN_LIST.map do |part|
39
- @body_formatter.public_send("#{part}_body".to_sym, definition)
40
- end
37
+ def body(definition, column_list)
38
+ body_formatter = CSVFormatterBody.new(@doc)
39
+ body_line = column_list.map { |part| body_formatter.public_send(part, definition) }
41
40
  body_line.reduce(:+)
42
41
  end
43
42
  end
@@ -10,23 +10,28 @@ module DefMastership
10
10
  @doc = doc
11
11
  end
12
12
 
13
- def fixed_body(definition)
14
- [definition.type, definition.reference, definition.value]
13
+ def fixed(definition)
14
+ [definition.type, definition.reference, definition.value, definition.sha256]
15
15
  end
16
16
 
17
- def labels_body(definition)
17
+ def wrong_explicit_checksum(definition)
18
+ wrong_explicit_checksum = definition.wrong_explicit_checksum
19
+ wrong_explicit_checksum ? [wrong_explicit_checksum] : ['']
20
+ end
21
+
22
+ def labels(definition)
18
23
  @doc.labels.empty? ? [] : [definition.labels.to_a.join("\n")]
19
24
  end
20
25
 
21
- def eref_body(definition)
26
+ def eref(definition)
22
27
  @doc.eref.map { |key, _| definition.eref[key].join("\n") }
23
28
  end
24
29
 
25
- def iref_body(definition)
30
+ def iref(definition)
26
31
  @doc.iref ? [definition.iref.join("\n")] : []
27
32
  end
28
33
 
29
- def attributes_body(definition)
34
+ def attributes(definition)
30
35
  @doc.attributes.map do |key, _|
31
36
  definition.attributes[key]
32
37
  end
@@ -10,26 +10,27 @@ module DefMastership
10
10
  @doc = doc
11
11
  end
12
12
 
13
- def fixed_header
14
- %w[Type Reference Value]
13
+ def fixed
14
+ %w[Type Reference Value sha256]
15
15
  end
16
16
 
17
- def labels_header
17
+ def wrong_explicit_checksum
18
+ @doc.wrong_explicit_checksum? ? ['Wrong explicit checksum'] : []
19
+ end
20
+
21
+ def labels
18
22
  @doc.labels.empty? ? [] : %w[Labels]
19
23
  end
20
24
 
21
- def eref_header
22
- @doc.eref.map do |_, ref|
23
- ref[:prefix] +
24
- (ref[:url].nil? || ref[:url] == 'none' ? '' : " #{ref[:url]}")
25
- end
25
+ def eref
26
+ @doc.eref.map { |_, ref| ref[:prefix] }
26
27
  end
27
28
 
28
- def iref_header
29
+ def iref
29
30
  @doc.iref ? ['Internal links'] : []
30
31
  end
31
32
 
32
- def attributes_header
33
+ def attributes
33
34
  @doc.attributes.map { |_, value| value }
34
35
  end
35
36
  end
@@ -1,6 +1,8 @@
1
1
  # Copyright (c) 2020 Jerome Arbez-Gindre
2
2
  # frozen_string_literal: true
3
3
 
4
+ require 'digest'
5
+
4
6
  module DefMastership
5
7
  # DefMastership definition: contains all data of a definition
6
8
  class Definition
@@ -16,6 +18,7 @@ module DefMastership
16
18
  @eref = Hash.new([])
17
19
  @iref = []
18
20
  @attributes = {}
21
+ @explicit_checksum = match[:explicit_checksum]
19
22
  end
20
23
 
21
24
  def <<(new_line)
@@ -27,6 +30,14 @@ module DefMastership
27
30
  @lines.join("\n")
28
31
  end
29
32
 
33
+ def sha256
34
+ Digest::SHA2.new(256).hexdigest(value).split(//).last(8).join
35
+ end
36
+
37
+ def wrong_explicit_checksum
38
+ @explicit_checksum if @explicit_checksum != sha256
39
+ end
40
+
30
41
  def add_eref(refname, extrefs)
31
42
  @eref[refname] = extrefs.strip.split(/\s*,\s*/)
32
43
  end
@@ -0,0 +1,46 @@
1
+ # Copyright (c) 2020 Jerome Arbez-Gindre
2
+ # frozen_string_literal: true
3
+
4
+ require('aasm')
5
+
6
+ module DefMastership
7
+ # DefMastership definition: contains all data of a definition
8
+ class DefinitionParser
9
+ include AASM
10
+
11
+ def initialize(document)
12
+ @document = document
13
+ end
14
+
15
+ aasm do
16
+ state :idle, initial: true
17
+ state :wait_content
18
+ state :in_block
19
+ state :single_para
20
+
21
+ event :new_definition do
22
+ transitions from: :idle, to: :wait_content, after: ->(*args) { @document.add_new_definition(*args) }
23
+ end
24
+
25
+ event :block_delimiter do
26
+ transitions from: :wait_content, to: :in_block
27
+ transitions from: %i[in_block idle single_para], to: :idle
28
+ end
29
+
30
+ event :new_line do
31
+ transitions from: %i[wait_content single_para],
32
+ to: :single_para,
33
+ after: ->(*args) { @document.add_line(*args) }
34
+ transitions from: :in_block,
35
+ to: :in_block,
36
+ after: ->(*args) { @document.add_line(*args) }
37
+ transitions from: :idle, to: :idle
38
+ end
39
+
40
+ event :empty_line do
41
+ transitions from: %i[wait_content single_para idle], to: :idle
42
+ transitions from: :in_block, to: :in_block
43
+ end
44
+ end
45
+ end
46
+ end
@@ -1,41 +1,11 @@
1
1
  # Copyright (c) 2020 Jerome Arbez-Gindre
2
2
  # frozen_string_literal: true
3
3
 
4
- require('aasm')
5
-
6
4
  module DefMastership
7
5
  # Contains the content of a DefMastership document: mainly definitions
8
- # TODO: make this class smaller by defining a separated parser
9
-
10
- # Contains regexp / action couples
11
- Filter = Struct.new(:regexp, :event, :consumed_line)
12
- private_constant :Filter
13
-
14
- FILTERS_IN_LITERAL = [
15
- Filter.new(DMRegexp::LITERAL_BLOCK, :code_block_delimiter, false),
16
- Filter.new(DMRegexp::WHATEVER, :new_line, true)
17
- ].freeze
18
- private_constant :FILTERS_IN_LITERAL
19
-
20
- FILTERS = [
21
- Filter.new(DMRegexp::VARIABLE_DEF, :new_variable_def, false),
22
- Filter.new(DMRegexp::VARIABLE_USE, :new_variable_use, false),
23
- Filter.new(DMRegexp::DEFINITION, :new_definition, true),
24
- Filter.new(DMRegexp::EREF_CONFIG, :new_eref_setup, true),
25
- Filter.new(DMRegexp::EREF_DEF, :new_eref_def, false),
26
- Filter.new(DMRegexp::IREF_DEF, :new_iref_def, false),
27
- Filter.new(DMRegexp::ATTR_CONFIG, :new_attribute_conf, true),
28
- Filter.new(DMRegexp::ATTR_SET, :new_attribute_value, false),
29
- Filter.new(DMRegexp::BLOCK, :block_delimiter, true),
30
- Filter.new(DMRegexp::LITERAL_BLOCK, :code_block_delimiter, true),
31
- Filter.new(DMRegexp::EMPTY_LINE, :empty_line, false),
32
- Filter.new(DMRegexp::WHATEVER, :new_line, true)
33
- ].freeze
34
- private_constant :FILTERS
35
6
 
36
7
  # Reflects document structure from a definition point of view
37
8
  class Document
38
- include AASM
39
9
  attr_reader :definitions, :labels, :eref, :iref, :attributes, :variables
40
10
 
41
11
  def initialize
@@ -45,110 +15,108 @@ module DefMastership
45
15
  @iref = false
46
16
  @attributes = {}
47
17
  @in_literal = true
48
- @current_line = nil
49
18
  @variables = {}
50
- end
51
-
52
- aasm do
53
- state :idle, initial: true
54
- state :wait_content
55
- state :in_block
56
- state :single_para
57
-
58
- event :new_definition do
59
- transitions from: :idle, to: :wait_content, after: :add_new_definition
60
- end
61
-
62
- event :block_delimiter do
63
- transitions from: :wait_content, to: :in_block
64
- transitions from: %i[in_block idle], to: :idle
65
- transitions from: :single_para, to: :idle
66
- end
67
19
 
68
- event :new_line do
69
- transitions from: :wait_content, to: :single_para, after: :add_line
70
- transitions from: :single_para, to: :single_para, after: :add_line
71
- transitions from: :in_block, to: :in_block, after: :add_line
72
- transitions from: :idle, to: :idle
73
- end
20
+ @definition_parser = DefinitionParser.new(self)
21
+ end
74
22
 
75
- event :empty_line do
76
- transitions from: %i[wait_content single_para idle], to: :idle
77
- transitions from: :in_block, to: :in_block
23
+ def wrong_explicit_checksum?
24
+ @definitions.reduce(false) do |res, definition|
25
+ res || !definition.wrong_explicit_checksum.nil?
78
26
  end
79
27
  end
80
28
 
81
- def code_block_delimiter(_match)
29
+ def code_block_delimiter(_match, line)
82
30
  @in_literal ^= true
31
+ line
83
32
  end
84
33
 
85
- def add_new_definition(match)
34
+ def add_new_definition(match, line)
86
35
  definition = Definition.new(match)
87
36
  @labels.merge(definition.labels)
88
37
  @definitions << definition
38
+ line
89
39
  end
90
40
 
91
- def add_line(_match)
92
- @definitions.last << @current_line
41
+ def add_line(_match, line)
42
+ @definitions.last << line
43
+ line
93
44
  end
94
45
 
95
- def new_eref_setup(match)
46
+ def new_eref_setup(match, line)
96
47
  @eref[match[:refname].to_sym] ||= {}
97
48
 
98
49
  @eref[match[:refname].to_sym][match[:symb].to_sym] =
99
50
  match[:value]
51
+ line
100
52
  end
101
53
 
102
- def new_eref_def(match)
54
+ def new_eref_def(match, line)
103
55
  @definitions.last.add_eref(
104
56
  match[:refname].to_sym,
105
57
  match[:extrefs]
106
58
  )
59
+ line
107
60
  end
108
61
 
109
- def new_iref_def(_match)
62
+ def new_iref_def(_match, line)
110
63
  @iref = true
111
- @current_line.scan(DMRegexp::IREF_DEF) do |_|
64
+ line.scan(DMRegexp::IREF_DEF) do |_|
112
65
  @definitions.last.add_iref(Regexp.last_match[:intref])
113
66
  end
67
+ line
114
68
  end
115
69
 
116
- def new_attribute_conf(match)
70
+ def new_attribute_conf(match, line)
117
71
  @attributes[match[:attr].to_sym] = match[:prefix]
72
+ line
118
73
  end
119
74
 
120
- def new_attribute_value(match)
75
+ def new_attribute_value(match, line)
121
76
  @definitions.last.set_attribute(
122
77
  match[:attr].to_sym,
123
78
  match[:value]
124
79
  )
80
+ line
125
81
  end
126
82
 
127
- def new_variable_def(match)
83
+ def new_variable_def(match, line)
128
84
  @variables[match[:varname].to_sym] = match[:value]
85
+ line
129
86
  end
130
87
 
131
- def new_variable_use(_match)
132
- @current_line.scan(DMRegexp::VARIABLE_USE) do |_|
88
+ def new_variable_use(_match, line)
89
+ new_line = line.dup
90
+ line.scan(DMRegexp::VARIABLE_USE) do |_|
133
91
  varname = Regexp.last_match[:varname]
134
92
  next if @variables[varname.to_sym].nil?
135
93
 
136
- @current_line = @current_line.gsub(
137
- "{#{varname}}", @variables[varname.to_sym]
138
- )
94
+ new_line.gsub!("{#{varname}}", @variables[varname.to_sym])
139
95
  end
96
+ new_line
140
97
  end
141
98
 
142
99
  def parse(lines)
143
100
  lines.reject(&:commented?).each do |line|
144
- @current_line = line
145
101
  (@in_literal ? FILTERS : FILTERS_IN_LITERAL).each do |filter|
146
102
  next unless line.match(filter.regexp)
147
103
 
148
- public_send(filter.event, Regexp.last_match)
104
+ line = generate_event(filter.event, Regexp.last_match, line)
105
+
149
106
  break if filter.consumed_line
150
107
  end
151
108
  end
152
109
  end
110
+
111
+ private
112
+
113
+ def generate_event(event, match, line)
114
+ if respond_to?(event)
115
+ line = public_send(event, match, line)
116
+ else
117
+ @definition_parser.public_send(event, match, line)
118
+ end
119
+ line
120
+ end
153
121
  end
154
122
  end