twitter2mixivoice 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
data/.gitignore ADDED
@@ -0,0 +1,24 @@
1
+ ## MAC OS
2
+ .DS_Store
3
+
4
+ ## TEXTMATE
5
+ *.tmproj
6
+ tmtags
7
+
8
+ ## EMACS
9
+ *~
10
+ \#*
11
+ .\#*
12
+
13
+ ## VIM
14
+ *.swp
15
+
16
+ ## PROJECT::GENERAL
17
+ coverage
18
+ rdoc
19
+ pkg
20
+
21
+ ## PROJECT::SPECIFIC
22
+ *.log
23
+ log/
24
+ config/
data/CHANGELOG.rdoc ADDED
@@ -0,0 +1,18 @@
1
+ = ChangeLog
2
+
3
+ == 2009-11-08 kawakazu80@gmail.com
4
+
5
+ * 0.1.1
6
+ packed gem.
7
+ add Twitter2MixiVoice.gemspec file.
8
+ change 'twitter_2_mixi_voice' file into 'twitter2mixivoice' file.
9
+
10
+ * README.rdoc
11
+ add description of 'INSTALL:' chapter.
12
+
13
+
14
+ == 2009-11-08 kawakazu80@gmail.com
15
+
16
+ * 0.1.0
17
+ first release.
18
+
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ (The MIT License)
2
+
3
+ Copyright (c) 2009 kazuya kawaguchi
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
20
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,45 @@
1
+ = Twitter2MixiVoice
2
+
3
+ This application is posted tweets of Twitter to MixiVoice.
4
+
5
+
6
+ == FEATURES:
7
+
8
+ * Post tweets of Twitter to MixiVoice.
9
+
10
+
11
+ == SUPPORT:
12
+
13
+ * e-mail address : kawakazu80@gmail.com
14
+ * twitter id : kazu_pon
15
+
16
+
17
+ == SYNOPSIS:
18
+
19
+ The following options are required.
20
+
21
+ * twitter id option : <em>--twitter_id</em> or <em>-t</em>
22
+ * twitter password option : <em>--twitter_password</em> or <em>-T</em>
23
+ * mixi email option : <em>--mixi_email</em> or <em>-m</em>
24
+ * mixi password option : <em>--mixi_password</em> or <em>-M</em>
25
+
26
+ Example:
27
+
28
+ $ twitter2mixivoice -t <em>twitter_id</em> -T <em>twitter_password</em> -m <em>user@hoge.com</em> -M <em>mixi_password</em>
29
+
30
+
31
+ == REQUIREMENTS:
32
+
33
+ * ruby 1.8.7
34
+ * twitter4r 0.3.1
35
+ * mechanize 0.9.3
36
+
37
+
38
+ == INSTALL:
39
+
40
+ gem install twitter2mixivoice
41
+
42
+
43
+ == Copyright:
44
+
45
+ Copyright (c) 2009 kazuya kawaguchi. See LICENSE for details.
data/Rakefile ADDED
@@ -0,0 +1,102 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "twitter2mixivoice"
8
+ gem.summary = %Q{twitter2mixivoice}
9
+ gem.description = %Q{Post twitter tweet to mixi voice.}
10
+ gem.email = "kawakazu80@gmail.com"
11
+ gem.homepage = "http://github.com/kazupon/Twitter2MixiVoice"
12
+ gem.authors = ["kazuya kawaguchi"]
13
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
14
+ end
15
+ rescue LoadError
16
+ puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
17
+ end
18
+
19
+ require 'rake/testtask'
20
+ Rake::TestTask.new(:test) do |test|
21
+ test.libs << 'lib' << 'test'
22
+ test.pattern = 'test/**/test_*.rb'
23
+ test.verbose = true
24
+ end
25
+
26
+ begin
27
+ require 'rcov/rcovtask'
28
+ Rcov::RcovTask.new do |test|
29
+ test.libs << 'test'
30
+ test.pattern = 'test/**/test_*.rb'
31
+ test.verbose = true
32
+ end
33
+ rescue LoadError
34
+ task :rcov do
35
+ abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
36
+ end
37
+ end
38
+
39
+
40
+ begin
41
+
42
+ require "highline"
43
+ desc "Setting test account"
44
+ task :setting_test_account do
45
+
46
+ setting_dir_path = "config"
47
+ setting_file_path = "#{setting_dir_path}/settings.yml"
48
+ setting_block = Proc.new do
49
+ password_block = Proc.new { |q| q.echo = "*" }
50
+ twitter_id = HighLine.new.ask("Enter Twitter ID: ")
51
+ twitter_pwd = HighLine.new.ask("Enter Twitter Password: ", &password_block)
52
+ mixi_email = HighLine.new.ask("Enter Mixi ID: ")
53
+ mixi_pwd = HighLine.new.ask("Enter Mixi Password: ", &password_block)
54
+
55
+ settings = {
56
+ "mixi_account" => {
57
+ "email" => mixi_email,
58
+ "password" => mixi_pwd
59
+ } ,
60
+ "twitter_account" => {
61
+ "id" => twitter_id,
62
+ "password" => twitter_pwd
63
+ }
64
+ }
65
+ File.open(setting_file_path, "w") { |file| YAML.dump(settings, file) }
66
+ end
67
+
68
+ if FileTest.exist?(setting_file_path)
69
+ result = HighLine.new.ask("Already Test Account Setting File. ReUse ? Yes -> Enter key, No -> 'n' typing : ")
70
+ if result == "n"
71
+ setting_block.call
72
+ puts "Success : Update '#{setting_file_path}' File."
73
+ end
74
+ else
75
+ Dir.mkdir(setting_dir_path)
76
+ setting_block.call
77
+ puts "Success : Create '#{setting_file_path}' File."
78
+ end
79
+
80
+ end
81
+
82
+ rescue Exception => e
83
+ puts "Error : Create 'config/settings.yml' File."
84
+ end
85
+
86
+
87
+ #task :test => :check_dependencies
88
+ task :test => [:check_dependencies, :setting_test_account]
89
+
90
+ task :default => :test
91
+
92
+ require 'rake/rdoctask'
93
+ Rake::RDocTask.new do |rdoc|
94
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
95
+
96
+ rdoc.rdoc_dir = 'rdoc'
97
+ rdoc.title = "Twitter2MixiVoice #{version}"
98
+ rdoc.rdoc_files.include('README*')
99
+ rdoc.rdoc_files.include('lib/**/*.rb')
100
+ rdoc.inline_source = true
101
+ rdoc.options << "-c UTF-8"
102
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.1
@@ -0,0 +1,31 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ #
4
+ # mixi_voice_bot.rb
5
+ # Twitter2MixiVoice
6
+ #
7
+ # Created by kazuya kawaguchi on 2009-11-08.
8
+ # Copyright 2009 kazuya kawaguchi. All rights reserved.
9
+ #
10
+
11
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
12
+
13
+ require "twitter_2_mixi_voice"
14
+
15
+
16
+ #
17
+ # entry point
18
+ #
19
+
20
+ if __FILE__ == $0
21
+
22
+ begin
23
+ # run application.
24
+ Twitter2MixiVoice::Application.run(ARGV)
25
+ rescue Exception => e
26
+ $stderr.puts e.to_s
27
+ end
28
+
29
+ end
30
+
31
+ __END__
@@ -0,0 +1,135 @@
1
+ #
2
+ # application.rb
3
+ # mixi_voice_bot
4
+ #
5
+ # Created by kazuya kawaguchi on 2009-10-25.
6
+ # Copyright 2009 kazuya kawaguchi. All rights reserved.
7
+ #
8
+
9
+ require "mixi"
10
+ require "twitter_client"
11
+ require "options"
12
+
13
+
14
+ module Twitter2MixiVoice
15
+
16
+
17
+ # This constants is Twitter2MixiVoice Application return code.
18
+ Success, Error = 0, 1
19
+
20
+
21
+ # This class provides mixi bot application.
22
+ class Application
23
+
24
+
25
+ # constants
26
+ Posted_Tweets_Dir = File.join(ENV["HOME"], ".twitter2mixivoice")
27
+ Posted_File_Name = "posted_tweets.yml"
28
+
29
+
30
+ # Run Application.
31
+ #
32
+ # [<em>*args</em>]
33
+ # <tt>command line options.</tt>
34
+ #
35
+ def self.run(args)
36
+
37
+ # parse arguments.
38
+ options = Options.new(args, Twitter2MixiVoice::version)
39
+
40
+ #
41
+ # check options.
42
+ #
43
+ if options[:invalid_argument]
44
+ $stderr.puts options[:invalid_argument]
45
+ options[:show_help] = true
46
+ end
47
+
48
+ if options[:show_version]
49
+ $stdout.puts options[:show_version]
50
+ return Success
51
+ end
52
+
53
+ if options[:show_help]
54
+ $stderr.puts options.opts.to_s
55
+ return Error
56
+ end
57
+
58
+
59
+ result = Error
60
+ begin
61
+
62
+ # login to twitter.
63
+ twitter = login_to_twitter(options[:twitter_id], options[:twitter_password])
64
+
65
+ # login to mixi.
66
+ mixi = login_to_mixi(options[:mixi_email], options[:mixi_password])
67
+
68
+ # read cache tweets from YAML file.
69
+ posted_tweets = read_tweets(Posted_Tweets_Dir, Posted_File_Name)
70
+
71
+ # get tweets from twitter.
72
+ tweets = twitter.get_tweets_from_timeline
73
+
74
+ # post twitter tweet to mixi voice.
75
+ tweets.each do |tweet|
76
+ if (!posted_tweets.has_key?(tweet.id))
77
+ mixi.post_voice(tweet.text)
78
+ posted_tweets[tweet.id] = tweet
79
+ $stdout.puts "tweet -> voice : id = #{tweet.id}, text = #{tweet.text}"
80
+ end
81
+ end
82
+
83
+ # write YAML file from cache tweets.
84
+ result = write_tweets(Posted_Tweets_Dir, Posted_File_Name, posted_tweets)
85
+
86
+ result = Success
87
+
88
+ rescue MixiException => e
89
+ $stderr.puts "Raise MixiException : #{e.to_s}"
90
+ result = Error
91
+ rescue TwitterClientException => e
92
+ $stderr.puts "Raise MixiException : #{e.to_s}"
93
+ result = Error
94
+ rescue Exception => e
95
+ $stderr.puts "Raise Exception : #{e.to_s}"
96
+ result = Error
97
+ end
98
+
99
+ return result
100
+
101
+ end # end of 'self.run'
102
+
103
+
104
+ # private code(s) block ...
105
+
106
+ private
107
+
108
+ def self.login_to_twitter(id, password)
109
+ TwitterClient.new(id, password)
110
+ end
111
+
112
+ def self.login_to_mixi(email, password)
113
+ Mixi.new(email, password)
114
+ end
115
+
116
+ def self.read_tweets(dir_path, file_name)
117
+ tweets = {}
118
+ path = File.join(dir_path, file_name)
119
+ File.open(path) { |file| tweets = YAML.load(file) } if FileTest.exist?(path)
120
+ tweets
121
+ end
122
+
123
+ def self.write_tweets(dir_path, file_name, tweets)
124
+ Dir.mkdir(dir_path) unless FileTest.exist?(dir_path)
125
+ path = File.join(dir_path, file_name)
126
+ File.open(path, "w+") { |file| YAML.dump(tweets, file) }
127
+ end
128
+
129
+ # ... private code(s) block
130
+
131
+
132
+ end # end of 'Application'
133
+
134
+
135
+ end # end of 'Twitter2MixiVoice'
data/lib/mixi.rb ADDED
@@ -0,0 +1,80 @@
1
+ #
2
+ # mixi.rb
3
+ # Twitter2MixiVoice
4
+ #
5
+ # Created by kazuya kawaguchi on 2009-11-03.
6
+ # Copyright 2009 kazuya kawaguchi. All rights reserved.
7
+ #
8
+
9
+ require "rubygems"
10
+ require "mechanize"
11
+ require "kconv"
12
+
13
+
14
+ module Twitter2MixiVoice
15
+
16
+
17
+ # This exception class that is thrown when an errors occur in Mixi class.
18
+ class MixiException < Exception ; end # end of 'MixiException'
19
+
20
+
21
+ # This class provides mixi functions.
22
+ class Mixi
23
+
24
+
25
+ VOICE_MAX_LENGTH = 150
26
+
27
+
28
+ # Create Mixi class instance.
29
+ def initialize(email, password)
30
+
31
+ # check parameter.
32
+ raise MixiException.new("Invalid 'email' parameter .") if email.nil? || email.empty?
33
+ raise MixiException.new("Invalid 'password' parameter .") if password.nil? || password.empty?
34
+
35
+ # login to mixi.
36
+ begin
37
+ @agent = WWW::Mechanize.new
38
+ @agent.get("http://mixi.jp")
39
+ @agent.page.form_with(:name => "login_form") do |form|
40
+ form.field_with(:name => "email").value = email
41
+ form.field_with(:name => "password").value = password
42
+ form.submit
43
+ end
44
+ rescue Exception => e
45
+ raise MixiException.new(e.to_s)
46
+ end
47
+
48
+ # check login error.
49
+ error = @agent.page.at("div#errorArea")
50
+ unless error.nil?
51
+ raise MixiException.new(error.inner_text)
52
+ end
53
+
54
+ end
55
+
56
+
57
+ # Post mixi voice.
58
+ def post_voice(message)
59
+
60
+ # check parameter
61
+ raise MixiException.new("Invalid 'message' parameter.") if message.nil? || message.empty? || message.split(//u).length > VOICE_MAX_LENGTH
62
+
63
+ # post voice
64
+ begin
65
+ @agent.get("http://mixi.jp/recent_echo.pl")
66
+ @agent.page.form_with(:action => "add_echo.pl") do |form|
67
+ form.field_with(:name => "body").value = message
68
+ form.click_button
69
+ end
70
+ rescue Exception => e
71
+ raise MixiException.new(e.to_s)
72
+ end
73
+
74
+ end
75
+
76
+
77
+ end # end of 'Mixi'
78
+
79
+
80
+ end # end of 'Twitter2MixiVoice'
data/lib/options.rb ADDED
@@ -0,0 +1,84 @@
1
+ #
2
+ # options.rb
3
+ # Twitter2MixiVoice
4
+ #
5
+ # Created by kazuya kawaguchi on 2009-11-04.
6
+ # Copyright 2009 kazuya kawaguchi. All rights reserved.
7
+ #
8
+
9
+ require "optparse"
10
+
11
+
12
+ module Twitter2MixiVoice
13
+
14
+
15
+ # This class provides command line option.
16
+ class Options < Hash
17
+
18
+
19
+ attr_reader :opts
20
+
21
+
22
+ def initialize(params, version = nil)
23
+
24
+ super()
25
+
26
+
27
+ @opts = OptionParser.new do |o|
28
+
29
+ o.on("-t", "--twitter_id TWITTER_ID", "login twitter id") do |id|
30
+ self[:twitter_id] = id
31
+ end
32
+
33
+ o.on("-T", "--twitter_password TWITTER_PASSWORD", "login twitter passowrd") do |password|
34
+ self[:twitter_password] = password
35
+ end
36
+
37
+ o.on("-m", "--mixi_email MIXI_EMAIL", "login mixi email") do |email|
38
+ self[:mixi_email] = email
39
+ end
40
+
41
+ o.on("-M", "--mixi_password MIXI_PASSWORD", "login mixi password") do |password|
42
+ self[:mixi_password] = password
43
+ end
44
+
45
+ o.on("-h", "--help", "#{File.basename($0, ".*")} help") do |help|
46
+ self[:show_help] = help
47
+ end
48
+
49
+ o.on_tail("-v", "--version", "#{File.basename($0, ".*")} version") do
50
+ self[:show_version] = "#{File.basename($0, ".*")}: #{version}"
51
+ end
52
+
53
+ end
54
+
55
+
56
+ begin
57
+ @opts.parse!(params)
58
+ rescue OptionParser::InvalidOption => e
59
+ self[:invalid_argument] = e.message
60
+ rescue OptionParser::InvalidArgument => e
61
+ self[:invalid_argument] = e.message
62
+ rescue OptionParser::MissingArgument => e
63
+ self[:invalid_argument] = e.message
64
+ rescue OptionParser::NeedlessArgument => e
65
+ self[:invalid_argument] = e.message
66
+ rescue OptionParser::ParseError => e
67
+ self[:invalid_argument] = e.message
68
+ rescue Exception => e
69
+ self[:invalid_argument] = e.message
70
+ end
71
+
72
+
73
+ # check authorized parameter.
74
+ if self[:show_version].nil? && self[:show_help].nil?
75
+ self[:invalid_argument] = "invalid argument" if self[:twitter_id].nil? || self[:twitter_password].nil? || self[:mixi_email].nil? || self[:mixi_password].nil?
76
+ end
77
+
78
+ end # end of 'initialize'
79
+
80
+
81
+ end # end of 'Options'
82
+
83
+
84
+ end # end of 'Twitter2MixiVoice'
data/lib/tweet.rb ADDED
@@ -0,0 +1,19 @@
1
+ #
2
+ # tweet.rb
3
+ # Twitter2MixiVoice
4
+ #
5
+ # Created by kazuya kawaguchi on 2009-11-03.
6
+ # Copyright 2009 kazuya kawaguchi. All rights reserved.
7
+ #
8
+
9
+
10
+ module Twitter2MixiVoice
11
+
12
+
13
+ # This class provides 'tweet' data model of twitter.
14
+ class Tweet
15
+ attr_accessor :id, :text, :created_at
16
+ end # end of 'Tweet'
17
+
18
+
19
+ end # end of 'Twitter2MixiVoice'
@@ -0,0 +1,34 @@
1
+ #
2
+ # twitter_2_mixi_voice.rb
3
+ # Twitter2MixiVoice
4
+ #
5
+ # Created by kazuya kawaguchi on 2009-11-03.
6
+ # Copyright 2009 kazuya kawaguchi. All rights reserved.
7
+ #
8
+
9
+
10
+ # This module is posted tweet of twitter to mixi voice.
11
+ module Twitter2MixiVoice
12
+
13
+
14
+ require "mixi"
15
+ require "twitter_client"
16
+ require "tweet"
17
+ require "application"
18
+ require "options"
19
+
20
+
21
+ # Get +Twitter2MixiVoice+ module version.
22
+ def self.version
23
+ version = nil
24
+ begin
25
+ version_path = File.join(File.dirname(__FILE__), "..", "VERSION")
26
+ version = File.exist?(version_path) ? File.read(version_path) : ""
27
+ rescue Exception => e
28
+ version = ""
29
+ end
30
+ version
31
+ end
32
+
33
+
34
+ end # end of 'Twitter2MixiVoice'
@@ -0,0 +1,85 @@
1
+ #
2
+ # twitter_client.rb
3
+ # Twitter2MixiVoice
4
+ #
5
+ # Created by kazuya kawaguchi on 2009-11-03.
6
+ # Copyright 2009 kazuya kawaguchi. All rights reserved.
7
+ #
8
+
9
+ require "rubygems"
10
+ require "twitter"
11
+ require "tweet"
12
+
13
+
14
+ module Twitter2MixiVoice
15
+
16
+
17
+ # This exception class that is thrown when an errors occur in TwitterClient class.
18
+ class TwitterException < Exception ; end # end of 'TwitterException'
19
+
20
+
21
+ # This class provides twitter functions.
22
+ class TwitterClient
23
+
24
+
25
+ # Create TwitterClient class instance.
26
+ def initialize(id, password)
27
+
28
+ # check parameter.
29
+ raise TwitterException.new("Invalid 'id' parameter.") if id.nil? || id.empty?
30
+ raise TwitterException.new("Invalid 'password' password.") if password.nil? || password.empty?
31
+
32
+ # login to twitter.
33
+ begin
34
+ @client = Twitter::Client.new(:login => id, :password => password)
35
+ rescue Exception => e
36
+ raise TwitterException.new(e.to_s)
37
+ end
38
+
39
+ # check authenticate.
40
+ unless @client.authenticate?(id, password)
41
+ raise TwitterException.new("Not authenticate.")
42
+ end
43
+
44
+ end
45
+
46
+
47
+ # Get tweets from timeline.
48
+ def get_tweets_from_timeline
49
+
50
+ # initialize tweets
51
+ tweets = []
52
+
53
+ # add that get status from timeline in tweet collection.
54
+ begin
55
+
56
+ # insert status in tweet collection.
57
+ @client.timeline_for(:me) do |status|
58
+ tweet = Tweet.new
59
+ tweet.id = status.id.to_i
60
+ tweet.text = status.text
61
+ tweet.created_at = status.created_at
62
+ tweets << tweet
63
+ end
64
+
65
+ # sort tweet collection.
66
+ unless tweets.empty?
67
+ tweets = tweets.sort do |a, b|
68
+ a.created_at.to_f <=> b.created_at.to_f
69
+ end
70
+ end
71
+
72
+ rescue Exception => e
73
+ raise TwitterException.new(e.to_s)
74
+ end
75
+
76
+ # return tweets.
77
+ tweets
78
+
79
+ end
80
+
81
+
82
+ end # end of 'TwitterClient'
83
+
84
+
85
+ end # end of 'Twitter2MixiVoice'
@@ -0,0 +1,110 @@
1
+ #
2
+ # test_application.rb
3
+ # Twitter2MixiVoice
4
+ #
5
+ # Created by kazuya kawaguchi on 2009-11-03.
6
+ # Copyright 2009 kazuya kawaguchi. All rights reserved.
7
+ #
8
+
9
+ require "test/unit"
10
+ require "twitter_2_mixi_voice"
11
+ require "yaml"
12
+ require "stringio"
13
+
14
+
15
+ class TestApplication < Test::Unit::TestCase
16
+
17
+
18
+ Settings = YAML.load_file(File.join(File.dirname(__FILE__), "..", "config", "settings.yml"))
19
+ Success, Error = 0, 1
20
+
21
+
22
+ # helper method code(s) block ...
23
+
24
+ def twitter_id; Settings["twitter_account"]["id"]; end
25
+
26
+ def twitter_password; Settings["twitter_account"]["password"]; end
27
+
28
+ def mixi_email; Settings["mixi_account"]["email"]; end
29
+
30
+ def mixi_password; Settings["mixi_account"]["password"]; end
31
+
32
+ def run_application(params)
33
+
34
+ org_stdout = $stdout
35
+ org_stderr = $stderr
36
+ fake_stdout = StringIO.new
37
+ fake_stderr = StringIO.new
38
+
39
+ result = nil
40
+ begin
41
+ result = Twitter2MixiVoice::Application.run(params)
42
+ ensure
43
+ $stdout = org_stdout
44
+ $stderr = org_stderr
45
+ end
46
+
47
+ @stdout = fake_stdout.string
48
+ @stderr = fake_stderr.string
49
+
50
+ result
51
+ end
52
+
53
+ # ... helper method code(s)
54
+
55
+
56
+ # test code(s) block ...
57
+
58
+ def test_run_auth_option
59
+
60
+ options = []
61
+ options << ["-t", twitter_id, "-T", twitter_password, "-m", mixi_email, "-M", mixi_password] # short
62
+ options << ["--twitter_id", twitter_id, "--twitter_password", twitter_password, "--mixi_email", mixi_email, "--mixi_password", mixi_password] # long
63
+ options.each do |option|
64
+ assert_equal(Twitter2MixiVoice::Success, run_application(option))
65
+ end
66
+ end
67
+
68
+
69
+ def test_run_none_password_auth_option
70
+ option = ["-t", twitter_id, "--mixi_email", mixi_email]
71
+ assert_equal(Twitter2MixiVoice::Error, run_application(option))
72
+ end
73
+
74
+
75
+ def test_run_version_option
76
+ options = [["-v"], ["--version"]] # short & long
77
+ options.each do |option|
78
+ assert_equal(Twitter2MixiVoice::Success, run_application(option))
79
+ end
80
+ end
81
+
82
+
83
+ def test_run_help_option
84
+ options = [["-h"], ["--help"]] # short & long
85
+ options.each do |option|
86
+ assert_equal(Twitter2MixiVoice::Error, run_application(option))
87
+ end
88
+ end
89
+
90
+
91
+ def test_run_option_invalid_undefine
92
+ assert_equal(Twitter2MixiVoice::Error, run_application([] << "--invalied"))
93
+ end
94
+
95
+
96
+ def test_run_option_empty
97
+ assert_equal(Twitter2MixiVoice::Error, run_application([]))
98
+ end
99
+
100
+
101
+ def test_posted_tweets_data
102
+ file_path = File.join(ENV["HOME"], ".twitter2mixivoice", "posted_tweets.yml")
103
+ run_application(["--twitter_id", twitter_id, "--twitter_password", twitter_password, "--mixi_email", mixi_email, "--mixi_password", mixi_password])
104
+ assert(FileTest.exist?(file_path))
105
+ end
106
+
107
+ # ... test code(s) block
108
+
109
+
110
+ end # end of 'TestApplication'
data/test/test_mixi.rb ADDED
@@ -0,0 +1,86 @@
1
+ #
2
+ # test_mixi.rb
3
+ # Twitter2MixiVoice
4
+ #
5
+ # Created by kazuya kawaguchi on 2009-11-03.
6
+ # Copyright 2009 kazuya kawaguchi. All rights reserved.
7
+ #
8
+
9
+ require "test/unit"
10
+ require "twitter_2_mixi_voice"
11
+ require "yaml"
12
+
13
+
14
+ class TestMixi < Test::Unit::TestCase
15
+
16
+
17
+ Settings = YAML.load_file(File.join(File.dirname(__FILE__), "..", "config", "settings.yml"))
18
+
19
+
20
+ # helper methods code block ...
21
+
22
+ def email; Settings["mixi_account"]["email"]; end
23
+
24
+ def password; Settings["mixi_account"]["password"]; end
25
+
26
+ def create_mixi(email, password)
27
+ Twitter2MixiVoice::Mixi.new(email, password)
28
+ end
29
+
30
+ # ... helper methods code block
31
+
32
+
33
+ # tests code block ...
34
+
35
+ def test_initialize
36
+ mixi = create_mixi(self.email, self.password)
37
+ assert_not_nil mixi
38
+ mixi
39
+ end
40
+
41
+
42
+ def test_initialize_param_error
43
+
44
+ assert_raise(Twitter2MixiVoice::MixiException) { create_mixi("", "") }
45
+ assert_raise(Twitter2MixiVoice::MixiException) { create_mixi(email, "") }
46
+ assert_raise(Twitter2MixiVoice::MixiException) { create_mixi("", password) }
47
+ assert_raise(Twitter2MixiVoice::MixiException) { create_mixi(email, nil) }
48
+ assert_raise(Twitter2MixiVoice::MixiException) { create_mixi(nil, password) }
49
+
50
+ # TODO: should be special data('/','¥', '\', etc ...) check
51
+
52
+ end
53
+
54
+
55
+ def test_initialize_auth_error
56
+ assert_raise(Twitter2MixiVoice::MixiException) { create_mixi("hoge", "hoge") }
57
+ end
58
+
59
+
60
+ def test_add_voice
61
+ mixi = test_initialize
62
+ mixi.post_voice "hello world."
63
+ end
64
+
65
+
66
+ def test_add_voice_param_error
67
+
68
+ mixi = test_initialize
69
+ mixi_voice_max_length = 150
70
+ assert_raise(Twitter2MixiVoice::MixiException) { mixi.post_voice("") }
71
+ assert_raise(Twitter2MixiVoice::MixiException) { mixi.post_voice(nil) }
72
+ assert_nothing_raised(Twitter2MixiVoice::MixiException) { mixi.post_voice("a" * (mixi_voice_max_length - 1)) }
73
+ assert_nothing_raised(Twitter2MixiVoice::MixiException) { mixi.post_voice("a" * mixi_voice_max_length) }
74
+ assert_raise(Twitter2MixiVoice::MixiException) { mixi.post_voice("a" * (mixi_voice_max_length + 1)) }
75
+ assert_nothing_raised(Twitter2MixiVoice::MixiException) { mixi.post_voice("あ" * (mixi_voice_max_length - 1)) }
76
+ assert_nothing_raised(Twitter2MixiVoice::MixiException) { mixi.post_voice("あ" * mixi_voice_max_length) }
77
+ assert_raise(Twitter2MixiVoice::MixiException) { mixi.post_voice("あ" * (mixi_voice_max_length + 1)) }
78
+
79
+ # TODO: should be special data('/','¥', '\', etc ...) check
80
+
81
+ end
82
+
83
+ # ... tests code block
84
+
85
+
86
+ end # end of 'TestMixi'
@@ -0,0 +1,107 @@
1
+ #
2
+ # test_options.rb
3
+ # Twitter2MixiVoice
4
+ #
5
+ # Created by kazuya kawaguchi on 2009-11-04.
6
+ # Copyright 2009 kazuya kawaguchi. All rights reserved.
7
+ #
8
+
9
+ require "test/unit"
10
+ require "twitter_2_mixi_voice"
11
+
12
+
13
+ class TestOptions < Test::Unit::TestCase
14
+
15
+
16
+ Version = "1.0.1"
17
+
18
+
19
+ # helper method code(s) block ...
20
+
21
+ def verify_options(params, version = nil)
22
+ params.each do |data, proc|
23
+ options = Twitter2MixiVoice::Options.new(data, version)
24
+ proc.call(options) if proc
25
+ end
26
+ end
27
+
28
+ # ... helper method code(s) block
29
+
30
+
31
+ # test code(s) block ...
32
+
33
+ def test_help_option
34
+
35
+ proc = Proc.new do |options|
36
+ assert(options[:show_help])
37
+ assert_match(/Usage:/, options.opts.to_s)
38
+ assert_nil(options[:invalid_argument])
39
+ end
40
+
41
+ help_options = {}
42
+ help_options[["-h"]] = proc
43
+ help_options[["--help"]] = proc
44
+
45
+ verify_options(help_options)
46
+
47
+ end
48
+
49
+
50
+ def test_version_option
51
+
52
+ proc = Proc.new do |options|
53
+ assert(options[:show_version])
54
+ assert_match(/: #{Version}/, options[:show_version])
55
+ assert_nil(options[:invalid_argument])
56
+ end
57
+
58
+ version_options = {}
59
+ version_options[["-v"]] = proc
60
+ version_options[["--version"]] = proc
61
+
62
+ verify_options(version_options, Version)
63
+
64
+ end
65
+
66
+
67
+ def test_auth_options
68
+
69
+ auth_options = {}
70
+
71
+ auth_options[["--twitter_id", "twitter", "-T", "tweet", "--mixi_email", "user@mixi.jp", "-M", "voice"]] = Proc.new do |options|
72
+ assert_nil(options[:invalid_argument])
73
+ assert_not_nil(options[:twitter_id])
74
+ assert_not_nil(options[:twitter_password])
75
+ assert_not_nil(options[:mixi_email])
76
+ assert_not_nil(options[:mixi_password])
77
+ end
78
+
79
+ auth_options[["-t", "twitter", "-m", "user@mixi.jp"]] = Proc.new do |options|
80
+ assert_not_nil(options[:invalid_argument])
81
+ assert_not_nil(options[:twitter_id])
82
+ assert_nil(options[:twitter_password])
83
+ assert_not_nil(options[:mixi_email])
84
+ assert_nil(options[:mixi_password])
85
+ end
86
+
87
+ verify_options(auth_options)
88
+
89
+ end
90
+
91
+
92
+ def test_empty_options
93
+
94
+ options = {}
95
+
96
+ options[[""]] = Proc.new do |options|
97
+ assert_not_nil(options[:invalid_argument])
98
+ end
99
+
100
+ verify_options(options)
101
+
102
+ end
103
+
104
+ # ... test code(s) block
105
+
106
+
107
+ end # end of 'TestOptions'
@@ -0,0 +1,32 @@
1
+ #
2
+ # test_tweet.rb
3
+ # Twitter2MixiVoice
4
+ #
5
+ # Created by kazuya kawaguchi on 2009-11-03.
6
+ # Copyright 2009 kazuya kawaguchi. All rights reserved.
7
+ #
8
+
9
+ require "test/unit"
10
+ require "twitter_2_mixi_voice"
11
+
12
+
13
+ class TestTweet < Test::Unit::TestCase
14
+
15
+
16
+ def test_tweet
17
+
18
+ tweet = Twitter2MixiVoice::Tweet.new
19
+ tweet.id = 12345
20
+ tweet.text = "hello world."
21
+ tweet.created_at = Time.now
22
+
23
+ assert_equal(12345, tweet.id)
24
+ assert_equal("hello world.", tweet.text)
25
+ assert(Time.now > tweet.created_at)
26
+
27
+ tweet
28
+
29
+ end
30
+
31
+
32
+ end # end of 'TestTweet'
@@ -0,0 +1,20 @@
1
+ #
2
+ # test_twitter_2_mixi_voice.rb
3
+ # Twitter2MixiVoice
4
+ #
5
+ # Created by kazuya kawaguchi on 2009-11-04.
6
+ # Copyright 2009 kazuya kawaguchi. All rights reserved.
7
+ #
8
+
9
+ require "test/unit"
10
+ require "twitter_2_mixi_voice"
11
+
12
+
13
+ class TestTwitter2MixiVoice < Test::Unit::TestCase
14
+
15
+ def test_version
16
+ assert_not_nil(Twitter2MixiVoice::version)
17
+ puts "Twitter2MixiVoice version : #{Twitter2MixiVoice::version}"
18
+ end
19
+
20
+ end # end of 'TestTwitter2MixiVoice'
@@ -0,0 +1,73 @@
1
+ #
2
+ # test_twitter_client.rb
3
+ # Twitter2MixiVoice
4
+ #
5
+ # Created by kazuya kawaguchi on 2009-11-03.
6
+ # Copyright 2009 kazuya kawaguchi. All rights reserved.
7
+ #
8
+
9
+ require "test/unit"
10
+ require "twitter_2_mixi_voice"
11
+ require "yaml"
12
+
13
+
14
+ class TestTwitterClient < Test::Unit::TestCase
15
+
16
+
17
+ Settings = YAML.load_file(File.join(File.dirname(__FILE__), "..", "config", "settings.yml"))
18
+
19
+
20
+ # helper method code(s) block ...
21
+
22
+ def id; Settings["twitter_account"]["id"]; end
23
+
24
+ def password; Settings["twitter_account"]["password"]; end
25
+
26
+ def create_twitter(id, password)
27
+ Twitter2MixiVoice::TwitterClient.new(id, password)
28
+ end
29
+
30
+ # ... helper method code(s) block
31
+
32
+
33
+ # test code(s) block ...
34
+
35
+ def test_initialize
36
+ twitter = create_twitter(self.id, self.password)
37
+ assert_not_nil(twitter)
38
+ twitter
39
+ end
40
+
41
+
42
+ def test_initialize_param_error
43
+
44
+ assert_raise(Twitter2MixiVoice::TwitterException) { create_twitter("", "") }
45
+ assert_raise(Twitter2MixiVoice::TwitterException) { create_twitter(self.id, "") }
46
+ assert_raise(Twitter2MixiVoice::TwitterException) { create_twitter("", self.password) }
47
+ assert_raise(Twitter2MixiVoice::TwitterException) { create_twitter(self.id, nil) }
48
+ assert_raise(Twitter2MixiVoice::TwitterException) { create_twitter(nil, self.password) }
49
+
50
+ end
51
+
52
+
53
+ def test_initialize_auth_error
54
+ assert_raise(Twitter2MixiVoice::TwitterException) { create_twitter("hoge", "hoge") }
55
+ end
56
+
57
+
58
+ def test_get_tweets_from_timeline
59
+ twitter = test_initialize
60
+ tweets = twitter.get_tweets_from_timeline
61
+ assert_not_nil(tweets)
62
+ tweets.each do |tweet|
63
+ assert_not_nil(tweet.id)
64
+ assert_not_nil(tweet.text)
65
+ assert(Time.now > tweet.created_at)
66
+ puts("id = #{tweet.id}, text = #{tweet.text}, created_at = #{tweet.created_at}")
67
+ end
68
+ end
69
+
70
+ # ... test code(s) block
71
+
72
+
73
+ end # end of 'TestTwitterClient'
@@ -0,0 +1,67 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{twitter2mixivoice}
8
+ s.version = "0.1.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["kazuya kawaguchi"]
12
+ s.date = %q{2009-11-08}
13
+ s.default_executable = %q{twitter_2_mixi_voice}
14
+ s.description = %q{Post twitter tweet to mixi voice.}
15
+ s.email = %q{kawakazu80@gmail.com}
16
+ s.executables = ["twitter_2_mixi_voice"]
17
+ s.extra_rdoc_files = [
18
+ "LICENSE",
19
+ "README.rdoc"
20
+ ]
21
+ s.files = [
22
+ ".document",
23
+ ".gitignore",
24
+ "CHANGELOG.rdoc",
25
+ "LICENSE",
26
+ "README.rdoc",
27
+ "Rakefile",
28
+ "VERSION",
29
+ "bin/twitter_2_mixi_voice",
30
+ "lib/application.rb",
31
+ "lib/mixi.rb",
32
+ "lib/options.rb",
33
+ "lib/tweet.rb",
34
+ "lib/twitter_2_mixi_voice.rb",
35
+ "lib/twitter_client.rb",
36
+ "test/test_application.rb",
37
+ "test/test_mixi.rb",
38
+ "test/test_options.rb",
39
+ "test/test_tweet.rb",
40
+ "test/test_twitter_2_mixi_voice.rb",
41
+ "test/test_twitter_client.rb"
42
+ ]
43
+ s.homepage = %q{http://github.com/kazupon/Twitter2MixiVoice}
44
+ s.rdoc_options = ["--charset=UTF-8"]
45
+ s.require_paths = ["lib"]
46
+ s.rubygems_version = %q{1.3.5}
47
+ s.summary = %q{twitter2mixivoice}
48
+ s.test_files = [
49
+ "test/test_application.rb",
50
+ "test/test_mixi.rb",
51
+ "test/test_options.rb",
52
+ "test/test_tweet.rb",
53
+ "test/test_twitter_2_mixi_voice.rb",
54
+ "test/test_twitter_client.rb"
55
+ ]
56
+
57
+ if s.respond_to? :specification_version then
58
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
59
+ s.specification_version = 3
60
+
61
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
62
+ else
63
+ end
64
+ else
65
+ end
66
+ end
67
+
metadata ADDED
@@ -0,0 +1,81 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: twitter2mixivoice
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - kazuya kawaguchi
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-11-08 00:00:00 +09:00
13
+ default_executable: twitter2mixivoice
14
+ dependencies: []
15
+
16
+ description: Post twitter tweet to mixi voice.
17
+ email: kawakazu80@gmail.com
18
+ executables:
19
+ - twitter2mixivoice
20
+ extensions: []
21
+
22
+ extra_rdoc_files:
23
+ - LICENSE
24
+ - README.rdoc
25
+ files:
26
+ - .document
27
+ - .gitignore
28
+ - CHANGELOG.rdoc
29
+ - LICENSE
30
+ - README.rdoc
31
+ - Rakefile
32
+ - VERSION
33
+ - bin/twitter2mixivoice
34
+ - lib/application.rb
35
+ - lib/mixi.rb
36
+ - lib/options.rb
37
+ - lib/tweet.rb
38
+ - lib/twitter_2_mixi_voice.rb
39
+ - lib/twitter_client.rb
40
+ - test/test_application.rb
41
+ - test/test_mixi.rb
42
+ - test/test_options.rb
43
+ - test/test_tweet.rb
44
+ - test/test_twitter_2_mixi_voice.rb
45
+ - test/test_twitter_client.rb
46
+ - twitter2mixivoice.gemspec
47
+ has_rdoc: true
48
+ homepage: http://github.com/kazupon/Twitter2MixiVoice
49
+ licenses: []
50
+
51
+ post_install_message:
52
+ rdoc_options:
53
+ - --charset=UTF-8
54
+ require_paths:
55
+ - lib
56
+ required_ruby_version: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: "0"
61
+ version:
62
+ required_rubygems_version: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: "0"
67
+ version:
68
+ requirements: []
69
+
70
+ rubyforge_project:
71
+ rubygems_version: 1.3.5
72
+ signing_key:
73
+ specification_version: 3
74
+ summary: twitter2mixivoice
75
+ test_files:
76
+ - test/test_application.rb
77
+ - test/test_mixi.rb
78
+ - test/test_options.rb
79
+ - test/test_tweet.rb
80
+ - test/test_twitter_2_mixi_voice.rb
81
+ - test/test_twitter_client.rb