| # 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) |