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 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