fluent-plugin-twitter 0.0.1 → 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.
data/.gitignore CHANGED
@@ -1,18 +1,4 @@
1
1
  *.gem
2
- *.rbc
3
2
  .bundle
4
- .config
5
- coverage
6
- InstalledFiles
7
- lib/bundler/man
8
- pkg
9
- rdoc
10
- spec/reports
11
- test/tmp
12
- test/version_tmp
13
- tmp
14
-
15
- # YARD artifacts
16
- .yardoc
17
- _yardoc
18
- doc/
3
+ Gemfile.lock
4
+ pkg/*
data/README.md CHANGED
@@ -1,8 +1,8 @@
1
1
  fluent-plugin-twitter
2
2
  =====================
3
3
 
4
- ## Overview
5
- create your own twitter bot with fluentd
4
+ ## Component
5
+ Fluentd Input/Output plugin. You can create your own "Twitter Bot" with fluentd messaging system.
6
6
 
7
7
  ## Installation
8
8
 
@@ -17,22 +17,67 @@ gem install fluent-plugin-twitter
17
17
  /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-twitter
18
18
  `````
19
19
 
20
- ## Configuration
20
+ ## Input Configuration
21
21
 
22
- ### Sample
22
+ ### Input Sample
23
23
  `````
24
+ <source>
25
+ type twitter
26
+ consumer_key YOUR_CONSUMER_KEY # Required
27
+ consumer_secret YOUR_CONSUMER_SECRET # Required
28
+ oauth_token YOUR_OAUTH_TOKEN # Required
29
+ oauth_token_secret YOUR_OAUTH_TOKEN_SECRET # Required
30
+ tag input.twitter.sampling # Required
31
+ timeline sampling # Required (sampling or userstream)
32
+ keyword Ruby,Python # Optional (userstream not supported yet)
33
+ lang ja,en # Optional
34
+ </source>
35
+
36
+ <match input.twitter.sampling>
37
+ type stdout
38
+ </match>
39
+ `````
40
+
41
+ ### Debug
42
+ `````
43
+ $ tail -f /var/log/td-agent/td-agent.log
44
+ `````
45
+
46
+ ## Output Configuration
47
+
48
+ ### Output Sample
49
+ `````
50
+ <source>
51
+ type http
52
+ port 8888
53
+ </source>
54
+
24
55
  <match notify.twitter>
25
56
  type twitter
26
57
  consumer_key YOUR_CONSUMER_KEY
27
58
  consumer_secret YOUR_CONSUMER_SECRET
28
- oauth_token YOUR_OAUTH_TOEKN
29
- oauth_token_secret YOUR_OAUTH_TOEKN_SECRET
59
+ oauth_token YOUR_OAUTH_TOKEN
60
+ oauth_token_secret YOUR_OAUTH_TOKEN_SECRET
30
61
  </match>
31
62
  `````
32
63
 
64
+ ### Debug
65
+ `````
66
+ $ curl http://localhost:8888/notify.twitter -F 'json={"message":"foo"}'
67
+ `````
68
+
69
+ ## Reference
70
+
71
+ ### Twitter OAuth Guide
72
+ http://pocketstudio.jp/log3/2012/02/12/how_to_get_twitter_apikey_and_token/
73
+
33
74
  ## TODO
34
75
  patches welcome!
35
76
 
77
+ ## Known Issue
78
+ On starting fluentd, appearing alert message below. Please tell me how to fix up.
79
+ `/usr/lib64/fluent/ruby/lib/ruby/gems/1.9.1/gems/eventmachine-1.0.0/lib/eventmachine.rb:1530: warning: already initialized constant EM`
80
+
36
81
  ## Copyright
37
82
 
38
83
  Copyright © 2012- Kentaro Yoshida (@yoshi_ken)
@@ -3,11 +3,11 @@ $:.push File.expand_path("../lib", __FILE__)
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "fluent-plugin-twitter"
6
- s.version = "0.0.1"
6
+ s.version = "0.1.1"
7
7
  s.authors = ["Kentaro Yoshida"]
8
8
  s.email = ["y.ken.studio@gmail.com"]
9
9
  s.homepage = "https://github.com/y-ken/fluent-plugin-twitter"
10
- s.summary = %q{Fluentd Output filter plugin. You can create your own "Twitter Bot" with fluentd messaging system.}
10
+ s.summary = %q{Fluentd Input/Output plugin. You can create your own "Twitter Bot" with fluentd messaging system.}
11
11
 
12
12
  s.files = `git ls-files`.split("\n")
13
13
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
@@ -17,4 +17,6 @@ Gem::Specification.new do |s|
17
17
  # specify any dependencies here; for example:
18
18
  s.add_development_dependency "fluentd"
19
19
  s.add_runtime_dependency "fluentd"
20
+ s.add_runtime_dependency "twitter"
21
+ s.add_runtime_dependency "tweetstream"
20
22
  end
@@ -0,0 +1,94 @@
1
+ module Fluent
2
+ class TwitterInput < Fluent::Input
3
+ TIMELINE_TYPE = %w(userstream sampling)
4
+ Plugin.register_input('twitter', self)
5
+
6
+ config_param :consumer_key, :string
7
+ config_param :consumer_secret, :string
8
+ config_param :oauth_token, :string
9
+ config_param :oauth_token_secret, :string
10
+ config_param :tag, :string
11
+ config_param :timeline, :string
12
+ config_param :keyword, :string, :default => nil
13
+ config_param :lang, :string, :default => ''
14
+
15
+ def initialize
16
+ super
17
+ require 'tweetstream'
18
+ end
19
+
20
+ def configure(conf)
21
+ super
22
+ raise Fluent::ConfigError, "timeline value undefined #{@timeline}" if !TIMELINE_TYPE.include?(@timeline)
23
+ TweetStream.configure do |config|
24
+ config.consumer_key = @consumer_key
25
+ config.consumer_secret = @consumer_secret
26
+ config.oauth_token = @oauth_token
27
+ config.oauth_token_secret = @oauth_token_secret
28
+ config.auth_method = :oauth
29
+ end
30
+ end
31
+
32
+ def start
33
+ @thread = Thread.new(&method(:run))
34
+ end
35
+
36
+ def shutdown
37
+ Thread.kill(@thread)
38
+ end
39
+
40
+ def run
41
+ if @timeline == 'sampling' && @keyword
42
+ start_twitter_track
43
+ elsif @timeline == 'sampling' && @keyword.nil?
44
+ start_twitter_sample
45
+ elsif @timeline == 'userstream'
46
+ start_twitter_userstream
47
+ end
48
+ end
49
+
50
+ def start_twitter_track
51
+ $log.info "starting twitter keyword tracking. tag:#{@tag} lang:#{@lang} keyword:#{@keyword}"
52
+ client = TweetStream::Client.new
53
+ client.track(@keyword) do |status|
54
+ next unless status.text
55
+ next unless @lang.include?(status.user.lang)
56
+ get_message(status)
57
+ end
58
+ end
59
+
60
+ def start_twitter_sample
61
+ $log.info "starting twitter sampled streaming. tag:#{@tag} lang:#{@lang}"
62
+ client = TweetStream::Client.new
63
+ client.sample do |status|
64
+ next unless status.text
65
+ next unless @lang.include?(status.user.lang)
66
+ get_message(status)
67
+ end
68
+ end
69
+
70
+ def start_twitter_userstream
71
+ $log.info "starting twitter userstream tracking. tag:#{@tag} lang:#{@lang}"
72
+ client = TweetStream::Client.new
73
+ client.userstream do |status|
74
+ next unless status.text
75
+ next unless @lang.include?(status.user.lang)
76
+ get_message(status)
77
+ end
78
+ end
79
+
80
+ def get_message(status)
81
+ record = Hash.new
82
+ record.store('message', status.text)
83
+ record.store('geo', status.geo)
84
+ record.store('place', status.place)
85
+ record.store('created_at', status.created_at)
86
+ record.store('user_name', status.user.name)
87
+ record.store('user_screen_name', status.user.screen_name)
88
+ record.store('user_profile_image_url', status.user.profile_image_url)
89
+ record.store('user_time_zone', status.user.time_zone)
90
+ record.store('user_lang', status.user.lang)
91
+ Engine.emit(@tag, Engine.now, record)
92
+ end
93
+ end
94
+ end
data/test/helper.rb CHANGED
@@ -23,6 +23,7 @@ unless ENV.has_key?('VERBOSE')
23
23
  end
24
24
 
25
25
  require 'fluent/plugin/out_twitter'
26
+ require 'fluent/plugin/in_twitter'
26
27
 
27
28
  class Test::Unit::TestCase
28
29
  end
@@ -0,0 +1,40 @@
1
+ require 'helper'
2
+
3
+ class TwitterInputTest < Test::Unit::TestCase
4
+ def setup
5
+ Fluent::Test.setup
6
+ end
7
+
8
+ CONFIG = %[
9
+ consumer_key CONSUMER_KEY
10
+ consumer_secret CONSUMER_SECRET
11
+ oauth_token OAUTH_TOKEN
12
+ oauth_token_secret OAUTH_TOKEN_SECRET
13
+ tag input.twitter
14
+ timeline sampling
15
+ ]
16
+
17
+ def create_driver(conf=CONFIG,tag='test')
18
+ Fluent::Test::OutputTestDriver.new(Fluent::TwitterInput, tag).configure(conf)
19
+ end
20
+
21
+ def test_configure
22
+ assert_raise(Fluent::ConfigError) {
23
+ d = create_driver('')
24
+ }
25
+ d = create_driver %[
26
+ consumer_key CONSUMER_KEY
27
+ consumer_secret CONSUMER_SECRET
28
+ oauth_token OAUTH_TOKEN
29
+ oauth_token_secret OAUTH_TOKEN_SECRET
30
+ tag input.twitter
31
+ timeline sampling
32
+ ]
33
+ d.instance.inspect
34
+ assert_equal 'CONSUMER_KEY', d.instance.consumer_key
35
+ assert_equal 'CONSUMER_SECRET', d.instance.consumer_secret
36
+ assert_equal 'OAUTH_TOKEN', d.instance.oauth_token
37
+ assert_equal 'OAUTH_TOKEN_SECRET', d.instance.oauth_token_secret
38
+ end
39
+ end
40
+
@@ -8,8 +8,8 @@ class TwitterOutputTest < Test::Unit::TestCase
8
8
  CONFIG = %[
9
9
  consumer_key CONSUMER_KEY
10
10
  consumer_secret CONSUMER_SECRET
11
- oauth_token OAUTH_TOEKN
12
- oauth_token_secret OAUTH_TOEKN_SECRET
11
+ oauth_token OAUTH_TOKEN
12
+ oauth_token_secret OAUTH_TOKEN_SECRET
13
13
  ]
14
14
 
15
15
  def create_driver(conf=CONFIG,tag='test')
@@ -23,14 +23,14 @@ class TwitterOutputTest < Test::Unit::TestCase
23
23
  d = create_driver %[
24
24
  consumer_key CONSUMER_KEY
25
25
  consumer_secret CONSUMER_SECRET
26
- oauth_token OAUTH_TOEKN
27
- oauth_token_secret OAUTH_TOEKN_SECRET
26
+ oauth_token OAUTH_TOKEN
27
+ oauth_token_secret OAUTH_TOKEN_SECRET
28
28
  ]
29
29
  d.instance.inspect
30
30
  assert_equal 'CONSUMER_KEY', d.instance.consumer_key
31
31
  assert_equal 'CONSUMER_SECRET', d.instance.consumer_secret
32
- assert_equal 'OAUTH_TOEKN', d.instance.oauth_token
33
- assert_equal 'OAUTH_TOEKN_SECRET', d.instance.oauth_token_secret
32
+ assert_equal 'OAUTH_TOKEN', d.instance.oauth_token
33
+ assert_equal 'OAUTH_TOKEN_SECRET', d.instance.oauth_token_secret
34
34
  end
35
35
 
36
36
  def test_emit
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-twitter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-02 00:00:00.000000000 Z
12
+ date: 2012-10-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: fluentd
16
- requirement: &16126320 !ruby/object:Gem::Requirement
16
+ requirement: &11259400 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *16126320
24
+ version_requirements: *11259400
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: fluentd
27
- requirement: &16125060 !ruby/object:Gem::Requirement
27
+ requirement: &11258160 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,7 +32,29 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *16125060
35
+ version_requirements: *11258160
36
+ - !ruby/object:Gem::Dependency
37
+ name: twitter
38
+ requirement: &11257360 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: *11257360
47
+ - !ruby/object:Gem::Dependency
48
+ name: tweetstream
49
+ requirement: &11283100 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :runtime
56
+ prerelease: false
57
+ version_requirements: *11283100
36
58
  description:
37
59
  email:
38
60
  - y.ken.studio@gmail.com
@@ -46,8 +68,10 @@ files:
46
68
  - README.md
47
69
  - Rakefile
48
70
  - fluent-plugin-twitter.gemspec
71
+ - lib/fluent/plugin/in_twitter.rb
49
72
  - lib/fluent/plugin/out_twitter.rb
50
73
  - test/helper.rb
74
+ - test/plugin/test_in_twitter.rb
51
75
  - test/plugin/test_out_twitter.rb
52
76
  homepage: https://github.com/y-ken/fluent-plugin-twitter
53
77
  licenses: []
@@ -72,8 +96,9 @@ rubyforge_project:
72
96
  rubygems_version: 1.8.11
73
97
  signing_key:
74
98
  specification_version: 3
75
- summary: Fluentd Output filter plugin. You can create your own "Twitter Bot" with
76
- fluentd messaging system.
99
+ summary: Fluentd Input/Output plugin. You can create your own "Twitter Bot" with fluentd
100
+ messaging system.
77
101
  test_files:
78
102
  - test/helper.rb
103
+ - test/plugin/test_in_twitter.rb
79
104
  - test/plugin/test_out_twitter.rb