Rally pyral SDK 查询两个以上术语时出错(解析表达式时预期“)”却看到“且”)。

2 投票
1 回答
790 浏览
提问于 2025-04-17 14:37

我正在使用pyral,也就是Rally的Python开发工具包。我用一个元组来格式化我的查询字符串,但每当我有超过两个条件时,它就会出问题。以下是我的测试代码:

import pyral

rally = pyral.Rally('rally1.rallydev.com', 'user@example.com', 'password')

user = rally.getUserInfo(name='User Name').pop(0)
wksp = rally.getWorkspace()
proj = rally.getProject()

print user.FirstName, user.LastName
print wksp.Name
print proj.Name

queryStrings = (
('State != "Closed"', 'Owner = ' + user.ref),
('State != "Fixed"', 'Owner = ' + user.ref),
('State != "Closed"', 'State != "Fixed"'),
('State != "Closed"', 'State != "Fixed"', 'Owner = ' + user.ref),
('State != Closed', 'State != Fixed', 'State != Submitted'),
('State != Fixed', 'ScheduleState != Tested'),
('State != Fixed', 'Owner = ' + user.ref, 'ScheduleState != Tested'),
)

for query in queryStrings:
    print "++++++++++++++++++++++++++++++++++++++++++"
    print "Query:",query
    defects = rally.get("Defect", True, query=query)
    print "Number of results:",defects.resultCount
    print "Errors:", defects.errors
    print

这是生成的输出结果:

User Name
A Workspace
Web Project
++++++++++++++++++++++++++++++++++++++++++
Query: ('State != "Closed"', u'Owner = user/1234567890')
QUERYJUNK: ((State != "Closed") AND (Owner = user/1234567890))
Number of results: 25
Errors: []

++++++++++++++++++++++++++++++++++++++++++
Query: ('State != "Fixed"', u'Owner = user/1234567890')
QUERYJUNK: ((State != "Fixed") AND (Owner = user/1234567890))
Number of results: 89
Errors: []

++++++++++++++++++++++++++++++++++++++++++
Query: ('State != "Closed"', 'State != "Fixed"')
QUERYJUNK: ((State != "Closed") AND (State != "Fixed"))
Number of results: 149
Errors: []

++++++++++++++++++++++++++++++++++++++++++
Query: ('State != "Closed"', 'State != "Fixed"', u'Owner = user/1234567890')
QUERYJUNK: ((State != "Closed") AND (State != "Fixed") AND (Owner = user/1234567890))
Number of results: 0
Errors: [u'Could not parse: Error parsing expression -- expected ")" but saw "AND"       instead.']

++++++++++++++++++++++++++++++++++++++++++
Query: ('State != Closed', 'State != Fixed', 'State != Submitted')
QUERYJUNK: ((State != Closed) AND (State != Fixed) AND (State != Submitted))
Number of results: 0
Errors: [u'Could not parse: Error parsing expression -- expected ")" but saw "AND" instead.']

++++++++++++++++++++++++++++++++++++++++++
Query: ('State != Fixed', 'ScheduleState != Tested')
QUERYJUNK: ((State != Fixed) AND (ScheduleState != Tested))
Number of results: 247
Errors: []

++++++++++++++++++++++++++++++++++++++++++
Query: ('State != Fixed', u'Owner = user/1234567890', 'ScheduleState != Tested')
QUERYJUNK: ((State != Fixed) AND (Owner = user/1234567890) AND (ScheduleState !=     Tested))
Number of results: 0
Errors: [u'Could not parse: Error parsing expression -- expected ")" but saw "AND" instead.']

QUERYJUNK是Rally SDK自己构建的查询字符串的输出,还是在它发送到Rally服务之前的状态。

编辑:

根据Kyle的回答,这个问题是SDK本身的一个bug,所以我在我的脚本中找了个临时解决办法,直到SDK修复这个问题。

def buildQueryString(querySequence):
if type(query) in [types.ListType, types.TupleType]:
    seq = ["(%s)" % (s,) for s in querySequence]
    qs = "%s" % seq.pop(0)
    for qt in seq:
        qs = "(%s AND %s)" % (qs, qt)
    print "QS:",qs
    return qs

return querySequence

然后我把这个生成的字符串传给API,现在一切看起来都正常了。看起来API也支持字典格式的查询参数,但因为这个没有文档说明,而且我不需要,所以我没有为这种情况找临时解决办法。

1 个回答

3

这看起来是pyral在生成包含超过两个条件的查询字符串时出现了一个错误。

现在的情况是:

((State != Closed) AND (State != Fixed) AND (State != Submitted))

应该是:

(((State != Closed) AND (State != Fixed)) AND (State != Submitted))

我们会尽快修复这个问题,并把它开源到github上,这样社区就能更好地解决类似的问题。

撰写回答