textacular 3.0.0 → 3.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 +7 -0
- data/CHANGELOG.md +14 -0
- data/README.md +47 -3
- data/Rakefile +37 -131
- data/lib/textacular.rb +18 -10
- data/lib/textacular/full_text_indexer.rb +3 -0
- data/lib/textacular/rails.rb +4 -0
- data/lib/textacular/version.rb +1 -1
- data/spec/config.yml.example +2 -1
- data/spec/fixtures/character.rb +6 -0
- data/spec/fixtures/game.rb +0 -2
- data/spec/fixtures/webcomic.rb +0 -2
- data/spec/spec_helper.rb +1 -2
- data/spec/textacular/searchable_spec.rb +13 -2
- data/spec/textacular_spec.rb +3 -3
- metadata +18 -31
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 53d7c937b144d66969445fd4dfeca06cf295ef44
|
4
|
+
data.tar.gz: 2c7b41331400ed32398a4e8f21c39c9c46513c30
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 709e443eb8c73f0658b5b76418b08e59a9c1caa23f358b6782910554e44a899693aeb57735dc0180e8b08b92fae77c81cbf4ca2565bfcd537914e47be7633082
|
7
|
+
data.tar.gz: 53351eed3f6f8177aee50c80f2c596722f546d12e2cbbe4e92942c4f27cbbc28147cddd926bbdaf33b32d2be2c95031110474d7c0140aef789711b1ca672b1f7
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,19 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
+
## 3.1.0
|
4
|
+
|
5
|
+
* Avoid Deprecation warnings from ActiveRecord 4.0.0.rc2.
|
6
|
+
* Fix `method_missing` in ActiveRecord 4.0.0.rc2.
|
7
|
+
* Remove unused `Textacular#normalize` method.
|
8
|
+
* Add `OR` example to the README.
|
9
|
+
* Fix tests for Ruby 2.0.0 & related improvements.
|
10
|
+
* Improve Rails integration.
|
11
|
+
* Fix dependency loading for textacular rake tasks.
|
12
|
+
* Fix ranking failures when rows had `NULL` column values.
|
13
|
+
* Clean up Rakefile; should make developing the gem nicer.
|
14
|
+
* DEPRECATION: The dynamic search helpers will be removed at the next major
|
15
|
+
release.
|
16
|
+
|
3
17
|
## 3.0.0
|
4
18
|
|
5
19
|
* All deprecations have been resolved. This breaks backwards compatibility.
|
data/README.md
CHANGED
@@ -22,8 +22,9 @@ extending ActiveRecord with scopes making search easy and fun!
|
|
22
22
|
|
23
23
|
In the project's Gemfile add
|
24
24
|
|
25
|
-
|
26
|
-
|
25
|
+
```ruby
|
26
|
+
gem 'textacular', '~> 3.0'
|
27
|
+
```
|
27
28
|
|
28
29
|
#### ActiveRecord outside of Rails
|
29
30
|
|
@@ -57,7 +58,24 @@ Game.advanced_search(system: '!PS2')
|
|
57
58
|
```
|
58
59
|
|
59
60
|
Finally, the `#fuzzy_search` method lets you use Postgres's trigram search
|
60
|
-
funcionality
|
61
|
+
funcionality.
|
62
|
+
|
63
|
+
In order to use this, you'll need to make sure your database has the `pg_trgm`
|
64
|
+
module installed. On your development machine, you can `require textacular/tasks` and run
|
65
|
+
|
66
|
+
```
|
67
|
+
rake textacular:install_trigram
|
68
|
+
```
|
69
|
+
|
70
|
+
Depending on your production environment, you might be able to use the rake
|
71
|
+
task, or you might have to manually run a command. For Postgres 9.1 and above,
|
72
|
+
you'll want to run
|
73
|
+
|
74
|
+
```sql
|
75
|
+
CREATE EXTENSION pg_trgm;
|
76
|
+
```
|
77
|
+
|
78
|
+
Once that's installed, you can use it like this:
|
61
79
|
|
62
80
|
```ruby
|
63
81
|
Comic.fuzzy_search(title: 'Questio') # matches Questionable Content
|
@@ -69,6 +87,13 @@ Searches are also chainable:
|
|
69
87
|
Game.fuzzy_search(title: 'tree').basic_search(system: 'SNES')
|
70
88
|
```
|
71
89
|
|
90
|
+
If you want to search on two or more fields with the OR operator use a hash for
|
91
|
+
the conditions and pass false as the second parameter:
|
92
|
+
|
93
|
+
```ruby
|
94
|
+
Game.basic_search({name: 'Mario', nickname: 'Mario'}, false)
|
95
|
+
```
|
96
|
+
|
72
97
|
|
73
98
|
### Setting Language
|
74
99
|
|
@@ -116,6 +141,25 @@ config.active_record.schema_format = :sql
|
|
116
141
|
$ gem install textacular
|
117
142
|
```
|
118
143
|
|
144
|
+
## Contributing
|
145
|
+
|
146
|
+
Help is gladly welcomed. If you have a feature you'd like to add, it's much more
|
147
|
+
likely to get in (or get in faster) the closer you stick to these steps:
|
148
|
+
|
149
|
+
1. Open an Issue to talk about it. We can discuss whether it's the right
|
150
|
+
direction or maybe help track down a bug, etc.
|
151
|
+
1. Fork the project, and make a branch to work on your feature/fix. Master is
|
152
|
+
where you'll want to start from.
|
153
|
+
1. Write a test for the feature you are about to add
|
154
|
+
1. Run the tests
|
155
|
+
1. Turn the Issue into a Pull Request. There are several ways to do this, but
|
156
|
+
[hub](https://github.com/defunkt/hub) is probably the easiest.
|
157
|
+
1. Bonus points if your Pull Request updates `CHANGES.md` to include a summary
|
158
|
+
of your changes and your name like the other entries. If the last entry is
|
159
|
+
the last release, add a new `## Unreleased` heading.
|
160
|
+
|
161
|
+
If you don't know how to fix something, even just a Pull Request that includes a
|
162
|
+
failing test can be helpful. If in doubt, make an Issue to discuss.
|
119
163
|
|
120
164
|
## LICENSE:
|
121
165
|
|
data/Rakefile
CHANGED
@@ -1,154 +1,60 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
|
3
|
-
require 'rake'
|
4
|
-
require 'yaml'
|
5
|
-
require 'pg'
|
6
1
|
require 'active_record'
|
7
|
-
require '
|
2
|
+
require 'rake/testtask'
|
3
|
+
require 'pry'
|
8
4
|
|
9
|
-
|
5
|
+
Rake::TestTask.new do |t|
|
6
|
+
t.libs << 'spec'
|
7
|
+
t.test_files = FileList[ 'spec/**/*_spec.rb' ]
|
8
|
+
end
|
9
|
+
task :default => :test
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
Rake::Task["test"].invoke
|
11
|
+
file 'spec/config.yml' do |t|
|
12
|
+
sh 'erb spec/config.yml.example > spec/config.yml'
|
14
13
|
end
|
15
14
|
|
16
|
-
desc
|
17
|
-
task :console do
|
18
|
-
|
19
|
-
|
15
|
+
desc 'Fire up an interactive terminal to play with'
|
16
|
+
task :console => :'db:connect' do
|
17
|
+
Pry.start
|
18
|
+
end
|
20
19
|
|
21
|
-
|
22
|
-
ActiveRecord::Base.establish_connection config.merge(:adapter => :postgresql)
|
20
|
+
namespace :db do
|
23
21
|
|
24
|
-
|
25
|
-
|
22
|
+
task :connect => 'spec/config.yml' do |t|
|
23
|
+
ActiveRecord::Base.establish_connection \
|
24
|
+
YAML.load_file 'spec/config.yml'
|
26
25
|
end
|
27
26
|
|
28
|
-
|
29
|
-
|
27
|
+
task :disconnect do
|
28
|
+
ActiveRecord::Base.clear_all_connections!
|
30
29
|
end
|
31
30
|
|
32
|
-
|
31
|
+
desc 'Create the test database'
|
32
|
+
task :create do
|
33
|
+
sh 'createdb textacular'
|
33
34
|
end
|
34
35
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
puts CodeRay.scan(reload_msg, :ruby).term
|
39
|
-
Pry.save_history
|
40
|
-
exec('rake console')
|
36
|
+
desc 'Drop the test database'
|
37
|
+
task :drop => :disconnect do
|
38
|
+
sh 'dropdb textacular'
|
41
39
|
end
|
42
40
|
|
43
|
-
|
44
|
-
welcome = <<-EOS
|
45
|
-
Welcome to the Textacular devloper console. You have some classes you can play with:
|
46
|
-
|
47
|
-
class Character < ActiveRecord::Base
|
48
|
-
# string :name
|
49
|
-
# string :description
|
50
|
-
# integer :web_comic_id
|
51
|
-
|
52
|
-
belongs_to :web_comic
|
53
|
-
end
|
54
|
-
|
55
|
-
class WebComic < ActiveRecord::Base
|
56
|
-
# string :name
|
57
|
-
# string :author
|
58
|
-
# integer :id
|
59
|
-
|
60
|
-
has_many :characters
|
61
|
-
end
|
41
|
+
namespace :migrate do
|
62
42
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
# text :description
|
67
|
-
end
|
68
|
-
EOS
|
69
|
-
|
70
|
-
puts CodeRay.scan(welcome, :ruby).term
|
71
|
-
Pry.start
|
72
|
-
end
|
73
|
-
|
74
|
-
task :test do
|
75
|
-
require 'textacular_spec'
|
76
|
-
require 'textacular/searchable_spec'
|
77
|
-
require 'textacular/full_text_indexer_spec'
|
78
|
-
end
|
79
|
-
|
80
|
-
namespace :db do
|
81
|
-
desc 'Create and configure the test database'
|
82
|
-
task :setup do
|
83
|
-
spec_directory = "#{File.expand_path(File.dirname(__FILE__))}/spec"
|
84
|
-
|
85
|
-
STDOUT.puts "Detecting database configuration..."
|
86
|
-
|
87
|
-
if File.exists?("#{spec_directory}/config.yml")
|
88
|
-
STDOUT.puts "Configuration detected. Skipping confguration."
|
89
|
-
else
|
90
|
-
STDOUT.puts "Would you like to create and configure the test database? y/N"
|
91
|
-
continue = STDIN.gets.chomp
|
92
|
-
|
93
|
-
unless continue =~ /^[y]$/i
|
94
|
-
STDOUT.puts "Done."
|
95
|
-
exit 0
|
96
|
-
end
|
97
|
-
|
98
|
-
STDOUT.puts "Creating database..."
|
99
|
-
`createdb textacular`
|
100
|
-
|
101
|
-
STDOUT.puts "Writing configuration file..."
|
102
|
-
|
103
|
-
config_example = File.read("#{spec_directory}/config.yml.example")
|
104
|
-
|
105
|
-
File.open("#{spec_directory}/config.yml", "w") do |config|
|
106
|
-
config << config_example.sub(/<username>/, `whoami`.chomp)
|
107
|
-
end
|
108
|
-
|
109
|
-
STDOUT.puts "Running migrations..."
|
110
|
-
Rake::Task["db:migrate"].invoke
|
111
|
-
|
112
|
-
STDOUT.puts 'Done.'
|
43
|
+
desc 'Run the test database migrations'
|
44
|
+
task :up => :'db:connect' do
|
45
|
+
ActiveRecord::Migrator.up 'db/migrate'
|
113
46
|
end
|
114
|
-
end
|
115
|
-
|
116
|
-
desc 'Run migrations for test database'
|
117
|
-
task :migrate do
|
118
|
-
config = YAML.load_file File.expand_path(File.dirname(__FILE__) + '/spec/config.yml')
|
119
|
-
ActiveRecord::Base.establish_connection config.merge(:adapter => :postgresql)
|
120
|
-
|
121
|
-
ActiveRecord::Migration.instance_eval do
|
122
|
-
create_table :games do |table|
|
123
|
-
table.string :system
|
124
|
-
table.string :title
|
125
|
-
table.text :description
|
126
|
-
end
|
127
|
-
create_table :web_comics do |table|
|
128
47
|
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
table.integer :id
|
133
|
-
end
|
134
|
-
|
135
|
-
create_table :characters do |table|
|
136
|
-
table.string :name
|
137
|
-
table.string :description
|
138
|
-
table.integer :web_comic_id
|
139
|
-
end
|
48
|
+
desc 'Reverse the test database migrations'
|
49
|
+
task :down => :'db:connect' do
|
50
|
+
ActiveRecord::Migrator.down 'db/migrate'
|
140
51
|
end
|
141
52
|
end
|
53
|
+
task :migrate => :'migrate:up'
|
142
54
|
|
143
|
-
desc '
|
144
|
-
task :
|
145
|
-
config = YAML.load_file File.expand_path(File.dirname(__FILE__) + '/spec/config.yml')
|
146
|
-
ActiveRecord::Base.establish_connection config.merge(:adapter => :postgresql)
|
55
|
+
desc 'Create and configure the test database'
|
56
|
+
task :setup => [ :create, :migrate ]
|
147
57
|
|
148
|
-
|
149
|
-
|
150
|
-
drop_table :web_comics
|
151
|
-
drop_table :characters
|
152
|
-
end
|
153
|
-
end
|
58
|
+
desc 'Drop the test tables and database'
|
59
|
+
task :teardown => [ :'migrate:down', :drop ]
|
154
60
|
end
|
data/lib/textacular.rb
CHANGED
@@ -3,6 +3,9 @@ require 'active_record'
|
|
3
3
|
require 'textacular/version'
|
4
4
|
|
5
5
|
module Textacular
|
6
|
+
autoload :FullTextIndexer, 'textacular/full_text_indexer'
|
7
|
+
autoload :PostgresModuleInstaller, 'textacular/postgres_module_installer'
|
8
|
+
|
6
9
|
def self.searchable_language
|
7
10
|
'english'
|
8
11
|
end
|
@@ -33,8 +36,9 @@ module Textacular
|
|
33
36
|
end
|
34
37
|
|
35
38
|
def method_missing(method, *search_terms)
|
36
|
-
return super if self
|
39
|
+
return super if self.abstract_class?
|
37
40
|
if Helper.dynamic_search_method?(method, self.columns)
|
41
|
+
warn("You are using a dynamic Textacular search method #{method}. These methods are deprecated and will be removed at the next major version release. Please use the has syntax for basic_search and advanced_search.")
|
38
42
|
exclusive = Helper.exclusive_dynamic_search_method?(method, self.columns)
|
39
43
|
columns = exclusive ? Helper.exclusive_dynamic_search_columns(method) : Helper.inclusive_dynamic_search_columns(method)
|
40
44
|
metaclass = class << self; self; end
|
@@ -53,7 +57,7 @@ module Textacular
|
|
53
57
|
end
|
54
58
|
|
55
59
|
def respond_to?(method, include_private = false)
|
56
|
-
return super if self
|
60
|
+
return super if self.abstract_class?
|
57
61
|
Helper.dynamic_search_method?(method, self.columns) or super
|
58
62
|
rescue StandardError
|
59
63
|
super
|
@@ -82,7 +86,7 @@ module Textacular
|
|
82
86
|
results += parse_query_hash(search_term, column_or_table)
|
83
87
|
else
|
84
88
|
column = connection.quote_column_name(column_or_table)
|
85
|
-
search_term = connection.quote
|
89
|
+
search_term = connection.quote Helper.normalize(search_term)
|
86
90
|
|
87
91
|
results << [table_name, column, search_term]
|
88
92
|
end
|
@@ -101,7 +105,7 @@ module Textacular
|
|
101
105
|
end
|
102
106
|
|
103
107
|
def basic_similarity_string(table_name, column, search_term)
|
104
|
-
"ts_rank(to_tsvector(#{quoted_language}, #{table_name}.#{column}::text), plainto_tsquery(#{quoted_language}, #{search_term}::text))"
|
108
|
+
"COALESCE(ts_rank(to_tsvector(#{quoted_language}, #{table_name}.#{column}::text), plainto_tsquery(#{quoted_language}, #{search_term}::text)), 0)"
|
105
109
|
end
|
106
110
|
|
107
111
|
def basic_condition_string(table_name, column, search_term)
|
@@ -118,7 +122,7 @@ module Textacular
|
|
118
122
|
end
|
119
123
|
|
120
124
|
def advanced_similarity_string(table_name, column, search_term)
|
121
|
-
"ts_rank(to_tsvector(#{quoted_language}, #{table_name}.#{column}::text), to_tsquery(#{quoted_language}, #{search_term}::text))"
|
125
|
+
"COALESCE(ts_rank(to_tsvector(#{quoted_language}, #{table_name}.#{column}::text), to_tsquery(#{quoted_language}, #{search_term}::text)), 0)"
|
122
126
|
end
|
123
127
|
|
124
128
|
def advanced_condition_string(table_name, column, search_term)
|
@@ -143,15 +147,19 @@ module Textacular
|
|
143
147
|
end
|
144
148
|
|
145
149
|
def assemble_query(similarities, conditions, exclusive)
|
146
|
-
rank = connection.quote_column_name('rank' + rand.to_s)
|
150
|
+
rank = connection.quote_column_name('rank' + rand(100000000000000000).to_s)
|
147
151
|
|
148
|
-
select("#{quoted_table_name + '.*,' if
|
152
|
+
select("#{quoted_table_name + '.*,' if select_values.empty?} #{similarities.join(" + ")} AS #{rank}").
|
149
153
|
where(conditions.join(exclusive ? " AND " : " OR ")).
|
150
154
|
order("#{rank} DESC")
|
151
155
|
end
|
152
156
|
|
153
|
-
def
|
154
|
-
|
157
|
+
def select_values
|
158
|
+
if ActiveRecord::VERSION::MAJOR == 4
|
159
|
+
all.select_values
|
160
|
+
else
|
161
|
+
scoped.select_values
|
162
|
+
end
|
155
163
|
end
|
156
164
|
|
157
165
|
def searchable_columns
|
@@ -224,4 +232,4 @@ module Textacular
|
|
224
232
|
end
|
225
233
|
end
|
226
234
|
|
227
|
-
require
|
235
|
+
require 'textacular/rails' if defined?(::Rails)
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
1
3
|
class Textacular::FullTextIndexer
|
2
4
|
def generate_migration(model_name)
|
3
5
|
stream_output do |io|
|
@@ -21,6 +23,7 @@ MIGRATION
|
|
21
23
|
|
22
24
|
def stream_output(now = Time.now.utc, &block)
|
23
25
|
if !@output_stream && defined?(Rails)
|
26
|
+
FileUtils.mkdir_p(File.dirname(migration_file_name(now)))
|
24
27
|
File.open(migration_file_name(now), 'w', &block)
|
25
28
|
else
|
26
29
|
@output_stream ||= $stdout
|
data/lib/textacular/rails.rb
CHANGED
data/lib/textacular/version.rb
CHANGED
data/spec/config.yml.example
CHANGED
data/spec/fixtures/character.rb
CHANGED
data/spec/fixtures/game.rb
CHANGED
data/spec/fixtures/webcomic.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -9,6 +9,7 @@ class SearchableTest < Test::Unit::TestCase
|
|
9
9
|
@jhony = WebComicWithSearchable.create :name => "Johnny Wander", :author => "Ananth & Yuko"
|
10
10
|
@ddeeg = WebComicWithSearchable.create :name => "Dominic Deegan", :author => "Mookie"
|
11
11
|
@penny = WebComicWithSearchable.create :name => "Penny Arcade", :author => "Tycho & Gabe"
|
12
|
+
@null = WebComicWithSearchable.create :author => 'Foo'
|
12
13
|
end
|
13
14
|
|
14
15
|
teardown do
|
@@ -19,6 +20,13 @@ class SearchableTest < Test::Unit::TestCase
|
|
19
20
|
assert_equal [@penny], WebComicWithSearchable.advanced_search("Penny")
|
20
21
|
assert_equal [@ddeeg], WebComicWithSearchable.advanced_search("Dominic")
|
21
22
|
end
|
23
|
+
|
24
|
+
should "still rank with NULL columns" do
|
25
|
+
comic = WebComicWithSearchable.basic_search('Foo').first
|
26
|
+
rank = comic.attributes.find { |key, value| key.to_s =~ /\Arank\d+\z/ }.last
|
27
|
+
|
28
|
+
assert rank
|
29
|
+
end
|
22
30
|
end
|
23
31
|
|
24
32
|
context "with one column as parameter" do
|
@@ -47,7 +55,7 @@ class SearchableTest < Test::Unit::TestCase
|
|
47
55
|
should "be not fine with searching for crazy character #{search_term} with advanced search" do
|
48
56
|
# Uses to_tsquery
|
49
57
|
assert_raise(ActiveRecord::StatementInvalid) do
|
50
|
-
WebComicWithSearchableName.advanced_search(search_term).
|
58
|
+
WebComicWithSearchableName.advanced_search(search_term).first
|
51
59
|
end
|
52
60
|
end
|
53
61
|
end
|
@@ -61,7 +69,7 @@ class SearchableTest < Test::Unit::TestCase
|
|
61
69
|
begin
|
62
70
|
WebComicWithSearchableName.searchable_columns
|
63
71
|
rescue NoMethodError => error
|
64
|
-
assert_match
|
72
|
+
assert_match /private method/, error.message
|
65
73
|
end
|
66
74
|
end
|
67
75
|
|
@@ -87,6 +95,9 @@ class SearchableTest < Test::Unit::TestCase
|
|
87
95
|
assert_equal [@penny], WebComicWithSearchableNameAndAuthor.advanced_search("Penny")
|
88
96
|
assert_equal [@penny], WebComicWithSearchableNameAndAuthor.advanced_search("Tycho")
|
89
97
|
end
|
98
|
+
should "allow includes" do
|
99
|
+
assert_equal [@penny], WebComicWithSearchableNameAndAuthor.includes(:characters).advanced_search("Penny")
|
100
|
+
end
|
90
101
|
end
|
91
102
|
end
|
92
103
|
end
|
data/spec/textacular_spec.rb
CHANGED
@@ -21,7 +21,7 @@ class TextacularTest < Test::Unit::TestCase
|
|
21
21
|
begin
|
22
22
|
ARStandIn.random
|
23
23
|
rescue NoMethodError => error
|
24
|
-
assert_match
|
24
|
+
assert_match /undefined method `random'/, error.message
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
@@ -31,7 +31,7 @@ class TextacularTest < Test::Unit::TestCase
|
|
31
31
|
begin
|
32
32
|
NotThere.random
|
33
33
|
rescue NoMethodError => error
|
34
|
-
assert_match
|
34
|
+
assert_match /undefined method `random'/, error.message
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
@@ -187,7 +187,7 @@ class TextacularTest < Test::Unit::TestCase
|
|
187
187
|
end
|
188
188
|
|
189
189
|
should "allow for 2 arguments to #respond_to?" do
|
190
|
-
assert GameExtendedWithTextacular.respond_to?(:
|
190
|
+
assert GameExtendedWithTextacular.respond_to?(:searchable_language, true)
|
191
191
|
end
|
192
192
|
end
|
193
193
|
|
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: textacular
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
5
|
-
prerelease:
|
4
|
+
version: 3.1.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Ben Hamill
|
@@ -11,28 +10,25 @@ authors:
|
|
11
10
|
autorequire:
|
12
11
|
bindir: bin
|
13
12
|
cert_chain: []
|
14
|
-
date: 2013-
|
13
|
+
date: 2013-08-06 00:00:00.000000000 Z
|
15
14
|
dependencies:
|
16
15
|
- !ruby/object:Gem::Dependency
|
17
16
|
name: pg
|
18
17
|
requirement: !ruby/object:Gem::Requirement
|
19
|
-
none: false
|
20
18
|
requirements:
|
21
19
|
- - ~>
|
22
20
|
- !ruby/object:Gem::Version
|
23
|
-
version: 0.
|
21
|
+
version: 0.14.0
|
24
22
|
type: :development
|
25
23
|
prerelease: false
|
26
24
|
version_requirements: !ruby/object:Gem::Requirement
|
27
|
-
none: false
|
28
25
|
requirements:
|
29
26
|
- - ~>
|
30
27
|
- !ruby/object:Gem::Version
|
31
|
-
version: 0.
|
28
|
+
version: 0.14.0
|
32
29
|
- !ruby/object:Gem::Dependency
|
33
30
|
name: shoulda
|
34
31
|
requirement: !ruby/object:Gem::Requirement
|
35
|
-
none: false
|
36
32
|
requirements:
|
37
33
|
- - ~>
|
38
34
|
- !ruby/object:Gem::Version
|
@@ -40,7 +36,6 @@ dependencies:
|
|
40
36
|
type: :development
|
41
37
|
prerelease: false
|
42
38
|
version_requirements: !ruby/object:Gem::Requirement
|
43
|
-
none: false
|
44
39
|
requirements:
|
45
40
|
- - ~>
|
46
41
|
- !ruby/object:Gem::Version
|
@@ -48,7 +43,6 @@ dependencies:
|
|
48
43
|
- !ruby/object:Gem::Dependency
|
49
44
|
name: rake
|
50
45
|
requirement: !ruby/object:Gem::Requirement
|
51
|
-
none: false
|
52
46
|
requirements:
|
53
47
|
- - ~>
|
54
48
|
- !ruby/object:Gem::Version
|
@@ -56,7 +50,6 @@ dependencies:
|
|
56
50
|
type: :development
|
57
51
|
prerelease: false
|
58
52
|
version_requirements: !ruby/object:Gem::Requirement
|
59
|
-
none: false
|
60
53
|
requirements:
|
61
54
|
- - ~>
|
62
55
|
- !ruby/object:Gem::Version
|
@@ -64,41 +57,36 @@ dependencies:
|
|
64
57
|
- !ruby/object:Gem::Dependency
|
65
58
|
name: pry
|
66
59
|
requirement: !ruby/object:Gem::Requirement
|
67
|
-
none: false
|
68
60
|
requirements:
|
69
|
-
- -
|
61
|
+
- - '>='
|
70
62
|
- !ruby/object:Gem::Version
|
71
63
|
version: '0'
|
72
64
|
type: :development
|
73
65
|
prerelease: false
|
74
66
|
version_requirements: !ruby/object:Gem::Requirement
|
75
|
-
none: false
|
76
67
|
requirements:
|
77
|
-
- -
|
68
|
+
- - '>='
|
78
69
|
- !ruby/object:Gem::Version
|
79
70
|
version: '0'
|
80
71
|
- !ruby/object:Gem::Dependency
|
81
72
|
name: pry-doc
|
82
73
|
requirement: !ruby/object:Gem::Requirement
|
83
|
-
none: false
|
84
74
|
requirements:
|
85
|
-
- -
|
75
|
+
- - '>='
|
86
76
|
- !ruby/object:Gem::Version
|
87
77
|
version: '0'
|
88
78
|
type: :development
|
89
79
|
prerelease: false
|
90
80
|
version_requirements: !ruby/object:Gem::Requirement
|
91
|
-
none: false
|
92
81
|
requirements:
|
93
|
-
- -
|
82
|
+
- - '>='
|
94
83
|
- !ruby/object:Gem::Version
|
95
84
|
version: '0'
|
96
85
|
- !ruby/object:Gem::Dependency
|
97
86
|
name: activerecord
|
98
87
|
requirement: !ruby/object:Gem::Requirement
|
99
|
-
none: false
|
100
88
|
requirements:
|
101
|
-
- -
|
89
|
+
- - '>='
|
102
90
|
- !ruby/object:Gem::Version
|
103
91
|
version: '3.0'
|
104
92
|
- - <
|
@@ -107,16 +95,16 @@ dependencies:
|
|
107
95
|
type: :runtime
|
108
96
|
prerelease: false
|
109
97
|
version_requirements: !ruby/object:Gem::Requirement
|
110
|
-
none: false
|
111
98
|
requirements:
|
112
|
-
- -
|
99
|
+
- - '>='
|
113
100
|
- !ruby/object:Gem::Version
|
114
101
|
version: '3.0'
|
115
102
|
- - <
|
116
103
|
- !ruby/object:Gem::Version
|
117
104
|
version: '4.1'
|
118
|
-
description:
|
119
|
-
|
105
|
+
description: |-
|
106
|
+
Textacular exposes full text search capabilities from PostgreSQL, extending
|
107
|
+
ActiveRecord with scopes making search easy and fun!
|
120
108
|
email:
|
121
109
|
- git-commits@benhamill.com
|
122
110
|
- ecin@copypastel.com
|
@@ -145,27 +133,26 @@ files:
|
|
145
133
|
homepage: http://textacular.github.com/textacular
|
146
134
|
licenses:
|
147
135
|
- MIT
|
136
|
+
metadata: {}
|
148
137
|
post_install_message:
|
149
138
|
rdoc_options: []
|
150
139
|
require_paths:
|
151
140
|
- lib
|
152
141
|
required_ruby_version: !ruby/object:Gem::Requirement
|
153
|
-
none: false
|
154
142
|
requirements:
|
155
|
-
- -
|
143
|
+
- - '>='
|
156
144
|
- !ruby/object:Gem::Version
|
157
145
|
version: '0'
|
158
146
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
159
|
-
none: false
|
160
147
|
requirements:
|
161
|
-
- -
|
148
|
+
- - '>='
|
162
149
|
- !ruby/object:Gem::Version
|
163
150
|
version: '0'
|
164
151
|
requirements: []
|
165
152
|
rubyforge_project:
|
166
|
-
rubygems_version:
|
153
|
+
rubygems_version: 2.0.3
|
167
154
|
signing_key:
|
168
|
-
specification_version:
|
155
|
+
specification_version: 4
|
169
156
|
summary: Textacular exposes full text search capabilities from PostgreSQL
|
170
157
|
test_files:
|
171
158
|
- spec/config.yml.example
|