mongo 2.1.0.beta → 2.2.0

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.
Files changed (342) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +10 -3
  4. data/Rakefile +1 -7
  5. data/lib/mongo/address/ipv4.rb +6 -1
  6. data/lib/mongo/address/unix.rb +2 -2
  7. data/lib/mongo/address.rb +32 -10
  8. data/lib/mongo/auth/cr/conversation.rb +1 -1
  9. data/lib/mongo/auth/ldap/conversation.rb +7 -3
  10. data/lib/mongo/auth/scram/conversation.rb +9 -3
  11. data/lib/mongo/auth/user/view.rb +23 -2
  12. data/lib/mongo/auth/x509/conversation.rb +1 -1
  13. data/lib/mongo/bulk_write/combineable.rb +51 -0
  14. data/lib/mongo/bulk_write/ordered_combiner.rb +55 -0
  15. data/lib/mongo/bulk_write/result.rb +61 -8
  16. data/lib/mongo/bulk_write/result_combiner.rb +117 -0
  17. data/lib/mongo/bulk_write/transformable.rb +132 -0
  18. data/lib/mongo/bulk_write/unordered_combiner.rb +52 -0
  19. data/lib/mongo/bulk_write/validatable.rb +62 -0
  20. data/lib/mongo/bulk_write.rb +164 -23
  21. data/lib/mongo/client.rb +75 -18
  22. data/lib/mongo/cluster/topology/replica_set.rb +8 -6
  23. data/lib/mongo/cluster/topology/unknown.rb +5 -2
  24. data/lib/mongo/cluster.rb +85 -5
  25. data/lib/mongo/collection/view/aggregation.rb +19 -45
  26. data/lib/mongo/collection/view/builder/aggregation.rb +98 -0
  27. data/lib/mongo/collection/view/builder/find_command.rb +111 -0
  28. data/lib/mongo/collection/view/builder/flags.rb +62 -0
  29. data/lib/mongo/collection/view/builder/map_reduce.rb +134 -0
  30. data/lib/mongo/collection/view/builder/modifiers.rb +80 -0
  31. data/lib/mongo/collection/view/builder/op_query.rb +83 -0
  32. data/lib/mongo/collection/view/builder.rb +20 -0
  33. data/lib/mongo/collection/view/explainable.rb +15 -0
  34. data/lib/mongo/collection/view/immutable.rb +4 -11
  35. data/lib/mongo/collection/view/iterable.rb +40 -5
  36. data/lib/mongo/collection/view/map_reduce.rb +67 -37
  37. data/lib/mongo/collection/view/readable.rb +114 -100
  38. data/lib/mongo/collection/view/writable.rb +46 -22
  39. data/lib/mongo/collection/view.rb +25 -22
  40. data/lib/mongo/collection.rb +130 -12
  41. data/lib/mongo/cursor/builder/get_more_command.rb +71 -0
  42. data/lib/mongo/cursor/builder/kill_cursors_command.rb +62 -0
  43. data/lib/mongo/cursor/builder/op_get_more.rb +61 -0
  44. data/lib/mongo/cursor/builder/op_kill_cursors.rb +56 -0
  45. data/lib/mongo/cursor/builder.rb +18 -0
  46. data/lib/mongo/cursor.rb +76 -21
  47. data/lib/mongo/database/view.rb +11 -6
  48. data/lib/mongo/database.rb +16 -6
  49. data/lib/mongo/dbref.rb +9 -9
  50. data/lib/mongo/{bulk_write/unordered_bulk_write.rb → error/closed_stream.rb} +12 -21
  51. data/lib/mongo/{bulk_write/ordered_bulk_write.rb → error/extra_file_chunk.rb} +13 -27
  52. data/lib/mongo/error/file_not_found.rb +37 -0
  53. data/lib/mongo/error/invalid_file.rb +2 -2
  54. data/lib/mongo/error/invalid_file_revision.rb +37 -0
  55. data/lib/mongo/error/invalid_uri.rb +5 -4
  56. data/lib/mongo/error/invalid_write_concern.rb +35 -0
  57. data/lib/mongo/error/missing_file_chunk.rb +38 -0
  58. data/lib/mongo/error/operation_failure.rb +33 -2
  59. data/lib/mongo/error/unchangeable_collection_option.rb +38 -0
  60. data/lib/mongo/error/unexpected_chunk_length.rb +39 -0
  61. data/lib/mongo/error.rb +8 -0
  62. data/lib/mongo/grid/file/chunk.rb +9 -9
  63. data/lib/mongo/grid/file/{metadata.rb → info.rb} +41 -39
  64. data/lib/mongo/grid/file.rb +12 -9
  65. data/lib/mongo/grid/fs_bucket.rb +448 -0
  66. data/lib/mongo/grid/stream/read.rb +208 -0
  67. data/lib/mongo/grid/stream/write.rb +187 -0
  68. data/lib/mongo/grid/stream.rb +64 -0
  69. data/lib/mongo/grid.rb +2 -1
  70. data/lib/mongo/index/view.rb +7 -4
  71. data/lib/mongo/index.rb +5 -0
  72. data/lib/mongo/loggable.rb +34 -57
  73. data/lib/mongo/logger.rb +16 -78
  74. data/lib/mongo/monitoring/command_log_subscriber.rb +38 -14
  75. data/lib/mongo/monitoring/event/command_started.rb +2 -1
  76. data/lib/mongo/monitoring/event/command_succeeded.rb +24 -2
  77. data/lib/mongo/monitoring/event/secure.rb +58 -0
  78. data/lib/mongo/monitoring/event.rb +1 -0
  79. data/lib/mongo/monitoring/publishable.rb +22 -12
  80. data/lib/mongo/monitoring.rb +1 -5
  81. data/lib/mongo/operation/commands/aggregate/result.rb +89 -0
  82. data/lib/mongo/operation/commands/aggregate.rb +64 -0
  83. data/lib/mongo/operation/commands/collections_info/result.rb +41 -0
  84. data/lib/mongo/operation/{read → commands}/collections_info.rb +5 -3
  85. data/lib/mongo/operation/commands/command.rb +47 -0
  86. data/lib/mongo/operation/commands/find/result.rb +62 -0
  87. data/lib/mongo/operation/commands/find.rb +27 -0
  88. data/lib/mongo/operation/commands/get_more/result.rb +62 -0
  89. data/lib/mongo/operation/commands/get_more.rb +27 -0
  90. data/lib/mongo/operation/{read → commands}/indexes.rb +9 -6
  91. data/lib/mongo/operation/{list_collections → commands/list_collections}/result.rb +1 -21
  92. data/lib/mongo/operation/{read → commands}/list_collections.rb +4 -32
  93. data/lib/mongo/operation/{list_indexes → commands/list_indexes}/result.rb +1 -21
  94. data/lib/mongo/operation/{read → commands}/list_indexes.rb +3 -33
  95. data/lib/mongo/operation/commands/map_reduce/result.rb +119 -0
  96. data/lib/mongo/operation/commands/map_reduce.rb +49 -0
  97. data/lib/mongo/operation/commands/parallel_scan/result.rb +64 -0
  98. data/lib/mongo/operation/commands/parallel_scan.rb +52 -0
  99. data/lib/mongo/operation/commands/user_query.rb +71 -0
  100. data/lib/mongo/operation/commands/users_info/result.rb +38 -0
  101. data/lib/mongo/operation/commands/users_info.rb +48 -0
  102. data/lib/mongo/operation/commands.rb +26 -0
  103. data/lib/mongo/operation/executable.rb +4 -68
  104. data/lib/mongo/operation/kill_cursors.rb +3 -3
  105. data/lib/mongo/operation/object_id_generator.rb +36 -0
  106. data/lib/mongo/operation/read/get_more.rb +2 -22
  107. data/lib/mongo/operation/read/query/result.rb +40 -0
  108. data/lib/mongo/operation/read/query.rb +4 -21
  109. data/lib/mongo/operation/read.rb +0 -4
  110. data/lib/mongo/operation/{read_preferrable.rb → read_preference.rb} +3 -2
  111. data/lib/mongo/operation/result.rb +43 -1
  112. data/lib/mongo/operation/specifiable.rb +59 -1
  113. data/lib/mongo/operation/write/bulk/bulkable.rb +83 -0
  114. data/lib/mongo/operation/write/bulk/delete/result.rb +67 -0
  115. data/lib/mongo/operation/write/bulk/delete.rb +71 -0
  116. data/lib/mongo/operation/write/bulk/insert/result.rb +129 -0
  117. data/lib/mongo/operation/write/bulk/insert.rb +96 -0
  118. data/lib/mongo/operation/write/bulk/legacy_mergable.rb +87 -0
  119. data/lib/mongo/operation/write/bulk/mergable.rb +71 -0
  120. data/lib/mongo/operation/write/bulk/update/result.rb +174 -0
  121. data/lib/mongo/operation/write/bulk/update.rb +81 -0
  122. data/lib/mongo/operation/write/bulk.rb +6 -3
  123. data/lib/mongo/operation/write/command/create_index.rb +0 -1
  124. data/lib/mongo/operation/write/command/create_user.rb +0 -1
  125. data/lib/mongo/operation/write/command/delete.rb +3 -3
  126. data/lib/mongo/operation/write/command/drop_index.rb +0 -1
  127. data/lib/mongo/operation/write/command/insert.rb +4 -3
  128. data/lib/mongo/operation/write/command/remove_user.rb +0 -1
  129. data/lib/mongo/operation/write/command/update.rb +6 -4
  130. data/lib/mongo/operation/write/command/update_user.rb +0 -1
  131. data/lib/mongo/operation/write/command/writable.rb +13 -18
  132. data/lib/mongo/operation/write/create_index.rb +4 -27
  133. data/lib/mongo/operation/write/create_user.rb +4 -30
  134. data/lib/mongo/operation/write/delete.rb +6 -29
  135. data/lib/mongo/operation/write/drop_index.rb +3 -3
  136. data/lib/mongo/operation/write/gle.rb +49 -0
  137. data/lib/mongo/operation/write/idable.rb +24 -2
  138. data/lib/mongo/operation/write/insert.rb +2 -24
  139. data/lib/mongo/operation/write/remove_user.rb +4 -27
  140. data/lib/mongo/operation/write/update.rb +13 -36
  141. data/lib/mongo/operation/write/update_user.rb +4 -30
  142. data/lib/mongo/operation/write/write_command_enabled.rb +53 -0
  143. data/lib/mongo/operation/write.rb +2 -0
  144. data/lib/mongo/operation.rb +33 -5
  145. data/lib/mongo/options/mapper.rb +26 -2
  146. data/lib/mongo/options/redacted.rb +156 -0
  147. data/lib/mongo/options.rb +1 -0
  148. data/lib/mongo/protocol/bit_vector.rb +11 -9
  149. data/lib/mongo/protocol/delete.rb +78 -3
  150. data/lib/mongo/protocol/get_more.rb +59 -2
  151. data/lib/mongo/protocol/insert.rb +73 -1
  152. data/lib/mongo/protocol/kill_cursors.rb +66 -4
  153. data/lib/mongo/protocol/message.rb +44 -20
  154. data/lib/mongo/protocol/query.rb +153 -65
  155. data/lib/mongo/protocol/reply.rb +92 -1
  156. data/lib/mongo/protocol/serializers.rb +49 -40
  157. data/lib/mongo/protocol/update.rb +93 -1
  158. data/lib/mongo/retryable.rb +101 -0
  159. data/lib/mongo/server/connectable.rb +28 -8
  160. data/lib/mongo/server/connection.rb +52 -10
  161. data/lib/mongo/server/connection_pool/queue.rb +15 -0
  162. data/lib/mongo/server/connection_pool.rb +12 -15
  163. data/lib/mongo/server/description/features.rb +4 -2
  164. data/lib/mongo/server/description.rb +39 -3
  165. data/lib/mongo/server/monitor/connection.rb +49 -28
  166. data/lib/mongo/server/monitor.rb +3 -14
  167. data/lib/mongo/server.rb +31 -4
  168. data/lib/mongo/server_selector/selectable.rb +58 -32
  169. data/lib/mongo/server_selector.rb +19 -10
  170. data/lib/mongo/socket/ssl.rb +4 -1
  171. data/lib/mongo/socket/tcp.rb +2 -2
  172. data/lib/mongo/socket/unix.rb +5 -8
  173. data/lib/mongo/socket.rb +11 -4
  174. data/lib/mongo/uri.rb +245 -139
  175. data/lib/mongo/version.rb +1 -1
  176. data/lib/mongo/write_concern.rb +21 -6
  177. data/lib/mongo.rb +4 -4
  178. data/mongo.gemspec +1 -2
  179. data/spec/mongo/address/unix_spec.rb +1 -1
  180. data/spec/mongo/address_spec.rb +25 -0
  181. data/spec/mongo/auth/ldap/conversation_spec.rb +43 -0
  182. data/spec/mongo/auth/user/view_spec.rb +26 -1
  183. data/spec/mongo/bulk_write/ordered_combiner_spec.rb +284 -0
  184. data/spec/mongo/bulk_write/unordered_combiner_spec.rb +239 -0
  185. data/spec/mongo/bulk_write_spec.rb +385 -161
  186. data/spec/mongo/client_spec.rb +193 -23
  187. data/spec/mongo/cluster/topology/replica_set_spec.rb +2 -0
  188. data/spec/mongo/collection/view/aggregation_spec.rb +65 -0
  189. data/spec/mongo/collection/view/builder/find_command_spec.rb +167 -0
  190. data/spec/mongo/collection/view/builder/flags_spec.rb +106 -0
  191. data/spec/mongo/collection/view/builder/modifiers_spec.rb +210 -0
  192. data/spec/mongo/collection/view/builder/op_query_spec.rb +154 -0
  193. data/spec/mongo/collection/view/explainable_spec.rb +1 -2
  194. data/spec/mongo/collection/view/immutable_spec.rb +54 -0
  195. data/spec/mongo/collection/view/map_reduce_spec.rb +104 -9
  196. data/spec/mongo/collection/view/readable_spec.rb +109 -112
  197. data/spec/mongo/collection/view_spec.rb +119 -487
  198. data/spec/mongo/collection_spec.rb +1002 -33
  199. data/spec/mongo/command_monitoring_spec.rb +64 -0
  200. data/spec/mongo/connection_string_spec.rb +115 -0
  201. data/spec/mongo/cursor/builder/get_more_command_spec.rb +160 -0
  202. data/spec/mongo/cursor/builder/op_get_more_spec.rb +52 -0
  203. data/spec/mongo/cursor_spec.rb +10 -60
  204. data/spec/mongo/database_spec.rb +81 -12
  205. data/spec/mongo/dbref_spec.rb +4 -4
  206. data/spec/mongo/grid/file/chunk_spec.rb +6 -6
  207. data/spec/mongo/grid/file/{metadata_spec.rb → info_spec.rb} +29 -17
  208. data/spec/mongo/grid/file_spec.rb +8 -8
  209. data/spec/mongo/grid/fs_bucket_spec.rb +1020 -0
  210. data/spec/mongo/grid/stream/read_spec.rb +275 -0
  211. data/spec/mongo/grid/stream/write_spec.rb +440 -0
  212. data/spec/mongo/grid/stream_spec.rb +48 -0
  213. data/spec/mongo/gridfs_spec.rb +50 -0
  214. data/spec/mongo/index/view_spec.rb +41 -0
  215. data/spec/mongo/logger_spec.rb +0 -40
  216. data/spec/mongo/monitoring/command_log_subscriber_spec.rb +76 -0
  217. data/spec/mongo/monitoring/event/command_started_spec.rb +26 -0
  218. data/spec/mongo/monitoring/event/command_succeeded_spec.rb +26 -0
  219. data/spec/mongo/monitoring/event/secure_spec.rb +57 -0
  220. data/spec/mongo/operation/{aggregate → commands/aggregate}/result_spec.rb +1 -1
  221. data/spec/mongo/operation/commands/aggregate_spec.rb +69 -0
  222. data/spec/mongo/operation/{read → commands}/collections_info_spec.rb +1 -1
  223. data/spec/mongo/operation/{command_spec.rb → commands/command_spec.rb} +1 -19
  224. data/spec/mongo/operation/{read → commands}/indexes_spec.rb +1 -1
  225. data/spec/mongo/operation/{map_reduce_spec.rb → commands/map_reduce_spec.rb} +1 -19
  226. data/spec/mongo/operation/kill_cursors_spec.rb +1 -17
  227. data/spec/mongo/operation/read/get_more_spec.rb +0 -16
  228. data/spec/mongo/operation/read/query_spec.rb +19 -16
  229. data/spec/mongo/operation/{read_preferrable_spec.rb → read_preference_spec.rb} +11 -11
  230. data/spec/mongo/operation/result_spec.rb +19 -0
  231. data/spec/mongo/operation/write/bulk/{bulk_delete_spec.rb → delete_spec.rb} +17 -28
  232. data/spec/mongo/operation/write/bulk/{bulk_insert_spec.rb → insert_spec.rb} +1 -12
  233. data/spec/mongo/operation/write/bulk/{bulk_update_spec.rb → update_spec.rb} +7 -18
  234. data/spec/mongo/operation/write/command/delete_spec.rb +18 -9
  235. data/spec/mongo/operation/write/command/insert_spec.rb +18 -9
  236. data/spec/mongo/operation/write/command/update_spec.rb +18 -9
  237. data/spec/mongo/operation/write/delete_spec.rb +3 -3
  238. data/spec/mongo/operation/write/insert_spec.rb +0 -11
  239. data/spec/mongo/operation/write/update_spec.rb +6 -6
  240. data/spec/mongo/options/redacted_spec.rb +350 -0
  241. data/spec/mongo/protocol/delete_spec.rb +4 -4
  242. data/spec/mongo/protocol/get_more_spec.rb +4 -4
  243. data/spec/mongo/protocol/insert_spec.rb +3 -3
  244. data/spec/mongo/protocol/kill_cursors_spec.rb +8 -6
  245. data/spec/mongo/protocol/query_spec.rb +21 -7
  246. data/spec/mongo/protocol/update_spec.rb +5 -5
  247. data/spec/mongo/retryable_spec.rb +221 -0
  248. data/spec/mongo/server/connection_pool/queue_spec.rb +16 -0
  249. data/spec/mongo/server/connection_pool_spec.rb +42 -6
  250. data/spec/mongo/server/connection_spec.rb +86 -1
  251. data/spec/mongo/server/description/features_spec.rb +25 -0
  252. data/spec/mongo/server/description_spec.rb +42 -0
  253. data/spec/mongo/server/monitor_spec.rb +44 -0
  254. data/spec/mongo/server_discovery_and_monitoring_spec.rb +25 -59
  255. data/spec/mongo/server_selection_rtt_spec.rb +37 -57
  256. data/spec/mongo/server_selection_spec.rb +5 -3
  257. data/spec/mongo/server_selector/nearest_spec.rb +35 -27
  258. data/spec/mongo/server_selector/primary_preferred_spec.rb +32 -30
  259. data/spec/mongo/server_selector/primary_spec.rb +21 -14
  260. data/spec/mongo/server_selector/secondary_preferred_spec.rb +28 -26
  261. data/spec/mongo/server_selector/secondary_spec.rb +24 -22
  262. data/spec/mongo/server_selector_spec.rb +87 -24
  263. data/spec/mongo/server_spec.rb +78 -15
  264. data/spec/mongo/socket/ssl_spec.rb +101 -57
  265. data/spec/mongo/socket/unix_spec.rb +52 -0
  266. data/spec/mongo/uri_spec.rb +271 -59
  267. data/spec/mongo/write_concern_spec.rb +126 -0
  268. data/spec/spec_helper.rb +29 -23
  269. data/spec/support/authorization.rb +4 -5
  270. data/spec/support/command_monitoring/bulkWrite.yml +73 -0
  271. data/spec/support/command_monitoring/command.yml +42 -0
  272. data/spec/support/command_monitoring/deleteMany.yml +55 -0
  273. data/spec/support/command_monitoring/deleteOne.yml +55 -0
  274. data/spec/support/command_monitoring/find.yml +268 -0
  275. data/spec/support/command_monitoring/insertMany.yml +81 -0
  276. data/spec/support/command_monitoring/insertOne.yml +51 -0
  277. data/spec/support/command_monitoring/updateMany.yml +67 -0
  278. data/spec/support/command_monitoring/updateOne.yml +95 -0
  279. data/spec/support/command_monitoring.rb +373 -0
  280. data/spec/support/connection_string.rb +228 -0
  281. data/spec/support/connection_string_tests/invalid-uris.yml +193 -0
  282. data/spec/support/connection_string_tests/valid-auth.yml +256 -0
  283. data/spec/support/connection_string_tests/valid-host_identifiers.yml +121 -0
  284. data/spec/support/connection_string_tests/valid-options.yml +30 -0
  285. data/spec/support/connection_string_tests/valid-unix_socket-absolute.yml +197 -0
  286. data/spec/support/connection_string_tests/valid-unix_socket-relative.yml +213 -0
  287. data/spec/support/connection_string_tests/valid-warnings.yml +55 -0
  288. data/spec/support/crud/read.rb +14 -10
  289. data/spec/support/crud/write.rb +36 -9
  290. data/spec/support/crud.rb +10 -2
  291. data/spec/support/gridfs.rb +637 -0
  292. data/spec/support/gridfs_tests/delete.yml +157 -0
  293. data/spec/support/gridfs_tests/download.yml +210 -0
  294. data/spec/support/gridfs_tests/download_by_name.yml +113 -0
  295. data/spec/support/gridfs_tests/upload.yml +158 -0
  296. data/spec/support/matchers.rb +2 -2
  297. data/spec/support/sdam/rs/equal_electionids.yml +1 -2
  298. data/spec/support/sdam/rs/new_primary_new_electionid.yml +0 -3
  299. data/spec/support/sdam/rs/primary_mismatched_me.yml +37 -0
  300. data/spec/support/sdam/rs/primary_to_no_primary_mismatched_me.yml +75 -0
  301. data/spec/support/sdam/rs/rsother_discovered.yml +24 -3
  302. data/spec/support/sdam/rs/secondary_mismatched_me.yml +37 -0
  303. data/spec/support/sdam/rs/stepdown_change_set_name.yml +59 -0
  304. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +1 -1
  305. data/spec/support/sdam/single/direct_connection_rsprimary.yml +1 -1
  306. data/spec/support/sdam/single/direct_connection_rssecondary.yml +1 -1
  307. data/spec/support/sdam/single/direct_connection_slave.yml +1 -1
  308. data/spec/support/sdam/single/direct_connection_standalone.yml +1 -1
  309. data/spec/support/sdam/single/not_ok_response.yml +0 -1
  310. data/spec/support/server_discovery_and_monitoring.rb +3 -1
  311. data/spec/support/server_selection.rb +3 -1
  312. data/spec/support/shared/bulk_write.rb +192 -0
  313. data/spec/support/shared/protocol.rb +5 -5
  314. data/spec/support/shared/server_selector.rb +78 -13
  315. data/spec/support/travis.rb +1 -1
  316. data.tar.gz.sig +0 -0
  317. metadata +211 -72
  318. metadata.gz.sig +0 -0
  319. data/lib/mongo/bulk_write/bulk_writable.rb +0 -252
  320. data/lib/mongo/bulk_write/deletable.rb +0 -57
  321. data/lib/mongo/bulk_write/insertable.rb +0 -49
  322. data/lib/mongo/bulk_write/replacable.rb +0 -58
  323. data/lib/mongo/bulk_write/updatable.rb +0 -69
  324. data/lib/mongo/grid/fs.rb +0 -146
  325. data/lib/mongo/operation/aggregate/result.rb +0 -103
  326. data/lib/mongo/operation/aggregate.rb +0 -108
  327. data/lib/mongo/operation/command.rb +0 -61
  328. data/lib/mongo/operation/map_reduce/result.rb +0 -122
  329. data/lib/mongo/operation/map_reduce.rb +0 -95
  330. data/lib/mongo/operation/parallel_scan/result.rb +0 -72
  331. data/lib/mongo/operation/parallel_scan.rb +0 -76
  332. data/lib/mongo/operation/write/bulk/bulk_delete/result.rb +0 -75
  333. data/lib/mongo/operation/write/bulk/bulk_delete.rb +0 -145
  334. data/lib/mongo/operation/write/bulk/bulk_insert/result.rb +0 -130
  335. data/lib/mongo/operation/write/bulk/bulk_insert.rb +0 -132
  336. data/lib/mongo/operation/write/bulk/bulk_mergable.rb +0 -67
  337. data/lib/mongo/operation/write/bulk/bulk_update/result.rb +0 -174
  338. data/lib/mongo/operation/write/bulk/bulk_update.rb +0 -154
  339. data/lib/mongo/operation/write/bulk/legacy_bulk_mergable.rb +0 -83
  340. data/spec/mongo/grid/fs_spec.rb +0 -160
  341. data/spec/mongo/loggable_spec.rb +0 -63
  342. data/spec/mongo/operation/aggregate_spec.rb +0 -127
data/lib/mongo/uri.rb CHANGED
@@ -12,6 +12,8 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ require 'uri'
16
+
15
17
  module Mongo
16
18
 
17
19
  # The URI class provides a way for users to parse the MongoDB uri as
@@ -29,58 +31,116 @@ module Mongo
29
31
  class URI
30
32
  include Loggable
31
33
 
32
- # Scheme Regex: non-capturing, matches scheme.
34
+ # The uri parser object options.
33
35
  #
34
36
  # @since 2.0.0
35
- SCHEME = %r{(?:mongodb://)}.freeze
37
+ attr_reader :options
36
38
 
37
- # User Regex: capturing, group 1, matches anything but ':'
39
+ # The options specified in the uri.
38
40
  #
39
- # @since 2.0.0
40
- USER = /([^:]+)/.freeze
41
+ # @since 2.1.0
42
+ attr_reader :uri_options
41
43
 
42
- # Password Regex: capturing, group 2, matches anything but '@'
44
+ # The servers specified in the uri.
43
45
  #
44
46
  # @since 2.0.0
45
- PASSWORD = /([^@]+)/.freeze
47
+ attr_reader :servers
46
48
 
47
- # Credentials Regex: non capturing, matches 'user:password@'
49
+ # Unsafe characters that must be urlencoded.
48
50
  #
49
- # @since 2.0.0
50
- CREDENTIALS = /(?:#{USER}:#{PASSWORD}?@)?/.freeze
51
+ # @since 2.1.0
52
+ UNSAFE = /[\:\/\+\@]/
51
53
 
52
- # Host and port server Regex: matches anything but a forward slash
54
+ # Unix socket suffix.
53
55
  #
54
- # @since 2.0.0
55
- HOSTPORT = /[^\/]+/.freeze
56
+ # @since 2.1.0
57
+ UNIX_SOCKET = /.sock/
56
58
 
57
- # Unix socket server Regex: matches unix socket server
59
+ # The mongodb connection string scheme.
58
60
  #
59
61
  # @since 2.0.0
60
- UNIX = /\/.+.sock?/.freeze
62
+ SCHEME = 'mongodb://'.freeze
61
63
 
62
- # server Regex: capturing, matches host and port server or unix server
64
+ # The character delimiting hosts.
63
65
  #
64
- # @since 2.0.0
65
- SERVERS = /((?:(?:#{HOSTPORT}|#{UNIX}),?)+)/.freeze
66
+ # @since 2.1.0
67
+ HOST_DELIM = ','.freeze
66
68
 
67
- # Database Regex: matches anything but the characters that cannot
68
- # be part of any MongoDB database name.
69
+ # The character separating a host and port.
69
70
  #
70
- # @since 2.0.0
71
- DATABASE = %r{(?:/([^/\.\ "*<>:\|\?]*))?}.freeze
71
+ # @since 2.1.0
72
+ HOST_PORT_DELIM = ':'.freeze
72
73
 
73
- # Option Regex: only matches the ampersand separator and does
74
- # not allow for semicolon to be used to separate options.
74
+ # The character delimiting a database.
75
75
  #
76
- # @since 2.0.0
77
- OPTIONS = /(?:\?(?:(.+=.+)&?)+)*/.freeze
76
+ # @since 2.1.0
77
+ DATABASE_DELIM = '/'.freeze
78
78
 
79
- # Complete URI Regex: matches all of the combined components
79
+ # The character delimiting options.
80
80
  #
81
- # @since 2.0.0
82
- URI = /#{SCHEME}#{CREDENTIALS}#{SERVERS}#{DATABASE}#{OPTIONS}/.freeze
81
+ # @since 2.1.0
82
+ URI_OPTS_DELIM = '?'.freeze
83
+
84
+ # The character delimiting multiple options.
85
+ #
86
+ # @since 2.1.0
87
+ INDIV_URI_OPTS_DELIM = '&'.freeze
88
+
89
+ # The character delimiting an option and its value.
90
+ #
91
+ # @since 2.1.0
92
+ URI_OPTS_VALUE_DELIM = '='.freeze
93
+
94
+ # The character separating a username from the password.
95
+ #
96
+ # @since 2.1.0
97
+ AUTH_USER_PWD_DELIM = ':'.freeze
83
98
 
99
+ # The character delimiting auth credentials.
100
+ #
101
+ # @since 2.1.0
102
+ AUTH_DELIM = '@'.freeze
103
+
104
+ # Error details for an invalid scheme.
105
+ #
106
+ # @since 2.1.0
107
+ INVALID_SCHEME = "Invalid scheme. Scheme must be '#{SCHEME}'".freeze
108
+
109
+ # Error details for an invalid options format.
110
+ #
111
+ # @since 2.1.0
112
+ INVALID_OPTS_VALUE_DELIM = "Options and their values must be delimited" +
113
+ " by '#{URI_OPTS_VALUE_DELIM}'".freeze
114
+
115
+ # Error details for an non-urlencoded user name or password.
116
+ #
117
+ # @since 2.1.0
118
+ UNESCAPED_USER_PWD = "User name and password must be urlencoded.".freeze
119
+
120
+ # Error details for a non-urlencoded unix socket path.
121
+ #
122
+ # @since 2.1.0
123
+ UNESCAPED_UNIX_SOCKET = "UNIX domain sockets must be urlencoded.".freeze
124
+
125
+ # Error details for a non-urlencoded auth databsae name.
126
+ #
127
+ # @since 2.1.0
128
+ UNESCAPED_DATABASE = "Auth database must be urlencoded.".freeze
129
+
130
+ # Error details for providing options without a database delimiter.
131
+ #
132
+ # @since 2.1.0
133
+ INVALID_OPTS_DELIM = "Database delimiter '#{DATABASE_DELIM}' must be present if options are specified.".freeze
134
+
135
+ # Error details for a missing host.
136
+ #
137
+ # @since 2.1.0
138
+ INVALID_HOST = "Missing host; at least one must be provided.".freeze
139
+
140
+ # Error details for an invalid port.
141
+ #
142
+ # @since 2.1.0
143
+ INVALID_PORT = "Invalid port. Port must be an integer greater than 0 and less than 65536".freeze
84
144
 
85
145
  # MongoDB URI format specification.
86
146
  #
@@ -113,32 +173,28 @@ module Mongo
113
173
  'GSSAPI' => :gssapi
114
174
  }.freeze
115
175
 
176
+ # Options that are allowed to appear more than once in the uri.
177
+ #
178
+ # @since 2.1.0
179
+ REPEATABLE_OPTIONS = [ :tag_sets ]
180
+
116
181
  # Create the new uri from the provided string.
117
182
  #
118
183
  # @example Create the new URI.
119
184
  # URI.new('mongodb://localhost:27017')
120
185
  #
121
186
  # @param [ String ] string The uri string.
187
+ # @param [ Hash ] options The options.
122
188
  #
123
- # @raise [ BadURI ] If the uri does not match the spec.
189
+ # @raise [ Error::InvalidURI ] If the uri does not match the spec.
124
190
  #
125
191
  # @since 2.0.0
126
- def initialize(string)
192
+ def initialize(string, options = {})
127
193
  @string = string
128
- @match = @string.match(URI)
129
- raise Error::InvalidURI.new(string) unless @match
130
- end
131
-
132
- # Get the servers provided in the URI.
133
- #
134
- # @example Get the servers.
135
- # uri.servers
136
- #
137
- # @return [ Array<String> ] The servers.
138
- #
139
- # @since 2.0.0
140
- def servers
141
- @match[3].split(',')
194
+ @options = options
195
+ empty, scheme, remaining = @string.partition(SCHEME)
196
+ raise_invalid_error!(INVALID_SCHEME) unless scheme == SCHEME
197
+ setup!(remaining)
142
198
  end
143
199
 
144
200
  # Gets the options hash that needs to be passed to a Mongo::Client on
@@ -152,8 +208,8 @@ module Mongo
152
208
  #
153
209
  # @since 2.0.0
154
210
  def client_options
155
- opts = options.merge(:database => database)
156
- user ? opts.merge(credentials) : opts
211
+ opts = uri_options.merge(:database => database)
212
+ @user ? opts.merge(credentials) : opts
157
213
  end
158
214
 
159
215
  # Get the credentials provided in the URI.
@@ -167,7 +223,7 @@ module Mongo
167
223
  #
168
224
  # @since 2.0.0
169
225
  def credentials
170
- { :user => user, :password => password }
226
+ { :user => @user, :password => @password }
171
227
  end
172
228
 
173
229
  # Get the database provided in the URI.
@@ -179,115 +235,161 @@ module Mongo
179
235
  #
180
236
  # @since 2.0.0
181
237
  def database
182
- @match[4].nil? ? Database::ADMIN : @match[4]
238
+ @database ? @database : Database::ADMIN
183
239
  end
184
240
 
185
- # Get the options provided in the URI.
186
- #
187
- # @example Get The options.
188
- # uri.options
189
- #
190
- # @return [Hash] The options.
191
- #
192
- # Generic Options
193
- # * :replica_set [String] replica set name
194
- # * :connect_timeout [Fixnum] connect timeout
195
- # * :socket_timeout [Fixnum] socket timeout
196
- # * :ssl [true, false] ssl enabled?
197
- #
198
- # Write Options (returned in a hash under the :write key)
199
- # * :w [String, Fixnum] write concern value
200
- # * :j [true, false] journal
201
- # * :fsync [true, false] fsync
202
- # * :timeout [Fixnum] timeout for write operation
203
- #
204
- # Read Options (returned in a hash under the :read key)
205
- # * :mode [Symbol] read mode
206
- # * :tag_sets [Array<Hash>] read tag sets
207
- #
208
- # @since 2.0.0
209
- def options
210
- parsed_options = @match[5]
211
- return {} unless parsed_options
212
- parsed_options.split('&').reduce({}) do |options, option|
213
- key, value = option.split('=')
214
- strategy = OPTION_MAP[key]
241
+ private
242
+
243
+ def setup!(remaining)
244
+ creds_hosts, db_opts = extract_db_opts!(remaining)
245
+ parse_creds_hosts!(creds_hosts)
246
+ parse_db_opts!(db_opts)
247
+ end
248
+
249
+ def extract_db_opts!(string)
250
+ db_opts, d, creds_hosts = string.reverse.partition(DATABASE_DELIM)
251
+ db_opts, creds_hosts = creds_hosts, db_opts if creds_hosts.empty?
252
+ if db_opts.empty? && creds_hosts.include?(URI_OPTS_DELIM)
253
+ raise_invalid_error!(INVALID_OPTS_DELIM)
254
+ end
255
+ [ creds_hosts, db_opts ].map { |s| s.reverse }
256
+ end
257
+
258
+ def parse_creds_hosts!(string)
259
+ hosts, creds = split_creds_hosts(string)
260
+ @servers = parse_servers!(hosts)
261
+ @user = parse_user!(creds)
262
+ @password = parse_password!(creds)
263
+ end
264
+
265
+ def split_creds_hosts(string)
266
+ hosts, d, creds = string.reverse.partition(AUTH_DELIM)
267
+ hosts, creds = creds, hosts if hosts.empty?
268
+ [ hosts, creds ].map { |s| s.reverse }
269
+ end
270
+
271
+ def parse_db_opts!(string)
272
+ auth_db, d, uri_opts = string.partition(URI_OPTS_DELIM)
273
+ @uri_options = Options::Redacted.new(parse_uri_options!(uri_opts))
274
+ @database = parse_database!(auth_db)
275
+ end
276
+
277
+ def parse_uri_options!(string)
278
+ return {} unless string
279
+ string.split(INDIV_URI_OPTS_DELIM).reduce({}) do |uri_options, opt|
280
+ raise_invalid_error!(INVALID_OPTS_VALUE_DELIM) unless opt.index(URI_OPTS_VALUE_DELIM)
281
+ key, value = opt.split(URI_OPTS_VALUE_DELIM)
282
+ strategy = URI_OPTION_MAP[key.downcase]
215
283
  if strategy.nil?
216
- log_warn([
217
- "Unsupported URI option '#{key}' on URI '#{@string}'. It will be ignored."
218
- ])
284
+ log_warn("Unsupported URI option '#{key}' on URI '#{@string}'. It will be ignored.")
219
285
  else
220
- add_option(strategy, value, options)
286
+ add_uri_option(strategy, value, uri_options)
221
287
  end
222
- options
288
+ uri_options
223
289
  end
224
290
  end
225
291
 
226
- private
292
+ def parse_user!(string)
293
+ if (string && user = string.partition(AUTH_USER_PWD_DELIM)[0])
294
+ raise_invalid_error!(UNESCAPED_USER_PWD) if user =~ UNSAFE
295
+ decode(user) if user.length > 0
296
+ end
297
+ end
298
+
299
+ def parse_password!(string)
300
+ if (string && pwd = string.partition(AUTH_USER_PWD_DELIM)[2])
301
+ raise_invalid_error!(UNESCAPED_USER_PWD) if pwd =~ UNSAFE
302
+ decode(pwd) if pwd.length > 0
303
+ end
304
+ end
305
+
306
+ def parse_database!(string)
307
+ raise_invalid_error!(UNESCAPED_DATABASE) if string =~ UNSAFE
308
+ decode(string) if string.length > 0
309
+ end
310
+
311
+ def validate_port_string!(port)
312
+ unless port.nil? || (port.length > 0 && port.to_i > 0 && port.to_i <= 65535)
313
+ raise_invalid_error!(INVALID_PORT)
314
+ end
315
+ end
316
+
317
+ def parse_servers!(string)
318
+ raise_invalid_error!(INVALID_HOST) unless string.size > 0
319
+ string.split(HOST_DELIM).reduce([]) do |servers, host|
320
+ if host[0] == '['
321
+ if host.index(']:')
322
+ h, p = host.split(']:')
323
+ validate_port_string!(p)
324
+ end
325
+ elsif host.index(HOST_PORT_DELIM)
326
+ h, d, p = host.partition(HOST_PORT_DELIM)
327
+ raise_invalid_error!(INVALID_HOST) unless h.size > 0
328
+ validate_port_string!(p)
329
+ elsif host =~ UNIX_SOCKET
330
+ raise_invalid_error!(UNESCAPED_UNIX_SOCKET) if host =~ UNSAFE
331
+ end
332
+ servers << host
333
+ end
334
+ end
335
+
336
+ def raise_invalid_error!(details)
337
+ raise Error::InvalidURI.new(@string, details)
338
+ end
339
+
340
+ def decode(value)
341
+ ::URI.decode(value)
342
+ end
227
343
 
228
344
  # Hash for storing map of URI option parameters to conversion strategies
229
- OPTION_MAP = {}
345
+ URI_OPTION_MAP = {}
230
346
 
231
- # Simple internal dsl to register a MongoDB URI option in the OPTION_MAP.
347
+ # Simple internal dsl to register a MongoDB URI option in the URI_OPTION_MAP.
232
348
  #
233
349
  # @param uri_key [String] The MongoDB URI option to register.
234
350
  # @param name [Symbol] The name of the option in the driver.
235
351
  # @param extra [Hash] Extra options.
236
352
  # * :group [Symbol] Nested hash where option will go.
237
353
  # * :type [Symbol] Name of function to transform value.
238
- def self.option(uri_key, name, extra = {})
239
- OPTION_MAP[uri_key] = { :name => name }.merge(extra)
354
+ def self.uri_option(uri_key, name, extra = {})
355
+ URI_OPTION_MAP[uri_key] = { :name => name }.merge(extra)
240
356
  end
241
357
 
242
358
  # Replica Set Options
243
- option 'replicaSet', :replica_set, :type => :replica_set
359
+ uri_option 'replicaset', :replica_set, :type => :replica_set
244
360
 
245
361
  # Timeout Options
246
- option 'connectTimeoutMS', :connect_timeout, :type => :ms_convert
247
- option 'socketTimeoutMS', :socket_timeout, :type => :ms_convert
248
- option 'serverSelectionTimeoutMS', :server_selection_timeout, :type => :ms_convert
249
- option 'localThresholdMS', :local_threshold, :type => :ms_convert
362
+ uri_option 'connecttimeoutms', :connect_timeout, :type => :ms_convert
363
+ uri_option 'sockettimeoutms', :socket_timeout, :type => :ms_convert
364
+ uri_option 'serverselectiontimeoutms', :server_selection_timeout, :type => :ms_convert
365
+ uri_option 'localthresholdms', :local_threshold, :type => :ms_convert
250
366
 
251
367
  # Write Options
252
- option 'w', :w, :group => :write
253
- option 'journal', :j, :group => :write
254
- option 'fsync', :fsync, :group => :write
255
- option 'wtimeoutMS', :timeout, :group => :write
368
+ uri_option 'w', :w, :group => :write
369
+ uri_option 'journal', :j, :group => :write
370
+ uri_option 'fsync', :fsync, :group => :write
371
+ uri_option 'wtimeoutms', :timeout, :group => :write
256
372
 
257
373
  # Read Options
258
- option 'readPreference', :mode, :group => :read, :type => :read_mode
259
- option 'readPreferenceTags', :tag_sets, :group => :read, :type => :read_tags
374
+ uri_option 'readpreference', :mode, :group => :read, :type => :read_mode
375
+ uri_option 'readpreferencetags', :tag_sets, :group => :read, :type => :read_tags
260
376
 
261
377
  # Pool options
262
- option 'minPoolSize', :min_pool_size
263
- option 'maxPoolSize', :max_pool_size
264
- option 'waitQueueTimeoutMS', :wait_queue_timeout, :type => :ms_convert
378
+ uri_option 'minpoolsize', :min_pool_size
379
+ uri_option 'maxpoolsize', :max_pool_size
380
+ uri_option 'waitqueuetimeoutms', :wait_queue_timeout, :type => :ms_convert
265
381
 
266
382
  # Security Options
267
- option 'ssl', :ssl
383
+ uri_option 'ssl', :ssl
268
384
 
269
385
  # Topology options
270
- option 'connect', :connect
386
+ uri_option 'connect', :connect
271
387
 
272
388
  # Auth Options
273
- option 'authSource', :source, :group => :auth, :type => :auth_source
274
- option 'authMechanism', :mechanism, :group => :auth, :type => :auth_mech
275
- option 'authMechanismProperties', :auth_mech_properties, :group => :auth,
276
- :type => :auth_mech_props
277
-
278
- # Gets the user provided in the URI
279
- #
280
- # @return [String] The user.
281
- def user
282
- @match[1]
283
- end
284
-
285
- # Gets the password provided in the URI
286
- #
287
- # @return [String] The password.
288
- def password
289
- @match[2]
290
- end
389
+ uri_option 'authsource', :source, :group => :auth, :type => :auth_source
390
+ uri_option 'authmechanism', :auth_mech, :type => :auth_mech
391
+ uri_option 'authmechanismproperties', :auth_mech_properties, :group => :auth,
392
+ :type => :auth_mech_props
291
393
 
292
394
  # Casts option values that do not have a specifically provided
293
395
  # transofrmation to the appropriate type.
@@ -303,7 +405,7 @@ module Mongo
303
405
  elsif value =~ /[\d]/
304
406
  value.to_i
305
407
  else
306
- value.to_sym
408
+ decode(value).to_sym
307
409
  end
308
410
  end
309
411
 
@@ -322,15 +424,15 @@ module Mongo
322
424
 
323
425
  # Selects the output destination for an option.
324
426
  #
325
- # @param options [Hash] The base target.
326
- # @param group [Symbol] Group subtarget.
427
+ # @param [Hash] uri_options The base target.
428
+ # @param [Symbol] group Group subtarget.
327
429
  #
328
430
  # @return [Hash] The target for the option.
329
- def select_target(options, group = nil)
431
+ def select_target(uri_options, group = nil)
330
432
  if group
331
- options[group] ||= {}
433
+ uri_options[group] ||= {}
332
434
  else
333
- options
435
+ uri_options
334
436
  end
335
437
  end
336
438
 
@@ -345,15 +447,19 @@ module Mongo
345
447
  # @param target [Hash] The destination.
346
448
  # @param value [Object] The value to be merged.
347
449
  # @param name [Symbol] The name of the option.
348
- def merge_option(target, value, name)
450
+ def merge_uri_option(target, value, name)
349
451
  if target.key?(name)
350
- target[name] += value
452
+ if REPEATABLE_OPTIONS.include?(name)
453
+ target[name] += value
454
+ else
455
+ log_warn("Repeated option key: #{name}.")
456
+ end
351
457
  else
352
458
  target.merge!(name => value)
353
459
  end
354
460
  end
355
461
 
356
- # Adds an option to the options hash via the supplied strategy.
462
+ # Adds an option to the uri options hash via the supplied strategy.
357
463
  #
358
464
  # Acquires a target for the option based on group.
359
465
  # Transforms the value.
@@ -361,11 +467,11 @@ module Mongo
361
467
  #
362
468
  # @param strategy [Symbol] The strategy for this option.
363
469
  # @param value [String] The value of the option.
364
- # @param options [Hash] The base option target.
365
- def add_option(strategy, value, options)
366
- target = select_target(options, strategy[:group])
470
+ # @param uri_options [Hash] The base option target.
471
+ def add_uri_option(strategy, value, uri_options)
472
+ target = select_target(uri_options, strategy[:group])
367
473
  value = apply_transform(value, strategy[:type])
368
- merge_option(target, value, strategy[:name])
474
+ merge_uri_option(target, value, strategy[:name])
369
475
  end
370
476
 
371
477
  # Replica set transformation, avoid converting to Symbol.
@@ -374,7 +480,7 @@ module Mongo
374
480
  #
375
481
  # @return [String] Same value to avoid cast to Symbol.
376
482
  def replica_set(value)
377
- value
483
+ decode(value)
378
484
  end
379
485
 
380
486
  # Auth source transformation, either db string or :external.
@@ -384,7 +490,7 @@ module Mongo
384
490
  # @return [String] If auth source is database name.
385
491
  # @return [:external] If auth source is external authentication.
386
492
  def auth_source(value)
387
- value == '$external' ? :external : value
493
+ value == '$external' ? :external : decode(value)
388
494
  end
389
495
 
390
496
  # Authentication mechanism transformation.
@@ -458,7 +564,7 @@ module Mongo
458
564
  def hash_extractor(value)
459
565
  value.split(',').reduce({}) do |set, tag|
460
566
  k, v = tag.split(':')
461
- set.merge(k.downcase.to_sym => v)
567
+ set.merge(decode(k).downcase.to_sym => decode(v))
462
568
  end
463
569
  end
464
570
  end
data/lib/mongo/version.rb CHANGED
@@ -17,5 +17,5 @@ module Mongo
17
17
  # The current version of the driver.
18
18
  #
19
19
  # @since 2.0.0
20
- VERSION = '2.1.0.beta'.freeze
20
+ VERSION = '2.2.0'.freeze
21
21
  end
@@ -52,7 +52,7 @@ module Mongo
52
52
  # The default write concern is to acknowledge on a single server.
53
53
  #
54
54
  # @since 2.0.0
55
- DEFAULT = { W => 1 }.freeze
55
+ DEFAULT = { }.freeze
56
56
 
57
57
  # Get a write concern mode for the provided options.
58
58
  #
@@ -72,17 +72,32 @@ module Mongo
72
72
  #
73
73
  # @return [ Unacknowledged, Acknowledged ] The appropriate concern.
74
74
  #
75
+ # @raise [ Error::InvalidWriteConcern ] If the write concern is invalid.
76
+ #
75
77
  # @since 2.0.0
76
78
  def get(options)
77
- if unacknowledged?(options)
78
- Unacknowledged.new(options)
79
- else
80
- Acknowledged.new(options || DEFAULT)
79
+ if options
80
+ validate!(options)
81
+ if unacknowledged?(options)
82
+ Unacknowledged.new(options)
83
+ else
84
+ Acknowledged.new(options)
85
+ end
81
86
  end
82
87
  end
83
88
 
84
89
  private
85
90
 
91
+ def validate!(options)
92
+ if options[W]
93
+ if options[W] == 0 && (options[J] || options[FSYNC])
94
+ raise Mongo::Error::InvalidWriteConcern.new
95
+ elsif options[W].is_a?(Integer) && options[W] < 0
96
+ raise Mongo::Error::InvalidWriteConcern.new
97
+ end
98
+ end
99
+ end
100
+
86
101
  # Determine if the options are for an unacknowledged write concern.
87
102
  #
88
103
  # @api private
@@ -93,7 +108,7 @@ module Mongo
93
108
  #
94
109
  # @since 2.0.0
95
110
  def unacknowledged?(options)
96
- options && (options[W] == 0 || options[W] == -1)
111
+ options[W] == 0
97
112
  end
98
113
  end
99
114
  end
data/lib/mongo.rb CHANGED
@@ -15,14 +15,16 @@
15
15
  require 'forwardable'
16
16
  require 'bson'
17
17
  require 'openssl'
18
- require 'mongo/monitoring'
18
+ require 'mongo/options'
19
19
  require 'mongo/loggable'
20
+ require 'mongo/monitoring'
20
21
  require 'mongo/logger'
22
+ require 'mongo/retryable'
23
+ require 'mongo/operation'
21
24
  require 'mongo/error'
22
25
  require 'mongo/event'
23
26
  require 'mongo/address'
24
27
  require 'mongo/auth'
25
- require 'mongo/bulk_write'
26
28
  require 'mongo/client'
27
29
  require 'mongo/cluster'
28
30
  require 'mongo/collection'
@@ -31,8 +33,6 @@ require 'mongo/database'
31
33
  require 'mongo/dbref'
32
34
  require 'mongo/grid'
33
35
  require 'mongo/index'
34
- require 'mongo/operation'
35
- require 'mongo/options'
36
36
  require 'mongo/protocol'
37
37
  require 'mongo/server'
38
38
  require 'mongo/server_selector'
data/mongo.gemspec CHANGED
@@ -4,7 +4,6 @@ require 'mongo/version'
4
4
 
5
5
  Gem::Specification.new do |s|
6
6
  s.name = 'mongo'
7
- s.rubyforge_project = 'mongo'
8
7
  s.version = Mongo::VERSION
9
8
  s.platform = Gem::Platform::RUBY
10
9
 
@@ -30,5 +29,5 @@ Gem::Specification.new do |s|
30
29
  s.has_rdoc = 'yard'
31
30
  s.bindir = 'bin'
32
31
 
33
- s.add_dependency 'bson', '~> 3.0'
32
+ s.add_dependency 'bson', '~> 4.0'
34
33
  end
@@ -27,7 +27,7 @@ describe Mongo::Address::Unix do
27
27
  describe '#socket' do
28
28
 
29
29
  let(:address) do
30
- '/path/to/socket.sock'
30
+ '/tmp/mongodb-27017.sock'
31
31
  end
32
32
 
33
33
  let(:socket) do