textacular 3.0.0 → 3.1.0

Sign up to get free protection for your applications and to get access to all the features.
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
- gem 'textacular', '~> 3.0', require: 'textacular/rails'
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 'benchmark'
2
+ require 'rake/testtask'
3
+ require 'pry'
8
4
 
9
- $LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/spec')
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
- task :default do
12
- Rake::Task["db:setup"].invoke
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 "Fire up an interactive terminal to play with"
17
- task :console do
18
- require 'pry'
19
- require File.expand_path(File.dirname(__FILE__) + '/lib/textacular')
15
+ desc 'Fire up an interactive terminal to play with'
16
+ task :console => :'db:connect' do
17
+ Pry.start
18
+ end
20
19
 
21
- config = YAML.load_file File.expand_path(File.dirname(__FILE__) + '/spec/config.yml')
22
- ActiveRecord::Base.establish_connection config.merge(:adapter => :postgresql)
20
+ namespace :db do
23
21
 
24
- class Character < ActiveRecord::Base
25
- belongs_to :web_comic
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
- class WebComic < ActiveRecord::Base
29
- has_many :characters
27
+ task :disconnect do
28
+ ActiveRecord::Base.clear_all_connections!
30
29
  end
31
30
 
32
- class Game < ActiveRecord::Base
31
+ desc 'Create the test database'
32
+ task :create do
33
+ sh 'createdb textacular'
33
34
  end
34
35
 
35
- # add ability to reload console
36
- def reload
37
- reload_msg = '# Reloading the console...'
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
- # start the console! :-)
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
- class Game < ActiveRecord::Base
64
- # string :system
65
- # string :title
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
- table.string :name
130
- table.string :author
131
- table.text :review
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 'Drop tables from test database'
144
- task :drop do
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
- ActiveRecord::Migration.instance_eval do
149
- drop_table :games
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 == ActiveRecord::Base
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 == ActiveRecord::Base
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 normalize(Helper.normalize(search_term))
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 scoped.select_values.empty?} #{similarities.join(" + ")} AS #{rank}").
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 normalize(query)
154
- query
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 File.expand_path(File.dirname(__FILE__) + '/textacular/full_text_indexer')
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
@@ -6,5 +6,9 @@ module Textacular
6
6
  initializer "textacular.configure_rails_initialization" do
7
7
  ActiveRecord::Base.extend(Textacular)
8
8
  end
9
+
10
+ rake_tasks do
11
+ load 'textacular/tasks.rb'
12
+ end
9
13
  end
10
14
  end
@@ -1,5 +1,5 @@
1
1
  module Textacular
2
- VERSION = '3.0.0'
2
+ VERSION = '3.1.0'
3
3
 
4
4
  def self.version
5
5
  VERSION
@@ -1,4 +1,5 @@
1
1
  database: textacular
2
- username: <username>
2
+ username: <%= ENV[ 'USER' ] %>
3
3
  pool: 5
4
4
  timeout: 5000
5
+ adapter: postgresql
@@ -0,0 +1,6 @@
1
+ class Character < ActiveRecord::Base
2
+ # string :name
3
+ # string :description
4
+ # integer :web_comic_id
5
+ belongs_to :web_comic
6
+ end
@@ -1,5 +1,3 @@
1
- require 'active_record'
2
-
3
1
  class Game < ActiveRecord::Base
4
2
  # string :system
5
3
  # string :title
@@ -1,5 +1,3 @@
1
- require 'active_record'
2
-
3
1
  class WebComic < ActiveRecord::Base
4
2
  # string :name
5
3
  # string :author
data/spec/spec_helper.rb CHANGED
@@ -1,5 +1,4 @@
1
- $LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/../lib')
2
-
1
+ require 'bundler/setup'
3
2
  require 'yaml'
4
3
  require 'textacular'
5
4
  require 'shoulda'
@@ -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).all
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 error.message, /private method/
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
@@ -21,7 +21,7 @@ class TextacularTest < Test::Unit::TestCase
21
21
  begin
22
22
  ARStandIn.random
23
23
  rescue NoMethodError => error
24
- assert_match error.message, /undefined method `random'/
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 error.message, /undefined method `random'/
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?(:normalize, true)
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.0.0
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-02-27 00:00:00.000000000 Z
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.11.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.11.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: ! "Textacular exposes full text search capabilities from PostgreSQL,
119
- extending\n ActiveRecord with scopes making search easy and fun!"
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: 1.8.23
153
+ rubygems_version: 2.0.3
167
154
  signing_key:
168
- specification_version: 3
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