DefV-soap4r 1.5.8.2

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.
Files changed (443) hide show
  1. data/bin/wsdl2ruby.rb +137 -0
  2. data/bin/xsd2ruby.rb +90 -0
  3. data/lib/soap/attachment.rb +108 -0
  4. data/lib/soap/attrproxy.rb +34 -0
  5. data/lib/soap/baseData.rb +1094 -0
  6. data/lib/soap/element.rb +277 -0
  7. data/lib/soap/encodingstyle/aspDotNetHandler.rb +207 -0
  8. data/lib/soap/encodingstyle/handler.rb +120 -0
  9. data/lib/soap/encodingstyle/literalHandler.rb +195 -0
  10. data/lib/soap/encodingstyle/soapHandler.rb +559 -0
  11. data/lib/soap/filter.rb +13 -0
  12. data/lib/soap/filter/filterchain.rb +51 -0
  13. data/lib/soap/filter/handler.rb +31 -0
  14. data/lib/soap/filter/streamhandler.rb +29 -0
  15. data/lib/soap/generator.rb +299 -0
  16. data/lib/soap/header/handler.rb +61 -0
  17. data/lib/soap/header/handlerset.rb +70 -0
  18. data/lib/soap/header/mappinghandler.rb +47 -0
  19. data/lib/soap/header/simplehandler.rb +44 -0
  20. data/lib/soap/httpconfigloader.rb +139 -0
  21. data/lib/soap/mapping.rb +12 -0
  22. data/lib/soap/mapping/encodedregistry.rb +537 -0
  23. data/lib/soap/mapping/factory.rb +388 -0
  24. data/lib/soap/mapping/literalregistry.rb +391 -0
  25. data/lib/soap/mapping/mapping.rb +577 -0
  26. data/lib/soap/mapping/registry.rb +295 -0
  27. data/lib/soap/mapping/rubytypeFactory.rb +446 -0
  28. data/lib/soap/mapping/schemadefinition.rb +170 -0
  29. data/lib/soap/mapping/typeMap.rb +106 -0
  30. data/lib/soap/mapping/wsdlencodedregistry.rb +211 -0
  31. data/lib/soap/mapping/wsdlliteralregistry.rb +248 -0
  32. data/lib/soap/marshal.rb +59 -0
  33. data/lib/soap/mimemessage.rb +241 -0
  34. data/lib/soap/nestedexception.rb +42 -0
  35. data/lib/soap/netHttpClient.rb +241 -0
  36. data/lib/soap/ns.rb +34 -0
  37. data/lib/soap/parser.rb +252 -0
  38. data/lib/soap/processor.rb +66 -0
  39. data/lib/soap/property.rb +333 -0
  40. data/lib/soap/proxy.rb +14 -0
  41. data/lib/soap/rpc/cgistub.rb +247 -0
  42. data/lib/soap/rpc/driver.rb +221 -0
  43. data/lib/soap/rpc/element.rb +374 -0
  44. data/lib/soap/rpc/element.rb.orig +374 -0
  45. data/lib/soap/rpc/httpserver.rb +142 -0
  46. data/lib/soap/rpc/methodDef.rb +68 -0
  47. data/lib/soap/rpc/proxy.rb +572 -0
  48. data/lib/soap/rpc/router.rb +662 -0
  49. data/lib/soap/rpc/rpc.rb +25 -0
  50. data/lib/soap/rpc/soaplet.rb +200 -0
  51. data/lib/soap/rpc/standaloneServer.rb +43 -0
  52. data/lib/soap/soap.rb +151 -0
  53. data/lib/soap/streamHandler.rb +301 -0
  54. data/lib/soap/wsdlDriver.rb +164 -0
  55. data/lib/wsdl/binding.rb +65 -0
  56. data/lib/wsdl/data.rb +64 -0
  57. data/lib/wsdl/definitions.rb +236 -0
  58. data/lib/wsdl/documentation.rb +32 -0
  59. data/lib/wsdl/import.rb +80 -0
  60. data/lib/wsdl/importer.rb +38 -0
  61. data/lib/wsdl/info.rb +50 -0
  62. data/lib/wsdl/message.rb +54 -0
  63. data/lib/wsdl/operation.rb +151 -0
  64. data/lib/wsdl/operationBinding.rb +240 -0
  65. data/lib/wsdl/param.rb +93 -0
  66. data/lib/wsdl/parser.rb +164 -0
  67. data/lib/wsdl/part.rb +52 -0
  68. data/lib/wsdl/port.rb +66 -0
  69. data/lib/wsdl/portType.rb +75 -0
  70. data/lib/wsdl/service.rb +61 -0
  71. data/lib/wsdl/soap/address.rb +40 -0
  72. data/lib/wsdl/soap/binding.rb +49 -0
  73. data/lib/wsdl/soap/body.rb +58 -0
  74. data/lib/wsdl/soap/cgiStubCreator.rb +92 -0
  75. data/lib/wsdl/soap/classDefCreator.rb +433 -0
  76. data/lib/wsdl/soap/classDefCreatorSupport.rb +240 -0
  77. data/lib/wsdl/soap/classNameCreator.rb +54 -0
  78. data/lib/wsdl/soap/clientSkeltonCreator.rb +104 -0
  79. data/lib/wsdl/soap/complexType.rb +173 -0
  80. data/lib/wsdl/soap/data.rb +42 -0
  81. data/lib/wsdl/soap/definitions.rb +200 -0
  82. data/lib/wsdl/soap/driverCreator.rb +118 -0
  83. data/lib/wsdl/soap/element.rb +33 -0
  84. data/lib/wsdl/soap/encodedMappingRegistryCreator.rb +73 -0
  85. data/lib/wsdl/soap/fault.rb +56 -0
  86. data/lib/wsdl/soap/header.rb +86 -0
  87. data/lib/wsdl/soap/headerfault.rb +56 -0
  88. data/lib/wsdl/soap/literalMappingRegistryCreator.rb +115 -0
  89. data/lib/wsdl/soap/mappingRegistryCreator.rb +58 -0
  90. data/lib/wsdl/soap/mappingRegistryCreatorSupport.rb +376 -0
  91. data/lib/wsdl/soap/methodDefCreator.rb +199 -0
  92. data/lib/wsdl/soap/operation.rb +112 -0
  93. data/lib/wsdl/soap/servantSkeltonCreator.rb +89 -0
  94. data/lib/wsdl/soap/servletStubCreator.rb +104 -0
  95. data/lib/wsdl/soap/standaloneServerStubCreator.rb +100 -0
  96. data/lib/wsdl/soap/wsdl2ruby.rb +217 -0
  97. data/lib/wsdl/types.rb +44 -0
  98. data/lib/wsdl/wsdl.rb +24 -0
  99. data/lib/wsdl/xmlSchema/all.rb +24 -0
  100. data/lib/wsdl/xmlSchema/annotation.rb +34 -0
  101. data/lib/wsdl/xmlSchema/any.rb +61 -0
  102. data/lib/wsdl/xmlSchema/anyAttribute.rb +48 -0
  103. data/lib/wsdl/xmlSchema/attribute.rb +104 -0
  104. data/lib/wsdl/xmlSchema/attributeGroup.rb +68 -0
  105. data/lib/wsdl/xmlSchema/choice.rb +58 -0
  106. data/lib/wsdl/xmlSchema/complexContent.rb +97 -0
  107. data/lib/wsdl/xmlSchema/complexExtension.rb +119 -0
  108. data/lib/wsdl/xmlSchema/complexRestriction.rb +104 -0
  109. data/lib/wsdl/xmlSchema/complexType.rb +193 -0
  110. data/lib/wsdl/xmlSchema/content.rb +95 -0
  111. data/lib/wsdl/xmlSchema/data.rb +116 -0
  112. data/lib/wsdl/xmlSchema/element.rb +153 -0
  113. data/lib/wsdl/xmlSchema/enumeration.rb +36 -0
  114. data/lib/wsdl/xmlSchema/fractiondigits.rb +37 -0
  115. data/lib/wsdl/xmlSchema/group.rb +100 -0
  116. data/lib/wsdl/xmlSchema/import.rb +53 -0
  117. data/lib/wsdl/xmlSchema/importHandler.rb +45 -0
  118. data/lib/wsdl/xmlSchema/importer.rb +102 -0
  119. data/lib/wsdl/xmlSchema/include.rb +48 -0
  120. data/lib/wsdl/xmlSchema/length.rb +37 -0
  121. data/lib/wsdl/xmlSchema/list.rb +48 -0
  122. data/lib/wsdl/xmlSchema/maxexclusive.rb +37 -0
  123. data/lib/wsdl/xmlSchema/maxinclusive.rb +37 -0
  124. data/lib/wsdl/xmlSchema/maxlength.rb +37 -0
  125. data/lib/wsdl/xmlSchema/minexclusive.rb +37 -0
  126. data/lib/wsdl/xmlSchema/mininclusive.rb +37 -0
  127. data/lib/wsdl/xmlSchema/minlength.rb +37 -0
  128. data/lib/wsdl/xmlSchema/parser.rb +167 -0
  129. data/lib/wsdl/xmlSchema/pattern.rb +36 -0
  130. data/lib/wsdl/xmlSchema/ref.rb +33 -0
  131. data/lib/wsdl/xmlSchema/schema.rb +178 -0
  132. data/lib/wsdl/xmlSchema/sequence.rb +54 -0
  133. data/lib/wsdl/xmlSchema/simpleContent.rb +69 -0
  134. data/lib/wsdl/xmlSchema/simpleExtension.rb +62 -0
  135. data/lib/wsdl/xmlSchema/simpleRestriction.rb +132 -0
  136. data/lib/wsdl/xmlSchema/simpleType.rb +87 -0
  137. data/lib/wsdl/xmlSchema/totaldigits.rb +37 -0
  138. data/lib/wsdl/xmlSchema/union.rb +35 -0
  139. data/lib/wsdl/xmlSchema/unique.rb +34 -0
  140. data/lib/wsdl/xmlSchema/whitespace.rb +37 -0
  141. data/lib/wsdl/xmlSchema/xsd2ruby.rb +174 -0
  142. data/lib/xsd/charset.rb +188 -0
  143. data/lib/xsd/codegen.rb +12 -0
  144. data/lib/xsd/codegen/classdef.rb +208 -0
  145. data/lib/xsd/codegen/commentdef.rb +34 -0
  146. data/lib/xsd/codegen/gensupport.rb +273 -0
  147. data/lib/xsd/codegen/methoddef.rb +70 -0
  148. data/lib/xsd/codegen/moduledef.rb +208 -0
  149. data/lib/xsd/datatypes.rb +1466 -0
  150. data/lib/xsd/datatypes1999.rb +20 -0
  151. data/lib/xsd/iconvcharset.rb +33 -0
  152. data/lib/xsd/mapping.rb +68 -0
  153. data/lib/xsd/namedelements.rb +132 -0
  154. data/lib/xsd/ns.rb +182 -0
  155. data/lib/xsd/qname.rb +79 -0
  156. data/lib/xsd/xmlparser.rb +76 -0
  157. data/lib/xsd/xmlparser.rb.orig +76 -0
  158. data/lib/xsd/xmlparser/libxmlparser.rb +119 -0
  159. data/lib/xsd/xmlparser/parser.rb +100 -0
  160. data/lib/xsd/xmlparser/rexmlparser.rb +58 -0
  161. data/lib/xsd/xmlparser/xmlparser.rb +50 -0
  162. data/lib/xsd/xmlparser/xmlscanner.rb +149 -0
  163. data/test/16runner.rb +68 -0
  164. data/test/interopR2/README.txt +2 -0
  165. data/test/interopR2/SOAPBuildersInterop_R2.wsdl +461 -0
  166. data/test/interopR2/SOAPBuildersInterop_R2GrB.wsdl +19 -0
  167. data/test/interopR2/base.rb +288 -0
  168. data/test/interopR2/client.NetRemoting.rb +17 -0
  169. data/test/interopR2/client.rb +1234 -0
  170. data/test/interopR2/client4S4C.rb +15 -0
  171. data/test/interopR2/client4S4C2.rb +14 -0
  172. data/test/interopR2/clientASP.NET.rb +17 -0
  173. data/test/interopR2/clientApacheAxis.rb +16 -0
  174. data/test/interopR2/clientApacheSOAP.rb +17 -0
  175. data/test/interopR2/clientBEAWebLogic.rb +17 -0
  176. data/test/interopR2/clientBase.rb +1967 -0
  177. data/test/interopR2/clientCapeConnect.rb +18 -0
  178. data/test/interopR2/clientDelphi.rb +19 -0
  179. data/test/interopR2/clientEasySoap.rb +14 -0
  180. data/test/interopR2/clientFrontier.rb +25 -0
  181. data/test/interopR2/clientGLUE.rb +32 -0
  182. data/test/interopR2/clientHP.rb +13 -0
  183. data/test/interopR2/clientJAX-RPC.rb +19 -0
  184. data/test/interopR2/clientJSOAP.rb +14 -0
  185. data/test/interopR2/clientKafkaXSLT.rb +15 -0
  186. data/test/interopR2/clientMSSOAPToolkit2.0.rb +17 -0
  187. data/test/interopR2/clientMSSOAPToolkit3.0.rb +17 -0
  188. data/test/interopR2/clientNuSOAP.rb +19 -0
  189. data/test/interopR2/clientNuWave.rb +15 -0
  190. data/test/interopR2/clientOpenLink.rb +15 -0
  191. data/test/interopR2/clientOracle.rb +15 -0
  192. data/test/interopR2/clientPEAR.rb +18 -0
  193. data/test/interopR2/clientPhalanx.rb +18 -0
  194. data/test/interopR2/clientSIMACE.rb +18 -0
  195. data/test/interopR2/clientSOAP4R.rb +18 -0
  196. data/test/interopR2/clientSOAP__Lite.rb +14 -0
  197. data/test/interopR2/clientSQLData.rb +18 -0
  198. data/test/interopR2/clientSilverStream.rb +17 -0
  199. data/test/interopR2/clientSpray2001.rb +17 -0
  200. data/test/interopR2/clientSun.rb +19 -0
  201. data/test/interopR2/clientVWOpentalkSoap.rb +19 -0
  202. data/test/interopR2/clientWASP.rb +19 -0
  203. data/test/interopR2/clientWASPC.rb +18 -0
  204. data/test/interopR2/clientWebMethods.rb +15 -0
  205. data/test/interopR2/clientWhiteMesa.rb +28 -0
  206. data/test/interopR2/clientWingfoot.rb +15 -0
  207. data/test/interopR2/clientXMLBus.rb +19 -0
  208. data/test/interopR2/clientXMLRPC-EPI.rb +17 -0
  209. data/test/interopR2/clientXSOAP.rb +14 -0
  210. data/test/interopR2/clientZSI.rb +19 -0
  211. data/test/interopR2/clienteSOAP.rb +18 -0
  212. data/test/interopR2/clientgSOAP.rb +18 -0
  213. data/test/interopR2/clientkSOAP.rb +17 -0
  214. data/test/interopR2/iSimonReg.rb +112 -0
  215. data/test/interopR2/interopResultBase.rb +114 -0
  216. data/test/interopR2/interopService.rb +247 -0
  217. data/test/interopR2/rwikiInteropService.rb +105 -0
  218. data/test/interopR2/server.cgi +270 -0
  219. data/test/interopR2/server.rb +275 -0
  220. data/test/interopR2/simonReg.rb +123 -0
  221. data/test/interopR2/test.sh +49 -0
  222. data/test/interopR4/client.rb +112 -0
  223. data/test/results +4810 -0
  224. data/test/runner.rb +7 -0
  225. data/test/sm11/classDef.rb +156 -0
  226. data/test/sm11/client.rb +542 -0
  227. data/test/sm11/driver.rb +183 -0
  228. data/test/sm11/servant.rb +1067 -0
  229. data/test/sm11/server.rb +25 -0
  230. data/test/soap/asp.net/hello.wsdl +96 -0
  231. data/test/soap/asp.net/test_aspdotnet.rb +123 -0
  232. data/test/soap/auth/htdigest +2 -0
  233. data/test/soap/auth/htpasswd +2 -0
  234. data/test/soap/auth/test_basic.rb +117 -0
  235. data/test/soap/auth/test_digest.rb +118 -0
  236. data/test/soap/calc/calc.rb +17 -0
  237. data/test/soap/calc/calc2.rb +29 -0
  238. data/test/soap/calc/server.cgi +13 -0
  239. data/test/soap/calc/server.rb +17 -0
  240. data/test/soap/calc/server2.rb +20 -0
  241. data/test/soap/calc/test_calc.rb +51 -0
  242. data/test/soap/calc/test_calc2.rb +55 -0
  243. data/test/soap/calc/test_calc_cgi.rb +71 -0
  244. data/test/soap/case/test_mapping.rb +57 -0
  245. data/test/soap/fault/test_customfault.rb +60 -0
  246. data/test/soap/fault/test_fault.rb +46 -0
  247. data/test/soap/fault/test_soaparray.rb +35 -0
  248. data/test/soap/filter/test_filter.rb +146 -0
  249. data/test/soap/header/server.cgi +119 -0
  250. data/test/soap/header/session.pstoredb +0 -0
  251. data/test/soap/header/test_authheader.rb +240 -0
  252. data/test/soap/header/test_authheader_cgi.rb +121 -0
  253. data/test/soap/header/test_simplehandler.rb +116 -0
  254. data/test/soap/helloworld/hw_s.rb +16 -0
  255. data/test/soap/helloworld/test_helloworld.rb +43 -0
  256. data/test/soap/htpasswd +2 -0
  257. data/test/soap/literalArrayMapping/amazonEc.rb +4778 -0
  258. data/test/soap/literalArrayMapping/amazonEcDriver.rb +172 -0
  259. data/test/soap/literalArrayMapping/amazonresponse.xml +100 -0
  260. data/test/soap/literalArrayMapping/test_definedarray.rb +34 -0
  261. data/test/soap/marshal/marshaltestlib.rb +494 -0
  262. data/test/soap/marshal/test_digraph.rb +56 -0
  263. data/test/soap/marshal/test_marshal.rb +26 -0
  264. data/test/soap/marshal/test_struct.rb +47 -0
  265. data/test/soap/ssl/README +1 -0
  266. data/test/soap/ssl/ca.cert +23 -0
  267. data/test/soap/ssl/client.cert +19 -0
  268. data/test/soap/ssl/client.key +15 -0
  269. data/test/soap/ssl/server.cert +19 -0
  270. data/test/soap/ssl/server.key +15 -0
  271. data/test/soap/ssl/sslsvr.rb +57 -0
  272. data/test/soap/ssl/subca.cert +21 -0
  273. data/test/soap/ssl/test_ssl.rb +235 -0
  274. data/test/soap/struct/test_struct.rb +70 -0
  275. data/test/soap/styleuse/client.rb +20 -0
  276. data/test/soap/styleuse/server.rb +86 -0
  277. data/test/soap/swa/test_file.rb +75 -0
  278. data/test/soap/test_basetype.rb +1090 -0
  279. data/test/soap/test_cookie.rb +112 -0
  280. data/test/soap/test_custom_ns.rb +105 -0
  281. data/test/soap/test_custommap.rb +110 -0
  282. data/test/soap/test_empty.rb +105 -0
  283. data/test/soap/test_envelopenamespace.rb +85 -0
  284. data/test/soap/test_extraattr.rb +54 -0
  285. data/test/soap/test_generator.rb +27 -0
  286. data/test/soap/test_httpconfigloader.rb +71 -0
  287. data/test/soap/test_mapping.rb +131 -0
  288. data/test/soap/test_nestedexception.rb +56 -0
  289. data/test/soap/test_nil.rb +57 -0
  290. data/test/soap/test_no_indent.rb +88 -0
  291. data/test/soap/test_property.rb +428 -0
  292. data/test/soap/test_response_as_xml.rb +117 -0
  293. data/test/soap/test_soapelement.rb +138 -0
  294. data/test/soap/test_streamhandler.rb +270 -0
  295. data/test/soap/test_styleuse.rb +326 -0
  296. data/test/soap/wsdlDriver/README.txt +2 -0
  297. data/test/soap/wsdlDriver/calc.wsdl +126 -0
  298. data/test/soap/wsdlDriver/document.wsdl +54 -0
  299. data/test/soap/wsdlDriver/echo_version.rb +29 -0
  300. data/test/soap/wsdlDriver/simpletype.wsdl +63 -0
  301. data/test/soap/wsdlDriver/test_calc.rb +71 -0
  302. data/test/soap/wsdlDriver/test_document.rb +71 -0
  303. data/test/soap/wsdlDriver/test_simpletype.rb +80 -0
  304. data/test/testutil.rb +54 -0
  305. data/test/wsdl/abstract/abstract.wsdl +176 -0
  306. data/test/wsdl/abstract/test_abstract.rb +159 -0
  307. data/test/wsdl/anonymous/expectedClassDef.rb +128 -0
  308. data/test/wsdl/anonymous/expectedDriver.rb +59 -0
  309. data/test/wsdl/anonymous/expectedMappingRegistry.rb +176 -0
  310. data/test/wsdl/anonymous/lp.wsdl +147 -0
  311. data/test/wsdl/anonymous/test_anonymous.rb +130 -0
  312. data/test/wsdl/any/any.wsdl +114 -0
  313. data/test/wsdl/any/expectedDriver.rb +68 -0
  314. data/test/wsdl/any/expectedEcho.rb +57 -0
  315. data/test/wsdl/any/expectedMappingRegistry.rb +63 -0
  316. data/test/wsdl/any/expectedService.rb +69 -0
  317. data/test/wsdl/any/test_any.rb +193 -0
  318. data/test/wsdl/axisArray/axisArray.wsdl +87 -0
  319. data/test/wsdl/axisArray/test_axisarray.rb +124 -0
  320. data/test/wsdl/choice/choice.wsdl +167 -0
  321. data/test/wsdl/choice/test_choice.rb +310 -0
  322. data/test/wsdl/complexcontent/complexContent.wsdl +83 -0
  323. data/test/wsdl/complexcontent/test_echo.rb +90 -0
  324. data/test/wsdl/datetime/DatetimeService.rb +44 -0
  325. data/test/wsdl/datetime/datetime.rb +0 -0
  326. data/test/wsdl/datetime/datetime.wsdl +45 -0
  327. data/test/wsdl/datetime/datetimeServant.rb +22 -0
  328. data/test/wsdl/datetime/test_datetime.rb +86 -0
  329. data/test/wsdl/document/array/double.wsdl +161 -0
  330. data/test/wsdl/document/array/test_array.rb +201 -0
  331. data/test/wsdl/document/document.wsdl +76 -0
  332. data/test/wsdl/document/number.wsdl +54 -0
  333. data/test/wsdl/document/ping_nosoapaction.wsdl +66 -0
  334. data/test/wsdl/document/test_nosoapaction.rb +102 -0
  335. data/test/wsdl/document/test_number.rb +92 -0
  336. data/test/wsdl/document/test_rpc.rb +355 -0
  337. data/test/wsdl/emptycomplextype.wsdl +31 -0
  338. data/test/wsdl/fault/fault.wsdl +79 -0
  339. data/test/wsdl/fault/multifault.wsdl +96 -0
  340. data/test/wsdl/fault/test_fault.rb +119 -0
  341. data/test/wsdl/fault/test_multifault.rb +134 -0
  342. data/test/wsdl/group/expectedClassdef.rb +58 -0
  343. data/test/wsdl/group/expectedDriver.rb +51 -0
  344. data/test/wsdl/group/expectedMappingRegistry.rb +67 -0
  345. data/test/wsdl/group/group.wsdl +88 -0
  346. data/test/wsdl/group/test_rpc.rb +145 -0
  347. data/test/wsdl/list/list.wsdl +93 -0
  348. data/test/wsdl/list/test_list.rb +124 -0
  349. data/test/wsdl/map/map.wsdl +92 -0
  350. data/test/wsdl/map/map.xml +43 -0
  351. data/test/wsdl/map/test_map.rb +99 -0
  352. data/test/wsdl/marshal/Person.rb +1 -0
  353. data/test/wsdl/marshal/person.wsdl +21 -0
  354. data/test/wsdl/marshal/person_org.rb +23 -0
  355. data/test/wsdl/marshal/test_wsdlmarshal.rb +76 -0
  356. data/test/wsdl/multiplefault.wsdl +75 -0
  357. data/test/wsdl/oneway/oneway.wsdl +36 -0
  358. data/test/wsdl/oneway/test_oneway.rb +108 -0
  359. data/test/wsdl/overload/expectedClient.rb +37 -0
  360. data/test/wsdl/overload/expectedDriver.rb +61 -0
  361. data/test/wsdl/overload/expectedServant.rb +35 -0
  362. data/test/wsdl/overload/overload.wsdl +70 -0
  363. data/test/wsdl/overload/test_overload.rb +131 -0
  364. data/test/wsdl/qualified/lp.wsdl +47 -0
  365. data/test/wsdl/qualified/lp.xsd +26 -0
  366. data/test/wsdl/qualified/np.wsdl +51 -0
  367. data/test/wsdl/qualified/test_qualified.rb +137 -0
  368. data/test/wsdl/qualified/test_unqualified.rb +138 -0
  369. data/test/wsdl/raa/RAAService.rb +125 -0
  370. data/test/wsdl/raa/README.txt +8 -0
  371. data/test/wsdl/raa/expectedClassDef.rb +100 -0
  372. data/test/wsdl/raa/expectedDriver.rb +96 -0
  373. data/test/wsdl/raa/expectedMappingRegistry.rb +121 -0
  374. data/test/wsdl/raa/raa.wsdl +264 -0
  375. data/test/wsdl/raa/test_raa.rb +126 -0
  376. data/test/wsdl/ref/expectedDriver.rb +51 -0
  377. data/test/wsdl/ref/expectedProduct.rb +243 -0
  378. data/test/wsdl/ref/product.wsdl +147 -0
  379. data/test/wsdl/ref/test_ref.rb +268 -0
  380. data/test/wsdl/rpc/rpc.wsdl +109 -0
  381. data/test/wsdl/rpc/test-rpc-lit.wsdl +371 -0
  382. data/test/wsdl/rpc/test_rpc.rb +176 -0
  383. data/test/wsdl/rpc/test_rpc_lit.rb +470 -0
  384. data/test/wsdl/simplecontent/simplecontent.wsdl +84 -0
  385. data/test/wsdl/simplecontent/test_simplecontent.rb +102 -0
  386. data/test/wsdl/simpletype/rpc/echo_version.rb +1 -0
  387. data/test/wsdl/simpletype/rpc/echo_versionDriver.rb +10 -0
  388. data/test/wsdl/simpletype/rpc/echo_versionMappingRegistry.rb +4 -0
  389. data/test/wsdl/simpletype/rpc/echo_versionServant.rb +3 -0
  390. data/test/wsdl/simpletype/rpc/echo_version_service.rb +3 -0
  391. data/test/wsdl/simpletype/rpc/echo_version_serviceClient.rb +34 -0
  392. data/test/wsdl/simpletype/rpc/expectedClient.rb +34 -0
  393. data/test/wsdl/simpletype/rpc/expectedDriver.rb +58 -0
  394. data/test/wsdl/simpletype/rpc/expectedEchoVersion.rb +36 -0
  395. data/test/wsdl/simpletype/rpc/expectedMappingRegistry.rb +57 -0
  396. data/test/wsdl/simpletype/rpc/expectedServant.rb +32 -0
  397. data/test/wsdl/simpletype/rpc/expectedService.rb +55 -0
  398. data/test/wsdl/simpletype/rpc/rpc.wsdl +98 -0
  399. data/test/wsdl/simpletype/rpc/test_rpc.rb +52 -0
  400. data/test/wsdl/simpletype/simpletype.wsdl +114 -0
  401. data/test/wsdl/simpletype/test_simpletype.rb +92 -0
  402. data/test/wsdl/soap/soapbodyparts.wsdl +103 -0
  403. data/test/wsdl/soap/test_soapbodyparts.rb +79 -0
  404. data/test/wsdl/soap/wsdl2ruby/echo_version.rb +1 -0
  405. data/test/wsdl/soap/wsdl2ruby/echo_versionDriver.rb +10 -0
  406. data/test/wsdl/soap/wsdl2ruby/echo_versionMappingRegistry.rb +4 -0
  407. data/test/wsdl/soap/wsdl2ruby/echo_versionServant.rb +3 -0
  408. data/test/wsdl/soap/wsdl2ruby/echo_version_service.cgi +3 -0
  409. data/test/wsdl/soap/wsdl2ruby/echo_version_service.rb +7 -0
  410. data/test/wsdl/soap/wsdl2ruby/echo_version_serviceClient.rb +34 -0
  411. data/test/wsdl/soap/wsdl2ruby/expectedClassdef.rb +21 -0
  412. data/test/wsdl/soap/wsdl2ruby/expectedClient.rb +34 -0
  413. data/test/wsdl/soap/wsdl2ruby/expectedDriver.rb +58 -0
  414. data/test/wsdl/soap/wsdl2ruby/expectedMappingRegistry.rb +36 -0
  415. data/test/wsdl/soap/wsdl2ruby/expectedServant.rb +32 -0
  416. data/test/wsdl/soap/wsdl2ruby/expectedService.cgi +48 -0
  417. data/test/wsdl/soap/wsdl2ruby/expectedService.rb +55 -0
  418. data/test/wsdl/soap/wsdl2ruby/rpc.wsdl +80 -0
  419. data/test/wsdl/soap/wsdl2ruby/section/expectedClassdef.rb +37 -0
  420. data/test/wsdl/soap/wsdl2ruby/section/section.xsd +31 -0
  421. data/test/wsdl/soap/wsdl2ruby/section/test_section.rb +53 -0
  422. data/test/wsdl/soap/wsdl2ruby/soapenc/soapenc.wsdl +64 -0
  423. data/test/wsdl/soap/wsdl2ruby/soapenc/test_soapenc.rb +83 -0
  424. data/test/wsdl/soap/wsdl2ruby/test_wsdl2ruby.rb +102 -0
  425. data/test/wsdl/soaptype/soaptype.wsdl +61 -0
  426. data/test/wsdl/soaptype/test_soaptype.rb +178 -0
  427. data/test/wsdl/test_emptycomplextype.rb +21 -0
  428. data/test/wsdl/test_fault.rb +50 -0
  429. data/test/wsdl/test_multiplefault.rb +41 -0
  430. data/test/xsd/codegen/test_classdef.rb +244 -0
  431. data/test/xsd/noencoding.xml +4 -0
  432. data/test/xsd/test_noencoding.rb +32 -0
  433. data/test/xsd/test_ns.rb +41 -0
  434. data/test/xsd/test_xmlschemaparser.rb +22 -0
  435. data/test/xsd/test_xsd.rb +1638 -0
  436. data/test/xsd/xmllang.xml +43 -0
  437. data/test/xsd/xmlschema.xml +12 -0
  438. data/test/xsd/xsd2ruby/expected_mysample.rb +65 -0
  439. data/test/xsd/xsd2ruby/expected_mysample_mapper.rb +11 -0
  440. data/test/xsd/xsd2ruby/expected_mysample_mapping_registry.rb +51 -0
  441. data/test/xsd/xsd2ruby/section.xsd +49 -0
  442. data/test/xsd/xsd2ruby/test_xsd2ruby.rb +90 -0
  443. metadata +568 -0
@@ -0,0 +1,240 @@
1
+ # WSDL4R - Creating class code support from WSDL.
2
+ # Copyright (C) 2000-2007 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
3
+
4
+ # This program is copyrighted free software by NAKAMURA, Hiroshi. You can
5
+ # redistribute it and/or modify it under the same terms of Ruby's license;
6
+ # either the dual license version in 2003, or any later version.
7
+
8
+
9
+ require 'wsdl/info'
10
+ require 'soap/mapping'
11
+ require 'soap/mapping/typeMap'
12
+ require 'xsd/codegen/gensupport'
13
+
14
+
15
+ module WSDL
16
+ module SOAP
17
+
18
+
19
+ # requires @defined_const, @simpletypes, @name_creator
20
+ module ClassDefCreatorSupport
21
+ include XSD::CodeGen::GenSupport
22
+
23
+ def mapped_class_name(qname, modulepath)
24
+ @name_creator.assign_name(qname, modulepath)
25
+ end
26
+
27
+ def mapped_class_basename(qname, modulepath)
28
+ classname = @name_creator.assign_name(qname, modulepath)
29
+ classname.sub(/\A.*:/, '')
30
+ end
31
+
32
+ def basetype_mapped_class(name)
33
+ ::SOAP::TypeMap[name]
34
+ end
35
+
36
+ def dump_method_signature(name, operation, element_definitions)
37
+ methodname = safemethodname(name)
38
+ input = operation.input
39
+ output = operation.output
40
+ fault = operation.fault
41
+ signature = "#{methodname}#{dump_inputparam(input)}"
42
+ str = <<__EOD__
43
+ # SYNOPSIS
44
+ # #{methodname}#{dump_inputparam(input)}
45
+ #
46
+ # ARGS
47
+ #{dump_inout_type(input, element_definitions).chomp}
48
+ #
49
+ # RETURNS
50
+ #{dump_inout_type(output, element_definitions).chomp}
51
+ #
52
+ __EOD__
53
+ unless fault.empty?
54
+ str <<<<__EOD__
55
+ # RAISES
56
+ #{dump_fault_type(fault, element_definitions)}
57
+ #
58
+ __EOD__
59
+ end
60
+ str
61
+ end
62
+
63
+ def dq(ele)
64
+ ele.dump
65
+ end
66
+
67
+ def ndq(ele)
68
+ ele.nil? ? 'nil' : dq(ele)
69
+ end
70
+
71
+ def sym(ele)
72
+ ':' + ele.id2name
73
+ end
74
+
75
+ def nsym(ele)
76
+ ele.nil? ? 'nil' : sym(ele)
77
+ end
78
+
79
+ def dqname(qname)
80
+ if @defined_const.key?(qname.namespace)
81
+ qname.dump(@defined_const[qname.namespace])
82
+ else
83
+ qname.dump
84
+ end
85
+ end
86
+
87
+ def assign_const(value, prefix = '')
88
+ return if value.nil? or @defined_const.key?(value)
89
+ name = value.scan(/[^:\/]+\/?\z/)[0] || 'C'
90
+ tag = prefix + safeconstname(name)
91
+ if @defined_const.value?(tag)
92
+ idx = 0
93
+ while true
94
+ tag = prefix + safeconstname(name + "_#{idx}")
95
+ break unless @defined_const.value?(tag)
96
+ idx += 1
97
+ raise RuntimeError.new("too much similar names") if idx > 100
98
+ end
99
+ end
100
+ @defined_const[value] = tag
101
+ end
102
+
103
+ def create_type_name(modulepath, element)
104
+ if element.type == XSD::AnyTypeName
105
+ # nil means anyType.
106
+ nil
107
+ elsif simpletype = @simpletypes[element.type]
108
+ if simpletype.restriction and simpletype.restriction.enumeration?
109
+ mapped_class_name(element.type, modulepath)
110
+ else
111
+ nil
112
+ end
113
+ elsif klass = element_basetype(element)
114
+ klass.name
115
+ elsif element.type
116
+ mapped_class_name(element.type, modulepath)
117
+ elsif element.ref
118
+ mapped_class_name(element.ref, modulepath)
119
+ elsif element.anonymous_type?
120
+ # inner class
121
+ mapped_class_name(element.name, modulepath)
122
+ else
123
+ nil
124
+ end
125
+ end
126
+
127
+ private
128
+
129
+ def dump_inout_type(param, element_definitions)
130
+ if param
131
+ message = param.find_message
132
+ params = ""
133
+ message.parts.each do |part|
134
+ name = safevarname(part.name)
135
+ if part.type
136
+ typename = safeconstname(part.type.name)
137
+ qname = part.type
138
+ params << add_at("# #{name}", "#{typename} - #{qname}\n", 20)
139
+ elsif part.element
140
+ ele = element_definitions[part.element]
141
+ if ele.type
142
+ typename = safeconstname(ele.type.name)
143
+ qname = ele.type
144
+ else
145
+ typename = safeconstname(ele.name.name)
146
+ qname = ele.name
147
+ end
148
+ params << add_at("# #{name}", "#{typename} - #{qname}\n", 20)
149
+ end
150
+ end
151
+ unless params.empty?
152
+ return params
153
+ end
154
+ end
155
+ "# N/A\n"
156
+ end
157
+
158
+ def dump_inputparam(input)
159
+ message = input.find_message
160
+ params = ""
161
+ message.parts.each do |part|
162
+ params << ", " unless params.empty?
163
+ params << safevarname(part.name)
164
+ end
165
+ if params.empty?
166
+ ""
167
+ else
168
+ "(#{ params })"
169
+ end
170
+ end
171
+
172
+ def add_at(base, str, pos)
173
+ if base.size >= pos
174
+ base + ' ' + str
175
+ else
176
+ base + ' ' * (pos - base.size) + str
177
+ end
178
+ end
179
+
180
+ def dump_fault_type(fault, element_definitions)
181
+ fault.collect { |ele|
182
+ dump_inout_type(ele, element_definitions).chomp
183
+ }.join("\n")
184
+ end
185
+
186
+ def element_basetype(ele)
187
+ if klass = basetype_class(ele.type)
188
+ klass
189
+ elsif ele.local_simpletype
190
+ basetype_class(ele.local_simpletype.base)
191
+ else
192
+ nil
193
+ end
194
+ end
195
+
196
+ def attribute_basetype(attr)
197
+ if klass = basetype_class(attr.type)
198
+ klass
199
+ elsif attr.local_simpletype
200
+ basetype_class(attr.local_simpletype.base)
201
+ else
202
+ nil
203
+ end
204
+ end
205
+
206
+ def basetype_class(type)
207
+ return nil if type.nil?
208
+ if simpletype = @simpletypes[type]
209
+ basetype_mapped_class(simpletype.base)
210
+ else
211
+ basetype_mapped_class(type)
212
+ end
213
+ end
214
+
215
+ def name_element(element)
216
+ return element.name if element.name
217
+ return element.ref if element.ref
218
+ raise RuntimeError.new("cannot define name of #{element}")
219
+ end
220
+
221
+ def name_attribute(attribute)
222
+ return attribute.name if attribute.name
223
+ return attribute.ref if attribute.ref
224
+ raise RuntimeError.new("cannot define name of #{attribute}")
225
+ end
226
+
227
+ # TODO: run MethodDefCreator just once in 1.6.X.
228
+ # MethodDefCreator should return parsed struct, not a String.
229
+ def collect_assigned_method(wsdl, porttypename, modulepath = nil)
230
+ name_creator = WSDL::SOAP::ClassNameCreator.new
231
+ methoddefcreator =
232
+ WSDL::SOAP::MethodDefCreator.new(wsdl, name_creator, modulepath, {})
233
+ methoddefcreator.dump(porttypename)
234
+ methoddefcreator.assigned_method
235
+ end
236
+ end
237
+
238
+
239
+ end
240
+ end
@@ -0,0 +1,54 @@
1
+ # WSDL4R - Class name creator.
2
+ # Copyright (C) 2000-2007 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
3
+
4
+ # This program is copyrighted free software by NAKAMURA, Hiroshi. You can
5
+ # redistribute it and/or modify it under the same terms of Ruby's license;
6
+ # either the dual license version in 2003, or any later version.
7
+
8
+
9
+ require 'soap/mapping/typeMap'
10
+ require 'xsd/codegen/gensupport'
11
+
12
+
13
+ module WSDL
14
+ module SOAP
15
+
16
+
17
+ class ClassNameCreator
18
+ include XSD::CodeGen::GenSupport
19
+
20
+ def initialize
21
+ @classname = {}
22
+ end
23
+
24
+ def assign_name(qname, modulepath = nil)
25
+ key = [modulepath, qname]
26
+ unless @classname.key?(key)
27
+ if klass = ::SOAP::TypeMap[qname]
28
+ name =
29
+ ::SOAP::Mapping::DefaultRegistry.find_mapped_obj_class(klass).name
30
+ else
31
+ name = safeconstname(qname.name)
32
+ if modulepath
33
+ name = [modulepath, name].join('::')
34
+ end
35
+ while @classname.value?(name)
36
+ name += '_'
37
+ end
38
+ check_classname(name)
39
+ end
40
+ @classname[key] = name.freeze
41
+ end
42
+ @classname[key]
43
+ end
44
+
45
+ def check_classname(name)
46
+ if Object.constants.include?(name)
47
+ warn("created definition re-opens an existing toplevel class: #{name}. consider to use --module_path option of wsdl2ruby.rb")
48
+ end
49
+ end
50
+ end
51
+
52
+
53
+ end
54
+ end
@@ -0,0 +1,104 @@
1
+ # WSDL4R - Creating client skelton code from WSDL.
2
+ # Copyright (C) 2000-2007 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
3
+
4
+ # This program is copyrighted free software by NAKAMURA, Hiroshi. You can
5
+ # redistribute it and/or modify it under the same terms of Ruby's license;
6
+ # either the dual license version in 2003, or any later version.
7
+
8
+
9
+ require 'wsdl/info'
10
+ require 'wsdl/soap/classDefCreatorSupport'
11
+
12
+
13
+ module WSDL
14
+ module SOAP
15
+
16
+
17
+ class ClientSkeltonCreator
18
+ include ClassDefCreatorSupport
19
+
20
+ attr_reader :definitions
21
+
22
+ def initialize(definitions, name_creator, modulepath = nil)
23
+ @definitions = definitions
24
+ @name_creator = name_creator
25
+ @modulepath = modulepath
26
+ end
27
+
28
+ def dump(service_name)
29
+ services = @definitions.service(service_name)
30
+ unless services
31
+ raise RuntimeError.new("service not defined: #{service_name}")
32
+ end
33
+ result = ""
34
+ if @modulepath
35
+ result << "\n"
36
+ result << @modulepath.collect { |ele| "module #{ele}" }.join("; ")
37
+ result << "\n\n"
38
+ end
39
+ services.ports.each do |port|
40
+ result << dump_porttype(port.porttype)
41
+ result << "\n"
42
+ end
43
+ if @modulepath
44
+ result << "\n\n"
45
+ result << @modulepath.collect { |ele| "end" }.join("; ")
46
+ result << "\n"
47
+ end
48
+ result
49
+ end
50
+
51
+ private
52
+
53
+ def dump_porttype(porttype)
54
+ assigned_method = collect_assigned_method(@definitions, porttype.name, @modulepath)
55
+ drv_name = mapped_class_basename(porttype.name, @modulepath)
56
+
57
+ result = ""
58
+ result << <<__EOD__
59
+ endpoint_url = ARGV.shift
60
+ obj = #{ drv_name }.new(endpoint_url)
61
+
62
+ # run ruby with -d to see SOAP wiredumps.
63
+ obj.wiredump_dev = STDERR if $DEBUG
64
+
65
+ __EOD__
66
+ element_definitions = @definitions.collect_elements
67
+ binding = porttype.find_binding
68
+ if binding
69
+ binding.operations.each do |op_bind|
70
+ operation = op_bind.find_operation
71
+ if operation.nil?
72
+ warn("operation not found for binding: #{op_bind}")
73
+ next
74
+ end
75
+ name = assigned_method[op_bind.boundid] || operation.name
76
+ result << dump_method_signature(name, operation, element_definitions)
77
+ result << dump_input_init(operation.input) << "\n"
78
+ result << dump_operation(name, operation) << "\n\n"
79
+ end
80
+ end
81
+ result
82
+ end
83
+
84
+ def dump_operation(name, operation)
85
+ input = operation.input
86
+ "puts obj.#{ safemethodname(name) }#{ dump_inputparam(input) }"
87
+ end
88
+
89
+ def dump_input_init(input)
90
+ result = input.find_message.parts.collect { |part|
91
+ safevarname(part.name)
92
+ }.join(" = ")
93
+ if result.empty?
94
+ ""
95
+ else
96
+ result << " = nil"
97
+ end
98
+ result
99
+ end
100
+ end
101
+
102
+
103
+ end
104
+ end
@@ -0,0 +1,173 @@
1
+ # WSDL4R - SOAP complexType definition for WSDL.
2
+ # Copyright (C) 2000-2007 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
3
+
4
+ # This program is copyrighted free software by NAKAMURA, Hiroshi. You can
5
+ # redistribute it and/or modify it under the same terms of Ruby's license;
6
+ # either the dual license version in 2003, or any later version.
7
+
8
+
9
+ require 'wsdl/xmlSchema/complexType'
10
+ require 'soap/mapping'
11
+
12
+
13
+ module WSDL
14
+ module XMLSchema
15
+
16
+
17
+ class ComplexType < Info
18
+ def compoundtype
19
+ @compoundtype ||= check_type
20
+ end
21
+
22
+ def check_type
23
+ if have_any?
24
+ :TYPE_STRUCT
25
+ elsif content
26
+ if attributes.empty? and map_as_array?
27
+ if name == ::SOAP::Mapping::MapQName
28
+ :TYPE_MAP
29
+ else
30
+ :TYPE_ARRAY
31
+ end
32
+ else
33
+ :TYPE_STRUCT
34
+ end
35
+ elsif complexcontent
36
+ complexcontent.check_type
37
+ elsif simplecontent
38
+ :TYPE_SIMPLE
39
+ elsif !attributes.empty?
40
+ :TYPE_STRUCT
41
+ else # empty complexType definition (seen in partner.wsdl of salesforce)
42
+ :TYPE_EMPTY
43
+ end
44
+ end
45
+
46
+ def child_type(name = nil)
47
+ case compoundtype
48
+ when :TYPE_STRUCT
49
+ if ele = find_element(name)
50
+ ele.type
51
+ elsif ele = find_element_by_name(name.name)
52
+ ele.type
53
+ end
54
+ when :TYPE_ARRAY
55
+ @contenttype ||= content_arytype
56
+ when :TYPE_MAP
57
+ item_ele = find_element_by_name("item") or
58
+ raise RuntimeError.new("'item' element not found in Map definition.")
59
+ content = item_ele.local_complextype or
60
+ raise RuntimeError.new("No complexType definition for 'item'.")
61
+ if ele = content.find_element(name)
62
+ ele.type
63
+ elsif ele = content.find_element_by_name(name.name)
64
+ ele.type
65
+ end
66
+ else
67
+ raise NotImplementedError.new("Unknown kind of complexType.")
68
+ end
69
+ end
70
+
71
+ def child_defined_complextype(name)
72
+ ele = nil
73
+ case compoundtype
74
+ when :TYPE_STRUCT, :TYPE_MAP
75
+ unless ele = find_element(name)
76
+ if name.namespace.nil?
77
+ ele = find_element_by_name(name.name)
78
+ end
79
+ end
80
+ when :TYPE_ARRAY
81
+ e = elements
82
+ if e.size == 1
83
+ ele = e[0]
84
+ else
85
+ raise RuntimeError.new("Assert: must not reach.")
86
+ end
87
+ else
88
+ raise RuntimeError.new("Assert: Not implemented.")
89
+ end
90
+ unless ele
91
+ raise RuntimeError.new("Cannot find #{name} as a children of #{@name}.")
92
+ end
93
+ ele.local_complextype
94
+ end
95
+
96
+ def find_soapenc_arytype
97
+ unless compoundtype == :TYPE_ARRAY
98
+ raise RuntimeError.new("Assert: not for array")
99
+ end
100
+ if complexcontent
101
+ if complexcontent.restriction
102
+ complexcontent.restriction.attributes.each do |attribute|
103
+ if attribute.ref == ::SOAP::AttrArrayTypeName
104
+ return attribute.arytype
105
+ end
106
+ end
107
+ end
108
+ end
109
+ nil
110
+ end
111
+
112
+ def find_arytype
113
+ unless compoundtype == :TYPE_ARRAY
114
+ raise RuntimeError.new("Assert: not for array")
115
+ end
116
+ if arytype = find_soapenc_arytype
117
+ return arytype
118
+ end
119
+ if map_as_array?
120
+ return element_simpletype(elements[0])
121
+ end
122
+ raise RuntimeError.new("Assert: Unknown array definition.")
123
+ end
124
+
125
+ def find_aryelement
126
+ unless compoundtype == :TYPE_ARRAY
127
+ raise RuntimeError.new("Assert: not for array")
128
+ end
129
+ if map_as_array?
130
+ return nested_elements[0]
131
+ end
132
+ nil # use default item name
133
+ end
134
+
135
+ private
136
+
137
+ def element_simpletype(element)
138
+ case element
139
+ when XMLSchema::Element
140
+ if element.type
141
+ element.type
142
+ elsif element.local_simpletype
143
+ element.local_simpletype.base
144
+ else
145
+ # element definition
146
+ nil
147
+ end
148
+ when XMLSchema::Any
149
+ XSD::AnyTypeName
150
+ else
151
+ nil
152
+ end
153
+ end
154
+
155
+ def map_as_array?
156
+ e = nested_elements
157
+ e.size == 1 and e[0].map_as_array?
158
+ end
159
+
160
+ def content_arytype
161
+ if arytype = find_arytype
162
+ ns = arytype.namespace
163
+ name = arytype.name.sub(/\[(?:,)*\]$/, '')
164
+ XSD::QName.new(ns, name)
165
+ else
166
+ nil
167
+ end
168
+ end
169
+ end
170
+
171
+
172
+ end
173
+ end