Skip to content

Commit

Permalink
Remove last references to functional-php
Browse files Browse the repository at this point in the history
  • Loading branch information
acelaya committed Nov 30, 2023
1 parent bff4bd1 commit 1854cc2
Show file tree
Hide file tree
Showing 22 changed files with 147 additions and 114 deletions.
17 changes: 17 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,23 @@ All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com), and this project adheres to [Semantic Versioning](https://semver.org).

## [Unreleased]
### Added
* *Nothing*

### Changed
* Remove dependency on functional-php library

### Deprecated
* *Nothing*

### Removed
* *Nothing*

### Fixed
* *Nothing*


## [3.7.0] - 2023-11-25
### Added
* [#1798](https://github.com/shlinkio/shlink/issues/1798) Experimental support to send visits to an external Matomo instance.
Expand Down
2 changes: 1 addition & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@
"laminas/laminas-servicemanager": "^3.21",
"laminas/laminas-stdlib": "^3.17",
"league/uri": "^6.8",
"lstrojny/functional-php": "^1.17",
"matomo/matomo-php-tracker": "^3.2",
"mezzio/mezzio": "^3.17",
"mezzio/mezzio-fastroute": "^3.10",
Expand Down Expand Up @@ -91,6 +90,7 @@
},
"files": [
"config/constants.php",
"module/Core/functions/array-utils.php",
"module/Core/functions/functions.php"
]
},
Expand Down
2 changes: 1 addition & 1 deletion config/autoload/entity-manager.global.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
use Happyr\DoctrineSpecification\Repository\EntitySpecificationRepository;
use Shlinkio\Shlink\Core\Config\EnvVars;

use function Shlinkio\Shlink\Core\contains;
use function Shlinkio\Shlink\Core\ArrayUtils\contains;

return (static function (): array {
$driver = EnvVars::DB_DRIVER->loadFromEnv();
Expand Down
2 changes: 1 addition & 1 deletion config/test/test_config.global.php
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
use function file_exists;
use function Laminas\Stratigility\middleware;
use function Shlinkio\Shlink\Config\env;
use function Shlinkio\Shlink\Core\contains;
use function Shlinkio\Shlink\Core\ArrayUtils\contains;
use function sprintf;
use function sys_get_temp_dir;

Expand Down
9 changes: 4 additions & 5 deletions data/migrations/Version20200105165647.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
use Doctrine\DBAL\Types\Types;
use Doctrine\Migrations\AbstractMigration;

use function Shlinkio\Shlink\Core\some;
use function Shlinkio\Shlink\Core\ArrayUtils\some;

final class Version20200105165647 extends AbstractMigration
{
Expand All @@ -23,12 +23,11 @@ final class Version20200105165647 extends AbstractMigration
public function preUp(Schema $schema): void
{
$visitLocations = $schema->getTable('visit_locations');
$this->skipIf(some(
self::COLUMNS,
fn (string $v, string $newColName) => $visitLocations->hasColumn($newColName),
$this->skipIf(some(
self::COLUMNS,
fn (string $v, string|int $newColName) => $visitLocations->hasColumn((string) $newColName),
), 'New columns already exist');


foreach (self::COLUMNS as $columnName) {
$qb = $this->connection->createQueryBuilder();
$qb->update('visit_locations')
Expand Down
15 changes: 5 additions & 10 deletions module/CLI/src/Command/Db/CreateDatabaseCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@
use Throwable;

use function array_map;
use function Shlinkio\Shlink\Core\contains;
use function Shlinkio\Shlink\Core\ArrayUtils\contains;
use function Shlinkio\Shlink\Core\ArrayUtils\some;

class CreateDatabaseCommand extends AbstractDatabaseCommand
{
Expand Down Expand Up @@ -71,15 +72,9 @@ private function databaseTablesExist(): bool
$allMetadata = $this->em->getMetadataFactory()->getAllMetadata();
$shlinkTables = array_map(static fn (ClassMetadata $metadata) => $metadata->getTableName(), $allMetadata);

foreach ($shlinkTables as $shlinkTable) {
// If at least one of the shlink tables exist, we will consider the database exists somehow.
// Any other inconsistency will be taken care of by the migrations.
if (contains($shlinkTable, $existingTables)) {
return true;
}
}

return false;
// If at least one of the shlink tables exist, we will consider the database exists somehow.
// Any other inconsistency will be taken care of by the migrations.
return some($shlinkTables, static fn (string $shlinkTable) => contains($shlinkTable, $existingTables));
}

private function ensureDatabaseExistsAndGetTables(): array
Expand Down
2 changes: 1 addition & 1 deletion module/CLI/src/Command/ShortUrl/CreateShortUrlCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
use function array_map;
use function array_unique;
use function explode;
use function Shlinkio\SHlink\Core\flatten;
use function Shlinkio\Shlink\Core\ArrayUtils\flatten;
use function sprintf;

class CreateShortUrlCommand extends Command
Expand Down
14 changes: 2 additions & 12 deletions module/CLI/src/Command/Visit/AbstractVisitsListCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,11 @@
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

use function array_filter;
use function array_keys;
use function array_map;
use function Shlinkio\Shlink\Common\buildDateRange;
use function Shlinkio\Shlink\Core\ArrayUtils\select_keys;
use function Shlinkio\Shlink\Core\camelCaseToHumanFriendly;
use function Shlinkio\Shlink\Core\contains;

use const ARRAY_FILTER_USE_KEY;

abstract class AbstractVisitsListCommand extends Command
{
Expand Down Expand Up @@ -64,14 +61,7 @@ private function resolveRowsAndHeaders(Paginator $paginator): array
];

// Filter out unknown keys
return array_filter(
$rowData,
static fn (string $key) => contains(
$key,
['referer', 'date', 'userAgent', 'country', 'city', ...$extraKeys],
),
ARRAY_FILTER_USE_KEY,
);
return select_keys($rowData, ['referer', 'date', 'userAgent', 'country', 'city', ...$extraKeys]);
}, [...$paginator->getCurrentPageResults()]);
$extra = array_map(camelCaseToHumanFriendly(...), $extraKeys);

Expand Down
74 changes: 74 additions & 0 deletions module/Core/functions/array-utils.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
<?php

declare(strict_types=1);

namespace Shlinkio\Shlink\Core\ArrayUtils;

use function array_filter;
use function array_reduce;
use function in_array;

use const ARRAY_FILTER_USE_KEY;

function contains(mixed $value, array $array): bool
{
return in_array($value, $array, strict: true);
}

/**
* @param array[] $multiArray
* @return array
*/
function flatten(array $multiArray): array
{
return array_reduce(
$multiArray,
static fn (array $carry, array $value) => [...$carry, ...$value],
initial: [],
);
}

/**
* Checks if a callback returns true for at least one item in a collection.
* @param callable(mixed $value, mixed $key): bool $callback
*/
function some(iterable $collection, callable $callback): bool
{
foreach ($collection as $key => $value) {
if ($callback($value, $key)) {
return true;
}
}

return false;
}

/**
* Checks if a callback returns true for all item in a collection.
* @param callable(mixed $value, string|number $key): bool $callback
*/
function every(iterable $collection, callable $callback): bool
{
foreach ($collection as $key => $value) {
if (! $callback($value, $key)) {
return false;
}
}

return true;
}

/**
* Returns an array containing only those entries in the array whose key is in the supplied keys.
*/
function select_keys(array $array, array $keys): array
{
return array_filter(
$array,
static fn (string $key) => contains(
$key,
$keys,
),
ARRAY_FILTER_USE_KEY,
);
}
49 changes: 0 additions & 49 deletions module/Core/functions/functions.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
use function array_map;
use function array_reduce;
use function date_default_timezone_get;
use function in_array;
use function is_array;
use function print_r;
use function Shlinkio\Shlink\Common\buildDateRange;
Expand Down Expand Up @@ -183,51 +182,3 @@ function enumValues(string $enum): array
$cache[$enum] = array_map(static fn (BackedEnum $type) => (string) $type->value, $enum::cases())
);
}

function contains(mixed $value, array $array): bool
{
return in_array($value, $array, strict: true);
}

/**
* @param array[] $multiArray
* @return array
*/
function flatten(array $multiArray): array
{
return array_reduce(
$multiArray,
static fn (array $carry, array $value) => [...$carry, ...$value],
initial: [],
);
}

/**
* Checks if a callback returns true for at least one item in a collection.
* @param callable(mixed $value, string|number $key): bool $callback
*/
function some(iterable $collection, callable $callback): bool
{
foreach ($collection as $key => $value) {
if ($callback($value, $key)) {
return true;
}
}

return false;
}

/**
* Checks if a callback returns true for all item in a collection.
* @param callable(mixed $value, string|number $key): bool $callback
*/
function every(iterable $collection, callable $callback): bool
{
foreach ($collection as $key => $value) {
if (! $callback($value, $key)) {
return false;
}
}

return true;
}
2 changes: 1 addition & 1 deletion module/Core/src/Action/Model/QrCodeParams.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
use Psr\Http\Message\ServerRequestInterface;
use Shlinkio\Shlink\Core\Options\QrCodeOptions;

use function Shlinkio\Shlink\Core\contains;
use function Shlinkio\Shlink\Core\ArrayUtils\contains;
use function strtolower;
use function trim;

Expand Down
40 changes: 25 additions & 15 deletions module/Core/src/Config/NotFoundRedirectResolver.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
use Shlinkio\Shlink\Core\ErrorHandler\Model\NotFoundType;
use Shlinkio\Shlink\Core\Util\RedirectResponseHelperInterface;

use function Functional\compose;
use function str_replace;
use function urlencode;

Expand Down Expand Up @@ -51,9 +50,6 @@ public function resolveRedirectResponse(

private function resolvePlaceholders(UriInterface $currentUri, string $redirectUrl): string
{
$domain = $currentUri->getAuthority();
$path = $currentUri->getPath();

try {
$redirectUri = Uri::createFromString($redirectUrl);
} catch (SyntaxError $e) {
Expand All @@ -64,18 +60,32 @@ private function resolvePlaceholders(UriInterface $currentUri, string $redirectU
return $redirectUrl;
}

$replacePlaceholderForPattern = static fn (string $pattern, string $replace, callable $modifier) =>
static fn (?string $value) =>
$value === null ? null : str_replace($modifier($pattern), $modifier($replace), $value);
$replacePlaceholders = static fn (callable $modifier) => compose(
$replacePlaceholderForPattern(self::DOMAIN_PLACEHOLDER, $domain, $modifier),
$replacePlaceholderForPattern(self::ORIGINAL_PATH_PLACEHOLDER, $path, $modifier),
);
$replacePlaceholdersInPath = compose(
$replacePlaceholders(static fn (mixed $v) => $v),
static fn (?string $path) => $path === null ? null : str_replace('//', '/', $path),
$path = $currentUri->getPath();
$domain = $currentUri->getAuthority();

$replacePlaceholderForPattern = static fn (string $pattern, string $replace, ?string $value): string|null =>
$value === null ? null : str_replace($pattern, $replace, $value);

$replacePlaceholders = static function (
callable $modifier,
?string $value,
) use (
$replacePlaceholderForPattern,
$path,
$domain,
): string|null {
$value = $replacePlaceholderForPattern($modifier(self::DOMAIN_PLACEHOLDER), $modifier($domain), $value);
return $replacePlaceholderForPattern($modifier(self::ORIGINAL_PATH_PLACEHOLDER), $modifier($path), $value);
};

$replacePlaceholdersInPath = static function (string $path) use ($replacePlaceholders): string {
$result = $replacePlaceholders(static fn (mixed $v) => $v, $path);
return str_replace('//', '/', $result ?? '');
};
$replacePlaceholdersInQuery = static fn (?string $query): string|null => $replacePlaceholders(
urlencode(...),
$query,
);
$replacePlaceholdersInQuery = $replacePlaceholders(urlencode(...));

return $redirectUri
->withPath($replacePlaceholdersInPath($redirectUri->getPath()))
Expand Down
2 changes: 1 addition & 1 deletion module/Core/src/ShortUrl/Model/DeviceLongUrlPair.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public static function fromRawTypeAndLongUrl(string $type, string $longUrl): sel
* * The first one is a list of mapped instances for those entries in the map with non-null value
* * The second is a list of DeviceTypes which have been provided with value null
*
* @param array<string, string | null> $map
* @param array<string, string|null> $map
* @return array{array<string, self>, DeviceType[]}
*/
public static function fromMapToChangeSet(array $map): array
Expand Down
2 changes: 1 addition & 1 deletion module/Core/src/ShortUrl/Model/OrderableField.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

namespace Shlinkio\Shlink\Core\ShortUrl\Model;

use function Shlinkio\Shlink\Core\contains;
use function Shlinkio\Shlink\Core\ArrayUtils\contains;

enum OrderableField: string
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@
use function array_keys;
use function array_values;
use function is_array;
use function Shlinkio\Shlink\Core\contains;
use function Shlinkio\Shlink\Core\ArrayUtils\contains;
use function Shlinkio\Shlink\Core\ArrayUtils\every;
use function Shlinkio\Shlink\Core\enumValues;
use function Shlinkio\Shlink\Core\every;

class DeviceLongUrlsValidator extends AbstractValidator
{
Expand Down
2 changes: 1 addition & 1 deletion module/Core/src/Util/RedirectStatus.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

namespace Shlinkio\Shlink\Core\Util;

use function Shlinkio\Shlink\Core\contains;
use function Shlinkio\Shlink\Core\ArrayUtils\contains;

enum RedirectStatus: int
{
Expand Down
Loading

0 comments on commit 1854cc2

Please sign in to comment.