skriptorium 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,150 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <rss version="2.0"
3
+ xmlns:content="http://purl.org/rss/1.0/modules/content/"
4
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
5
+ xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
6
+ xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
7
+ <channel>
8
+ <title>Samoilenko Yuri</title>
9
+ <link>https://teletype.in/@jerry_ru?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=jerry_ru</link>
10
+ <description>Lead developer and technical writer @ RNDSOFT // Ruby 💕
11
+
12
+ Тут пишу про интересное, чем занимаюсь на работе - IT, проектирование, разработка...</description>
13
+ <pubDate>Mon, 27 Jul 2026 20:58:12 +0000</pubDate>
14
+ <lastBuildDate>Mon, 27 Jul 2026 20:58:12 +0000</lastBuildDate>
15
+ <item>
16
+ <title>Syncerman: от bash-скриптов к Go cli для пяти облаков одновременно</title>
17
+ <link>https://teletype.in/@jerry_ru/NpCFHTA1uZQ?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=jerry_ru</link>
18
+ <description>&lt;img src=&quot;https://img3.teletype.in/files/a3/78/a378884e-5416-4669-b2fb-a001bce9d848.png&quot;&gt;&lt;/img&gt;Иногда, чтобы решить свою проблему, приходится написать инструмент. А иногда — чтобы написать инструмент, приходится решить свою проблему. Короче, как обычно, всё началось не с идеи сделать утилиту, а с того, что добавилась пара важных документов (по иппотке) к существующему зоопарку данных, которые надо хранить.</description>
19
+ <pubDate>Tue, 21 Jul 2026 15:46:22 +0000</pubDate>
20
+ <guid isPermaLink="true">https://teletype.in/@jerry_ru/NpCFHTA1uZQ</guid>
21
+ <content:encoded>
22
+ &lt;figure id=&quot;IDYK&quot; class=&quot;m_column&quot;&gt;
23
+ &lt;img src=&quot;https://img3.teletype.in/files/a3/78/a378884e-5416-4669-b2fb-a001bce9d848.png&quot; width=&quot;1768&quot; /&gt;
24
+ &lt;/figure&gt;
25
+ &lt;p id=&quot;Z4r2&quot;&gt;Иногда, чтобы решить свою проблему, приходится написать инструмент. А иногда — чтобы написать инструмент, приходится решить свою проблему. Короче, как обычно, всё началось не с идеи сделать утилиту, а с того, что добавилась пара важных документов (по иппотке) к существующему зоопарку данных, которые надо хранить.&lt;/p&gt;
26
+ &lt;h3 id=&quot;Be8d&quot;&gt;Как я к этому пришел&lt;/h3&gt;
27
+ &lt;p id=&quot;xuVl&quot;&gt;У меня давно назрела проблема: синхронизировать разные файлы с разных рабочих мест — по крайней мере дома и на работе. Документы (важные), сохранения из игр, книги для читалки. Ну и надёжный архив всего этого добра, потому что терять даже что-то незначительное это боль 🤕.&lt;/p&gt;
28
+ &lt;p id=&quot;VVdw&quot;&gt;Просто положить всё в одно облако — хорошо, но нужен ещё постоянный процесс актуализации. &lt;code&gt;Яндекс Диск&lt;/code&gt; работает, &lt;code&gt;Google Drive&lt;/code&gt; может изменить условия, &lt;code&gt;Dropbox&lt;/code&gt; может внезапно ограничить доступ. Поэтому идея была простая: &lt;strong&gt;хранить копии везде&lt;/strong&gt;. &lt;code&gt;Яндекс Диск&lt;/code&gt;, &lt;code&gt;Google Drive&lt;/code&gt;, &lt;code&gt;Mail.ru Cloud&lt;/code&gt;, &lt;code&gt;Dropbox&lt;/code&gt; — чем больше, тем надёжнее. Только файлы, только хардкор! &lt;/p&gt;
29
+ &lt;p id=&quot;nq1A&quot;&gt;&lt;br /&gt;Раньше я обходился консольным демоном &lt;code&gt;yandex-disk&lt;/code&gt; — он работал, но только с Яндексом. Потом перешёл на самописные bash-скрипты, которые вызывали &lt;a href=&quot;https://rclone.org/&quot; target=&quot;_blank&quot;&gt;rclone&lt;/a&gt; напрямую. Это работало… до поры до времени. Конфигурация разрасталась, порядок синхронизации был важен (нельзя синкать из пустого облака в другое до того, как туда прилетели файлы) и всякое подобное. Проблема!&lt;/p&gt;
30
+ &lt;p id=&quot;yxo0&quot;&gt;Когда появились нормальные ИИ-ассистенты для кодинга, я решил, что пора пробовать, а мне нужен нормальный инструмент. Declarative configuration, predictable order, automatic error handling и пр. Так родился &lt;a href=&quot;https://gitlab.com/kinnalru/syncerman&quot; target=&quot;_blank&quot;&gt;Syncerman&lt;/a&gt;.&lt;/p&gt;
31
+ &lt;h3 id=&quot;hK4h&quot;&gt;&lt;s&gt;Из говна и палок&lt;/s&gt; архитектура и технологии&lt;/h3&gt;
32
+ &lt;p id=&quot;8efP&quot;&gt;&lt;code&gt;Syncerman&lt;/code&gt; написан на &lt;strong&gt;Go&lt;/strong&gt; — выбрал его только за простоту распространения (один бинарник).&lt;/p&gt;
33
+ &lt;p id=&quot;jtkg&quot;&gt;В основе лежит &lt;a href=&quot;https://rclone.org/bisync/&quot; target=&quot;_blank&quot;&gt;rclone bisync&lt;/a&gt; — двусторонняя синхронизация с сохранением метаданных. &lt;code&gt;Syncerman&lt;/code&gt; не пытается переизобрести колесо синхронизации, а выступает оркестратором над &lt;code&gt;rclone&lt;/code&gt;, предоставляя удобный CLI и YAML-конфигурацию. Никаких серверов и БД.&lt;/p&gt;
34
+ &lt;h3 id=&quot;Hkbu&quot;&gt;YAML-конфигурация&lt;/h3&gt;
35
+ &lt;p id=&quot;PgEt&quot;&gt;Вместо папок с ссылками на bash-скрипты — чёткая структура:&lt;/p&gt;
36
+ &lt;pre id=&quot;USS9&quot; data-lang=&quot;yaml&quot;&gt;jobs:
37
+ important:
38
+ name: &amp;quot;Важное&amp;quot;
39
+ priority: 10
40
+ tasks:
41
+ - from: &amp;quot;local:/home/jerry/cloud/mirror/Documents&amp;quot;
42
+ to:
43
+ - path: &amp;quot;gdrive:folders/Documents&amp;quot;
44
+ - path: &amp;quot;ydisk:folders/Documents&amp;quot;
45
+ - from: local:Наследие
46
+ to:
47
+ - path: gdrive:Наследие/
48
+ args: [ &amp;quot;--force&amp;quot; ]
49
+ - path: ydisk:Наследие/
50
+ args: [ &amp;quot;--force&amp;quot; ]
51
+ - path: mailru:Наследие/
52
+ args: [ &amp;quot;--force&amp;quot; ]
53
+
54
+ games:
55
+ name: &amp;quot;игрули&amp;quot;
56
+ priority: 20
57
+ tasks:
58
+ - from: &amp;quot;local:games_sync&amp;quot;
59
+ to:
60
+ - path: &amp;quot;ydisk:folders/games_sync&amp;quot;&lt;/pre&gt;
61
+ &lt;p id=&quot;BSFP&quot;&gt;Порядок &lt;strong&gt;tasks&lt;/strong&gt; и &lt;strong&gt;to&lt;/strong&gt; внутри массивов сохраняется строго. Это критично для цепочек: &lt;code&gt;local → Google Drive → Yandex Disk&lt;/code&gt;. Без этого — катастрофа.&lt;/p&gt;
62
+ &lt;h3 id=&quot;sRPV&quot;&gt;Проблемасики&lt;/h3&gt;
63
+ &lt;p id=&quot;eMgG&quot;&gt;&lt;code&gt;rclone bisync&lt;/code&gt; требует state-файлы для работы (они лежат где-то в папке пользователя). При первом запуске на новой паре путей он падает с ошибкой &lt;em&gt;&amp;quot;cannot find prior Path1 or Path2 listings&amp;quot;&lt;/em&gt;. Syncerman детектирует это по двум паттернам в выводе и автоматически перезапускает синхронизацию с флагом &lt;code&gt;--resync&lt;/code&gt;. Пользователь даже не замечает проблемы. Раньше делал руками.&lt;/p&gt;
64
+ &lt;p id=&quot;imKH&quot;&gt;На ранних этапах обнаружился критический баг: из-за использования map в Go порядок выполнения целей был недетерминированным. Для линейных цепочек это катастрофа: если сначала синкать из пустого &lt;code&gt;Yandex&lt;/code&gt; в &lt;code&gt;Google&lt;/code&gt;, а потом из локальной папки в &lt;code&gt;Google&lt;/code&gt; — быть беде. Проблема! Так появились массивы.&lt;/p&gt;
65
+ &lt;h3 id=&quot;kWCn&quot;&gt;Результат&lt;/h3&gt;
66
+ &lt;p id=&quot;nH30&quot;&gt;&lt;a href=&quot;https://gitlab.com/kinnalru/syncerman&quot; target=&quot;_blank&quot;&gt;Syncerman&lt;/a&gt; версии **0.3.6** сейчас работает в production — то есть на моих машинах :) Само собой нужны пруфы, и их есть у меня!&lt;/p&gt;
67
+ &lt;ul id=&quot;rmas&quot;&gt;
68
+ &lt;li id=&quot;exGG&quot;&gt;бинарники для Linux и Windows (сборка сразу подо всё)&lt;/li&gt;
69
+ &lt;li id=&quot;Mea6&quot;&gt;GitLab CI как в лучших домах&lt;/li&gt;
70
+ &lt;li id=&quot;tbNO&quot;&gt;Покрытие тестами - самому было бы лень писать а тут юнит-тесты для всех ключевых пакетов (config, rclone, sync), интеграционные тесты (не просто интеграционные а целые &lt;strong&gt;bash-сценарии с десятком шагов&lt;/strong&gt;).&lt;/li&gt;
71
+ &lt;/ul&gt;
72
+ &lt;p id=&quot;uFDI&quot;&gt;Публичные репозитории (это мой фетиш):&lt;/p&gt;
73
+ &lt;ul id=&quot;0Rdg&quot;&gt;
74
+ &lt;li id=&quot;fqVe&quot;&gt;Gitlab &lt;a href=&quot;https://gitlab.com/kinnalru/syncerman&quot; target=&quot;_blank&quot;&gt;https://gitlab.com/kinnalru/syncerman&lt;/a&gt;&lt;/li&gt;
75
+ &lt;li id=&quot;QP9Z&quot;&gt;Github &lt;a href=&quot;https://github.com/kinnalru/syncerman&quot; target=&quot;_blank&quot;&gt;https://github.com/kinnalru/syncerman&lt;/a&gt;&lt;/li&gt;
76
+ &lt;li id=&quot;HGZ3&quot;&gt;Gitflic &lt;a href=&quot;https://gitflic.ru/project/kinnalru/syncerman&quot; target=&quot;_blank&quot;&gt;https://gitflic.ru/project/kinnalru/syncerman&lt;/a&gt;&lt;/li&gt;
77
+ &lt;li id=&quot;zG5B&quot;&gt;Gitverse &lt;a href=&quot;https://gitverse.ru/kinnalru/syncerman&quot; target=&quot;_blank&quot;&gt;https://gitverse.ru/kinnalru/syncerman&lt;/a&gt;&lt;/li&gt;
78
+ &lt;/ul&gt;
79
+ &lt;h3 id=&quot;gmfZ&quot;&gt;Использование&lt;/h3&gt;
80
+ &lt;p id=&quot;KC8f&quot;&gt;Мой &lt;code&gt;crontab&lt;/code&gt; выглядит так:&lt;/p&gt;
81
+ &lt;pre id=&quot;gOCW&quot; data-lang=&quot;bash&quot;&gt;# Синхронизация документов и сохранений 2 рааз в час и лог для ручной проверки
82
+ 10,30 * * * * /bin/sh -lc &amp;quot;cd /home/jerry/cloud/mirror &amp;amp;&amp;amp; syncerman sync 2&amp;gt;&amp;amp;1 | tee ./lastrun.log&amp;quot;&lt;/pre&gt;
83
+ &lt;p id=&quot;bTiU&quot;&gt;Конфигурация зеркалирует локальные папки во все облака (настроенные в &lt;code&gt;rclone&lt;/code&gt;) одновременно, а затем синхронизирует облака между собой. Если одно облако отвалится — данные остаются в остальных. Если &lt;code&gt;rclone&lt;/code&gt; выдаст &lt;code&gt;first-run&lt;/code&gt; ошибку — &lt;code&gt;Syncerman&lt;/code&gt; сам всё починит. &lt;/p&gt;
84
+ &lt;h3 id=&quot;ONVK&quot;&gt;Вместо вывода&lt;/h3&gt;
85
+ &lt;p id=&quot;0EVJ&quot;&gt;Появление ИИ-ассистентов снизило порог входа для написания таких инструментов. Раньше мне было лень писать то, что и так работает с помощью пары строк на bash. А сейчас это делаю не я :) — разбор выхлопов &lt;code&gt;rclone&lt;/code&gt;, обработка edge cases и тестирование делаются очень легко. Я могу заняться решением проблем (архитектурой и требованиями), а рутина &amp;quot;делается сама&amp;quot;. &lt;/p&gt;
86
+ &lt;hr /&gt;
87
+ &lt;p id=&quot;uKqc&quot;&gt;Второй фетиш это ссылочки:&lt;/p&gt;
88
+ &lt;ul id=&quot;Bf8d&quot;&gt;
89
+ &lt;li id=&quot;bQjX&quot;&gt;&lt;a href=&quot;https://rclone.org/bisync/&quot; target=&quot;_blank&quot;&gt;rclone bisync&lt;/a&gt; - это база&lt;/li&gt;
90
+ &lt;li id=&quot;phUm&quot;&gt;&lt;a href=&quot;https://github.com/bcpierce00/unison&quot; target=&quot;_blank&quot;&gt;unison&lt;/a&gt; - еще одна классная штука по теме синхронизации, она прочно заняла место в моём сердце, но об это в другой раз&lt;/li&gt;
91
+ &lt;/ul&gt;
92
+
93
+ </content:encoded>
94
+ <dc:creator>jerry_ru</dc:creator>
95
+ <dc:date>2026-07-21T15:46:22+00:00</dc:date>
96
+ </item>
97
+ <item>
98
+ <title>Linux -&gt; Wine -&gt; DxWnd -&gt; Capitalism 2</title>
99
+ <link>https://teletype.in/@jerry_ru/ZtDQsnXWPM5?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=jerry_ru</link>
100
+ <description>&lt;img src=&quot;https://img3.teletype.in/files/66/f8/66f84541-472d-428d-8971-72742d1c7b8b.png&quot;&gt;&lt;/img&gt;Захотелось поиграть в шикарную старую игрулину моего детства Capitalism 2. Захотеть то я захотел, а вот чтоб её запустить пришлось вспомнить свои старые навыки - ведь я Core/Kernel Linux Developer (хоть и в прошлом). Получилось инетресно и позновательно - рекомендую для ознакомления.</description>
101
+ <pubDate>Mon, 20 Jan 2025 20:09:22 +0000</pubDate>
102
+ <guid isPermaLink="true">https://teletype.in/@jerry_ru/ZtDQsnXWPM5</guid>
103
+ <content:encoded>
104
+ &lt;p id=&quot;mxO8&quot;&gt;Захотелось поиграть в шикарную старую игрулину моего детства &lt;a href=&quot;https://en.wikipedia.org/wiki/Capitalism_II&quot; target=&quot;_blank&quot;&gt;Capitalism 2&lt;/a&gt;. Захотеть то я захотел, а вот чтоб её запустить пришлось вспомнить свои старые навыки - ведь я Core/Kernel Linux Developer (хоть и в прошлом). Получилось инетресно и позновательно - рекомендую для ознакомления.&lt;/p&gt;
105
+ &lt;h2 id=&quot;ATun&quot;&gt;Шаг первый - установка&lt;/h2&gt;
106
+ &lt;p id=&quot;uD2Z&quot;&gt;Игра очень крутая - используется в универах для обучения экономике, однако выпущена в 2001 под Windows и это большая проблема.&lt;/p&gt;
107
+ &lt;p id=&quot;VZvg&quot;&gt;Находим пыльный диск или качаем с торрентов, ставим себе wine и устанавливаем игру. Ей потребуются зависимости, которые проще всего поставить с помощью &lt;a href=&quot;https://gitlab.winehq.org/wine/wine/-/wikis/Winetricks&quot; target=&quot;_blank&quot;&gt;winetricks&lt;/a&gt; - они очень помогают. Зависимости:&lt;/p&gt;
108
+ &lt;ul id=&quot;BnLK&quot;&gt;
109
+ &lt;li id=&quot;l7kR&quot;&gt;mfc42.dll&lt;/li&gt;
110
+ &lt;li id=&quot;bN40&quot;&gt;шрифты (я ставлю все)&lt;/li&gt;
111
+ &lt;li id=&quot;4PlB&quot;&gt;DirectPlay (без этого сетевая игра по локалочке с друганом не заработает)&lt;/li&gt;
112
+ &lt;/ul&gt;
113
+ &lt;p id=&quot;6SYg&quot;&gt;Игра достаточно сложная и я предпочитаю играть в неё с хорошей локализацией, для этого мало поставить русскую версию, надо еще накатить 2 (два) патча с исправлением локализации - ищите их на торрентах.&lt;/p&gt;
114
+ &lt;p id=&quot;TYcJ&quot;&gt;Для запуска надо будет задать локаль:&lt;/p&gt;
115
+ &lt;pre id=&quot;GAD4&quot; data-lang=&quot;shell&quot;&gt;LC_ALL=ru_RU.UTF-8 LANG=ru_RU.UTF-8 wine cap2.exe&lt;/pre&gt;
116
+ &lt;h3 id=&quot;Anqm&quot;&gt;Эмуляция CDROM&lt;/h3&gt;
117
+ &lt;p id=&quot;eZZk&quot;&gt;Всё запустится, но не будет работать одиночная игра. Дело в том что если у вас не похаченная версия, то ей нeжен будет CDROM. Его эмуляция делается через &lt;code&gt;winecfg&lt;/code&gt; - выбираем Диски, указывам путь к файлам инсталятора, тип ставим CDROM:&lt;/p&gt;
118
+ &lt;figure id=&quot;xvwx&quot; class=&quot;m_original&quot;&gt;
119
+ &lt;img src=&quot;https://img2.teletype.in/files/57/5d/575dc7fe-a098-452e-81c8-731c41152f94.png&quot; width=&quot;542&quot; /&gt;
120
+ &lt;/figure&gt;
121
+ &lt;p id=&quot;d6Dj&quot;&gt;Запускаем еще раз и оно работает! На первый взгляд. Но если запустить саму игру то окажется что у неё не перерисовывается экран :( &lt;/p&gt;
122
+ &lt;p id=&quot;gilF&quot;&gt;Это ввергло меня в уныние... Я много и долго тыкал в настройки wine, режимы совместимости, поставил всякие древние версии DirectX и пр. и ничего. Но не зря же я разработчик с 20ти летним стажем?!? Дай, думаю, запущу в оконном режиме. Таких настроек в игре нет, но это не может меня остановить - я перлопатил все файлы игры в поисках конфигов, но не нашел. &lt;/p&gt;
123
+ &lt;p id=&quot;PKte&quot;&gt;После этого я пошел гуглить как заставить игру под виндой работать в оконном режиме и нашел! &lt;/p&gt;
124
+ &lt;h2 id=&quot;doNY&quot;&gt;Шаг второй - DxWnd&lt;/h2&gt;
125
+ &lt;section style=&quot;background-color:hsl(hsl(0, 0%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
126
+ &lt;p id=&quot;MOaO&quot;&gt;&lt;strong&gt;DxWnd&lt;/strong&gt;&lt;br /&gt;Window hooker to run fullscreen programs in window and much more...&lt;/p&gt;
127
+ &lt;p id=&quot;mEpW&quot;&gt;Windows hooker - intercepts system calls to make Win32 programs run in a window, to enhance application compatibility, to enhance video modes, to stretch timing and emulate CD disk data and audio tracks. It is typically very useful to run old Windows games.&lt;/p&gt;
128
+ &lt;/section&gt;
129
+ &lt;p id=&quot;gLH2&quot;&gt;Это такая дич которая перехватывает системные вызовы и вызовы к библиотеке DirectX и позволяет надругиваться над ними. &lt;/p&gt;
130
+ &lt;p id=&quot;btun&quot;&gt;Ставим эту волшебную прогу также под wine, запускам и настраиваем запуск Capitalism 2. Мне подошло &lt;code&gt;1440x900 Desktop center&lt;/code&gt;, но вы можете указать там что хотите.&lt;/p&gt;
131
+ &lt;figure id=&quot;fyFG&quot; class=&quot;m_original&quot;&gt;
132
+ &lt;img src=&quot;https://img3.teletype.in/files/a9/62/a962f09d-ea70-41e0-94f7-9aa7c80208c6.png&quot; width=&quot;531&quot; /&gt;
133
+ &lt;/figure&gt;
134
+ &lt;h2 id=&quot;PTlp&quot;&gt;Шаг третий - пора играть!&lt;/h2&gt;
135
+ &lt;p id=&quot;Xsy1&quot;&gt;И вот, наконец, после прочтения тонны логов и выхлопов из wine, плясок с версиями библиотек, шрифтами, локалями и DirectX, можно наконец.... Лечь спать. Играть буду в другой день :)&lt;/p&gt;
136
+ &lt;figure id=&quot;52Ua&quot; class=&quot;m_original&quot;&gt;
137
+ &lt;img src=&quot;https://img3.teletype.in/files/66/f8/66f84541-472d-428d-8971-72742d1c7b8b.png&quot; width=&quot;1572&quot; /&gt;
138
+ &lt;/figure&gt;
139
+ &lt;figure id=&quot;yqXD&quot; class=&quot;m_column&quot;&gt;
140
+ &lt;iframe src=&quot;data:text/html;charset=utf-8, &lt;head&gt;&lt;base target=&amp;#x27;_blank&amp;#x27; /&gt;&lt;/head&gt; &lt;body&gt;&lt;script src=&amp;#x27;https://static.elfsight.com/platform/platform.js&amp;#x27; async&gt;&lt;/script&gt; &lt;div class=&amp;#x27;elfsight-app-1fd8a750-8313-41db-a2e7-e8f396a33bc1&amp;#x27; data-elfsight-app-lazy&gt;&lt;/div&gt; &lt;/body&gt;&quot;&gt;&lt;/iframe&gt;
141
+ &lt;figcaption&gt;Мои ссылочки&lt;/figcaption&gt;
142
+ &lt;/figure&gt;
143
+
144
+ </content:encoded>
145
+ <dc:creator>jerry_ru</dc:creator>
146
+ <dc:date>2025-01-20T20:09:22+00:00</dc:date>
147
+ </item>
148
+ <dc:date>2026-07-27T20:58:12+00:00</dc:date>
149
+ </channel>
150
+ </rss>
metadata ADDED
@@ -0,0 +1,230 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: skriptorium
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Samoilenko Yuri
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2026-08-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.0'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 2.0.1
23
+ type: :development
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '2.0'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 2.0.1
33
+ - !ruby/object:Gem::Dependency
34
+ name: rspec
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '3.13'
40
+ type: :development
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '3.13'
47
+ - !ruby/object:Gem::Dependency
48
+ name: webmock
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '3.26'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '3.26'
61
+ - !ruby/object:Gem::Dependency
62
+ name: activesupport
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '8.1'
68
+ type: :runtime
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '8.1'
75
+ - !ruby/object:Gem::Dependency
76
+ name: base64
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '0.3'
82
+ type: :runtime
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '0.3'
89
+ - !ruby/object:Gem::Dependency
90
+ name: faraday
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '2.14'
96
+ type: :runtime
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '2.14'
103
+ - !ruby/object:Gem::Dependency
104
+ name: front_matter_parser
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '1.0'
110
+ type: :runtime
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '1.0'
117
+ - !ruby/object:Gem::Dependency
118
+ name: redcarpet
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '3.6'
124
+ type: :runtime
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '3.6'
131
+ - !ruby/object:Gem::Dependency
132
+ name: reverse_markdown
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '3.0'
138
+ type: :runtime
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: '3.0'
145
+ - !ruby/object:Gem::Dependency
146
+ name: rss
147
+ requirement: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - "~>"
150
+ - !ruby/object:Gem::Version
151
+ version: '0.3'
152
+ type: :runtime
153
+ prerelease: false
154
+ version_requirements: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - "~>"
157
+ - !ruby/object:Gem::Version
158
+ version: '0.3'
159
+ - !ruby/object:Gem::Dependency
160
+ name: russian
161
+ requirement: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - "~>"
164
+ - !ruby/object:Gem::Version
165
+ version: '1.0'
166
+ type: :runtime
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - "~>"
171
+ - !ruby/object:Gem::Version
172
+ version: '1.0'
173
+ description: Skriptorium fetches new articles from a single source and publishes them
174
+ to multiple destinations such as dev.to, hashnode, GitHub Pages, Blogger and local
175
+ files.
176
+ email:
177
+ - kinnalru@gmail.com
178
+ executables:
179
+ - skriptorium
180
+ extensions: []
181
+ extra_rdoc_files: []
182
+ files:
183
+ - Gemfile
184
+ - Gemfile.lock
185
+ - LICENSE
186
+ - README.md
187
+ - bin/google.rb
188
+ - bin/skriptorium
189
+ - config.yml.example
190
+ - lib/skriptorium.rb
191
+ - lib/skriptorium/article.rb
192
+ - lib/skriptorium/base_destination.rb
193
+ - lib/skriptorium/base_source.rb
194
+ - lib/skriptorium/blogger/destination.rb
195
+ - lib/skriptorium/config.rb
196
+ - lib/skriptorium/dev_to/destination.rb
197
+ - lib/skriptorium/dev_to/source.rb
198
+ - lib/skriptorium/github_pages/destination.rb
199
+ - lib/skriptorium/hashnode/destination.rb
200
+ - lib/skriptorium/local/destination.rb
201
+ - lib/skriptorium/rss/source.rb
202
+ - lib/skriptorium/version.rb
203
+ - test/fixtures/dev_to_me_article_1.json
204
+ - test/fixtures/dev_to_me_article_2.json
205
+ - test/fixtures/dev_to_me_articles.json
206
+ - test/fixtures/rss_teletype.xml
207
+ homepage: https://github.com/kinnalru/skriptorium
208
+ licenses:
209
+ - MIT
210
+ metadata: {}
211
+ post_install_message:
212
+ rdoc_options: []
213
+ require_paths:
214
+ - lib
215
+ required_ruby_version: !ruby/object:Gem::Requirement
216
+ requirements:
217
+ - - ">="
218
+ - !ruby/object:Gem::Version
219
+ version: '3.0'
220
+ required_rubygems_version: !ruby/object:Gem::Requirement
221
+ requirements:
222
+ - - ">="
223
+ - !ruby/object:Gem::Version
224
+ version: '0'
225
+ requirements: []
226
+ rubygems_version: 3.4.10
227
+ signing_key:
228
+ specification_version: 4
229
+ summary: Personal CLI tool for automatic article publishing.
230
+ test_files: []