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 +4 -4
- data/.rubocop.yml +24 -0
- data/.ruby-version +1 -1
- data/Gemfile +1 -0
- data/Guardfile +1 -0
- data/Rakefile +5 -4
- data/bin/console +4 -3
- data/lib/truth_serum.rb +7 -5
- data/lib/truth_serum/lexer.rb +68 -91
- data/lib/truth_serum/parser.rb +107 -53
- data/lib/truth_serum/result.rb +3 -2
- data/lib/truth_serum/state_machine.rb +73 -0
- data/lib/truth_serum/token.rb +1 -12
- data/lib/truth_serum/version.rb +2 -1
- data/truth_serum.gemspec +16 -14
- metadata +31 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5e8f73535a864ae7b2e8bc1dc32fbe4d8d648cb6
|
4
|
+
data.tar.gz: 63f502f8255d3f70f9bf5f5f995bb8a68dd637a2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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.
|
1
|
+
2.4.0
|
data/Gemfile
CHANGED
data/Guardfile
CHANGED
data/Rakefile
CHANGED
@@ -1,9 +1,10 @@
|
|
1
|
-
|
2
|
-
require
|
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 <<
|
6
|
-
t.libs <<
|
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
|
4
|
-
require
|
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
|
14
|
+
require 'irb'
|
14
15
|
IRB.start
|
data/lib/truth_serum.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
|
-
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
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
|
data/lib/truth_serum/lexer.rb
CHANGED
@@ -1,128 +1,105 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module TruthSerum
|
2
|
-
class Lexer
|
3
|
-
def
|
4
|
-
|
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
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
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
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
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
|
-
|
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
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
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
|
-
|
60
|
-
raise 'not in quoted
|
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
|
-
|
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
|
82
|
-
|
83
|
-
|
84
|
-
when '
|
85
|
-
|
86
|
-
|
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
|
-
|
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
|
-
|
99
|
-
|
100
|
-
|
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
|
-
|
103
|
-
return nil if eof?
|
104
|
-
@input[@index]
|
89
|
+
:lex_inside_quoted_term
|
105
90
|
end
|
106
91
|
|
107
|
-
|
108
|
-
raise 'consume beyond EOF' if eof?
|
109
|
-
|
110
|
-
@buffer += peek
|
111
|
-
discard
|
112
|
-
end
|
92
|
+
private
|
113
93
|
|
114
|
-
def
|
115
|
-
@
|
116
|
-
@
|
94
|
+
def append(ch)
|
95
|
+
@buffer ||= ''
|
96
|
+
@buffer += ch
|
97
|
+
ch
|
117
98
|
end
|
118
99
|
|
119
100
|
def emit(type)
|
120
|
-
|
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
|
data/lib/truth_serum/parser.rb
CHANGED
@@ -1,87 +1,141 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module TruthSerum
|
2
|
-
class Parser
|
3
|
-
def
|
4
|
-
|
3
|
+
class Parser < StateMachine
|
4
|
+
def parse
|
5
|
+
execute
|
5
6
|
end
|
6
7
|
|
7
|
-
|
8
|
-
|
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
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
end
|
18
|
+
stream = super
|
19
|
+
until stream.empty?
|
20
|
+
result = merge_result(result, stream.shift)
|
21
|
+
end
|
21
22
|
|
22
|
-
|
23
|
-
|
24
|
-
token = peek
|
23
|
+
result
|
24
|
+
end
|
25
25
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
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
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
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
|
-
|
49
|
+
raise 'not a modifier'
|
43
50
|
end
|
51
|
+
:start
|
44
52
|
end
|
45
53
|
|
46
|
-
|
47
|
-
|
48
|
-
|
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
|
-
|
51
|
-
|
52
|
-
|
67
|
+
state :parse_term do
|
68
|
+
emit_term(consume.text)
|
69
|
+
:start
|
70
|
+
end
|
53
71
|
|
54
|
-
|
55
|
-
consume
|
72
|
+
state :parse_filter do
|
73
|
+
@filter_key = consume.text
|
74
|
+
:parse_filter_separator
|
75
|
+
end
|
56
76
|
|
57
|
-
|
58
|
-
|
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
|
-
|
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
|
66
|
-
@
|
67
|
-
@
|
68
|
-
end
|
109
|
+
def emit_term(term)
|
110
|
+
type = @negate ? :negative_terms : :terms
|
111
|
+
@negate = false
|
69
112
|
|
70
|
-
|
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
|
76
|
-
|
77
|
-
|
116
|
+
def emit_filter(key, value)
|
117
|
+
type = @negate ? :negative_filters : :filters
|
118
|
+
@negate = false
|
78
119
|
|
79
|
-
|
80
|
-
@tokens[0] || NilToken.new
|
120
|
+
emit(type => { key => value })
|
81
121
|
end
|
82
122
|
|
83
|
-
|
84
|
-
|
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
|
data/lib/truth_serum/result.rb
CHANGED
@@ -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
|
-
|
51
|
-
|
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
|
data/lib/truth_serum/token.rb
CHANGED
@@ -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
|
data/lib/truth_serum/version.rb
CHANGED
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 =
|
9
|
+
spec.name = 'truth_serum'
|
9
10
|
spec.version = TruthSerum::VERSION
|
10
|
-
spec.authors = [
|
11
|
-
spec.email = [
|
11
|
+
spec.authors = ['Chakrit Wichian']
|
12
|
+
spec.email = ['chakrit@omise.co']
|
12
13
|
|
13
|
-
spec.summary =
|
14
|
-
spec.homepage =
|
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 =
|
17
|
-
spec.licenses = [
|
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 = [
|
20
|
+
spec.require_paths = ['lib']
|
20
21
|
|
21
|
-
spec.add_development_dependency
|
22
|
-
spec.add_development_dependency
|
23
|
-
spec.add_development_dependency
|
24
|
-
spec.add_development_dependency
|
25
|
-
spec.add_development_dependency
|
26
|
-
spec.add_development_dependency
|
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.
|
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:
|
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:
|
28
|
+
name: guard
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
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: '
|
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:
|
70
|
+
name: pry
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
58
72
|
requirements:
|
59
73
|
- - "~>"
|
60
74
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
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: '
|
82
|
+
version: '0.10'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
84
|
+
name: rake
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
72
86
|
requirements:
|
73
87
|
- - "~>"
|
74
88
|
- !ruby/object:Gem::Version
|
75
|
-
version: '2
|
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
|
96
|
+
version: '11.2'
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
98
|
+
name: rubocop
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
86
100
|
requirements:
|
87
101
|
- - "~>"
|
88
102
|
- !ruby/object:Gem::Version
|
89
|
-
version: '0.
|
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.
|
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.
|
156
|
+
rubygems_version: 2.6.8
|
141
157
|
signing_key:
|
142
158
|
specification_version: 4
|
143
159
|
summary: Parser for github-style search.
|