You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							66 lines
						
					
					
						
							2.1 KiB
						
					
					
				
			
		
		
	
	
							66 lines
						
					
					
						
							2.1 KiB
						
					
					
				# -*- coding: utf-8 -*-
 | 
						|
"""
 | 
						|
    werkzeug.filesystem
 | 
						|
    ~~~~~~~~~~~~~~~~~~~
 | 
						|
 | 
						|
    Various utilities for the local filesystem.
 | 
						|
 | 
						|
    :copyright: (c) 2015 by the Werkzeug Team, see AUTHORS for more details.
 | 
						|
    :license: BSD, see LICENSE for more details.
 | 
						|
"""
 | 
						|
 | 
						|
import codecs
 | 
						|
import sys
 | 
						|
import warnings
 | 
						|
 | 
						|
# We do not trust traditional unixes.
 | 
						|
has_likely_buggy_unicode_filesystem = \
 | 
						|
    sys.platform.startswith('linux') or 'bsd' in sys.platform
 | 
						|
 | 
						|
 | 
						|
def _is_ascii_encoding(encoding):
 | 
						|
    """
 | 
						|
    Given an encoding this figures out if the encoding is actually ASCII (which
 | 
						|
    is something we don't actually want in most cases). This is necessary
 | 
						|
    because ASCII comes under many names such as ANSI_X3.4-1968.
 | 
						|
    """
 | 
						|
    if encoding is None:
 | 
						|
        return False
 | 
						|
    try:
 | 
						|
        return codecs.lookup(encoding).name == 'ascii'
 | 
						|
    except LookupError:
 | 
						|
        return False
 | 
						|
 | 
						|
 | 
						|
class BrokenFilesystemWarning(RuntimeWarning, UnicodeWarning):
 | 
						|
    '''The warning used by Werkzeug to signal a broken filesystem. Will only be
 | 
						|
    used once per runtime.'''
 | 
						|
 | 
						|
 | 
						|
_warned_about_filesystem_encoding = False
 | 
						|
 | 
						|
 | 
						|
def get_filesystem_encoding():
 | 
						|
    """
 | 
						|
    Returns the filesystem encoding that should be used. Note that this is
 | 
						|
    different from the Python understanding of the filesystem encoding which
 | 
						|
    might be deeply flawed. Do not use this value against Python's unicode APIs
 | 
						|
    because it might be different. See :ref:`filesystem-encoding` for the exact
 | 
						|
    behavior.
 | 
						|
 | 
						|
    The concept of a filesystem encoding in generally is not something you
 | 
						|
    should rely on. As such if you ever need to use this function except for
 | 
						|
    writing wrapper code reconsider.
 | 
						|
    """
 | 
						|
    global _warned_about_filesystem_encoding
 | 
						|
    rv = sys.getfilesystemencoding()
 | 
						|
    if has_likely_buggy_unicode_filesystem and not rv \
 | 
						|
       or _is_ascii_encoding(rv):
 | 
						|
        if not _warned_about_filesystem_encoding:
 | 
						|
            warnings.warn(
 | 
						|
                'Detected a misconfigured UNIX filesystem: Will use UTF-8 as '
 | 
						|
                'filesystem encoding instead of {0!r}'.format(rv),
 | 
						|
                BrokenFilesystemWarning)
 | 
						|
            _warned_about_filesystem_encoding = True
 | 
						|
        return 'utf-8'
 | 
						|
    return rv
 | 
						|
 |