search_lingo 2.0.0 → 3.0.0.pre1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.gitlab-ci.yml +27 -0
- data/.rubocop.yml +5 -11
- data/.travis.yml +5 -3
- data/examples/complex.rb +5 -3
- data/examples/sequel_example.rb +5 -7
- data/lib/search_lingo/abstract_search.rb +9 -7
- data/lib/search_lingo/constants.rb +16 -3
- data/lib/search_lingo/parsers/date_parser.rb +17 -13
- data/lib/search_lingo/parsers/mdy.rb +21 -20
- data/lib/search_lingo/token.rb +11 -14
- data/lib/search_lingo/tokenizer.rb +2 -14
- data/lib/search_lingo/version.rb +1 -1
- data/search_lingo.gemspec +8 -8
- metadata +27 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 06b21144b96415a618c188261eca38aab055ca218d294a966f96f543c41759a2
|
4
|
+
data.tar.gz: eff6897cd99f4abf444a9dd9c8c5d1d545b1da5277d507a8fb8b7a685756ca44
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fbd45adde84bf9a73d73c15cb91545e1e46b7ddbc2b0647506a087dcf77cf1aa7777ed29e57c8329a101b98b01b647308ed5657157fc60cc9858bd5281a25ca0
|
7
|
+
data.tar.gz: a05213f9fd31a2049f649bc935ac9d5edf0e4c8cd4bc390ee423bdc660180d78fb1a9802ffe7ff428b886b70911f93c98d469edb1dfb59b5c9e43c13c4eb1a74
|
data/.gitignore
CHANGED
data/.gitlab-ci.yml
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
before_script:
|
2
|
+
- gem install bundler --no-document -v '~> 2.3.11'
|
3
|
+
- bundle install --jobs="$(nproc)" --retry=3
|
4
|
+
|
5
|
+
build:rubocop:
|
6
|
+
stage: build
|
7
|
+
image: "ruby:3.1"
|
8
|
+
script:
|
9
|
+
- bundle exec rubocop
|
10
|
+
|
11
|
+
test:ruby-2.7:
|
12
|
+
stage: test
|
13
|
+
image: "ruby:2.7"
|
14
|
+
script:
|
15
|
+
- bundle exec rake test
|
16
|
+
|
17
|
+
test:ruby-3.0:
|
18
|
+
stage: test
|
19
|
+
image: "ruby:3.0"
|
20
|
+
script:
|
21
|
+
- bundle exec rake test
|
22
|
+
|
23
|
+
test:ruby-3.1:
|
24
|
+
stage: test
|
25
|
+
image: "ruby:3.1"
|
26
|
+
script:
|
27
|
+
- bundle exec rake test
|
data/.rubocop.yml
CHANGED
@@ -1,14 +1,8 @@
|
|
1
1
|
AllCops:
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
Metrics/AbcSize:
|
6
|
-
Max: 25
|
7
|
-
Style/AndOr:
|
8
|
-
EnforcedStyle: conditionals
|
2
|
+
NewCops: enable
|
3
|
+
SuggestExtensions: false
|
4
|
+
TargetRubyVersion: 2.7.0
|
9
5
|
Style/TrailingCommaInArrayLiteral:
|
10
|
-
|
6
|
+
EnforcedStyleForMultiline: consistent_comma
|
11
7
|
Style/TrailingCommaInHashLiteral:
|
12
|
-
|
13
|
-
Style/NumericPredicate:
|
14
|
-
Enabled: false
|
8
|
+
EnforcedStyleForMultiline: consistent_comma
|
data/.travis.yml
CHANGED
data/examples/complex.rb
CHANGED
@@ -40,9 +40,11 @@ class JobSearch < SearchLingo::AbstractSearch # :nodoc:
|
|
40
40
|
end
|
41
41
|
|
42
42
|
class ReceiptSearch < SearchLingo::AbstractSearch # :nodoc:
|
43
|
-
|
44
|
-
|
45
|
-
|
43
|
+
# You might prefer to include SearchLingo::Parsers if you you are going to
|
44
|
+
# instantiate multiple DateParsers.
|
45
|
+
include SearchLingo::Parsers
|
46
|
+
parser DateParser.new Receipt.arel_table[:check_date]
|
47
|
+
parser DateParser.new Receipt.arel_table[:post_date], modifier: 'posted'
|
46
48
|
|
47
49
|
parser do |token, chain|
|
48
50
|
token.match(/\Aamount: (\d+(?:\.\d+)?)\z/) do |m|
|
data/examples/sequel_example.rb
CHANGED
@@ -56,13 +56,11 @@ class TaskSearch < SearchLingo::AbstractSearch # :nodoc:
|
|
56
56
|
# 7/4/17 => Tasks with due_date == Date.new(2017, 7, 4)
|
57
57
|
parser do |token, chain|
|
58
58
|
token.match %r{\A(?<m>\d{1,2})/(?<d>\d{1,2})/(?<y>\d{2}\d{2}?)\z} do |m|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
nil
|
65
|
-
end
|
59
|
+
date = Date.parse "#{m[:y]}/#{m[:m]}/#{m[:d]}"
|
60
|
+
chain.where due_date: date
|
61
|
+
rescue ArgumentError
|
62
|
+
# Fail if Date.parse raises an ArgumentError
|
63
|
+
nil
|
66
64
|
end
|
67
65
|
end
|
68
66
|
|
@@ -61,8 +61,8 @@ module SearchLingo
|
|
61
61
|
# responds to +#call+. The parser will be send +#call+ with a single
|
62
62
|
# argument which will be a token from the query string.
|
63
63
|
#
|
64
|
-
#
|
65
|
-
#
|
64
|
+
# Raises +ArgumentError+ if +parser+ does not respond to +#call+ and no
|
65
|
+
# block is given.
|
66
66
|
#
|
67
67
|
# class MyParser
|
68
68
|
# def call(token)
|
@@ -77,11 +77,13 @@ module SearchLingo
|
|
77
77
|
# end
|
78
78
|
# end
|
79
79
|
def self.parser(parser = nil, &block)
|
80
|
-
|
81
|
-
|
80
|
+
if parser.respond_to? :call
|
81
|
+
parsers << parser
|
82
|
+
elsif block_given?
|
83
|
+
parsers << block
|
84
|
+
else
|
85
|
+
raise ArgumentError, 'parse must be called with block or callable object'
|
82
86
|
end
|
83
|
-
|
84
|
-
parsers << (parser || block)
|
85
87
|
end
|
86
88
|
|
87
89
|
##
|
@@ -161,7 +163,7 @@ module SearchLingo
|
|
161
163
|
# implementation should return +chain+. (Doing so would ignore +token+.)
|
162
164
|
def default_parse(_token, _chain)
|
163
165
|
raise NotImplementedError,
|
164
|
-
|
166
|
+
"#default_parse must be implemented by #{self.class}"
|
165
167
|
end
|
166
168
|
end
|
167
169
|
end
|
@@ -3,9 +3,22 @@
|
|
3
3
|
module SearchLingo
|
4
4
|
##
|
5
5
|
# Pattern for matching modifiers within a token.
|
6
|
-
MODIFIER = /[[:alnum:]]
|
6
|
+
MODIFIER = /[[:alnum:]]+/.freeze
|
7
7
|
|
8
8
|
##
|
9
|
-
# Pattern for matching
|
10
|
-
|
9
|
+
# Pattern for matching a simple token.
|
10
|
+
SIMPLE_TOKEN = /"[^"]+"|[[:graph:]]+/.freeze
|
11
|
+
|
12
|
+
##
|
13
|
+
# Pattern for matching a simple or compound token.
|
14
|
+
SIMPLE_OR_COMPOUND_TOKEN = /(?:#{MODIFIER}:[[:space:]]*)?#{SIMPLE_TOKEN}/.freeze
|
15
|
+
|
16
|
+
##
|
17
|
+
# Pattern for matching a simple or compound token, with regex grouping to aid
|
18
|
+
# in decomposing the token into its modifier and term components.
|
19
|
+
SIMPLE_OR_COMPOUND_TOKEN_WITH_GROUPING = /\A(?:(#{MODIFIER}):[[:space:]]*)?(#{SIMPLE_TOKEN})\z/.freeze
|
20
|
+
|
21
|
+
##
|
22
|
+
# Pattern for matching the delimiter between tokens.
|
23
|
+
DELIMITER = /[[:space:]]*/.freeze
|
11
24
|
end
|
@@ -16,7 +16,7 @@ module SearchLingo
|
|
16
16
|
class DateParser
|
17
17
|
include MDY
|
18
18
|
|
19
|
-
attr_reader :column, :prefix, :
|
19
|
+
attr_reader :column, :prefix, :decorator
|
20
20
|
|
21
21
|
##
|
22
22
|
# Instantiates a new DateParser object.
|
@@ -26,10 +26,10 @@ module SearchLingo
|
|
26
26
|
# If present, the optional argument +modifier+ will be used as the
|
27
27
|
# token operator which precedes the date term.
|
28
28
|
#
|
29
|
-
# If a block is provided, it will be
|
30
|
-
#
|
31
|
-
#
|
32
|
-
#
|
29
|
+
# If a block is provided, it will be called with the filter chain. This
|
30
|
+
# is useful if you need to send additional messages to the filter chain
|
31
|
+
# which are independent of the content of the token, e.g., if you need to
|
32
|
+
# join another table.
|
33
33
|
#
|
34
34
|
# DateParser.new Model.arel_table[:date]
|
35
35
|
# DateParser.new Model.arel_table[:date], modifier: 'contract'
|
@@ -39,7 +39,7 @@ module SearchLingo
|
|
39
39
|
def initialize(column, modifier: nil, &block)
|
40
40
|
@column = column
|
41
41
|
@prefix = /#{modifier}:[[:space:]]*/ if modifier
|
42
|
-
@
|
42
|
+
@decorator = block_given? ? block : ->(chain) { chain }
|
43
43
|
end
|
44
44
|
|
45
45
|
##
|
@@ -57,9 +57,9 @@ module SearchLingo
|
|
57
57
|
|
58
58
|
def inspect # :nodoc:
|
59
59
|
format '#<%<cls>s @prefix=%<prefix>s @column=%<column>s>',
|
60
|
-
|
61
|
-
|
62
|
-
|
60
|
+
cls: self.class,
|
61
|
+
prefix: prefix.inspect,
|
62
|
+
column: "#{column.relation.name}.#{column.name}".inspect
|
63
63
|
end
|
64
64
|
|
65
65
|
private
|
@@ -67,7 +67,7 @@ module SearchLingo
|
|
67
67
|
def parse_single_date(token, chain) # :nodoc:
|
68
68
|
token.match(/\A#{prefix}(?<date>#{US_DATE})\z/) do |m|
|
69
69
|
date = parse(m[:date]) or return nil
|
70
|
-
throw :halt,
|
70
|
+
throw :halt, decorate(chain).where(column.eq(date))
|
71
71
|
end
|
72
72
|
end
|
73
73
|
|
@@ -75,23 +75,27 @@ module SearchLingo
|
|
75
75
|
token.match(/\A#{prefix}(?<min>#{US_DATE})-(?<max>#{US_DATE})\z/) do |m|
|
76
76
|
min = parse(m[:min]) or return nil
|
77
77
|
max = parse(m[:max], relative_to: min.next_year) or return nil
|
78
|
-
throw :halt,
|
78
|
+
throw :halt, decorate(chain).where(column.between(min..max))
|
79
79
|
end
|
80
80
|
end
|
81
81
|
|
82
82
|
def parse_lte_date(token, chain) # :nodoc:
|
83
83
|
token.match(/\A#{prefix}-(?<date>#{US_DATE})\z/) do |m|
|
84
84
|
date = parse(m[:date]) or return nil
|
85
|
-
throw :halt,
|
85
|
+
throw :halt, decorate(chain).where(column.lteq(date))
|
86
86
|
end
|
87
87
|
end
|
88
88
|
|
89
89
|
def parse_gte_date(token, chain) # :nodoc:
|
90
90
|
token.match(/\A#{prefix}(?<date>#{US_DATE})-\z/) do |m|
|
91
91
|
date = parse(m[:date]) or return nil
|
92
|
-
throw :halt,
|
92
|
+
throw :halt, decorate(chain).where(column.gteq(date))
|
93
93
|
end
|
94
94
|
end
|
95
|
+
|
96
|
+
def decorate(chain)
|
97
|
+
decorator.call chain
|
98
|
+
end
|
95
99
|
end
|
96
100
|
end
|
97
101
|
end
|
@@ -5,14 +5,16 @@ require 'date'
|
|
5
5
|
module SearchLingo
|
6
6
|
module Parsers # :nodoc:
|
7
7
|
##
|
8
|
-
# MDY provides a parser for dates that adhere to the
|
9
|
-
# US.
|
8
|
+
# MDY provides a parser for dates that adhere to the M/D/Y format used in
|
9
|
+
# the US.
|
10
10
|
module MDY
|
11
11
|
##
|
12
12
|
# Pattern for matching US-formatted date strings.
|
13
13
|
#
|
14
14
|
# The year may be two or four digits, or it may be omitted.
|
15
|
-
US_DATE = %r{(?<m>\d{1,2})/(?<d>\d{1,2})(?:/(?<y>\d{2}\d{2}?))?}
|
15
|
+
US_DATE = %r{(?<m>\d{1,2})/(?<d>\d{1,2})(?:/(?<y>\d{2}\d{2}?))?}.freeze
|
16
|
+
|
17
|
+
module_function
|
16
18
|
|
17
19
|
##
|
18
20
|
# Returns a +Date+ object for the date represented by +term+. Returns
|
@@ -24,33 +26,32 @@ module SearchLingo
|
|
24
26
|
# If the year is omitted, it will be inferred using +relative_to+ as a
|
25
27
|
# reference date. In this scenario, the resulting date will always be
|
26
28
|
# less than or equal to the reference date. If +relative_to+ omitted, it
|
27
|
-
# defaults to today
|
29
|
+
# defaults to +Date.today+.
|
28
30
|
#
|
29
31
|
# Available as both a class method and an instance method.
|
30
|
-
# rubocop:disable Metrics/MethodLength
|
31
32
|
def parse(term, relative_to: Date.today)
|
32
33
|
term.match(/\A#{US_DATE}\z/) do |m|
|
33
|
-
|
34
|
-
|
35
|
-
ref = relative_to
|
36
|
-
month = Integer m[:m]
|
37
|
-
day = Integer m[:d]
|
38
|
-
year = if month < ref.month || month == ref.month && day <= ref.day
|
39
|
-
ref.year
|
40
|
-
else
|
41
|
-
ref.year - 1
|
42
|
-
end
|
43
|
-
Date.new year, month, day
|
34
|
+
date = reformat_date m, relative_to
|
35
|
+
Date.parse date
|
44
36
|
end
|
45
37
|
rescue ArgumentError
|
46
38
|
# Fail if Date.parse or Date.new raise ArgumentError.
|
47
39
|
nil
|
48
40
|
end
|
49
|
-
# rubocop:enable Metrics/MethodLength
|
50
41
|
|
51
|
-
#
|
52
|
-
|
53
|
-
|
42
|
+
def reformat_date(match, today) # :nodoc:
|
43
|
+
return match.values_at(:y, :m, :d).join('/') if match[:y]
|
44
|
+
|
45
|
+
month = Integer match[:m]
|
46
|
+
day = Integer match[:d]
|
47
|
+
year = if month < today.month || (month == today.month && day <= today.day)
|
48
|
+
today.year
|
49
|
+
else
|
50
|
+
today.year - 1
|
51
|
+
end
|
52
|
+
|
53
|
+
"#{year}/#{month}/#{day}"
|
54
|
+
end
|
54
55
|
end
|
55
56
|
end
|
56
57
|
end
|
data/lib/search_lingo/token.rb
CHANGED
@@ -18,18 +18,14 @@ module SearchLingo
|
|
18
18
|
# Token.new('foo: bar')
|
19
19
|
# Token.new('foo: "bar baz"')
|
20
20
|
class Token < DelegateClass(String)
|
21
|
-
##
|
22
|
-
# Pattern for decomposing a token into a modifier and a term.
|
23
|
-
STRUCTURE = /\A(?:(#{MODIFIER}):[[:space:]]*)?"?(.+?)"?\z/
|
24
|
-
|
25
21
|
##
|
26
22
|
# Returns the modifier portion of the token. Returns +nil+ if token does
|
27
23
|
# not have a modifier.
|
28
24
|
#
|
29
|
-
# Token.new('foo: bar').modifier # =>
|
25
|
+
# Token.new('foo: bar').modifier # => "foo"
|
30
26
|
# Token.new('bar').modifier # => nil
|
31
27
|
def modifier
|
32
|
-
self[
|
28
|
+
self[SIMPLE_OR_COMPOUND_TOKEN_WITH_GROUPING, 1]
|
33
29
|
end
|
34
30
|
|
35
31
|
alias operator modifier
|
@@ -38,11 +34,12 @@ module SearchLingo
|
|
38
34
|
# Returns the term portion of the token. If the term is wrapped in quotes,
|
39
35
|
# they are removed.
|
40
36
|
#
|
41
|
-
# Token.new('foo: bar').term # =>
|
42
|
-
# Token.new('bar').term # =>
|
43
|
-
# Token.new('"bar baz"').term # =>
|
37
|
+
# Token.new('foo: bar').term # => "bar"
|
38
|
+
# Token.new('bar').term # => "bar"
|
39
|
+
# Token.new('"bar baz"').term # => "bar baz"
|
40
|
+
# Token.new('""').term # => ""
|
44
41
|
def term
|
45
|
-
self[
|
42
|
+
self[SIMPLE_OR_COMPOUND_TOKEN_WITH_GROUPING, 2].delete_prefix('"').delete_suffix('"')
|
46
43
|
end
|
47
44
|
|
48
45
|
##
|
@@ -56,10 +53,10 @@ module SearchLingo
|
|
56
53
|
|
57
54
|
def inspect # :nodoc:
|
58
55
|
format '#<%<cls>s String(%<str>s) modifier=%<mod>s term=%<term>s>',
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
56
|
+
cls: self.class,
|
57
|
+
str: super,
|
58
|
+
mod: modifier.inspect,
|
59
|
+
term: term.inspect
|
63
60
|
end
|
64
61
|
end
|
65
62
|
end
|
@@ -16,18 +16,6 @@ module SearchLingo
|
|
16
16
|
include Enumerable
|
17
17
|
extend Forwardable
|
18
18
|
|
19
|
-
##
|
20
|
-
# Pattern for matching a simple token (a term without a modifier).
|
21
|
-
SIMPLE_TOKEN = /#{TERM}/
|
22
|
-
|
23
|
-
##
|
24
|
-
# Pattern for matching a compound token (a term with an optional modifier).
|
25
|
-
COMPOUND_TOKEN = /(?:#{MODIFIER}:[[:space:]]*)?#{TERM}/
|
26
|
-
|
27
|
-
##
|
28
|
-
# Pattern for matching the delimiter between tokens.
|
29
|
-
DELIMITER = /[[:space:]]*/
|
30
|
-
|
31
19
|
def initialize(query) # :nodoc:
|
32
20
|
@scanner = StringScanner.new query.strip
|
33
21
|
end
|
@@ -42,11 +30,11 @@ module SearchLingo
|
|
42
30
|
end
|
43
31
|
|
44
32
|
##
|
45
|
-
# Returns a Token for the next token in the query string. When the end of
|
33
|
+
# Returns a +Token+ for the next token in the query string. When the end of
|
46
34
|
# the query string is reached raises +StopIteration+.
|
47
35
|
def next
|
48
36
|
scanner.skip DELIMITER
|
49
|
-
token = scanner.scan
|
37
|
+
token = scanner.scan SIMPLE_OR_COMPOUND_TOKEN
|
50
38
|
raise StopIteration unless token
|
51
39
|
|
52
40
|
Token.new token
|
data/lib/search_lingo/version.rb
CHANGED
data/search_lingo.gemspec
CHANGED
@@ -4,7 +4,6 @@ lib = File.expand_path('lib', __dir__)
|
|
4
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
5
|
require 'search_lingo/version'
|
6
6
|
|
7
|
-
# rubocop:disable Metrics/BlockLength
|
8
7
|
Gem::Specification.new do |spec|
|
9
8
|
spec.name = 'search_lingo'
|
10
9
|
spec.version = SearchLingo::VERSION
|
@@ -19,25 +18,26 @@ Gem::Specification.new do |spec|
|
|
19
18
|
spec.homepage = 'https://github.com/jparker/search_lingo'
|
20
19
|
spec.license = 'MIT'
|
21
20
|
|
22
|
-
spec.files = `git ls-files -z`.split("\x0").reject
|
21
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
23
22
|
f.match(%r{^(test|spec|features)/})
|
24
|
-
|
23
|
+
end
|
25
24
|
spec.bindir = 'exe'
|
26
25
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
27
26
|
spec.require_paths = ['lib']
|
28
27
|
|
29
28
|
spec.rdoc_options += ['-x', 'examples/', '-x', 'test/']
|
30
29
|
|
31
|
-
spec.required_ruby_version = '>= 2.
|
30
|
+
spec.required_ruby_version = '>= 2.7'
|
32
31
|
|
33
|
-
spec.add_development_dependency 'bundler', '~>
|
32
|
+
spec.add_development_dependency 'bundler', '~> 2.0'
|
34
33
|
spec.add_development_dependency 'minitest'
|
35
34
|
spec.add_development_dependency 'minitest-focus'
|
36
35
|
spec.add_development_dependency 'mocha'
|
37
36
|
spec.add_development_dependency 'pry'
|
38
|
-
spec.add_development_dependency 'rake', '~>
|
39
|
-
spec.add_development_dependency 'rubocop'
|
37
|
+
spec.add_development_dependency 'rake', '~> 13.0'
|
38
|
+
spec.add_development_dependency 'rubocop', '~> 1.12'
|
39
|
+
spec.add_development_dependency 'rubocop-minitest'
|
40
40
|
spec.add_development_dependency 'sequel', '~> 5.0'
|
41
41
|
spec.add_development_dependency 'sqlite3'
|
42
|
+
spec.metadata['rubygems_mfa_required'] = 'true'
|
42
43
|
end
|
43
|
-
# rubocop:enable Metrics/BlockLength
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: search_lingo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0.pre1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Parker
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-04-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '2.0'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '2.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: minitest
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -86,16 +86,30 @@ dependencies:
|
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: '
|
89
|
+
version: '13.0'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: '
|
96
|
+
version: '13.0'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: rubocop
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '1.12'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '1.12'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rubocop-minitest
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|
100
114
|
requirements:
|
101
115
|
- - ">="
|
@@ -146,6 +160,7 @@ extensions: []
|
|
146
160
|
extra_rdoc_files: []
|
147
161
|
files:
|
148
162
|
- ".gitignore"
|
163
|
+
- ".gitlab-ci.yml"
|
149
164
|
- ".rubocop.yml"
|
150
165
|
- ".travis.yml"
|
151
166
|
- Gemfile
|
@@ -169,7 +184,8 @@ files:
|
|
169
184
|
homepage: https://github.com/jparker/search_lingo
|
170
185
|
licenses:
|
171
186
|
- MIT
|
172
|
-
metadata:
|
187
|
+
metadata:
|
188
|
+
rubygems_mfa_required: 'true'
|
173
189
|
post_install_message:
|
174
190
|
rdoc_options:
|
175
191
|
- "-x"
|
@@ -182,15 +198,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
182
198
|
requirements:
|
183
199
|
- - ">="
|
184
200
|
- !ruby/object:Gem::Version
|
185
|
-
version: '2.
|
201
|
+
version: '2.7'
|
186
202
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
187
203
|
requirements:
|
188
|
-
- - "
|
204
|
+
- - ">"
|
189
205
|
- !ruby/object:Gem::Version
|
190
|
-
version:
|
206
|
+
version: 1.3.1
|
191
207
|
requirements: []
|
192
|
-
|
193
|
-
rubygems_version: 2.7.8
|
208
|
+
rubygems_version: 3.3.7
|
194
209
|
signing_key:
|
195
210
|
specification_version: 4
|
196
211
|
summary: Framework for defining and parsing search queries.
|