mongo 1.12.5 → 2.0.0.beta

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 (437) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/CONTRIBUTING.md +64 -0
  5. data/LICENSE +1 -1
  6. data/README.md +23 -125
  7. data/Rakefile +26 -21
  8. data/bin/mongo_console +6 -38
  9. data/lib/mongo.rb +23 -82
  10. data/lib/mongo/address.rb +111 -0
  11. data/lib/mongo/address/ipv4.rb +85 -0
  12. data/lib/mongo/address/ipv6.rb +85 -0
  13. data/lib/mongo/address/unix.rb +76 -0
  14. data/lib/mongo/auth.rb +108 -0
  15. data/lib/mongo/auth/cr.rb +44 -0
  16. data/lib/mongo/auth/cr/conversation.rb +119 -0
  17. data/lib/mongo/auth/executable.rb +52 -0
  18. data/lib/mongo/auth/ldap.rb +48 -0
  19. data/lib/mongo/auth/ldap/conversation.rb +92 -0
  20. data/lib/mongo/auth/roles.rb +104 -0
  21. data/lib/mongo/auth/scram.rb +53 -0
  22. data/lib/mongo/auth/scram/conversation.rb +450 -0
  23. data/lib/mongo/auth/user.rb +159 -0
  24. data/lib/mongo/auth/user/view.rb +102 -0
  25. data/lib/mongo/auth/x509.rb +48 -0
  26. data/lib/mongo/auth/x509/conversation.rb +92 -0
  27. data/lib/mongo/{gridfs.rb → bulk.rb} +2 -5
  28. data/lib/mongo/bulk/bulk_write.rb +307 -0
  29. data/lib/mongo/client.rb +233 -0
  30. data/lib/mongo/cluster.rb +203 -0
  31. data/lib/mongo/cluster/topology.rb +60 -0
  32. data/lib/mongo/cluster/topology/replica_set.rb +160 -0
  33. data/lib/mongo/cluster/topology/sharded.rb +132 -0
  34. data/lib/mongo/cluster/topology/standalone.rb +132 -0
  35. data/lib/mongo/cluster/topology/unknown.rb +155 -0
  36. data/lib/mongo/collection.rb +130 -1101
  37. data/lib/mongo/collection/view.rb +169 -0
  38. data/lib/mongo/collection/view/aggregation.rb +108 -0
  39. data/lib/mongo/collection/view/explainable.rb +49 -0
  40. data/lib/mongo/collection/view/immutable.rb +43 -0
  41. data/lib/mongo/collection/view/iterable.rb +48 -0
  42. data/lib/mongo/collection/view/map_reduce.rb +191 -0
  43. data/lib/mongo/collection/view/readable.rb +363 -0
  44. data/lib/mongo/collection/view/writable.rb +169 -0
  45. data/lib/mongo/cursor.rb +79 -680
  46. data/lib/mongo/database.rb +224 -0
  47. data/lib/mongo/database/view.rb +101 -0
  48. data/lib/mongo/error.rb +81 -0
  49. data/lib/mongo/error/bulk_write_failure.rb +41 -0
  50. data/lib/mongo/{utils/thread_local_variable_manager.rb → error/empty_batch.rb} +22 -8
  51. data/{test/functional/db_connection_test.rb → lib/mongo/error/invalid_bulk_operation.rb} +19 -8
  52. data/lib/mongo/error/invalid_collection_name.rb +39 -0
  53. data/lib/mongo/error/invalid_database_name.rb +39 -0
  54. data/{test/replica_set/ssl_test.rb → lib/mongo/error/invalid_document.rb} +21 -14
  55. data/lib/mongo/error/invalid_file.rb +38 -0
  56. data/lib/mongo/error/invalid_nonce.rb +46 -0
  57. data/lib/mongo/error/invalid_replacement_document.rb +39 -0
  58. data/lib/mongo/error/invalid_signature.rb +47 -0
  59. data/{test/functional/ssl_test.rb → lib/mongo/error/invalid_update_document.rb} +22 -12
  60. data/lib/mongo/error/max_bson_size.rb +40 -0
  61. data/lib/mongo/error/max_message_size.rb +42 -0
  62. data/lib/mongo/{utils.rb → error/need_primary_server.rb} +10 -6
  63. data/lib/mongo/{connection.rb → error/operation_failure.rb} +10 -6
  64. data/lib/mongo/error/parser.rb +77 -0
  65. data/lib/mongo/{connection/socket.rb → error/socket_error.rb} +10 -5
  66. data/lib/mongo/error/socket_timeout_error.rb +23 -0
  67. data/lib/mongo/error/unsupported_features.rb +43 -0
  68. data/lib/mongo/event.rb +40 -0
  69. data/lib/mongo/event/listeners.rb +63 -0
  70. data/lib/mongo/event/primary_elected.rb +53 -0
  71. data/lib/mongo/event/publisher.rb +42 -0
  72. data/lib/mongo/event/server_added.rb +53 -0
  73. data/lib/mongo/event/server_removed.rb +53 -0
  74. data/lib/mongo/event/subscriber.rb +41 -0
  75. data/lib/mongo/grid.rb +16 -0
  76. data/lib/mongo/grid/file.rb +94 -0
  77. data/lib/mongo/grid/file/chunk.rb +184 -0
  78. data/lib/mongo/grid/file/metadata.rb +223 -0
  79. data/lib/mongo/grid/fs.rb +149 -0
  80. data/lib/mongo/index.rb +64 -0
  81. data/lib/mongo/index/view.rb +205 -0
  82. data/lib/mongo/loggable.rb +126 -0
  83. data/lib/mongo/logger.rb +132 -0
  84. data/lib/mongo/operation.rb +26 -0
  85. data/lib/mongo/operation/aggregate.rb +100 -0
  86. data/lib/mongo/operation/aggregate/result.rb +84 -0
  87. data/lib/mongo/operation/batchable.rb +103 -0
  88. data/lib/mongo/operation/bulk_delete/result.rb +197 -0
  89. data/lib/mongo/operation/bulk_insert/result.rb +195 -0
  90. data/lib/mongo/operation/bulk_update/result.rb +295 -0
  91. data/lib/mongo/operation/command.rb +62 -0
  92. data/lib/mongo/operation/executable.rb +105 -0
  93. data/lib/mongo/operation/kill_cursors.rb +39 -0
  94. data/lib/mongo/operation/limited.rb +37 -0
  95. data/lib/mongo/operation/list_collections/result.rb +116 -0
  96. data/lib/mongo/operation/list_indexes/result.rb +118 -0
  97. data/lib/mongo/operation/map_reduce.rb +96 -0
  98. data/lib/mongo/operation/map_reduce/result.rb +122 -0
  99. data/lib/mongo/{functional.rb → operation/read.rb} +7 -7
  100. data/lib/mongo/operation/read/collections_info.rb +67 -0
  101. data/lib/mongo/operation/read/get_more.rb +71 -0
  102. data/lib/mongo/operation/read/indexes.rb +68 -0
  103. data/lib/mongo/operation/read/list_collections.rb +75 -0
  104. data/lib/mongo/operation/read/list_indexes.rb +77 -0
  105. data/lib/mongo/operation/read/query.rb +71 -0
  106. data/lib/mongo/operation/read_preferrable.rb +34 -0
  107. data/lib/mongo/operation/result.rb +259 -0
  108. data/lib/mongo/operation/specifiable.rb +380 -0
  109. data/lib/mongo/operation/write.rb +25 -0
  110. data/lib/mongo/operation/write/bulk_delete.rb +158 -0
  111. data/lib/mongo/operation/write/bulk_insert.rb +160 -0
  112. data/lib/mongo/operation/write/bulk_update.rb +167 -0
  113. data/lib/mongo/{connection/socket/socket_util.rb → operation/write/command.rb} +9 -24
  114. data/lib/mongo/operation/write/command/create_user.rb +43 -0
  115. data/lib/mongo/operation/write/command/delete.rb +56 -0
  116. data/lib/mongo/operation/write/command/drop_index.rb +51 -0
  117. data/lib/mongo/operation/write/command/ensure_index.rb +55 -0
  118. data/lib/mongo/operation/write/command/insert.rb +55 -0
  119. data/lib/mongo/operation/write/command/remove_user.rb +42 -0
  120. data/lib/mongo/operation/write/command/update.rb +60 -0
  121. data/lib/mongo/operation/write/command/writable.rb +61 -0
  122. data/lib/mongo/operation/write/create_index.rb +84 -0
  123. data/lib/mongo/operation/write/create_user.rb +75 -0
  124. data/lib/mongo/operation/write/delete.rb +91 -0
  125. data/lib/mongo/operation/write/drop_index.rb +62 -0
  126. data/lib/mongo/operation/write/insert.rb +88 -0
  127. data/lib/mongo/operation/write/remove_user.rb +70 -0
  128. data/lib/mongo/operation/write/update.rb +98 -0
  129. data/lib/mongo/protocol.rb +15 -0
  130. data/lib/mongo/protocol/bit_vector.rb +61 -0
  131. data/lib/mongo/protocol/delete.rb +94 -0
  132. data/lib/mongo/protocol/get_more.rb +99 -0
  133. data/lib/mongo/protocol/insert.rb +99 -0
  134. data/lib/mongo/protocol/kill_cursors.rb +74 -0
  135. data/lib/mongo/protocol/message.rb +252 -0
  136. data/lib/mongo/protocol/query.rb +147 -0
  137. data/lib/mongo/protocol/reply.rb +72 -0
  138. data/lib/mongo/protocol/serializers.rb +180 -0
  139. data/lib/mongo/protocol/update.rb +111 -0
  140. data/lib/mongo/server.rb +163 -0
  141. data/lib/mongo/server/connectable.rb +99 -0
  142. data/lib/mongo/server/connection.rb +133 -0
  143. data/lib/mongo/server/connection_pool.rb +141 -0
  144. data/lib/mongo/server/connection_pool/queue.rb +182 -0
  145. data/lib/mongo/server/context.rb +66 -0
  146. data/lib/mongo/server/description.rb +450 -0
  147. data/lib/mongo/server/description/features.rb +85 -0
  148. data/lib/mongo/server/description/inspector.rb +79 -0
  149. data/lib/mongo/server/description/inspector/primary_elected.rb +58 -0
  150. data/lib/mongo/server/description/inspector/server_added.rb +59 -0
  151. data/lib/mongo/server/description/inspector/server_removed.rb +59 -0
  152. data/lib/mongo/server/monitor.rb +160 -0
  153. data/lib/mongo/server/monitor/connection.rb +88 -0
  154. data/lib/mongo/server_selector.rb +81 -0
  155. data/lib/mongo/server_selector/nearest.rb +94 -0
  156. data/lib/mongo/server_selector/primary.rb +88 -0
  157. data/lib/mongo/server_selector/primary_preferred.rb +94 -0
  158. data/lib/mongo/server_selector/secondary.rb +91 -0
  159. data/lib/mongo/server_selector/secondary_preferred.rb +96 -0
  160. data/lib/mongo/server_selector/selectable.rb +209 -0
  161. data/lib/mongo/socket.rb +179 -0
  162. data/lib/mongo/socket/ssl.rb +108 -0
  163. data/lib/mongo/socket/tcp.rb +69 -0
  164. data/lib/mongo/socket/unix.rb +66 -0
  165. data/lib/mongo/uri.rb +504 -0
  166. data/lib/mongo/version.rb +21 -0
  167. data/lib/mongo/write_concern.rb +99 -0
  168. data/lib/mongo/write_concern/acknowledged.rb +38 -0
  169. data/lib/mongo/write_concern/normalizable.rb +73 -0
  170. data/lib/mongo/write_concern/unacknowledged.rb +43 -0
  171. data/mongo.gemspec +17 -14
  172. data/spec/mongo/address/ipv4_spec.rb +74 -0
  173. data/spec/mongo/address/ipv6_spec.rb +74 -0
  174. data/spec/mongo/address/unix_spec.rb +30 -0
  175. data/spec/mongo/address_spec.rb +206 -0
  176. data/spec/mongo/auth/cr_spec.rb +59 -0
  177. data/spec/mongo/auth/ldap_spec.rb +40 -0
  178. data/spec/mongo/auth/scram/conversation_spec.rb +197 -0
  179. data/spec/mongo/auth/scram_spec.rb +55 -0
  180. data/spec/mongo/auth/user/view_spec.rb +76 -0
  181. data/spec/mongo/auth/user_spec.rb +190 -0
  182. data/spec/mongo/auth/x509_spec.rb +40 -0
  183. data/spec/mongo/auth_spec.rb +65 -0
  184. data/spec/mongo/bulk/bulk_write_spec.rb +175 -0
  185. data/spec/mongo/client_spec.rb +564 -0
  186. data/spec/mongo/cluster/topology/replica_set_spec.rb +101 -0
  187. data/spec/mongo/cluster/topology/sharded_spec.rb +74 -0
  188. data/spec/mongo/cluster/topology/standalone_spec.rb +79 -0
  189. data/spec/mongo/cluster/topology_spec.rb +65 -0
  190. data/spec/mongo/cluster_spec.rb +129 -0
  191. data/spec/mongo/collection/view/aggregation_spec.rb +135 -0
  192. data/spec/mongo/collection/view/explainable_spec.rb +32 -0
  193. data/spec/mongo/collection/view/map_reduce_spec.rb +242 -0
  194. data/spec/mongo/collection/view/readable_spec.rb +603 -0
  195. data/spec/mongo/collection/view/writable_spec.rb +504 -0
  196. data/spec/mongo/collection/view_spec.rb +521 -0
  197. data/spec/mongo/collection_spec.rb +362 -0
  198. data/spec/mongo/cursor_spec.rb +295 -0
  199. data/spec/mongo/database_spec.rb +306 -0
  200. data/spec/mongo/error/parser_spec.rb +119 -0
  201. data/spec/mongo/event/publisher_spec.rb +50 -0
  202. data/spec/mongo/event/subscriber_spec.rb +34 -0
  203. data/spec/mongo/grid/file/chunk_spec.rb +226 -0
  204. data/spec/mongo/grid/file/metadata_spec.rb +69 -0
  205. data/spec/mongo/grid/file_spec.rb +138 -0
  206. data/spec/mongo/grid/fs_spec.rb +129 -0
  207. data/spec/mongo/index/view_spec.rb +226 -0
  208. data/spec/mongo/loggable_spec.rb +62 -0
  209. data/spec/mongo/logger_spec.rb +97 -0
  210. data/spec/mongo/operation/aggregate/result_spec.rb +80 -0
  211. data/spec/mongo/operation/aggregate_spec.rb +135 -0
  212. data/spec/mongo/operation/command_spec.rb +106 -0
  213. data/spec/mongo/operation/kill_cursors_spec.rb +66 -0
  214. data/spec/mongo/operation/limited_spec.rb +50 -0
  215. data/spec/mongo/operation/map_reduce_spec.rb +143 -0
  216. data/spec/mongo/operation/read/collections_info_spec.rb +40 -0
  217. data/spec/mongo/operation/read/get_more_spec.rb +81 -0
  218. data/spec/mongo/operation/read/indexes_spec.rb +31 -0
  219. data/spec/mongo/operation/read/query_spec.rb +84 -0
  220. data/spec/mongo/operation/result_spec.rb +275 -0
  221. data/spec/mongo/operation/specifiable_spec.rb +53 -0
  222. data/spec/mongo/operation/write/bulk_delete_spec.rb +473 -0
  223. data/spec/mongo/operation/write/bulk_insert_spec.rb +466 -0
  224. data/spec/mongo/operation/write/bulk_update_spec.rb +524 -0
  225. data/spec/mongo/operation/write/command/delete_spec.rb +116 -0
  226. data/spec/mongo/operation/write/command/insert_spec.rb +117 -0
  227. data/spec/mongo/operation/write/command/update_spec.rb +123 -0
  228. data/spec/mongo/operation/write/create_user_spec.rb +44 -0
  229. data/spec/mongo/operation/write/delete_spec.rb +178 -0
  230. data/spec/mongo/operation/write/drop_index_spec.rb +51 -0
  231. data/spec/mongo/operation/write/ensure_index_spec.rb +81 -0
  232. data/spec/mongo/operation/write/insert_spec.rb +231 -0
  233. data/spec/mongo/operation/write/remove_user_spec.rb +46 -0
  234. data/spec/mongo/operation/write/response_spec.rb +85 -0
  235. data/spec/mongo/operation/write/update_spec.rb +177 -0
  236. data/spec/mongo/protocol/delete_spec.rb +167 -0
  237. data/spec/mongo/protocol/get_more_spec.rb +146 -0
  238. data/spec/mongo/protocol/insert_spec.rb +161 -0
  239. data/spec/mongo/protocol/kill_cursors_spec.rb +101 -0
  240. data/spec/mongo/protocol/query_spec.rb +285 -0
  241. data/spec/mongo/protocol/reply_spec.rb +157 -0
  242. data/spec/mongo/protocol/update_spec.rb +186 -0
  243. data/spec/mongo/server/connection_pool/queue_spec.rb +170 -0
  244. data/spec/mongo/server/connection_pool_spec.rb +120 -0
  245. data/spec/mongo/server/connection_spec.rb +289 -0
  246. data/spec/mongo/server/description/features_spec.rb +138 -0
  247. data/spec/mongo/server/description/inspector/primary_elected_spec.rb +94 -0
  248. data/spec/mongo/server/description/inspector/server_added_spec.rb +92 -0
  249. data/spec/mongo/server/description/inspector/server_removed_spec.rb +95 -0
  250. data/spec/mongo/server/description_spec.rb +510 -0
  251. data/spec/mongo/server/monitor_spec.rb +130 -0
  252. data/spec/mongo/server_discovery_and_monitoring_spec.rb +103 -0
  253. data/spec/mongo/server_selection_rtt_spec.rb +104 -0
  254. data/spec/mongo/server_selection_spec.rb +89 -0
  255. data/spec/mongo/server_selector/nearest_spec.rb +250 -0
  256. data/spec/mongo/server_selector/primary_preferred_spec.rb +290 -0
  257. data/spec/mongo/server_selector/primary_spec.rb +114 -0
  258. data/spec/mongo/server_selector/secondary_preferred_spec.rb +252 -0
  259. data/spec/mongo/server_selector/secondary_spec.rb +196 -0
  260. data/spec/mongo/server_selector_spec.rb +101 -0
  261. data/spec/mongo/server_spec.rb +131 -0
  262. data/spec/mongo/uri_spec.rb +517 -0
  263. data/spec/mongo/write_concern/acknowledged_spec.rb +44 -0
  264. data/spec/mongo/write_concern/unacknowledged_spec.rb +15 -0
  265. data/spec/mongo_orchestration_spec.rb +70 -0
  266. data/spec/spec_helper.rb +148 -0
  267. data/spec/support/authorization.rb +245 -0
  268. data/spec/support/helpers.rb +140 -0
  269. data/spec/support/matchers.rb +37 -0
  270. data/spec/support/mongo_orchestration.rb +61 -0
  271. data/spec/support/mongo_orchestration/requestable.rb +109 -0
  272. data/spec/support/mongo_orchestration/standalone.rb +57 -0
  273. data/spec/support/sdam/rs/discover_arbiters.yml +41 -0
  274. data/spec/support/sdam/rs/discover_passives.yml +41 -0
  275. data/spec/support/sdam/rs/discover_primary.yml +40 -0
  276. data/spec/support/sdam/rs/discover_secondary.yml +41 -0
  277. data/spec/support/sdam/rs/discovery.yml +195 -0
  278. data/spec/support/sdam/rs/ghost_discovered.yml +39 -0
  279. data/spec/support/sdam/rs/hosts_differ_from_seeds.yml +34 -0
  280. data/spec/support/sdam/rs/member_reconfig.yml +68 -0
  281. data/spec/support/sdam/rs/member_standalone.yml +60 -0
  282. data/spec/support/sdam/rs/new_primary.yml +74 -0
  283. data/spec/support/sdam/rs/new_primary_wrong_set_name.yml +71 -0
  284. data/spec/support/sdam/rs/non_rs_member.yml +31 -0
  285. data/spec/support/sdam/rs/normalize_case.yml +49 -0
  286. data/spec/support/sdam/rs/primary_becomes_standalone.yml +52 -0
  287. data/spec/support/sdam/rs/primary_changes_set_name.yml +57 -0
  288. data/spec/support/sdam/rs/primary_disconnect.yml +56 -0
  289. data/spec/support/sdam/rs/primary_wrong_set_name.yml +27 -0
  290. data/spec/support/sdam/rs/response_from_removed.yml +63 -0
  291. data/spec/support/sdam/rs/rsother_discovered.yml +41 -0
  292. data/spec/support/sdam/rs/sec_not_auth.yml +49 -0
  293. data/spec/support/sdam/rs/secondary_wrong_set_name.yml +28 -0
  294. data/spec/support/sdam/rs/secondary_wrong_set_name_with_primary.yml +69 -0
  295. data/spec/support/sdam/rs/unexpected_mongos.yml +26 -0
  296. data/spec/support/sdam/rs/wrong_set_name.yml +35 -0
  297. data/spec/support/sdam/sharded/multiple_mongoses.yml +46 -0
  298. data/spec/support/sdam/sharded/non_mongos_removed.yml +41 -0
  299. data/spec/support/sdam/sharded/normalize_uri_case.yml +32 -0
  300. data/spec/support/sdam/single/direct_connection_external_ip.yml +34 -0
  301. data/spec/support/sdam/single/direct_connection_mongos.yml +33 -0
  302. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +35 -0
  303. data/spec/support/sdam/single/direct_connection_rsprimary.yml +34 -0
  304. data/spec/support/sdam/single/direct_connection_rssecondary.yml +35 -0
  305. data/spec/support/sdam/single/direct_connection_slave.yml +32 -0
  306. data/spec/support/sdam/single/direct_connection_standalone.yml +32 -0
  307. data/spec/support/sdam/single/not_ok_response.yml +39 -0
  308. data/spec/support/sdam/single/standalone_removed.yml +32 -0
  309. data/spec/support/sdam/single/unavailable_seed.yml +28 -0
  310. data/spec/support/server_discovery_and_monitoring.rb +167 -0
  311. data/spec/support/server_selection.rb +140 -0
  312. data/spec/support/server_selection/rtt/first_value.yml +4 -0
  313. data/spec/support/server_selection/rtt/first_value_zero.yml +4 -0
  314. data/spec/support/server_selection/rtt/value_test_1.yml +4 -0
  315. data/spec/support/server_selection/rtt/value_test_2.yml +4 -0
  316. data/spec/support/server_selection/rtt/value_test_3.yml +4 -0
  317. data/spec/support/server_selection/rtt/value_test_4.yml +4 -0
  318. data/spec/support/server_selection/rtt/value_test_5.yml +4 -0
  319. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest.yml +32 -0
  320. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest_non_matching.yml +27 -0
  321. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Primary.yml +23 -0
  322. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred.yml +32 -0
  323. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred_non_matching.yml +27 -0
  324. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary.yml +32 -0
  325. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred.yml +32 -0
  326. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred_non_matching.yml +27 -0
  327. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary_non_matching.yml +27 -0
  328. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest.yml +41 -0
  329. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest_non_matching.yml +34 -0
  330. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Primary.yml +33 -0
  331. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred.yml +39 -0
  332. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred_non_matching.yml +36 -0
  333. data/spec/support/server_selection/selection/Sharded/read/SecondaryPreferred.yml +32 -0
  334. data/spec/support/server_selection/selection/Single/read/SecondaryPreferred.yml +23 -0
  335. data/spec/support/server_selection/selection/Unknown/read/SecondaryPreferred.yml +13 -0
  336. data/spec/support/server_selection_rtt.rb +41 -0
  337. data/spec/support/shared/bulk_write.rb +498 -0
  338. data/spec/support/shared/cursor.rb +38 -0
  339. data/spec/support/shared/operation.rb +77 -0
  340. data/spec/support/shared/protocol.rb +31 -0
  341. data/spec/support/shared/server_selector.rb +111 -0
  342. data/spec/support/shared/socket.rb +82 -0
  343. data/spec/support/travis.rb +14 -0
  344. metadata +523 -189
  345. metadata.gz.sig +0 -0
  346. data/VERSION +0 -1
  347. data/lib/mongo/bulk_write_collection_view.rb +0 -387
  348. data/lib/mongo/collection_writer.rb +0 -364
  349. data/lib/mongo/connection/node.rb +0 -249
  350. data/lib/mongo/connection/pool.rb +0 -340
  351. data/lib/mongo/connection/pool_manager.rb +0 -320
  352. data/lib/mongo/connection/sharding_pool_manager.rb +0 -67
  353. data/lib/mongo/connection/socket/ssl_socket.rb +0 -95
  354. data/lib/mongo/connection/socket/tcp_socket.rb +0 -87
  355. data/lib/mongo/connection/socket/unix_socket.rb +0 -39
  356. data/lib/mongo/db.rb +0 -808
  357. data/lib/mongo/exception.rb +0 -145
  358. data/lib/mongo/functional/authentication.rb +0 -455
  359. data/lib/mongo/functional/logging.rb +0 -85
  360. data/lib/mongo/functional/read_preference.rb +0 -183
  361. data/lib/mongo/functional/scram.rb +0 -556
  362. data/lib/mongo/functional/uri_parser.rb +0 -409
  363. data/lib/mongo/functional/write_concern.rb +0 -66
  364. data/lib/mongo/gridfs/grid.rb +0 -112
  365. data/lib/mongo/gridfs/grid_ext.rb +0 -53
  366. data/lib/mongo/gridfs/grid_file_system.rb +0 -163
  367. data/lib/mongo/gridfs/grid_io.rb +0 -484
  368. data/lib/mongo/legacy.rb +0 -140
  369. data/lib/mongo/mongo_client.rb +0 -697
  370. data/lib/mongo/mongo_replica_set_client.rb +0 -535
  371. data/lib/mongo/mongo_sharded_client.rb +0 -159
  372. data/lib/mongo/networking.rb +0 -372
  373. data/lib/mongo/utils/conversions.rb +0 -110
  374. data/lib/mongo/utils/core_ext.rb +0 -70
  375. data/lib/mongo/utils/server_version.rb +0 -69
  376. data/lib/mongo/utils/support.rb +0 -80
  377. data/test/functional/authentication_test.rb +0 -39
  378. data/test/functional/bulk_api_stress_test.rb +0 -133
  379. data/test/functional/bulk_write_collection_view_test.rb +0 -1198
  380. data/test/functional/client_test.rb +0 -627
  381. data/test/functional/collection_test.rb +0 -2175
  382. data/test/functional/collection_writer_test.rb +0 -83
  383. data/test/functional/conversions_test.rb +0 -163
  384. data/test/functional/cursor_fail_test.rb +0 -57
  385. data/test/functional/cursor_message_test.rb +0 -56
  386. data/test/functional/cursor_test.rb +0 -683
  387. data/test/functional/db_api_test.rb +0 -835
  388. data/test/functional/db_test.rb +0 -348
  389. data/test/functional/grid_file_system_test.rb +0 -285
  390. data/test/functional/grid_io_test.rb +0 -252
  391. data/test/functional/grid_test.rb +0 -273
  392. data/test/functional/pool_test.rb +0 -136
  393. data/test/functional/safe_test.rb +0 -98
  394. data/test/functional/support_test.rb +0 -62
  395. data/test/functional/timeout_test.rb +0 -60
  396. data/test/functional/uri_test.rb +0 -446
  397. data/test/functional/write_concern_test.rb +0 -118
  398. data/test/helpers/general.rb +0 -50
  399. data/test/helpers/test_unit.rb +0 -476
  400. data/test/replica_set/authentication_test.rb +0 -37
  401. data/test/replica_set/basic_test.rb +0 -189
  402. data/test/replica_set/client_test.rb +0 -393
  403. data/test/replica_set/connection_test.rb +0 -138
  404. data/test/replica_set/count_test.rb +0 -66
  405. data/test/replica_set/cursor_test.rb +0 -220
  406. data/test/replica_set/insert_test.rb +0 -157
  407. data/test/replica_set/max_values_test.rb +0 -151
  408. data/test/replica_set/pinning_test.rb +0 -105
  409. data/test/replica_set/query_test.rb +0 -73
  410. data/test/replica_set/read_preference_test.rb +0 -219
  411. data/test/replica_set/refresh_test.rb +0 -211
  412. data/test/replica_set/replication_ack_test.rb +0 -95
  413. data/test/sharded_cluster/basic_test.rb +0 -203
  414. data/test/shared/authentication/basic_auth_shared.rb +0 -260
  415. data/test/shared/authentication/bulk_api_auth_shared.rb +0 -249
  416. data/test/shared/authentication/gssapi_shared.rb +0 -176
  417. data/test/shared/authentication/sasl_plain_shared.rb +0 -96
  418. data/test/shared/authentication/scram_shared.rb +0 -92
  419. data/test/shared/ssl_shared.rb +0 -235
  420. data/test/test_helper.rb +0 -61
  421. data/test/threading/basic_test.rb +0 -120
  422. data/test/tools/mongo_config.rb +0 -708
  423. data/test/tools/mongo_config_test.rb +0 -160
  424. data/test/unit/client_test.rb +0 -381
  425. data/test/unit/collection_test.rb +0 -166
  426. data/test/unit/connection_test.rb +0 -335
  427. data/test/unit/cursor_test.rb +0 -307
  428. data/test/unit/db_test.rb +0 -136
  429. data/test/unit/grid_test.rb +0 -76
  430. data/test/unit/mongo_sharded_client_test.rb +0 -48
  431. data/test/unit/node_test.rb +0 -93
  432. data/test/unit/pool_manager_test.rb +0 -111
  433. data/test/unit/read_pref_test.rb +0 -406
  434. data/test/unit/read_test.rb +0 -159
  435. data/test/unit/safe_test.rb +0 -158
  436. data/test/unit/sharding_pool_manager_test.rb +0 -84
  437. data/test/unit/write_concern_test.rb +0 -175
@@ -0,0 +1,72 @@
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
+ module Mongo
16
+ module Protocol
17
+
18
+ # The MongoDB wire protocol message representing a reply
19
+ #
20
+ # @example
21
+ # socket = TCPSocket.new('localhost', 27017)
22
+ # query = Protocol::Query.new('xgen', 'users', {:name => 'Tyler'})
23
+ # socket.write(query)
24
+ # reply = Protocol::Reply::deserialize(socket)
25
+ #
26
+ # @api semipublic
27
+ class Reply < Message
28
+
29
+ private
30
+
31
+ # The operation code required to specify a Reply message.
32
+ # @return [Fixnum] the operation code.
33
+ def op_code
34
+ 1
35
+ end
36
+
37
+ # Available flags for a Reply message.
38
+ FLAGS = [
39
+ :cursor_not_found,
40
+ :query_failure,
41
+ :shard_config_stale,
42
+ :await_capable
43
+ ]
44
+
45
+ public
46
+
47
+ # @!attribute
48
+ # @return [Array<Symbol>] The flags for this reply.
49
+ #
50
+ # Supported flags: +:cursor_not_found+, +:query_failure+,
51
+ # +:shard_config_stale+, +:await_capable+
52
+ field :flags, BitVector.new(FLAGS)
53
+
54
+ # @!attribute
55
+ # @return [Fixnum] The cursor id for this response. Will be zero
56
+ # if there are no additional results.
57
+ field :cursor_id, Int64
58
+
59
+ # @!attribute
60
+ # @return [Fixnum] The starting position of the cursor for this Reply.
61
+ field :starting_from, Int32
62
+
63
+ # @!attribute
64
+ # @return [Fixnum] Number of documents in this Reply.
65
+ field :number_returned, Int32
66
+
67
+ # @!attribute
68
+ # @return [Array<Hash>] The documents in this Reply.
69
+ field :documents, Document, :@number_returned
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,180 @@
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
+ module Mongo
16
+ module Protocol
17
+
18
+ # Container for various serialization strategies
19
+ #
20
+ # Each strategy must have a serialization method named +serailize+
21
+ # and a deserialization method named +deserialize+
22
+ #
23
+ # Serialize methods must take buffer and value arguements and
24
+ # serialize the value into the buffer
25
+ #
26
+ # Deserialize methods must take an IO stream argument and
27
+ # deserialize the value from the stream of bytes
28
+ #
29
+ # @api private
30
+ module Serializers
31
+
32
+ private
33
+
34
+ ZERO = 0.freeze
35
+ NULL = 0.chr.freeze
36
+ INT32_PACK = 'l<'.freeze
37
+ INT64_PACK = 'q<'.freeze
38
+ HEADER_PACK = 'l<l<l<l<'.freeze
39
+
40
+ # MongoDB wire protocol serialization strategy for message headers.
41
+ #
42
+ # Serializes and de-serializes four 32-bit integers consisting
43
+ # of the length of the message, the request id, the response id,
44
+ # and the op code for the operation.
45
+ module Header
46
+
47
+ # Serializes the header value into the buffer
48
+ #
49
+ # @param buffer [String] Buffer to receive the serialized value.
50
+ # @param value [String] Header value to be serialized.
51
+ # @return [String] Buffer with serialized value.
52
+ def self.serialize(buffer, value)
53
+ buffer << value.pack(HEADER_PACK)
54
+ end
55
+
56
+ # Deserializes the header value from the IO stream
57
+ #
58
+ # @param io [IO] IO stream containing the message header.
59
+ # @return [Array<Fixnum>] Array consisting of the deserialized
60
+ # length, request id, response id, and op code.
61
+ def self.deserialize(io)
62
+ io.read(16).unpack(HEADER_PACK)
63
+ end
64
+ end
65
+
66
+ # MongoDB wire protocol serialization strategy for C style strings.
67
+ #
68
+ # Serializes and de-serializes C style strings (null terminated).
69
+ module CString
70
+
71
+ # Serializes a C style string into the buffer
72
+ #
73
+ # @param buffer [String] Buffer to receive the serialized CString.
74
+ # @param value [String] The string to be serialized.
75
+ # @return [String] Buffer with serialized value.
76
+ def self.serialize(buffer, value)
77
+ buffer << value
78
+ buffer << NULL
79
+ end
80
+ end
81
+
82
+ # MongoDB wire protocol serialization strategy for 32-bit Zero.
83
+ #
84
+ # Serializes and de-serializes one 32-bit Zero.
85
+ module Zero
86
+
87
+ # Serializes a 32-bit Zero into the buffer
88
+ #
89
+ # @param buffer [String] Buffer to receive the serialized Zero.
90
+ # @param value [Fixnum] Ignored value.
91
+ # @return [String] Buffer with serialized value.
92
+ def self.serialize(buffer, value)
93
+ buffer << [ZERO].pack(INT32_PACK)
94
+ end
95
+ end
96
+
97
+ # MongoDB wire protocol serialization strategy for 32-bit integers.
98
+ #
99
+ # Serializes and de-serializes one 32-bit integer.
100
+ module Int32
101
+
102
+ # Serializes a fixnum to a 4-byte 32-bit integer
103
+ #
104
+ # @param buffer [String] Buffer to receive the serialized Int32.
105
+ # @param value [Fixnum] 32-bit integer to be serialized.
106
+ # @return [String] Buffer with serialized value.
107
+ def self.serialize(buffer, value)
108
+ buffer << [value].pack(INT32_PACK)
109
+ end
110
+
111
+ # Deserializes a 32-bit Fixnum from the IO stream
112
+ #
113
+ # @param io [IO] IO stream containing the 32-bit integer
114
+ # @return [Fixnum] Deserialized Int32
115
+ def self.deserialize(io)
116
+ io.read(4).unpack(INT32_PACK).first
117
+ end
118
+ end
119
+
120
+ # MongoDB wire protocol serialization strategy for 64-bit integers.
121
+ #
122
+ # Serializes and de-serializes one 64-bit integer.
123
+ module Int64
124
+
125
+ # Serializes a fixnum to an 8-byte 64-bit integer
126
+ #
127
+ # @param buffer [String] Buffer to receive the serialized Int64.
128
+ # @param value [Fixnum] 64-bit integer to be serialized.
129
+ # @return [String] Buffer with serialized value.
130
+ def self.serialize(buffer, value)
131
+ buffer << [value].pack(INT64_PACK)
132
+ end
133
+
134
+ # Deserializes a 64-bit Fixnum from the IO stream
135
+ #
136
+ # @param io [IO] IO stream containing the 64-bit integer.
137
+ # @return [Fixnum] Deserialized Int64.
138
+ def self.deserialize(io)
139
+ io.read(8).unpack(INT64_PACK).first
140
+ end
141
+ end
142
+
143
+ # MongoDB wire protocol serialization strategy for a BSON Document.
144
+ #
145
+ # Serializes and de-serializes a single document.
146
+ module Document
147
+
148
+ # Serializes a document into the buffer
149
+ #
150
+ # @param buffer [String] Buffer to receive the BSON encoded document.
151
+ # @param value [Hash] Document to serialize as BSON.
152
+ # @return [String] Buffer with serialized value.
153
+ def self.serialize(buffer, value, max_bson_size = nil)
154
+ start_size = buffer.size
155
+ value.to_bson(buffer)
156
+ if max_bson_size && buffer.size - start_size > max_bson_size
157
+ raise Error::MaxBSONSize.new(max_bson_size)
158
+ end
159
+ end
160
+
161
+ # Deserializes a document from the IO stream
162
+ #
163
+ # @param io [IO] IO stream containing the BSON encoded document.
164
+ # @return [Hash] The decoded BSON document.
165
+ def self.deserialize(io)
166
+ BSON::Document.from_bson(io)
167
+ end
168
+
169
+ # Whether there can be a size limit on this type after serialization.
170
+ #
171
+ # @return [ true ] Documents can be size limited upon serialization.
172
+ #
173
+ # @since 2.0.0
174
+ def self.size_limited?
175
+ true
176
+ end
177
+ end
178
+ end
179
+ end
180
+ end
@@ -0,0 +1,111 @@
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
+ module Mongo
16
+ module Protocol
17
+
18
+ # MongoDB Wire protocol Update message.
19
+ #
20
+ # This is a client request message that is sent to the server in order
21
+ # to update documents matching the provided query.
22
+ #
23
+ # The default is to update a single document. In order to update many at
24
+ # a time users should set the +:multi_update+ flag for the update.
25
+ #
26
+ # If an upsert (update or insert) is desired, users can set the +:upsert+
27
+ # flag in order to indicate they would like to insert the merged selector
28
+ # and update if no document matching the update query currently exists.
29
+ #
30
+ # @api semipublic
31
+ class Update < Message
32
+
33
+ # Creates a new Update message
34
+ #
35
+ # @example Update single document
36
+ # Update.new('xgen', 'users', {:name => 'Tyler'}, {:name => 'Bob'})
37
+ #
38
+ # @example Perform a multi update
39
+ # Update.new('xgen', 'users',
40
+ # {:age => 20}, {:age => 21}, :flags => [:multi_update])
41
+ #
42
+ # @example Perform an upsert
43
+ # Update.new('xgen', 'users', {:name => 'Tyler'}, :flags => [:upsert])
44
+ #
45
+ # @param database [String, Symbol] The database to update.
46
+ # @param collection [String, Symbol] The collection to update.
47
+ # @param selector [Hash] The update selector.
48
+ # @param update [Hash] The update to perform.
49
+ # @param options [Hash] The additional query options.
50
+ #
51
+ # @option options :flags [Array] The flags for the update message.
52
+ #
53
+ # Supported flags: +:upsert+, +:multi_update+
54
+ def initialize(database, collection, selector, update, options = {})
55
+ @namespace = "#{database}.#{collection}"
56
+ @selector = selector
57
+ @update = update
58
+ @flags = options[:flags] || []
59
+ end
60
+
61
+ # The log message for an update operation.
62
+ #
63
+ # @example Get the log message.
64
+ # update.log_message
65
+ #
66
+ # @return [ String ] The log message
67
+ #
68
+ # @since 2.0.0
69
+ def log_message
70
+ fields = []
71
+ fields << ["%s |", "UPDATE"]
72
+ fields << ["namespace=%s", namespace]
73
+ fields << ["selector=%s", selector.inspect]
74
+ fields << ["udpdate=%s", update.inspect]
75
+ fields << ["flags=%s", flags.inspect]
76
+ f, v = fields.transpose
77
+ f.join(" ") % v
78
+ end
79
+
80
+ private
81
+
82
+ # The operation code required to specify an Update message.
83
+ # @return [Fixnum] the operation code.
84
+ def op_code
85
+ 2001
86
+ end
87
+
88
+ # Available flags for an Update message.
89
+ FLAGS = [:upsert, :multi_update]
90
+
91
+ # Field representing Zero encoded as an Int32.
92
+ field :zero, Zero
93
+
94
+ # @!attribute
95
+ # @return [String] The namespace for this Update message.
96
+ field :namespace, CString
97
+
98
+ # @!attribute
99
+ # @return [Array<Symbol>] The flags for this Update message.
100
+ field :flags, BitVector.new(FLAGS)
101
+
102
+ # @!attribute
103
+ # @return [Hash] The selector for this Update message.
104
+ field :selector, Document
105
+
106
+ # @!attribute
107
+ # @return [Hash] The update for this Delete message.
108
+ field :update, Document
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,163 @@
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
+ require 'mongo/server/connectable'
16
+ require 'mongo/server/connection'
17
+ require 'mongo/server/connection_pool'
18
+ require 'mongo/server/context'
19
+ require 'mongo/server/description'
20
+ require 'mongo/server/monitor'
21
+
22
+ module Mongo
23
+
24
+ # Represents a single server on the server side that can be standalone, part of
25
+ # a replica set, or a mongos.
26
+ #
27
+ # @since 2.0.0
28
+ class Server
29
+ extend Forwardable
30
+
31
+ # @return [ String ] The configured address for the server.
32
+ attr_reader :address
33
+
34
+ # @return [ Monitor ] monitor The server monitor.
35
+ attr_reader :monitor
36
+
37
+ # @return [ Hash ] The options hash.
38
+ attr_reader :options
39
+
40
+ # Get the description from the monitor and scan on monitor.
41
+ def_delegators :monitor, :description, :scan!
42
+
43
+ # Delegate convenience methods to the monitor description.
44
+ def_delegators :description,
45
+ :arbiter?,
46
+ :features,
47
+ :ghost?,
48
+ :max_wire_version,
49
+ :max_write_batch_size,
50
+ :max_bson_object_size,
51
+ :max_message_size,
52
+ :tags,
53
+ :average_round_trip_time,
54
+ :mongos?,
55
+ :other?,
56
+ :primary?,
57
+ :replica_set_name,
58
+ :secondary?,
59
+ :standalone?,
60
+ :unknown?
61
+
62
+ # Is this server equal to another?
63
+ #
64
+ # @example Is the server equal to the other?
65
+ # server == other
66
+ #
67
+ # @param [ Object ] other The object to compare to.
68
+ #
69
+ # @return [ true, false ] If the servers are equal.
70
+ #
71
+ # @since 2.0.0
72
+ def ==(other)
73
+ return false unless other.is_a?(Server)
74
+ address == other.address
75
+ end
76
+
77
+ # Get a new context for this server in which to send messages.
78
+ #
79
+ # @example Get the server context.
80
+ # server.context
81
+ #
82
+ # @return [ Mongo::Server::Context ] The server context.
83
+ #
84
+ # @since 2.0.0
85
+ def context
86
+ Context.new(self)
87
+ end
88
+
89
+ # Disconnect the server from the connection.
90
+ #
91
+ # @example Disconnect the server.
92
+ # server.disconnect!
93
+ #
94
+ # @return [ true ] Always tru with no exception.
95
+ #
96
+ # @since 2.0.0
97
+ def disconnect!
98
+ context.with_connection do |connection|
99
+ connection.disconnect!
100
+ end
101
+ monitor.stop! and true
102
+ end
103
+
104
+ # Instantiate a new server object. Will start the background refresh and
105
+ # subscribe to the appropriate events.
106
+ #
107
+ # @example Initialize the server.
108
+ # Mongo::Server.new('127.0.0.1:27017', listeners)
109
+ #
110
+ # @param [ Address ] address The host:port address to connect to.
111
+ # @param [ Event::Listeners ] event_listeners The event listeners.
112
+ # @param [ Hash ] options The server options.
113
+ #
114
+ # @since 2.0.0
115
+ def initialize(address, event_listeners, options = {})
116
+ @address = address
117
+ @options = options.freeze
118
+ @monitor = Monitor.new(address, event_listeners, options)
119
+ monitor.scan!
120
+ monitor.run!
121
+ end
122
+
123
+ # Get a pretty printed server inspection.
124
+ #
125
+ # @example Get the server inspection.
126
+ # server.inspec
127
+ #
128
+ # @return [ String ] The nice inspection string.
129
+ #
130
+ # @since 2.0.0
131
+ def inspect
132
+ "#<Mongo::Server:0x#{object_id} address=#{address.host}:#{address.port}>"
133
+ end
134
+
135
+ # Get the connection pool for this server.
136
+ #
137
+ # @example Get the connection pool for the server.
138
+ # server.pool
139
+ #
140
+ # @return [ Mongo::Pool ] The connection pool.
141
+ #
142
+ # @since 2.0.0
143
+ def pool
144
+ @pool ||= ConnectionPool.get(self)
145
+ end
146
+
147
+ # Determine if the provided tags are a subset of the server's tags.
148
+ #
149
+ # @example Are the provided tags a subset of the server's tags.
150
+ # server.matches_tag_set?({ 'rack' => 'a', 'dc' => 'nyc' })
151
+ #
152
+ # @param [ Hash ] The tag set to compare to the server's tags.
153
+ #
154
+ # @return [ true, false ] If the provided tags are a subset of the server's tags.
155
+ #
156
+ # @since 2.0.0
157
+ def matches_tag_set?(tag_set)
158
+ tag_set.keys.all? do |k|
159
+ tags[k] && tags[k] == tag_set[k]
160
+ end
161
+ end
162
+ end
163
+ end