55
66use Cake \Command \Command ;
77use Cake \Console \Arguments ;
8+ use Cake \Console \CommandFactoryInterface ;
89use Cake \Console \ConsoleIo ;
910use Cake \Log \Log ;
11+ use Composer \Semver \Semver ;
1012use Packagist \Api \Client ;
1113
1214/**
1315 * SyncPackages command.
1416 */
1517class SyncPackagesCommand extends Command
1618{
19+ private Client $ client ;
20+
1721 /**
1822 * The name of this command.
1923 *
@@ -41,6 +45,16 @@ public static function getDescription(): string
4145 return 'Command description here. ' ;
4246 }
4347
48+ /**
49+ * @param \Cake\Console\CommandFactoryInterface|null $factory
50+ */
51+ public function __construct (
52+ ?CommandFactoryInterface $ factory = null ,
53+ ) {
54+ parent ::__construct ($ factory );
55+ $ this ->client = new Client ();
56+ }
57+
4458 /**
4559 * Implement this method with your command's logic.
4660 *
@@ -50,18 +64,19 @@ public static function getDescription(): string
5064 */
5165 public function execute (Arguments $ args , ConsoleIo $ io )
5266 {
53- $ client = new Client ();
5467 $ packagesTable = $ this ->fetchTable ('Packages ' );
5568
5669 /** @var \Packagist\Api\Result\Result $package */
57- foreach ($ client ->search ('' , ['type ' => 'cakephp-plugin ' ]) as $ package ) {
70+ foreach ($ this ->client ->search ('' , ['type ' => 'cakephp-plugin ' ]) as $ package ) {
71+ $ tags = $ this ->getTagsForPackage ($ package ->getName ());
5872 $ data = [
5973 'package ' => $ package ->getName (),
6074 'description ' => $ package ->getDescription (),
6175 'repo_url ' => $ package ->getRepository (),
6276 'packagist_url ' => $ package ->getUrl (),
6377 'downloads ' => $ package ->getDownloads (),
6478 'stars ' => $ package ->getFavers (),
79+ 'tag_list ' => $ tags ,
6580 ];
6681
6782 $ entity = $ packagesTable ->find ()->where (['package ' => $ package ->getName ()])->first ();
@@ -78,4 +93,84 @@ public function execute(Arguments $args, ConsoleIo $io)
7893 }
7994 }
8095 }
96+
97+ /**
98+ * @param string $packageName
99+ * @return array
100+ */
101+ private function getTagsForPackage (string $ packageName ): array
102+ {
103+ $ metaDetails = $ this ->client ->getComposer ($ packageName );
104+
105+ /** @var \Packagist\Api\Result\Package $metaDetails */
106+ $ metaDetails = $ metaDetails [$ packageName ];
107+ $ versions = $ metaDetails ->getVersions ();
108+
109+ $ meta = [];
110+ // Check each version
111+ foreach ($ versions as $ versionMeta ) {
112+ $ phpRequire = $ versionMeta ->getRequire ()['php ' ] ?? null ;
113+ if ($ phpRequire ) {
114+ $ meta = $ this ->checkPHPVersion ($ meta , $ phpRequire );
115+ }
116+
117+ $ cakephpRequire = $ versionMeta ->getRequire ()['cakephp/cakephp ' ] ?? null ;
118+ if ($ cakephpRequire ) {
119+ $ meta = $ this ->checkCakeVersion ($ meta , $ cakephpRequire );
120+ }
121+ }
122+
123+ return $ meta ;
124+ }
125+
126+ /**
127+ * @param array $meta
128+ * @param string $packageConstraint
129+ * @return array
130+ */
131+ private function checkPHPVersion (array $ meta , string $ packageConstraint ): array
132+ {
133+ $ phpVersions = [
134+ '8.4.0 ' => 'PHP: 8.4 ' ,
135+ '8.3.0 ' => 'PHP: 8.3 ' ,
136+ '8.2.0 ' => 'PHP: 8.2 ' ,
137+ '8.1.0 ' => 'PHP: 8.1 ' ,
138+ '8.0.0 ' => 'PHP: 8.0 ' ,
139+ '7.4.0 ' => 'PHP: 7.4 ' ,
140+ '7.3.0 ' => 'PHP: 7.3 ' ,
141+ '7.2.0 ' => 'PHP: 7.2 ' ,
142+ '7.1.0 ' => 'PHP: 7.1 ' ,
143+ '7.0.0 ' => 'PHP: 7.0 ' ,
144+ ];
145+
146+ foreach ($ phpVersions as $ version => $ label ) {
147+ if (Semver::satisfies ($ version , $ packageConstraint ) && !in_array ($ label , $ meta )) {
148+ $ meta [] = $ label ;
149+ }
150+ }
151+
152+ return $ meta ;
153+ }
154+
155+ /**
156+ * @param array $meta
157+ * @param string $packageConstraint
158+ * @return array
159+ */
160+ private function checkCakeVersion (array $ meta , string $ packageConstraint ): array
161+ {
162+ $ cakeVersions = [
163+ '5.0.0 ' => 'CakePHP: 5.0 ' ,
164+ '4.0.0 ' => 'CakePHP: 4.0 ' ,
165+ '3.0.0 ' => 'CakePHP: 3.0 ' ,
166+ ];
167+
168+ foreach ($ cakeVersions as $ version => $ label ) {
169+ if (Semver::satisfies ($ version , $ packageConstraint ) && !in_array ($ label , $ meta )) {
170+ $ meta [] = $ label ;
171+ }
172+ }
173+
174+ return $ meta ;
175+ }
81176}
0 commit comments