-
Notifications
You must be signed in to change notification settings - Fork 5.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[core] [1/N] Validate uv options #48479
Merged
Merged
Changes from all commits
Commits
Show all changes
9 commits
Select commit
Hold shift + click to select a range
97bdec9
validate uv options
dentiny b8f757a
reword
dentiny dfd13b3
update documentation on package list
dentiny 612aa8b
add comments for pip checks
dentiny 9dc3b77
fix comment
dentiny 60c0000
move pip test into validation test
dentiny 54cf250
move test to a separate folder
dentiny 6d4087f
rename test
dentiny d08af64
use pytest for code consistency
dentiny File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
load("@rules_python//python:defs.bzl", "py_library") | ||
|
||
package(default_visibility = ["//visibility:public"]) | ||
|
||
py_library( | ||
name = "validation", | ||
srcs = ["validation.py"], | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
py_test( | ||
name = "test_runtime_env_validation", | ||
srcs = ["test_runtime_env_validation.py"], | ||
tags = ["team:core"], | ||
deps = [ | ||
"//python/ray/_private/runtime_env:validation", | ||
], | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,115 @@ | ||
# TODO(hjiang): Move conda related unit test to this file also, after addressing the ` | ||
# yaml` third-party dependency issue. | ||
|
||
from ray._private.runtime_env import validation | ||
|
||
import os | ||
from pathlib import Path | ||
import tempfile | ||
import pytest | ||
import sys | ||
|
||
_PIP_LIST = ["requests==1.0.0", "pip-install-test"] | ||
|
||
|
||
@pytest.fixture | ||
def test_directory(): | ||
with tempfile.TemporaryDirectory() as tmp_dir: | ||
path = Path(tmp_dir) | ||
subdir = path / "subdir" | ||
subdir.mkdir(parents=True) | ||
requirements_file = subdir / "requirements.txt" | ||
with requirements_file.open(mode="w") as f: | ||
print("\n".join(_PIP_LIST), file=f) | ||
|
||
old_dir = os.getcwd() | ||
os.chdir(tmp_dir) | ||
yield subdir, requirements_file | ||
os.chdir(old_dir) | ||
|
||
|
||
class TestVaidationUv: | ||
def test_parse_and_validate_uv(self): | ||
# Valid case w/o duplication. | ||
result = validation.parse_and_validate_uv({"packages": ["tensorflow"]}) | ||
assert result == {"packages": ["tensorflow"]} | ||
|
||
# Valid case w/ duplication. | ||
result = validation.parse_and_validate_uv( | ||
{"packages": ["tensorflow", "tensorflow"]} | ||
) | ||
assert result == {"packages": ["tensorflow"]} | ||
|
||
# Valid case, use `list` to represent necessary packages. | ||
result = validation.parse_and_validate_uv( | ||
["requests==1.0.0", "aiohttp", "ray[serve]"] | ||
) | ||
assert result == {"packages": ["requests==1.0.0", "aiohttp", "ray[serve]"]} | ||
|
||
# Invalid case, `str` is not supported for now. | ||
with pytest.raises(TypeError): | ||
result = validation.parse_and_validate_uv("./requirements.txt") | ||
|
||
# Invalid case, unsupport keys. | ||
with pytest.raises(ValueError): | ||
result = validation.parse_and_validate_uv({"random_key": "random_value"}) | ||
|
||
|
||
class TestValidatePip: | ||
def test_validate_pip_invalid_types(self): | ||
with pytest.raises(TypeError): | ||
validation.parse_and_validate_pip(1) | ||
|
||
with pytest.raises(TypeError): | ||
validation.parse_and_validate_pip(True) | ||
|
||
def test_validate_pip_invalid_path(self): | ||
with pytest.raises(ValueError): | ||
validation.parse_and_validate_pip("../bad_path.txt") | ||
|
||
@pytest.mark.parametrize("absolute_path", [True, False]) | ||
def test_validate_pip_valid_file(self, test_directory, absolute_path): | ||
_, requirements_file = test_directory | ||
|
||
if absolute_path: | ||
requirements_file = requirements_file.resolve() | ||
|
||
result = validation.parse_and_validate_pip(str(requirements_file)) | ||
assert result["packages"] == _PIP_LIST | ||
assert not result["pip_check"] | ||
assert "pip_version" not in result | ||
|
||
def test_validate_pip_valid_list(self): | ||
result = validation.parse_and_validate_pip(_PIP_LIST) | ||
assert result["packages"] == _PIP_LIST | ||
assert not result["pip_check"] | ||
assert "pip_version" not in result | ||
|
||
def test_validate_ray(self): | ||
result = validation.parse_and_validate_pip(["pkg1", "ray", "pkg2"]) | ||
assert result["packages"] == ["pkg1", "ray", "pkg2"] | ||
assert not result["pip_check"] | ||
assert "pip_version" not in result | ||
|
||
|
||
class TestValidateEnvVars: | ||
def test_type_validation(self): | ||
# Only strings allowed. | ||
with pytest.raises(TypeError, match=".*Dict[str, str]*"): | ||
validation.parse_and_validate_env_vars({"INT_ENV": 1}) | ||
|
||
with pytest.raises(TypeError, match=".*Dict[str, str]*"): | ||
validation.parse_and_validate_env_vars({1: "hi"}) | ||
|
||
with pytest.raises(TypeError, match=".*value 123 is of type <class 'int'>*"): | ||
validation.parse_and_validate_env_vars({"hi": 123}) | ||
|
||
with pytest.raises(TypeError, match=".*value True is of type <class 'bool'>*"): | ||
validation.parse_and_validate_env_vars({"hi": True}) | ||
|
||
with pytest.raises(TypeError, match=".*key 1.23 is of type <class 'float'>*"): | ||
validation.parse_and_validate_env_vars({1.23: "hi"}) | ||
|
||
|
||
if __name__ == "__main__": | ||
sys.exit(pytest.main(["-vv", __file__])) |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
what are the other 2 fields?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sorry I don't understand, I'm trying to mimic the documentation for
pip
.ray/python/ray/_private/runtime_env/validation.py
Lines 111 to 128 in 056d596
Could you please tell me which part am I missing here?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I mean we should support pip_check field as well and possibly uv_version field.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
About
uv_version
, since the functionality is not implemented yet, I already left a TODO comment at the start of the function. IMO, only implemented feature should be officially documented.I will definitely document it when feature implemented. Let me know if you're fine with it.
About
pip_check
, my concern is it doesn't have 100% compatibility betweenuv
andpip
, in some cases it would report failure, check out https://github.com/astral-sh/uv/pull/2544/filesOne concrete example might be, uv's
pip_check
warns against multiple versions of a package, while pip version doesn't.So I'm hesitant whether to implement it or not; but anyway I left a TODO comment at the beginning, so we don't forget to