twurl 0.9.6 → 0.9.7

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7e12cf717906fbf24bcd34598212105569647dbed1f6b5ee37a195ec0db8ca15
4
- data.tar.gz: c5d7a22975a06fccc328a99323ead35584104e77fcf3827611d9cf279ccb22bf
3
+ metadata.gz: 9120a8daa09529e8e484e2bc15da6042ea1ced1100b1a23c8ea2a2481e194f2b
4
+ data.tar.gz: 549c25417c3e00e35bab15fb9299a6103b3a01717a3a56b9c78cc388cd1c20fb
5
5
  SHA512:
6
- metadata.gz: daf4dae500fb05b24eaed8413538420bf66d5f113982663e7e3bd416df6d4a98eef31b982eac9174eaa251421aef512db60bd3675c4ae55529ef009603a070de
7
- data.tar.gz: 7ef9671671c1d946f0671147b49c8485b21da16837a1c890b2e67b28f5b3f4ed2065e9b896ae9a3533d92bb384908c79f0fd72543adb5a06626aec0390d98f2c
6
+ metadata.gz: 3df6c245df33cccfaec2ed2a28d370b5ed3de81a1f96bfb17b5852b4cce209bae975bdbfe9d9fdf7bd117f8bbd8826b4265a3acb5cc509103032ebcf2dc405ac
7
+ data.tar.gz: 300977ca1182b02d1f1673754b49e015a9e38b5c064967044f5243252097e6caf29a4d37ec0c385e35460a1db34265e2d7947449427abf83bc868d75cfb5833f
data/INSTALL.md CHANGED
@@ -10,7 +10,7 @@ $ gem install twurl
10
10
  ```sh
11
11
  # verify installation
12
12
  $ twurl -v
13
- 0.9.6
13
+ 0.9.7
14
14
  ```
15
15
 
16
16
  ## Install from source
@@ -32,5 +32,5 @@ If you don't want to install Twurl globally on your system, use `--path` [option
32
32
  ```
33
33
  $ bundle install --path path/to/directory
34
34
  $ bundle exec twurl -v
35
- 0.9.6
35
+ 0.9.7
36
36
  ```
data/README.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # Twurl
2
2
 
3
3
  [![MIT License](https://img.shields.io/apm/l/atomic-design-ui.svg?)](https://github.com/twitter/twurl/blob/master/LICENSE)
4
- [![Gem Version](https://badge.fury.io/rb/twurl.svg)](https://badge.fury.io/rb/twurl)
5
- [![Build Status](https://travis-ci.com/twitter/twurl.svg?branch=master)](https://travis-ci.com/twitter/twurl)
4
+ [![Gem Version](https://badge.fury.io/rb/twurl.svg)](https://badge.fury.io/rb/twurl)
5
+ [![CI](https://github.com/twitter/twurl/actions/workflows/ci.yml/badge.svg)](https://github.com/twitter/twurl/actions/workflows/ci.yml)
6
6
 
7
7
  Twurl is like curl, but tailored specifically for the Twitter API.
8
8
  It knows how to grant an access token to a client application for
@@ -15,9 +15,13 @@ module Twurl
15
15
  end
16
16
  when 1
17
17
  if options.path
18
- OAuthClient.rcfile.alias(options.subcommands.first, options.path)
18
+ if Twurl::CLI::SUPPORTED_COMMANDS.include?(options.subcommands.first)
19
+ raise Exception, "ERROR: '#{options.subcommands.first}' is reserved for commands. Please use different alias name."
20
+ else
21
+ OAuthClient.rcfile.alias(options.subcommands.first, options.path)
22
+ end
19
23
  else
20
- CLI.puts NO_PATH_PROVIDED_MESSAGE
24
+ raise Exception, NO_PATH_PROVIDED_MESSAGE
21
25
  end
22
26
  end
23
27
  end
@@ -57,12 +57,9 @@ module Twurl
57
57
  http.set_debug_output(Twurl.options.debug_output_io) if Twurl.options.trace
58
58
  http.read_timeout = http.open_timeout = Twurl.options.timeout || 60
59
59
  http.open_timeout = Twurl.options.connection_timeout if Twurl.options.connection_timeout
60
- # Only override if Net::HTTP support max_retries (since Ruby >= 2.5)
61
- http.max_retries = 0 if http.respond_to?(:max_retries=)
62
- if Twurl.options.ssl?
63
- http.use_ssl = true
64
- http.verify_mode = OpenSSL::SSL::VERIFY_NONE
65
- end
60
+ http.max_retries = 0
61
+ http.use_ssl = true
62
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
66
63
  http
67
64
  end
68
65
 
data/lib/twurl/cli.rb CHANGED
@@ -6,8 +6,6 @@ module Twurl
6
6
  PROTOCOL_PATTERN = /^\w+:\/\//
7
7
  README = File.dirname(__FILE__) + '/../../README.md'
8
8
  @output ||= STDOUT
9
- class NoPathFound < Exception
10
- end
11
9
 
12
10
  class << self
13
11
  attr_accessor :output
@@ -15,8 +13,8 @@ module Twurl
15
13
  def run(args)
16
14
  begin
17
15
  options = parse_options(args)
18
- rescue NoPathFound => e
19
- exit
16
+ rescue Twurl::Exception => exception
17
+ abort(exception.message)
20
18
  end
21
19
  dispatch(options)
22
20
  end
@@ -80,7 +78,6 @@ Supported Commands: #{SUPPORTED_COMMANDS.sort.join(', ')}
80
78
  headers
81
79
  host
82
80
  quiet
83
- disable_ssl
84
81
  request_method
85
82
  help
86
83
  version
@@ -98,11 +95,11 @@ Supported Commands: #{SUPPORTED_COMMANDS.sort.join(', ')}
98
95
  begin
99
96
  arguments = option_parser.parse!(args)
100
97
  rescue OptionParser::InvalidOption
101
- CLI.puts "ERROR: undefined option"
102
- exit
98
+ raise Exception "ERROR: undefined option"
99
+ rescue Twurl::Exception
100
+ raise
103
101
  rescue
104
- CLI.puts "ERROR: invalid argument"
105
- exit
102
+ raise Exception "ERROR: invalid argument"
106
103
  end
107
104
  Twurl.options.command = extract_command!(arguments)
108
105
  Twurl.options.path = extract_path!(arguments)
@@ -110,7 +107,7 @@ Supported Commands: #{SUPPORTED_COMMANDS.sort.join(', ')}
110
107
 
111
108
  if Twurl.options.command == DEFAULT_COMMAND and Twurl.options.path.nil? and Twurl.options.args.empty?
112
109
  CLI.puts option_parser
113
- raise NoPathFound, "No path found"
110
+ raise Exception, "No path found"
114
111
  end
115
112
 
116
113
  Twurl.options
@@ -172,7 +169,7 @@ Supported Commands: #{SUPPORTED_COMMANDS.sort.join(', ')}
172
169
 
173
170
  def escape_params(params)
174
171
  CGI::parse(params).map do |key, value|
175
- "#{CGI.escape key}=#{CGI.escape value.first}"
172
+ "#{CGI.escape(key)}=#{CGI.escape(value.first)}"
176
173
  end.join("&")
177
174
  end
178
175
  end
@@ -234,12 +231,12 @@ Supported Commands: #{SUPPORTED_COMMANDS.sort.join(', ')}
234
231
 
235
232
  def data
236
233
  on('-d', '--data [data]', 'Sends the specified data in a POST request to the HTTP server.') do |data|
237
- if options.args.count { |item| /content-type: (.*)/i.match(item) } > 0
238
- options.data[data] = nil
234
+ if options.args.count { |item| /^content-type:\s+application\/json/i.match(item) } > 0
235
+ options.json_data = true
236
+ options.data = data
239
237
  else
240
- data.split('&').each do |pair|
241
- key, value = pair.split('=', 2)
242
- options.data[key] = value
238
+ CGI.parse(data).each_pair do |key, value|
239
+ options.data[key] = value.first
243
240
  end
244
241
  end
245
242
  end
@@ -247,9 +244,13 @@ Supported Commands: #{SUPPORTED_COMMANDS.sort.join(', ')}
247
244
 
248
245
  def raw_data
249
246
  on('-r', '--raw-data [data]', 'Sends the specified data as it is in a POST request to the HTTP server.') do |data|
250
- CGI::parse(data).each_pair do |key, value|
251
- options.data[key] = value.first
247
+ if options.raw_data
248
+ raise Exception, "ERROR: can't specify '-r' option more than once"
249
+ elsif options.args.include?('-d') || options.args.include?('--data')
250
+ raise Exception, "ERROR: can't use '-r' and '-d' options together"
252
251
  end
252
+ options.raw_data = true
253
+ options.data = data
253
254
  end
254
255
  end
255
256
 
@@ -277,12 +278,6 @@ Supported Commands: #{SUPPORTED_COMMANDS.sort.join(', ')}
277
278
  end
278
279
  end
279
280
 
280
- def disable_ssl
281
- on('-U', '--no-ssl', 'Disable SSL (default: SSL is enabled)') do |use_ssl|
282
- options.protocol = 'http'
283
- end
284
- end
285
-
286
281
  def request_method
287
282
  on('-X', '--request-method [method]', 'Request method (default: GET)') do |request_method|
288
283
  options.request_method = request_method.downcase
@@ -298,7 +293,7 @@ Supported Commands: #{SUPPORTED_COMMANDS.sort.join(', ')}
298
293
 
299
294
  def version
300
295
  on_tail("-v", "--version", "Show version") do
301
- CLI.puts Version
296
+ CLI.puts "twurl version: #{Version}\nplatform: #{RUBY_ENGINE} #{RUBY_VERSION} (#{RUBY_PLATFORM})"
302
297
  exit
303
298
  end
304
299
  end
@@ -374,10 +369,6 @@ Supported Commands: #{SUPPORTED_COMMANDS.sort.join(', ')}
374
369
  "#{protocol}://#{host}"
375
370
  end
376
371
 
377
- def ssl?
378
- protocol == 'https'
379
- end
380
-
381
372
  def debug_output_io
382
373
  super || STDERR
383
374
  end
@@ -162,16 +162,20 @@ module Twurl
162
162
 
163
163
  request.body = multipart_body.join
164
164
  request.content_type = "multipart/form-data, boundary=\"#{boundary}\""
165
- elsif request.content_type && options.data
166
- request.body = options.data.keys.first
165
+ elsif options.json_data
166
+ request.body = options.data
167
167
  elsif options.data
168
- request.content_type = "application/x-www-form-urlencoded"
169
- if options.data.length == 1 && options.data.values.first == nil
170
- request.body = options.data.keys.first
168
+ request.content_type = "application/x-www-form-urlencoded" unless request.content_type
169
+ if options.raw_data
170
+ request.body = options.data
171
171
  else
172
- request.body = options.data.map do |key, value|
173
- "#{key}=#{CGI.escape value}"
174
- end.join("&")
172
+ begin
173
+ request.body = options.data.map do |key, value|
174
+ "#{key}" + (value.nil? ? "" : "=#{CGI.escape(value)}")
175
+ end.join("&")
176
+ rescue
177
+ raise Exception, "ERROR: failed to parse POST request body"
178
+ end
175
179
  end
176
180
  end
177
181
  request
@@ -202,7 +206,11 @@ module Twurl
202
206
  def perform_pin_authorize_workflow
203
207
  @request_token = consumer.get_request_token
204
208
  CLI.puts("Go to #{generate_authorize_url} and paste in the supplied PIN")
205
- pin = STDIN.gets
209
+ begin
210
+ pin = STDIN.gets.chomp
211
+ rescue SystemExit, Interrupt
212
+ raise Exception, "Operation cancelled"
213
+ end
206
214
  access_token = @request_token.get_access_token(:oauth_verifier => pin.chomp)
207
215
  {:oauth_token => access_token.token, :oauth_token_secret => access_token.secret}
208
216
  end
@@ -212,7 +220,7 @@ module Twurl
212
220
  params = request['Authorization'].sub(/^OAuth\s+/, '').split(/,\s+/).map { |p|
213
221
  k, v = p.split('=')
214
222
  v =~ /"(.*?)"/
215
- "#{k}=#{CGI::escape($1)}"
223
+ "#{k}=#{CGI.escape($1)}"
216
224
  }.join('&')
217
225
  "#{Twurl.options.base_url}#{request.path}?#{params}"
218
226
  end
@@ -260,12 +268,9 @@ module Twurl
260
268
  consumer.http.set_debug_output(Twurl.options.debug_output_io) if Twurl.options.trace
261
269
  consumer.http.read_timeout = consumer.http.open_timeout = Twurl.options.timeout || 60
262
270
  consumer.http.open_timeout = Twurl.options.connection_timeout if Twurl.options.connection_timeout
263
- # Only override if Net::HTTP support max_retries (since Ruby >= 2.5)
264
- consumer.http.max_retries = 0 if consumer.http.respond_to?(:max_retries=)
265
- if Twurl.options.ssl?
266
- consumer.http.use_ssl = true
267
- consumer.http.verify_mode = OpenSSL::SSL::VERIFY_NONE
268
- end
271
+ consumer.http.max_retries = 0
272
+ consumer.http.use_ssl = true
273
+ consumer.http.verify_mode = OpenSSL::SSL::VERIFY_NONE
269
274
  end
270
275
 
271
276
  def consumer
@@ -22,11 +22,11 @@ module Twurl
22
22
  }
23
23
  }
24
24
  rescue URI::InvalidURIError
25
- CLI.puts INVALID_URI_MESSAGE
25
+ raise Exception, INVALID_URI_MESSAGE
26
26
  rescue Net::ReadTimeout
27
- CLI.puts READ_TIMEOUT_MESSAGE
27
+ raise Exception, READ_TIMEOUT_MESSAGE
28
28
  rescue Net::OpenTimeout
29
- CLI.puts OPEN_TIMEOUT_MESSAGE
29
+ raise Exception, OPEN_TIMEOUT_MESSAGE
30
30
  end
31
31
  end
32
32
 
data/lib/twurl/version.rb CHANGED
@@ -2,7 +2,7 @@ module Twurl
2
2
  class Version
3
3
  MAJOR = 0 unless defined? Twurl::Version::MAJOR
4
4
  MINOR = 9 unless defined? Twurl::Version::MINOR
5
- PATCH = 6 unless defined? Twurl::Version::PATCH
5
+ PATCH = 7 unless defined? Twurl::Version::PATCH
6
6
  PRE = nil unless defined? Twurl::Version::PRE # Time.now.to_i.to_s
7
7
 
8
8
  class << self
data/twurl.gemspec CHANGED
@@ -1,22 +1,22 @@
1
- # coding: utf-8
2
1
  lib = File.expand_path('../lib', __FILE__)
3
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
3
  require 'twurl/version'
5
4
 
6
5
  Gem::Specification.new do |spec|
7
6
  spec.add_dependency 'oauth', '~> 0.4'
7
+ spec.add_dependency 'ostruct', '>= 0.3.3'
8
8
  spec.authors = ["Marcel Molina", "Erik Michaels-Ober", "@TwitterDev team"]
9
9
  spec.description = %q{Curl for the Twitter API}
10
10
  spec.bindir = 'bin'
11
11
  spec.executables << 'twurl'
12
12
  spec.extra_rdoc_files = Dir["*.md", "LICENSE"]
13
13
  spec.files = Dir["*.md", "LICENSE", "twurl.gemspec", "bin/*", "lib/**/*"]
14
- spec.homepage = 'http://github.com/twitter/twurl'
14
+ spec.homepage = 'https://github.com/twitter/twurl'
15
15
  spec.licenses = ['MIT']
16
16
  spec.name = 'twurl'
17
17
  spec.rdoc_options = ['--title', 'twurl -- OAuth-enabled curl for the Twitter API', '--main', 'README.md', '--line-numbers', '--inline-source']
18
18
  spec.require_paths = ['lib']
19
- spec.required_ruby_version = '>= 2.4.0'
19
+ spec.required_ruby_version = '>= 2.5.0'
20
20
  spec.summary = spec.description
21
21
  spec.version = Twurl::Version
22
22
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: twurl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.6
4
+ version: 0.9.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marcel Molina
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2020-08-27 00:00:00.000000000 Z
13
+ date: 2023-04-26 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: oauth
@@ -26,6 +26,20 @@ dependencies:
26
26
  - - "~>"
27
27
  - !ruby/object:Gem::Version
28
28
  version: '0.4'
29
+ - !ruby/object:Gem::Dependency
30
+ name: ostruct
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - ">="
34
+ - !ruby/object:Gem::Version
35
+ version: 0.3.3
36
+ type: :runtime
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 0.3.3
29
43
  description: Curl for the Twitter API
30
44
  email:
31
45
  executables:
@@ -33,9 +47,9 @@ executables:
33
47
  extensions: []
34
48
  extra_rdoc_files:
35
49
  - CODE_OF_CONDUCT.md
50
+ - CONTRIBUTING.md
36
51
  - INSTALL.md
37
52
  - README.md
38
- - CONTRIBUTING.md
39
53
  - LICENSE
40
54
  files:
41
55
  - CODE_OF_CONDUCT.md
@@ -58,7 +72,7 @@ files:
58
72
  - lib/twurl/request_controller.rb
59
73
  - lib/twurl/version.rb
60
74
  - twurl.gemspec
61
- homepage: http://github.com/twitter/twurl
75
+ homepage: https://github.com/twitter/twurl
62
76
  licenses:
63
77
  - MIT
64
78
  metadata: {}
@@ -76,14 +90,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
76
90
  requirements:
77
91
  - - ">="
78
92
  - !ruby/object:Gem::Version
79
- version: 2.4.0
93
+ version: 2.5.0
80
94
  required_rubygems_version: !ruby/object:Gem::Requirement
81
95
  requirements:
82
96
  - - ">="
83
97
  - !ruby/object:Gem::Version
84
98
  version: '0'
85
99
  requirements: []
86
- rubygems_version: 3.0.6
100
+ rubygems_version: 3.3.26
87
101
  signing_key:
88
102
  specification_version: 4
89
103
  summary: Curl for the Twitter API