pebblebed 0.3.15 → 0.3.16

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
  SHA1:
3
- metadata.gz: ee75f8d72025d4c7694243367b3d2c005cabc4e0
4
- data.tar.gz: '09d5d620129964dc80b206c1f3801bda4cebbeb8'
3
+ metadata.gz: ec6e1847afca02058150931728920d66a0488b41
4
+ data.tar.gz: fe9d7005b7ae347ab80d16473b2787ce46b4188f
5
5
  SHA512:
6
- metadata.gz: ed69ba69a5cf148d35c4eb06a864bc2e2026e9f93982657df0768f200bff70e6a704920b50f843fe9e44577cebc602d9fe58ae19706ca9d1033c2bce1ac91ca2
7
- data.tar.gz: bf78c1ac553713d8e40c0ccf85eb7be968744dcfebfcc9c144819691f6c4a686f7c7d8a72d44d7bd60645ae84f0aa6ab78882d973d6c927d421e6fd011415add
6
+ metadata.gz: 9a877ec1296f7df0a29b5ae43c2eb99cd99f39f4dbbe8fce3eda0ce397eae5225294bfe53a8df0f6892194febfabb857811bc75f2f0214606c9dab615d8c8e74
7
+ data.tar.gz: bf10e50a98159afda438c7e6e746dce69e634d5283fbdea2514e7e96434bfde424cd3ee01d3f45aeb1763e3242cda4508702cc6fce72559581cb21a89cded3ce
@@ -3,7 +3,7 @@ require 'deepstruct'
3
3
  module Pebblebed
4
4
  class GenericClient < AbstractClient
5
5
  def initialize(session_key, root_url)
6
- @root_url = root_url
6
+ @root_url = root_url
7
7
  @root_url = URI(@root_url) unless @root_url.is_a?(URI::HTTP)
8
8
  @session_key = session_key
9
9
  end
@@ -22,6 +22,14 @@ module Pebblebed
22
22
  end
23
23
  end
24
24
 
25
+ def stream(method, url = '', params = {}, options = {})
26
+ on_data = options[:on_data] or raise "Option :on_data must be specified"
27
+ method_name = "stream_#{method.to_s.downcase}"
28
+ raise "Method not supported for streaming" unless Pebblebed::Http.respond_to?(method_name)
29
+ return Pebblebed::Http.send(method_name, service_url(url), service_params(params),
30
+ on_data: on_data)
31
+ end
32
+
25
33
  def service_url(url, params = nil)
26
34
  result = @root_url.dup
27
35
  result.path = result.path.sub(/\/+$/, "") + url
@@ -50,7 +50,7 @@ module Pebblebed
50
50
 
51
51
  def self.get(url = nil, params = nil, &block)
52
52
  url, params = url_and_params_from_args(url, params, &block)
53
- return with_curl { |easy|
53
+ return do_easy { |easy|
54
54
  easy.url = url_with_params(url, params)
55
55
  easy.http_get
56
56
  }
@@ -59,7 +59,7 @@ module Pebblebed
59
59
  def self.post(url, params, &block)
60
60
  url, params = url_and_params_from_args(url, params, &block)
61
61
  content_type, body = serialize_params(params)
62
- return with_curl { |easy|
62
+ return do_easy { |easy|
63
63
  easy.url = url.to_s
64
64
  easy.headers['Accept'] = 'application/json'
65
65
  easy.headers['Content-Type'] = content_type
@@ -70,7 +70,7 @@ module Pebblebed
70
70
  def self.put(url, params, &block)
71
71
  url, params = url_and_params_from_args(url, params, &block)
72
72
  content_type, body = serialize_params(params)
73
- return with_curl { |easy|
73
+ return do_easy { |easy|
74
74
  easy.url = url.to_s
75
75
  easy.headers['Accept'] = 'application/json'
76
76
  easy.headers['Content-Type'] = content_type
@@ -80,12 +80,55 @@ module Pebblebed
80
80
 
81
81
  def self.delete(url, params, &block)
82
82
  url, params = url_and_params_from_args(url, params, &block)
83
- return with_curl { |easy|
83
+ return do_easy { |easy|
84
84
  easy.url = url_with_params(url, params)
85
85
  easy.http_delete
86
86
  }
87
87
  end
88
88
 
89
+ def self.stream_get(url = nil, params = nil, options = {})
90
+ return do_easy { |easy|
91
+ on_data = options[:on_data] or raise "Option :on_data must be specified"
92
+
93
+ url, params = url_and_params_from_args(url, params)
94
+
95
+ easy.url = url_with_params(url, params)
96
+ easy.on_body do |data|
97
+ on_data.call(data)
98
+ data.length
99
+ end
100
+ easy.http_get
101
+ }
102
+ end
103
+
104
+ def self.stream_post(url, params, options = {})
105
+ return do_easy { |easy|
106
+ on_data = options[:on_data] or raise "Option :on_data must be specified"
107
+
108
+ url, params = url_and_params_from_args(url, params)
109
+ content_type, body = serialize_params(params)
110
+
111
+ easy.url = url.to_s
112
+ easy.headers['Accept'] = 'application/json'
113
+ easy.headers['Content-Type'] = content_type
114
+ easy.http_post(body)
115
+ }
116
+ end
117
+
118
+ def self.stream_put(url, params, options = {})
119
+ return do_easy { |easy|
120
+ on_data = options[:on_data] or raise "Option :on_data must be specified"
121
+
122
+ url, params = url_and_params_from_args(url, params)
123
+ content_type, body = serialize_params(params)
124
+
125
+ easy.url = url.to_s
126
+ easy.headers['Accept'] = 'application/json'
127
+ easy.headers['Content-Type'] = content_type
128
+ easy.http_put(body)
129
+ }
130
+ end
131
+
89
132
  private
90
133
 
91
134
  def self.serialize_params(params)
@@ -114,11 +157,17 @@ module Pebblebed
114
157
  response
115
158
  end
116
159
 
117
- def self.with_curl(&block)
160
+ def self.do_easy(&block)
161
+ with_easy do |easy|
162
+ yield easy
163
+ return handle_http_errors(Response.new(easy))
164
+ end
165
+ end
166
+
167
+ def self.with_easy(&block)
118
168
  easy = Thread.current[:pebblebed_curb_easy] ||= Curl::Easy.new
119
169
  easy.reset
120
170
  yield easy
121
- return handle_http_errors(Response.new(easy))
122
171
  end
123
172
 
124
173
  def self.url_with_params(url, params)
@@ -1,3 +1,3 @@
1
1
  module Pebblebed
2
- VERSION = "0.3.15"
2
+ VERSION = "0.3.16"
3
3
  end
@@ -49,4 +49,27 @@ describe Pebblebed::GenericClient do
49
49
  expect(result).to eq "Ok"
50
50
  end
51
51
 
52
+ describe 'streaming' do
53
+ context 'GET' do
54
+ it "streams response body" do
55
+ curl_result = DeepStruct.wrap({status: 200, body: nil})
56
+ allow(Pebblebed::Http).to receive(:stream_get).with(
57
+ URI.parse("http://example.org/"),
58
+ {"session" => "session_key"},
59
+ anything) { |_, _, options|
60
+ options[:on_data].call("hello")
61
+ }.and_return(curl_result)
62
+
63
+ buf = ""
64
+ client = Pebblebed::GenericClient.new("session_key", "http://example.org/")
65
+ result = client.stream(:get, '/', {}, on_data: ->(data) {
66
+ buf << data
67
+ })
68
+ expect(buf).to eq "hello"
69
+ expect(result.status).to eq 200
70
+ expect(result.body).to eq nil
71
+ end
72
+ end
73
+ end
74
+
52
75
  end
data/spec/http_spec.rb CHANGED
@@ -87,4 +87,19 @@ describe Pebblebed::Http do
87
87
  expect(result["QUERY_STRING"]).to eq "hello=world"
88
88
  end
89
89
 
90
+ describe 'streaming' do
91
+ context 'GET' do
92
+ it "streams response body" do
93
+ buf = ""
94
+ response = Pebblebed::Http.stream_get(pebble_url, {hello: 'world'},
95
+ on_data: ->(data) {
96
+ buf << data
97
+ })
98
+ result = JSON.parse(buf)
99
+ expect(result["QUERY_STRING"]).to eq "hello=world"
100
+ expect(response.body).to eq nil
101
+ end
102
+ end
103
+ end
104
+
90
105
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pebblebed
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.15
4
+ version: 0.3.16
5
5
  platform: ruby
6
6
  authors:
7
7
  - Katrina Owen
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2017-06-13 00:00:00.000000000 Z
12
+ date: 2017-07-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
@@ -303,7 +303,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
303
303
  version: '0'
304
304
  requirements: []
305
305
  rubyforge_project: pebblebed
306
- rubygems_version: 2.5.2
306
+ rubygems_version: 2.4.5.2
307
307
  signing_key:
308
308
  specification_version: 4
309
309
  summary: Development tools for working with Pebblebed
@@ -323,3 +323,4 @@ test_files:
323
323
  - spec/sinatra_spec.rb
324
324
  - spec/spec_helper.rb
325
325
  - spec/uid_spec.rb
326
+ has_rdoc: