twurl 0.9.5 → 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 +4 -4
- data/CONTRIBUTING.md +15 -1
- data/INSTALL.md +2 -2
- data/README.md +4 -3
- data/lib/twurl/aliases_controller.rb +6 -2
- data/lib/twurl/app_only_oauth_client.rb +3 -6
- data/lib/twurl/cli.rb +25 -33
- data/lib/twurl/oauth_client.rb +29 -29
- data/lib/twurl/rcfile.rb +1 -1
- data/lib/twurl/request_controller.rb +3 -3
- data/lib/twurl/version.rb +1 -1
- data/twurl.gemspec +7 -7
- metadata +24 -16
- data/.github/ISSUE_TEMPLATE.md +0 -13
- data/.github/PULL_REQUEST_TEMPLATE.md +0 -15
- data/.gitignore +0 -40
- data/.travis.yml +0 -23
- data/Gemfile +0 -13
- data/Rakefile +0 -12
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 9120a8daa09529e8e484e2bc15da6042ea1ced1100b1a23c8ea2a2481e194f2b
|
|
4
|
+
data.tar.gz: 549c25417c3e00e35bab15fb9299a6103b3a01717a3a56b9c78cc388cd1c20fb
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 3df6c245df33cccfaec2ed2a28d370b5ed3de81a1f96bfb17b5852b4cce209bae975bdbfe9d9fdf7bd117f8bbd8826b4265a3acb5cc509103032ebcf2dc405ac
|
|
7
|
+
data.tar.gz: 300977ca1182b02d1f1673754b49e015a9e38b5c064967044f5243252097e6caf29a4d37ec0c385e35460a1db34265e2d7947449427abf83bc868d75cfb5833f
|
data/CONTRIBUTING.md
CHANGED
|
@@ -9,7 +9,21 @@ We follow the [GitHub Flow Workflow](https://guides.github.com/introduction/flow
|
|
|
9
9
|
1. Fork the project
|
|
10
10
|
2. Check out the `master` branch
|
|
11
11
|
3. Create a feature branch
|
|
12
|
-
4. Write code and tests for your change
|
|
12
|
+
4. Write code and tests for your change
|
|
13
|
+
|
|
14
|
+
```sh
|
|
15
|
+
$ cd ./twurl
|
|
16
|
+
|
|
17
|
+
# install twurl from source
|
|
18
|
+
$ bundle install
|
|
19
|
+
|
|
20
|
+
# run twurl from source
|
|
21
|
+
$ bundle exec twurl -v
|
|
22
|
+
|
|
23
|
+
# run tests
|
|
24
|
+
$ bundle exec rake
|
|
25
|
+
```
|
|
26
|
+
|
|
13
27
|
5. From your branch, make a pull request against `twitter/twurl/master`
|
|
14
28
|
6. Work with repo maintainers to get your change reviewed
|
|
15
29
|
7. Wait for your change to be pulled into `twitter/twurl/master`
|
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.
|
|
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.
|
|
35
|
+
0.9.7
|
|
36
36
|
```
|
data/README.md
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
# Twurl
|
|
2
2
|
|
|
3
3
|
[](https://github.com/twitter/twurl/blob/master/LICENSE)
|
|
4
|
-
|
|
4
|
+
[](https://badge.fury.io/rb/twurl)
|
|
5
|
+
[](https://github.com/twitter/twurl/actions/workflows/ci.yml)
|
|
5
6
|
|
|
6
7
|
Twurl is like curl, but tailored specifically for the Twitter API.
|
|
7
8
|
It knows how to grant an access token to a client application for
|
|
@@ -97,7 +98,7 @@ This will print a pair of consumer_key and its associated bearer token. Note, to
|
|
|
97
98
|
You can access different hosts for other Twitter APIs using the -H flag.
|
|
98
99
|
|
|
99
100
|
```sh
|
|
100
|
-
twurl -H "ads-api.twitter.com" "/
|
|
101
|
+
twurl -H "ads-api.twitter.com" "/7/accounts"
|
|
101
102
|
```
|
|
102
103
|
|
|
103
104
|
## Uploading Media
|
|
@@ -164,7 +165,7 @@ twurl accounts
|
|
|
164
165
|
|
|
165
166
|
### Profiles and Bearer Tokens
|
|
166
167
|
|
|
167
|
-
While changing the default profile allows you to select which access token (OAuth1.0a) to use, bearer tokens don't link to any user profiles as the Application-only authentication doesn't require user context. That is, you can make an application-only request regardless of your default profile if you specify the `-c` (
|
|
168
|
+
While changing the default profile allows you to select which access token (OAuth1.0a) to use, bearer tokens don't link to any user profiles as the Application-only authentication doesn't require user context. That is, you can make an application-only request regardless of your default profile if you specify the `-c` (`--consumer-key`) option once you generate a bearer token with this consumer key. By default, twurl reads the current profile's consumer key and its associated bearer token from `~/.twurlrc` file.
|
|
168
169
|
|
|
169
170
|
## Contributors
|
|
170
171
|
|
|
@@ -15,9 +15,13 @@ module Twurl
|
|
|
15
15
|
end
|
|
16
16
|
when 1
|
|
17
17
|
if options.path
|
|
18
|
-
|
|
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
|
-
|
|
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
|
-
|
|
61
|
-
http.
|
|
62
|
-
|
|
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
|
|
19
|
-
|
|
16
|
+
rescue Twurl::Exception => exception
|
|
17
|
+
abort(exception.message)
|
|
20
18
|
end
|
|
21
19
|
dispatch(options)
|
|
22
20
|
end
|
|
@@ -67,7 +65,6 @@ Supported Commands: #{SUPPORTED_COMMANDS.sort.join(', ')}
|
|
|
67
65
|
|
|
68
66
|
o.section "Authorization options:" do
|
|
69
67
|
username
|
|
70
|
-
password
|
|
71
68
|
consumer_key
|
|
72
69
|
consumer_secret
|
|
73
70
|
access_token
|
|
@@ -81,7 +78,6 @@ Supported Commands: #{SUPPORTED_COMMANDS.sort.join(', ')}
|
|
|
81
78
|
headers
|
|
82
79
|
host
|
|
83
80
|
quiet
|
|
84
|
-
disable_ssl
|
|
85
81
|
request_method
|
|
86
82
|
help
|
|
87
83
|
version
|
|
@@ -96,14 +92,22 @@ Supported Commands: #{SUPPORTED_COMMANDS.sort.join(', ')}
|
|
|
96
92
|
end
|
|
97
93
|
end
|
|
98
94
|
|
|
99
|
-
|
|
95
|
+
begin
|
|
96
|
+
arguments = option_parser.parse!(args)
|
|
97
|
+
rescue OptionParser::InvalidOption
|
|
98
|
+
raise Exception "ERROR: undefined option"
|
|
99
|
+
rescue Twurl::Exception
|
|
100
|
+
raise
|
|
101
|
+
rescue
|
|
102
|
+
raise Exception "ERROR: invalid argument"
|
|
103
|
+
end
|
|
100
104
|
Twurl.options.command = extract_command!(arguments)
|
|
101
105
|
Twurl.options.path = extract_path!(arguments)
|
|
102
106
|
Twurl.options.subcommands = arguments
|
|
103
107
|
|
|
104
108
|
if Twurl.options.command == DEFAULT_COMMAND and Twurl.options.path.nil? and Twurl.options.args.empty?
|
|
105
109
|
CLI.puts option_parser
|
|
106
|
-
raise
|
|
110
|
+
raise Exception, "No path found"
|
|
107
111
|
end
|
|
108
112
|
|
|
109
113
|
Twurl.options
|
|
@@ -165,7 +169,7 @@ Supported Commands: #{SUPPORTED_COMMANDS.sort.join(', ')}
|
|
|
165
169
|
|
|
166
170
|
def escape_params(params)
|
|
167
171
|
CGI::parse(params).map do |key, value|
|
|
168
|
-
"#{CGI.escape
|
|
172
|
+
"#{CGI.escape(key)}=#{CGI.escape(value.first)}"
|
|
169
173
|
end.join("&")
|
|
170
174
|
end
|
|
171
175
|
end
|
|
@@ -219,12 +223,6 @@ Supported Commands: #{SUPPORTED_COMMANDS.sort.join(', ')}
|
|
|
219
223
|
end
|
|
220
224
|
end
|
|
221
225
|
|
|
222
|
-
def password
|
|
223
|
-
on('-p', '--password [password]', 'Password of account to authorize (required)') do |password|
|
|
224
|
-
options.password = password ? password : CLI.prompt_for('Password')
|
|
225
|
-
end
|
|
226
|
-
end
|
|
227
|
-
|
|
228
226
|
def trace
|
|
229
227
|
on('-t', '--[no-]trace', 'Trace request/response traffic (default: --no-trace)') do |trace|
|
|
230
228
|
options.trace = trace
|
|
@@ -233,12 +231,12 @@ Supported Commands: #{SUPPORTED_COMMANDS.sort.join(', ')}
|
|
|
233
231
|
|
|
234
232
|
def data
|
|
235
233
|
on('-d', '--data [data]', 'Sends the specified data in a POST request to the HTTP server.') do |data|
|
|
236
|
-
if options.args.count { |item|
|
|
237
|
-
options.
|
|
234
|
+
if options.args.count { |item| /^content-type:\s+application\/json/i.match(item) } > 0
|
|
235
|
+
options.json_data = true
|
|
236
|
+
options.data = data
|
|
238
237
|
else
|
|
239
|
-
|
|
240
|
-
key
|
|
241
|
-
options.data[key] = value
|
|
238
|
+
CGI.parse(data).each_pair do |key, value|
|
|
239
|
+
options.data[key] = value.first
|
|
242
240
|
end
|
|
243
241
|
end
|
|
244
242
|
end
|
|
@@ -246,9 +244,13 @@ Supported Commands: #{SUPPORTED_COMMANDS.sort.join(', ')}
|
|
|
246
244
|
|
|
247
245
|
def raw_data
|
|
248
246
|
on('-r', '--raw-data [data]', 'Sends the specified data as it is in a POST request to the HTTP server.') do |data|
|
|
249
|
-
|
|
250
|
-
|
|
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"
|
|
251
251
|
end
|
|
252
|
+
options.raw_data = true
|
|
253
|
+
options.data = data
|
|
252
254
|
end
|
|
253
255
|
end
|
|
254
256
|
|
|
@@ -276,12 +278,6 @@ Supported Commands: #{SUPPORTED_COMMANDS.sort.join(', ')}
|
|
|
276
278
|
end
|
|
277
279
|
end
|
|
278
280
|
|
|
279
|
-
def disable_ssl
|
|
280
|
-
on('-U', '--no-ssl', 'Disable SSL (default: SSL is enabled)') do |use_ssl|
|
|
281
|
-
options.protocol = 'http'
|
|
282
|
-
end
|
|
283
|
-
end
|
|
284
|
-
|
|
285
281
|
def request_method
|
|
286
282
|
on('-X', '--request-method [method]', 'Request method (default: GET)') do |request_method|
|
|
287
283
|
options.request_method = request_method.downcase
|
|
@@ -297,7 +293,7 @@ Supported Commands: #{SUPPORTED_COMMANDS.sort.join(', ')}
|
|
|
297
293
|
|
|
298
294
|
def version
|
|
299
295
|
on_tail("-v", "--version", "Show version") do
|
|
300
|
-
CLI.puts Version
|
|
296
|
+
CLI.puts "twurl version: #{Version}\nplatform: #{RUBY_ENGINE} #{RUBY_VERSION} (#{RUBY_PLATFORM})"
|
|
301
297
|
exit
|
|
302
298
|
end
|
|
303
299
|
end
|
|
@@ -373,10 +369,6 @@ Supported Commands: #{SUPPORTED_COMMANDS.sort.join(', ')}
|
|
|
373
369
|
"#{protocol}://#{host}"
|
|
374
370
|
end
|
|
375
371
|
|
|
376
|
-
def ssl?
|
|
377
|
-
protocol == 'https'
|
|
378
|
-
end
|
|
379
|
-
|
|
380
372
|
def debug_output_io
|
|
381
373
|
super || STDERR
|
|
382
374
|
end
|
data/lib/twurl/oauth_client.rb
CHANGED
|
@@ -9,7 +9,11 @@ module Twurl
|
|
|
9
9
|
end
|
|
10
10
|
|
|
11
11
|
def load_from_options(options)
|
|
12
|
-
if
|
|
12
|
+
if options.command == 'request' && has_oauth_options?(options)
|
|
13
|
+
load_new_client_from_oauth_options(options)
|
|
14
|
+
elsif options.command == 'request' && options.app_only && options.consumer_key
|
|
15
|
+
load_client_for_non_profile_app_only_auth(options)
|
|
16
|
+
elsif rcfile.has_oauth_profile_for_username_with_consumer_key?(options.username, options.consumer_key)
|
|
13
17
|
load_client_for_username_and_consumer_key(options.username, options.consumer_key)
|
|
14
18
|
elsif options.username
|
|
15
19
|
load_client_for_username(options.username)
|
|
@@ -17,10 +21,6 @@ module Twurl
|
|
|
17
21
|
load_client_for_app_only_auth(options, options.consumer_key)
|
|
18
22
|
elsif options.command == 'authorize'
|
|
19
23
|
load_new_client_from_options(options)
|
|
20
|
-
elsif options.command == 'request' && has_oauth_options?(options)
|
|
21
|
-
load_new_client_from_oauth_options(options)
|
|
22
|
-
elsif options.command == 'request' && options.app_only && options.consumer_key
|
|
23
|
-
load_client_for_non_profile_app_only_auth(options)
|
|
24
24
|
else
|
|
25
25
|
load_default_client(options)
|
|
26
26
|
end
|
|
@@ -52,7 +52,7 @@ module Twurl
|
|
|
52
52
|
end
|
|
53
53
|
|
|
54
54
|
def load_new_client_from_options(options)
|
|
55
|
-
new(options.oauth_client_options
|
|
55
|
+
new(options.oauth_client_options)
|
|
56
56
|
end
|
|
57
57
|
|
|
58
58
|
def load_new_client_from_oauth_options(options)
|
|
@@ -106,10 +106,9 @@ module Twurl
|
|
|
106
106
|
|
|
107
107
|
OAUTH_CLIENT_OPTIONS = %w[username consumer_key consumer_secret token secret]
|
|
108
108
|
attr_reader *OAUTH_CLIENT_OPTIONS
|
|
109
|
-
attr_reader :username
|
|
109
|
+
attr_reader :username
|
|
110
110
|
def initialize(options = {})
|
|
111
111
|
@username = options['username']
|
|
112
|
-
@password = options['password']
|
|
113
112
|
@consumer_key = options['consumer_key']
|
|
114
113
|
@consumer_secret = options['consumer_secret']
|
|
115
114
|
@token = options['token']
|
|
@@ -163,16 +162,20 @@ module Twurl
|
|
|
163
162
|
|
|
164
163
|
request.body = multipart_body.join
|
|
165
164
|
request.content_type = "multipart/form-data, boundary=\"#{boundary}\""
|
|
166
|
-
elsif
|
|
167
|
-
request.body = options.data
|
|
165
|
+
elsif options.json_data
|
|
166
|
+
request.body = options.data
|
|
168
167
|
elsif options.data
|
|
169
|
-
request.content_type = "application/x-www-form-urlencoded"
|
|
170
|
-
if options.
|
|
171
|
-
request.body = options.data
|
|
168
|
+
request.content_type = "application/x-www-form-urlencoded" unless request.content_type
|
|
169
|
+
if options.raw_data
|
|
170
|
+
request.body = options.data
|
|
172
171
|
else
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
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
|
|
176
179
|
end
|
|
177
180
|
end
|
|
178
181
|
request
|
|
@@ -192,7 +195,7 @@ module Twurl
|
|
|
192
195
|
|
|
193
196
|
def exchange_credentials_for_access_token
|
|
194
197
|
response = begin
|
|
195
|
-
consumer.token_request(:post, consumer.access_token_path, nil, {}
|
|
198
|
+
consumer.token_request(:post, consumer.access_token_path, nil, {})
|
|
196
199
|
rescue OAuth::Unauthorized
|
|
197
200
|
perform_pin_authorize_workflow
|
|
198
201
|
end
|
|
@@ -200,14 +203,14 @@ module Twurl
|
|
|
200
203
|
@secret = response[:oauth_token_secret]
|
|
201
204
|
end
|
|
202
205
|
|
|
203
|
-
def client_auth_parameters
|
|
204
|
-
{'x_auth_username' => username, 'x_auth_password' => password, 'x_auth_mode' => 'client_auth'}
|
|
205
|
-
end
|
|
206
|
-
|
|
207
206
|
def perform_pin_authorize_workflow
|
|
208
207
|
@request_token = consumer.get_request_token
|
|
209
208
|
CLI.puts("Go to #{generate_authorize_url} and paste in the supplied PIN")
|
|
210
|
-
|
|
209
|
+
begin
|
|
210
|
+
pin = STDIN.gets.chomp
|
|
211
|
+
rescue SystemExit, Interrupt
|
|
212
|
+
raise Exception, "Operation cancelled"
|
|
213
|
+
end
|
|
211
214
|
access_token = @request_token.get_access_token(:oauth_verifier => pin.chomp)
|
|
212
215
|
{:oauth_token => access_token.token, :oauth_token_secret => access_token.secret}
|
|
213
216
|
end
|
|
@@ -217,7 +220,7 @@ module Twurl
|
|
|
217
220
|
params = request['Authorization'].sub(/^OAuth\s+/, '').split(/,\s+/).map { |p|
|
|
218
221
|
k, v = p.split('=')
|
|
219
222
|
v =~ /"(.*?)"/
|
|
220
|
-
"#{k}=#{CGI
|
|
223
|
+
"#{k}=#{CGI.escape($1)}"
|
|
221
224
|
}.join('&')
|
|
222
225
|
"#{Twurl.options.base_url}#{request.path}?#{params}"
|
|
223
226
|
end
|
|
@@ -265,12 +268,9 @@ module Twurl
|
|
|
265
268
|
consumer.http.set_debug_output(Twurl.options.debug_output_io) if Twurl.options.trace
|
|
266
269
|
consumer.http.read_timeout = consumer.http.open_timeout = Twurl.options.timeout || 60
|
|
267
270
|
consumer.http.open_timeout = Twurl.options.connection_timeout if Twurl.options.connection_timeout
|
|
268
|
-
|
|
269
|
-
consumer.http.
|
|
270
|
-
|
|
271
|
-
consumer.http.use_ssl = true
|
|
272
|
-
consumer.http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
|
273
|
-
end
|
|
271
|
+
consumer.http.max_retries = 0
|
|
272
|
+
consumer.http.use_ssl = true
|
|
273
|
+
consumer.http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
|
274
274
|
end
|
|
275
275
|
|
|
276
276
|
def consumer
|
data/lib/twurl/rcfile.rb
CHANGED
|
@@ -22,11 +22,11 @@ module Twurl
|
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
24
|
rescue URI::InvalidURIError
|
|
25
|
-
|
|
25
|
+
raise Exception, INVALID_URI_MESSAGE
|
|
26
26
|
rescue Net::ReadTimeout
|
|
27
|
-
|
|
27
|
+
raise Exception, READ_TIMEOUT_MESSAGE
|
|
28
28
|
rescue Net::OpenTimeout
|
|
29
|
-
|
|
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 =
|
|
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
|
-
spec.
|
|
11
|
-
spec.
|
|
12
|
-
spec.
|
|
13
|
-
spec.
|
|
10
|
+
spec.bindir = 'bin'
|
|
11
|
+
spec.executables << 'twurl'
|
|
12
|
+
spec.extra_rdoc_files = Dir["*.md", "LICENSE"]
|
|
13
|
+
spec.files = Dir["*.md", "LICENSE", "twurl.gemspec", "bin/*", "lib/**/*"]
|
|
14
|
+
spec.homepage = 'https://github.com/twitter/twurl'
|
|
14
15
|
spec.licenses = ['MIT']
|
|
15
16
|
spec.name = 'twurl'
|
|
16
17
|
spec.rdoc_options = ['--title', 'twurl -- OAuth-enabled curl for the Twitter API', '--main', 'README.md', '--line-numbers', '--inline-source']
|
|
17
18
|
spec.require_paths = ['lib']
|
|
18
|
-
spec.required_ruby_version = '>= 2.
|
|
19
|
-
spec.rubyforge_project = 'twurl'
|
|
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,16 +1,16 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: twurl
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.9.
|
|
4
|
+
version: 0.9.7
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Marcel Molina
|
|
8
8
|
- Erik Michaels-Ober
|
|
9
9
|
- "@TwitterDev team"
|
|
10
|
-
autorequire:
|
|
10
|
+
autorequire:
|
|
11
11
|
bindir: bin
|
|
12
12
|
cert_chain: []
|
|
13
|
-
date:
|
|
13
|
+
date: 2023-04-26 00:00:00.000000000 Z
|
|
14
14
|
dependencies:
|
|
15
15
|
- !ruby/object:Gem::Dependency
|
|
16
16
|
name: oauth
|
|
@@ -26,8 +26,22 @@ 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
|
-
email:
|
|
44
|
+
email:
|
|
31
45
|
executables:
|
|
32
46
|
- twurl
|
|
33
47
|
extensions: []
|
|
@@ -35,20 +49,14 @@ extra_rdoc_files:
|
|
|
35
49
|
- CODE_OF_CONDUCT.md
|
|
36
50
|
- CONTRIBUTING.md
|
|
37
51
|
- INSTALL.md
|
|
38
|
-
- LICENSE
|
|
39
52
|
- README.md
|
|
53
|
+
- LICENSE
|
|
40
54
|
files:
|
|
41
|
-
- ".github/ISSUE_TEMPLATE.md"
|
|
42
|
-
- ".github/PULL_REQUEST_TEMPLATE.md"
|
|
43
|
-
- ".gitignore"
|
|
44
|
-
- ".travis.yml"
|
|
45
55
|
- CODE_OF_CONDUCT.md
|
|
46
56
|
- CONTRIBUTING.md
|
|
47
|
-
- Gemfile
|
|
48
57
|
- INSTALL.md
|
|
49
58
|
- LICENSE
|
|
50
59
|
- README.md
|
|
51
|
-
- Rakefile
|
|
52
60
|
- bin/twurl
|
|
53
61
|
- lib/twurl.rb
|
|
54
62
|
- lib/twurl/abstract_command_controller.rb
|
|
@@ -64,11 +72,11 @@ files:
|
|
|
64
72
|
- lib/twurl/request_controller.rb
|
|
65
73
|
- lib/twurl/version.rb
|
|
66
74
|
- twurl.gemspec
|
|
67
|
-
homepage:
|
|
75
|
+
homepage: https://github.com/twitter/twurl
|
|
68
76
|
licenses:
|
|
69
77
|
- MIT
|
|
70
78
|
metadata: {}
|
|
71
|
-
post_install_message:
|
|
79
|
+
post_install_message:
|
|
72
80
|
rdoc_options:
|
|
73
81
|
- "--title"
|
|
74
82
|
- twurl -- OAuth-enabled curl for the Twitter API
|
|
@@ -82,15 +90,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
82
90
|
requirements:
|
|
83
91
|
- - ">="
|
|
84
92
|
- !ruby/object:Gem::Version
|
|
85
|
-
version: 2.
|
|
93
|
+
version: 2.5.0
|
|
86
94
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
87
95
|
requirements:
|
|
88
96
|
- - ">="
|
|
89
97
|
- !ruby/object:Gem::Version
|
|
90
98
|
version: '0'
|
|
91
99
|
requirements: []
|
|
92
|
-
rubygems_version: 3.
|
|
93
|
-
signing_key:
|
|
100
|
+
rubygems_version: 3.3.26
|
|
101
|
+
signing_key:
|
|
94
102
|
specification_version: 4
|
|
95
103
|
summary: Curl for the Twitter API
|
|
96
104
|
test_files: []
|
data/.github/ISSUE_TEMPLATE.md
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
One line summary of the issue here.
|
|
2
|
-
|
|
3
|
-
### Expected behavior
|
|
4
|
-
|
|
5
|
-
As concisely as possible, describe the expected behavior.
|
|
6
|
-
|
|
7
|
-
### Actual behavior
|
|
8
|
-
|
|
9
|
-
As concisely as possible, describe the observed behavior.
|
|
10
|
-
|
|
11
|
-
### Steps to reproduce the behavior
|
|
12
|
-
|
|
13
|
-
Please list all relevant steps to reproduce the observed behavior.
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
Problem
|
|
2
|
-
|
|
3
|
-
Explain the context and why you're making that change. What is the
|
|
4
|
-
problem you're trying to solve? In some cases there is not a problem
|
|
5
|
-
and this can be thought of being the motivation for your change.
|
|
6
|
-
|
|
7
|
-
Solution
|
|
8
|
-
|
|
9
|
-
Describe the modifications you've done.
|
|
10
|
-
|
|
11
|
-
Result
|
|
12
|
-
|
|
13
|
-
What will change as a result of your pull request? Note that sometimes
|
|
14
|
-
this section is unnecessary because it is self-explanatory based on
|
|
15
|
-
the solution.
|
data/.gitignore
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
*.gem
|
|
2
|
-
*.rbc
|
|
3
|
-
*.sw[a-p]
|
|
4
|
-
*.tmproj
|
|
5
|
-
*.tmproject
|
|
6
|
-
*.un~
|
|
7
|
-
*~
|
|
8
|
-
.Spotlight-V100
|
|
9
|
-
.Trashes
|
|
10
|
-
._*
|
|
11
|
-
.bundle
|
|
12
|
-
.config
|
|
13
|
-
.directory
|
|
14
|
-
.elc
|
|
15
|
-
.emacs.desktop
|
|
16
|
-
.emacs.desktop.lock
|
|
17
|
-
.redcar
|
|
18
|
-
.yardoc
|
|
19
|
-
Desktop.ini
|
|
20
|
-
Gemfile.lock
|
|
21
|
-
Icon?
|
|
22
|
-
InstalledFiles
|
|
23
|
-
Session.vim
|
|
24
|
-
\#*\#
|
|
25
|
-
_yardoc
|
|
26
|
-
auto-save-list
|
|
27
|
-
coverage
|
|
28
|
-
doc
|
|
29
|
-
lib/bundler/man
|
|
30
|
-
pkg
|
|
31
|
-
pkg/*
|
|
32
|
-
rdoc
|
|
33
|
-
spec/reports
|
|
34
|
-
test/tmp
|
|
35
|
-
test/version_tmp
|
|
36
|
-
tmp
|
|
37
|
-
tmtags
|
|
38
|
-
tramp
|
|
39
|
-
.vscode
|
|
40
|
-
vendor
|
data/.travis.yml
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
dist: xenial
|
|
2
|
-
language: ruby
|
|
3
|
-
|
|
4
|
-
before_install:
|
|
5
|
-
- bundle config without 'development'
|
|
6
|
-
|
|
7
|
-
branches:
|
|
8
|
-
only:
|
|
9
|
-
- master
|
|
10
|
-
|
|
11
|
-
matrix:
|
|
12
|
-
fast_finish: true
|
|
13
|
-
allow_failures:
|
|
14
|
-
- rvm: jruby-head
|
|
15
|
-
- rvm: ruby-head
|
|
16
|
-
- rvm: rbx-2
|
|
17
|
-
include:
|
|
18
|
-
- rvm: 2.6.5
|
|
19
|
-
- rvm: 2.5.7
|
|
20
|
-
- rvm: 2.4.9
|
|
21
|
-
- rvm: jruby-head
|
|
22
|
-
- rvm: ruby-head
|
|
23
|
-
- rvm: rbx-2
|
data/Gemfile
DELETED
data/Rakefile
DELETED