randomness-kit 0.1.0__tar.gz → 0.1.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {randomness_kit-0.1.0 → randomness_kit-0.1.2}/Cargo.lock +1 -1
- {randomness_kit-0.1.0 → randomness_kit-0.1.2}/Cargo.toml +6 -4
- {randomness_kit-0.1.0 → randomness_kit-0.1.2}/PKG-INFO +4 -3
- {randomness_kit-0.1.0 → randomness_kit-0.1.2}/README.md +3 -2
- randomness_kit-0.1.2/builder_cb.py +64 -0
- randomness_kit-0.1.2/dev.py +61 -0
- randomness_kit-0.1.2/gen-ci.py +43 -0
- {randomness_kit-0.1.0 → randomness_kit-0.1.2}/pyproject.toml +8 -3
- randomness_kit-0.1.2/randomness_kit/__init__.py +6 -0
- randomness_kit-0.1.2/randomness_kit/_randomness_kit/__init__.pyi +17 -0
- randomness_kit-0.1.2/randomness_kit/_randomness_kit/min_entropy_algo.pyi +14 -0
- randomness_kit-0.1.2/randomness_kit/_randomness_kit/shannon_entropy_algo.pyi +32 -0
- randomness_kit-0.1.2/randomness_kit/py.typed +0 -0
- {randomness_kit-0.1.0 → randomness_kit-0.1.2}/release.py +3 -2
- {randomness_kit-0.1.0 → randomness_kit-0.1.2}/src/lib.rs +10 -1
- {randomness_kit-0.1.0 → randomness_kit-0.1.2}/.github/workflows/CI.yml +0 -0
- {randomness_kit-0.1.0 → randomness_kit-0.1.2}/.gitignore +0 -0
- {randomness_kit-0.1.0 → randomness_kit-0.1.2}/LICENSE +0 -0
- {randomness_kit-0.1.0 → randomness_kit-0.1.2}/src/min_entropy/mod.rs +0 -0
- {randomness_kit-0.1.0 → randomness_kit-0.1.2}/src/pytypes.rs +0 -0
- {randomness_kit-0.1.0 → randomness_kit-0.1.2}/src/shannon_entropy/func.rs +0 -0
- {randomness_kit-0.1.0 → randomness_kit-0.1.2}/src/shannon_entropy/lut.rs +0 -0
- {randomness_kit-0.1.0 → randomness_kit-0.1.2}/src/shannon_entropy/mod.rs +0 -0
- {randomness_kit-0.1.0 → randomness_kit-0.1.2}/src/shannon_entropy/optimize.rs +0 -0
- {randomness_kit-0.1.0 → randomness_kit-0.1.2}/src/util.rs +0 -0
- {randomness_kit-0.1.0 → randomness_kit-0.1.2}/uv.lock +0 -0
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
[package]
|
|
2
2
|
name = "randomness-kit"
|
|
3
|
-
|
|
3
|
+
description = "some tools about randomness calculation"
|
|
4
|
+
repository = "https://github.com/sb-child/randomness-kit"
|
|
5
|
+
version = "0.1.2"
|
|
4
6
|
edition = "2024"
|
|
5
7
|
license = "MIT"
|
|
6
8
|
authors = ["sbchild <sbchild0@gmail.com>"]
|
|
7
9
|
readme = "README.md"
|
|
8
10
|
|
|
9
11
|
[lib]
|
|
10
|
-
name = "
|
|
12
|
+
name = "_randomness_kit"
|
|
11
13
|
crate-type = ["cdylib"]
|
|
12
14
|
|
|
13
15
|
[dependencies]
|
|
14
|
-
pyo3 = "0.29.2"
|
|
16
|
+
pyo3 = { version = "0.29.2" }
|
|
15
17
|
secrets = { git = "https://github.com/sb-child/secrets-rs", rev = "2bf8870156a8115fd7b71aa8cd620088521a5104", features = [
|
|
16
18
|
"use-libsodium-sys",
|
|
17
19
|
] }
|
|
@@ -30,4 +32,4 @@ codegen-units = 1
|
|
|
30
32
|
lto = true
|
|
31
33
|
opt-level = 3
|
|
32
34
|
panic = 'abort'
|
|
33
|
-
strip =
|
|
35
|
+
strip = 'debuginfo' # otherwise PyO3 can't introspect the library to generate type stubs
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: randomness-kit
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.2
|
|
4
4
|
Classifier: Programming Language :: Rust
|
|
5
5
|
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
6
6
|
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
|
@@ -30,7 +30,7 @@ uv tool install maturin
|
|
|
30
30
|
Build debug package, and install in local venv:
|
|
31
31
|
|
|
32
32
|
```bash
|
|
33
|
-
|
|
33
|
+
uv run dev.py
|
|
34
34
|
uv run python3
|
|
35
35
|
```
|
|
36
36
|
|
|
@@ -44,12 +44,13 @@ ls dist # whl file generates here
|
|
|
44
44
|
Commit a release:
|
|
45
45
|
|
|
46
46
|
```bash
|
|
47
|
+
# Bump version at Cargo.toml
|
|
47
48
|
uv run release.py
|
|
48
49
|
```
|
|
49
50
|
|
|
50
51
|
Generate CI config:
|
|
51
52
|
|
|
52
53
|
```bash
|
|
53
|
-
|
|
54
|
+
uv run gen-ci.py
|
|
54
55
|
```
|
|
55
56
|
|
|
@@ -17,7 +17,7 @@ uv tool install maturin
|
|
|
17
17
|
Build debug package, and install in local venv:
|
|
18
18
|
|
|
19
19
|
```bash
|
|
20
|
-
|
|
20
|
+
uv run dev.py
|
|
21
21
|
uv run python3
|
|
22
22
|
```
|
|
23
23
|
|
|
@@ -31,11 +31,12 @@ ls dist # whl file generates here
|
|
|
31
31
|
Commit a release:
|
|
32
32
|
|
|
33
33
|
```bash
|
|
34
|
+
# Bump version at Cargo.toml
|
|
34
35
|
uv run release.py
|
|
35
36
|
```
|
|
36
37
|
|
|
37
38
|
Generate CI config:
|
|
38
39
|
|
|
39
40
|
```bash
|
|
40
|
-
|
|
41
|
+
uv run gen-ci.py
|
|
41
42
|
```
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import subprocess
|
|
2
|
+
import maturin
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from typing import Any, Mapping
|
|
5
|
+
|
|
6
|
+
SCRIPT_DIR = Path(__file__).resolve().parent
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def add_settings(
|
|
10
|
+
s: Mapping[str, Any] | None = None, stubs: bool = True, release: bool = False
|
|
11
|
+
) -> Mapping[str, Any]:
|
|
12
|
+
args = []
|
|
13
|
+
if stubs:
|
|
14
|
+
args.append("--generate-stubs")
|
|
15
|
+
if release:
|
|
16
|
+
args.append("--release")
|
|
17
|
+
base = dict(s) if s else {}
|
|
18
|
+
return base | {"maturin.build-args": args}
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def build_wheel(wheel_directory, config_settings=None, metadata_directory=None):
|
|
22
|
+
return maturin.build_wheel(
|
|
23
|
+
wheel_directory,
|
|
24
|
+
# stubs should be generated before build_wheel.
|
|
25
|
+
add_settings(config_settings, release=False, stubs=False),
|
|
26
|
+
metadata_directory,
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def build_sdist(sdist_directory, config_settings=None):
|
|
31
|
+
# generate stubs here
|
|
32
|
+
command = ["maturin", "generate-stubs", "-o", SCRIPT_DIR / "randomness_kit"]
|
|
33
|
+
subprocess.run(command, env=maturin._get_env(), cwd=SCRIPT_DIR, check=True)
|
|
34
|
+
return maturin.build_sdist(
|
|
35
|
+
sdist_directory, add_settings(config_settings, release=True)
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def build_editable(wheel_directory, config_settings=None, metadata_directory=None):
|
|
40
|
+
return maturin.build_editable(
|
|
41
|
+
wheel_directory, add_settings(config_settings), metadata_directory
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def get_requires_for_build_wheel(config_settings=None):
|
|
46
|
+
return maturin.get_requires_for_build_wheel(
|
|
47
|
+
add_settings(add_settings(config_settings, release=True), release=True)
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def get_requires_for_build_editable(config_settings=None):
|
|
52
|
+
return maturin.get_requires_for_build_editable(add_settings(config_settings))
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def prepare_metadata_for_build_wheel(metadata_directory, config_settings=None):
|
|
56
|
+
return maturin.prepare_metadata_for_build_wheel(
|
|
57
|
+
metadata_directory, add_settings(config_settings, release=True)
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def prepare_metadata_for_build_editable(metadata_directory, config_settings=None):
|
|
62
|
+
return maturin.prepare_metadata_for_build_editable(
|
|
63
|
+
metadata_directory, add_settings(config_settings)
|
|
64
|
+
)
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
import argparse
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
import subprocess
|
|
5
|
+
import sys
|
|
6
|
+
|
|
7
|
+
SCRIPT_DIR = Path(__file__).resolve().parent
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def generate_stub():
|
|
11
|
+
command = ["maturin", "generate-stubs", "-o", SCRIPT_DIR / "randomness_kit"]
|
|
12
|
+
try:
|
|
13
|
+
subprocess.run(command, cwd=SCRIPT_DIR, check=True)
|
|
14
|
+
except KeyboardInterrupt:
|
|
15
|
+
sys.exit(130)
|
|
16
|
+
except FileNotFoundError:
|
|
17
|
+
print(
|
|
18
|
+
"Error: maturin is not installed.",
|
|
19
|
+
file=sys.stderr,
|
|
20
|
+
)
|
|
21
|
+
sys.exit(1)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def main():
|
|
25
|
+
parser = argparse.ArgumentParser(description="`maturin develop` 的快捷封装脚本")
|
|
26
|
+
group = parser.add_mutually_exclusive_group()
|
|
27
|
+
group.add_argument(
|
|
28
|
+
"-d",
|
|
29
|
+
"--debug",
|
|
30
|
+
action="store_true",
|
|
31
|
+
help="以 Debug 模式运行(默认行为)",
|
|
32
|
+
)
|
|
33
|
+
group.add_argument(
|
|
34
|
+
"-r",
|
|
35
|
+
"--release",
|
|
36
|
+
action="store_true",
|
|
37
|
+
help="以 Release 模式运行 (--release)",
|
|
38
|
+
)
|
|
39
|
+
args, extra_args = parser.parse_known_args()
|
|
40
|
+
cmd = ["maturin", "develop", "--uv", "--generate-stubs"]
|
|
41
|
+
if args.release:
|
|
42
|
+
cmd.append("--release")
|
|
43
|
+
cmd.extend(extra_args)
|
|
44
|
+
print("Generating Stubs...\n")
|
|
45
|
+
generate_stub()
|
|
46
|
+
print(f"Execute: {' '.join(cmd)}\n")
|
|
47
|
+
try:
|
|
48
|
+
result = subprocess.run(cmd, cwd=SCRIPT_DIR)
|
|
49
|
+
sys.exit(result.returncode)
|
|
50
|
+
except KeyboardInterrupt:
|
|
51
|
+
sys.exit(130)
|
|
52
|
+
except FileNotFoundError:
|
|
53
|
+
print(
|
|
54
|
+
"Error: maturin is not installed.",
|
|
55
|
+
file=sys.stderr,
|
|
56
|
+
)
|
|
57
|
+
sys.exit(1)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
if __name__ == "__main__":
|
|
61
|
+
main()
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
import subprocess
|
|
3
|
+
import sys
|
|
4
|
+
|
|
5
|
+
SCRIPT_DIR = Path(__file__).resolve().parent
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def gen_ci() -> str:
|
|
9
|
+
try:
|
|
10
|
+
p = subprocess.run(
|
|
11
|
+
["maturin", "generate-ci", "github"],
|
|
12
|
+
capture_output=True,
|
|
13
|
+
check=True,
|
|
14
|
+
text=True,
|
|
15
|
+
cwd=SCRIPT_DIR,
|
|
16
|
+
)
|
|
17
|
+
ci_file: str = p.stdout
|
|
18
|
+
return ci_file
|
|
19
|
+
except FileNotFoundError:
|
|
20
|
+
sys.exit("Error: maturin is not installed.")
|
|
21
|
+
except subprocess.CalledProcessError as e:
|
|
22
|
+
print(e.stderr)
|
|
23
|
+
sys.exit(f"Generate CI failed: {e}")
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def write_ci(s: str):
|
|
27
|
+
ci_path = SCRIPT_DIR / ".github" / "workflows"
|
|
28
|
+
ci_path.mkdir(parents=True, exist_ok=True)
|
|
29
|
+
ci_file_path = ci_path / "CI.yml"
|
|
30
|
+
with open(ci_file_path, "w") as f:
|
|
31
|
+
f.write(s)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def main():
|
|
35
|
+
print("Generating...")
|
|
36
|
+
s = gen_ci()
|
|
37
|
+
print("Saving CI file...")
|
|
38
|
+
write_ci(s)
|
|
39
|
+
print("Completed")
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
if __name__ == "__main__":
|
|
43
|
+
main()
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
[build-system]
|
|
2
2
|
requires = ["maturin>=1.14,<2.0"]
|
|
3
|
-
build-backend = "
|
|
3
|
+
build-backend = "builder_cb"
|
|
4
|
+
backend-path = ["."]
|
|
4
5
|
|
|
5
6
|
[project]
|
|
6
7
|
name = "randomness-kit"
|
|
@@ -18,12 +19,16 @@ authors = [{ "name" = "sbchild", "email" = "sbchild0@gmail.com" }]
|
|
|
18
19
|
license = { file = "LICENSE" }
|
|
19
20
|
|
|
20
21
|
[tool.maturin]
|
|
22
|
+
module-name = "randomness_kit._randomness_kit"
|
|
21
23
|
features = ["pyo3/extension-module", "pyo3/experimental-inspect"]
|
|
24
|
+
include = ["py.typed"]
|
|
22
25
|
|
|
23
26
|
[tool.maturin.generate-ci.github]
|
|
24
27
|
# Finally found: https://github.com/PyO3/maturin/blob/main/src/pyproject_toml.rs#L487
|
|
25
|
-
|
|
26
|
-
|
|
28
|
+
# but before_script_linux doesn't work
|
|
29
|
+
linux = { target = [{ arch = "x86_64", before_script_linux = "xxx" }] }
|
|
30
|
+
musllinux = { target = [{ arch = "x86_64", before_script_linux = "xxx" }] }
|
|
31
|
+
# args = "--generate-stubs" # stubs already exist
|
|
27
32
|
# windows = {}
|
|
28
33
|
# macos = {}
|
|
29
34
|
# emscripten = {}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
from ._randomness_kit import __all__ as all_modules
|
|
2
|
+
from ._randomness_kit import __doc__ as doc
|
|
3
|
+
from ._randomness_kit import * # pyright: ignore[reportMissingImports] # noqa: F403
|
|
4
|
+
|
|
5
|
+
__all__ = all_modules # pyright: ignore[reportUnsupportedDunderAll]
|
|
6
|
+
__doc__ = doc
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"""
|
|
2
|
+
`randomness_kit` root module
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from _typeshed import Incomplete
|
|
6
|
+
|
|
7
|
+
def ping(x: int) -> int:
|
|
8
|
+
"""
|
|
9
|
+
test function
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
def version() -> str:
|
|
13
|
+
"""
|
|
14
|
+
package version
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
def __getattr__(name: str) -> Incomplete: ...
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Min entropy algorithm module
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from collections.abc import Sequence
|
|
6
|
+
|
|
7
|
+
def measure_entropy(data: str |Sequence[int]) -> float:
|
|
8
|
+
"""
|
|
9
|
+
计算数据的最小熵 (Min-entropy: H_infinity).
|
|
10
|
+
|
|
11
|
+
最小熵表示预测最可能出现的字节所需的比特数:`H_inf = -log2(max(P))`.
|
|
12
|
+
|
|
13
|
+
返回值:通常在 `0.0..=8.0` bits 之间。若数据为空则返回 `0.0`。
|
|
14
|
+
"""
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Shannon entropy algorithm module
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from collections.abc import Sequence
|
|
6
|
+
|
|
7
|
+
def measure_entropy(data: str |Sequence[int]) -> float:
|
|
8
|
+
"""
|
|
9
|
+
计算数据的香农熵 (Shannon entropy).
|
|
10
|
+
|
|
11
|
+
衡量数据的随机性/信息密度:`H = -sum(p * log2(p))`.
|
|
12
|
+
|
|
13
|
+
返回值:通常在 `0.0..=8.0` bits 之间。若数据为空则返回 `0.0`。
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
def measure_metric_entropy(data: str |Sequence[int]) -> float:
|
|
17
|
+
"""
|
|
18
|
+
计算标准的度量香农熵 (Metric Shannon entropy).
|
|
19
|
+
|
|
20
|
+
将香农熵按 `8-bit` 最大 theoretical 熵 (`8.0` bits) 进行归一化。
|
|
21
|
+
|
|
22
|
+
返回值:通常在 `0.0..=1.0` 之间。
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
def measure_normalized_metric_entropy(data: str |Sequence[int]) -> float:
|
|
26
|
+
"""
|
|
27
|
+
规范化缩放的香农熵 (Normalized Shannon entropy)。
|
|
28
|
+
|
|
29
|
+
完全随机数据的返回值紧密分布在 `1.0` 周围。
|
|
30
|
+
|
|
31
|
+
返回值:通常在 `0.0..=1.0` 之间。有些故意编写的数据会导致结果超过 `1.0`。
|
|
32
|
+
"""
|
|
File without changes
|
|
@@ -46,10 +46,11 @@ def main():
|
|
|
46
46
|
current_branch = run_git("branch", "--show-current", capture=True)
|
|
47
47
|
if not current_branch:
|
|
48
48
|
sys.exit("Error: Not on a valid branch (detached HEAD).")
|
|
49
|
-
print(
|
|
49
|
+
print()
|
|
50
|
+
print("Adding files...")
|
|
50
51
|
run_git("add", ".")
|
|
51
52
|
print("Commiting...")
|
|
52
|
-
run_git("commit", "-am", f"Release {tag}")
|
|
53
|
+
run_git("commit", "--allow-empty", "-am", f"Release {tag}")
|
|
53
54
|
print("Tagging...")
|
|
54
55
|
run_git("tag", "-a", tag, "-m", f"Version {version}")
|
|
55
56
|
print("Pushing branch...")
|
|
@@ -4,7 +4,8 @@ mod pytypes;
|
|
|
4
4
|
mod shannon_entropy;
|
|
5
5
|
mod util;
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
/// `randomness_kit` root module
|
|
8
|
+
#[pymodule(name = "_randomness_kit")]
|
|
8
9
|
mod randomness_kit {
|
|
9
10
|
use pyo3::prelude::*;
|
|
10
11
|
|
|
@@ -14,11 +15,19 @@ mod randomness_kit {
|
|
|
14
15
|
#[pymodule_export]
|
|
15
16
|
use super::min_entropy_algo;
|
|
16
17
|
|
|
18
|
+
/// test function
|
|
17
19
|
#[pyfunction]
|
|
18
20
|
fn ping(x: usize) -> usize {
|
|
19
21
|
x * 2
|
|
20
22
|
}
|
|
21
23
|
|
|
24
|
+
/// package version
|
|
25
|
+
#[pyfunction]
|
|
26
|
+
fn version() -> PyResult<String> {
|
|
27
|
+
let v = env!("CARGO_PKG_VERSION");
|
|
28
|
+
Ok(v.to_owned())
|
|
29
|
+
}
|
|
30
|
+
|
|
22
31
|
#[pymodule_init]
|
|
23
32
|
fn init(_m: &Bound<'_, PyModule>) -> PyResult<()> {
|
|
24
33
|
// m.add("double2", m.getattr("double")?)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|