mongo_client.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. from .database import Database
  2. from .helpers import parse_dbase_from_uri
  3. import itertools
  4. from mongomock import ConfigurationError
  5. class MongoClient(object):
  6. HOST = 'localhost'
  7. PORT = 27017
  8. _CONNECTION_ID = itertools.count()
  9. def __init__(self, host=None, port=None, document_class=dict,
  10. tz_aware=False, connect=True, **kwargs):
  11. if host:
  12. self.host = host[0] if isinstance(host, (list, tuple)) else host
  13. else:
  14. self.host = self.HOST
  15. self.port = port or self.PORT
  16. self._tz_aware = tz_aware
  17. self._databases = {}
  18. self._id = next(self._CONNECTION_ID)
  19. self._document_class = document_class
  20. dbase = None
  21. if "://" in self.host:
  22. dbase = parse_dbase_from_uri(self.host)
  23. self.__default_datebase_name = dbase
  24. def __getitem__(self, db_name):
  25. return self.get_database(db_name)
  26. def __getattr__(self, attr):
  27. return self[attr]
  28. def __repr__(self):
  29. return "mongomock.MongoClient('{0}', {1})".format(self.host, self.port)
  30. def close(self):
  31. pass
  32. @property
  33. def is_mongos(self):
  34. return True
  35. @property
  36. def is_primary(self):
  37. return True
  38. @property
  39. def address(self):
  40. return self.host, self.port
  41. def server_info(self):
  42. return {
  43. "version": "3.0.0",
  44. "sysInfo": "Mock",
  45. "versionArray": [3, 0, 0, 0],
  46. "bits": 64,
  47. "debug": False,
  48. "maxBsonObjectSize": 16777216,
  49. "ok": 1
  50. }
  51. def database_names(self):
  52. return list(self._databases.keys())
  53. def drop_database(self, name_or_db):
  54. def drop_collections_for_db(_db):
  55. for col_name in _db.collection_names():
  56. _db.drop_collection(col_name)
  57. if isinstance(name_or_db, Database):
  58. db = next(db for db in self._databases.values() if db is name_or_db)
  59. if db:
  60. drop_collections_for_db(db)
  61. elif name_or_db in self._databases:
  62. db = self._databases[name_or_db]
  63. drop_collections_for_db(db)
  64. def get_database(self, name=None, codec_options=None, read_preference=None,
  65. write_concern=None):
  66. if name is None:
  67. return self.get_default_database()
  68. db = self._databases.get(name)
  69. if db is None:
  70. db = self._databases[name] = Database(self, name)
  71. return db
  72. def get_default_database(self):
  73. if self.__default_datebase_name is None:
  74. raise ConfigurationError('No default database defined')
  75. return self[self.__default_datebase_name]
  76. def alive(self):
  77. """The original MongoConnection.alive method checks the status of the server.
  78. In our case as we mock the actual server, we should always return True.
  79. """
  80. return True