Current section

53 Versions

Jump to

Compare versions

9 files changed
+191 additions
-121 deletions
  @@ -7,6 +7,34 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7 7
8 8 ## [Unreleased]
9 9
10 + ## [0.8.9] - 2026-01-01
11 +
12 + ### Breaking Changes
13 +
14 + - **uv is now required** - pip support has been removed. Snakepit now requires [uv](https://docs.astral.sh/uv/) for Python package management.
15 + - Install uv: `curl -LsSf https://astral.sh/uv/install.sh | sh`
16 + - Or via Homebrew: `brew install uv`
17 + - The `:installer` config option has been removed (was `:auto`, `:uv`, or `:pip`)
18 + - uv provides 10-100x faster package operations and more reliable version resolution
19 +
20 + ### Fixed
21 +
22 + - **Version checking now validates constraints** - `PythonPackages.check_installed/2` now properly verifies that installed package versions satisfy the version constraints in requirements (e.g., `grpcio>=1.76.0`).
23 + - Previously, only package existence was checked, not version satisfaction
24 + - This caused runtime errors when outdated packages were installed (e.g., grpcio 1.67.1 when >=1.76.0 was required)
25 + - Now uses `uv pip install --dry-run` for accurate PEP-440 version checking
26 + - Packages that need upgrading are correctly identified as "missing" and reinstalled
27 +
28 + - **Bootstrap now uses quiet pip install** - Reduced noise from "Requirement already satisfied" messages during `mix test --include python_integration`
29 +
30 + - **Added startup feedback** - Shows "🐍 Checking Python package requirements..." during app startup in dev/test when checking packages (once per BEAM session)
31 +
32 + ### Changed
33 +
34 + - Removed unused configuration keys from `config/config.exs`, `config/test.exs`, and `config/grpc_test.exs` to trim dead config surface (legacy worker timeouts and unused grpc_test flags)
35 + - Virtual environments are now created using `uv venv` for consistency with package management
36 + - Simplified `PythonPackages` module by removing all pip-specific code paths
37 +
10 38 ## [0.8.8] - 2025-12-31
11 39
12 40 ### Added
  @@ -399,7 +427,6 @@ config :snakepit, log_level: :info
399 427 - `Snakepit.PythonPackages.ensure!/2` for provisioning required packages.
400 428 - `Snakepit.PythonPackages.check_installed/2` for verifying package presence.
401 429 - `Snakepit.PythonPackages.lock_metadata/2` for lockfile package metadata.
402 - - `Snakepit.PythonPackages.installer/0` for reporting the active installer.
403 430 - `Snakepit.PythonPackages.install!/2` for direct requirement installs.
404 431
405 432 ## [0.7.4] - 2025-12-25
  @@ -31,7 +31,7 @@ Add `snakepit` to your dependencies in `mix.exs`:
31 31 ```elixir
32 32 def deps do
33 33 [
34 - {:snakepit, "~> 0.8.8"}
34 + {:snakepit, "~> 0.8.9"}
35 35 ]
36 36 end
37 37 ```
  @@ -44,6 +44,23 @@ mix snakepit.setup # Install Python dependencies and generate gRPC stubs
44 44 mix snakepit.doctor # Verify environment is correctly configured
45 45 ```
46 46
47 + ### Using with SnakeBridge (Recommended)
48 +
49 + For higher-level Python integration with compile-time type generation, use [SnakeBridge](https://hex.pm/packages/snakebridge) instead of snakepit directly. SnakeBridge handles Python environment setup automatically at compile time.
50 +
51 + ```elixir
52 + def deps do
53 + [{:snakebridge, "~> 0.7.9"}]
54 + end
55 +
56 + def project do
57 + [
58 + ...
59 + compilers: [:snakebridge] ++ Mix.compilers()
60 + ]
61 + end
62 + ```
63 +
47 64 ## Quick Start
48 65
49 66 ```elixir
  @@ -632,8 +649,22 @@ mix run examples/hardware_detection.exs
632 649 - Elixir 1.18+
633 650 - Erlang/OTP 27+
634 651 - Python 3.9+ (3.13+ for thread profile)
652 + - [uv](https://docs.astral.sh/uv/) - Fast Python package manager (required)
635 653 - gRPC Python packages (`grpcio`, `grpcio-tools`)
636 654
655 + ### Installing uv
656 +
657 + ```bash
658 + # macOS/Linux
659 + curl -LsSf https://astral.sh/uv/install.sh | sh
660 +
661 + # Windows
662 + powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
663 +
664 + # Or via Homebrew
665 + brew install uv
666 + ```
667 +
637 668 ## License
638 669
639 670 MIT License - see [LICENSE](LICENSE) for details.
  @@ -61,7 +61,7 @@ Add Snakepit as a dependency in your `mix.exs`:
61 61 # mix.exs
62 62 def deps do
63 63 [
64 - {:snakepit, "~> 0.8.8"}
64 + {:snakepit, "~> 0.8.9"}
65 65 ]
66 66 end
67 67 ```
  @@ -4,7 +4,7 @@
4 4 {<<"Documentation">>,<<"https://hexdocs.pm/snakepit">>},
5 5 {<<"GitHub">>,<<"https://github.com/nshkrdotcom/snakepit">>}]}.
6 6 {<<"name">>,<<"snakepit">>}.
7 - {<<"version">>,<<"0.8.8">>}.
7 + {<<"version">>,<<"0.8.9">>}.
8 8 {<<"description">>,
9 9 <<"High-performance pooler and session manager for external language integrations.\nSupports Python, Node.js, Ruby, and more with gRPC streaming, session management,\nand production-ready process cleanup.">>}.
10 10 {<<"elixir">>,<<"~> 1.18">>}.
  @@ -77,11 +77,11 @@
77 77 <<"lib/snakepit/crash_barrier.ex">>,<<"lib/snakepit/worker">>,
78 78 <<"lib/snakepit/worker/lifecycle_config.ex">>,
79 79 <<"lib/snakepit/worker/taint_registry.ex">>,
80 - <<"lib/snakepit/worker/lifecycle_manager.ex">>,<<"priv/proto">>,
81 - <<"priv/proto/README.md">>,<<"priv/proto/snakepit_bridge.proto">>,
82 - <<"priv/python/__init__.py">>,<<"priv/python/grpc_server.py">>,
83 - <<"priv/python/grpc_server_threaded.py">>,<<"priv/python/setup.py">>,
84 - <<"priv/python/snakepit_bridge_pb2.py">>,
80 + <<"lib/snakepit/worker/lifecycle_manager.ex">>,<<"lib/repomix-output.xml">>,
81 + <<"priv/proto">>,<<"priv/proto/README.md">>,
82 + <<"priv/proto/snakepit_bridge.proto">>,<<"priv/python/__init__.py">>,
83 + <<"priv/python/grpc_server.py">>,<<"priv/python/grpc_server_threaded.py">>,
84 + <<"priv/python/setup.py">>,<<"priv/python/snakepit_bridge_pb2.py">>,
85 85 <<"priv/python/snakepit_bridge_pb2_grpc.py">>,
86 86 <<"priv/python/requirements.txt">>,
87 87 <<"priv/python/snakepit_bridge/__init__.py">>,
unknownlib/repomix-output.xml
File is too large to be displayed (100 KB limit).
Loading more files…