packagelister.whouses API documentation

# packagelister.whouses

View Source

     1import argparse
     2
     3from pathier import Pathier
     4from printbuddies import ProgBar
     5
     6from packagelister import packagelister
     7
     8
     9def get_args() -> argparse.Namespace:
    10    parser = argparse.ArgumentParser(
    11        prog="whouses",
    12        description=""" Determine what sub-folders in the current directory use the specified package.
    13        Useful for knowing which projects need to be updated when upgrading an installed package.""",
    14    )
    15
    16    parser.add_argument(
    17        "package",
    18        type=str,
    19        help=""" Scan the current working directory for project folders that use this package.""",
    20    )
    21
    22    parser.add_argument(
    23        "-i",
    24        "--ignore",
    25        nargs="*",
    26        default=[],
    27        type=str,
    28        help=""" Ignore these folders. """,
    29    )
    30    args = parser.parse_args()
    31
    32    return args
    33
    34
    35def find(root: Pathier, package: str, ignore: list[str] = []) -> list[str]:
    36    """Find what sub-folders of `root`, excluding those in `ignore`, have files that use `package`."""
    37    package_users = []
    38    scan_fails = {}  # Error message: [projects]
    39    projects = [
    40        path for path in root.iterdir() if path.is_dir() and path.stem not in ignore
    41    ]
    42    num_projects = len(projects)
    43    with ProgBar(num_projects, width_ratio=0.3) as bar:
    44        for project in projects:
    45            try:
    46                if package in packagelister.scan_dir(project, True).packages.names:
    47                    package_users.append(project.stem)
    48            except Exception as e:
    49                err = str(e)
    50                if err not in scan_fails:
    51                    scan_fails[err] = [project]
    52                else:
    53                    scan_fails[err].append(project)
    54            bar.display(suffix=f"Scanning {project.stem}...")
    55    print()
    56    if scan_fails:
    57        print("The following errors occured during the scan:")
    58        for fail in scan_fails:
    59            print(f"ERROR: {fail}:")
    60            print(*scan_fails[fail], sep="\n")
    61            print()
    62    return package_users
    63
    64
    65def main(args: argparse.Namespace | None = None):
    66    if not args:
    67        args = get_args()
    68    package_users = find(
    69        Pathier.cwd(), args.package, [".pytest_cache", "__pycache__"] + args.ignore
    70    )
    71    print(f"The following folders have files that use `{args.package}`:")
    72    print(*package_users, sep="\n")
    73
    74
    75if __name__ == "__main__":
    76    main(get_args())

def get_args() -> argparse.Namespace: View Source

    10def get_args() -> argparse.Namespace:
    11    parser = argparse.ArgumentParser(
    12        prog="whouses",
    13        description=""" Determine what sub-folders in the current directory use the specified package.
    14        Useful for knowing which projects need to be updated when upgrading an installed package.""",
    15    )
    16
    17    parser.add_argument(
    18        "package",
    19        type=str,
    20        help=""" Scan the current working directory for project folders that use this package.""",
    21    )
    22
    23    parser.add_argument(
    24        "-i",
    25        "--ignore",
    26        nargs="*",
    27        default=[],
    28        type=str,
    29        help=""" Ignore these folders. """,
    30    )
    31    args = parser.parse_args()
    32
    33    return args

def find( root: pathier.pathier.Pathier, package: str, ignore: list[str] = []) -> list[str]: View Source

    36def find(root: Pathier, package: str, ignore: list[str] = []) -> list[str]:
    37    """Find what sub-folders of `root`, excluding those in `ignore`, have files that use `package`."""
    38    package_users = []
    39    scan_fails = {}  # Error message: [projects]
    40    projects = [
    41        path for path in root.iterdir() if path.is_dir() and path.stem not in ignore
    42    ]
    43    num_projects = len(projects)
    44    with ProgBar(num_projects, width_ratio=0.3) as bar:
    45        for project in projects:
    46            try:
    47                if package in packagelister.scan_dir(project, True).packages.names:
    48                    package_users.append(project.stem)
    49            except Exception as e:
    50                err = str(e)
    51                if err not in scan_fails:
    52                    scan_fails[err] = [project]
    53                else:
    54                    scan_fails[err].append(project)
    55            bar.display(suffix=f"Scanning {project.stem}...")
    56    print()
    57    if scan_fails:
    58        print("The following errors occured during the scan:")
    59        for fail in scan_fails:
    60            print(f"ERROR: {fail}:")
    61            print(*scan_fails[fail], sep="\n")
    62            print()
    63    return package_users

Find what sub-folders of `root`, excluding those in `ignore`, have files that use `package`.

def main(args: argparse.Namespace | None = None): View Source

    66def main(args: argparse.Namespace | None = None):
    67    if not args:
    68        args = get_args()
    69    package_users = find(
    70        Pathier.cwd(), args.package, [".pytest_cache", "__pycache__"] + args.ignore
    71    )
    72    print(f"The following folders have files that use `{args.package}`:")
    73    print(*package_users, sep="\n")