tweetwine 0.2.12 → 0.3.0

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.
Files changed (67) hide show
  1. data/CHANGELOG.rdoc +7 -0
  2. data/Gemfile +17 -0
  3. data/README.md +57 -47
  4. data/Rakefile +17 -26
  5. data/bin/tweetwine +11 -12
  6. data/contrib/tweetwine-completion.bash +2 -3
  7. data/example/application_behavior_example.rb +173 -0
  8. data/example/example_helper.rb +44 -28
  9. data/example/fixture/config.yaml +8 -0
  10. data/example/fixture/shorten_rubygems.html +5 -0
  11. data/example/fixture/shorten_rubylang.html +5 -0
  12. data/example/fixture/update_utf8.json +1 -0
  13. data/example/fixture/update_with_urls.json +1 -0
  14. data/example/fixture/{update.json → update_without_urls.json} +0 -0
  15. data/example/search_statuses_example.rb +49 -16
  16. data/example/show_followers_example.rb +7 -8
  17. data/example/show_friends_example.rb +7 -8
  18. data/example/show_home_example.rb +19 -16
  19. data/example/show_mentions_example.rb +8 -9
  20. data/example/show_user_example.rb +16 -13
  21. data/example/update_status_example.rb +143 -26
  22. data/example/use_http_proxy_example.rb +40 -20
  23. data/lib/tweetwine/basic_object.rb +19 -0
  24. data/lib/tweetwine/character_encoding.rb +59 -0
  25. data/lib/tweetwine/cli.rb +354 -230
  26. data/lib/tweetwine/config.rb +65 -0
  27. data/lib/tweetwine/http.rb +120 -0
  28. data/lib/tweetwine/oauth.rb +104 -0
  29. data/lib/tweetwine/obfuscate.rb +21 -0
  30. data/lib/tweetwine/option_parser.rb +31 -0
  31. data/lib/tweetwine/promise.rb +39 -0
  32. data/lib/tweetwine/twitter.rb +211 -0
  33. data/lib/tweetwine/{io.rb → ui.rb} +30 -21
  34. data/lib/tweetwine/url_shortener.rb +15 -9
  35. data/lib/tweetwine/util.rb +30 -15
  36. data/lib/tweetwine.rb +72 -12
  37. data/man/tweetwine.7 +43 -69
  38. data/man/tweetwine.7.ronn +57 -47
  39. data/test/character_encoding_test.rb +87 -0
  40. data/test/cli_test.rb +19 -6
  41. data/test/config_test.rb +244 -0
  42. data/test/fixture/oauth.rb +21 -0
  43. data/test/fixture/test_config.yaml +4 -4
  44. data/test/http_test.rb +199 -0
  45. data/test/oauth_test.rb +77 -0
  46. data/test/obfuscate_test.rb +16 -0
  47. data/test/option_parser_test.rb +60 -0
  48. data/test/promise_test.rb +56 -0
  49. data/test/test_helper.rb +76 -8
  50. data/test/twitter_test.rb +625 -0
  51. data/test/{io_test.rb → ui_test.rb} +92 -74
  52. data/test/url_shortener_test.rb +115 -135
  53. data/test/util_test.rb +136 -85
  54. data/tweetwine.gemspec +53 -0
  55. metadata +112 -56
  56. data/example/show_metadata_example.rb +0 -86
  57. data/lib/tweetwine/client.rb +0 -187
  58. data/lib/tweetwine/meta.rb +0 -5
  59. data/lib/tweetwine/options.rb +0 -24
  60. data/lib/tweetwine/retrying_http.rb +0 -99
  61. data/lib/tweetwine/startup_config.rb +0 -50
  62. data/man/tweetwine.1 +0 -109
  63. data/man/tweetwine.1.ronn +0 -69
  64. data/test/client_test.rb +0 -544
  65. data/test/options_test.rb +0 -45
  66. data/test/retrying_http_test.rb +0 -147
  67. data/test/startup_config_test.rb +0 -162
@@ -1,99 +0,0 @@
1
- # coding: utf-8
2
-
3
- require "rest_client"
4
-
5
- module Tweetwine
6
- class HttpError < RuntimeError; end
7
-
8
- module RetryingHttp
9
- def self.proxy=(url)
10
- RestClient.proxy = url
11
- end
12
-
13
- class Base
14
- MAX_RETRIES = 3
15
- RETRY_BASE_WAIT_TIMEOUT = 4
16
-
17
- def self.use_retries_with(*methods)
18
- methods.each do |method_name|
19
- module_eval do
20
- non_retrying_method_name = "original_#{method_name}".to_sym
21
- alias_method non_retrying_method_name, method_name
22
- define_method(method_name) do |*args|
23
- do_with_retries { send(non_retrying_method_name, *args).to_s }
24
- end
25
- end
26
- end
27
- end
28
-
29
- private
30
-
31
- def do_with_retries
32
- retries = 0
33
- begin
34
- yield
35
- rescue Errno::ECONNRESET, RestClient::RequestTimeout => e
36
- if retries < MAX_RETRIES
37
- retries += 1
38
- timeout = RETRY_BASE_WAIT_TIMEOUT**retries
39
- @io.warn("Could not connect -- retrying in #{timeout} seconds") if @io
40
- sleep timeout
41
- retry
42
- else
43
- raise HttpError, e
44
- end
45
- rescue RestClient::Exception, SocketError, SystemCallError => e
46
- raise HttpError, e
47
- end
48
- end
49
- end
50
-
51
- class Client < Base
52
- attr_accessor :io
53
-
54
- def initialize(io)
55
- @io = io
56
- end
57
-
58
- def get(*args)
59
- RestClient.get(*args)
60
- end
61
-
62
- def post(*args)
63
- RestClient.post(*args)
64
- end
65
-
66
- def as_resource(url, options = {})
67
- resource = Resource.new(RestClient::Resource.new(url, options))
68
- resource.io = @io
69
- resource
70
- end
71
-
72
- use_retries_with :get, :post
73
- end
74
-
75
- class Resource < Base
76
- attr_accessor :io
77
-
78
- def initialize(wrapped_resource)
79
- @wrapped = wrapped_resource
80
- end
81
-
82
- def [](suburl)
83
- instance = self.class.new(@wrapped[suburl])
84
- instance.io = @io
85
- instance
86
- end
87
-
88
- def get(*args)
89
- @wrapped.get(*args)
90
- end
91
-
92
- def post(*args)
93
- @wrapped.post(*args)
94
- end
95
-
96
- use_retries_with :get, :post
97
- end
98
- end
99
- end
@@ -1,50 +0,0 @@
1
- # coding: utf-8
2
-
3
- require "yaml"
4
-
5
- module Tweetwine
6
- class StartupConfig
7
- attr_reader :options, :command
8
-
9
- def initialize(supported_commands, default_command, default_opts = {})
10
- raise ArgumentError, "Must give at least one supported command" if supported_commands.empty?
11
- raise ArgumentError, "Default command is not a supported command" unless supported_commands.include? default_command
12
- @supported_commands, @default_command = supported_commands, default_command
13
- @options, @command = default_opts, nil
14
- end
15
-
16
- def parse(args = [], config_file = nil, env_lookouts = [], &cmd_option_parser)
17
- options = @options.merge(parse_options(args, config_file, env_lookouts, &cmd_option_parser))
18
- command = if args.empty? then @default_command else args.shift.to_sym end
19
- raise ArgumentError, "Unknown command" unless @supported_commands.include? command
20
- @options, @command = options, command
21
- self
22
- end
23
-
24
- private
25
-
26
- def parse_options(args, config_file, env_lookouts, &cmd_option_parser)
27
- cmd_options = if cmd_option_parser then parse_cmdline_args(args, &cmd_option_parser) else {} end
28
- config_options = if config_file && File.exists?(config_file) then parse_config_file(config_file) else {} end
29
- env_options = if env_lookouts then parse_env_vars(env_lookouts) else {} end
30
- env_options.merge(config_options.merge(cmd_options))
31
- end
32
-
33
- def parse_cmdline_args(args, &cmd_option_parser)
34
- yield args
35
- end
36
-
37
- def parse_config_file(config_file)
38
- options = YAML.load(File.read(config_file))
39
- Util.symbolize_hash_keys(options)
40
- end
41
-
42
- def parse_env_vars(env_lookouts)
43
- env_lookouts.inject({}) do |result, env_var_name|
44
- env_option = ENV[env_var_name.to_s]
45
- result[env_var_name.to_sym] = env_option if env_option && !env_option.empty?
46
- result
47
- end
48
- end
49
- end
50
- end
data/man/tweetwine.1 DELETED
@@ -1,109 +0,0 @@
1
- .\" generated with Ronn/v0.5
2
- .\" http://github.com/rtomayko/ronn/
3
- .
4
- .TH "TWEETWINE" "1" "April 2010" "Tuomas Kareinen" "Tweetwine Manual"
5
- .
6
- .SH "NAME"
7
- \fBtweetwine\fR \-\- a simple Twitter command line agent
8
- .
9
- .SH "SYNOPSIS"
10
- .
11
- .nf
12
-
13
- tweetwine [ <GLOBAL_OPTIONS> ]
14
- tweetwine [ <GLOBAL_OPTIONS> ] <COMMAND> [ <COMMAND_OPTIONS> ]
15
- .
16
- .fi
17
- .
18
- .SH "DESCRIPTION"
19
- Tweetwine supports showing the home timeline of the authenticated user, the
20
- latest statuses of friends and followers, and the latest statuses that mention
21
- the user. If that's not enough, statuses can be searched with arbitrary terms.
22
- In addition, new statuses can be sent.
23
- .
24
- .P
25
- \fICOMMAND\fR is one of
26
- .
27
- .IP "\(bu" 4
28
- \fBfollowers\fR,
29
- .
30
- .IP "\(bu" 4
31
- \fBfriends\fR,
32
- .
33
- .IP "\(bu" 4
34
- \fBhome\fR,
35
- .
36
- .IP "\(bu" 4
37
- \fBmentions\fR,
38
- .
39
- .IP "\(bu" 4
40
- \fBsearch\fR,
41
- .
42
- .IP "\(bu" 4
43
- \fBupdate\fR, or
44
- .
45
- .IP "\(bu" 4
46
- \fBuser\fR.
47
- .
48
- .IP "" 0
49
- .
50
- .P
51
- The default is \fBhome\fR.
52
- .
53
- .SH "OPTIONS"
54
- Options given from command line override corresponding settings from
55
- configuration (\fB~/.tweetwine\fR).
56
- .
57
- .P
58
- \fIGLOBAL_OPTIONS\fR are:
59
- .
60
- .TP
61
- \fB\-a\fR, \fB\-\-auth USERNAME:PASSWORD\fR
62
- Authentication.
63
- .
64
- .TP
65
- \fB\-c\fR, \fB\-\-[no\-]colors\fR
66
- Colorize output with ANSI escape codes.
67
- .
68
- .TP
69
- \fB\-n\fR, \fB\-\-num N\fR
70
- The number of statuses in page, default 20.
71
- .
72
- .TP
73
- \fB\-\-[no\-]http\-proxy URL\fR
74
- Use proxy for HTTP and HTTPS.
75
- .
76
- .TP
77
- \fB\-\-no\-url\-shorten\fR
78
- Do not shorten URLs for status update.
79
- .
80
- .TP
81
- \fB\-p\fR, \fB\-\-page N\fR
82
- The page number for statuses, default 1.
83
- .
84
- .TP
85
- \fB\-v\fR, \fB\-\-version\fR
86
- Show version information and exit.
87
- .
88
- .TP
89
- \fB\-h\fR, \fB\-\-help\fR
90
- Show help message and exit.
91
- .
92
- .P
93
- In order to see \fICOMMAND_OPTIONS\fR, enter:
94
- .
95
- .IP "" 4
96
- .
97
- .nf
98
-
99
- $ tweetwine help <COMMAND>
100
- .
101
- .fi
102
- .
103
- .IP "" 0
104
- .
105
- .SH "COPYRIGHT"
106
- Tweetwine is Copyright (c) 2009\-2010 Tuomas Kareinen
107
- .
108
- .SH "SEE ALSO"
109
- tweetwine(7), \fIhttp://github.com/tuomas/tweetwine\fR
data/man/tweetwine.1.ronn DELETED
@@ -1,69 +0,0 @@
1
- tweetwine(1) -- a simple Twitter command line agent
2
- ===================================================
3
-
4
- ## SYNOPSIS
5
-
6
- tweetwine [ <GLOBAL_OPTIONS> ]
7
- tweetwine [ <GLOBAL_OPTIONS> ] <COMMAND> [ <COMMAND_OPTIONS> ]
8
-
9
- ## DESCRIPTION
10
-
11
- Tweetwine supports showing the home timeline of the authenticated user, the
12
- latest statuses of friends and followers, and the latest statuses that mention
13
- the user. If that's not enough, statuses can be searched with arbitrary terms.
14
- In addition, new statuses can be sent.
15
-
16
- <COMMAND> is one of
17
-
18
- * `followers`,
19
- * `friends`,
20
- * `home`,
21
- * `mentions`,
22
- * `search`,
23
- * `update`, or
24
- * `user`.
25
-
26
- The default is `home`.
27
-
28
- ## OPTIONS
29
-
30
- Options given from command line override corresponding settings from
31
- configuration (`~/.tweetwine`).
32
-
33
- <GLOBAL_OPTIONS> are:
34
-
35
- * `-a`, `--auth USERNAME:PASSWORD`:
36
- Authentication.
37
-
38
- * `-c`, `--[no-]colors`:
39
- Colorize output with ANSI escape codes.
40
-
41
- * `-n`, `--num N`:
42
- The number of statuses in page, default 20.
43
-
44
- * `--[no-]http-proxy URL`:
45
- Use proxy for HTTP and HTTPS.
46
-
47
- * `--no-url-shorten`:
48
- Do not shorten URLs for status update.
49
-
50
- * `-p`, `--page N`:
51
- The page number for statuses, default 1.
52
-
53
- * `-v`, `--version`:
54
- Show version information and exit.
55
-
56
- * `-h`, `--help`:
57
- Show help message and exit.
58
-
59
- In order to see <COMMAND_OPTIONS>, enter:
60
-
61
- $ tweetwine help <COMMAND>
62
-
63
- ## COPYRIGHT
64
-
65
- Tweetwine is Copyright (c) 2009-2010 Tuomas Kareinen
66
-
67
- ## SEE ALSO
68
-
69
- tweetwine(7), <http://github.com/tuomas/tweetwine>