truth_serum 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 11bd5ca743bdf3ff58d3fe304596c2c829dbaac0
4
- data.tar.gz: 537bee9e6d7db49485e6479ce3ea7a0c1fa441a6
3
+ metadata.gz: 5e8f73535a864ae7b2e8bc1dc32fbe4d8d648cb6
4
+ data.tar.gz: 63f502f8255d3f70f9bf5f5f995bb8a68dd637a2
5
5
  SHA512:
6
- metadata.gz: bc5d5395ca20932ca664ad57956601ecb2f47241cb234f09930e5cb5d829c0e79457a9202350c70634d1dd0ec20dbd83445590a6d2d40187ff743367b7ab86c3
7
- data.tar.gz: 788837b9491cac7588a831effbd022c44e961ac328fbc37e351f5d5713f19927157cb362a50700cba7df4a0a616b12c06f108dcb2cbb7872c34987b56e3ff3ff
6
+ metadata.gz: 2818668ee316717a212eb5abe168b17c352a8a48f57f3b24b7977144aaa17b448283185508bb3293eb1f253dd2b9eb4e749faab0eb654996e80162965d408312
7
+ data.tar.gz: 6cfd62269b1512650028befc0011c169ba605a9c5b4c23121254599edb0c2f097a8e0a57a35a54fe0519a65db6ce10dd66ed66e0b1ab6384878e816446ff8979
data/.rubocop.yml ADDED
@@ -0,0 +1,24 @@
1
+ ---
2
+ Metrics/AbcSize:
3
+ Max: 20
4
+ Metrics/ClassLength:
5
+ Max: 200
6
+ Metrics/LineLength:
7
+ Enabled: false
8
+ Metrics/MethodLength:
9
+ Max: 20
10
+ Style/Documentation:
11
+ Enabled: false
12
+ Style/HashSyntax:
13
+ Style: no_mixed_keys
14
+ Exclude:
15
+ - 'Rakefile'
16
+ Style/EmptyCaseCondition:
17
+ Enabled: false
18
+ Style/ParallelAssignment:
19
+ Enabled: false
20
+ Style/NumericPredicate:
21
+ Enabled: false
22
+ Style/WhileUntilModifier:
23
+ Enabled: false
24
+
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.3.1
1
+ 2.4.0
data/Gemfile CHANGED
@@ -1,2 +1,3 @@
1
+ # frozen_string_literal: true
1
2
  source 'https://rubygems.org'
2
3
  gemspec
data/Guardfile CHANGED
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  clearing :on
2
3
 
3
4
  guard :minitest do
data/Rakefile CHANGED
@@ -1,9 +1,10 @@
1
- require "bundler/gem_tasks"
2
- require "rake/testtask"
1
+ # frozen_string_literal: true
2
+ require 'bundler/gem_tasks'
3
+ require 'rake/testtask'
3
4
 
4
5
  Rake::TestTask.new(:test) do |t|
5
- t.libs << "test"
6
- t.libs << "lib"
6
+ t.libs << 'test'
7
+ t.libs << 'lib'
7
8
  t.test_files = FileList['test/**/*_test.rb']
8
9
  end
9
10
 
data/bin/console CHANGED
@@ -1,7 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
- require "bundler/setup"
4
- require "truth_serum"
4
+ require 'bundler/setup'
5
+ require 'truth_serum'
5
6
 
6
7
  # You can add fixtures and/or initialization code here to make experimenting
7
8
  # with your gem easier. You can also use a different console, if you like.
@@ -10,5 +11,5 @@ require "truth_serum"
10
11
  # require "pry"
11
12
  # Pry.start
12
13
 
13
- require "irb"
14
+ require 'irb'
14
15
  IRB.start
data/lib/truth_serum.rb CHANGED
@@ -1,8 +1,10 @@
1
- require "truth_serum/version"
2
- require "truth_serum/result"
3
- require "truth_serum/token"
4
- require "truth_serum/lexer"
5
- require "truth_serum/parser"
1
+ # frozen_string_literal: true
2
+ require 'truth_serum/version'
3
+ require 'truth_serum/result'
4
+ require 'truth_serum/token'
5
+ require 'truth_serum/state_machine'
6
+ require 'truth_serum/lexer'
7
+ require 'truth_serum/parser'
6
8
 
7
9
  module TruthSerum
8
10
  module_function
@@ -1,128 +1,105 @@
1
+ # frozen_string_literal: true
1
2
  module TruthSerum
2
- class Lexer
3
- def initialize(input)
4
- @input = input
5
- end
6
-
7
- def reset
8
- @index = 0
9
- @tokens = []
10
- @buffer = ''
3
+ class Lexer < StateMachine
4
+ def lex
5
+ execute
11
6
  end
12
7
 
13
- def lex
14
- reset
15
- lex_line
16
- @tokens
8
+ state :start do
9
+ case peek
10
+ when nil then :end
11
+ when ' ' then :lex_space
12
+ when ':', '+', '-' then :lex_symbol
13
+ when '"' then :lex_quoted_term
14
+ else
15
+ :lex_term
16
+ end
17
17
  end
18
18
 
19
- def lex_line
20
- until eof?
21
- case peek
22
- when '"' then lex_quoted_word
23
- when ':', '+', '-' then lex_symbol
24
- when ' ' then lex_spaces
25
- else
26
- lex_word
27
- end
19
+ state :lex_space do
20
+ case peek
21
+ when ' '
22
+ append(consume)
23
+ :lex_space
24
+ else
25
+ emit(:space)
26
+ :start
28
27
  end
29
28
  end
30
29
 
31
- def lex_symbol
32
- case consume
30
+ state :lex_symbol do
31
+ case append(consume)
33
32
  when ':' then emit(:colon)
34
33
  when '+' then emit(:plus)
35
34
  when '-' then emit(:minus)
36
35
  else
37
36
  raise 'not a symbol'
38
37
  end
38
+ :start
39
39
  end
40
40
 
41
- def lex_spaces
42
- consume while peek == ' '
43
- emit(:space)
44
- end
45
-
46
- def lex_word
47
- until eof?
48
- case peek
49
- when ' ', ':' then return emit(:term)
50
- when '"' then discard
51
- else
52
- consume
53
- end
41
+ state :lex_term do
42
+ case peek
43
+ when ' ', ':', nil
44
+ emit(:term)
45
+ :start
46
+ when '"'
47
+ consume # ignored
48
+ :lex_term
49
+ else
50
+ append(consume)
51
+ :lex_term
54
52
  end
55
-
56
- emit(:term)
57
53
  end
58
54
 
59
- def lex_quoted_word
60
- raise 'not in quoted word' unless discard == '"'
61
-
62
- until eof?
63
- case peek
64
- when '\\' then lex_escaped_char
65
- when '"'
66
- discard
67
- break
68
- else
69
- consume
70
- end
71
- end
72
-
73
- emit(:term)
55
+ state :lex_quoted_term do
56
+ raise 'not in quoted term' unless consume == '"'
57
+ :lex_inside_quoted_term
74
58
  end
75
59
 
76
- def lex_escaped_char
77
- raise 'not in escaped char' unless discard == '\\'
78
- return @buffer += '\\' if eof?
79
-
60
+ state :lex_inside_quoted_term do
80
61
  case peek
81
- when 'r'
82
- discard
83
- @buffer += "\r"
84
- when 'n'
85
- discard
86
- @buffer += "\n"
87
- else # '\\' '"' and everything else is treated literally
62
+ when nil
63
+ emit(:term)
64
+ :start
65
+ when '\\'
66
+ :lex_quoted_char
67
+ when '"'
88
68
  consume
69
+ emit(:term)
70
+ :start
71
+ else
72
+ append(consume)
73
+ :lex_inside_quoted_term
89
74
  end
90
75
  end
91
76
 
92
- private
93
-
94
- def eof?
95
- @index >= @input.length
96
- end
77
+ state :lex_quoted_char do
78
+ raise 'not in quoted char' unless consume == '\\'
97
79
 
98
- def chars_left
99
- @input.length - @index
100
- end
80
+ case char = consume
81
+ when 'r'
82
+ append("\r")
83
+ when 'n'
84
+ append("\n")
85
+ else # '\\' '"' and everything else is passed verbatim
86
+ append(char)
87
+ end
101
88
 
102
- def peek
103
- return nil if eof?
104
- @input[@index]
89
+ :lex_inside_quoted_term
105
90
  end
106
91
 
107
- def consume
108
- raise 'consume beyond EOF' if eof?
109
-
110
- @buffer += peek
111
- discard
112
- end
92
+ private
113
93
 
114
- def discard
115
- @index += 1
116
- @input[@index - 1]
94
+ def append(ch)
95
+ @buffer ||= ''
96
+ @buffer += ch
97
+ ch
117
98
  end
118
99
 
119
100
  def emit(type)
120
- return nil if @buffer == ''
121
-
122
- token = Token.new(type, @buffer)
123
- @tokens << token
124
- @buffer = ''
125
- token
101
+ super(Token.new(type, @buffer))
102
+ @buffer = nil
126
103
  end
127
104
  end
128
105
  end
@@ -1,87 +1,141 @@
1
+ # frozen_string_literal: true
1
2
  module TruthSerum
2
- class Parser
3
- def initialize(tokens)
4
- @tokens = tokens
3
+ class Parser < StateMachine
4
+ def parse
5
+ execute
5
6
  end
6
7
 
7
- def reset
8
- @result = {
8
+ # convert result stream to hash
9
+ def execute
10
+ @negate = false
11
+ result = {
9
12
  terms: [],
10
13
  negative_terms: [],
11
14
  filters: {},
12
- negative_filters: {},
15
+ negative_filters: {}
13
16
  }
14
- end
15
17
 
16
- def parse
17
- reset
18
- parse_line
19
- @result
20
- end
18
+ stream = super
19
+ until stream.empty?
20
+ result = merge_result(result, stream.shift)
21
+ end
21
22
 
22
- def parse_line
23
- until eof?
24
- token = peek
23
+ result
24
+ end
25
25
 
26
- case
27
- when token.plus? || token.minus?
28
- parse_sign
29
- when token.term?
30
- parse_term_or_filter
31
- else
32
- consume # stray colons and spaces
33
- end
26
+ state :start do
27
+ token = peek
28
+ case
29
+ when token.nil?
30
+ :end
31
+ when token.plus? || token.minus?
32
+ :parse_modifier
33
+ when token.term?
34
+ :parse_term_or_filter
35
+ when token.colon? || token.space?
36
+ consume # ignored
37
+ :start
34
38
  end
35
39
  end
36
40
 
37
- def parse_sign
38
- negate = consume.minus? while peek.plus? || peek.minus?
39
- if peek.term?
40
- parse_term_or_filter(negate: negate)
41
+ state :parse_modifier do
42
+ token = consume
43
+ case
44
+ when token.plus?
45
+ @negate = false
46
+ when token.minus?
47
+ @negate = true
41
48
  else
42
- nil
49
+ raise 'not a modifier'
43
50
  end
51
+ :start
44
52
  end
45
53
 
46
- def parse_term_or_filter(negate: false)
47
- term = ''
48
- value = ''
54
+ state :parse_term_or_filter do
55
+ start_token = consume
56
+ mid_token = peek
57
+ raise 'not term or filter' unless start_token.term?
58
+
59
+ rewind
60
+ if mid_token.nil? || !mid_token.colon?
61
+ :parse_term
62
+ else # mid_token.colon? == true
63
+ :parse_filter
64
+ end
65
+ end
49
66
 
50
- # first portion of text
51
- term = consume.text
52
- return emit_term(term, negate: negate) unless peek.colon?
67
+ state :parse_term do
68
+ emit_term(consume.text)
69
+ :start
70
+ end
53
71
 
54
- # initial `:` separator
55
- consume
72
+ state :parse_filter do
73
+ @filter_key = consume.text
74
+ :parse_filter_separator
75
+ end
56
76
 
57
- # the rest becomes value (including successive `:`s '-'s)
58
- value += consume.text while peek.colon? || peek.plus? || peek.minus? || peek.term?
77
+ state :parse_filter_separator do
78
+ case
79
+ when peek.nil? # dangling colon at the end, treat key as single term
80
+ emit_term(@filter_key)
81
+ @filter_key = nil
82
+ :start
83
+ when peek.colon?
84
+ consume
85
+ :parse_filter_separator
86
+ when peek.term?
87
+ :parse_filter_value
88
+ else
89
+ raise 'malformed filter!!!'
90
+ end
91
+ end
59
92
 
60
- emit_filter(term, value, negate: negate)
93
+ state :parse_filter_value do
94
+ case
95
+ when !peek.nil? && (peek.term? || peek.colon?)
96
+ # consecutive `:` inside value part are treated literally
97
+ @filter_value ||= ''
98
+ @filter_value += consume.text
99
+ :parse_filter_value
100
+ else
101
+ emit_filter(@filter_key, @filter_value)
102
+ @filter_key, @filter_value = nil, nil
103
+ :start
104
+ end
61
105
  end
62
106
 
63
107
  private
64
108
 
65
- def emit_term(term, negate: false)
66
- @result[:terms] << term unless negate
67
- @result[:negative_terms] << term if negate
68
- end
109
+ def emit_term(term)
110
+ type = @negate ? :negative_terms : :terms
111
+ @negate = false
69
112
 
70
- def emit_filter(key, value, negate: false)
71
- @result[:filters][key] = value unless negate
72
- @result[:negative_filters][key] = value if negate
113
+ emit(type => [term])
73
114
  end
74
115
 
75
- def eof?
76
- peek.is_a?(NilToken)
77
- end
116
+ def emit_filter(key, value)
117
+ type = @negate ? :negative_filters : :filters
118
+ @negate = false
78
119
 
79
- def peek
80
- @tokens[0] || NilToken.new
120
+ emit(type => { key => value })
81
121
  end
82
122
 
83
- def consume
84
- @tokens.shift || NilToken.new
123
+ # simplified 1-deep merge
124
+ def merge_result(x, y)
125
+ result = x.merge({})
126
+ y.each do |key, value|
127
+ if result.key?(key)
128
+ if value.is_a?(Hash)
129
+ result[key] = result[key].merge(value)
130
+ elsif value.is_a?(Array)
131
+ result[key] = result[key] + value
132
+ end
133
+ else
134
+ result[key] = value
135
+ end
136
+ end
137
+
138
+ result
85
139
  end
86
140
  end
87
141
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module TruthSerum
2
3
  class Result
3
4
  attr_accessor :terms, :negative_terms, :filters, :negative_filters
@@ -47,8 +48,8 @@ module TruthSerum
47
48
 
48
49
  def quote_term(term)
49
50
  term = term.gsub(/\r/, '\r')
50
- .gsub(/\n/, '\n')
51
- .gsub(/\\/, '\\\\')
51
+ .gsub(/\n/, '\n')
52
+ .gsub(/\\/, '\\\\')
52
53
 
53
54
  "\"#{term}\""
54
55
  end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+ module TruthSerum
3
+ class StateMachine
4
+ class << self
5
+ def states
6
+ @states ||= {}
7
+ end
8
+
9
+ def state(name, &block)
10
+ @states ||= {}
11
+ @states[name] = block
12
+ end
13
+ end
14
+
15
+ attr_accessor :debug
16
+
17
+ def initialize(input)
18
+ @input = input
19
+ @states = self.class.states
20
+ @position = 0
21
+ @result = []
22
+ end
23
+
24
+ def execute
25
+ @position = 0
26
+ @result = []
27
+
28
+ state = :start
29
+ loop do
30
+ puts "#{self.class.name}: #{state}" if debug
31
+
32
+ next_state = instance_eval(&@states[state])
33
+ case
34
+ when next_state == :end
35
+ break
36
+ when !next_state.is_a?(Symbol)
37
+ raise "#{state.inspect} did not return the next state."
38
+ when !@states.key?(next_state)
39
+ raise "#{state.inspect} refers to undefined #{next_state.inspect} state."
40
+ end
41
+
42
+ state = next_state
43
+ end
44
+
45
+ @result
46
+ end
47
+
48
+ protected
49
+
50
+ def peek
51
+ @input[@position]
52
+ end
53
+
54
+ def consume
55
+ result = @input[@position]
56
+ @position += 1
57
+ result
58
+ end
59
+
60
+ def rewind
61
+ @position -= 1
62
+ end
63
+
64
+ def eof?
65
+ @position >= @input.length
66
+ end
67
+
68
+ def emit(value)
69
+ puts "#{self.class.name}: << #{value.inspect}" if debug
70
+ @result << value
71
+ end
72
+ end
73
+ end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module TruthSerum
2
3
  class Token
3
4
  VALID_TYPES = [
@@ -15,22 +16,10 @@ module TruthSerum
15
16
  @text = text
16
17
  end
17
18
 
18
- def valid?
19
- VALID_TYPES.include?(@type) &&
20
- !@text.nil? &&
21
- !@text.empty?
22
- end
23
-
24
19
  VALID_TYPES.each do |type|
25
20
  define_method "#{type}?" do
26
21
  @type == type
27
22
  end
28
23
  end
29
24
  end
30
-
31
- class NilToken < Token
32
- def initialize
33
- super(:nil, '')
34
- end
35
- end
36
25
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module TruthSerum
2
- VERSION = "0.3.0"
3
+ VERSION = '0.4.0'
3
4
  end
data/truth_serum.gemspec CHANGED
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # vim: filetype=ruby
2
3
  # coding: utf-8
3
4
  lib = File.expand_path('../lib', __FILE__)
@@ -5,23 +6,24 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
6
  require 'truth_serum/version'
6
7
 
7
8
  Gem::Specification.new do |spec|
8
- spec.name = "truth_serum"
9
+ spec.name = 'truth_serum'
9
10
  spec.version = TruthSerum::VERSION
10
- spec.authors = ["Chakrit Wichian"]
11
- spec.email = ["chakrit@omise.co"]
11
+ spec.authors = ['Chakrit Wichian']
12
+ spec.email = ['chakrit@omise.co']
12
13
 
13
- spec.summary = "Parser for github-style search."
14
- spec.homepage = "https://github.com/chakrit/truth_serum"
14
+ spec.summary = 'Parser for github-style search.'
15
+ spec.homepage = 'https://github.com/chakrit/truth_serum'
15
16
  spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
16
- spec.bindir = "exe"
17
- spec.licenses = ["MIT"]
17
+ spec.bindir = 'exe'
18
+ spec.licenses = ['MIT']
18
19
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
- spec.require_paths = ["lib"]
20
+ spec.require_paths = ['lib']
20
21
 
21
- spec.add_development_dependency "bundler", '~> 1.12'
22
- spec.add_development_dependency "rake", '~> 11.2'
23
- spec.add_development_dependency "minitest", '~> 5.9'
24
- spec.add_development_dependency "guard", '~> 2.14'
25
- spec.add_development_dependency "guard-minitest", '~> 2.4'
26
- spec.add_development_dependency "pry", '~> 0.10'
22
+ spec.add_development_dependency 'bundler', '~> 1.12'
23
+ spec.add_development_dependency 'guard', '~> 2.14'
24
+ spec.add_development_dependency 'guard-minitest', '~> 2.4'
25
+ spec.add_development_dependency 'minitest', '~> 5.9'
26
+ spec.add_development_dependency 'pry', '~> 0.10'
27
+ spec.add_development_dependency 'rake', '~> 11.2'
28
+ spec.add_development_dependency 'rubocop', '~> 0.46'
27
29
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: truth_serum
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chakrit Wichian
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-12-08 00:00:00.000000000 Z
11
+ date: 2017-01-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -25,19 +25,33 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.12'
27
27
  - !ruby/object:Gem::Dependency
28
- name: rake
28
+ name: guard
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '11.2'
33
+ version: '2.14'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '11.2'
40
+ version: '2.14'
41
+ - !ruby/object:Gem::Dependency
42
+ name: guard-minitest
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '2.4'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '2.4'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: minitest
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -53,47 +67,47 @@ dependencies:
53
67
  - !ruby/object:Gem::Version
54
68
  version: '5.9'
55
69
  - !ruby/object:Gem::Dependency
56
- name: guard
70
+ name: pry
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
73
  - - "~>"
60
74
  - !ruby/object:Gem::Version
61
- version: '2.14'
75
+ version: '0.10'
62
76
  type: :development
63
77
  prerelease: false
64
78
  version_requirements: !ruby/object:Gem::Requirement
65
79
  requirements:
66
80
  - - "~>"
67
81
  - !ruby/object:Gem::Version
68
- version: '2.14'
82
+ version: '0.10'
69
83
  - !ruby/object:Gem::Dependency
70
- name: guard-minitest
84
+ name: rake
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
87
  - - "~>"
74
88
  - !ruby/object:Gem::Version
75
- version: '2.4'
89
+ version: '11.2'
76
90
  type: :development
77
91
  prerelease: false
78
92
  version_requirements: !ruby/object:Gem::Requirement
79
93
  requirements:
80
94
  - - "~>"
81
95
  - !ruby/object:Gem::Version
82
- version: '2.4'
96
+ version: '11.2'
83
97
  - !ruby/object:Gem::Dependency
84
- name: pry
98
+ name: rubocop
85
99
  requirement: !ruby/object:Gem::Requirement
86
100
  requirements:
87
101
  - - "~>"
88
102
  - !ruby/object:Gem::Version
89
- version: '0.10'
103
+ version: '0.46'
90
104
  type: :development
91
105
  prerelease: false
92
106
  version_requirements: !ruby/object:Gem::Requirement
93
107
  requirements:
94
108
  - - "~>"
95
109
  - !ruby/object:Gem::Version
96
- version: '0.10'
110
+ version: '0.46'
97
111
  description:
98
112
  email:
99
113
  - chakrit@omise.co
@@ -102,6 +116,7 @@ extensions: []
102
116
  extra_rdoc_files: []
103
117
  files:
104
118
  - ".gitignore"
119
+ - ".rubocop.yml"
105
120
  - ".ruby-version"
106
121
  - ".travis.yml"
107
122
  - Gemfile
@@ -114,6 +129,7 @@ files:
114
129
  - lib/truth_serum/lexer.rb
115
130
  - lib/truth_serum/parser.rb
116
131
  - lib/truth_serum/result.rb
132
+ - lib/truth_serum/state_machine.rb
117
133
  - lib/truth_serum/token.rb
118
134
  - lib/truth_serum/version.rb
119
135
  - truth_serum.gemspec
@@ -137,7 +153,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
137
153
  version: '0'
138
154
  requirements: []
139
155
  rubyforge_project:
140
- rubygems_version: 2.5.1
156
+ rubygems_version: 2.6.8
141
157
  signing_key:
142
158
  specification_version: 4
143
159
  summary: Parser for github-style search.