plugin uri finder, jp (merge-request): labels handling:

- a label can now be specified as metadata after specifing a "xmpp:" URI in doc (with « use "[label]" label" » after the URI)
- updated jp to handle new signature of URIFind
- jp (merge-request/set): labels can now be specified using --label
This commit is contained in:
Goffi 2018-04-01 20:17:00 +02:00
commit e4c56da671
5 changed files with 41 additions and 10 deletions

View file

@ -41,6 +41,7 @@ class Set(base.CommandBase):
self.parser.add_argument("-i", "--item", type=base.unicode_decoder, default=u'', help=_(u"id or URL of the request to update, or nothing for a new one"))
self.parser.add_argument("-r", "--repository", metavar="PATH", type=base.unicode_decoder, default=u'.', help=_(u"path of the repository (DEFAULT: current directory)"))
self.parser.add_argument("-f", "--force", action="store_true", help=_(u"publish merge request without confirmation"))
self.parser.add_argument("-l", "--label", dest="labels", type=base.unicode_decoder, action='append', help=_(u"labels to categorize your request"))
def mergeRequestSetCb(self, published_id):
if published_id:
@ -51,12 +52,15 @@ class Set(base.CommandBase):
def sendRequest(self):
extra = {'update': 'true'} if self.args.item else {}
values = {}
if self.args.labels is not None:
values[u'labels'] = self.args.labels
self.host.bridge.mergeRequestSet(
self.args.service,
self.args.node,
self.repository,
u'auto',
{},
values,
u'',
self.args.item,
extra,

View file

@ -671,6 +671,13 @@ class URIFinder(object):
"""Helper class to find URIs in well-known locations"""
def __init__(self, command, path, key, callback):
"""
@param command(CommandBase): command instance
args of this instance will be updated with found values
@param path(unicode): absolute path to use as a starting point to look for URIs
@param key(unicode): key to look for
@param callback(callable): method to call once URIs are found (or not)
"""
if not command.args.service and not command.args.node:
self.host = command.host
self.args = command.args
@ -685,12 +692,26 @@ class URIFinder(object):
else:
callback()
def URIFindCb(self, uri_data):
def URIFindCb(self, uris_data):
try:
uri = uri_data[self.key]
uri_data = uris_data[self.key]
except KeyError:
self.host.disp(_(u"No {key} URI specified for this project, please specify service and node").format(key=self.key), error=True)
self.host.quit(C.EXIT_NOT_FOUND)
else:
uri = uri_data[u'uri']
labels_raw = uri_data.get(u'labels')
if labels_raw is not None:
try:
labels = self.args.labels
except AttributeError:
raise exceptions.InternalError(u'there is no "labels" arguments')
else:
if labels is None:
labels = []
labels.extend(json.loads(labels_raw))
self.args.labels = labels
parsed_uri = xmpp_uri.parseXMPPUri(uri)
try:
self.args.service = parsed_uri[u'path']

View file

@ -430,8 +430,8 @@ class PubsubSchema(object):
"""Set an item in a node with a schema
This method can be used directly by *Set methods added by dependant plugin
@param values(dict[key(unicode), [iterable[object], object]]): values of the items
if not iterable, will be put in a list
@param values(dict[key(unicode), [iterable[object]|object]]): values of the items
if value is not iterable, it will be put in a list
'created' and 'updated' will be forced to current time:
- 'created' is set if item_id is None, i.e. if it's a new ticket
- 'updated' is set everytime

View file

@ -84,8 +84,8 @@ class Tickets(object):
@param node(unicode, None): Pubsub node to use
None to use default tickets node
@param values(dict[key(unicode), [iterable[object], object]]): values of the ticket
if not iterable, will be put in a list
@param values(dict[key(unicode), [iterable[object]|object]]): values of the ticket
if value is not iterable, it will be put in a list
'created' and 'updated' will be forced to current time:
- 'created' is set if item_id is None, i.e. if it's a new ticket
- 'updated' is set everytime

View file

@ -23,6 +23,7 @@ from sat.core.log import getLogger
from twisted.internet import defer
import textwrap
log = getLogger(__name__)
import json
import os.path
import os
import re
@ -51,7 +52,7 @@ class URIFinder(object):
log.info(_(u"URI finder plugin initialization"))
self.host = host
host.bridge.addMethod("URIFind", ".plugin",
in_sign='sas', out_sign='a{ss}',
in_sign='sas', out_sign='a{sa{ss}}',
method=self.find,
async=True)
@ -64,7 +65,9 @@ class URIFinder(object):
@return (dict[unicode, unicode]): map from key to found uri
"""
keys_re = u'|'.join(keys)
uri_re = re.compile(ur'(?P<key>{keys_re})[ :]? +(?P<uri>xmpp:\S+)'.format(keys_re=keys_re))
label_re = r'"(?P<label>[^"]+)"'
uri_re = re.compile(ur'(?P<key>{keys_re})[ :]? +(?P<uri>xmpp:\S+)(?:.*use {label_re} label)?'.format(
keys_re=keys_re, label_re = label_re))
path = os.path.normpath(path)
if not os.path.isdir(path) or not os.path.isabs(path):
raise ValueError(u'path must be an absolute path to a directory')
@ -79,10 +82,13 @@ class URIFinder(object):
for m in uri_re.finditer(f.read()):
key = m.group(u'key')
uri = m.group(u'uri')
label = m.group(u'label')
if key in found_uris:
log.warning(_(u"Ignoring already found uri for key \"{key}\"").format(key=key))
else:
found_uris[key] = uri
uri_data = found_uris[key] = {u'uri': uri}
if label is not None:
uri_data[u'labels'] = json.dumps([label])
if found_uris:
break
path = os.path.dirname(path)