Skip to content

Commit 1c5d5e5

Browse files
committed
Address code review feedback for table headers
1 parent bab9c04 commit 1c5d5e5

File tree

2 files changed

+52
-2
lines changed

2 files changed

+52
-2
lines changed

lib/cli/Table.php

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,11 @@ public function __construct( array $headers = array(), array $rows = array(), ar
7272
$rows = $headers;
7373
$first_row = array_shift( $headers );
7474
$keys = is_array( $first_row ) ? array_keys( $first_row ) : array();
75-
$headers = array_map( $safe_strval, $keys );
75+
76+
$headers = array();
77+
foreach ( $keys as $key ) {
78+
$headers[ $key ] = $safe_strval( $key );
79+
}
7680
} else {
7781
$headers = array_map( $safe_strval, $headers );
7882
}
@@ -82,7 +86,11 @@ public function __construct( array $headers = array(), array $rows = array(), ar
8286
$safe_rows = array();
8387
foreach ( $rows as $row ) {
8488
if ( is_array( $row ) ) {
85-
$safe_rows[] = array_map( $safe_strval, $row );
89+
$normalized_row = array();
90+
foreach ( $headers as $key => $header_val ) {
91+
$normalized_row[ $key ] = isset( $row[ $key ] ) ? $safe_strval( $row[ $key ] ) : '';
92+
}
93+
$safe_rows[] = $normalized_row;
8694
}
8795
}
8896
$this->setRows( $safe_rows );

tests/Test_Table.php

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,48 @@ public function test_resetRows() {
399399
$this->assertGreaterThan( 0, count( $out ) );
400400
}
401401

402+
public function test_shortcut_constructor_tabular() {
403+
$headers = array(
404+
array( 'Name' => 'Alice', 'Age' => '30' ),
405+
array( 'Name' => 'Bob', 'Age' => '25' ),
406+
);
407+
408+
$table = new cli\Table( $headers );
409+
$table->setRenderer( new cli\Table\Tabular() );
410+
411+
$out = $table->getDisplayLines();
412+
413+
$expected = [
414+
"Name\tAge",
415+
"Alice\t30",
416+
"Bob\t25",
417+
];
418+
419+
$this->assertSame( $expected, $out );
420+
}
421+
422+
public function test_shortcut_constructor_normalization() {
423+
$headers = array(
424+
array( 'Name' => 'Alice', 'Age' => '30' ),
425+
array( 'Age' => '25', 'Name' => 'Bob' ), // Different order
426+
array( 'Name' => 'Charlie' ), // Missing Age
427+
);
428+
429+
$table = new cli\Table( $headers );
430+
$table->setRenderer( new cli\Table\Tabular() );
431+
432+
$out = $table->getDisplayLines();
433+
434+
$expected = [
435+
"Name\tAge",
436+
"Alice\t30",
437+
"Bob\t25", // Order should be normalized to match headers!
438+
"Charlie\t", // Missing value should be empty string
439+
];
440+
441+
$this->assertSame( $expected, $out );
442+
}
443+
402444
public function test_displayRow_ascii() {
403445
$mockFile = tempnam( sys_get_temp_dir(), 'temp' );
404446
$resource = fopen( $mockFile, 'wb' );

0 commit comments

Comments
 (0)