跳转到主要内容

Fedora消息消费者用于颁发开放徽章

项目描述

此仓库包含将徽章堆栈(Tahrir、Tahrir-API、Tahrir-REST)钩入Fedora消息传递所需的消费者和命令。这是一个在后台运行的过程,监视Fedora贡献者的活动,并负责在活动发生时颁发徽章。它与徽章系统的前端(tahrir)分开,有时会与之混淆。此项目(fedbadges)写入前端(tahrir)从中读取的数据库。

在Fedora基础设施中我们实际采取行动的徽章规则可以在此找到。

架构

fedbadges是Fedora消息传递消费者的回调类。启动时,它将加载一些初始配置和一些BadgeRules(稍后详述),然后安静地监听Fedora消息传递总线。每个规则(由一些元数据、一个触发器、一个可选的条件和一个可选的计数先前消息的方式组成)被定义为磁盘上的yaml文件。

  • 当出现一条新消息时,我们的回调会查看它是否匹配它注册的任何BadgeRules

  • 每个BadgeRules必须定义一个触发器 – 一个轻量级的检查。在处理消息时,这是首先要检查的。它定义了一个消息必须匹配的模式。如果消息不匹配,则当前BadgeRules被丢弃,处理转移到下一个。

    触发器通常类似于“任何bodhi消息”或“koji构建失败的唯一消息”。下面将详细介绍它们的规范。

  • BadgeRules还可以定义一个先前值,作为计数过去通过总线的类似消息的方式。这通常涉及到对datanommer数据库的更昂贵的查询。

    BadgeRules的先前查询可能类似于“候选者推送的稳定更新”或“候选者主持的IRC会议”。

    备注:虽然datanommer是目前唯一支持的后端,但我们可以在需要时实现其他可查询的后端,例如FAS(查看用户是否在X个组中)或甚至离站服务,如libravatar(如果用户是AGPL网络服务的用户,则颁发徽章)。

  • BadgeRules可以定义一个必须与先前查询返回的消息数匹配的条件。这可以像大于或等于: 50。如果未设置,则默认条件为大于或等于 1

  • 如果没有设置先前查询,则规则只考虑当前传入的消息(它就像先前的结果始终是1)。这对于在第一次行动时颁发徽章的规则是相关的。这些规则也不需要设置条件,默认条件即可。

  • 如果徽章的触发器条件都匹配,则颁发徽章。如果BadgeRules未指定,则使用消息的agent_name属性将徽章颁发给操作者。

    这通常是正确的——但有时,BadgeRule需要指定一个特定的用户应该是徽章的接收者。在这种情况下,BadgeRule可以定义一个recipient,使用点符号来指导Consumer如何从收到的消息中提取接收者的用户名。

    徽章通过tahrir_api颁发给应得的用户。最终,这相当于在Tahrir应用程序的数据库表中添加一行。

为了清晰起见,省略了一些优化。例如,触发器匹配后,我们首先检查将要被授予徽章的用户是否已经拥有它。如果他们已经拥有,我们将立即停止处理徽章规则,以避免对datanommer数据库进行不必要的昂贵检查。

配置 - 全局

fedbadges需要三个主要的全局配置项。所有配置都按照标准Fedora Messaging方式加载,来自配置文件的[consumer_config]部分。请参阅git仓库中的fedbadges.toml.example以获取示例。

fedbadges还会发出自己的消息。在Fedora基础设施中,topic_prefix将是org.fedoraproject.prod

配置 - BadgeRule规范

BadgeRules在文件系统中以YAML格式指定。

触发器

每个BadgeRule都必须携带以下最小集合的元数据

# This is some metadata about the badge
name:           Like a Rock
description:    You have pushed 500 or more bodhi updates to stable status.
creator:        ralph

# This is a link to the discussion about adopting this as a for-real badge.
discussion: http://github.com/fedora-infra/badges/pull/SOME_NUMBER

# A link to the image for the badge
image_url: http://somelink.org/to-an-image.png

以下是一个简单的trigger示例

trigger:
  category: bodhi

上面的代码将匹配来自bodhi更新系统任何主题的任何bodhi消息。

触发器可以采用一些逻辑来创建更复杂的过滤器。以下触发器将匹配来自bodhi更新系统或fedora git软件包仓库的任何消息

trigger:
  category:
    any:
      - bodhi
      - git

目前,触发器可以直接将自身与消息的categorytopic进行比较。未来我们希望添加更多比较功能。同时,以下是一个比较完全限定消息主题的示例。这将匹配任何特定于编辑维基页面的消息

trigger:
  topic: org.fedoraproject.prod.wiki.article.edit

您可以指定触发器的一种额外方法。如果您需要比topiccategory更灵活的选项,您可以指定一个自定义的过滤器表达式,使用lambda过滤器。例如

trigger:
  lambda: "a string of interest" in json.dumps(message.body)

上面的触发器将在字符串"a string of interest"出现在传入消息的任何地方时匹配。fedbadges在初始化时将您提供的表达式编译成一个Python可调用函数。我们在这里将消息序列化为JSON字符串,然后进行其比较。非常强大!

上一个

如上述架构部分所述,我们目前只支持datanommer作为上一个查询的可查询后端。我们希望在未来扩展这一点。

Datanommer查询由两部分组成

  • filter限制查询的作用域为datanommer。

  • operation定义了我们想要对过滤查询执行的操作。目前,我们可以计算结果或通过返回整数的lambda函数运行它们(匹配消息的数量)。

以下是一个简单的上一个定义示例

previous:
  filter:
    topics:
    - message.topic
  operation: count

上述上一个查询将返回具有与正在处理的传入消息相同主题的datanommer中的消息数量。在这里,message.topic是一个具有传入message的作用域的lambda函数。


上面的例子并不太合理——我们永远不会用它来制作真正的徽章。之前的查询将在过去任何时间由任何用户发起的任何消息中返回两个时为真。相当通用。这里有一个更有趣的previous查询

previous:
  filter:
    topics:
    - org.fedoraproject.prod.git.receive
    users:
    - message.body["commit"]["username"]
  operation: count

这个previous查询将返回当前正在处理的消息的message.body['commit']['username']字段中列出的用户发起的"org.fedoraproject.prod.git.receive"主题的消息数量。换句话说,这个查询将返回该用户对fedora git仓库的推送数量。

条件

您可以使用条件字段做一些很酷的事情。以下是可以进行比较的可能列表

  • "大于或等于"或 alternatively "greater than or equal to"

  • "greater than"

  • "小于或等于"或 alternatively "less than or equal to"

  • "less than"

  • "等于"或 alternatively "is equal to"

  • "is not"或 alternatively "is not equal to"

如您所见,其中一些是彼此的同义词。


如果这些都不符合您的需求,您可以通过使用lambda条件来指定一个自定义表达式,fedbadges将编译您提供的任何语句并使用它在运行时。例如

condition:
  lambda: value != 0 and ((value & (value - 1)) == 0)

谁知道您为什么要这样做,但上面的条件检查将在过去匹配的消息数恰好是2的幂时成功。

指定收件人

默认情况下,如果触发器和条件匹配,fedbadges将为消息的agent_name属性返回的用户颁发徽章。这通常对应于“哪个用户负责”这条消息。这是我们通常想要颁发徽章的。

有些情况下我们并不希望这样。

org.fedoraproject.prod.bodhi.update.comment消息为例。当用户A对用户B的更新发表评论时,用户A由消息的agent_name属性返回。

想象一下,如果我们有一个“收到评论”徽章,它将授予收到更新评论的打包者。我们不希望无意中把徽章授予评论者,而是只授予创建更新的人。

为了允许这种场景,徽章可以可选地定义一个recipient,使用点分隔符来告诉fedbadges在哪里找到原始消息中收件人的用户名。例如,以下将处理我们上面描述的fas情况

trigger:
  topic: org.fedoraproject.prod.bodhi.update.comment
condition:
  greater than or equal to: 1
previous:
  filter:
    topics:
    - message.topic
    users:
    - recipient
  operation: count
recipient: message.body["update"]["user"]["name"]

项目详情


下载文件

为您的平台下载文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分布

fedbadges-2.2.0.tar.gz (41.7 kB 查看哈希值)

上传时间 源代码

构建分发版本

fedbadges-2.2.0-py3-none-any.whl (33.1 kB 查看哈希值)

上传时间 Python 3

由以下提供支持