Source code for revscoring.features.wikibase.features.revision_oriented

from revscoring.dependencies import DependentSet

from ...feature import Feature
from ...meta import aggregators, bools
from .diff import Diff


[docs]class Revision(DependentSet): def __init__(self, name, revision_datasources): super().__init__(name) self.datasources = revision_datasources self.sitelinks = aggregators.len(self.datasources.sitelinks) "`int` : A count of sitelinks in the revision" self.labels = aggregators.len(self.datasources.labels) "`int` : A count of labels in the revision" self.aliases = aggregators.len(self.datasources.aliases) "`int` : A count of aliases in the revision" self.descriptions = aggregators.len(self.datasources.descriptions) "`int` : A count of descriptions in the revision" self.properties = aggregators.len(self.datasources.properties) "`int` : A count of properties in the revision" self.claims = aggregators.len(self.datasources.claims) "`int` : A count of claims in the revision" self.sources = aggregators.len(self.datasources.sources) "`int` : A count of sources in the revision" self.reference_claims = aggregators.len( self.datasources.reference_claims) "`int` : A count of reference claims in the revision" self.qualifiers = aggregators.len(self.datasources.qualifiers) "`int` : A count of qualifiers in the revision" self.badges = aggregators.len(self.datasources.badges) "`int` : A count of badges in the revision" if hasattr(self.datasources, "parent"): self.parent = Revision(name + ".parent", self.datasources.parent) """ :class:`revscoring.features.wikibase.Revision` : The parent (aka "previous") revision of the page. """ if hasattr(self.datasources, "diff"): self.diff = Diff(name + ".diff", self.datasources.diff) """ :class:`~revscoring.features.wikibase.Diff` : The difference between this revision and the parent revision. """
[docs] def has_property(self, property, name=None): """ Returns True if the specified property exists :Parameters: property : `str` The name of a property (usually preceeded by "P") name : `str` A name to associate with the feature. If not set, the feature's name will be 'has_property(<property>)' """ if name is None: name = self._name + ".has_property({0})".format(repr(property)) return bools.item_in_set(property, self.datasources.properties, name=name)
[docs] def has_property_value(self, property, value, name=None): """ Returns True if the specified property matches the provided value. :Parameters: property : `str` The name of a property (usually preceeded by "P") value : `mixed` The value to match name : `str` A name to associate with the Feature. If not set, the feature's name will be 'has_property_value(<property>, <value>)' """ if name is None: name = self._name + ".has_property_value({0}, {1})" \ .format(repr(property), repr(value)) return HasPropertyValue(name, property, value, self.datasources.entity)
class HasPropertyValue(Feature): def __init__(self, name, property, value, item_datasource): self.property = property self.value = value super().__init__(name, self._process, returns=bool, depends_on=[item_datasource]) def _process(self, item): statements = item.properties.get(self.property, []) return self.value in (str(s.claim.datavalue) for s in statements)