Compose your business logic into commands that sanitize and validate input.
$ pip install mutations
- Subclass
mutations.Mutation
- Define your inputs.
- Define an
execute
method in your command. - Run it, like this:
SimpleMutation.run(foo='bar')
To learn more, see this blog post.
import mutations
class UserSignup(mutations.Mutation):
"""Define the inputs to your mutation here. """
email = mutations.fields.CharField(required=True)
full_name = mutations.fields.CharField(required=True)
send_welcome_email = mutations.fields.Boolean(required=False, default=True)
def validate_email_address(self):
"""Custom validation for a field.
If you encounter any validation errors and want to raise, you should
raise mutation.ValidationError or some sublcass thereof. Otherwise, it
assumes there were no problems.
Any function beginning with `validate_` is assumed to be a validator
function and will be run before the mutation can execute.
"""
if not self.email.is_valid():
raise mutations.ValidationError("email_not_valid", "Email is not valid.")
def execute(self):
"""Executes the mutation.
This method does the heavy lifting. You can call it by calling .run() on
your mutation class.
"""
user = User.objects.create(email=self.email, name=self.full_name)
if self.send_welcome_email:
EmailServer.deliver(recipient = self.email)
return user
>>> result = UserSignup.run(email=email, full_name="Bob Boblob")
>>> result.success
True
>>> result.return_value
<User id=...>
>>> result.errors
result = ...
>>> result = UserSignup.run(email=None)
>>> result.success
False
>>> result.errors
mutations.ErrorDict({
'email': ['email_not_valid']
})
>>> result.value
None
>>> result = UserSignup.validate(email=email, full_name="Bob Boblob")
>>> result.is_valid
True
$ make tests
When you're ready to do a release, please make sure tests pass across both 2.7 and 3.6 by running tox:
$ tox
This project uses Semantic Versioning.
Thanks to Cypriss for the excellent Ruby Mutations Gem. I created this library because I was looking for something similar for Python.