malcolm 0.0.2 → 0.1.0

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ce48a7b3712eb2d682e308b30b5e3ac8153ce6c6
4
+ data.tar.gz: 040a16adb500ea31bb00486a95011b343f1b54c8
5
+ SHA512:
6
+ metadata.gz: a86a1a211487167fb7d3a8c8b5e6894e1ea8ebd0a41474c4eaf58130b902406adf133748a6e86c75bb7e9c7fd5141740a6eddea67c9970f8414c4de1018630b1
7
+ data.tar.gz: d8deaf6c14307d53cc89fd877cfb87d43722adfdcef4255c33d1ea73211e929f4fb4b9be5d4e9b7e15f9c786277c7b4e1ba16f118568fc6079ed207ee553bf68
@@ -1,13 +1,13 @@
1
1
  require 'faraday'
2
+ require 'nori'
3
+ require 'gyoku'
4
+ require 'malcolm/exceptions'
2
5
 
3
6
  module Malcolm
4
7
  autoload :SOAPBuilder, 'malcolm/request/soap_builder'
5
8
  autoload :SOAPParser, 'malcolm/response/soap_parser'
6
9
 
7
- Faraday.register_middleware :request,
8
- :soap => SOAPBuilder
9
-
10
- Faraday.register_middleware :response,
11
- :soap => SOAPParser
10
+ Faraday::Request.register_middleware soap: SOAPBuilder
12
11
 
13
- end
12
+ Faraday::Response.register_middleware soap: SOAPParser
13
+ end
@@ -0,0 +1,3 @@
1
+ module Malcolm
2
+ class SOAPError < Exception; end
3
+ end
@@ -2,23 +2,22 @@ module Malcolm
2
2
  # Request middleware that converts params to XML and wraps them in a SOAP envelope.
3
3
  #See http://www.w3.org/TR/2007/REC-soap12-part0-20070427/
4
4
  class SOAPBuilder < Faraday::Middleware
5
- dependency 'xmlsimple'
6
-
7
- # Assumes request body is a hash of key-value pairs
5
+ # Assumes request body is a hash of key-value pairs
8
6
  def call(env)
9
7
  env[:body] = wrap(env[:body])
10
8
  @app.call env
11
9
  end
12
-
10
+
13
11
  private
14
-
12
+
15
13
  # Builds an XML document around request data
16
14
  def wrap(data)
17
- raise "Request body already serialized. Please make sure it is a hash before applying SOAP Builder." unless data.is_a?(Hash)
18
15
  "<?xml version=\"1.0\" encoding=\"UTF-8\"?><env:Envelope xmlns:env=\"http://schemas.xmlsoap.org/soap/envelope/\"><env:Body>".tap do |soap_envelope|
19
- soap_envelope << XmlSimple.xml_out(data, :keep_root => true) if data
16
+ unless data.blank?
17
+ soap_envelope << (data.is_a?(Hash) ? Gyoku.xml(data) : data)
18
+ end
20
19
  soap_envelope << "</env:Body></env:Envelope>"
21
20
  end
22
21
  end
23
22
  end
24
- end
23
+ end
@@ -1,25 +1,24 @@
1
1
  module Malcolm
2
2
  # Response middleware that unwraps a SOAP envelope for you
3
3
  class SOAPParser < Faraday::Response::Middleware
4
- dependency 'nori'
5
-
6
- Nori.configure do |config|
7
- config.strip_namespaces = true
8
- config.convert_tags_to { |tag| tag.snakecase.to_sym }
9
- end
10
-
11
4
  def initialize(env, *args)
12
5
  key = args[0]
13
6
  super(env)
14
7
  end
15
-
8
+
16
9
  # Expects response XML to already be parsed
17
10
  def on_complete(env)
18
- env[:body] = Nori.parse(env[:body])
11
+ env[:body] = Nori.new(
12
+ strip_namespaces: true,
13
+ convert_tags_to: ->(tag) { tag.snakecase.to_sym }
14
+ ).parse(env[:body])
15
+
16
+ raise SOAPError, "Invalid SOAP response" if env[:body].empty?
17
+
19
18
  env[:body] = env[:body][:envelope][:body]
20
19
  env[:body] = find_key_in_hash(env[:body], @key)
21
20
  end
22
-
21
+
23
22
  private
24
23
 
25
24
  # Finds +index+ in +hash+ by searching recursively
@@ -42,6 +41,6 @@ module Malcolm
42
41
  end
43
42
  end
44
43
  end
45
-
44
+
46
45
  end
47
46
  end
@@ -0,0 +1,3 @@
1
+ module Malcolm
2
+ VERSION = Version = '0.1.0'
3
+ end
@@ -18,11 +18,20 @@ describe Malcolm::SOAPBuilder do
18
18
  xml.should include %{<test>data}
19
19
  end
20
20
 
21
- it "raises if body isn't a hash" do
21
+ it "directly inserts string data into hash" do
22
22
  middleware = described_class.new(lambda{|env| env})
23
- env = {:body => "test=data", :request_headers => Faraday::Utils::Headers.new}
24
- expect { middleware.call(env) }.to raise_error
23
+ env = {:body => "<test>data</test>", :request_headers => Faraday::Utils::Headers.new}
24
+ result = middleware.call(env)
25
+ xml = result[:body]
26
+ xml.should include %{<test>data</test>}
25
27
  end
26
28
 
29
+ it "ignores empty data" do
30
+ middleware = described_class.new(lambda{|env| env})
31
+ env = {:body => {}, :request_headers => Faraday::Utils::Headers.new}
32
+ result = middleware.call(env)
33
+ xml = result[:body]
34
+ xml.should include %{<env:Body></env:Body>}
35
+ end
27
36
 
28
37
  end
@@ -8,14 +8,14 @@ describe Malcolm::SOAPParser do
8
8
  res = middleware.on_complete(env)
9
9
  res.should be_a Hash
10
10
  end
11
-
11
+
12
12
  it "drills down to body" do
13
13
  env = { :body => load_fixture("soap.xml") }
14
14
  middleware = described_class.new(lambda{|env| env})
15
15
  res = middleware.on_complete(env)
16
16
  res.keys.should_not include(:envelope)
17
17
  end
18
-
18
+
19
19
  it "fetches given key" do
20
20
  env = { :body => load_fixture("soap.xml") }
21
21
  middleware = described_class.new(lambda{|env| env}, :item)
@@ -23,4 +23,9 @@ describe Malcolm::SOAPParser do
23
23
  res.keys.should_not include(:envelope)
24
24
  end
25
25
 
26
+ it "raises on invalid response" do
27
+ env = { :body => "" }
28
+ middleware = described_class.new(lambda{|env| env}, :item)
29
+ expect { middleware.on_complete(env) }.to raise_error(Malcolm::SOAPError)
30
+ end
26
31
  end
metadata CHANGED
@@ -1,113 +1,141 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: malcolm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
5
- prerelease:
4
+ version: 0.1.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Floyd Wright
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2012-03-19 00:00:00.000000000 Z
11
+ date: 2014-06-03 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: faraday
16
- requirement: &2151891200 !ruby/object:Gem::Requirement
17
- none: false
15
+ requirement: !ruby/object:Gem::Requirement
18
16
  requirements:
19
- - - ~>
17
+ - - "~>"
20
18
  - !ruby/object:Gem::Version
21
- version: 0.8.0rc2
19
+ version: 0.9.0
22
20
  type: :runtime
23
21
  prerelease: false
24
- version_requirements: *2151891200
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.9.0
25
27
  - !ruby/object:Gem::Dependency
26
- name: xml-simple
27
- requirement: &2151890420 !ruby/object:Gem::Requirement
28
- none: false
28
+ name: gyoku
29
+ requirement: !ruby/object:Gem::Requirement
29
30
  requirements:
30
- - - ~>
31
+ - - ">="
31
32
  - !ruby/object:Gem::Version
32
- version: 1.1.1
33
+ version: 0.4.4
33
34
  type: :runtime
34
35
  prerelease: false
35
- version_requirements: *2151890420
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 0.4.4
36
41
  - !ruby/object:Gem::Dependency
37
42
  name: nori
38
- requirement: &2151889120 !ruby/object:Gem::Requirement
39
- none: false
43
+ requirement: !ruby/object:Gem::Requirement
40
44
  requirements:
41
- - - ~>
45
+ - - ">="
42
46
  - !ruby/object:Gem::Version
43
47
  version: 1.1.0
44
48
  type: :runtime
45
49
  prerelease: false
46
- version_requirements: *2151889120
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: 1.1.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: nokogiri
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: 1.6.2.1
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: 1.6.2.1
47
69
  - !ruby/object:Gem::Dependency
48
70
  name: rake
49
- requirement: &2151888160 !ruby/object:Gem::Requirement
50
- none: false
71
+ requirement: !ruby/object:Gem::Requirement
51
72
  requirements:
52
- - - ~>
73
+ - - "~>"
53
74
  - !ruby/object:Gem::Version
54
75
  version: 0.9.2.2
55
76
  type: :development
56
77
  prerelease: false
57
- version_requirements: *2151888160
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 0.9.2.2
58
83
  - !ruby/object:Gem::Dependency
59
84
  name: rspec
60
- requirement: &2151886900 !ruby/object:Gem::Requirement
61
- none: false
85
+ requirement: !ruby/object:Gem::Requirement
62
86
  requirements:
63
- - - ~>
87
+ - - "~>"
64
88
  - !ruby/object:Gem::Version
65
- version: 2.8.0
89
+ version: 2.10.0
66
90
  type: :development
67
91
  prerelease: false
68
- version_requirements: *2151886900
69
- description: ! ' A collection of Faraday middleware
70
-
71
- '
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 2.10.0
97
+ description: |2
98
+ A collection of Faraday middleware
72
99
  email: fwright@site5.com
73
100
  executables: []
74
101
  extensions: []
75
102
  extra_rdoc_files:
76
103
  - README.markdown
77
104
  files:
105
+ - README.markdown
78
106
  - Rakefile
79
- - README.md
107
+ - lib/malcolm.rb
108
+ - lib/malcolm/exceptions.rb
80
109
  - lib/malcolm/request/soap_builder.rb
81
110
  - lib/malcolm/response/soap_parser.rb
82
- - lib/malcolm.rb
111
+ - lib/malcolm/version.rb
83
112
  - spec/fixtures/soap.xml
84
113
  - spec/malcolm/request/soap_builder_spec.rb
85
114
  - spec/malcolm/response/soap_parser_spec.rb
86
115
  - spec/spec_helper.rb
87
- - README.markdown
88
116
  homepage: https://github.com/site5/malcolm
89
117
  licenses: []
118
+ metadata: {}
90
119
  post_install_message:
91
120
  rdoc_options:
92
- - --charset=UTF-8
121
+ - "--charset=UTF-8"
93
122
  require_paths:
94
123
  - lib
95
124
  required_ruby_version: !ruby/object:Gem::Requirement
96
- none: false
97
125
  requirements:
98
- - - ! '>='
126
+ - - ">="
99
127
  - !ruby/object:Gem::Version
100
128
  version: '0'
101
129
  required_rubygems_version: !ruby/object:Gem::Requirement
102
- none: false
103
130
  requirements:
104
- - - ! '>='
131
+ - - ">="
105
132
  - !ruby/object:Gem::Version
106
133
  version: '0'
107
134
  requirements: []
108
135
  rubyforge_project:
109
- rubygems_version: 1.8.16
136
+ rubygems_version: 2.2.2
110
137
  signing_key:
111
- specification_version: 3
138
+ specification_version: 4
112
139
  summary: A collection of Faraday middleware
113
140
  test_files: []
141
+ has_rdoc:
data/README.md DELETED
@@ -1,22 +0,0 @@
1
- # Malcolm [![Malcolm Build Status][Build Icon]][Build Status]
2
-
3
- Malcolm is a collection of middleware for [Faraday](https://github.com/technoweenie/faraday),
4
- the excellent HTTP client interface based on [Rack](http://rack.github.com/).
5
-
6
- [Build Icon]: https://secure.travis-ci.org/site5/malcolm.png?branch=master
7
- [Build Status]: https://travis-ci.org/site5/malcolm
8
-
9
- ## Note on Patches/Pull Requests
10
-
11
- * Fork the project.
12
- * Make your feature addition or bug fix.
13
- * Add tests for it. This is important so I don't break it in a
14
- future version unintentionally.
15
- * Commit, do not mess with rakefile, version, or history.
16
- (if you want to have your own version, that is fine but bump version in a
17
- commit by itself I can ignore when I pull)
18
- * Send me a pull request. Bonus points for topic branches.
19
-
20
- ## Copyright
21
-
22
- Copyright (c) 2012 Site5.com. See LICENSE for details.