querylicious 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +24 -0
- data/VERSION +1 -1
- data/lib/querylicious/key_value_pair.rb +2 -1
- data/lib/querylicious/matcher.rb +5 -4
- data/lib/querylicious/parser.rb +12 -3
- data/lib/querylicious/query_reducer.rb +1 -1
- data/lib/querylicious/transform.rb +10 -0
- data/querylicious.gemspec +6 -2
- metadata +36 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e1f4d432e05a5f75fcfc89b7cdba9c08274e3a53
|
4
|
+
data.tar.gz: 8180af54ac20004c003e4ff8db81f360cbad2387
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1f327774005b652a257346a7007ca6b3dfc79ac30ea6b1dd125500629478051ec53fb22023052f609d9003aeb2e544d38bc42b721397cd6c2cb47af696823764
|
7
|
+
data.tar.gz: 0c16fbe5446519fee9b9b4111791e407ff20435e8abb29ae9e16c0c3ae9e8f03782353f1140c56bfdb01c8bf53aa1a601c88445a02fd0279a560ae43c48f909d
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# Changelog
|
2
|
+
All notable changes to this project will be documented in this file.
|
3
|
+
|
4
|
+
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
|
5
|
+
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
|
6
|
+
|
7
|
+
## [Unreleased]
|
8
|
+
|
9
|
+
## [0.2.0] - 2017-08-15
|
10
|
+
### Added
|
11
|
+
- Add support for lists (arrays)
|
12
|
+
|
13
|
+
### Changed
|
14
|
+
- Change `type` in the reducer matchers from classes to dry-types
|
15
|
+
|
16
|
+
### Fixed
|
17
|
+
- Support empty queries
|
18
|
+
|
19
|
+
## [0.1.0] - 2017-08-14
|
20
|
+
### Added
|
21
|
+
- Initial implementation of querylicious, with query-parser and query-reducer
|
22
|
+
|
23
|
+
[Unreleased]: https://github.com/Sonans/querylicious/compare/v0.1.0...HEAD
|
24
|
+
[0.1.0]: https://github.com/Sonans/querylicious/compare/v0.0.0...v0.1.0
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
data/lib/querylicious/matcher.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'dry-matcher'
|
4
|
+
require 'querylicious/types'
|
4
5
|
|
5
6
|
module Querylicious
|
6
7
|
# A matcher for query key-value pairs
|
@@ -9,18 +10,18 @@ module Querylicious
|
|
9
10
|
# matchers
|
10
11
|
class Evaluator < Dry::Matcher::Evaluator
|
11
12
|
def phrase(&block)
|
12
|
-
key('phrase', op: :eql, type: ::String, &block)
|
13
|
+
key('phrase', op: :eql, type: Types::Strict::String, &block)
|
13
14
|
end
|
14
15
|
|
15
16
|
def not_phrase(&block)
|
16
|
-
key('phrase', op: :not_eql, type: ::String, &block)
|
17
|
+
key('phrase', op: :not_eql, type: Types::Strict::String, &block)
|
17
18
|
end
|
18
19
|
end
|
19
20
|
|
20
21
|
CASES = {
|
21
22
|
key: Dry::Matcher::Case.new(
|
22
|
-
match: lambda do |pair, key, op: :eql, type:
|
23
|
-
pair.key == key && pair.op == op && pair.value
|
23
|
+
match: lambda do |pair, key, op: :eql, type: Types::Any|
|
24
|
+
pair.key == key && pair.op == op && type.valid?(pair.value)
|
24
25
|
end,
|
25
26
|
resolve: ->(pair) { pair.value }
|
26
27
|
),
|
data/lib/querylicious/parser.rb
CHANGED
@@ -6,7 +6,7 @@ module Querylicious
|
|
6
6
|
# Parser for Querylicious search queries
|
7
7
|
class Parser < Parslet::Parser
|
8
8
|
rule(:expression) do
|
9
|
-
(kv_pair | phrase) >> (space >> expression).repeat
|
9
|
+
((kv_pair | phrase) >> (space >> expression).repeat).maybe
|
10
10
|
end
|
11
11
|
|
12
12
|
rule(:phrase) do
|
@@ -22,12 +22,12 @@ module Querylicious
|
|
22
22
|
|
23
23
|
rule(:key) { word }
|
24
24
|
rule(:value) do
|
25
|
-
range | (kv_op.as(:op).maybe >> (datetime | integer | word | string))
|
25
|
+
list | range | (kv_op.as(:op).maybe >> (datetime | integer | word | string))
|
26
26
|
end
|
27
27
|
|
28
28
|
rule(:kv_op) { (str('>=') | str('>') | str('<=') | str('<')).as(:symbol) }
|
29
29
|
|
30
|
-
rule(:word) { match('[[:graph:]&&[^"
|
30
|
+
rule(:word) { match('[[:graph:]&&[^":.,]]').repeat(1).as(:string) }
|
31
31
|
rule(:string) do
|
32
32
|
quotemark >> match('[[^"]&&[:print:]]').repeat(0).as(:string) >> quotemark
|
33
33
|
end
|
@@ -39,6 +39,14 @@ module Querylicious
|
|
39
39
|
(star | datetime | integer | word).as(:end)
|
40
40
|
).as(:range)
|
41
41
|
end
|
42
|
+
|
43
|
+
rule(:list) do
|
44
|
+
((range | datetime | integer | word | string) >>
|
45
|
+
(comma >>
|
46
|
+
(range | datetime | integer | word | string)).repeat(1)
|
47
|
+
).as(:list)
|
48
|
+
end
|
49
|
+
|
42
50
|
rule(:datetime) do
|
43
51
|
(date >> str('T') >> time).as(:datetime) | date.as(:date)
|
44
52
|
end
|
@@ -56,6 +64,7 @@ module Querylicious
|
|
56
64
|
rule(:quotemark) { match('"') }
|
57
65
|
rule(:star) { str('*').as(:symbol) }
|
58
66
|
rule(:dotdot) { str('..') }
|
67
|
+
rule(:comma) { str(',') }
|
59
68
|
|
60
69
|
rule(:space) { match('[[:space:]]').repeat(1) }
|
61
70
|
rule(:space?) { space.maybe }
|
@@ -8,6 +8,7 @@ require 'querylicious/key_value_pair'
|
|
8
8
|
module Querylicious
|
9
9
|
# Transformer for turning a parsed query string into a list of KeyValuePair
|
10
10
|
class Transform < Parslet::Transform
|
11
|
+
rule('') { nil }
|
11
12
|
rule(string: simple(:it)) { Types::Coercible::String[it] }
|
12
13
|
rule(integer: simple(:it)) { Types::Form::Int[it] }
|
13
14
|
rule(date: simple(:it)) { Types::Form::Date[it] }
|
@@ -28,6 +29,8 @@ module Querylicious
|
|
28
29
|
end
|
29
30
|
end
|
30
31
|
|
32
|
+
rule( list: sequence(:it)) { Types::Form::Array[it] }
|
33
|
+
|
31
34
|
rule(range: { start: simple(:first), end: simple(:last) }) do
|
32
35
|
if first == :* && last == :*
|
33
36
|
:*
|
@@ -58,6 +61,13 @@ module Querylicious
|
|
58
61
|
KeyValuePair.new(key: key, value: value, op: op)
|
59
62
|
end
|
60
63
|
|
64
|
+
rule(pair: { key: simple(:key), value: sequence(:value) }) do
|
65
|
+
KeyValuePair.new(key: key, value: value)
|
66
|
+
end
|
67
|
+
rule(pair: { key: simple(:key), value: sequence(:value), op: simple(:op) }) do
|
68
|
+
KeyValuePair.new(key: key, value: value, op: op)
|
69
|
+
end
|
70
|
+
|
61
71
|
rule(op: simple(:op), string: simple(:it)) do
|
62
72
|
{ object: Types::Coercible::String[it], op: op }
|
63
73
|
end
|
data/querylicious.gemspec
CHANGED
@@ -18,6 +18,8 @@ Gem::Specification.new do |spec|
|
|
18
18
|
end
|
19
19
|
spec.require_paths = %w[lib]
|
20
20
|
|
21
|
+
spec.required_ruby_version = '>= 2.3'
|
22
|
+
|
21
23
|
spec.add_runtime_dependency 'parslet', '~> 1.8'
|
22
24
|
spec.add_runtime_dependency 'dry-matcher', '~> 0.6.0'
|
23
25
|
spec.add_runtime_dependency 'dry-types', '~> 0.11.0'
|
@@ -25,9 +27,11 @@ Gem::Specification.new do |spec|
|
|
25
27
|
spec.add_runtime_dependency 'dry-initializer', '~> 1.4'
|
26
28
|
|
27
29
|
spec.add_development_dependency 'bundler', '~> 1.15'
|
28
|
-
spec.add_development_dependency 'rake', '~>
|
30
|
+
spec.add_development_dependency 'rake', '~> 12.0'
|
31
|
+
spec.add_development_dependency 'reek', '~> 4.7'
|
29
32
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
30
33
|
spec.add_development_dependency 'rspec-parameterized', '~> 0.4.0'
|
34
|
+
spec.add_development_dependency 'rubocop', '~> 0.49.1'
|
31
35
|
spec.add_development_dependency 'pry', '~> 0.10.4'
|
32
|
-
spec.add_development_dependency 'simplecov', '~> 0.
|
36
|
+
spec.add_development_dependency 'simplecov', '~> 0.15.0'
|
33
37
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: querylicious
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jo-Herman Haugholt
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-08-
|
11
|
+
date: 2017-08-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: parslet
|
@@ -100,14 +100,28 @@ dependencies:
|
|
100
100
|
requirements:
|
101
101
|
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: '
|
103
|
+
version: '12.0'
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: '
|
110
|
+
version: '12.0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: reek
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '4.7'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '4.7'
|
111
125
|
- !ruby/object:Gem::Dependency
|
112
126
|
name: rspec
|
113
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -136,6 +150,20 @@ dependencies:
|
|
136
150
|
- - "~>"
|
137
151
|
- !ruby/object:Gem::Version
|
138
152
|
version: 0.4.0
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: rubocop
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - "~>"
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: 0.49.1
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - "~>"
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: 0.49.1
|
139
167
|
- !ruby/object:Gem::Dependency
|
140
168
|
name: pry
|
141
169
|
requirement: !ruby/object:Gem::Requirement
|
@@ -156,14 +184,14 @@ dependencies:
|
|
156
184
|
requirements:
|
157
185
|
- - "~>"
|
158
186
|
- !ruby/object:Gem::Version
|
159
|
-
version: 0.
|
187
|
+
version: 0.15.0
|
160
188
|
type: :development
|
161
189
|
prerelease: false
|
162
190
|
version_requirements: !ruby/object:Gem::Requirement
|
163
191
|
requirements:
|
164
192
|
- - "~>"
|
165
193
|
- !ruby/object:Gem::Version
|
166
|
-
version: 0.
|
194
|
+
version: 0.15.0
|
167
195
|
description:
|
168
196
|
email:
|
169
197
|
- jo-herman@sonans.no
|
@@ -174,6 +202,7 @@ files:
|
|
174
202
|
- ".reek"
|
175
203
|
- ".rspec"
|
176
204
|
- ".rubocop.yml"
|
205
|
+
- CHANGELOG.md
|
177
206
|
- CODE_OF_CONDUCT.md
|
178
207
|
- Gemfile
|
179
208
|
- LICENSE.txt
|
@@ -202,7 +231,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
202
231
|
requirements:
|
203
232
|
- - ">="
|
204
233
|
- !ruby/object:Gem::Version
|
205
|
-
version: '
|
234
|
+
version: '2.3'
|
206
235
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
207
236
|
requirements:
|
208
237
|
- - ">="
|