From 66edb5be54544af78476514494c85dac84205f2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Mazzucotelli?= Date: Mon, 5 Jun 2017 23:40:36 +0200 Subject: [PATCH] Implement archan provider --- setup.py | 3 +++ src/dependenpy/__init__.py | 4 ++-- src/dependenpy/cli.py | 7 ++---- src/dependenpy/dsm.py | 48 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 55 insertions(+), 7 deletions(-) diff --git a/setup.py b/setup.py index a82e956..02b076e 100644 --- a/setup.py +++ b/setup.py @@ -72,6 +72,9 @@ def read(*names, **kwargs): entry_points={ 'console_scripts': [ 'dependenpy = dependenpy.cli:main', + ], + 'archan': [ + 'dependenpy.ArchanProvider = dependenpy.dsm:ArchanProvider' ] }, ) diff --git a/src/dependenpy/__init__.py b/src/dependenpy/__init__.py index 30f1c1f..9bf4d09 100644 --- a/src/dependenpy/__init__.py +++ b/src/dependenpy/__init__.py @@ -8,8 +8,8 @@ be able to build a dependency matrix and use it for other purposes. """ -from .dsm import DSM, Dependency, Module, Package +from .dsm import ArchanProvider, DSM, Dependency, Module, Package from .structures import Matrix, TreeMap -__all__ = ('DSM', 'Dependency', 'Matrix', 'Module', 'Package', 'TreeMap') +__all__ = ('ArchanProvider', 'DSM', 'Dependency', 'Matrix', 'Module', 'Package', 'TreeMap') __version__ = '3.1.0' diff --git a/src/dependenpy/cli.py b/src/dependenpy/cli.py index ab50d48..5367aa9 100644 --- a/src/dependenpy/cli.py +++ b/src/dependenpy/cli.py @@ -21,7 +21,7 @@ import sys from . import __version__ -from .dsm import DSM +from .dsm import DSM, guess_depth from .printer import CSV, FORMAT, JSON parser = argparse.ArgumentParser( @@ -98,10 +98,7 @@ def main(args=None): # guess convenient depth depth = args.depth if depth is None: - if len(packages) == 1: - depth = packages[0].count('.') + 2 - else: - depth = min(p.count('.') for p in packages) + 1 + depth = guess_depth(packages) # open file if not stdout output = args.output diff --git a/src/dependenpy/dsm.py b/src/dependenpy/dsm.py index f2fa17d..be05473 100644 --- a/src/dependenpy/dsm.py +++ b/src/dependenpy/dsm.py @@ -17,6 +17,13 @@ import sys from os.path import isdir, isfile, join, splitext +try: + from archan import Provider, Argument +except ImportError: + from collections import namedtuple + Provider = object + Argument = lambda *a, **k: None + from .finder import Finder, PackageSpec from .node import LeafNode, NodeMixin, RootNode from .printer import PrintMixin @@ -425,3 +432,44 @@ def __str__(self): def external(self): """Property to tell if the dependency's target is a valid node.""" return isinstance(self.target, str) + + +def guess_depth(packages): + if len(packages) == 1: + return packages[0].count('.') + 2 + return min(p.count('.') for p in packages) + 1 + + +class ArchanProvider(Provider): + name = 'Dependency matrix provider for Archan' + description = 'Provide matrix data about internal dependencies ' \ + 'in a set of packages.' + arguments = ( + Argument('packages', list, 'the list of packages to check for'), + Argument( + 'enforce_init', bool, + ' whether to assert presence of __init__.py files in directories'), + Argument('depth', int, 'the depth of the matrix to generate'), + ) + + def get_dsm(self, packages, enforce_init=True, depth=None): + """ + Provide matrix data about internal dependencies in a set of packages. + + Args: + *packages (list): the list of packages to check for. + enforce_init (bool): + whether to assert presence of __init__.py files in directories. + depth (int): the depth of the matrix to generate. + + Returns: + dict: keys and data in a dictionary (no categories for now). + """ + dsm = DSM(*packages, enforce_init=enforce_init) + if depth is None: + depth = guess_depth(packages) + matrix = dsm.as_matrix(depth=depth) + return { + 'keys': matrix.keys, + 'data': matrix.data + }