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.
@@ -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