Skip to content

Commit 3b61533

Browse files
committed
show files for all versions if no version given for fetch command
1 parent 382a325 commit 3b61533

File tree

3 files changed

+80
-12
lines changed

3 files changed

+80
-12
lines changed

Symfony/src/Codebender/LibraryBundle/Entity/Library.php

+22
Original file line numberDiff line numberDiff line change
@@ -469,4 +469,26 @@ public function getVersions()
469469
{
470470
return $this->versions;
471471
}
472+
473+
/**
474+
* Get the metadata of the library
475+
*
476+
* @return array
477+
*/
478+
public function getLiraryMeta()
479+
{
480+
return array(
481+
'name' => $this->getName(),
482+
'description' => $this->getDescription(),
483+
'verified' => $this->getVerified(),
484+
'gitOwner' => $this->getOwner(),
485+
'gitRepo' => $this->getRepo(),
486+
'url' => $this->getUrl(),
487+
'active' => $this->getActive(),
488+
'gitBranch' => $this->getBranch(),
489+
'gitLastCommit' => $this->getLastCommit(),
490+
'gitInRepoPath' => $this->getInRepoPath(),
491+
'libraryNotes' => $this->getNotes()
492+
);
493+
}
472494
}

Symfony/src/Codebender/LibraryBundle/Handler/ApiCommand/FetchApiCommand.php

+55-11
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace Codebender\LibraryBundle\Handler\ApiCommand;
44

5+
use Codebender\LibraryBundle\Entity\Version;
56
use Symfony\Component\Finder\Finder;
67

78
class FetchApiCommand extends AbstractApiCommand
@@ -11,9 +12,9 @@ public function execute($content)
1112
$content = $this->setDefault($content);
1213
$filename = $content['library'];
1314

14-
$last_slash = strrpos($content['library'], "/");
15+
$last_slash = strrpos($filename, "/");
1516
if ($last_slash !== false) {
16-
$filename = substr($content['library'], $last_slash + 1);
17+
$filename = substr($filename, $last_slash + 1);
1718
}
1819

1920
$apiHandler = $this->container->get('codebender_library.apiHandler');
@@ -37,24 +38,66 @@ public function execute($content)
3738
if ($content['renderView']) {
3839
$examples = $this->fetchLibraryExamples($exampleFinder, $builtinLibrariesPath . "/libraries/" . $filename);
3940
$meta = [];
41+
$versions = [];
4042
}
4143
} else {
4244
if (!$apiHandler->isExternalLibrary($filename, $content['disabled'])) {
4345
return ["success" => false, "message" => "No Library named " . $filename . " found."];
4446
}
4547

46-
$response = $this->fetchLibraryFiles($finder, $externalLibrariesPath . "/" . $filename . "/" . $content['version']);
47-
if (empty($response)) {
48-
return ['success' => false, 'message' => 'No files for Library named `' . $filename . '` with version `' . $content['version'] . '` found.'];
48+
// check if requested (if any) version is valid
49+
if ($content['version'] !== null && !$apiHandler->libraryVersionExists($filename, $content['version'])) {
50+
return [
51+
'success' => false,
52+
'message' => 'No files for Library named `' . $filename . '` with version `' . $content['version'] . '` found.'
53+
];
4954
}
5055

51-
if ($content['renderView']) {
52-
$examples = $this->fetchLibraryExamples($exampleFinder, $externalLibrariesPath . "/" . $filename . "/" . $content['version']);
56+
$versionObjects = $apiHandler->getAllVersionsFromDefaultHeader($filename);
57+
58+
// use the requested version (if any) for fetching data
59+
// else fetch data for all versions
60+
$versions = $versionObjects->toArray();
61+
if ($content['version'] !== null) {
62+
$versionsCollection = $versionObjects->filter(function ($version) use ($content) {
63+
return $version->getVersion() === $content['version'];
64+
});
65+
$versions = $versionsCollection->toArray();
66+
}
67+
68+
// fetch library files for each version
69+
$response = [];
70+
$examples = [];
71+
foreach ($versions as $version) {
72+
/* @var Version $version */
73+
$libraryPath = $externalLibrariesPath . "/" . $filename . "/" . $version->getFolderName();
74+
75+
// fetch library files for this version
76+
$fetchResponse = $this->fetchLibraryFiles($finder->create(), $libraryPath);
77+
if (!empty($fetchResponse)) {
78+
$response[$version->getVersion()] = $fetchResponse;
79+
}
5380

54-
$externalLibrary = $this->entityManager->getRepository('CodebenderLibraryBundle:ExternalLibrary')
55-
->findOneBy(array('machineName' => $filename));
56-
$filename = $externalLibrary->getMachineName();
81+
if ($content['renderView']) {
82+
// fetch example files for this version if it's rendering view
83+
$exampleResponse = $this->fetchLibraryExamples($exampleFinder->create(), $libraryPath);
84+
if (!empty($exampleResponse)) {
85+
$examples[$version->getVersion()] = $exampleResponse;
86+
}
87+
}
88+
}
89+
90+
if ($content['renderView']) {
91+
$externalLibrary = $this->entityManager->getRepository('CodebenderLibraryBundle:Library')
92+
->findOneBy(array('default_header' => $filename));
93+
$filename = $externalLibrary->getDefaultHeader();
5794
$meta = $externalLibrary->getLiraryMeta();
95+
$versions = array_map(
96+
function ($version) {
97+
return $version->getVersion();
98+
},
99+
$versions
100+
);
58101
}
59102
}
60103

@@ -65,6 +108,7 @@ public function execute($content)
65108
return [
66109
'success' => true,
67110
'library' => $filename,
111+
'versions' => $versions,
68112
'files' => $response,
69113
'examples' => $examples,
70114
'meta' => $meta
@@ -84,9 +128,9 @@ private function fetchLibraryFiles($finder, $directory, $getContent = true)
84128
if (!is_dir($directory)) {
85129
return array();
86130
}
87-
88131
$finder->in($directory)->exclude('examples')->exclude('Examples');
89132
$finder->name('*.*');
133+
$finder->files(); // fetch only files
90134

91135
$finfo = finfo_open(FILEINFO_MIME_TYPE);
92136

Symfony/src/Codebender/LibraryBundle/Tests/Controller/ApiControllerTest.php

+3-1
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,9 @@ public function testFetchApiCommand()
369369
$this->assertTrue($response['success']);
370370
$this->assertEquals('Library found', $response['message']);
371371

372-
$filenames = array_column($response['files'], 'filename');
372+
$this->assertArrayHasKey('1.1.0', $response['files']);
373+
374+
$filenames = array_column($response['files']['1.1.0'], 'filename');
373375
$this->assertContains('default.cpp', $filenames);
374376
$this->assertContains('default.h', $filenames);
375377
$this->assertContains('inc_file.inc', $filenames);

0 commit comments

Comments
 (0)