mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 23:21:29 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			68 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			68 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import re
 | 
						|
import textwrap
 | 
						|
import email.message
 | 
						|
 | 
						|
from ._text import FoldedCase
 | 
						|
 | 
						|
 | 
						|
class Message(email.message.Message):
 | 
						|
    multiple_use_keys = set(
 | 
						|
        map(
 | 
						|
            FoldedCase,
 | 
						|
            [
 | 
						|
                'Classifier',
 | 
						|
                'Obsoletes-Dist',
 | 
						|
                'Platform',
 | 
						|
                'Project-URL',
 | 
						|
                'Provides-Dist',
 | 
						|
                'Provides-Extra',
 | 
						|
                'Requires-Dist',
 | 
						|
                'Requires-External',
 | 
						|
                'Supported-Platform',
 | 
						|
                'Dynamic',
 | 
						|
            ],
 | 
						|
        )
 | 
						|
    )
 | 
						|
    """
 | 
						|
    Keys that may be indicated multiple times per PEP 566.
 | 
						|
    """
 | 
						|
 | 
						|
    def __new__(cls, orig: email.message.Message):
 | 
						|
        res = super().__new__(cls)
 | 
						|
        vars(res).update(vars(orig))
 | 
						|
        return res
 | 
						|
 | 
						|
    def __init__(self, *args, **kwargs):
 | 
						|
        self._headers = self._repair_headers()
 | 
						|
 | 
						|
    # suppress spurious error from mypy
 | 
						|
    def __iter__(self):
 | 
						|
        return super().__iter__()
 | 
						|
 | 
						|
    def _repair_headers(self):
 | 
						|
        def redent(value):
 | 
						|
            "Correct for RFC822 indentation"
 | 
						|
            if not value or '\n' not in value:
 | 
						|
                return value
 | 
						|
            return textwrap.dedent(' ' * 8 + value)
 | 
						|
 | 
						|
        headers = [(key, redent(value)) for key, value in vars(self)['_headers']]
 | 
						|
        if self._payload:
 | 
						|
            headers.append(('Description', self.get_payload()))
 | 
						|
        return headers
 | 
						|
 | 
						|
    @property
 | 
						|
    def json(self):
 | 
						|
        """
 | 
						|
        Convert PackageMetadata to a JSON-compatible format
 | 
						|
        per PEP 0566.
 | 
						|
        """
 | 
						|
 | 
						|
        def transform(key):
 | 
						|
            value = self.get_all(key) if key in self.multiple_use_keys else self[key]
 | 
						|
            if key == 'Keywords':
 | 
						|
                value = re.split(r'\s+', value)
 | 
						|
            tk = key.lower().replace('-', '_')
 | 
						|
            return tk, value
 | 
						|
 | 
						|
        return dict(map(transform, map(FoldedCase, self)))
 |