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 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