uddi4r 0.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. data/README +19 -0
  2. data/doc/classes/Uddi4r/BindingDetail.html +120 -0
  3. data/doc/classes/Uddi4r/BindingTemplate.html +120 -0
  4. data/doc/classes/Uddi4r/BusinessDetail.html +120 -0
  5. data/doc/classes/Uddi4r/BusinessEntity.html +120 -0
  6. data/doc/classes/Uddi4r/BusinessInfo.html +120 -0
  7. data/doc/classes/Uddi4r/BusinessList.html +120 -0
  8. data/doc/classes/Uddi4r/BusinessService.html +120 -0
  9. data/doc/classes/Uddi4r/CategoryBag.html +120 -0
  10. data/doc/classes/Uddi4r/Client.html +651 -0
  11. data/doc/classes/Uddi4r/Connection.html +331 -0
  12. data/doc/classes/Uddi4r/DiscoveryURLs.html +157 -0
  13. data/doc/classes/Uddi4r/FindQualifiers.html +157 -0
  14. data/doc/classes/Uddi4r/IdentifierBag.html +120 -0
  15. data/doc/classes/Uddi4r/KeyedReference.html +120 -0
  16. data/doc/classes/Uddi4r/Model.html +296 -0
  17. data/doc/classes/Uddi4r/OverviewDoc.html +120 -0
  18. data/doc/classes/Uddi4r/RelatedBusinessesList.html +120 -0
  19. data/doc/classes/Uddi4r/ServiceDetail.html +120 -0
  20. data/doc/classes/Uddi4r/ServiceInfo.html +120 -0
  21. data/doc/classes/Uddi4r/ServiceList.html +120 -0
  22. data/doc/classes/Uddi4r/SoapBuilder.html +356 -0
  23. data/doc/classes/Uddi4r/TModel.html +120 -0
  24. data/doc/classes/Uddi4r/TModelBag.html +155 -0
  25. data/doc/classes/Uddi4r/TModelDetail.html +120 -0
  26. data/doc/classes/Uddi4r/TModelInstanceInfo.html +120 -0
  27. data/doc/classes/Uddi4r.html +154 -0
  28. data/doc/created.rid +1 -0
  29. data/doc/files/README.html +147 -0
  30. data/doc/files/lib/client_rb.html +117 -0
  31. data/doc/files/lib/connection_rb.html +119 -0
  32. data/doc/files/lib/models_rb.html +115 -0
  33. data/doc/files/lib/soap_builder_rb.html +108 -0
  34. data/doc/fr_class_index.html +52 -0
  35. data/doc/fr_file_index.html +31 -0
  36. data/doc/fr_method_index.html +54 -0
  37. data/doc/index.html +24 -0
  38. data/doc/rdoc-style.css +208 -0
  39. data/lib/client.rb +203 -0
  40. data/lib/connection.rb +74 -0
  41. data/lib/models.rb +207 -0
  42. data/lib/soap_builder.rb +89 -0
  43. data/test/fixtures/business_service.xml +40 -0
  44. data/test/fixtures/test_uddi_servers.rb +31 -0
  45. data/test/test_client.rb +141 -0
  46. data/test/test_connection.rb +34 -0
  47. data/test/test_model.rb +34 -0
  48. metadata +97 -0
@@ -0,0 +1,89 @@
1
+ # uddi4r - UDDI Client for Ruby
2
+ # http://rubyforge.org/projects/uddi4r/
3
+
4
+ module Uddi4r
5
+ # Helper module to be mixed into Uddi4r::Connection
6
+ module SoapBuilder
7
+ # Create payload for given body (DOM element)
8
+ def create_payload(body)
9
+ content = REXML::Document.new()
10
+ content << REXML::XMLDecl.new("1.0", "utf-8")
11
+ envelope = REXML::Element.new("Envelope")
12
+ envelope.add_attribute("xmlns", "http://schemas.xmlsoap.org/soap/envelope/")
13
+ envelope << body
14
+ content << envelope
15
+ return content
16
+ end
17
+
18
+ # Creates tModelBag with key
19
+ def create_t_model_bag(keys)
20
+ bags = []
21
+ keys.each do |key|
22
+ t_model_bag = REXML::Element.new("tModelBag")
23
+ t_model_bag.add_element(create_element("tModelKey", key))
24
+ bags << t_model_bag
25
+ end
26
+ return bags
27
+ end
28
+
29
+ # Create element array
30
+ def create_elements(name, *values)
31
+ elems = []
32
+ values.each do |value|
33
+ elems << create_element(name, value)
34
+ end
35
+ return elems
36
+ end
37
+
38
+ # Create an empty DOM element for SOAP Body
39
+ def create_body
40
+ body = REXML::Element.new("Body")
41
+ end
42
+
43
+ # Create a template operation element for given name
44
+ def create_uddi_operation(name, attribs={})
45
+ operation = REXML::Element.new(name)
46
+ # set UDDI attributes
47
+ operation.add_attribute("generic",@version)
48
+ operation.add_attribute("xmlns",@uddi_namespace)
49
+ operation.add_attribute("maxRows",@max_rows) if @max_rows
50
+ # add passed attributes
51
+ attribs.each {|k,v| operation.add_attribute(k,v)}
52
+ return operation
53
+ end
54
+
55
+ # Create a DOM element for given name
56
+ def create_element(name, value=nil, attributes={})
57
+ elm = REXML::Element.new(name)
58
+ elm.text = value if value
59
+ attributes.each { |k,v| elm.add_attribute(k, v) }
60
+ return elm
61
+ end
62
+
63
+ # Create the operation for the SOAP body
64
+ # name:: Name of the element
65
+ # attribs:: Attributes for the element
66
+ # elements:: Sub elements varargs (items can be nil, Hash,
67
+ # Array of Hashes and REXML:Element)
68
+ def create_operation(name, attribs={}, *elements)
69
+ operation = create_uddi_operation(name, attribs)
70
+ elements.each do |elem|
71
+ add_element(operation, elem)
72
+ end
73
+ return operation
74
+ end
75
+ private
76
+ def add_element(operation, element)
77
+ return unless element
78
+ if element.is_a? Hash
79
+ element.each do |key,value|
80
+ operation.add_element(create_element(key,value)) if value
81
+ end
82
+ elsif element.is_a? Array
83
+ element.each { |e| add_element(operation, e) }
84
+ else
85
+ operation.add_element(element)
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,40 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
3
+ <soap:Body>
4
+ <businessList generic="2.0" operator="ms.com" truncated="true" xmlns="urn:uddi-org:api_v2">
5
+ <businessInfos>
6
+ <businessInfo businessKey="c13cc7b2-642d-41d0-b2dd-7bb531a18997">
7
+ <name xml:lang="en">Microsoft DRMS Dev</name>
8
+ <serviceInfos>
9
+ <serviceInfo serviceKey="6166f8b2-436d-4001-9f68-f37ff8b47ea3" businessKey="c13cc7b2-642d-41d0-b2dd-7bb531a18997">
10
+ <name xml:lang="en">Certification</name>
11
+ </serviceInfo>
12
+ <serviceInfo serviceKey="7ae6c133-4471-4deb-93a5-1158aaa826b8" businessKey="c13cc7b2-642d-41d0-b2dd-7bb531a18997">
13
+ <name xml:lang="en">Machine Activation</name>
14
+ </serviceInfo>
15
+ <serv serviceKey="52616482-653c-45f3-ae08-e4d4ca8b66c2" businessKey="c13cc7b2-642d-41d0-b2dd-7bb531a18997">
16
+ <name xml:lang="en">Server Enrollment</name>
17
+ </serviceInfo>
18
+ <serviceInfo serviceKey="597ea82b-f005-4972-812b-d8434e58be89" businessKey="c13cc7b2-642d-41d0-b2dd-7bb531a18997">
19
+ <name xml:lang="en">Licensing</name>
20
+ </serviceInfo>
21
+ </serviceInfos>
22
+ </businessInfo>
23
+ <businessInfo businessKey="0e3d9bb8-b765-4a68-a329-51548685fed3">
24
+ <name xml:lang="en">Microsoft DRMS Isv</name>
25
+ <serviceInfos>
26
+ <serviceInfo serviceKey="3b9b66a8-f19c-4ece-90f9-d484abbeb803" businessKey="0e3d9bb8-b765-4a68-a329-51548685fed3">
27
+ <name xml:lang="en">Machine Activation</name>
28
+ </serviceInfo>
29
+ <serviceInfo serviceKey="a8261df2-8829-49c6-a9b8-14a1d8a58f1e" businessKey="0e3d9bb8-b765-4a68-a329-51548685fed3">
30
+ <name xml:lang="en">Certification</name>
31
+ </serviceInfo>
32
+ <serviceInfo serviceKey="c4f18db0-9748-41bd-87f6-142640a1fd42" businessKey="0e3d9bb8-b765-4a68-a329-51548685fed3">
33
+ <name xml:lang="en">Server Enrollment</name>
34
+ </serviceInfo>
35
+ </serviceInfos>
36
+ </businessInfo>
37
+ </businessInfos>
38
+ </businessList>
39
+ </soap:Body>
40
+ </soap:Envelope>
@@ -0,0 +1,31 @@
1
+ class UddiFixture
2
+ def self.method_missing(property)
3
+ return @Properties[property]
4
+ end
5
+ end
6
+
7
+ class MicrosoftUddi < UddiFixture
8
+ @Properties = {
9
+ :url=>"http://test.uddi.microsoft.com/inquire",
10
+ :opeartor=>"Microsoft",
11
+ :version=>"2.0",
12
+ :expected_business_names=>["Microsoft DRMS Dev", "Microsoft DRMS Isv"],
13
+ :business_name=>"Microsoft",
14
+ :business_key=>"c13cc7b2-642d-41d0-b2dd-7bb531a18997"
15
+ }
16
+ end
17
+
18
+ class XMethodsUddi < UddiFixture
19
+ @Properties = {
20
+ :url=>"http://uddi.xmethods.net/inquire",
21
+ :operator=>"XMethods",
22
+ :version=>"2.0",
23
+ :binding_key=>"9780B801-8CD0-EA03-D6C4-C211A1A46474",
24
+ :business_key=>"2BF938C6-BFFE-DA78-2AEA-78CA987D1C24",
25
+ :service_key=>"7CEAB5C2-D40E-1E0C-7942-99C64EF3C1ED",
26
+ :business_name=>"chaiwat",
27
+ :service_name=>"Temperature Convert",
28
+ :t_model_key=>"uuid:928A64AB-E277-32FA-0ABA-A28CE9E5E6A5",
29
+ :binding_key_2=>"39642DC0-BEB2-07A4-15C0-B3F087E064BC"
30
+ }
31
+ end
@@ -0,0 +1,141 @@
1
+ require "test/unit"
2
+ require "lib/connection"
3
+ require "lib/client"
4
+ require "lib/models"
5
+ require "test/fixtures/test_uddi_servers"
6
+
7
+ # Following test run against private UDDI registries. Internet connection
8
+ # is required. The tests will fail if the source registry is modified.
9
+ # To resolve, run with debugging and adjust the expected responses.
10
+ class TestClient < Test::Unit::TestCase
11
+ @@Report = false
12
+ @@Debug = false
13
+ @@UddiVersion = "2.0"
14
+
15
+ def uddi_for(fixture)
16
+ connection = Uddi4r::Connection.new(fixture.url, @@UddiVersion, @@Debug)
17
+ #connection = Uddi4r::Connection.new(nil, @@UddiVersion, @@Debug)
18
+ connection.max_rows = 2
19
+ uddi = Uddi4r::Client.new(connection)
20
+ return uddi
21
+ end
22
+
23
+ # Test finding a business by name and composed services
24
+ def test_find_business
25
+ fix = MicrosoftUddi
26
+ uddi = uddi_for(fix)
27
+ business_list = uddi.find_business(:name=>fix.business_name, :business_key=>fix.business_key)
28
+ businesses = business_list.business_infos
29
+ assert_equal(2, businesses.size)
30
+ businesses.each do |biz|
31
+ assert(fix.expected_business_names.include?(biz.name))
32
+ if @@Report
33
+ puts "Business #{biz.name}"
34
+ biz.service_infos.each { |svc| puts " - Service #{svc.name} - #{svc.service_key}" }
35
+ end
36
+ end
37
+ end
38
+
39
+ # Follow a drill-down use-case for business > service > binding
40
+ def test_drill_down
41
+ fix = XMethodsUddi
42
+ uddi = uddi_for(fix)
43
+ biz_list = uddi.find_business(:name=>fix.business_name)
44
+ biz = biz_list.business_infos.first
45
+ assert_equal(fix.business_name, biz.name)
46
+ service = biz.service_infos.first
47
+ assert_equal(fix.service_name, service.name)
48
+ assert_not_nil(service.service_key)
49
+ binding = uddi.find_binding(:service_key=>service.service_key,
50
+ :t_model_keys=>[fix.t_model_key])
51
+ assert_equal(fix.operator, binding.operator)
52
+ assert_not_nil(bt = binding.binding_template.first)
53
+ assert_equal("SOAP binding", bt.description)
54
+ assert_http_endpoint(bt.access_point)
55
+ end
56
+
57
+ # Find a service
58
+ def test_find_service
59
+ fix = XMethodsUddi
60
+ uddi = uddi_for(fix)
61
+ services = uddi.find_service(:name=>fix.service_name)
62
+ service = services.service_infos.first
63
+ assert_equal(fix.service_name, service.name)
64
+ assert_not_nil(service.service_key)
65
+ end
66
+
67
+ # Find related businesses
68
+ def test_find_related_business
69
+ fix = MicrosoftUddi
70
+ uddi = uddi_for(fix)
71
+ biz = uddi.find_business(:name=>fix.business_name).business_infos.first
72
+ related_biz = uddi.find_related_businesses(:business_key=>fix.business_key)
73
+ assert_not_nil(related_biz)
74
+ end
75
+
76
+ # Get binding detail
77
+ def test_get_binding_detail_single
78
+ fix = XMethodsUddi
79
+ uddi = uddi_for(fix)
80
+ binding = uddi.get_binding_detail(:binding_key=>fix.binding_key)
81
+ assert_not_nil(binding)
82
+ assert_http_endpoint(binding.binding_template.first.access_point)
83
+ end
84
+
85
+ # Get binding detail
86
+ def test_get_binding_detail_multi
87
+ fix = XMethodsUddi
88
+ uddi = uddi_for(fix)
89
+ bindings = uddi.get_binding_detail(:binding_keys=>[fix.binding_key, fix.binding_key_2])
90
+ assert_not_nil(bindings)
91
+ bts = bindings.binding_template
92
+ assert_http_endpoint(bts.first.access_point)
93
+ end
94
+
95
+ # Get the business details and validate all sub elements
96
+ def test_get_business_detail
97
+ fix = XMethodsUddi
98
+ uddi = uddi_for(fix)
99
+ assert_not_nil(bd = uddi.get_business_detail(:business_key=>fix.business_key))
100
+ assert_not_nil(be = bd.business_entity.first)
101
+ assert_equal(fix.business_name, be.name)
102
+ assert_not_nil(be.discovery_url)
103
+ assert_not_nil(bs = be.business_services.first)
104
+ assert_equal(fix.service_name, bs.name)
105
+ assert_not_nil(bt = bs.binding_templates.first)
106
+ assert_http_endpoint(bt.access_point)
107
+ assert_not_nil(tmi = bt.t_model_instance_details.first)
108
+ assert_not_nil(tmi.t_model_key)
109
+ end
110
+
111
+ # Get the tModel detail and validate all sub elements
112
+ def test_get_t_model_detail
113
+ fix = XMethodsUddi
114
+ uddi = uddi_for(fix)
115
+ assert_not_nil(bd = uddi.get_t_model_detail(:t_model_key=>fix.t_model_key))
116
+ assert_not_nil(t_model = bd.t_model.first)
117
+ assert_equal(fix.service_name, t_model.name)
118
+ assert_not_nil(t_model.description)
119
+ assert_not_nil(c_bag = t_model.category_bag)
120
+ assert_equal("uddi-org:types", c_bag.keyed_reference.first.key_name)
121
+ end
122
+
123
+ # Get the service detail and validate all sub elements
124
+ def test_service_detail
125
+ fix = XMethodsUddi
126
+ uddi = uddi_for(fix)
127
+ assert_not_nil(sd = uddi.get_service_detail(:service_key=>fix.service_key))
128
+ assert_not_nil(bs = sd.business_service.first)
129
+ assert_equal(fix.service_name, bs.name)
130
+ assert_not_nil(bt = bs.binding_templates.first)
131
+ assert_equal(fix.binding_key, bt.binding_key)
132
+ assert_equal(fix.t_model_key, bt.t_model_instance_details.first.t_model_key)
133
+ end
134
+
135
+ private
136
+
137
+ def assert_http_endpoint(url)
138
+ assert_equal("http://", url[0..6])
139
+ end
140
+
141
+ end
@@ -0,0 +1,34 @@
1
+ require "test/unit"
2
+ require "lib/connection"
3
+
4
+ class TestConnection < Test::Unit::TestCase
5
+ def setup
6
+ @TestUddiServer = "http://test.uddi.microsoft.com/inquire"
7
+ @conn = Uddi4r::Connection.new(@TestUddiServer)
8
+ end
9
+
10
+ def test_connection
11
+ assert_equal("UDDI connection: #{@TestUddiServer}: 2.0 ns:urn:uddi-org:api_v2",
12
+ @conn.to_s())
13
+ end
14
+
15
+ def test_create_body
16
+ body = @conn.create_body()
17
+ assert_equal("<Body/>", body.to_s())
18
+ end
19
+
20
+ def test_create_operation
21
+ op = @conn.create_operation("op", {"maxRows"=>"5"})
22
+ assert_equal("<op maxRows='5' generic='2.0' xmlns='urn:uddi-org:api_v2'/>", op.to_s())
23
+ end
24
+
25
+ def test_create_payload
26
+ body = @conn.create_body()
27
+ op = @conn.create_operation("op", {"maxRows"=>"5"})
28
+ body << op
29
+ pl = @conn.create_payload(body)
30
+ expected="<?xml version='1.0' encoding='UTF-8'?><Envelope xmlns='http://schemas.xmlsoap.org/soap/envelope/'><Body><op maxRows='5' generic='2.0' xmlns='urn:uddi-org:api_v2'/></Body></Envelope>"
31
+ assert_equal(expected, pl.to_s())
32
+ end
33
+
34
+ end
@@ -0,0 +1,34 @@
1
+ require "test/unit"
2
+ require "lib/models"
3
+
4
+ # Test marshalling of UDDI XML objects to Ruby
5
+ class TestModel < Test::Unit::TestCase
6
+ def test_business_info
7
+ xml = <<EOX
8
+ <businessList generic="2.0" operator="ms.com" truncated="true" xmlns="urn:uddi-org:api_v2">
9
+ <businessInfos>
10
+ <businessInfo businessKey="c13cc7b2-642d-41d0-b2dd-7bb531a18997">
11
+ <name xml:lang="en">Microsoft DRMS Dev</name>
12
+ <serviceInfos>
13
+ <serviceInfo serviceKey="6166f8b2-436d-4001-9f68-f37ff8b47ea3" businessKey="c13cc7b2-642d-41d0-b2dd-7bb531a18997">
14
+ <name xml:lang="en">Certification</name>
15
+ </serviceInfo>
16
+ <serviceInfo serviceKey="7ae6c133-4471-4deb-93a5-1158aaa826b8" businessKey="c13cc7b2-642d-41d0-b2dd-7bb531a18997">
17
+ <name xml:lang="en">Machine Activation</name>
18
+ </serviceInfo>
19
+ </serviceInfos>
20
+ </businessInfo>
21
+ </businessInfos>
22
+ </businessList>
23
+ EOX
24
+ list = Uddi4r::BusinessList.parse(xml)
25
+ assert_equal("ms.com", list.operator)
26
+ biz = list.business_infos.first
27
+ assert_equal("Microsoft DRMS Dev", biz.name)
28
+ assert_equal(2, biz.service_infos.size)
29
+ expected_services = ["Certification", "Machine Activation"]
30
+ biz.service_infos.each do | svc |
31
+ expected_services.include? svc.name
32
+ end
33
+ end
34
+ end
metadata ADDED
@@ -0,0 +1,97 @@
1
+ --- !ruby/object:Gem::Specification
2
+ rubygems_version: 0.9.0
3
+ specification_version: 1
4
+ name: uddi4r
5
+ version: !ruby/object:Gem::Version
6
+ version: "0.7"
7
+ date: 2006-07-16 00:00:00 -04:00
8
+ summary: UDDI for Ruby
9
+ require_paths:
10
+ - lib
11
+ email:
12
+ homepage: http://uddi4r.rubyforge.org
13
+ rubyforge_project:
14
+ description: Uddi4r is a Ruby library designed to make it easier for Ruby developers to work with XML. Using simple annotations, it enables Ruby classes to be mapped to XML. ROXML takes care of the marshalling and unmarshalling of mapped attributes so that developers can focus on building first-class Ruby classes. As a result, ROXML simplifies the development of RESTful applications, Web Services, and XML-RPC.
15
+ autorequire: uddi4r
16
+ default_executable:
17
+ bindir: bin
18
+ has_rdoc: true
19
+ required_ruby_version: !ruby/object:Gem::Version::Requirement
20
+ requirements:
21
+ - - ">"
22
+ - !ruby/object:Gem::Version
23
+ version: 0.0.0
24
+ version:
25
+ platform: ruby
26
+ signing_key:
27
+ cert_chain:
28
+ post_install_message:
29
+ authors:
30
+ - Zak Mandhro
31
+ files:
32
+ - lib/models.rb
33
+ - lib/soap_builder.rb
34
+ - lib/client.rb
35
+ - lib/connection.rb
36
+ - README
37
+ - test/test_model.rb
38
+ - test/test_client.rb
39
+ - test/fixtures
40
+ - test/test_connection.rb
41
+ - test/fixtures/business_service.xml
42
+ - test/fixtures/test_uddi_servers.rb
43
+ - doc/created.rid
44
+ - doc/rdoc-style.css
45
+ - doc/files
46
+ - doc/classes
47
+ - doc/fr_file_index.html
48
+ - doc/fr_class_index.html
49
+ - doc/fr_method_index.html
50
+ - doc/index.html
51
+ - doc/files/README.html
52
+ - doc/files/lib
53
+ - doc/files/lib/models_rb.html
54
+ - doc/files/lib/soap_builder_rb.html
55
+ - doc/files/lib/client_rb.html
56
+ - doc/files/lib/connection_rb.html
57
+ - doc/classes/Uddi4r.html
58
+ - doc/classes/Uddi4r
59
+ - doc/classes/Uddi4r/SoapBuilder.html
60
+ - doc/classes/Uddi4r/BindingDetail.html
61
+ - doc/classes/Uddi4r/ServiceList.html
62
+ - doc/classes/Uddi4r/BusinessList.html
63
+ - doc/classes/Uddi4r/FindQualifiers.html
64
+ - doc/classes/Uddi4r/IdentifierBag.html
65
+ - doc/classes/Uddi4r/OverviewDoc.html
66
+ - doc/classes/Uddi4r/KeyedReference.html
67
+ - doc/classes/Uddi4r/BindingTemplate.html
68
+ - doc/classes/Uddi4r/TModelInstanceInfo.html
69
+ - doc/classes/Uddi4r/Model.html
70
+ - doc/classes/Uddi4r/BusinessEntity.html
71
+ - doc/classes/Uddi4r/BusinessService.html
72
+ - doc/classes/Uddi4r/BusinessInfo.html
73
+ - doc/classes/Uddi4r/ServiceInfo.html
74
+ - doc/classes/Uddi4r/Client.html
75
+ - doc/classes/Uddi4r/RelatedBusinessesList.html
76
+ - doc/classes/Uddi4r/ServiceDetail.html
77
+ - doc/classes/Uddi4r/TModelDetail.html
78
+ - doc/classes/Uddi4r/Connection.html
79
+ - doc/classes/Uddi4r/TModelBag.html
80
+ - doc/classes/Uddi4r/DiscoveryURLs.html
81
+ - doc/classes/Uddi4r/TModel.html
82
+ - doc/classes/Uddi4r/CategoryBag.html
83
+ - doc/classes/Uddi4r/BusinessDetail.html
84
+ test_files:
85
+ - test/test_client.rb
86
+ rdoc_options: []
87
+
88
+ extra_rdoc_files: []
89
+
90
+ executables: []
91
+
92
+ extensions: []
93
+
94
+ requirements:
95
+ - roxml
96
+ dependencies: []
97
+