示例#1
0
def generate_preview(filepath: str, max_size: int = 390) -> str:
    """Generate a human readable text preview.

    For text files, the preview will be the first `max_size` characters.
    For other file types the preview is not implemented.
    :param filepath: full/path/to/file (with extension or without it)
    :param max_size:
    For CLI.
    The number of characters for viewing by default depends on the terminal width settings
    and can be changed with the -ps or -preview-size argument.
    :return: a string with the text preview (without newline characters).
    If the preview is not available for the file, it returns an information message.
    """
    extension = get_file_extension(filepath, case_sensitive=False).lower()

    if extension in SUPPORTED_TYPES['text']:
        excerpt = generic_text_preview(filepath, max_size)
        if excerpt:
            # return excerpt or error string
            return f"{excerpt}"
        else:
            return "[This file can be empty.]"
    else:
        # skip the extension if it is not supported
        return "[A preview of this file type is not yet implemented.]"
示例#2
0
 def count_file_extensions(files: Iterable[str], no_feedback: bool = no_feedback):
     for f in files:
         extension = get_file_extension(f, case_sensitive=case_sensitive)
         if extension == '.':
             extension = '[no extension]'
         counters[extension] += 1
         if not no_feedback:
             print("\r" + os.path.basename(f)[:TERM_WIDTH - 1].ljust(TERM_WIDTH - 1), end="")
示例#3
0
    def test_get_file_extension(self):
        """Testing def get_file_extension.

        Extract only the file extension from a given path.
        Expected behavior: return extension name (txt, py) or '.' (for files without extension)
        :return:
        """
        extensions_dict = {'file.py': 'py', '.gitignore': '.', 'image.JPG': 'JPG',
                           'file': '.', '.hidden_file.txt': 'txt',
                           '.hidden.file.txt': 'txt', 'select2.3805311d5fc1.css.gz': 'gz'
                           }
        for k, v in extensions_dict.items():
            with self.subTest(k=k, v=v):
                self.assertEqual(get_file_extension(k, case_sensitive=True), v)
示例#4
0
    def search_files(self, dirpath: str, extension: str, recursive: bool = True,
                     include_hidden: bool = False, case_sensitive: bool = False) -> Iterable[str]:
        """Find all files in a given directory with and without the extension.

        :param dirpath: full/path/to/folder
        :param extension: extension name (txt, py), '.'(without extension) or '..' (all extensions)
        :param recursive: True(default) or False
        :param include_hidden: False -> exclude hidden, True -> include hidden, counting all files
        :param case_sensitive: False -> ignore case in extensions,
        True -> distinguish case variations in extensions
        :return: object <class 'generator'> with full paths to all found files
        """
        # this part used for -fe .. or -t .. (all extensions)
        if extension == '..':
            for root, dirs, files in os.walk(dirpath):
                for f in files:
                    f_path = os.path.join(root, f)
                    if not os.path.isfile(f_path):
                        continue
                    if include_hidden or not self.is_hidden_file_or_dir(f_path):
                        yield f_path
                if not recursive:
                    break
        # this part used for: -fe . or -fe extension_name, -t . or -t extension_name
        else:
            ext = extension if case_sensitive else extension.upper()
            for root, dirs, files in os.walk(dirpath):
                for f in files:
                    f_path = os.path.join(root, f)
                    f_extension = get_file_extension(f_path, case_sensitive=case_sensitive)
                    if f_extension != ext or not os.path.isfile(f_path):
                        continue
                    if include_hidden or not self.is_hidden_file_or_dir(f_path):
                        yield f_path
                if not recursive:
                    break