couch-shell 0.0.2 → 0.0.3

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.
@@ -11,7 +11,7 @@ module CouchShell
11
11
  "application/json", "text/plain"
12
12
  ].freeze
13
13
 
14
- # +response+ is a Net::HTTP response
14
+ # +response+ is a HTTP::Message from httpclient library
15
15
  def initialize(response)
16
16
  @res = response
17
17
  @json = nil
@@ -23,9 +23,9 @@ module CouchShell
23
23
  def json
24
24
  unless @computed_json
25
25
  if JSON_CONTENT_TYPES.include?(content_type) &&
26
- !@res.body.nil? && !@res.body.empty?
26
+ !body.nil? && !body.empty?
27
27
  begin
28
- @json = JsonValue.wrap(JSON.parse(@res.body))
28
+ @json = JsonValue.wrap(JSON.parse(body))
29
29
  rescue JSON::ParserError
30
30
  @json = false
31
31
  end
@@ -36,11 +36,11 @@ module CouchShell
36
36
  end
37
37
 
38
38
  def code
39
- @res.code
39
+ @res.status.to_s
40
40
  end
41
41
 
42
42
  def message
43
- @res.message
43
+ @res.reason
44
44
  end
45
45
 
46
46
  def ok?
@@ -48,11 +48,11 @@ module CouchShell
48
48
  end
49
49
 
50
50
  def body
51
- @res.body
51
+ @res.content
52
52
  end
53
53
 
54
54
  def content_type
55
- @res.content_type
55
+ @res.contenttype.sub(/;[^;]*\z/, '')
56
56
  end
57
57
 
58
58
  def attr(name, altname = nil)
@@ -1,7 +1,7 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
 
3
3
  require "uri"
4
- require "net/http"
4
+ require "httpclient"
5
5
  require "highline"
6
6
  require "couch-shell/response"
7
7
  require "couch-shell/ring_buffer"
@@ -27,6 +27,22 @@ module CouchShell
27
27
 
28
28
  end
29
29
 
30
+ class FileToUpload
31
+
32
+ attr_reader :filename, :content_type
33
+
34
+ def initialize(filename, content_type = nil)
35
+ @filename = filename
36
+ @content_type = content_type
37
+ end
38
+
39
+ def content_type!
40
+ # TODO: use mime-types and/or file to guess mime type
41
+ content_type || "application/octet-stream"
42
+ end
43
+
44
+ end
45
+
30
46
  PREDEFINED_VARS = [
31
47
  "uuid", "id", "rev", "idr",
32
48
  "content-type", "server"
@@ -43,6 +59,7 @@ module CouchShell
43
59
  @highline = HighLine.new(@stdin, @stdout)
44
60
  @responses = RingBuffer.new(10)
45
61
  @eval_context = EvalContext.new(self)
62
+ @httpclient = HTTPClient.new
46
63
  end
47
64
 
48
65
  def normalize_server_url(url)
@@ -126,34 +143,35 @@ module CouchShell
126
143
  errmsg "Protocol #{@server_url.scheme} not supported, use http."
127
144
  return
128
145
  end
129
- rescode = nil
130
- Net::HTTP.start(@server_url.host, @server_url.port) do |http|
131
- req = (case method
132
- when "GET"
133
- Net::HTTP::Get
134
- when "PUT"
135
- Net::HTTP::Put
136
- when "POST"
137
- Net::HTTP::Post
138
- when "DELETE"
139
- Net::HTTP::Delete
140
- else
141
- raise "unsupported http method: `#{method}'"
142
- end).new(fpath)
143
- if body
144
- req.body = body
145
- if req.content_type.nil? && req.body =~ JSON_DOC_START_RX
146
- req.content_type = "application/json"
147
- end
148
- end
149
- res = Response.new(http.request(req))
150
- @responses << res
151
- rescode = res.code
152
- vars = ["r#{@responses.index}"]
153
- vars << ["j#{@responses.index}"] if res.json
154
- print_response res, " vars: #{vars.join(', ')}"
146
+ res = http_client_request(method, expand(path), body)
147
+ @responses << res
148
+ rescode = res.code
149
+ vars = ["r#{@responses.index}"]
150
+ vars << ["j#{@responses.index}"] if res.json
151
+ print_response res, " vars: #{vars.join(', ')}"
152
+ res.code
153
+ end
154
+
155
+ def http_client_request(method, absolute_url, body)
156
+ file = nil
157
+ headers = {}
158
+ if body.kind_of?(FileToUpload)
159
+ file_to_upload = body
160
+ file = File.open(file_to_upload.filename, "rb")
161
+ body = [{'Content-Type' => file_to_upload.content_type!,
162
+ :content => file}]
163
+ elsif body && body =~ JSON_DOC_START_RX
164
+ headers['Content-Type'] = "application/json"
155
165
  end
156
- rescode
166
+ res = @httpclient.request(method, absolute_url, body, headers)
167
+ Response.new(res)
168
+ ensure
169
+ file.close if file
170
+ end
171
+
172
+ def expand(url)
173
+ u = @server_url
174
+ "#{u.scheme}://#{u.host}:#{u.port}#{full_path url}"
157
175
  end
158
176
 
159
177
  def full_path(path)
@@ -322,22 +340,31 @@ module CouchShell
322
340
  end
323
341
  end
324
342
 
343
+ def request_command_with_body(method, argstr)
344
+ if argstr =~ JSON_DOC_START_RX
345
+ url, bodyarg = nil, argstr
346
+ else
347
+ url, bodyarg= argstr.split(/\s+/, 2)
348
+ end
349
+ if bodyarg.start_with?("@")
350
+ filename, content_type = bodyarg[1..-1].split(/\s+/, 2)
351
+ body = FileToUpload.new(filename, content_type)
352
+ else
353
+ body = bodyarg
354
+ end
355
+ request method, interpolate(url), body
356
+ end
357
+
325
358
  def command_get(argstr)
326
359
  request "GET", interpolate(argstr)
327
360
  end
328
361
 
329
362
  def command_put(argstr)
330
- url, body = argstr.split(/\s+/, 2)
331
- request "PUT", interpolate(url), body
363
+ request_command_with_body("PUT", argstr)
332
364
  end
333
365
 
334
366
  def command_post(argstr)
335
- if argstr =~ JSON_DOC_START_RX
336
- url, body = nil, argstr
337
- else
338
- url, body = argstr.split(/\s+/, 2)
339
- end
340
- request "POST", interpolate(url), body
367
+ request_command_with_body("POST", argstr)
341
368
  end
342
369
 
343
370
  def command_delete(argstr)
@@ -396,6 +423,10 @@ module CouchShell
396
423
  self.server = argstr
397
424
  end
398
425
 
426
+ def command_expand(argstr)
427
+ @stdout.puts expand(interpolate(argstr))
428
+ end
429
+
399
430
  end
400
431
 
401
432
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module CouchShell
4
4
 
5
- VERSION = "0.0.2"
5
+ VERSION = "0.0.3"
6
6
 
7
7
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 2
9
- version: 0.0.2
8
+ - 3
9
+ version: 0.0.3
10
10
  platform: ruby
11
11
  authors:
12
12
  - Stefan Lang
@@ -16,8 +16,38 @@ cert_chain: []
16
16
 
17
17
  date: 2011-01-19 00:00:00 +01:00
18
18
  default_executable:
19
- dependencies: []
20
-
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: httpclient
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 2
30
+ - 1
31
+ - 6
32
+ - 1
33
+ version: 2.1.6.1
34
+ type: :runtime
35
+ version_requirements: *id001
36
+ - !ruby/object:Gem::Dependency
37
+ name: highline
38
+ prerelease: false
39
+ requirement: &id002 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ segments:
45
+ - 1
46
+ - 6
47
+ - 1
48
+ version: 1.6.1
49
+ type: :runtime
50
+ version_requirements: *id002
21
51
  description:
22
52
  email: langstefan@gmx.at
23
53
  executables: