Merge pull request #1814 from reaperhulk/keyusage-repr

add repr to KeyUsage
diff --git a/src/cryptography/x509.py b/src/cryptography/x509.py
index 8554aea..a9b6f8b 100644
--- a/src/cryptography/x509.py
+++ b/src/cryptography/x509.py
@@ -348,6 +348,23 @@
         else:
             return self._decipher_only
 
+    def __repr__(self):
+        try:
+            encipher_only = self.encipher_only
+            decipher_only = self.decipher_only
+        except ValueError:
+            encipher_only = "N/A"
+            decipher_only = "N/A"
+
+        return ("<KeyUsage(digital_signature={0.digital_signature}, "
+                "content_commitment={0.content_commitment}, "
+                "key_encipherment={0.key_encipherment}, "
+                "data_encipherment={0.data_encipherment}, "
+                "key_agreement={0.key_agreement}, "
+                "key_cert_sign={0.key_cert_sign}, crl_sign={0.crl_sign}, "
+                "encipher_only={1}, decipher_only={2})>").format(
+                    self, encipher_only, decipher_only)
+
 
 class SubjectKeyIdentifier(object):
     def __init__(self, digest):
diff --git a/tests/test_x509_ext.py b/tests/test_x509_ext.py
index 194b18c..c2d33d9 100644
--- a/tests/test_x509_ext.py
+++ b/tests/test_x509_ext.py
@@ -134,6 +134,44 @@
         with pytest.raises(ValueError):
             ku.decipher_only
 
+    def test_repr_key_agreement_false(self):
+        ku = x509.KeyUsage(
+            digital_signature=True,
+            content_commitment=True,
+            key_encipherment=False,
+            data_encipherment=False,
+            key_agreement=False,
+            key_cert_sign=True,
+            crl_sign=False,
+            encipher_only=False,
+            decipher_only=False
+        )
+        assert repr(ku) == (
+            "<KeyUsage(digital_signature=True, content_commitment=True, key_en"
+            "cipherment=False, data_encipherment=False, key_agreement=False, k"
+            "ey_cert_sign=True, crl_sign=False, encipher_only=N/A, decipher_on"
+            "ly=N/A)>"
+        )
+
+    def test_repr_key_agreement_true(self):
+        ku = x509.KeyUsage(
+            digital_signature=True,
+            content_commitment=True,
+            key_encipherment=False,
+            data_encipherment=False,
+            key_agreement=True,
+            key_cert_sign=True,
+            crl_sign=False,
+            encipher_only=False,
+            decipher_only=False
+        )
+        assert repr(ku) == (
+            "<KeyUsage(digital_signature=True, content_commitment=True, key_en"
+            "cipherment=False, data_encipherment=False, key_agreement=True, k"
+            "ey_cert_sign=True, crl_sign=False, encipher_only=False, decipher_"
+            "only=False)>"
+        )
+
 
 class TestSubjectKeyIdentifier(object):
     def test_properties(self):