semvec/pypi-packages huggingface dataset:
sibase 0.2.0
A basic python package that converts numerical strings with units to base units
Requires Python: >=3.6

# SI-Base python package

A basic python package that converts numerical strings with units to base units.
There are two main classes:
* `Unit` which holds information about units, for instance that string `km/s` has unit **m** with *10 power of 3* and unit **s** with *10 power of -1* 
* `Value` is a float which also holds Unit and some numerical value that is always in **SI Base**. 

### Examples:

```python
from sibase import Value, Unit

value = Value('3e5 nm/ps')  # 3e+08 m/s
# value is instance of float with value if 3e8
float_value = value.to('km/s')  # 300000.0
# shorthand method:
float_value = value @ 'km/s' 

# Converting with units:
float_value = Unit('km/s').convert(3e8)
# shorthand methods:
float_value = 3e8 @ Unit('km/s')
float_value = Unit('km/s') @ 3e8

# Operations
# Note that this only compares numerical values, not units
Value('50 km') > '1e6 mm'  # True
Value('50 km') < '1e8 mm'  # True
Value('50 /km') == '50 km^-1'  # True

Value('50 km') + '50 km'  # 1e5 m (returns Value object, keeps units from LHS)
Value('50 km') - '1e4 m'  # 4e4 m (returns Value object, keeps units from LHS)
Value('50 km') * '100 m'  # 5e6 m^2 (returns Value object, unit updated)
Value('1 km') / '50 m'  # 20 (returns Value object, this case unitless)
Value('1 km') / '50 s'  # 20 m/s (returns Value object, units updated)

# Invert operation returns string with original units
~Value('50 km')  # 50 km
Value('50 km').original()  # 50 km
# Reduces same unit and prefix values, useful for multiply/divide operations 
Value('17 ps/nm/km/km').original(simplify=True)  # 17 ps/nm/km^2
```

Superscripts are enabled by default

```python
from sibase import Value, Unit
Unit.USE_SUBSCRIPTS = False  # Disable superscripts for units
Value('300mm^2/ps')  # 3e+08 m²s⁻¹
```

Supports converting units with powers such as:

```python
from sibase import Value

Value('-21 ps^2/km')  #  -2.1e-26 s^2/m
Value('17 ps/nm/km')  #  1.7e-05 s/m^2

# dB, dBm and Np (Nepers) are special units
Value('20 dB/km')  # 0.1 /m 
Value('2.3 km/Np')  # ~10.05 m 
Value('-20 dB') @ 'dBm'  # 10.0
Value('0.2 dB/km') @ 'Np/m'  # -3.43

# More special units can be added
from sibase import set_special_unit

set_special_unit(
    'log',  # name of unit 
    lambda x, _math: _math.log(x),  # function to convert to SI base  
    lambda x, _math: _math.exp(x)   # inverse of above
)
# Note: _math will depend on instance of x, it could be python's math module or numpy or jax.numpy
Value('10 log') # 2.30258509 
Value('2.3') @ 'log' # ~10 
Value('1π')  # 3.14159265 ( π treated as special unit )

```

Numpy, probably could also applied for other libraries

```python
from sibase import to_base, Unit
import numpy as np

np_array = np.array([...])
# Convert from nonstandard:
si_array = to_base(np_array, 'km/s')

# Convert to other units
not_base_array = Unit('km/s').convert(si_array)
# shorthand method (will not work other way around for numpy arrays):
not_base_array = Unit('km/s') @ si_array
```
hpke-spec 0.2.0
The Hybrid Public Key Encryption (HPKE) standard in Python
Requires Python: >=3.8

py-hpke-spec
===============
The Hybrid Public Key Encryption (HPKE) standard in Python.

- [`hpke-spec`](https://github.com/cryspen/hpke-spec) = [HPKE](https://blog.cloudflare.com/hybrid-public-key-encryption/) :handshake: [`hacspec`](https://hacspec.github.io)

- [`py-hpke-spec`](https://github.com/capeprivacy/py-hpke-spec) = [`hpke-spec`](https://github.com/cryspen/hpke-spec) :handshake: [`PyO3`](https://github.com/PyO3/pyo3)


This HPKE implementation is simply a thin Python wrapper around [`hpke-spec`](https://github.com/cryspen/hpke-spec), the hacspec implementation [written by Franziskus Kiefer](https://www.franziskuskiefer.de/p/tldr-hybrid-public-key-encryption/). This package mirrors the `hpke-spec` constructions as much as possible, to avoid any discrepancy from the HPKE standard.

## Why `hpke-spec`?

The `hpke-spec` library has two primary advantages:
- `hpke-spec` is written in [`hacspec`](https://hacspec.github.io/) which can be compiled into [F*](https://www.fstar-lang.org/) for formal verification.
- The cargo [documentation](https://tech.cryspen.com/hpke-spec/hpke/index.html) for `hpke-spec` is simply the text of the [HPKE RFC 9180](https://datatracker.ietf.org/doc/rfc9180/), with all the RFC's constructions linked directly to the hacspec code that implements it.

As a result, it's much more straightforward to evaluate `hpke-spec` for security and correctness. Indeed, both hacspec and RFC 9180 have received thorough vetting from cryptographers in [Project Everest](https://project-everest.github.io) and the [Internet Research Task Force](https://datatracker.ietf.org/doc/rfc9180/), respectively.

## Installation
Wheels for various platforms and architectures can be found on on [PyPI](https://pypi.org/project/hpke-spec/) or in the `wheelhouse.zip` archive from the [latest Github release](https://github.com/capeprivacy/py-hpke-spec/releases).

The library can also be installed from source with [`maturin`](https://github.com/PyO3/maturin) -- see below.

## Development

We use [`maturin`](https://github.com/PyO3/maturin) to build and distribute the PyO3 extension module as a Python wheel.

For users of `cmake`, we provide a [`Makefile`](https://github.com/capeprivacy/py-hpke-spec/blob/main/Makefile) that includes some helpful development commands.

Other useful tips:
- `maturin develop` builds & installs the Python package into your Python environment (`venv` or `conda` recommended)
- `pytest .` tests the resulting Python package
- `maturin build --release -o dist --sdist` builds the extension module in release-mode and produces a wheel for your environment's OS and architecture.
- The `-i`/`--interpreter` flag for `maturin` can be used to swap out different Python interpreters, if you have multiple Python installations.

## Related Projects
- [hpke-py](https://github.com/ctz/hpke-py): An implementation of HPKE based on primitives from [cryptography.io](https://cryptography.io).