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.8.0-cp313-cp313-win_amd64.whl (1.6 MB view details)

Uploaded CPython 3.13Windows x86-64

fapyc-0.8.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

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

Uploaded CPython 3.13macOS 15.0+ ARM64

fapyc-0.8.0-cp313-cp313-macosx_10_15_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.13macOS 10.15+ x86-64

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

Uploaded CPython 3.12Windows x86-64

fapyc-0.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

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

Uploaded CPython 3.12macOS 15.0+ ARM64

fapyc-0.8.0-cp312-cp312-macosx_10_15_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.12macOS 10.15+ x86-64

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

Uploaded CPython 3.11Windows x86-64

fapyc-0.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

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

Uploaded CPython 3.11macOS 15.0+ ARM64

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

Uploaded CPython 3.11macOS 10.15+ x86-64

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

Uploaded CPython 3.10Windows x86-64

fapyc-0.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

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

Uploaded CPython 3.10macOS 15.0+ ARM64

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

Uploaded CPython 3.10macOS 10.15+ x86-64

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

Uploaded CPython 3.9Windows x86-64

fapyc-0.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

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

Uploaded CPython 3.9macOS 15.0+ ARM64

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

Uploaded CPython 3.9macOS 10.15+ x86-64

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

Uploaded CPython 3.8Windows x86-64

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

Uploaded CPython 3.8manylinux: glibc 2.17+ x86-64

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

Uploaded CPython 3.8macOS 15.0+ ARM64

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

Uploaded CPython 3.8macOS 10.15+ x86-64

File details

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

File metadata

  • Download URL: fapyc-0.8.0-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/6.1.0 CPython/3.11.5

File hashes

Hashes for fapyc-0.8.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 061afa33abd2c64a2d1e34c0229a28f03cc02ed49923a66b309a4e047d9e80a9
MD5 19583856572d7fbe50b3365daaa8749c
BLAKE2b-256 9bbdfed6a44a4d06235f045a8b8744bd62c508736ce1c3a4f94a93eff50370d0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fapyc-0.8.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 38e976748e5f40fc85b70e3cfc9ee8b3a721c7743b3c1207f38bf26f8338ec5f
MD5 3a2066e6701bfd8330bb20c43ac05469
BLAKE2b-256 3ebfc354a10228507820f3e714c8bc6942c98154b33dbbf17e000bdb973fcf5c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fapyc-0.8.0-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 e72f3c023f5db8a267cd71afd11238eda1877ca873e4939e522fd3ea157ffa3e
MD5 9984eeea21d5b3c248377627f7500fd0
BLAKE2b-256 61145dad632af883e768c181c97a9544d01251f23c544b66194d42617468b3ac

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fapyc-0.8.0-cp313-cp313-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 e90aef38f37a81480b4d3aa7bb75135e89ecec2cbd73eb430fc1eba540903f76
MD5 ca612c2966eb320e5e6a0ede6389f03d
BLAKE2b-256 35d98c1ce6f7f1ff6fd7736998134df6d6de9eeb353e180a70f8f3231b60ed04

See more details on using hashes here.

File details

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

File metadata

  • Download URL: fapyc-0.8.0-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/6.1.0 CPython/3.11.5

File hashes

Hashes for fapyc-0.8.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 b6161a06b92423b85df8cc6f140485acac77142be44c37f3f15ac97e806e41fd
MD5 f56ab53e6a031862bd1d9bf9462d1166
BLAKE2b-256 2c784637488a9108b950ad9eb6fa10b2c8ace77dde4f3f3a77835b82e1d1bed8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fapyc-0.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f48d211a5bc593d1dee80e14a4864ffeb6a3592275e46138267e721dae56daa1
MD5 419609e8b8049e0fa531388111d92443
BLAKE2b-256 12c9407cc2b4718f795bde82fc49ede81fbb74d289f11019f8dcdf3ce5c36898

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fapyc-0.8.0-cp312-cp312-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 0a3c8f0d5b1b4c8296f4fff1284dec565c11a97e395159afc5c07bba324e5623
MD5 8a378a6dbf41775a7f2bc96092da1085
BLAKE2b-256 b53e504387e063ef4f9d779ab0f7d1207dbc692d9c5bd5b056c0219e9988691b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fapyc-0.8.0-cp312-cp312-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 4f2e9cdb45ed2b7284f3833cd398b774fba8f101c50b3005e3f9f5304b3b0c0c
MD5 9147a137b05a3a428c32b3efe80ea508
BLAKE2b-256 3ec210594400e4d87b7f5493f659eec4fe03674a97271997bdfb2a98d417aeb3

See more details on using hashes here.

File details

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

File metadata

  • Download URL: fapyc-0.8.0-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/6.1.0 CPython/3.11.5

File hashes

Hashes for fapyc-0.8.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 1e9ea103f67c0f14b3a0409b0a53bf75c6126d0efe66e0f103408cd472b0315d
MD5 8b4278000fd488880e025ce7f8bf919d
BLAKE2b-256 3669f480880edc9ae5eafcd9852192a700f264878da39a5a78e2e9cfee9ec1f2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fapyc-0.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 aab58c6cd22cd42ad1e91773d222f05db7a88a2bd36c5dc776c87c7203942f32
MD5 a6ffd4898c0cf358dc1b11a1683b771f
BLAKE2b-256 2624afcc9c1902ea08c5dab8e91cd25df307a25b6aae1b04cf061d21e94af5b6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fapyc-0.8.0-cp311-cp311-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 7fc3e86c61ab819829e5399a1e79c52544fd20800732539d0ddd580fd619d32a
MD5 dbb79fd680d8584967ea02faa9d2dc81
BLAKE2b-256 2c89441be8fdfe54e83e461bfbb6155f0f22acf516314051edbeccb2c1730bc7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fapyc-0.8.0-cp311-cp311-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 1a5f553266899627c9e69578489ed8902dc3ebb733d19ca4bfef0f994104404c
MD5 17bd91bf708f2d54eccdfc96e5ac008c
BLAKE2b-256 43290f6f0141dba6b9a12b03911de19ec365c061a1946c59f3f197b6b897610a

See more details on using hashes here.

File details

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

File metadata

  • Download URL: fapyc-0.8.0-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/6.1.0 CPython/3.11.5

File hashes

Hashes for fapyc-0.8.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 57874a23eb6e152f75d0ee789afcea84adb87ff85455fdb161a53afbfb326449
MD5 0e0aa2316500dac1af6044f2a302eff8
BLAKE2b-256 1ad97ce609c6cd11919e06225e37e0b6a0f128dc1f7ab47e6cd379ec51316324

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fapyc-0.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3d1afc18a8a8024c70f3a2ec579bca06d6e22a92c578f521068528030d51328f
MD5 bf3e5a7cabd69fe021726cf47022fab4
BLAKE2b-256 f1548756ffebe44974a6f0dd19d3af8d6005ddb1bcb7edf536dca1bef07a8a59

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fapyc-0.8.0-cp310-cp310-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 4b5576449c89598374f9fa0c1cdd49cd57a7e9bf370db5b7a8531b19060163a6
MD5 07832409f6c6363d7b981210ee619d9d
BLAKE2b-256 a0badbff4b4d1f51a5060d14b3b230fe8c56cc628dc61fa67e73f316e3f401f1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fapyc-0.8.0-cp310-cp310-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 76b4d731cc75bc3610e730ae94834533ca2d33a1e199d187c5f22de1e673da9d
MD5 20b6e3c42a9ff2f4c4622fc068ed3eb8
BLAKE2b-256 fb7a447ece8ed78fa938fded8c4e90f4c5bcd5c432201226aa6b4afca117d4ae

See more details on using hashes here.

File details

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

File metadata

  • Download URL: fapyc-0.8.0-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/6.1.0 CPython/3.11.5

File hashes

Hashes for fapyc-0.8.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 b648a69f69a4a85624aedde40d3bc39ca943b2a2feff03017a065b3bf3cd2590
MD5 fd907137fd636ff6cae05615b5ba35e7
BLAKE2b-256 eb819fdda31cff2711c9108dfa7e6c1f92a5fa4074bf95bd87fc068f7232b0ce

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fapyc-0.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6fd3790c3ed6b278d027e4922cbc7ebca18a7cd73592f9c7739770564cd4e2c9
MD5 1777b719c9891467fff1807742929ee6
BLAKE2b-256 e70429235f0bcc2b1a7227217be665fde7180ab26a5895de3d2130f32d9d3790

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fapyc-0.8.0-cp39-cp39-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 019b1b31f18083d8f88cb78663923b678ff722b8f0eae1762ae13cd011be3f99
MD5 03692d8b23c190c6d3b3ad2e2fe66a02
BLAKE2b-256 c3a09357994eb41e99d73e77afbf5f60b89000761dffa8859692c601c94f42ba

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fapyc-0.8.0-cp39-cp39-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 1c496dd533486975168913f5de0af42441bacb7feb03d8592dc6a9306dd71273
MD5 b95120fda26fe260086be102f7691ee7
BLAKE2b-256 aa52a62a12c34a516d29512bc46846fde98a8127140c2285226f259d39e96abf

See more details on using hashes here.

File details

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

File metadata

  • Download URL: fapyc-0.8.0-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/6.1.0 CPython/3.11.5

File hashes

Hashes for fapyc-0.8.0-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 a021a5dfcd609d1892216b1362dcaee918ba7d45b932ffe35de5bf1787b4cf02
MD5 588b62e6ada9deab8535f5cf49709a84
BLAKE2b-256 72c2f9117d95b5d8c3e206d5027d92ba46029281c2dc73cd667db00491eb471f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fapyc-0.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c2bf4accc62c823bb1bd6e8a2130f9bb4b12612c7b28195fb50b9bba91b9d814
MD5 4db8abc47398f1b4465ad0672894f317
BLAKE2b-256 8a02712319737d412345491307b56e466a71a2d3bb9a0cc61f6076a8de5542b9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fapyc-0.8.0-cp38-cp38-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 053044f8335bdf78dfd67caa573bcc22e48209915247f9c05bfdea647db6a43f
MD5 c40b76ab3b13be23332c8bff82b6c4fe
BLAKE2b-256 40d024ddcac83b8d9a5d972fea6eb102bd3854d997db41d75177e7c9d7e7ea08

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fapyc-0.8.0-cp38-cp38-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 3180033f6560f5bd652a87cd23fbf4b8e158d997220755de7be8b989979e3aa2
MD5 9e69a0a044b7ac10b70e5ced057056c9
BLAKE2b-256 898f1029585f5e8f9c8afafbcb447268f8570b6f4f62084b9f013c2dc4c9330d

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