aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/mozart-core/src/repository
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-05-10 01:18:44 +0900
committernsfisis <nsfisis@gmail.com>2026-05-10 01:18:44 +0900
commit4caf72463de598ea9b6454f3b7b7332dd0071318 (patch)
tree62f99c8a48e5b21d75ab70bfd374eb67215542c9 /crates/mozart-core/src/repository
parent8cc1ba8a02c0318b65658f1634de378c780392b9 (diff)
downloadphp-mozart-4caf72463de598ea9b6454f3b7b7332dd0071318.tar.gz
php-mozart-4caf72463de598ea9b6454f3b7b7332dd0071318.tar.zst
php-mozart-4caf72463de598ea9b6454f3b7b7332dd0071318.zip
refactor(package): port RootPackageLoader into RootPackageData::from_raw
Mirrors Composer\Package\Loader\RootPackageLoader::load(): converts the parsed RawPackageData into fully typed RootPackageData with Link objects, defaulted fields, and trait-based accessors. Composer::package() now returns RootPackageData instead of RawPackageData, eliminating the pre-normalised JSON workaround noted in the previous comment.
Diffstat (limited to 'crates/mozart-core/src/repository')
-rw-r--r--crates/mozart-core/src/repository/browse_repos.rs36
-rw-r--r--crates/mozart-core/src/repository/lockfile.rs24
2 files changed, 29 insertions, 31 deletions
diff --git a/crates/mozart-core/src/repository/browse_repos.rs b/crates/mozart-core/src/repository/browse_repos.rs
index d54465f..9cb8a9f 100644
--- a/crates/mozart-core/src/repository/browse_repos.rs
+++ b/crates/mozart-core/src/repository/browse_repos.rs
@@ -8,7 +8,8 @@
//! `CompletePackageInterface` (`getSupport()['source']`,
//! `getSourceUrl()`, `getHomepage()`).
-use super::super::package::RawPackageData;
+use super::super::package::Package;
+use super::super::package::{CompletePackage, RootPackageData};
use super::cache::Cache;
use super::installed::{InstalledPackageEntry, InstalledPackages};
use super::lockfile::LockedPackage;
@@ -77,19 +78,11 @@ impl From<&PackagistVersion> for CompletePackageView {
}
}
-/// `RawPackageData` lacks a typed `support` field — the root package's
-/// `support` block lives inside `extra_fields` because the schema is not
-/// yet ported. Read it manually here.
-pub fn view_from_raw(pkg: &RawPackageData) -> CompletePackageView {
+pub fn view_from_root(pkg: &RootPackageData) -> CompletePackageView {
CompletePackageView {
- support_source: pkg
- .extra_fields
- .get("support")
- .and_then(|s| s.get("source"))
- .and_then(|s| s.as_str())
- .map(str::to_string),
+ support_source: pkg.support().source.clone(),
source_url: None,
- homepage: pkg.homepage.clone(),
+ homepage: pkg.homepage().map(str::to_string),
}
}
@@ -99,9 +92,9 @@ pub fn view_from_raw(pkg: &RawPackageData) -> CompletePackageView {
pub enum BrowseRepo {
/// Stand-in for `Composer\Repository\RootPackageRepository` —
/// a one-package array containing the root composer.json.
- /// Boxed because `RawPackageData` is much larger than the other
+ /// Boxed because `RootPackageData` is much larger than the other
/// variants (clippy::large_enum_variant).
- Root(Box<RawPackageData>),
+ Root(Box<RootPackageData>),
/// Stand-in for `RepositoryManager::getLocalRepository()` —
/// the installed.json view of `vendor/`.
Installed(InstalledPackages),
@@ -116,8 +109,8 @@ impl BrowseRepo {
pub async fn find_packages(&self, name: &str) -> anyhow::Result<Vec<CompletePackageView>> {
match self {
BrowseRepo::Root(pkg) => {
- if pkg.name.eq_ignore_ascii_case(name) {
- Ok(vec![view_from_raw(pkg)])
+ if pkg.name().eq_ignore_ascii_case(name) {
+ Ok(vec![view_from_root(pkg)])
} else {
Ok(Vec::new())
}
@@ -148,7 +141,7 @@ impl BrowseRepos {
/// them from `Composer` (when composer.json is present) or skip
/// them entirely (the `defaultReposWithDefaultManager` fallback).
pub fn new(
- root: Option<RawPackageData>,
+ root: Option<RootPackageData>,
installed: Option<InstalledPackages>,
packagist_cache: Cache,
) -> Self {
@@ -173,6 +166,7 @@ impl BrowseRepos {
#[cfg(test)]
mod tests {
use super::*;
+ use crate::package::RawPackageData;
use std::collections::BTreeMap;
fn locked(
@@ -267,14 +261,15 @@ mod tests {
}
#[test]
- fn view_from_raw_reads_support_via_extra_fields() {
+ fn view_from_root_reads_support_and_homepage() {
let mut raw = RawPackageData::new("vendor/root".to_string());
raw.homepage = Some("https://vendor.example.com".to_string());
raw.extra_fields.insert(
"support".to_string(),
serde_json::json!({"source": "https://github.com/vendor/root"}),
);
- let view = view_from_raw(&raw);
+ let root = RootPackageData::from_raw(raw);
+ let view = view_from_root(&root);
assert_eq!(
view.support_source.as_deref(),
Some("https://github.com/vendor/root")
@@ -286,7 +281,8 @@ mod tests {
#[tokio::test]
async fn root_repo_matches_case_insensitively() {
let raw = RawPackageData::new("Vendor/Root".to_string());
- let repo = BrowseRepo::Root(Box::new(raw));
+ let root = RootPackageData::from_raw(raw);
+ let repo = BrowseRepo::Root(Box::new(root));
assert_eq!(repo.find_packages("vendor/root").await.unwrap().len(), 1);
assert_eq!(repo.find_packages("other/pkg").await.unwrap().len(), 0);
}
diff --git a/crates/mozart-core/src/repository/lockfile.rs b/crates/mozart-core/src/repository/lockfile.rs
index 4c41bbb..6aae4df 100644
--- a/crates/mozart-core/src/repository/lockfile.rs
+++ b/crates/mozart-core/src/repository/lockfile.rs
@@ -2,7 +2,8 @@ use super::packagist::{PackagistDist, PackagistSource, PackagistVersion};
use super::repository::RepositorySet;
use super::resolver::ResolvedPackage;
use crate::installer::HasSuggests;
-use crate::package::{RawPackageData, to_json_pretty};
+use crate::package::Package;
+use crate::package::{Link, RawPackageData, to_json_pretty};
use indexmap::IndexMap;
use indexmap::IndexSet;
use serde::{Deserialize, Serialize};
@@ -260,7 +261,7 @@ impl LockFile {
/// Mirrors `Composer\Package\Locker::getMissingRequirementInfo()`.
pub fn get_missing_requirement_info(
&self,
- root: &crate::package::RawPackageData,
+ root: &crate::package::RootPackageData,
include_dev: bool,
) -> Vec<String> {
let mut messages = Vec::new();
@@ -280,7 +281,7 @@ impl LockFile {
}
check_requirement_set(
- &root.require,
+ root.requires(),
"Required",
&base_pool,
&mut messages,
@@ -288,7 +289,7 @@ impl LockFile {
);
if include_dev {
check_requirement_set(
- &root.require_dev,
+ root.dev_requires(),
"Required (in require-dev)",
&dev_pool,
&mut messages,
@@ -395,16 +396,17 @@ pub fn locked_package_branch_aliases(pkg: &LockedPackage) -> Vec<LockAlias> {
}
fn check_requirement_set(
- requires: &BTreeMap<String, String>,
+ requires: &BTreeMap<String, Link>,
description: &str,
pool: &[LockedSearchEntry],
messages: &mut Vec<String>,
any_missing: &mut bool,
) {
- for (name, constraint_str) in requires {
+ for (name, link) in requires {
if crate::platform::is_platform_package(name) {
continue;
}
+ let constraint_str = link.constraint.as_str();
if constraint_str.trim() == "self.version" {
continue;
}
@@ -1931,15 +1933,15 @@ mod tests {
fn root_with_require(
require: &[(&str, &str)],
require_dev: &[(&str, &str)],
- ) -> crate::package::RawPackageData {
- let mut root = crate::package::RawPackageData::new("__root__".to_string());
+ ) -> crate::package::RootPackageData {
+ let mut raw = crate::package::RawPackageData::new("__root__".to_string());
for (k, v) in require {
- root.require.insert((*k).to_string(), (*v).to_string());
+ raw.require.insert((*k).to_string(), (*v).to_string());
}
for (k, v) in require_dev {
- root.require_dev.insert((*k).to_string(), (*v).to_string());
+ raw.require_dev.insert((*k).to_string(), (*v).to_string());
}
- root
+ crate::package::RootPackageData::from_raw(raw)
}
#[test]