directories_interface 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ require "savon"
2
+ require "rubygems"
3
+ require "Nokogiri"
4
+ require "directories_interface/version"
5
+ require "directories_interface/xml_parser"
6
+ require "directories_interface/communication"
7
+ require "directories_interface/directories_interface_wrapper"
@@ -0,0 +1,11 @@
1
+ module DirectoriesInterface
2
+
3
+ class Communication
4
+ attr_accessor :type, :number
5
+
6
+ def to_s
7
+ "type => #{type}, number => #{number}"
8
+ end
9
+ end
10
+
11
+ end
@@ -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,3 @@
1
+ module DirectoriesInterface
2
+ VERSION = "0.0.1"
3
+ 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
@@ -0,0 +1,12 @@
1
+ require "rspec"
2
+
3
+ module DirectoriesInterface
4
+ describe XmlParser do
5
+
6
+ it "should do something" do
7
+
8
+ #To change this template use File | Settings | File Templates.
9
+ true.should == false
10
+ end
11
+ end
12
+ end
@@ -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