# -*- coding: utf-8 -*- # This file is part of pygal # # A python svg graph plotting library # Copyright © 2012-2016 Kozea # # This library is free software: you can redistribute it and/or modify it under # the terms of the GNU Lesser General Public License as published by the Free # Software Foundation, either version 3 of the License, or (at your option) any # later version. # # This library 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 Lesser General Public License for more # details. # # You should have received a copy of the GNU Lesser General Public License # along with pygal. If not, see . """ Main pygal package. This package holds all available charts in pygal, the Config class and the maps extensions namespace module. """ from .__about__ import * # noqa: F401,F403 import pkg_resources import sys import traceback import warnings from pygal.graph.bar import Bar from pygal.graph.box import Box from pygal.graph.dot import Dot from pygal.graph.funnel import Funnel from pygal.graph.gauge import Gauge from pygal.graph.solidgauge import SolidGauge from pygal.graph.histogram import Histogram from pygal.graph.horizontalbar import HorizontalBar from pygal.graph.horizontalstackedbar import HorizontalStackedBar from pygal.graph.line import Line from pygal.graph.horizontalline import HorizontalLine from pygal.graph.horizontalstackedline import HorizontalStackedLine from pygal.graph.pie import Pie from pygal.graph.pyramid import Pyramid, VerticalPyramid from pygal.graph.radar import Radar from pygal.graph.stackedbar import StackedBar from pygal.graph.stackedline import StackedLine from pygal.graph.time import DateLine, DateTimeLine, TimeLine, TimeDeltaLine from pygal.graph.treemap import Treemap from pygal.graph.xy import XY from pygal.graph.graph import Graph from pygal.config import Config from pygal import maps CHARTS_BY_NAME = dict( [(k, v) for k, v in locals().items() if isinstance(v, type) and issubclass(v, Graph) and v != Graph]) from pygal.graph.map import BaseMap for entry in pkg_resources.iter_entry_points('pygal.maps'): try: module = entry.load() except Exception: warnings.warn('Unable to load %s pygal plugin \n\n%s' % ( entry, traceback.format_exc()), Warning) continue setattr(maps, entry.name, module) for k, v in module.__dict__.items(): if isinstance(v, type) and issubclass(v, BaseMap) and v != BaseMap: CHARTS_BY_NAME[entry.name.capitalize() + k + 'Map'] = v CHARTS_NAMES = list(CHARTS_BY_NAME.keys()) CHARTS = list(CHARTS_BY_NAME.values()) class PluginImportFixer(object): """ Allow external map plugins to be imported from pygal.maps package. It is a ``sys.meta_path`` loader. """ def find_module(self, fullname, path=None): """ Tell if the module to load can be loaded by the load_module function, ie: if it is a ``pygal.maps.*`` module. """ if fullname.startswith('pygal.maps.') and hasattr( maps, fullname.split('.')[2]): return self return None def load_module(self, name): """ Load the ``pygal.maps.name`` module from the previously loaded plugin """ if name not in sys.modules: sys.modules[name] = getattr(maps, name.split('.')[2]) return sys.modules[name] sys.meta_path += [PluginImportFixer()]