pysteve/lib/plugins/ap.py (48 lines of code) (raw):
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
""" ASF PMC style voting plugin """
from lib import constants
def tallyAP(votes, issue):
""" Simple YNA tallying
:param votes: The JSON object from $issueid.json.votes
:return: dict with y,n,a,by,bn numbers as well as pretty-printed version
"""
y = n = a = 0
by = bn = 0
# For each vote cast, tally it
for vote in votes.values():
if vote == 'y':
y += 1
elif vote == 'n':
n += 1
elif vote == 'a':
a += 1
elif vote == 'by':
by += 1
elif vote == 'bn':
bn += 1
else:
raise Exception("Invalid vote found in votes db!")
js = {
'votes': len(votes),
'yes': y,
'no': n,
'abstain': a,
'binding_yes': by,
'binding_no': bn
}
return js, """
Yes: %4u
No: %4u
Abstain: %4u
Binding Yes: %4u
Binding No: %4u
""" % (y,n,a,by,bn)
def validateAP(vote, issue):
"Tries to validate a vote, returns why if not valid, None otherwise"
letters = ['y','n','a', 'by', 'bn']
if len(vote) >= 3 or not vote in letters:
return "Invalid vote. Accepted votes are: %s" % ", ".join(letters)
return None
# Verification process
def verifyAP(basedata, issueID, voterID, vote, uid):
"Invalidate a binding vote if not allowed to cast such"
if vote.startswith('b'):
# Simple check example: if not apache committer, discard vote if binding
if not uid.endswith("@apache.org"):
raise Exception("You are not allowed to cast a binding vote!")
constants.appendVote(
{
'key': "ap",
'description': "PMC Style vote (YNA with binding votes)",
'category': 'ap',
'validate_func': validateAP,
'vote_func': verifyAP,
'tally_func': tallyAP
},
)