pose 3.0.0 → 3.1.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.
- checksums.yaml +4 -4
- data/README.md +42 -19
- data/Rakefile +37 -5
- data/lib/pose/activerecord_base_additions.rb +7 -6
- data/{app/models → lib}/pose/assignment.rb +6 -1
- data/lib/pose/jobs/install.rb +27 -0
- data/lib/pose/jobs/reindex_all.rb +34 -0
- data/lib/pose/jobs/remove.rb +28 -0
- data/lib/pose/jobs/uninstall.rb +19 -0
- data/lib/pose/jobs/vacuum.rb +23 -0
- data/lib/pose/model_class_additions.rb +32 -14
- data/lib/pose/query.rb +49 -9
- data/lib/pose/search.rb +5 -5
- data/lib/pose/static_api.rb +21 -3
- data/lib/pose/version.rb +1 -1
- data/lib/pose/word.rb +33 -0
- data/lib/pose.rb +11 -5
- data/lib/tasks/pose_tasks.rake +16 -27
- data/spec/{dummy/db/development.sqlite3 → db/pose.sqlite3} +0 -0
- data/spec/factories/posable_one.rb +2 -0
- data/spec/factories/posable_three.rb +8 -0
- data/spec/factories/posable_two.rb +2 -0
- data/spec/factories/user.rb +2 -0
- data/spec/lib/pose/activerecord_base_additions_spec.rb +11 -0
- data/spec/{models → lib/pose}/assignment_spec.rb +5 -5
- data/spec/lib/pose/jobs/reindex_all_spec.rb +31 -0
- data/spec/lib/pose/jobs/remove_spec.rb +20 -0
- data/spec/lib/pose/model_class_additions_spec.rb +150 -0
- data/spec/lib/pose/query_spec.rb +106 -8
- data/spec/lib/pose/search_spec.rb +2 -22
- data/spec/lib/pose/word_spec.rb +68 -0
- data/spec/pose_api_spec.rb +33 -13
- data/spec/spec_helper.rb +4 -32
- data/spec/support/config/database.yml +51 -0
- data/spec/support/config/database.yml.example +16 -0
- data/spec/{dummy/db/migrate → support/migrations}/20130308054001_create_posable_one.rb +0 -0
- data/spec/{dummy/db/migrate → support/migrations}/20130308054142_create_posable_two.rb +0 -0
- data/spec/support/migrations/20130308054143_create_posable_three.rb +9 -0
- data/spec/{dummy/db/migrate → support/migrations}/20130708084009_create_users.rb +0 -0
- data/spec/support/migrations/20130808084009_setup_pose_specs.rb +5 -0
- data/spec/{dummy/app → support}/models/posable_one.rb +1 -1
- data/spec/support/models/posable_three.rb +10 -0
- data/spec/{dummy/app → support}/models/posable_two.rb +1 -1
- data/spec/{dummy/app → support}/models/user.rb +1 -1
- data/spec/support/spec_manager.rb +105 -0
- metadata +70 -101
- data/app/models/pose/word.rb +0 -22
- data/db/migrate/20130308144915_pose_install.rb +0 -18
- data/lib/generators/pose/install/install_generator.rb +0 -56
- data/lib/generators/pose/install/templates/install_migration.rb +0 -24
- data/lib/generators/pose/remove/remove_generator.rb +0 -56
- data/lib/generators/pose/remove/templates/remove_migration.rb +0 -23
- data/lib/generators/pose/upgrade/templates/upgrade_migration.rb +0 -7
- data/lib/generators/pose/upgrade/upgrade_generator.rb +0 -35
- data/lib/pose/engine.rb +0 -5
- data/lib/pose/helpers.rb +0 -89
- data/lib/pose/railtie.rb +0 -19
- data/spec/dummy/Rakefile +0 -7
- data/spec/dummy/config/application.rb +0 -23
- data/spec/dummy/config/boot.rb +0 -10
- data/spec/dummy/config/database.yml +0 -25
- data/spec/dummy/config/environment.rb +0 -5
- data/spec/dummy/config/environments/development.rb +0 -30
- data/spec/dummy/config/environments/production.rb +0 -81
- data/spec/dummy/config/environments/test.rb +0 -37
- data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -7
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +0 -4
- data/spec/dummy/config/initializers/inflections.rb +0 -15
- data/spec/dummy/config/initializers/mime_types.rb +0 -5
- data/spec/dummy/config/initializers/secret_token.rb +0 -7
- data/spec/dummy/config/initializers/session_store.rb +0 -8
- data/spec/dummy/config/initializers/wrap_parameters.rb +0 -14
- data/spec/dummy/config/locales/en.yml +0 -5
- data/spec/dummy/config/routes.rb +0 -2
- data/spec/dummy/config.ru +0 -4
- data/spec/dummy/db/schema.rb +0 -47
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/log/development.log +0 -309
- data/spec/dummy/log/test.log +0 -88518
- data/spec/dummy/script/rails +0 -6
- data/spec/lib/pose/helpers_spec.rb +0 -147
- data/spec/models/word_spec.rb +0 -42
data/lib/tasks/pose_tasks.rake
CHANGED
@@ -1,38 +1,27 @@
|
|
1
|
-
include Rake::DSL if defined?(Rake::DSL)
|
2
|
-
require 'ruby-progressbar'
|
3
|
-
|
4
1
|
namespace :pose do
|
5
2
|
|
6
|
-
desc "
|
7
|
-
task :
|
8
|
-
|
9
|
-
|
10
|
-
Pose::Assignment.cleanup_orphaned_pose_assignments progress_bar
|
11
|
-
progress_bar.finish
|
3
|
+
desc "Creates the Pose tables in the database."
|
4
|
+
task :install => :environment do
|
5
|
+
Pose::Jobs::Install.new.perform
|
6
|
+
end
|
12
7
|
|
13
|
-
|
14
|
-
|
15
|
-
|
8
|
+
desc "Removes the Pose tables from the database."
|
9
|
+
task :uninstall => :environment do
|
10
|
+
Pose::Jobs::Uninstall.new.perform
|
11
|
+
end
|
16
12
|
|
17
|
-
|
13
|
+
desc "Cleans out unused data from the search index."
|
14
|
+
task :vacuum => :environment do
|
15
|
+
Pose::Jobs::Vacuum.new.perform
|
18
16
|
end
|
19
17
|
|
20
18
|
desc "Removes the search index for all instances of the given classes."
|
21
|
-
task :remove, [:class_name] => :environment do |
|
22
|
-
|
23
|
-
Pose::Assignment.delete_class_index clazz
|
24
|
-
puts "Search index for class #{clazz.name} deleted.\n\n"
|
19
|
+
task :remove, [:class_name] => :environment do |_, args|
|
20
|
+
Pose::Jobs::Remove.new(args.class_name).perform
|
25
21
|
end
|
26
22
|
|
27
|
-
desc "
|
28
|
-
task :reindex_all, [:class_name] => [:environment] do |
|
29
|
-
|
30
|
-
progress_bar = ProgressBar.create title: " reindexing", total: clazz.count
|
31
|
-
clazz.find_each do |instance|
|
32
|
-
instance.update_pose_words
|
33
|
-
progress_bar.increment
|
34
|
-
end
|
35
|
-
progress_bar.finish
|
23
|
+
desc "Recreates the search index for all instances of the given class from scratch."
|
24
|
+
task :reindex_all, [:class_name] => [:environment] do |_, args|
|
25
|
+
Pose::Jobs::ReindexAll.new(args.class_name).perform
|
36
26
|
end
|
37
|
-
|
38
27
|
end
|
Binary file
|
data/spec/factories/user.rb
CHANGED
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Pose::ActiveRecordBaseAdditions do
|
4
|
+
describe "::posify" do
|
5
|
+
let(:posable) { create :posable_three, text_1: 't1', text_2: 't2' }
|
6
|
+
|
7
|
+
it 'includes all listed fields in index' do
|
8
|
+
posable.pose_fetch_content.should == 't1 t2 |custom text| |from pose block|'
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -6,8 +6,8 @@ module Pose
|
|
6
6
|
describe :delete_class_index do
|
7
7
|
|
8
8
|
before :each do
|
9
|
-
|
10
|
-
|
9
|
+
create :assignment, posable_id: 1, posable_type: 'PosableOne'
|
10
|
+
create :assignment, posable_id: 2, posable_type: 'PosableTwo'
|
11
11
|
Assignment.delete_class_index PosableOne
|
12
12
|
end
|
13
13
|
|
@@ -24,20 +24,20 @@ module Pose
|
|
24
24
|
describe :cleanup_orphaned_pose_assignments do
|
25
25
|
|
26
26
|
it "deletes the assignment if the posable object doesn't exist" do
|
27
|
-
|
27
|
+
create :assignment, posable_id: 2, posable_type: 'PosableOne'
|
28
28
|
expect(Assignment.count).to be > 0
|
29
29
|
Assignment.cleanup_orphaned_pose_assignments
|
30
30
|
expect(Assignment.count).to eql 0
|
31
31
|
end
|
32
32
|
|
33
33
|
it "deletes the assignment if the word doesn't exist" do
|
34
|
-
assignment =
|
34
|
+
assignment = create :assignment, word: nil, word_id: 27
|
35
35
|
Assignment.cleanup_orphaned_pose_assignments
|
36
36
|
expect(Assignment.find_by_id(assignment.id)).to be_nil
|
37
37
|
end
|
38
38
|
|
39
39
|
it "doesn't delete the assignment if it is still used" do
|
40
|
-
assignment =
|
40
|
+
assignment = create :assignment
|
41
41
|
Assignment.cleanup_orphaned_pose_assignments
|
42
42
|
expect(Assignment.find_by_id(assignment.id)).to_not be_nil
|
43
43
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
|
4
|
+
describe Pose::Jobs::ReindexAll do
|
5
|
+
let(:klass) { PosableOne }
|
6
|
+
subject { described_class.new(klass) }
|
7
|
+
|
8
|
+
describe "#initialize" do
|
9
|
+
its(:klass) { should == PosableOne }
|
10
|
+
|
11
|
+
context "string given" do
|
12
|
+
let(:klass) { 'PosableOne' }
|
13
|
+
its(:klass) { should == PosableOne }
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "#perform" do
|
18
|
+
let(:posable_one_1) { create(:posable_one, text: '1') }
|
19
|
+
let(:posable_one_2) { create(:posable_one, text: '1 2') }
|
20
|
+
|
21
|
+
context "records were updated without running callbacks" do
|
22
|
+
before do
|
23
|
+
PosableOne.where(id: posable_one_1.id).update_all(text: '1 2')
|
24
|
+
PosableOne.where(id: posable_one_2.id).update_all(text: '1')
|
25
|
+
end
|
26
|
+
|
27
|
+
it { expect { subject.perform }.to change{ posable_one_1.pose_words.count }.from(1).to(2) }
|
28
|
+
it { expect { subject.perform }.to change{ posable_one_2.pose_words.count }.from(2).to(1) }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
|
4
|
+
describe Pose::Jobs::Remove do
|
5
|
+
let(:klass) { PosableOne }
|
6
|
+
subject { described_class.new(klass) }
|
7
|
+
|
8
|
+
describe "#initialize" do
|
9
|
+
its(:klass) { should == PosableOne }
|
10
|
+
|
11
|
+
context "string given" do
|
12
|
+
let(:klass) { 'PosableOne' }
|
13
|
+
its(:klass) { should == PosableOne }
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "#perform" do
|
18
|
+
it { expect{ subject.perform }.not_to raise_error }
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,150 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
|
4
|
+
describe Pose::ModelClassAdditions do
|
5
|
+
subject { create :posable_one, text: 'one two' }
|
6
|
+
let(:instance_2) { create :posable_one, text: 'two three four' }
|
7
|
+
|
8
|
+
|
9
|
+
it 'extends AR models' do
|
10
|
+
expect(subject).to be_a_kind_of described_class
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
describe 'creating an instance' do
|
15
|
+
it 'adds the instance data to the search index' do
|
16
|
+
expect(Pose::Assignment).to have(0).instances
|
17
|
+
expect(Pose::Word).to have(0).instances
|
18
|
+
subject
|
19
|
+
expect(Pose::Assignment).to have(2).instances
|
20
|
+
expect(Pose::Word).to have(2).instances
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe 'updating an instance' do
|
25
|
+
it 'updates the instance data in the search index' do
|
26
|
+
subject.text = 'two three four'
|
27
|
+
subject.save!
|
28
|
+
expect(subject).to have(3).pose_words
|
29
|
+
expect(Pose::Assignment).to have(3).instances
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe 'deleting an instance' do
|
34
|
+
it 'removes the instance data from the search index' do
|
35
|
+
subject ; instance_2
|
36
|
+
subject.destroy
|
37
|
+
expect(Pose::Assignment).to have(3).instances
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
|
42
|
+
describe '#pose_current_words' do
|
43
|
+
it 'returns all currently indexed words the instance' do
|
44
|
+
expect(subject.pose_current_words).to match_array %w[one two]
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
|
49
|
+
describe '#pose_fetch_content' do
|
50
|
+
|
51
|
+
context 'pristine object' do
|
52
|
+
it 'returns the searchable text snippet for this instance' do
|
53
|
+
expect(subject.pose_fetch_content).to eql 'one two'
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context 'object with unsaved changes' do
|
58
|
+
it 'returns the new unsaved searchable text' do
|
59
|
+
subject.text = 'two three'
|
60
|
+
expect(subject.pose_fetch_content).to eql 'two three'
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
|
66
|
+
describe '#pose_fresh_words' do
|
67
|
+
|
68
|
+
context 'pristine object' do
|
69
|
+
it 'returns the words that this instance should have based on its current content' do
|
70
|
+
expect(subject.pose_fresh_words).to match_array %w[one two]
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
context 'after a content change in the instance' do
|
75
|
+
it 'returns only the current words' do
|
76
|
+
subject.text = 'two three'
|
77
|
+
expect(subject.pose_fresh_words true).to match_array %w[two three]
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
describe 'reload parameter' do
|
82
|
+
before :each do
|
83
|
+
subject.pose_fresh_words
|
84
|
+
subject.text = 'new text'
|
85
|
+
end
|
86
|
+
|
87
|
+
context 'given nothing' do
|
88
|
+
it 'caches the data' do
|
89
|
+
expect(subject.pose_fresh_words).to match_array %w[one two]
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
context 'given false' do
|
94
|
+
it 'caches the data' do
|
95
|
+
expect(subject.pose_fresh_words false).to match_array %w[one two]
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
context 'given true' do
|
100
|
+
it 'always recalculates the data' do
|
101
|
+
expect(subject.pose_fresh_words true).to match_array %w[new text]
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
|
108
|
+
describe 'pose_stale_words' do
|
109
|
+
|
110
|
+
context 'pristine object' do
|
111
|
+
it 'has no stale words' do
|
112
|
+
expect(subject.pose_stale_words).to be_empty
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
context 'object with unsaved changes' do
|
117
|
+
it 'returns the words that have to be removed from the search index' do
|
118
|
+
subject.text = 'two three'
|
119
|
+
expect(subject.pose_stale_words true).to match_array %w[one]
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
|
125
|
+
describe 'pose_words_to_add' do
|
126
|
+
|
127
|
+
context 'pristine object' do
|
128
|
+
it 'has no words to add' do
|
129
|
+
expect(subject.pose_words_to_add).to be_empty
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
context 'object with unsaved changes' do
|
134
|
+
it 'returns the words that are missing in the search index for this instance' do
|
135
|
+
subject.text = 'two three'
|
136
|
+
expect(subject.pose_words_to_add true).to match_array %w[three]
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
|
142
|
+
describe 'delete_pose_index' do
|
143
|
+
it 'removes the search index for this instance' do
|
144
|
+
subject ; instance_2
|
145
|
+
expect(Pose::Assignment).to have(5).instances
|
146
|
+
subject.delete_pose_index
|
147
|
+
expect(Pose::Assignment).to have(3).instances
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
data/spec/lib/pose/query_spec.rb
CHANGED
@@ -2,10 +2,9 @@
|
|
2
2
|
require "spec_helper"
|
3
3
|
|
4
4
|
module Pose
|
5
|
-
|
6
5
|
describe Query do
|
6
|
+
let(:subject) { Query.new [PosableOne, [PosableTwo]], 'query string' }
|
7
7
|
|
8
|
-
let(:subject) { Pose::Query.new [PosableOne, [PosableTwo]], 'query string' }
|
9
8
|
|
10
9
|
describe :initialize do
|
11
10
|
|
@@ -14,15 +13,17 @@ module Pose
|
|
14
13
|
end
|
15
14
|
end
|
16
15
|
|
16
|
+
|
17
17
|
describe :class_names do
|
18
18
|
|
19
19
|
it 'returns the names of the given classes' do
|
20
|
-
expect(subject.class_names).to eql [
|
20
|
+
expect(subject.class_names).to eql %w[PosableOne PosableTwo]
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
24
|
|
25
25
|
describe :has_joins? do
|
26
|
+
|
26
27
|
it 'returns TRUE if the query has joins' do
|
27
28
|
query = Query.new [], '', joins: :user
|
28
29
|
expect(query).to have_joins
|
@@ -34,6 +35,39 @@ module Pose
|
|
34
35
|
end
|
35
36
|
end
|
36
37
|
|
38
|
+
|
39
|
+
describe 'is_url?' do
|
40
|
+
|
41
|
+
it 'returns TRUE if the given string is a URL' do
|
42
|
+
expect(Query.is_url? 'http://web.com').to be_true
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'returns TRUE if the given string is localhost' do
|
46
|
+
expect(Query.is_url? 'http://localhost').to be_true
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'returns TRUE if localhost has a port' do
|
50
|
+
expect(Query.is_url? 'http://localhost:3000').to be_true
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'returns TRUE if the given url has a port' do
|
54
|
+
expect(Query.is_url? 'http://web.com:8080').to be_true
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'returns TRUE if the given string is a HTTPS URL' do
|
58
|
+
expect(Query.is_url? 'https://web.com').to be_true
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'returns FALSE if the given string is not a URL' do
|
62
|
+
expect(Query.is_url? 'foo').to be_false
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'returns FALSE if the given string is a malformed URL' do
|
66
|
+
expect(Query.is_url? 'http://web').to be_false
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
|
37
71
|
describe :joins do
|
38
72
|
|
39
73
|
it 'returns the given joins' do
|
@@ -41,7 +75,7 @@ module Pose
|
|
41
75
|
expect(query.joins).to eql [:foo, :bar]
|
42
76
|
end
|
43
77
|
|
44
|
-
it 'returns
|
78
|
+
it 'returns a single given join as an array' do
|
45
79
|
query = Query.new [], '', joins: :foo
|
46
80
|
expect(query.joins).to eql [:foo]
|
47
81
|
end
|
@@ -52,25 +86,89 @@ module Pose
|
|
52
86
|
end
|
53
87
|
end
|
54
88
|
|
89
|
+
|
55
90
|
describe :query_words do
|
56
91
|
|
57
92
|
it 'returns all individual words resulting from the given query' do
|
58
|
-
expect(
|
93
|
+
expect(Query.new([], 'foo bar').query_words).to eq ['foo', 'bar']
|
59
94
|
end
|
60
95
|
|
61
96
|
it 'converts the individual words into their root form' do
|
62
|
-
expect(
|
97
|
+
expect(Query.new([], 'bars').query_words).to eq ['bar']
|
63
98
|
end
|
64
99
|
|
65
100
|
it 'splits complex words into separate terms' do
|
66
|
-
expect(
|
101
|
+
expect(Query.new([], 'one-two').query_words).to eq ['one', 'two']
|
67
102
|
end
|
68
103
|
|
69
104
|
it 'removes duplicates' do
|
70
|
-
expect(
|
105
|
+
expect(Query.new([], 'foo-bar foo').query_words).to eq ['foo', 'bar']
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
|
110
|
+
describe :root_word do
|
111
|
+
|
112
|
+
it 'converts words into singular' do
|
113
|
+
expect(Query.root_word('bars')).to eql(['bar'])
|
114
|
+
end
|
115
|
+
|
116
|
+
it 'removes special characters' do
|
117
|
+
expect(Query.root_word('(bar')).to eq ['bar']
|
118
|
+
expect(Query.root_word('bar)')).to eq ['bar']
|
119
|
+
expect(Query.root_word('(bar)')).to eq ['bar']
|
120
|
+
expect(Query.root_word('>foo')).to eq ['foo']
|
121
|
+
expect(Query.root_word('<foo')).to eq ['foo']
|
122
|
+
expect(Query.root_word('"foo"')).to eq ['foo']
|
123
|
+
expect(Query.root_word('"foo')).to eq ['foo']
|
124
|
+
expect(Query.root_word("'foo'")).to eq ['foo']
|
125
|
+
expect(Query.root_word("'foo's")).to eq ['foo']
|
126
|
+
expect(Query.root_word("foo?")).to eq ['foo']
|
127
|
+
expect(Query.root_word("foo!")).to eq ['foo']
|
128
|
+
expect(Query.root_word("foo/bar")).to eq ['foo', 'bar']
|
129
|
+
expect(Query.root_word("foo-bar")).to eq ['foo', 'bar']
|
130
|
+
expect(Query.root_word("foo--bar")).to eq ['foo', 'bar']
|
131
|
+
expect(Query.root_word("foo.bar")).to eq ['foo', 'bar']
|
132
|
+
end
|
133
|
+
|
134
|
+
it 'removes umlauts' do
|
135
|
+
expect(Query.root_word('fünf')).to eq ['funf']
|
136
|
+
end
|
137
|
+
|
138
|
+
it 'splits up numbers' do
|
139
|
+
expect(Query.root_word('11.2.2011')).to eq ['11', '2', '2011']
|
140
|
+
expect(Query.root_word('11-2-2011')).to eq ['11', '2', '2011']
|
141
|
+
expect(Query.root_word('30:4-5')).to eq ['30', '4', '5']
|
142
|
+
end
|
143
|
+
|
144
|
+
it 'converts into lowercase' do
|
145
|
+
expect(Query.root_word('London')).to eq ['london']
|
146
|
+
end
|
147
|
+
|
148
|
+
it "stores single-letter words" do
|
149
|
+
expect(Query.root_word('a b')).to eq ['a', 'b']
|
150
|
+
end
|
151
|
+
|
152
|
+
it "does't encode external URLs" do
|
153
|
+
expect(Query.root_word('http://web.com')).to eq ['http', 'web', 'com']
|
154
|
+
end
|
155
|
+
|
156
|
+
it "doesn't store empty words" do
|
157
|
+
expect(Query.root_word(' one two ')).to eq ['one', 'two']
|
158
|
+
end
|
159
|
+
|
160
|
+
it "removes duplicates" do
|
161
|
+
expect(Query.root_word('one_one')).to eq ['one']
|
162
|
+
expect(Query.root_word('one one')).to eq ['one']
|
163
|
+
end
|
164
|
+
|
165
|
+
it "splits up complex URLs" do
|
166
|
+
expect(Query.root_word('books?id=p7uyWPcVGZsC&dq=closure%20definitive%20guide&pg=PP1#v=onepage&q&f=false')).to eql([
|
167
|
+
"book", "id", "p7uywpcvgzsc", "dq", "closure", "definitive", "guide", "pg", "pp1", "v", "onepage", "q", "f", "false"])
|
71
168
|
end
|
72
169
|
end
|
73
170
|
|
171
|
+
|
74
172
|
describe :where do
|
75
173
|
|
76
174
|
it 'returns the given simple WHERE clause as an iterable array' do
|
@@ -4,13 +4,11 @@ module Pose
|
|
4
4
|
|
5
5
|
describe Search do
|
6
6
|
let(:subject) { Search.new [PosableOne, [PosableTwo]], 'query string' }
|
7
|
-
let(:arel)
|
7
|
+
let(:arel) { double() }
|
8
8
|
let(:arel_2) { double() }
|
9
9
|
let(:arel_3) { double() }
|
10
10
|
|
11
|
-
|
12
11
|
describe :add_join do
|
13
|
-
|
14
12
|
it 'returns the new arel' do
|
15
13
|
arel.should_receive(:joins).with('foo').and_return(arel_2)
|
16
14
|
expect(subject.add_join arel, 'foo').to eql arel_2
|
@@ -39,9 +37,7 @@ module Pose
|
|
39
37
|
end
|
40
38
|
end
|
41
39
|
|
42
|
-
|
43
40
|
describe :add_joins do
|
44
|
-
|
45
41
|
it 'adds all joins to the given arel' do
|
46
42
|
arel.should_receive(:joins).with('one').and_return(arel_2)
|
47
43
|
arel_2.should_receive(:joins).with('two').and_return(arel_3)
|
@@ -57,9 +53,7 @@ module Pose
|
|
57
53
|
end
|
58
54
|
end
|
59
55
|
|
60
|
-
|
61
56
|
describe :add_wheres do
|
62
|
-
|
63
57
|
it 'adds all joins to the given arel' do
|
64
58
|
arel.should_receive(:where).with(['one = ?', true]).and_return(arel_2)
|
65
59
|
arel_2.should_receive(:where).with(['two = ?', false]).and_return(arel_3)
|
@@ -75,9 +69,7 @@ module Pose
|
|
75
69
|
end
|
76
70
|
end
|
77
71
|
|
78
|
-
|
79
72
|
describe :empty_result do
|
80
|
-
|
81
73
|
it 'returns a hash with classes and empty arrays for each class in the search query' do
|
82
74
|
search = Search.new [PosableOne, PosableTwo], ''
|
83
75
|
result = search.empty_result
|
@@ -87,7 +79,6 @@ module Pose
|
|
87
79
|
end
|
88
80
|
end
|
89
81
|
|
90
|
-
|
91
82
|
describe :limit_ids do
|
92
83
|
before :each do
|
93
84
|
@search = Search.new nil, nil, limit: 2
|
@@ -129,7 +120,6 @@ module Pose
|
|
129
120
|
|
130
121
|
|
131
122
|
describe :load_classes do
|
132
|
-
|
133
123
|
context 'when the user wants ids' do
|
134
124
|
it 'does nothing' do
|
135
125
|
search = Search.new nil, nil, result_type: :ids
|
@@ -143,7 +133,7 @@ module Pose
|
|
143
133
|
it 'loads the classes' do
|
144
134
|
object_1 = create :posable_one
|
145
135
|
object_2 = create :posable_one
|
146
|
-
result = { PosableOne => [
|
136
|
+
result = { PosableOne => [object_1.id, object_2.id] }
|
147
137
|
search = Search.new nil, nil
|
148
138
|
search.load_classes result
|
149
139
|
expect(result[PosableOne]).to eq [object_1, object_2]
|
@@ -154,7 +144,6 @@ module Pose
|
|
154
144
|
|
155
145
|
describe :merge_search_result_word_matches do
|
156
146
|
context 'given a new class name' do
|
157
|
-
|
158
147
|
before :each do
|
159
148
|
@result = {}
|
160
149
|
end
|
@@ -166,7 +155,6 @@ module Pose
|
|
166
155
|
end
|
167
156
|
|
168
157
|
context 'given a class name with already existing ids from another word' do
|
169
|
-
|
170
158
|
before :each do
|
171
159
|
@result = { 'class1' => [1, 2] }
|
172
160
|
end
|
@@ -178,7 +166,6 @@ module Pose
|
|
178
166
|
end
|
179
167
|
|
180
168
|
context 'with an existing empty result set from a previous query' do
|
181
|
-
|
182
169
|
before :each do
|
183
170
|
@result = { 'class1' => [] }
|
184
171
|
end
|
@@ -190,7 +177,6 @@ module Pose
|
|
190
177
|
end
|
191
178
|
|
192
179
|
context 'with a new empty result set' do
|
193
|
-
|
194
180
|
before :each do
|
195
181
|
@result = { 'class1' => [1, 2] }
|
196
182
|
end
|
@@ -202,7 +188,6 @@ module Pose
|
|
202
188
|
end
|
203
189
|
|
204
190
|
context 'with a completely different result set' do
|
205
|
-
|
206
191
|
before :each do
|
207
192
|
@result = { 'class1' => [1, 2] }
|
208
193
|
end
|
@@ -216,7 +201,6 @@ module Pose
|
|
216
201
|
|
217
202
|
|
218
203
|
describe :search do
|
219
|
-
|
220
204
|
it 'finds all matching instances of all classes' do
|
221
205
|
posable_one_1 = create :posable_one, text: 'foo bar'
|
222
206
|
posable_one_2 = create :posable_one, text: 'foo bar'
|
@@ -255,7 +239,6 @@ module Pose
|
|
255
239
|
end
|
256
240
|
|
257
241
|
describe 'result types' do
|
258
|
-
|
259
242
|
it 'loads classes by default' do
|
260
243
|
posable_one = create :posable_one, text: 'foo'
|
261
244
|
search = Search.new PosableOne, 'foo'
|
@@ -292,7 +275,6 @@ module Pose
|
|
292
275
|
|
293
276
|
|
294
277
|
describe :search_word do
|
295
|
-
|
296
278
|
context 'search results' do
|
297
279
|
it 'returns the ids of the matching instances for this class' do
|
298
280
|
posable_one_1 = create :posable_one, text: 'foo'
|
@@ -323,9 +305,7 @@ module Pose
|
|
323
305
|
end
|
324
306
|
end
|
325
307
|
|
326
|
-
|
327
308
|
describe :search_words do
|
328
|
-
|
329
309
|
context 'search results' do
|
330
310
|
it 'returns the ids of all instances that match all query words' do
|
331
311
|
posable_one = create :posable_one, text: 'foo bar'
|