ilike 0.0.3 → 0.0.4

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.
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/README.md CHANGED
@@ -8,9 +8,21 @@ write code that doesn't depend explicitly on your db adapter:
8
8
  ```ruby
9
9
  class Product < ActiveRecord::Base; end
10
10
 
11
- Product.create(:name => 'Mozzarella Cheese', :price => 1.50)
12
- Product.ilike(:name => '%cheese')
13
- => [#<Product id: 2, name: "Mozzarella Cheese", price: #<BigDecimal:7fdeab856c90,'0.15E1',18(18)>>]
11
+ Product.create(:name => 'Pinot wine', :origin => 'France', :price => 13.50)
12
+ Product.create(:name => 'Barolo wine', :origin => 'Italy', :price => 12.50)
13
+
14
+ # basic search:
15
+ Product.ilike(:name => '%wine')
16
+ # => [#<Product id: 2, name: "Pinot wine", origin: "France", price: #<BigDecimal:105b70880,'0.135E2',18(18)>>,
17
+ #<Product id: 3, name: "Barolo wine", origin: "Italy", price: #<BigDecimal:105b705d8,'0.125E2',18(18)>>]
18
+
19
+ # search on multiple fields:
20
+ Product.ilike(:name => '%wine%', :origin => '%Ita%')
21
+ # => [#<Product id: 3, name: "Barolo wine", origin: "Italy", price: #<BigDecimal:1059677a0,'0.125E2',18(18)>>]
22
+
23
+ # search with multiple keywords on the same field:
24
+ Product.ilike(:name => ['%wine', '%barolo%')
25
+ # => [#<Product id: 3, name: "Barolo wine", origin: "Italy", price: #<BigDecimal:1059fe998,'0.125E2',18(18)>>]
14
26
  ```
15
27
 
16
28
 
@@ -28,6 +40,7 @@ Or install it yourself as:
28
40
 
29
41
  $ gem install liker
30
42
 
43
+
31
44
  ## Contributing
32
45
 
33
46
  1. Fork it
@@ -15,6 +15,7 @@ Gem::Specification.new do |gem|
15
15
  gem.require_paths = ["lib"]
16
16
  gem.version = Ilike::VERSION
17
17
 
18
+ gem.add_dependency 'rake'
18
19
  gem.add_dependency 'activerecord', '>= 3.0'
19
20
  gem.add_development_dependency 'rspec'
20
21
  gem.add_development_dependency 'guard-rspec'
@@ -2,10 +2,13 @@ require 'ilike/version'
2
2
  require 'active_record'
3
3
 
4
4
  module Ilike
5
- def ilike(condition)
6
- field = condition.keys.first
7
- value = condition.values.first
8
- where(arel_table[field].matches(value))
5
+ autoload :ArelTemplate, 'ilike/arel_template'
6
+
7
+ def ilike(conditions)
8
+ code = conditions.inject [] do |parts, arr|
9
+ parts << ArelTemplate.new(arr).build
10
+ end.flatten.join('.and')
11
+ class_eval "where(#{code})"
9
12
  end
10
13
  end
11
14
 
@@ -0,0 +1,21 @@
1
+ module Ilike
2
+ class ArelTemplate
3
+ attr_reader :field, :values
4
+
5
+ def initialize(arr)
6
+ @field, @values = arr
7
+ end
8
+
9
+ def build
10
+ if Array === values
11
+ values.map {|value| template(value)}
12
+ else
13
+ template(values)
14
+ end
15
+ end
16
+
17
+ def template(value)
18
+ "(arel_table[:#{field}].matches('#{value}'))"
19
+ end
20
+ end
21
+ end
@@ -1,3 +1,3 @@
1
1
  module Ilike
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ module Ilike
4
+ describe ArelTemplate do
5
+ let(:template) { ArelTemplate.new([:name, 'andrea%'])}
6
+ let(:multi_template) { ArelTemplate.new([:name, ['%andrea%', '%longhi%']])}
7
+
8
+ it 'template builds the basic code for arel' do
9
+ template.template('andrea%').should == "(arel_table[:name].matches('andrea%'))"
10
+ end
11
+
12
+ context 'when passing multiple keywords for field' do
13
+ it 'builds an array of templates' do
14
+ multi_template.build.should be_an(Array)
15
+ end
16
+
17
+ it 'builds expected templates' do
18
+ expected = ["(arel_table[:name].matches('%andrea%'))", "(arel_table[:name].matches('%longhi%'))"]
19
+ multi_template.build.should == expected
20
+ end
21
+ end
22
+ end
23
+ end
@@ -10,16 +10,22 @@ describe Ilike do
10
10
  )
11
11
  ActiveRecord::Schema.define do
12
12
  create_table :products do |t|
13
- t.string :name, :null => false
14
- t.decimal :price, :null => false
13
+ t.string :name, :null => false
14
+ t.string :origin, :null => false
15
+ t.decimal :price, :null => false
15
16
  end
16
17
  end
17
18
  end
18
19
 
19
20
  before do
20
21
  Product.delete_all
21
- @pasta = Product.create(:name => 'Spaghetti Pasta', :price => 1.00)
22
- @cheese = Product.create(:name => 'Mozzarella Fresh Cheese', :price => 1.50)
22
+ @pasta = Product.create(:name => 'Spaghetti Pasta', :origin => 'Italy', :price => 1.00)
23
+ @pinot = Product.create(:name => 'Pinot wine', :origin => 'France', :price => 13.50)
24
+ @barolo = Product.create(:name => 'Barolo wine', :origin => 'Italy', :price => 12.50)
25
+ end
26
+
27
+ it 'finds records that end with the requested string' do
28
+ Product.ilike(:name => '%pasta').should == [@pasta]
23
29
  end
24
30
 
25
31
  it 'finds records that end with the requested string' do
@@ -27,6 +33,19 @@ describe Ilike do
27
33
  end
28
34
 
29
35
  it 'finds records that contain the requested string' do
30
- Product.ilike(:name => '%cheese%').should == [@cheese]
36
+ Product.ilike(:name => '%olo%').should == [@barolo]
37
+ end
38
+
39
+ it 'finds records that match all matchers' do
40
+ Product.ilike(:name => '%wine', :origin => '%fra%').should == [@pinot]
41
+ end
42
+
43
+ it 'searches with all options' do
44
+ Product.ilike(:name => ['%wine%', '%barolo%']).should == [@barolo]
45
+ end
46
+
47
+ it 'builds the expected sql' do
48
+ sql = 'SELECT "products".* FROM "products" WHERE ("products"."name" LIKE \'%wine%\' AND "products"."name" LIKE \'%barolo%\')'
49
+ Product.ilike(:name => ['%wine%', '%barolo%']).to_sql.should == sql
31
50
  end
32
51
  end
metadata CHANGED
@@ -1,8 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ilike
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 23
4
5
  prerelease:
5
- version: 0.0.3
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 4
10
+ version: 0.0.4
6
11
  platform: ruby
7
12
  authors:
8
13
  - andrea longhi
@@ -10,52 +15,79 @@ autorequire:
10
15
  bindir: bin
11
16
  cert_chain: []
12
17
 
13
- date: 2012-12-07 00:00:00 Z
18
+ date: 2012-12-12 00:00:00 Z
14
19
  dependencies:
15
20
  - !ruby/object:Gem::Dependency
16
- name: activerecord
21
+ name: rake
22
+ version_requirements: &id001 !ruby/object:Gem::Requirement
23
+ none: false
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ hash: 3
28
+ segments:
29
+ - 0
30
+ version: "0"
31
+ type: :runtime
32
+ requirement: *id001
17
33
  prerelease: false
18
- requirement: &id001 !ruby/object:Gem::Requirement
34
+ - !ruby/object:Gem::Dependency
35
+ name: activerecord
36
+ version_requirements: &id002 !ruby/object:Gem::Requirement
19
37
  none: false
20
38
  requirements:
21
39
  - - ">="
22
40
  - !ruby/object:Gem::Version
41
+ hash: 7
42
+ segments:
43
+ - 3
44
+ - 0
23
45
  version: "3.0"
24
46
  type: :runtime
25
- version_requirements: *id001
47
+ requirement: *id002
48
+ prerelease: false
26
49
  - !ruby/object:Gem::Dependency
27
50
  name: rspec
28
- prerelease: false
29
- requirement: &id002 !ruby/object:Gem::Requirement
51
+ version_requirements: &id003 !ruby/object:Gem::Requirement
30
52
  none: false
31
53
  requirements:
32
54
  - - ">="
33
55
  - !ruby/object:Gem::Version
56
+ hash: 3
57
+ segments:
58
+ - 0
34
59
  version: "0"
35
60
  type: :development
36
- version_requirements: *id002
61
+ requirement: *id003
62
+ prerelease: false
37
63
  - !ruby/object:Gem::Dependency
38
64
  name: guard-rspec
39
- prerelease: false
40
- requirement: &id003 !ruby/object:Gem::Requirement
65
+ version_requirements: &id004 !ruby/object:Gem::Requirement
41
66
  none: false
42
67
  requirements:
43
68
  - - ">="
44
69
  - !ruby/object:Gem::Version
70
+ hash: 3
71
+ segments:
72
+ - 0
45
73
  version: "0"
46
74
  type: :development
47
- version_requirements: *id003
75
+ requirement: *id004
76
+ prerelease: false
48
77
  - !ruby/object:Gem::Dependency
49
78
  name: sqlite3
50
- prerelease: false
51
- requirement: &id004 !ruby/object:Gem::Requirement
79
+ version_requirements: &id005 !ruby/object:Gem::Requirement
52
80
  none: false
53
81
  requirements:
54
82
  - - ">="
55
83
  - !ruby/object:Gem::Version
84
+ hash: 3
85
+ segments:
86
+ - 0
56
87
  version: "0"
57
88
  type: :development
58
- version_requirements: *id004
89
+ requirement: *id005
90
+ prerelease: false
59
91
  description: easy way to match strings with active record
60
92
  email:
61
93
  - andrea@spaghetticode.it
@@ -67,6 +99,7 @@ extra_rdoc_files: []
67
99
 
68
100
  files:
69
101
  - .gitignore
102
+ - .rspec
70
103
  - Gemfile
71
104
  - Guardfile
72
105
  - LICENSE
@@ -74,7 +107,9 @@ files:
74
107
  - Rakefile
75
108
  - ilike.gemspec
76
109
  - lib/ilike.rb
110
+ - lib/ilike/arel_template.rb
77
111
  - lib/ilike/version.rb
112
+ - spec/lib/ilike/arel_template_spec.rb
78
113
  - spec/lib/ilike_spec.rb
79
114
  - spec/spec_helper.rb
80
115
  homepage: https://github.com/spaghetticode/ilike
@@ -90,12 +125,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
90
125
  requirements:
91
126
  - - ">="
92
127
  - !ruby/object:Gem::Version
128
+ hash: 3
129
+ segments:
130
+ - 0
93
131
  version: "0"
94
132
  required_rubygems_version: !ruby/object:Gem::Requirement
95
133
  none: false
96
134
  requirements:
97
135
  - - ">="
98
136
  - !ruby/object:Gem::Version
137
+ hash: 3
138
+ segments:
139
+ - 0
99
140
  version: "0"
100
141
  requirements: []
101
142
 
@@ -105,6 +146,6 @@ signing_key:
105
146
  specification_version: 3
106
147
  summary: easy way to match strings with active record
107
148
  test_files:
149
+ - spec/lib/ilike/arel_template_spec.rb
108
150
  - spec/lib/ilike_spec.rb
109
151
  - spec/spec_helper.rb
110
- has_rdoc: