#!/usr/bin/python3 # -*- coding: utf-8 -*- # graph.py file is part of slpkg. # Copyright 2014-2020 Dimitris Zlatanidis # All rights reserved. # Slpkg is a user-friendly package manager for Slackware installations # https://gitlab.com/dslackw/slpkg # Slpkg is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . import os import subprocess # class ImportErrorGraphEasy(Exception): # def __init__(self, GraphEasyImportError): # Exception.__init__(self, "graph-easy required") # self.GraphEasyImportError = GraphEasyImportError class Graph: """Drawing dependencies diagram """ def __init__(self, image): self.image = image self.file_format = [ ".bmp", ".canon", ".cmap", ".cmapx", ".cmapx_np", ".dot", ".eps", ".fig", ".gd", ".gd2", ".gif", ".gtk", ".gv", ".ico", ".imap", ".imap_np", ".ismap", ".jpe", ".jpeg", ".jpg", ".pdf", ".pic", ".plain", ".plain-ext", ".png", ".pov", ".ps", ".ps2", ".svg", ".svgz", ".tif", ".tiff", ".tk", ".vml", ".vmlz", ".vrml", ".wbmp", ".x11", ".xdot", ".xlib" ] def dependencies(self, deps_dict): """Generate graph file with depenndencies map tree """ try: import pygraphviz as pgv except ImportError: if self.image == "ascii" and not os.path.isfile("/usr/bin/graph-easy"): print("Require 'grap_easy': Install with 'slpkg -s sbo graph-easy'") else: print("Require 'pygraphviz: Install with 'slpkg -s sbo pygraphviz'") raise SystemExit() if self.image != "ascii": self.check_file() try: G = pgv.AGraph(deps_dict) G.layout(prog="fdp") if self.image == "ascii": G.write(f"{self.image}.dot") self.graph_easy() G.draw(self.image) except IOError: raise SystemExit() if os.path.isfile(self.image): print(f"Graph image file '{self.image}' created") raise SystemExit() def check_file(self): """Check for file format and type """ try: image_type = f".{self.image.split('.')[1]}" if image_type not in self.file_format: print(f"Format: '{self.image.split('.')[1]}' not recognized." f" Use one of them:\n{', '.join(self.file_format)}") raise SystemExit() except IndexError: print("slpkg: Error: Image file suffix missing") raise SystemExit() def graph_easy(self): """Draw ascii diagram. graph-easy perl module require """ if not os.path.isfile("/usr/bin/graph-easy"): print("Require 'graph-easy': Install with 'slpkg -s sbo" " graph-easy'") self.remove_dot() raise SystemExit() subprocess.call(f"graph-easy {self.image}.dot", shell=True) self.remove_dot() raise SystemExit() def remove_dot(self): """Remove .dot files """ if os.path.isfile(f"{self.image}.dot"): os.remove(f"{self.image}.dot")