mongo 2.1.0.beta → 2.1.0.rc0

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 (253) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/Rakefile +2 -2
  5. data/lib/mongo.rb +2 -3
  6. data/lib/mongo/address.rb +7 -5
  7. data/lib/mongo/address/unix.rb +2 -2
  8. data/lib/mongo/auth/ldap/conversation.rb +6 -2
  9. data/lib/mongo/auth/scram/conversation.rb +8 -2
  10. data/lib/mongo/auth/user/view.rb +21 -0
  11. data/lib/mongo/bulk_write.rb +155 -23
  12. data/lib/mongo/bulk_write/combineable.rb +51 -0
  13. data/lib/mongo/bulk_write/ordered_combiner.rb +55 -0
  14. data/lib/mongo/bulk_write/result.rb +61 -8
  15. data/lib/mongo/bulk_write/result_combiner.rb +117 -0
  16. data/lib/mongo/bulk_write/transformable.rb +117 -0
  17. data/lib/mongo/bulk_write/unordered_combiner.rb +52 -0
  18. data/lib/mongo/bulk_write/validatable.rb +62 -0
  19. data/lib/mongo/client.rb +7 -3
  20. data/lib/mongo/cluster.rb +3 -3
  21. data/lib/mongo/cluster/topology/replica_set.rb +8 -6
  22. data/lib/mongo/cluster/topology/unknown.rb +5 -2
  23. data/lib/mongo/collection.rb +75 -4
  24. data/lib/mongo/collection/view.rb +1 -2
  25. data/lib/mongo/collection/view/aggregation.rb +13 -8
  26. data/lib/mongo/collection/view/immutable.rb +6 -6
  27. data/lib/mongo/collection/view/iterable.rb +13 -4
  28. data/lib/mongo/collection/view/map_reduce.rb +22 -17
  29. data/lib/mongo/collection/view/readable.rb +121 -70
  30. data/lib/mongo/cursor.rb +5 -1
  31. data/lib/mongo/database.rb +3 -3
  32. data/lib/mongo/database/view.rb +1 -1
  33. data/lib/mongo/error.rb +7 -0
  34. data/lib/mongo/{bulk_write/unordered_bulk_write.rb → error/closed_stream.rb} +12 -21
  35. data/lib/mongo/{bulk_write/ordered_bulk_write.rb → error/extra_file_chunk.rb} +13 -27
  36. data/lib/mongo/error/file_not_found.rb +37 -0
  37. data/lib/mongo/error/invalid_file.rb +2 -2
  38. data/lib/mongo/error/invalid_file_revision.rb +37 -0
  39. data/lib/mongo/error/invalid_uri.rb +5 -4
  40. data/lib/mongo/error/missing_file_chunk.rb +38 -0
  41. data/lib/mongo/error/operation_failure.rb +1 -1
  42. data/lib/mongo/error/unchangeable_collection_option.rb +38 -0
  43. data/lib/mongo/error/unexpected_chunk_length.rb +39 -0
  44. data/lib/mongo/grid.rb +2 -1
  45. data/lib/mongo/grid/file.rb +12 -9
  46. data/lib/mongo/grid/file/chunk.rb +6 -6
  47. data/lib/mongo/grid/file/{metadata.rb → info.rb} +41 -39
  48. data/lib/mongo/grid/fs_bucket.rb +441 -0
  49. data/lib/mongo/grid/stream.rb +64 -0
  50. data/lib/mongo/grid/stream/read.rb +208 -0
  51. data/lib/mongo/grid/stream/write.rb +187 -0
  52. data/lib/mongo/index/view.rb +1 -1
  53. data/lib/mongo/loggable.rb +34 -57
  54. data/lib/mongo/logger.rb +16 -78
  55. data/lib/mongo/monitoring.rb +1 -5
  56. data/lib/mongo/monitoring/command_log_subscriber.rb +35 -17
  57. data/lib/mongo/monitoring/event/command_succeeded.rb +20 -1
  58. data/lib/mongo/monitoring/publishable.rb +22 -12
  59. data/lib/mongo/operation.rb +3 -6
  60. data/lib/mongo/operation/commands.rb +24 -0
  61. data/lib/mongo/operation/{aggregate.rb → commands/aggregate.rb} +3 -41
  62. data/lib/mongo/operation/{aggregate → commands/aggregate}/result.rb +0 -0
  63. data/lib/mongo/operation/commands/collections_info.rb +66 -0
  64. data/lib/mongo/operation/{command.rb → commands/command.rb} +2 -18
  65. data/lib/mongo/operation/commands/indexes.rb +70 -0
  66. data/lib/mongo/operation/commands/list_collections.rb +54 -0
  67. data/lib/mongo/operation/commands/list_collections/result.rb +112 -0
  68. data/lib/mongo/operation/commands/list_indexes.rb +56 -0
  69. data/lib/mongo/operation/commands/list_indexes/result.rb +115 -0
  70. data/lib/mongo/operation/{map_reduce.rb → commands/map_reduce.rb} +3 -41
  71. data/lib/mongo/operation/{map_reduce → commands/map_reduce}/result.rb +0 -0
  72. data/lib/mongo/operation/{parallel_scan.rb → commands/parallel_scan.rb} +3 -23
  73. data/lib/mongo/operation/{parallel_scan → commands/parallel_scan}/result.rb +0 -0
  74. data/lib/mongo/operation/commands/user_query.rb +69 -0
  75. data/lib/mongo/operation/commands/users_info.rb +53 -0
  76. data/lib/mongo/operation/commands/users_info/result.rb +36 -0
  77. data/lib/mongo/operation/executable.rb +4 -68
  78. data/lib/mongo/operation/kill_cursors.rb +3 -3
  79. data/lib/mongo/operation/read.rb +0 -4
  80. data/lib/mongo/operation/read/get_more.rb +2 -22
  81. data/lib/mongo/operation/read/query.rb +2 -21
  82. data/lib/mongo/operation/{read_preferrable.rb → read_preference.rb} +3 -2
  83. data/lib/mongo/operation/specifiable.rb +24 -0
  84. data/lib/mongo/operation/write.rb +2 -0
  85. data/lib/mongo/operation/write/bulk.rb +6 -3
  86. data/lib/mongo/operation/write/bulk/bulkable.rb +82 -0
  87. data/lib/mongo/operation/write/bulk/delete.rb +71 -0
  88. data/lib/mongo/operation/write/bulk/delete/result.rb +74 -0
  89. data/lib/mongo/operation/write/bulk/insert.rb +96 -0
  90. data/lib/mongo/operation/write/bulk/insert/result.rb +129 -0
  91. data/lib/mongo/operation/write/bulk/legacy_mergable.rb +87 -0
  92. data/lib/mongo/operation/write/bulk/mergable.rb +71 -0
  93. data/lib/mongo/operation/write/bulk/update.rb +81 -0
  94. data/lib/mongo/operation/write/bulk/update/result.rb +174 -0
  95. data/lib/mongo/operation/write/command/create_index.rb +0 -1
  96. data/lib/mongo/operation/write/command/create_user.rb +0 -1
  97. data/lib/mongo/operation/write/command/delete.rb +0 -1
  98. data/lib/mongo/operation/write/command/drop_index.rb +0 -1
  99. data/lib/mongo/operation/write/command/insert.rb +0 -1
  100. data/lib/mongo/operation/write/command/remove_user.rb +0 -1
  101. data/lib/mongo/operation/write/command/update.rb +0 -1
  102. data/lib/mongo/operation/write/command/update_user.rb +0 -1
  103. data/lib/mongo/operation/write/command/writable.rb +13 -18
  104. data/lib/mongo/operation/write/create_index.rb +4 -27
  105. data/lib/mongo/operation/write/create_user.rb +4 -30
  106. data/lib/mongo/operation/write/delete.rb +5 -28
  107. data/lib/mongo/operation/write/drop_index.rb +3 -3
  108. data/lib/mongo/operation/write/gle.rb +48 -0
  109. data/lib/mongo/operation/write/idable.rb +5 -0
  110. data/lib/mongo/operation/write/insert.rb +2 -24
  111. data/lib/mongo/operation/write/remove_user.rb +4 -27
  112. data/lib/mongo/operation/write/update.rb +4 -32
  113. data/lib/mongo/operation/write/update_user.rb +4 -30
  114. data/lib/mongo/operation/write/write_command_enabled.rb +53 -0
  115. data/lib/mongo/options/mapper.rb +4 -2
  116. data/lib/mongo/protocol/delete.rb +68 -3
  117. data/lib/mongo/protocol/get_more.rb +54 -2
  118. data/lib/mongo/protocol/insert.rb +59 -1
  119. data/lib/mongo/protocol/kill_cursors.rb +53 -4
  120. data/lib/mongo/protocol/message.rb +12 -12
  121. data/lib/mongo/protocol/query.rb +139 -65
  122. data/lib/mongo/protocol/reply.rb +69 -1
  123. data/lib/mongo/protocol/update.rb +70 -1
  124. data/lib/mongo/server/connection.rb +11 -3
  125. data/lib/mongo/server/description.rb +29 -0
  126. data/lib/mongo/server/description/features.rb +2 -1
  127. data/lib/mongo/server/monitor.rb +2 -2
  128. data/lib/mongo/server_selector.rb +14 -10
  129. data/lib/mongo/server_selector/selectable.rb +24 -22
  130. data/lib/mongo/socket.rb +6 -3
  131. data/lib/mongo/socket/tcp.rb +2 -2
  132. data/lib/mongo/socket/unix.rb +5 -8
  133. data/lib/mongo/uri.rb +243 -139
  134. data/lib/mongo/version.rb +1 -1
  135. data/spec/mongo/address/unix_spec.rb +1 -1
  136. data/spec/mongo/address_spec.rb +25 -0
  137. data/spec/mongo/auth/ldap/conversation_spec.rb +43 -0
  138. data/spec/mongo/auth/user/view_spec.rb +26 -1
  139. data/spec/mongo/bulk_write/ordered_combiner_spec.rb +271 -0
  140. data/spec/mongo/bulk_write/unordered_combiner_spec.rb +239 -0
  141. data/spec/mongo/bulk_write_spec.rb +332 -166
  142. data/spec/mongo/client_spec.rb +25 -0
  143. data/spec/mongo/cluster/topology/replica_set_spec.rb +2 -0
  144. data/spec/mongo/collection/view/aggregation_spec.rb +65 -0
  145. data/spec/mongo/collection/view/immutable_spec.rb +103 -0
  146. data/spec/mongo/collection/view/map_reduce_spec.rb +98 -3
  147. data/spec/mongo/collection/view/readable_spec.rb +17 -30
  148. data/spec/mongo/collection/view_spec.rb +233 -7
  149. data/spec/mongo/collection_spec.rb +360 -18
  150. data/spec/mongo/command_monitoring_spec.rb +51 -0
  151. data/spec/mongo/connection_string_spec.rb +137 -0
  152. data/spec/mongo/database_spec.rb +27 -11
  153. data/spec/mongo/grid/file/chunk_spec.rb +5 -5
  154. data/spec/mongo/grid/file/{metadata_spec.rb → info_spec.rb} +29 -17
  155. data/spec/mongo/grid/file_spec.rb +8 -8
  156. data/spec/mongo/grid/fs_bucket_spec.rb +1020 -0
  157. data/spec/mongo/grid/stream/read_spec.rb +275 -0
  158. data/spec/mongo/grid/stream/write_spec.rb +440 -0
  159. data/spec/mongo/grid/stream_spec.rb +48 -0
  160. data/spec/mongo/gridfs_spec.rb +50 -0
  161. data/spec/mongo/logger_spec.rb +0 -40
  162. data/spec/mongo/monitoring/command_log_subscriber_spec.rb +76 -0
  163. data/spec/mongo/operation/{aggregate_spec.rb → commands/aggregate_spec.rb} +0 -42
  164. data/spec/mongo/operation/{read → commands}/collections_info_spec.rb +1 -1
  165. data/spec/mongo/operation/{command_spec.rb → commands/command_spec.rb} +0 -0
  166. data/spec/mongo/operation/{read → commands}/indexes_spec.rb +1 -1
  167. data/spec/mongo/operation/{map_reduce_spec.rb → commands/map_reduce_spec.rb} +0 -18
  168. data/spec/mongo/operation/kill_cursors_spec.rb +1 -1
  169. data/spec/mongo/operation/{read_preferrable_spec.rb → read_preference_spec.rb} +11 -11
  170. data/spec/mongo/operation/write/bulk/{bulk_delete_spec.rb → delete_spec.rb} +1 -12
  171. data/spec/mongo/operation/write/bulk/{bulk_insert_spec.rb → insert_spec.rb} +1 -12
  172. data/spec/mongo/operation/write/bulk/{bulk_update_spec.rb → update_spec.rb} +1 -12
  173. data/spec/mongo/operation/write/insert_spec.rb +0 -11
  174. data/spec/mongo/protocol/kill_cursors_spec.rb +5 -3
  175. data/spec/mongo/server/description_spec.rb +42 -0
  176. data/spec/mongo/server/monitor_spec.rb +21 -0
  177. data/spec/mongo/server_discovery_and_monitoring_spec.rb +1 -0
  178. data/spec/mongo/server_selection_spec.rb +3 -3
  179. data/spec/mongo/server_selector/nearest_spec.rb +34 -27
  180. data/spec/mongo/server_selector/primary_preferred_spec.rb +31 -30
  181. data/spec/mongo/server_selector/primary_spec.rb +14 -13
  182. data/spec/mongo/server_selector/secondary_preferred_spec.rb +27 -26
  183. data/spec/mongo/server_selector/secondary_spec.rb +23 -22
  184. data/spec/mongo/server_selector_spec.rb +87 -24
  185. data/spec/mongo/socket/unix_spec.rb +52 -0
  186. data/spec/mongo/uri_spec.rb +251 -39
  187. data/spec/spec_helper.rb +11 -4
  188. data/spec/support/authorization.rb +4 -5
  189. data/spec/support/command_monitoring.rb +365 -0
  190. data/spec/support/command_monitoring/bulkWrite.yml +73 -0
  191. data/spec/support/command_monitoring/command.yml +42 -0
  192. data/spec/support/command_monitoring/deleteMany.yml +55 -0
  193. data/spec/support/command_monitoring/deleteOne.yml +55 -0
  194. data/spec/support/command_monitoring/find.yml +219 -0
  195. data/spec/support/command_monitoring/insertMany.yml +81 -0
  196. data/spec/support/command_monitoring/insertOne.yml +51 -0
  197. data/spec/support/command_monitoring/updateMany.yml +67 -0
  198. data/spec/support/command_monitoring/updateOne.yml +95 -0
  199. data/spec/support/connection_string.rb +228 -0
  200. data/spec/support/connection_string_tests/invalid-uris.yml +193 -0
  201. data/spec/support/connection_string_tests/valid-auth.yml +256 -0
  202. data/spec/support/connection_string_tests/valid-host_identifiers.yml +121 -0
  203. data/spec/support/connection_string_tests/valid-options.yml +30 -0
  204. data/spec/support/connection_string_tests/valid-unix_socket-absolute.yml +197 -0
  205. data/spec/support/connection_string_tests/valid-unix_socket-relative.yml +213 -0
  206. data/spec/support/connection_string_tests/valid-warnings.yml +55 -0
  207. data/spec/support/crud.rb +3 -1
  208. data/spec/support/crud/read.rb +14 -10
  209. data/spec/support/crud/write.rb +36 -9
  210. data/spec/support/gridfs.rb +637 -0
  211. data/spec/support/gridfs_tests/delete.yml +157 -0
  212. data/spec/support/gridfs_tests/download.yml +210 -0
  213. data/spec/support/gridfs_tests/download_by_name.yml +113 -0
  214. data/spec/support/gridfs_tests/upload.yml +158 -0
  215. data/spec/support/sdam/rs/equal_electionids.yml +1 -2
  216. data/spec/support/sdam/rs/new_primary_new_electionid.yml +0 -3
  217. data/spec/support/sdam/rs/primary_mismatched_me.yml +37 -0
  218. data/spec/support/sdam/rs/primary_to_no_primary_mismatched_me.yml +75 -0
  219. data/spec/support/sdam/rs/secondary_mismatched_me.yml +37 -0
  220. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +1 -1
  221. data/spec/support/sdam/single/direct_connection_rsprimary.yml +1 -1
  222. data/spec/support/sdam/single/direct_connection_rssecondary.yml +1 -1
  223. data/spec/support/sdam/single/direct_connection_slave.yml +1 -1
  224. data/spec/support/sdam/single/direct_connection_standalone.yml +1 -1
  225. data/spec/support/sdam/single/not_ok_response.yml +0 -1
  226. data/spec/support/server_discovery_and_monitoring.rb +3 -1
  227. data/spec/support/server_selection.rb +3 -1
  228. data/spec/support/shared/bulk_write.rb +192 -0
  229. data/spec/support/shared/server_selector.rb +21 -12
  230. metadata +147 -57
  231. metadata.gz.sig +0 -0
  232. data/lib/mongo/bulk_write/bulk_writable.rb +0 -252
  233. data/lib/mongo/bulk_write/deletable.rb +0 -57
  234. data/lib/mongo/bulk_write/insertable.rb +0 -49
  235. data/lib/mongo/bulk_write/replacable.rb +0 -58
  236. data/lib/mongo/bulk_write/updatable.rb +0 -69
  237. data/lib/mongo/grid/fs.rb +0 -146
  238. data/lib/mongo/operation/list_collections/result.rb +0 -114
  239. data/lib/mongo/operation/list_indexes/result.rb +0 -118
  240. data/lib/mongo/operation/read/collections_info.rb +0 -68
  241. data/lib/mongo/operation/read/indexes.rb +0 -69
  242. data/lib/mongo/operation/read/list_collections.rb +0 -76
  243. data/lib/mongo/operation/read/list_indexes.rb +0 -78
  244. data/lib/mongo/operation/write/bulk/bulk_delete.rb +0 -145
  245. data/lib/mongo/operation/write/bulk/bulk_delete/result.rb +0 -75
  246. data/lib/mongo/operation/write/bulk/bulk_insert.rb +0 -132
  247. data/lib/mongo/operation/write/bulk/bulk_insert/result.rb +0 -130
  248. data/lib/mongo/operation/write/bulk/bulk_mergable.rb +0 -67
  249. data/lib/mongo/operation/write/bulk/bulk_update.rb +0 -154
  250. data/lib/mongo/operation/write/bulk/bulk_update/result.rb +0 -174
  251. data/lib/mongo/operation/write/bulk/legacy_bulk_mergable.rb +0 -83
  252. data/spec/mongo/grid/fs_spec.rb +0 -160
  253. data/spec/mongo/loggable_spec.rb +0 -63
@@ -0,0 +1,51 @@
1
+ data:
2
+ - { _id: 1, x: 11 }
3
+
4
+ collection_name: &collection_name "test"
5
+ database_name: &database_name "ruby-driver"
6
+
7
+ tests:
8
+ -
9
+ description: "A successful insert one"
10
+ operation:
11
+ name: "insertOne"
12
+ arguments:
13
+ document: { _id: 2, x: 22 }
14
+ expectations:
15
+ -
16
+ command_started_event:
17
+ command:
18
+ insert: *collection_name
19
+ documents:
20
+ - { _id: 2, x: 22 }
21
+ ordered: true
22
+ command_name: "insert"
23
+ database_name: *database_name
24
+ -
25
+ command_succeeded_event:
26
+ reply: { ok: 1.0, n: 1 }
27
+ command_name: "insert"
28
+ -
29
+ description: "A successful insert one command with write errors"
30
+ operation:
31
+ name: "insertOne"
32
+ arguments:
33
+ document: { _id: 1, x: 11 }
34
+ expectations:
35
+ -
36
+ command_started_event:
37
+ command:
38
+ insert: *collection_name
39
+ documents:
40
+ - { _id: 1, x: 11 }
41
+ ordered: true
42
+ command_name: "insert"
43
+ database_name: *database_name
44
+ -
45
+ command_succeeded_event:
46
+ reply:
47
+ ok: 1.0
48
+ n: 0
49
+ writeErrors:
50
+ - { index: 0, code: 42, errmsg: "" }
51
+ command_name: "insert"
@@ -0,0 +1,67 @@
1
+ data:
2
+ - { _id: 1, x: 11 }
3
+ - { _id: 2, x: 22 }
4
+ - { _id: 3, x: 33 }
5
+
6
+ collection_name: &collection_name "test"
7
+ database_name: &database_name "ruby-driver"
8
+
9
+ tests:
10
+ -
11
+ description: "A successful update many"
12
+ operation:
13
+ name: "updateMany"
14
+ arguments:
15
+ filter:
16
+ _id: { $gt: 1 }
17
+ update:
18
+ $inc: { x: 1 }
19
+ expectations:
20
+ -
21
+ command_started_event:
22
+ command:
23
+ update: *collection_name
24
+ ordered: true
25
+ updates:
26
+ -
27
+ q: { _id: { $gt: 1 }}
28
+ u: { $inc: { x: 1 }}
29
+ multi: true
30
+ upsert: false
31
+ command_name: "update"
32
+ database_name: *database_name
33
+ -
34
+ command_succeeded_event:
35
+ reply: { ok: 1.0, n: 2 }
36
+ command_name: "update"
37
+ -
38
+ description: "A successful update many command with write errors"
39
+ operation:
40
+ name: "updateMany"
41
+ arguments:
42
+ filter:
43
+ _id: { $gt: 1 }
44
+ update:
45
+ $nothing: { x: 1 }
46
+ expectations:
47
+ -
48
+ command_started_event:
49
+ command:
50
+ update: *collection_name
51
+ ordered: true
52
+ updates:
53
+ -
54
+ q: { _id: { $gt: 1 }}
55
+ u: { $nothing: { x: 1 }}
56
+ multi: true
57
+ upsert: false
58
+ command_name: "update"
59
+ database_name: *database_name
60
+ -
61
+ command_succeeded_event:
62
+ reply:
63
+ ok: 1.0
64
+ n: 0
65
+ writeErrors:
66
+ - { index: 0, code: 42, errmsg: "" }
67
+ command_name: "update"
@@ -0,0 +1,95 @@
1
+ data:
2
+ - { _id: 1, x: 11 }
3
+ - { _id: 2, x: 22 }
4
+ - { _id: 3, x: 33 }
5
+
6
+ collection_name: &collection_name "test"
7
+ database_name: &database_name "ruby-driver"
8
+
9
+ tests:
10
+ -
11
+ description: "A successful update one"
12
+ operation:
13
+ name: "updateOne"
14
+ arguments:
15
+ filter:
16
+ _id: { $gt: 1 }
17
+ update:
18
+ $inc: { x: 1 }
19
+ expectations:
20
+ -
21
+ command_started_event:
22
+ command:
23
+ update: *collection_name
24
+ ordered: true
25
+ updates:
26
+ -
27
+ q: { _id: { $gt: 1 }}
28
+ u: { $inc: { x: 1 }}
29
+ multi: false
30
+ upsert: false
31
+ command_name: "update"
32
+ database_name: *database_name
33
+ -
34
+ command_succeeded_event:
35
+ reply: { ok: 1.0, n: 1 }
36
+ command_name: "update"
37
+ -
38
+ description: "A successful update one with upsert when the upserted id is not an object id"
39
+ operation:
40
+ name: "updateOne"
41
+ arguments:
42
+ filter:
43
+ _id: 4
44
+ update:
45
+ $inc: { x: 1 }
46
+ upsert: true
47
+ expectations:
48
+ -
49
+ command_started_event:
50
+ command:
51
+ update: *collection_name
52
+ ordered: true
53
+ updates:
54
+ -
55
+ q: { _id: 4 }
56
+ u: { $inc: { x: 1 } }
57
+ multi: false
58
+ upsert: true
59
+ command_name: "update"
60
+ database_name: *database_name
61
+ -
62
+ command_succeeded_event:
63
+ reply: { ok: 1.0, n: 1, upserted: [{ index: 0, _id: 4 }] }
64
+ command_name: "update"
65
+ -
66
+ description: "A successful update one command with write errors"
67
+ operation:
68
+ name: "updateOne"
69
+ arguments:
70
+ filter:
71
+ _id: { $gt: 1 }
72
+ update:
73
+ $nothing: { x: 1 }
74
+ expectations:
75
+ -
76
+ command_started_event:
77
+ command:
78
+ update: *collection_name
79
+ ordered: true
80
+ updates:
81
+ -
82
+ q: { _id: { $gt: 1 }}
83
+ u: { $nothing: { x: 1 }}
84
+ multi: false
85
+ upsert: false
86
+ command_name: "update"
87
+ database_name: *database_name
88
+ -
89
+ command_succeeded_event:
90
+ reply:
91
+ ok: 1.0
92
+ n: 0
93
+ writeErrors:
94
+ - { index: 0, code: 42, errmsg: "" }
95
+ command_name: "update"
@@ -0,0 +1,228 @@
1
+ # Copyright (C) 2014-2015 MongoDB, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ RSpec::Matchers.define :have_hosts do |test|
16
+
17
+ match do |client|
18
+
19
+ def find_server(client, host)
20
+ client.cluster.instance_variable_get(:@servers).detect do |s|
21
+ s.address.host == host.host
22
+ end
23
+ end
24
+
25
+ def match_host?(server, host)
26
+ server.address.host == host.host
27
+ end
28
+
29
+ def match_port?(server, host)
30
+ server.address.port == host.port || !host.port
31
+ end
32
+
33
+ def match_address_family?(server, host)
34
+ address_family(server) == host.address_family
35
+ end
36
+
37
+ def address_family(server)
38
+ server.address.socket(2)
39
+ server.address.instance_variable_get(:@resolver).class
40
+ end
41
+
42
+ test.hosts.all? do |host|
43
+ server = find_server(client, host)
44
+ match_host?(server, host) &&
45
+ match_port?(server, host) if server #&&
46
+ #match_address_family?(server, host) if server
47
+ end
48
+
49
+ failure_message do |client|
50
+ "With URI: #{test.uri_string}\n" +
51
+ "Expected that test hosts: #{test.hosts} would match " +
52
+ "client hosts: #{client.cluster.instance_variable_get(:@servers)}"
53
+ end
54
+ end
55
+ end
56
+
57
+ RSpec::Matchers.define :match_auth do |test|
58
+
59
+ def match_database?(client, auth)
60
+ client.options[:database] == auth.database || !auth.database
61
+ end
62
+
63
+ def match_password?(client, auth)
64
+ client.options[:password] == auth.password ||
65
+ client.options[:password].nil? && auth.password == ''
66
+ end
67
+
68
+ match do |client|
69
+ auth = test.auth
70
+ return true unless auth
71
+ client.options[:user] == auth.username &&
72
+ match_password?(client, auth) &&
73
+ match_database?(client, auth)
74
+ end
75
+
76
+ failure_message do |client|
77
+ "With URI: #{test.uri_string}\n" +
78
+ "Expected that test auth: #{test.auth} would match client auth: #{client.options}"
79
+ end
80
+ end
81
+
82
+ RSpec::Matchers.define :match_options do |test|
83
+
84
+ match do |client|
85
+ options = test.options
86
+ return true unless options
87
+ options.match?(client.options)
88
+ end
89
+
90
+ failure_message do |client|
91
+ "With URI: #{test.uri_string}\n" +
92
+ "Expected that test options: #{test.options.options} would match client options: #{client.options}"
93
+ end
94
+ end
95
+
96
+ module Mongo
97
+ module ConnectionString
98
+
99
+ class Spec
100
+
101
+ attr_reader :description
102
+
103
+ # Instantiate the new spec.
104
+ #
105
+ # @example Create the spec.
106
+ # Spec.new(file)
107
+ #
108
+ # @param [ String ] file The name of the file.
109
+ #
110
+ # @since 2.0.0
111
+ def initialize(file)
112
+ file = File.new(file)
113
+ @spec = YAML.load(ERB.new(file.read).result)
114
+ file.close
115
+ @description = File.basename(file)
116
+ end
117
+
118
+ def tests
119
+ @tests ||= @spec['tests'].collect do |spec|
120
+ Test.new(spec)
121
+ end
122
+ end
123
+ end
124
+
125
+ class Test
126
+
127
+ attr_reader :description
128
+ attr_reader :uri_string
129
+
130
+ def initialize(spec)
131
+ @spec = spec
132
+ @description = @spec['description']
133
+ @uri_string = @spec['uri']
134
+ end
135
+
136
+ def valid?
137
+ @spec['valid']
138
+ end
139
+
140
+ def warn?
141
+ @spec['warning']
142
+ end
143
+
144
+ def hosts
145
+ @hosts ||= @spec['hosts'].collect do |host|
146
+ Host.new(host)
147
+ end
148
+ end
149
+
150
+ def options
151
+ @options ||= Options.new(@spec['options']) if @spec['options']
152
+ end
153
+
154
+ def client
155
+ @client ||= Mongo::Client.new(@spec['uri'])
156
+ end
157
+
158
+ def uri
159
+ @uri ||= Mongo::URI.new(@spec['uri'])
160
+ end
161
+
162
+ def auth
163
+ @auth ||= Auth.new(@spec['auth']) if @spec['auth']
164
+ end
165
+ end
166
+
167
+ class Host
168
+
169
+ MAPPING = {
170
+ 'ipv4' => Mongo::Address::IPv4,
171
+ 'ipv6' => Mongo::Address::IPv6,
172
+ 'unix' => Mongo::Address::Unix
173
+ }
174
+
175
+ attr_reader :host
176
+ attr_reader :port
177
+
178
+ def initialize(spec)
179
+ @spec = spec
180
+ @host = @spec['host']
181
+ @port = @spec['port']
182
+ end
183
+
184
+ def address_family
185
+ MAPPING[@spec['type']]
186
+ end
187
+ end
188
+
189
+ class Auth
190
+
191
+ attr_reader :username
192
+ attr_reader :password
193
+ attr_reader :database
194
+
195
+ def initialize(spec)
196
+ @spec = spec
197
+ @username = @spec['username']
198
+ @password = @spec['password']
199
+ @database = @spec['db']
200
+ end
201
+
202
+ def to_s
203
+ "username: #{username}, password: #{password}, database: #{database}"
204
+ end
205
+ end
206
+
207
+ class Options
208
+
209
+ MAPPINGS = {
210
+ 'replicaset' => :replica_set,
211
+ 'authmechanism' => :auth_mech
212
+ }
213
+
214
+ attr_reader :options
215
+
216
+ def initialize(options)
217
+ @options = options
218
+ end
219
+
220
+ def match?(opts)
221
+ @options.keys.all? do |k|
222
+ opts[MAPPINGS[k]] == @options[k] ||
223
+ Mongo::URI::AUTH_MECH_MAP[@options[k]] == opts[MAPPINGS[k]]
224
+ end
225
+ end
226
+ end
227
+ end
228
+ end
@@ -0,0 +1,193 @@
1
+ tests:
2
+ -
3
+ description: "Empty string"
4
+ uri: ""
5
+ valid: false
6
+ warning: ~
7
+ hosts: ~
8
+ auth: ~
9
+ options: ~
10
+ -
11
+ description: "Invalid scheme"
12
+ uri: "mongo://localhost:27017"
13
+ valid: false
14
+ warning: ~
15
+ hosts: ~
16
+ auth: ~
17
+ options: ~
18
+ -
19
+ description: "Missing host"
20
+ uri: "mongodb://"
21
+ valid: false
22
+ warning: ~
23
+ hosts: ~
24
+ auth: ~
25
+ options: ~
26
+ -
27
+ description: "Double colon in host identifier"
28
+ uri: "mongodb://localhost::27017"
29
+ valid: false
30
+ warning: ~
31
+ hosts: ~
32
+ auth: ~
33
+ options: ~
34
+ -
35
+ description: "Double colon in host identifier and trailing slash"
36
+ uri: "mongodb://localhost::27017/"
37
+ valid: false
38
+ warning: ~
39
+ hosts: ~
40
+ auth: ~
41
+ options: ~
42
+ -
43
+ description: "Double colon in host identifier with missing host and port"
44
+ uri: "mongodb://::"
45
+ valid: false
46
+ warning: ~
47
+ hosts: ~
48
+ auth: ~
49
+ options: ~
50
+ -
51
+ description: "Double colon in host identifier with missing port"
52
+ uri: "mongodb://localhost,localhost::"
53
+ valid: false
54
+ warning: ~
55
+ hosts: ~
56
+ auth: ~
57
+ options: ~
58
+ -
59
+ description: "Double colon in host identifier and second host"
60
+ uri: "mongodb://localhost::27017,abc"
61
+ valid: false
62
+ warning: ~
63
+ hosts: ~
64
+ auth: ~
65
+ options: ~
66
+ -
67
+ description: "Invalid port (negative number) with hostname"
68
+ uri: "mongodb://localhost:-1"
69
+ valid: false
70
+ warning: ~
71
+ hosts: ~
72
+ auth: ~
73
+ options: ~
74
+ -
75
+ description: "Invalid port (zero) with hostname"
76
+ uri: "mongodb://localhost:0/"
77
+ valid: false
78
+ warning: ~
79
+ hosts: ~
80
+ auth: ~
81
+ options: ~
82
+ -
83
+ description: "Invalid port (positive number) with hostname"
84
+ uri: "mongodb://localhost:65536"
85
+ valid: false
86
+ warning: ~
87
+ hosts: ~
88
+ auth: ~
89
+ options: ~
90
+ -
91
+ description: "Invalid port (positive number) with hostname and trailing slash"
92
+ uri: "mongodb://localhost:65536/"
93
+ valid: false
94
+ warning: ~
95
+ hosts: ~
96
+ auth: ~
97
+ options: ~
98
+ -
99
+ description: "Invalid port (non-numeric string) with hostname"
100
+ uri: "mongodb://localhost:foo"
101
+ valid: false
102
+ warning: ~
103
+ hosts: ~
104
+ auth: ~
105
+ options: ~
106
+ -
107
+ description: "Invalid port (negative number) with IP literal"
108
+ uri: "mongodb://[::1]:-1"
109
+ valid: false
110
+ warning: ~
111
+ hosts: ~
112
+ auth: ~
113
+ options: ~
114
+ -
115
+ description: "Invalid port (zero) with IP literal"
116
+ uri: "mongodb://[::1]:0/"
117
+ valid: false
118
+ warning: ~
119
+ hosts: ~
120
+ auth: ~
121
+ options: ~
122
+ -
123
+ description: "Invalid port (positive number) with IP literal"
124
+ uri: "mongodb://[::1]:65536"
125
+ valid: false
126
+ warning: ~
127
+ hosts: ~
128
+ auth: ~
129
+ options: ~
130
+ -
131
+ description: "Invalid port (positive number) with IP literal and trailing slash"
132
+ uri: "mongodb://[::1]:65536/"
133
+ valid: false
134
+ warning: ~
135
+ hosts: ~
136
+ auth: ~
137
+ options: ~
138
+ -
139
+ description: "Invalid port (non-numeric string) with IP literal"
140
+ uri: "mongodb://[::1]:foo"
141
+ valid: false
142
+ warning: ~
143
+ hosts: ~
144
+ auth: ~
145
+ options: ~
146
+ -
147
+ description: "Missing delimiting slash between hosts and options"
148
+ uri: "mongodb://example.com?w=1"
149
+ valid: false
150
+ warning: ~
151
+ hosts: ~
152
+ auth: ~
153
+ options: ~
154
+ -
155
+ description: "Incomplete key value pair for option"
156
+ uri: "mongodb://example.com/?w"
157
+ valid: false
158
+ warning: ~
159
+ hosts: ~
160
+ auth: ~
161
+ options: ~
162
+ -
163
+ description: "Username with password containing an unescaped colon"
164
+ uri: "mongodb://alice:foo:bar@127.0.0.1"
165
+ valid: false
166
+ warning: ~
167
+ hosts: ~
168
+ auth: ~
169
+ options: ~
170
+ -
171
+ description: "Username containing an unescaped at-sign"
172
+ uri: "mongodb://alice@@127.0.0.1"
173
+ valid: false
174
+ warning: ~
175
+ hosts: ~
176
+ auth: ~
177
+ options: ~
178
+ -
179
+ description: "Username with password containing an unescaped at-sign"
180
+ uri: "mongodb://alice@foo:bar@127.0.0.1"
181
+ valid: false
182
+ warning: ~
183
+ hosts: ~
184
+ auth: ~
185
+ options: ~
186
+ -
187
+ description: "Host with unescaped slash"
188
+ uri: "mongodb:///tmp/mongodb-27017.sock/"
189
+ valid: false
190
+ warning: ~
191
+ hosts: ~
192
+ auth: ~
193
+ options: ~