automatic 12.2.1

Sign up to get free protection for your applications and to get access to all the features.
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
+