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.]"
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="")
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)
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