picky 3.4.0 → 3.4.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.
@@ -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