fragile 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +9 -3
- data/examples/example.rb +28 -10
- data/lib/fragile/application.rb +12 -17
- data/lib/fragile/pipeline.rb +3 -2
- data/{examples/plugins/foo.rb → lib/fragile/plugin/console_output.rb} +6 -3
- data/lib/fragile/plugin/mail_output.rb +50 -0
- data/lib/fragile/plugin/map_filter.rb +18 -0
- data/lib/fragile/plugin/rss_input.rb +21 -0
- data/lib/fragile/plugin/select_filter.rb +18 -0
- data/lib/fragile/plugin_manager.rb +0 -17
- data/lib/fragile/version.rb +2 -2
- data/test/dsl_test.rb +0 -3
- data/test/pipeline_manager_test.rb +0 -3
- data/test/pipeline_test.rb +0 -3
- data/test/plugin_manager_test.rb +6 -45
- data/test/test_helper.rb +3 -0
- metadata +7 -5
- data/examples/plugins/bar.rb +0 -14
- data/examples/plugins/hoge.rb +0 -13
data/README.md
CHANGED
@@ -28,11 +28,17 @@ $ fragile -f recipe/example.rb
|
|
28
28
|
|
29
29
|
##What is Recipe?
|
30
30
|
|
31
|
+
The "Recipe" is ruby script.
|
32
|
+
|
31
33
|
```ruby
|
34
|
+
require "fragile/plugin/rss_input"
|
35
|
+
require "fragile/plugin/select_filter"
|
36
|
+
require "fragile/plugin/console_output"
|
37
|
+
|
32
38
|
pipeline "foobar" do
|
33
|
-
use "
|
34
|
-
use "
|
35
|
-
use "
|
39
|
+
use "rss_input", :url => "http://d.hatena.ne.jp/griefworker/rss"
|
40
|
+
use "select_filter", :proc => lambda{|x| x[:title].include?("[Ruby]")}
|
41
|
+
use "console_output"
|
36
42
|
end
|
37
43
|
```
|
38
44
|
|
data/examples/example.rb
CHANGED
@@ -1,15 +1,33 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
1
|
+
# coding: utf-8
|
2
|
+
require "fragile/plugin/rss_input"
|
3
|
+
require "fragile/plugin/select_filter"
|
4
|
+
require "fragile/plugin/map_filter"
|
5
|
+
require "fragile/plugin/console_output"
|
6
|
+
require "fragile/plugin/mail_output"
|
7
|
+
|
8
|
+
pipeline :console_sample do
|
9
|
+
retry_count 4
|
10
|
+
|
11
|
+
use :rss_input, :url => "http://d.hatena.ne.jp/griefworker/rss"
|
12
|
+
use :select_filter, :proc => lambda{|x| x[:title].include?("[Ruby]")}
|
13
|
+
use :map_filter, :proc => lambda{|x| x[:title] = x[:title].encode("UTF-8")}
|
14
|
+
use :console_output
|
6
15
|
end
|
7
16
|
|
8
|
-
pipeline :
|
9
|
-
retry_count
|
17
|
+
pipeline :mail_sample do
|
18
|
+
retry_count 4
|
10
19
|
|
11
|
-
use :
|
12
|
-
use :
|
13
|
-
use :
|
20
|
+
use :rss_input, :url => "http://d.hatena.ne.jp/griefworker/rss"
|
21
|
+
use :select_filter, :proc => lambda{|x| x[:title].include?("[Ruby]")}
|
22
|
+
use :mail_output, {
|
23
|
+
:port => 587,
|
24
|
+
:helo_domain => "gmail.com",
|
25
|
+
:auth_type => :login,
|
26
|
+
:smtp => "smtp.gmail.com",
|
27
|
+
:account => "yourname@gmail.com",
|
28
|
+
:password => "password",
|
29
|
+
:from => "from@example.com",
|
30
|
+
:to => "to@example.com"
|
31
|
+
}
|
14
32
|
end
|
15
33
|
|
data/lib/fragile/application.rb
CHANGED
@@ -26,33 +26,28 @@ module Fragile
|
|
26
26
|
|
27
27
|
def run
|
28
28
|
handle_options
|
29
|
-
load_plugins
|
30
29
|
load_recipe_file
|
31
30
|
run_pipeline(ARGV)
|
32
31
|
end
|
33
32
|
|
34
33
|
def load_recipe_file
|
35
34
|
load @recipe_file
|
35
|
+
self.logger.info "#{@recipe_file} was loaded."
|
36
36
|
end
|
37
37
|
|
38
38
|
def handle_options
|
39
|
-
opts = OptionParser.new
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
39
|
+
opts = OptionParser.new do |opts|
|
40
|
+
opts.version = Fragile::VERSION
|
41
|
+
opts.banner = "fragile [-f RECIPE_FILE] {options} targets..."
|
42
|
+
opts.separator ""
|
43
|
+
opts.separator "Options are ..."
|
44
|
+
opts.on_tail("-h", "--help", "-H", "Display this help message.") do
|
45
|
+
puts opts
|
46
|
+
exit
|
47
|
+
end
|
48
|
+
opts.on("-f", "--recipefile=RECIPE_FILE", "Recipe file path"){|v| @recipe_file = v}
|
49
|
+
opts.on("-V", "--verbose", "Show detail log"){|v| @logger.level = Logger::DEBUG}
|
47
50
|
end
|
48
|
-
opts.on("-f", "--recipefile=RECIPE_FILE", "Recipe file path") { |v|
|
49
|
-
@recipe_file = v
|
50
|
-
@plugin_dir ||= File.join(File::expand_path(File.dirname(@recipe_file)), "plugins")
|
51
|
-
}
|
52
|
-
opts.on("-p", "--plugindir=plugin_dir", "Plugin directory") { |v|
|
53
|
-
@plugin_dir = File::expand_path(v)
|
54
|
-
}
|
55
|
-
opts.on("-V", "--verbose", "Show detail log") { |v| @logger.level = Logger::DEBUG }
|
56
51
|
opts.parse!(ARGV)
|
57
52
|
|
58
53
|
unless 0 < ARGV.count
|
data/lib/fragile/pipeline.rb
CHANGED
@@ -28,7 +28,7 @@ module Fragile
|
|
28
28
|
end
|
29
29
|
|
30
30
|
def run
|
31
|
-
data =
|
31
|
+
data = []
|
32
32
|
@plugins.each do |plugin|
|
33
33
|
retry_handler do
|
34
34
|
data = plugin.call(data)
|
@@ -41,7 +41,8 @@ module Fragile
|
|
41
41
|
count = 0
|
42
42
|
begin
|
43
43
|
block.call
|
44
|
-
rescue
|
44
|
+
rescue => ex
|
45
|
+
Fragile.logger.error(ex)
|
45
46
|
if @retry_count < count
|
46
47
|
raise PipelineError.new("retry over error.")
|
47
48
|
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
require "date"
|
3
|
+
require "securerandom"
|
4
|
+
require "net/smtp"
|
5
|
+
|
6
|
+
module Fragile
|
7
|
+
module Plugin
|
8
|
+
class MailOutput
|
9
|
+
def initialize(config)
|
10
|
+
@port = config[:port] || 25
|
11
|
+
@helo_domain = config[:helo_domain] || "localhost"
|
12
|
+
@auth_type = config[:auth_type] || :plain
|
13
|
+
@smtp = config[:smtp]
|
14
|
+
@ssl = config[:ssl] || true
|
15
|
+
@account = config[:account]
|
16
|
+
@password = config[:password]
|
17
|
+
@from = config[:from]
|
18
|
+
@to = config[:to]
|
19
|
+
@subject = config[:subject]
|
20
|
+
end
|
21
|
+
|
22
|
+
def call(data=[])
|
23
|
+
message = create_mesage(data)
|
24
|
+
send_mail(message)
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
def create_mesage(data)
|
29
|
+
message = <<-EOM
|
30
|
+
From: <#{@from}>
|
31
|
+
To: <#{@to}>
|
32
|
+
Subject: #{@subject}
|
33
|
+
Date: #{Date.today}
|
34
|
+
Message-Id: #{SecureRandom.uuid}@localhost
|
35
|
+
|
36
|
+
EOM
|
37
|
+
message += data.join("\n")
|
38
|
+
end
|
39
|
+
|
40
|
+
def send_mail(message)
|
41
|
+
@smtp = Net::SMTP.new(@smtp, @port)
|
42
|
+
@smtp.enable_starttls if @ssl
|
43
|
+
@smtp.start(@helo_domain, @account, @password, @auth_type) do |smtp|
|
44
|
+
smtp.send_message(message, @from, @to)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
require "rss"
|
3
|
+
|
4
|
+
module Fragile
|
5
|
+
module Plugin
|
6
|
+
class RssInput
|
7
|
+
def initialize(config)
|
8
|
+
@url = config[:url]
|
9
|
+
end
|
10
|
+
|
11
|
+
def call(data=[])
|
12
|
+
rss = RSS::Parser.parse(@url)
|
13
|
+
urls = rss.items.map do |item|
|
14
|
+
{ :title => item.title, :link => item.link }
|
15
|
+
end
|
16
|
+
data + urls
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
@@ -13,23 +13,6 @@ module Fragile
|
|
13
13
|
end
|
14
14
|
|
15
15
|
module PluginManager
|
16
|
-
attr_accessor :plugin_dir
|
17
|
-
|
18
|
-
def load_plugins
|
19
|
-
Fragile.logger.info "plugin_dir is '#{@plugin_dir}'."
|
20
|
-
unless Dir.exist?(@plugin_dir)
|
21
|
-
Fragile.logger.warn "'#{@plugin_dir}' is not exist."
|
22
|
-
return
|
23
|
-
end
|
24
|
-
|
25
|
-
pattern = File.join(@plugin_dir, "*.rb")
|
26
|
-
Fragile.logger.info "pattern is '#{pattern}'."
|
27
|
-
Dir.glob(pattern) do |path|
|
28
|
-
load path
|
29
|
-
Fragile.logger.info "'#{path}' is loaded."
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
16
|
def create_plugin(plugin, config)
|
34
17
|
if plugin.instance_of?(Class)
|
35
18
|
# クラスなら直接 new する
|
data/lib/fragile/version.rb
CHANGED
@@ -2,10 +2,10 @@
|
|
2
2
|
# Name:: Fragile
|
3
3
|
# Author:: tnakamura <http://d.hatena.ne.jp/griefworker>
|
4
4
|
# Created:: Jun 15, 2012
|
5
|
-
# Updated:: Jun
|
5
|
+
# Updated:: Jun 23, 2012
|
6
6
|
# Copyright:: tnakamura Copyright (c) 2012
|
7
7
|
# License:: Licensed under the MIT LICENSE.
|
8
8
|
|
9
9
|
module Fragile
|
10
|
-
VERSION = "0.0.
|
10
|
+
VERSION = "0.0.3"
|
11
11
|
end
|
data/test/dsl_test.rb
CHANGED
data/test/pipeline_test.rb
CHANGED
data/test/plugin_manager_test.rb
CHANGED
@@ -1,15 +1,8 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
require_relative "test_helper"
|
3
|
-
require "minitest/spec"
|
4
|
-
require "minitest/autorun"
|
5
|
-
require "fragile"
|
6
3
|
|
7
4
|
class TestApp
|
8
5
|
include Fragile::PluginManager
|
9
|
-
|
10
|
-
def initialize(plugin_dir)
|
11
|
-
@plugin_dir = plugin_dir
|
12
|
-
end
|
13
6
|
end
|
14
7
|
|
15
8
|
module Fragile::Plugin
|
@@ -24,26 +17,10 @@ module Fragile::Plugin
|
|
24
17
|
end
|
25
18
|
|
26
19
|
describe "PluginManager" do
|
27
|
-
describe "#load_plugins" do
|
28
|
-
describe "プラグインディレクトリが存在するとき" do
|
29
|
-
before do
|
30
|
-
@plugin_dir = File.join(File.dirname(__FILE__), "../examples/plugins")
|
31
|
-
@manager = TestApp.new(@plugin_dir)
|
32
|
-
end
|
33
|
-
|
34
|
-
it "プラグインをロードできるべき" do
|
35
|
-
@manager.load_plugins
|
36
|
-
Fragile::Plugin.const_get("Foo")
|
37
|
-
pass
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
20
|
describe "#create_plugin" do
|
43
21
|
describe "クラスを指定したとき" do
|
44
22
|
before do
|
45
|
-
@
|
46
|
-
@manager = TestApp.new(@plugin_dir)
|
23
|
+
@manager = TestApp.new
|
47
24
|
end
|
48
25
|
|
49
26
|
it "プラグインのインスタンスを生成できるべき" do
|
@@ -54,8 +31,7 @@ describe "PluginManager" do
|
|
54
31
|
|
55
32
|
describe "存在しないプラグイン名を指定したとき" do
|
56
33
|
before do
|
57
|
-
@
|
58
|
-
@manager = TestApp.new(@plugin_dir)
|
34
|
+
@manager = TestApp.new
|
59
35
|
end
|
60
36
|
|
61
37
|
it "NameError が発生するべき" do
|
@@ -67,28 +43,13 @@ describe "PluginManager" do
|
|
67
43
|
|
68
44
|
describe "存在するプラグイン名を指定したとき" do
|
69
45
|
before do
|
70
|
-
@
|
71
|
-
|
72
|
-
@manager.load_plugins
|
46
|
+
@manager = TestApp.new
|
47
|
+
require "fragile/plugin/console_output"
|
73
48
|
end
|
74
49
|
|
75
50
|
it "プラグインのインスタンスを生成できるべき" do
|
76
|
-
obj = @manager.create_plugin(
|
77
|
-
assert_equal Fragile::Plugin::
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
describe "プラグインディレクトリが存在しないとき" do
|
82
|
-
before do
|
83
|
-
@plugin_dir = File.join(File.dirname(__FILE__), "not_exist")
|
84
|
-
@manager = TestApp.new(@plugin_dir)
|
85
|
-
end
|
86
|
-
|
87
|
-
it "何もしないべき" do
|
88
|
-
@manager.load_plugins
|
89
|
-
assert_raises NameError do
|
90
|
-
Fragile::Plugin.const_get("Foo")
|
91
|
-
end
|
51
|
+
obj = @manager.create_plugin(:console_output, {})
|
52
|
+
assert_equal Fragile::Plugin::ConsoleOutput, obj.class
|
92
53
|
end
|
93
54
|
end
|
94
55
|
end
|
data/test/test_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fragile
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-06-
|
12
|
+
date: 2012-06-23 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: Ruby Pipeline Framework
|
15
15
|
email:
|
@@ -26,15 +26,17 @@ files:
|
|
26
26
|
- Rakefile
|
27
27
|
- bin/fragile
|
28
28
|
- examples/example.rb
|
29
|
-
- examples/plugins/bar.rb
|
30
|
-
- examples/plugins/foo.rb
|
31
|
-
- examples/plugins/hoge.rb
|
32
29
|
- fragile.gemspec
|
33
30
|
- lib/fragile.rb
|
34
31
|
- lib/fragile/application.rb
|
35
32
|
- lib/fragile/dsl.rb
|
36
33
|
- lib/fragile/pipeline.rb
|
37
34
|
- lib/fragile/pipeline_manager.rb
|
35
|
+
- lib/fragile/plugin/console_output.rb
|
36
|
+
- lib/fragile/plugin/mail_output.rb
|
37
|
+
- lib/fragile/plugin/map_filter.rb
|
38
|
+
- lib/fragile/plugin/rss_input.rb
|
39
|
+
- lib/fragile/plugin/select_filter.rb
|
38
40
|
- lib/fragile/plugin_manager.rb
|
39
41
|
- lib/fragile/version.rb
|
40
42
|
- test/dsl_test.rb
|
data/examples/plugins/bar.rb
DELETED