directories_interface 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.
- data/lib/directories_interface.rb +7 -0
- data/lib/directories_interface/communication.rb +11 -0
- data/lib/directories_interface/directories_interface_wrapper.rb +59 -0
- data/lib/directories_interface/version.rb +3 -0
- data/lib/directories_interface/xml_parser.rb +67 -0
- data/spec/directories_interface/directories_interface_wrapper_spec.rb +37 -0
- data/spec/directories_interface/xml_parser_spec.rb +12 -0
- data/spec/spec_helper.rb +16 -0
- metadata +121 -0
@@ -0,0 +1,59 @@
|
|
1
|
+
module DirectoriesInterface
|
2
|
+
|
3
|
+
class DirectoriesInterfaceWrapper
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
# SETUP WEB SERVICES
|
7
|
+
@login = Savon::Client.new do
|
8
|
+
wsdl.document = "https://secure.directories.ch/administration/v4/security.asmx?WSDL"
|
9
|
+
end
|
10
|
+
|
11
|
+
@client = Savon::Client.new do
|
12
|
+
wsdl.document = "http://service.directories.ch/search/v4/searchaddress.asmx?WSDL"
|
13
|
+
end
|
14
|
+
|
15
|
+
@login.http.auth.ssl.verify_mode = :none
|
16
|
+
end
|
17
|
+
|
18
|
+
#returns a sessionID
|
19
|
+
def login(username,password,service_id)
|
20
|
+
soap_login_response = @login.request "Login", :xmlns => "urn:directories/administration/v4/security" do
|
21
|
+
http.headers["SOAPAction"] = '"urn:directories/administration/v4/security/Login"'
|
22
|
+
soap.body = '<loginParam>' + XmlParser.generate_login_xml(:username=> username, :password=>password, :service_id=>service_id)+'</loginParam>'
|
23
|
+
end
|
24
|
+
login_response = XmlParser.extract_login_response(soap_login_response.to_hash[:login_response][:login_result])
|
25
|
+
XmlParser.extract_session_id(login_response) if result_available login_response
|
26
|
+
end
|
27
|
+
|
28
|
+
#returns a search result as XML. auth = [ServiceID,SessionID], person = [nachname,vorname,location]
|
29
|
+
def search_address(service_id,session_id, person)
|
30
|
+
result = @client.request "SearchAddress", :xmlns =>"urn:directories/search/v4/searchaddress" do
|
31
|
+
http.headers["SOAPAction"] = '"urn:directories/search/v4/searchaddress/SearchAddress"'
|
32
|
+
soap.body = "<addressParam>" + XmlParser.generate_search_xml(service_id,session_id,person) + "</addressParam>"
|
33
|
+
end
|
34
|
+
|
35
|
+
numbers = nil
|
36
|
+
|
37
|
+
if result.success?
|
38
|
+
result_xml = XmlParser.extract_search_result(result.to_hash[:search_address_response][:search_address_result])
|
39
|
+
if result_available result_xml
|
40
|
+
if XmlParser.count_matches(result_xml) == "1"
|
41
|
+
numbers = XmlParser.extract_services(result_xml)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
numbers
|
46
|
+
end
|
47
|
+
|
48
|
+
def result_available(result_xml)
|
49
|
+
error_code = XmlParser.extract_error_code(result_xml)
|
50
|
+
case error_code
|
51
|
+
when "200" then false
|
52
|
+
when "0" then true
|
53
|
+
else raise "Service has error: #{error_code}"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module DirectoriesInterface
|
2
|
+
|
3
|
+
class XmlParser
|
4
|
+
def initialize
|
5
|
+
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.generate_login_xml(attr)
|
9
|
+
res=Nokogiri::XML::Builder.new do |xml|
|
10
|
+
xml.LoginParam(:ServiceId=>attr[:service_id], :UserName=>attr[:username], :Password=>attr[:password])
|
11
|
+
end
|
12
|
+
res.to_xml.to_s.gsub(/\n/,"").encode(:xml => :text)
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.generate_search_xml(service_id,session_id,person)
|
17
|
+
res = Nokogiri::XML::Builder.new do |xml|
|
18
|
+
xml.AddressParam {
|
19
|
+
xml.Authentication(:ServiceId=>service_id, :SessionId=>session_id)
|
20
|
+
xml.Paging(:StartAtIndex=>"1", :FinishAtIndex=>"5")
|
21
|
+
xml.LastName(:Value=>person[:nachname], :Phonetic=>"1", :PrecisionCode=>"FIELDGROUP")
|
22
|
+
xml.FirstName(:Value=>person[:vorname], :Phonetic=>"1", :PrecisionCode=>"FIELDGROUP")
|
23
|
+
xml.StreetHouseNo(:Value=>person[:address], :Phonetic=>"1") if person.has_key?(:address)
|
24
|
+
xml.Location(:Value=>person[:location], :Phonetic=>"0")
|
25
|
+
xml.TypeCode "ALL"
|
26
|
+
}
|
27
|
+
end
|
28
|
+
res.to_xml.to_s.gsub(/\n/,"").encode(:xml => :text)
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.extract_login_response(soap_login_response)
|
33
|
+
Nokogiri::XML(soap_login_response)
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.extract_session_id(login_response)
|
37
|
+
login_response.xpath("//@SessionId").to_s
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.extract_search_result(res)
|
41
|
+
Nokogiri::XML(res)
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.extract_error_code(xml_res)
|
45
|
+
xml_res.xpath("//@ErrorCode").to_s
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.count_matches(xml_res)
|
49
|
+
xml_res.xpath("//@MatchedEntries").to_s
|
50
|
+
end
|
51
|
+
|
52
|
+
#take the (unique)search result and returns an array of communications
|
53
|
+
def self.extract_services(xml_res)
|
54
|
+
services = xml_res.xpath("//Service[@TypeGrpCode='TEL' or @TypeGrpCode='NATEL' or @TypeGrpCode='FAX']")
|
55
|
+
result = Array.new
|
56
|
+
services.each do |node|
|
57
|
+
item = Communication.new
|
58
|
+
item.type = node.xpath("@TypeGrpCode").to_s
|
59
|
+
item.number = node.xpath("@Value").to_s
|
60
|
+
result << item
|
61
|
+
end
|
62
|
+
result
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
|
@@ -0,0 +1,37 @@
|
|
1
|
+
|
2
|
+
require "spec_helper"
|
3
|
+
|
4
|
+
module DirectoriesInterface
|
5
|
+
describe DirectoriesInterfaceWrapper do
|
6
|
+
before(:each) do
|
7
|
+
@username = ""
|
8
|
+
@password = ""
|
9
|
+
@service_id = ""
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "#login" do
|
13
|
+
it "returns a sessionID" do
|
14
|
+
dir1 = DirectoriesInterfaceWrapper.new
|
15
|
+
@session_id = dir1.login(@username, @password, @service_id)
|
16
|
+
puts @session_id
|
17
|
+
@session_id.should_not be_nil
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "#search_address" do
|
22
|
+
before(:each) do
|
23
|
+
@dir1 = DirectoriesInterfaceWrapper.new
|
24
|
+
@session_id = @dir1.login(@username, @password, @service_id)
|
25
|
+
end
|
26
|
+
|
27
|
+
it "if exactly one match found, returns a list of numbers" do
|
28
|
+
person = {:vorname=>"Daniele", :nachname=>"Pestalozzi", :location=>"Novazzano", :address=>"via al Loi"}
|
29
|
+
result = @dir1.search_address(@service_id, @session_id,person)
|
30
|
+
puts result
|
31
|
+
result.should_not be_nil
|
32
|
+
result.length.should == 2
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
# This file was generated by the `rspec --init` command. Conventionally, all
|
2
|
+
# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
|
3
|
+
# Require this file using `require "spec_helper.rb"` to ensure that it is only
|
4
|
+
# loaded once.
|
5
|
+
#
|
6
|
+
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
|
7
|
+
|
8
|
+
require 'directories_interface'
|
9
|
+
|
10
|
+
RSpec.configure do |config|
|
11
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
12
|
+
config.run_all_when_everything_filtered = true
|
13
|
+
config.filter_run :focus
|
14
|
+
end
|
15
|
+
|
16
|
+
|
metadata
ADDED
@@ -0,0 +1,121 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: directories_interface
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Nicola Pestalozzi
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-06-01 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rspec
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: savon
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: certified
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: nokogiri
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :runtime
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
description: First version of the interface. Searches for a person and returns an
|
79
|
+
array of phone numbers
|
80
|
+
email:
|
81
|
+
- np@impac.ch
|
82
|
+
executables: []
|
83
|
+
extensions: []
|
84
|
+
extra_rdoc_files: []
|
85
|
+
files:
|
86
|
+
- lib/directories_interface/communication.rb
|
87
|
+
- lib/directories_interface/directories_interface_wrapper.rb
|
88
|
+
- lib/directories_interface/version.rb
|
89
|
+
- lib/directories_interface/xml_parser.rb
|
90
|
+
- lib/directories_interface.rb
|
91
|
+
- spec/directories_interface/directories_interface_wrapper_spec.rb
|
92
|
+
- spec/directories_interface/xml_parser_spec.rb
|
93
|
+
- spec/spec_helper.rb
|
94
|
+
homepage: ''
|
95
|
+
licenses: []
|
96
|
+
post_install_message:
|
97
|
+
rdoc_options: []
|
98
|
+
require_paths:
|
99
|
+
- lib
|
100
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
101
|
+
none: false
|
102
|
+
requirements:
|
103
|
+
- - ! '>='
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
version: '0'
|
106
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
107
|
+
none: false
|
108
|
+
requirements:
|
109
|
+
- - ! '>='
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '0'
|
112
|
+
requirements: []
|
113
|
+
rubyforge_project: directories_interface
|
114
|
+
rubygems_version: 1.8.23
|
115
|
+
signing_key:
|
116
|
+
specification_version: 3
|
117
|
+
summary: Interface to Directories.ch
|
118
|
+
test_files:
|
119
|
+
- spec/directories_interface/directories_interface_wrapper_spec.rb
|
120
|
+
- spec/directories_interface/xml_parser_spec.rb
|
121
|
+
- spec/spec_helper.rb
|