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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e2e54fb0b61c4208e61b6edec4936b1fae5d37c9872c775ed2091f1ebbb0806f
4
- data.tar.gz: 3d0f886c18e7f7acf5725d4c1101acd277805e8b8d02eaf0c524bd6f41b222cb
3
+ metadata.gz: 48dc212ce20b6ca6d502ad3776598375e9aadf5aba67448a0db0833ff9ae9b22
4
+ data.tar.gz: 9110f9d208a47032ded854d4541eb2d212359599f8b6ddc13bdb6add5c4ee6ab
5
5
  SHA512:
6
- metadata.gz: bee8e661b253b3e356b14d0a587ea019d4f8f9bcebf3090d7fbb6e12d410ddd85e29ceecaa41735a3b510a924ac119cd770500ad6c9828992c026b0e81e59bd2
7
- data.tar.gz: ac76a97eb3ec3fd5c42c975462642b2d35366f7e29a1be7c22c32cf07f8f0442b9e79c7a4d4966826be56b6143cb293d8dd5831201166ff94d4b4fe5e72be579
6
+ metadata.gz: a9bfec6dad76471dedab609b8eef445c3b61bfb3eaded66d362849a1f42192de117485b7a9c4157aa8277a7a8a34df5f9c9f1aa15997d001751c92a3259172fe
7
+ data.tar.gz: 38a894d13baec1cb47a68bf805243fe238355dcf65cc35effae2d5c3d304082883fa73e60de07340d2f29c74ad15e89b5b1ca6d20235a63bfd6cd545b07d67af
@@ -1,38 +1,27 @@
1
1
  require 'sequel'
2
2
  require 'sqlite3'
3
3
 
4
- DB = Sequel.sqlite
5
-
6
- if ENV['LOG_TO_STDOUT']
7
- require 'logger'
8
- DB.loggers << Logger.new(STDOUT)
9
- end
10
-
11
- DB.create_table :categories do
12
- primary_key :id
13
- String :name, null: false, unique: true
14
- end
15
-
16
- DB.create_table :tasks do
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
- chain.eager_graph(:category)
35
- .where Sequel.qualify('category', 'name') => token.term
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 categories with priority less than or greater than a given value.
32
+ # Match tasks with matching priority
44
33
  #
45
- # <2 => Categories with priority < 2
46
- # >5 => Categories with priority > 5
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 /\A([<>])([[:digit:]]+)\z/ do |m|
49
- chain.eager_graph(:category)
50
- .where Sequel.expr { priority.send m[1], m[2] }
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(\d{1,2})/(\d{1,2})/(\d{2}\d{2}?)\z} do |m|
60
- date = begin
61
- Date.parse '%d/%d/%d' % m.values_at(3, 1, 2)
62
- rescue ArgumentError
63
- return nil
64
- end
65
- chain.where due_date: date
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 that contain a given term.
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 Sequel.lit 'tasks.name LIKE ?', "%#{token.term}%"
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 '%d/%d/%d' % m.values_at(:y, :m, :d) if m[:y]
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])
@@ -1,3 +1,3 @@
1
1
  module SearchLingo
2
- VERSION = '2.0.0.pre1'
2
+ VERSION = '2.0.0.pre2'
3
3
  end
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 building simple query languages}
13
- spec.description = %q{Framework for building simple query language for converting user queries into database queries.}
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', '~> 4.48'
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.pre1
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: '4.48'
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: '4.48'
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: Framework for building simple query language for converting user queries
126
- into database queries.
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 building simple query languages
180
+ summary: Framework for defining and parsing search queries.
181
181
  test_files: []