posterboy 0.0.1
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.
- data/MIT_LICENSE +20 -0
- data/README +0 -0
- data/lib/posterboy.rb +103 -0
- data/lib/posterboy/document.rb +7 -0
- data/lib/posterboy/version.rb +4 -0
- metadata +169 -0
data/MIT_LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2009 Durran Jordan
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README
ADDED
File without changes
|
data/lib/posterboy.rb
ADDED
@@ -0,0 +1,103 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'active_record'
|
4
|
+
require 'active_support/concern'
|
5
|
+
require 'posterboy/document'
|
6
|
+
require 'posterboy/version'
|
7
|
+
|
8
|
+
module Posterboy #:nodoc:
|
9
|
+
extend ActiveSupport::Concern
|
10
|
+
|
11
|
+
# This is the base query used to perform a full-text search in Postgre.
|
12
|
+
QUERY = "to_tsvector('english', documents.search_text) @@ plainto_tsquery('english', ?)"
|
13
|
+
|
14
|
+
# Operators for performing different types of searches.
|
15
|
+
OPERATORS = { and: '&', or: '|' }
|
16
|
+
|
17
|
+
included do
|
18
|
+
|
19
|
+
# Each searchable model has a reference to a single {#Posterboy::Document},
|
20
|
+
# which is where the searchable attributes will get stored.
|
21
|
+
has_one \
|
22
|
+
:document,
|
23
|
+
as: :searchable,
|
24
|
+
inverse_of: :searchable,
|
25
|
+
class_name: "Posterboy::Document"
|
26
|
+
|
27
|
+
# The search scope takes a space separated list of terms to perform an
|
28
|
+
# AND query on. This should be configurable in the future.
|
29
|
+
#
|
30
|
+
# @example
|
31
|
+
# User.search('Syd London')
|
32
|
+
#
|
33
|
+
# @param [ Symbol ] operator The type of search to perform.
|
34
|
+
# @param [ String ] term The words to search on.
|
35
|
+
#
|
36
|
+
# @return [ ActiveRecord::Relation ] The matching records.
|
37
|
+
scope :search, lambda { | operator, term |
|
38
|
+
if term.present?
|
39
|
+
{
|
40
|
+
include: [:document],
|
41
|
+
conditions: [ QUERY, term.gsub(' ', " #{OPERATORS[:operator]} ") ]
|
42
|
+
}
|
43
|
+
end
|
44
|
+
}
|
45
|
+
|
46
|
+
# Update the searchable {#Document} after each save.
|
47
|
+
set_callback :save, :after, :update_document
|
48
|
+
|
49
|
+
# Searchable fields are stored here.
|
50
|
+
class_inheritable_accessor :searchables
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
# Get the actual values for the attributes that have been defined as
|
56
|
+
# searchable.
|
57
|
+
#
|
58
|
+
# @example
|
59
|
+
# user.searchable_values
|
60
|
+
#
|
61
|
+
# @return [ Array ] The actual values for this record.
|
62
|
+
def searchable_values
|
63
|
+
[].tap do |values|
|
64
|
+
searchables.each do |searchable|
|
65
|
+
searchable.is_a?(Hash) ?
|
66
|
+
values << send(searchable.to_a[0][0]).map(&searchable.to_a[0][1]) :
|
67
|
+
values << send(searchable)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
# Updates or creates the document with the supplied attribute values with
|
73
|
+
# each save.
|
74
|
+
#
|
75
|
+
# @example
|
76
|
+
# user.update_document
|
77
|
+
def update_document
|
78
|
+
if searchables
|
79
|
+
text = searchable_values.flatten.join(' ')
|
80
|
+
return document.update_attribute(:search_text, text) if document
|
81
|
+
create_document(search_text: text)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
module ClassMethods
|
86
|
+
|
87
|
+
# Macro to define which attributes should be searched on.
|
88
|
+
#
|
89
|
+
# @example
|
90
|
+
# class User < ActiveRecord::Base
|
91
|
+
# has_many :tags, through: :user_tags
|
92
|
+
#
|
93
|
+
# search_on :first_name, :last_name, tags: :name
|
94
|
+
# end
|
95
|
+
#
|
96
|
+
# @param [ Array<Symbol> ] args The attributes to search on.
|
97
|
+
def search_on(*args)
|
98
|
+
self.searchables = args
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
ActiveRecord::Base.send(:include, Posterboy)
|
metadata
ADDED
@@ -0,0 +1,169 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: posterboy
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
version: 0.0.1
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Durran Jordan
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2010-11-09 00:00:00 -05:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: pg
|
22
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
23
|
+
none: false
|
24
|
+
requirements:
|
25
|
+
- - ~>
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 0
|
29
|
+
- 9
|
30
|
+
version: "0.9"
|
31
|
+
type: :runtime
|
32
|
+
prerelease: false
|
33
|
+
version_requirements: *id001
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
name: activerecord
|
36
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
37
|
+
none: false
|
38
|
+
requirements:
|
39
|
+
- - ~>
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
segments:
|
42
|
+
- 3
|
43
|
+
version: "3"
|
44
|
+
type: :runtime
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *id002
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: activesupport
|
49
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
segments:
|
55
|
+
- 3
|
56
|
+
version: "3"
|
57
|
+
type: :runtime
|
58
|
+
prerelease: false
|
59
|
+
version_requirements: *id003
|
60
|
+
- !ruby/object:Gem::Dependency
|
61
|
+
name: mocha
|
62
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
63
|
+
none: false
|
64
|
+
requirements:
|
65
|
+
- - ~>
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
segments:
|
68
|
+
- 0
|
69
|
+
- 9
|
70
|
+
- 8
|
71
|
+
version: 0.9.8
|
72
|
+
type: :development
|
73
|
+
prerelease: false
|
74
|
+
version_requirements: *id004
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: rspec
|
77
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
78
|
+
none: false
|
79
|
+
requirements:
|
80
|
+
- - ~>
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
segments:
|
83
|
+
- 2
|
84
|
+
- 0
|
85
|
+
version: "2.0"
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: *id005
|
89
|
+
- !ruby/object:Gem::Dependency
|
90
|
+
name: watchr
|
91
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
92
|
+
none: false
|
93
|
+
requirements:
|
94
|
+
- - ~>
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
segments:
|
97
|
+
- 0
|
98
|
+
- 7
|
99
|
+
version: "0.7"
|
100
|
+
type: :development
|
101
|
+
prerelease: false
|
102
|
+
version_requirements: *id006
|
103
|
+
- !ruby/object:Gem::Dependency
|
104
|
+
name: ruby-debug-wrapper
|
105
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
106
|
+
none: false
|
107
|
+
requirements:
|
108
|
+
- - "="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
segments:
|
111
|
+
- 0
|
112
|
+
- 0
|
113
|
+
- 1
|
114
|
+
version: 0.0.1
|
115
|
+
type: :development
|
116
|
+
prerelease: false
|
117
|
+
version_requirements: *id007
|
118
|
+
description: Adds full-text search to Active Record models on PostgreSQL
|
119
|
+
email:
|
120
|
+
- durran@gmail.com
|
121
|
+
executables: []
|
122
|
+
|
123
|
+
extensions: []
|
124
|
+
|
125
|
+
extra_rdoc_files: []
|
126
|
+
|
127
|
+
files:
|
128
|
+
- lib/posterboy/document.rb
|
129
|
+
- lib/posterboy/version.rb
|
130
|
+
- lib/posterboy.rb
|
131
|
+
- MIT_LICENSE
|
132
|
+
- README
|
133
|
+
has_rdoc: true
|
134
|
+
homepage: http://github.com/durran/posterboy
|
135
|
+
licenses: []
|
136
|
+
|
137
|
+
post_install_message:
|
138
|
+
rdoc_options: []
|
139
|
+
|
140
|
+
require_paths:
|
141
|
+
- lib
|
142
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
143
|
+
none: false
|
144
|
+
requirements:
|
145
|
+
- - ">="
|
146
|
+
- !ruby/object:Gem::Version
|
147
|
+
hash: 398691525175066671
|
148
|
+
segments:
|
149
|
+
- 0
|
150
|
+
version: "0"
|
151
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
152
|
+
none: false
|
153
|
+
requirements:
|
154
|
+
- - ">="
|
155
|
+
- !ruby/object:Gem::Version
|
156
|
+
segments:
|
157
|
+
- 1
|
158
|
+
- 3
|
159
|
+
- 6
|
160
|
+
version: 1.3.6
|
161
|
+
requirements: []
|
162
|
+
|
163
|
+
rubyforge_project: posterboy
|
164
|
+
rubygems_version: 1.3.7
|
165
|
+
signing_key:
|
166
|
+
specification_version: 3
|
167
|
+
summary: PostgreSQL Search Done Easy
|
168
|
+
test_files: []
|
169
|
+
|