redis 4.1.0.beta1 → 4.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (142) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +13 -2
  3. data/README.md +45 -0
  4. data/lib/redis.rb +497 -20
  5. data/lib/redis/client.rb +14 -6
  6. data/lib/redis/cluster.rb +1 -0
  7. data/lib/redis/cluster/command_loader.rb +2 -0
  8. data/lib/redis/cluster/node_loader.rb +2 -0
  9. data/lib/redis/cluster/option.rb +1 -0
  10. data/lib/redis/cluster/slot_loader.rb +2 -0
  11. data/lib/redis/distributed.rb +3 -4
  12. data/lib/redis/version.rb +1 -1
  13. metadata +20 -243
  14. data/.gitignore +0 -19
  15. data/.travis.yml +0 -61
  16. data/.travis/Gemfile +0 -18
  17. data/.yardopts +0 -3
  18. data/Gemfile +0 -8
  19. data/benchmarking/logging.rb +0 -71
  20. data/benchmarking/pipeline.rb +0 -51
  21. data/benchmarking/speed.rb +0 -21
  22. data/benchmarking/suite.rb +0 -24
  23. data/benchmarking/worker.rb +0 -71
  24. data/bin/build +0 -71
  25. data/bors.toml +0 -14
  26. data/examples/basic.rb +0 -15
  27. data/examples/consistency.rb +0 -114
  28. data/examples/dist_redis.rb +0 -43
  29. data/examples/incr-decr.rb +0 -17
  30. data/examples/list.rb +0 -26
  31. data/examples/pubsub.rb +0 -37
  32. data/examples/sentinel.rb +0 -41
  33. data/examples/sentinel/start +0 -49
  34. data/examples/sets.rb +0 -36
  35. data/examples/unicorn/config.ru +0 -3
  36. data/examples/unicorn/unicorn.rb +0 -20
  37. data/makefile +0 -74
  38. data/redis.gemspec +0 -42
  39. data/test/bitpos_test.rb +0 -63
  40. data/test/blocking_commands_test.rb +0 -40
  41. data/test/client_test.rb +0 -76
  42. data/test/cluster_abnormal_state_test.rb +0 -38
  43. data/test/cluster_blocking_commands_test.rb +0 -15
  44. data/test/cluster_client_internals_test.rb +0 -77
  45. data/test/cluster_client_key_hash_tags_test.rb +0 -88
  46. data/test/cluster_client_options_test.rb +0 -147
  47. data/test/cluster_client_pipelining_test.rb +0 -59
  48. data/test/cluster_client_replicas_test.rb +0 -36
  49. data/test/cluster_client_slots_test.rb +0 -94
  50. data/test/cluster_client_transactions_test.rb +0 -71
  51. data/test/cluster_commands_on_cluster_test.rb +0 -165
  52. data/test/cluster_commands_on_connection_test.rb +0 -40
  53. data/test/cluster_commands_on_geo_test.rb +0 -74
  54. data/test/cluster_commands_on_hashes_test.rb +0 -11
  55. data/test/cluster_commands_on_hyper_log_log_test.rb +0 -17
  56. data/test/cluster_commands_on_keys_test.rb +0 -134
  57. data/test/cluster_commands_on_lists_test.rb +0 -15
  58. data/test/cluster_commands_on_pub_sub_test.rb +0 -101
  59. data/test/cluster_commands_on_scripting_test.rb +0 -56
  60. data/test/cluster_commands_on_server_test.rb +0 -221
  61. data/test/cluster_commands_on_sets_test.rb +0 -39
  62. data/test/cluster_commands_on_sorted_sets_test.rb +0 -35
  63. data/test/cluster_commands_on_streams_test.rb +0 -196
  64. data/test/cluster_commands_on_strings_test.rb +0 -15
  65. data/test/cluster_commands_on_transactions_test.rb +0 -41
  66. data/test/cluster_commands_on_value_types_test.rb +0 -14
  67. data/test/command_map_test.rb +0 -28
  68. data/test/commands_on_geo_test.rb +0 -116
  69. data/test/commands_on_hashes_test.rb +0 -7
  70. data/test/commands_on_hyper_log_log_test.rb +0 -7
  71. data/test/commands_on_lists_test.rb +0 -7
  72. data/test/commands_on_sets_test.rb +0 -7
  73. data/test/commands_on_sorted_sets_test.rb +0 -7
  74. data/test/commands_on_strings_test.rb +0 -7
  75. data/test/commands_on_value_types_test.rb +0 -207
  76. data/test/connection_handling_test.rb +0 -275
  77. data/test/connection_test.rb +0 -57
  78. data/test/distributed_blocking_commands_test.rb +0 -52
  79. data/test/distributed_commands_on_hashes_test.rb +0 -21
  80. data/test/distributed_commands_on_hyper_log_log_test.rb +0 -26
  81. data/test/distributed_commands_on_lists_test.rb +0 -19
  82. data/test/distributed_commands_on_sets_test.rb +0 -105
  83. data/test/distributed_commands_on_sorted_sets_test.rb +0 -59
  84. data/test/distributed_commands_on_strings_test.rb +0 -79
  85. data/test/distributed_commands_on_value_types_test.rb +0 -129
  86. data/test/distributed_commands_requiring_clustering_test.rb +0 -162
  87. data/test/distributed_connection_handling_test.rb +0 -21
  88. data/test/distributed_internals_test.rb +0 -68
  89. data/test/distributed_key_tags_test.rb +0 -50
  90. data/test/distributed_persistence_control_commands_test.rb +0 -24
  91. data/test/distributed_publish_subscribe_test.rb +0 -90
  92. data/test/distributed_remote_server_control_commands_test.rb +0 -64
  93. data/test/distributed_scripting_test.rb +0 -100
  94. data/test/distributed_sorting_test.rb +0 -18
  95. data/test/distributed_test.rb +0 -56
  96. data/test/distributed_transactions_test.rb +0 -30
  97. data/test/encoding_test.rb +0 -14
  98. data/test/error_replies_test.rb +0 -57
  99. data/test/fork_safety_test.rb +0 -60
  100. data/test/helper.rb +0 -344
  101. data/test/helper_test.rb +0 -22
  102. data/test/internals_test.rb +0 -395
  103. data/test/lint/blocking_commands.rb +0 -174
  104. data/test/lint/hashes.rb +0 -203
  105. data/test/lint/hyper_log_log.rb +0 -74
  106. data/test/lint/lists.rb +0 -159
  107. data/test/lint/sets.rb +0 -282
  108. data/test/lint/sorted_sets.rb +0 -497
  109. data/test/lint/strings.rb +0 -348
  110. data/test/lint/value_types.rb +0 -130
  111. data/test/persistence_control_commands_test.rb +0 -24
  112. data/test/pipelining_commands_test.rb +0 -246
  113. data/test/publish_subscribe_test.rb +0 -280
  114. data/test/remote_server_control_commands_test.rb +0 -175
  115. data/test/scanning_test.rb +0 -407
  116. data/test/scripting_test.rb +0 -76
  117. data/test/sentinel_command_test.rb +0 -78
  118. data/test/sentinel_test.rb +0 -253
  119. data/test/sorting_test.rb +0 -57
  120. data/test/ssl_test.rb +0 -69
  121. data/test/support/cluster/orchestrator.rb +0 -199
  122. data/test/support/connection/hiredis.rb +0 -1
  123. data/test/support/connection/ruby.rb +0 -1
  124. data/test/support/connection/synchrony.rb +0 -17
  125. data/test/support/redis_mock.rb +0 -130
  126. data/test/support/ssl/gen_certs.sh +0 -31
  127. data/test/support/ssl/trusted-ca.crt +0 -25
  128. data/test/support/ssl/trusted-ca.key +0 -27
  129. data/test/support/ssl/trusted-cert.crt +0 -81
  130. data/test/support/ssl/trusted-cert.key +0 -28
  131. data/test/support/ssl/untrusted-ca.crt +0 -26
  132. data/test/support/ssl/untrusted-ca.key +0 -27
  133. data/test/support/ssl/untrusted-cert.crt +0 -82
  134. data/test/support/ssl/untrusted-cert.key +0 -28
  135. data/test/support/wire/synchrony.rb +0 -24
  136. data/test/support/wire/thread.rb +0 -5
  137. data/test/synchrony_driver.rb +0 -85
  138. data/test/test.conf.erb +0 -9
  139. data/test/thread_safety_test.rb +0 -60
  140. data/test/transactions_test.rb +0 -272
  141. data/test/unknown_commands_test.rb +0 -12
  142. data/test/url_param_test.rb +0 -136
@@ -1,39 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'helper'
4
- require_relative 'lint/sets'
5
-
6
- # ruby -w -Itest test/cluster_commands_on_sets_test.rb
7
- # @see https://redis.io/commands#set
8
- class TestClusterCommandsOnSets < Test::Unit::TestCase
9
- include Helper::Cluster
10
- include Lint::Sets
11
-
12
- def test_sdiff
13
- assert_raise(Redis::CommandError) { super }
14
- end
15
-
16
- def test_sdiffstore
17
- assert_raise(Redis::CommandError) { super }
18
- end
19
-
20
- def test_sinter
21
- assert_raise(Redis::CommandError) { super }
22
- end
23
-
24
- def test_sinterstore
25
- assert_raise(Redis::CommandError) { super }
26
- end
27
-
28
- def test_smove
29
- assert_raise(Redis::CommandError) { super }
30
- end
31
-
32
- def test_sunion
33
- assert_raise(Redis::CommandError) { super }
34
- end
35
-
36
- def test_sunionstore
37
- assert_raise(Redis::CommandError) { super }
38
- end
39
- end
@@ -1,35 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'helper'
4
- require_relative 'lint/sorted_sets'
5
-
6
- # ruby -w -Itest test/cluster_commands_on_sorted_sets_test.rb
7
- # @see https://redis.io/commands#sorted_set
8
- class TestClusterCommandsOnSortedSets < Test::Unit::TestCase
9
- include Helper::Cluster
10
- include Lint::SortedSets
11
-
12
- def test_zinterstore
13
- assert_raise(Redis::CommandError) { super }
14
- end
15
-
16
- def test_zinterstore_with_aggregate
17
- assert_raise(Redis::CommandError) { super }
18
- end
19
-
20
- def test_zinterstore_with_weights
21
- assert_raise(Redis::CommandError) { super }
22
- end
23
-
24
- def test_zunionstore
25
- assert_raise(Redis::CommandError) { super }
26
- end
27
-
28
- def test_zunionstore_with_aggregate
29
- assert_raise(Redis::CommandError) { super }
30
- end
31
-
32
- def test_zunionstore_with_weights
33
- assert_raise(Redis::CommandError) { super }
34
- end
35
- end
@@ -1,196 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'helper'
4
-
5
- # ruby -w -Itest test/cluster_commands_on_streams_test.rb
6
- # @see https://redis.io/commands#stream
7
- class TestClusterCommandsOnStreams < Test::Unit::TestCase
8
- include Helper::Cluster
9
-
10
- MIN_REDIS_VERSION = '4.9.0'
11
- ENTRY_ID_FORMAT = /\d+-\d+/
12
-
13
- def setup
14
- super
15
- add_some_entries_to_streams_without_hashtag
16
- add_some_entries_to_streams_with_hashtag
17
- end
18
-
19
- def add_some_entries_to_streams_without_hashtag
20
- target_version(MIN_REDIS_VERSION) do
21
- redis.xadd('stream1', '*', 'name', 'John', 'surname', 'Connor')
22
- redis.xadd('stream1', '*', 'name', 'Sarah', 'surname', 'Connor')
23
- redis.xadd('stream1', '*', 'name', 'Miles', 'surname', 'Dyson')
24
- redis.xadd('stream1', '*', 'name', 'Peter', 'surname', 'Silberman')
25
- end
26
- end
27
-
28
- def add_some_entries_to_streams_with_hashtag
29
- target_version(MIN_REDIS_VERSION) do
30
- redis.xadd('{stream}1', '*', 'name', 'John', 'surname', 'Connor')
31
- redis.xadd('{stream}1', '*', 'name', 'Sarah', 'surname', 'Connor')
32
- redis.xadd('{stream}1', '*', 'name', 'Miles', 'surname', 'Dyson')
33
- redis.xadd('{stream}1', '*', 'name', 'Peter', 'surname', 'Silberman')
34
- end
35
- end
36
-
37
- def assert_stream_entry(actual, expected_name, expected_surname)
38
- actual_key = actual.keys.first
39
- actual_values = actual[actual_key]
40
-
41
- assert_match ENTRY_ID_FORMAT, actual_key
42
- assert_equal expected_name, actual_values['name']
43
- assert_equal expected_surname, actual_values['surname']
44
- end
45
-
46
- def assert_stream_pending(actual, expected_size_of_group, expected_consumer_name, expected_size_of_consumer)
47
- assert_equal expected_size_of_group, actual[:size]
48
- assert_match ENTRY_ID_FORMAT, actual[:min_entry_id]
49
- assert_match ENTRY_ID_FORMAT, actual[:max_entry_id]
50
- assert_equal({ expected_consumer_name => expected_size_of_consumer }, actual[:consumers])
51
- end
52
-
53
- # TODO: Remove this helper method when we implement streams interfaces
54
- def hashify_stream_entries(reply)
55
- reply.map do |entry_id, values|
56
- [entry_id, Hash[values.each_slice(2).to_a]]
57
- end.to_h
58
- end
59
-
60
- # TODO: Remove this helper method when we implement streams interfaces
61
- def hashify_streams(reply)
62
- reply.map do |stream_key, entries|
63
- [stream_key, hashify_stream_entries(entries)]
64
- end.to_h
65
- end
66
-
67
- # TODO: Remove this helper method when we implement streams interfaces
68
- def hashify_stream_pendings(reply)
69
- {
70
- size: reply.first,
71
- min_entry_id: reply[1],
72
- max_entry_id: reply[2],
73
- consumers: Hash[reply[3]]
74
- }
75
- end
76
-
77
- def test_xadd
78
- target_version(MIN_REDIS_VERSION) do
79
- assert_match ENTRY_ID_FORMAT, redis.xadd('mystream', '*', 'type', 'T-800', 'model', '101')
80
- assert_match ENTRY_ID_FORMAT, redis.xadd('my{stream}', '*', 'type', 'T-1000')
81
- end
82
- end
83
-
84
- def test_xrange
85
- target_version(MIN_REDIS_VERSION) do
86
- actual = redis.xrange('stream1', '-', '+', 'COUNT', 1)
87
- actual = hashify_stream_entries(actual) # TODO: Remove this step when we implement streams interfaces
88
- assert_stream_entry(actual, 'John', 'Connor')
89
-
90
- actual = redis.xrange('{stream}1', '-', '+', 'COUNT', 1)
91
- actual = hashify_stream_entries(actual) # TODO: Remove this step when we implement streams interfaces
92
- assert_stream_entry(actual, 'John', 'Connor')
93
- end
94
- end
95
-
96
- def test_xrevrange
97
- target_version(MIN_REDIS_VERSION) do
98
- actual = redis.xrevrange('stream1', '+', '-', 'COUNT', 1)
99
- actual = hashify_stream_entries(actual) # TODO: Remove this step when we implement streams interfaces
100
- assert_stream_entry(actual, 'Peter', 'Silberman')
101
-
102
- actual = redis.xrevrange('{stream}1', '+', '-', 'COUNT', 1)
103
- actual = hashify_stream_entries(actual) # TODO: Remove this step when we implement streams interfaces
104
- assert_stream_entry(actual, 'Peter', 'Silberman')
105
- end
106
- end
107
-
108
- def test_xlen
109
- target_version(MIN_REDIS_VERSION) do
110
- assert_equal 4, redis.xlen('stream1')
111
- assert_equal 4, redis.xlen('{stream}1')
112
- end
113
- end
114
-
115
- def test_xread
116
- target_version(MIN_REDIS_VERSION) do
117
- # non blocking without hashtag
118
- actual = redis.xread('COUNT', 1, 'STREAMS', 'stream1', 0)
119
- actual = hashify_streams(actual) # TODO: Remove this step when we implement streams interfaces
120
- assert_equal 'stream1', actual.keys.first
121
- assert_stream_entry(actual['stream1'], 'John', 'Connor')
122
-
123
- # blocking without hashtag
124
- actual = redis.xread('COUNT', 1, 'BLOCK', 1, 'STREAMS', 'stream1', 0)
125
- actual = hashify_streams(actual) # TODO: Remove this step when we implement streams interfaces
126
- assert_equal 'stream1', actual.keys.first
127
- assert_stream_entry(actual['stream1'], 'John', 'Connor')
128
-
129
- # non blocking with hashtag
130
- actual = redis.xread('COUNT', 1, 'STREAMS', '{stream}1', 0)
131
- actual = hashify_streams(actual) # TODO: Remove this step when we implement streams interfaces
132
- assert_equal '{stream}1', actual.keys.first
133
- assert_stream_entry(actual['{stream}1'], 'John', 'Connor')
134
-
135
- # blocking with hashtag
136
- actual = redis.xread('COUNT', 1, 'BLOCK', 1, 'STREAMS', '{stream}1', 0)
137
- actual = hashify_streams(actual) # TODO: Remove this step when we implement streams interfaces
138
- assert_equal '{stream}1', actual.keys.first
139
- assert_stream_entry(actual['{stream}1'], 'John', 'Connor')
140
- end
141
- end
142
-
143
- def test_xreadgroup
144
- target_version(MIN_REDIS_VERSION) do
145
- # non blocking without hashtag
146
- redis.xgroup('create', 'stream1', 'mygroup1', '$')
147
- add_some_entries_to_streams_without_hashtag
148
- actual = redis.xreadgroup('GROUP', 'mygroup1', 'T-1000', 'COUNT', 1, 'STREAMS', 'stream1', '>')
149
- actual = hashify_streams(actual) # TODO: Remove this step when we implement streams interfaces
150
- assert_equal 'stream1', actual.keys.first
151
- assert_stream_entry(actual['stream1'], 'John', 'Connor')
152
-
153
- # blocking without hashtag
154
- redis.xgroup('create', 'stream1', 'mygroup2', '$')
155
- add_some_entries_to_streams_without_hashtag
156
- actual = redis.xreadgroup('GROUP', 'mygroup2', 'T-800', 'COUNT', 1, 'BLOCK', 1, 'STREAMS', 'stream1', '>')
157
- actual = hashify_streams(actual) # TODO: Remove this step when we implement streams interfaces
158
- assert_equal 'stream1', actual.keys.first
159
- assert_stream_entry(actual['stream1'], 'John', 'Connor')
160
-
161
- # non blocking with hashtag
162
- redis.xgroup('create', '{stream}1', 'mygroup3', '$')
163
- add_some_entries_to_streams_with_hashtag
164
- actual = redis.xreadgroup('GROUP', 'mygroup3', 'T-1000', 'COUNT', 1, 'STREAMS', '{stream}1', '>')
165
- actual = hashify_streams(actual) # TODO: Remove this step when we implement streams interfaces
166
- assert_equal '{stream}1', actual.keys.first
167
- assert_stream_entry(actual['{stream}1'], 'John', 'Connor')
168
-
169
- # blocking with hashtag
170
- redis.xgroup('create', '{stream}1', 'mygroup4', '$')
171
- add_some_entries_to_streams_with_hashtag
172
- actual = redis.xreadgroup('GROUP', 'mygroup4', 'T-800', 'COUNT', 1, 'BLOCK', 1, 'STREAMS', '{stream}1', '>')
173
- actual = hashify_streams(actual) # TODO: Remove this step when we implement streams interfaces
174
- assert_equal '{stream}1', actual.keys.first
175
- assert_stream_entry(actual['{stream}1'], 'John', 'Connor')
176
- end
177
- end
178
-
179
- def test_xpending
180
- target_version(MIN_REDIS_VERSION) do
181
- redis.xgroup('create', 'stream1', 'mygroup1', '$')
182
- add_some_entries_to_streams_without_hashtag
183
- redis.xreadgroup('GROUP', 'mygroup1', 'T-800', 'COUNT', 1, 'STREAMS', 'stream1', '>')
184
- actual = redis.xpending('stream1', 'mygroup1')
185
- actual = hashify_stream_pendings(actual) # TODO: Remove this step when we implement streams interfaces
186
- assert_stream_pending(actual, 1, 'T-800', '1')
187
-
188
- redis.xgroup('create', '{stream}1', 'mygroup2', '$')
189
- add_some_entries_to_streams_with_hashtag
190
- redis.xreadgroup('GROUP', 'mygroup2', 'T-800', 'COUNT', 1, 'STREAMS', '{stream}1', '>')
191
- actual = redis.xpending('{stream}1', 'mygroup2')
192
- actual = hashify_stream_pendings(actual) # TODO: Remove this step when we implement streams interfaces
193
- assert_stream_pending(actual, 1, 'T-800', '1')
194
- end
195
- end
196
- end
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'helper'
4
- require_relative 'lint/strings'
5
-
6
- # ruby -w -Itest test/cluster_commands_on_strings_test.rb
7
- # @see https://redis.io/commands#string
8
- class TestClusterCommandsOnStrings < Test::Unit::TestCase
9
- include Helper::Cluster
10
- include Lint::Strings
11
-
12
- def mock(*args, &block)
13
- redis_cluster_mock(*args, &block)
14
- end
15
- end
@@ -1,41 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'helper'
4
-
5
- # ruby -w -Itest test/cluster_commands_on_transactions_test.rb
6
- # @see https://redis.io/commands#transactions
7
- class TestClusterCommandsOnTransactions < Test::Unit::TestCase
8
- include Helper::Cluster
9
-
10
- def test_discard
11
- assert_raise(Redis::Cluster::AmbiguousNodeError) do
12
- redis.discard
13
- end
14
- end
15
-
16
- def test_exec
17
- assert_raise(Redis::Cluster::AmbiguousNodeError) do
18
- redis.exec
19
- end
20
- end
21
-
22
- def test_multi
23
- assert_raise(Redis::Cluster::AmbiguousNodeError) do
24
- redis.multi
25
- end
26
- end
27
-
28
- def test_unwatch
29
- assert_raise(Redis::Cluster::AmbiguousNodeError) do
30
- redis.unwatch
31
- end
32
- end
33
-
34
- def test_watch
35
- assert_raise(Redis::CommandError, "CROSSSLOT Keys in request don't hash to the same slot") do
36
- redis.watch('key1', 'key2')
37
- end
38
-
39
- assert_equal 'OK', redis.watch('{key}1', '{key}2')
40
- end
41
- end
@@ -1,14 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'helper'
4
- require_relative 'lint/value_types'
5
-
6
- # ruby -w -Itest test/cluster_commands_on_value_types_test.rb
7
- class TestClusterCommandsOnValueTypes < Test::Unit::TestCase
8
- include Helper::Cluster
9
- include Lint::ValueTypes
10
-
11
- def test_move
12
- assert_raise(Redis::CommandError) { super }
13
- end
14
- end
@@ -1,28 +0,0 @@
1
- require_relative "helper"
2
-
3
- class TestCommandMap < Test::Unit::TestCase
4
-
5
- include Helper::Client
6
-
7
- def test_override_existing_commands
8
- r.set("counter", 1)
9
-
10
- assert_equal 2, r.incr("counter")
11
-
12
- r._client.command_map[:incr] = :decr
13
-
14
- assert_equal 1, r.incr("counter")
15
- end
16
-
17
- def test_override_non_existing_commands
18
- r.set("key", "value")
19
-
20
- assert_raise Redis::CommandError do
21
- r.idontexist("key")
22
- end
23
-
24
- r._client.command_map[:idontexist] = :get
25
-
26
- assert_equal "value", r.idontexist("key")
27
- end
28
- end
@@ -1,116 +0,0 @@
1
- require_relative "helper"
2
-
3
- class TestCommandsGeo < Test::Unit::TestCase
4
- include Helper::Client
5
-
6
- def setup
7
- super
8
-
9
- target_version "3.2.0" do
10
- added_items_count = r.geoadd("Sicily", 13.361389, 38.115556, "Palermo", 15.087269, 37.502669, "Catania")
11
- assert_equal 2, added_items_count
12
- end
13
- end
14
-
15
- def test_georadius_with_sort
16
- target_version "3.2.0" do
17
- nearest_cities = r.georadius("Sicily", 15, 37, 200, 'km', sort: 'asc')
18
- assert_equal %w(Catania Palermo), nearest_cities
19
-
20
- farthest_cities = r.georadius("Sicily", 15, 37, 200, 'km', sort: 'desc')
21
- assert_equal %w(Palermo Catania), farthest_cities
22
- end
23
- end
24
-
25
- def test_georadius_with_count
26
- target_version "3.2.0" do
27
- city = r.georadius("Sicily", 15, 37, 200, 'km', count: 1)
28
- assert_equal %w(Catania), city
29
- end
30
- end
31
-
32
- def test_georadius_with_options_count_sort
33
- target_version "3.2.0" do
34
- city = r.georadius("Sicily", 15, 37, 200, 'km', sort: :desc, options: :WITHDIST, count: 1)
35
- assert_equal [["Palermo", "190.4424"]], city
36
- end
37
- end
38
-
39
- def test_georadiusbymember_with_sort
40
- target_version "3.2.0" do
41
- nearest_cities = r.georadiusbymember("Sicily", "Catania", 200, 'km', sort: 'asc')
42
- assert_equal %w(Catania Palermo), nearest_cities
43
-
44
- farthest_cities = r.georadiusbymember("Sicily", "Catania", 200, 'km', sort: 'desc')
45
- assert_equal %w(Palermo Catania), farthest_cities
46
- end
47
- end
48
-
49
- def test_georadiusbymember_with_count
50
- target_version "3.2.0" do
51
- city = r.georadiusbymember("Sicily", "Catania", 200, 'km', count: 1)
52
- assert_equal %w(Catania), city
53
- end
54
- end
55
-
56
- def test_georadiusbymember_with_options_count_sort
57
- target_version "3.2.0" do
58
- city = r.georadiusbymember("Sicily", "Catania", 200, 'km', sort: :desc, options: :WITHDIST, count: 1)
59
- assert_equal [["Palermo", "166.2742"]], city
60
- end
61
- end
62
-
63
- def test_geopos
64
- target_version "3.2.0" do
65
- location = r.geopos("Sicily", "Catania")
66
- assert_equal [["15.08726745843887329", "37.50266842333162032"]], location
67
-
68
- locations = r.geopos("Sicily", ["Palermo", "Catania"])
69
- assert_equal [["13.36138933897018433", "38.11555639549629859"], ["15.08726745843887329", "37.50266842333162032"]], locations
70
- end
71
- end
72
-
73
- def test_geopos_nonexistant_location
74
- target_version "3.2.0" do
75
- location = r.geopos("Sicily", "Rome")
76
- assert_equal [nil], location
77
-
78
- locations = r.geopos("Sicily", ["Rome", "Catania"])
79
- assert_equal [nil, ["15.08726745843887329", "37.50266842333162032"]], locations
80
- end
81
- end
82
-
83
- def test_geodist
84
- target_version "3.2.0" do
85
- distination_in_meters = r.geodist("Sicily", "Palermo", "Catania")
86
- assert_equal "166274.1516", distination_in_meters
87
-
88
- distination_in_feet = r.geodist("Sicily", "Palermo", "Catania", 'ft')
89
- assert_equal "545518.8700", distination_in_feet
90
- end
91
- end
92
-
93
- def test_geodist_with_nonexistant_location
94
- target_version "3.2.0" do
95
- distination = r.geodist("Sicily", "Palermo", "Rome")
96
- assert_equal nil, distination
97
- end
98
- end
99
-
100
- def test_geohash
101
- target_version "3.2.0" do
102
- geohash = r.geohash("Sicily", "Palermo")
103
- assert_equal ["sqc8b49rny0"], geohash
104
-
105
- geohashes = r.geohash("Sicily", ["Palermo", "Catania"])
106
- assert_equal %w(sqc8b49rny0 sqdtr74hyu0), geohashes
107
- end
108
- end
109
-
110
- def test_geohash_with_nonexistant_location
111
- target_version "3.2.0" do
112
- geohashes = r.geohash("Sicily", ["Palermo", "Rome"])
113
- assert_equal ["sqc8b49rny0", nil], geohashes
114
- end
115
- end
116
- end