puppet 5.3.7 → 5.4.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of puppet might be problematic. Click here for more details.

Files changed (454) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +42 -29
  3. data/README.md +8 -6
  4. data/ext/cert_inspector +2 -2
  5. data/ext/envpuppet +1 -1
  6. data/ext/gentoo/init.d/puppetmaster +4 -4
  7. data/ext/ips/puppet-agent +11 -11
  8. data/ext/ips/puppet-master +11 -11
  9. data/ext/puppet-test +1 -2
  10. data/ext/redhat/client.init +2 -2
  11. data/ext/redhat/logrotate +1 -1
  12. data/ext/solaris/smf/puppet +11 -11
  13. data/ext/solaris/smf/svc-puppetd +5 -5
  14. data/ext/solaris/smf/svc-puppetmasterd +5 -5
  15. data/ext/windows/service/daemon.rb +1 -1
  16. data/install.rb +2 -3
  17. data/lib/puppet/agent.rb +1 -1
  18. data/lib/puppet/application/cert.rb +1 -3
  19. data/lib/puppet/application/describe.rb +0 -1
  20. data/lib/puppet/application/device.rb +12 -99
  21. data/lib/puppet/application/filebucket.rb +32 -11
  22. data/lib/puppet/application/lookup.rb +1 -11
  23. data/lib/puppet/application/script.rb +261 -0
  24. data/lib/puppet/configurer.rb +3 -4
  25. data/lib/puppet/configurer/plugin_handler.rb +26 -9
  26. data/lib/puppet/context.rb +1 -1
  27. data/lib/puppet/datatypes.rb +213 -0
  28. data/lib/puppet/datatypes/error.rb +21 -0
  29. data/lib/puppet/datatypes/impl/error.rb +40 -0
  30. data/lib/puppet/defaults.rb +51 -20
  31. data/lib/puppet/environments.rb +17 -0
  32. data/lib/puppet/error.rb +17 -0
  33. data/lib/puppet/etc.rb +2 -2
  34. data/lib/puppet/external/pson/pure/generator.rb +1 -1
  35. data/lib/puppet/external/pson/pure/parser.rb +1 -1
  36. data/lib/puppet/face/config.rb +45 -0
  37. data/lib/puppet/face/epp.rb +3 -3
  38. data/lib/puppet/face/help/action.erb +3 -0
  39. data/lib/puppet/face/module/build.rb +1 -0
  40. data/lib/puppet/face/module/generate.rb +5 -0
  41. data/lib/puppet/face/module/install.rb +1 -0
  42. data/lib/puppet/face/module/search.rb +6 -2
  43. data/lib/puppet/face/module/uninstall.rb +1 -0
  44. data/lib/puppet/face/module/upgrade.rb +1 -0
  45. data/lib/puppet/face/parser.rb +0 -1
  46. data/lib/puppet/face/plugin.rb +1 -3
  47. data/lib/puppet/feature/base.rb +1 -1
  48. data/lib/puppet/feature/bolt.rb +3 -0
  49. data/lib/puppet/file_bucket/dipper.rb +1 -2
  50. data/lib/puppet/file_serving/http_metadata.rb +1 -1
  51. data/lib/puppet/file_system/uniquefile.rb +2 -2
  52. data/lib/puppet/forge.rb +6 -0
  53. data/lib/puppet/functions.rb +70 -88
  54. data/lib/puppet/functions/all.rb +6 -2
  55. data/lib/puppet/functions/annotate.rb +1 -1
  56. data/lib/puppet/functions/any.rb +7 -3
  57. data/lib/puppet/functions/contain.rb +6 -0
  58. data/lib/puppet/functions/convert_to.rb +32 -0
  59. data/lib/puppet/functions/defined.rb +0 -3
  60. data/lib/puppet/functions/each.rb +10 -6
  61. data/lib/puppet/functions/filter.rb +16 -10
  62. data/lib/puppet/functions/find_file.rb +0 -1
  63. data/lib/puppet/functions/include.rb +6 -0
  64. data/lib/puppet/functions/map.rb +12 -9
  65. data/lib/puppet/functions/module_directory.rb +41 -0
  66. data/lib/puppet/functions/new.rb +1 -4
  67. data/lib/puppet/functions/regsubst.rb +1 -1
  68. data/lib/puppet/functions/require.rb +6 -0
  69. data/lib/puppet/generate/type.rb +1 -1
  70. data/lib/puppet/gettext/config.rb +2 -2
  71. data/lib/puppet/gettext/stubs.rb +1 -1
  72. data/lib/puppet/indirector/catalog/compiler.rb +0 -1
  73. data/lib/puppet/indirector/file_bucket_file/file.rb +6 -2
  74. data/lib/puppet/indirector/file_server.rb +1 -1
  75. data/lib/puppet/indirector/node/ldap.rb +19 -3
  76. data/lib/puppet/indirector/request.rb +10 -6
  77. data/lib/puppet/indirector/rest.rb +11 -12
  78. data/lib/puppet/info_service/class_information_service.rb +1 -1
  79. data/lib/puppet/interface/action.rb +11 -0
  80. data/lib/puppet/interface/action_builder.rb +8 -0
  81. data/lib/puppet/interface/option_manager.rb +1 -1
  82. data/lib/puppet/loaders.rb +2 -0
  83. data/lib/puppet/module.rb +6 -2
  84. data/lib/puppet/module_tool/applications/builder.rb +4 -0
  85. data/lib/puppet/module_tool/applications/installer.rb +3 -0
  86. data/lib/puppet/module_tool/applications/uninstaller.rb +3 -0
  87. data/lib/puppet/module_tool/applications/unpacker.rb +1 -1
  88. data/lib/puppet/module_tool/applications/upgrader.rb +3 -0
  89. data/lib/puppet/module_tool/installed_modules.rb +1 -1
  90. data/lib/puppet/module_tool/metadata.rb +0 -1
  91. data/lib/puppet/network/authstore.rb +1 -1
  92. data/lib/puppet/network/http/api/indirected_routes.rb +1 -1
  93. data/lib/puppet/network/http/connection.rb +1 -9
  94. data/lib/puppet/network/http/factory.rb +0 -3
  95. data/lib/puppet/network/http/webrick.rb +1 -0
  96. data/lib/puppet/network/rights.rb +1 -1
  97. data/lib/puppet/node.rb +53 -0
  98. data/lib/puppet/node/environment.rb +1 -1
  99. data/lib/puppet/parameter/boolean.rb +1 -1
  100. data/lib/puppet/parser.rb +1 -0
  101. data/lib/puppet/parser/abstract_compiler.rb +36 -0
  102. data/lib/puppet/parser/ast/branch.rb +1 -1
  103. data/lib/puppet/parser/ast/pops_bridge.rb +8 -52
  104. data/lib/puppet/parser/compiler.rb +4 -54
  105. data/lib/puppet/parser/functions.rb +0 -1
  106. data/lib/puppet/parser/functions/create_resources.rb +6 -0
  107. data/lib/puppet/parser/functions/fqdn_rand.rb +6 -2
  108. data/lib/puppet/parser/functions/inline_template.rb +6 -0
  109. data/lib/puppet/parser/functions/new.rb +47 -32
  110. data/lib/puppet/parser/functions/realize.rb +6 -0
  111. data/lib/puppet/parser/functions/return.rb +1 -22
  112. data/lib/puppet/parser/functions/reverse_each.rb +1 -1
  113. data/lib/puppet/parser/functions/scanf.rb +1 -1
  114. data/lib/puppet/parser/functions/sha256.rb +5 -0
  115. data/lib/puppet/parser/functions/tag.rb +6 -0
  116. data/lib/puppet/parser/functions/tagged.rb +6 -0
  117. data/lib/puppet/parser/functions/template.rb +5 -0
  118. data/lib/puppet/parser/scope.rb +28 -4
  119. data/lib/puppet/parser/script_compiler.rb +118 -0
  120. data/lib/puppet/parser/type_loader.rb +1 -1
  121. data/lib/puppet/pops.rb +1 -1
  122. data/lib/puppet/pops/evaluator/access_operator.rb +38 -4
  123. data/lib/puppet/pops/evaluator/closure.rb +12 -4
  124. data/lib/puppet/pops/evaluator/compare_operator.rb +4 -4
  125. data/lib/puppet/pops/evaluator/epp_evaluator.rb +13 -0
  126. data/lib/puppet/pops/evaluator/evaluator_impl.rb +38 -10
  127. data/lib/puppet/pops/evaluator/literal_evaluator.rb +1 -1
  128. data/lib/puppet/pops/evaluator/runtime3_converter.rb +1 -1
  129. data/lib/puppet/pops/evaluator/runtime3_support.rb +2 -3
  130. data/lib/puppet/pops/functions/dispatch.rb +6 -5
  131. data/lib/puppet/pops/functions/function.rb +2 -2
  132. data/lib/puppet/pops/issues.rb +34 -2
  133. data/lib/puppet/pops/loader/base_loader.rb +10 -0
  134. data/lib/puppet/pops/loader/dependency_loader.rb +7 -0
  135. data/lib/puppet/pops/loader/loader.rb +21 -2
  136. data/lib/puppet/pops/loader/loader_paths.rb +180 -30
  137. data/lib/puppet/pops/loader/module_loaders.rb +202 -33
  138. data/lib/puppet/pops/loader/puppet_plan_instantiator.rb +84 -0
  139. data/lib/puppet/pops/loader/puppet_resource_type_impl_instantiator.rb +9 -9
  140. data/lib/puppet/pops/loader/ruby_data_type_instantiator.rb +40 -0
  141. data/lib/puppet/pops/loader/runtime3_type_loader.rb +6 -1
  142. data/lib/puppet/pops/loader/static_loader.rb +23 -8
  143. data/lib/puppet/pops/loader/task_instantiator.rb +69 -0
  144. data/lib/puppet/pops/loader/type_definition_instantiator.rb +4 -0
  145. data/lib/puppet/pops/loaders.rb +122 -11
  146. data/lib/puppet/pops/lookup/data_dig_function_provider.rb +1 -1
  147. data/lib/puppet/pops/lookup/interpolation.rb +1 -1
  148. data/lib/puppet/pops/lookup/lookup_adapter.rb +0 -1
  149. data/lib/puppet/pops/model/ast.pp +3 -0
  150. data/lib/puppet/pops/model/ast.rb +34 -1
  151. data/lib/puppet/pops/model/factory.rb +30 -3
  152. data/lib/puppet/pops/model/model_label_provider.rb +1 -0
  153. data/lib/puppet/pops/model/model_tree_dumper.rb +12 -1
  154. data/lib/puppet/pops/model/tree_dumper.rb +1 -1
  155. data/lib/puppet/pops/parser/code_merger.rb +2 -2
  156. data/lib/puppet/pops/parser/egrammar.ra +44 -15
  157. data/lib/puppet/pops/parser/eparser.rb +1687 -1571
  158. data/lib/puppet/pops/parser/epp_support.rb +1 -3
  159. data/lib/puppet/pops/parser/evaluating_parser.rb +1 -1
  160. data/lib/puppet/pops/parser/interpolation_support.rb +2 -2
  161. data/lib/puppet/pops/parser/lexer2.rb +4 -4
  162. data/lib/puppet/pops/parser/lexer_support.rb +2 -2
  163. data/lib/puppet/pops/parser/locatable.rb +1 -1
  164. data/lib/puppet/pops/parser/locator.rb +7 -13
  165. data/lib/puppet/pops/parser/parser_support.rb +3 -3
  166. data/lib/puppet/pops/parser/slurp_support.rb +0 -3
  167. data/lib/puppet/pops/pcore.rb +45 -0
  168. data/lib/puppet/pops/resource/param.rb +1 -1
  169. data/lib/puppet/pops/resource/resource_type_impl.rb +1 -1
  170. data/lib/puppet/pops/serialization/abstract_reader.rb +4 -0
  171. data/lib/puppet/pops/serialization/abstract_writer.rb +6 -0
  172. data/lib/puppet/pops/serialization/extension.rb +1 -0
  173. data/lib/puppet/pops/serialization/from_data_converter.rb +64 -10
  174. data/lib/puppet/pops/serialization/json_path.rb +2 -1
  175. data/lib/puppet/pops/serialization/object.rb +3 -4
  176. data/lib/puppet/pops/serialization/serializer.rb +2 -1
  177. data/lib/puppet/pops/serialization/to_data_converter.rb +7 -3
  178. data/lib/puppet/pops/time/timespan.rb +1 -1
  179. data/lib/puppet/pops/types/iterable.rb +38 -9
  180. data/lib/puppet/pops/types/p_init_type.rb +1 -1
  181. data/lib/puppet/pops/types/p_meta_type.rb +4 -0
  182. data/lib/puppet/pops/types/p_object_type.rb +146 -14
  183. data/lib/puppet/pops/types/p_object_type_extension.rb +218 -0
  184. data/lib/puppet/pops/types/p_sem_ver_range_type.rb +0 -1
  185. data/lib/puppet/pops/types/p_sem_ver_type.rb +10 -2
  186. data/lib/puppet/pops/types/p_type_set_type.rb +0 -1
  187. data/lib/puppet/pops/types/p_uri_type.rb +190 -0
  188. data/lib/puppet/pops/types/puppet_object.rb +15 -1
  189. data/lib/puppet/pops/types/ruby_generator.rb +46 -54
  190. data/lib/puppet/pops/types/string_converter.rb +22 -1
  191. data/lib/puppet/pops/types/type_acceptor.rb +1 -1
  192. data/lib/puppet/pops/types/type_calculator.rb +13 -4
  193. data/lib/puppet/pops/types/type_factory.rb +29 -5
  194. data/lib/puppet/pops/types/type_formatter.rb +67 -4
  195. data/lib/puppet/pops/types/type_parser.rb +92 -4
  196. data/lib/puppet/pops/types/type_with_members.rb +43 -0
  197. data/lib/puppet/pops/types/types.rb +212 -80
  198. data/lib/puppet/pops/validation/checker4_0.rb +10 -6
  199. data/lib/puppet/pops/validation/tasks_checker.rb +60 -0
  200. data/lib/puppet/pops/validation/validator_factory_4_0.rb +6 -1
  201. data/lib/puppet/property.rb +1 -1
  202. data/lib/puppet/provider.rb +18 -8
  203. data/lib/puppet/provider/augeas/augeas.rb +3 -4
  204. data/lib/puppet/provider/exec.rb +0 -2
  205. data/lib/puppet/provider/group/groupadd.rb +25 -1
  206. data/lib/puppet/provider/group/windows_adsi.rb +7 -4
  207. data/lib/puppet/provider/mount.rb +25 -8
  208. data/lib/puppet/provider/nameservice.rb +9 -4
  209. data/lib/puppet/provider/nameservice/directoryservice.rb +3 -3
  210. data/lib/puppet/provider/nameservice/objectadd.rb +13 -24
  211. data/lib/puppet/provider/nameservice/pw.rb +14 -14
  212. data/lib/puppet/provider/package/appdmg.rb +0 -1
  213. data/lib/puppet/provider/package/apple.rb +0 -1
  214. data/lib/puppet/provider/package/gem.rb +2 -2
  215. data/lib/puppet/provider/package/macports.rb +2 -2
  216. data/lib/puppet/provider/package/pkg.rb +3 -0
  217. data/lib/puppet/provider/package/pkgdmg.rb +0 -1
  218. data/lib/puppet/provider/package/portage.rb +0 -1
  219. data/lib/puppet/provider/package/yum.rb +23 -8
  220. data/lib/puppet/provider/package/zypper.rb +2 -2
  221. data/lib/puppet/provider/scheduled_task/win32_taskscheduler.rb +2 -2
  222. data/lib/puppet/provider/service/init.rb +1 -0
  223. data/lib/puppet/provider/service/launchd.rb +6 -7
  224. data/lib/puppet/provider/service/redhat.rb +3 -2
  225. data/lib/puppet/provider/service/systemd.rb +2 -2
  226. data/lib/puppet/provider/ssh_authorized_key/parsed.rb +1 -1
  227. data/lib/puppet/provider/user/aix.rb +3 -2
  228. data/lib/puppet/provider/user/openbsd.rb +1 -1
  229. data/lib/puppet/provider/user/pw.rb +1 -1
  230. data/lib/puppet/provider/user/user_role_add.rb +7 -1
  231. data/lib/puppet/provider/user/useradd.rb +36 -6
  232. data/lib/puppet/provider/user/windows_adsi.rb +1 -1
  233. data/lib/puppet/provider/yumrepo/inifile.rb +2 -4
  234. data/lib/puppet/provider/zfs/zfs.rb +23 -3
  235. data/lib/puppet/provider/zpool/zpool.rb +1 -1
  236. data/lib/puppet/reference/configuration.rb +0 -2
  237. data/lib/puppet/reference/type.rb +0 -1
  238. data/lib/puppet/resource.rb +1 -2
  239. data/lib/puppet/resource/catalog.rb +1 -1
  240. data/lib/puppet/resource/status.rb +0 -1
  241. data/lib/puppet/resource/type.rb +4 -4
  242. data/lib/puppet/resource/type_collection.rb +1 -1
  243. data/lib/puppet/settings/base_setting.rb +1 -1
  244. data/lib/puppet/settings/environment_conf.rb +0 -1
  245. data/lib/puppet/settings/ini_file.rb +66 -12
  246. data/lib/puppet/ssl/certificate_authority.rb +1 -1
  247. data/lib/puppet/ssl/certificate_request.rb +2 -2
  248. data/lib/puppet/ssl/certificate_revocation_list.rb +2 -1
  249. data/lib/puppet/ssl/certificate_signer.rb +11 -0
  250. data/lib/puppet/ssl/host.rb +2 -2
  251. data/lib/puppet/syntax_checkers/base64.rb +1 -1
  252. data/lib/puppet/transaction.rb +37 -14
  253. data/lib/puppet/transaction/report.rb +3 -1
  254. data/lib/puppet/type.rb +17 -4
  255. data/lib/puppet/type/cron.rb +1 -1
  256. data/lib/puppet/type/exec.rb +5 -4
  257. data/lib/puppet/type/file.rb +3 -3
  258. data/lib/puppet/type/file/checksum.rb +7 -1
  259. data/lib/puppet/type/file/checksum_value.rb +4 -3
  260. data/lib/puppet/type/group.rb +3 -0
  261. data/lib/puppet/type/k5login.rb +101 -0
  262. data/lib/puppet/type/macauthorization.rb +1 -1
  263. data/lib/puppet/type/mount.rb +6 -2
  264. data/lib/puppet/type/tidy.rb +6 -4
  265. data/lib/puppet/type/user.rb +26 -39
  266. data/lib/puppet/type/yumrepo.rb +9 -0
  267. data/lib/puppet/type/zfs.rb +4 -0
  268. data/lib/puppet/util.rb +8 -15
  269. data/lib/puppet/util/character_encoding.rb +2 -2
  270. data/lib/puppet/util/checksums.rb +82 -1
  271. data/lib/puppet/util/errors.rb +0 -2
  272. data/lib/puppet/util/filetype.rb +2 -2
  273. data/lib/puppet/util/json_lockfile.rb +1 -1
  274. data/lib/puppet/util/log.rb +1 -1
  275. data/lib/puppet/util/log/destinations.rb +10 -1
  276. data/lib/puppet/util/monkey_patches.rb +1 -1
  277. data/lib/puppet/util/network_device/cisco/device.rb +5 -5
  278. data/lib/puppet/util/network_device/config.rb +2 -3
  279. data/lib/puppet/util/platform.rb +13 -0
  280. data/lib/puppet/util/plist.rb +4 -4
  281. data/lib/puppet/util/rdoc/generators/puppet_generator.rb +2 -2
  282. data/lib/puppet/util/rdoc/parser/puppet_parser_rdoc2.rb +1 -1
  283. data/lib/puppet/util/reference.rb +8 -1
  284. data/lib/puppet/util/windows/adsi.rb +18 -15
  285. data/lib/puppet/util/windows/principal.rb +6 -7
  286. data/lib/puppet/util/windows/process.rb +1 -1
  287. data/lib/puppet/util/windows/registry.rb +2 -2
  288. data/lib/puppet/util/windows/sid.rb +7 -62
  289. data/lib/puppet/vendor/deep_merge/README.md +2 -2
  290. data/lib/puppet/vendor/pathspec/lib/pathspec/gitignorespec.rb +18 -18
  291. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/version.rb +2 -2
  292. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/version_range.rb +5 -5
  293. data/lib/puppet/vendor/semantic_puppet/locales/config.yaml +1 -1
  294. data/lib/puppet/version.rb +1 -1
  295. data/lib/puppet_pal.rb +874 -0
  296. data/locales/ja/puppet.po +140 -163
  297. data/locales/puppet.pot +940 -597
  298. data/man/man5/puppet.conf.5 +16 -91
  299. data/man/man8/puppet-agent.8 +2 -6
  300. data/man/man8/puppet-apply.8 +2 -2
  301. data/man/man8/puppet-ca.8 +1 -1
  302. data/man/man8/puppet-catalog.8 +1 -1
  303. data/man/man8/puppet-cert.8 +1 -1
  304. data/man/man8/puppet-certificate.8 +1 -1
  305. data/man/man8/puppet-certificate_request.8 +1 -1
  306. data/man/man8/puppet-certificate_revocation_list.8 +1 -1
  307. data/man/man8/puppet-config.8 +1 -1
  308. data/man/man8/puppet-describe.8 +1 -1
  309. data/man/man8/puppet-device.8 +11 -33
  310. data/man/man8/puppet-doc.8 +1 -1
  311. data/man/man8/puppet-epp.8 +1 -1
  312. data/man/man8/puppet-facts.8 +1 -1
  313. data/man/man8/puppet-filebucket.8 +4 -22
  314. data/man/man8/puppet-generate.8 +1 -1
  315. data/man/man8/puppet-help.8 +1 -1
  316. data/man/man8/puppet-key.8 +1 -1
  317. data/man/man8/puppet-lookup.8 +1 -1
  318. data/man/man8/puppet-man.8 +1 -1
  319. data/man/man8/puppet-master.8 +1 -1
  320. data/man/man8/puppet-module.8 +2 -11
  321. data/man/man8/puppet-node.8 +1 -1
  322. data/man/man8/puppet-parser.8 +1 -1
  323. data/man/man8/puppet-plugin.8 +1 -1
  324. data/man/man8/puppet-report.8 +1 -1
  325. data/man/man8/puppet-resource.8 +1 -1
  326. data/man/man8/puppet-status.8 +1 -1
  327. data/man/man8/puppet.8 +2 -2
  328. data/spec/integration/application/lookup_spec.rb +0 -21
  329. data/spec/integration/parser/compiler_spec.rb +18 -0
  330. data/spec/integration/parser/script_compiler_spec.rb +113 -0
  331. data/spec/integration/provider/mount_spec.rb +2 -0
  332. data/spec/integration/type/file_spec.rb +11 -3
  333. data/spec/integration/util/windows/adsi_spec.rb +1 -86
  334. data/spec/integration/util/windows/principal_spec.rb +1 -10
  335. data/spec/shared_contexts/checksum.rb +4 -1
  336. data/spec/shared_contexts/digests.rb +46 -1
  337. data/spec/shared_contexts/types_setup.rb +8 -3
  338. data/spec/unit/agent_spec.rb +2 -2
  339. data/spec/unit/application/cert_spec.rb +5 -17
  340. data/spec/unit/application/device_spec.rb +2 -96
  341. data/spec/unit/application/filebucket_spec.rb +18 -4
  342. data/spec/unit/configurer/plugin_handler_spec.rb +5 -32
  343. data/spec/unit/configurer_spec.rb +3 -3
  344. data/spec/unit/datatypes_spec.rb +304 -0
  345. data/spec/unit/defaults_spec.rb +41 -20
  346. data/spec/unit/face/config_spec.rb +46 -1
  347. data/spec/unit/face/epp_face_spec.rb +7 -3
  348. data/spec/unit/face/module/search_spec.rb +11 -0
  349. data/spec/unit/face/parser_spec.rb +2 -2
  350. data/spec/unit/file_bucket/dipper_spec.rb +12 -1
  351. data/spec/unit/forge/module_release_spec.rb +70 -0
  352. data/spec/unit/functions/break_spec.rb +34 -2
  353. data/spec/unit/functions/contain_spec.rb +1 -0
  354. data/spec/unit/functions/convert_to_spec.rb +22 -0
  355. data/spec/unit/functions/epp_spec.rb +5 -0
  356. data/spec/unit/functions/include_spec.rb +15 -0
  357. data/spec/unit/functions/module_directory_spec.rb +43 -0
  358. data/spec/unit/functions/new_spec.rb +14 -14
  359. data/spec/unit/functions/require_spec.rb +2 -0
  360. data/spec/unit/functions/shared.rb +12 -0
  361. data/spec/unit/functions/step_spec.rb +1 -1
  362. data/spec/unit/functions4_spec.rb +49 -4
  363. data/spec/unit/indirector/catalog/compiler_spec.rb +3 -3
  364. data/spec/unit/indirector/file_bucket_file/file_spec.rb +148 -94
  365. data/spec/unit/indirector/node/ldap_spec.rb +15 -12
  366. data/spec/unit/indirector/rest_spec.rb +0 -43
  367. data/spec/unit/interface/action_spec.rb +33 -0
  368. data/spec/unit/module_tool/applications/builder_spec.rb +7 -0
  369. data/spec/unit/module_tool/applications/installer_spec.rb +8 -0
  370. data/spec/unit/module_tool/applications/uninstaller_spec.rb +8 -0
  371. data/spec/unit/module_tool/applications/upgrader_spec.rb +6 -0
  372. data/spec/unit/network/http/connection_spec.rb +1 -1
  373. data/spec/unit/network/http/factory_spec.rb +28 -35
  374. data/spec/unit/parser/compiler_spec.rb +0 -8
  375. data/spec/unit/parser/environment_compiler_spec.rb +36 -0
  376. data/spec/unit/parser/functions/create_resources_spec.rb +9 -0
  377. data/spec/unit/parser/functions/inline_template_spec.rb +7 -0
  378. data/spec/unit/parser/functions/realize_spec.rb +9 -0
  379. data/spec/unit/parser/functions/tag_spec.rb +7 -0
  380. data/spec/unit/parser/functions/tagged_spec.rb +25 -0
  381. data/spec/unit/parser/functions/template_spec.rb +8 -0
  382. data/spec/unit/parser/scope_spec.rb +19 -0
  383. data/spec/unit/pops/evaluator/conditionals_spec.rb +1 -1
  384. data/spec/unit/pops/loaders/loader_spec.rb +516 -0
  385. data/spec/unit/pops/loaders/loaders_spec.rb +11 -0
  386. data/spec/unit/pops/loaders/module_loaders_spec.rb +43 -0
  387. data/spec/unit/pops/loaders/static_loader_spec.rb +15 -7
  388. data/spec/unit/pops/model/model_spec.rb +5 -0
  389. data/spec/unit/pops/parser/lexer2_spec.rb +15 -0
  390. data/spec/unit/pops/parser/locator_spec.rb +20 -0
  391. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +33 -0
  392. data/spec/unit/pops/parser/parse_calls_spec.rb +28 -0
  393. data/spec/unit/pops/parser/parse_conditionals_spec.rb +12 -0
  394. data/spec/unit/pops/parser/parse_plan_spec.rb +48 -0
  395. data/spec/unit/pops/serialization/packer_spec.rb +8 -0
  396. data/spec/unit/pops/serialization/serialization_spec.rb +30 -0
  397. data/spec/unit/pops/serialization/to_from_hr_spec.rb +31 -0
  398. data/spec/unit/pops/types/error_spec.rb +207 -0
  399. data/spec/unit/pops/types/p_init_type_spec.rb +98 -0
  400. data/spec/unit/pops/types/p_object_type_spec.rb +275 -10
  401. data/spec/unit/pops/types/p_uri_type_spec.rb +191 -0
  402. data/spec/unit/pops/types/ruby_generator_spec.rb +82 -44
  403. data/spec/unit/pops/types/task_spec.rb +353 -0
  404. data/spec/unit/pops/types/type_calculator_spec.rb +76 -5
  405. data/spec/unit/pops/types/type_formatter_spec.rb +31 -13
  406. data/spec/unit/pops/types/type_parser_spec.rb +13 -1
  407. data/spec/unit/pops/types/types_spec.rb +60 -0
  408. data/spec/unit/pops/validator/validator_spec.rb +76 -0
  409. data/spec/unit/provider/group/groupadd_spec.rb +77 -1
  410. data/spec/unit/provider/group/pw_spec.rb +4 -4
  411. data/spec/unit/provider/group/windows_adsi_spec.rb +22 -79
  412. data/spec/unit/provider/mount_spec.rb +18 -5
  413. data/spec/unit/provider/nameservice_spec.rb +5 -5
  414. data/spec/unit/provider/package/dnf_spec.rb +2 -2
  415. data/spec/unit/provider/package/gem_spec.rb +1 -1
  416. data/spec/unit/provider/package/pkg_spec.rb +3 -0
  417. data/spec/unit/provider/package/yum_spec.rb +40 -0
  418. data/spec/unit/provider/service/launchd_spec.rb +2 -1
  419. data/spec/unit/provider/service/redhat_spec.rb +5 -0
  420. data/spec/unit/provider/service/systemd_spec.rb +1 -1
  421. data/spec/unit/provider/user/hpux_spec.rb +2 -2
  422. data/spec/unit/provider/user/openbsd_spec.rb +2 -2
  423. data/spec/unit/provider/user/pw_spec.rb +14 -14
  424. data/spec/unit/provider/user/user_role_add_spec.rb +19 -2
  425. data/spec/unit/provider/user/useradd_spec.rb +188 -22
  426. data/spec/unit/provider/user/windows_adsi_spec.rb +4 -4
  427. data/spec/unit/provider/zfs/zfs_spec.rb +55 -1
  428. data/spec/unit/provider_spec.rb +48 -0
  429. data/spec/unit/puppet_pal_2pec.rb +1005 -0
  430. data/spec/unit/puppet_pal_spec.rb +11 -0
  431. data/spec/unit/settings/ini_file_spec.rb +313 -2
  432. data/spec/unit/ssl/certificate_request_spec.rb +42 -1
  433. data/spec/unit/ssl/certificate_revocation_list_spec.rb +2 -1
  434. data/spec/unit/transaction/report_spec.rb +1 -0
  435. data/spec/unit/transaction_spec.rb +112 -21
  436. data/spec/unit/type/file/checksum_spec.rb +20 -0
  437. data/spec/unit/type/file_spec.rb +8 -0
  438. data/spec/unit/type/group_spec.rb +8 -0
  439. data/spec/unit/type/k5login_spec.rb +22 -1
  440. data/spec/unit/type/scheduled_task_spec.rb +15 -0
  441. data/spec/unit/type/user_spec.rb +11 -1
  442. data/spec/unit/type/yumrepo_spec.rb +5 -0
  443. data/spec/unit/util/checksums_spec.rb +3 -3
  444. data/spec/unit/util/log/destinations_spec.rb +14 -0
  445. data/spec/unit/util/network_device/cisco/device_spec.rb +1 -1
  446. data/spec/unit/util/plist_spec.rb +3 -3
  447. data/spec/unit/util/windows/adsi_spec.rb +27 -31
  448. data/spec/unit/util/windows/sid_spec.rb +15 -86
  449. data/spec/unit/util_spec.rb +17 -3
  450. data/tasks/manpages.rake +1 -1
  451. metadata +216 -178
  452. data/lib/puppet/bindings.rb +0 -148
  453. data/lib/puppet/configurer/downloader_factory.rb +0 -44
  454. data/spec/unit/configurer/downloader_factory_spec.rb +0 -129
@@ -0,0 +1,218 @@
1
+ module Puppet::Pops
2
+ module Types
3
+
4
+ # Base class for Parameterized Object implementations. The wrapper impersonates the base
5
+ # object and extends it with methods to filter assignable types and instances based on parameter
6
+ # values.
7
+ #
8
+ # @api public
9
+ class PObjectTypeExtension < PAnyType
10
+ include TypeWithMembers
11
+
12
+ def self.register_ptype(loader, ir)
13
+ create_ptype(loader, ir, 'AnyType',
14
+ 'base_type' => {
15
+ KEY_TYPE => PTypeType::DEFAULT
16
+ },
17
+ 'init_parameters' => {
18
+ KEY_TYPE => PArrayType::DEFAULT
19
+ }
20
+ )
21
+ end
22
+
23
+ attr_reader :base_type, :parameters
24
+
25
+ # @api private
26
+ def self.create(base_type, init_parameters)
27
+ impl_class = Loaders.implementation_registry.module_for_type("#{base_type.name}TypeExtension") || self
28
+ impl_class.new(base_type, init_parameters)
29
+ end
30
+
31
+ # Creates an array of type parameters from the attributes of the given instance that matches the
32
+ # type parameters by name. Type parameters for which there is no matching attribute
33
+ # will have `nil` in their corresponding position on the array. The array is then passed
34
+ # as the `init_parameters` argument in a call to `create`
35
+ #
36
+ # @return [PObjectTypeExtension] the created extension
37
+ # @api private
38
+ def self.create_from_instance(base_type, instance)
39
+ type_parameters = base_type.type_parameters(true)
40
+ attrs = base_type.attributes(true)
41
+ params = type_parameters.keys.map do |pn|
42
+ attr = attrs[pn]
43
+ attr.nil? ? nil : instance.send(pn)
44
+ end
45
+ create(base_type, params)
46
+ end
47
+
48
+ def [](name)
49
+ @base_type[name]
50
+ end
51
+
52
+ # @api private
53
+ def initialize(base_type, init_parameters)
54
+ pts = base_type.type_parameters(true)
55
+ raise Puppet::ParseError, _('The %{label}-Type cannot be parameterized using []') % { label: base_type.label } if pts.empty?
56
+ @base_type = base_type
57
+
58
+ named_args = init_parameters.size == 1 && init_parameters[0].is_a?(Hash)
59
+ if named_args
60
+ # Catch case when first parameter is an assignable Hash
61
+ named_args = pts.size >= 1 && !pts.values[0].type.instance?(init_parameters[0])
62
+ end
63
+
64
+ by_name = {}
65
+ if named_args
66
+ hash = init_parameters[0]
67
+ hash.each_pair do |pn, pv|
68
+ tp = pts[pn]
69
+ if tp.nil?
70
+ raise Puppet::ParseError, _("'%{pn}' is not a known type parameter for %{label}-Type") % { pn: pn, label: base_type.label }
71
+ end
72
+ by_name[pn] = check_param(tp, pv) unless pv == :default
73
+ end
74
+ else
75
+ pts.values.each_with_index do |tp, idx|
76
+ if idx < init_parameters.size
77
+ pv = init_parameters[idx]
78
+ by_name[tp.name] = check_param(tp, pv) unless pv == :default
79
+ end
80
+ end
81
+ end
82
+ if by_name.empty?
83
+ raise Puppet::ParseError, _('The %{label}-Type cannot be parameterized using an empty parameter list') % { label: base_type.label }
84
+ end
85
+ @parameters = by_name
86
+ end
87
+
88
+ def check_param(type_param, v)
89
+ TypeAsserter.assert_instance_of(nil, type_param.type, v) { type_param.label }
90
+ end
91
+
92
+ # Return the parameter values as positional arguments with unset values as :default. The
93
+ # array is stripped from trailing :default values
94
+ # @return [Array] the parameter values
95
+ # @api private
96
+ def init_parameters
97
+ pts = @base_type.type_parameters(true)
98
+ if pts.size > 2
99
+ @parameters
100
+ else
101
+ result = pts.values.map do |tp|
102
+ pn = tp.name
103
+ @parameters.include?(pn) ? @parameters[pn] : :default
104
+ end
105
+ # Remove trailing defaults
106
+ result.pop while result.last == :default
107
+ result
108
+ end
109
+ end
110
+
111
+ # @api private
112
+ def eql?(o)
113
+ super(o) && @base_type.eql?(o.base_type) && @parameters.eql?(o.parameters)
114
+ end
115
+
116
+ # @api private
117
+ def generalize
118
+ @base_type
119
+ end
120
+
121
+ # @api private
122
+ def hash
123
+ @base_type.hash ^ @parameters.hash
124
+ end
125
+
126
+ # @api private
127
+ def loader
128
+ @base_type.loader
129
+ end
130
+
131
+ # @api private
132
+ def check_self_recursion(originator)
133
+ @base_type.check_self_recursion(originator)
134
+ end
135
+
136
+ # @api private
137
+ def create(*args)
138
+ @base_type.create(*args)
139
+ end
140
+
141
+ # @api private
142
+ def instance?(o, guard = nil)
143
+ @base_type.instance?(o, guard) && test_instance?(o, guard)
144
+ end
145
+
146
+ # @api private
147
+ def new_function
148
+ @base_type.new_function
149
+ end
150
+
151
+ # @api private
152
+ def simple_name
153
+ @base_type.simple_name
154
+ end
155
+
156
+ protected
157
+
158
+ # Checks that the given `param_values` hash contains all keys present in the `parameters` of
159
+ # this instance and that each keyed value is a match for the given parameter. The match is done
160
+ # using case expression semantics.
161
+ #
162
+ # This method is only called when a given type is found to be assignable to the base type of
163
+ # this extension.
164
+ #
165
+ # @param param_values[Hash] the parameter values of the assignable type
166
+ # @param guard[RecursionGuard] guard against endless recursion
167
+ # @return [Boolean] true or false to indicate assignability
168
+ # @api public
169
+ def test_assignable?(param_values, guard)
170
+ # Default implementation performs case expression style matching of all parameter values
171
+ # provided that the value exist (this should always be the case, since all defaults have
172
+ # been assigned at this point)
173
+ eval = Parser::EvaluatingParser.singleton.evaluator
174
+ @parameters.keys.all? do |pn|
175
+ if param_values.include?(pn)
176
+ a = param_values[pn]
177
+ b = @parameters[pn]
178
+ eval.match?(a, b) || a.is_a?(PAnyType) && b.is_a?(PAnyType) && b.assignable?(a)
179
+ else
180
+ false
181
+ end
182
+ end
183
+ end
184
+
185
+ # Checks that the given instance `o` has one attribute for each key present in the `parameters` of
186
+ # this instance and that each attribute value is a match for the given parameter. The match is done
187
+ # using case expression semantics.
188
+ #
189
+ # This method is only called when the given value is found to be an instance of the base type of
190
+ # this extension.
191
+ #
192
+ # @param o [Object] the instance to test
193
+ # @param guard[RecursionGuard] guard against endless recursion
194
+ # @return [Boolean] true or false to indicate if the value is an instance or not
195
+ # @api public
196
+ def test_instance?(o, guard)
197
+ eval = Parser::EvaluatingParser.singleton.evaluator
198
+ @parameters.keys.all? do |pn|
199
+ begin
200
+ m = o.public_method(pn)
201
+ m.arity == 0 ? eval.match?(m.call, @parameters[pn]) : false
202
+ rescue NameError
203
+ false
204
+ end
205
+ end
206
+ end
207
+
208
+ # @api private
209
+ def _assignable?(o, guard = nil)
210
+ if o.is_a?(PObjectTypeExtension)
211
+ @base_type.assignable?(o.base_type, guard) && test_assignable?(o.parameters, guard)
212
+ else
213
+ @base_type.assignable?(o, guard) && test_assignable?(EMPTY_HASH, guard)
214
+ end
215
+ end
216
+ end
217
+ end
218
+ end
@@ -107,7 +107,6 @@ class PSemVerRangeType < PAnyType
107
107
  end
108
108
 
109
109
  def self.new_function(type)
110
- range_expr = "\\A#{range_pattern}\\Z"
111
110
  @new_function ||= Puppet::Functions.create_loaded_function(:new_VersionRange, type.loader) do
112
111
  local_types do
113
112
  type 'SemVerRangeString = String[1]'
@@ -60,14 +60,14 @@ class PSemVerType < PScalarType
60
60
  local_types do
61
61
  type 'PositiveInteger = Integer[0,default]'
62
62
  type 'SemVerQualifier = Pattern[/\A(?<part>[0-9A-Za-z-]+)(?:\.\g<part>)*\Z/]'
63
- type 'SemVerString = String[1]'
63
+ type "SemVerPattern = Pattern[/\\A#{SemanticPuppet::Version::REGEX_FULL}\\Z/]"
64
64
  type 'SemVerHash = Struct[{major=>PositiveInteger,minor=>PositiveInteger,patch=>PositiveInteger,Optional[prerelease]=>SemVerQualifier,Optional[build]=>SemVerQualifier}]'
65
65
  end
66
66
 
67
67
  # Creates a SemVer from a string as specified by http://semver.org/
68
68
  #
69
69
  dispatch :from_string do
70
- param 'SemVerString', :str
70
+ param 'SemVerPattern', :str
71
71
  end
72
72
 
73
73
  # Creates a SemVer from integers, prerelease, and build arguments
@@ -86,6 +86,10 @@ class PSemVerType < PScalarType
86
86
  param 'SemVerHash', :hash_args
87
87
  end
88
88
 
89
+ argument_mismatch :on_error do
90
+ param 'String', :str
91
+ end
92
+
89
93
  def from_string(str)
90
94
  SemanticPuppet::Version.parse(str)
91
95
  end
@@ -97,6 +101,10 @@ class PSemVerType < PScalarType
97
101
  def from_hash(hash)
98
102
  SemanticPuppet::Version.new(hash['major'], hash['minor'], hash['patch'], hash['prerelease'], hash['build'])
99
103
  end
104
+
105
+ def on_error(str)
106
+ _("The string '%{str}' cannot be converted to a SemVer") % { str: str }
107
+ end
100
108
  end
101
109
  end
102
110
 
@@ -227,7 +227,6 @@ class PTypeSetType < PMetaType
227
227
  def name_for(t, default_name)
228
228
  key = @types.key(t)
229
229
  if key.nil?
230
- qname = t.name
231
230
  if @references.empty?
232
231
  default_name
233
232
  else
@@ -0,0 +1,190 @@
1
+ module Puppet::Pops
2
+ module Types
3
+ class PURIType < PAnyType
4
+
5
+ # Tell evaluator that an members of instances of this type can be invoked using dot notation
6
+ include TypeWithMembers
7
+
8
+ SCHEME = 'scheme'.freeze
9
+ USERINFO = 'userinfo'.freeze
10
+ HOST = 'host'.freeze
11
+ PORT = 'port'.freeze
12
+ PATH = 'path'.freeze
13
+ QUERY = 'query'.freeze
14
+ FRAGMENT = 'fragment'.freeze
15
+ OPAQUE = 'opaque'.freeze
16
+
17
+ URI_MEMBERS = {
18
+ SCHEME => AttrReader.new(SCHEME),
19
+ USERINFO => AttrReader.new(USERINFO),
20
+ HOST => AttrReader.new(HOST),
21
+ PORT => AttrReader.new(PORT),
22
+ PATH => AttrReader.new(PATH),
23
+ QUERY => AttrReader.new(QUERY),
24
+ FRAGMENT => AttrReader.new(FRAGMENT),
25
+ OPAQUE => AttrReader.new(OPAQUE),
26
+ }
27
+
28
+ TYPE_URI_INIT_HASH = TypeFactory.struct(
29
+ TypeFactory.optional(SCHEME) => PStringType::NON_EMPTY,
30
+ TypeFactory.optional(USERINFO) => PStringType::NON_EMPTY,
31
+ TypeFactory.optional(HOST) => PStringType::NON_EMPTY,
32
+ TypeFactory.optional(PORT) => PIntegerType.new(0),
33
+ TypeFactory.optional(PATH) => PStringType::NON_EMPTY,
34
+ TypeFactory.optional(QUERY) => PStringType::NON_EMPTY,
35
+ TypeFactory.optional(FRAGMENT) => PStringType::NON_EMPTY,
36
+ TypeFactory.optional(OPAQUE) => PStringType::NON_EMPTY,
37
+ )
38
+
39
+ TYPE_STRING_PARAM = TypeFactory.optional(PVariantType.new([
40
+ PStringType::NON_EMPTY,
41
+ PRegexpType::DEFAULT,
42
+ TypeFactory.type_type(PPatternType::DEFAULT),
43
+ TypeFactory.type_type(PEnumType::DEFAULT),
44
+ TypeFactory.type_type(PNotUndefType::DEFAULT),
45
+ TypeFactory.type_type(PUndefType::DEFAULT),
46
+ ]))
47
+
48
+ TYPE_INTEGER_PARAM = TypeFactory.optional(PVariantType.new([
49
+ PIntegerType.new(0),
50
+ TypeFactory.type_type(PNotUndefType::DEFAULT),
51
+ TypeFactory.type_type(PUndefType::DEFAULT),
52
+ ]))
53
+
54
+ TYPE_URI_PARAM_HASH_TYPE = TypeFactory.struct(
55
+ TypeFactory.optional(SCHEME) => TYPE_STRING_PARAM,
56
+ TypeFactory.optional(USERINFO) => TYPE_STRING_PARAM,
57
+ TypeFactory.optional(HOST) => TYPE_STRING_PARAM,
58
+ TypeFactory.optional(PORT) => TYPE_INTEGER_PARAM,
59
+ TypeFactory.optional(PATH) => TYPE_STRING_PARAM,
60
+ TypeFactory.optional(QUERY) => TYPE_STRING_PARAM,
61
+ TypeFactory.optional(FRAGMENT) => TYPE_STRING_PARAM,
62
+ TypeFactory.optional(OPAQUE) => TYPE_STRING_PARAM,
63
+ )
64
+
65
+ TYPE_URI_PARAM_TYPE = PVariantType.new([PStringType::NON_EMPTY, TYPE_URI_PARAM_HASH_TYPE])
66
+
67
+ def self.register_ptype(loader, ir)
68
+ create_ptype(loader, ir, 'AnyType',
69
+ {
70
+ 'parameters' => { KEY_TYPE => TypeFactory.optional(TYPE_URI_PARAM_TYPE), KEY_VALUE => nil }
71
+ }
72
+ )
73
+ end
74
+
75
+ def self.new_function(type)
76
+ @new_function ||= Puppet::Functions.create_loaded_function(:new_error, type.loader) do
77
+ dispatch :create do
78
+ param 'String[1]', :uri
79
+ end
80
+
81
+ dispatch :from_hash do
82
+ param TYPE_URI_INIT_HASH, :hash
83
+ end
84
+
85
+ def create(uri)
86
+ URI.parse(uri)
87
+ end
88
+
89
+ def from_hash(init_hash)
90
+ sym_hash = {}
91
+ init_hash.each_pair { |k, v| sym_hash[k.to_sym] = v }
92
+ scheme = sym_hash[:scheme]
93
+ scheme_class = scheme.nil? ? URI::Generic : (URI.scheme_list[scheme.upcase] || URI::Generic)
94
+ scheme_class.build(sym_hash)
95
+ end
96
+ end
97
+ end
98
+
99
+ attr_reader :parameters
100
+
101
+ def initialize(parameters = nil)
102
+ if parameters.is_a?(String)
103
+ parameters = TypeAsserter.assert_instance_of('URI-Type parameter', Pcore::TYPE_URI, parameters, true)
104
+ @parameters = uri_to_hash(URI.parse(parameters))
105
+ elsif parameters.is_a?(URI)
106
+ @parameters = uri_to_hash(parameters)
107
+ elsif parameters.is_a?(Hash)
108
+ params = TypeAsserter.assert_instance_of('URI-Type parameter', TYPE_URI_PARAM_TYPE, parameters, true)
109
+ @parameters = params.empty? ? nil : params
110
+ end
111
+ end
112
+
113
+ def eql?(o)
114
+ self.class == o.class && @parameters == o.parameters
115
+ end
116
+
117
+ def ==(o)
118
+ eql?(o)
119
+ end
120
+
121
+ def [](key)
122
+ URI_MEMBERS[key]
123
+ end
124
+
125
+ def generalize
126
+ DEFAULT
127
+ end
128
+
129
+ def hash
130
+ self.class.hash ^ @parameters.hash
131
+ end
132
+
133
+ def instance?(o, guard = nil)
134
+ return false unless o.is_a?(URI)
135
+ return true if @parameters.nil?
136
+
137
+ eval = Parser::EvaluatingParser.singleton.evaluator
138
+ @parameters.keys.all? { |pn| eval.match?(o.send(pn), @parameters[pn]) }
139
+ end
140
+
141
+ def roundtrip_with_string?
142
+ true
143
+ end
144
+
145
+ def _pcore_init_hash
146
+ @parameters == nil? ? EMPTY_HASH : { 'parameters' => @parameters }
147
+ end
148
+
149
+ protected
150
+
151
+ def _assignable?(o, guard = nil)
152
+ return false unless o.class == self.class
153
+ return true if @parameters.nil?
154
+ o_params = o.parameters || EMPTY_HASH
155
+
156
+ eval = Parser::EvaluatingParser.singleton.evaluator
157
+ @parameters.keys.all? do |pn|
158
+ if o_params.include?(pn)
159
+ a = o_params[pn]
160
+ b = @parameters[pn]
161
+ eval.match?(a, b) || a.is_a?(PAnyType) && b.is_a?(PAnyType) && b.assignable?(a)
162
+ else
163
+ false
164
+ end
165
+ end
166
+ end
167
+
168
+ private
169
+
170
+ def uri_to_hash(uri)
171
+ result = {}
172
+ scheme = uri.scheme
173
+ unless scheme.nil?
174
+ scheme = scheme.downcase
175
+ result[SCHEME] = scheme
176
+ end
177
+ result[USERINFO] = uri.userinfo unless uri.userinfo.nil?
178
+ result[HOST] = uri.host.downcase unless uri.host.nil?
179
+ result[PORT] = uri.port.to_s unless uri.port.nil? || uri.port == 80 && 'http' == scheme || uri.port == 443 && 'https' == scheme
180
+ result[PATH] = uri.path unless uri.path.nil? || uri.path.empty?
181
+ result[QUERY] = uri.query unless uri.query.nil?
182
+ result[FRAGMENT] = uri.fragment unless uri.fragment.nil?
183
+ result[OPAQUE] = uri.opaque unless uri.opaque.nil?
184
+ result.empty? ? nil : result
185
+ end
186
+
187
+ DEFAULT = PURIType.new(nil)
188
+ end
189
+ end
190
+ end