message_exchange 0.0.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: e413293bee6021a29b2b4c73e217d24fe5046c34
4
+ data.tar.gz: 4bacba899d4d70ba5f1b1d0a69e51f17fd41f5c2
5
+ SHA512:
6
+ metadata.gz: 6aab063ac0ddbc02090912b39c72e5c86fd016daa0731078d71867cdd60a970adb4b07fa926597a862529e2c74f3332e945d41d345cb2633d3038ead45aec33a
7
+ data.tar.gz: 78c6c07527d5ba8f021a652ade115091e7796b45fd065ae30c2b5106a52bb4b0defeb03299396e2d201874df9e56a22e191467ceb39a589ac9634c4ba07cf762
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 1.9.3-p448
data/.travis.yml ADDED
@@ -0,0 +1,7 @@
1
+ language: ruby
2
+ rvm:
3
+ - "1.8.7"
4
+ - "1.9.2"
5
+ - "1.9.3"
6
+ - "2.0.0"
7
+
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in message_exchange.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2013 On The Beach Ltd
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,50 @@
1
+ # MessageExchange [![Code Climate](https://codeclimate.com/github/onthebeach/message_exchange.png)](https://codeclimate.com/github/onthebeach/message_exchange) [![Build Status](https://travis-ci.org/onthebeach/message_exchange.png?branch=master)](https://travis-ci.org/onthebeach/message_exchange)
2
+
3
+ Use MessageExchange to simplify the passing of JSON-based messages between HTTP based applications.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'message_exchange', git: 'git@github.com:onthebeach/message_exchange.git'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install message_exchange
18
+
19
+ ## Usage
20
+
21
+ Craft your request, replacing the class with one of `Get`, `Post`, `Put` or `Delete`.
22
+
23
+ request = MessageExchange::Get.new(url_string, params_hash)
24
+
25
+ Consume the response:
26
+
27
+ response = request.response
28
+
29
+ response.status # => the HTTP response code
30
+
31
+ response.success? # => Boolean (based on 20x response code)
32
+
33
+ response.body # => some stuff you probably wanted
34
+
35
+ ## Todo
36
+
37
+ * Implement other HTTP v1.1 methods: `Patch`, `Options`, `Head`, `Trace` or `Connect`.
38
+ * Better error handling; currently only catches request timeouts.
39
+ * Configurable timeouts.
40
+ * Configurable headers.
41
+ * Configurable ports (instead of just port 80).
42
+ * HTTP/HTTPS support.
43
+
44
+ ## Contributing
45
+
46
+ 1. Fork it
47
+ 2. Create your feature branch (`git checkout -b feature/my-new-feature`)
48
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
49
+ 4. Push to the branch (`git push origin feature/my-new-feature`)
50
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env rake
2
+
3
+ begin
4
+ require 'bundler/setup'
5
+ rescue LoadError
6
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
7
+ end
8
+
9
+ APP_RAKEFILE = File.expand_path("./Rakefile", __FILE__)
10
+
11
+ Bundler::GemHelper.install_tasks
12
+
13
+ Dir[File.join(File.dirname(__FILE__), 'lib/**/*.rake')].each {|f| load f }
14
+
15
+ require 'rspec/core'
16
+ require 'rspec/core/rake_task'
17
+
18
+ desc "Run all specs in spec directory (excluding plugin specs)"
19
+ RSpec::Core::RakeTask.new
20
+ task :default => :spec
21
+
@@ -0,0 +1,13 @@
1
+ require "net/http"
2
+ require "yajl"
3
+ require "active_support/core_ext"
4
+
5
+ require "message_exchange/version"
6
+
7
+ require "message_exchange/response"
8
+ require "message_exchange/server_error_response"
9
+ require "message_exchange/request"
10
+ require "message_exchange/get"
11
+ require "message_exchange/delete"
12
+ require "message_exchange/post"
13
+ require "message_exchange/put"
@@ -0,0 +1,13 @@
1
+ module MessageExchange
2
+ class Delete < Request
3
+ def request
4
+ Net::HTTP::Delete.new(full_path).tap do |request|
5
+ request['Accept'] = 'application/json'
6
+ end
7
+ end
8
+
9
+ def full_path
10
+ uri.request_uri
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,18 @@
1
+ module MessageExchange
2
+ class Get < Request
3
+ def request
4
+ Net::HTTP::Get.new(full_path).tap do |request|
5
+ request['Accept'] = 'application/json'
6
+ end
7
+ end
8
+
9
+ def full_path
10
+ "#{uri.request_uri}#{parameter_string}"
11
+ end
12
+
13
+ def parameter_string
14
+ return ("?" + params.to_query) unless params.empty?
15
+ ""
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,14 @@
1
+ module MessageExchange
2
+ class Post < Request
3
+ def request
4
+ Net::HTTP::Post.new(full_path).tap do |request|
5
+ request['Accept'] = 'application/json'
6
+ request.body = params.to_param
7
+ end
8
+ end
9
+
10
+ def full_path
11
+ uri.request_uri
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ module MessageExchange
2
+ class Put < Request
3
+ def request
4
+ Net::HTTP::Put.new(full_path).tap do |request|
5
+ request['Accept'] = 'application/json'
6
+ request.body = params.to_param
7
+ end
8
+ end
9
+
10
+ def full_path
11
+ uri.request_uri
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,31 @@
1
+ module MessageExchange
2
+ class Request
3
+ attr_reader :uri, :params
4
+
5
+ def initialize(uri, params = {})
6
+ @uri = URI(uri)
7
+ @params = params
8
+ end
9
+
10
+ def request
11
+ raise NotImplementedError, "Subclasses must implement this"
12
+ end
13
+
14
+ def port
15
+ 80
16
+ end
17
+
18
+ def response
19
+ @response ||= Response.new(http.request(request))
20
+ rescue Timeout::Error
21
+ @response ||= ServerErrorResponse.new
22
+ end
23
+
24
+ def http
25
+ Net::HTTP.new(uri.host, port).tap do |http|
26
+ http.open_timeout = 0.1
27
+ http.read_timeout = 0.5
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,25 @@
1
+ module MessageExchange
2
+ class Response
3
+ attr_accessor :status, :body
4
+
5
+ def initialize(api_response)
6
+ @api_response = api_response
7
+ end
8
+
9
+ def status
10
+ @status ||= api_response.code.to_i
11
+ end
12
+
13
+ def body
14
+ @body ||= Yajl::Parser.parse(api_response.body)
15
+ end
16
+
17
+ def success?
18
+ (200..206).include?(status)
19
+ end
20
+
21
+ private
22
+
23
+ attr_reader :api_response
24
+ end
25
+ end
@@ -0,0 +1,15 @@
1
+ module MessageExchange
2
+ class ServerErrorResponse
3
+ def status
4
+ 500
5
+ end
6
+
7
+ def body
8
+ '{ "error": "Request timed out." }'
9
+ end
10
+
11
+ def success?
12
+ false
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,3 @@
1
+ module MessageExchange
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,29 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'message_exchange/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "message_exchange"
8
+ spec.version = MessageExchange::VERSION
9
+ spec.authors = ["Gavin Laking", "Salla Turunen"]
10
+ spec.email = ["gavin.laking@onthebeach.co.uk", "salla.turunen@onthebeach.co.uk"]
11
+ spec.description = %q{Gem to facilitate HTTP request/responses between applications.}
12
+ spec.summary = spec.description
13
+ spec.homepage = "http://www.onthebeach.co.uk/"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.3"
22
+ spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "rspec"
24
+ spec.add_development_dependency "simplecov"
25
+ spec.add_development_dependency "webmock"
26
+
27
+ spec.add_dependency "activesupport", "3.2.13"
28
+ spec.add_dependency "yajl-ruby"
29
+ end
@@ -0,0 +1,18 @@
1
+ require "spec_helper"
2
+
3
+ describe MessageExchange::Delete do
4
+ subject { described_class.new('http://www.myurl.woo') }
5
+
6
+ it "makes a request to a URL" do
7
+ stub_request(:delete, "http://www.myurl.woo/").
8
+ with(:headers => {'Accept'=>'application/json'})
9
+
10
+ subject.response
11
+ end
12
+
13
+ it "returns a ServerErrorResponse when the request times out" do
14
+ Net::HTTP.stub(:new){ raise Timeout::Error }
15
+
16
+ expect(subject.response).to be_a MessageExchange::ServerErrorResponse
17
+ end
18
+ end
@@ -0,0 +1,29 @@
1
+ require "spec_helper"
2
+
3
+ describe MessageExchange::Get do
4
+ subject { described_class.new('http://www.myurl.woo') }
5
+
6
+ it "makes a request to a URL" do
7
+ stub_request(:get, "http://www.myurl.woo/").
8
+ with(:headers => {'Accept'=>'application/json'}).
9
+ to_return(:status => 200, :body => "", :headers => {})
10
+ subject.response
11
+ end
12
+
13
+ it "passes the parameters that we configure" do
14
+ stub_request(:get, "http://www.myurl.woo/?foo=bar").
15
+ with(:headers => {'Accept'=>'application/json'})
16
+
17
+ described_class.new('http://www.myurl.woo', {:foo => 'bar'}).response
18
+ end
19
+
20
+ it "returns a ServerErrorResponse when the request times out" do
21
+ Net::HTTP.stub(:new){ raise Timeout::Error }
22
+
23
+ expect(subject.response).to be_a MessageExchange::ServerErrorResponse
24
+ end
25
+
26
+ it "does not return a parameter string if there are no parameters" do
27
+ expect(subject.parameter_string).to_not include("?")
28
+ end
29
+ end
@@ -0,0 +1,18 @@
1
+ require "spec_helper"
2
+
3
+ describe MessageExchange::Post do
4
+ subject { described_class.new('http://www.myurl.woo') }
5
+
6
+ it "makes a request to a URL" do
7
+ stub_request(:post, "http://www.myurl.woo/").
8
+ with(:headers => {'Accept'=>'application/json'})
9
+
10
+ subject.response
11
+ end
12
+
13
+ it "returns a ServerErrorResponse when the request times out" do
14
+ Net::HTTP.stub(:new){ raise Timeout::Error }
15
+
16
+ expect(subject.response).to be_a MessageExchange::ServerErrorResponse
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ require "spec_helper"
2
+
3
+ describe MessageExchange::Put do
4
+ subject { described_class.new('http://www.myurl.woo') }
5
+
6
+ it "makes a request to a URL" do
7
+ stub_request(:put, "http://www.myurl.woo/").
8
+ with(:headers => {'Accept'=>'application/json'})
9
+
10
+ subject.response
11
+ end
12
+
13
+ it "returns a ServerErrorResponse when the request times out" do
14
+ Net::HTTP.stub(:new){ raise Timeout::Error }
15
+
16
+ expect(subject.response).to be_a MessageExchange::ServerErrorResponse
17
+ end
18
+ end
@@ -0,0 +1,21 @@
1
+ require "spec_helper"
2
+
3
+ describe MessageExchange::Request do
4
+ let(:uri) { "http://www.myurl.woo/" }
5
+
6
+ describe "#request" do
7
+ subject { described_class.new(uri).request }
8
+
9
+ it "raises the not implemented error" do
10
+ expect{ subject }.to raise_error(NotImplementedError, "Subclasses must implement this")
11
+ end
12
+ end
13
+
14
+ describe "#port" do
15
+ subject { described_class.new(uri).port }
16
+
17
+ it "sets the port to 80" do
18
+ expect(subject).to eq(80)
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,53 @@
1
+ require "spec_helper"
2
+
3
+ describe MessageExchange::Response do
4
+ let(:api_response) { double(:api_response) }
5
+
6
+ describe "#status" do
7
+ subject { described_class.new(api_response).status }
8
+
9
+ before do
10
+ api_response.stub(:code) { "200" }
11
+ end
12
+
13
+ it "returns the status code of the response" do
14
+ expect(subject).to eq(200)
15
+ end
16
+ end
17
+
18
+ describe "#body" do
19
+ subject { described_class.new(api_response).body }
20
+
21
+ before do
22
+ api_response.stub(:body) { "{\"string\": \"Hello World\"}" }
23
+ end
24
+
25
+ it "returns the parsed JSON body" do
26
+ expect(subject).to eq({"string" => "Hello World"})
27
+ end
28
+ end
29
+
30
+ describe "#success?" do
31
+ subject { described_class.new(api_response).success? }
32
+
33
+ (200..206).map(&:to_s).each do |code|
34
+ context "when #{code}" do
35
+ before do
36
+ api_response.stub(:code) { code }
37
+ end
38
+
39
+ it { expect(subject).to be_true }
40
+ end
41
+ end
42
+
43
+ context "when the status code is not 20x" do
44
+ before do
45
+ api_response.stub(:code) { 301 }
46
+ end
47
+
48
+ it "returns a false" do
49
+ expect(subject).to be_false
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,21 @@
1
+ require "spec_helper"
2
+
3
+ describe MessageExchange::ServerErrorResponse do
4
+ describe "#status" do
5
+ subject { described_class.new.status }
6
+
7
+ it { subject.should eq(500) }
8
+ end
9
+
10
+ describe "#body" do
11
+ subject { described_class.new.body }
12
+
13
+ it { subject.should eq('{ "error": "Request timed out." }') }
14
+ end
15
+
16
+ describe "#success?" do
17
+ subject { described_class.new.success? }
18
+
19
+ it { subject.should be_false }
20
+ end
21
+ end
@@ -0,0 +1,18 @@
1
+ require 'simplecov'
2
+
3
+ SimpleCov.start
4
+
5
+ require "webmock/rspec"
6
+ require "message_exchange"
7
+
8
+ RSpec.configure do |config|
9
+ config.treat_symbols_as_metadata_keys_with_true_values = true
10
+ config.run_all_when_everything_filtered = true
11
+ config.filter_run :focus
12
+
13
+ # Run specs in random order to surface order dependencies. If you find an
14
+ # order dependency and want to debug it, you can fix the order by providing
15
+ # the seed, which is printed after each run.
16
+ # --seed 1234
17
+ config.order = 'random'
18
+ end
metadata ADDED
@@ -0,0 +1,178 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: message_exchange
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Gavin Laking
8
+ - Salla Turunen
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-07-04 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bundler
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ~>
19
+ - !ruby/object:Gem::Version
20
+ version: '1.3'
21
+ type: :development
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ~>
26
+ - !ruby/object:Gem::Version
27
+ version: '1.3'
28
+ - !ruby/object:Gem::Dependency
29
+ name: rake
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - '>='
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - '>='
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: rspec
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - '>='
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: simplecov
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: webmock
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - '>='
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ - !ruby/object:Gem::Dependency
85
+ name: activesupport
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - '='
89
+ - !ruby/object:Gem::Version
90
+ version: 3.2.13
91
+ type: :runtime
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - '='
96
+ - !ruby/object:Gem::Version
97
+ version: 3.2.13
98
+ - !ruby/object:Gem::Dependency
99
+ name: yajl-ruby
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - '>='
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ type: :runtime
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - '>='
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ description: Gem to facilitate HTTP request/responses between applications.
113
+ email:
114
+ - gavin.laking@onthebeach.co.uk
115
+ - salla.turunen@onthebeach.co.uk
116
+ executables: []
117
+ extensions: []
118
+ extra_rdoc_files: []
119
+ files:
120
+ - .gitignore
121
+ - .rspec
122
+ - .ruby-version
123
+ - .travis.yml
124
+ - Gemfile
125
+ - LICENSE.txt
126
+ - README.md
127
+ - Rakefile
128
+ - lib/message_exchange.rb
129
+ - lib/message_exchange/delete.rb
130
+ - lib/message_exchange/get.rb
131
+ - lib/message_exchange/post.rb
132
+ - lib/message_exchange/put.rb
133
+ - lib/message_exchange/request.rb
134
+ - lib/message_exchange/response.rb
135
+ - lib/message_exchange/server_error_response.rb
136
+ - lib/message_exchange/version.rb
137
+ - message_exchange.gemspec
138
+ - spec/lib/message_exchange/delete_spec.rb
139
+ - spec/lib/message_exchange/get_spec.rb
140
+ - spec/lib/message_exchange/post_spec.rb
141
+ - spec/lib/message_exchange/put_spec.rb
142
+ - spec/lib/message_exchange/request_spec.rb
143
+ - spec/lib/message_exchange/response_spec.rb
144
+ - spec/lib/message_exchange/server_error_response_spec.rb
145
+ - spec/spec_helper.rb
146
+ homepage: http://www.onthebeach.co.uk/
147
+ licenses:
148
+ - MIT
149
+ metadata: {}
150
+ post_install_message:
151
+ rdoc_options: []
152
+ require_paths:
153
+ - lib
154
+ required_ruby_version: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - '>='
157
+ - !ruby/object:Gem::Version
158
+ version: '0'
159
+ required_rubygems_version: !ruby/object:Gem::Requirement
160
+ requirements:
161
+ - - '>='
162
+ - !ruby/object:Gem::Version
163
+ version: '0'
164
+ requirements: []
165
+ rubyforge_project:
166
+ rubygems_version: 2.0.3
167
+ signing_key:
168
+ specification_version: 4
169
+ summary: Gem to facilitate HTTP request/responses between applications.
170
+ test_files:
171
+ - spec/lib/message_exchange/delete_spec.rb
172
+ - spec/lib/message_exchange/get_spec.rb
173
+ - spec/lib/message_exchange/post_spec.rb
174
+ - spec/lib/message_exchange/put_spec.rb
175
+ - spec/lib/message_exchange/request_spec.rb
176
+ - spec/lib/message_exchange/response_spec.rb
177
+ - spec/lib/message_exchange/server_error_response_spec.rb
178
+ - spec/spec_helper.rb