where_lower 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -0,0 +1,2 @@
1
+ gemfiles/*.gemfile.lock
2
+ Gemfile.lock
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,14 @@
1
+ script: "bundle exec rspec"
2
+ rvm:
3
+ - 1.9.2
4
+ - 1.9.3
5
+ - 2.0.0
6
+ gemfile:
7
+ - gemfiles/rails3_1.gemfile
8
+ - gemfiles/rails3_2.gemfile
9
+ - gemfiles/rails4_0.gemfile
10
+ matrix:
11
+ exclude:
12
+ - rvm: 1.9.2
13
+ gemfile: gemfiles/rails4_0.gemfile
14
+
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
@@ -0,0 +1,9 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
3
+
4
+ gem 'activerecord'
5
+ gem 'appraisal'
6
+ gem 'rake'
7
+ gem 'sqlite3'
8
+ gem 'rspec'
9
+ gem 'database_cleaner', '>= 1.0.0.RC1' # Need RC1 for Rails 4 support
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,11 @@
1
+ require 'appraisal'
2
+ require 'rubygems'
3
+ require 'bundler/setup'
4
+ require 'bundler/gem_tasks'
5
+ require 'rspec/core/rake_task'
6
+
7
+ task :default do
8
+ sh "rake appraisal:install && rake appraisal spec"
9
+ end
10
+
11
+ RSpec::Core::RakeTask.new(:spec)
@@ -0,0 +1,12 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "appraisal"
6
+ gem "rake"
7
+ gem "sqlite3"
8
+ gem "rspec"
9
+ gem "database_cleaner", ">= 1.0.0.RC1"
10
+ gem "activerecord", "3.1.12"
11
+
12
+ gemspec :path=>"../"
@@ -0,0 +1,12 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "appraisal"
6
+ gem "rake"
7
+ gem "sqlite3"
8
+ gem "rspec"
9
+ gem "database_cleaner", ">= 1.0.0.RC1"
10
+ gem "activerecord", "3.2.13"
11
+
12
+ gemspec :path=>"../"
@@ -0,0 +1,12 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "appraisal"
6
+ gem "rake"
7
+ gem "sqlite3"
8
+ gem "rspec"
9
+ gem "database_cleaner", ">= 1.0.0.RC1"
10
+ gem "activerecord", "4.0.0.beta1"
11
+
12
+ gemspec :path=>"../"
@@ -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
@@ -0,0 +1,3 @@
1
+ module WhereLower
2
+ VERSION = '0.1.0'.freeze
3
+ end
@@ -0,0 +1,5 @@
1
+ require 'active_record'
2
+ require 'where_lower/version'
3
+ require 'where_lower/core'
4
+
5
+ ActiveRecord::Base.send(:include, WhereLower::Core)
@@ -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
@@ -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