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.0-cp312-cp312-win_amd64.whl (1.5 MB view details)

Uploaded CPython 3.12 Windows x86-64

fapyc-0.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

fapyc-0.7.0-cp312-cp312-macosx_13_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.12 macOS 13.0+ ARM64

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

Uploaded CPython 3.12 macOS 10.15+ x86-64

fapyc-0.7.0-cp311-cp311-win_amd64.whl (1.5 MB view details)

Uploaded CPython 3.11 Windows x86-64

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

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

fapyc-0.7.0-cp311-cp311-macosx_13_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.11 macOS 13.0+ ARM64

fapyc-0.7.0-cp311-cp311-macosx_10_15_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.11 macOS 10.15+ x86-64

fapyc-0.7.0-cp310-cp310-win_amd64.whl (1.5 MB view details)

Uploaded CPython 3.10 Windows x86-64

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

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

fapyc-0.7.0-cp310-cp310-macosx_13_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.10 macOS 13.0+ ARM64

fapyc-0.7.0-cp310-cp310-macosx_10_15_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.10 macOS 10.15+ x86-64

fapyc-0.7.0-cp39-cp39-win_amd64.whl (1.5 MB view details)

Uploaded CPython 3.9 Windows x86-64

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

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

fapyc-0.7.0-cp39-cp39-macosx_13_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.9 macOS 13.0+ ARM64

fapyc-0.7.0-cp39-cp39-macosx_10_15_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.9 macOS 10.15+ x86-64

fapyc-0.7.0-cp38-cp38-win_amd64.whl (1.5 MB view details)

Uploaded CPython 3.8 Windows x86-64

fapyc-0.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

fapyc-0.7.0-cp38-cp38-macosx_13_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.8 macOS 13.0+ ARM64

fapyc-0.7.0-cp38-cp38-macosx_10_15_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.8 macOS 10.15+ x86-64

fapyc-0.7.0-cp37-cp37m-win_amd64.whl (1.5 MB view details)

Uploaded CPython 3.7m Windows x86-64

fapyc-0.7.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.7m manylinux: glibc 2.17+ x86-64

fapyc-0.7.0-cp37-cp37m-macosx_13_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.7m macOS 13.0+ ARM64

fapyc-0.7.0-cp37-cp37m-macosx_10_15_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.7m macOS 10.15+ x86-64

fapyc-0.7.0-cp36-cp36m-win_amd64.whl (1.5 MB view details)

Uploaded CPython 3.6m Windows x86-64

fapyc-0.7.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.6m manylinux: glibc 2.17+ x86-64

fapyc-0.7.0-cp36-cp36m-macosx_13_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.6m macOS 13.0+ ARM64

fapyc-0.7.0-cp36-cp36m-macosx_10_15_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.6m macOS 10.15+ x86-64

File details

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

File metadata

  • Download URL: fapyc-0.7.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 1.5 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.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 625e15d604976ed5f01d9f46d58c418c4b3d2087d4362af27ed40e1f42551b5b
MD5 19eabebe86d4442ba843dc5cd6bfdbf7
BLAKE2b-256 fef0ccb3d5724ab384d6659aa8c83bd26c47a2ac3ad21213851203ec831ff908

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fapyc-0.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 fb66cc76c6c5da3deb290b84e6badb9a86132b23c0adcb74064efcf750739d76
MD5 7fa0d6a55fa1b0f6871be76d61a8100d
BLAKE2b-256 6eecee3ad5f9ba5ddd953f1d9f647c061ac5110a2eedfa931fe13ed0423d244e

See more details on using hashes here.

File details

Details for the file fapyc-0.7.0-cp312-cp312-macosx_13_0_arm64.whl.

File metadata

File hashes

Hashes for fapyc-0.7.0-cp312-cp312-macosx_13_0_arm64.whl
Algorithm Hash digest
SHA256 ad1e9f8d10c76f536e2852f881e1f6f1fbbeaea4aef5829090b6d0fa3cad61f2
MD5 f05fbdd8a11a53ebde0c2c48b315eb38
BLAKE2b-256 b2863d29ae7fc50d27a1c0bc558bc8112251e78565bffa75cd8ed1137e685e3d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fapyc-0.7.0-cp312-cp312-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 9de51606cbc2a89b9cee562f7be2c8f5510da06bab93473259d2ff7d4d771a59
MD5 692ec0142bb9af6e52474f1fc17cb032
BLAKE2b-256 63445d0e5508cfb53887e0596604d330d7cc4c1eedf0900052898c7e0d99631b

See more details on using hashes here.

File details

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

File metadata

  • Download URL: fapyc-0.7.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 1.5 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.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 779d591e52deef4954b745ad1e143d099aa4e54341096f1a3c46623c028ba77e
MD5 0c96f4489c14d4f39eb46a98ec21551a
BLAKE2b-256 93a9f7006b685df6564624017db9a792abeb6a8ae96a0a49d274328e83aa0e6a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fapyc-0.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6d8b6ca0ab4df777bb5160d79c668eb585bad44f2834178d45acaa7b83de26eb
MD5 f532625690b1b1ec7425576b19bca654
BLAKE2b-256 bb04e56f295ca0ef74bab274f8ceec83a51dafd927b527aee156c19d655a543b

See more details on using hashes here.

File details

Details for the file fapyc-0.7.0-cp311-cp311-macosx_13_0_arm64.whl.

File metadata

File hashes

Hashes for fapyc-0.7.0-cp311-cp311-macosx_13_0_arm64.whl
Algorithm Hash digest
SHA256 ba2f7748f84de4b3f379e1b165965de58f1257027436d374352b8fc2a14664ed
MD5 0246c45a48245a163ca612a7307521b8
BLAKE2b-256 3af040ab88f63242f97a26d3f53ff11d15f1f6896b5219a03bc6a0b35a43a176

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fapyc-0.7.0-cp311-cp311-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 c799555af361f14c399eac297760b17f705adf4ec40f109331e90662e3b011e7
MD5 082ebb4077eb7bc4ccf77dab9634fe99
BLAKE2b-256 05fe973891b17e45543187c49157defa89b4821a8f4bd419771cbcc41db30317

See more details on using hashes here.

File details

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

File metadata

  • Download URL: fapyc-0.7.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 1.5 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.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 62ac3bcaacf68af45be477442a77bafcd3f771e7be901e8bd592f1fe42667f3c
MD5 8e433cc816dc92da1bfa5208588e8285
BLAKE2b-256 03c391fae1d011d2b48ed5e0d05964118a53a7b73577406423f12d4ba90a1059

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fapyc-0.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2e0dbb81f6dee80484a89cb3230d6fc96b0be6eae963e4a056ce5a487ceca5d2
MD5 c2728db74aec41e06640f761d8cd2bd2
BLAKE2b-256 913c5ae08317c7e89ac6c98af7a7a4c8a53b9bcc523e44b5f430916155d1cc88

See more details on using hashes here.

File details

Details for the file fapyc-0.7.0-cp310-cp310-macosx_13_0_arm64.whl.

File metadata

File hashes

Hashes for fapyc-0.7.0-cp310-cp310-macosx_13_0_arm64.whl
Algorithm Hash digest
SHA256 e10d1d41c750bdaa056a473a4d99a26b157ec1b1ed66a05c3d74ba1d3c85e027
MD5 223468d14a182ac24fd79176e82cd6a8
BLAKE2b-256 19261153ba7b51bbcbd86230c8ccafae329a18201a6cbfe9aa762a504fa0ba8c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fapyc-0.7.0-cp310-cp310-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 9b5ea45167647cd9f74c64e54bc02d850c35ad0f8fb084b98e16908a0bdc902f
MD5 f39a39f8e4e55a7ecd6acb54d04a575d
BLAKE2b-256 2a757ec9c2174f30dc3eb42f0be81795bbe39e1c31b8d2f7d1642ef5b58f3dc9

See more details on using hashes here.

File details

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

File metadata

  • Download URL: fapyc-0.7.0-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 1.5 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.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 12e27908a34b541c4b4c508cb76e1d5807c66bffef345385dbb8a7ffa73bbcf1
MD5 25511d4252305fbf4254d4ef9022e8b9
BLAKE2b-256 b94892e905ed6ad29424818a152f1927e746cf1b0cbd4503605d5bd403025b06

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fapyc-0.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d3c574e936b766f1b5ae08ce9ffb7664da46f7059f93804c64b86724277a14a1
MD5 d4d34072fa3247c745e6ff8da7c4ba43
BLAKE2b-256 c068e02d9509fa5a19e490f4384f83d44b4fde99a53aa204c3adb9c170505225

See more details on using hashes here.

File details

Details for the file fapyc-0.7.0-cp39-cp39-macosx_13_0_arm64.whl.

File metadata

File hashes

Hashes for fapyc-0.7.0-cp39-cp39-macosx_13_0_arm64.whl
Algorithm Hash digest
SHA256 0633bea6a0a9b7e5e9a5981b050f5e1e63299e75eafc65cddcf3e3279f654cdf
MD5 46f1e33b9f6feb48de87be50181ece24
BLAKE2b-256 8897aec689570582b8f0f9d7724829657ea13ce52c8a16291d2eb53470c58948

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fapyc-0.7.0-cp39-cp39-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 bf92f6d10d6b535d23dd95d6929e02aeb2aefbebb7449a48f4c66cc73e74d52a
MD5 81bc9113da1de60c12576a9301467d7a
BLAKE2b-256 a4a9c0c81c52c92a07c32ff4a608b3d3f9517a8b413091c1060dd547e68eaa98

See more details on using hashes here.

File details

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

File metadata

  • Download URL: fapyc-0.7.0-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 1.5 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.0-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 636e86059bc2e05c0fc1ebdc17b62f226ac12cadfdc44fdba069f2bcd38d6369
MD5 9abb39f9d9f9d96a8d9ac0e676959630
BLAKE2b-256 22695a9748ba1f80012c73b755add6e7d03f9c1f872fbdff5412ff9497db07e2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fapyc-0.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 31cad198939dc76d9fccc54c31eb2de1410f21e88a21581a5f4a4a4e5766d976
MD5 1d31423c81219e84c3b095c8b505914c
BLAKE2b-256 c7913a8ca40aa2ad12d9f3aec7fc0f3d2b427b39dd743fc47dc39efe37681565

See more details on using hashes here.

File details

Details for the file fapyc-0.7.0-cp38-cp38-macosx_13_0_arm64.whl.

File metadata

File hashes

Hashes for fapyc-0.7.0-cp38-cp38-macosx_13_0_arm64.whl
Algorithm Hash digest
SHA256 a254db14c5064ed2e21582d8b9d2c14d77f0b97fb1155bc9a0e4173dca5b179e
MD5 35ec1a3aeda176359e88e57af0322540
BLAKE2b-256 a27e758fe906ed29ff33ade794026127de0c0ba3b12cfb33d3533860f5587728

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fapyc-0.7.0-cp38-cp38-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 8c0efe34fed1affd7a5f752c792ffd08df540564af10bbcf039288810c333151
MD5 bfcd47c3d304ad8b13d2bab6f9507cbb
BLAKE2b-256 73bab775c00962ce355da1a2e2a806f8bda692b108dcef4db8d0077626183f68

See more details on using hashes here.

File details

Details for the file fapyc-0.7.0-cp37-cp37m-win_amd64.whl.

File metadata

  • Download URL: fapyc-0.7.0-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 1.5 MB
  • Tags: CPython 3.7m, 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.0-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 358ac35cf515882afc523b06b3ecf47da490eb11f1f807750a9747a50edf3880
MD5 0e6af1a014bcf36acb3b9f092999d622
BLAKE2b-256 ecbe4b6a6aebe874d7a2c4f073d32008df11f9e98e016dab5ba7278b725bbf1f

See more details on using hashes here.

File details

Details for the file fapyc-0.7.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for fapyc-0.7.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c1279ca36d549d06de670b3651bb3adc347e70c5c76130b7af439b039fbc27e6
MD5 05b1b51d2b62693344ba768690d14a05
BLAKE2b-256 be1a63df74711b2253e48c9184cd503819aae51bf01cfa23bb6d282e1360df2f

See more details on using hashes here.

File details

Details for the file fapyc-0.7.0-cp37-cp37m-macosx_13_0_arm64.whl.

File metadata

File hashes

Hashes for fapyc-0.7.0-cp37-cp37m-macosx_13_0_arm64.whl
Algorithm Hash digest
SHA256 0eb237e091da9fbeceab8b78a6c49f5be6c893277f734a84e53f6c8915ea340e
MD5 fd7776d88266bc496bedb71d7d9c56c2
BLAKE2b-256 f3e74a3a966944efd1e883485749108a8b9dce468d6d4318f25c22a7f981267e

See more details on using hashes here.

File details

Details for the file fapyc-0.7.0-cp37-cp37m-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for fapyc-0.7.0-cp37-cp37m-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 cb02942fa57f203b60d2929d6b57abd779ad32d76a6aebc6b913dec420330a57
MD5 898c630e7a46c13fd8a8c8fb670f69db
BLAKE2b-256 06b66e75aec35e884f9c2672e0f0b0cb29f337ea485ae2498c1fbc10380fe213

See more details on using hashes here.

File details

Details for the file fapyc-0.7.0-cp36-cp36m-win_amd64.whl.

File metadata

  • Download URL: fapyc-0.7.0-cp36-cp36m-win_amd64.whl
  • Upload date:
  • Size: 1.5 MB
  • Tags: CPython 3.6m, 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.0-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 cd29724ad488f2974d988756a9bf85191c7c6be75ba83a6d6b93e203e07c213c
MD5 f69fa7685cbb4cd739ac3f974f1e8e16
BLAKE2b-256 54f4565cfec91f892ccd11bb6cc66a82a4e6a8f9b3ba58ac1687d8267286f209

See more details on using hashes here.

File details

Details for the file fapyc-0.7.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for fapyc-0.7.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c418d0497ca3935a9719bf4c9077e629c47b04a3c71cd81e605d985096106f73
MD5 9edf6a82abd29ea8cb8fbcf0ed5901f8
BLAKE2b-256 ca540f4edf9b9bafe9e5ad00707b523052797cc716e035df6e2c4ec501f29bca

See more details on using hashes here.

File details

Details for the file fapyc-0.7.0-cp36-cp36m-macosx_13_0_arm64.whl.

File metadata

File hashes

Hashes for fapyc-0.7.0-cp36-cp36m-macosx_13_0_arm64.whl
Algorithm Hash digest
SHA256 94c1fe098ce9681cae6d3ea02f3e9d030e462106b110a557b1fcf13ef949f70a
MD5 ef7d9dc89692068411c15d680c5109a1
BLAKE2b-256 d73eb0c69603b9fc859b69c0bfc1279757022dbac071074fdc14debc42eff8e6

See more details on using hashes here.

File details

Details for the file fapyc-0.7.0-cp36-cp36m-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for fapyc-0.7.0-cp36-cp36m-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 e8089c0f561d32bfa8da3c2fba212a428a2961d14b00260ef7e2d1428aa0e040
MD5 e8191552ea0c62f53e82638057ecd33e
BLAKE2b-256 affcf1d92739d5880f6c6b01e4e43a9e086dde4f9c44efa677c1fc4f467b312a

See more details on using hashes here.

Supported by

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