Skip to main content

Convert Splunk SPL queries into PySpark code

Project description

from spl_transpiler import convert_spl_to_pyspark

Overview

spl_transpiler is a Rust + Python port of Databricks Labs' spl_transpiler. The goal is to provide a high-performance, highly portable, convenient tool for adapting common SPL code into PySpark code when possible, making it easy to migrate from Splunk to other data platforms for log processing.

Installation

pip install spl_transpiler

Usage

from spl_transpiler import convert_spl_to_pyspark

print(convert_spl_to_pyspark(r"""multisearch
[index=regionA | fields +country, orders]
[index=regionB | fields +country, orders]"""))

# spark.table("regionA").select(
#     F.col("country"),
#     F.col("orders"),
# ).unionByName(
#     spark.table("regionB").select(
#         F.col("country"),
#         F.col("orders"),
#     ),
#     allowMissingColumns=True,
# )

Interactive CLI

For demonstration purposes and ease of use, an interactive CLI is also provided.

pip install spl_transpiler[cli]
python -m spl_transpiler

cli_screenshot.png

This provides an in-terminal user interface (using textual) where you can type an SPL query and see the converted Pyspark code in real time, alongside a visual representation of how the transpiler is understanding your query.

Runtime

The Runtime is a library provided (currently) as part of the SPL Transpiler which can provide more robust implementation as well as an SPL-like authoring experience when writing PySpark code directly.

For example, the following code snippets are equivalent:

In SPL (which can be transpiled and run on Spark):

sourcetype="cisco" | eval x=len(raw) | stats max(x) AS longest BY source

In PySpark:

from pyspark.sql import functions as F
spark.table(...).where(
    (F.col("sourcetype") == F.lit("cisco")),
).withColumn(
    "x",
    F.length(F.col("raw")),
).groupBy(
    [
        "source",
    ]
).agg(
    F.max(F.col("x")).alias("longest"),
)

In the SPL Runtime:

from pyspark.sql import functions as F
from spl_transpiler.runtime import commands, functions
df_1 = commands.search(None, sourcetype=F.lit("cisco"))
df_2 = commands.eval(df_1, x=functions.eval.len(F.col("raw")))
df_3 = commands.stats(
    df_2, by=[F.col("source")], longest=functions.stats.max(F.col("x"))
)
df_3

This runtime is a collection of helper functions on top of PySpark, and can be intermingled with other PySpark code. This means you can leverage an SPL-like experience where convenient while still using regular PySpark code where convenient.

In addition to these helper functions, the runtime also provides UDFs (user-defined functions) to provide data processing functions that aren't natively available in Spark. For example, in eval is_local=cidrmatch("10.0.0.0/8", ip), the cidrmatch function has no direct equivalent in Spark. The runtime provides a UDF that can be used as follows, either directly:

from pyspark.sql import functions as F
from spl_transpiler.runtime import udfs

df = df.withColumn("is_local", udfs.cidr_match("10.0.0.0/8", F.col("ip")))

Or via the runtime:

from pyspark.sql import functions as F
from spl_transpiler.runtime import commands, functions
df_1 = commands.eval(None, is_local=functions.eval.cidrmatch("10.0.0.0/8", F.col("ip")))
df_1

The transpiler, by default, will not assume the presence of the runtime. You need to explicitly allow the runtime to enable these features (it is enabled by default in the TUI):

from spl_transpiler import convert_spl_to_pyspark
convert_spl_to_pyspark(
    '''eval is_local=cidrmatch("10.0.0.0/8", ip)''',
    allow_runtime=True
)

Why?

Why transpile SPL into Spark? Because a huge amount of domain knowledge is locked up in the Splunk ecosystem, but Splunk is not always the optimal place to store and analyze data. Transpiling existing queries can make it easier for analysts and analytics to migrate iteratively onto other platforms. SPL is also a very laser-focused language for certain analytics, and in most cases it's far more concise than other languages (PySpark or SQL) at log processing tasks. Therefore, it may be preferable to continue writing queries in SPL and use a transpiler layer to make that syntax viable on various platforms.

Why rewrite the Databricks Lab transpiler? A few reasons:

  1. The original transpiler is written in Scala and assumes access to a Spark environment. That requires a JVM to execute and possibly a whole ecosystem of software (maybe even a running Spark cluster) to be available. This transpiler stands alone and compiles natively to any platform.
  2. While Scala is a common language in the Spark ecosystem, Spark isn't the only ecosystem that would benefit from having an SPL transpiler. By providing a transpiler that's both easy to use in Python and directly linkable at a system level, it becomes easy to embed and adapt the transpiler for any other use case too.
  3. Speed. Scala's plenty fast, to be honest, but Rust is mind-numbingly fast. This transpiler can parse SPL queries and generate equivalent Python code in a fraction of a millisecond. This makes it viable to treat the transpiler as a realtime component, for example embedding it in a UI and re-computing the converted results after every keystroke.
  4. Maintainability. Rust's type system helps keep things unambiguous as data passes through parsers and converters, and built-in unit testing makes it easy to adapt and grow the transpiler without risk of breaking existing features. While Rust is undoubtedly a language with a learning curve, the resulting code is very hard to break without noticing. This makes it much easier to maintain than a similarly complicated system would be in Python.

Contributing

This project is in early development. While it parses most common SPL queries and can convert a non-trivial variety of queries to PySpark, it's extremely limited and not yet ready for any serious usage. However, it lays a solid foundation for the whole process and is modular enough to easily add incremental features to.

Ways to contribute:

  • Add SPL queries and what the equivalent PySpark could would be. These test cases can drive development and prioritize the most commonly used features.

Support Matrix

Search Commands

A complete list of built-in Splunk commands is provided on the Splunk documentation page.

It is not the goal of this transpiler to support every feature of every SPL command. Splunk and Spark are two different platforms and not everything that is built in to Splunk makes sense to trivially convert to Spark. What's far more important is supporting most queries (say, 90% of all queries), which only requires supporting a reasonable number of the most commonly used commands.

For reference, however, here is a complete table of Splunk commands and the current and planned support status in this transpiler.

Support status can be one of the following:

  • None: This command will result in a syntax error in the SPL parser, and is completely unrecognized.
  • Parser: This command can be parsed from SPL into a syntax tree, but cannot currently be rendered back as Pyspark code.
  • Partial: This command can be parsed and rendered back to functional Pyspark code. Not all features may be supported.
  • Complete: This command can be parsed and rendered back to functional Pyspark code. All intended features are supported. This library is still early in its development, and commands might get marked as Complete while still having unknown bugs or limitations.

Commands that don't yet support the Runtime can still be converted to raw PySpark code. The only difference will be that the PySpark code will be verbose and native, rather than using the SPL-like interface the runtime provides.

Command Support Runtime Target
High Priority
bin (bucket) Partial Yes
convert Yes Yes
dedup Parser Yes
eval Partial Yes Yes
eventstats Partial Yes
fields Yes Yes
fillnull Partial Yes Yes
head Partial Yes
inputlookup Parser Yes
iplocation None Yes
join Partial Yes
lookup Partial Yes
mstats None Yes
multisearch Partial Yes
mvexpand Parser Yes
outputlookup None Yes
rare Yes Yes
regex Yes Yes
rename Partial Yes
rex Partial Yes
search Partial Yes Yes
sort Partial Yes
spath Partial Yes
stats Partial Yes
streamstats Parser Yes
table Partial Yes
tail Yes Yes
top Yes Yes
tstats Partial Yes Yes
where Partial Yes
Planned/Supported
addtotals Partial Yes
anomalydetection None Maybe
append None Maybe
appendpipe None Maybe
chart None Maybe
collect Parser Maybe
extract (kv) None Maybe
foreach None Yes
format Parser Yes
from None Yes
makecontinuous None Maybe
makemv None Maybe
makeresults Parser Yes
map Parser Yes
multikv None Maybe
replace None Maybe
return Parser Yes
transaction None Yes
xmlkv None Yes
Unsupported
abstract None
accum None
addcoltotals None
addinfo None
analyzefields None
anomalies None
anomalousvalue None
appendcols None
arules None
associate None
autoregress None
bucketdir None
cluster None
cofilter None
concurrency None
contingency None
correlate None
datamodel None
dbinspect None
delete None
delta None
diff None
erex None
eventcount None
fieldformat None
fieldsummary None
filldown None
findtypes None
folderize None
gauge None
gentimes None
geom None
geomfilter None
geostats None
highlight None
history None
iconify None
inputcsv None
kmeans None
kvform None
loadjob None
localize None
localop None
mcollect None
metadata None
metasearch None
meventcollect None
mpreview None
msearch None
mvcombine Parser
nomv None
outlier None Maybe
outputcsv None
outputtext None
overlap None
pivot None
predict None
rangemap None
redistribute None
reltime None
require None
rest None
reverse None
rtorder None
savedsearch None
script (run) None
scrub None
searchtxn None
selfjoin None
sendalert None
sendemail None
set None
setfields None
sichart None
sirare None
sistats None
sitimechart None
sitop None
strcat None
tags None
timechart None Maybe
timewrap None
tojson None
transpose None
trendline None
tscollect None
typeahead None
typelearner None
typer None
union None
uniq None
untable None
walklex None
x11 None
xmlunescape None
xpath None
xyseries None

Functions

There are two primary kinds of functions: Evaluation functions ( primarily for use in eval) and Statistical and Charting functions ( primarily for use in stats).

Like with commands, there are a lot of built-in functions and not all of them may map cleanly to Spark. This transpiler intends to support most queries and will thus support the most common functions. However, there is no goal at this time to support all Splunk functions.

Category Subcategory Function Support Runtime Target
Eval Bitwise bit_and Yes Yes Yes
Eval Bitwise bit_or Yes Yes Yes
Eval Bitwise bit_not Yes Yes Yes
Eval Bitwise bit_xor Yes Yes Yes
Eval Bitwise bit_shift_left Yes Yes Yes
Eval Bitwise bit_shift_right Yes Yes Yes
Eval Comparison and Conditional case Yes Yes Yes
Eval Comparison and Conditional cidrmatch Yes* Yes (UDF) Yes
Eval Comparison and Conditional coalesce Yes Yes Yes
Eval Comparison and Conditional false Yes Yes Yes
Eval Comparison and Conditional if Yes Yes Yes
Eval Comparison and Conditional in Yes Yes Yes
Eval Comparison and Conditional like Yes Yes Yes
Eval Comparison and Conditional lookup No No
Eval Comparison and Conditional match Yes Yes Yes
Eval Comparison and Conditional null Yes Yes Yes
Eval Comparison and Conditional nullif Yes Yes Yes
Eval Comparison and Conditional searchmatch No No
Eval Comparison and Conditional true Yes Yes Yes
Eval Comparison and Conditional validate Yes Yes Yes
Eval Conversion ipmask No Yes (UDF)
Eval Conversion printf No Yes (UDF)
Eval Conversion tonumber Partial Yes (UDF) Yes
Eval Conversion tostring Partial Yes (UDF) Yes
Eval Cryptographic md5 Yes Yes Yes
Eval Cryptographic sha1 Yes Yes Yes
Eval Cryptographic sha256 Yes Yes Yes
Eval Cryptographic sha512 Yes Yes Yes
Eval Date and Time now Yes Yes Yes
Eval Date and Time relative_time Yes Yes Yes
Eval Date and Time strftime Partial Partial Yes
Eval Date and Time strptime Partial Partial Yes
Eval Date and Time time Yes Yes Yes
Eval Informational isbool No No No
Eval Informational isint No No No
Eval Informational isnotnull Yes Yes Yes
Eval Informational isnull Yes Yes Yes
Eval Informational isnum No No No
Eval Informational isstr No No No
Eval Informational typeof No No No
Eval JSON json_object No No
Eval JSON json_append No No
Eval JSON json_array No No
Eval JSON json_array_to_mv No No
Eval JSON json_extend No No
Eval JSON json_extract No No
Eval JSON json_extract_exact No No
Eval JSON json_keys Yes Yes
Eval JSON json_set No No
Eval JSON json_set_exact No No
Eval JSON json_valid Yes Yes
Eval Mathematical abs Yes Yes Yes
Eval Mathematical ceiling (ceil) Yes Yes Yes
Eval Mathematical exact Yes* Yes* No
Eval Mathematical exp Yes Yes Yes
Eval Mathematical floor Yes Yes Yes
Eval Mathematical ln Yes Yes Yes
Eval Mathematical log Yes Yes Yes
Eval Mathematical pi Yes Yes Yes
Eval Mathematical pow Yes Yes Yes
Eval Mathematical round Yes Yes Yes
Eval Mathematical sigfig No Yes No
Eval Mathematical sqrt Yes Yes Yes
Eval Mathematical sum Yes Yes Yes
Eval Multivalue commands No No
Eval Multivalue mvappend Yes Yes Yes
Eval Multivalue mvcount Yes Yes Yes
Eval Multivalue mvdedup No No
Eval Multivalue mvfilter No No Yes
Eval Multivalue mvfind No No
Eval Multivalue mvindex Yes Yes Yes
Eval Multivalue mvjoin No No Yes
Eval Multivalue mvmap No No
Eval Multivalue mvrange No No
Eval Multivalue mvsort No No
Eval Multivalue mvzip Yes Yes
Eval Multivalue mv_to_json_array No No
Eval Multivalue split Yes Yes Yes
Eval Statistical avg Yes Yes Yes
Eval Statistical max Yes Yes Yes
Eval Statistical min Yes Yes Yes
Eval Statistical random Yes Yes Yes
Eval Text len Yes Yes Yes
Eval Text lower Yes Yes Yes
Eval Text ltrim Yes Yes Yes
Eval Text replace Yes Yes Yes
Eval Text rtrim Yes Yes Yes
Eval Text spath No No
Eval Text substr Yes Yes Yes
Eval Text trim Yes Yes Yes
Eval Text upper Yes Yes Yes
Eval Text urldecode Yes Yes Yes
Eval Trigonometry and Hyperbolic acos Yes Yes Yes
Eval Trigonometry and Hyperbolic acosh Yes Yes Yes
Eval Trigonometry and Hyperbolic asin Yes Yes Yes
Eval Trigonometry and Hyperbolic asinh Yes Yes Yes
Eval Trigonometry and Hyperbolic atan Yes Yes Yes
Eval Trigonometry and Hyperbolic atan2 Yes Yes Yes
Eval Trigonometry and Hyperbolic atanh Yes Yes Yes
Eval Trigonometry and Hyperbolic cos Yes Yes Yes
Eval Trigonometry and Hyperbolic cosh Yes Yes Yes
Eval Trigonometry and Hyperbolic hypot Yes Yes Yes
Eval Trigonometry and Hyperbolic sin Yes Yes Yes
Eval Trigonometry and Hyperbolic sinh Yes Yes Yes
Eval Trigonometry and Hyperbolic tan Yes Yes Yes
Eval Trigonometry and Hyperbolic tanh Yes Yes Yes
Stats Aggregate avg Yes Yes Yes
Stats Aggregate count Yes Yes Yes
Stats Aggregate distinct_count (dc) Yes Yes Yes
Stats Aggregate estdc Yes Yes
Stats Aggregate estdc_error No No
Stats Aggregate exactperc Yes Yes
Stats Aggregate max Yes Yes Yes
Stats Aggregate mean Yes Yes Yes
Stats Aggregate median Yes Yes Yes
Stats Aggregate min Yes Yes Yes
Stats Aggregate mode Yes Yes Yes
Stats Aggregate percentile Yes Yes Yes
Stats Aggregate range Yes Yes Yes
Stats Aggregate stdev Yes Yes Yes
Stats Aggregate stdevp Yes Yes Yes
Stats Aggregate sum Yes Yes Yes
Stats Aggregate sumsq Yes Yes Yes
Stats Aggregate upperperc Yes Yes Yes
Stats Aggregate var Yes Yes Yes
Stats Aggregate varp Yes Yes Yes
Stats Event order first Yes Yes
Stats Event order last Yes Yes
Stats Multivalue stats and chart list Yes Yes
Stats Multivalue stats and chart values Yes Yes Yes
Stats Time earliest Yes Yes Yes
Stats Time earliest_time Yes? Yes?
Stats Time latest Yes Yes Yes
Stats Time latest_time Yes? Yes?
Stats Time per_day No No
Stats Time per_hour No No
Stats Time per_minute No No
Stats Time per_second No No
Stats Time rate Yes? Yes?
Stats Time rate_avg No Yes?
Stats Time rate_sum No Yes?

* Pyspark output depends on custom UDFs instead of native Spark functions. Some of these may be provided by this package, some may be provided by Databricks Sirens.

Prioritized TODO list

  • Support macro syntax (separate pre-processing function?)
  • Use sample queries to create prioritized list of remaining commands
  • ~~ Incorporate standard macros that come with CIM~~
  • Support re-using intermediate results (saving off as tables or variables, .cache())
  • Migrate existing commands into runtime
  • Migrate eval, stats, and collect functions into runtime
  • Support custom Python UDFs
  • Finish supporting desired but not directly-mappable evals functions using UDFs
  • Support {} and @ in field names
  • Support Scala UDFs
  • Support SQL output

Contributing

Installation

You'll need cargo (Rust) and python installed. I recommend using uv for managing the Python environment, dependencies, and tools needed for this project.

Note that PySpark is currently only compatible with Python 3.11 and older, 3.12 and 3.13 are not yet supported. E.g., you can use uv venv --python 3.11 to create a .venv virtual environment with the appropriate Python interpreter. spl_transpiler is developed against Python 3.10 and likely requires at least that.

This project uses maturin and pyo3 for the Rust <-> Python interfacing, you'll need to install maturin, e.g. using uvx maturin commands which will auto-install the tool on first use.

This project uses pre-commit to automate linting and formatting. E.g. you can use uvx pre-commit install to install pre-commit and set up its git hooks.

You can then build and install spl_transpiler and all dependencies. First, make sure you have your virtual environment activated (uv commands will detect the venv by default if you use that, else follow activation instructions for your virtual environment tool), then run uv pip install -e .[cli,test,runtime].

Running Tests

You can test the core transpiler using cargo test. The Rust test suites include full end-to-end tests of query conversions, ensuring that the transpiler compiles and converts a wide range of known inputs into expected outputs.

The Python-side tests can be run with pytest and primarily ensure that the Rust <-> Python interface is behaving as expected. It also includes runtime tests, which validate that hand-written and transpiled runtime code does what is expected using known input/output data pairs running in an ephemeral Spark cluster.

There is also a large-scale Python test that can be run using pytest tests/test_sample_files_parse.py. By default, this test is ignored because it is slow and currently does not pass. It runs the transpiler on >1,800 sample SPL queries and ensure that the transpiler doesn't crash, generating detailed logs and error summaries along the way. This test is useful when expanding the transpiler to support new syntax, command, functions, etc. to see if the changes cause more commands/queries to transpile successfully. It's also useful for identifying what elements of SPL should be prioritized next to support more real-world use cases.

Acknowledgements

This project is deeply indebted to several other projects:

  • Databricks Labs' Transpiler provided most of the starting point for this parser, including an unambiguous grammar definition and numerous test cases which have been copied mostly verbatim. The license for that transpiler can be found here. Copyright 2021-2022 Databricks, Inc.
  • Numerous real-world SPL queries have been provided by Splunk Security Content under Apache 2.0 License. Copyright 2022 Splunk Inc.

Project details


Download files

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

Source Distribution

spl_transpiler-0.2.0.tar.gz (556.5 kB view details)

Uploaded Source

Built Distributions

spl_transpiler-0.2.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl (1.9 MB view details)

Uploaded PyPy musllinux: musl 1.2+ x86-64

spl_transpiler-0.2.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl (1.9 MB view details)

Uploaded PyPy musllinux: musl 1.2+ i686

spl_transpiler-0.2.0-pp310-pypy310_pp73-musllinux_1_2_armv7l.whl (1.8 MB view details)

Uploaded PyPy musllinux: musl 1.2+ ARMv7l

spl_transpiler-0.2.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl (1.8 MB view details)

Uploaded PyPy musllinux: musl 1.2+ ARM64

spl_transpiler-0.2.0-cp312-none-win_amd64.whl (1.8 MB view details)

Uploaded CPython 3.12 Windows x86-64

spl_transpiler-0.2.0-cp312-none-win32.whl (1.5 MB view details)

Uploaded CPython 3.12 Windows x86

spl_transpiler-0.2.0-cp312-cp312-musllinux_1_2_x86_64.whl (1.9 MB view details)

Uploaded CPython 3.12 musllinux: musl 1.2+ x86-64

spl_transpiler-0.2.0-cp312-cp312-musllinux_1_2_i686.whl (1.9 MB view details)

Uploaded CPython 3.12 musllinux: musl 1.2+ i686

spl_transpiler-0.2.0-cp312-cp312-musllinux_1_2_armv7l.whl (1.8 MB view details)

Uploaded CPython 3.12 musllinux: musl 1.2+ ARMv7l

spl_transpiler-0.2.0-cp312-cp312-musllinux_1_2_aarch64.whl (1.8 MB view details)

Uploaded CPython 3.12 musllinux: musl 1.2+ ARM64

spl_transpiler-0.2.0-cp312-cp312-macosx_11_0_arm64.whl (1.6 MB view details)

Uploaded CPython 3.12 macOS 11.0+ ARM64

spl_transpiler-0.2.0-cp312-cp312-macosx_10_12_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.12 macOS 10.12+ x86-64

spl_transpiler-0.2.0-cp311-none-win_amd64.whl (1.8 MB view details)

Uploaded CPython 3.11 Windows x86-64

spl_transpiler-0.2.0-cp311-none-win32.whl (1.5 MB view details)

Uploaded CPython 3.11 Windows x86

spl_transpiler-0.2.0-cp311-cp311-musllinux_1_2_x86_64.whl (1.9 MB view details)

Uploaded CPython 3.11 musllinux: musl 1.2+ x86-64

spl_transpiler-0.2.0-cp311-cp311-musllinux_1_2_i686.whl (1.9 MB view details)

Uploaded CPython 3.11 musllinux: musl 1.2+ i686

spl_transpiler-0.2.0-cp311-cp311-musllinux_1_2_armv7l.whl (1.8 MB view details)

Uploaded CPython 3.11 musllinux: musl 1.2+ ARMv7l

spl_transpiler-0.2.0-cp311-cp311-musllinux_1_2_aarch64.whl (1.8 MB view details)

Uploaded CPython 3.11 musllinux: musl 1.2+ ARM64

spl_transpiler-0.2.0-cp311-cp311-macosx_11_0_arm64.whl (1.6 MB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

spl_transpiler-0.2.0-cp311-cp311-macosx_10_12_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.11 macOS 10.12+ x86-64

spl_transpiler-0.2.0-cp310-none-win_amd64.whl (1.8 MB view details)

Uploaded CPython 3.10 Windows x86-64

spl_transpiler-0.2.0-cp310-none-win32.whl (1.5 MB view details)

Uploaded CPython 3.10 Windows x86

spl_transpiler-0.2.0-cp310-cp310-musllinux_1_2_x86_64.whl (1.9 MB view details)

Uploaded CPython 3.10 musllinux: musl 1.2+ x86-64

spl_transpiler-0.2.0-cp310-cp310-musllinux_1_2_i686.whl (1.9 MB view details)

Uploaded CPython 3.10 musllinux: musl 1.2+ i686

spl_transpiler-0.2.0-cp310-cp310-musllinux_1_2_armv7l.whl (1.8 MB view details)

Uploaded CPython 3.10 musllinux: musl 1.2+ ARMv7l

spl_transpiler-0.2.0-cp310-cp310-musllinux_1_2_aarch64.whl (1.8 MB view details)

Uploaded CPython 3.10 musllinux: musl 1.2+ ARM64

spl_transpiler-0.2.0-cp310-cp310-macosx_11_0_arm64.whl (1.6 MB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

File details

Details for the file spl_transpiler-0.2.0.tar.gz.

File metadata

  • Download URL: spl_transpiler-0.2.0.tar.gz
  • Upload date:
  • Size: 556.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.7.4

File hashes

Hashes for spl_transpiler-0.2.0.tar.gz
Algorithm Hash digest
SHA256 2bee4dbad1eb0e923af484e96f7d87d3e881f31b7727a9825baafd6c7600d9ee
MD5 d38d15852cba80e9d96dde30e22485b7
BLAKE2b-256 1edc669650965d095b29e91c16c73e3d2909ac89061828cbb9932a79172f7c37

See more details on using hashes here.

File details

Details for the file spl_transpiler-0.2.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for spl_transpiler-0.2.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 d4ac7391fa82fc86551fb0f8e03c8df24549a5e2f5f4f574c06a9371e25a75d2
MD5 16daf483c11e5c15ad308dc0212912ad
BLAKE2b-256 502d3b669215b558750209720ac266d10e733f2e077da564fa2f2096dfb3d52d

See more details on using hashes here.

File details

Details for the file spl_transpiler-0.2.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for spl_transpiler-0.2.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 9686b4a925a8eb4a64e0aa4d6a4c04a89b99508a322e3d4f4cb38fc7daf3d963
MD5 e5db908e37e26d5c1d77947137723776
BLAKE2b-256 6ad8001acfaabae94152503b17f6a710a8fbd844107654789d801e57b2041433

See more details on using hashes here.

File details

Details for the file spl_transpiler-0.2.0-pp310-pypy310_pp73-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for spl_transpiler-0.2.0-pp310-pypy310_pp73-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 5cf69be908411b41ceaacd9bb34164f946dcf9bdb204f19c7feb97b70f7f2325
MD5 ea73355b6eb9afd1d7f88384ef46ff92
BLAKE2b-256 eac9fb2ec09a8531d02da055c902298588e7d174a46da9018a58d22ab31601be

See more details on using hashes here.

File details

Details for the file spl_transpiler-0.2.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for spl_transpiler-0.2.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 44e7c5fcc57fcd1cd543669bb2b24945aac6538daf9fdaca55a4bc7f46db07ca
MD5 c0158be23684a11ebe47356a8a6e5464
BLAKE2b-256 8222f3e4aafa3a5c403c4f746e6c4ae142ac97549f44e32c581c055731ec3693

See more details on using hashes here.

File details

Details for the file spl_transpiler-0.2.0-cp312-none-win_amd64.whl.

File metadata

File hashes

Hashes for spl_transpiler-0.2.0-cp312-none-win_amd64.whl
Algorithm Hash digest
SHA256 08a6694e26adb342ead82cd66b952a9d210dfbfeb5bca49057a6734c1688c322
MD5 3783e183e6a85c755d88892d9d4810f9
BLAKE2b-256 68dedbaa0c7d74a8bd3100ff94dd248a9483f1176ec9406e0e386a7ace834eff

See more details on using hashes here.

File details

Details for the file spl_transpiler-0.2.0-cp312-none-win32.whl.

File metadata

File hashes

Hashes for spl_transpiler-0.2.0-cp312-none-win32.whl
Algorithm Hash digest
SHA256 188a30ac3d7b1c45deaac51be5c71fd1a8acb3c8bc3f5c95d2beba4821398963
MD5 34ac9f82c8da272f4a8161787473fb9c
BLAKE2b-256 62e8d517198cb1767631f8ccad345eca53caf52dd874768b9152cc3b75caa4ef

See more details on using hashes here.

File details

Details for the file spl_transpiler-0.2.0-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for spl_transpiler-0.2.0-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 5ab785f8b471f85f57a572405be955de3feaca1bfb5e3b50a6a5fddac3cf4a5e
MD5 8ece271edca2d00f9b46920791542d6e
BLAKE2b-256 23ef54b5f5ce5fcad12d14a5dfebaa45a305076fb44b249248298d9c6cbf609c

See more details on using hashes here.

File details

Details for the file spl_transpiler-0.2.0-cp312-cp312-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for spl_transpiler-0.2.0-cp312-cp312-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 a4008d881b7b4609dcc7cc68fb0ad5a34503f85f572dbd2b842fe1c1ac1e37a7
MD5 b1708b84e05796d0bba4aa270bb14862
BLAKE2b-256 7e12d068a9acbb1a2f6da33f45c7a940cdf50d9abef28e5e9a44c63be545ccf6

See more details on using hashes here.

File details

Details for the file spl_transpiler-0.2.0-cp312-cp312-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for spl_transpiler-0.2.0-cp312-cp312-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 46542d768d017a2342af1475e58228a2297b96dd1b5f418c427f1b41b81b6b3d
MD5 2e85a9ec1a8f532762e2de1edcdc02d2
BLAKE2b-256 82a5c6c3d349048e0d9338a2bb759fb1a067c2a6ddbe5946550104e7b353c137

See more details on using hashes here.

File details

Details for the file spl_transpiler-0.2.0-cp312-cp312-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for spl_transpiler-0.2.0-cp312-cp312-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 f78b20202327c9dc6507ddb6fd3d4e4e78a5346c6ac3148a410eaa739264a6e8
MD5 86d726319fc35d47948773ace5ec5e7e
BLAKE2b-256 8039fbebc3e4e5f3dfd132d8dbdc02f1e2d265a05f642a63f9246422b8e9586e

See more details on using hashes here.

File details

Details for the file spl_transpiler-0.2.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for spl_transpiler-0.2.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 40a57b240b45722c4fd5d9f0fc01466e169110f484c2d79544ac166543dd0ab3
MD5 e9d9f1eb20c3cc74e8ef9a4f6ca85703
BLAKE2b-256 38f0a0d3a79795c03b4d24962295f6d118df562f2e2e0badc422c2758a956708

See more details on using hashes here.

File details

Details for the file spl_transpiler-0.2.0-cp312-cp312-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for spl_transpiler-0.2.0-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 292ba8fe562ecd1698cb7fdf57a87da5753ffd7e48d08fabc4155444413ad74b
MD5 2384af67d69c5f862c09b4e398c6b6d8
BLAKE2b-256 ad206fcceddb888d004695d236182f4ce6159700eb8408daf64008223265dc4b

See more details on using hashes here.

File details

Details for the file spl_transpiler-0.2.0-cp311-none-win_amd64.whl.

File metadata

File hashes

Hashes for spl_transpiler-0.2.0-cp311-none-win_amd64.whl
Algorithm Hash digest
SHA256 afc158e636a133f48f323afc80963df70f3d76c3c7a00affc6f57d3e6af2d7de
MD5 4d41b7293187ad82d6c4f7003ffb62ae
BLAKE2b-256 df4fdad87fc811559b3def38565e2b02c72f26f478ed21e033bef405d3006649

See more details on using hashes here.

File details

Details for the file spl_transpiler-0.2.0-cp311-none-win32.whl.

File metadata

File hashes

Hashes for spl_transpiler-0.2.0-cp311-none-win32.whl
Algorithm Hash digest
SHA256 d1bc5aaa9a648ed4fb4ec46069947b98bc8dc9ead75a38d1391b18518b56317b
MD5 ae8a55af548ed56e06f8f66ee3c6c0fc
BLAKE2b-256 106eab3f02a2b84aa4b08e62dff05e0281a0ac2aa5e98b4747efacb6c2926af5

See more details on using hashes here.

File details

Details for the file spl_transpiler-0.2.0-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for spl_transpiler-0.2.0-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 00f5bf4d12fb6e7637e60b77b48237f937ca84f8e9925319c6653b56dca560d0
MD5 26f2465cb9ec83304d09223804293a81
BLAKE2b-256 380c29ea5308a353478b412a734dce7c52acee8bb051bf4ce228140ecbe3d11d

See more details on using hashes here.

File details

Details for the file spl_transpiler-0.2.0-cp311-cp311-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for spl_transpiler-0.2.0-cp311-cp311-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 06b193d1154c02c4218a7cc1f364da2dd101a1a429689b4a4b7581ada2471953
MD5 df1118d7438a7bbbd7ba287af856aac2
BLAKE2b-256 7d2eaef9de2032daff5a761ec154faf264011aadf343ee21ba8a4a7c03d9ae24

See more details on using hashes here.

File details

Details for the file spl_transpiler-0.2.0-cp311-cp311-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for spl_transpiler-0.2.0-cp311-cp311-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 f4bdf7db849676bb747f1dd4a0378e1625df3ada9a8b2cc159fc3db82970674a
MD5 2bcac31ee1ea17e8e76289eb33848e81
BLAKE2b-256 ad86ca5525497be20568667eea0a0094f831876238076aac5fb81168ab438a95

See more details on using hashes here.

File details

Details for the file spl_transpiler-0.2.0-cp311-cp311-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for spl_transpiler-0.2.0-cp311-cp311-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 1994b75748f2b1251a1e2987374294d6b91e1137f36e1e97793c98910473ba52
MD5 437f40068ca4d2fd3b1e4765f3cb2dfd
BLAKE2b-256 ab6b1c5007f68deb120cb4bde43a9798d6e5f5b7a270fd73a6e4f8f88b8cb238

See more details on using hashes here.

File details

Details for the file spl_transpiler-0.2.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for spl_transpiler-0.2.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e5cf6d9e8ae3c8262ae89f433ca5a6223be3401846cea798dd13ed905d706770
MD5 73e41892a58b22118ae2f81d3c3e02ad
BLAKE2b-256 9c1c50be60b8736ef2594900069126db13150a006a273c197ef98bc88c9ca6d7

See more details on using hashes here.

File details

Details for the file spl_transpiler-0.2.0-cp311-cp311-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for spl_transpiler-0.2.0-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 c491b6ce912e8919b2e978ca8dfa73f4906fc1ec5ce9db45b76e9462fb53cff4
MD5 0f5e322fd6d18097d2282e125c5759ea
BLAKE2b-256 7c3c34d0c6afa28f7bbe26e4915bff41f896215543c851da8ea147e229b916ff

See more details on using hashes here.

File details

Details for the file spl_transpiler-0.2.0-cp310-none-win_amd64.whl.

File metadata

File hashes

Hashes for spl_transpiler-0.2.0-cp310-none-win_amd64.whl
Algorithm Hash digest
SHA256 a078dcd5bd32c53ac331ddd60b34b8546c9568ab455ae8c36436431e85b01082
MD5 d60b3b000478a228891512ea776e763d
BLAKE2b-256 8f8213e3570c6bfdc56f42d9d1b9db4ca05f53e7ac61512ee55f7fff06673ca2

See more details on using hashes here.

File details

Details for the file spl_transpiler-0.2.0-cp310-none-win32.whl.

File metadata

File hashes

Hashes for spl_transpiler-0.2.0-cp310-none-win32.whl
Algorithm Hash digest
SHA256 930b698ba8a5ff6bd405d1a13fdcede130a9f3c13328c83f52091672af53e9d4
MD5 b3a4139ab38cbcfd34793e4dc5af90b4
BLAKE2b-256 7311f396c19d592e6cbb6ed720e53b072c988ef2e0ba94f5d0893b275d825f50

See more details on using hashes here.

File details

Details for the file spl_transpiler-0.2.0-cp310-cp310-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for spl_transpiler-0.2.0-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 80b38a083aaad9e74e3811fd2cede56238419f8e8d3c19569e57b7e8173f51e5
MD5 c8bc884870d337a27b401d52b932de09
BLAKE2b-256 968fe529fc8ed657fc0ee006af091d18694f93aa41b0459b036886d3f339c64a

See more details on using hashes here.

File details

Details for the file spl_transpiler-0.2.0-cp310-cp310-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for spl_transpiler-0.2.0-cp310-cp310-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 58eadd6ce9844d17aeb9fdafd2756d43afc290adc131cb090739c01e48228a91
MD5 b304ee7dcf1bc0a2b8807992766a935c
BLAKE2b-256 cc138b61fb7322b51e9719d0db09a548999ed72285e635d0395cac452a2962f7

See more details on using hashes here.

File details

Details for the file spl_transpiler-0.2.0-cp310-cp310-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for spl_transpiler-0.2.0-cp310-cp310-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 97ae30b642d235a4596db12845bb0c8dc838556a08a8d9c91c751b8c0cd412fe
MD5 28ad3b1dad174acd10b1447d71ca87c0
BLAKE2b-256 73c87b133fa522dcde6cc81f64adfb8d436a17ad357cd7d10af564664c905512

See more details on using hashes here.

File details

Details for the file spl_transpiler-0.2.0-cp310-cp310-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for spl_transpiler-0.2.0-cp310-cp310-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 d035a879aa8a851e734319e8a28cef50081f64cbd3338b4ef50af8b727af0900
MD5 68f50bfbb5eb4cedc2dd9c00dfa0d234
BLAKE2b-256 45f8abcd330794974a8ff2dea996006ca07dd872e29ea6c9ca2ff6722cc08996

See more details on using hashes here.

File details

Details for the file spl_transpiler-0.2.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for spl_transpiler-0.2.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e530f51ed31708830444553cc83ada9830f09df28193e05e4165ea93a6200b2f
MD5 b7cd0fc95adca844299e9b324aedacfc
BLAKE2b-256 ed6a8a2ead4a956ef0bcb90e270ff92864674af86ac2145b45edff65a2701e16

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