-
Notifications
You must be signed in to change notification settings - Fork 1.2k
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
Allow user to constrain supported lock environments #6210
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
use std::str::FromStr; | ||
|
||
use serde::ser::SerializeSeq; | ||
|
||
use pep508_rs::MarkerTree; | ||
|
||
#[derive(Debug, Default, Clone, Eq, PartialEq)] | ||
pub struct SupportedEnvironments(Vec<MarkerTree>); | ||
|
||
impl SupportedEnvironments { | ||
/// Return the list of marker trees. | ||
pub fn as_markers(&self) -> &[MarkerTree] { | ||
&self.0 | ||
} | ||
|
||
/// Convert the [`SupportedEnvironments`] struct into a list of marker trees. | ||
pub fn into_markers(self) -> Vec<MarkerTree> { | ||
self.0 | ||
} | ||
} | ||
|
||
/// Serialize a [`SupportedEnvironments`] struct into a list of marker strings. | ||
impl serde::Serialize for SupportedEnvironments { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Is the difference from the auto-derive here that we drop empty markers that the user may have written? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We support providing a string or a list of strings -- either is fine. |
||
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> | ||
where | ||
S: serde::Serializer, | ||
{ | ||
let mut seq = serializer.serialize_seq(Some(self.0.len()))?; | ||
for element in &self.0 { | ||
if let Some(contents) = element.contents() { | ||
seq.serialize_element(&contents)?; | ||
} | ||
} | ||
seq.end() | ||
} | ||
} | ||
|
||
/// Deserialize a marker string or list of marker strings into a [`SupportedEnvironments`] struct. | ||
impl<'de> serde::Deserialize<'de> for SupportedEnvironments { | ||
fn deserialize<D>(deserializer: D) -> Result<SupportedEnvironments, D::Error> | ||
where | ||
D: serde::Deserializer<'de>, | ||
{ | ||
struct StringOrVecVisitor; | ||
|
||
impl<'de> serde::de::Visitor<'de> for StringOrVecVisitor { | ||
type Value = SupportedEnvironments; | ||
|
||
fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { | ||
formatter.write_str("a string or a list of strings") | ||
} | ||
|
||
fn visit_str<E>(self, value: &str) -> Result<Self::Value, E> | ||
where | ||
E: serde::de::Error, | ||
{ | ||
let marker = MarkerTree::from_str(value).map_err(serde::de::Error::custom)?; | ||
Ok(SupportedEnvironments(vec![marker])) | ||
} | ||
|
||
fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error> | ||
where | ||
A: serde::de::SeqAccess<'de>, | ||
{ | ||
let mut markers = Vec::new(); | ||
|
||
while let Some(elem) = seq.next_element::<String>()? { | ||
let marker = MarkerTree::from_str(&elem).map_err(serde::de::Error::custom)?; | ||
markers.push(marker); | ||
} | ||
|
||
Ok(SupportedEnvironments(markers)) | ||
} | ||
} | ||
|
||
deserializer.deserialize_any(StringOrVecVisitor) | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,8 +1,10 @@ | ||
pub use environments::SupportedEnvironments; | ||
pub use workspace::{ | ||
check_nested_workspaces, DiscoveryOptions, ProjectWorkspace, VirtualProject, Workspace, | ||
WorkspaceError, WorkspaceMember, | ||
}; | ||
|
||
mod environments; | ||
pub mod pyproject; | ||
pub mod pyproject_mut; | ||
mod workspace; |
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 am tempted to rename these to:
resolution-markers
andsupported-markers
(i.e., renameenvironment-markers
).