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 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: []