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.3.post1.dev0-cp313-cp313-win_amd64.whl (376.8 kB view details)

Uploaded CPython 3.13Windows x86-64

filepattern-2.2.3.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.3.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.3.post1.dev0-cp313-cp313-macosx_11_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

filepattern-2.2.3.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.3.post1.dev0-cp312-cp312-win_amd64.whl (376.8 kB view details)

Uploaded CPython 3.12Windows x86-64

filepattern-2.2.3.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.3.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.3.post1.dev0-cp312-cp312-macosx_11_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

filepattern-2.2.3.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.3.post1.dev0-cp311-cp311-win_amd64.whl (376.9 kB view details)

Uploaded CPython 3.11Windows x86-64

filepattern-2.2.3.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.3.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.3.post1.dev0-cp311-cp311-macosx_11_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

filepattern-2.2.3.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.3.post1.dev0-cp310-cp310-win_amd64.whl (375.8 kB view details)

Uploaded CPython 3.10Windows x86-64

filepattern-2.2.3.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.3.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.3.post1.dev0-cp310-cp310-macosx_11_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

filepattern-2.2.3.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.3.post1.dev0-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for filepattern-2.2.3.post1.dev0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 9e27821a7d287ec2488d07c073d0b9f7c244b7bbea4e2125c104356ceedd5eb2
MD5 9d15df4bb3b9c3acd4ff71ed617b1c14
BLAKE2b-256 3c593ee87e804981e8cc958ec4769dcc9b3720d31b69463ea98dfb087ca0bebb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for filepattern-2.2.3.post1.dev0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 0a3ecd7d1d77eb9027305eac7ff6c792eb8d92ea1b1c2adf910a05450a1f8e9e
MD5 f34c74e55feb04467a354f2449d8fb0c
BLAKE2b-256 2d15cc4067f151ef40c49495e2e73043fd698585d5a0aba90d72240eae263ece

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for filepattern-2.2.3.post1.dev0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 8c09f6c7e220f7457b06483b2aa3846fec5a2f0d08b1aa27cd172cafd7e5ef68
MD5 e069961f380f9af093d48a47061c7d4f
BLAKE2b-256 d02e20d9ac539dee56818122f1a4d4ba86ea89ed3813a7f7939a824ff977ba95

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for filepattern-2.2.3.post1.dev0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 cc96662a3435f1ba0a145c922c3ca0a70346f06ea77e4513e6739d2af1bba227
MD5 7629180aeec8754858e93e66d795322e
BLAKE2b-256 b292d55094a219d4093c177bd25b161412f599d4260aaaabb643bdc9ea06bc1a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for filepattern-2.2.3.post1.dev0-cp313-cp313-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 cbf0cbea1d99bf11222e784b992aca8a6052a091c00f1193ca711f7ea3a5a346
MD5 cda489f16eaf298cdb0336e2a3e44e78
BLAKE2b-256 da7e9a62254dfa511643896b1f3188ea02d788aa72fa2a098fe0229214847c26

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for filepattern-2.2.3.post1.dev0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 cd1128e9c2cd522bf901498cdea77b8e3025b14acdd00ce6e1f2f51f53f54301
MD5 2ece9230fb40fde11c90ffea9c613266
BLAKE2b-256 18f67f1e5f76935e0fa131be6d7999bd3819e7b9961a729eb4f5c594035fafd5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for filepattern-2.2.3.post1.dev0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 d5f7e6506e6308a0ac50acb0175e65f5e9a08971293f510d7f88751b71d7f9ce
MD5 dd1802c49daabbe9651b4de36fe1c4cc
BLAKE2b-256 c472f287e4bcd27015aef4a1358c0fa3b5fa685fd324fc02bd188f3321e61402

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for filepattern-2.2.3.post1.dev0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 afe9a2cd0e38970d812ab1283275d59afccc3ea8f7c40c0ff7c79c3dccd43070
MD5 2ca0fb56c0feb5a28f0d10ad6192a4d3
BLAKE2b-256 85bfb97b2a491bfcda6f0c6023e9c2901afb8ac2044c64c4e5c160565e370286

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for filepattern-2.2.3.post1.dev0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 bd5be990c42b2f5dcf529e78e554114145a97172af5ce6a17e7ae28d0e53df39
MD5 2296fb65a132b89402232c2f7f15eb35
BLAKE2b-256 173770b1faa7bc8a1327ef77b731946fed92c6ccc5f19301b279390144e758d3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for filepattern-2.2.3.post1.dev0-cp312-cp312-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 8fbe6a5bcce55f64de4baeadb7949c45ae744abb6339f01ab940d121a0179a61
MD5 8b97e82fe0957fa10f1e2af79f44e3d0
BLAKE2b-256 e2324481cb34e92a35fd5e3ee90abecc17db01e3391a2d2585204ee7235af4f8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for filepattern-2.2.3.post1.dev0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 bab52a98b96136c2270f66ff0679624103470d9fe010e56ea8a27f92a937f4d5
MD5 2a2901850da8627a5caa9932bd628b09
BLAKE2b-256 cfa739d9e7535f31b37716af562fc96386f586f670245073bd25308ac3a2d4fe

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for filepattern-2.2.3.post1.dev0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 02df7dae600619d8dee7858fd20fe30c8b0fccb857eb50a061a49124ca65d3f1
MD5 3aac18e89590f78e136b1d1854b15d9b
BLAKE2b-256 5aa441399706b03ec9d6a5369d20d8d833e2f025b61302d8f8a2fbab93edda7b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for filepattern-2.2.3.post1.dev0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 00bb6ff0d36b901863163874c762457819d62f283ecd7dae2ca49712c7148725
MD5 43a4aa46575c1278fdea2ddcec02e361
BLAKE2b-256 b9ef476aa86848689fcbf79a7170560f4cb04f418dea1cc9cee980a3f82e7c3f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for filepattern-2.2.3.post1.dev0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b75340ec02b0a0d48e296e44fa2fa27107a44b0dbd5835b4336390dc5858f99b
MD5 1393b4c835b5597a56a127c7aaf765ac
BLAKE2b-256 6a903c91864be7c700b1e56d938701c67ccb1c6e64456d9de5e6c8336f8f2d9b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for filepattern-2.2.3.post1.dev0-cp311-cp311-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 4294c64a0bbdb8ff0d6f86b17aae76c9726345b9e39fead0ca6bc8c49725f7d6
MD5 21e1ed068b5e69b517e6d049e0d7bcdc
BLAKE2b-256 0454724f7bffcf61dd0b810424f27342bcf793e920e2b05f79680a3aac436e4e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for filepattern-2.2.3.post1.dev0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 34f9ae0d20d0a0e028811a91cca5387f54c75a2034c378020cf8f95311f43b51
MD5 ab3e0396290055006abf5ae9f99a2f30
BLAKE2b-256 cc420a5ae2ca966869135c62b53b808c6bb41a8e00f3dba2ef1c8530e463268e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for filepattern-2.2.3.post1.dev0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 beb682bc3455f9e4ef40f18a29c2a208cacdae02b53af03c098c58097b7ae736
MD5 6c458b73ed9b06b694733db2a1c37eaf
BLAKE2b-256 5b79c7207b85c6da8f8a15e9647860800cec62153ea16e9d1f89b3e9d4883aed

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for filepattern-2.2.3.post1.dev0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 a1fae0853cbfce77f24c4c8b0f255a5487dc98b56a514f570a934360d0ea9dc4
MD5 c795b8b983794d192c949ad3ff06862d
BLAKE2b-256 c6c636e4f5a7e3b2d47ff0621e14645d54992b07148b1fb2fd21e9bd06056624

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for filepattern-2.2.3.post1.dev0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ec3aef13f7936e47dd19f419583810ceac78d2b0e10552fcbb94dfb75aec8ba3
MD5 413f4a91cbf7b0e33538a19a3f9134b5
BLAKE2b-256 d2fa6bae582986f82198dbe1b981b6d256f3be02fc8faa95c43cf1b60b41777f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for filepattern-2.2.3.post1.dev0-cp310-cp310-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 80a5744008af91c49eb5b5a4e9726a1a88c91a4673b5f2151bfa1a2de94e7933
MD5 9a827f980319730af5403ff01ecb4fb6
BLAKE2b-256 c4dd216dab79121ffd5a1e0276df1dca678703d7838fd36bb4b97eca2396873d

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