active_search 0.0.1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rvmrc +48 -0
- data/.travis.yml +3 -0
- data/Guardfile +9 -0
- data/README.md +3 -3
- data/active_search.gemspec +2 -2
- data/img/tests.png +0 -0
- data/lib/active_search/is_searchable.rb +21 -0
- data/lib/active_search/search_helper.rb +27 -0
- data/lib/active_search/version.rb +1 -1
- data/spec/lib/active_search_spec.rb +118 -0
- data/spec/spec_helper.rb +30 -0
- metadata +15 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d62e32ef5213c4e135d0d4bb69d3b4ac0bdc504c
|
4
|
+
data.tar.gz: b9abf6b9ff1bc7bff9bf05faa1f85c513e49879c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2eec8c4ab05cddbc04f7c197e12551e14f2f67acab4bfd3f75b2f3b5737fc5baec62892f8284418615de24839d5ac81c605ed5ac4c35e524153d4adde26e6b19
|
7
|
+
data.tar.gz: da6c5d1b53f994ebdb67a97f05f9e9c5da411b8ecc740351dc1a1a81d0c73e7b4ff3ea6a44925a7cf9bad3f927ebb534bc22c38331076770d3ac09d7a4df486f
|
data/.rvmrc
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
# This is an RVM Project .rvmrc file, used to automatically load the ruby
|
4
|
+
# development environment upon cd'ing into the directory
|
5
|
+
|
6
|
+
# First we specify our desired <ruby>[@<gemset>], the @gemset name is optional,
|
7
|
+
# Only full ruby name is supported here, for short names use:
|
8
|
+
# echo "rvm use 1.9.3" > .rvmrc
|
9
|
+
environment_id="ruby-1.9.3-p374@searchable"
|
10
|
+
|
11
|
+
# Uncomment the following lines if you want to verify rvm version per project
|
12
|
+
# rvmrc_rvm_version="1.18.3 (stable)" # 1.10.1 seams as a safe start
|
13
|
+
# eval "$(echo ${rvm_version}.${rvmrc_rvm_version} | awk -F. '{print "[[ "$1*65536+$2*256+$3" -ge "$4*65536+$5*256+$6" ]]"}' )" || {
|
14
|
+
# echo "This .rvmrc file requires at least RVM ${rvmrc_rvm_version}, aborting loading."
|
15
|
+
# return 1
|
16
|
+
# }
|
17
|
+
|
18
|
+
# First we attempt to load the desired environment directly from the environment
|
19
|
+
# file. This is very fast and efficient compared to running through the entire
|
20
|
+
# CLI and selector. If you want feedback on which environment was used then
|
21
|
+
# insert the word 'use' after --create as this triggers verbose mode.
|
22
|
+
if [[ -d "${rvm_path:-$HOME/.rvm}/environments"
|
23
|
+
&& -s "${rvm_path:-$HOME/.rvm}/environments/$environment_id" ]]
|
24
|
+
then
|
25
|
+
\. "${rvm_path:-$HOME/.rvm}/environments/$environment_id"
|
26
|
+
[[ -s "${rvm_path:-$HOME/.rvm}/hooks/after_use" ]] &&
|
27
|
+
\. "${rvm_path:-$HOME/.rvm}/hooks/after_use" || true
|
28
|
+
else
|
29
|
+
# If the environment file has not yet been created, use the RVM CLI to select.
|
30
|
+
rvm --create "$environment_id" || {
|
31
|
+
echo "Failed to create RVM environment '${environment_id}'."
|
32
|
+
return 1
|
33
|
+
}
|
34
|
+
fi
|
35
|
+
|
36
|
+
# If you use bundler, this might be useful to you:
|
37
|
+
# if [[ -s Gemfile ]] && {
|
38
|
+
# ! builtin command -v bundle >/dev/null ||
|
39
|
+
# builtin command -v bundle | GREP_OPTIONS= \grep $rvm_path/bin/bundle >/dev/null
|
40
|
+
# }
|
41
|
+
# then
|
42
|
+
# printf "%b" "The rubygem 'bundler' is not installed. Installing it now.\n"
|
43
|
+
# gem install bundler
|
44
|
+
# fi
|
45
|
+
# if [[ -s Gemfile ]] && builtin command -v bundle >/dev/null
|
46
|
+
# then
|
47
|
+
# bundle install | GREP_OPTIONS= \grep -vE '^Using|Your bundle is complete'
|
48
|
+
# fi
|
data/.travis.yml
ADDED
data/Guardfile
ADDED
data/README.md
CHANGED
@@ -1,11 +1,11 @@
|
|
1
|
-
##
|
1
|
+
## ActiveSearch
|
2
2
|
#### By zachmokahn
|
3
3
|
|
4
4
|
This gem is in very early, very beta release. Please report any and all bugs, as well as any or all desired features. I'd love to make this better, or for you to make it better. Fork it, make pull requests, give me feedback. THANKS!
|
5
5
|
|
6
6
|
#### What does it do?
|
7
7
|
|
8
|
-
|
8
|
+
ActiveSearch adds some methods to ActiveRecord::Base Objects
|
9
9
|
|
10
10
|
|
11
11
|
```
|
@@ -39,7 +39,7 @@ This can also be called on an instance of a Class to search against a collection
|
|
39
39
|
|
40
40
|
#### How the Heck do you use this?
|
41
41
|
1. Install the Gem
|
42
|
-
|
42
|
+
|
43
43
|
```ruby
|
44
44
|
gem install searchable
|
45
45
|
```
|
data/active_search.gemspec
CHANGED
@@ -8,9 +8,9 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.version = ActiveSearch::VERSION
|
9
9
|
spec.authors = ["Zachary J. Davy"]
|
10
10
|
spec.email = ["zachmokahn@gmail.com"]
|
11
|
-
spec.description = "
|
11
|
+
spec.description = "ActiveSearch will allow any model to be 'searched for' in a text field given the 'searchable_by' attribute"
|
12
12
|
spec.summary = "Easily make items searchable inside of your app"
|
13
|
-
spec.homepage = "http://github.com/zachmokahn/
|
13
|
+
spec.homepage = "http://github.com/zachmokahn/active_search"
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
16
16
|
spec.files = `git ls-files`.split($/)
|
data/img/tests.png
ADDED
Binary file
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module ActiveSearch
|
2
|
+
module IsSearchable
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
module ClassMethods
|
5
|
+
attr_reader :searchable_values
|
6
|
+
def is_searchable?
|
7
|
+
true
|
8
|
+
end
|
9
|
+
alias searchable? is_searchable?
|
10
|
+
|
11
|
+
def find_by_value(value, association=self)
|
12
|
+
values = []
|
13
|
+
@searchable_values.each do |search|
|
14
|
+
values << association.where("#{search} LIKE ?", "%#{value}%")
|
15
|
+
end
|
16
|
+
values.flatten
|
17
|
+
end
|
18
|
+
alias search_for find_by_value
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'active_support/concern'
|
2
|
+
|
3
|
+
module ActiveRecord
|
4
|
+
class Base
|
5
|
+
def find_by_value(value, association)
|
6
|
+
self.send(association.to_sym).find_by_value(value)
|
7
|
+
end
|
8
|
+
alias search_for find_by_value
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
module ActiveSearch
|
13
|
+
module SearchHelper
|
14
|
+
extend ActiveSupport::Concern
|
15
|
+
module ClassMethods
|
16
|
+
def is_searchable?
|
17
|
+
false
|
18
|
+
end
|
19
|
+
alias searchable? is_searchable?
|
20
|
+
def searchable_by(*values)
|
21
|
+
@searchable_values = values
|
22
|
+
include ActiveSearch::IsSearchable
|
23
|
+
end
|
24
|
+
alias findable_by searchable_by
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,118 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'active_search'
|
3
|
+
|
4
|
+
class Model < ActiveRecord::Base
|
5
|
+
end
|
6
|
+
|
7
|
+
class SearchableModel < ActiveRecord::Base
|
8
|
+
belongs_to :is_not_searchable_model
|
9
|
+
belongs_to :is_searchable_model
|
10
|
+
searchable_by :test, :banana
|
11
|
+
end
|
12
|
+
|
13
|
+
class IsNotSearchableModel < ActiveRecord::Base
|
14
|
+
has_many :searchable_models
|
15
|
+
end
|
16
|
+
|
17
|
+
class IsSearchableModel < ActiveRecord::Base
|
18
|
+
has_many :searchable_models
|
19
|
+
searchable_by :test
|
20
|
+
end
|
21
|
+
|
22
|
+
class FindableModel < ActiveRecord::Base
|
23
|
+
findable_by :test
|
24
|
+
end
|
25
|
+
|
26
|
+
describe ActiveSearch do
|
27
|
+
before(:each) do
|
28
|
+
@model = Model.create(test: "test")
|
29
|
+
@is_not_searchable_model = IsNotSearchableModel.create(test: "test")
|
30
|
+
@is_searchable_model = IsSearchableModel.create(test: "test")
|
31
|
+
@bob = SearchableModel.create(test: "Bob",
|
32
|
+
banana: "yellow",
|
33
|
+
is_not_searchable_model_id: @is_not_searchable_model.id,
|
34
|
+
is_searchable_model_id: @is_searchable_model.id)
|
35
|
+
@bob2 = SearchableModel.create(test: "Bob",
|
36
|
+
banana: "brown",
|
37
|
+
is_not_searchable_model_id: @is_not_searchable_model.id,
|
38
|
+
is_searchable_model_id: @is_searchable_model.id)
|
39
|
+
end
|
40
|
+
describe "Active Record Model" do
|
41
|
+
context "#is_searchable?" do
|
42
|
+
it "returns false by default" do
|
43
|
+
expect(Model.is_searchable?).to be_false
|
44
|
+
end
|
45
|
+
|
46
|
+
it "returns true if '#search_by' is included" do
|
47
|
+
expect(SearchableModel.is_searchable?).to be_true
|
48
|
+
end
|
49
|
+
end
|
50
|
+
context "#searchable_values" do
|
51
|
+
it "returns values passed to '#searchable_by'" do
|
52
|
+
expect(SearchableModel.searchable_values).to include(:test)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
context "#find_by_values" do
|
56
|
+
it "returns an array of matching objects" do
|
57
|
+
expect(SearchableModel.find_by_value("Bob")).to include(@bob)
|
58
|
+
expect(SearchableModel.find_by_value("Bob")).to include(@bob2)
|
59
|
+
expect(SearchableModel.find_by_value("yellow")).to include(@bob)
|
60
|
+
expect(SearchableModel.find_by_value("yellow")).to_not include(@bob2)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
describe "Active Record Associations" do
|
65
|
+
context "#find_by_values" do
|
66
|
+
it "returns an instance of a model's associations found by value when the model is searchable" do
|
67
|
+
expect(@is_searchable_model.class.is_searchable?).to be_true
|
68
|
+
expect(@is_searchable_model.find_by_value("yellow", "searchable_models")).to include(@bob)
|
69
|
+
expect(@is_searchable_model.find_by_value("yellow", "searchable_models")).to_not include(@bob2)
|
70
|
+
end
|
71
|
+
it "returns an instance of a model's associations found by value when the model is not searchable" do
|
72
|
+
expect(@is_not_searchable_model.class.is_searchable?).to be_false
|
73
|
+
expect(@is_not_searchable_model.find_by_value("yellow", "searchable_models")).to include(@bob)
|
74
|
+
expect(@is_not_searchable_model.find_by_value("yellow", "searchable_models")).to_not include(@bob2)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
describe "Partial Matches" do
|
79
|
+
context "#find_by_value" do
|
80
|
+
it "returns the models as long as the value partially matches the '#seachable_values' strings" do
|
81
|
+
expect(SearchableModel.find_by_value("ow")).to include(@bob)
|
82
|
+
expect(SearchableModel.find_by_value("ow")).to include(@bob2)
|
83
|
+
end
|
84
|
+
it "does not return the value if the partial strings do not match" do
|
85
|
+
expect(SearchableModel.find_by_value("low")).to include(@bob)
|
86
|
+
expect(SearchableModel.find_by_value("low")).to_not include(@bob2)
|
87
|
+
expect(SearchableModel.find_by_value("row")).to include(@bob2)
|
88
|
+
expect(SearchableModel.find_by_value("row")).to_not include(@bob)
|
89
|
+
end
|
90
|
+
it "returns the models regardless of case" do
|
91
|
+
expect(SearchableModel.find_by_value("bob")).to include(@bob)
|
92
|
+
expect(SearchableModel.find_by_value("bob")).to include(@bob2)
|
93
|
+
expect(SearchableModel.find_by_value("Yellow")).to include(@bob)
|
94
|
+
expect(SearchableModel.find_by_value("Brown")).to include(@bob2)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
describe "Method Aliases" do
|
99
|
+
context "#searchable?" do
|
100
|
+
it "is an alias for #is_searchable?" do
|
101
|
+
expect(SearchableModel.searchable?).to eq(SearchableModel.is_searchable?)
|
102
|
+
expect(Model.searchable?).to eq(Model.is_searchable?)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
context "#search_for" do
|
106
|
+
it "is an alias for #find_by_value" do
|
107
|
+
expect(SearchableModel.search_for("Bob")).to eq(SearchableModel.find_by_value("Bob"))
|
108
|
+
expect(@is_searchable_model.search_for("yellow", "searchable_models")).to eq(@is_searchable_model.find_by_value("yellow", "searchable_models"))
|
109
|
+
expect(@is_not_searchable_model.search_for("yellow", "searchable_models")).to eq(@is_not_searchable_model.find_by_value("yellow", "searchable_models"))
|
110
|
+
end
|
111
|
+
end
|
112
|
+
context "#findable_by" do
|
113
|
+
it "is an alias for #searchable_by" do
|
114
|
+
expect(FindableModel.searchable?).to eq(true)
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'coveralls'
|
2
|
+
Coveralls.wear!
|
3
|
+
SimpleCov.formatter = SimpleCov::Formatter::HTMLFormatter
|
4
|
+
require 'active_search'
|
5
|
+
require 'active_record'
|
6
|
+
|
7
|
+
ActiveRecord::Base.establish_connection(:adapter => "sqlite3",
|
8
|
+
:database => ":memory:")
|
9
|
+
|
10
|
+
ActiveRecord::Schema.define do
|
11
|
+
self.verbose = false
|
12
|
+
create_table :models, :force => true do |t|
|
13
|
+
t.string :test
|
14
|
+
end
|
15
|
+
create_table :searchable_models, :force => true do |t|
|
16
|
+
t.string :test
|
17
|
+
t.string :banana
|
18
|
+
t.integer :is_not_searchable_model_id
|
19
|
+
t.integer :is_searchable_model_id
|
20
|
+
end
|
21
|
+
create_table :is_not_searchable_models, :force => true do |t|
|
22
|
+
t.string :test
|
23
|
+
end
|
24
|
+
create_table :is_searchable_models, :force => true do |t|
|
25
|
+
t.string :test
|
26
|
+
end
|
27
|
+
create_table :findable_models, :force => true do |t|
|
28
|
+
t.string :test
|
29
|
+
end
|
30
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_search
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Zachary J. Davy
|
@@ -122,8 +122,8 @@ dependencies:
|
|
122
122
|
- - '>='
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '0'
|
125
|
-
description:
|
126
|
-
given the '
|
125
|
+
description: ActiveSearch will allow any model to be 'searched for' in a text field
|
126
|
+
given the 'searchable_by' attribute
|
127
127
|
email:
|
128
128
|
- zachmokahn@gmail.com
|
129
129
|
executables: []
|
@@ -131,14 +131,22 @@ extensions: []
|
|
131
131
|
extra_rdoc_files: []
|
132
132
|
files:
|
133
133
|
- .gitignore
|
134
|
+
- .rvmrc
|
135
|
+
- .travis.yml
|
134
136
|
- Gemfile
|
137
|
+
- Guardfile
|
135
138
|
- LICENSE.txt
|
136
139
|
- README.md
|
137
140
|
- Rakefile
|
138
141
|
- active_search.gemspec
|
142
|
+
- img/tests.png
|
139
143
|
- lib/active_search.rb
|
144
|
+
- lib/active_search/is_searchable.rb
|
145
|
+
- lib/active_search/search_helper.rb
|
140
146
|
- lib/active_search/version.rb
|
141
|
-
|
147
|
+
- spec/lib/active_search_spec.rb
|
148
|
+
- spec/spec_helper.rb
|
149
|
+
homepage: http://github.com/zachmokahn/active_search
|
142
150
|
licenses:
|
143
151
|
- MIT
|
144
152
|
metadata: {}
|
@@ -162,4 +170,6 @@ rubygems_version: 2.1.10
|
|
162
170
|
signing_key:
|
163
171
|
specification_version: 4
|
164
172
|
summary: Easily make items searchable inside of your app
|
165
|
-
test_files:
|
173
|
+
test_files:
|
174
|
+
- spec/lib/active_search_spec.rb
|
175
|
+
- spec/spec_helper.rb
|