v0.5.2-pre.006-fix-010

This commit is contained in:
2026-08-11 12:03:35 +02:00
parent 1ee1d0297d
commit 56572cec40
67 changed files with 2484 additions and 539 deletions

View File

@@ -1,8 +1,23 @@
<!-- file: ks-config/CHANGELOG.md -->
<!-- version: 21 -->
<!-- version: 24 -->
# CHANGELOG — ks-config
## `0.5.2-pre.006-delta-fix-007`
- corrige le test de séparation des répertoires wallet afin quil résolve dabord `${KS_WALLETS_DIRECTORY:-wallets}` comme le chemin de chargement runtime ;
- rend le test indépendant dun éventuel override `KS_WALLETS_DIRECTORY` en vérifiant la relation `temporary_wallet_dir = wallet_dir/temporary/local_devnet` plutôt quune racine littérale.
## `0.5.2-pre.006-delta-fix-006`
- réinclut dans le delta `config/wallet.config.json` et `config/exemples/example.wallet.config.json`, omis par erreur dans `fix-005`, afin que leurs sous-répertoires temporaires `temporary/...` correspondent au contrat runtime résolu ;
- précise dans le schéma wallet que `wallets_directory` est la racine persistante `.kswallet` et que `profile.directory` désigne les wallets/fixtures temporaires du profil.
## `0.5.2-pre.006-delta-fix-005`
- sépare le store natif persistant `wallet_dir` de `temporary_wallet_dir` : les `.kswallet` utilisent désormais directement la racine `wallets_directory`, tandis que les wallets et keypairs de fixtures restent sous le sous-répertoire temporaire du profil ;
- propage les deux chemins dans le contrat runtime résolu et son schéma sans déplacer automatiquement les fichiers existants.
## `0.5.2-pre.006`
- ajoute `wallet_alias` aux profils du document wallet comme sélection optionnelle/nullable d'un wallet natif persistant, sans password ni matériau secret dans `ks-config` ;

View File

@@ -1,5 +1,5 @@
<!-- file: ks-config/USAGE.md -->
<!-- version: 11 -->
<!-- version: 12 -->
# Utilisation de ks-config
@@ -92,9 +92,9 @@ Les endpoints WebSocket source sélectionnent une classe `ws_endpoint_defaults`;
## Wallet
`wallet.config.json` porte `wallets_directory` hors profils. Chaque profil définit un chemin relatif, le cluster, l'alias et la politique temporaire/persistante. `resolved_wallet_profile` construit le chemin runtime final.
`wallet.config.json` porte `wallets_directory` hors profils. Cette valeur résout directement `wallet.wallet_dir`, racine commune des `.kswallet` persistants. Chaque profil conserve `directory` uniquement pour ses wallets/keypairs temporaires ; `resolved_wallet_profile` le résout séparément dans `wallet.temporary_wallet_dir` (par défaut `wallets/temporary/<profil>`).
Les autorisations de soumission ne font plus partie du wallet.
Un changement de profil ne déplace donc pas les `.kswallet` persistants. Les fixtures temporaires restent isolées par profil et les autorisations de soumission ne font plus partie du wallet.
## Exécution

View File

@@ -1,5 +1,5 @@
// file: ks-config/src/settings.rs
// version: 24
// version: 25
//! Resolved runtime configuration models retained during the `0.5.1` source-document split.
@@ -222,8 +222,10 @@ pub struct AccountListenerConfig {
/// Wallet configuration.
#[derive(Clone, serde::Deserialize, Eq, PartialEq)]
pub struct WalletConfig {
/// Wallet directory path.
/// Persistent native wallet directory path.
pub wallet_dir: std::string::String,
/// Profile-specific temporary wallet and fixture directory path.
pub temporary_wallet_dir: std::string::String,
/// Selected cluster name.
pub cluster: std::string::String,
/// Optional persistent native wallet alias selected by this profile.
@@ -734,6 +736,10 @@ pub(crate) fn validate_wallet(config: &WalletConfig) -> ks_core::Result<()> {
std::result::Result::Ok(()) => (),
std::result::Result::Err(error) => return std::result::Result::Err(error),
}
match require_non_empty(&config.temporary_wallet_dir, "wallet.temporary_wallet_dir") {
std::result::Result::Ok(()) => (),
std::result::Result::Err(error) => return std::result::Result::Err(error),
}
match require_non_empty(&config.cluster, "wallet.cluster") {
std::result::Result::Ok(()) => (),
std::result::Result::Err(error) => return std::result::Result::Err(error),

View File

@@ -1,5 +1,5 @@
// file: ks-config/src/wallet.rs
// version: 4
// version: 6
//! Independent wallet configuration document loading and validation.
@@ -21,7 +21,7 @@ pub struct WalletConfigDocument {
pub struct WalletProfileConfig {
/// Profile code.
pub name: std::string::String,
/// Wallet subdirectory or absolute directory.
/// Temporary wallet/fixture subdirectory or absolute directory.
pub directory: std::string::String,
/// Selected cluster name.
pub cluster: std::string::String,
@@ -143,14 +143,16 @@ pub fn resolved_wallet_profile(
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => return std::result::Result::Err(error),
};
let configured = std::path::PathBuf::from(profile.directory.as_str());
let wallet_dir = if configured.is_absolute() {
configured
let persistent_wallet_dir = std::path::PathBuf::from(document.wallets_directory.as_str());
let configured_temporary = std::path::PathBuf::from(profile.directory.as_str());
let temporary_wallet_dir = if configured_temporary.is_absolute() {
configured_temporary
} else {
std::path::PathBuf::from(document.wallets_directory.as_str()).join(configured)
persistent_wallet_dir.join(configured_temporary)
};
let resolved = crate::WalletConfig {
wallet_dir: wallet_dir.display().to_string(),
wallet_dir: persistent_wallet_dir.display().to_string(),
temporary_wallet_dir: temporary_wallet_dir.display().to_string(),
cluster: profile.cluster.clone(),
wallet_alias: profile.wallet_alias.clone(),
temporary_wallet_enabled: profile.temporary_wallet_enabled,
@@ -233,6 +235,25 @@ mod tests {
);
}
#[test]
fn resolved_profile_separates_persistent_and_temporary_wallet_directories() {
let resolved_raw = crate::resolve_environment_placeholders(DEFAULT_WALLET);
let document = match super::parse_wallet_json(resolved_raw.as_str()) {
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => panic!("resolved wallet config failed: {error}"),
};
let resolved = match super::resolved_wallet_profile(&document, "local_devnet") {
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => panic!("wallet profile resolution failed: {error}"),
};
assert!(!resolved.wallet_dir.contains("${"));
let expected_temporary = std::path::PathBuf::from(resolved.wallet_dir.as_str())
.join("temporary/local_devnet")
.display()
.to_string();
assert_eq!(resolved.temporary_wallet_dir, expected_temporary);
}
#[test]
fn wallet_profile_without_persistent_alias_remains_backward_compatible() {
let mut value = match serde_json::from_str::<serde_json::Value>(DEFAULT_WALLET) {