Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion crates/spk-build/src/build/binary.rs
Original file line number Diff line number Diff line change
Expand Up @@ -776,7 +776,7 @@ where
let manifests = split_manifest_by_component(
input.package.ident(),
&collected_layer,
input.package.components(),
&input.package.components(),
)?;
let mut components = HashMap::new();
for (component, manifest) in manifests {
Expand Down
4 changes: 2 additions & 2 deletions crates/spk-build/src/validation/inherit_requirements.rs
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ impl super::Validator for InheritRequirementsValidator<'_> {
for component in all_components {
let downstream_build = solved_request
.spec
.downstream_build_requirements([component]);
.downstream_build_requirements([&component]);
for request in downstream_build.iter() {
let compat = build_requirements.contains_request(request);
let status = match (self.kind, compat) {
Expand Down Expand Up @@ -86,7 +86,7 @@ impl super::Validator for InheritRequirementsValidator<'_> {
}
let downstream_runtime = solved_request
.spec
.downstream_runtime_requirements([component]);
.downstream_runtime_requirements([&component]);
for request in downstream_runtime.iter() {
let status = match (self.kind, runtime_requirements.contains_request(request)) {
(RuleKind::Allow, Compatibility::Compatible)
Expand Down
8 changes: 4 additions & 4 deletions crates/spk-schema/crates/foundation/src/spec_ops/versioned.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ pub trait WithVersion {
#[enum_dispatch::enum_dispatch]
pub trait Versioned: HasVersion {
/// The compatibility guaranteed by this items versioning scheme
fn compat(&self) -> &Compat;
fn compat(&self) -> Arc<Compat>;

/// Check if this item's version is api-compatible with the provided one
fn is_api_compatible(&self, base: &Version) -> Compatibility {
Expand All @@ -47,7 +47,7 @@ impl<T: HasVersion> HasVersion for Arc<T> {
}

impl<T: Versioned> Versioned for Arc<T> {
fn compat(&self) -> &Compat {
fn compat(&self) -> Arc<Compat> {
(**self).compat()
}

Expand All @@ -67,7 +67,7 @@ impl<T: HasVersion> HasVersion for Box<T> {
}

impl<T: Versioned> Versioned for Box<T> {
fn compat(&self) -> &Compat {
fn compat(&self) -> Arc<Compat> {
(**self).compat()
}

Expand All @@ -87,7 +87,7 @@ impl<T: HasVersion> HasVersion for &T {
}

impl<T: Versioned> Versioned for &T {
fn compat(&self) -> &Compat {
fn compat(&self) -> Arc<Compat> {
(**self).compat()
}

Expand Down
35 changes: 35 additions & 0 deletions crates/spk-schema/src/arc_compat.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
// Copyright (c) Contributors to the SPK project.
// SPDX-License-Identifier: Apache-2.0
// https://github.com/spkenv/spk

use std::sync::Arc;

use serde::de::Deserializer;
use serde::ser::Serializer;
use serde::{Deserialize, Serialize};
use spk_schema_foundation::IsDefault;

use crate::foundation::version::Compat;

/// Return true if the `Compat` inside an `Arc<Compat>` is the default `Compat`
pub fn is_default_arc_compat(compat: &Arc<Compat>) -> bool {
(**compat).is_default()
}

/// Serde serialize support for `Arc<Compat>`
pub fn serialize<S, T>(val: &Arc<T>, s: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
T: Serialize,
{
T::serialize(val, s)
}

/// Serde deserialize support for `Arc<Compat>`
pub fn deserialize<'de, D, T>(d: D) -> Result<Arc<T>, D::Error>
where
D: Deserializer<'de>,
T: Deserialize<'de>,
{
Ok(Arc::new(T::deserialize(d)?))
}
3 changes: 2 additions & 1 deletion crates/spk-schema/src/install_spec.rs
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,8 @@ where
}
}

let new_components = target_embedded_package.components().names();
let new_component_specs = target_embedded_package.components();
let new_components = new_component_specs.names();
if new_components.is_empty() {
// Empty components set? The embedded package is not allowed
// to have an empty component set.
Expand Down
2 changes: 2 additions & 0 deletions crates/spk-schema/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// SPDX-License-Identifier: Apache-2.0
// https://github.com/spkenv/spk

pub mod arc_compat;
mod build_spec;
mod component_embedded_packages;
mod component_spec;
Expand All @@ -27,6 +28,7 @@ pub mod v1;
pub mod validation;
pub mod variant;

pub use arc_compat::is_default_arc_compat;
pub use build_spec::BuildSpec;
pub use component_embedded_packages::ComponentEmbeddedPackagesList;
pub use component_spec::ComponentSpec;
Expand Down
17 changes: 9 additions & 8 deletions crates/spk-schema/src/package.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

use std::borrow::Cow;
use std::collections::HashMap;
use std::sync::Arc;

use spk_schema_foundation::ident::{BuildIdent, PinnedRequest, RequestWithOptions};
use spk_schema_foundation::ident_build::Build;
Expand Down Expand Up @@ -91,13 +92,13 @@ pub trait Components {
type ComponentSpecT;

/// The components defined by this package
fn components(&self) -> &super::ComponentSpecList<Self::ComponentSpecT>;
fn components(&self) -> Arc<super::ComponentSpecList<Self::ComponentSpecT>>;
}

forward_to_impl!(Components, {
type ComponentSpecT = T::ComponentSpecT;

fn components(&self) -> &super::ComponentSpecList<Self::ComponentSpecT> {
fn components(&self) -> Arc<super::ComponentSpecList<Self::ComponentSpecT>> {
(**self).components()
}
});
Expand Down Expand Up @@ -172,7 +173,7 @@ pub trait Package:
fn sources(&self) -> &Vec<super::SourceSpec>;

/// The packages that are embedded within this one
fn embedded(&self) -> &super::EmbeddedPackagesList<Self::EmbeddedPackage>;
fn embedded(&self) -> Arc<super::EmbeddedPackagesList<Self::EmbeddedPackage>>;

/// The packages that are embedded within this one.
///
Expand All @@ -185,7 +186,7 @@ pub trait Package:
) -> std::result::Result<Vec<(Self::Package, Option<Component>)>, &str>;

/// The list of build options for this package
fn get_build_options(&self) -> &Vec<Opt>;
fn get_build_options(&self) -> Arc<Vec<Opt>>;

/// Identify the requirements for a build of this package.
fn get_build_requirements(&self) -> crate::Result<Cow<'_, RequirementsList<PinnedRequest>>>;
Expand Down Expand Up @@ -231,7 +232,7 @@ pub trait Package:
///
/// The package requirements include the package-specific options required
/// too.
fn runtime_requirements(&self) -> Cow<'_, RequirementsList<RequestWithOptions>>;
fn runtime_requirements(&self) -> Arc<RequirementsList<RequestWithOptions>>;
}

pub trait PackageMut: Package + DeprecateMut {
Expand Down Expand Up @@ -266,7 +267,7 @@ forward_to_impl!(Package, {
(**self).sources()
}

fn embedded(&self) -> &super::EmbeddedPackagesList<Self::EmbeddedPackage> {
fn embedded(&self) -> Arc<super::EmbeddedPackagesList<Self::EmbeddedPackage>> {
(**self).embedded()
}

Expand All @@ -276,7 +277,7 @@ forward_to_impl!(Package, {
(**self).embedded_as_packages()
}

fn get_build_options(&self) -> &Vec<Opt> {
fn get_build_options(&self) -> Arc<Vec<Opt>> {
(**self).get_build_options()
}

Expand All @@ -288,7 +289,7 @@ forward_to_impl!(Package, {
(**self).get_all_tests()
}

fn runtime_requirements(&self) -> Cow<'_, RequirementsList<RequestWithOptions>> {
fn runtime_requirements(&self) -> Arc<RequirementsList<RequestWithOptions>> {
(**self).runtime_requirements()
}
});
Expand Down
12 changes: 6 additions & 6 deletions crates/spk-schema/src/spec.rs
Original file line number Diff line number Diff line change
Expand Up @@ -433,7 +433,7 @@ impl RuntimeEnvironment for SpecRecipe {
}

impl Versioned for SpecRecipe {
fn compat(&self) -> &Compat {
fn compat(&self) -> Arc<Compat> {
each_variant!(self, spec, spec.compat())
}
}
Expand Down Expand Up @@ -638,7 +638,7 @@ pub enum Spec {
impl Components for Spec {
type ComponentSpecT = ComponentSpec;

fn components(&self) -> &super::ComponentSpecList<Self::ComponentSpecT> {
fn components(&self) -> Arc<super::ComponentSpecList<Self::ComponentSpecT>> {
match self {
Spec::V0Package(spec) => spec.components(),
}
Expand Down Expand Up @@ -702,7 +702,7 @@ impl RuntimeEnvironment for Spec {
}

impl Versioned for Spec {
fn compat(&self) -> &Compat {
fn compat(&self) -> Arc<Compat> {
match self {
Spec::V0Package(spec) => spec.compat(),
}
Expand Down Expand Up @@ -738,7 +738,7 @@ impl Package for Spec {
}
}

fn embedded(&self) -> &super::EmbeddedPackagesList<Self::EmbeddedPackage> {
fn embedded(&self) -> Arc<super::EmbeddedPackagesList<Self::EmbeddedPackage>> {
match self {
Spec::V0Package(spec) => spec.embedded(),
}
Expand All @@ -754,7 +754,7 @@ impl Package for Spec {
}
}

fn get_build_options(&self) -> &Vec<Opt> {
fn get_build_options(&self) -> Arc<Vec<Opt>> {
match self {
Spec::V0Package(spec) => spec.get_build_options(),
}
Expand All @@ -772,7 +772,7 @@ impl Package for Spec {
}
}

fn runtime_requirements(&self) -> Cow<'_, crate::RequirementsList<RequestWithOptions>> {
fn runtime_requirements(&self) -> Arc<crate::RequirementsList<RequestWithOptions>> {
match self {
Spec::V0Package(spec) => spec.runtime_requirements(),
}
Expand Down
23 changes: 15 additions & 8 deletions crates/spk-schema/src/v0/embedded_package_spec.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
// https://github.com/spkenv/spk

use std::borrow::Cow;
use std::sync::Arc;

use serde::{Deserialize, Serialize};
use spk_schema_foundation::IsDefault;
Expand Down Expand Up @@ -49,6 +50,8 @@ use crate::{
RequirementsList,
Result,
SourceSpec,
arc_compat,
is_default_arc_compat,
};

#[cfg(test)]
Expand All @@ -64,8 +67,12 @@ pub struct EmbeddedPackageSpec {
pub pkg: BuildIdent,
#[serde(default, skip_serializing_if = "Meta::is_default")]
pub meta: Meta,
#[serde(default, skip_serializing_if = "Compat::is_default")]
pub compat: Compat,
#[serde(
default,
skip_serializing_if = "is_default_arc_compat",
with = "arc_compat"
)]
pub compat: Arc<Compat>,
#[serde(default, skip_serializing_if = "is_false")]
pub deprecated: bool,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
Expand Down Expand Up @@ -94,7 +101,7 @@ impl EmbeddedPackageSpec {
Self {
pkg: ident,
meta: Meta::default(),
compat: Compat::default(),
compat: Arc::new(Compat::default()),
deprecated: bool::default(),
sources: Vec::new(),
build: EmbeddedBuildSpec::default(),
Expand Down Expand Up @@ -201,7 +208,7 @@ impl EmbeddedPackageSpec {
.pkg
.into_build_ident(Build::Embedded(EmbeddedSource::Unknown)),
meta: recipe.meta,
compat: recipe.compat,
compat: recipe.compat.clone(),
deprecated: recipe.deprecated,
sources: recipe.sources,
tests: recipe.tests,
Expand Down Expand Up @@ -243,8 +250,8 @@ impl BuildOptions for EmbeddedPackageSpec {
impl Components for EmbeddedPackageSpec {
type ComponentSpecT = ComponentSpec;

fn components(&self) -> &ComponentSpecList<Self::ComponentSpecT> {
&self.install.components
fn components(&self) -> Arc<ComponentSpecList<Self::ComponentSpecT>> {
Arc::new(self.install.components.clone())
}
}

Expand Down Expand Up @@ -313,8 +320,8 @@ impl OptionValues for EmbeddedPackageSpec {
}

impl Versioned for EmbeddedPackageSpec {
fn compat(&self) -> &Compat {
&self.compat
fn compat(&self) -> Arc<Compat> {
self.compat.clone()
}
}

Expand Down
9 changes: 5 additions & 4 deletions crates/spk-schema/src/v0/embedded_recipe_install_spec_test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
// https://github.com/spkenv/spk

use std::collections::HashMap;
use std::sync::Arc;

use rstest::rstest;
use spk_schema_foundation::ident::{
Expand Down Expand Up @@ -55,7 +56,7 @@ fn test_render_all_pins_renders_requirements_in_components() {
assert_eq!(req.to_string(), "test");

struct FakeBuild {
compat: Compat,
compat: Arc<Compat>,
build_ident: BuildIdent,
}

Expand All @@ -72,8 +73,8 @@ fn test_render_all_pins_renders_requirements_in_components() {
}

impl Versioned for FakeBuild {
fn compat(&self) -> &Compat {
&self.compat
fn compat(&self) -> Arc<Compat> {
self.compat.clone()
}
}

Expand All @@ -83,7 +84,7 @@ fn test_render_all_pins_renders_requirements_in_components() {
&HashMap::from([(
pkg_name!("test"),
FakeBuild {
compat: Compat::default(),
compat: Arc::new(Compat::default()),
build_ident: "test/1.2.3/GMTG3CXY".parse::<BuildIdent>().unwrap(),
},
)]),
Expand Down
Loading
Loading