File: plugin.py

package info (click to toggle)
vmdb2 0.40-2
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 552 kB
  • sloc: python: 2,578; sh: 151; makefile: 17
file content (56 lines) | stat: -rw-r--r-- 1,687 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# Copyright 2020  Lars Wirzenius
#
# This program 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 <http://www.gnu.org/licenses/>.
#
# =*= License: GPL-3+ =*=


import importlib.util
import os


class Plugin:
    def __init__(self, app):
        self.app = app


def find_plugins(dirname, namesuffix):
    suffix = "_plugin.py"
    filenames = _find_suffixed_files(dirname, suffix)
    plugins = []
    for filename in filenames:
        for c in _classes_in_file(filename, namesuffix):
            plugins.append(c)

    return plugins


def _find_suffixed_files(dirname, suffix):
    return [
        os.path.join(dirname, basename)
        for basename in os.listdir(dirname)
        if basename.endswith(suffix)
    ]


def _classes_in_file(filename, namesuffix):
    module_name = os.path.basename(filename)[: -len(".py")]
    spec = importlib.util.spec_from_file_location(module_name, filename)
    module = importlib.util.module_from_spec(spec)
    spec.loader.exec_module(module)
    classes = []
    for name in dir(module):
        if name.endswith(namesuffix):
            classes.append(module.__getattribute__(name))
    return classes