full_search 0.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.
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FullSearch
4
+ module Tokenizer
5
+ VALID = %w[unicode61 porter trigram].freeze
6
+
7
+ def self.validate!(value)
8
+ value = value.to_s
9
+ unless VALID.include?(value)
10
+ raise InvalidFieldError, "Unsupported tokenizer: #{value.inspect}. Use one of #{VALID.inspect}"
11
+ end
12
+ value
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FullSearch
4
+ module Typo
5
+ MIN_SQLITE_VERSION = [3, 34].freeze
6
+
7
+ class << self
8
+ def supported?
9
+ major, minor = sqlite_version_parts
10
+ major > MIN_SQLITE_VERSION.first || (major == MIN_SQLITE_VERSION.first && minor >= MIN_SQLITE_VERSION.last)
11
+ end
12
+
13
+ def warn_unsupported!
14
+ warn "[full_search] SQLite #{sqlite_version} does not support the trigram tokenizer. typo_tolerance requires SQLite >= 3.34."
15
+ end
16
+
17
+ private
18
+
19
+ def sqlite_version_parts
20
+ sqlite_version.split(".").first(2).map(&:to_i)
21
+ end
22
+
23
+ def sqlite_version
24
+ ActiveRecord::Base.connection.execute("SELECT sqlite_version() AS v").first["v"]
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FullSearch
4
+ VERSION = "0.1.0"
5
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record"
4
+ require "active_support"
5
+ require "active_support/concern"
6
+
7
+ require "full_search/version"
8
+ require "full_search/config"
9
+ require "full_search/errors"
10
+ require "full_search/tokenizer"
11
+ require "full_search/dsl"
12
+ require "full_search/model"
13
+ require "full_search/index"
14
+ require "full_search/exact_match"
15
+ require "full_search/query_parser"
16
+ require "full_search/highlighter"
17
+ require "full_search/typo"
18
+ require "full_search/search"
19
+ require "full_search/soft_delete"
20
+ require "full_search/callbacks"
21
+ require "full_search/reindex_job"
22
+ require "full_search/test_helpers"
23
+
24
+ ActiveSupport.on_load(:active_record) do
25
+ include FullSearch::Model
26
+ end
27
+
28
+ module FullSearch
29
+ class << self
30
+ def models
31
+ @models ||= []
32
+ end
33
+ end
34
+ end
35
+
36
+ require "full_search/railtie" if defined?(Rails::Railtie)
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails/generators"
4
+
5
+ module FullSearch
6
+ module Generators
7
+ class InstallGenerator < Rails::Generators::Base
8
+ source_root File.expand_path("templates", __dir__)
9
+
10
+ def create_initializer
11
+ template "full_search.rb", "config/initializers/full_search.rb"
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ FullSearch.configure do |config|
4
+ config.auto_manage_schema = Rails.env.local?
5
+
6
+ config.stale_query_behavior = Rails.env.production? ? :log_and_fallback : :raise
7
+
8
+ config.lock_rebuilds = true
9
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ namespace :full_search do
4
+ desc "Rebuild full_search indexes"
5
+ task :rebuild, [:models] => :environment do |_t, args|
6
+ Rails.application.eager_load!
7
+
8
+ models = if args[:models]
9
+ args[:models].split(",").map do |name|
10
+ klass = name.singularize.camelize.constantize rescue nil
11
+ klass || FullSearch.models.find { |m| m.table_name == name }
12
+ end.compact
13
+ else
14
+ FullSearch.models
15
+ end
16
+
17
+ models.each do |model|
18
+ FullSearch::Index.rebuild!(model)
19
+ puts "Rebuilt #{FullSearch::Index.fts_table_name(model)}"
20
+ end
21
+ end
22
+
23
+ desc "Optimize full_search indexes"
24
+ task optimize: :environment do
25
+ Rails.application.eager_load!
26
+ FullSearch.models.each do |model|
27
+ FullSearch::Index.optimize!(model)
28
+ puts "Optimized #{FullSearch::Index.fts_table_name(model)}"
29
+ end
30
+ end
31
+
32
+ desc "Show full_search index status"
33
+ task status: :environment do
34
+ Rails.application.eager_load!
35
+ FullSearch.models.each do |model|
36
+ stored = FullSearch::Index.stored_config_hash(model)
37
+ current = model.full_search_dsl.config_hash
38
+ status = stored == current ? "ok" : "stale"
39
+ puts "#{model.table_name}: #{status} (stored=#{stored}, current=#{current})"
40
+ end
41
+ end
42
+ end
metadata ADDED
@@ -0,0 +1,144 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: full_search
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Ben D'Angelo
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: activerecord
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '8.0'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: '8.0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: railties
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '8.0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '8.0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: sqlite3
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '2.0'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '2.0'
54
+ - !ruby/object:Gem::Dependency
55
+ name: ostruct
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0.6'
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0.6'
68
+ - !ruby/object:Gem::Dependency
69
+ name: minitest
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '5.0'
75
+ type: :development
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '5.0'
82
+ - !ruby/object:Gem::Dependency
83
+ name: rake
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '13.0'
89
+ type: :development
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '13.0'
96
+ description: Declarative full-text search for Rails apps backed by SQLite FTS5
97
+ executables: []
98
+ extensions: []
99
+ extra_rdoc_files: []
100
+ files:
101
+ - README.md
102
+ - lib/full_search.rb
103
+ - lib/full_search/callbacks.rb
104
+ - lib/full_search/config.rb
105
+ - lib/full_search/dsl.rb
106
+ - lib/full_search/errors.rb
107
+ - lib/full_search/exact_match.rb
108
+ - lib/full_search/highlighter.rb
109
+ - lib/full_search/index.rb
110
+ - lib/full_search/model.rb
111
+ - lib/full_search/query_parser.rb
112
+ - lib/full_search/railtie.rb
113
+ - lib/full_search/reindex_job.rb
114
+ - lib/full_search/search.rb
115
+ - lib/full_search/soft_delete.rb
116
+ - lib/full_search/test_helpers.rb
117
+ - lib/full_search/tokenizer.rb
118
+ - lib/full_search/typo.rb
119
+ - lib/full_search/version.rb
120
+ - lib/generators/full_search/install/install_generator.rb
121
+ - lib/generators/full_search/install/templates/full_search.rb
122
+ - lib/tasks/full_search.rake
123
+ homepage: https://github.com/bendangelo/full_search
124
+ licenses:
125
+ - MIT
126
+ metadata: {}
127
+ rdoc_options: []
128
+ require_paths:
129
+ - lib
130
+ required_ruby_version: !ruby/object:Gem::Requirement
131
+ requirements:
132
+ - - ">="
133
+ - !ruby/object:Gem::Version
134
+ version: 4.0.0
135
+ required_rubygems_version: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ version: '0'
140
+ requirements: []
141
+ rubygems_version: 4.0.15
142
+ specification_version: 4
143
+ summary: SQLite FTS5 full-text search for Rails/ActiveRecord
144
+ test_files: []