tweetwine 0.2.8 → 0.2.9

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.rdoc CHANGED
@@ -1,3 +1,8 @@
1
+ === 0.2.9 released 2010-02-24
2
+
3
+ * HTTP proxy support
4
+ * A Bash completion support script is packed in the gem
5
+
1
6
  === 0.2.8 released 2010-01-17
2
7
 
3
8
  * Unescape basic HTML encoding when displaying statuses
data/README.rdoc CHANGED
@@ -2,11 +2,19 @@
2
2
 
3
3
  A simple but tasty Twitter agent for command line use, made for fun.
4
4
 
5
+ == Features
6
+
7
+ * Simple to use command line interface, with Bash completion support
8
+ * ANSI coloring of statuses, but in discreet manner
9
+ * Supports shortening URLs in a status update with a configurable shortening
10
+ service
11
+ * Configuration file for preferred settings
12
+
5
13
  == Installation
6
14
 
7
- Install Tweetwine as a RubyGem from Gemcutter[http://gemcutter.org/]:
15
+ Install Tweetwine as a RubyGem:
8
16
 
9
- $ sudo gem install tweetwine --source http://gemcutter.org
17
+ $ gem install tweetwine
10
18
 
11
19
  The program is compatible with both Ruby 1.8 and 1.9.
12
20
 
@@ -76,6 +84,28 @@ The feature can be disabled by
76
84
 
77
85
  The use of the feature requires <b>nokogiri</b> gem to be installed.
78
86
 
87
+ === HTTP proxy setting
88
+
89
+ If <tt>$http_proxy</tt> environment variable is set, Tweetwine attempts to use
90
+ the URL in the environment variable as HTTP proxy for all its HTTP
91
+ connections. This setting can be overridden with <tt>--http-proxy</tt> and
92
+ <tt>--no-http-proxy</tt> command line options.
93
+
94
+ === Bash command line completion support
95
+
96
+ Bash shell supports command line completion via tab character. If you want to
97
+ enable Tweetwine specific completion with Bash, source the file
98
+ <tt>tweetwine-completion.bash</tt>, located in <tt>contrib</tt> directory:
99
+
100
+ . contrib/tweetwine-completion.bash
101
+
102
+ In order to do this automatically when your shell starts, insert the following
103
+ snippet to your Bash initialization script (such as <tt>~/.bashrc</tt>):
104
+
105
+ if [ -f <path_to_tweetwine>/contrib/tweetwine-completion.bash ]; then
106
+ . <path_to_tweetwine>/contrib/tweetwine-completion.bash
107
+ fi
108
+
79
109
  == Contacting
80
110
 
81
111
  Please send feedback by email to Tuomas Kareinen < tkareine (at) gmail (dot)
data/Rakefile CHANGED
@@ -4,7 +4,7 @@ require "rubygems"
4
4
 
5
5
  name = "tweetwine"
6
6
  require "#{name}"
7
- version = Tweetwine::VERSION
7
+ version = Tweetwine::VERSION.dup
8
8
 
9
9
  require "rake/clean"
10
10
 
@@ -20,7 +20,15 @@ spec = Gem::Specification.new do |s|
20
20
  s.email = "tkareine@gmail.com"
21
21
 
22
22
  s.platform = Gem::Platform::RUBY
23
- s.files = FileList["Rakefile", "MIT-LICENSE.txt", "*.rdoc", "bin/**/*", "example/**/*", "lib/**/*", "test/**/*"].to_a
23
+ s.files = FileList[
24
+ "Rakefile",
25
+ "MIT-LICENSE.txt",
26
+ "*.rdoc",
27
+ "bin/**/*",
28
+ "contrib/**/*",
29
+ "example/**/*",
30
+ "lib/**/*",
31
+ "test/**/*"].to_a
24
32
  s.executables = ["tweetwine"]
25
33
 
26
34
  s.add_dependency("rest-client", ">= 1.0.0")
@@ -47,12 +55,12 @@ end
47
55
 
48
56
  desc "Install the software as a gem"
49
57
  task :install => [:package] do
50
- sh %{sudo gem install pkg/#{name}-#{version}.gem}
58
+ sh %{gem install pkg/#{name}-#{version}.gem}
51
59
  end
52
60
 
53
61
  desc "Uninstall the gem"
54
62
  task :uninstall => [:clean] do
55
- sh %{sudo gem uninstall #{name}}
63
+ sh %{gem uninstall #{name}}
56
64
  end
57
65
 
58
66
  require "rake/rdoctask"
@@ -0,0 +1,28 @@
1
+ _tweetwine_completion ()
2
+ {
3
+ local cur prev cmds gopts
4
+ cur="${COMP_WORDS[COMP_CWORD]}"
5
+ prev="${COMP_WORDS[COMP_CWORD-1]}"
6
+ cmds="followers friends home mentions search update user"
7
+ gopts="--auth --colors --num --no-colors --no-url-shorten --page --version"
8
+
9
+ case "${prev}" in
10
+ followers | friends | home | mentions | search | update | user)
11
+ COMPREPLY=()
12
+ ;;
13
+ help)
14
+ COMPREPLY=( $(compgen -W "${cmds}" -- ${cur}) )
15
+ ;;
16
+ *)
17
+ if [[ "${cur}" == -* ]]; then
18
+ COMPREPLY=( $(compgen -W "${gopts}" -- ${cur}) )
19
+ else
20
+ COMPREPLY=( $(compgen -W "${cmds} help" -- ${cur}) )
21
+ fi
22
+ ;;
23
+ esac
24
+
25
+ return 0
26
+ }
27
+
28
+ complete -F _tweetwine_completion tweetwine
@@ -8,6 +8,7 @@
8
8
  timecop
9
9
  }.each { |lib| require lib }
10
10
 
11
+ FakeWeb.clean_registry
11
12
  FakeWeb.allow_net_connect = false
12
13
  Timecop.freeze(Time.parse("2009-10-14 01:56:15 +0300"))
13
14
 
@@ -18,6 +19,7 @@ module Tweetwine
18
19
  TEST_USER = "fooman"
19
20
  TEST_PASSWD = "barpwd"
20
21
  TEST_AUTH = "#{TEST_USER}:#{TEST_PASSWD}"
22
+ TEST_PROXY_URL = "http://proxy.net:8080"
21
23
 
22
24
  def launch_app(args, &blk)
23
25
  lib = File.dirname(__FILE__) << "/../lib"
@@ -47,8 +47,10 @@ Usage: tweetwine [global_options...] [command] [command_options...]
47
47
  -c, --colors Colorize output with ANSI escape codes
48
48
  -n, --num N The number of statuses in page, default 20
49
49
  --no-colors Do not use ANSI colors
50
+ --no-http-proxy Do not use proxy for HTTP and HTTPS
50
51
  --no-url-shorten Do not shorten URLs for status update
51
52
  -p, --page N The page number for statuses, default 1
53
+ --http-proxy URL Use proxy for HTTP and HTTPS
52
54
  -v, --version Show version information and exit
53
55
  -h, --help Show this help message and exit
54
56
  END
@@ -0,0 +1,45 @@
1
+ require "example_helper"
2
+
3
+ FakeWeb.register_uri(:get, "https://#{TEST_AUTH}@twitter.com/statuses/home_timeline.json?count=20&page=1", :body => fixture("home.json"))
4
+
5
+ Feature "using HTTP proxy setting" do
6
+ in_order_to "tweet behind an HTTP proxy"
7
+ as_a "authenticated user"
8
+ i_want_to "tweet as before"
9
+
10
+ Scenario "Proxy is enabled via environment variable" do
11
+ When "application is launched" do
12
+ ENV['http_proxy'] = TEST_PROXY_URL
13
+ @output = launch_cli(%W{-a #{TEST_AUTH} --no-colors})
14
+ end
15
+
16
+ Then "the latest statuses in the home view are shown via proxy" do
17
+ RestClient.proxy.should == TEST_PROXY_URL
18
+ @output[0].should == "pelit, 11 days ago:"
19
+ end
20
+ end
21
+
22
+ Scenario "Proxy is enabled via command line option" do
23
+ When "application is launched with --http-proxy" do
24
+ ENV['http_proxy'] = nil
25
+ @output = launch_cli(%W{-a #{TEST_AUTH} --no-colors --http-proxy #{TEST_PROXY_URL}})
26
+ end
27
+
28
+ Then "the latest statuses in the home view are shown via proxy" do
29
+ RestClient.proxy.should == TEST_PROXY_URL
30
+ @output[0].should == "pelit, 11 days ago:"
31
+ end
32
+ end
33
+
34
+ Scenario "Proxy is disabled via command line option" do
35
+ When "application is launched with --no-http-proxy" do
36
+ ENV['http_proxy'] = TEST_PROXY_URL
37
+ @output = launch_cli(%W{-a #{TEST_AUTH} --no-colors --no-http-proxy})
38
+ end
39
+
40
+ Then "the latest statuses in the home view are shown via proxy" do
41
+ RestClient.proxy.should == nil
42
+ @output[0].should == "pelit, 11 days ago:"
43
+ end
44
+ end
45
+ end
data/lib/tweetwine/cli.rb CHANGED
@@ -36,7 +36,7 @@ module Tweetwine
36
36
  def initialize(args, exec_name, config_file, extra_opts = {}, &dependencies_blk)
37
37
  @global_option_parser = create_global_option_parser(exec_name)
38
38
  @config = StartupConfig.new(Client::COMMANDS + [:help], Client::DEFAULT_COMMAND, extra_opts)
39
- @config.parse(args, config_file, &@global_option_parser)
39
+ @config.parse(args, config_file, [:http_proxy], &@global_option_parser)
40
40
  @client = Client.new(dependencies_blk.call(@config.options), @config.options) if @config.command != :help
41
41
  end
42
42
 
@@ -119,6 +119,11 @@ Usage: #{exec_name} [global_options...] [command] [command_options...]
119
119
  :desc => "Do not use ANSI colors",
120
120
  :action => lambda { |arg| parsed[:colors] = false }
121
121
  },
122
+ {
123
+ :long => "--no-http-proxy",
124
+ :desc => "Do not use proxy for HTTP and HTTPS",
125
+ :action => lambda { |arg| parsed[:http_proxy] = nil }
126
+ },
122
127
  {
123
128
  :long => "--no-url-shorten",
124
129
  :desc => "Do not shorten URLs for status update",
@@ -131,6 +136,12 @@ Usage: #{exec_name} [global_options...] [command] [command_options...]
131
136
  :desc => "The page number for statuses, default #{Client::DEFAULT_PAGE_NUM}",
132
137
  :action => lambda { |arg| parsed[:page_num] = arg }
133
138
  },
139
+ {
140
+ :long => "--http-proxy URL",
141
+ :type => String,
142
+ :desc => "Use proxy for HTTP and HTTPS",
143
+ :action => lambda { |arg| parsed[:http_proxy] = arg }
144
+ },
134
145
  {
135
146
  :short => "-v",
136
147
  :long => "--version",
@@ -18,6 +18,7 @@ module Tweetwine
18
18
  @io = dependencies.io
19
19
  @username = options[:username].to_s
20
20
  raise ArgumentError, "No authentication data given" if @username.empty?
21
+ RetryingHttp.proxy = options[:http_proxy] if options[:http_proxy]
21
22
  @http_client = dependencies.http_client
22
23
  @http_resource = @http_client.as_resource("https://twitter.com", :user => @username, :password => options[:password])
23
24
  @num_statuses = Util.parse_int_gt(options[:num_statuses], DEFAULT_NUM_STATUSES, 1, "number of statuses_to_show")
@@ -1,3 +1,3 @@
1
1
  module Tweetwine
2
- VERSION = "0.2.8"
2
+ VERSION = "0.2.9".freeze
3
3
  end
@@ -4,6 +4,10 @@ module Tweetwine
4
4
  class HttpError < RuntimeError; end
5
5
 
6
6
  module RetryingHttp
7
+ def self.proxy=(url)
8
+ RestClient.proxy = url
9
+ end
10
+
7
11
  class Base
8
12
  MAX_RETRIES = 3
9
13
  RETRY_BASE_WAIT_TIMEOUT = 4
@@ -11,8 +11,8 @@ module Tweetwine
11
11
  @options, @command = default_opts, nil
12
12
  end
13
13
 
14
- def parse(args = [], config_file = nil, &cmd_option_parser)
15
- options = @options.merge(parse_options(args, config_file, &cmd_option_parser))
14
+ def parse(args = [], config_file = nil, env_lookouts = [], &cmd_option_parser)
15
+ options = @options.merge(parse_options(args, config_file, env_lookouts, &cmd_option_parser))
16
16
  command = if args.empty? then @default_command else args.shift.to_sym end
17
17
  raise ArgumentError, "Unknown command" unless @supported_commands.include? command
18
18
  @options, @command = options, command
@@ -21,10 +21,11 @@ module Tweetwine
21
21
 
22
22
  private
23
23
 
24
- def parse_options(args, config_file, &cmd_option_parser)
24
+ def parse_options(args, config_file, env_lookouts, &cmd_option_parser)
25
25
  cmd_options = if cmd_option_parser then parse_cmdline_args(args, &cmd_option_parser) else {} end
26
26
  config_options = if config_file && File.exists?(config_file) then parse_config_file(config_file) else {} end
27
- config_options.merge(cmd_options)
27
+ env_options = if env_lookouts then parse_env_vars(env_lookouts) else {} end
28
+ env_options.merge(config_options.merge(cmd_options))
28
29
  end
29
30
 
30
31
  def parse_cmdline_args(args, &cmd_option_parser)
@@ -35,5 +36,13 @@ module Tweetwine
35
36
  options = YAML.load(File.read(config_file))
36
37
  Util.symbolize_hash_keys(options)
37
38
  end
39
+
40
+ def parse_env_vars(env_lookouts)
41
+ env_lookouts.inject({}) do |result, env_var_name|
42
+ env_option = ENV[env_var_name.to_s]
43
+ result[env_var_name.to_sym] = env_option if env_option && !env_option.empty?
44
+ result
45
+ end
46
+ end
38
47
  end
39
48
  end
@@ -8,6 +8,22 @@ end
8
8
  module Tweetwine
9
9
  module RetryingHttp
10
10
 
11
+ class ModuleTest < Test::Unit::TestCase
12
+ context "When using HTTP proxy" do
13
+ setup do
14
+ RetryingHttp.proxy = "http://proxy.net:8080"
15
+ end
16
+
17
+ should "pass HTTP proxy configuration to RestClient" do
18
+ assert_equal "http://proxy.net:8080", RestClient.proxy
19
+ end
20
+
21
+ teardown do
22
+ RetryingHttp.proxy = nil
23
+ end
24
+ end
25
+ end
26
+
11
27
  class ClientTest < Test::Unit::TestCase
12
28
  context "A Client instance" do
13
29
  setup do
@@ -26,7 +26,10 @@ class StartupConfigTest < Test::Unit::TestCase
26
26
 
27
27
  context "at runtime" do
28
28
  setup do
29
- @config = StartupConfig.new([:default_action, :another_action], :default_action, {:defopt => 42})
29
+ @config = StartupConfig.new(
30
+ [:default_action, :another_action],
31
+ :default_action,
32
+ {:defopt => 42})
30
33
  end
31
34
 
32
35
  should "use the default command when given no command as a cmdline argument" do
@@ -48,7 +51,7 @@ class StartupConfigTest < Test::Unit::TestCase
48
51
  end
49
52
  end
50
53
 
51
- context "when given cmdline args and no config file" do
54
+ context "when given cmdline args and no config file and no environment variables" do
52
55
  setup do
53
56
  @cmd_args = %w{--opt bar --another_opt baz another_action left overs}
54
57
  @config.parse(@cmd_args) do |args|
@@ -61,7 +64,7 @@ class StartupConfigTest < Test::Unit::TestCase
61
64
  assert_equal "baz", @config.options[:nopt]
62
65
  end
63
66
 
64
- should "override default options with the options given as cmdline args" do
67
+ should "override the default value for the option given as a cmdline arg" do
65
68
  assert_equal 56, @config.options[:defopt]
66
69
  end
67
70
 
@@ -78,7 +81,7 @@ class StartupConfigTest < Test::Unit::TestCase
78
81
  end
79
82
  end
80
83
 
81
- context "when given no cmdline args and a config file" do
84
+ context "when given a config file and no cmdline args and no environment variables" do
82
85
  setup do
83
86
  @config.parse([], TEST_CONFIG_FILE)
84
87
  end
@@ -87,24 +90,69 @@ class StartupConfigTest < Test::Unit::TestCase
87
90
  assert_equal false, @config.options[:colors]
88
91
  end
89
92
 
90
- should "override default options with the options given from the config file" do
93
+ should "override the default value for the option given from the config file" do
91
94
  assert_equal 78, @config.options[:defopt]
92
95
  end
93
96
  end
94
97
 
95
- context "when given an option both as a cmdline option and in a config file" do
98
+ context "when given an environment variable and no cmdline args no config file" do
96
99
  setup do
97
- @config.parse(%w{--colors}, TEST_CONFIG_FILE) do |args|
100
+ ENV['colors'] = "baba"
101
+ ENV['defopt'] = "zaza"
102
+ ENV['blank'] = ""
103
+ @config.parse([], nil, [:colors, :defopt])
104
+ end
105
+
106
+ should "have the parsed option defined" do
107
+ assert_equal "baba", @config.options[:colors]
108
+ end
109
+
110
+ should "override default value for the option given as an environment variable" do
111
+ assert_equal "zaza", @config.options[:defopt]
112
+ end
113
+
114
+ should "not pass blank environment variable" do
115
+ assert_equal nil, @config.options[:blank]
116
+ end
117
+
118
+ teardown do
119
+ ENV['colors'] = ENV['defopt'] = ENV['blank'] = nil
120
+ end
121
+ end
122
+
123
+ context "when given an option as a cmdline option and in a config file and as an environment variable" do
124
+ setup do
125
+ @config.parse(%w{--colors}, TEST_CONFIG_FILE, [:colors, :defopt]) do |args|
98
126
  args.clear
99
127
  {:defopt => 56, :colors => true}
100
128
  end
101
129
  end
102
130
 
103
- should "the command line option should override the config file option" do
131
+ should "the command line option should override all other option sources" do
104
132
  assert_equal true, @config.options[:colors]
105
133
  assert_equal 56, @config.options[:defopt]
106
134
  end
107
135
  end
136
+
137
+ context "when given an option from a config file and as an environment variable" do
138
+ setup do
139
+ ENV['colors'] = "baba"
140
+ ENV['defopt'] = "zaza"
141
+ @config.parse(%w{}, TEST_CONFIG_FILE, [:colors, :defopt]) do |args|
142
+ args.clear
143
+ {}
144
+ end
145
+ end
146
+
147
+ should "the config file option should override environment variable" do
148
+ assert_equal false, @config.options[:colors]
149
+ assert_equal 78, @config.options[:defopt]
150
+ end
151
+
152
+ teardown do
153
+ ENV['colors'] = ENV['defopt'] = nil
154
+ end
155
+ end
108
156
  end
109
157
  end
110
158
  end
data/test/util_test.rb CHANGED
@@ -111,50 +111,47 @@ class UtilTest < Test::Unit::TestCase
111
111
  end
112
112
 
113
113
  context "for percent-encoding strings" do
114
- should "not encode safe characters" do
115
- assert_equal "a", Util.percent_encode("a")
116
- assert_equal "B", Util.percent_encode("B")
117
- assert_equal "3", Util.percent_encode("3")
118
- assert_equal ".", Util.percent_encode(".")
119
- assert_equal "-", Util.percent_encode("-")
120
- assert_equal "_", Util.percent_encode("_")
114
+ %w{a B 3 . - _}.each do |char|
115
+ should "not encode safe characters, case '#{char}'" do
116
+ assert_equal char, Util.percent_encode(char)
117
+ end
121
118
  end
122
119
 
123
120
  should "encode space character with percent-encoding, not with '+' character" do
124
121
  assert_equal "%20", Util.percent_encode(" ")
125
122
  end
126
123
 
127
- should "encode unsafe characters that URI.encode leaves by default unencoded" do
128
- assert_equal "&", URI.encode("&")
129
- assert_equal "%26", Util.percent_encode("&")
130
- assert_equal "?", URI.encode("?")
131
- assert_equal "%3F", Util.percent_encode("?")
132
- assert_equal "/", URI.encode("/")
133
- assert_equal "%2F", Util.percent_encode("/")
134
- assert_equal ":", URI.encode(":")
135
- assert_equal "%3A", Util.percent_encode(":")
136
- assert_equal ",", URI.encode(",")
137
- assert_equal "%2C", Util.percent_encode(",")
124
+ [
125
+ %w{& %26},
126
+ %w{? %3F},
127
+ %w{/ %2F},
128
+ %w{: %3A},
129
+ %w{, %2C}
130
+ ].each do |input, expected|
131
+ should "encode unsafe characters that URI.encode leaves by default unencoded, case '#{input}'" do
132
+ assert_equal input, URI.encode(input)
133
+ assert_equal expected, Util.percent_encode(input)
134
+ end
138
135
  end
139
136
  end
140
137
 
141
138
  context "for unescaping HTML" do
142
- should "not affect already unescaped characters" do
143
- assert_equal "a", Util.unescape_html("a")
144
- assert_equal "B", Util.unescape_html("B")
145
- assert_equal "3", Util.unescape_html("3")
146
- assert_equal ".", Util.unescape_html(".")
147
- assert_equal "-", Util.unescape_html("-")
148
- assert_equal "_", Util.unescape_html("_")
149
- assert_equal "+", Util.unescape_html("+")
150
- end
151
-
152
- should "unescape HTML-escaped characters" do
153
- assert_equal "<", Util.unescape_html("&lt;")
154
- assert_equal ">", Util.unescape_html("&gt;")
155
- assert_equal "&", Util.unescape_html("&amp;")
156
- assert_equal "\"", Util.unescape_html("&quot;")
157
- assert_equal " ", Util.unescape_html("&nbsp;")
139
+ %w{a B 3 . - _ +}.each do |char|
140
+ should "not affect already unescaped characters, case '#{char}'" do
141
+ assert_equal char, Util.unescape_html(char)
142
+ end
143
+ end
144
+
145
+ [
146
+ %w{&lt; <},
147
+ %w{&gt; >},
148
+ %w{&amp; &},
149
+ %w{&quot; "},
150
+ %W{&nbsp; \ }
151
+ ].each do |input, expected|
152
+ should "unescape HTML-escaped characters, case '#{input}'" do
153
+ assert_equal expected, Util.unescape_html(input)
154
+ end
158
155
  end
159
156
  end
160
157
 
metadata CHANGED
@@ -1,7 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tweetwine
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.8
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 2
8
+ - 9
9
+ version: 0.2.9
5
10
  platform: ruby
6
11
  authors:
7
12
  - Tuomas Kareinen
@@ -9,19 +14,23 @@ autorequire:
9
14
  bindir: bin
10
15
  cert_chain: []
11
16
 
12
- date: 2010-01-17 00:00:00 +02:00
17
+ date: 2010-02-24 00:00:00 +02:00
13
18
  default_executable:
14
19
  dependencies:
15
20
  - !ruby/object:Gem::Dependency
16
21
  name: rest-client
17
- type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
20
24
  requirements:
21
25
  - - ">="
22
26
  - !ruby/object:Gem::Version
27
+ segments:
28
+ - 1
29
+ - 0
30
+ - 0
23
31
  version: 1.0.0
24
- version:
32
+ type: :runtime
33
+ version_requirements: *id001
25
34
  description: A simple but tasty Twitter agent for command line use, made for fun.
26
35
  email: tkareine@gmail.com
27
36
  executables:
@@ -38,6 +47,7 @@ files:
38
47
  - CHANGELOG.rdoc
39
48
  - README.rdoc
40
49
  - bin/tweetwine
50
+ - contrib/tweetwine-completion.bash
41
51
  - example/example_helper.rb
42
52
  - example/fixtures/home.json
43
53
  - example/fixtures/mentions.json
@@ -53,6 +63,7 @@ files:
53
63
  - example/show_metadata_example.rb
54
64
  - example/show_user_example.rb
55
65
  - example/update_status_example.rb
66
+ - example/use_http_proxy_example.rb
56
67
  - lib/tweetwine/cli.rb
57
68
  - lib/tweetwine/client.rb
58
69
  - lib/tweetwine/io.rb
@@ -80,7 +91,7 @@ licenses: []
80
91
  post_install_message:
81
92
  rdoc_options:
82
93
  - --title
83
- - tweetwine 0.2.8
94
+ - tweetwine 0.2.9
84
95
  - --main
85
96
  - README.rdoc
86
97
  - --exclude
@@ -92,18 +103,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
92
103
  requirements:
93
104
  - - ">="
94
105
  - !ruby/object:Gem::Version
106
+ segments:
107
+ - 0
95
108
  version: "0"
96
- version:
97
109
  required_rubygems_version: !ruby/object:Gem::Requirement
98
110
  requirements:
99
111
  - - ">="
100
112
  - !ruby/object:Gem::Version
113
+ segments:
114
+ - 0
101
115
  version: "0"
102
- version:
103
116
  requirements: []
104
117
 
105
118
  rubyforge_project:
106
- rubygems_version: 1.3.5
119
+ rubygems_version: 1.3.6
107
120
  signing_key:
108
121
  specification_version: 3
109
122
  summary: A simple Twitter agent for command line use