Skip to main content

A Python wrapper for the FAPEC data compressor.

Project description

Fapyc

1. What is FAPEC and fapyc

A Python wrapper for the FAPEC data compressor. (C) DAPCOM Data Services S.L. - https://www.dapcom.es

The full FAPEC compression and decompression library is included in this package, but a valid license file must be available to properly use it. Without a license, you can still use the decompressor (yet with some limitations, such as the maximum number of threads, the recovery of corrupted files, or the decompression of just one part of a multi-part archive). You can get free evaluation licenses at https://www.dapcom.es/get-fapec/ to test the compressor. For full licenses, please contact us at fapec@dapcom.es Once a valid license is obtained (either full or evaluation), you must define a FAPEC_HOME environment variable pointing to the path where you have stored your fapeclic.dat license file.

2. Quick guide

There are 3 main execution modes:

  • File: When invoking Fapyc or Unfapyc on a filename, it will (de)compress it directly into another file.
  • Buffer: You can load the whole file to (de)compress on e.g. a byte array, and then invoke Fapyc/Unfapyc which will leave the result in the output buffer. Obviously, you should be careful with large files, as it may use a lot of RAM.
  • Chunk: FAPEC internally works in 'chunks' of data, typically 1-8 MB each (maximum 384MB each), which allows to progressively (de)compress a huge file while keeping memory usage under control. File and buffer (de)compression automatically uses this feature. For now, directly invoking this method is only available in the native C API, not in fapyc yet.

The file and buffer operations can also be combined:

  • Buffer-to-file compression: You can pass a buffer to Fapyc and tell it to progressively compress and store it into a file.
  • File-to-buffer decompression: You can directly decompress a file (without having to load it beforehand) and leave its decompressed output in a buffer, which you can use afterwards.

In addition, the current version of Fapyc includes a console application that allows the user to use basic functionalities of Fapyc.These include:

  • Compress a file or folder: The user can compress a single file or a folder using basic options as overwrite, the number of threads and the output file path. The automatic compression will be used.
  • Decompress FAPEC file: You can see what parts contains a Fapec file and the information about them. Also, you can decompress one part or all of them.

3 Functions and data structures

3.1 User options

The user can modify some parameters of compression/decompression.In the current fapyc version, the following user options are available:

  • Sets the FAPEC user options: Verbosity level (0-3), Error Detection And Correction option (0-3), Encryption option (0-2), Decompression mode (0-3), Abort in case of decompression errors (do not try to recover) (0-1):

    fapyc_set_useropts(verbLevel, edacOpt, cryptOpt, decMode, abortErr)

  • Sets the number of threads. 0 means single-thread, 1 means one thread for compression/decompression plus read/write threads, 2...16 means multi-thread for comp/decomp , -1 means automatic configuration from the CPUs found:

    fapyc_set_nthreads(threadPool)

  • Set delete input after successfully finishing (True/False):

    fapyc_set_delInput(delInput)

  • Set ask before overwriting (True/False):

    fapyc_set_askOverwrite(askOverwrite)

  • Set do not recurse subdirectories (in compression) or extract all files in the same working directory (in decompression) (True-False):

    fapyc_set_noDirTree(noDirTree)

  • Set license-enforced privacy (True/False):

    fapyc_set_enforcePriv(enforcePriv)

  • Set encrypt file when compressing. 0 to generate a non-encrypted archive; 1 to use XXTEA; 2 to use OpenSSL (if supported):

    fapyc_set_cryptOpt(cryptOpt)

  • Set abort decompression in case of errors (True/False):

    fapyc_set_abortErr(abortErr)

  • Set the password for decompression (String):

    fapyc_set_decompress_password(password)

3.2 Logger functions

To handle errors conveniently the user can define his own looger in Python to manage this type of messages, with the following functions:

  • Set the fapyc logger to (re)use an existing Python logger provided by the user (Python logger):

    fapyc_set_logger(logger)

  • Write a message to the logger, specifying the logging level (Python logging level, String):

    fapyc_write_logger(level, msg)

  • Get the Fapyc log level corresponding to a given FAPEC-internal logger level (Fapec Log Level 0-3):

    fapyc_get_pyloglev(fapecLogLev)

  • Get the FAPEC log level corresponding to a given Python log level (Python logging level):

    fapyc_get_fapecloglev(pyLogLev)

  • Set the FAPEC log level (Python logging level):

    fapyc_set_loglev(logLev)

3.3 License functions

To use the full FAPEC compression and decompression library a license is required, to manage it, these functions are available:

  • Method to get the license type.

    fapyc_get_lic_type()

  • Method for obtaining the remaining days of the license:

    fapyc_get_eval_lic_rem_days()

  • Method to get the owener of the license:

    fapyc_get_lic_owner()

  • Method to "test" license file given by the user (String with the path of the file): Currently cannot activate the new license, only can be activated modifying FAPEC HOME.

    fapyc_test_or_use_lic_file(licfname)

3.4 Compression functions

In the current fapyc version, the following compression algorithms and parameters are available:

  • Class with the Python implementation of the FAPEC compressor.

    Fapyc(filename, buffer, chunksize, blen, logger)

  • Automatic selection of the compression algorithm from the data contents:

    compress_auto()

  • LZW dictionary coding:

    compress_lzw()

  • Basic integer compression, allowing to indicate the bits per sample, signed integers (True/False), big endian (True/False), interleaving in samples, and lossy level:

    compress_basic(bits, sign, bigendian, il, lossy)

  • Tabulated text compression, allowing to indicate the separator character (and even a second separator):

    compress_tabtxt(sep1, sep2)

  • Double-precision floating point values, with interleaving and lossy level:

    compress_doubles(bigEndian, il, lossy)

  • FastQ genomic files compression:

    compress_fastq()

  • Kongsberg's .all files:

    compress_kall()

  • Kongsberg's .wcd files:

    compress_kwcd(lossy)

  • Kongsberg's .kmall and .kmwcd files:

    compress_kmall(sndlossy, silossy, amplossy, phaselossy, smartlossy)

  • Direct invocation of the FAPEC entropy coding core without any pre-processing:

    entropy_coder()

3.5 Decompression functions

In the current fapyc version, the following decompression functions and parameters are available:

  • Class with the Python implementation of the FAPEC decompressor.

    Unfapyc(filename=None, buffer=None, chunksize=1048576, blen=128, logger = None)

  • Wrapper method to call either buffer-to-buffer or file decompression.

    decompress(output="", partname= None, partindex= -1)

  • Method to get the number of parts of the FAPEC file.

    fapyc_get_farch_num_parts()

  • Method to get the part name of a index in the FAPEC file.

    fapyc_get_part_name(index)

  • Method to get a dict describing the compression options used for a given part.

    fapyc_get_part_cmpopts(index)

  • Method to get the original size of a part contained in a FAPEC archive.

    fapyc_get_part_origsize(index)

4.Main operation modes

The basic syntax for these different modes is as follows:

  • File-to-file compression:
    from fapyc import Fapyc
    f = Fapyc(filename = your_file)
    f.compress_auto(output = your_file + ".fapec")  # We can also invoke a specific compression algorithm
  • Buffer-to-file compression:
    from fapyc import Fapyc
    f = Fapyc(buffer = your_data_buffer)
    f.compress_auto(output = "your_output_file.fapec")
  • Buffer-to-buffer compression:
    from fapyc import Fapyc
    f = Fapyc(buffer = your_data_buffer)
    f.compress_auto()
    your_data_handling_routine(f.outputBuffer)
  • File-to-file decompression:
    from fapyc import Unfapyc
    uf = Unfapyc(filename = your_fapec_file)
    uf.decompress(output = your_fapec_file + ".restored")  # or whatever filename/extension
  • File-to-buffer decompression:
    from fapyc import Unfapyc
    uf = Unfapyc(filename = your_fapec_file)
    uf.decompress()
    your_data_handling_routine(uf.outputBuffer)
  • Buffer-to-buffer decompression:
    from fapyc import Unfapyc
    uf = Unfapyc(buffer = your_data_buffer)
    uf.decompress()
    your_data_handling_routine(uf.outputBuffer)
  • Get FAPEC file information:
    from fapyc import Unfapyc
    uf = Unfapyc(filename = your_fapec_file) 
    nparts = uf.fapyc_get_farch_num_parts()
    for i in range(nparts):
        part_name = uf.fapyc_get_part_name(i)
        cmpOpts = uf.fapyc_get_part_cmpopts(i)
        for x in cmpOpts:
            print(x,':',cmpOpts[x])
  • Part file-to-file decompression:
    from fapyc import Unfapyc
    uf = Unfapyc(filename = your_fapec_file) 
    uf.decompress(partindex = part_index, output = your_fapec_file + ".restored") 
  • Part file-to-buffer decompression:
    from fapyc import Unfapyc
    uf = Unfapyc(filename = your_fapec_file)
    uf.decompress(partindex = part_index)
    your_data_handling_routine(uf.outputBuffer)
  • Console compression:
     fapyc  {-ow} {-mt <t>} {-o /path/to/the/output/file} /path/to/the/file
  • Console decompression:
    unfapyc {-ow} {-mt <t>} {-o /path/to/the/output/file} /path/to/the/fapec/file
  • Console file information:
    unfapyc -list /path/to/the/fapec/file
  • Console part decompression:
    unfapyc {-ow} {-mt <t>} -part part_index /path/to/the/fapec/file

5.Examples

Compress and decompress a file

In this example we use the kmall option of FAPEC, suitable for this kind of geomaritime data files from Kongsberg Maritime:

from fapyc import Fapyc, Unfapyc, FapecLicense

filename = input("Path to KMALL file: ")

# Here we invoke FAPEC to directly run on files,
# so the memory usage will be small (just 16MB or so)
# although it won't allow us to directly access the
# (de)compressed buffers.
f = Fapyc(filename)
# Check that we have a valid license
lt = f.fapyc_get_lic_type()
if lt >= 0:
    ln = FapecLicense(lt).name
    lo = f.fapyc_get_lic_owner()
    print("FAPEC",ln,"license granted to",lo)
    f.compress_kmall()
    # Let's now decompress it, as a check
    print("Preparing to decompress %s" % (filename + ".fapec"))
    uf = Unfapyc(filename + ".fapec")
    uf.decompress(output=filename+".dec")
else:
    print("No valid license found")

Decompress an image into a buffer and show it

With this example we can view a colour image compressed with FAPEC:

from fapyc import Unfapyc
import numpy as np
from matplotlib import pyplot as plt

filename = input("Path to FAPEC-compressed 8-bit RGB image file: ")

# Decompress the file into a byte array buffer
uf = Unfapyc(filename = filename)

# Get the image features - assuming part index 0 (OK for a single-part archive; otherwise, we're simply taking the first part)
cmpOpts = uf.fapyc_get_part_cmpopts(0)

# Get the compression algorithm, which should be CILLIC, DWT or HPA for an image
algo = cmpOpts['algorithm'].decode('utf-8')
if algo != 'CILLIC' and algo != 'DWT' and algo != 'HPA':
    raise Exception("Not an image")
else:
    print("Found image compressed with the",algo,"algorithm")

# Get the image features we need
w = cmpOpts['imageWidth']
h = cmpOpts['imageHeight']
bpp = cmpOpts['sampleBits']
bands = cmpOpts['nBands']
coding = cmpOpts['bandsCoding']
coding2text = ['BIP','BIL','BSQ']

# Do some check
if bpp != 8 or bands != 3 or coding != 0:
    raise Exception("This test needs 8-bit colour images (3 colour bands) in pixel-interleaved coding mode")
else:
    print("Image features:",w,"x",h,"pixels,",bpp,"bits per pixel,",bands,"colour bands,",coding2text[coding],"coding")

uf.decompress()
# Check consistency (image dimensions vs. buffer size)
if len(uf.outputBuffer) != 3*w*h:
    print("Image dimensions inconsistent with file contents!")
else:
    # Reshape this one-dimensional array into a three-dimensional array (height, width, colours) to plot it
    ima = np.reshape(np.frombuffer(uf.outputBuffer, dtype=np.dtype('u1')), (h, w, 3))
    plt.imshow(ima)
    plt.show()

Compress and decompress a buffer

In this example we use the tab option of FAPEC, which typically outperforms gzip and bzip2 on tabulated text/numerical data such as point clouds or certain scientific data files:

from fapyc import Fapyc, Unfapyc

filename = input("Path to file: ")
file = open(filename, "rb")
# Beware - Load the whole file to memory
data = file.read()
f = Fapyc(buffer = data)
# Use 2 threads
f.fapyc_set_nthreads(2)
# Invoke our tabulated-text compression algorithm
# indicating a comma separator
f.compress_tabtxt(sep1=',')
print("Ratio =", round(float(len(data))/len(f.outputBuffer), 4))

# Now we decompress the buffer into another buffer
uf = Unfapyc(buffer = f.outputBuffer)
uf.fapyc_set_useropts(0, 3, 0, 0, 0)
uf.decompress()
print("Decompressed size:", len(uf.outputBuffer))

Decompress a file into a buffer, and do some operations on it

Here we provide a quite specific use case, based on the ESA/DPAC Gaia DR3 bulk catalogue (which is publicly available as FAPEC-compressed CSVs). In this example, we decompress two of the files, and while getting their CSV-formatted contents with Pandas we filter the contents according to some conditions, and generate some plots. This is just to illustrate how you can directly work on several compressed files. Note that it may require quite a lot of RAM, perhaps 4GB. You may need to install pyqt5 with pip.

from fapyc import Unfapyc
from io import BytesIO
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import colors
import gc

filename = input("Path to GaiaDR3 csv.fapec file: ")
filename2 = input("Path to another GaiaDR3 csv.fapec file: ")

### Option 1: open the file, load it to memory (beware!), and decompress the buffer; it would be like this:
#file = open(filename, "rb")
#data = file.read()
#uf = Unfapyc(buffer = data)

### Option 2: directly decompress from the file into a buffer:
uf = Unfapyc(filename = filename)

# Here we'll use a verbose mode to see the decompression progress
uf.fapyc_set_useropts(2, 3, 0, 0, 0)
uf.fapyc_set_nthreads(2)
# Invoke decompressor
uf.decompress()

# Define our query (filter):
myq = "ra_error < 0.1 & dec_error < 0.1 & ruwe > 0.5 & ruwe < 2"

# Regenerate the CSV from the bytes buffer
print("Decoding and filtering CSV...")
df = pd.read_csv(BytesIO(uf.outputBuffer), comment="#").query(myq)

# Repeat for the 2nd file
uf = Unfapyc(filename = filename2)
uf.fapyc_set_useropts(2, 3, 0, 0, 0)
uf.fapyc_set_nthreads(2)
uf.decompress()
print("Decoding, filtering and joining CSV...")
df = pd.concat([df, pd.read_csv(BytesIO(uf.outputBuffer), comment="#").query(myq)])
# Remove NaNs and nulls from these two columns
df = df[np.isfinite(df['bp_rp'])]
df = df[np.isfinite(df['phot_g_mean_mag'])]
# Delete Unfapyc and force garbage collection, to try to free some memory
del uf
gc.collect()

print("Info from the filtered CSVs:")
print(df.info())

# Prepare some nice histograms for all data
plt.subplot(2,2,1)
plt.title("Skymap (%d sources)" % df.shape[0])
plt.xlabel("RA")
plt.ylabel("DEC")
print("Getting 2D histogram...")
plt.hist2d(df.ra, df.dec, bins=(200, 200), cmap=plt.cm.jet)
plt.colorbar()

plt.subplot(2,2,2)
plt.title("G-mag distribution")
plt.xlabel("G magnitude")
plt.ylabel("Counts")
plt.yscale("log")
print("Getting histogram...")
plt.hist(df.phot_g_mean_mag, bins=(100))

plt.subplot(2,2,3)
plt.title("Colour-Magnitude Diagram")
plt.xlabel("BP-RP")
plt.ylabel("G")
print("Getting 2D histogram...")
plt.hist2d(df.bp_rp, df.phot_g_mean_mag, bins=(100, 100), norm = colors.LogNorm(), cmap=plt.cm.jet)
plt.colorbar()

plt.subplot(2,2,4)
plt.title("Parallax error distribution")
plt.xlabel("G magnitude")
plt.ylabel("Parallax error")
print("Getting 2D histogram...")
plt.hist2d(df.phot_g_mean_mag, df.parallax_error, bins=(100, 100), norm = colors.LogNorm(), cmap=plt.cm.jet)

print("Plotting...")
plt.show()

Compress file using a logger

In this example, the user can provide a Python logger to get an information message from Fapyc, to capture the progress and get more information in case of errors (otherwise the native FAPEC library just writes to the console).

import logging
from fapyc import Fapyc, Unfapyc

filename = input("Path to the file to compress: ")
logger_file = 'fapyc.log'
logger = logging.getLogger(__name__)
logging.basicConfig(filename=logger_file, filemode='w', format='%(name)s - %(levelname)s - %(message)s')
logger.setLevel(logging.DEBUG)

file = open(filename, "rb")
data = file.read()
file.close()

f = Fapyc(filename = filename, logger = logger)
f.fapyc_set_loglev(logging.INFO)
f.compress_doubles(output = "a.fapec")

Make plots from kmall stats file

In this example, the user provides a stats file generated when a kmall file is compressed with FAPEC

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

fapyc-0.7.2-cp313-cp313-win_amd64.whl (1.6 MB view details)

Uploaded CPython 3.13 Windows x86-64

fapyc-0.7.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.13 manylinux: glibc 2.17+ x86-64

fapyc-0.7.2-cp313-cp313-macosx_15_0_arm64.whl (1.3 MB view details)

Uploaded CPython 3.13 macOS 15.0+ ARM64

fapyc-0.7.2-cp313-cp313-macosx_10_15_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.13 macOS 10.15+ x86-64

fapyc-0.7.2-cp312-cp312-win_amd64.whl (1.6 MB view details)

Uploaded CPython 3.12 Windows x86-64

fapyc-0.7.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

fapyc-0.7.2-cp312-cp312-macosx_15_0_arm64.whl (1.3 MB view details)

Uploaded CPython 3.12 macOS 15.0+ ARM64

fapyc-0.7.2-cp312-cp312-macosx_10_15_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.12 macOS 10.15+ x86-64

fapyc-0.7.2-cp311-cp311-win_amd64.whl (1.7 MB view details)

Uploaded CPython 3.11 Windows x86-64

fapyc-0.7.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

fapyc-0.7.2-cp311-cp311-macosx_15_0_arm64.whl (1.3 MB view details)

Uploaded CPython 3.11 macOS 15.0+ ARM64

fapyc-0.7.2-cp311-cp311-macosx_10_15_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.11 macOS 10.15+ x86-64

fapyc-0.7.2-cp310-cp310-win_amd64.whl (1.7 MB view details)

Uploaded CPython 3.10 Windows x86-64

fapyc-0.7.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

fapyc-0.7.2-cp310-cp310-macosx_15_0_arm64.whl (1.3 MB view details)

Uploaded CPython 3.10 macOS 15.0+ ARM64

fapyc-0.7.2-cp310-cp310-macosx_10_15_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.10 macOS 10.15+ x86-64

fapyc-0.7.2-cp39-cp39-win_amd64.whl (1.7 MB view details)

Uploaded CPython 3.9 Windows x86-64

fapyc-0.7.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

fapyc-0.7.2-cp39-cp39-macosx_15_0_arm64.whl (1.3 MB view details)

Uploaded CPython 3.9 macOS 15.0+ ARM64

fapyc-0.7.2-cp39-cp39-macosx_10_15_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.9 macOS 10.15+ x86-64

fapyc-0.7.2-cp38-cp38-win_amd64.whl (1.7 MB view details)

Uploaded CPython 3.8 Windows x86-64

fapyc-0.7.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

fapyc-0.7.2-cp38-cp38-macosx_15_0_arm64.whl (1.3 MB view details)

Uploaded CPython 3.8 macOS 15.0+ ARM64

fapyc-0.7.2-cp38-cp38-macosx_10_15_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.8 macOS 10.15+ x86-64

File details

Details for the file fapyc-0.7.2-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: fapyc-0.7.2-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 1.6 MB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.11.5

File hashes

Hashes for fapyc-0.7.2-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 9a6c02f0c3e5f67ef71cb812bbfc840caaa89997b8fa243e43e183637cda1725
MD5 78ed2565225f5423f225b07916546d98
BLAKE2b-256 8e7798b0c694abffcebd55f3901b50b25811c95baafb2ddc40f75e472ffad082

See more details on using hashes here.

File details

Details for the file fapyc-0.7.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for fapyc-0.7.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7dc72037469bcba68ef2521bb8e7628efb2dc87c5a245ebd85764ba99b1fa38f
MD5 d1ef518dcfa86a3e0839f809b93e8ec4
BLAKE2b-256 3b516504dc337ec85b17bb2cba6639b6679ea49a1456633c5a9b2fac2ec37c73

See more details on using hashes here.

File details

Details for the file fapyc-0.7.2-cp313-cp313-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for fapyc-0.7.2-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 9fb3e5ff295e90bb7e7a3c61d208acf0afa6a0f66ac67d15ff3702d8b17cf3d4
MD5 320ea666e8207d51dc3e176c111ed411
BLAKE2b-256 155524a216b9899072a79ae66efeb31a5adb6e1e0088c5379a0578bd058dc3a5

See more details on using hashes here.

File details

Details for the file fapyc-0.7.2-cp313-cp313-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for fapyc-0.7.2-cp313-cp313-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 fb20945445f4abc55b34bf9fc77ad4965a2fa7e22049babe0e4fe790dad359a2
MD5 d85cb1b58e0a95736db8af8e08bafc7f
BLAKE2b-256 3c924937399181bf05bfe55b9d6fddb78165f54006145eadbc4e77b675a4f703

See more details on using hashes here.

File details

Details for the file fapyc-0.7.2-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: fapyc-0.7.2-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 1.6 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.11.5

File hashes

Hashes for fapyc-0.7.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 f27f617fb6de1b28616e126305a1d868a908592b14a1cc31589775622bd0d4b5
MD5 c9d4d5d6dce0d055a7bb45622fc15ecc
BLAKE2b-256 4b10d8f5168a96c43e36b90abc5ea30cdcaee59061c1b09b16aff5139f5bf7e9

See more details on using hashes here.

File details

Details for the file fapyc-0.7.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for fapyc-0.7.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4cfdd1e8c28422a3409f387611582697ba4287c3b3c6b5e6c659aac62580c09d
MD5 af3127709765441e26a763ef45c46e05
BLAKE2b-256 72bc40b97f5acb6cc6a98939fa543be3a415f95ec1cfb42d13df2fded0f8711a

See more details on using hashes here.

File details

Details for the file fapyc-0.7.2-cp312-cp312-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for fapyc-0.7.2-cp312-cp312-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 9521bdb324b59177498d3e48056674a0ed3ae192800efa6f8a220d459d1cf15a
MD5 3d240c2addae0fe617675c93e8e96fed
BLAKE2b-256 448a4b59ed70f9be3357a84ccd552db49a57c86151ff37de2c9d9eb97a83b547

See more details on using hashes here.

File details

Details for the file fapyc-0.7.2-cp312-cp312-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for fapyc-0.7.2-cp312-cp312-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 43d3cf635f9649fca3c8bdbabe85a73747c58bdaceecf4f3ed269004dab5ae5f
MD5 94020978b3a075038199e1d0d0b81456
BLAKE2b-256 5877ad9ba879f02b62f92183277798501fe859629354fb2c02ae8304f85ffbb9

See more details on using hashes here.

File details

Details for the file fapyc-0.7.2-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: fapyc-0.7.2-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 1.7 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.11.5

File hashes

Hashes for fapyc-0.7.2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 c3a5c02c24d8a3bcf11b3fd320976fd8e9dd681bef29c903b0c2d86c33483ce5
MD5 c2e6b72ee323ce549f36480a726f09b4
BLAKE2b-256 ff2b14b032086904ea46deceacfcbd9f6d965c50e7b191f89ac2fb1f9ebf08cb

See more details on using hashes here.

File details

Details for the file fapyc-0.7.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for fapyc-0.7.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1493eee08c5274d6ab6601abd9fd93a6d7e52f39f69e0dfde79133a15fc19a47
MD5 66c2b45c67432b33a9912f4fb629988f
BLAKE2b-256 32a74243613076e5e09d9621e377346209ddfc80db359f2c6b4c1842f0667495

See more details on using hashes here.

File details

Details for the file fapyc-0.7.2-cp311-cp311-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for fapyc-0.7.2-cp311-cp311-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 d9da4a504aef4b81693f243794276c4e1963db2485f462d12300a232627c3326
MD5 e87200767e770c8d49beaf0a0c194e71
BLAKE2b-256 449e0ba267adceebcffdaacfa2942186363c313161d2c87fd00ba9c656666716

See more details on using hashes here.

File details

Details for the file fapyc-0.7.2-cp311-cp311-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for fapyc-0.7.2-cp311-cp311-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 938d7fea9b880c0374216b38e5d98865a33eb610a2fb9d5f063dcc9f51f419d3
MD5 cef093f5ef66f37b02117a879dd1d7e0
BLAKE2b-256 1b76589158f6fcf43b5a44f58379f3a2ec941f2db3033263abc5d8155273b24d

See more details on using hashes here.

File details

Details for the file fapyc-0.7.2-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: fapyc-0.7.2-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 1.7 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.11.5

File hashes

Hashes for fapyc-0.7.2-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 e9e1be77c9926e525886256126f4e4752435698c47d23d04d8cf9c53d009476a
MD5 cc2664e5d2c3ac7737a256c4cee620e4
BLAKE2b-256 78cc04ac7034cc7e8c151242aa636682acb673ccbc21ca5aadc791143cdaa5e0

See more details on using hashes here.

File details

Details for the file fapyc-0.7.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for fapyc-0.7.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 42c469bd537c6d662735fd7e01173701cc5467f2c5ff33477f77007f611dca54
MD5 1c26429482b11ec0173d926a0f060bce
BLAKE2b-256 4cc17d39c4fad2397d570797f85728547e8820726beb97dc90b84d53a85e7979

See more details on using hashes here.

File details

Details for the file fapyc-0.7.2-cp310-cp310-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for fapyc-0.7.2-cp310-cp310-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 9a1068f7b0e83c68d222757577d3d28f02a6e03e450d33c7c494fe8ca331cb4f
MD5 10ae3f0aeece1db06c44a7c95d71807b
BLAKE2b-256 19877d59c933eb4bcca310bb907aef3803c1ef37e06d0a17bd95facc098411bf

See more details on using hashes here.

File details

Details for the file fapyc-0.7.2-cp310-cp310-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for fapyc-0.7.2-cp310-cp310-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 f1298ed5c01e8dcbb3142388c55d8bc8b1ce6fb0885f4ea31d3f0cd36ad94ebe
MD5 989f7f1706e50155883edcac2c092243
BLAKE2b-256 b24eec752a1eb2db41524a358f27b133aaebd92cae52b368e0835c0ace6cb4d3

See more details on using hashes here.

File details

Details for the file fapyc-0.7.2-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: fapyc-0.7.2-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 1.7 MB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.11.5

File hashes

Hashes for fapyc-0.7.2-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 c7b63c7e3248fa7ff3324d518c57fb679b6978bcdaea1f8a61977ba525e2191f
MD5 f92f53366bfcf936dc066a828daa987a
BLAKE2b-256 eeac194726438f22bd32a6d5d307a0f3090da8a29f7f34a8a5ce350ad40d183d

See more details on using hashes here.

File details

Details for the file fapyc-0.7.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for fapyc-0.7.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 883f9e332a6f0c3c35aac827813cabf99a82d2a7b0e5a3a465c28016f2d89d63
MD5 598545cb144854f40973b5ecb4203821
BLAKE2b-256 c737bf39b534a91bc51e8e9ddc2237b00005346fc83c6d53cfd3cb0329183487

See more details on using hashes here.

File details

Details for the file fapyc-0.7.2-cp39-cp39-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for fapyc-0.7.2-cp39-cp39-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 d9313091e57f956b9f02334c643aa74fb3f514c9a0a9415b9a8a631a56076165
MD5 e841aaeb27868fd0b5345aa77b5b5a75
BLAKE2b-256 e2833603b4a7ed65c41a9a823d4a9fd0169d20d92127fb1ed5d6694f3008f51f

See more details on using hashes here.

File details

Details for the file fapyc-0.7.2-cp39-cp39-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for fapyc-0.7.2-cp39-cp39-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 0be1d28f2dd153405e48529750928433bd2f7192665334dd2794f84822d5c996
MD5 cfb99e7b3b64e72557b34ba66062c7f1
BLAKE2b-256 63784b3ae27d2f9713c0d5cded688c6832de2b197932674fb37fdaccbb6cd2cb

See more details on using hashes here.

File details

Details for the file fapyc-0.7.2-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: fapyc-0.7.2-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 1.7 MB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.11.5

File hashes

Hashes for fapyc-0.7.2-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 9559d5d14fd124cf2497acc4c00f4805120ea2adf3d11904fd836992ecfa2354
MD5 e4eb395b99246eb6f1060f1c7cc3673a
BLAKE2b-256 0192dfebb6dc24b730aa9ca40ae66d6110f91cc62c0f6cf3830f734791852865

See more details on using hashes here.

File details

Details for the file fapyc-0.7.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for fapyc-0.7.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 280530503c291fb765fa523f1d81ad10cb40c75a31c23e6516b346aa124108bb
MD5 6f73b232e2ccbb75b29907085fab7037
BLAKE2b-256 7336b4c761adecb6990856be012c03c1f027d93c6efc13ec769b8c2f4f95cc6f

See more details on using hashes here.

File details

Details for the file fapyc-0.7.2-cp38-cp38-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for fapyc-0.7.2-cp38-cp38-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 122ae37d574c5602ab797c813362ffa21fa9a2252be559236078f85d4d0ba785
MD5 6e15c3c651b711e292585c7a1d140e94
BLAKE2b-256 1f76bacfa36c5a3f229079c348c1e7e2d7bb1cf87104c8dea0e949011642f689

See more details on using hashes here.

File details

Details for the file fapyc-0.7.2-cp38-cp38-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for fapyc-0.7.2-cp38-cp38-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 d27bfb816eebaf158e22b95de2a45d607fa27eb813c965990048f7b609d0e966
MD5 01e9b1e4a0a7687c1b39dcda8195ad86
BLAKE2b-256 3754ce2cb223699a3d34a070428ba77fee89b668e222748ccb55ba3ce146b906

See more details on using hashes here.

Supported by

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