Example #1
0
 def __init__(self):
     self.explicit = set()  # BlockCellNames, obtained from code
     self.implicit = set()  # of BlockCellName, deduced implicitly
     self.system = set()  # of SystemResourceName, from code
     self.properties = DependenciesProperties()
     self.resolved = set()  # of DependencyDeclaration, found
     self.unresolved = set()  # of DependencyDeclaration, not found
     self.cell_name = None  # transient, not serializable name of cell. Required for relative
     self.paths = {
     }  # {Order, BlockNamePath} to help define order; used for include_paths
Example #2
0
 def update_declarations(self, declarations):
     '''declarations: iterable of declarations explicitly found while parsing the file,
     When the new declarations are updated, as a result of a file parse, the whole
     dependencies are reset, and they are started from scratch, re-generated
     in the process'''
     self.explicit = set()
     self.implicit = set()
     self.system = set()
     self.properties = DependenciesProperties()
     self.resolved = set()
     self.unresolved = declarations
     self.paths = {}
 def __init__(self):
     self.explicit = set()  # BlockCellNames, obtained from code
     self.implicit = set()  # of BlockCellName, deduced implicitly
     self.system = set()  # of SystemResourceName, from code
     self.properties = DependenciesProperties()
     self.resolved = set()  # of DependencyDeclaration, found
     self.unresolved = set()  # of DependencyDeclaration, not found
     self.cell_name = None  # transient, not serializable name of cell. Required for relative
     self.paths = {}  # {Order, BlockNamePath} to help define order; used for include_paths
 def update_declarations(self, declarations):
     '''declarations: iterable of declarations explicitly found while parsing the file,
     When the new declarations are updated, as a result of a file parse, the whole
     dependencies are reset, and they are started from scratch, re-generated
     in the process'''
     self.explicit = set()
     self.implicit = set()
     self.system = set()
     self.properties = DependenciesProperties()
     self.resolved = set()
     self.unresolved = declarations
     self.paths = {}
Example #5
0
    def deserialize(data):
        targets_deserializer = DependencySet.targets_deserializer
        declaration_deserializer = DependencySet.declaration_deserializer
        r = DependencySet()
        r.explicit = targets_deserializer.deserialize(
            data[DependencySet.SERIAL_EXPLICIT])
        r.implicit = targets_deserializer.deserialize(
            data[DependencySet.SERIAL_IMPLICIT])
        r.system = SetDeserializer(SystemCellName).deserialize(
            data[DependencySet.SERIAL_SYSTEM])
        r.resolved = declaration_deserializer.deserialize(
            data[DependencySet.SERIAL_RESOLVED])
        r.unresolved = declaration_deserializer.deserialize(
            data[DependencySet.SERIAL_UNRESOLVED])
        try:
            d = data[DependencySet.SERIAL_PROPERTIES]
            r.properties = DependenciesProperties.deserialize(d)
        except KeyError:
            pass

        try:
            d = data[DependencySet.SERIAL_PATHS]
            r.paths = DictDeserializer(int, str).deserialize(d)
        except KeyError:
            pass

        # This 2 latter are backward compatibility deserializations
        # TODO: Can be removed with a migration
        try:
            d = data[DependencySet.SERIAL_DATA]
            items = targets_deserializer.deserialize(d)
            for item in items:
                r.explicit.add(item)
                r.properties.add_property(item, DependenciesProperties.DATA)
        except KeyError:
            pass

        try:
            d = data[DependencySet.SERIAL_EXCLUDE]
            items = targets_deserializer.deserialize(d)
            for item in items:
                r.properties.add_property(
                    item, DependenciesProperties.EXCLUDE_FROM_BUILD)
        except KeyError:
            pass
        return r
    def deserialize(data):
        targets_deserializer = DependencySet.targets_deserializer
        declaration_deserializer = DependencySet.declaration_deserializer
        r = DependencySet()
        r.explicit = targets_deserializer.deserialize(data[DependencySet.SERIAL_EXPLICIT])
        r.implicit = targets_deserializer.deserialize(data[DependencySet.SERIAL_IMPLICIT])
        r.system = SetDeserializer(SystemCellName).deserialize(data[DependencySet.SERIAL_SYSTEM])
        r.resolved = declaration_deserializer.deserialize(data[DependencySet.SERIAL_RESOLVED])
        r.unresolved = declaration_deserializer.deserialize(data[DependencySet.SERIAL_UNRESOLVED])
        try:
            d = data[DependencySet.SERIAL_PROPERTIES]
            r.properties = DependenciesProperties.deserialize(d)
        except KeyError:
            pass

        try:
            d = data[DependencySet.SERIAL_PATHS]
            r.paths = DictDeserializer(int, str).deserialize(d)
        except KeyError:
            pass

        # This 2 latter are backward compatibility deserializations
        # TODO: Can be removed with a migration
        try:
            d = data[DependencySet.SERIAL_DATA]
            items = targets_deserializer.deserialize(d)
            for item in items:
                r.explicit.add(item)
                r.properties.add_property(item, DependenciesProperties.DATA)
        except KeyError:
            pass

        try:
            d = data[DependencySet.SERIAL_EXCLUDE]
            items = targets_deserializer.deserialize(d)
            for item in items:
                r.properties.add_property(item, DependenciesProperties.EXCLUDE_FROM_BUILD)
        except KeyError:
            pass
        return r
Example #7
0
class DependencySet(object):
    '''Class to represent the dependencies of a cell'''
    def __init__(self):
        self.explicit = set()  # BlockCellNames, obtained from code
        self.implicit = set()  # of BlockCellName, deduced implicitly
        self.system = set()  # of SystemResourceName, from code
        self.properties = DependenciesProperties()
        self.resolved = set()  # of DependencyDeclaration, found
        self.unresolved = set()  # of DependencyDeclaration, not found
        self.cell_name = None  # transient, not serializable name of cell. Required for relative
        self.paths = {
        }  # {Order, BlockNamePath} to help define order; used for include_paths

    def __eq__(self, other):
        # necessary equality comparison for "compare" operations between Resources
        return (self.explicit == other.explicit
                and self.implicit == other.implicit
                and self.system == other.system
                and self.properties == other.properties
                and self.resolved == other.resolved
                and self.unresolved == other.unresolved
                and self.paths == other.paths)

    def __ne__(self, other):
        return not self.__eq__(other)

    def add_path(self, path_tuple):
        if path_tuple:
            order, path = path_tuple
            self.paths[order] = path

    @property
    def targets(self):
        return self.explicit.union(self.implicit)

    @property
    def data(self):
        '''obtain the data items, deducing it from properties'''
        return set([
            k for k, v in self.properties.iteritems()
            if DependenciesProperties.DATA in v
        ])

    @property
    def exclude_from_build(self):
        '''obtain the excluded items, deducing it from properties'''
        return set([
            k for k, v in self.properties.iteritems()
            if DependenciesProperties.EXCLUDE_FROM_BUILD in v
        ])

    def update_declarations(self, declarations):
        '''declarations: iterable of declarations explicitly found while parsing the file,
        When the new declarations are updated, as a result of a file parse, the whole
        dependencies are reset, and they are started from scratch, re-generated
        in the process'''
        self.explicit = set()
        self.implicit = set()
        self.system = set()
        self.properties = DependenciesProperties()
        self.resolved = set()
        self.unresolved = declarations
        self.paths = {}

    def _force_properties_support(self):
        '''those properties not supported by any target are removed'''
        targets = self.targets
        for block_cell_name in self.properties.keys():
            if block_cell_name not in targets:
                self.properties.pop(block_cell_name)

    def resolve(self, declaration, targets):
        self.unresolved.remove(declaration)
        self.resolved.add(declaration)
        self.explicit.update(targets)
        for target in targets:
            self.properties.add_properties(target, declaration.properties)

    def resolve_system(self, declaration, targets):
        self.unresolved.remove(declaration)
        self.resolved.add(declaration)
        self.system.update(targets)

    def update(self, other):
        ''' Updates current dependency set with other elements
        Params:
            updated_items: DependencySet
        Returns: Self
        '''
        self.explicit.update(other.explicit)
        self.implicit.update(other.implicit)
        self.system.update(other.system)
        self.resolved.update(other.resolved)
        self.unresolved.update(other.unresolved)
        self.paths.update(other.paths)
        for k, v in other.properties.iteritems():
            self.properties.add_properties(k, v)

        return self

    def update_resolved(self, resolved_items, renames):
        '''Updates dependency set with resolved dependencies.
        Params:
            resolved_items: dict{Declaration: Set(BlockCellName)
            renames {old:new}
        '''
        old_explicit = self.explicit.copy()
        resolved_declarations = resolved_items.keys()
        old_resolved = self.resolved.copy()
        # First remove from current explicit and resolved
        self.resolved.difference_update(resolved_declarations)
        '''those explicit dependencies not supported by any declaration are removed'''
        targets = set()
        for resolved in self.resolved:
            targets.update(resolved.match(self.explicit, self.cell_name))
        unsupported = self.explicit.difference(targets)
        self.explicit.difference_update(unsupported)
        self.properties.discard(unsupported)

        # now add again new resolved
        for declaration, targets in resolved_items.iteritems():
            if declaration in old_resolved:
                declaration.name = renames.get(declaration.name,
                                               declaration.name)
                self.resolved.add(declaration)
                self.explicit.update(targets)
                for target in targets:
                    self.properties.add_properties(target,
                                                   declaration.properties)
        return old_explicit != self.explicit

    def add_implicit(self, block_cell_name):
        result = block_cell_name not in self.implicit
        self.implicit.add(block_cell_name)
        return result

    def __repr__(self):
        result = []
        result.append('Explicit %s' % self.explicit)
        result.append('Implicit %s' % self.implicit)
        result.append('Props %s' % self.properties)
        result.append('System %s' % self.system)
        result.append('Resolved %s' % self.resolved)
        result.append('Unresolved %s' % self.unresolved)
        result.append('Paths %s' % self.paths)
        return ' '.join(result)

    SERIAL_EXPLICIT = 'e'
    SERIAL_IMPLICIT = 'i'
    SERIAL_DATA = 'd'
    SERIAL_SYSTEM = 's'
    SERIAL_RESOLVED = 'r'
    SERIAL_UNRESOLVED = 'u'
    SERIAL_EXCLUDE = 'ex'
    SERIAL_PROPERTIES = 'p'
    SERIAL_PATHS = 'q'

    def serialize(self):
        return Serializer().build(
            (DependencySet.SERIAL_EXPLICIT, self.explicit),
            (DependencySet.SERIAL_IMPLICIT, self.implicit),
            (DependencySet.SERIAL_PROPERTIES, self.properties),
            (DependencySet.SERIAL_SYSTEM, self.system),
            (DependencySet.SERIAL_RESOLVED, self.resolved),
            (DependencySet.SERIAL_UNRESOLVED, self.unresolved),
            (DependencySet.SERIAL_PATHS, self.paths),
        )

    targets_deserializer = SetDeserializer(BlockCellName)
    declaration_deserializer = SetDeserializer(Declaration)

    @staticmethod
    def deserialize(data):
        targets_deserializer = DependencySet.targets_deserializer
        declaration_deserializer = DependencySet.declaration_deserializer
        r = DependencySet()
        r.explicit = targets_deserializer.deserialize(
            data[DependencySet.SERIAL_EXPLICIT])
        r.implicit = targets_deserializer.deserialize(
            data[DependencySet.SERIAL_IMPLICIT])
        r.system = SetDeserializer(SystemCellName).deserialize(
            data[DependencySet.SERIAL_SYSTEM])
        r.resolved = declaration_deserializer.deserialize(
            data[DependencySet.SERIAL_RESOLVED])
        r.unresolved = declaration_deserializer.deserialize(
            data[DependencySet.SERIAL_UNRESOLVED])
        try:
            d = data[DependencySet.SERIAL_PROPERTIES]
            r.properties = DependenciesProperties.deserialize(d)
        except KeyError:
            pass

        try:
            d = data[DependencySet.SERIAL_PATHS]
            r.paths = DictDeserializer(int, str).deserialize(d)
        except KeyError:
            pass

        # This 2 latter are backward compatibility deserializations
        # TODO: Can be removed with a migration
        try:
            d = data[DependencySet.SERIAL_DATA]
            items = targets_deserializer.deserialize(d)
            for item in items:
                r.explicit.add(item)
                r.properties.add_property(item, DependenciesProperties.DATA)
        except KeyError:
            pass

        try:
            d = data[DependencySet.SERIAL_EXCLUDE]
            items = targets_deserializer.deserialize(d)
            for item in items:
                r.properties.add_property(
                    item, DependenciesProperties.EXCLUDE_FROM_BUILD)
        except KeyError:
            pass
        return r
class DependencySet(object):
    '''Class to represent the dependencies of a cell'''

    def __init__(self):
        self.explicit = set()  # BlockCellNames, obtained from code
        self.implicit = set()  # of BlockCellName, deduced implicitly
        self.system = set()  # of SystemResourceName, from code
        self.properties = DependenciesProperties()
        self.resolved = set()  # of DependencyDeclaration, found
        self.unresolved = set()  # of DependencyDeclaration, not found
        self.cell_name = None  # transient, not serializable name of cell. Required for relative
        self.paths = {}  # {Order, BlockNamePath} to help define order; used for include_paths

    def __eq__(self, other):
        # necessary equality comparison for "compare" operations between Resources
        return (self.explicit == other.explicit and
                self.implicit == other.implicit and
                self.system == other.system and
                self.properties == other.properties and
                self.resolved == other.resolved and
                self.unresolved == other.unresolved and
                self.paths == other.paths)

    def __ne__(self, other):
        return not self.__eq__(other)

    def add_path(self, path_tuple):
        if path_tuple:
            order, path = path_tuple
            self.paths[order] = path

    @property
    def targets(self):
        return self.explicit.union(self.implicit)

    @property
    def data(self):
        '''obtain the data items, deducing it from properties'''
        return set([k for k, v in self.properties.iteritems()
                            if DependenciesProperties.DATA in v])

    @property
    def exclude_from_build(self):
        '''obtain the excluded items, deducing it from properties'''
        return set([k for k, v in self.properties.iteritems()
                            if DependenciesProperties.EXCLUDE_FROM_BUILD in v])

    def update_declarations(self, declarations):
        '''declarations: iterable of declarations explicitly found while parsing the file,
        When the new declarations are updated, as a result of a file parse, the whole
        dependencies are reset, and they are started from scratch, re-generated
        in the process'''
        self.explicit = set()
        self.implicit = set()
        self.system = set()
        self.properties = DependenciesProperties()
        self.resolved = set()
        self.unresolved = declarations
        self.paths = {}

    def _force_properties_support(self):
        '''those properties not supported by any target are removed'''
        targets = self.targets
        for block_cell_name in self.properties.keys():
            if block_cell_name not in targets:
                self.properties.pop(block_cell_name)

    def resolve(self, declaration, targets):
        self.unresolved.remove(declaration)
        self.resolved.add(declaration)
        self.explicit.update(targets)
        for target in targets:
            self.properties.add_properties(target, declaration.properties)

    def resolve_system(self, declaration, targets):
        self.unresolved.remove(declaration)
        self.resolved.add(declaration)
        self.system.update(targets)

    def update(self, other):
        ''' Updates current dependency set with other elements
        Params:
            updated_items: DependencySet
        Returns: Self
        '''
        self.explicit.update(other.explicit)
        self.implicit.update(other.implicit)
        self.system.update(other.system)
        self.resolved.update(other.resolved)
        self.unresolved.update(other.unresolved)
        self.paths.update(other.paths)
        for k, v in other.properties.iteritems():
            self.properties.add_properties(k, v)

        return self

    def update_resolved(self, resolved_items, renames):
        '''Updates dependency set with resolved dependencies.
        Params:
            resolved_items: dict{Declaration: Set(BlockCellName)
            renames {old:new}
        '''
        old_explicit = self.explicit.copy()
        resolved_declarations = resolved_items.keys()
        old_resolved = self.resolved.copy()
        # First remove from current explicit and resolved
        self.resolved.difference_update(resolved_declarations)

        '''those explicit dependencies not supported by any declaration are removed'''
        targets = set()
        for resolved in self.resolved:
            targets.update(resolved.match(self.explicit, self.cell_name))
        unsupported = self.explicit.difference(targets)
        self.explicit.difference_update(unsupported)
        self.properties.discard(unsupported)

        # now add again new resolved
        for declaration, targets in resolved_items.iteritems():
            if declaration in old_resolved:
                declaration.name = renames.get(declaration.name, declaration.name)
                self.resolved.add(declaration)
                self.explicit.update(targets)
                for target in targets:
                    self.properties.add_properties(target, declaration.properties)
        return old_explicit != self.explicit

    def add_implicit(self, block_cell_name):
        result = block_cell_name not in self.implicit
        self.implicit.add(block_cell_name)
        return result

    def __repr__(self):
        result = []
        result.append('Explicit %s' % self.explicit)
        result.append('Implicit %s' % self.implicit)
        result.append('Props %s' % self.properties)
        result.append('System %s' % self.system)
        result.append('Resolved %s' % self.resolved)
        result.append('Unresolved %s' % self.unresolved)
        result.append('Paths %s' % self.paths)
        return ' '.join(result)

    SERIAL_EXPLICIT = 'e'
    SERIAL_IMPLICIT = 'i'
    SERIAL_DATA = 'd'
    SERIAL_SYSTEM = 's'
    SERIAL_RESOLVED = 'r'
    SERIAL_UNRESOLVED = 'u'
    SERIAL_EXCLUDE = 'ex'
    SERIAL_PROPERTIES = 'p'
    SERIAL_PATHS = 'q'

    def serialize(self):
        return  Serializer().build(
                                  (DependencySet.SERIAL_EXPLICIT, self.explicit),
                                  (DependencySet.SERIAL_IMPLICIT, self.implicit),
                                  (DependencySet.SERIAL_PROPERTIES, self.properties),
                                  (DependencySet.SERIAL_SYSTEM, self.system),
                                  (DependencySet.SERIAL_RESOLVED, self.resolved),
                                  (DependencySet.SERIAL_UNRESOLVED, self.unresolved),
                                  (DependencySet.SERIAL_PATHS, self.paths),
                                  )

    targets_deserializer = SetDeserializer(BlockCellName)
    declaration_deserializer = SetDeserializer(Declaration)

    @staticmethod
    def deserialize(data):
        targets_deserializer = DependencySet.targets_deserializer
        declaration_deserializer = DependencySet.declaration_deserializer
        r = DependencySet()
        r.explicit = targets_deserializer.deserialize(data[DependencySet.SERIAL_EXPLICIT])
        r.implicit = targets_deserializer.deserialize(data[DependencySet.SERIAL_IMPLICIT])
        r.system = SetDeserializer(SystemCellName).deserialize(data[DependencySet.SERIAL_SYSTEM])
        r.resolved = declaration_deserializer.deserialize(data[DependencySet.SERIAL_RESOLVED])
        r.unresolved = declaration_deserializer.deserialize(data[DependencySet.SERIAL_UNRESOLVED])
        try:
            d = data[DependencySet.SERIAL_PROPERTIES]
            r.properties = DependenciesProperties.deserialize(d)
        except KeyError:
            pass

        try:
            d = data[DependencySet.SERIAL_PATHS]
            r.paths = DictDeserializer(int, str).deserialize(d)
        except KeyError:
            pass

        # This 2 latter are backward compatibility deserializations
        # TODO: Can be removed with a migration
        try:
            d = data[DependencySet.SERIAL_DATA]
            items = targets_deserializer.deserialize(d)
            for item in items:
                r.explicit.add(item)
                r.properties.add_property(item, DependenciesProperties.DATA)
        except KeyError:
            pass

        try:
            d = data[DependencySet.SERIAL_EXCLUDE]
            items = targets_deserializer.deserialize(d)
            for item in items:
                r.properties.add_property(item, DependenciesProperties.EXCLUDE_FROM_BUILD)
        except KeyError:
            pass
        return r