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