where_lower 0.1.0
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 +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
|
+
[](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
|