# Copyright 2022 The PDFium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Utilities for working with the PDFium tree's root directory.""" import os import sys class RootDirectoryFinder: """Finds the PDFium tree's root directories. The implementation expects that either: 1. PDFium is a standalone checkout. 2. PDFium is part of another tree within a "third_party/pdfium" directory. Attributes: pdfium_root: The path to the root of the PDFium tree. source_root: The path to the root of the source tree. May differ from `pdfium_root` if PDFium is a third-party dependency in another tree. """ def __init__(self): # Expect `self_dir` to be ".../testing/tools". self_dir = os.path.dirname(os.path.realpath(__file__)) self.pdfium_root = _remove_path_suffix(self_dir, ('testing', 'tools')) if not self.pdfium_root: raise Exception('Cannot find testing/tools within PDFium root directory') # In a Chromium checkout, expect `self.pdfium_root` to be # ".../third_party/pdfium". self.source_root = _remove_path_suffix(self.pdfium_root, ('third_party', 'pdfium')) if not self.source_root: self.source_root = self.pdfium_root def _remove_path_suffix(path, expected_suffix): for expected_part in reversed(expected_suffix): if os.path.basename(path) != expected_part: return None path = os.path.dirname(path) return path def add_source_directory_to_import_path(source_directory_path): """Adds a source root-relative directory to end of the import path.""" root_finder = RootDirectoryFinder() path = os.path.realpath( os.path.join(root_finder.source_root, source_directory_path)) if path not in sys.path: sys.path.append(path)