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.
- checksums.yaml +7 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +124 -0
- data/LICENSE +21 -0
- data/README.md +53 -0
- data/bin/google.rb +99 -0
- data/bin/skriptorium +117 -0
- data/config.yml.example +27 -0
- data/lib/skriptorium/article.rb +114 -0
- data/lib/skriptorium/base_destination.rb +27 -0
- data/lib/skriptorium/base_source.rb +40 -0
- data/lib/skriptorium/blogger/destination.rb +98 -0
- data/lib/skriptorium/config.rb +18 -0
- data/lib/skriptorium/dev_to/destination.rb +62 -0
- data/lib/skriptorium/dev_to/source.rb +71 -0
- data/lib/skriptorium/github_pages/destination.rb +69 -0
- data/lib/skriptorium/hashnode/destination.rb +188 -0
- data/lib/skriptorium/local/destination.rb +34 -0
- data/lib/skriptorium/rss/source.rb +50 -0
- data/lib/skriptorium/version.rb +3 -0
- data/lib/skriptorium.rb +83 -0
- data/test/fixtures/dev_to_me_article_1.json +31 -0
- data/test/fixtures/dev_to_me_article_2.json +38 -0
- data/test/fixtures/dev_to_me_articles.json +1211 -0
- data/test/fixtures/rss_teletype.xml +150 -0
- metadata +230 -0
|
@@ -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&utm_medium=feed_rss&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&utm_medium=feed_rss&utm_campaign=jerry_ru</link>
|
|
18
|
+
<description><img src="https://img3.teletype.in/files/a3/78/a378884e-5416-4669-b2fb-a001bce9d848.png"></img>Иногда, чтобы решить свою проблему, приходится написать инструмент. А иногда — чтобы написать инструмент, приходится решить свою проблему. Короче, как обычно, всё началось не с идеи сделать утилиту, а с того, что добавилась пара важных документов (по иппотке) к существующему зоопарку данных, которые надо хранить.</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
|
+
<figure id="IDYK" class="m_column">
|
|
23
|
+
<img src="https://img3.teletype.in/files/a3/78/a378884e-5416-4669-b2fb-a001bce9d848.png" width="1768" />
|
|
24
|
+
</figure>
|
|
25
|
+
<p id="Z4r2">Иногда, чтобы решить свою проблему, приходится написать инструмент. А иногда — чтобы написать инструмент, приходится решить свою проблему. Короче, как обычно, всё началось не с идеи сделать утилиту, а с того, что добавилась пара важных документов (по иппотке) к существующему зоопарку данных, которые надо хранить.</p>
|
|
26
|
+
<h3 id="Be8d">Как я к этому пришел</h3>
|
|
27
|
+
<p id="xuVl">У меня давно назрела проблема: синхронизировать разные файлы с разных рабочих мест — по крайней мере дома и на работе. Документы (важные), сохранения из игр, книги для читалки. Ну и надёжный архив всего этого добра, потому что терять даже что-то незначительное это боль 🤕.</p>
|
|
28
|
+
<p id="VVdw">Просто положить всё в одно облако — хорошо, но нужен ещё постоянный процесс актуализации. <code>Яндекс Диск</code> работает, <code>Google Drive</code> может изменить условия, <code>Dropbox</code> может внезапно ограничить доступ. Поэтому идея была простая: <strong>хранить копии везде</strong>. <code>Яндекс Диск</code>, <code>Google Drive</code>, <code>Mail.ru Cloud</code>, <code>Dropbox</code> — чем больше, тем надёжнее. Только файлы, только хардкор! </p>
|
|
29
|
+
<p id="nq1A"><br />Раньше я обходился консольным демоном <code>yandex-disk</code> — он работал, но только с Яндексом. Потом перешёл на самописные bash-скрипты, которые вызывали <a href="https://rclone.org/" target="_blank">rclone</a> напрямую. Это работало… до поры до времени. Конфигурация разрасталась, порядок синхронизации был важен (нельзя синкать из пустого облака в другое до того, как туда прилетели файлы) и всякое подобное. Проблема!</p>
|
|
30
|
+
<p id="yxo0">Когда появились нормальные ИИ-ассистенты для кодинга, я решил, что пора пробовать, а мне нужен нормальный инструмент. Declarative configuration, predictable order, automatic error handling и пр. Так родился <a href="https://gitlab.com/kinnalru/syncerman" target="_blank">Syncerman</a>.</p>
|
|
31
|
+
<h3 id="hK4h"><s>Из говна и палок</s> архитектура и технологии</h3>
|
|
32
|
+
<p id="8efP"><code>Syncerman</code> написан на <strong>Go</strong> — выбрал его только за простоту распространения (один бинарник).</p>
|
|
33
|
+
<p id="jtkg">В основе лежит <a href="https://rclone.org/bisync/" target="_blank">rclone bisync</a> — двусторонняя синхронизация с сохранением метаданных. <code>Syncerman</code> не пытается переизобрести колесо синхронизации, а выступает оркестратором над <code>rclone</code>, предоставляя удобный CLI и YAML-конфигурацию. Никаких серверов и БД.</p>
|
|
34
|
+
<h3 id="Hkbu">YAML-конфигурация</h3>
|
|
35
|
+
<p id="PgEt">Вместо папок с ссылками на bash-скрипты — чёткая структура:</p>
|
|
36
|
+
<pre id="USS9" data-lang="yaml">jobs:
|
|
37
|
+
important:
|
|
38
|
+
name: &quot;Важное&quot;
|
|
39
|
+
priority: 10
|
|
40
|
+
tasks:
|
|
41
|
+
- from: &quot;local:/home/jerry/cloud/mirror/Documents&quot;
|
|
42
|
+
to:
|
|
43
|
+
- path: &quot;gdrive:folders/Documents&quot;
|
|
44
|
+
- path: &quot;ydisk:folders/Documents&quot;
|
|
45
|
+
- from: local:Наследие
|
|
46
|
+
to:
|
|
47
|
+
- path: gdrive:Наследие/
|
|
48
|
+
args: [ &quot;--force&quot; ]
|
|
49
|
+
- path: ydisk:Наследие/
|
|
50
|
+
args: [ &quot;--force&quot; ]
|
|
51
|
+
- path: mailru:Наследие/
|
|
52
|
+
args: [ &quot;--force&quot; ]
|
|
53
|
+
|
|
54
|
+
games:
|
|
55
|
+
name: &quot;игрули&quot;
|
|
56
|
+
priority: 20
|
|
57
|
+
tasks:
|
|
58
|
+
- from: &quot;local:games_sync&quot;
|
|
59
|
+
to:
|
|
60
|
+
- path: &quot;ydisk:folders/games_sync&quot;</pre>
|
|
61
|
+
<p id="BSFP">Порядок <strong>tasks</strong> и <strong>to</strong> внутри массивов сохраняется строго. Это критично для цепочек: <code>local → Google Drive → Yandex Disk</code>. Без этого — катастрофа.</p>
|
|
62
|
+
<h3 id="sRPV">Проблемасики</h3>
|
|
63
|
+
<p id="eMgG"><code>rclone bisync</code> требует state-файлы для работы (они лежат где-то в папке пользователя). При первом запуске на новой паре путей он падает с ошибкой <em>&quot;cannot find prior Path1 or Path2 listings&quot;</em>. Syncerman детектирует это по двум паттернам в выводе и автоматически перезапускает синхронизацию с флагом <code>--resync</code>. Пользователь даже не замечает проблемы. Раньше делал руками.</p>
|
|
64
|
+
<p id="imKH">На ранних этапах обнаружился критический баг: из-за использования map в Go порядок выполнения целей был недетерминированным. Для линейных цепочек это катастрофа: если сначала синкать из пустого <code>Yandex</code> в <code>Google</code>, а потом из локальной папки в <code>Google</code> — быть беде. Проблема! Так появились массивы.</p>
|
|
65
|
+
<h3 id="kWCn">Результат</h3>
|
|
66
|
+
<p id="nH30"><a href="https://gitlab.com/kinnalru/syncerman" target="_blank">Syncerman</a> версии **0.3.6** сейчас работает в production — то есть на моих машинах :) Само собой нужны пруфы, и их есть у меня!</p>
|
|
67
|
+
<ul id="rmas">
|
|
68
|
+
<li id="exGG">бинарники для Linux и Windows (сборка сразу подо всё)</li>
|
|
69
|
+
<li id="Mea6">GitLab CI как в лучших домах</li>
|
|
70
|
+
<li id="tbNO">Покрытие тестами - самому было бы лень писать а тут юнит-тесты для всех ключевых пакетов (config, rclone, sync), интеграционные тесты (не просто интеграционные а целые <strong>bash-сценарии с десятком шагов</strong>).</li>
|
|
71
|
+
</ul>
|
|
72
|
+
<p id="uFDI">Публичные репозитории (это мой фетиш):</p>
|
|
73
|
+
<ul id="0Rdg">
|
|
74
|
+
<li id="fqVe">Gitlab <a href="https://gitlab.com/kinnalru/syncerman" target="_blank">https://gitlab.com/kinnalru/syncerman</a></li>
|
|
75
|
+
<li id="QP9Z">Github <a href="https://github.com/kinnalru/syncerman" target="_blank">https://github.com/kinnalru/syncerman</a></li>
|
|
76
|
+
<li id="HGZ3">Gitflic <a href="https://gitflic.ru/project/kinnalru/syncerman" target="_blank">https://gitflic.ru/project/kinnalru/syncerman</a></li>
|
|
77
|
+
<li id="zG5B">Gitverse <a href="https://gitverse.ru/kinnalru/syncerman" target="_blank">https://gitverse.ru/kinnalru/syncerman</a></li>
|
|
78
|
+
</ul>
|
|
79
|
+
<h3 id="gmfZ">Использование</h3>
|
|
80
|
+
<p id="KC8f">Мой <code>crontab</code> выглядит так:</p>
|
|
81
|
+
<pre id="gOCW" data-lang="bash"># Синхронизация документов и сохранений 2 рааз в час и лог для ручной проверки
|
|
82
|
+
10,30 * * * * /bin/sh -lc &quot;cd /home/jerry/cloud/mirror &amp;&amp; syncerman sync 2&gt;&amp;1 | tee ./lastrun.log&quot;</pre>
|
|
83
|
+
<p id="bTiU">Конфигурация зеркалирует локальные папки во все облака (настроенные в <code>rclone</code>) одновременно, а затем синхронизирует облака между собой. Если одно облако отвалится — данные остаются в остальных. Если <code>rclone</code> выдаст <code>first-run</code> ошибку — <code>Syncerman</code> сам всё починит. </p>
|
|
84
|
+
<h3 id="ONVK">Вместо вывода</h3>
|
|
85
|
+
<p id="0EVJ">Появление ИИ-ассистентов снизило порог входа для написания таких инструментов. Раньше мне было лень писать то, что и так работает с помощью пары строк на bash. А сейчас это делаю не я :) — разбор выхлопов <code>rclone</code>, обработка edge cases и тестирование делаются очень легко. Я могу заняться решением проблем (архитектурой и требованиями), а рутина &quot;делается сама&quot;. </p>
|
|
86
|
+
<hr />
|
|
87
|
+
<p id="uKqc">Второй фетиш это ссылочки:</p>
|
|
88
|
+
<ul id="Bf8d">
|
|
89
|
+
<li id="bQjX"><a href="https://rclone.org/bisync/" target="_blank">rclone bisync</a> - это база</li>
|
|
90
|
+
<li id="phUm"><a href="https://github.com/bcpierce00/unison" target="_blank">unison</a> - еще одна классная штука по теме синхронизации, она прочно заняла место в моём сердце, но об это в другой раз</li>
|
|
91
|
+
</ul>
|
|
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 -> Wine -> DxWnd -> Capitalism 2</title>
|
|
99
|
+
<link>https://teletype.in/@jerry_ru/ZtDQsnXWPM5?utm_source=teletype&utm_medium=feed_rss&utm_campaign=jerry_ru</link>
|
|
100
|
+
<description><img src="https://img3.teletype.in/files/66/f8/66f84541-472d-428d-8971-72742d1c7b8b.png"></img>Захотелось поиграть в шикарную старую игрулину моего детства 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
|
+
<p id="mxO8">Захотелось поиграть в шикарную старую игрулину моего детства <a href="https://en.wikipedia.org/wiki/Capitalism_II" target="_blank">Capitalism 2</a>. Захотеть то я захотел, а вот чтоб её запустить пришлось вспомнить свои старые навыки - ведь я Core/Kernel Linux Developer (хоть и в прошлом). Получилось инетресно и позновательно - рекомендую для ознакомления.</p>
|
|
105
|
+
<h2 id="ATun">Шаг первый - установка</h2>
|
|
106
|
+
<p id="uD2Z">Игра очень крутая - используется в универах для обучения экономике, однако выпущена в 2001 под Windows и это большая проблема.</p>
|
|
107
|
+
<p id="VZvg">Находим пыльный диск или качаем с торрентов, ставим себе wine и устанавливаем игру. Ей потребуются зависимости, которые проще всего поставить с помощью <a href="https://gitlab.winehq.org/wine/wine/-/wikis/Winetricks" target="_blank">winetricks</a> - они очень помогают. Зависимости:</p>
|
|
108
|
+
<ul id="BnLK">
|
|
109
|
+
<li id="l7kR">mfc42.dll</li>
|
|
110
|
+
<li id="bN40">шрифты (я ставлю все)</li>
|
|
111
|
+
<li id="4PlB">DirectPlay (без этого сетевая игра по локалочке с друганом не заработает)</li>
|
|
112
|
+
</ul>
|
|
113
|
+
<p id="6SYg">Игра достаточно сложная и я предпочитаю играть в неё с хорошей локализацией, для этого мало поставить русскую версию, надо еще накатить 2 (два) патча с исправлением локализации - ищите их на торрентах.</p>
|
|
114
|
+
<p id="TYcJ">Для запуска надо будет задать локаль:</p>
|
|
115
|
+
<pre id="GAD4" data-lang="shell">LC_ALL=ru_RU.UTF-8 LANG=ru_RU.UTF-8 wine cap2.exe</pre>
|
|
116
|
+
<h3 id="Anqm">Эмуляция CDROM</h3>
|
|
117
|
+
<p id="eZZk">Всё запустится, но не будет работать одиночная игра. Дело в том что если у вас не похаченная версия, то ей нeжен будет CDROM. Его эмуляция делается через <code>winecfg</code> - выбираем Диски, указывам путь к файлам инсталятора, тип ставим CDROM:</p>
|
|
118
|
+
<figure id="xvwx" class="m_original">
|
|
119
|
+
<img src="https://img2.teletype.in/files/57/5d/575dc7fe-a098-452e-81c8-731c41152f94.png" width="542" />
|
|
120
|
+
</figure>
|
|
121
|
+
<p id="d6Dj">Запускаем еще раз и оно работает! На первый взгляд. Но если запустить саму игру то окажется что у неё не перерисовывается экран :( </p>
|
|
122
|
+
<p id="gilF">Это ввергло меня в уныние... Я много и долго тыкал в настройки wine, режимы совместимости, поставил всякие древние версии DirectX и пр. и ничего. Но не зря же я разработчик с 20ти летним стажем?!? Дай, думаю, запущу в оконном режиме. Таких настроек в игре нет, но это не может меня остановить - я перлопатил все файлы игры в поисках конфигов, но не нашел. </p>
|
|
123
|
+
<p id="PKte">После этого я пошел гуглить как заставить игру под виндой работать в оконном режиме и нашел! </p>
|
|
124
|
+
<h2 id="doNY">Шаг второй - DxWnd</h2>
|
|
125
|
+
<section style="background-color:hsl(hsl(0, 0%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
|
|
126
|
+
<p id="MOaO"><strong>DxWnd</strong><br />Window hooker to run fullscreen programs in window and much more...</p>
|
|
127
|
+
<p id="mEpW">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.</p>
|
|
128
|
+
</section>
|
|
129
|
+
<p id="gLH2">Это такая дич которая перехватывает системные вызовы и вызовы к библиотеке DirectX и позволяет надругиваться над ними. </p>
|
|
130
|
+
<p id="btun">Ставим эту волшебную прогу также под wine, запускам и настраиваем запуск Capitalism 2. Мне подошло <code>1440x900 Desktop center</code>, но вы можете указать там что хотите.</p>
|
|
131
|
+
<figure id="fyFG" class="m_original">
|
|
132
|
+
<img src="https://img3.teletype.in/files/a9/62/a962f09d-ea70-41e0-94f7-9aa7c80208c6.png" width="531" />
|
|
133
|
+
</figure>
|
|
134
|
+
<h2 id="PTlp">Шаг третий - пора играть!</h2>
|
|
135
|
+
<p id="Xsy1">И вот, наконец, после прочтения тонны логов и выхлопов из wine, плясок с версиями библиотек, шрифтами, локалями и DirectX, можно наконец.... Лечь спать. Играть буду в другой день :)</p>
|
|
136
|
+
<figure id="52Ua" class="m_original">
|
|
137
|
+
<img src="https://img3.teletype.in/files/66/f8/66f84541-472d-428d-8971-72742d1c7b8b.png" width="1572" />
|
|
138
|
+
</figure>
|
|
139
|
+
<figure id="yqXD" class="m_column">
|
|
140
|
+
<iframe src="data:text/html;charset=utf-8, <head><base target=&#x27;_blank&#x27; /></head> <body><script src=&#x27;https://static.elfsight.com/platform/platform.js&#x27; async></script> <div class=&#x27;elfsight-app-1fd8a750-8313-41db-a2e7-e8f396a33bc1&#x27; data-elfsight-app-lazy></div> </body>"></iframe>
|
|
141
|
+
<figcaption>Мои ссылочки</figcaption>
|
|
142
|
+
</figure>
|
|
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: []
|