Compare commits
No commits in common. "master" and "1.0.0-dev" have entirely different histories.
16 changed files with 469 additions and 595 deletions
2
LICENCE
2
LICENCE
|
@ -1,4 +1,4 @@
|
||||||
Copyright (c) 2023-2024, flashwave <me@flash.moe>
|
Copyright (c) 2023, flashwave <me@flash.moe>
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
|
|
@ -1,9 +1,5 @@
|
||||||
# Sasae
|
# Sasae
|
||||||
|
|
||||||
This library has been deprecated and its functionality is now implemented into [Index](https://patchii.net/flash/index).
|
|
||||||
|
|
||||||
## Original header
|
|
||||||
|
|
||||||
Sasae is a simple wrapper around some of Twig's functionality as well as making `Twig\Environment` a little bit more immutable.
|
Sasae is a simple wrapper around some of Twig's functionality as well as making `Twig\Environment` a little bit more immutable.
|
||||||
|
|
||||||
While it's not a lot of extras, I often implement the added functionality across projects.
|
While it's not a lot of extras, I often implement the added functionality across projects.
|
||||||
|
@ -12,7 +8,7 @@ The source file structure is meant to be similar to Twig's own.
|
||||||
|
|
||||||
## Requirements and Dependencies
|
## Requirements and Dependencies
|
||||||
|
|
||||||
Sasae currently targets **PHP 8.3**.
|
Sasae currently targets **PHP 8.2**.
|
||||||
|
|
||||||
No additional requirements and/or dependencies at this time.
|
No additional requirements and/or dependencies at this time.
|
||||||
|
|
||||||
|
|
2
VERSION
2
VERSION
|
@ -1 +1 @@
|
||||||
1.1.1
|
1.0.0-dev
|
||||||
|
|
|
@ -2,17 +2,18 @@
|
||||||
"name": "flashwave/sasae",
|
"name": "flashwave/sasae",
|
||||||
"description": "A wrapper for Twig with added common functionality.",
|
"description": "A wrapper for Twig with added common functionality.",
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"homepage": "https://railgun.sh/sasae",
|
|
||||||
"license": "bsd-3-clause-clear",
|
"license": "bsd-3-clause-clear",
|
||||||
|
"minimum-stability": "dev",
|
||||||
|
"prefer-stable": true,
|
||||||
"require": {
|
"require": {
|
||||||
"php": ">=8.3",
|
"php": ">=8.2",
|
||||||
"twig/twig": "^3.12",
|
"twig/twig": "^3.7",
|
||||||
"twig/html-extra": "^3.12",
|
"twig/html-extra": "^3.7",
|
||||||
"flashwave/index": "^0.2408.40014"
|
"flashwave/index": "dev-master"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"phpunit/phpunit": "^11.2",
|
"phpunit/phpunit": "^10.2",
|
||||||
"phpstan/phpstan": "^1.11"
|
"phpstan/phpstan": "^1.10"
|
||||||
},
|
},
|
||||||
"authors": [
|
"authors": [
|
||||||
{
|
{
|
||||||
|
|
814
composer.lock
generated
814
composer.lock
generated
File diff suppressed because it is too large
Load diff
|
@ -31,5 +31,11 @@
|
||||||
<ignore-tag>implements</ignore-tag>
|
<ignore-tag>implements</ignore-tag>
|
||||||
</ignore-tags>
|
</ignore-tags>
|
||||||
</api>
|
</api>
|
||||||
|
<guide format="rst">
|
||||||
|
<source dsn=".">
|
||||||
|
<path>docs</path>
|
||||||
|
</source>
|
||||||
|
<output>guide</output>
|
||||||
|
</guide>
|
||||||
</version>
|
</version>
|
||||||
</phpdocumentor>
|
</phpdocumentor>
|
||||||
|
|
|
@ -1,18 +1,15 @@
|
||||||
<?php
|
<?php
|
||||||
// SasaeFilesystemCache.php
|
|
||||||
// Created: 2024-08-04
|
|
||||||
// Updated: 2024-08-04
|
|
||||||
|
|
||||||
namespace Sasae\Cache;
|
namespace Sasae\Cache;
|
||||||
|
|
||||||
use Twig\Cache\FilesystemCache as TwigFilesystemCache;
|
use Twig\Cache\FilesystemCache as TwigFilesystemCache;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Extends Twig's filesystem cache implementation with an alternate constructor.
|
* Extends Twig's filesystem cache implementation with an alternate constructor.
|
||||||
*/
|
*/
|
||||||
class SasaeFilesystemCache extends TwigFilesystemCache {
|
class SasaeFilesystemCache extends TwigFilesystemCache {
|
||||||
/**
|
/**
|
||||||
* @param string $path Directory path to store the cache in.
|
* string $path Directory path to store the cache in.
|
||||||
* @param bool $autoReload Whether to refresh the cache if changes are detected.
|
* bool $autoReload Whether to refresh the cache if changes are detected.
|
||||||
*/
|
*/
|
||||||
public function __construct(string $path, bool $autoReload) {
|
public function __construct(string $path, bool $autoReload) {
|
||||||
parent::__construct(
|
parent::__construct(
|
||||||
|
|
|
@ -1,14 +1,11 @@
|
||||||
<?php
|
<?php
|
||||||
// SasaeExtension.php
|
|
||||||
// Created: 2024-08-04
|
|
||||||
// Updated: 2024-08-04
|
|
||||||
|
|
||||||
namespace Sasae\Extension;
|
namespace Sasae\Extension;
|
||||||
|
|
||||||
use Index\{ByteFormat,Index};
|
use Index\ByteFormat;
|
||||||
use Sasae\{Sasae,SasaeEnvironment};
|
use Index\Environment as NdxEnvironment;
|
||||||
use Twig\{TwigFilter,TwigFunction};
|
use Sasae\SasaeEnvironment;
|
||||||
use Twig\Environment as TwigEnvironment;
|
use Twig\TwigFilter;
|
||||||
|
use Twig\TwigFunction;
|
||||||
use Twig\Extension\AbstractExtension as TwigAbstractExtension;
|
use Twig\Extension\AbstractExtension as TwigAbstractExtension;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -23,9 +20,9 @@ class SasaeExtension extends TwigAbstractExtension {
|
||||||
|
|
||||||
public function getFunctions() {
|
public function getFunctions() {
|
||||||
return [
|
return [
|
||||||
new TwigFunction('ndx_version', Index::version(...)),
|
new TwigFunction('ndx_version', NdxEnvironment::getIndexVersion(...)),
|
||||||
new TwigFunction('sasae_version', Sasae::version(...)),
|
new TwigFunction('sasae_version', SasaeEnvironment::getSasaeVersion(...)),
|
||||||
new TwigFunction('twig_version', fn() => TwigEnvironment::VERSION),
|
new TwigFunction('twig_version', SasaeEnvironment::getTwigVersion(...)),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,4 @@
|
||||||
<?php
|
<?php
|
||||||
// SasaeFilesystemLoader.php
|
|
||||||
// Created: 2024-08-04
|
|
||||||
// Updated: 2024-08-04
|
|
||||||
|
|
||||||
namespace Sasae\Loader;
|
namespace Sasae\Loader;
|
||||||
|
|
||||||
use InvalidArgumentException;
|
use InvalidArgumentException;
|
||||||
|
|
|
@ -1,34 +0,0 @@
|
||||||
<?php
|
|
||||||
// Sasae.php
|
|
||||||
// Created: 2024-08-04
|
|
||||||
// Updated: 2024-08-04
|
|
||||||
|
|
||||||
namespace Sasae;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Provides information about the Sasae library.
|
|
||||||
*/
|
|
||||||
final class Sasae {
|
|
||||||
public const PATH_SOURCE = __DIR__;
|
|
||||||
public const PATH_ROOT = self::PATH_SOURCE . DIRECTORY_SEPARATOR . '..';
|
|
||||||
public const PATH_VERSION = self::PATH_ROOT . DIRECTORY_SEPARATOR . 'VERSION';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the current version of the Sasae library.
|
|
||||||
*
|
|
||||||
* Reads the VERSION file in the root of the Sasae directory.
|
|
||||||
* Returns 0.0.0 if reading the file failed for any reason.
|
|
||||||
*
|
|
||||||
* @return string Current version string.
|
|
||||||
*/
|
|
||||||
public static function version(): string {
|
|
||||||
if(!is_file(self::PATH_VERSION))
|
|
||||||
return '0.0.0';
|
|
||||||
|
|
||||||
$version = file_get_contents(self::PATH_VERSION);
|
|
||||||
if($version === false)
|
|
||||||
return '0.0.0';
|
|
||||||
|
|
||||||
return trim($version);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,8 +1,4 @@
|
||||||
<?php
|
<?php
|
||||||
// SasaeContext.php
|
|
||||||
// Created: 2024-08-04
|
|
||||||
// Updated: 2024-08-04
|
|
||||||
|
|
||||||
namespace Sasae;
|
namespace Sasae;
|
||||||
|
|
||||||
use InvalidArgumentException;
|
use InvalidArgumentException;
|
||||||
|
@ -74,7 +70,7 @@ class SasaeContext implements Stringable {
|
||||||
/**
|
/**
|
||||||
* Renders the template to a string, taking additional variables that are not commit to local set.
|
* Renders the template to a string, taking additional variables that are not commit to local set.
|
||||||
*
|
*
|
||||||
* @param array<string, mixed>|null $vars Additional local variables, nullable to avoid additional function calls.
|
* @param ?array<string, mixed> $vars Additional local variables, nullable to avoid additional function calls.
|
||||||
* @return string Rendered template.
|
* @return string Rendered template.
|
||||||
*/
|
*/
|
||||||
public function render(?array $vars = null): string {
|
public function render(?array $vars = null): string {
|
||||||
|
|
|
@ -1,17 +1,17 @@
|
||||||
<?php
|
<?php
|
||||||
// SasaeEnvironment.php
|
// SasaeEnvironment.php
|
||||||
// Created: 2023-08-24
|
// Created: 2023-08-24
|
||||||
// Updated: 2024-08-04
|
// Updated: 2023-08-24
|
||||||
|
|
||||||
namespace Sasae;
|
namespace Sasae;
|
||||||
|
|
||||||
use InvalidArgumentException;
|
|
||||||
use UnexpectedValueException;
|
use UnexpectedValueException;
|
||||||
use Sasae\Cache\SasaeFilesystemCache;
|
use Index\Version;
|
||||||
use Sasae\Extension\SasaeExtension;
|
use Sasae\Extension\SasaeExtension;
|
||||||
use Sasae\Loader\SasaeFilesystemLoader;
|
|
||||||
use Twig\{TwigFilter,TwigFunction,TwigTest};
|
|
||||||
use Twig\Environment as TwigEnvironment;
|
use Twig\Environment as TwigEnvironment;
|
||||||
|
use Twig\TwigFilter;
|
||||||
|
use Twig\TwigFunction;
|
||||||
|
use Twig\TwigTest;
|
||||||
use Twig\Cache\CacheInterface as TwigCacheInterface;
|
use Twig\Cache\CacheInterface as TwigCacheInterface;
|
||||||
use Twig\Extension\ExtensionInterface as TwigExtensionInterface;
|
use Twig\Extension\ExtensionInterface as TwigExtensionInterface;
|
||||||
use Twig\Extra\Html\HtmlExtension as TwigHtmlExtension;
|
use Twig\Extra\Html\HtmlExtension as TwigHtmlExtension;
|
||||||
|
@ -23,27 +23,22 @@ use Twig\Loader\LoaderInterface as TwigLoaderInterface;
|
||||||
class SasaeEnvironment {
|
class SasaeEnvironment {
|
||||||
private TwigEnvironment $env;
|
private TwigEnvironment $env;
|
||||||
|
|
||||||
|
private static ?string $sasaeVersionString = null;
|
||||||
|
private static ?Version $sasaeVersion = null;
|
||||||
|
private static ?Version $twigVersion = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param TwigLoaderInterface|string $loader A template loader instance or a path.
|
* @param TwigLoaderInterface $loader A template loader instance.
|
||||||
* @param TwigCacheInterface|array<string>|string|null $cache A caching driver.
|
* @param ?TwigCacheInterface $cache A caching driver.
|
||||||
* @param string $charset Character for templates.
|
* @param string $charset Character for templates.
|
||||||
* @param bool $debug Debug mode.
|
* @param bool $debug Debug mode.
|
||||||
*/
|
*/
|
||||||
public function __construct(
|
public function __construct(
|
||||||
TwigLoaderInterface|string $loader,
|
TwigLoaderInterface $loader,
|
||||||
TwigCacheInterface|array|string|null $cache = null,
|
?TwigCacheInterface $cache = null,
|
||||||
string $charset = 'utf-8',
|
string $charset = 'utf-8',
|
||||||
bool $debug = false
|
bool $debug = false
|
||||||
) {
|
) {
|
||||||
if(is_string($loader))
|
|
||||||
$loader = new SasaeFilesystemLoader($loader);
|
|
||||||
|
|
||||||
if(is_array($cache)) {
|
|
||||||
if(empty($cache))
|
|
||||||
throw new InvalidArgumentException('If $cache is an array, it may not be empty.');
|
|
||||||
$cache = SasaeFilesystemCache::create(array_shift($cache), array_shift($cache));
|
|
||||||
} elseif($cache === null) $cache = false;
|
|
||||||
|
|
||||||
$this->env = new TwigEnvironment($loader, [
|
$this->env = new TwigEnvironment($loader, [
|
||||||
'debug' => $debug,
|
'debug' => $debug,
|
||||||
'cache' => $cache,
|
'cache' => $cache,
|
||||||
|
@ -148,4 +143,50 @@ class SasaeEnvironment {
|
||||||
public function render(string $name, array $vars = []): string {
|
public function render(string $name, array $vars = []): string {
|
||||||
return $this->env->render($name, $vars);
|
return $this->env->render($name, $vars);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the current version of the Sasae library.
|
||||||
|
*
|
||||||
|
* @return Version
|
||||||
|
*/
|
||||||
|
public static function getSasaeVersion(): Version {
|
||||||
|
if(self::$sasaeVersion === null)
|
||||||
|
self::$sasaeVersion = Version::parse(self::getSasaeVersionString());
|
||||||
|
return self::$sasaeVersion;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the current version of the Sasae library as a string.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public static function getSasaeVersionString(): string {
|
||||||
|
if(self::$sasaeVersionString === null) {
|
||||||
|
$body = file_get_contents(__DIR__ . '/../VERSION');
|
||||||
|
if($body === false)
|
||||||
|
throw new UnexpectedValueException('Was unable to read VERSION file.');
|
||||||
|
self::$sasaeVersionString = trim($body);
|
||||||
|
}
|
||||||
|
return self::$sasaeVersionString;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the current version of the Twig library.
|
||||||
|
*
|
||||||
|
* @return Version
|
||||||
|
*/
|
||||||
|
public static function getTwigVersion(): Version {
|
||||||
|
if(self::$twigVersion === null)
|
||||||
|
self::$twigVersion = Version::parse(TwigEnvironment::VERSION);
|
||||||
|
return self::$twigVersion;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the current version of the Twig library as a string.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public static function getTwigVersionString(): string {
|
||||||
|
return TwigEnvironment::VERSION;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,39 +1,36 @@
|
||||||
<?php
|
<?php
|
||||||
// SasaeTest.php
|
|
||||||
// Created: 2024-08-04
|
|
||||||
// Updated: 2024-08-04
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
declare(strict_types=1);
|
||||||
|
|
||||||
use PHPUnit\Framework\TestCase;
|
use PHPUnit\Framework\TestCase;
|
||||||
use PHPUnit\Framework\Attributes\CoversClass;
|
use Index\Environment;
|
||||||
use Index\{Index,XString};
|
use Index\XString;
|
||||||
use Sasae\{Sasae,SasaeContext,SasaeEnvironment};
|
use Sasae\SasaeContext;
|
||||||
|
use Sasae\SasaeEnvironment;
|
||||||
use Sasae\Cache\SasaeFilesystemCache;
|
use Sasae\Cache\SasaeFilesystemCache;
|
||||||
use Sasae\Extension\SasaeExtension;
|
use Sasae\Extension\SasaeExtension;
|
||||||
use Sasae\Loader\SasaeFilesystemLoader;
|
use Sasae\Loader\SasaeFilesystemLoader;
|
||||||
use Twig\Environment as TwigEnvironment;
|
|
||||||
|
|
||||||
#[CoversClass(Sasae::class)]
|
/**
|
||||||
#[CoversClass(SasaeContext::class)]
|
* @covers SasaeContext
|
||||||
#[CoversClass(SasaeEnvironment::class)]
|
* @covers SasaeEnvironment
|
||||||
#[CoversClass(SasaeFilesystemCache::class)]
|
* @covers SasaeExtension
|
||||||
#[CoversClass(SasaeExtension::class)]
|
* @covers SasaeFilesystemCache
|
||||||
#[CoversClass(SasaeFilesystemLoader::class)]
|
* @covers SasaeFilesystemLoader
|
||||||
|
*/
|
||||||
final class SasaeTest extends TestCase {
|
final class SasaeTest extends TestCase {
|
||||||
public function testEverything(): void {
|
public function testEverything(): void {
|
||||||
$env = new SasaeEnvironment(
|
$env = new SasaeEnvironment(
|
||||||
__DIR__,
|
new SasaeFilesystemLoader(__DIR__),
|
||||||
['SasaeTest', XString::random(8)]
|
SasaeFilesystemCache::create('SasaeTest', XString::random(8))
|
||||||
);
|
);
|
||||||
|
|
||||||
$this->assertFalse($env->isDebug());
|
$this->assertFalse($env->isDebug());
|
||||||
|
|
||||||
$env->addGlobal('global_var', 'Sasae global var');
|
$env->addGlobal('global_var', 'Sasae global var');
|
||||||
$env->addGlobal('expect', [
|
$env->addGlobal('expect', [
|
||||||
'ndx_version' => Index::version(),
|
'ndx_version' => (string)Environment::getIndexVersion(),
|
||||||
'sasae_version' => Sasae::version(),
|
'sasae_version' => SasaeEnvironment::getSasaeVersionString(),
|
||||||
'twig_version' => TwigEnvironment::VERSION,
|
'twig_version' => SasaeEnvironment::getTwigVersionString(),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$env->addFilter('test_filter', fn($text) => ('filter:' . $text));
|
$env->addFilter('test_filter', fn($text) => ('filter:' . $text));
|
||||||
|
|
|
@ -1,30 +0,0 @@
|
||||||
#!/usr/bin/env php
|
|
||||||
<?php
|
|
||||||
$path = (function($path) {
|
|
||||||
if(!str_starts_with($path, '/'))
|
|
||||||
die('Cannot be bothered to support non-UNIX style paths, sorry!' . PHP_EOL);
|
|
||||||
|
|
||||||
while($path !== '/') {
|
|
||||||
$vPath = $path . DIRECTORY_SEPARATOR . 'VERSION';
|
|
||||||
if(is_file($vPath))
|
|
||||||
return $vPath;
|
|
||||||
|
|
||||||
$path = dirname($path);
|
|
||||||
}
|
|
||||||
})(__DIR__);
|
|
||||||
|
|
||||||
$version = file_get_contents($path);
|
|
||||||
if($version === false)
|
|
||||||
die('Failed to read VERSION file.' . PHP_EOL);
|
|
||||||
$version = trim($version);
|
|
||||||
|
|
||||||
$workingDir = getcwd();
|
|
||||||
try {
|
|
||||||
chdir(dirname($path));
|
|
||||||
echo shell_exec(sprintf('git tag v%s', $version));
|
|
||||||
echo shell_exec(sprintf('git push origin v%s', $version));
|
|
||||||
} finally {
|
|
||||||
chdir($workingDir);
|
|
||||||
}
|
|
||||||
|
|
||||||
echo $version . PHP_EOL;
|
|
|
@ -1,8 +1,8 @@
|
||||||
#!/usr/bin/env bash
|
#!/bin/bash
|
||||||
|
|
||||||
pushd .
|
pushd .
|
||||||
cd $(dirname "$0")
|
cd $(dirname "$0")
|
||||||
|
|
||||||
./update-headers
|
php update-headers.php
|
||||||
|
|
||||||
popd
|
popd
|
||||||
|
|
1
tools/update-headers → tools/update-headers.php
Executable file → Normal file
1
tools/update-headers → tools/update-headers.php
Executable file → Normal file
|
@ -1,4 +1,3 @@
|
||||||
#!/usr/bin/env php
|
|
||||||
<?php
|
<?php
|
||||||
// the point of index was so that i wouldn't have to copy things between projects
|
// the point of index was so that i wouldn't have to copy things between projects
|
||||||
// here i am copying things from index
|
// here i am copying things from index
|
Reference in a new issue