Merge pull request #46356 from nextcloud/enh/use-generator-for-group-list

feat(occ): Add support for iterable in Base and use it in group:list and user:list
pull/40427/head
Côme Chilliet 2024-08-06 17:34:04 +07:00 committed by GitHub
commit 2f3dfbb877
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 52 additions and 57 deletions

@ -37,17 +37,19 @@ class Base extends Command implements CompletionAwareInterface {
;
}
protected function writeArrayInOutputFormat(InputInterface $input, OutputInterface $output, array $items, string $prefix = ' - '): void {
protected function writeArrayInOutputFormat(InputInterface $input, OutputInterface $output, iterable $items, string $prefix = ' - '): void {
switch ($input->getOption('output')) {
case self::OUTPUT_FORMAT_JSON:
$items = (is_array($items) ? $items : iterator_to_array($items));
$output->writeln(json_encode($items));
break;
case self::OUTPUT_FORMAT_JSON_PRETTY:
$items = (is_array($items) ? $items : iterator_to_array($items));
$output->writeln(json_encode($items, JSON_PRETTY_PRINT));
break;
default:
foreach ($items as $key => $item) {
if (is_array($item)) {
if (is_iterable($item)) {
$output->writeln($prefix . $key . ':');
$this->writeArrayInOutputFormat($input, $output, $item, ' ' . $prefix);
continue;

@ -68,25 +68,18 @@ class ListCommand extends Base {
/**
* @param IGroup[] $groups
* @return array
*/
private function formatGroups(array $groups, bool $addInfo = false) {
$keys = array_map(function (IGroup $group) {
return $group->getGID();
}, $groups);
if ($addInfo) {
$values = array_map(function (IGroup $group) {
return [
private function formatGroups(array $groups, bool $addInfo = false): \Generator {
foreach ($groups as $group) {
if ($addInfo) {
$value = [
'backends' => $group->getBackendNames(),
'users' => $this->usersForGroup($group),
];
}, $groups);
} else {
$values = array_map(function (IGroup $group) {
return $this->usersForGroup($group);
}, $groups);
} else {
$value = $this->usersForGroup($group);
}
yield $group->getGID() => $value;
}
return array_combine($keys, $values);
}
}

@ -69,18 +69,13 @@ class ListCommand extends Base {
/**
* @param IUser[] $users
* @param bool [$detailed=false]
* @return array
* @return \Generator<string,string|array>
*/
private function formatUsers(array $users, bool $detailed = false) {
$keys = array_map(function (IUser $user) {
return $user->getUID();
}, $users);
$values = array_map(function (IUser $user) use ($detailed) {
private function formatUsers(array $users, bool $detailed = false): \Generator {
foreach ($users as $user) {
if ($detailed) {
$groups = $this->groupManager->getUserGroupIds($user);
return [
$value = [
'user_id' => $user->getUID(),
'display_name' => $user->getDisplayName(),
'email' => (string)$user->getSystemEMailAddress(),
@ -92,9 +87,10 @@ class ListCommand extends Base {
'user_directory' => $user->getHome(),
'backend' => $user->getBackendClassName()
];
} else {
$value = $user->getDisplayName();
}
return $user->getDisplayName();
}, $users);
return array_combine($keys, $values);
yield $user->getUID() => $value;
}
}
}

@ -90,18 +90,20 @@ class ListCommandTest extends TestCase {
->with(
$this->equalTo($this->input),
$this->equalTo($this->output),
[
'group1' => [
'user1',
'user2',
],
'group2' => [
],
'group3' => [
'user1',
'user3',
$this->callback(
fn ($iterator) => iterator_to_array($iterator) === [
'group1' => [
'user1',
'user2',
],
'group2' => [
],
'group3' => [
'user1',
'user3',
]
]
]
)
);
$this->invokePrivate($this->command, 'execute', [$this->input, $this->output]);
@ -166,26 +168,28 @@ class ListCommandTest extends TestCase {
->with(
$this->equalTo($this->input),
$this->equalTo($this->output),
[
'group1' => [
'backends' => ['Database'],
'users' => [
'user1',
'user2',
$this->callback(
fn ($iterator) => iterator_to_array($iterator) === [
'group1' => [
'backends' => ['Database'],
'users' => [
'user1',
'user2',
],
],
],
'group2' => [
'backends' => ['Database'],
'users' => [],
],
'group3' => [
'backends' => ['LDAP'],
'users' => [
'user1',
'user3',
'group2' => [
'backends' => ['Database'],
'users' => [],
],
'group3' => [
'backends' => ['LDAP'],
'users' => [
'user1',
'user3',
],
]
]
]
)
);
$this->invokePrivate($this->command, 'execute', [$this->input, $this->output]);