picky 3.4.0 → 3.4.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -17,7 +17,7 @@ module Picky
17
17
  # Loads the index hash from json format.
18
18
  #
19
19
  def load
20
- Yajl::Parser.parse ::File.open(cache_path, 'r'), symbolize_keys: true
20
+ Yajl::Parser.parse ::File.open(cache_path, 'r'), symbolize_keys: true # TODO to_sym
21
21
  end
22
22
 
23
23
  # Dumps the index hash in json format.
@@ -46,6 +46,40 @@ module Picky
46
46
  String.new(client, "#{bundle.identifier}:configuration")
47
47
  end
48
48
 
49
+ # Does the Redis version already include
50
+ # scripting support?
51
+ #
52
+ def redis_with_scripting?
53
+ at_least_version redis_version, [2, 6, 0]
54
+ end
55
+
56
+ # Compares two versions each in an array [major, minor, patch]
57
+ # format and returns true if the first version is higher
58
+ # or the same as the second one. False if not.
59
+ #
60
+ # Note: Destructive.
61
+ #
62
+ def at_least_version major_minor_patch, should_be
63
+ 3.times { return false if major_minor_patch.shift < should_be.shift }
64
+ true
65
+ end
66
+
67
+ # Returns an array describing the
68
+ # current Redis version.
69
+ #
70
+ # Note: This method assumes that clients answer
71
+ # to #info with a hash (string/symbol keys)
72
+ # detailing the infos.
73
+ #
74
+ # Example:
75
+ # backend.redis_version # => [2, 4, 1]
76
+ #
77
+ def redis_version
78
+ infos = client.info
79
+ version_string = infos['redis_version'] || infos[:redis_version]
80
+ version_string.split('.').map &:to_i
81
+ end
82
+
49
83
  # Returns the result ids for the allocation.
50
84
  #
51
85
  # Developers wanting to program fast intersection
@@ -54,29 +88,53 @@ module Picky
54
88
  #
55
89
  # Note: We use the amount and offset hints to speed Redis up.
56
90
  #
57
- def ids combinations, amount, offset
58
- identifiers = combinations.inject([]) do |identifiers, combination|
59
- identifiers << "#{combination.identifier}"
60
- end
61
-
62
- result_id = generate_intermediate_result_id
63
-
64
- # Intersect and store.
65
- #
66
- client.zinterstore result_id, identifiers
67
-
68
- # Get the stored result.
69
- #
70
- results = client.zrange result_id, offset, (offset + amount)
71
-
72
- # Delete the stored result as it was only for temporary purposes.
73
- #
74
- # Note: I could also not delete it, but that would not be clean at all.
75
- #
76
- client.del result_id
77
-
78
- results
79
- end
91
+ # def ids combinations, amount, offset
92
+ # if redis_with_scripting?
93
+ # @@script = <<-SCRIPT
94
+ # redis.call('zinterstore', KEYS[1], ARGV[1]);
95
+ # local result = redis.call('zrange', KEYS[1], ARGV[2], ARGV[3])
96
+ # redis.call('del', KEYS[1])
97
+ # return result
98
+ # SCRIPT
99
+ # # Scripting version of #ids.
100
+ # #
101
+ # def ids combinations, amount, offset
102
+ # identifiers = combinations.inject([]) do |identifiers, combination|
103
+ # identifiers << "#{combination.identifier}"
104
+ # end
105
+ #
106
+ # # Assume it's using EVALSHA.
107
+ # #
108
+ # client.eval @@script, generate_intermediate_result_id, identifiers, offset, (offset + amount)
109
+ # end
110
+ # else
111
+ # Non-Scripting version of #ids.
112
+ #
113
+ def ids combinations, amount, offset
114
+ identifiers = combinations.inject([]) do |identifiers, combination|
115
+ identifiers << "#{combination.identifier}"
116
+ end
117
+
118
+ result_id = generate_intermediate_result_id
119
+
120
+ # Intersect and store.
121
+ #
122
+ client.zinterstore result_id, identifiers
123
+
124
+ # Get the stored result.
125
+ #
126
+ results = client.zrange result_id, offset, (offset + amount)
127
+
128
+ # Delete the stored result as it was only for temporary purposes.
129
+ #
130
+ # Note: I could also not delete it, but that would not be clean at all.
131
+ #
132
+ client.del result_id
133
+
134
+ results
135
+ end
136
+ # end
137
+ # end
80
138
 
81
139
  # Generate a multiple host/process safe result id.
82
140
  #
@@ -0,0 +1,45 @@
1
+ # Extending the String class.
2
+ #
3
+ class String # :nodoc:all
4
+
5
+ # 'keys'.each_subtoken # => yields each of ['keys', 'key', 'ke', 'k']
6
+ # 'keys'.each_subtoken(2) # => yields each of ['keys', 'key', 'ke']
7
+ #
8
+ def each_subtoken from_length = 1, range = nil
9
+ sub = self
10
+
11
+ sub = sub[range] if range
12
+
13
+ yield sub
14
+
15
+ size = sub.size
16
+ from_length = size + from_length + 1 if from_length < 0
17
+ from_length = size if size < from_length
18
+ from_length = 1 if from_length < 1
19
+
20
+ size.downto(from_length + 1) { yield sub = sub.chop }
21
+ end
22
+
23
+ # 'keys'.each_intoken # => yields each of ['keys', 'key', 'eys', 'ke', 'ey', 'ys', 'k', 'e', 'y', 's']
24
+ # 'keys'.each_intoken(2) # => yields each of ['keys', 'key', 'eys', 'ke', 'ey', 'ys']
25
+ # 'keys'.each_intoken(2, 3) # => yields each of ['key', 'eys', 'ke', 'ey', 'ys']
26
+ # 'keys'.each_intoken(10, 12) # => yields nothing (min larger than str)
27
+ #
28
+ def each_intoken min_length = 1, max_length = -1
29
+ max_length = size + max_length + 1 if max_length < 0
30
+ max_length = size if size < max_length
31
+ max_length = 1 if max_length < 1
32
+
33
+ min_length = size + min_length + 1 if min_length < 0
34
+ min_length = 1 if min_length < 1
35
+
36
+ this_many = size - max_length + 1
37
+ max_length.downto(min_length) do |length|
38
+ this_many.times do |offset|
39
+ yield self[offset, length]
40
+ end
41
+ this_many += 1
42
+ end
43
+ end
44
+
45
+ end
@@ -5,15 +5,18 @@ class Symbol # :nodoc:all
5
5
  # :keys.each_subtoken # => yields each of [:keys, :key, :ke, :k]
6
6
  # :keys.each_subtoken(2) # => yields each of [:keys, :key, :ke]
7
7
  #
8
- def each_subtoken from_length = 1
8
+ def each_subtoken from_length = 1, range = nil
9
9
  sub = self.id2name
10
10
 
11
+ sub = sub[range] if range
12
+
13
+ yield sub.intern
14
+
11
15
  size = sub.size
12
16
  from_length = size + from_length + 1 if from_length < 0
13
17
  from_length = size if size < from_length
14
18
  from_length = 1 if from_length < 1
15
19
 
16
- yield self
17
20
  size.downto(from_length + 1) { yield sub.chop!.intern }
18
21
  end
19
22
 
@@ -20,11 +20,13 @@ module Picky
20
20
  else
21
21
  if @from < 0 && @to < 0
22
22
  def each_subtoken token, &block
23
- token[0..@to].intern.each_subtoken @from - @to - 1, &block
23
+ token.each_subtoken @from - @to - 1, (0..@to), &block
24
+ # token[0..@to].intern.each_subtoken @from - @to - 1, &block # TODO to_sym
24
25
  end
25
26
  else
26
27
  def each_subtoken token, &block
27
- token[0..@to].intern.each_subtoken @from, &block
28
+ token.each_subtoken @from, (0..@to), &block
29
+ # token[0..@to].intern.each_subtoken @from, &block # TODO to_sym
28
30
  end
29
31
  end
30
32
  end
data/lib/picky/loader.rb CHANGED
@@ -56,6 +56,7 @@ module Picky
56
56
  load_relative 'extensions/object'
57
57
  load_relative 'extensions/array'
58
58
  load_relative 'extensions/symbol'
59
+ load_relative 'extensions/string'
59
60
  load_relative 'extensions/module'
60
61
  load_relative 'extensions/class'
61
62
  load_relative 'extensions/hash'
@@ -37,7 +37,7 @@ module Picky
37
37
  partialize # TODO Should this operate on the original?
38
38
  similarize # TODO Should this operate on the original?
39
39
  remove_illegals # TODO Remove?
40
- symbolize
40
+ symbolize # TODO to_sym
41
41
  self
42
42
  end
43
43
 
@@ -12,6 +12,32 @@ describe Picky::Backends::Redis do
12
12
  @backend.stub! :timed_exclaim
13
13
  end
14
14
 
15
+ describe "redis_with_scripting?" do
16
+ let(:client) { stub :client}
17
+ let(:redis) { described_class.new client: client }
18
+
19
+ it "answers correctly" do
20
+ client.stub! :info => {"redis_version"=>"2.2.2", "redis_git_sha1"=>"00000000", "redis_git_dirty"=>"0", "arch_bits"=>"64", "multiplexing_api"=>"kqueue", "process_id"=>"70364", "uptime_in_seconds"=>"86804", "uptime_in_days"=>"1", "lru_clock"=>"2057342", "used_cpu_sys"=>"12.76", "used_cpu_user"=>"13.44", "used_cpu_sys_childrens"=>"0.62", "used_cpu_user_childrens"=>"0.30", "connected_clients"=>"1", "connected_slaves"=>"0", "client_longest_output_list"=>"0", "client_biggest_input_buf"=>"0", "blocked_clients"=>"0", "used_memory"=>"34389632", "used_memory_human"=>"32.80M", "used_memory_rss"=>"675840", "mem_fragmentation_ratio"=>"0.02", "use_tcmalloc"=>"0", "loading"=>"0", "aof_enabled"=>"0", "changes_since_last_save"=>"0", "bgsave_in_progress"=>"0", "last_save_time"=>"1320721195", "bgrewriteaof_in_progress"=>"0", "total_connections_received"=>"20", "total_commands_processed"=>"327594", "expired_keys"=>"0", "evicted_keys"=>"0", "keyspace_hits"=>"218584", "keyspace_misses"=>"98664", "hash_max_zipmap_entries"=>"512", "hash_max_zipmap_value"=>"64", "pubsub_channels"=>"0", "pubsub_patterns"=>"0", "vm_enabled"=>"0", "role"=>"master", "allocation_stats"=>"2=74,6=1,8=15,9=156,10=142939,11=104891,12=290902,13=263791,14=14570,15=29143,16=1661979,17=8986,18=6370,19=4508,20=18010,21=1622,22=1136,23=544,24=419271,25=154,26=73,27=32,28=30,29=14,32=419046,33=6,34=7,35=15,36=10,37=12,38=625,39=7127,40=207716,41=40840,42=7246,43=2645,44=28390,45=37835,46=35164,47=67465,48=54765,49=41247,50=44391,51=36420,52=29582,53=21491,54=18575,55=14101,56=61954,57=5476,58=3246,59=2227,60=1502,61=868,62=541,63=282,64=69006,65=87,66=58,67=32,68=30,69=6,70=2,71=5,72=12723,74=19,75=2,76=13,77=6,80=12500,81=10,82=4,83=8,84=10,85=14,86=5,87=37,88=97714,89=58,91=30,93=68,94=14,95=35,97=56,99=46,101=24,103=17,104=846,105=1,106=15,107=19,109=4,110=6,111=13,113=8,114=8,115=4,116=5,117=8,118=11,119=4,120=217,121=18,122=6,125=5,126=12,128=4411,131=12,133=8,136=57,137=14,138=10,142=6,143=4,145=6,147=14,150=4,152=23,153=6,157=4,158=6,159=14,163=8,164=18,166=4,168=6,169=1,170=16,171=27,173=7,174=10,175=31,177=14,178=6,179=13,181=39,182=4,183=12,184=7,185=42,187=16,189=69,191=22,193=17,195=8,196=16,197=23,199=20,201=23,203=12,205=4,206=16,207=6,208=4,209=10,211=1,213=8,215=4,216=10,217=4,218=14,219=10,221=14,223=4,225=8,226=6,227=4,228=10,230=10,232=6,234=6,237=4,238=6,239=8,240=6,241=4,242=6,245=6,248=4,249=16,250=6,252=4,253=4,>=256=113463", "db15"=>"keys=26605,expires=0"}
21
+
22
+ redis.redis_with_scripting?.should == false
23
+ end
24
+ it "answers correctly" do
25
+ client.stub! :info => {"redis_version"=>"2.6.0", "redis_git_sha1"=>"00000000", "redis_git_dirty"=>"0", "arch_bits"=>"64", "multiplexing_api"=>"kqueue", "process_id"=>"70364", "uptime_in_seconds"=>"86804", "uptime_in_days"=>"1", "lru_clock"=>"2057342", "used_cpu_sys"=>"12.76", "used_cpu_user"=>"13.44", "used_cpu_sys_childrens"=>"0.62", "used_cpu_user_childrens"=>"0.30", "connected_clients"=>"1", "connected_slaves"=>"0", "client_longest_output_list"=>"0", "client_biggest_input_buf"=>"0", "blocked_clients"=>"0", "used_memory"=>"34389632", "used_memory_human"=>"32.80M", "used_memory_rss"=>"675840", "mem_fragmentation_ratio"=>"0.02", "use_tcmalloc"=>"0", "loading"=>"0", "aof_enabled"=>"0", "changes_since_last_save"=>"0", "bgsave_in_progress"=>"0", "last_save_time"=>"1320721195", "bgrewriteaof_in_progress"=>"0", "total_connections_received"=>"20", "total_commands_processed"=>"327594", "expired_keys"=>"0", "evicted_keys"=>"0", "keyspace_hits"=>"218584", "keyspace_misses"=>"98664", "hash_max_zipmap_entries"=>"512", "hash_max_zipmap_value"=>"64", "pubsub_channels"=>"0", "pubsub_patterns"=>"0", "vm_enabled"=>"0", "role"=>"master", "allocation_stats"=>"2=74,6=1,8=15,9=156,10=142939,11=104891,12=290902,13=263791,14=14570,15=29143,16=1661979,17=8986,18=6370,19=4508,20=18010,21=1622,22=1136,23=544,24=419271,25=154,26=73,27=32,28=30,29=14,32=419046,33=6,34=7,35=15,36=10,37=12,38=625,39=7127,40=207716,41=40840,42=7246,43=2645,44=28390,45=37835,46=35164,47=67465,48=54765,49=41247,50=44391,51=36420,52=29582,53=21491,54=18575,55=14101,56=61954,57=5476,58=3246,59=2227,60=1502,61=868,62=541,63=282,64=69006,65=87,66=58,67=32,68=30,69=6,70=2,71=5,72=12723,74=19,75=2,76=13,77=6,80=12500,81=10,82=4,83=8,84=10,85=14,86=5,87=37,88=97714,89=58,91=30,93=68,94=14,95=35,97=56,99=46,101=24,103=17,104=846,105=1,106=15,107=19,109=4,110=6,111=13,113=8,114=8,115=4,116=5,117=8,118=11,119=4,120=217,121=18,122=6,125=5,126=12,128=4411,131=12,133=8,136=57,137=14,138=10,142=6,143=4,145=6,147=14,150=4,152=23,153=6,157=4,158=6,159=14,163=8,164=18,166=4,168=6,169=1,170=16,171=27,173=7,174=10,175=31,177=14,178=6,179=13,181=39,182=4,183=12,184=7,185=42,187=16,189=69,191=22,193=17,195=8,196=16,197=23,199=20,201=23,203=12,205=4,206=16,207=6,208=4,209=10,211=1,213=8,215=4,216=10,217=4,218=14,219=10,221=14,223=4,225=8,226=6,227=4,228=10,230=10,232=6,234=6,237=4,238=6,239=8,240=6,241=4,242=6,245=6,248=4,249=16,250=6,252=4,253=4,>=256=113463", "db15"=>"keys=26605,expires=0"}
26
+
27
+ redis.redis_with_scripting?.should == true
28
+ end
29
+ it "answers correctly" do
30
+ client.stub! :info => {:redis_version=>"2.2.2", "redis_git_sha1"=>"00000000", "redis_git_dirty"=>"0", "arch_bits"=>"64", "multiplexing_api"=>"kqueue", "process_id"=>"70364", "uptime_in_seconds"=>"86804", "uptime_in_days"=>"1", "lru_clock"=>"2057342", "used_cpu_sys"=>"12.76", "used_cpu_user"=>"13.44", "used_cpu_sys_childrens"=>"0.62", "used_cpu_user_childrens"=>"0.30", "connected_clients"=>"1", "connected_slaves"=>"0", "client_longest_output_list"=>"0", "client_biggest_input_buf"=>"0", "blocked_clients"=>"0", "used_memory"=>"34389632", "used_memory_human"=>"32.80M", "used_memory_rss"=>"675840", "mem_fragmentation_ratio"=>"0.02", "use_tcmalloc"=>"0", "loading"=>"0", "aof_enabled"=>"0", "changes_since_last_save"=>"0", "bgsave_in_progress"=>"0", "last_save_time"=>"1320721195", "bgrewriteaof_in_progress"=>"0", "total_connections_received"=>"20", "total_commands_processed"=>"327594", "expired_keys"=>"0", "evicted_keys"=>"0", "keyspace_hits"=>"218584", "keyspace_misses"=>"98664", "hash_max_zipmap_entries"=>"512", "hash_max_zipmap_value"=>"64", "pubsub_channels"=>"0", "pubsub_patterns"=>"0", "vm_enabled"=>"0", "role"=>"master", "allocation_stats"=>"2=74,6=1,8=15,9=156,10=142939,11=104891,12=290902,13=263791,14=14570,15=29143,16=1661979,17=8986,18=6370,19=4508,20=18010,21=1622,22=1136,23=544,24=419271,25=154,26=73,27=32,28=30,29=14,32=419046,33=6,34=7,35=15,36=10,37=12,38=625,39=7127,40=207716,41=40840,42=7246,43=2645,44=28390,45=37835,46=35164,47=67465,48=54765,49=41247,50=44391,51=36420,52=29582,53=21491,54=18575,55=14101,56=61954,57=5476,58=3246,59=2227,60=1502,61=868,62=541,63=282,64=69006,65=87,66=58,67=32,68=30,69=6,70=2,71=5,72=12723,74=19,75=2,76=13,77=6,80=12500,81=10,82=4,83=8,84=10,85=14,86=5,87=37,88=97714,89=58,91=30,93=68,94=14,95=35,97=56,99=46,101=24,103=17,104=846,105=1,106=15,107=19,109=4,110=6,111=13,113=8,114=8,115=4,116=5,117=8,118=11,119=4,120=217,121=18,122=6,125=5,126=12,128=4411,131=12,133=8,136=57,137=14,138=10,142=6,143=4,145=6,147=14,150=4,152=23,153=6,157=4,158=6,159=14,163=8,164=18,166=4,168=6,169=1,170=16,171=27,173=7,174=10,175=31,177=14,178=6,179=13,181=39,182=4,183=12,184=7,185=42,187=16,189=69,191=22,193=17,195=8,196=16,197=23,199=20,201=23,203=12,205=4,206=16,207=6,208=4,209=10,211=1,213=8,215=4,216=10,217=4,218=14,219=10,221=14,223=4,225=8,226=6,227=4,228=10,230=10,232=6,234=6,237=4,238=6,239=8,240=6,241=4,242=6,245=6,248=4,249=16,250=6,252=4,253=4,>=256=113463", "db15"=>"keys=26605,expires=0"}
31
+
32
+ redis.redis_with_scripting?.should == false
33
+ end
34
+ it "answers correctly" do
35
+ client.stub! :info => {:redis_version=>"2.6.0", "redis_git_sha1"=>"00000000", "redis_git_dirty"=>"0", "arch_bits"=>"64", "multiplexing_api"=>"kqueue", "process_id"=>"70364", "uptime_in_seconds"=>"86804", "uptime_in_days"=>"1", "lru_clock"=>"2057342", "used_cpu_sys"=>"12.76", "used_cpu_user"=>"13.44", "used_cpu_sys_childrens"=>"0.62", "used_cpu_user_childrens"=>"0.30", "connected_clients"=>"1", "connected_slaves"=>"0", "client_longest_output_list"=>"0", "client_biggest_input_buf"=>"0", "blocked_clients"=>"0", "used_memory"=>"34389632", "used_memory_human"=>"32.80M", "used_memory_rss"=>"675840", "mem_fragmentation_ratio"=>"0.02", "use_tcmalloc"=>"0", "loading"=>"0", "aof_enabled"=>"0", "changes_since_last_save"=>"0", "bgsave_in_progress"=>"0", "last_save_time"=>"1320721195", "bgrewriteaof_in_progress"=>"0", "total_connections_received"=>"20", "total_commands_processed"=>"327594", "expired_keys"=>"0", "evicted_keys"=>"0", "keyspace_hits"=>"218584", "keyspace_misses"=>"98664", "hash_max_zipmap_entries"=>"512", "hash_max_zipmap_value"=>"64", "pubsub_channels"=>"0", "pubsub_patterns"=>"0", "vm_enabled"=>"0", "role"=>"master", "allocation_stats"=>"2=74,6=1,8=15,9=156,10=142939,11=104891,12=290902,13=263791,14=14570,15=29143,16=1661979,17=8986,18=6370,19=4508,20=18010,21=1622,22=1136,23=544,24=419271,25=154,26=73,27=32,28=30,29=14,32=419046,33=6,34=7,35=15,36=10,37=12,38=625,39=7127,40=207716,41=40840,42=7246,43=2645,44=28390,45=37835,46=35164,47=67465,48=54765,49=41247,50=44391,51=36420,52=29582,53=21491,54=18575,55=14101,56=61954,57=5476,58=3246,59=2227,60=1502,61=868,62=541,63=282,64=69006,65=87,66=58,67=32,68=30,69=6,70=2,71=5,72=12723,74=19,75=2,76=13,77=6,80=12500,81=10,82=4,83=8,84=10,85=14,86=5,87=37,88=97714,89=58,91=30,93=68,94=14,95=35,97=56,99=46,101=24,103=17,104=846,105=1,106=15,107=19,109=4,110=6,111=13,113=8,114=8,115=4,116=5,117=8,118=11,119=4,120=217,121=18,122=6,125=5,126=12,128=4411,131=12,133=8,136=57,137=14,138=10,142=6,143=4,145=6,147=14,150=4,152=23,153=6,157=4,158=6,159=14,163=8,164=18,166=4,168=6,169=1,170=16,171=27,173=7,174=10,175=31,177=14,178=6,179=13,181=39,182=4,183=12,184=7,185=42,187=16,189=69,191=22,193=17,195=8,196=16,197=23,199=20,201=23,203=12,205=4,206=16,207=6,208=4,209=10,211=1,213=8,215=4,216=10,217=4,218=14,219=10,221=14,223=4,225=8,226=6,227=4,228=10,230=10,232=6,234=6,237=4,238=6,239=8,240=6,241=4,242=6,245=6,248=4,249=16,250=6,252=4,253=4,>=256=113463", "db15"=>"keys=26605,expires=0"}
36
+
37
+ redis.redis_with_scripting?.should == true
38
+ end
39
+ end
40
+
15
41
  describe 'create_...' do
16
42
  [
17
43
  [:inverted, Picky::Backends::Redis::Float],
@@ -0,0 +1,492 @@
1
+ # encoding: utf-8
2
+ #
3
+ require 'spec_helper'
4
+
5
+ describe String do
6
+
7
+ context 'performance' do
8
+ include Picky::Helpers::Measuring
9
+ before(:each) do
10
+ @token = (((0..9).to_a)*10).to_s.to_sym
11
+ end
12
+ it "is fast" do
13
+ performance_of { @token.each_subtoken { |subtoken| } }.should < 0.00065
14
+ end
15
+ it 'is fast enough' do
16
+ performance_of { @token.each_intoken { |intoken| } }.should < 0.025 # TODO Slow!
17
+ end
18
+ end
19
+
20
+ describe 'each_intoken' do
21
+ context 'normal String' do
22
+ before(:each) do
23
+ @str = "picky"
24
+ end
25
+ context 'no params' do
26
+ it "yields the right elements" do
27
+ result = []
28
+ @str.each_intoken do |subtoken|
29
+ result << subtoken
30
+ end
31
+ result.should == ['picky', 'pick', 'icky', 'pic', 'ick', 'cky', 'pi', 'ic', 'ck', 'ky', 'p', 'i', 'c', 'k', 'y']
32
+ end
33
+ end
34
+ context 'with min_length == 0' do
35
+ it "yields the right elements" do
36
+ result = []
37
+ @str.each_intoken(0) do |subtoken|
38
+ result << subtoken
39
+ end
40
+ result.should == ['picky', 'pick', 'icky', 'pic', 'ick', 'cky', 'pi', 'ic', 'ck', 'ky', 'p', 'i', 'c', 'k', 'y']
41
+ end
42
+ context 'max_length == 0' do
43
+ it 'yields the right elements' do
44
+ result = []
45
+ @str.each_intoken(0, 0) do |subtoken|
46
+ result << subtoken
47
+ end
48
+ result.should == ['p', 'i', 'c', 'k', 'y']
49
+ end
50
+ end
51
+ context 'max_length == 1' do
52
+ it 'yields the right elements' do
53
+ result = []
54
+ @str.each_intoken(0, 1) do |subtoken|
55
+ result << subtoken
56
+ end
57
+ result.should == ['p', 'i', 'c', 'k', 'y']
58
+ end
59
+ end
60
+ context 'max_length == 2' do
61
+ it 'yields the right elements' do
62
+ result = []
63
+ @str.each_intoken(0, 2) do |subtoken|
64
+ result << subtoken
65
+ end
66
+ result.should == ['pi', 'ic', 'ck', 'ky', 'p', 'i', 'c', 'k', 'y']
67
+ end
68
+ end
69
+ context 'max_length == 10' do
70
+ it 'yields the right elements' do
71
+ result = []
72
+ @str.each_intoken(0, 10) do |subtoken|
73
+ result << subtoken
74
+ end
75
+ result.should == ['picky', 'pick', 'icky', 'pic', 'ick', 'cky', 'pi', 'ic', 'ck', 'ky', 'p', 'i', 'c', 'k', 'y']
76
+ end
77
+ end
78
+ context 'max_length == -1' do
79
+ it 'yields the right elements' do
80
+ result = []
81
+ @str.each_intoken(0, -1) do |subtoken|
82
+ result << subtoken
83
+ end
84
+ result.should == ['picky', 'pick', 'icky', 'pic', 'ick', 'cky', 'pi', 'ic', 'ck', 'ky', 'p', 'i', 'c', 'k', 'y']
85
+ end
86
+ end
87
+ end
88
+ context 'with min_length == sym.size' do
89
+ it "yields the right elements" do
90
+ result = []
91
+ @str.each_intoken(@str.size) do |subtoken|
92
+ result << subtoken
93
+ end
94
+ result.should == ['picky']
95
+ end
96
+ context 'max_length == 0' do
97
+ it 'yields the right elements' do
98
+ result = []
99
+ @str.each_intoken(@str.size, 0) do |subtoken|
100
+ result << subtoken
101
+ end
102
+ result.should == []
103
+ end
104
+ end
105
+ context 'max_length == 1' do
106
+ it 'yields the right elements' do
107
+ result = []
108
+ @str.each_intoken(@str.size, 1) do |subtoken|
109
+ result << subtoken
110
+ end
111
+ result.should == []
112
+ end
113
+ end
114
+ context 'max_length == 2' do
115
+ it 'yields the right elements' do
116
+ result = []
117
+ @str.each_intoken(@str.size, 2) do |subtoken|
118
+ result << subtoken
119
+ end
120
+ result.should == []
121
+ end
122
+ end
123
+ context 'max_length == 10' do
124
+ it 'yields the right elements' do
125
+ result = []
126
+ @str.each_intoken(@str.size, 10) do |subtoken|
127
+ result << subtoken
128
+ end
129
+ result.should == ['picky']
130
+ end
131
+ end
132
+ context 'max_length == -1' do
133
+ it 'yields the right elements' do
134
+ result = []
135
+ @str.each_intoken(@str.size, -1) do |subtoken|
136
+ result << subtoken
137
+ end
138
+ result.should == ['picky']
139
+ end
140
+ end
141
+ end
142
+ context 'with min_length > sym.size' do
143
+ it "yields the right elements" do
144
+ result = []
145
+ @str.each_intoken(@str.size+1) do |subtoken|
146
+ result << subtoken
147
+ end
148
+ result.should == []
149
+ end
150
+ context 'max_length == 0' do
151
+ it 'yields the right elements' do
152
+ result = []
153
+ @str.each_intoken(@str.size+1, 0) do |subtoken|
154
+ result << subtoken
155
+ end
156
+ result.should == []
157
+ end
158
+ end
159
+ context 'max_length == 1' do
160
+ it 'yields the right elements' do
161
+ result = []
162
+ @str.each_intoken(@str.size+1, 1) do |subtoken|
163
+ result << subtoken
164
+ end
165
+ result.should == []
166
+ end
167
+ end
168
+ context 'max_length == 2' do
169
+ it 'yields the right elements' do
170
+ result = []
171
+ @str.each_intoken(@str.size+1, 2) do |subtoken|
172
+ result << subtoken
173
+ end
174
+ result.should == []
175
+ end
176
+ end
177
+ context 'max_length == 10' do
178
+ it 'yields the right elements' do
179
+ result = []
180
+ @str.each_intoken(@str.size+1, 10) do |subtoken|
181
+ result << subtoken
182
+ end
183
+ result.should == []
184
+ end
185
+ end
186
+ context 'max_length == -1' do
187
+ it 'yields the right elements' do
188
+ result = []
189
+ @str.each_intoken(@str.size+1, -1) do |subtoken|
190
+ result << subtoken
191
+ end
192
+ result.should == []
193
+ end
194
+ end
195
+ end
196
+ context 'with min_length < 0' do
197
+ it "yields the right elements" do
198
+ result = []
199
+ @str.each_intoken(-2) do |subtoken|
200
+ result << subtoken
201
+ end
202
+ result.should == ['picky', 'pick', 'icky']
203
+ end
204
+ context 'max_length == 0' do
205
+ it 'yields the right elements' do
206
+ result = []
207
+ @str.each_intoken(-2, 0) do |subtoken|
208
+ result << subtoken
209
+ end
210
+ result.should == []
211
+ end
212
+ end
213
+ context 'max_length == 1' do
214
+ it 'yields the right elements' do
215
+ result = []
216
+ @str.each_intoken(-2, 1) do |subtoken|
217
+ result << subtoken
218
+ end
219
+ result.should == []
220
+ end
221
+ end
222
+ context 'max_length == 2' do
223
+ it 'yields the right elements' do
224
+ result = []
225
+ @str.each_intoken(-2, 2) do |subtoken|
226
+ result << subtoken
227
+ end
228
+ result.should == []
229
+ end
230
+ end
231
+ context 'max_length == 10' do
232
+ it 'yields the right elements' do
233
+ result = []
234
+ @str.each_intoken(-2, 10) do |subtoken|
235
+ result << subtoken
236
+ end
237
+ result.should == ['picky', 'pick', 'icky']
238
+ end
239
+ end
240
+ context 'max_length == -1' do
241
+ it 'yields the right elements' do
242
+ result = []
243
+ @str.each_intoken(-2, -1) do |subtoken|
244
+ result << subtoken
245
+ end
246
+ result.should == ['picky', 'pick', 'icky']
247
+ end
248
+ end
249
+ end
250
+ end
251
+ end
252
+
253
+ describe "each_subtoken" do
254
+ context 'normal String' do
255
+ before(:each) do
256
+ @str = 'reinke'
257
+ end
258
+ context 'no downto' do
259
+ it "should return an array of pieces of the original token, each 1 smaller than the other" do
260
+ result = []
261
+ @str.each_subtoken do |subtoken|
262
+ result << subtoken
263
+ end
264
+ result.should == ['reinke', 'reink', 'rein', 'rei', 're', 'r']
265
+ end
266
+ end
267
+ context 'downto is larger than the String' do
268
+ before(:each) do
269
+ @downto = 8
270
+ end
271
+ it "should return an array of pieces of the original token, each 1 smaller than the other" do
272
+ result = []
273
+ @str.each_subtoken(@downto) do |subtoken|
274
+ result << subtoken
275
+ end
276
+ result.should == ['reinke']
277
+ end
278
+ end
279
+ context 'downto is exactly the same as String' do
280
+ before(:each) do
281
+ @downto = 6
282
+ end
283
+ it "should return an array of pieces of the original token, each 1 smaller than the other" do
284
+ result = []
285
+ @str.each_subtoken(@downto) do |subtoken|
286
+ result << subtoken
287
+ end
288
+ result.should == ['reinke']
289
+ end
290
+ end
291
+ context 'downto is smaller than the length of the String' do
292
+ before(:each) do
293
+ @downto = 4
294
+ end
295
+ it "should return an array of pieces of the original token, each 1 smaller than the other" do
296
+ result = []
297
+ @str.each_subtoken(@downto) do |subtoken|
298
+ result << subtoken
299
+ end
300
+ result.should == ['reinke', 'reink', 'rein']
301
+ end
302
+ end
303
+ context 'downto is 1' do
304
+ before(:each) do
305
+ @downto = 1
306
+ end
307
+ it "should return an array of pieces of the original token, each 1 smaller than the other" do
308
+ result = []
309
+ @str.each_subtoken(@downto) do |subtoken|
310
+ result << subtoken
311
+ end
312
+ result.should == ['reinke', 'reink', 'rein', 'rei', 're', 'r']
313
+ end
314
+ end
315
+ context 'downto is 0' do
316
+ before(:each) do
317
+ @downto = 0
318
+ end
319
+ it "should return an array of pieces of the original token, each 1 smaller than the other" do
320
+ result = []
321
+ @str.each_subtoken(@downto) do |subtoken|
322
+ result << subtoken
323
+ end
324
+ result.should == ['reinke', 'reink', 'rein', 'rei', 're', 'r']
325
+ end
326
+ end
327
+ context 'downto is less than zero' do
328
+ before(:each) do
329
+ @downto = -2
330
+ end
331
+ it "should return an array of pieces of the original token, each 1 smaller than the other" do
332
+ result = []
333
+ @str.each_subtoken(@downto) do |subtoken|
334
+ result << subtoken
335
+ end
336
+ result.should == ['reinke', 'reink']
337
+ end
338
+ end
339
+ end
340
+ context 'japanese String' do
341
+ before(:each) do
342
+ @str = :日本語
343
+ end
344
+ it "should return an array of japanese Strings, each 1 smaller than the other" do
345
+ result = []
346
+ @str.each_subtoken do |subtoken|
347
+ result << subtoken
348
+ end
349
+ result.should == [:日本語, :日本, :日]
350
+ end
351
+ end
352
+ context 'very short String' do
353
+ before(:each) do
354
+ @str = 'r'
355
+ end
356
+ context 'no downto' do
357
+ it "should return an array of pieces of the original token, each 1 smaller than the other" do
358
+ result = []
359
+ @str.each_subtoken do |subtoken|
360
+ result << subtoken
361
+ end
362
+ result.should == ['r']
363
+ end
364
+ end
365
+ context 'downto is larger than the String' do
366
+ before(:each) do
367
+ @downto = 8
368
+ end
369
+ it "should return an array of pieces of the original token, each 1 smaller than the other" do
370
+ result = []
371
+ @str.each_subtoken(@downto) do |subtoken|
372
+ result << subtoken
373
+ end
374
+ result.should == ['r']
375
+ end
376
+ end
377
+ context 'downto is exactly the same as String' do
378
+ before(:each) do
379
+ @downto = 6
380
+ end
381
+ it "should return an array of pieces of the original token, each 1 smaller than the other" do
382
+ result = []
383
+ @str.each_subtoken(@downto) do |subtoken|
384
+ result << subtoken
385
+ end
386
+ result.should == ['r']
387
+ end
388
+ end
389
+ context 'downto is smaller than the length of the String' do
390
+ before(:each) do
391
+ @downto = 4
392
+ end
393
+ it "should return an array of pieces of the original token, each 1 smaller than the other" do
394
+ result = []
395
+ @str.each_subtoken(@downto) do |subtoken|
396
+ result << subtoken
397
+ end
398
+ result.should == ['r']
399
+ end
400
+ end
401
+ context 'downto is 1' do
402
+ before(:each) do
403
+ @downto = 1
404
+ end
405
+ it "should return an array of pieces of the original token, each 1 smaller than the other" do
406
+ result = []
407
+ @str.each_subtoken(@downto) do |subtoken|
408
+ result << subtoken
409
+ end
410
+ result.should == ['r']
411
+ end
412
+ end
413
+ context 'downto is 0' do
414
+ before(:each) do
415
+ @downto = 0
416
+ end
417
+ it "should return an array of pieces of the original token, each 1 smaller than the other" do
418
+ result = []
419
+ @str.each_subtoken(@downto) do |subtoken|
420
+ result << subtoken
421
+ end
422
+ result.should == ['r']
423
+ end
424
+ end
425
+ context 'downto is less than zero' do
426
+ before(:each) do
427
+ @downto = -1
428
+ end
429
+ it "should return an array of pieces of the original token, each 1 smaller than the other" do
430
+ result = []
431
+ @str.each_subtoken(@downto) do |subtoken|
432
+ result << subtoken
433
+ end
434
+ result.should == ['r']
435
+ end
436
+ end
437
+ context 'downto is less than zero' do
438
+ before(:each) do
439
+ @downto = -2
440
+ end
441
+ it "should return an array of pieces of the original token, each 1 smaller than the other" do
442
+ result = []
443
+ @str.each_subtoken(@downto) do |subtoken|
444
+ result << subtoken
445
+ end
446
+ result.should == ['r']
447
+ end
448
+ end
449
+ context 'downto is less than zero' do
450
+ before(:each) do
451
+ @downto = -3
452
+ end
453
+ it "should return an array of pieces of the original token, each 1 smaller than the other" do
454
+ result = []
455
+ @str.each_subtoken(@downto) do |subtoken|
456
+ result << subtoken
457
+ end
458
+ result.should == ['r']
459
+ end
460
+ end
461
+ context 'downto is less than zero' do
462
+ before(:each) do
463
+ @downto = -100
464
+ end
465
+ it "should return an array of pieces of the original token, each 1 smaller than the other" do
466
+ result = []
467
+ @str.each_subtoken(@downto) do |subtoken|
468
+ result << subtoken
469
+ end
470
+ result.should == ['r']
471
+ end
472
+ end
473
+ end
474
+ context "with range param" do
475
+ it "returns a subtoken array from a clipped original" do
476
+ result = []
477
+ 'reinke'.each_subtoken 2, (0..3) do |subtoken|
478
+ result << subtoken
479
+ end
480
+ result.should == ['rein', 'rei', 're']
481
+ end
482
+ it "returns a subtoken array from a clipped original" do
483
+ result = []
484
+ 'reinke'.each_subtoken 2, (1..-2) do |subtoken|
485
+ result << subtoken
486
+ end
487
+ result.should == ['eink', 'ein', 'ei']
488
+ end
489
+ end
490
+ end
491
+
492
+ end
@@ -3,7 +3,7 @@
3
3
  require 'spec_helper'
4
4
 
5
5
  describe Symbol do
6
-
6
+
7
7
  context 'performance' do
8
8
  include Picky::Helpers::Measuring
9
9
  before(:each) do
@@ -16,7 +16,7 @@ describe Symbol do
16
16
  performance_of { @token.each_intoken { |intoken| } }.should < 0.025 # TODO Slow!
17
17
  end
18
18
  end
19
-
19
+
20
20
  describe 'each_intoken' do
21
21
  context 'normal symbol' do
22
22
  before(:each) do
@@ -249,7 +249,7 @@ describe Symbol do
249
249
  end
250
250
  end
251
251
  end
252
-
252
+
253
253
  describe "each_subtoken" do
254
254
  context 'normal symbol' do
255
255
  before(:each) do
@@ -471,6 +471,22 @@ describe Symbol do
471
471
  end
472
472
  end
473
473
  end
474
+ context "with range param" do
475
+ it "returns a subtoken array from a clipped original" do
476
+ result = []
477
+ :reinke.each_subtoken 2, (0..3) do |subtoken|
478
+ result << subtoken
479
+ end
480
+ result.should == [:rein, :rei, :re]
481
+ end
482
+ it "returns a subtoken array from a clipped original" do
483
+ result = []
484
+ :reinke.each_subtoken 2, (1..-2) do |subtoken|
485
+ result << subtoken
486
+ end
487
+ result.should == [:eink, :ein, :ei]
488
+ end
489
+ end
474
490
  end
475
-
491
+
476
492
  end
@@ -0,0 +1,35 @@
1
+ # encoding: utf-8
2
+ #
3
+ require 'spec_helper'
4
+
5
+ describe "Regression" do
6
+
7
+ # # This was described by Niko
8
+ # # and references a case where
9
+ # # an attribute and the id referenced
10
+ # # to the same String.
11
+ # #
12
+ # context 'fun cases' do
13
+ # it 'stopwords destroy ids (final: id reference on attribute)' do
14
+ # index = Picky::Index.new :stopwords do
15
+ # key_format :to_sym
16
+ # indexing splits_text_on: /[\\\/\s\"\'\&_,;:]+/i,
17
+ # stopwords: /\b(and|the|or|on|of|in|der|die|das|und|oder)\b/i
18
+ # category :text
19
+ # end
20
+ #
21
+ # referenced = "this and that"
22
+ #
23
+ # require 'ostruct'
24
+ #
25
+ # thing = OpenStruct.new id: referenced, text: referenced
26
+ #
27
+ # index.add thing
28
+ #
29
+ # try = Picky::Search.new index
30
+ #
31
+ # try.search("this").ids.should == ["this that"]
32
+ # end
33
+ # end
34
+
35
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: picky
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.4.0
4
+ version: 3.4.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-11-08 00:00:00.000000000 Z
12
+ date: 2011-11-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &70199588357580 !ruby/object:Gem::Requirement
16
+ requirement: &70307432765800 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,21 +21,21 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *70199588357580
24
+ version_requirements: *70307432765800
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: picky-client
27
- requirement: &70199588357080 !ruby/object:Gem::Requirement
27
+ requirement: &70307432765260 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
31
31
  - !ruby/object:Gem::Version
32
- version: 3.4.0
32
+ version: 3.4.1
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *70199588357080
35
+ version_requirements: *70307432765260
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rack
38
- requirement: &70199588356660 !ruby/object:Gem::Requirement
38
+ requirement: &70307432764800 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70199588356660
46
+ version_requirements: *70307432764800
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rack_fast_escape
49
- requirement: &70199588356200 !ruby/object:Gem::Requirement
49
+ requirement: &70307432764280 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *70199588356200
57
+ version_requirements: *70307432764280
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: text
60
- requirement: &70199588379320 !ruby/object:Gem::Requirement
60
+ requirement: &70307432763780 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '0'
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *70199588379320
68
+ version_requirements: *70307432763780
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: yajl-ruby
71
- requirement: &70199588378900 !ruby/object:Gem::Requirement
71
+ requirement: &70307432763280 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: '0'
77
77
  type: :runtime
78
78
  prerelease: false
79
- version_requirements: *70199588378900
79
+ version_requirements: *70307432763280
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: activesupport
82
- requirement: &70199588378400 !ruby/object:Gem::Requirement
82
+ requirement: &70307432762740 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ~>
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: '3.0'
88
88
  type: :runtime
89
89
  prerelease: false
90
- version_requirements: *70199588378400
90
+ version_requirements: *70307432762740
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: activerecord
93
- requirement: &70199588377900 !ruby/object:Gem::Requirement
93
+ requirement: &70307432762180 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ~>
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: '3.0'
99
99
  type: :runtime
100
100
  prerelease: false
101
- version_requirements: *70199588377900
101
+ version_requirements: *70307432762180
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: unicorn
104
- requirement: &70199588377520 !ruby/object:Gem::Requirement
104
+ requirement: &70307432761720 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ! '>='
@@ -109,10 +109,10 @@ dependencies:
109
109
  version: '0'
110
110
  type: :runtime
111
111
  prerelease: false
112
- version_requirements: *70199588377520
112
+ version_requirements: *70307432761720
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: sinatra
115
- requirement: &70199588377040 !ruby/object:Gem::Requirement
115
+ requirement: &70307432761240 !ruby/object:Gem::Requirement
116
116
  none: false
117
117
  requirements:
118
118
  - - ! '>='
@@ -120,10 +120,10 @@ dependencies:
120
120
  version: '0'
121
121
  type: :runtime
122
122
  prerelease: false
123
- version_requirements: *70199588377040
123
+ version_requirements: *70307432761240
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: redis
126
- requirement: &70199588376580 !ruby/object:Gem::Requirement
126
+ requirement: &70307432760800 !ruby/object:Gem::Requirement
127
127
  none: false
128
128
  requirements:
129
129
  - - ! '>='
@@ -131,10 +131,10 @@ dependencies:
131
131
  version: '0'
132
132
  type: :runtime
133
133
  prerelease: false
134
- version_requirements: *70199588376580
134
+ version_requirements: *70307432760800
135
135
  - !ruby/object:Gem::Dependency
136
136
  name: mysql
137
- requirement: &70199588376060 !ruby/object:Gem::Requirement
137
+ requirement: &70307432760320 !ruby/object:Gem::Requirement
138
138
  none: false
139
139
  requirements:
140
140
  - - ! '>='
@@ -142,7 +142,7 @@ dependencies:
142
142
  version: '0'
143
143
  type: :runtime
144
144
  prerelease: false
145
- version_requirements: *70199588376060
145
+ version_requirements: *70307432760320
146
146
  description: Fast Ruby semantic text search engine with comfortable single field interface.
147
147
  email: florian.hanke+picky@gmail.com
148
148
  executables:
@@ -198,6 +198,7 @@ files:
198
198
  - lib/picky/extensions/hash.rb
199
199
  - lib/picky/extensions/module.rb
200
200
  - lib/picky/extensions/object.rb
201
+ - lib/picky/extensions/string.rb
201
202
  - lib/picky/extensions/symbol.rb
202
203
  - lib/picky/frontend_adapters/rack.rb
203
204
  - lib/picky/generators/aliases.rb
@@ -313,6 +314,7 @@ files:
313
314
  - spec/lib/extensions/hash_spec.rb
314
315
  - spec/lib/extensions/module_spec.rb
315
316
  - spec/lib/extensions/object_spec.rb
317
+ - spec/lib/extensions/string_spec.rb
316
318
  - spec/lib/extensions/symbol_spec.rb
317
319
  - spec/lib/frontend_adapters/rack_spec.rb
318
320
  - spec/lib/generators/aliases_spec.rb
@@ -376,6 +378,7 @@ files:
376
378
  - spec/lib/tasks/try_spec.rb
377
379
  - spec/lib/tokenizer_spec.rb
378
380
  - spec/specific/realtime_spec.rb
381
+ - spec/specific/regression_spec.rb
379
382
  - spec/specific/speed_spec.rb
380
383
  - bin/picky
381
384
  homepage: http://florianhanke.com/picky
@@ -436,6 +439,7 @@ test_files:
436
439
  - spec/lib/extensions/hash_spec.rb
437
440
  - spec/lib/extensions/module_spec.rb
438
441
  - spec/lib/extensions/object_spec.rb
442
+ - spec/lib/extensions/string_spec.rb
439
443
  - spec/lib/extensions/symbol_spec.rb
440
444
  - spec/lib/frontend_adapters/rack_spec.rb
441
445
  - spec/lib/generators/aliases_spec.rb
@@ -499,4 +503,5 @@ test_files:
499
503
  - spec/lib/tasks/try_spec.rb
500
504
  - spec/lib/tokenizer_spec.rb
501
505
  - spec/specific/realtime_spec.rb
506
+ - spec/specific/regression_spec.rb
502
507
  - spec/specific/speed_spec.rb