def _iter_artifact_dependency_infos(self, cur, artifact_name, sources):
        cur.execute('''
            select source, source_mtime, source_size,
                   source_checksum, is_dir
            from artifacts
            where artifact = ?
        ''', [artifact_name])
        rv = cur.fetchall()

        found = set()
        for path, mtime, size, checksum, is_dir in rv:
            if '@' in path:
                yield path, VirtualSourceInfo(path, mtime, checksum)
            else:
                file_info = FileInfo(self.env, path, mtime, size, checksum,
                                     bool(is_dir))
                filename = self.to_source_filename(file_info.filename)
                found.add(filename)
                yield filename, file_info

        # In any case we also iterate over our direct sources, even if the
        # build state does not know about them yet.  This can be caused by
        # an initial build or a change in original configuration.
        for source in sources:
            filename = self.to_source_filename(source)
            if filename not in found:
                yield source, None
This iterates over all dependencies as file info objects.
dataset/ETHPy150Open lektor/lektor/lektor/builder.py/BuildState._iter_artifact_dependency_infos