diff --git a/Converter/AbstractPackageConverter.php b/Converter/AbstractPackageConverter.php new file mode 100644 index 00000000..4f8ce182 --- /dev/null +++ b/Converter/AbstractPackageConverter.php @@ -0,0 +1,142 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Fxp\Composer\AssetPlugin\Converter; + +use Fxp\Composer\AssetPlugin\Type\AssetTypeInterface; + +/** + * Abstract class for converter for asset package to composer package. + * + * @author François Pluchino + */ +abstract class AbstractPackageConverter implements PackageConverterInterface +{ + /** + * @var AssetTypeInterface + */ + protected $assetType; + + /** + * Constructor. + * + * @param AssetTypeInterface $assetType + */ + public function __construct(AssetTypeInterface $assetType) + { + $this->assetType = $assetType; + } + + /** + * Converts the all keys (keys, dependencies and extra keys). + * + * @param array $asset The asset data + * @param array $keys The map of asset key and composer key + * @param array $dependencies The map of asset dependency key and composer dependency key + * @param array $extras The map of asset key and composer extra key + * + * @return array The composer package converted + */ + protected function convertData(array $asset, array $keys, array $dependencies, array $extras) + { + $composer = array(); + + foreach ($keys as $assetKey => $composerKey) { + $this->convertKey($asset, $assetKey, $composer, $composerKey); + } + + foreach ($dependencies as $assetKey => $composerKey) { + $this->convertDependencies($asset, $assetKey, $composer, $composerKey); + } + + foreach ($extras as $assetKey => $composerKey) { + $this->convertExtraKey($asset, $assetKey, $composer, $composerKey); + } + + return $composer; + } + + /** + * Converts the simple key of package. + * + * @param array $asset The asset data + * @param string $assetKey The asset key + * @param array &$composer The composer data + * @param string|array $composerKey The composer key or array with composer key name and closure + * + * @throws \InvalidArgumentException When the 'composerKey' argument of asset packager converter is not an string or an array with the composer key and closure + */ + protected function convertKey(array $asset, $assetKey, array &$composer, $composerKey) + { + if (is_string($composerKey)) { + if (isset($asset[$assetKey])) { + $composer[$composerKey] = $asset[$assetKey]; + } + + } elseif (is_array($composerKey) && 2 === count($composerKey) + && is_string($composerKey[0]) && $composerKey[1] instanceof \Closure) { + $closure = $composerKey[1]; + $composerKey = $composerKey[0]; + $data = isset($asset[$assetKey]) ? $asset[$assetKey] : null; + $previousData = isset($composer[$composerKey]) ? $composer[$composerKey] : null; + $data = $closure($data, $previousData); + + if (null !== $data) { + $composer[$composerKey] = $data; + } + + } else { + throw new \InvalidArgumentException('The "composerKey" argument of asset packager converter must be an string or an array with the composer key and closure'); + } + } + + /** + * Converts the extra key of package. + * + * @param array $asset The asset data + * @param string $assetKey The asset extra key + * @param array &$composer The composer data + * @param string|array $composerKey The composer extra key or array with composer extra key name and closure + * @param string $extraKey The extra key name + */ + protected function convertExtraKey(array $asset, $assetKey, array &$composer, $composerKey, $extraKey = 'extra') + { + $extra = isset($composer[$extraKey]) ? $composer[$extraKey] : array(); + + $this->convertKey($asset, $assetKey, $extra, $composerKey); + + if (count($extra) > 0) { + $composer[$extraKey] = $extra; + } + } + + /** + * Converts simple key of package. + * + * @param array $asset The asset data + * @param string $assetKey The asset key of dependencies + * @param array &$composer The composer data + * @param string $composerKey The composer key of dependencies + */ + protected function convertDependencies(array $asset, $assetKey, array &$composer, $composerKey) + { + if (isset($asset[$assetKey]) && is_array($asset[$assetKey])) { + $newDependencies = array(); + + foreach ($asset[$assetKey] as $dependency => $version) { + $version = $this->assetType->getVersionConverter()->convertRange($version); + $newDependencies[$this->assetType->getComposerVendorName() . '/' . $dependency] = $version; + } + + $composer[$composerKey] = $newDependencies; + } + } +} diff --git a/Converter/BowerPackageConverter.php b/Converter/BowerPackageConverter.php new file mode 100644 index 00000000..fb982de6 --- /dev/null +++ b/Converter/BowerPackageConverter.php @@ -0,0 +1,54 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Fxp\Composer\AssetPlugin\Converter; + +/** + * Converter for bower package to composer package. + * + * @author François Pluchino + */ +class BowerPackageConverter extends AbstractPackageConverter +{ + /** + * {@inheritdoc} + */ + public function convert(array $data) + { + $assetType = $this->assetType; + $keys = array( + 'name' => array('name', function ($value) use ($assetType) { + return $assetType->getComposerVendorName() . '/' . $value; + }), + 'type' => array('type', function () { + return 'bower-asset-library'; + }), + 'version' => array('version', function ($value) use ($assetType) { + return $assetType->getVersionConverter()->convertVersion($value); + }), + 'description' => 'description', + 'keywords' => 'keywords', + 'license' => 'license', + 'bin' => 'bin', + ); + $dependencies = array( + 'dependencies' => 'require', + 'devDependencies' => 'require-dev', + ); + $extras = array( + 'main' => 'bower-asset-main', + 'ignore' => 'bower-asset-ignore', + 'private' => 'bower-asset-private', + ); + + return $this->convertData($data, $keys, $dependencies, $extras); + } +} diff --git a/Converter/NpmPackageConverter.php b/Converter/NpmPackageConverter.php new file mode 100644 index 00000000..6d6ce592 --- /dev/null +++ b/Converter/NpmPackageConverter.php @@ -0,0 +1,86 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Fxp\Composer\AssetPlugin\Converter; + +/** + * Converter for NPM package to composer package. + * + * @author François Pluchino + */ +class NpmPackageConverter extends AbstractPackageConverter +{ + /** + * {@inheritdoc} + */ + public function convert(array $data) + { + $assetType = $this->assetType; + $keys = array( + 'name' => array('name', function ($value) use ($assetType) { + return $assetType->getComposerVendorName() . '/' . $value; + }), + 'type' => array('type', function () { + return 'npm-asset-library'; + }), + 'version' => array('version', function ($value) use ($assetType) { + return $assetType->getVersionConverter()->convertVersion($value); + }), + 'description' => 'description', + 'keywords' => 'keywords', + 'homepage' => 'homepage', + 'license' => 'license', + 'author' => array('authors', function ($value) use ($assetType) { + if (null !== $value) { + $value = array($value); + } + + return $value; + }), + 'contributors' => array('authors', function ($value, $prevValue) use ($assetType) { + $mergeValue = is_array($prevValue) ? $prevValue : array(); + $mergeValue = array_merge($mergeValue, is_array($value) ? $value : array()); + + if (count($mergeValue) > 0) { + $value = $mergeValue; + } + + return $value; + }), + 'bin' => 'bin', + ); + $dependencies = array( + 'dependencies' => 'require', + 'devDependencies' => 'require-dev', + ); + $extras = array( + 'bugs' => 'npm-asset-bugs', + 'files' => 'npm-asset-files', + 'main' => 'npm-asset-main', + 'man' => 'npm-asset-man', + 'directories' => 'npm-asset-directories', + 'repository' => 'npm-asset-repository', + 'scripts' => 'npm-asset-scripts', + 'config' => 'npm-asset-config', + 'bundledDependencies' => 'npm-asset-bundled-dependencies', + 'optionalDependencies' => 'npm-asset-optional-dependencies', + 'engines' => 'npm-asset-engines', + 'engineStrict' => 'npm-asset-engine-strict', + 'os' => 'npm-asset-os', + 'cpu' => 'npm-asset-cpu', + 'preferGlobal' => 'npm-asset-prefer-global', + 'private' => 'npm-asset-private', + 'publishConfig' => 'npm-asset-publish-config', + ); + + return $this->convertData($data, $keys, $dependencies, $extras); + } +} diff --git a/Converter/PackageConverterInterface.php b/Converter/PackageConverterInterface.php new file mode 100644 index 00000000..af8f4321 --- /dev/null +++ b/Converter/PackageConverterInterface.php @@ -0,0 +1,29 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Fxp\Composer\AssetPlugin\Converter; + +/** + * Interface for the converter for asset package to composer package. + * + * @author François Pluchino + */ +interface PackageConverterInterface +{ + /** + * Converts the asset data package to composer data package. + * + * @param array $data The asset data package + * + * @return array The composer data package + */ + public function convert(array $data); +} diff --git a/Repository/AssetVcsRepository.php b/Repository/AssetVcsRepository.php index c8046179..425f541d 100644 --- a/Repository/AssetVcsRepository.php +++ b/Repository/AssetVcsRepository.php @@ -248,7 +248,7 @@ private function preProcess(VcsDriverInterface $driver, array $data, $identifier { // keep the name of the main identifier for all packages $data['name'] = $this->packageName ?: $data['name']; - $data = $this->assetType->convert($data); + $data = $this->assetType->getPackageConverter()->convert($data); if (!isset($data['dist'])) { $data['dist'] = $driver->getDist($identifier); diff --git a/Type/AbstractAssetType.php b/Type/AbstractAssetType.php index 0f7d9889..308d9955 100644 --- a/Type/AbstractAssetType.php +++ b/Type/AbstractAssetType.php @@ -11,6 +11,7 @@ namespace Fxp\Composer\AssetPlugin\Type; +use Fxp\Composer\AssetPlugin\Converter\PackageConverterInterface; use Fxp\Composer\AssetPlugin\Converter\SemverConverter; use Fxp\Composer\AssetPlugin\Converter\VersionConverterInterface; @@ -21,14 +22,26 @@ */ abstract class AbstractAssetType implements AssetTypeInterface { + /** + * @var PackageConverterInterface + */ + protected $packageConverter; + /** * @var VersionConverterInterface */ protected $versionConverter; - public function __construct() + /** + * Constructor. + * + * @param PackageConverterInterface $packageConverter + * @param VersionConverterInterface $versionConverter + */ + public function __construct(PackageConverterInterface $packageConverter, VersionConverterInterface $versionConverter = null) { - $this->versionConverter = new SemverConverter(); + $this->packageConverter = $packageConverter; + $this->versionConverter = !$versionConverter ? new SemverConverter() : $versionConverter; } /** @@ -47,6 +60,14 @@ public function getFilename() return $this->getName() . '.json'; } + /** + * {@inheritdoc} + */ + public function getPackageConverter() + { + return $this->packageConverter; + } + /** * {@inheritdoc} */ diff --git a/Type/AssetTypeInterface.php b/Type/AssetTypeInterface.php index 9f8d783f..e2693c7a 100644 --- a/Type/AssetTypeInterface.php +++ b/Type/AssetTypeInterface.php @@ -11,6 +11,7 @@ namespace Fxp\Composer\AssetPlugin\Type; +use Fxp\Composer\AssetPlugin\Converter\PackageConverterInterface; use Fxp\Composer\AssetPlugin\Converter\VersionConverterInterface; /** @@ -49,11 +50,9 @@ public function getFilename(); public function getVersionConverter(); /** - * Converts the asset data package to composer data package. + * Gets the package converter. * - * @param array $data The asset data package - * - * @return array The composer data package + * @return PackageConverterInterface */ - public function convert(array $data); + public function getPackageConverter(); } diff --git a/Type/BowerAssetType.php b/Type/BowerAssetType.php index c95557a3..b73e84b8 100644 --- a/Type/BowerAssetType.php +++ b/Type/BowerAssetType.php @@ -11,6 +11,10 @@ namespace Fxp\Composer\AssetPlugin\Type; +use Fxp\Composer\AssetPlugin\Converter\BowerPackageConverter; +use Fxp\Composer\AssetPlugin\Converter\PackageConverterInterface; +use Fxp\Composer\AssetPlugin\Converter\VersionConverterInterface; + /** * Bower asset type. * @@ -19,76 +23,23 @@ class BowerAssetType extends AbstractAssetType { /** - * {@inheritdoc} + * Constructor. + * + * @param PackageConverterInterface $packageConverter + * @param VersionConverterInterface $versionConverter */ - public function getName() + public function __construct(PackageConverterInterface $packageConverter = null, VersionConverterInterface $versionConverter = null) { - return 'bower'; + $packageConverter = !$packageConverter ? new BowerPackageConverter($this) : $packageConverter; + + parent::__construct($packageConverter, $versionConverter); } /** * {@inheritdoc} */ - public function convert(array $data) + public function getName() { - $package = array( - 'name' => $this->getComposerVendorName() . '/' . $data['name'], - 'type' => "bower-asset-library", - 'version' => $this->getVersionConverter()->convertVersion($data['version']), - ); - - if (isset($data['description'])) { - $package['description'] = $data['description']; - } - - if (isset($data['keywords'])) { - $package['keywords'] = $data['keywords']; - } - - if (isset($data['license'])) { - $package['license'] = $data['license']; - } - - if (isset($data['dependencies'])) { - $package['require'] = array(); - - foreach ($data['dependencies'] as $dependency => $version) { - $version = $this->getVersionConverter()->convertRange($version); - $package['require'][$this->getComposerVendorName() . '/' . $dependency] = $version; - } - } - - if (isset($data['devDependencies'])) { - $package['require-dev'] = array(); - - foreach ($data['devDependencies'] as $dependency => $version) { - $version = $this->getVersionConverter()->convertRange($version); - $package['require-dev'][$this->getComposerVendorName() . '/' . $dependency] = $version; - } - } - - if (isset($data['bin'])) { - $package['bin'] = $data['bin']; - } - - $extra = array(); - - if (isset($data['main'])) { - $extra['bower-asset-main'] = $data['main']; - } - - if (isset($data['ignore'])) { - $extra['bower-asset-ignore'] = $data['ignore']; - } - - if (isset($data['private'])) { - $extra['bower-asset-private'] = $data['private']; - } - - if (count($extra) > 0) { - $package['extra'] = $extra; - } - - return $package; + return 'bower'; } } diff --git a/Type/NpmAssetType.php b/Type/NpmAssetType.php index 47441624..7a46667c 100644 --- a/Type/NpmAssetType.php +++ b/Type/NpmAssetType.php @@ -11,6 +11,10 @@ namespace Fxp\Composer\AssetPlugin\Type; +use Fxp\Composer\AssetPlugin\Converter\NpmPackageConverter; +use Fxp\Composer\AssetPlugin\Converter\PackageConverterInterface; +use Fxp\Composer\AssetPlugin\Converter\VersionConverterInterface; + /** * NPM asset type. * @@ -19,160 +23,31 @@ class NpmAssetType extends AbstractAssetType { /** - * {@inheritdoc} + * Constructor. + * + * @param PackageConverterInterface $packageConverter + * @param VersionConverterInterface $versionConverter */ - public function getName() + public function __construct(PackageConverterInterface $packageConverter = null, VersionConverterInterface $versionConverter = null) { - return 'npm'; + $packageConverter = !$packageConverter ? new NpmPackageConverter($this) : $packageConverter; + + parent::__construct($packageConverter, $versionConverter); } /** * {@inheritdoc} */ - public function getFilename() + public function getName() { - return 'package.json'; + return 'npm'; } /** * {@inheritdoc} */ - public function convert(array $data) + public function getFilename() { - $package = array( - 'name' => $this->getComposerVendorName() . '/' . $data['name'], - 'type' => "npm-asset-library", - 'version' => $this->getVersionConverter()->convertVersion($data['version']), - ); - - if (isset($data['description'])) { - $package['description'] = $data['description']; - } - - if (isset($data['keywords'])) { - $package['keywords'] = $data['keywords']; - } - - if (isset($data['homepage'])) { - $package['homepage'] = $data['homepage']; - } - - if (isset($data['license'])) { - $package['license'] = $data['license']; - } - - $authors = array(); - - if (isset($data['author'])) { - $authors[] = $data['author']; - } - - if (isset($data['contributors'])) { - foreach ($data['contributors'] as $contributor) { - $authors[] = $contributor; - } - } - - if (count($authors) > 0) { - $package['authors'] = $authors; - } - - if (isset($data['dependencies'])) { - $package['require'] = array(); - - foreach ($data['dependencies'] as $dependency => $version) { - $version = $this->getVersionConverter()->convertRange($version); - $package['require'][$this->getComposerVendorName() . '/' . $dependency] = $version; - } - } - - if (isset($data['devDependencies'])) { - $package['require-dev'] = array(); - - foreach ($data['devDependencies'] as $dependency => $version) { - $version = $this->getVersionConverter()->convertRange($version); - $package['require-dev'][$this->getComposerVendorName() . '/' . $dependency] = $version; - } - } - - if (isset($data['bin'])) { - $package['bin'] = $data['bin']; - } - - $extra = array(); - - if (isset($data['bugs'])) { - $extra['npm-asset-bugs'] = $data['bugs']; - } - - if (isset($data['files'])) { - $extra['npm-asset-files'] = $data['files']; - } - - if (isset($data['main'])) { - $extra['npm-asset-main'] = $data['main']; - } - - if (isset($data['man'])) { - $extra['npm-asset-man'] = $data['man']; - } - - if (isset($data['directories'])) { - $extra['npm-asset-directories'] = $data['directories']; - } - - if (isset($data['repository'])) { - $extra['npm-asset-repository'] = $data['repository']; - } - - if (isset($data['scripts'])) { - $extra['npm-asset-scripts'] = $data['scripts']; - } - - if (isset($data['config'])) { - $extra['npm-asset-config'] = $data['config']; - } - - if (isset($data['bundledDependencies'])) { - $extra['npm-asset-bundled-dependencies'] = $data['bundledDependencies']; - } - - if (isset($data['optionalDependencies'])) { - $extra['npm-asset-optional-dependencies'] = $data['optionalDependencies']; - } - - if (isset($data['engines'])) { - $extra['npm-asset-engines'] = $data['engines']; - } - - if (isset($data['engineStrict'])) { - $extra['npm-asset-engine-strict'] = $data['engineStrict']; - } - - if (isset($data['os'])) { - $extra['npm-asset-os'] = $data['os']; - } - - if (isset($data['cpu'])) { - $extra['npm-asset-cpu'] = $data['cpu']; - } - - if (isset($data['preferGlobal'])) { - $extra['npm-asset-prefer-global'] = $data['preferGlobal']; - } - - if (isset($data['private'])) { - $extra['npm-asset-private'] = $data['private']; - } - - if (isset($data['publishConfig'])) { - $extra['npm-asset-publish-config'] = $data['publishConfig']; - } - - if (count($extra) > 0) { - $package['extra'] = $extra; - } - - return $package; + return 'package.json'; } }