Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: astral-sh/uv
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 0.3.4
Choose a base ref
...
head repository: astral-sh/uv
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 0.3.5
Choose a head ref
  • 19 commits
  • 78 files changed
  • 7 contributors

Commits on Aug 26, 2024

  1. Avoid reusing state across tool upgrades (#6660)

    ## Summary
    
    Because tool upgrades can use different Python versions, we can't share
    state across them.
    
    Closes #6659.
    charliermarsh authored Aug 26, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    100e45c View commit details
  2. Add docs for constraint-dependencies and override-dependencies (#…

    …6596)
    
    Add missing portions of documents reported in #6518 and #5248(Comment).
    
    ## Summary
    
    <img width="600" alt="override"
    src="https://github.com/user-attachments/assets/062f0036-8672-4c68-b21c-aebdeb79b58b">
    
    <img width="600" alt="constraint"
    src="https://github.com/user-attachments/assets/f5ef1aa2-0662-4352-a1a0-3af1127fb7fb">
    Di-Is authored Aug 26, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    154ea24 View commit details
  3. Respect tool.uv.environments in pip compile --universal (#6663)

    ## Summary
    
    We now respect the `environments` field in `uv pip compile --universal`,
    e.g.:
    
    ```toml
    [tool.uv]
    environments = ["platform_system == 'Emscripten'"]
    ```
    
    Closes #6641.
    charliermarsh authored Aug 26, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    1ae2c3f View commit details

Commits on Aug 27, 2024

  1. Detect musl and error for musl pbs builds (#6643)

    As described in #4242, we're currently incorrectly downloading glibc
    python-build-standalone on musl target, but we also can't fix this by
    using musl python-build-standalone on musl targets since the musl builds
    are effectively broken.
    
    We reintroduce the libc detection previously removed in #2381, using it
    to detect which libc is the current one before we have a python
    interpreter. I changed the strategy a big to support an empty `PATH`
    which we use in the tests.
    
    For simplicity, i've decided to just filter out the musl
    python-build-standalone archives from the list of available archive,
    given this is temporary. This means we show the same error message as if
    we don't have a build for the platform. We could also add a dedicated
    error message for musl.
    
    Fixes #4242
    
    ## Test Plan
    
    Tested manually.
    
    On my ubuntu host, python downloads continue to pass:
    ```
    target/x86_64-unknown-linux-musl/debug/uv python install
    ```
    
    On alpine, we fail:
    ```
    $ docker run -it --rm -v .:/io alpine /io/target/x86_64-unknown-linux-musl/debug/uv python install
      Searching for Python installations
      error: No download found for request: cpython-any-linux-x86_64-musl
    ```
    konstin authored Aug 27, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    ae57d85 View commit details
  2. Clarify package priority order in pip compatibility guide (#6619)

    This is a minor documentation update to a recently added section
    "Package priority" in the pip compatibility guide. The aim of this PR is
    clear up two things which I think the current paragraph implies but I
    don't think are (always) true:
    
    1. That pip doesn't use provided order to prioritize resolution
    2. That uv relies solely on provided order to prioritize resolution
    
    What is true, at least for now, is pip has more heuristics than uv to
    prioritize during resolution, and so I've tried to rework this to make
    it clear why changing the order might help uv come to a different
    resolution whereas for pip it might not make a difference.
    notatallshaw authored Aug 27, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    e44dc08 View commit details
  3. Shift the order of some of the Docker guide content (#6664)

    zanieb authored Aug 27, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    3949e5d View commit details
  4. Improve consistency of directory lookup instructions in Docker (#6665)

    zanieb authored Aug 27, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    680dcc3 View commit details
  5. refactor: use a struct for install options (#6561)

    ## Summary
    
    Closes #6545.
    
    ## Test Plan
    
    Relying on existing tests.
    mkniewallner authored Aug 27, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    6a988ac View commit details
  6. docs: use python to highlight requirements and use more content tabs (

    #6549)
    
    ## Summary
    
    It appears that using `python` for code blocks containing requirements
    works quite well.
    
    ![Screenshot from 2024-08-23
    23-23-05](https://github.com/user-attachments/assets/38c92ef7-1f5e-40eb-8ea4-7024c8180bc4)
    
    ![Screenshot from 2024-08-23
    23-23-31](https://github.com/user-attachments/assets/940dc7d5-22a8-4cd8-b54a-d56542d4345c)
    
    Also using more content tabs for cases where we need to differentiate
    macOS/Linux from Windows.
    
    ## Test Plan
    
    Local run of the documentation.
    mkniewallner authored Aug 27, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    fd17f6d View commit details
  7. Add development section to Docker guide and reference new example pro…

    …ject (#6666)
    zanieb authored Aug 27, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    563e292 View commit details
  8. Fix docs for disabling build isolation with uv sync (#6674)

    Self-explanatory
    kabouzeid authored Aug 27, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    5ef0375 View commit details
  9. Ignore send errors in installer (#6667)

    ## Summary
    
    Similar to #6182.
    charliermarsh authored Aug 27, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    51723a2 View commit details
  10. Read requirements from requires.txt when available (#6655)

    ## Summary
    
    Allows us to avoid building setuptools-based packages at versions prior
    to Metadata 2.2
    
    Closes #6647.
    charliermarsh authored Aug 27, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    ce74959 View commit details
  11. Add support for --trusted-host (#6591)

    ## Summary
    
    This PR revives #4944, which I think
    was a good start towards adding `--trusted-host`. Last night, I tried to
    add `--trusted-host` with a custom verifier, but we had to vendor a lot
    of `reqwest` code and I eventually hit some private APIs. I'm not
    confident that I can implement it correctly with that mechanism, and
    since this is security, correctness is the priority.
    
    So, instead, we now use two clients and multiplex between them.
    
    Closes #1339.
    
    ## Test Plan
    
    Created self-signed certificate, and ran `python3 -m http.server --bind
    127.0.0.1 4443 --directory . --certfile cert.pem --keyfile key.pem` from
    the packse index directory.
    
    Verified that `cargo run pip install
    transitive-yanked-and-unyanked-dependency-a-0abad3b6 --index-url
    https://127.0.0.1:8443/simple-html` failed with:
    
    ```
    error: Request failed after 3 retries
      Caused by: error sending request for url (https://127.0.0.1:8443/simple-html/transitive-yanked-and-unyanked-dependency-a-0abad3b6/)
      Caused by: client error (Connect)
      Caused by: invalid peer certificate: Other(OtherError(CaUsedAsEndEntity))
    ```
    
    Verified that `cargo run pip install
    transitive-yanked-and-unyanked-dependency-a-0abad3b6 --index-url
    'https://127.0.0.1:8443/simple-html' --trusted-host '127.0.0.1:8443'`
    failed with the expected error (invalid resolution) and made valid
    requests.
    
    Verified that `cargo run pip install
    transitive-yanked-and-unyanked-dependency-a-0abad3b6 --index-url
    'https://127.0.0.1:8443/simple-html' --trusted-host '127.0.0.2' -n` also
    failed.
    charliermarsh authored Aug 27, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    d86075f View commit details
  12. Use relative paths by default in uv add (#6686)

    ## Summary
    
    Closes #6684.
    charliermarsh authored Aug 27, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    3f15f2d View commit details
  13. Improve messages for empty solves and installs (#6588)

    ## Summary
    
    Tries to improve the following:
    
    ```
    ❯ cargo run sync
       Compiling uv-cli v0.0.1 (/Users/crmarsh/workspace/uv/crates/uv-cli)
       Compiling uv v0.3.3 (/Users/crmarsh/workspace/uv/crates/uv)
        Finished `dev` profile [unoptimized + debuginfo] target(s) in 3.81s
         Running `/Users/crmarsh/workspace/uv/target/debug/uv sync`
    Using Python 3.12.1
    Creating virtualenv at: .venv
    Resolved in 7ms
    Audited environment in 0.05ms
    ```
    
    In this case we don't actually have any dependencies -- should we just
    omit `Resolved in...` and perhaps even the audited line?
    charliermarsh authored Aug 27, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    5d5e06c View commit details
  14. Add note about install python on alpine (#6677)

    When not using a python base image and using alpine, you need to install
    python by yourself. You should also pin the python version when doing
    so; currently, i see only python 3.12 in the alpine repository.
    konstin authored Aug 27, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    18453ae View commit details
  15. Improve lockfile concept documentation, add coverage for upgrades (#6698

    )
    zanieb authored Aug 27, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    cee0d2d View commit details
  16. Bump version to v0.3.5 (#6696)

    charliermarsh authored Aug 27, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    6c62d9f View commit details
Showing with 2,481 additions and 521 deletions.
  1. +27 −0 CHANGELOG.md
  2. +47 −5 Cargo.lock
  3. +1 −0 Cargo.toml
  4. +2 −0 crates/pypi-types/src/lib.rs
  5. +164 −2 crates/pypi-types/src/metadata.rs
  6. +1 −0 crates/{uv-workspace/src/environments.rs → pypi-types/src/supported_environments.rs}
  7. +1 −19 crates/uv-cli/src/compat.rs
  8. +111 −1 crates/uv-cli/src/lib.rs
  9. +35 −0 crates/uv-cli/src/options.rs
  10. +125 −68 crates/uv-client/src/base_client.rs
  11. +5 −3 crates/uv-client/src/cached_client.rs
  12. +1 −1 crates/uv-client/src/flat_index.rs
  13. +18 −9 crates/uv-client/src/registry_client.rs
  14. +2 −0 crates/uv-client/tests/user_agent_version.rs
  15. +4 −0 crates/uv-configuration/Cargo.toml
  16. +85 −0 crates/uv-configuration/src/install_options.rs
  17. +4 −0 crates/uv-configuration/src/lib.rs
  18. +137 −0 crates/uv-configuration/src/trusted_host.rs
  19. +1 −1 crates/uv-distribution/src/distribution_database.rs
  20. +6 −0 crates/uv-distribution/src/error.rs
  21. +141 −14 crates/uv-distribution/src/source/mod.rs
  22. +3 −1 crates/uv-installer/src/installer.rs
  23. +1 −0 crates/uv-python/Cargo.toml
  24. +13 −7 crates/uv-python/src/downloads.rs
  25. +1 −1 crates/uv-python/src/installation.rs
  26. +1 −0 crates/uv-python/src/lib.rs
  27. +279 −0 crates/uv-python/src/libc.rs
  28. +7 −4 crates/uv-python/src/managed.rs
  29. +8 −7 crates/uv-python/src/platform.rs
  30. +4 −2 crates/uv-settings/src/combine.rs
  31. +50 −12 crates/uv-settings/src/settings.rs
  32. +1 −1 crates/uv-version/Cargo.toml
  33. +0 −2 crates/uv-workspace/src/lib.rs
  34. +73 −10 crates/uv-workspace/src/pyproject.rs
  35. +1 −2 crates/uv-workspace/src/workspace.rs
  36. +1 −1 crates/uv/Cargo.toml
  37. +13 −7 crates/uv/src/commands/pip/compile.rs
  38. +5 −3 crates/uv/src/commands/pip/install.rs
  39. +36 −20 crates/uv/src/commands/pip/loggers.rs
  40. +5 −3 crates/uv/src/commands/pip/sync.rs
  41. +4 −2 crates/uv/src/commands/pip/uninstall.rs
  42. +8 −8 crates/uv/src/commands/project/add.rs
  43. +4 −2 crates/uv/src/commands/project/lock.rs
  44. +8 −0 crates/uv/src/commands/project/mod.rs
  45. +3 −7 crates/uv/src/commands/project/remove.rs
  46. +3 −7 crates/uv/src/commands/project/run.rs
  47. +8 −66 crates/uv/src/commands/project/sync.rs
  48. +1 −2 crates/uv/src/commands/python/install.rs
  49. +3 −3 crates/uv/src/commands/tool/upgrade.rs
  50. +5 −1 crates/uv/src/commands/venv.rs
  51. +7 −3 crates/uv/src/lib.rs
  52. +51 −10 crates/uv/src/settings.rs
  53. +106 −1 crates/uv/tests/edit.rs
  54. +2 −2 crates/uv/tests/lock.rs
  55. +92 −5 crates/uv/tests/pip_compile.rs
  56. +1 −1 crates/uv/tests/pip_install.rs
  57. +3 −3 crates/uv/tests/pip_sync.rs
  58. +107 −21 crates/uv/tests/show_settings.rs
  59. +4 −4 crates/uv/tests/sync.rs
  60. +49 −21 docs/concepts/projects.md
  61. +11 −7 docs/concepts/python-versions.md
  62. +3 −3 docs/concepts/resolution.md
  63. +17 −0 docs/configuration/authentication.md
  64. +1 −1 docs/configuration/files.md
  65. +30 −18 docs/getting-started/installation.md
  66. +180 −69 docs/guides/integration/docker.md
  67. +7 −7 docs/guides/integration/github.md
  68. +3 −3 docs/guides/integration/pre-commit.md
  69. +10 −6 docs/index.md
  70. +16 −10 docs/pip/compatibility.md
  71. +2 −2 docs/pip/compile.md
  72. +1 −1 docs/pip/dependencies.md
  73. +10 −6 docs/pip/environments.md
  74. +119 −7 docs/reference/cli.md
  75. +2 −2 docs/reference/resolver-internals.md
  76. +151 −0 docs/reference/settings.md
  77. +1 −1 pyproject.toml
  78. +28 −3 uv.schema.json
27 changes: 27 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,32 @@
# Changelog

## 0.3.5

### Enhancements

- Add support for `--allow-insecure-host` (aliased to `--trusted-host`) ([#6591](https://github.com/astral-sh/uv/pull/6591))
- Read requirements from `requires.txt` when available ([#6655](https://github.com/astral-sh/uv/pull/6655))
- Respect `tool.uv.environments` in `pip compile --universal` ([#6663](https://github.com/astral-sh/uv/pull/6663))
- Use relative paths by default in `uv add` ([#6686](https://github.com/astral-sh/uv/pull/6686))
- Improve messages for empty solves and installs ([#6588](https://github.com/astral-sh/uv/pull/6588))

### Bug fixes

- Avoid reusing state across tool upgrades ([#6660](https://github.com/astral-sh/uv/pull/6660))
- Detect musl and error for musl Python builds ([#6643](https://github.com/astral-sh/uv/pull/6643))
- Ignore `send` errors in installer ([#6667](https://github.com/astral-sh/uv/pull/6667))

### Documentation

- Add development section to Docker guide and reference new example project ([#6666](https://github.com/astral-sh/uv/pull/6666))
- Add docs for `constraint-dependencies` and `override-dependencies` ([#6596](https://github.com/astral-sh/uv/pull/6596))
- Clarify package priority order in pip compatibility guide ([#6619](https://github.com/astral-sh/uv/pull/6619))
- Fix docs for disabling build isolation with `uv sync` ([#6674](https://github.com/astral-sh/uv/pull/6674))
- Improve consistency of directory lookup instructions in Docker ([#6665](https://github.com/astral-sh/uv/pull/6665))
- Improve lockfile concept documentation, add coverage for upgrades ([#6698](https://github.com/astral-sh/uv/pull/6698))
- Shift the order of some of the Docker guide content ([#6664](https://github.com/astral-sh/uv/pull/6664))
- Use `python` to highlight requirements and use more content tabs ([#6549](https://github.com/astral-sh/uv/pull/6549))

## 0.3.4

### CLI
52 changes: 47 additions & 5 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -90,6 +90,7 @@ fs-err = { version = "2.11.0" }
fs2 = { version = "0.4.3" }
futures = { version = "0.3.30" }
glob = { version = "0.3.1" }
goblin = { version = "0.8.2", default-features = false, features = ["std", "elf32", "elf64", "endian_fd"] }
hex = { version = "0.4.3" }
home = { version = "0.5.9" }
html-escape = { version = "0.2.13" }
2 changes: 2 additions & 0 deletions crates/pypi-types/src/lib.rs
Original file line number Diff line number Diff line change
@@ -7,6 +7,7 @@ pub use parsed_url::*;
pub use requirement::*;
pub use scheme::*;
pub use simple_json::*;
pub use supported_environments::*;

mod base_url;
mod direct_url;
@@ -17,3 +18,4 @@ mod parsed_url;
mod requirement;
mod scheme;
mod simple_json;
mod supported_environments;
166 changes: 164 additions & 2 deletions crates/pypi-types/src/metadata.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
//! Derived from `pypi_types_crate`.
use std::io::BufRead;
use std::str::FromStr;

use indexmap::IndexMap;
@@ -10,7 +11,8 @@ use thiserror::Error;
use tracing::warn;

use pep440_rs::{Version, VersionParseError, VersionSpecifiers, VersionSpecifiersParseError};
use pep508_rs::{Pep508Error, Requirement};
use pep508_rs::marker::MarkerValueExtra;
use pep508_rs::{ExtraOperator, MarkerExpression, MarkerTree, Pep508Error, Requirement};
use uv_normalize::{ExtraName, InvalidNameError, PackageName};

use crate::lenient_requirement::LenientRequirement;
@@ -62,6 +64,8 @@ pub enum MetadataError {
DynamicField(&'static str),
#[error("The project uses Poetry's syntax to declare its dependencies, despite including a `project` table in `pyproject.toml`")]
PoetrySyntax,
#[error("Failed to read `requires.txt` contents")]
RequiresTxtContents(#[from] std::io::Error),
}

impl From<Pep508Error<VerbatimParsedUrl>> for MetadataError {
@@ -492,6 +496,109 @@ impl RequiresDist {
}
}

/// `requires.txt` metadata as defined in <https://setuptools.pypa.io/en/latest/deprecated/python_eggs.html#dependency-metadata>.
///
/// This is a subset of the full metadata specification, and only includes the fields that are
/// included in the legacy `requires.txt` file.
#[derive(Deserialize, Debug, Clone)]
#[serde(rename_all = "kebab-case")]
pub struct RequiresTxt {
pub requires_dist: Vec<Requirement<VerbatimParsedUrl>>,
pub provides_extras: Vec<ExtraName>,
}

impl RequiresTxt {
/// Parse the [`RequiresTxt`] from a `requires.txt` file, as included in an `egg-info`.
///
/// See: <https://setuptools.pypa.io/en/latest/deprecated/python_eggs.html#dependency-metadata>
pub fn parse(content: &[u8]) -> Result<Self, MetadataError> {
let mut requires_dist = vec![];
let mut provides_extras = vec![];
let mut current_marker = MarkerTree::default();

for line in content.lines() {
let line = line.map_err(MetadataError::RequiresTxtContents)?;

let line = line.trim();
if line.is_empty() {
continue;
}

// When encountering a new section, parse the extra and marker from the header, e.g.,
// `[:sys_platform == "win32"]` or `[dev]`.
if line.starts_with('[') {
let line = line.trim_start_matches('[').trim_end_matches(']');

// Split into extra and marker, both of which can be empty.
let (extra, marker) = {
let (extra, marker) = match line.split_once(':') {
Some((extra, marker)) => (Some(extra), Some(marker)),
None => (Some(line), None),
};
let extra = extra.filter(|extra| !extra.is_empty());
let marker = marker.filter(|marker| !marker.is_empty());
(extra, marker)
};

// Parse the extra.
let extra = if let Some(extra) = extra {
if let Ok(extra) = ExtraName::from_str(extra) {
provides_extras.push(extra.clone());
Some(MarkerValueExtra::Extra(extra))
} else {
Some(MarkerValueExtra::Arbitrary(extra.to_string()))
}
} else {
None
};

// Parse the marker.
let marker = marker.map(MarkerTree::parse_str).transpose()?;

// Create the marker tree.
match (extra, marker) {
(Some(extra), Some(mut marker)) => {
marker.and(MarkerTree::expression(MarkerExpression::Extra {
operator: ExtraOperator::Equal,
name: extra,
}));
current_marker = marker;
}
(Some(extra), None) => {
current_marker = MarkerTree::expression(MarkerExpression::Extra {
operator: ExtraOperator::Equal,
name: extra,
});
}
(None, Some(marker)) => {
current_marker = marker;
}
(None, None) => {
current_marker = MarkerTree::default();
}
}

continue;
}

// Parse the requirement.
let requirement =
Requirement::<VerbatimParsedUrl>::from(LenientRequirement::from_str(line)?);

// Add the markers and extra, if necessary.
requires_dist.push(Requirement {
marker: current_marker.clone(),
..requirement
});
}

Ok(Self {
requires_dist,
provides_extras,
})
}
}

/// The headers of a distribution metadata file.
#[derive(Debug)]
struct Headers<'a>(Vec<mailparse::MailHeader<'a>>);
@@ -531,7 +638,7 @@ mod tests {
use pep440_rs::Version;
use uv_normalize::PackageName;

use crate::MetadataError;
use crate::{MetadataError, RequiresTxt};

use super::Metadata23;

@@ -677,4 +784,59 @@ mod tests {
);
assert_eq!(meta.provides_extras, vec!["dotenv".parse().unwrap()]);
}

#[test]
fn test_requires_txt() {
let s = r"
Werkzeug>=0.14
Jinja2>=2.10
[dev]
pytest>=3
sphinx
[dotenv]
python-dotenv
";
let meta = RequiresTxt::parse(s.as_bytes()).unwrap();
assert_eq!(
meta.requires_dist,
vec![
"Werkzeug>=0.14".parse().unwrap(),
"Jinja2>=2.10".parse().unwrap(),
"pytest>=3; extra == \"dev\"".parse().unwrap(),
"sphinx; extra == \"dev\"".parse().unwrap(),
"python-dotenv; extra == \"dotenv\"".parse().unwrap(),
]
);

let s = r"
Werkzeug>=0.14
[dev:]
Jinja2>=2.10
[:sys_platform == 'win32']
pytest>=3
[]
sphinx
[dotenv:sys_platform == 'darwin']
python-dotenv
";
let meta = RequiresTxt::parse(s.as_bytes()).unwrap();
assert_eq!(
meta.requires_dist,
vec![
"Werkzeug>=0.14".parse().unwrap(),
"Jinja2>=2.10 ; extra == \"dev\"".parse().unwrap(),
"pytest>=3; sys_platform == 'win32'".parse().unwrap(),
"sphinx".parse().unwrap(),
"python-dotenv; sys_platform == 'darwin' and extra == \"dotenv\""
.parse()
.unwrap(),
]
);
}
}
Original file line number Diff line number Diff line change
@@ -4,6 +4,7 @@ use serde::ser::SerializeSeq;

use pep508_rs::MarkerTree;

/// A list of supported marker environments.
#[derive(Debug, Default, Clone, Eq, PartialEq)]
pub struct SupportedEnvironments(Vec<MarkerTree>);

Loading