dhl-intraship 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,19 @@
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
18
+ atlassian-ide-plugin.xml
19
+ .idea
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in dhl-intraship.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 Team Europe
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,91 @@
1
+ # Dhl::Intraship
2
+
3
+ This is a simple gem to wrap the DHL Intraship SOAP Api. Note that currently only the simplest usecase is implemented:
4
+ Sending a national day definite package without any extra services.
5
+
6
+ ## Installation
7
+
8
+ Add this line to your application's Gemfile:
9
+
10
+ gem 'dhl-intraship'
11
+
12
+ And then execute:
13
+
14
+ $ bundle
15
+
16
+ Or install it yourself as:
17
+
18
+ $ gem install dhl-intraship
19
+
20
+ ## Usage
21
+
22
+ Initialize a new API object using
23
+
24
+ ```ruby
25
+ api = Dhl::Infraship::API.new(config, options)
26
+ ```
27
+
28
+ Config is the following hash:
29
+
30
+ ```ruby
31
+ config = {user: 'your Intraship API user name', #mandatory
32
+ signature: 'Your Intraship API user password', #mandatory
33
+ ekp: 'Your DHL EKP (first part of your DHL Account number)', #mandatory
34
+ procedure_id: 'The prodedureId (second part of your DHL Account number)', #optional, defaults to '01'
35
+ partner_id: 'The partnerId (=attendance, third part of your DHL Account number)' #optional, defaults to '01'
36
+ }
37
+ ```
38
+
39
+ Options is an optional parameter and can contain the following parameters:
40
+
41
+ ```ruby
42
+ options = {test: true, # If test is set, all API calls go against the Intraship test system
43
+ label_response_type: :xml} # If it's set to XML the createShipment-Calls return the label data as XML instead of the PDF-Link
44
+ ```
45
+
46
+ To send a shipment to DHL you need to create it first:
47
+
48
+ ```ruby
49
+ sender_address = Dhl::Intraship::Address.new(company: 'Team Europe Ventures',
50
+ street: 'Mohrenstraße',
51
+ house_number: '60',
52
+ zip: '10117',
53
+ city: 'Berlin',
54
+ country_code: 'DE',
55
+ email: 'info@teameurope.net')
56
+
57
+ receiver_address = Dhl::Intraship::Address.new(firstname: 'John',
58
+ lastname: 'Doe',
59
+ street: 'Mainstreet',
60
+ house_number: '10',
61
+ street_additional: 'Appartment 2a',
62
+ zip: '90210',
63
+ city: 'Springfield',
64
+ country_code: 'DE',
65
+ email: 'john.doe@example.com')
66
+
67
+ # Note that the weight parameter is in kg and the length/height/width in cm
68
+ shipment = Dhl::Intraship::Shipment.new(sender_address: sender_address,
69
+ receiver_address: receiver_address,
70
+ shipment_date: Date.today,
71
+ weight: 2,
72
+ length: 30,
73
+ height:15,
74
+ width: 25)
75
+ ```
76
+
77
+ Note that the actual api-call takes an array of shipments
78
+
79
+ ```ruby
80
+ result = api.createShipmentDD([shipment])
81
+ ```
82
+
83
+ The result contains the "shipment_number", as well as the "label_url" (or the "xml_label" when it was specified as repsonse type)
84
+
85
+ ## Contributing
86
+
87
+ 1. Fork it
88
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
89
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
90
+ 4. Push to the branch (`git push origin my-new-feature`)
91
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
@@ -0,0 +1,21 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/dhl-intraship/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["Alexander Kops"]
6
+ gem.email = ["a.kops@teameurope.net"]
7
+ gem.description = %q{A simple gem to access the DHL Intraship API}
8
+ gem.summary = %q{This wraps the DHL Intraship SOAP Interface for creating shipments}
9
+ gem.homepage = "https://github.com/teameurope/dhl-intraship"
10
+
11
+ gem.add_dependency "savon", "~> 0.9.9"
12
+ gem.add_development_dependency "rspec", "~> 2.9"
13
+ gem.add_development_dependency "savon_spec", "~> 0.1.6"
14
+
15
+ gem.files = `git ls-files`.split($\)
16
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
+ gem.name = "dhl-intraship"
19
+ gem.require_paths = ["lib"]
20
+ gem.version = Dhl::Intraship::VERSION
21
+ end
@@ -0,0 +1,5 @@
1
+ require "dhl-intraship/version"
2
+ require "dhl-intraship/api"
3
+ require "dhl-intraship/address"
4
+ require "dhl-intraship/shipment"
5
+ require "dhl-intraship/product_code"
@@ -0,0 +1,78 @@
1
+ module Dhl
2
+ module Intraship
3
+ class Address
4
+ attr_accessor :company, :salutation, :firstname, :lastname, :street, :house_number, :street_additional,
5
+ :zip, :city, :country_code, :email
6
+
7
+ def initialize(attributes = {})
8
+ attributes.each do |key, value|
9
+ setter = :"#{key.to_s}="
10
+ if self.respond_to?(setter)
11
+ self.send(setter, value)
12
+ end
13
+ end
14
+ end
15
+
16
+ def company?
17
+ !self.company.blank?
18
+ end
19
+
20
+ def country_code=(country_code)
21
+ raise "Country code must be an ISO-3166 two digit code" unless country_code.length == 2
22
+ @country_code = country_code
23
+ end
24
+
25
+ # Note: DHL rejects valid email addresses containing the + sign
26
+ def email=(email)
27
+ split = email.split('@')
28
+ local_part = split[0]
29
+ if local_part.include?('+')
30
+ local_part = local_part.split('+')[0]
31
+ end
32
+
33
+ @email = "#{local_part}@#{split[1]}"
34
+ end
35
+
36
+ def append_to_xml(xml)
37
+ xml.Company do |xml|
38
+ if company?
39
+ xml.cis(:Company) do |xml|
40
+ xml.cis(:name1, company)
41
+ if !street_additional.blank?
42
+ xml.cis(:name2, street_additional)
43
+ end
44
+ end
45
+ else
46
+ xml.cis(:Person) do |xml|
47
+ xml.cis(:salutation, salutation)
48
+ xml.cis(:firstname, firstname)
49
+ xml.cis(:lastname, lastname)
50
+ end
51
+ end
52
+ end
53
+ xml.Address do |xml|
54
+ xml.cis(:streetName, street)
55
+ xml.cis(:streetNumber, house_number)
56
+ xml.cis(:careOfName, street_additional) unless street_additional.nil?
57
+ xml.cis(:Zip) do |xml|
58
+ if country_code == 'DE'
59
+ xml.cis(:germany, zip)
60
+ elsif ['GB','UK'].include?(country_code)
61
+ xml.cis(:england, zip)
62
+ else
63
+ xml.cis(:other, zip)
64
+ end
65
+ end
66
+ xml.cis(:city, city)
67
+ xml.cis(:Origin) do |xml|
68
+ xml.cis(:countryISOCode, country_code)
69
+ end
70
+ end
71
+ xml.Communication do |xml|
72
+ xml.cis(:email, self.email)
73
+ xml.cis(:contactPerson, "#{firstname} #{lastname}")
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,104 @@
1
+ require 'savon'
2
+
3
+ module Dhl
4
+ module Intraship
5
+ class API
6
+
7
+ DEFAULT_NAMESPACES = {
8
+ "xmlns:soapenv" => "http://schemas.xmlsoap.org/soap/envelope/",
9
+ "xmlns:de" => "http://de.ws.intraship",
10
+ "xmlns:is" => "http://dhl.de/webservice/is_base_de",
11
+ "xmlns:cis" => "http://dhl.de/webservice/cisbase"}
12
+
13
+ INTRASHIP_WSDL = ""
14
+ INTRASHIP_ENDPOINT = ""
15
+ INTRASHIP_TEST_WSDL = "http://test-intraship.dhl.com/ws/1_0/ISService/DE.wsdl"
16
+ INTRASHIP_TEST_ENDPOINT = "http://test-intraship.dhl.com/ws/1_0/de/ISService"
17
+
18
+ def initialize(config, options = {})
19
+ raise "User must be specified" if config[:user].nil?
20
+ raise "Signature (password) must be specified" if config[:signature].nil?
21
+ raise "EKP (first part of the DHL account number) must be specified" if config[:ekp].nil?
22
+
23
+ if options[:test]
24
+ wsdl_url = INTRASHIP_TEST_WSDL
25
+ endpoint = INTRASHIP_TEST_ENDPOINT
26
+ else
27
+ wsdl_url = INTRASHIP_WSDL
28
+ endpoint = INTRASHIP_ENDPOINT
29
+ end
30
+
31
+ @user = config[:user]
32
+ @signature = config[:signature]
33
+ @ekp = config[:ekp]
34
+ @procedure_id = config[:procedure_id] || '01'
35
+ @partner_id = config[:partner_id] || '01'
36
+
37
+ @options = options
38
+ @client = ::Savon::Client.new do
39
+ wsdl.document = wsdl_url
40
+ wsdl.endpoint = endpoint
41
+ end
42
+ end
43
+
44
+ def createShipmentDD(shipments)
45
+ begin
46
+ # For some reason the class instance variables are not accessible inside of the request block
47
+ user = @user
48
+ signature = @signature
49
+ ekp = @ekp
50
+ procedure_id = @procedure_id
51
+ partner_id = @partner_id
52
+
53
+ returnXML = @config && @config[:label_response_type] && @config[:label_response_type] == :xml;
54
+ result = @client.request "de:CreateShipmentDDRequest" do
55
+ soap.xml do |xml|
56
+ xml.soapenv(:Envelope, DEFAULT_NAMESPACES) do |xml|
57
+ xml.soapenv(:Header) do |xml|
58
+ xml.cis(:Authentification) do |xml|
59
+ xml.cis(:user, user)
60
+ xml.cis(:signature, signature)
61
+ xml.cis(:accountNumber, "#{ekp}|#{procedure_id}|#{partner_id}")
62
+ xml.cis(:type, '0')
63
+ end
64
+ end
65
+ xml.soapenv(:Body) do |xml|
66
+ xml.de(:"CreateShipmentDDRequest") do |xml|
67
+ xml.cis(:Version) do |xml|
68
+ xml.cis(:majorRelease, '1')
69
+ xml.cis(:minorRelease, '0')
70
+ end
71
+ xml.ShipmentOrder do |xml|
72
+ xml.SequenceNumber('1')
73
+ shipments.each do |shipment|
74
+ shipment.append_to_xml(ekp, partner_id, xml)
75
+ xml.LabelResponseType('XML') if returnXML
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
83
+ r = result.to_hash[:create_shipment_response]
84
+ if r[:status][:status_code] == '0'
85
+ shipment_number = r[:creation_state][:shipment_number][:shipment_number]
86
+
87
+ if returnXML
88
+ xml_label = r[:creation_state][:xmllabel]
89
+ {shipment_number: shipment_number, xml_label: xml_label}
90
+ else
91
+ label_url = r[:creation_state][:labelurl]
92
+ {shipment_number: shipment_number, label_url: label_url}
93
+ end
94
+
95
+ else
96
+ raise "Intraship call failed with code #{r[:status][:status_code]}: #{r[:status][:status_message]}"
97
+ end
98
+ rescue Savon::Error => error
99
+ raise error
100
+ end
101
+ end
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,18 @@
1
+ module Dhl
2
+ module Intraship
3
+ class ProductCode
4
+ # Day definite product codes
5
+ DHL_PACKAGE = 'EPN'
6
+ WORLD_PACKAGE = 'BPI'
7
+ DHL_EURO_PACKAGE = 'EPI'
8
+ DHL_EURO_PLUS = 'EUP'
9
+
10
+ # Time definite product codes
11
+ DOMESTIC_EXPRESS = 'DXM'
12
+ STARTDAY_EXPRESS = 'TDK'
13
+ DHL_EXPRESS_WORLDWIDE = 'WPX'
14
+
15
+ VALID_PRODUCT_CODES = [DHL_PACKAGE, WORLD_PACKAGE, DHL_EURO_PACKAGE, DHL_EURO_PLUS, DOMESTIC_EXPRESS, STARTDAY_EXPRESS, DHL_EXPRESS_WORLDWIDE]
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,57 @@
1
+ require "dhl-intraship/product_code"
2
+
3
+ module Dhl
4
+ module Intraship
5
+ class Shipment
6
+ PACKAGE_TYPE = 'PK'
7
+
8
+ attr_accessor :sender_address, :receiver_address, :shipment_date, :weight, :length, :height, :width, :product_code
9
+
10
+ def initialize(attributes = {})
11
+ self.product_code = ProductCode::DHL_PACKAGE
12
+ attributes.each do |key, value|
13
+ setter = :"#{key.to_s}="
14
+ if self.respond_to?(setter)
15
+ self.send(setter, value)
16
+ end
17
+ end
18
+ end
19
+
20
+ def product_code=(product_code)
21
+ raise "No valid product code #{product_code}" unless ProductCode::VALID_PRODUCT_CODES.include?(product_code)
22
+ @product_code = product_code
23
+ end
24
+
25
+ def append_to_xml(ekp, partner_id, xml)
26
+ raise "Shipment date must be set!" if shipment_date.nil?
27
+ raise "Sender address must be set!" if sender_address.nil?
28
+ raise "Receiver address must be set!" if sender_address.nil?
29
+ xml.Shipment do |xml|
30
+ xml.ShipmentDetails do |xml|
31
+ xml.ProductCode(product_code)
32
+ xml.ShipmentDate(shipment_date.strftime("%Y-%m-%d"))
33
+ xml.cis(:EKP, ekp)
34
+ xml.Attendance do |xml|
35
+ xml.cis(:partnerID, partner_id)
36
+ end
37
+ xml.ShipmentItem do |xml|
38
+ xml.WeightInKG(weight)
39
+ xml.LengthInCM(length) unless length.nil?
40
+ xml.WidthInCM(width) unless width.nil?
41
+ xml.HeightInCM(height) unless height.nil?
42
+ xml.PackageType(PACKAGE_TYPE)
43
+ end
44
+ end
45
+ # Shipper information
46
+ xml.Shipper do |xml|
47
+ sender_address.append_to_xml(xml)
48
+ end
49
+ # Receiver information
50
+ xml.Receiver do |xml|
51
+ receiver_address.append_to_xml(xml)
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,5 @@
1
+ module Dhl
2
+ module Intraship
3
+ VERSION = "0.0.7"
4
+ end
5
+ end
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+
3
+ module Dhl
4
+ module Intraship
5
+
6
+ describe Address do
7
+ before{@address = Address.new}
8
+
9
+ it "should remove the part after a + from the email address" do
10
+ @address.email = "test+part@teameurope.net"
11
+ @address.email.should == "test@teameurope.net"
12
+ end
13
+
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,60 @@
1
+ require 'spec_helper'
2
+
3
+ module Dhl
4
+ module Intraship
5
+
6
+ TEST_RESPONSE = <<EOS
7
+ <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
8
+ <soapenv:Body>
9
+ <ns2:CreateShipmentResponse xmlns:ns2="http://de.ws.intraship">
10
+ <Version xmlns="http://dhl.de/webservice/cisbase">
11
+ <majorRelease>1</majorRelease>
12
+ <minorRelease>0</minorRelease>
13
+ <build>11</build>
14
+ </Version>
15
+ <status>
16
+ <StatusCode>0</StatusCode>
17
+ <StatusMessage>ok</StatusMessage>
18
+ </status>
19
+ <CreationState>
20
+ <StatusCode>0</StatusCode>
21
+ <StatusMessage>ok</StatusMessage>
22
+ <SequenceNumber>1</SequenceNumber>
23
+ <ShipmentNumber>
24
+ <ns1:shipmentNumber xmlns:ns1="http://dhl.de/webservice/cisbase">00340433836000191469</ns1:shipmentNumber>
25
+ </ShipmentNumber>
26
+ <PieceInformation>
27
+ <PieceNumber>
28
+ <ns1:licensePlate xmlns:ns1="http://dhl.de/webservice/cisbase">00340433836000191469</ns1:licensePlate>
29
+ </PieceNumber>
30
+ </PieceInformation>
31
+ <Labelurl>http://test-intraship.dhl.com:80/cartridge.55/WSPrint?code=2DF3501616A182E9328C91C83B00509C4A611A39324EAA66</Labelurl>
32
+ </CreationState>
33
+ </ns2:CreateShipmentResponse>
34
+ </soapenv:Body>
35
+ </soapenv:Envelope>
36
+ EOS
37
+
38
+ describe API do
39
+ before(:each) do
40
+ config = {user: 'user', signature: 'signature', ekp: 'ekp12345'}
41
+ options = {test: true}
42
+ @api = API.new(config, options)
43
+ end
44
+
45
+ it "should create an API call" do
46
+ savon.expects("de:CreateShipmentDDRequest" ).returns( code: 200, headers: {},body: TEST_RESPONSE )
47
+
48
+ shipment = Shipment.new(shipment_date: Date.today + 1)
49
+
50
+ sender = Address.new
51
+ receiver = Address.new
52
+ shipment.receiver_address=receiver
53
+ shipment.sender_address=sender
54
+
55
+ @api.createShipmentDD([shipment]).should_not be_nil
56
+ end
57
+ end
58
+
59
+ end
60
+ end
@@ -0,0 +1,8 @@
1
+ require 'savon/spec'
2
+ require 'dhl-intraship/api'
3
+ require 'dhl-intraship/shipment'
4
+ require 'dhl-intraship/address'
5
+
6
+ RSpec.configure do |config|
7
+ config.include Savon::Spec::Macros
8
+ end
metadata ADDED
@@ -0,0 +1,111 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dhl-intraship
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.7
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Alexander Kops
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-04-20 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: savon
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 0.9.9
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 0.9.9
30
+ - !ruby/object:Gem::Dependency
31
+ name: rspec
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: '2.9'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: '2.9'
46
+ - !ruby/object:Gem::Dependency
47
+ name: savon_spec
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: 0.1.6
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 0.1.6
62
+ description: A simple gem to access the DHL Intraship API
63
+ email:
64
+ - a.kops@teameurope.net
65
+ executables: []
66
+ extensions: []
67
+ extra_rdoc_files: []
68
+ files:
69
+ - .gitignore
70
+ - Gemfile
71
+ - LICENSE
72
+ - README.md
73
+ - Rakefile
74
+ - dhl-intraship.gemspec
75
+ - lib/dhl-intraship.rb
76
+ - lib/dhl-intraship/address.rb
77
+ - lib/dhl-intraship/api.rb
78
+ - lib/dhl-intraship/product_code.rb
79
+ - lib/dhl-intraship/shipment.rb
80
+ - lib/dhl-intraship/version.rb
81
+ - spec/dhl-intraship/address_spec.rb
82
+ - spec/dhl-intraship/create_shipment_dd_spec.rb
83
+ - spec/spec_helper.rb
84
+ homepage: https://github.com/teameurope/dhl-intraship
85
+ licenses: []
86
+ post_install_message:
87
+ rdoc_options: []
88
+ require_paths:
89
+ - lib
90
+ required_ruby_version: !ruby/object:Gem::Requirement
91
+ none: false
92
+ requirements:
93
+ - - ! '>='
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ required_rubygems_version: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ requirements: []
103
+ rubyforge_project:
104
+ rubygems_version: 1.8.23
105
+ signing_key:
106
+ specification_version: 3
107
+ summary: This wraps the DHL Intraship SOAP Interface for creating shipments
108
+ test_files:
109
+ - spec/dhl-intraship/address_spec.rb
110
+ - spec/dhl-intraship/create_shipment_dd_spec.rb
111
+ - spec/spec_helper.rb