truth_serum 0.3.0 → 0.4.0

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
  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.