jist 1.2.0 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +4 -0
- data/lib/jist.rb +36 -23
- data/spec/clipboard_spec.rb +1 -1
- data/spec/proxy_spec.rb +4 -2
- metadata +10 -11
data/Rakefile
CHANGED
data/lib/jist.rb
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
require 'net/https'
|
2
2
|
require 'cgi'
|
3
3
|
require 'json'
|
4
|
+
require 'uri'
|
4
5
|
|
5
6
|
# It just gists.
|
6
7
|
module Jist
|
7
8
|
extend self
|
8
9
|
|
9
|
-
VERSION = '1.
|
10
|
+
VERSION = '1.3.0'
|
10
11
|
|
11
12
|
# A list of clipboard commands with copy and paste support.
|
12
13
|
CLIPBOARD_COMMANDS = {
|
@@ -16,8 +17,12 @@ module Jist
|
|
16
17
|
'putclip' => 'getclip'
|
17
18
|
}
|
18
19
|
|
20
|
+
GITHUB_API_URL = URI("https://api.github.com/")
|
21
|
+
GIT_IO_URL = URI("http://git.io")
|
22
|
+
|
19
23
|
# Exception tag for errors raised while gisting.
|
20
24
|
module Error; end
|
25
|
+
class ClipboardError < RuntimeError; include Error end
|
21
26
|
|
22
27
|
# Upload a gist to https://gist.github.com
|
23
28
|
#
|
@@ -91,7 +96,7 @@ module Jist
|
|
91
96
|
retried = false
|
92
97
|
|
93
98
|
begin
|
94
|
-
response = http(request)
|
99
|
+
response = http(GITHUB_API_URL, request)
|
95
100
|
if Net::HTTPSuccess === response
|
96
101
|
on_success(response.body, options)
|
97
102
|
else
|
@@ -107,12 +112,14 @@ module Jist
|
|
107
112
|
raise e.extend Error
|
108
113
|
end
|
109
114
|
|
110
|
-
# Convert long github urls into
|
115
|
+
# Convert long github urls into short git.io ones
|
111
116
|
#
|
112
117
|
# @param [String] url
|
113
118
|
# @return [String] shortened url, or long url if shortening fails
|
114
119
|
def shorten(url)
|
115
|
-
|
120
|
+
request = Net::HTTP::Post.new("/")
|
121
|
+
request.set_form_data(:url => url)
|
122
|
+
response = http(GIT_IO_URL, request)
|
116
123
|
case response.code
|
117
124
|
when "201"
|
118
125
|
response['Location']
|
@@ -150,7 +157,7 @@ module Jist
|
|
150
157
|
request.content_type = 'application/json'
|
151
158
|
request.basic_auth(username, password)
|
152
159
|
|
153
|
-
response = http(request)
|
160
|
+
response = http(GITHUB_API_URL, request)
|
154
161
|
|
155
162
|
if Net::HTTPCreated === response
|
156
163
|
File.open(File.expand_path("~/.jist"), 'w') do |f|
|
@@ -166,29 +173,32 @@ module Jist
|
|
166
173
|
|
167
174
|
# Return HTTP connection
|
168
175
|
#
|
176
|
+
# @param [URI::HTTP] The URI to which to connect
|
169
177
|
# @return [Net::HTTP]
|
170
|
-
def http_connection
|
178
|
+
def http_connection(uri)
|
171
179
|
env = ENV['http_proxy'] || ENV['HTTP_PROXY']
|
172
180
|
connection = if env
|
173
|
-
|
174
|
-
|
175
|
-
Net::HTTP::Proxy(proxy_host, proxy_port).new("api.github.com", 443)
|
181
|
+
proxy = URI(env)
|
182
|
+
Net::HTTP::Proxy(proxy.host, proxy.port).new(uri.host, uri.port)
|
176
183
|
else
|
177
|
-
Net::HTTP.new(
|
184
|
+
Net::HTTP.new(uri.host, uri.port)
|
178
185
|
end
|
179
|
-
|
180
|
-
|
186
|
+
if uri.scheme == "https"
|
187
|
+
connection.use_ssl = true
|
188
|
+
connection.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
189
|
+
end
|
181
190
|
connection.open_timeout = 10
|
182
191
|
connection.read_timeout = 10
|
183
192
|
connection
|
184
193
|
end
|
185
194
|
|
186
|
-
# Run an HTTP operation
|
195
|
+
# Run an HTTP operation
|
187
196
|
#
|
188
|
-
# @param [
|
197
|
+
# @param [URI::HTTP] The URI to which to connect
|
198
|
+
# @param [Net::HTTPRequest] The request to make
|
189
199
|
# @return [Net::HTTPResponse]
|
190
|
-
def http(request)
|
191
|
-
http_connection().start do |http|
|
200
|
+
def http(url, request)
|
201
|
+
http_connection(url).start do |http|
|
192
202
|
http.request request
|
193
203
|
end
|
194
204
|
rescue Timeout::Error
|
@@ -214,19 +224,19 @@ module Jist
|
|
214
224
|
# Copy a string to the clipboard.
|
215
225
|
#
|
216
226
|
# @param [String] content
|
217
|
-
# @raise [
|
227
|
+
# @raise [Jist::Error] if no clipboard integration could be found
|
218
228
|
#
|
219
|
-
# This method was heavily inspired by defunkt's Gist#copy,
|
220
|
-
# @see https://github.com/defunkt/gist/blob/bca9b29/lib/gist.rb#L178
|
221
229
|
def copy(content)
|
222
230
|
IO.popen(clipboard_command(:copy), 'r+') { |clip| clip.print content }
|
223
|
-
raise
|
231
|
+
raise Error, 'Copying to clipboard failed.' unless paste == content
|
232
|
+
rescue Error => e
|
233
|
+
raise ClipboardError, e.message + "\nAttempted to copy: #{content}"
|
224
234
|
end
|
225
235
|
|
226
236
|
# Get a string from the clipboard.
|
227
237
|
#
|
228
238
|
# @param [String] content
|
229
|
-
# @raise [
|
239
|
+
# @raise [Jist::Error] if no clipboard integration could be found
|
230
240
|
def paste
|
231
241
|
`#{clipboard_command(:paste)}`
|
232
242
|
end
|
@@ -252,12 +262,15 @@ module Jist
|
|
252
262
|
#
|
253
263
|
# @param [Symbol] action either :copy or :paste
|
254
264
|
# @return [String] the command to run
|
255
|
-
# @raise [
|
265
|
+
# @raise [Jist::ClipboardError] if no clipboard integration could be found
|
256
266
|
def clipboard_command(action)
|
257
267
|
command = CLIPBOARD_COMMANDS.keys.detect do |cmd|
|
258
268
|
which cmd
|
259
269
|
end
|
260
|
-
raise
|
270
|
+
raise ClipboardError, <<-EOT unless command
|
271
|
+
Could not find copy command, tried:
|
272
|
+
#{CLIPBOARD_COMMANDS.values.join(' || ')}
|
273
|
+
EOT
|
261
274
|
action == :copy ? command : CLIPBOARD_COMMANDS[command]
|
262
275
|
end
|
263
276
|
|
data/spec/clipboard_spec.rb
CHANGED
data/spec/proxy_spec.rb
CHANGED
@@ -7,13 +7,15 @@ describe '...' do
|
|
7
7
|
ENV['HTTP_PROXY'] = @saved_env
|
8
8
|
end
|
9
9
|
|
10
|
+
FOO_URL = URI('http://ddg.gg/')
|
11
|
+
|
10
12
|
it "should be Net::HTTP when $HTTP_PROXY wasn't set" do
|
11
13
|
ENV['HTTP_PROXY'] = ''
|
12
|
-
Jist.http_connection().should be_an_instance_of(Net::HTTP)
|
14
|
+
Jist.http_connection(FOO_URL).should be_an_instance_of(Net::HTTP)
|
13
15
|
end
|
14
16
|
|
15
17
|
it "should be Net::HTTP::Proxy when $HTTP_PROXY was set" do
|
16
18
|
ENV['HTTP_PROXY'] = 'http://proxy.example.com:8080'
|
17
|
-
Jist.http_connection().should_not be_an_instance_of(Net::HTTP)
|
19
|
+
Jist.http_connection(FOO_URL).should_not be_an_instance_of(Net::HTTP)
|
18
20
|
end
|
19
21
|
end
|
metadata
CHANGED
@@ -1,25 +1,24 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jist
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.0
|
5
4
|
prerelease:
|
5
|
+
version: 1.3.0
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Conrad Irwin
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-12-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
|
15
|
+
type: :runtime
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
20
20
|
- !ruby/object:Gem::Version
|
21
21
|
version: '0'
|
22
|
-
type: :runtime
|
23
22
|
prerelease: false
|
24
23
|
version_requirements: !ruby/object:Gem::Requirement
|
25
24
|
none: false
|
@@ -27,15 +26,15 @@ dependencies:
|
|
27
26
|
- - ! '>='
|
28
27
|
- !ruby/object:Gem::Version
|
29
28
|
version: '0'
|
29
|
+
name: json
|
30
30
|
- !ruby/object:Gem::Dependency
|
31
|
-
|
31
|
+
type: :development
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|
33
33
|
none: false
|
34
34
|
requirements:
|
35
35
|
- - ! '>='
|
36
36
|
- !ruby/object:Gem::Version
|
37
37
|
version: '0'
|
38
|
-
type: :development
|
39
38
|
prerelease: false
|
40
39
|
version_requirements: !ruby/object:Gem::Requirement
|
41
40
|
none: false
|
@@ -43,15 +42,15 @@ dependencies:
|
|
43
42
|
- - ! '>='
|
44
43
|
- !ruby/object:Gem::Version
|
45
44
|
version: '0'
|
45
|
+
name: rake
|
46
46
|
- !ruby/object:Gem::Dependency
|
47
|
-
|
47
|
+
type: :development
|
48
48
|
requirement: !ruby/object:Gem::Requirement
|
49
49
|
none: false
|
50
50
|
requirements:
|
51
51
|
- - ! '>='
|
52
52
|
- !ruby/object:Gem::Version
|
53
53
|
version: '0'
|
54
|
-
type: :development
|
55
54
|
prerelease: false
|
56
55
|
version_requirements: !ruby/object:Gem::Requirement
|
57
56
|
none: false
|
@@ -59,15 +58,15 @@ dependencies:
|
|
59
58
|
- - ! '>='
|
60
59
|
- !ruby/object:Gem::Version
|
61
60
|
version: '0'
|
61
|
+
name: rspec
|
62
62
|
- !ruby/object:Gem::Dependency
|
63
|
-
|
63
|
+
type: :development
|
64
64
|
requirement: !ruby/object:Gem::Requirement
|
65
65
|
none: false
|
66
66
|
requirements:
|
67
67
|
- - ! '>='
|
68
68
|
- !ruby/object:Gem::Version
|
69
69
|
version: '0'
|
70
|
-
type: :development
|
71
70
|
prerelease: false
|
72
71
|
version_requirements: !ruby/object:Gem::Requirement
|
73
72
|
none: false
|
@@ -75,6 +74,7 @@ dependencies:
|
|
75
74
|
- - ! '>='
|
76
75
|
- !ruby/object:Gem::Version
|
77
76
|
version: '0'
|
77
|
+
name: webmock
|
78
78
|
description: Provides a single function (Jist.gist) that uploads a gist.
|
79
79
|
email: conrad.irwin@gmail.com
|
80
80
|
executables:
|
@@ -121,4 +121,3 @@ signing_key:
|
|
121
121
|
specification_version: 3
|
122
122
|
summary: Just allows you to upload gists
|
123
123
|
test_files: []
|
124
|
-
has_rdoc:
|