Skip to main content

Utilities for parsing files in a directory based on a file name pattern.

Project description

Filepattern

Documentation Status PyPI PyPI - Downloads Bower

The filepattern utility is used to store files that follow a pattern, where the pattern is analogous to a simplified regular expression. The need for filepattern arises in situations where large amounts of data with a systematic naming convention needs to be filtered by patterns in the naming. For example, one may have a directory containing segmented images where the name contains information such as the channel, the column value, and the row value. filepattern provides the ability to extract all images containing such a naming pattern, filter by the row or column value, or group files by one or more of the aforementioned variables.

Summary

Install

filepattern is both pip and conda installable by running pip install filepattern or conda install filepattern -c conda-forge

Build and Install

Alternatively, filepattern can either be build inside a conda environment or independently outside of it directly from the source.

Inside Conda

filepattern uses a CMake build system. Below is an example of how to build filepattern Python package inside a conda environment on Linux.

git clone https://github.com/PolusAI/filepattern.git
cd filepattern
conda install -y -c conda-forge compilers --file ci-utils/envs/conda_cpp.txt --file ci-utils/envs/conda_py.txt
CMAKE_ARGS="-DCMAKE_PREFIX_PATH=$CONDA_PREFIX -DCMAKE_INSTALL_PREFIX=$CONDA_PREFIX " python -m pip install . -vv

Without Using Conda

To build filepattern outside of a conda environment, use the following example.

git clone https://github.com/PolusAI/filepattern.git
cd filepattern
mkdir build_dep
cd build_dep
bash ../ci-utils/install_prereq_linux.sh
cd ..
export FILEPATTERN_DEP_DIR=./build_dep/local_install
python -m pip install . -vv

C++ Library

filepattern also comes with a C++ API. To build and install filepattern as a C++ library, following the steps below.

git clone https://github.com/PolusAI/filepattern.git
cd filepattern
mkdir build
cd build
bash ../ci-utils/install_prereq_linux.sh
cmake -Dfilepattern_SHARED_LIB=ON -DCMAKE_PREFIX_PATH=./local_install -DCMAKE_INSTALL_PREFIX=./local_install ../src/filepattern/cpp/
make -j4
make install

To link filepattern with the client code, use the following CMake statements.

find_package(filepattern REQUIRED)
target_link_libraries(client_executable PRIVATE filepattern::filepattern)

Java API

filepattern also supplies a Java API. To add filepattern as a dependency to a project, the following can be added to the pom.xml of the maven project.

<dependencies>
    <dependency>
        <groupId>ai.polus.utils</groupId>
        <artifactId>filepattern</artifactId>
        <version>LATEST</version>
    </dependency>
</dependencies>

The Java API can also be built from source using Maven. To build the project, run

git clone https://github.com/PolusAI/filepattern.git
cd filepattern
mvn clean install

To build a jar instead of installing filepattern, mvn clean package can be used in place of mvn clean install.

For more information of the Java API, see the Java API documentation

Filepattern

When only a path to a directory and a pattern are supplied to the constructor of filepattern, filepattern will iterate over the directory, matching the filenames in the directory to the filepattern. The filepattern can either be supplied by the user or can be found using the infer_pattern method of filepattern. For example, consider a directory containing the following files,

img_r001_c001_DAPI.tif
img_r001_c001_TXREAD.tif
img_r001_c001_GFP.tif

In each of these filenames, there are three descriptors of the image: the row, the column, and the channel. To match these files, the pattern img_r{r:ddd}_c{c:ddd}_{channel:c+} can be used. In this pattern, the named groups are contained within the curly brackets, where the variable name is before the colon and the value is after the colon. For the value, the descriptors d and c are used, which represent a digit and a character, respectively. In the example pattern, three d's are used to capture three digits. The + after c denotes that one or more characters will be captured, which is equivalent to [a-zA-z]+ in a regular expression. The + symbol may be used after either d or c.

To have filepattern guess what the pattern is for a directory, the static method infer_pattern can be used:

import filepattern as fp

path = 'path/to/directory'

pattern = fp.infer_pattern(path)

print(pattern)

The result is:

img_r001_c001_{r:c+}.tif

Note that the infer_pattern can also guess the patterns from stitching vectors and text files when a path to a text file is passed, rather than a path to a directory.

To retrieve files from a directory that match the filepattern, an iterator is called on the FilePattern object, as shown below. A user specified custom pattern, such as the one below, or the guessed pattern can be passed to the constructor.

import filepattern as fp
import pprint

filepath = "path/to/directory"

pattern = "img_r{r:ddd}_c{c:ddd}_{channel:c+}.tif"

files = fp.FilePattern(filepath, pattern)

for file in files():
    pprint.pprint(file)

The output is:

({'c': 1, 'channel': 'DAPI', 'r': 1},
 ['path/to/directory/img_r001_c001_DAPI.tif'])
({'c': 1, 'channel': 'TXREAD', 'r': 1},
 ['path/to/directory/img_r001_c001_TXREAD.tif'])
({'c': 1, 'channel': 'GFP', 'r': 1},
 ['path/to/directory/img_r001_c001_GFP.tif'])

As shown in this example, the output is a tuple where the first member is a map between the group name supplied in the pattern and the value of the group for each file name. The second member of the tuple is a vector containing the path to the matched file. The second member is stored in a vector for the case where a directory is supplied with multiple subdirectories. In this case, a third optional parameter can be passed to the constructor. If the parameter recursive is set to True, a recursive directory iterator will be used, which iterates over all subdirectories. If the basename of two files from two different subdirectories match, filepattern will add the path of the file to the vector in the existing tuple rather than creating a new tuple.

For example, consider the directory with the structure

/root_directory
    /DAPI
        img_r001_c001.tif
    /GFP
        img_r001_c001.tif
    /TXREAD
        img_r001_c001.tif

In this case, the subdirectories are split by the channel. Recursive matching can be used as shown below.

import filepattern as fp
import pprint

filepath = "path/to/root/directory"

pattern = "img_r{r:ddd}_c{c:ddd}.tif"

files = fp.FilePattern(filepath, pattern, recursive=True)

for file in files():
    pprint.pprint(file)

The output of this case is:

({'c': 1, 'r': 1},
 ['path/to/root/directory/DAPI/img_r001_c001.tif',
  'path/to/root/directory/GFP/img_r001_c001.tif',
  'path/to/root/directory/TXREAD/img_r001_c001.tif'])

Floating Point Support

`filepattern` has the ability to capture floating point values in file patterns. For example, if we have a set of files
img_r0.05_c1.15.tif
img_r1.05_c2.25.tif
img_r2.05_c3.35.tif

We can capture the values in a couple of different ways. Similar to capturing digits, the character f can be used to capture an element of a floating point number. Note that with this method, the decimal point in the number must be captured by an f. For example, in the file img_r0.05_c1.15.tif, the floating point numbers would be capture with ffff. The code to utilize this method is

filepath = "path/to/directory"

pattern = "img_r{r:ffff}_c{c:ffff}.tif"

files = fp.FilePattern(filepath, pattern)

for file in files():
    pprint.pprint(file)

The result is:

({'c': 1.15, 'r': 0.05},
 ['path/to/directory/img_r0.05_c1.15.tif'])
({'c': 2.25, 'r': 1.05},
 ['path/to/directory/img_r1.05_c2.25.tif'])
({'c': 3.35, 'r': 2.05},
 ['path/to/directory/img_r2.05_c3.35.tif'])

To capture floating point numbers with an arbitrary number of digits, we can use f+. This method operates in the same way as using d+ or c+, where all digits (and the decimal point) will be captured for a floating point of any length. The code for this method is

filepath = "path/to/directory"

pattern = "img_r{r:f+}_c{c:f+}.tif"

files = fp.FilePattern(filepath, pattern)

for file in files():
    pprint.pprint(file)

The result of this code is the same as the previous example.

The final method for capturing floating points is to use d to capture the digits and to add the decimal point where needed. For example, in the file img_r0.05_c1.15.tif, the floating point numbers could be captured using d.dd. The code for this method is:

filepath = "path/to/directory"

pattern = "img_r{r:d.dd}_c{c:d.dd}.tif"

files = fp.FilePattern(filepath, pattern)

for file in files():
    pprint.pprint(file)

Once again, the results are the same as the first example.

Note that d can be used to specify even more specific floating points. For example, if we want to capturing all floating points with one digit in the whole part and an arbitrary number of digits in the decimal, we can add d.d+ for the pattern. Similarly, this could be used in a reverse manner to capture an arbitrary number of digits in the whole part using d+.ddd.

Group By

If images need to be processed in a specific order, for example by the row number, the group_by function is used. With the directory

img_r001_c001_DAPI.tif
img_r002_c001_DAPI.tif
img_r001_c001_TXREAD.tif
img_r002_c001_TXREAD.tif
img_r001_c001_GFP.tif
img_r002_c001_GFP.tif

the images can be returned in groups where r is held constant by passing the parameter group_by='r' to the object iterator.

import filepattern as fp
import pprint

filepath = "path/to/directory"

pattern = "img_r{r:ddd}_c{c:ddd}_{channel:c+}.tif"

files = fp.FilePattern(filepath, pattern)

for file in files(group_by='r'):
    pprint.pprint(file)

The output is:

('r': 1, [({'c': 1, 'channel': 'DAPI', 'file': 0, 'r': 1},
  ['/home/ec2-user/Dev/FilePattern/data/example/img_r001_c001_DAPI.tif']),
 ({'c': 1, 'channel': 'TXREAD', 'file': 0, 'r': 1},
  ['/home/ec2-user/Dev/FilePattern/data/example/img_r001_c001_TXREAD.tif']),
 ({'c': 1, 'channel': 'GFP', 'file': 0, 'r': 1},
  ['/home/ec2-user/Dev/FilePattern/data/example/img_r001_c001_GFP.tif'])])
('r': 2, [({'c': 1, 'channel': 'DAPI', 'file': 0, 'r': 2},
  ['/home/ec2-user/Dev/FilePattern/data/example/img_r002_c001_DAPI.tif']),
 ({'c': 1, 'channel': 'GFP', 'file': 0, 'r': 2},
  ['/home/ec2-user/Dev/FilePattern/data/example/img_r002_c001_GFP.tif']),
 ({'c': 1, 'channel': 'TXREAD', 'file': 0, 'r': 2},
  ['/home/ec2-user/Dev/FilePattern/data/example/img_r002_c001_TXREAD.tif'])])

Note that the return of each call is a tuple where the first member is the group_by variable mapped to the current value and the second member is a list of files where the group_by variable matches the current value.

Get Matching

To get files where the variable matches a value, the get_matching method is used. For example, if only files from the TXREAD channel are needed, get_matching(channel=['TXREAD'] is called.

filepath = "/home/ec2-user/Dev/FilePattern/data/example"

pattern = "img_r{r:ddd}_c{c:ddd}_{channel:c+}.tif"

files = fp.FilePattern(filepath, pattern)

matching = files.get_matching(channel=['TXREAD'])

pprint.pprint(matching)

The output is:

[({'c': 1, 'channel': 'TXREAD', 'r': 1},
  ['/home/ec2-user/Dev/FilePattern/data/example/img_r001_c001_TXREAD.tif']),
 ({'c': 1, 'channel': 'TXREAD', 'r': 2},
  ['/home/ec2-user/Dev/FilePattern/data/example/img_r002_c001_TXREAD.tif'])]

Text files

filepattern can also take in a text file as an input rather than a directory. To use this functionality, a path to a text file is supplied to the path variable rather than a directory. When a text file is passed as input, each line of the text file will be matched to the pattern. For example, a text file containing containing the strings

img_r001_c001_DAPI.tif
img_r001_c001_TXREAD.tif
img_r001_c001_GFP.tif

can be matched to the pattern img_r{r:ddd}_c{c:ddd}_{channel:c+}.tif with:

import filepattern as fp
import pprint

filepath = "path/to/file.txt"

pattern = "img_r{r:ddd}_c{c:ddd}_{channel:c+}.tif"

files = fp.FilePattern(filepath, pattern)

for file in files():
    pprint.pprint(file)

The output is:

({'c': 1, 'channel': 'DAPI', 'r': 1},
 ['img_r001_c001_DAPI.tif'])
({'c': 1, 'channel': 'TXREAD', 'r': 1},
 ['img_r001_c001_TXREAD.tif'])
({'c': 1, 'channel': 'GFP', 'r': 1},
 ['img_r001_c001_GFP.tif'])

After calling filepattern on a text file, the group_by and get_matching functionality can be used the same as outlined in the FilePattern section.

Stitching vectors

filepattern can also take in stitching vectors as input. In this case, a path to a text file containing a stitching vector is passed to the path variable. A stitching vector has the following form,

file: x01_y01_wx0_wy0_c1.ome.tif; corr: 0; position: (0, 0); grid: (0, 0);
file: x02_y01_wx0_wy0_c1.ome.tif; corr: 0; position: (3496, 0); grid: (3, 0);
file: x03_y01_wx0_wy0_c1.ome.tif; corr: 0; position: (6992, 0); grid: (6, 0);
file: x04_y01_wx0_wy0_c1.ome.tif; corr: 0; position: (10488, 0); grid: (9, 0);

This stitching vector can be processed using

import filepattern as fp

filepath = 'path/to/stitching/vector.txt'

pattern = 'x0{x:d}_y01_wx0_wy0_c1.ome.tif'

files = fp.FilePattern(filepath, pattern)

for file in files():
    pprint.pprint(files)

The output is:

({'correlation': 0, 'gridX': 0, 'gridY': 0, 'posX': 0, 'posY': 0, 'x': 1},
 ['x01_y01_wx0_wy0_c1.ome.tif'])
({'correlation': 0, 'gridX': 3, 'gridY': 0, 'posX': 3496, 'posY': 0, 'x': 2},
 ['x02_y01_wx0_wy0_c1.ome.tif'])
({'correlation': 0, 'gridX': 6, 'gridY': 0, 'posX': 6992, 'posY': 0, 'x': 3},
 ['x03_y01_wx0_wy0_c1.ome.tif'])
({'correlation': 0, 'gridX': 9, 'gridY': 0, 'posX': 10488, 'posY': 0, 'x': 4},
 ['x04_y01_wx0_wy0_c1.ome.tif'])

As shown in the output, filepattern not only captures the specified variables from the pattern, but also captures the variables supplied in the stitching vector.

Out of core

filepattern has the ability to use external memory when the dataset is too large to fit in main memory, i.e. it utilizes disk memory along with RAM. It has the same functionality as filepattern, however it takes in an addition parameter called block_size, which limits the amount of main memory used by filepattern. Consider a directory containing the files:

img_r001_c001_DAPI.tif
img_r001_c001_TXREAD.tif
img_r001_c001_GFP.tif

This directory can be processed with only one file in memory as:

import filepattern as fp
import pprint

filepath = "path/to/directory"

pattern = "img_r{r:ddd}_c{c:ddd}_{channel:c+}.tif"

files = fp.FilePattern(filepath, pattern, block_size="125 B")


for file in files():
    pprint.pprint(file)

The output from this example is:

({'c': 1, 'channel': 'DAPI', 'r': 1},
 ['/home/ec2-user/Dev/FilePattern/data/example/img_r001_c001_DAPI.tif'])
({'c': 1, 'channel': 'TXREAD', 'r': 1},
 ['/home/ec2-user/Dev/FilePattern/data/example/img_r001_c001_TXREAD.tif'])
({'c': 1, 'channel': 'GFP', 'r': 1},
 ['/home/ec2-user/Dev/FilePattern/data/example/img_r001_c001_GFP.tif'])

Note that the block_size argument is provided in bytes (B) in this example, but also has the options for kilobytes (KB), megabytes (MB), and gigabytes (GB). The block_size must be under 1000 GB.

Group by and get matching

The out of core version of filepattern contains the same functionalities as the in memory version. group_by is called the same way, i.e.,

for file in files(group_by="r"):
    pprint.pprint(file)

The output remains identical to the in memory version.

The get_matching functionality remains the same, however the API is slightly different. In this case, get_matching is called as

for matching in files.get_matching(channel=['TXREAD'])
    pprint.pprint(matching)

where the output is returned in blocks of block_size. The output is:

({'c': 1, 'channel': 'TXREAD', 'r': 1},
 ['/home/ec2-user/Dev/FilePattern/data/example/img_r001_c001_TXREAD.tif'])

Out of Core: text files and stitching vectors

Out of core processing can also be used for stitching vectors and text files. To utilize this functionality, call filepattern the same way as described previously, but add in the block_size parameter, as described in the (Out of Core)[#out-of-core] section.

Contributing

We welcome contributions to filepattern! Please see CONTRIBUTING.md for detailed guidelines.

Quick Start for Contributors

  1. Fork the repository
  2. Create a feature branch: git checkout -b feat/my-feature
  3. Make your changes following Conventional Commits
  4. Push to your fork and submit a pull request

Commit Message Format

We use Conventional Commits for automated releases:

  • feat: - New features (minor version bump)
  • fix: - Bug fixes (patch version bump)
  • docs: - Documentation changes
  • refactor: - Code refactoring
  • test: - Test additions or changes
  • chore: - Maintenance tasks

Example: feat: add support for nested directory patterns

For breaking changes, use feat!: or include BREAKING CHANGE: in the commit footer (major version bump).

Release Process

Releases are fully automated:

  1. Commits following conventional format are pushed to master
  2. Release Please creates/updates a Release PR with version bump and changelog
  3. When the Release PR is merged, a GitHub Release is created
  4. Automated workflows publish to PyPI and Maven Central

You don't need to manually update version numbers - the automation handles this based on your commit messages!

Authors

Jesse McKinzie(Jesse.McKinzie@axleinfo.com, jesse.mckinzie@nih.gov) Nick Schaub (nick.schaub@nih.gov, nick.schaub@labshare.org)

License

This project is licensed under the MIT License Creative Commons License - see the LICENSE file for details

Acknowledgments

  • This utility was inspired by the notation found in the MIST algorithm developed at NIST.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

filepattern-2.2.2.post1.dev0-cp313-cp313-win_amd64.whl (376.7 kB view details)

Uploaded CPython 3.13Windows x86-64

filepattern-2.2.2.post1.dev0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (1.9 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

filepattern-2.2.2.post1.dev0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (2.1 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

filepattern-2.2.2.post1.dev0-cp313-cp313-macosx_11_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

filepattern-2.2.2.post1.dev0-cp313-cp313-macosx_10_15_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.13macOS 10.15+ x86-64

filepattern-2.2.2.post1.dev0-cp312-cp312-win_amd64.whl (376.7 kB view details)

Uploaded CPython 3.12Windows x86-64

filepattern-2.2.2.post1.dev0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (1.9 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

filepattern-2.2.2.post1.dev0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (2.1 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

filepattern-2.2.2.post1.dev0-cp312-cp312-macosx_11_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

filepattern-2.2.2.post1.dev0-cp312-cp312-macosx_10_15_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.12macOS 10.15+ x86-64

filepattern-2.2.2.post1.dev0-cp311-cp311-win_amd64.whl (376.9 kB view details)

Uploaded CPython 3.11Windows x86-64

filepattern-2.2.2.post1.dev0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (1.9 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

filepattern-2.2.2.post1.dev0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (2.1 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

filepattern-2.2.2.post1.dev0-cp311-cp311-macosx_11_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

filepattern-2.2.2.post1.dev0-cp311-cp311-macosx_10_15_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.11macOS 10.15+ x86-64

filepattern-2.2.2.post1.dev0-cp310-cp310-win_amd64.whl (375.7 kB view details)

Uploaded CPython 3.10Windows x86-64

filepattern-2.2.2.post1.dev0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (1.9 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

filepattern-2.2.2.post1.dev0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (2.1 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

filepattern-2.2.2.post1.dev0-cp310-cp310-macosx_11_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

filepattern-2.2.2.post1.dev0-cp310-cp310-macosx_10_15_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.10macOS 10.15+ x86-64

File details

Details for the file filepattern-2.2.2.post1.dev0-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for filepattern-2.2.2.post1.dev0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 2085c0d6492a964b18ef5da19164ad9897566745f9c40534d54586429f17fbb8
MD5 d2df3670870af9401a30e218b86c08af
BLAKE2b-256 b54b36967f6009644b663d1efc5018116e2300b9f30e987b43c600c22e349a69

See more details on using hashes here.

File details

Details for the file filepattern-2.2.2.post1.dev0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for filepattern-2.2.2.post1.dev0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 319ecf3ad82eb5c6bcd7fd59b222c572b41b5cd81439062735fe80e69f082e77
MD5 46e1c42a42ce3fbf3ee4b74701019a40
BLAKE2b-256 39db12b52c29baf0036a4bdf07a93a7313b35e7da895a6490cbf6feab3bc5fed

See more details on using hashes here.

File details

Details for the file filepattern-2.2.2.post1.dev0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for filepattern-2.2.2.post1.dev0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 03c23860147418fcdf6d41d9ee7fbf46bf1971e244a58f53b90e3e4687474a24
MD5 36bbade33f4fa02b2ede1eb7a1bca4b6
BLAKE2b-256 f396ca62d3db88de5fdf3cfd93a6aab7eaefd1aeefceaee3653bfa0e85b78684

See more details on using hashes here.

File details

Details for the file filepattern-2.2.2.post1.dev0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for filepattern-2.2.2.post1.dev0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 aa0af8b5d7915c1013b341219f258ec2067aa23b7cb49773b0167bffa0c241b1
MD5 ee6da0c21fca052015159893341a6612
BLAKE2b-256 f6dc75708d7f590b912a54d6db15d258a147eff6ae306926ec5b6cda91834868

See more details on using hashes here.

File details

Details for the file filepattern-2.2.2.post1.dev0-cp313-cp313-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for filepattern-2.2.2.post1.dev0-cp313-cp313-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 ab4e87d413d85979958eb2244ff815d49e8545ca915a68f586e5ba0c5951ce3e
MD5 006df8e75f13a6ee8d95d1df4de39a57
BLAKE2b-256 4525a556e3849f7c578abb789841e53dcc14ed9a49b0bc81ddd5bf28de5eef97

See more details on using hashes here.

File details

Details for the file filepattern-2.2.2.post1.dev0-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for filepattern-2.2.2.post1.dev0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 8791798f4185964b3e0c4f35e2a300d059f6d1a50305b095402dd3c431751839
MD5 f5e635c5710f288d15323cf4d04ef496
BLAKE2b-256 c7d57090a363a55077f8dc08ca91b71948d2e2327b1eb27733ae254b1d538dcf

See more details on using hashes here.

File details

Details for the file filepattern-2.2.2.post1.dev0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for filepattern-2.2.2.post1.dev0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 05fbde8f45587ef49a1f515fba55560f9bcd570e029f4104603c477164239c29
MD5 fed29e9976abb4c4f438a02d4c2be6a9
BLAKE2b-256 008264fab222e1c98653d3cf7aa9f7bdff74c0fd7065b18f8aee703c94ec8d9b

See more details on using hashes here.

File details

Details for the file filepattern-2.2.2.post1.dev0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for filepattern-2.2.2.post1.dev0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 88c7b7fbb12660b3327289a763109e38b059d7fecc7b28e74a9e38f76cbfbf41
MD5 56f0a36def7a838ad9a9df86b19d8407
BLAKE2b-256 301b8c7785e3e4944369c4c1ddb0f061c74b4e9fea53523933b5eec00d185433

See more details on using hashes here.

File details

Details for the file filepattern-2.2.2.post1.dev0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for filepattern-2.2.2.post1.dev0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 297ce894e0cbb79600dc31d18ca7b80aba092d15200d46386057d0f72ad6a9e9
MD5 17c5ca53e126daac129a156ec9bb015d
BLAKE2b-256 ddba9766a81012679e48d0fef50bdc255524ffcc26388eedd94f2e3a9eea5024

See more details on using hashes here.

File details

Details for the file filepattern-2.2.2.post1.dev0-cp312-cp312-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for filepattern-2.2.2.post1.dev0-cp312-cp312-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 9eb837c105c192a0274768a69e066ce273711c6158f5bd000bbae09493095f89
MD5 5b2cdfe237a601d5ac5a81e2e0ab21f7
BLAKE2b-256 ef7d46121bea978272cf0bbfa93ae04c4e9278bef342faa9ed0375f9211771a4

See more details on using hashes here.

File details

Details for the file filepattern-2.2.2.post1.dev0-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for filepattern-2.2.2.post1.dev0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 2b316fb62450637766ccec491bfefd1a0f3fad9f55f3c478683577d3d88c5b0e
MD5 bd26249115189655dc1e85c16edddfab
BLAKE2b-256 4ce9c83c7477de4afb6c61a6eceefbfae21c2b61045383ec613035f36c67caf4

See more details on using hashes here.

File details

Details for the file filepattern-2.2.2.post1.dev0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for filepattern-2.2.2.post1.dev0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 6848e288017f1679c05ecb22415135c51359c633814df6892a90f0f0a3da403d
MD5 3a101f75162e8e29317ad20838a96cfb
BLAKE2b-256 a717df86cd62f7054fa7b065aa1c0b27aaa0eea1fe01384621748957a9f0f357

See more details on using hashes here.

File details

Details for the file filepattern-2.2.2.post1.dev0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for filepattern-2.2.2.post1.dev0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 b8cb232f51f30b38351cd68ec4ab3df5f62ee04187dc2cc14b400dfe50ffb4fa
MD5 eb626e1ba9a7ab6ea7ba5801bc57e1fb
BLAKE2b-256 011703f26270adaa6a1ac496ac7d27e62882d1e28a470afb8fa40956239d33af

See more details on using hashes here.

File details

Details for the file filepattern-2.2.2.post1.dev0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for filepattern-2.2.2.post1.dev0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1705d9e7f38dcfb1ce1588ed8f63caf0e83c5110e1d9739eb20e9ce3960e2ce7
MD5 561d1863a3fed69c3341a9c9c9317622
BLAKE2b-256 3d171eed24bd25c434b1318a41fba864a167ea683601f1409bbde0cf7356df5f

See more details on using hashes here.

File details

Details for the file filepattern-2.2.2.post1.dev0-cp311-cp311-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for filepattern-2.2.2.post1.dev0-cp311-cp311-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 cc02b4024beb6d99a754342e163341974098996f3f7d2b68567d87fb976cb211
MD5 a82ad967376c7b2b409e2dd17e113c47
BLAKE2b-256 7434ba4fefe7aa6b9f792db8fbde5e074e813494c1fbfcee65df2eb8a48171aa

See more details on using hashes here.

File details

Details for the file filepattern-2.2.2.post1.dev0-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for filepattern-2.2.2.post1.dev0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 2efdb61d8eb2ad742e36c757b86435e4f44f311cdb61ed2fbdee8b01c8755d50
MD5 9e59abf28aca8f4f9ae6060b750ef7ec
BLAKE2b-256 2ca06feeb5daa5b2f5bf579526b9d529dc7102c449414c99c09634937725203b

See more details on using hashes here.

File details

Details for the file filepattern-2.2.2.post1.dev0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for filepattern-2.2.2.post1.dev0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 672531c870147762b144fbda57eb0b43706468acc9407ec6a0fa30ab6ca180d8
MD5 d56300a1dbbd529f5508c6dcd0d7c0e9
BLAKE2b-256 9d803efeb35005d01ac9f171519bddeeee82c57812e2d7c06f33e8a949b22671

See more details on using hashes here.

File details

Details for the file filepattern-2.2.2.post1.dev0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for filepattern-2.2.2.post1.dev0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 0cce81f3cea67b425a4bc2d65f7677edaa0de8c7995835e6143862189034c676
MD5 c02d20666865249f6e1b4ad0b7943f85
BLAKE2b-256 bc281ac6b600c29290f58cdc036a1670febfd34a26dfe9ab86b6299cc34f7924

See more details on using hashes here.

File details

Details for the file filepattern-2.2.2.post1.dev0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for filepattern-2.2.2.post1.dev0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3419dd7cf25fa661cefd7e058361fc62a295c10d17c73f87a37ef10d5e778ae3
MD5 525ca5fee903898e9dd680453842a112
BLAKE2b-256 bba686bd67860e8caf883da66d3a0c1dbfd75c39f15e99ff65f51f6ed50ca9bc

See more details on using hashes here.

File details

Details for the file filepattern-2.2.2.post1.dev0-cp310-cp310-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for filepattern-2.2.2.post1.dev0-cp310-cp310-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 994277025849db27da3cdddcb832f8a8780d26bcfc32c6f20ced874b43d5bb78
MD5 859a6e9be34b498340fc5459fcd8d8ab
BLAKE2b-256 9a271d813bdc64cadd8796a698fdc782765acb5416992048db81bcc29775caf5

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page