Skip to content

Commit fe9deac

Browse files
committed
refactor: remove magic string 'traces' and add Environment::traces_dir() method
- Add public const TRACES_DIR_NAME for the 'traces' subdirectory name - Implement Environment::traces_dir() method to return traces directory path - Replace all environment.data_dir().join('traces') calls with environment.traces_dir() - Update test files to use TRACES_DIR_NAME constant instead of hardcoded 'traces' string This centralizes the traces directory path logic in one place, making it easier to maintain and change if needed. All linters, unit tests, and E2E tests pass.
1 parent 7f79bf5 commit fe9deac

File tree

6 files changed

+47
-6
lines changed

6 files changed

+47
-6
lines changed

src/application/commands/configure.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ impl ConfigureCommand {
283283
};
284284

285285
// Generate trace file with complete error chain
286-
let traces_dir = environment.data_dir().join("traces");
286+
let traces_dir = environment.traces_dir();
287287
let clock = Arc::new(SystemClock);
288288
let trace_writer = ConfigureTraceWriter::new(traces_dir, clock);
289289

src/application/commands/provision.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -488,7 +488,7 @@ impl ProvisionCommand {
488488
};
489489

490490
// Generate trace file
491-
let traces_dir = environment.data_dir().join("traces");
491+
let traces_dir = environment.traces_dir();
492492
let clock = Arc::new(SystemClock);
493493
let writer = ProvisionTraceWriter::new(traces_dir, clock);
494494

src/domain/environment/mod.rs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,9 @@ use crate::shared::{ssh::SshCredentials, Username};
7070
use serde::{Deserialize, Serialize};
7171
use std::path::PathBuf;
7272

73+
/// Directory name for trace files within an environment's data directory
74+
pub const TRACES_DIR_NAME: &str = "traces";
75+
7376
/// Environment configuration encapsulating all environment-specific settings
7477
///
7578
/// This entity represents a complete environment configuration including naming,
@@ -348,6 +351,39 @@ impl<S> Environment<S> {
348351
self.data_dir.join("templates")
349352
}
350353

354+
/// Returns the traces directory for this environment
355+
///
356+
/// The traces directory is located at `data/{env_name}/traces/`
357+
/// and contains error trace files for failed operations.
358+
///
359+
/// # Examples
360+
///
361+
/// ```rust
362+
/// use torrust_tracker_deploy::domain::{Environment, EnvironmentName};
363+
/// use torrust_tracker_deploy::shared::{Username, ssh::SshCredentials};
364+
/// use std::path::PathBuf;
365+
///
366+
/// let env_name = EnvironmentName::new("production".to_string())?;
367+
/// let ssh_username = Username::new("torrust".to_string())?;
368+
/// let ssh_credentials = SshCredentials::new(
369+
/// PathBuf::from("keys/prod_rsa"),
370+
/// PathBuf::from("keys/prod_rsa.pub"),
371+
/// ssh_username,
372+
/// );
373+
/// let environment = Environment::new(env_name, ssh_credentials);
374+
///
375+
/// assert_eq!(
376+
/// environment.traces_dir(),
377+
/// PathBuf::from("data/production/traces")
378+
/// );
379+
///
380+
/// # Ok::<(), Box<dyn std::error::Error>>(())
381+
/// ```
382+
#[must_use]
383+
pub fn traces_dir(&self) -> PathBuf {
384+
self.data_dir.join(TRACES_DIR_NAME)
385+
}
386+
351387
/// Returns the ansible build directory for this environment
352388
///
353389
/// # Examples

src/infrastructure/trace/writer/commands/configure.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,11 +154,12 @@ mod tests {
154154
/// Returns (writer, `temp_dir`, `traces_dir`)
155155
/// The `temp_dir` must be kept alive for the duration of the test
156156
fn create_test_writer() -> (ConfigureTraceWriter, TempDir, PathBuf) {
157+
use crate::domain::environment::TRACES_DIR_NAME;
157158
use crate::testing::MockClock;
158159
use chrono::TimeZone;
159160

160161
let temp_dir = TempDir::new().expect("Failed to create temp dir");
161-
let traces_dir = temp_dir.path().join("traces");
162+
let traces_dir = temp_dir.path().join(TRACES_DIR_NAME);
162163
let fixed_time = Utc.with_ymd_and_hms(2025, 10, 7, 12, 0, 0).unwrap();
163164
let clock = Arc::new(MockClock::new(fixed_time));
164165
let writer = ConfigureTraceWriter::new(traces_dir.clone(), clock);

src/infrastructure/trace/writer/commands/provision.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,11 +156,12 @@ mod tests {
156156
/// Returns (writer, `temp_dir`, `traces_dir`)
157157
/// The `temp_dir` must be kept alive for the duration of the test
158158
fn create_test_writer() -> (ProvisionTraceWriter, TempDir, PathBuf) {
159+
use crate::domain::environment::TRACES_DIR_NAME;
159160
use crate::testing::MockClock;
160161
use chrono::TimeZone;
161162

162163
let temp_dir = TempDir::new().expect("Failed to create temp dir");
163-
let traces_dir = temp_dir.path().join("traces");
164+
let traces_dir = temp_dir.path().join(TRACES_DIR_NAME);
164165
let fixed_time = Utc.with_ymd_and_hms(2025, 10, 7, 12, 0, 0).unwrap();
165166
let clock = Arc::new(MockClock::new(fixed_time));
166167
let writer = ProvisionTraceWriter::new(traces_dir.clone(), clock);

src/infrastructure/trace/writer/common.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,7 @@ mod tests {
162162

163163
// Test helpers - Arrange phase utilities
164164

165+
use crate::domain::environment::TRACES_DIR_NAME;
165166
use crate::testing::MockClock;
166167
use chrono::TimeZone;
167168
use std::sync::Arc;
@@ -171,8 +172,10 @@ mod tests {
171172
/// Returns (writer, `temp_dir`, `traces_dir`)
172173
/// The `temp_dir` must be kept alive for the duration of the test
173174
fn create_test_writer() -> (CommonTraceWriter, TempDir, PathBuf) {
175+
use crate::domain::environment::TRACES_DIR_NAME;
176+
174177
let temp_dir = TempDir::new().expect("Failed to create temp dir");
175-
let traces_dir = temp_dir.path().join("traces");
178+
let traces_dir = temp_dir.path().join(TRACES_DIR_NAME);
176179
let fixed_time = chrono::Utc.with_ymd_and_hms(2025, 10, 7, 12, 0, 0).unwrap();
177180
let clock = Arc::new(MockClock::new(fixed_time));
178181
let writer = CommonTraceWriter::new(traces_dir.clone(), clock);
@@ -389,7 +392,7 @@ mod tests {
389392
perms.set_mode(0o444); // Read-only
390393
fs::set_permissions(&readonly_dir, perms).expect("Failed to set permissions");
391394

392-
let traces_dir = readonly_dir.join("traces");
395+
let traces_dir = readonly_dir.join(TRACES_DIR_NAME);
393396
let fixed_time = chrono::Utc.with_ymd_and_hms(2025, 10, 7, 12, 0, 0).unwrap();
394397
let clock = Arc::new(MockClock::new(fixed_time));
395398
let writer = CommonTraceWriter::new(traces_dir, clock);

0 commit comments

Comments
 (0)