search_lingo 2.0.0.pre1 → 2.0.0.pre2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/examples/sequel_example.rb +39 -46
- data/lib/search_lingo/parsers/mdy.rb +1 -1
- data/lib/search_lingo/version.rb +1 -1
- data/search_lingo.gemspec +3 -3
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 48dc212ce20b6ca6d502ad3776598375e9aadf5aba67448a0db0833ff9ae9b22
|
4
|
+
data.tar.gz: 9110f9d208a47032ded854d4541eb2d212359599f8b6ddc13bdb6add5c4ee6ab
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a9bfec6dad76471dedab609b8eef445c3b61bfb3eaded66d362849a1f42192de117485b7a9c4157aa8277a7a8a34df5f9c9f1aa15997d001751c92a3259172fe
|
7
|
+
data.tar.gz: 38a894d13baec1cb47a68bf805243fe238355dcf65cc35effae2d5c3d304082883fa73e60de07340d2f29c74ad15e89b5b1ca6d20235a63bfd6cd545b07d67af
|
data/examples/sequel_example.rb
CHANGED
@@ -1,38 +1,27 @@
|
|
1
1
|
require 'sequel'
|
2
2
|
require 'sqlite3'
|
3
3
|
|
4
|
-
DB = Sequel.sqlite
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
end
|
10
|
-
|
11
|
-
DB.create_table :
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
foreign_key :category_id, :categories
|
18
|
-
String :name, null: false, unique: true
|
19
|
-
Integer :priority, null: false
|
20
|
-
Date :due_date, null: false
|
21
|
-
end
|
22
|
-
|
23
|
-
class Category < Sequel::Model # :nodoc:
|
24
|
-
one_to_many :tasks
|
25
|
-
end
|
26
|
-
|
27
|
-
class Task < Sequel::Model # :nodoc:
|
28
|
-
many_to_one :category
|
29
|
-
end
|
4
|
+
# DB = Sequel.sqlite
|
5
|
+
#
|
6
|
+
# DB.create_table :categories do
|
7
|
+
# primary_key :id
|
8
|
+
# String :name, null: false, unique: true
|
9
|
+
# end
|
10
|
+
#
|
11
|
+
# DB.create_table :tasks do
|
12
|
+
# foreign_key :category_id, :categories
|
13
|
+
# String :name, null: false, unique: true
|
14
|
+
# Integer :priority, null: false
|
15
|
+
# Date :due_date, null: false
|
16
|
+
# end
|
30
17
|
|
31
18
|
class CategoryParser # :nodoc:
|
32
19
|
def call(token, chain)
|
33
20
|
if token.modifier == 'cat'
|
34
|
-
|
35
|
-
|
21
|
+
# This is kind of broken. The categories table will be joined once each
|
22
|
+
# time this parser matches a token.
|
23
|
+
chain.join(:categories, id: :category_id)
|
24
|
+
.where Sequel.qualify('categories', 'name') => token.term
|
36
25
|
end
|
37
26
|
end
|
38
27
|
end
|
@@ -40,14 +29,21 @@ end
|
|
40
29
|
class TaskSearch < SearchLingo::AbstractSearch # :nodoc:
|
41
30
|
parser CategoryParser.new
|
42
31
|
|
43
|
-
# Match
|
32
|
+
# Match tasks with matching priority
|
44
33
|
#
|
45
|
-
# <2 =>
|
46
|
-
# >
|
34
|
+
# prio<2 => Tasks with priority less than 2
|
35
|
+
# prio>2 => Tasks with priority greater than 2
|
36
|
+
# prio=2 => Tasks with priority equal to 5
|
47
37
|
parser do |token, chain|
|
48
|
-
token.match
|
49
|
-
|
50
|
-
|
38
|
+
token.match(/\A prio ([<=>]) (\d+) \z/x) do |m|
|
39
|
+
case m[1]
|
40
|
+
when '<'
|
41
|
+
chain.where { priority < m[2] }
|
42
|
+
when '>'
|
43
|
+
chain.where { priority > m[2] }
|
44
|
+
else
|
45
|
+
chain.where { priority =~ m[2] }
|
46
|
+
end
|
51
47
|
end
|
52
48
|
end
|
53
49
|
|
@@ -56,21 +52,18 @@ class TaskSearch < SearchLingo::AbstractSearch # :nodoc:
|
|
56
52
|
# 7/4/1776 => Tasks with due_date == Date.new(1776, 7, 4)
|
57
53
|
# 7/4/17 => Tasks with due_date == Date.new(2017, 7, 4)
|
58
54
|
parser do |token, chain|
|
59
|
-
token.match %r{\A(
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
55
|
+
token.match %r{\A(?<m>\d{1,2})/(?<d>\d{1,2})/(?<y>\d{2}\d{2}?)\z} do |m|
|
56
|
+
begin
|
57
|
+
date = Date.parse "#{m[:y]}/#{m[:m]}/#{m[:d]}"
|
58
|
+
chain.where due_date: date
|
59
|
+
rescue ArgumentError
|
60
|
+
# Date.parse raised an ArgumentError
|
61
|
+
end
|
66
62
|
end
|
67
63
|
end
|
68
64
|
|
69
|
-
# Match tasks with names
|
70
|
-
#
|
71
|
-
# pay bills => Match tasks with names like "pay bills", "pay bills by today"
|
72
|
-
# brush teeth => Match tasks with names like "brush teeth", "brush teeth and floss"
|
65
|
+
# Match tasks with names containing the given string.
|
73
66
|
def default_parse(token, chain)
|
74
|
-
chain.where
|
67
|
+
chain.where { name.like "%#{token.term}%" }
|
75
68
|
end
|
76
69
|
end
|
@@ -24,7 +24,7 @@ module SearchLingo
|
|
24
24
|
# Available as both a class method and an instance method.
|
25
25
|
def parse(term, relative_to: Date.today)
|
26
26
|
term.match /\A#{US_DATE}\z/ do |m|
|
27
|
-
return Date.parse
|
27
|
+
return Date.parse "#{m[:y]}/#{m[:m]}/#{m[:d]}" if m[:y]
|
28
28
|
|
29
29
|
ref = relative_to
|
30
30
|
day = Integer(m[:d])
|
data/lib/search_lingo/version.rb
CHANGED
data/search_lingo.gemspec
CHANGED
@@ -9,8 +9,8 @@ Gem::Specification.new do |spec|
|
|
9
9
|
spec.authors = ["John Parker"]
|
10
10
|
spec.email = ["jparker@urgetopunt.com"]
|
11
11
|
|
12
|
-
spec.summary = %q{Framework for
|
13
|
-
spec.description = %q{
|
12
|
+
spec.summary = %q{Framework for defining and parsing search queries.}
|
13
|
+
spec.description = %q{SearchLingo is a simple framework for defining simple query languages and translating them into application-specific queries.}
|
14
14
|
spec.homepage = "https://github.com/jparker/search_lingo"
|
15
15
|
spec.license = "MIT"
|
16
16
|
|
@@ -29,6 +29,6 @@ Gem::Specification.new do |spec|
|
|
29
29
|
spec.add_development_dependency 'minitest-focus'
|
30
30
|
spec.add_development_dependency 'mocha'
|
31
31
|
spec.add_development_dependency 'pry'
|
32
|
-
spec.add_development_dependency 'sequel', '~>
|
32
|
+
spec.add_development_dependency 'sequel', '~> 5.0'
|
33
33
|
spec.add_development_dependency 'sqlite3'
|
34
34
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: search_lingo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.0.
|
4
|
+
version: 2.0.0.pre2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Parker
|
@@ -100,14 +100,14 @@ dependencies:
|
|
100
100
|
requirements:
|
101
101
|
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: '
|
103
|
+
version: '5.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: '5.0'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: sqlite3
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -122,8 +122,8 @@ dependencies:
|
|
122
122
|
- - ">="
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '0'
|
125
|
-
description:
|
126
|
-
into
|
125
|
+
description: SearchLingo is a simple framework for defining simple query languages
|
126
|
+
and translating them into application-specific queries.
|
127
127
|
email:
|
128
128
|
- jparker@urgetopunt.com
|
129
129
|
executables: []
|
@@ -177,5 +177,5 @@ rubyforge_project:
|
|
177
177
|
rubygems_version: 2.7.7
|
178
178
|
signing_key:
|
179
179
|
specification_version: 4
|
180
|
-
summary: Framework for
|
180
|
+
summary: Framework for defining and parsing search queries.
|
181
181
|
test_files: []
|