The formal string representation operator __repr__() of class Query omits the join_specs attribute:
>>> query = Query(client, "Rule", order=['grouping', 'what', 'id'], join_specs={"grouping": "LEFT OUTER JOIN"})
>>> repr(query)
"Query(<icat.client.Client object at 0x7f1e16158860>, 'Rule', attributes=[], aggregate=None, order=[('grouping.name', None), ('what', None), ('id', None)], conditions={}, includes=set(), limit=None)"
This is related to #90: both methods, copy() and __repr__() have simply been forgotten to update in #85.