Skip to content

Add collection methods to RunfilesSubject #72

@rickeylev

Description

@rickeylev

While asserting some runfiles, I needed to do something like:

target.runfiles().contains_at_least([
  <ends with "/foo">,
  <ends with "/foo.exe">
])

Unfortunately, there isn't a great way to do this.

At the least, I think these convenience methods need to be added:

  • .paths() -> CollectionSubject[str]: returns all the runfiles paths that are represented.
  • .path_map() -> DictSubject[str, File|None]: returns a mapping of path to File (or None, in the case of .empty_filenames). Unfortunately, this is, potentially, a lossy operation -- a symlink could have the same path as a regular file entry. So we would want to match Bazel's behavior for how it handles such cases as best we can.

And these two lower-level accessors need to be added:

  • .files() -> DepsetFileSubject: returns the Runfiles.file value as a subject
  • .empty_filenames() -> CollectionSubject[str]: Returns Runfiles.empty_filenames as a subject
  • .symlinks() -> DepsetSubject[SymlinkEntry]: Returns Runfiles.symlinks as a subject
  • .root_symlinks() -> DepsetSubject[SymlinKEntry]: Returns Runfiles.root_symlinks as a subject

I'm not sure how to best directly expose other methods because a runfiles object is a heterogenous collection -- Files, symlink entries, and str (empty file names). I think matching on the str paths is about the best we can do -- its the common denominator. For a more specific check, the other accessors can be used (e.g. to check that something is a symlink).

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions