[](https://github.com/darviarush/perl-liveman/actions) [](https://metacpan.org/release/Liveman) # NAME Liveman - компиллÑтор из markdown в теÑÑ‚Ñ‹ и документацию # VERSION 3.2 # SYNOPSIS Файл lib/Example.md: ```markdown Дважды два: \```perl 2*2 # -> 2+2 \``` ``` ТеÑÑ‚: ```perl use Liveman; my $liveman = Liveman->new(prove => 1); # Компилировать lib/Example.md файл в t/example.t # и добавить pod-документацию в lib/Example.pm $liveman->transform("lib/Example.md"); $liveman->{count} # => 1 -f "t/example.t" # => 1 -f "lib/Example.pm" # => 1 # Компилировать вÑе lib/**.md файлы Ñо временем модификации, превышающим ÑоответÑтвующие теÑтовые файлы (t/**.t): $liveman->transforms; $liveman->{count} # => 0 # Компилировать без проверки времени модификации Liveman->new(compile_force => 1)->transforms->{count} # => 1 # ЗапуÑтить теÑÑ‚Ñ‹ Ñ yath: my $yath_return_code = $liveman->tests->{exit_code}; $yath_return_code # => 0 -f "cover_db/coverage.html" # => 1 # Ограничить liveman Ñтими файлами Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¹, преобразований и теÑтов (без покрытиÑ): my $liveman2 = Liveman->new(files => [], force_compile => 1); ``` # DESCRIPION Проблема Ñовременных проектов в том, что Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ Ð¾Ñ‚Ð¾Ñ€Ð²Ð°Ð½Ð° от теÑтированиÑ. Ðто значит, что примеры в документации могут не работать, а Ñама Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ отÑтавать от кода. Liveman компилирует файлы `lib/**.md` в файлы `t/**.t` и добавлÑет документацию в раздел `__END__` Ð¼Ð¾Ð´ÑƒÐ»Ñ Ðº файлам `lib/**.pm`. ИÑпользуйте команду `liveman` Ð´Ð»Ñ ÐºÐ¾Ð¼Ð¿Ð¸Ð»Ñции документации к теÑтам в каталоге вашего проекта и запуÑкайте теÑÑ‚Ñ‹: liveman ЗапуÑтите его Ñ Ð¿Ð¾ÐºÑ€Ñ‹Ñ‚Ð¸ÐµÐ¼. ÐžÐ¿Ñ†Ð¸Ñ `-o` открывает отчёт о покрытии кода теÑтами в браузере (файл отчёта покрытиÑ: `cover_db/coverage.html`). Liveman заменÑет `our $VERSION = "...";` в `lib/**.pm` из `lib/**.md` из Ñекции **VERSION** еÑли она ÑущеÑтвует. ЕÑли файл **minil.toml** ÑущеÑтвует, то Liveman прочитает из него `name` и Ñкопирует файл Ñ Ñтим именем и раÑширением `.md` в `README.md`. ЕÑли нужно, чтобы Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ Ð² `.md` была напиÑана на одном Ñзыке, а `pod` – на другом, то в начале `.md` нужно указать `!from:to` (Ñ ÐºÐ°ÐºÐ¾Ð³Ð¾ на какой Ñзык перевеÑти, например, Ð´Ð»Ñ Ñтого файла: `!ru:en`). Заголовки (Ñтроки на #) – не переводÑÑ‚ÑÑ. Так же не переводÑÑ‚Ñ Ð±Ð»Ð¾ÐºÐ¸ кода. Ð Ñам перевод оÑущеÑтвлÑетÑÑ Ð¿Ð¾ абзацам. Файлы Ñ Ð¿ÐµÑ€ÐµÐ²Ð¾Ð´Ð°Ð¼Ð¸ ÑкладываютÑÑ Ð² каталог `i18n`, например, `lib/My/Module.md` -> `i18n/My/Module.ru-en.po`. Перевод оÑущеÑтвлÑетÑÑ ÑƒÑ‚Ð¸Ð»Ð¸Ñ‚Ð¾Ð¹ `trans` (она должна быть уÑтановлена в ÑиÑтеме). Файлы переводов можно подкорректировать, так как еÑли перевод уже еÑÑ‚ÑŒ в файле, то берётÑÑ Ð¾Ð½. **Внимание!** Будьте оÑторожны и поÑле Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ `.md` проÑматривайте `git diff`, чтобы не потерÑÑ‚ÑŒ подкорректированные переводы в `.po`. **Примечание:** `trans -R` покажет ÑпиÑок Ñзыков, которые можно указывать в **!from:to** на первой Ñтроке документа. ## TYPES OF TESTS Коды Ñекций без указанного Ñзыка Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ Ñ `perl` запиÑываютÑÑ ÐºÐ°Ðº код в файл `t/**.t`. Ркомментарий Ñо Ñтрелкой (# -> )превращаетÑÑ Ð² теÑÑ‚ `Test::More`. ### `is` Сравнить два Ñквивалентных выражениÑ: ```perl "hi!" # -> "hi" . "!" "hi!" # → "hi" . "!" ``` ### `is_deeply` Сравнить два Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñтруктур: ```perl ["hi!"] # --> ["hi" . "!"] "hi!" # ⟶ "hi" . "!" ``` ### `is` with extrapolate-string Сравнить выражение Ñ ÑкÑтраполированной Ñтрокой: ```perl my $exclamation = "!"; "hi!2" # => hi${exclamation}2 "hi!2" # ⇒ hi${exclamation}2 ``` ### `is` with nonextrapolate-string Сравнить выражение Ñ Ð½ÐµÑкÑтраполированной Ñтрокой: ```perl 'hi${exclamation}3' # \> hi${exclamation}3 'hi${exclamation}3' # ↦ hi${exclamation}3 ``` ### `like` ПроверÑет регулÑрное выражение, включенное в выражение: ```perl 'abbc' # ~> b+ 'abc' # ↬ b+ ``` ### `unlike` Он проверÑет регулÑрное выражение, иÑключённое из выражениÑ: ```perl 'ac' # <~ b+ 'ac' # ↫ b+ ``` ## EMBEDDING FILES Каждый теÑÑ‚ выполнÑетÑÑ Ð²Ð¾ временном каталоге, который удалÑетÑÑ Ð¸ ÑоздаетÑÑ Ð¿Ñ€Ð¸ запуÑке теÑта. Формат Ñтого каталога: /tmp/.liveman/*project*/*path-to-test*/. Раздел кода в Ñтроке Ñ Ð¿Ñ€ÐµÑ„Ð¸ÐºÑом md-файла **File `path`:** запишетÑÑ Ð² файл при теÑтировании во Ð²Ñ€ÐµÐ¼Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ. Раздел кода в префикÑной Ñтроке md-файла **File `path` is:** будет ÑравниватьÑÑ Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð¼ методом `Test::More::is`. Файл experiment/test.txt: ```text hi! ``` Файл experiment/test.txt ÑвлÑетÑÑ: ```text hi! ``` **Внимание!** ПуÑÑ‚Ð°Ñ Ñтрока между префикÑом и кодом не допуÑкаетÑÑ! Ðти префикÑÑ‹ могут быть как на английÑком, так и на руÑÑком (`File <path>:` и `File <path> is:`). # METHODS ## new (%param) КонÑтруктор. Имеет аргументы: 1. `files` (array_ref) — ÑпиÑок md-файлов Ð´Ð»Ñ Ð¼ÐµÑ‚Ð¾Ð´Ð¾Ð² `transforms` и `tests`. 1. `open` (boolean) — открыть покрытие в браузере. ЕÑли на компьютере уÑтановлен браузер **opera**, то будет иÑпользоватÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° `opera` Ð´Ð»Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ. Иначе — `xdg-open`. 1. `force_compile` (boolean) — не проверÑÑ‚ÑŒ Ð²Ñ€ÐµÐ¼Ñ Ð¼Ð¾Ð´Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ md-файлов. 1. `options` — добавить параметры в командной Ñтроке Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ или доказательÑтва. 1. `prove` — иÑпользовать доказательÑтво (команду `prove` Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка теÑтов), а не команду `yath`. ## test_path ($md_path) Получить путь к `t/**.t`-файлу из пути к `lib/**.md`-файлу: ```perl Liveman->new->test_path("lib/PathFix/RestFix.md") # => t/path-fix/rest-fix.t ``` ## transform ($md_path, [$test_path]) Компилирует `lib/**.md`-файл в `t/**.t`-файл. Ртак же заменÑет **pod**-документацию в Ñекции `__END__` в `lib/**.pm`-файле и Ñоздаёт `lib/**.pm`-файл, еÑли тот не ÑущеÑтвует. Файл lib/Example.pm ÑвлÑетÑÑ: ```perl package Example; 1; __END__ =encoding utf-8 Дважды два: 2*2 # -> 2+2 ``` Файл `lib/Example.pm` был Ñоздан из файла `lib/Example.md`, что опиÑано в разделе `SINOPSIS` в Ñтом документе. ## transforms () Компилировать `lib/**.md`-файлы в `t/**.t`-файлы. Ð’Ñе, еÑли `$self->{files}` не уÑтановлен, или `$self->{files}`. ## tests () ЗапуÑтить теÑÑ‚Ñ‹ (`t/**.t`-файлы). Ð’Ñе, еÑли `$self->{files}` не уÑтановлен, или `$self->{files}` только. # DEPENDENCIES IN CPANFILE Ð’ Ñвоей библиотеке, которую вы будете теÑтировать Liveman-ом, нужно будет указать дополнительные завиÑимоÑти Ð´Ð»Ñ Ñ‚ÐµÑтов в **cpanfile**: ```cpanfile on 'test' => sub { requires 'Test::More', '0.98'; requires 'Carp'; requires 'File::Basename'; requires 'File::Path'; requires 'File::Slurper'; requires 'File::Spec'; requires 'Scalar::Util'; }; ``` Так же неплохо будет указать и Ñам **Liveman** в разделе Ð´Ð»Ñ Ñ€Ð°Ð·Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸: ```cpanfile on 'develop' => sub { requires 'Minilla', 'v3.1.19'; requires 'Data::Printer', '1.000004'; requires 'Liveman', '1.0'; }; ``` # AUTHOR Yaroslav O. Kosmina <dart@cpan.org> # LICENSE âš– **GPLv3** # COPYRIGHT The Liveman module is copyright © 2023 Yaroslav O. Kosmina. Rusland. All rights reserved.