mirror of
				https://github.com/encode/django-rest-framework.git
				synced 2025-10-31 16:07:38 +03:00 
			
		
		
		
	Add support for ipaddress objects in JSONEncoder (#9087)
* Add support for ipaddress objects in JSONEncoder
* Update tests/test_encoders.py
* Update assertions to be more explicit
---------
Co-authored-by: Asif Saif Uddin {"Auvi":"অভি"} <auvipy@gmail.com>
Co-authored-by: Bruno Alla <alla.brunoo@gmail.com>
			
			
This commit is contained in:
		
							parent
							
								
									01659c075a
								
							
						
					
					
						commit
						ad0fea04de
					
				|  | @ -5,6 +5,7 @@ Helper classes for parsers. | ||||||
| import contextlib | import contextlib | ||||||
| import datetime | import datetime | ||||||
| import decimal | import decimal | ||||||
|  | import ipaddress | ||||||
| import json  # noqa | import json  # noqa | ||||||
| import uuid | import uuid | ||||||
| 
 | 
 | ||||||
|  | @ -45,6 +46,15 @@ class JSONEncoder(json.JSONEncoder): | ||||||
|             return float(obj) |             return float(obj) | ||||||
|         elif isinstance(obj, uuid.UUID): |         elif isinstance(obj, uuid.UUID): | ||||||
|             return str(obj) |             return str(obj) | ||||||
|  |         elif isinstance(obj, ( | ||||||
|  |             ipaddress.IPv4Address, | ||||||
|  |             ipaddress.IPv6Address, | ||||||
|  |             ipaddress.IPv4Network, | ||||||
|  |             ipaddress.IPv6Network, | ||||||
|  |             ipaddress.IPv4Interface, | ||||||
|  |             ipaddress.IPv6Interface) | ||||||
|  |         ): | ||||||
|  |             return str(obj) | ||||||
|         elif isinstance(obj, QuerySet): |         elif isinstance(obj, QuerySet): | ||||||
|             return tuple(obj) |             return tuple(obj) | ||||||
|         elif isinstance(obj, bytes): |         elif isinstance(obj, bytes): | ||||||
|  |  | ||||||
|  | @ -1,3 +1,4 @@ | ||||||
|  | import ipaddress | ||||||
| from datetime import date, datetime, timedelta, timezone | from datetime import date, datetime, timedelta, timezone | ||||||
| from decimal import Decimal | from decimal import Decimal | ||||||
| from uuid import uuid4 | from uuid import uuid4 | ||||||
|  | @ -78,6 +79,48 @@ class JSONEncoderTests(TestCase): | ||||||
|         unique_id = uuid4() |         unique_id = uuid4() | ||||||
|         assert self.encoder.default(unique_id) == str(unique_id) |         assert self.encoder.default(unique_id) == str(unique_id) | ||||||
| 
 | 
 | ||||||
|  |     def test_encode_ipaddress_ipv4address(self): | ||||||
|  |         """ | ||||||
|  |         Tests encoding ipaddress IPv4Address object | ||||||
|  |         """ | ||||||
|  |         obj = ipaddress.IPv4Address("192.168.1.1") | ||||||
|  |         assert self.encoder.default(obj) == "192.168.1.1" | ||||||
|  | 
 | ||||||
|  |     def test_encode_ipaddress_ipv6address(self): | ||||||
|  |         """ | ||||||
|  |         Tests encoding ipaddress IPv6Address object | ||||||
|  |         """ | ||||||
|  |         obj = ipaddress.IPv6Address("2001:0db8:85a3:0000:0000:8a2e:0370:7334") | ||||||
|  |         assert self.encoder.default(obj) == "2001:db8:85a3::8a2e:370:7334" | ||||||
|  | 
 | ||||||
|  |     def test_encode_ipaddress_ipv4network(self): | ||||||
|  |         """ | ||||||
|  |         Tests encoding ipaddress IPv4Network object | ||||||
|  |         """ | ||||||
|  |         obj = ipaddress.IPv4Network("192.0.2.8/29") | ||||||
|  |         assert self.encoder.default(obj) == "192.0.2.8/29" | ||||||
|  | 
 | ||||||
|  |     def test_encode_ipaddress_ipv6network(self): | ||||||
|  |         """ | ||||||
|  |         Tests encoding ipaddress IPv4Network object | ||||||
|  |         """ | ||||||
|  |         obj = ipaddress.IPv6Network("2001:4860:0000::0000/32") | ||||||
|  |         assert self.encoder.default(obj) == "2001:4860::/32" | ||||||
|  | 
 | ||||||
|  |     def test_encode_ipaddress_ipv4interface(self): | ||||||
|  |         """ | ||||||
|  |         Tests encoding ipaddress IPv4Interface object | ||||||
|  |         """ | ||||||
|  |         obj = ipaddress.IPv4Interface("192.0.2.8/29") | ||||||
|  |         assert self.encoder.default(obj) == "192.0.2.8/29" | ||||||
|  | 
 | ||||||
|  |     def test_encode_ipaddress_ipv6interface(self): | ||||||
|  |         """ | ||||||
|  |         Tests encoding ipaddress IPv4Network object | ||||||
|  |         """ | ||||||
|  |         obj = ipaddress.IPv6Interface("2001:4860:4860::8888/32") | ||||||
|  |         assert self.encoder.default(obj) == "2001:4860:4860::8888/32" | ||||||
|  | 
 | ||||||
|     @pytest.mark.skipif(not coreapi, reason='coreapi is not installed') |     @pytest.mark.skipif(not coreapi, reason='coreapi is not installed') | ||||||
|     def test_encode_coreapi_raises_error(self): |     def test_encode_coreapi_raises_error(self): | ||||||
|         """ |         """ | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user