Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
f2065f1
Snížena podpora PHP na 5.5+ + .gitignore
MilanPala Jun 16, 2016
ef70c76
Cachují se i závislosti přes HTTP a je možné cache smazat Commandem
MilanPala Jun 17, 2016
6562c8c
Časová verze změněna na obsahovou verzi
MilanPala Jul 29, 2016
e284f7e
Přidána podpora nových major verzí
MilanPala Mar 12, 2017
de50efb
Přidána podpora nových major verzí
MilanPala Mar 12, 2017
01823e9
Refaktoring, nový namespace, CS a PHPStan
MilanPala Nov 30, 2018
cff718f
Merge pull request #1 from peckadesign/v2
MilanPala Nov 30, 2018
f01b13d
Expirace se už nepoužívá
MilanPala Nov 30, 2018
b8647b4
Proměnná musí být inicializovaná
MilanPala Nov 30, 2018
9edad66
Funkce očekávají string
MilanPala Nov 30, 2018
239a4c1
Přidána podpora pro PHP 7.2
MilanPala Dec 7, 2018
81e2d4a
Merge pull request #2 from peckadesign/php73
MilanPala Dec 7, 2018
9bb103b
Přidána podpora pro PHP 7.3
MilanPala Feb 1, 2019
aaa399b
Merge pull request #3 from peckadesign/php73
MilanPala Feb 1, 2019
d0bd5d5
Nette 3
MilanPala May 31, 2019
bc560fe
Opraveno napojování latte filtru
MilanPala Jun 7, 2019
be5a54c
PHP 7.4
MilanPala Mar 3, 2020
1607ab9
Merge pull request #5 from peckadesign/php74
MilanPala Mar 3, 2020
66523ec
Doplněn interface na filter
MilanPala Mar 23, 2020
34a77f3
Merge pull request #6 from peckadesign/interface
MilanPala Mar 23, 2020
84c0f79
Povoleny novější verze Nette/Application
MilanPala Jun 3, 2020
b23ae30
Merge pull request #7 from peckadesign/nette-application
MilanPala Jun 3, 2020
5139c96
pridani resloveru na relativni cesty
Oct 16, 2020
f0858eb
Merge pull request #8 from peckadesign/path_resolver
Oct 20, 2020
452f251
#3493: přidání cache tagu pro invalidaci
PavelJurasek Dec 1, 2020
dd52d2c
Merge pull request #10 from peckadesign/3493-cache-tag
Spamercz Jan 8, 2021
c840789
Update PHPStan
PavelJurasek Feb 11, 2021
5b00025
Merge pull request #11 from peckadesign/pdp3602-phpstan
PavelJurasek Mar 17, 2021
604fe8b
Přechod na Github Actions
jakubenglicky Mar 23, 2021
543c975
Přechod na Github Actions
jakubenglicky Mar 23, 2021
4c6616c
Přechod na Github Actions
jakubenglicky Mar 23, 2021
a09c72e
Přechod na Github Actions
jakubenglicky Mar 23, 2021
eca11e7
Merge pull request #13 from peckadesign/github-ci
jakubenglicky Mar 23, 2021
3db3c01
Doplnění referencování pomocí &
jakubenglicky Mar 23, 2021
c7287d4
Podmínka nemohla být splněna
jakubenglicky Mar 23, 2021
934aaf5
Tagy, jsou pole
jakubenglicky Mar 23, 2021
d684240
Refactoring testů
jakubenglicky Mar 23, 2021
5c644f2
Přidán test na přidání tagů do cache
jakubenglicky Mar 23, 2021
7683c35
Sjednocení se šablonou Package CI
jakubenglicky Mar 25, 2021
0b264dd
Merge pull request #14 from peckadesign/fix_clear_cache_dependencies
jakubenglicky Mar 25, 2021
1c584a6
#3804: povýšení na PHP 8: composer
PavelJurasek May 31, 2021
c64bbac
#3804: povýšení na PHP 8: CI
PavelJurasek May 31, 2021
8f46b9c
#3804: povýšení na PHP 8: back compatibility
PavelJurasek May 31, 2021
148fef7
#3804: povýšení na PHP 8: typed properties, whitespaces
PavelJurasek May 31, 2021
09d37fb
#3804: povýšení na PHP 8: tester lepší asserce
PavelJurasek May 31, 2021
87d0b2a
#3804: povýšení na PHP 8: nette compatibility
PavelJurasek May 31, 2021
d333cf9
Merge pull request #21 from peckadesign/3804-php8
PavelJurasek Jun 3, 2021
2531020
Kromě Kdyby/Console přidána podpora pro další knihovny
MilanPala Sep 13, 2019
9088143
Merge pull request #4 from peckadesign/contributte-console
MilanPala Aug 17, 2021
d9a2404
nette/cache 3.1.3+ support (#22)
Spamercz Jun 20, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
name: Package CI

on:
pull_request:

jobs:
checks:
name: Checks
runs-on: ubuntu-latest
strategy:
matrix:
php: [ 7.4, 8.0 ]
steps:
- uses: actions/checkout@v2
- uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php }}

- run: make composer

- if: matrix.php == '8.0'
run: make cs

- if: matrix.php == '8.0'
run: make phpstan

- run: make run-tests
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
/composer.lock
/vendor
/tests/**/*.actual
/tests/**/*.expected
/tests/temp
13 changes: 13 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
composer:
composer validate
composer update --no-interaction --prefer-dist

phpstan:
vendor/bin/phpstan analyse src/ -c phpstan.neon --level 8 --no-progress

cs:
vendor/bin/phpcs src/ --standard=vendor/pd/coding-standard/src/PeckaCodingStandard/ruleset.xml
vendor/bin/phpcs src/ --standard=vendor/pd/coding-standard/src/PeckaCodingStandardStrict/ruleset.xml

run-tests:
vendor/bin/tester -C tests/
31 changes: 25 additions & 6 deletions composer.json
Original file line number Diff line number Diff line change
@@ -1,21 +1,40 @@
{
"name": "vitkutny/version",
"name": "pd/version",
"description": "Filtr pro zjisštění verze obsahu URL",
"extra": {
"extensions": {
"vitkutny.version": "VitKutny\\Version\\Extension"
"pd.version": "Pd\\Version\\Extension"
}
},
"require": {
"php": "~7.0",
"nette/http": "~2.0"
"php": "^7.4 | ^8.0",
"nette/http": "^3.0",
"nette/caching": "^3.0",
"nette/application": "^3.0",
"symfony/console": "^3.0 | ^4.0 | ^5.0"
},
"require-dev": {
"pd/coding-standard": "v1.27.2",
"nette/tester": "^2.4",
"nette/bootstrap": "^3.0",
"phpstan/phpstan": "0.12.88",
"phpstan/phpstan-strict-rules": "0.12.9",
"latte/latte": "^2.9"
},
"suggest": {
"nette/caching": "Caching support",
"nette/di": "Register filter using extension"
"nette/di": "Register filter using extension",
"kdyby/console": "For Symfony Console support",
"contributte/console": "For Symfony Console support"
},
"autoload": {
"psr-4": {
"VitKutny\\": "src/"
"Pd\\Version\\": "src/"
}
},
"autoload-dev": {
"classmap": [
"tests/"
]
}
}
5 changes: 5 additions & 0 deletions phpstan.neon
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
parameters:
ignoreErrors:
-
message: '~^Parameter #2 \$(format|associative) of function get_headers expects (int|bool), int\|true given\.$~'
path: src/Resolvers/AbsoluteUrlResolver.php
40 changes: 40 additions & 0 deletions src/CleanCacheCommand.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<?php declare(strict_types = 1);

namespace Pd\Version;

final class CleanCacheCommand extends \Symfony\Component\Console\Command\Command
{

protected function configure(): void
{
$this->setName('pd:version:clean-cache');
$this->setDescription('Smaže cache verzí');
}


protected function execute(
\Symfony\Component\Console\Input\InputInterface $input,
\Symfony\Component\Console\Output\OutputInterface $output
) {
/** @var \Nette\Caching\IStorage $storage */
$storage = $this->getHelper('container')->getByType(\Nette\Caching\IStorage::class);
$conditions = [
'tags' => [
Filter::CACHE_TAG,
],
];

if ($output->getVerbosity() > \Symfony\Component\Console\Output\Output::VERBOSITY_QUIET) {
$output->write('Smaže se cache verzí: ');
}

$storage->clean($conditions);

if ($output->getVerbosity() > \Symfony\Component\Console\Output\Output::VERBOSITY_QUIET) {
$output->writeln('<info>Smazáno</info>');
}

return 0;
}

}
105 changes: 105 additions & 0 deletions src/Extension.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
<?php declare(strict_types = 1);

namespace Pd\Version;

final class Extension extends \Nette\DI\CompilerExtension
{

private string $directory;

private string $parameter;

private bool $debugMode;


public function __construct(string $directory = '%wwwDir%', string $parameter = 'version', bool $debugMode = FALSE)
{
$this->directory = $directory;
$this->parameter = $parameter;
$this->debugMode = $debugMode;
}


public function beforeCompile(): void
{
$builder = $this->getContainerBuilder();
/** @var \Nette\DI\Definitions\ServiceDefinition $filter */
$filter = $builder->getDefinition($this->prefix('filter'));
/** @var \Nette\DI\Definitions\ServiceDefinition $absoluteUrlResolver */
$absoluteUrlResolver = $builder->getDefinition($this->prefix('absoluteUrlResolver'));
/** @var \Nette\DI\Definitions\ServiceDefinition $pathResolver */
$pathResolver = $builder->getDefinition($this->prefix('pathResolver'));

$request = $builder->getByType(\Nette\Http\IRequest::class);
if ($request) {
$absoluteUrlResolver->addSetup('setRequest', [$builder->getDefinition($request)]);
$pathResolver->addSetup('setRequest', [$builder->getDefinition($request)]);
}

$storage = $builder->getByType(\Nette\Caching\IStorage::class);
if ($storage) {
$absoluteUrlResolver->addSetup('setStorage', [
$builder->getDefinition($storage),
]);
$pathResolver->addSetup('setStorage', [
$builder->getDefinition($storage),
]);
}

$engine = $builder->getByType(\Nette\Bridges\ApplicationLatte\ILatteFactory::class);
if ($engine) {
/** @var \Nette\DI\Definitions\FactoryDefinition $latteEngine */
$latteEngine = $builder->getDefinition($engine);
$latteEngine->getResultDefinition()->addSetup('addFilter', [
'version',
$filter,
])
;
}
}


public function loadConfiguration(): void
{
$builder = $this->getContainerBuilder();

$absoluteUrlResolver = $builder->addDefinition($this->prefix('absoluteUrlResolver'))
->setFactory(\Pd\Version\Resolvers\AbsoluteUrlResolver::class)
;

$pathResolver = $builder->addDefinition($this->prefix('pathResolver'))
->setFactory(\Pd\Version\Resolvers\PathResolver::class)
->setArguments([$this->debugMode])
;

$arguments = [
$this->directory,
$this->parameter,
$absoluteUrlResolver,
$pathResolver,
];
$builder
->addDefinition($this->prefix('filter'))
->setFactory(Filter::class)
->setArguments($arguments)
;

$builder->addDefinition($this->prefix('relativePathGetter'))
->setFactory(\Pd\Version\Resolvers\Getter\RelativePathGetter::class)
;

if (\PHP_SAPI !== 'cli') {
return;
}
$builder = $this->getContainerBuilder();
$cleanCacheDefinition = $builder
->addDefinition($this->prefix('console.cleanCache'))
->setFactory(CleanCacheCommand::class)
;

if (\class_exists('\Kdyby\Console\DI\ConsoleExtension')) {
$cleanCacheDefinition->addTag('kdyby.console.command');
}
}

}
56 changes: 56 additions & 0 deletions src/Filter.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
<?php declare(strict_types = 1);

namespace Pd\Version;

final class Filter implements IFilter
{

public const CACHE_TAG = 'pd-version';


private string $directory;

private string $parameter;

/**
* @var \Pd\Version\Resolvers\PathResolverInterface[]
*/
private array $getters;


public function __construct(
string $directory,
string $parameter,
\Pd\Version\Resolvers\PathResolverInterface ...$getters
)
{
$this->directory = $directory;
$this->parameter = $parameter;
$this->getters = $getters;
}


/**
* @param string|\Nette\Http\Url|\Nette\Http\UrlImmutable $url
*/
public function __invoke(
$url,
?string $directory = NULL,
?string $parameter = NULL
): ?string
{
$directory = $directory ?: $this->directory;
$parameter = $parameter ?: $this->parameter;

$url = new \Nette\Http\Url($url);
foreach ($this->getters as $getter) {
$filePath = $getter->resolve($url, $directory, $parameter);
if ($filePath) {
return $filePath;
}
}

return NULL;
}

}
17 changes: 17 additions & 0 deletions src/IFilter.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?php declare(strict_types = 1);

namespace Pd\Version;

interface IFilter
{

/**
* @param string|\Nette\Http\Url|\Nette\Http\UrlImmutable $url
*/
public function __invoke(
$url,
?string $directory = NULL,
?string $parameter = NULL
): ?string;

}
47 changes: 47 additions & 0 deletions src/Resolvers/AbsoluteUrlResolver.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<?php declare(strict_types = 1);

namespace Pd\Version\Resolvers;

class AbsoluteUrlResolver extends \Pd\Version\Resolvers\AbstractPathResolver
{

public function resolve(\Nette\Http\Url $url, string $directory, string $parameter): ?string
{
if ( ! $this->isAbsoluteUrl($url)) {
return NULL;
}

if ( ! $this->cache) {
return $this->process($url, $parameter);
}

return $this->cache->load([$url->path, $directory, $parameter], function () use ($url, $parameter): string {
return $this->process($url, $parameter);
});
}


private function process(\Nette\Http\Url $url, string $parameter): string
{
$version = '';
$headers = @\get_headers($url->getAbsoluteUrl(), \PHP_VERSION_ID >= 80000 ? TRUE : 1);
if (\is_array($headers) && isset($headers['ETag'])) {
$version = \preg_replace('~[^a-z0-9\-]~', '', $headers['ETag']);
} elseif (\is_array($headers) && isset($headers['Last-Modified'])) {
$version = (string) (new \DateTime($headers['Last-Modified']))->getTimestamp();
}

return $this->getPath($url, $version, $parameter);
}


private function isAbsoluteUrl(\Nette\Http\Url $url): bool
{
if ( ! \Nette\Utils\Strings::length($url->getHost())) {
return FALSE;
}

return $this->request && $url->getHost() !== $this->request->getUrl()->getHost();
}

}
Loading