automatic 12.2.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.
Files changed (60) hide show
  1. data/Gemfile +23 -0
  2. data/README.md +109 -0
  3. data/Rakefile +42 -0
  4. data/VERSION +1 -0
  5. data/app.rb +15 -0
  6. data/automatic.gemspec +122 -0
  7. data/bin/automatic +15 -0
  8. data/config/default.yml +29 -0
  9. data/config/feed2console.yml +15 -0
  10. data/db/.gitkeep +0 -0
  11. data/doc/COPYING +674 -0
  12. data/doc/ChangeLog +17 -0
  13. data/doc/PLUGINS.ja +205 -0
  14. data/doc/README.ja +449 -0
  15. data/lib/automatic.rb +60 -0
  16. data/lib/automatic/environment.rb +8 -0
  17. data/lib/automatic/feed_parser.rb +36 -0
  18. data/lib/automatic/log.rb +24 -0
  19. data/lib/automatic/pipeline.rb +36 -0
  20. data/lib/automatic/recipe.rb +31 -0
  21. data/lib/config/validator.rb +83 -0
  22. data/plugins/custom_feed/svn_log.rb +56 -0
  23. data/plugins/filter/ignore.rb +60 -0
  24. data/plugins/filter/image.rb +47 -0
  25. data/plugins/filter/tumblr_resize.rb +40 -0
  26. data/plugins/notify/ikachan.rb +85 -0
  27. data/plugins/publish/console.rb +31 -0
  28. data/plugins/publish/google_calendar.rb +86 -0
  29. data/plugins/publish/hatena_bookmark.rb +103 -0
  30. data/plugins/store/full_text.rb +57 -0
  31. data/plugins/store/permalink.rb +47 -0
  32. data/plugins/store/store_database.rb +53 -0
  33. data/plugins/store/target_link.rb +47 -0
  34. data/plugins/subscription/feed.rb +30 -0
  35. data/script/bootstrap +117 -0
  36. data/spec/plugins/custom_feed/svn_log_spec.rb +31 -0
  37. data/spec/plugins/filter/ignore_spec.rb +37 -0
  38. data/spec/plugins/filter/image_spec.rb +55 -0
  39. data/spec/plugins/filter/tumblr_resize_spec.rb +102 -0
  40. data/spec/plugins/notify/ikachan_spec.rb +28 -0
  41. data/spec/plugins/publish/console_spec.rb +24 -0
  42. data/spec/plugins/publish/google_calendar_spec.rb +82 -0
  43. data/spec/plugins/publish/hatena_bookmark_spec.rb +36 -0
  44. data/spec/plugins/store/full_text_spec.rb +39 -0
  45. data/spec/plugins/store/permalink_spec.rb +39 -0
  46. data/spec/plugins/store/target_link_spec.rb +30 -0
  47. data/spec/plugins/subscription/feed_spec.rb +36 -0
  48. data/spec/spec_helper.rb +82 -0
  49. data/test/integration/test_activerecord.yml +24 -0
  50. data/test/integration/test_fulltext.yml +24 -0
  51. data/test/integration/test_hatenabookmark.yml +26 -0
  52. data/test/integration/test_ignore.yml +22 -0
  53. data/test/integration/test_ignore2.yml +25 -0
  54. data/test/integration/test_image2local.yml +26 -0
  55. data/test/integration/test_svnlog.yml +14 -0
  56. data/test/integration/test_tumblr2local.yml +26 -0
  57. data/utils/auto_discovery.rb +18 -0
  58. data/utils/opml_parser.rb +247 -0
  59. data/vendor/.gitkeep +0 -0
  60. metadata +205 -0
data/doc/ChangeLog ADDED
@@ -0,0 +1,17 @@
1
+ === 12.02.1 / 2012-02-25
2
+
3
+ * Point release
4
+
5
+ * Big Refactoring for core.
6
+ * Reorganization of the namespace.
7
+ * A few plugins added.
8
+
9
+
10
+ === 12.02 / 2012-02-18
11
+
12
+ * First release
13
+
14
+ * Scratch of this script.
15
+ * Plugin existing only for hatenabookmark.
16
+
17
+
data/doc/PLUGINS.ja ADDED
@@ -0,0 +1,205 @@
1
+ ================
2
+ プラグインの説明
3
+ ================
4
+
5
+ SubscriptionFeed
6
+ ----------------
7
+ [パス]
8
+ /plugins/subscription/feed.rb
9
+
10
+ [概要]
11
+ フィードを購読する
12
+
13
+ [レシピ記法]
14
+ - module: SubscriptionFeed
15
+ config:
16
+ feeds:
17
+ - フィード名
18
+ - フィード名 ...
19
+
20
+
21
+ FilterIgnore
22
+ ------------
23
+ [パス]
24
+ /plugins/filter/ignore.rb
25
+
26
+ [概要]
27
+ NG ワードを除外する
28
+
29
+ [レシピ記法]
30
+ - module: FilterIgnore
31
+ config:
32
+ exclude:
33
+ - 無視キーワード
34
+ - 無視キーワード ...
35
+
36
+
37
+ FilterImage
38
+ ------------
39
+ [パス]
40
+ /plugins/filter/image.rb
41
+
42
+ [概要]
43
+ パーマリンクを本文中の画像のリンクに書き換える
44
+ 画像のリンクが無い場合は nil にする
45
+
46
+ [レシピ記法]
47
+ - module: FilterImage
48
+
49
+
50
+ FilterTumblrResize
51
+ --------------------
52
+ [パス]
53
+ /plugins/filter/tumblr_resize.rb
54
+
55
+ [概要]
56
+ パーマリンクを Tumblr の最大サイズ
57
+ (High Res) に書き換える
58
+
59
+ [前提]
60
+ パーマリンクが画像リンクに書き換え済であること
61
+
62
+ [レシピ記法]
63
+ - module: FilterTumblrResize
64
+
65
+
66
+ StorePermalink
67
+ --------------
68
+ [パス]
69
+ /plugins/store/permalink.rb
70
+
71
+ [概要]
72
+ パーマリンクを保存する
73
+ 重複したパーマリンクは破棄する
74
+
75
+ [レシピ記法]
76
+ - module: StoreBookmark
77
+ config:
78
+ db: ブックマークを保存する SQLite3 DB 名
79
+
80
+
81
+ StoreFullText
82
+ -------------
83
+ [パス]
84
+ /plugins/store/full_text.rb
85
+
86
+ [概要]
87
+ フィード全文を DB に保存する
88
+
89
+ 保存した DB は以下のビューワでも閲覧できる
90
+ https://github.com/id774/blog_viewer
91
+
92
+ [レシピ記法]
93
+ - module: StoreFullText
94
+ config:
95
+ db: SQLite3 DB 名
96
+
97
+
98
+ StoreTargetLink
99
+ --------------
100
+ [パス]
101
+ /plugins/store/target_link.rb
102
+
103
+ [概要]
104
+ リンク先のコンテンツをローカルに保存する
105
+
106
+ [レシピ記法]
107
+ - module: StoreTargetLink
108
+ config:
109
+ path: 保存先のフォルダ
110
+ interval: 保存する間隔 (秒)
111
+
112
+
113
+ PublishConsole
114
+ ------------
115
+ [パス]
116
+ /plugins/publish/console.rb
117
+
118
+ [概要]
119
+ パイプラインをコンソールに出力する
120
+
121
+ [レシピ記法]
122
+ - module: PublishConsole
123
+
124
+
125
+ PublishHatenaBookmark
126
+ ---------------------
127
+ [パス]
128
+ /plugins/publish/hatenabookmark.rb
129
+
130
+ [概要]
131
+ はてなブックマークをする
132
+
133
+ [説明]
134
+ はてなブックマーク API への投稿用 XML を生成し
135
+ 送信する
136
+
137
+ [レシピ記法]
138
+ - module: AutoBookmark
139
+ config:
140
+ username: はてな ID
141
+ passowrd: パスワード
142
+ interval: はてブする間隔 (秒)
143
+
144
+
145
+ PublishGoogleCalendar
146
+ ---------------------
147
+ [パス]
148
+ /plugins/publish/google_calendar.rb
149
+
150
+ [概要]
151
+ Google Calendar に予定を登録する
152
+
153
+ [説明]
154
+ item.title を当日の Google カレンダーに
155
+ 登録する
156
+
157
+ [レシピ記法]
158
+ - module: PublishGoogleCalendar
159
+ config:
160
+ username: Google メールアドレス
161
+ password: パスワード
162
+ interval: 複数の予定の投稿間隔 (秒)
163
+
164
+
165
+ NotifyIkachan
166
+ -------------
167
+ [パス]
168
+ /plugins/notify/ikachan.rb
169
+
170
+ [概要]
171
+ ikachan へメッセージを送信する
172
+
173
+ [説明]
174
+ ikachan へ HTTP 経由で POST する
175
+ ikachan とは: http://blog.yappo.jp/yappo/archives/000760.html
176
+
177
+ [レシピ記法]
178
+ - module: NotifyIkachan
179
+ config:
180
+ url: http://sample.com
181
+ port: 4979 # ポート番号、デフォルトは 4979
182
+ channels: foo,bar,#baz # '#' はあってもなくても自動的につけられる、複数は','で指定
183
+ command: notice # privmsg や notice など
184
+ interval: 5 # ポストする間隔 (秒)
185
+
186
+
187
+ CustomFeedSVNLog
188
+ ----------------
189
+ [パス]
190
+ /plugins/custom/feed_svn_log.rb
191
+
192
+ [概要]
193
+ SVN から新しいリビジョン情報を取得する
194
+
195
+ [説明]
196
+ target で指定された URL から SVN のコミット情報を
197
+ fetch_items で指定された数だけ取得する
198
+
199
+ [レシピ記法]
200
+ - module: CustomFeedSVNLog
201
+ config:
202
+ target: http://redmine.rubyforge.org/svn
203
+ fetch_items: 2 # 指定されない場合は 30
204
+
205
+
data/doc/README.ja ADDED
@@ -0,0 +1,449 @@
1
+ automaticruby
2
+
3
+ 名前
4
+ automaticruby - Ruby による汎用的な自動処理フレームワーク
5
+
6
+ 書式
7
+ $ bin/automatic
8
+
9
+ 任意のレシピを指定して起動する
10
+ $ bin/automatic -c <recipe>
11
+
12
+ バージョン番号を表示する
13
+ $ bin/automatic -v
14
+
15
+ 説明
16
+ このソフトウェアは、プラガブルに機能を拡張可能な Ruby
17
+ による汎用自動処理フレームワークである。
18
+ プラグインによってさまざまな情報を収集加工し、任意の
19
+ 形で出力することができる。
20
+
21
+
22
+ ============
23
+ インストール
24
+ ============
25
+
26
+ 本ソフトウェアを GitHub がらダウンロードする。
27
+ $ git clone git://github.com/id774/automaticruby.git
28
+
29
+
30
+ ruby 1.9 の場合
31
+ $ script/bootstrap
32
+
33
+ ruby 1.8 の場合
34
+ Gemfile にある必要な gem を手動でインストールする
35
+
36
+
37
+ 任意のレシピ (後述) を作成する。
38
+ $ bin/automatic -c your_recipe.yml
39
+
40
+ -c オプション付きで手動実行し、問題がなければ
41
+ cron に登録するなどして自動化する。
42
+
43
+
44
+ ============
45
+ 実行してみる
46
+ ============
47
+
48
+ 試しに実行するなら config/feed2console.yml
49
+ を利用すると良い。
50
+
51
+ $ bin/automatic -c config/feed2console.yml
52
+
53
+ これは、ブログのフィードを単純にコンソール出力するだけの
54
+ 簡単なレシピである。
55
+ 本ソフトウェアの動作確認に使うことができる。
56
+
57
+
58
+ ==========================
59
+ ディレクトリとファイル構成
60
+ ==========================
61
+ .
62
+ |
63
+ +- bin
64
+ | |
65
+ | +- automatic
66
+ | 実行ファイル本体
67
+ |
68
+ +- config
69
+ | |
70
+ | +- default.yml
71
+ | デフォルトでロードされるレシピ
72
+ | YAML 形式でプラグインの情報を記述する
73
+ | automatic.rb の -c オプションの引数で
74
+ | 任意のファイル名をレシピとして指定できる
75
+ |
76
+ | 新しくレシピを書いた場合は config ディレクトリに置く
77
+ |
78
+ |
79
+ +- plugins
80
+ | |
81
+ | +- subscription フィードを購読するプラグイン
82
+ | |
83
+ | +- filter 情報をフィルタリングするプラグイン
84
+ | |
85
+ | +- store 情報を内部に保存するプラグイン
86
+ | |
87
+ | +- publish 外部に情報を送信するプラグイン
88
+ |
89
+ | プラグインを開発した場合は plugins ディレクトリに置く
90
+ |
91
+ |
92
+ +- lib
93
+ | |
94
+ | +- automatic.rb
95
+ | | Automatic モジュールの定義をする
96
+ | |
97
+ | +- automatic
98
+ | | |
99
+ | | +- environment.rb
100
+ | | | 環境情報を読み込む
101
+ | | |
102
+ | | +- pipeline.rb
103
+ | | | パイプラインと呼ばれるオブジェクトを利用し
104
+ | | | レシピに書かれたプラグインに処理を順次受け渡す
105
+ | | |
106
+ | | +- feed_parser.rb
107
+ | | | フィードを解析する
108
+ | | |
109
+ | | +- log.rb
110
+ | | | ログを出力する
111
+ | | |
112
+ | | +- recipe.rb
113
+ | | レシピを読み込む
114
+ | |
115
+ | +- config
116
+ |
117
+ +- db
118
+ | |
119
+ | +- permalink.db
120
+ | Store::Permalink プラグインで収集された
121
+ | ブックマークが保存される
122
+ |
123
+ +- script
124
+ | |
125
+ | +- bootstrap
126
+ | bundle install 等の環境設定をおこなう
127
+ | (ruby 1.9 以上のみ)
128
+ |
129
+ +- utils
130
+ | 補助的なツールのためのディレクトリ
131
+ |
132
+ +- spec
133
+ | ユニットテスト用ディレクトリ
134
+ |
135
+ +- test
136
+ | |
137
+ | +- integration
138
+ | インテグレーションテスト用ディレクトリ
139
+ |
140
+ +- vendor
141
+ | |
142
+ | +- gems
143
+ | bundle install された gem パッケージ
144
+ |
145
+ +- doc
146
+ |
147
+ +- COPYING
148
+ | 本ソフトウェアのライセンス
149
+ |
150
+ +- PLUGINS.ja
151
+ | プラグインについてのドキュメント
152
+ |
153
+ +- README.ja
154
+ 本ドキュメント
155
+
156
+
157
+ ==========
158
+ レシピとは
159
+ ==========
160
+
161
+ Automatic Ruby では YAML 形式で書かれた設定ファイル
162
+ を解析し、呼び出すプラグインの情報とそれに伴う様々な
163
+ 情報を読み込む。
164
+
165
+ この YAML ファイルをレシピと呼ぶ。
166
+
167
+ automatic.rb 起動時に -c オプションの引数にレシピの
168
+ ファイル名を指定することができる。オプションが省略
169
+ された場合は config/default.yml が呼ばれる。
170
+
171
+ [起動例]
172
+ $ bin/automatic -c ~/recipes/your_recipe.yml
173
+
174
+
175
+ ================
176
+ レシピの記述方法
177
+ ================
178
+
179
+ レシピには暗黙的な命名規則がある。
180
+ 以下はレシピのサンプルとなる YAML ファイルである。
181
+
182
+ global:
183
+ timezone: Asia/Tokyo
184
+ cache:
185
+ base: /tmp
186
+ log:
187
+ level: info
188
+
189
+ plugins:
190
+ - module: SubscriptionFeed
191
+ config:
192
+ feeds:
193
+ - http://example.com/rss2
194
+ - http://hogefuga.com/feed
195
+
196
+ - module: FilterIgnore
197
+ config:
198
+ link:
199
+ - hoge
200
+ - fuga
201
+
202
+ - module: StorePermalink
203
+ config:
204
+ db: permalink.db
205
+
206
+ - module: PublishHatenaBookmark
207
+ config:
208
+ username: your_hatena_id
209
+ password: your_password
210
+ interval: 5
211
+
212
+ このサンプルレシピの例では
213
+ 1. フィードを購読し
214
+ 2. 無視キーワードを含む URL を除外し
215
+ 3. パーマリンクをデータベースに保存し
216
+ 4. はてなブックマークをする
217
+ という一連の処理をプラグインの組み合わせで実現している。
218
+
219
+ このように、プラグインと設定情報をレシピに記述するだけで
220
+ 複数のプラグインの組み合わせにより自由な処理を実現できる。
221
+
222
+ たとえば Twitter に投稿する Publish::Twitter プラグインを
223
+ 作成し上記のレシピに記述すれば、自動的に記事を Twitter に
224
+ 投稿する自動処理が完成する。
225
+
226
+ Gmail に送信する Publish::Gmail プラグインを作成しレシピ
227
+ に追加すれば、フィードの記事を Gmail で読めるようになる。
228
+
229
+ 他にもリンクを元にブログ記事全文を取得したり、電子書籍の
230
+ 形式にして Kindle で読めるようにしたり、データベースに
231
+ ブログ記事全文を保存してローカルのアプリで読めるように
232
+ したりなど、プラグインの組み合わせ次第で無限の可能性を
233
+ 実現することができる。
234
+
235
+
236
+
237
+ ==============
238
+ 開発に参加する
239
+ ==============
240
+
241
+ リポジトリ
242
+ https://github.com/id774/automaticruby
243
+
244
+ 課題
245
+ https://github.com/id774/automaticruby/issues
246
+
247
+ CI
248
+ http://id774.net/jenkins/
249
+
250
+
251
+ プラグインを新しく作ったり、あるいはフレームワークを
252
+ 改善してくれるなら、以下の手順で開発に参加できる。
253
+
254
+ 1. GitHub でリポジトリをフォークする。
255
+ 2. プラグインを新しく作ったりする。
256
+ 3. Pull Request を送信する。
257
+
258
+ なんらかの貢献があった場合、少しの修正を迅速におこなうために
259
+ コミット権を配布する。
260
+
261
+
262
+ ================
263
+ コーディング規約
264
+ ================
265
+
266
+ 2 タブ (ソフトタブ)
267
+ 末尾のスペースは除去
268
+ 名前空間は既存のコードを参照
269
+ {} は do end より推奨される
270
+ RDoc ヘッダはファイルの作者によって書かれる
271
+ RSPec でテストを書く
272
+ カバレッジ 100% を目指す
273
+
274
+
275
+ ==================
276
+ プラグインの作り方
277
+ ==================
278
+
279
+ たとえば自動処理した何らかの情報を Twitter に投稿したい。
280
+
281
+ このようなときは Publish::Twitter プラグインを作れば良い。
282
+
283
+ 実装方法については後述するが、基本的には Twitter の API に
284
+ 投稿するだけの簡単な Ruby スクリプトを作るだけである。
285
+
286
+ レシピはこのようになるだろう。
287
+
288
+ - module: PublishTwitter
289
+ config:
290
+ username: your_mail_address
291
+ password: your_password
292
+
293
+ この場合、ファイルを plugins/publish 配下に置き、クラス名
294
+ はレシピで指定した PublishTwitter とする。あとは後述する
295
+ Automatic::Pipeline の機能により自動的に処理される。
296
+
297
+
298
+ ========================
299
+ Automatic::Pipeline とは
300
+ ========================
301
+
302
+ 本フレームワークはレシピを YAML で解析し、プラグインを
303
+ 順次読み込む。このとき pipeline がインスタンス生成時の
304
+ 引数として渡され、戻り値は pipeline に戻る。
305
+
306
+ コードは以下の通りである。
307
+
308
+ pipeline = []
309
+ recipe.each_plugin { |plugin|
310
+ load_plugin(plugin.module)
311
+ klass = Automatic::Plugin.const_get(plugin.module)
312
+ pipeline = klass.new(plugin.config, pipeline).run
313
+ }
314
+
315
+ プラグイン間での連続した pipeline の受け渡しにより
316
+ 処理要素を直列に連結し、あるプラグインの出力が次の
317
+ プラグインの入力となるパイプライン処理を実現する。
318
+
319
+ この機構を本フレームワークでは Automatic::Pipeline と呼ぶ。
320
+
321
+
322
+ ====================
323
+ プラグインの実装規約
324
+ ====================
325
+
326
+ プラグインのコンストラクタは YAML.load によってロード
327
+ されたハッシュの配列、及びパイプラインと呼ばれる
328
+ インスタンス変数のオブジェクトを引数に取る。
329
+
330
+ 推奨されるコンストラクタの実装例は以下の通りである。
331
+
332
+ def initialize(config, pipeline=[])
333
+ @config = config
334
+ @pipeline = pipeline
335
+ end
336
+
337
+ インスタンスメソッド run が自動的に呼ばれる。
338
+ 戻り値はインスタンス変数 @pipeline に渡り、レシピで
339
+ 定義された次のプラグインに引き渡される。
340
+
341
+
342
+ ==============
343
+ ユニットテスト
344
+ ==============
345
+
346
+ ユニットテストは RSpec でおこなう。
347
+
348
+ プラグインのテストは、引数となるパイプラインを渡し
349
+ 戻り値を検査する。
350
+
351
+
352
+ ========================
353
+ 継続的インテグレーション
354
+ ========================
355
+
356
+ CI は Jenkins でおこなう。
357
+ http://id774.net/jenkins/
358
+
359
+
360
+ ========
361
+ 結合試験
362
+ ========
363
+
364
+ test/integration 配下に複数のレシピを結合して
365
+ テストをおこなうためのレシピを置く。
366
+
367
+
368
+
369
+ ================
370
+ プラグインの説明
371
+ ================
372
+
373
+ doc/PLUGINS.ja を参照
374
+
375
+
376
+
377
+ ====================
378
+ その他のツールの説明
379
+ ====================
380
+
381
+ utils の下にはフィードを扱うための補助的なツールが
382
+ 置かれる。内容は以下のとおりである。
383
+
384
+
385
+ 名前
386
+ utils/opml_parser.rb
387
+
388
+ 説明
389
+ 既存の RSS Reader の OPML から登録済みフィードの
390
+ URL リストを抽出するのに使う。
391
+
392
+ $ ruby opml_parser.rb > feeds.txt
393
+
394
+
395
+ 名前
396
+ utils/auto_discovery.rb
397
+
398
+ 説明
399
+ 引数に指定した URL から購読対象のフィードを
400
+ オートディスカバリで抽出する。
401
+
402
+ $ ruby auto_discovery.rb "https://twitter.com/twitt"
403
+ ["https://twitter.com/statuses/user_timeline/4441691.rss",
404
+ "https://twitter.com/favorites/4441691.rss"]
405
+
406
+
407
+
408
+ ========
409
+ 更新履歴
410
+ ========
411
+
412
+ doc/ChangeLog を参照
413
+
414
+
415
+ ====
416
+ TODO
417
+ ====
418
+
419
+ GitHub の issues を参照
420
+ https://github.com/id774/automaticruby/issues
421
+
422
+
423
+ ========
424
+ 動作環境
425
+ ========
426
+
427
+ Ruby 1.8 以降
428
+
429
+
430
+ 以下の gem パッケージに依存
431
+
432
+ sqlite3
433
+ activesupport
434
+ hashie
435
+ activerecord
436
+ gcalapi
437
+ xml-simple
438
+
439
+ 詳細は Gemfile を参照
440
+
441
+
442
+ ========
443
+ 注意事項
444
+ ========
445
+
446
+ 過剰なスクレイピング等を避け、常識の範囲の利用に留める。
447
+ 本ソフトウェアは GPLv3 ライセンスである。
448
+
449
+