activerecord-where-any-of 1.0.6 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Rakefile +22 -0
- data/activerecord-where-any-of.gemspec +4 -3
- data/lib/active_record/where-any-of-mixin-rails-5.rb +19 -0
- data/lib/active_record/where-any-of-mixin.rb +6 -1
- data/lib/activerecord-where-any-of.rb +5 -1
- data/spec/database.sqlite3 +0 -0
- data/spec/lib/activerecord_where_any_of_spec.rb +93 -0
- data/spec/spec.opts +2 -0
- data/spec/spec_helper.rb +11 -0
- data/spec/support/active_record.rb +10 -0
- data/spec/support/example_model.rb +23 -0
- data/spec/support/match_ignoring_whitespace.rb +18 -0
- metadata +26 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 07f33898c696d787dbb54fe69e22445332f59d74
|
4
|
+
data.tar.gz: ab421f360ba43c7bf6ef5dcb36dd37cc3130884a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ea1dae0d404b1cf67210eee30a18df9e498cd99685c48b582536cb15b4c750f8e22c79776aa1c1ab07b94b9c724fb8587112e10adbf18517ca516306401c35c3
|
7
|
+
data.tar.gz: 55e261b044362ddbf309c9c1e2a9cc5fff22da86f3b78654c2a1ade5c3ff0e18ebe41fe5906f130055aa471e02acc18f2171dee7837ba62bdef639e5a29197cb
|
data/Rakefile
CHANGED
@@ -1 +1,23 @@
|
|
1
1
|
require "bundler/gem_tasks"
|
2
|
+
|
3
|
+
namespace :rspec do
|
4
|
+
|
5
|
+
desc "Run specs against ActiveRecord 3"
|
6
|
+
task :active_record_3 do
|
7
|
+
sh 'ACTIVE_RECORD_VERSION=3 rspec -O spec/spec.opts'
|
8
|
+
end
|
9
|
+
|
10
|
+
desc "Run specs against ActiveRecord 4"
|
11
|
+
task :active_record_4 do
|
12
|
+
sh 'ACTIVE_RECORD_VERSION=4 rspec -O spec/spec.opts'
|
13
|
+
end
|
14
|
+
|
15
|
+
desc "Run specs against ActiveRecord 5"
|
16
|
+
task :active_record_5 do
|
17
|
+
sh 'ACTIVE_RECORD_VERSION=5 rspec -O spec/spec.opts'
|
18
|
+
end
|
19
|
+
|
20
|
+
desc "Run specs against all three versions of ActiveRecord"
|
21
|
+
task all: [:active_record_3, :active_record_4, :active_record_5]
|
22
|
+
|
23
|
+
end
|
@@ -1,10 +1,10 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'activerecord-where-any-of'
|
3
|
-
s.version = '1.0
|
3
|
+
s.version = '1.1.0'
|
4
4
|
s.license = 'MIT'
|
5
|
-
s.date = '
|
5
|
+
s.date = '2016-12-25'
|
6
6
|
s.summary = 'A simple mixin to ActiveRecord::Base that allows use of OR arel relations.'
|
7
|
-
s.description = '
|
7
|
+
s.description = 'Should work in Rails 3, 4, & 5. However, in Rails 5 use of #or is prefered.'
|
8
8
|
s.description = File.read(File.expand_path('../README.md', __FILE__))[/Description:\n-+\s*(.*?)\n\n/m, 1]
|
9
9
|
s.authors = ['David McCullars']
|
10
10
|
s.email = ['david.mccullars@gmail.com']
|
@@ -15,4 +15,5 @@ Gem::Specification.new do |s|
|
|
15
15
|
s.add_runtime_dependency 'activerecord', '>= 3.0'
|
16
16
|
s.add_development_dependency 'bundler', '>= 1.3'
|
17
17
|
s.add_development_dependency 'rake'
|
18
|
+
s.add_development_dependency 'rspec'
|
18
19
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# Rails 5+ mixin
|
2
|
+
module ActiveRecord
|
3
|
+
module WhereAnyOfMixin
|
4
|
+
|
5
|
+
def where_any_of(*conditions)
|
6
|
+
# Rails 5 comes with an #or method for relations, so we can just use that
|
7
|
+
# It is advised that once on Rails 5, this gem should be removed.
|
8
|
+
conditions = conditions.map do |c|
|
9
|
+
if c.is_a? Symbol or c.is_a? String
|
10
|
+
self.unscoped.send(c)
|
11
|
+
else
|
12
|
+
c
|
13
|
+
end
|
14
|
+
end
|
15
|
+
all.merge conditions.reduce(:or)
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
@@ -1,16 +1,21 @@
|
|
1
|
+
# Rails 4+ mixin
|
1
2
|
module ActiveRecord
|
2
3
|
module WhereAnyOfMixin
|
3
4
|
|
4
5
|
def where_any_of(*conditions)
|
5
6
|
# Takes any number of scopes and OR them together
|
6
7
|
# into a new scope which can be combined with other scopes
|
8
|
+
bind_values = []
|
7
9
|
conditions = conditions.map do |c|
|
8
10
|
if c.is_a? Symbol or c.is_a? String
|
9
11
|
c = self.unscoped.send(c)
|
10
12
|
end
|
13
|
+
bind_values.concat(c.bind_values)
|
11
14
|
__convert_string_wheres(c.where_values).reduce(:and)
|
12
15
|
end
|
13
|
-
where(conditions.reduce(:or))
|
16
|
+
s = where(conditions.reduce(:or))
|
17
|
+
s.bind_values += bind_values if bind_values.present?
|
18
|
+
s
|
14
19
|
end
|
15
20
|
|
16
21
|
def __convert_string_wheres(wheres)
|
@@ -1,3 +1,7 @@
|
|
1
1
|
require 'active_record'
|
2
|
-
|
2
|
+
if ActiveRecord::VERSION::MAJOR >= 5
|
3
|
+
require 'active_record/where-any-of-mixin-rails-5'
|
4
|
+
else
|
5
|
+
require 'active_record/where-any-of-mixin'
|
6
|
+
end
|
3
7
|
ActiveRecord::Base.send(:extend, ActiveRecord::WhereAnyOfMixin)
|
Binary file
|
@@ -0,0 +1,93 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'activerecord-where-any-of'
|
3
|
+
|
4
|
+
describe 'where_any_of' do
|
5
|
+
|
6
|
+
subject { ExampleModel }
|
7
|
+
|
8
|
+
let(:lparen) do
|
9
|
+
'(' if ActiveRecord::VERSION::MAJOR <= 3
|
10
|
+
end
|
11
|
+
|
12
|
+
let(:rparen) do
|
13
|
+
')' if ActiveRecord::VERSION::MAJOR <= 3
|
14
|
+
end
|
15
|
+
|
16
|
+
describe '(*relations)' do
|
17
|
+
|
18
|
+
let(:relation) do
|
19
|
+
subject.where_any_of(
|
20
|
+
subject.active.on_shelf('h'),
|
21
|
+
subject.inactive.recent,
|
22
|
+
subject.with_name('apple'),
|
23
|
+
)
|
24
|
+
end
|
25
|
+
|
26
|
+
specify :count do
|
27
|
+
expect(relation.count).to eq(6)
|
28
|
+
end
|
29
|
+
|
30
|
+
specify :first do
|
31
|
+
m = relation.first
|
32
|
+
expect(m.id).to eq(1)
|
33
|
+
expect(m.name).to eq('apple')
|
34
|
+
end
|
35
|
+
|
36
|
+
specify :to_sql do
|
37
|
+
expect(relation.to_sql).to match_ignoring_whitespace(<<-END)
|
38
|
+
SELECT "example_models".*
|
39
|
+
FROM "example_models"
|
40
|
+
WHERE #{lparen}((
|
41
|
+
"example_models"."active" = 't' AND (name LIKE 'h%')
|
42
|
+
OR "example_models"."active" = 'f' AND (created_at > '2016-11-01'))
|
43
|
+
OR "example_models"."name" = 'apple'
|
44
|
+
)#{rparen}
|
45
|
+
END
|
46
|
+
end
|
47
|
+
|
48
|
+
specify :group_count do
|
49
|
+
expect(relation.group(:active).count).to match(true => 2, false => 4)
|
50
|
+
end
|
51
|
+
|
52
|
+
specify :order_limit do
|
53
|
+
expect(relation.order('updated_at DESC').limit(2).pluck(:name)).to eq [
|
54
|
+
"historiette boxthorn quinaldine",
|
55
|
+
"slipcase diorthotic holocentrid plessimetry prestudiously",
|
56
|
+
]
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
describe "(:symbol, 'string', relation)" do
|
62
|
+
|
63
|
+
let(:relation) do
|
64
|
+
subject.where('name <> ?', 'bad').where_any_of(
|
65
|
+
:recent,
|
66
|
+
'active',
|
67
|
+
subject.on_shelf('z'),
|
68
|
+
)
|
69
|
+
end
|
70
|
+
|
71
|
+
specify :count do
|
72
|
+
expect(relation.count).to eq(38)
|
73
|
+
end
|
74
|
+
|
75
|
+
specify :merge_and_count do
|
76
|
+
expect(relation.merge(subject.inactive).count).to eq(4)
|
77
|
+
end
|
78
|
+
|
79
|
+
specify :to_sql do
|
80
|
+
expect(relation.to_sql).to match_ignoring_whitespace(<<-END)
|
81
|
+
SELECT "example_models".*
|
82
|
+
FROM "example_models"
|
83
|
+
WHERE (name <> 'bad') AND #{lparen}((
|
84
|
+
(created_at > '2016-11-01')
|
85
|
+
OR "example_models"."active" = 't')
|
86
|
+
OR (name LIKE 'z%')
|
87
|
+
)#{rparen}
|
88
|
+
END
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
data/spec/spec.opts
ADDED
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
version = ENV.fetch('ACTIVE_RECORD_VERSION', '3.0').to_f
|
2
|
+
raise "Unsupported ActiveRecord version #{version.inspect}" unless version >= 3.0 && version < 6.0
|
3
|
+
gem 'activerecord', "~> #{version}"
|
4
|
+
|
5
|
+
require 'active_record'
|
6
|
+
|
7
|
+
ActiveRecord::Base.establish_connection(
|
8
|
+
adapter: 'sqlite3',
|
9
|
+
database: File.expand_path('../../database.sqlite3', __FILE__),
|
10
|
+
)
|
@@ -0,0 +1,23 @@
|
|
1
|
+
class ExampleModel < ActiveRecord::Base
|
2
|
+
|
3
|
+
def self.with_name(name)
|
4
|
+
where(name: name)
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.on_shelf(letter)
|
8
|
+
letter =~ /\A[a-z]\z/i ? where("name LIKE '#{letter}%'") : where('1=0')
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.active
|
12
|
+
where(active: true)
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.inactive
|
16
|
+
where(active: false)
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.recent
|
20
|
+
where('created_at > ?', Date.parse('2016-11-01'))
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
RSpec::Matchers.define :match_ignoring_whitespace do |expected|
|
2
|
+
match do |actual|
|
3
|
+
expected.to_s.gsub(/\s/, '') == actual.to_s.gsub(/\s/, '')
|
4
|
+
end
|
5
|
+
|
6
|
+
failure_message do |actual|
|
7
|
+
sep = '=' * 80
|
8
|
+
<<-END
|
9
|
+
#{sep}
|
10
|
+
Expected:
|
11
|
+
#{expected.to_s.strip}
|
12
|
+
#{sep}
|
13
|
+
Actual:
|
14
|
+
#{actual.to_s.strip}
|
15
|
+
#{sep}
|
16
|
+
END
|
17
|
+
end
|
18
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord-where-any-of
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David McCullars
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-12-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
55
69
|
description: |-
|
56
70
|
Provides a mechanism for OR'ing together one or more AREL relations. Normally when
|
57
71
|
one performs `SomeModel.where(condition_1).where(condition_2)`, the result is to AND
|
@@ -69,8 +83,16 @@ files:
|
|
69
83
|
- README.md
|
70
84
|
- Rakefile
|
71
85
|
- activerecord-where-any-of.gemspec
|
86
|
+
- lib/active_record/where-any-of-mixin-rails-5.rb
|
72
87
|
- lib/active_record/where-any-of-mixin.rb
|
73
88
|
- lib/activerecord-where-any-of.rb
|
89
|
+
- spec/database.sqlite3
|
90
|
+
- spec/lib/activerecord_where_any_of_spec.rb
|
91
|
+
- spec/spec.opts
|
92
|
+
- spec/spec_helper.rb
|
93
|
+
- spec/support/active_record.rb
|
94
|
+
- spec/support/example_model.rb
|
95
|
+
- spec/support/match_ignoring_whitespace.rb
|
74
96
|
homepage:
|
75
97
|
licenses:
|
76
98
|
- MIT
|
@@ -91,8 +113,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
91
113
|
version: '0'
|
92
114
|
requirements: []
|
93
115
|
rubyforge_project:
|
94
|
-
rubygems_version: 2.
|
116
|
+
rubygems_version: 2.6.7
|
95
117
|
signing_key:
|
96
118
|
specification_version: 4
|
97
119
|
summary: A simple mixin to ActiveRecord::Base that allows use of OR arel relations.
|
98
120
|
test_files: []
|
121
|
+
has_rdoc:
|