File indexing completed on 2024-05-12 03:53:40

0001 # -*- coding: utf-8 -*-
0002 #
0003 # SPDX-FileCopyrightText: 2014 Aurélien Gâteau <agateau@kde.org>
0004 #
0005 # SPDX-License-Identifier: BSD-2-Clause
0006 
0007 from functools import reduce
0008 
0009 class Framework(object):
0010     """
0011     A framework has a tier, a name, a collection of targets it provides.
0012     For each target it provides, it knows which targets they depend on.
0013 
0014     It also has a list of frameworks it depends on, for framework-to-framework
0015     dependencies. This is useful for cases when a framework depends on macros
0016     provided by another framework.
0017     """
0018     def __init__(self, tier, name):
0019         self.tier = tier
0020         self.name = name
0021 
0022         # A dict of target => set([targets])
0023         self._target_dict = {}
0024 
0025         # A list of other frameworks (not targets!) this framework depends on.
0026         self._fw_list = []
0027 
0028     def add_target(self, target):
0029         # Add a new target provided by this framework
0030         assert target not in self._target_dict
0031         self._target_dict[target] = set()
0032 
0033     def add_target_dependency(self, target, dep):
0034         # Add a new dependency target to a target provided by this framework
0035         assert target in self._target_dict
0036         self._target_dict[target].add(dep)
0037 
0038     def get_targets(self):
0039         return self._target_dict.keys()
0040 
0041     def has_target(self, target):
0042         return target in self._target_dict
0043 
0044     def get_all_target_dependencies(self):
0045         deps = self._target_dict.values()
0046         if not deps:
0047             return set()
0048         return reduce(lambda x,y: x.union(y), deps)
0049 
0050     def get_dependencies_for_target(self, target):
0051         return self._target_dict[target]
0052 
0053     def add_extra_framework(self, name):
0054         # Add a framework this framework depends on because of a
0055         # framework-to-framework dependency
0056         self._fw_list.append(name)
0057 
0058     def get_extra_frameworks(self):
0059         # Returns frameworks this framework depends on because of a
0060         # framework-to-framework dependency
0061         return self._fw_list
0062 
0063     def __repr__(self):
0064         return self.name