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.
Files changed (26) hide show
  1. {randomness_kit-0.1.0 → randomness_kit-0.1.2}/Cargo.lock +1 -1
  2. {randomness_kit-0.1.0 → randomness_kit-0.1.2}/Cargo.toml +6 -4
  3. {randomness_kit-0.1.0 → randomness_kit-0.1.2}/PKG-INFO +4 -3
  4. {randomness_kit-0.1.0 → randomness_kit-0.1.2}/README.md +3 -2
  5. randomness_kit-0.1.2/builder_cb.py +64 -0
  6. randomness_kit-0.1.2/dev.py +61 -0
  7. randomness_kit-0.1.2/gen-ci.py +43 -0
  8. {randomness_kit-0.1.0 → randomness_kit-0.1.2}/pyproject.toml +8 -3
  9. randomness_kit-0.1.2/randomness_kit/__init__.py +6 -0
  10. randomness_kit-0.1.2/randomness_kit/_randomness_kit/__init__.pyi +17 -0
  11. randomness_kit-0.1.2/randomness_kit/_randomness_kit/min_entropy_algo.pyi +14 -0
  12. randomness_kit-0.1.2/randomness_kit/_randomness_kit/shannon_entropy_algo.pyi +32 -0
  13. randomness_kit-0.1.2/randomness_kit/py.typed +0 -0
  14. {randomness_kit-0.1.0 → randomness_kit-0.1.2}/release.py +3 -2
  15. {randomness_kit-0.1.0 → randomness_kit-0.1.2}/src/lib.rs +10 -1
  16. {randomness_kit-0.1.0 → randomness_kit-0.1.2}/.github/workflows/CI.yml +0 -0
  17. {randomness_kit-0.1.0 → randomness_kit-0.1.2}/.gitignore +0 -0
  18. {randomness_kit-0.1.0 → randomness_kit-0.1.2}/LICENSE +0 -0
  19. {randomness_kit-0.1.0 → randomness_kit-0.1.2}/src/min_entropy/mod.rs +0 -0
  20. {randomness_kit-0.1.0 → randomness_kit-0.1.2}/src/pytypes.rs +0 -0
  21. {randomness_kit-0.1.0 → randomness_kit-0.1.2}/src/shannon_entropy/func.rs +0 -0
  22. {randomness_kit-0.1.0 → randomness_kit-0.1.2}/src/shannon_entropy/lut.rs +0 -0
  23. {randomness_kit-0.1.0 → randomness_kit-0.1.2}/src/shannon_entropy/mod.rs +0 -0
  24. {randomness_kit-0.1.0 → randomness_kit-0.1.2}/src/shannon_entropy/optimize.rs +0 -0
  25. {randomness_kit-0.1.0 → randomness_kit-0.1.2}/src/util.rs +0 -0
  26. {randomness_kit-0.1.0 → randomness_kit-0.1.2}/uv.lock +0 -0
@@ -537,7 +537,7 @@ checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69"
537
537
 
538
538
  [[package]]
539
539
  name = "randomness-kit"
540
- version = "0.1.0"
540
+ version = "0.1.2"
541
541
  dependencies = [
542
542
  "cjk",
543
543
  "libsodium-rs",
@@ -1,17 +1,19 @@
1
1
  [package]
2
2
  name = "randomness-kit"
3
- version = "0.1.0"
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 = "randomness_kit"
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 = true
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.0
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
- maturin develop --uv
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
- maturin generate-ci github > .github/workflows/CI.yml
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
- maturin develop --uv
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
- maturin generate-ci github > .github/workflows/CI.yml
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 = "maturin"
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
- linux = { "targets" = ["x86_64"] }
26
- musllinux = { "targets" = ["x86_64"] }
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("\nAdding files...")
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
- #[pymodule(name = "randomness_kit")]
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