blob: f528aca979f73bbc65d528a5bb74990910411e02 [file] [log] [blame]
#
# Copyright (C) 2018 Bloomberg LP
#
# This program 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 2 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 this library. If not, see <http://www.gnu.org/licenses/>.
#
# Authors:
# Tristan Van Berkom <tristan.vanberkom@codethink.co.uk>
# Jim MacArthur <jim.macarthur@codethink.co.uk>
# Benjamin Schubert <bschubert15@bloomberg.net>
"""
Foundation types
================
"""
from enum import Enum
import heapq
class Scope(Enum):
"""Defines the scope of dependencies to include for a given element
when iterating over the dependency graph in APIs like
:func:`Element.dependencies() <buildstream.element.Element.dependencies>`
"""
ALL = 1
"""All elements which the given element depends on, following
all elements required for building. Including the element itself.
"""
BUILD = 2
"""All elements required for building the element, including their
respective run dependencies. Not including the given element itself.
"""
RUN = 3
"""All elements required for running the element. Including the element
itself.
"""
NONE = 4
"""Just the element itself, no dependencies.
*Since: 1.4*
"""
class Consistency():
"""Defines the various consistency states of a :class:`.Source`.
"""
INCONSISTENT = 0
"""Inconsistent
Inconsistent sources have no explicit reference set. They cannot
produce a cache key, be fetched or staged. They can only be tracked.
"""
RESOLVED = 1
"""Resolved
Resolved sources have a reference and can produce a cache key and
be fetched, however they cannot be staged.
"""
CACHED = 2
"""Cached
Sources have a cached unstaged copy in the source directory.
"""
class CoreWarnings():
"""CoreWarnings()
Some common warnings which are raised by core functionalities within BuildStream are found in this class.
"""
OVERLAPS = "overlaps"
"""
This warning will be produced when buildstream detects an overlap on an element
which is not whitelisted. See :ref:`Overlap Whitelist <public_overlap_whitelist>`
"""
REF_NOT_IN_TRACK = "ref-not-in-track"
"""
This warning will be produced when a source is configured with a reference
which is found to be invalid based on the configured track
"""
BAD_ELEMENT_SUFFIX = "bad-element-suffix"
"""
This warning will be produced when an element whose name does not end in .bst
is referenced either on the command line or by another element
"""
BAD_CHARACTERS_IN_NAME = "bad-characters-in-name"
"""
This warning will be produces when filename for a target contains invalid
characters in its name.
"""
class CoreWarnings():
"""CoreWarnings()
Some common warnings which are raised by core functionalities within BuildStream are found in this class.
"""
OVERLAPS = "overlaps"
"""
This warning will be produced when buildstream detects an overlap on an element
which is not whitelisted. See :ref:`Overlap Whitelist <public_overlap_whitelist>`
"""
REF_NOT_IN_TRACK = "ref-not-in-track"
"""
This warning will be produced when a source is configured with a reference
which is found to be invalid based on the configured track
"""
BAD_ELEMENT_SUFFIX = "bad-element-suffix"
"""
This warning will be produced when an element whose name does not end in .bst
is referenced either on the command line or by another element
"""
# _KeyStrength():
#
# Strength of cache key
#
class _KeyStrength(Enum):
# Includes strong cache keys of all build dependencies and their
# runtime dependencies.
STRONG = 1
# Includes names of direct build dependencies but does not include
# cache keys of dependencies.
WEAK = 2
# _UniquePriorityQueue():
#
# Implements a priority queue that adds only each key once.
#
# The queue will store and priority based on a tuple (key, item).
#
class _UniquePriorityQueue:
def __init__(self):
self._items = set()
self._heap = []
# push():
#
# Push a new item in the queue.
#
# If the item is already present in the queue as identified by the key,
# this is a noop.
#
# Args:
# key (hashable, comparable): unique key to use for checking for
# the object's existence and used for
# ordering
# item (any): item to push to the queue
#
def push(self, key, item):
if key not in self._items:
self._items.add(key)
heapq.heappush(self._heap, (key, item))
# pop():
#
# Pop the next item from the queue, by priority order.
#
# Returns:
# (any): the next item
#
# Throw:
# IndexError: when the list is empty
#
def pop(self):
key, item = heapq.heappop(self._heap)
self._items.remove(key)
return item
def __len__(self):
return len(self._heap)