search_lingo 2.0.0.pre1 → 2.0.0.pre2
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/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: []
|