where_lower 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +2 -0
- data/.rspec +1 -0
- data/.travis.yml +14 -0
- data/Appraisals +15 -0
- data/Gemfile +9 -0
- data/README.md +33 -0
- data/Rakefile +11 -0
- data/gemfiles/rails3_1.gemfile +12 -0
- data/gemfiles/rails3_2.gemfile +12 -0
- data/gemfiles/rails4_0.gemfile +12 -0
- data/lib/where_lower/core.rb +41 -0
- data/lib/where_lower/version.rb +3 -0
- data/lib/where_lower.rb +5 -0
- data/spec/spec_helper.rb +65 -0
- data/spec/where_lower_spec.rb +144 -0
- data/where_lower.gemspec +34 -0
- metadata +153 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: cb05183f08ea309e144cdbcffaf26008e4dc7f45
|
4
|
+
data.tar.gz: 30367bed82e96ea4d079b9806b027a8f2bf031b1
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: b1f7bc135acc5a1a4833dfd510f0ac870cdc4b84fa63400fc000df6c7a462e08110574bbc7f159e358c1771fa9b00dea0d4eb35e6c788fafc77ef544370bbe50
|
7
|
+
data.tar.gz: 8f0ce99c9dd7ccb2ef814b9f000aeb31105a4f78f1ea51a6d7e9ee2fb1b015461dd5e23cdea63db23e9101fdf586681f192e0810bd4c63009ed333b051b1a9de
|
data/.gitignore
ADDED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/.travis.yml
ADDED
data/Appraisals
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
|
2
|
+
appraise "rails3-1" do
|
3
|
+
version = "3.1.12"
|
4
|
+
gem 'activerecord', version
|
5
|
+
end
|
6
|
+
|
7
|
+
appraise "rails3-2" do
|
8
|
+
version = "3.2.13"
|
9
|
+
gem 'activerecord', version
|
10
|
+
end
|
11
|
+
|
12
|
+
appraise "rails4-0" do
|
13
|
+
version = "4.0.0.beta1"
|
14
|
+
gem 'activerecord', version
|
15
|
+
end
|
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
where_lower
|
2
|
+
===========
|
3
|
+
|
4
|
+
Provide an easy way to use case insensitive `where` in ActiveRecord.
|
5
|
+
|
6
|
+
### Support
|
7
|
+
===========
|
8
|
+
Tested against:
|
9
|
+
- Active Record of version `3.1`, `3.2` and `4.0`
|
10
|
+
- Ruby `1.9.2`, `1.9.3`, `2.0.0` (except Rails 4 with `1.9.2`)
|
11
|
+
|
12
|
+
[![Build Status](https://travis-ci.org/PikachuEXE/where_lower.png?branch=master)](https://travis-ci.org/PikachuEXE/where_lower)
|
13
|
+
|
14
|
+
Install
|
15
|
+
=======
|
16
|
+
|
17
|
+
```ruby
|
18
|
+
gem 'where_lower'
|
19
|
+
```
|
20
|
+
|
21
|
+
Usage
|
22
|
+
=====
|
23
|
+
Supports `String`, `Array`, `Range`
|
24
|
+
Values in `Array` and `Range` will be converted to `String` and then `downcase`
|
25
|
+
Other types will not be touched
|
26
|
+
|
27
|
+
```ruby
|
28
|
+
SomeActiveRecordClass.where_lower(attribute1: 'AbC', attribute2: ['stRing', 123, :symBol], attribute3: ('AA'..'AZ'))
|
29
|
+
```
|
30
|
+
|
31
|
+
Contributors
|
32
|
+
============
|
33
|
+
[Matthew Rudy Jacobs](https://github.com/matthewrudy) (Who wrote the first version of `where_lower` method)
|
data/Rakefile
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
module WhereLower
|
2
|
+
module Core
|
3
|
+
def self.included(base)
|
4
|
+
base.extend(ClassMethods)
|
5
|
+
end
|
6
|
+
|
7
|
+
module ClassMethods
|
8
|
+
def where_lower(fields)
|
9
|
+
fields.is_a?(Hash) or raise AugumentError, 'fields is not a Hash'
|
10
|
+
|
11
|
+
scope = self
|
12
|
+
table = self.arel_table
|
13
|
+
|
14
|
+
fields.each do |field_name, value|
|
15
|
+
case value
|
16
|
+
when Range
|
17
|
+
value = Range.new(value.begin.to_s.downcase, value.end.to_s.downcase, value.exclude_end?)
|
18
|
+
scope = scope.where(
|
19
|
+
table[field_name].lower.in(value)
|
20
|
+
)
|
21
|
+
when Array # Assume the content to be string, or can be converted to string
|
22
|
+
value = value.to_a.map {|x| x.to_s.downcase}
|
23
|
+
scope = scope.where(
|
24
|
+
table[field_name].lower.in(value)
|
25
|
+
)
|
26
|
+
when String
|
27
|
+
scope = scope.where(
|
28
|
+
table[field_name].lower.eq(table.lower(value))
|
29
|
+
)
|
30
|
+
else # other single value classes
|
31
|
+
scope = scope.where(
|
32
|
+
table[field_name].eq(value)
|
33
|
+
)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
scope
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/lib/where_lower.rb
ADDED
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'active_record'
|
2
|
+
require 'where_lower'
|
3
|
+
require 'database_cleaner'
|
4
|
+
require 'logger'
|
5
|
+
|
6
|
+
# ActiveRecord::Base.logger = Logger.new(STDOUT) # for easier debugging
|
7
|
+
|
8
|
+
RSpec.configure do |config|
|
9
|
+
config.before(:suite) do
|
10
|
+
DatabaseCleaner.strategy = :transaction
|
11
|
+
end
|
12
|
+
|
13
|
+
config.before do
|
14
|
+
DatabaseCleaner.start
|
15
|
+
end
|
16
|
+
|
17
|
+
config.after do
|
18
|
+
DatabaseCleaner.clean
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
# connect
|
23
|
+
ActiveRecord::Base.establish_connection(
|
24
|
+
:adapter => "sqlite3",
|
25
|
+
:database => ":memory:"
|
26
|
+
)
|
27
|
+
|
28
|
+
# create tables
|
29
|
+
ActiveRecord::Schema.define(:version => 1) do
|
30
|
+
create_table :parents do |t|
|
31
|
+
t.string :name
|
32
|
+
t.text :description
|
33
|
+
t.integer :age, null: false, default: 21
|
34
|
+
t.boolean :is_minecraft_lover, default: true
|
35
|
+
|
36
|
+
t.timestamps
|
37
|
+
end
|
38
|
+
|
39
|
+
create_table :chirdren do |t|
|
40
|
+
t.string :name
|
41
|
+
t.text :description
|
42
|
+
t.integer :age, null: false, default: 0
|
43
|
+
t.boolean :is_minecraft_lover, default: true
|
44
|
+
|
45
|
+
t.integer :parent_id
|
46
|
+
|
47
|
+
t.timestamps
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
class ActiveRecord::Base
|
52
|
+
def self.silent_set_table_name(name)
|
53
|
+
self.table_name = name
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
# setup models
|
58
|
+
|
59
|
+
class Parent < ActiveRecord::Base
|
60
|
+
has_many :children, inverse_of: :parent
|
61
|
+
end
|
62
|
+
|
63
|
+
class Child < ActiveRecord::Base
|
64
|
+
belongs_to :parent, inverse_of: :children, touch: true
|
65
|
+
end
|
@@ -0,0 +1,144 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe WhereLower do
|
4
|
+
|
5
|
+
let(:parent_name) { 'Parent #1' }
|
6
|
+
let(:parent_name2) { 'Parent #10' }
|
7
|
+
let(:parent_name3) { 'Parent #20' }
|
8
|
+
let(:parent_description) { 'I need a Medic!' }
|
9
|
+
let(:parent_description2) { 'I need a Pokemon!' }
|
10
|
+
|
11
|
+
let!(:parent) do
|
12
|
+
Parent.create!(name: parent_name, description: parent_description,
|
13
|
+
age: 40, is_minecraft_lover: false, created_at: 1.day.ago)
|
14
|
+
end
|
15
|
+
|
16
|
+
describe 'finding records with condition(s) for columns inside the model table' do
|
17
|
+
describe 'finding record using string column' do
|
18
|
+
describe 'with type string' do
|
19
|
+
before do
|
20
|
+
Parent.where(name: parent_name).should_not be_empty
|
21
|
+
Parent.where(name: parent_name2).should be_empty
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'works like where' do
|
25
|
+
Parent.where_lower(name: parent_name).should_not be_empty
|
26
|
+
Parent.where_lower(name: parent_name2).should be_empty
|
27
|
+
end
|
28
|
+
it 'works like where case insensitively' do
|
29
|
+
Parent.where_lower(name: parent_name.swapcase).should_not be_empty
|
30
|
+
Parent.where_lower(name: parent_name2.swapcase).should be_empty
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe 'with type text' do
|
35
|
+
before do
|
36
|
+
Parent.where(description: parent_description).should_not be_empty
|
37
|
+
Parent.where(description: parent_description2).should be_empty
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'works like where' do
|
41
|
+
Parent.where_lower(description: parent_description).should_not be_empty
|
42
|
+
Parent.where_lower(description: parent_description2).should be_empty
|
43
|
+
end
|
44
|
+
it 'works like where case insensitively' do
|
45
|
+
Parent.where_lower(description: parent_description.swapcase).should_not be_empty
|
46
|
+
Parent.where_lower(description: parent_description2.swapcase).should be_empty
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe 'with different types of values in conditions' do
|
51
|
+
describe 'with Range' do
|
52
|
+
before do
|
53
|
+
Parent.where(name: ('Parens'..'Parenu')).should_not be_empty
|
54
|
+
Parent.where(name: ('Parenu'..'Parenv')).should be_empty
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'works like where' do
|
58
|
+
Parent.where_lower(name: ('Parens'..'Parenu')).should_not be_empty
|
59
|
+
Parent.where_lower(name: ('Parenu'..'Parenv')).should be_empty
|
60
|
+
end
|
61
|
+
it 'works like where case insensitively' do
|
62
|
+
Parent.where_lower(name: (('Parens'.downcase)..('Parenu'.downcase))).should_not be_empty
|
63
|
+
Parent.where_lower(name: (('Parenu'.downcase)..('Parenv'.downcase))).should be_empty
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
describe 'with Array' do
|
68
|
+
before do
|
69
|
+
Parent.where(name: [parent_name, parent_name2]).should_not be_empty
|
70
|
+
Parent.where(name: [parent_name2, parent_name3]).should be_empty
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'works like where' do
|
74
|
+
Parent.where_lower(name: [parent_name, parent_name2]).should_not be_empty
|
75
|
+
Parent.where_lower(name: [parent_name2, parent_name3]).should be_empty
|
76
|
+
end
|
77
|
+
it 'works like where case insensitively' do
|
78
|
+
Parent.where_lower(name: [parent_name.swapcase, parent_name2.swapcase]).should_not be_empty
|
79
|
+
Parent.where_lower(name: [parent_name2.swapcase, parent_name3.swapcase]).should be_empty
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
describe 'with nil' do
|
84
|
+
context 'when record with nil value does not exist' do
|
85
|
+
before do
|
86
|
+
Parent.where(name: nil).should be_empty
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'works like where' do
|
90
|
+
Parent.where_lower(name: nil).should be_empty
|
91
|
+
end
|
92
|
+
end
|
93
|
+
context 'when record with nil value does exist' do
|
94
|
+
before do
|
95
|
+
Parent.create!(name: nil)
|
96
|
+
end
|
97
|
+
|
98
|
+
before do
|
99
|
+
Parent.where(name: nil).should_not be_empty
|
100
|
+
end
|
101
|
+
|
102
|
+
it 'works like where' do
|
103
|
+
Parent.where_lower(name: nil).should_not be_empty
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
describe 'with query injection' do
|
109
|
+
it 'prevents injection' do
|
110
|
+
expect do
|
111
|
+
Parent.where_lower(name: "'); truncate table parents")
|
112
|
+
end.to_not change(Parent, :count)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
describe 'finding record using non string columns' do
|
119
|
+
describe 'with type integer' do
|
120
|
+
before do
|
121
|
+
Parent.where(age: 40).should_not be_empty
|
122
|
+
Parent.where(age: 41).should be_empty
|
123
|
+
end
|
124
|
+
|
125
|
+
it 'works like where' do
|
126
|
+
Parent.where_lower(age: 40).should_not be_empty
|
127
|
+
Parent.where_lower(age: 41).should be_empty
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
describe 'with type boolean' do
|
132
|
+
before do
|
133
|
+
Parent.where(is_minecraft_lover: false).should_not be_empty
|
134
|
+
Parent.where(is_minecraft_lover: true).should be_empty
|
135
|
+
end
|
136
|
+
|
137
|
+
it 'works like where' do
|
138
|
+
Parent.where_lower(is_minecraft_lover: false).should_not be_empty
|
139
|
+
Parent.where_lower(is_minecraft_lover: true).should be_empty
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
data/where_lower.gemspec
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
|
4
|
+
author_name = 'PikachuEXE'
|
5
|
+
gem_name = 'where_lower'
|
6
|
+
|
7
|
+
require "#{gem_name}/version"
|
8
|
+
|
9
|
+
Gem::Specification.new do |s|
|
10
|
+
s.platform = Gem::Platform::RUBY
|
11
|
+
s.name = gem_name
|
12
|
+
s.version = WhereLower::VERSION
|
13
|
+
s.summary = 'Provide an easy way to use case insensitive `where` in ActiveRecord.'
|
14
|
+
s.description = 'ActiveRecord provides no method for case insensitive version of `where` method. So here is one. No longer need to use SQL fragment yeah!'
|
15
|
+
|
16
|
+
s.license = 'MIT'
|
17
|
+
|
18
|
+
s.authors = [author_name]
|
19
|
+
s.email = ['pikachuexe@gmail.com']
|
20
|
+
s.homepage = "http://github.com/#{author_name}/#{gem_name}"
|
21
|
+
|
22
|
+
s.files = `git ls-files`.split("\n")
|
23
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
24
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
25
|
+
s.require_paths = ['lib']
|
26
|
+
|
27
|
+
s.add_dependency 'activerecord', '>= 3.1.0', '< 5.0.0'
|
28
|
+
|
29
|
+
s.add_development_dependency 'rake'
|
30
|
+
s.add_development_dependency 'appraisal'
|
31
|
+
s.add_development_dependency 'sqlite3'
|
32
|
+
s.add_development_dependency 'rspec'
|
33
|
+
s.add_development_dependency 'database_cleaner', '>= 1.0.0.RC1'
|
34
|
+
end
|
metadata
ADDED
@@ -0,0 +1,153 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: where_lower
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- PikachuEXE
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-04-12 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activerecord
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 3.1.0
|
20
|
+
- - <
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 5.0.0
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 3.1.0
|
30
|
+
- - <
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 5.0.0
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: rake
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - '>='
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0'
|
40
|
+
type: :development
|
41
|
+
prerelease: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - '>='
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0'
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: appraisal
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - '>='
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0'
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: sqlite3
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - '>='
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
68
|
+
type: :development
|
69
|
+
prerelease: false
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - '>='
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '0'
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: rspec
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - '>='
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '0'
|
82
|
+
type: :development
|
83
|
+
prerelease: false
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - '>='
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '0'
|
89
|
+
- !ruby/object:Gem::Dependency
|
90
|
+
name: database_cleaner
|
91
|
+
requirement: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - '>='
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: 1.0.0.RC1
|
96
|
+
type: :development
|
97
|
+
prerelease: false
|
98
|
+
version_requirements: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - '>='
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: 1.0.0.RC1
|
103
|
+
description: ActiveRecord provides no method for case insensitive version of `where`
|
104
|
+
method. So here is one. No longer need to use SQL fragment yeah!
|
105
|
+
email:
|
106
|
+
- pikachuexe@gmail.com
|
107
|
+
executables: []
|
108
|
+
extensions: []
|
109
|
+
extra_rdoc_files: []
|
110
|
+
files:
|
111
|
+
- .gitignore
|
112
|
+
- .rspec
|
113
|
+
- .travis.yml
|
114
|
+
- Appraisals
|
115
|
+
- Gemfile
|
116
|
+
- README.md
|
117
|
+
- Rakefile
|
118
|
+
- gemfiles/rails3_1.gemfile
|
119
|
+
- gemfiles/rails3_2.gemfile
|
120
|
+
- gemfiles/rails4_0.gemfile
|
121
|
+
- lib/where_lower.rb
|
122
|
+
- lib/where_lower/core.rb
|
123
|
+
- lib/where_lower/version.rb
|
124
|
+
- spec/spec_helper.rb
|
125
|
+
- spec/where_lower_spec.rb
|
126
|
+
- where_lower.gemspec
|
127
|
+
homepage: http://github.com/PikachuEXE/where_lower
|
128
|
+
licenses:
|
129
|
+
- MIT
|
130
|
+
metadata: {}
|
131
|
+
post_install_message:
|
132
|
+
rdoc_options: []
|
133
|
+
require_paths:
|
134
|
+
- lib
|
135
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
136
|
+
requirements:
|
137
|
+
- - '>='
|
138
|
+
- !ruby/object:Gem::Version
|
139
|
+
version: '0'
|
140
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
141
|
+
requirements:
|
142
|
+
- - '>='
|
143
|
+
- !ruby/object:Gem::Version
|
144
|
+
version: '0'
|
145
|
+
requirements: []
|
146
|
+
rubyforge_project:
|
147
|
+
rubygems_version: 2.0.3
|
148
|
+
signing_key:
|
149
|
+
specification_version: 4
|
150
|
+
summary: Provide an easy way to use case insensitive `where` in ActiveRecord.
|
151
|
+
test_files:
|
152
|
+
- spec/spec_helper.rb
|
153
|
+
- spec/where_lower_spec.rb
|