MongoEngine dependency provider for Nameko microservice framework.
pip install nameko-mongoengine
The basic usage of the dependency provider is shown:
from mongoengine import Document, fields
from nameko_mongoengine import MongoEngine
from nameko.rpc import rpc
class MyModel(Document):
"""
My document model
"""
info = fields.StringField(required=True)
class MockService:
name = "mock_service"
engine = MongoEngine()
@rpc
def write(self, info):
model = MyModel()
model.info = info
model.save()
return model
@rpc
def read(self, _id):
return MyModel.objects.get(id=_id)
The dependency engine
exposes standard pymongo
interface to database connections. The default connection can be accessed by the db
property:
class MockService:
name = "mock_service"
engine = MongoEngine()
@rpc
def get(self, _id):
return self.engine.db.your_collection.find_one({'_id': _id})
Other database connections defined by MongoEngine
aliases can be accessed by:
@rpc
def get(self, _id):
db = self.engine.with_alias("your_alias").db
return db.your_collection.find_one({'_id': _id})
See full example for more details.
The dependency configurations can be set in nameko config.yaml
file, or by environment variables.
MONGODB_URI: mongodb://localhost:27017/dbname?replicaSet=replset
# or
# ---- with aliases
MONGODB_URI:
default: mongodb://localhost:27017/dbname?replicaSet=replset
"<alias>": "<uri>"
MONGODB_URI='mongodb://localhost:27017/dbname?replicaSet=replset'
# or
# ---- with aliases
MONGODB_URI='{"default": "mongodb://localhost:27017/dbname?replicaSet=replset", "<alias>": "<uri>"}'
To perform development tasks and run tests run:
$ pip install -e .[dev] # to install all dependencies
$ docker run -d --restart=always --name some-rabbit -p 5672:5672 -p 15672:15672 rabbitmq:3-management # Run rabbitmq-management server
$ docker run --rm -d -p 27017:27017 mongo # Run mongodb server on docker
$ pytest --cov=nameko_mongoengine tests/ # to get coverage report
$ pylint nameko_mongoengine # to check code quality with PyLint
Optionally you can use make
.
Pull requests always welcomed. Thanks!