Handle ID creation and parsing.
BE IDs are formatted:
where each <..> is a UUID. For example:
refers to bug 3438b72c-6244-4f1d-8722-8c8d41484e35 which is located in bug directory bea86499-824e-4e77-b085-2d581fa9ccab. This is a bit of a mouthful, so you can truncate each UUID so long as it remains unique. For example:
If there were two bugs 3438... and 343a... in bea, you’d have to use:
BE will only truncate each UUID down to three characters to slightly future-proof the short user ids. However, if you want to save keystrokes and you know there is only one bug directory, feel free to truncate all the way to zero characters:
To refer to other bug-directories/bugs/comments from bug comments, simply enclose the ID in pound signs (#). BE will automatically expand the truncations to the full UUIDs before storing the comment, and the reference will be appropriately truncated (and hyperlinked, if possible) when the comment is displayed.
Although bug and comment IDs always appear in compound references, UUIDs at each level are globally unique. For example, comment bea/343/ba96f1c0-ba48-4df8-aaf0-4e3a3144fc46 will only appear under bea/343. The prefix (bea/343) allows BE to reduce caching global comment-lookup tables and enables easy error messages (“I couldn’t find bea/343/ba9 because I don’t know where the bea bug directory is located”).
Keep track of the object type hierarchy.
Store an object ID and produce various representations.
type : ‘bugdir’ or ‘bug’ or ‘comment’
IDs have several formats specialized for different uses.
In storage, all objects are represented by their uuid alone, because that is the simplest globally unique identifier. You can generate ids of this sort with the .storage() method. Because an object’s storage may be distributed across several chunks, and the chunks may not have their own uuid, we generate chunk ids by prepending the objects uuid to the chunk name. The user id types do not support this chunk extension feature.
For users, the full uuids are a bit overwhelming, so we truncate them while retaining local uniqueness (with regards to the other objects currently in storage). We also prepend truncated parent ids for two reasons:
So that a user can locate the repository containing the referenced object. It would be hard to find bug XYZ if that’s all you knew. Much easier with ABC/XYZ, where ABC is the bugdir. Each project can publish a list of bugdir-id-to-location mappings, e.g.:
ABC...(full uuid)...DEF https://server.com/projectX/be/
which is easier than publishing all-object-ids-to-location mappings.
Because it’s easier to generate and parse truncated ids if you don’t have to fetch all the ids in the storage repository but can restrict yourself to a specific branch.
You can generate ids of this sort with the user() method, although in order to preform the truncation, your object (and its parents must define a sibling_uuids method.
While users can use the convenient short user ids in the short term, the truncation will inevitably lead to name collision. To avoid that, we provide a non-truncated form of the short user ids via the long_user() method. These long user ids should be converted to short user ids by intelligent user interfaces.
Helper class for ID replacement in text.
Reassembles the match elements from REGEXP matching into the original ID, for easier replacement.
A purported ID does not have the appropriate syntax.
id : str
msg : str, optional
Multiple IDs match the given user ID.
id : str
common : str
matches : list of str
No IDs match the given user ID.
id : str
possible_ids : list of str
msg : str, optional
Regular expression for matching IDs (both short and long) in text.
Extract uuid children from other children generated by ID.storage().
This is useful for separating data belonging to a particular object directly from entries for its child objects. Since the Storage backend doesn’t distinguish between the two.
>>> list(child_uuids(['abc123/values', '123abc', '123def'])) ['123abc', '123def']
Convert long user IDs to short user IDs in text (see ID). The list of bugdirs allows uniqueness-maintaining truncation of the bugdir portion of the ID.
Convert a long user ID to a short user ID (see ID). The list of bugdirs allows uniqueness-maintaining truncation of the bugdir portion of the ID.
Parse a user ID (see ID), returning a dict of parsed information.
The returned dict will contain a value for “type” (from HIERARCHY) and values for the levels that are defined.
This function tries to expand IDs before parsing, so it can handle both short and long IDs successfully.
Split the short ID fragment into a portion corresponding to base, and a portion inside base.
>>> residual('ABC/DEF/', '//GHI') ('//', 'GHI') >>> residual('ABC/DEF/', '/D/GHI') ('/D/', 'GHI') >>> residual('ABC/DEF', 'A/D/GHI') ('A/D/', 'GHI') >>> residual('ABC/DEF', 'A/D/GHI/JKL') ('A/D/', 'GHI/JKL')
Convert short user IDs to long user IDs in text (see ID). The list of bugdirs allows uniqueness-checking during expansion of the bugdir portion of the ID.
Convert a short user ID to a long user ID (see ID). The list of bugdirs allows uniqueness-checking during expansion of the bugdir portion of the ID.