picky 3.6.16 → 4.0.0pre1
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/picky/application.rb +1 -1
- data/lib/picky/backends/backend.rb +2 -0
- data/lib/picky/backends/memory.rb +14 -7
- data/lib/picky/backends/{memory → prepared}/text.rb +10 -4
- data/lib/picky/backends/redis/directly_manipulable.rb +3 -5
- data/lib/picky/backends/redis/list.rb +5 -1
- data/lib/picky/backends/sqlite/basic.rb +4 -2
- data/lib/picky/bundle.rb +6 -7
- data/lib/picky/bundle_indexed.rb +2 -2
- data/lib/picky/bundle_realtime.rb +8 -7
- data/lib/picky/categories.rb +0 -1
- data/lib/picky/categories_indexing.rb +14 -0
- data/lib/picky/category.rb +3 -5
- data/lib/picky/category_indexed.rb +2 -5
- data/lib/picky/category_indexing.rb +28 -16
- data/lib/picky/constants.rb +3 -1
- data/lib/picky/frontend_adapters/rack.rb +2 -2
- data/lib/picky/generators/similarity/phonetic.rb +6 -14
- data/lib/picky/generators/strategy.rb +1 -1
- data/lib/picky/generators/weights/runtime.rb +2 -2
- data/lib/picky/helpers/indexing.rb +20 -0
- data/lib/picky/index.rb +7 -10
- data/lib/picky/index_indexed.rb +1 -8
- data/lib/picky/index_indexing.rb +44 -42
- data/lib/picky/indexers/base.rb +5 -6
- data/lib/picky/indexers/parallel.rb +35 -32
- data/lib/picky/indexers/serial.rb +38 -15
- data/lib/picky/indexes_indexed.rb +0 -7
- data/lib/picky/indexes_indexing.rb +16 -19
- data/lib/picky/loader.rb +6 -4
- data/lib/picky/query/allocation.rb +7 -2
- data/lib/picky/query/combination.rb +1 -1
- data/lib/picky/query/indexes.rb +1 -1
- data/lib/picky/query/indexes_check.rb +12 -14
- data/lib/picky/query/token.rb +33 -15
- data/lib/picky/results/exact_first.rb +53 -0
- data/lib/picky/scheduler.rb +43 -0
- data/lib/picky/search.rb +0 -2
- data/lib/picky/sources/csv.rb +2 -3
- data/lib/picky/sources/db.rb +4 -3
- data/lib/picky/sources/mongo.rb +1 -1
- data/lib/picky/tokenizer.rb +0 -4
- data/lib/picky/wrappers/bundle/location.rb +1 -1
- data/lib/picky.rb +2 -2
- data/lib/tasks/index.rake +13 -14
- data/spec/functional/backends/file_spec.rb +2 -4
- data/spec/functional/backends/memory_spec.rb +2 -2
- data/spec/functional/backends/redis_spec.rb +1 -1
- data/spec/functional/exact_first_spec.rb +24 -4
- data/spec/functional/realtime_spec.rb +7 -3
- data/spec/lib/application_spec.rb +30 -30
- data/spec/lib/backends/backend_spec.rb +25 -27
- data/spec/lib/backends/{memory → prepared}/text_spec.rb +1 -1
- data/spec/lib/category_indexing_spec.rb +1 -1
- data/spec/lib/extensions/symbol_spec.rb +1 -1
- data/spec/lib/generators/similarity/phonetic_spec.rb +46 -0
- data/spec/lib/index_indexed_spec.rb +5 -5
- data/spec/lib/index_indexing_spec.rb +13 -12
- data/spec/lib/index_spec.rb +8 -8
- data/spec/lib/indexers/base_spec.rb +5 -6
- data/spec/lib/indexers/parallel_spec.rb +10 -10
- data/spec/lib/indexes_indexed_spec.rb +1 -7
- data/spec/lib/indexes_indexing_spec.rb +10 -5
- data/spec/lib/query/indexes_check_spec.rb +44 -15
- data/spec/lib/query/indexes_spec.rb +11 -11
- data/spec/lib/query/token_spec.rb +10 -0
- data/spec/lib/{indexed/wrappers → results}/exact_first_spec.rb +18 -21
- data/spec/lib/scheduler_spec.rb +92 -0
- metadata +45 -34
- data/lib/picky/cores.rb +0 -127
- data/lib/picky/tokenizers/location.rb +0 -53
- data/lib/picky/wrappers/category/exact_first.rb +0 -94
- data/spec/lib/cores_spec.rb +0 -185
@@ -0,0 +1,53 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
module Picky
|
4
|
+
|
5
|
+
class Results
|
6
|
+
|
7
|
+
# This index combines an exact and partial index.
|
8
|
+
# It serves to order the results such that exact hits are found first.
|
9
|
+
#
|
10
|
+
module ExactFirst
|
11
|
+
|
12
|
+
# Installs the exact first on the given category
|
13
|
+
# or on the categories of the index, if an index is given.
|
14
|
+
#
|
15
|
+
# THINK Can we unextend in the case it is an index?
|
16
|
+
#
|
17
|
+
def self.extended index_or_category
|
18
|
+
if index_or_category.respond_to? :categories
|
19
|
+
extend_each_of index_or_category.categories
|
20
|
+
index_or_category
|
21
|
+
end
|
22
|
+
end
|
23
|
+
def self.extend_each_of categories
|
24
|
+
categories.categories.each { |category| category.extend self }
|
25
|
+
end
|
26
|
+
|
27
|
+
# Overrides the original method.
|
28
|
+
#
|
29
|
+
def ids token
|
30
|
+
text = token.text
|
31
|
+
if token.partial?
|
32
|
+
exact.ids(text) | partial.ids(text)
|
33
|
+
else
|
34
|
+
exact.ids text
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# Overrides the original method.
|
39
|
+
#
|
40
|
+
def weight token
|
41
|
+
text = token.text
|
42
|
+
if token.partial?
|
43
|
+
[exact.weight(text), partial.weight(text)].compact.max
|
44
|
+
else
|
45
|
+
exact.weight text
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Picky
|
2
|
+
|
3
|
+
class Scheduler
|
4
|
+
|
5
|
+
attr_reader :parallel
|
6
|
+
|
7
|
+
def initialize options = {}
|
8
|
+
@parallel = options[:parallel]
|
9
|
+
|
10
|
+
configure
|
11
|
+
end
|
12
|
+
|
13
|
+
def configure
|
14
|
+
if fork?
|
15
|
+
def schedule &block
|
16
|
+
scheduler.schedule &block
|
17
|
+
end
|
18
|
+
|
19
|
+
def finish
|
20
|
+
scheduler.join
|
21
|
+
end
|
22
|
+
|
23
|
+
def scheduler
|
24
|
+
@scheduler ||= Procrastinate::Scheduler.start Procrastinate::SpawnStrategy::Default.new(2)
|
25
|
+
end
|
26
|
+
else
|
27
|
+
def schedule
|
28
|
+
yield
|
29
|
+
end
|
30
|
+
|
31
|
+
def finish
|
32
|
+
# Don't do anything.
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def fork?
|
38
|
+
parallel && Process.respond_to?(:fork)
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
data/lib/picky/search.rb
CHANGED
data/lib/picky/sources/csv.rb
CHANGED
@@ -62,9 +62,8 @@ module Picky
|
|
62
62
|
#
|
63
63
|
def harvest category
|
64
64
|
index = category_names.index category.from
|
65
|
-
get_data do |ary|
|
66
|
-
|
67
|
-
text = ary[index]
|
65
|
+
get_data do |indexed_id, *ary|
|
66
|
+
text = ary[index]
|
68
67
|
next unless text
|
69
68
|
text.force_encoding 'utf-8' # TODO Still needed?
|
70
69
|
yield indexed_id, text
|
data/lib/picky/sources/db.rb
CHANGED
@@ -56,8 +56,9 @@ module Picky
|
|
56
56
|
end
|
57
57
|
|
58
58
|
# Creates a database adapter for use with this source.
|
59
|
+
#
|
59
60
|
def create_database_adapter # :nodoc:
|
60
|
-
#
|
61
|
+
# THINK Do not use ActiveRecord directly? Use set_table_name etc?
|
61
62
|
#
|
62
63
|
adapter_class = Class.new ActiveRecord::Base
|
63
64
|
adapter_class.abstract_class = true
|
@@ -96,7 +97,7 @@ module Picky
|
|
96
97
|
# Uses CREATE TABLE AS with the given SELECT statement to create a snapshot of the data.
|
97
98
|
#
|
98
99
|
def take_snapshot index
|
99
|
-
timed_exclaim %Q{"#{index.identifier}": Taking snapshot of database data.}
|
100
|
+
timed_exclaim %Q{ "#{index.identifier}": Taking snapshot of database data.}
|
100
101
|
|
101
102
|
origin = snapshot_table_name index.name
|
102
103
|
on_database = database.connection
|
@@ -143,7 +144,7 @@ module Picky
|
|
143
144
|
def get_data category, offset, &block # :nodoc:
|
144
145
|
select_statement = harvest_statement_with_offset category, offset
|
145
146
|
|
146
|
-
#
|
147
|
+
# THINK Not really nice like this. Rewrite if possible.
|
147
148
|
#
|
148
149
|
if database.connection.adapter_name == "PostgreSQL"
|
149
150
|
id_key = 'id'
|
data/lib/picky/sources/mongo.rb
CHANGED
@@ -61,7 +61,7 @@ module Picky
|
|
61
61
|
JSON.parse(resp)['rows'].each do |row|
|
62
62
|
text = row[collection].to_s
|
63
63
|
next unless text
|
64
|
-
index_key = row.delete
|
64
|
+
index_key = row.delete @@id_key # Note: I removed .values
|
65
65
|
yield index_key, text
|
66
66
|
end
|
67
67
|
end
|
data/lib/picky/tokenizer.rb
CHANGED
@@ -52,7 +52,7 @@ module Picky
|
|
52
52
|
bundle.load
|
53
53
|
|
54
54
|
# TODO Symbols (of the location_anchor!!!).
|
55
|
-
#
|
55
|
+
# It should always be a Symbol.
|
56
56
|
#
|
57
57
|
@calculation.anchor = bundle['location_anchor'] && bundle['location_anchor'].to_f || raise("Configuration 'location_anchor' for #{bundle.identifier} missing. Did you run rake index already?")
|
58
58
|
end
|
data/lib/picky.rb
CHANGED
@@ -4,9 +4,10 @@ module Picky
|
|
4
4
|
#
|
5
5
|
require 'active_support/core_ext'
|
6
6
|
require 'text'
|
7
|
-
require 'yajl' #
|
7
|
+
require 'yajl' # THINK Maybe replace by multi_json?
|
8
8
|
require 'rack' # TODO Remove.
|
9
9
|
require 'rack_fast_escape' # TODO Remove.
|
10
|
+
require 'procrastinate'
|
10
11
|
|
11
12
|
# Require the constants.
|
12
13
|
#
|
@@ -19,7 +20,6 @@ module Picky
|
|
19
20
|
# Load the framework
|
20
21
|
#
|
21
22
|
Loader.load_framework
|
22
|
-
puts "Loaded picky with environment '#{PICKY_ENVIRONMENT}' in #{PICKY_ROOT} on Ruby #{RUBY_VERSION}."
|
23
23
|
|
24
24
|
# Check if delegators need to be installed.
|
25
25
|
#
|
data/lib/tasks/index.rake
CHANGED
@@ -1,22 +1,21 @@
|
|
1
1
|
# Indexing tasks.
|
2
2
|
#
|
3
|
-
desc "Generate the index (index, category optional)."
|
4
|
-
task :index, [:index, :category] => :
|
5
|
-
index, category = options.index, options.category
|
6
|
-
|
7
|
-
specific = Picky::Indexes
|
8
|
-
specific = specific[index] if index
|
9
|
-
specific = specific[category] if category
|
10
|
-
specific.index
|
11
|
-
end
|
3
|
+
desc "Generate the index in parallel (index, category optional)."
|
4
|
+
task :index, [:index, :category] => :'index:parallel'
|
12
5
|
|
13
6
|
namespace :index do
|
14
7
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
8
|
+
[:parallel, :serial].each do |kind|
|
9
|
+
desc "Generate the index in #{kind} (index, category optional)."
|
10
|
+
task kind, [:index, :category] => :application do |_, options|
|
11
|
+
index, category = options.index, options.category
|
12
|
+
|
13
|
+
specific = Picky::Indexes
|
14
|
+
specific = specific[index] if index
|
15
|
+
specific = specific[category] if category
|
16
|
+
|
17
|
+
specific.index Picky::Scheduler.new(kind => true)
|
18
|
+
end
|
20
19
|
end
|
21
20
|
|
22
21
|
end
|
@@ -5,8 +5,6 @@ require 'spec_helper'
|
|
5
5
|
# Describes a Picky index that uses the File backend
|
6
6
|
# for data storage.
|
7
7
|
#
|
8
|
-
# TODO Everything should just fail.
|
9
|
-
#
|
10
8
|
describe Picky::Backends::File do
|
11
9
|
|
12
10
|
class Book
|
@@ -49,7 +47,7 @@ describe Picky::Backends::File do
|
|
49
47
|
it 'handles removing with more than one entry' do
|
50
48
|
data.add Book.new(2, 'title', 'author')
|
51
49
|
|
52
|
-
books.search('title').ids.should == ['2', '1']
|
50
|
+
books.search('title').ids.should == ['2', '1']
|
53
51
|
|
54
52
|
data.remove '1'
|
55
53
|
|
@@ -59,7 +57,7 @@ describe Picky::Backends::File do
|
|
59
57
|
data.add Book.new(2, 'title', 'author')
|
60
58
|
data.add Book.new(3, 'title', 'author')
|
61
59
|
|
62
|
-
books.search('title').ids.should == ['3', '2', '1']
|
60
|
+
books.search('title').ids.should == ['3', '2', '1']
|
63
61
|
|
64
62
|
data.remove '1'
|
65
63
|
|
@@ -47,7 +47,7 @@ describe Picky::Backends::Memory do
|
|
47
47
|
it 'handles removing with more than one entry' do
|
48
48
|
data.add Book.new(2, 'title', 'author')
|
49
49
|
|
50
|
-
books.search('title').ids.should == ['2', '1']
|
50
|
+
books.search('title').ids.should == ['2', '1']
|
51
51
|
|
52
52
|
data.remove '1'
|
53
53
|
|
@@ -57,7 +57,7 @@ describe Picky::Backends::Memory do
|
|
57
57
|
data.add Book.new(2, 'title', 'author')
|
58
58
|
data.add Book.new(3, 'title', 'author')
|
59
59
|
|
60
|
-
books.search('title').ids.should == ['3', '2', '1']
|
60
|
+
books.search('title').ids.should == ['3', '2', '1']
|
61
61
|
|
62
62
|
data.remove '1'
|
63
63
|
|
@@ -57,7 +57,7 @@ describe Picky::Backends::Redis do
|
|
57
57
|
data.add Book.new(2, 'title', 'author')
|
58
58
|
data.add Book.new(3, 'title', 'author')
|
59
59
|
|
60
|
-
books.search('title').ids.should == ['3', '2', '1']
|
60
|
+
books.search('title').ids.should == ['3', '2', '1']
|
61
61
|
|
62
62
|
data.remove '1'
|
63
63
|
|
@@ -23,7 +23,27 @@ describe "exact first" do
|
|
23
23
|
normal = Picky::Search.new index
|
24
24
|
normal.search("disco").ids.should == [2, 1] # 2 was added later.
|
25
25
|
|
26
|
-
index
|
26
|
+
index.extend Picky::Results::ExactFirst
|
27
|
+
|
28
|
+
exact_first = Picky::Search.new index
|
29
|
+
exact_first.search("disco").ids.should == [1, 2] # Exact first.
|
30
|
+
exact_first.search("disc").ids.should == [2, 1] # Not exact, so not first.
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'handles extending single categories' do
|
34
|
+
index = Picky::Index.new :exact_first
|
35
|
+
category = index.category :text, partial: Picky::Partial::Substring.new(from: 1)
|
36
|
+
|
37
|
+
require 'ostruct'
|
38
|
+
exact = OpenStruct.new id: 1, text: "disco"
|
39
|
+
partial = OpenStruct.new id: 2, text: "discofox"
|
40
|
+
index.add exact
|
41
|
+
index.add partial
|
42
|
+
|
43
|
+
normal = Picky::Search.new index
|
44
|
+
normal.search("disco").ids.should == [2, 1] # 2 was added later.
|
45
|
+
|
46
|
+
category.extend Picky::Results::ExactFirst
|
27
47
|
|
28
48
|
exact_first = Picky::Search.new index
|
29
49
|
exact_first.search("disco").ids.should == [1, 2] # Exact first.
|
@@ -41,14 +61,14 @@ describe "exact first" do
|
|
41
61
|
category :text, partial: Picky::Partial::Substring.new(from: 1)
|
42
62
|
end
|
43
63
|
normal = Picky::Search.new data
|
44
|
-
Picky::Indexes.
|
64
|
+
Picky::Indexes.index
|
45
65
|
|
46
66
|
normal.search("disco").ids.should == [1, 2] # Ordering with which it was added.
|
47
67
|
|
48
|
-
data
|
68
|
+
data.extend Picky::Results::ExactFirst
|
49
69
|
exact_first = Picky::Search.new data
|
50
70
|
|
51
|
-
Picky::Indexes.
|
71
|
+
Picky::Indexes.index
|
52
72
|
|
53
73
|
exact_first.search("disco").ids.should == [2, 1] # Exact first.
|
54
74
|
exact_first.search("disc").ids.should == [1, 2] # Not exact, so not first.
|
@@ -26,7 +26,7 @@ describe "Realtime Indexing" do
|
|
26
26
|
end
|
27
27
|
|
28
28
|
context 'dumping and loading' do
|
29
|
-
it "doesn't find books anymore after dumping and
|
29
|
+
it "doesn't find books anymore after dumping and loading and updating" do
|
30
30
|
index.replace Book.new(2, "Title New", "Author New")
|
31
31
|
|
32
32
|
books.search("title").ids.should == [2, 1]
|
@@ -243,7 +243,9 @@ describe "Realtime Indexing" do
|
|
243
243
|
index.replace Book.new(2, "Title New", "Author New")
|
244
244
|
index.add Book.new(3, "TTL", "AUTHR")
|
245
245
|
|
246
|
-
|
246
|
+
# Note: [2, 1] are in one allocation, [3] in the other.
|
247
|
+
#
|
248
|
+
books.search('author:Athr~').ids.should == [2, 1, 3]
|
247
249
|
end
|
248
250
|
end
|
249
251
|
end
|
@@ -465,7 +467,9 @@ describe "Realtime Indexing" do
|
|
465
467
|
index.replace Book.new("two", "Title New", "Author New")
|
466
468
|
index.add Book.new("three", "TTL", "AUTHR")
|
467
469
|
|
468
|
-
|
470
|
+
# Note: Allocations are [:two, :one], then [:three].
|
471
|
+
#
|
472
|
+
books.search('author:Athr~').ids.should == [:two, :one, :three]
|
469
473
|
end
|
470
474
|
end
|
471
475
|
end
|
@@ -3,7 +3,7 @@
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
5
|
describe Picky::Application do
|
6
|
-
|
6
|
+
|
7
7
|
describe "integration" do
|
8
8
|
it "should run ok" do
|
9
9
|
lambda {
|
@@ -14,10 +14,10 @@ describe Picky::Application do
|
|
14
14
|
:file => 'app/db.yml'
|
15
15
|
)
|
16
16
|
end
|
17
|
-
books.
|
18
|
-
|
17
|
+
books.category :title
|
18
|
+
|
19
19
|
rack_adapter.stub! :exclaim # Stopping it from exclaiming.
|
20
|
-
|
20
|
+
|
21
21
|
route %r{^/books} => Picky::Search.new(books)
|
22
22
|
end
|
23
23
|
Picky::Tokenizer.index_default.tokenize 'some text'
|
@@ -35,29 +35,29 @@ describe Picky::Application do
|
|
35
35
|
removes_characters_after_splitting: /[\.]/,
|
36
36
|
normalizes_words: [[/\$(\w+)/i, '\1 dollars']],
|
37
37
|
rejects_token_if: lambda { |token| token.blank? || token == :amistad }
|
38
|
-
|
38
|
+
|
39
39
|
searching removes_characters: /[^a-zA-Z0-9äöü\s\/\-\,\&\"\~\*\:]/,
|
40
40
|
stopwords: /\b(and|the|of|it|in|for)\b/,
|
41
41
|
splits_text_on: /[\s\/\-\,\&]+/,
|
42
42
|
normalizes_words: [[/Deoxyribonucleic Acid/i, 'DNA']],
|
43
|
-
|
43
|
+
|
44
44
|
substitutes_characters_with: Picky::CharacterSubstituters::WestEuropean.new,
|
45
45
|
maximum_tokens: 5
|
46
|
-
|
46
|
+
|
47
47
|
books_index = Picky::Index.new :books do
|
48
48
|
source Picky::Sources::DB.new(
|
49
49
|
'SELECT id, title, author, isbn13 as isbn FROM books',
|
50
50
|
:file => 'app/db.yml'
|
51
51
|
)
|
52
52
|
end
|
53
|
-
|
54
|
-
books_index.
|
55
|
-
|
56
|
-
books_index.
|
57
|
-
|
58
|
-
books_index.
|
53
|
+
|
54
|
+
books_index.category :title,
|
55
|
+
similarity: Picky::Similarity::DoubleMetaphone.new(3) # Up to three similar title word indexed.
|
56
|
+
books_index.category :author,
|
57
|
+
similarity: Picky::Similarity::Soundex.new(2)
|
58
|
+
books_index.category :isbn,
|
59
59
|
partial: Picky::Partial::None.new # Partially searching on an ISBN makes not much sense.
|
60
|
-
|
60
|
+
|
61
61
|
geo_index = Picky::Index.new :geo do
|
62
62
|
source Picky::Sources::CSV.new(:location, :north, :east, file: 'data/ch.csv', col_sep: ',')
|
63
63
|
indexing removes_characters: /[^a-z]/
|
@@ -66,11 +66,11 @@ describe Picky::Application do
|
|
66
66
|
ranged_category :north1, 1, precision: 3, from: :north
|
67
67
|
ranged_category :east1, 1, precision: 3, from: :east
|
68
68
|
end
|
69
|
-
|
69
|
+
|
70
70
|
rack_adapter.stub! :exclaim # Stopping it from exclaiming.
|
71
|
-
|
71
|
+
|
72
72
|
route %r{^/books} => Picky::Search.new(books_index)
|
73
|
-
|
73
|
+
|
74
74
|
buks_search = Picky::Search.new(books_index) do
|
75
75
|
searching removes_characters: /[buks]/
|
76
76
|
ignore :author
|
@@ -80,39 +80,39 @@ describe Picky::Application do
|
|
80
80
|
}.should_not raise_error
|
81
81
|
end
|
82
82
|
end
|
83
|
-
|
83
|
+
|
84
84
|
describe 'finalize' do
|
85
85
|
before(:each) do
|
86
86
|
described_class.stub! :check
|
87
87
|
end
|
88
88
|
it 'checks if all is ok' do
|
89
89
|
described_class.should_receive(:check).once.with
|
90
|
-
|
90
|
+
|
91
91
|
described_class.finalize
|
92
92
|
end
|
93
93
|
it 'tells the rack adapter to finalize' do
|
94
94
|
described_class.rack_adapter.should_receive(:finalize).once.with
|
95
|
-
|
95
|
+
|
96
96
|
described_class.finalize
|
97
97
|
end
|
98
98
|
end
|
99
|
-
|
99
|
+
|
100
100
|
describe 'check' do
|
101
101
|
it 'does something' do
|
102
102
|
described_class.should_receive(:warn).once.with "\nWARNING: No routes defined for application configuration in Class.\n\n"
|
103
|
-
|
103
|
+
|
104
104
|
described_class.check
|
105
105
|
end
|
106
106
|
end
|
107
|
-
|
107
|
+
|
108
108
|
describe 'delegation' do
|
109
109
|
it "should delegate route" do
|
110
110
|
described_class.rack_adapter.should_receive(:route).once.with :path => :query
|
111
|
-
|
111
|
+
|
112
112
|
described_class.route :path => :query
|
113
113
|
end
|
114
114
|
end
|
115
|
-
|
115
|
+
|
116
116
|
describe 'rack_adapter' do
|
117
117
|
it 'should be there' do
|
118
118
|
lambda { described_class.rack_adapter }.should_not raise_error
|
@@ -124,11 +124,11 @@ describe Picky::Application do
|
|
124
124
|
described_class.rack_adapter.should == described_class.rack_adapter
|
125
125
|
end
|
126
126
|
end
|
127
|
-
|
127
|
+
|
128
128
|
describe 'route' do
|
129
129
|
it 'is delegated' do
|
130
130
|
described_class.rack_adapter.should_receive(:route).once.with :some_options
|
131
|
-
|
131
|
+
|
132
132
|
described_class.route(:some_options)
|
133
133
|
end
|
134
134
|
it 'raises on block' do
|
@@ -139,7 +139,7 @@ describe Picky::Application do
|
|
139
139
|
}.to raise_error("Warning: block passed into #route method, not into Search.new!")
|
140
140
|
end
|
141
141
|
end
|
142
|
-
|
142
|
+
|
143
143
|
describe 'call' do
|
144
144
|
before(:each) do
|
145
145
|
@routes = stub :routes
|
@@ -147,9 +147,9 @@ describe Picky::Application do
|
|
147
147
|
end
|
148
148
|
it 'should delegate' do
|
149
149
|
@routes.should_receive(:call).once.with :env
|
150
|
-
|
150
|
+
|
151
151
|
described_class.call :env
|
152
152
|
end
|
153
153
|
end
|
154
|
-
|
154
|
+
|
155
155
|
end
|
@@ -2,37 +2,35 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Picky::Backends::Backend do
|
4
4
|
|
5
|
-
|
6
|
-
let(:backend) { described_class.new }
|
5
|
+
let(:backend) { described_class.new }
|
7
6
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
end
|
16
|
-
|
17
|
-
backend.extract_lambda_or(lam).should == :lam
|
7
|
+
describe 'extract_lambda_or' do
|
8
|
+
it 'returns a given non-lambda' do
|
9
|
+
backend.extract_lambda_or(:thing).should == :thing
|
10
|
+
end
|
11
|
+
it 'calls a given lambda with the given args' do
|
12
|
+
lam = ->() do
|
13
|
+
:lam
|
18
14
|
end
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
15
|
+
|
16
|
+
backend.extract_lambda_or(lam).should == :lam
|
17
|
+
end
|
18
|
+
it 'calls a given lambda with the given args' do
|
19
|
+
lam = ->(arg1) do
|
20
|
+
arg1.should == 1
|
21
|
+
:lam
|
26
22
|
end
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
23
|
+
|
24
|
+
backend.extract_lambda_or(lam, 1).should == :lam
|
25
|
+
end
|
26
|
+
it 'calls a given lambda with the given args' do
|
27
|
+
lam = ->(arg1, arg2) do
|
28
|
+
arg1.should == 1
|
29
|
+
arg2.should == 2
|
30
|
+
:lam
|
35
31
|
end
|
32
|
+
|
33
|
+
backend.extract_lambda_or(lam, 1, 2).should == :lam
|
36
34
|
end
|
37
35
|
end
|
38
36
|
|
@@ -13,7 +13,7 @@ describe Symbol do
|
|
13
13
|
performance_of { @token.each_subtoken { |subtoken| } }.should < 0.00065
|
14
14
|
end
|
15
15
|
it 'is fast enough' do
|
16
|
-
performance_of { @token.each_intoken { |intoken| } }.should < 0.025 #
|
16
|
+
performance_of { @token.each_intoken { |intoken| } }.should < 0.025 # THINK Is this too slow?
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|