fix(config): enable explicit face focus

This commit is contained in:
Panfilov Konstantin committed 2026-10-17 20:51:44 +03:00
1 parent f14ce88cc6
commit ac4cc21361
5 files changed
+64 -18

No files matched your search

+7 -5
View File
@@ -23,11 +23,13 @@
Не обходить серверные правила доступа к загрузке и результату обработки. Не обходить серверные правила доступа к загрузке и результату обработки.
- Рабочий `config.json` на каждом хостинге настраивает владелец. Деплой не имеет - Рабочий `config.json` на каждом хостинге настраивает владелец. Деплой не имеет
права перезаписывать его значений. При появлении новой обязательной UTM workflow права перезаписывать его значений. При появлении новой обязательной UTM workflow
получает текущий хостовый конфиг и добавляет только отсутствующий ключ через получает текущий хостовый конфиг и меняет только ключи, которые прямо
`bin/ensure-focus-config.php`; имеющиеся значения, включая уже настроенный согласованы в задаче. Иные значения, включая уже настроенные UTM, остаются
`focus`, остаются байт-в-байт прежними. `requisites.html` также живёт только на байт-в-байт прежними. Для #274 `bin/ensure-focus-config.php` — явное
хостинге и не перезаписывается. Не создавать target-specific конфиги или исключение: он задаёт только новый `focus=face` (default и rnd). После каждого
`config.json.example`. такого выпуска фактический stage-config следует забрать и зафиксировать в Git.
`requisites.html` также живёт только на хостинге и не перезаписывается. Не
создавать target-specific конфиги или `config.json.example`.
- Коммит в `main` запускает FTP-автодеплой на все цели workflow; откат через `git revert` - Коммит в `main` запускает FTP-автодеплой на все цели workflow; откат через `git revert`
также запускает выкат. Коммит, push и изменения хостинга — только по прямому поручению. также запускает выкат. Коммит, push и изменения хостинга — только по прямому поручению.
- Проверки кода и браузера проводить в Docker без установки ПО на хост. - Проверки кода и браузера проводить в Docker без установки ПО на хост.
+1 -1
View File
@@ -65,7 +65,7 @@ Preland всегда формирует полный resolved-набор сво
| `requisites.html` | реквизиты для подвала (HTML), если в `config.json` нет `requisites`. Без обоих — **заглушка «ИП Иванов Иван Иванович»** из `template.php` | | `requisites.html` | реквизиты для подвала (HTML), если в `config.json` нет `requisites`. Без обоих — **заглушка «ИП Иванов Иван Иванович»** из `template.php` |
| `images/`, `fonts/`, `favicon/`, `*.css` | статика; `style.min.css` встраивается в страницу | | `images/`, `fonts/`, `favicon/`, `*.css` | статика; `style.min.css` встраивается в страницу |
| `.htaccess` | только сроки кэширования статики (Apache) | | `.htaccess` | только сроки кэширования статики (Apache) |
| `config.json` | зафиксированный Git-снимок актуального stage-конфига; runtime-файл хоста является источником истины и обычным deploy не заменяется | | `config.json` | снимок актуального stage-конфига и схема. Рабочий конфиг на каждом хостинге настраивает владелец; deploy не заменяет его и меняет только явно согласованные в задаче ключи. После такого изменения актуальный stage-снимок забирают обратно в Git |
### `config.json` ### `config.json`
+15 -10
View File
@@ -1,11 +1,13 @@
<?php <?php
/** /**
* Точечно добавляет новую UTM focus в рабочий конфиг приленда на хостинге. * Точечно включает UTM focus в рабочем конфиге приленда на хостинге.
* *
* Значения уже существующих полей конфигурации намеренно не нормализуются и * Значения уже существующих полей конфигурации намеренно не нормализуются и
* не переписываются: владелец настраивает их непосредственно на стенде или * не переписываются: владелец настраивает их непосредственно на стенде или
* production. Скрипт возвращает 0, когда focus уже существует, и 10, когда * production. В #274 владелец явно задал значения самого нового ключа focus:
* ключ добавлен и config.json требуется загрузить обратно. * face включён и для TypeIn default, и для rnd. Скрипт возвращает 0, когда
* focus уже совпадает с этим контрактом, и 10, когда требуется загрузить
* обратно config.json с изменённым только focus.
* *
* @usage php bin/ensure-focus-config.php /path/to/config.json * @usage php bin/ensure-focus-config.php /path/to/config.json
*/ */
@@ -36,12 +38,8 @@ if (!is_array($config) || !isset($config['utm']) || !is_array($config['utm'])) {
exit(2); exit(2);
} }
if (array_key_exists('focus', $config['utm'])) { /** Единственное явно согласованное изменение host-config в #274. */
fwrite(STDOUT, "focus уже настроен: конфиг не изменён.\n"); $focus = [
exit(0);
}
$config['utm']['focus'] = [
'weights' => [ 'weights' => [
'center' => 0, 'center' => 0,
'face' => 1, 'face' => 1,
@@ -49,6 +47,13 @@ $config['utm']['focus'] = [
'default' => 'face', 'default' => 'face',
]; ];
if (($config['utm']['focus'] ?? null) === $focus) {
fwrite(STDOUT, "focus уже включён: конфиг не изменён.\n");
exit(0);
}
$config['utm']['focus'] = $focus;
try { try {
$encoded = json_encode( $encoded = json_encode(
$config, $config,
@@ -64,5 +69,5 @@ if (file_put_contents($path, $encoded, LOCK_EX) === false) {
exit(2); exit(2);
} }
fwrite(STDOUT, "Добавлен только utm.focus (face включён по умолчанию).\n"); fwrite(STDOUT, "Изменён только utm.focus: face включён по умолчанию и для rnd.\n");
exit(10); exit(10);
+39
View File
@@ -0,0 +1,39 @@
<?php
/** Регрессия правила: deploy меняет только явно согласованный ключ focus. */
declare(strict_types=1);
$root = dirname(__DIR__);
$script = $root . '/bin/ensure-focus-config.php';
$fixture = [
'host' => 'custom.example',
'requisites' => ['Не менять'],
'utm' => [
'theme' => ['weights' => ['dark' => 7, 'light' => 3], 'default' => 'light'],
'focus' => ['weights' => ['center' => 9, 'face' => 1], 'default' => 'center'],
],
];
$path = tempnam(sys_get_temp_dir(), 'preland-config-');
if ($path === false) {
fwrite(STDERR, "FAIL: не создан временный config.\n");
exit(1);
}
try {
file_put_contents($path, json_encode($fixture, JSON_THROW_ON_ERROR));
exec(PHP_BINARY . ' ' . escapeshellarg($script) . ' ' . escapeshellarg($path), $output, $code);
$actual = json_decode((string) file_get_contents($path), true, 512, JSON_THROW_ON_ERROR);
} finally {
@unlink($path);
}
if ($code !== 10
|| ($actual['host'] ?? null) !== 'custom.example'
|| ($actual['requisites'] ?? null) !== ['Не менять']
|| ($actual['utm']['theme'] ?? null) !== $fixture['utm']['theme']
|| ($actual['utm']['focus'] ?? null) !== ['weights' => ['center' => 0, 'face' => 1], 'default' => 'face']) {
fwrite(STDERR, "FAIL: host-config должен сохранить все значения, кроме явно заданного focus.\n");
exit(1);
}
fwrite(STDOUT, "OK: host config changes only explicit focus\n");
+2 -2
View File
@@ -4,7 +4,7 @@
* *
* Репозиторный config.json задаёт схему и стартовые значения. Рабочий конфиг * Репозиторный config.json задаёт схему и стартовые значения. Рабочий конфиг
* владельца на хостинге не перезаписывается: delivery добавляет только * владельца на хостинге не перезаписывается: delivery добавляет только
* отсутствующие обязательные UTM-ключи. * явно согласованные ключи. В #274 это единственный новый ключ focus.
*/ */
declare(strict_types=1); declare(strict_types=1);
@@ -63,7 +63,7 @@ foreach ([
|| !str_contains($block, 'config\\.json$') || !str_contains($block, 'config\\.json$')
|| !str_contains($block, 'ensure-focus-config.php') || !str_contains($block, 'ensure-focus-config.php')
|| !str_contains($block, 'Preserve host config and add focus if absent')) { || !str_contains($block, 'Preserve host config and add focus if absent')) {
$failures[] = "{$delivery} обязан сохранять хостовый config.json и добавлять только отсутствующий focus."; $failures[] = "{$delivery} обязан сохранять хостовый config.json и менять только явно согласованный focus.";
} }
} }