openvox 8.19.0

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 (1104) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +19 -0
  3. data/CODEOWNERS +11 -0
  4. data/CODE_OF_CONDUCT.md +70 -0
  5. data/Gemfile +87 -0
  6. data/Guardfile.example +76 -0
  7. data/LICENSE +202 -0
  8. data/README.md +63 -0
  9. data/Rakefile +170 -0
  10. data/bin/puppet +10 -0
  11. data/conf/environment.conf +18 -0
  12. data/conf/fileserver.conf +32 -0
  13. data/conf/hiera.yaml +11 -0
  14. data/conf/puppet.conf +6 -0
  15. data/examples/enc/regexp_nodes/classes/databases +2 -0
  16. data/examples/enc/regexp_nodes/classes/webservers +2 -0
  17. data/examples/enc/regexp_nodes/environment/development +2 -0
  18. data/examples/enc/regexp_nodes/parameters/service/prod +1 -0
  19. data/examples/enc/regexp_nodes/parameters/service/qa +3 -0
  20. data/examples/enc/regexp_nodes/parameters/service/sandbox +1 -0
  21. data/examples/enc/regexp_nodes/regexp_nodes.rb +270 -0
  22. data/examples/hiera/README.md +102 -0
  23. data/examples/hiera/data/common.yaml +12 -0
  24. data/examples/hiera/data/dc1.yaml +6 -0
  25. data/examples/hiera/hiera.yaml +15 -0
  26. data/examples/hiera/modules/ntp/data/common.yaml +4 -0
  27. data/examples/hiera/modules/ntp/hiera.yaml +9 -0
  28. data/examples/hiera/modules/ntp/manifests/config.pp +18 -0
  29. data/examples/hiera/modules/ntp/templates/ntp.conf.epp +3 -0
  30. data/examples/hiera/modules/users/manifests/common.pp +9 -0
  31. data/examples/hiera/modules/users/manifests/dc1.pp +9 -0
  32. data/examples/hiera/site.pp +3 -0
  33. data/examples/nagios/check_puppet.rb +123 -0
  34. data/ext/README.md +13 -0
  35. data/ext/build_defaults.yaml +18 -0
  36. data/ext/debian/puppet.default +4 -0
  37. data/ext/debian/puppet.init +113 -0
  38. data/ext/hiera/hiera.yaml +15 -0
  39. data/ext/osx/puppet.plist +32 -0
  40. data/ext/project_data.yaml +20 -0
  41. data/ext/redhat/client.init +169 -0
  42. data/ext/redhat/client.sysconfig +2 -0
  43. data/ext/solaris/smf/puppet +44 -0
  44. data/ext/solaris/smf/puppet.xml +46 -0
  45. data/ext/suse/client.init +141 -0
  46. data/ext/systemd/puppet.service +26 -0
  47. data/ext/windows/puppet_interactive.bat +6 -0
  48. data/ext/windows/puppet_shell.bat +9 -0
  49. data/ext/windows/run_puppet_interactive.bat +9 -0
  50. data/ext/windows/service/daemon.bat +6 -0
  51. data/ext/windows/service/daemon.rb +219 -0
  52. data/install.rb +428 -0
  53. data/lib/hiera/puppet_function.rb +86 -0
  54. data/lib/hiera/scope.rb +92 -0
  55. data/lib/hiera_puppet.rb +78 -0
  56. data/lib/puppet/agent/disabler.rb +55 -0
  57. data/lib/puppet/agent/locker.rb +46 -0
  58. data/lib/puppet/agent.rb +178 -0
  59. data/lib/puppet/application/agent.rb +527 -0
  60. data/lib/puppet/application/apply.rb +435 -0
  61. data/lib/puppet/application/catalog.rb +6 -0
  62. data/lib/puppet/application/config.rb +7 -0
  63. data/lib/puppet/application/describe.rb +255 -0
  64. data/lib/puppet/application/device.rb +440 -0
  65. data/lib/puppet/application/doc.rb +232 -0
  66. data/lib/puppet/application/epp.rb +7 -0
  67. data/lib/puppet/application/face_base.rb +277 -0
  68. data/lib/puppet/application/facts.rb +11 -0
  69. data/lib/puppet/application/filebucket.rb +324 -0
  70. data/lib/puppet/application/generate.rb +7 -0
  71. data/lib/puppet/application/help.rb +7 -0
  72. data/lib/puppet/application/indirection_base.rb +6 -0
  73. data/lib/puppet/application/lookup.rb +433 -0
  74. data/lib/puppet/application/module.rb +6 -0
  75. data/lib/puppet/application/node.rb +6 -0
  76. data/lib/puppet/application/parser.rb +7 -0
  77. data/lib/puppet/application/plugin.rb +6 -0
  78. data/lib/puppet/application/report.rb +6 -0
  79. data/lib/puppet/application/resource.rb +264 -0
  80. data/lib/puppet/application/script.rb +266 -0
  81. data/lib/puppet/application/ssl.rb +331 -0
  82. data/lib/puppet/application.rb +596 -0
  83. data/lib/puppet/application_support.rb +69 -0
  84. data/lib/puppet/coercion.rb +42 -0
  85. data/lib/puppet/compilable_resource_type.rb +17 -0
  86. data/lib/puppet/concurrent/lock.rb +15 -0
  87. data/lib/puppet/concurrent/synchronized.rb +15 -0
  88. data/lib/puppet/concurrent/thread_local_singleton.rb +18 -0
  89. data/lib/puppet/concurrent.rb +4 -0
  90. data/lib/puppet/configurer/downloader.rb +91 -0
  91. data/lib/puppet/configurer/fact_handler.rb +51 -0
  92. data/lib/puppet/configurer/plugin_handler.rb +61 -0
  93. data/lib/puppet/configurer.rb +759 -0
  94. data/lib/puppet/confine/any.rb +28 -0
  95. data/lib/puppet/confine/boolean.rb +47 -0
  96. data/lib/puppet/confine/exists.rb +21 -0
  97. data/lib/puppet/confine/false.rb +27 -0
  98. data/lib/puppet/confine/feature.rb +18 -0
  99. data/lib/puppet/confine/true.rb +28 -0
  100. data/lib/puppet/confine/variable.rb +61 -0
  101. data/lib/puppet/confine.rb +86 -0
  102. data/lib/puppet/confine_collection.rb +54 -0
  103. data/lib/puppet/confiner.rb +48 -0
  104. data/lib/puppet/context/trusted_information.rb +122 -0
  105. data/lib/puppet/context.rb +190 -0
  106. data/lib/puppet/daemon.rb +198 -0
  107. data/lib/puppet/data_binding.rb +16 -0
  108. data/lib/puppet/datatypes/error.rb +23 -0
  109. data/lib/puppet/datatypes/impl/error.rb +42 -0
  110. data/lib/puppet/datatypes.rb +218 -0
  111. data/lib/puppet/defaults.rb +2316 -0
  112. data/lib/puppet/environments.rb +599 -0
  113. data/lib/puppet/error.rb +142 -0
  114. data/lib/puppet/etc.rb +185 -0
  115. data/lib/puppet/external/dot.rb +315 -0
  116. data/lib/puppet/face/catalog/select.rb +51 -0
  117. data/lib/puppet/face/catalog.rb +167 -0
  118. data/lib/puppet/face/config.rb +266 -0
  119. data/lib/puppet/face/epp.rb +565 -0
  120. data/lib/puppet/face/facts.rb +176 -0
  121. data/lib/puppet/face/generate.rb +69 -0
  122. data/lib/puppet/face/help/action.erb +89 -0
  123. data/lib/puppet/face/help/face.erb +114 -0
  124. data/lib/puppet/face/help/global.erb +16 -0
  125. data/lib/puppet/face/help/man.erb +152 -0
  126. data/lib/puppet/face/help.rb +260 -0
  127. data/lib/puppet/face/module/changes.rb +44 -0
  128. data/lib/puppet/face/module/install.rb +149 -0
  129. data/lib/puppet/face/module/list.rb +271 -0
  130. data/lib/puppet/face/module/uninstall.rb +91 -0
  131. data/lib/puppet/face/module/upgrade.rb +89 -0
  132. data/lib/puppet/face/module.rb +21 -0
  133. data/lib/puppet/face/node/clean.rb +109 -0
  134. data/lib/puppet/face/node.rb +45 -0
  135. data/lib/puppet/face/parser.rb +226 -0
  136. data/lib/puppet/face/plugin.rb +62 -0
  137. data/lib/puppet/face/report.rb +54 -0
  138. data/lib/puppet/face/resource.rb +55 -0
  139. data/lib/puppet/face.rb +14 -0
  140. data/lib/puppet/facter_impl.rb +96 -0
  141. data/lib/puppet/feature/base.rb +76 -0
  142. data/lib/puppet/feature/bolt.rb +5 -0
  143. data/lib/puppet/feature/cfpropertylist.rb +5 -0
  144. data/lib/puppet/feature/eventlog.rb +7 -0
  145. data/lib/puppet/feature/hiera_eyaml.rb +5 -0
  146. data/lib/puppet/feature/hocon.rb +5 -0
  147. data/lib/puppet/feature/libuser.rb +10 -0
  148. data/lib/puppet/feature/msgpack.rb +5 -0
  149. data/lib/puppet/feature/pe_license.rb +6 -0
  150. data/lib/puppet/feature/pson.rb +6 -0
  151. data/lib/puppet/feature/selinux.rb +5 -0
  152. data/lib/puppet/feature/ssh.rb +5 -0
  153. data/lib/puppet/feature/telnet.rb +5 -0
  154. data/lib/puppet/feature/zlib.rb +7 -0
  155. data/lib/puppet/ffi/posix/constants.rb +16 -0
  156. data/lib/puppet/ffi/posix/functions.rb +25 -0
  157. data/lib/puppet/ffi/posix.rb +12 -0
  158. data/lib/puppet/ffi/windows/api_types.rb +313 -0
  159. data/lib/puppet/ffi/windows/constants.rb +406 -0
  160. data/lib/puppet/ffi/windows/functions.rb +629 -0
  161. data/lib/puppet/ffi/windows/structs.rb +339 -0
  162. data/lib/puppet/ffi/windows.rb +14 -0
  163. data/lib/puppet/file_bucket/dipper.rb +183 -0
  164. data/lib/puppet/file_bucket/file.rb +131 -0
  165. data/lib/puppet/file_bucket.rb +6 -0
  166. data/lib/puppet/file_serving/base.rb +94 -0
  167. data/lib/puppet/file_serving/configuration/parser.rb +116 -0
  168. data/lib/puppet/file_serving/configuration.rb +116 -0
  169. data/lib/puppet/file_serving/content.rb +45 -0
  170. data/lib/puppet/file_serving/fileset.rb +190 -0
  171. data/lib/puppet/file_serving/http_metadata.rb +61 -0
  172. data/lib/puppet/file_serving/metadata.rb +174 -0
  173. data/lib/puppet/file_serving/mount/file.rb +126 -0
  174. data/lib/puppet/file_serving/mount/locales.rb +35 -0
  175. data/lib/puppet/file_serving/mount/modules.rb +29 -0
  176. data/lib/puppet/file_serving/mount/pluginfacts.rb +35 -0
  177. data/lib/puppet/file_serving/mount/plugins.rb +35 -0
  178. data/lib/puppet/file_serving/mount/scripts.rb +27 -0
  179. data/lib/puppet/file_serving/mount/tasks.rb +26 -0
  180. data/lib/puppet/file_serving/mount.rb +41 -0
  181. data/lib/puppet/file_serving/terminus_helper.rb +33 -0
  182. data/lib/puppet/file_serving/terminus_selector.rb +33 -0
  183. data/lib/puppet/file_serving.rb +5 -0
  184. data/lib/puppet/file_system/file_impl.rb +189 -0
  185. data/lib/puppet/file_system/jruby.rb +25 -0
  186. data/lib/puppet/file_system/memory_file.rb +82 -0
  187. data/lib/puppet/file_system/memory_impl.rb +103 -0
  188. data/lib/puppet/file_system/path_pattern.rb +95 -0
  189. data/lib/puppet/file_system/posix.rb +52 -0
  190. data/lib/puppet/file_system/uniquefile.rb +190 -0
  191. data/lib/puppet/file_system/windows.rb +224 -0
  192. data/lib/puppet/file_system.rb +421 -0
  193. data/lib/puppet/forge/cache.rb +61 -0
  194. data/lib/puppet/forge/errors.rb +113 -0
  195. data/lib/puppet/forge/repository.rb +98 -0
  196. data/lib/puppet/forge.rb +257 -0
  197. data/lib/puppet/functions/abs.rb +64 -0
  198. data/lib/puppet/functions/alert.rb +16 -0
  199. data/lib/puppet/functions/all.rb +106 -0
  200. data/lib/puppet/functions/annotate.rb +110 -0
  201. data/lib/puppet/functions/any.rb +111 -0
  202. data/lib/puppet/functions/assert_type.rb +96 -0
  203. data/lib/puppet/functions/binary_file.rb +35 -0
  204. data/lib/puppet/functions/break.rb +49 -0
  205. data/lib/puppet/functions/call.rb +81 -0
  206. data/lib/puppet/functions/camelcase.rb +63 -0
  207. data/lib/puppet/functions/capitalize.rb +62 -0
  208. data/lib/puppet/functions/ceiling.rb +38 -0
  209. data/lib/puppet/functions/chomp.rb +58 -0
  210. data/lib/puppet/functions/chop.rb +68 -0
  211. data/lib/puppet/functions/compare.rb +127 -0
  212. data/lib/puppet/functions/contain.rb +58 -0
  213. data/lib/puppet/functions/convert_to.rb +36 -0
  214. data/lib/puppet/functions/crit.rb +16 -0
  215. data/lib/puppet/functions/debug.rb +16 -0
  216. data/lib/puppet/functions/defined.rb +163 -0
  217. data/lib/puppet/functions/dig.rb +70 -0
  218. data/lib/puppet/functions/downcase.rb +91 -0
  219. data/lib/puppet/functions/each.rb +169 -0
  220. data/lib/puppet/functions/emerg.rb +16 -0
  221. data/lib/puppet/functions/empty.rb +87 -0
  222. data/lib/puppet/functions/epp.rb +50 -0
  223. data/lib/puppet/functions/err.rb +16 -0
  224. data/lib/puppet/functions/eyaml_lookup_key.rb +103 -0
  225. data/lib/puppet/functions/filter.rb +138 -0
  226. data/lib/puppet/functions/find_file.rb +50 -0
  227. data/lib/puppet/functions/find_template.rb +65 -0
  228. data/lib/puppet/functions/flatten.rb +66 -0
  229. data/lib/puppet/functions/floor.rb +38 -0
  230. data/lib/puppet/functions/get.rb +152 -0
  231. data/lib/puppet/functions/getvar.rb +89 -0
  232. data/lib/puppet/functions/group_by.rb +62 -0
  233. data/lib/puppet/functions/hiera.rb +91 -0
  234. data/lib/puppet/functions/hiera_array.rb +83 -0
  235. data/lib/puppet/functions/hiera_hash.rb +94 -0
  236. data/lib/puppet/functions/hiera_include.rb +107 -0
  237. data/lib/puppet/functions/hocon_data.rb +41 -0
  238. data/lib/puppet/functions/import.rb +9 -0
  239. data/lib/puppet/functions/include.rb +56 -0
  240. data/lib/puppet/functions/index.rb +168 -0
  241. data/lib/puppet/functions/info.rb +16 -0
  242. data/lib/puppet/functions/inline_epp.rb +61 -0
  243. data/lib/puppet/functions/join.rb +58 -0
  244. data/lib/puppet/functions/json_data.rb +33 -0
  245. data/lib/puppet/functions/keys.rb +27 -0
  246. data/lib/puppet/functions/length.rb +45 -0
  247. data/lib/puppet/functions/lest.rb +57 -0
  248. data/lib/puppet/functions/lookup.rb +224 -0
  249. data/lib/puppet/functions/lstrip.rb +59 -0
  250. data/lib/puppet/functions/map.rb +137 -0
  251. data/lib/puppet/functions/match.rb +133 -0
  252. data/lib/puppet/functions/max.rb +250 -0
  253. data/lib/puppet/functions/min.rb +249 -0
  254. data/lib/puppet/functions/module_directory.rb +43 -0
  255. data/lib/puppet/functions/new.rb +1013 -0
  256. data/lib/puppet/functions/next.rb +35 -0
  257. data/lib/puppet/functions/notice.rb +16 -0
  258. data/lib/puppet/functions/partition.rb +62 -0
  259. data/lib/puppet/functions/reduce.rb +159 -0
  260. data/lib/puppet/functions/regsubst.rb +100 -0
  261. data/lib/puppet/functions/require.rb +81 -0
  262. data/lib/puppet/functions/return.rb +17 -0
  263. data/lib/puppet/functions/reverse_each.rb +96 -0
  264. data/lib/puppet/functions/round.rb +26 -0
  265. data/lib/puppet/functions/rstrip.rb +59 -0
  266. data/lib/puppet/functions/scanf.rb +46 -0
  267. data/lib/puppet/functions/size.rb +15 -0
  268. data/lib/puppet/functions/slice.rb +127 -0
  269. data/lib/puppet/functions/sort.rb +76 -0
  270. data/lib/puppet/functions/split.rb +78 -0
  271. data/lib/puppet/functions/step.rb +100 -0
  272. data/lib/puppet/functions/strftime.rb +214 -0
  273. data/lib/puppet/functions/strip.rb +59 -0
  274. data/lib/puppet/functions/then.rb +80 -0
  275. data/lib/puppet/functions/tree_each.rb +198 -0
  276. data/lib/puppet/functions/type.rb +74 -0
  277. data/lib/puppet/functions/unique.rb +135 -0
  278. data/lib/puppet/functions/unwrap.rb +61 -0
  279. data/lib/puppet/functions/upcase.rb +91 -0
  280. data/lib/puppet/functions/values.rb +27 -0
  281. data/lib/puppet/functions/versioncmp.rb +41 -0
  282. data/lib/puppet/functions/warning.rb +16 -0
  283. data/lib/puppet/functions/with.rb +34 -0
  284. data/lib/puppet/functions/yaml_data.rb +45 -0
  285. data/lib/puppet/functions.rb +858 -0
  286. data/lib/puppet/generate/models/type/property.rb +73 -0
  287. data/lib/puppet/generate/models/type/type.rb +68 -0
  288. data/lib/puppet/generate/templates/type/pcore.erb +42 -0
  289. data/lib/puppet/generate/type.rb +255 -0
  290. data/lib/puppet/gettext/config.rb +282 -0
  291. data/lib/puppet/gettext/module_translations.rb +43 -0
  292. data/lib/puppet/gettext/stubs.rb +13 -0
  293. data/lib/puppet/graph/key.rb +28 -0
  294. data/lib/puppet/graph/prioritizer.rb +31 -0
  295. data/lib/puppet/graph/rb_tree_map.rb +407 -0
  296. data/lib/puppet/graph/relationship_graph.rb +286 -0
  297. data/lib/puppet/graph/sequential_prioritizer.rb +33 -0
  298. data/lib/puppet/graph/simple_graph.rb +552 -0
  299. data/lib/puppet/graph.rb +11 -0
  300. data/lib/puppet/http/client.rb +529 -0
  301. data/lib/puppet/http/dns.rb +159 -0
  302. data/lib/puppet/http/errors.rb +50 -0
  303. data/lib/puppet/http/external_client.rb +89 -0
  304. data/lib/puppet/http/factory.rb +53 -0
  305. data/lib/puppet/http/pool.rb +174 -0
  306. data/lib/puppet/http/pool_entry.rb +19 -0
  307. data/lib/puppet/http/proxy.rb +139 -0
  308. data/lib/puppet/http/redirector.rb +87 -0
  309. data/lib/puppet/http/resolver/server_list.rb +88 -0
  310. data/lib/puppet/http/resolver/settings.rb +24 -0
  311. data/lib/puppet/http/resolver/srv.rb +42 -0
  312. data/lib/puppet/http/resolver.rb +50 -0
  313. data/lib/puppet/http/response.rb +104 -0
  314. data/lib/puppet/http/response_converter.rb +25 -0
  315. data/lib/puppet/http/response_net_http.rb +43 -0
  316. data/lib/puppet/http/retry_after_handler.rb +78 -0
  317. data/lib/puppet/http/service/ca.rb +133 -0
  318. data/lib/puppet/http/service/compiler.rb +356 -0
  319. data/lib/puppet/http/service/file_server.rb +200 -0
  320. data/lib/puppet/http/service/puppetserver.rb +54 -0
  321. data/lib/puppet/http/service/report.rb +62 -0
  322. data/lib/puppet/http/service.rb +177 -0
  323. data/lib/puppet/http/session.rb +124 -0
  324. data/lib/puppet/http/site.rb +44 -0
  325. data/lib/puppet/http.rb +48 -0
  326. data/lib/puppet/indirector/catalog/compiler.rb +432 -0
  327. data/lib/puppet/indirector/catalog/json.rb +42 -0
  328. data/lib/puppet/indirector/catalog/msgpack.rb +8 -0
  329. data/lib/puppet/indirector/catalog/rest.rb +51 -0
  330. data/lib/puppet/indirector/catalog/store_configs.rb +8 -0
  331. data/lib/puppet/indirector/catalog/yaml.rb +8 -0
  332. data/lib/puppet/indirector/code.rb +8 -0
  333. data/lib/puppet/indirector/data_binding/hiera.rb +8 -0
  334. data/lib/puppet/indirector/data_binding/none.rb +10 -0
  335. data/lib/puppet/indirector/direct_file_server.rb +20 -0
  336. data/lib/puppet/indirector/envelope.rb +13 -0
  337. data/lib/puppet/indirector/errors.rb +7 -0
  338. data/lib/puppet/indirector/exec.rb +40 -0
  339. data/lib/puppet/indirector/face.rb +142 -0
  340. data/lib/puppet/indirector/fact_search.rb +62 -0
  341. data/lib/puppet/indirector/facts/facter.rb +120 -0
  342. data/lib/puppet/indirector/facts/json.rb +29 -0
  343. data/lib/puppet/indirector/facts/memory.rb +11 -0
  344. data/lib/puppet/indirector/facts/network_device.rb +29 -0
  345. data/lib/puppet/indirector/facts/rest.rb +46 -0
  346. data/lib/puppet/indirector/facts/store_configs.rb +12 -0
  347. data/lib/puppet/indirector/facts/yaml.rb +31 -0
  348. data/lib/puppet/indirector/file_bucket_file/file.rb +268 -0
  349. data/lib/puppet/indirector/file_bucket_file/rest.rb +53 -0
  350. data/lib/puppet/indirector/file_bucket_file/selector.rb +54 -0
  351. data/lib/puppet/indirector/file_content/file.rb +9 -0
  352. data/lib/puppet/indirector/file_content/file_server.rb +9 -0
  353. data/lib/puppet/indirector/file_content/rest.rb +37 -0
  354. data/lib/puppet/indirector/file_content/selector.rb +32 -0
  355. data/lib/puppet/indirector/file_content.rb +7 -0
  356. data/lib/puppet/indirector/file_metadata/file.rb +9 -0
  357. data/lib/puppet/indirector/file_metadata/file_server.rb +9 -0
  358. data/lib/puppet/indirector/file_metadata/http.rb +49 -0
  359. data/lib/puppet/indirector/file_metadata/rest.rb +58 -0
  360. data/lib/puppet/indirector/file_metadata/selector.rb +32 -0
  361. data/lib/puppet/indirector/file_metadata.rb +7 -0
  362. data/lib/puppet/indirector/file_server.rb +57 -0
  363. data/lib/puppet/indirector/generic_http.rb +7 -0
  364. data/lib/puppet/indirector/hiera.rb +101 -0
  365. data/lib/puppet/indirector/indirection.rb +381 -0
  366. data/lib/puppet/indirector/json.rb +82 -0
  367. data/lib/puppet/indirector/memory.rb +37 -0
  368. data/lib/puppet/indirector/msgpack.rb +87 -0
  369. data/lib/puppet/indirector/node/exec.rb +70 -0
  370. data/lib/puppet/indirector/node/json.rb +9 -0
  371. data/lib/puppet/indirector/node/memory.rb +12 -0
  372. data/lib/puppet/indirector/node/msgpack.rb +9 -0
  373. data/lib/puppet/indirector/node/plain.rb +23 -0
  374. data/lib/puppet/indirector/node/rest.rb +31 -0
  375. data/lib/puppet/indirector/node/store_configs.rb +8 -0
  376. data/lib/puppet/indirector/node/yaml.rb +9 -0
  377. data/lib/puppet/indirector/none.rb +10 -0
  378. data/lib/puppet/indirector/plain.rb +11 -0
  379. data/lib/puppet/indirector/report/json.rb +36 -0
  380. data/lib/puppet/indirector/report/msgpack.rb +13 -0
  381. data/lib/puppet/indirector/report/processor.rb +63 -0
  382. data/lib/puppet/indirector/report/rest.rb +31 -0
  383. data/lib/puppet/indirector/report/yaml.rb +36 -0
  384. data/lib/puppet/indirector/request.rb +197 -0
  385. data/lib/puppet/indirector/resource/ral.rb +66 -0
  386. data/lib/puppet/indirector/resource/store_configs.rb +14 -0
  387. data/lib/puppet/indirector/resource/validator.rb +10 -0
  388. data/lib/puppet/indirector/rest.rb +66 -0
  389. data/lib/puppet/indirector/store_configs.rb +32 -0
  390. data/lib/puppet/indirector/terminus.rb +180 -0
  391. data/lib/puppet/indirector/yaml.rb +65 -0
  392. data/lib/puppet/indirector.rb +64 -0
  393. data/lib/puppet/info_service/class_information_service.rb +108 -0
  394. data/lib/puppet/info_service/plan_information_service.rb +38 -0
  395. data/lib/puppet/info_service/task_information_service.rb +45 -0
  396. data/lib/puppet/info_service.rb +27 -0
  397. data/lib/puppet/interface/action.rb +410 -0
  398. data/lib/puppet/interface/action_builder.rb +167 -0
  399. data/lib/puppet/interface/action_manager.rb +101 -0
  400. data/lib/puppet/interface/documentation.rb +363 -0
  401. data/lib/puppet/interface/face_collection.rb +141 -0
  402. data/lib/puppet/interface/option.rb +184 -0
  403. data/lib/puppet/interface/option_builder.rb +110 -0
  404. data/lib/puppet/interface/option_manager.rb +108 -0
  405. data/lib/puppet/interface.rb +240 -0
  406. data/lib/puppet/loaders.rb +31 -0
  407. data/lib/puppet/metatype/manager.rb +198 -0
  408. data/lib/puppet/module/plan.rb +166 -0
  409. data/lib/puppet/module/task.rb +288 -0
  410. data/lib/puppet/module.rb +487 -0
  411. data/lib/puppet/module_tool/applications/application.rb +96 -0
  412. data/lib/puppet/module_tool/applications/checksummer.rb +62 -0
  413. data/lib/puppet/module_tool/applications/installer.rb +402 -0
  414. data/lib/puppet/module_tool/applications/uninstaller.rb +121 -0
  415. data/lib/puppet/module_tool/applications/unpacker.rb +102 -0
  416. data/lib/puppet/module_tool/applications/upgrader.rb +288 -0
  417. data/lib/puppet/module_tool/applications.rb +14 -0
  418. data/lib/puppet/module_tool/checksums.rb +50 -0
  419. data/lib/puppet/module_tool/dependency.rb +42 -0
  420. data/lib/puppet/module_tool/errors/base.rb +17 -0
  421. data/lib/puppet/module_tool/errors/installer.rb +94 -0
  422. data/lib/puppet/module_tool/errors/shared.rb +228 -0
  423. data/lib/puppet/module_tool/errors/uninstaller.rb +51 -0
  424. data/lib/puppet/module_tool/errors/upgrader.rb +64 -0
  425. data/lib/puppet/module_tool/errors.rb +13 -0
  426. data/lib/puppet/module_tool/install_directory.rb +48 -0
  427. data/lib/puppet/module_tool/installed_modules.rb +99 -0
  428. data/lib/puppet/module_tool/local_tarball.rb +92 -0
  429. data/lib/puppet/module_tool/metadata.rb +227 -0
  430. data/lib/puppet/module_tool/shared_behaviors.rb +199 -0
  431. data/lib/puppet/module_tool/tar/gnu.rb +23 -0
  432. data/lib/puppet/module_tool/tar/mini.rb +118 -0
  433. data/lib/puppet/module_tool/tar.rb +20 -0
  434. data/lib/puppet/module_tool.rb +194 -0
  435. data/lib/puppet/network/authconfig.rb +9 -0
  436. data/lib/puppet/network/authorization.rb +21 -0
  437. data/lib/puppet/network/client_request.rb +32 -0
  438. data/lib/puppet/network/format.rb +116 -0
  439. data/lib/puppet/network/format_handler.rb +110 -0
  440. data/lib/puppet/network/format_support.rb +140 -0
  441. data/lib/puppet/network/formats.rb +338 -0
  442. data/lib/puppet/network/http/api/indirected_routes.rb +270 -0
  443. data/lib/puppet/network/http/api/indirection_type.rb +33 -0
  444. data/lib/puppet/network/http/api/master/v3/environments.rb +4 -0
  445. data/lib/puppet/network/http/api/master/v3.rb +4 -0
  446. data/lib/puppet/network/http/api/master.rb +5 -0
  447. data/lib/puppet/network/http/api/server/v3/environments.rb +54 -0
  448. data/lib/puppet/network/http/api/server/v3.rb +40 -0
  449. data/lib/puppet/network/http/api/server.rb +12 -0
  450. data/lib/puppet/network/http/api.rb +41 -0
  451. data/lib/puppet/network/http/connection.rb +288 -0
  452. data/lib/puppet/network/http/error.rb +75 -0
  453. data/lib/puppet/network/http/handler.rb +213 -0
  454. data/lib/puppet/network/http/issues.rb +14 -0
  455. data/lib/puppet/network/http/memory_response.rb +15 -0
  456. data/lib/puppet/network/http/request.rb +83 -0
  457. data/lib/puppet/network/http/response.rb +25 -0
  458. data/lib/puppet/network/http/route.rb +104 -0
  459. data/lib/puppet/network/http.rb +30 -0
  460. data/lib/puppet/network/http_pool.rb +78 -0
  461. data/lib/puppet/network/uri.rb +20 -0
  462. data/lib/puppet/network.rb +5 -0
  463. data/lib/puppet/node/environment.rb +638 -0
  464. data/lib/puppet/node/facts.rb +165 -0
  465. data/lib/puppet/node/server_facts.rb +46 -0
  466. data/lib/puppet/node.rb +256 -0
  467. data/lib/puppet/pal/catalog_compiler.rb +107 -0
  468. data/lib/puppet/pal/compiler.rb +227 -0
  469. data/lib/puppet/pal/function_signature.rb +54 -0
  470. data/lib/puppet/pal/json_catalog_encoder.rb +76 -0
  471. data/lib/puppet/pal/pal_api.rb +17 -0
  472. data/lib/puppet/pal/pal_impl.rb +585 -0
  473. data/lib/puppet/pal/plan_signature.rb +73 -0
  474. data/lib/puppet/pal/script_compiler.rb +75 -0
  475. data/lib/puppet/pal/task_signature.rb +64 -0
  476. data/lib/puppet/parameter/boolean.rb +17 -0
  477. data/lib/puppet/parameter/package_options.rb +33 -0
  478. data/lib/puppet/parameter/path.rb +61 -0
  479. data/lib/puppet/parameter/value.rb +93 -0
  480. data/lib/puppet/parameter/value_collection.rb +213 -0
  481. data/lib/puppet/parameter.rb +590 -0
  482. data/lib/puppet/parser/abstract_compiler.rb +35 -0
  483. data/lib/puppet/parser/ast/block_expression.rb +17 -0
  484. data/lib/puppet/parser/ast/branch.rb +21 -0
  485. data/lib/puppet/parser/ast/hostclass.rb +29 -0
  486. data/lib/puppet/parser/ast/leaf.rb +84 -0
  487. data/lib/puppet/parser/ast/node.rb +19 -0
  488. data/lib/puppet/parser/ast/pops_bridge.rb +245 -0
  489. data/lib/puppet/parser/ast/resource.rb +66 -0
  490. data/lib/puppet/parser/ast/resource_instance.rb +13 -0
  491. data/lib/puppet/parser/ast/resourceparam.rb +33 -0
  492. data/lib/puppet/parser/ast/top_level_construct.rb +6 -0
  493. data/lib/puppet/parser/ast.rb +62 -0
  494. data/lib/puppet/parser/catalog_compiler.rb +56 -0
  495. data/lib/puppet/parser/compiler/catalog_validator/relationship_validator.rb +41 -0
  496. data/lib/puppet/parser/compiler/catalog_validator.rb +35 -0
  497. data/lib/puppet/parser/compiler.rb +616 -0
  498. data/lib/puppet/parser/e4_parser_adapter.rb +61 -0
  499. data/lib/puppet/parser/files.rb +95 -0
  500. data/lib/puppet/parser/functions/assert_type.rb +62 -0
  501. data/lib/puppet/parser/functions/binary_file.rb +26 -0
  502. data/lib/puppet/parser/functions/break.rb +41 -0
  503. data/lib/puppet/parser/functions/contain.rb +32 -0
  504. data/lib/puppet/parser/functions/create_resources.rb +114 -0
  505. data/lib/puppet/parser/functions/defined.rb +109 -0
  506. data/lib/puppet/parser/functions/dig.rb +40 -0
  507. data/lib/puppet/parser/functions/digest.rb +7 -0
  508. data/lib/puppet/parser/functions/each.rb +106 -0
  509. data/lib/puppet/parser/functions/epp.rb +40 -0
  510. data/lib/puppet/parser/functions/fail.rb +13 -0
  511. data/lib/puppet/parser/functions/file.rb +35 -0
  512. data/lib/puppet/parser/functions/filter.rb +81 -0
  513. data/lib/puppet/parser/functions/find_file.rb +29 -0
  514. data/lib/puppet/parser/functions/fqdn_rand.rb +46 -0
  515. data/lib/puppet/parser/functions/generate.rb +39 -0
  516. data/lib/puppet/parser/functions/hiera.rb +105 -0
  517. data/lib/puppet/parser/functions/hiera_array.rb +93 -0
  518. data/lib/puppet/parser/functions/hiera_hash.rb +103 -0
  519. data/lib/puppet/parser/functions/hiera_include.rb +102 -0
  520. data/lib/puppet/parser/functions/include.rb +36 -0
  521. data/lib/puppet/parser/functions/inline_epp.rb +52 -0
  522. data/lib/puppet/parser/functions/inline_template.rb +28 -0
  523. data/lib/puppet/parser/functions/lest.rb +51 -0
  524. data/lib/puppet/parser/functions/lookup.rb +134 -0
  525. data/lib/puppet/parser/functions/map.rb +78 -0
  526. data/lib/puppet/parser/functions/match.rb +45 -0
  527. data/lib/puppet/parser/functions/md5.rb +7 -0
  528. data/lib/puppet/parser/functions/new.rb +992 -0
  529. data/lib/puppet/parser/functions/next.rb +40 -0
  530. data/lib/puppet/parser/functions/realize.rb +22 -0
  531. data/lib/puppet/parser/functions/reduce.rb +139 -0
  532. data/lib/puppet/parser/functions/regsubst.rb +65 -0
  533. data/lib/puppet/parser/functions/require.rb +43 -0
  534. data/lib/puppet/parser/functions/return.rb +94 -0
  535. data/lib/puppet/parser/functions/reverse_each.rb +85 -0
  536. data/lib/puppet/parser/functions/scanf.rb +40 -0
  537. data/lib/puppet/parser/functions/sha1.rb +7 -0
  538. data/lib/puppet/parser/functions/sha256.rb +7 -0
  539. data/lib/puppet/parser/functions/shellquote.rb +63 -0
  540. data/lib/puppet/parser/functions/slice.rb +41 -0
  541. data/lib/puppet/parser/functions/split.rb +29 -0
  542. data/lib/puppet/parser/functions/sprintf.rb +62 -0
  543. data/lib/puppet/parser/functions/step.rb +86 -0
  544. data/lib/puppet/parser/functions/strftime.rb +187 -0
  545. data/lib/puppet/parser/functions/tag.rb +15 -0
  546. data/lib/puppet/parser/functions/tagged.rb +24 -0
  547. data/lib/puppet/parser/functions/template.rb +42 -0
  548. data/lib/puppet/parser/functions/then.rb +75 -0
  549. data/lib/puppet/parser/functions/type.rb +55 -0
  550. data/lib/puppet/parser/functions/versioncmp.rb +31 -0
  551. data/lib/puppet/parser/functions/with.rb +30 -0
  552. data/lib/puppet/parser/functions.rb +324 -0
  553. data/lib/puppet/parser/parser_factory.rb +32 -0
  554. data/lib/puppet/parser/relationship.rb +90 -0
  555. data/lib/puppet/parser/resource/param.rb +37 -0
  556. data/lib/puppet/parser/resource.rb +353 -0
  557. data/lib/puppet/parser/scope.rb +1141 -0
  558. data/lib/puppet/parser/script_compiler.rb +123 -0
  559. data/lib/puppet/parser/templatewrapper.rb +105 -0
  560. data/lib/puppet/parser/type_loader.rb +151 -0
  561. data/lib/puppet/parser.rb +22 -0
  562. data/lib/puppet/plugins/configuration.rb +31 -0
  563. data/lib/puppet/plugins/syntax_checkers.rb +99 -0
  564. data/lib/puppet/plugins.rb +11 -0
  565. data/lib/puppet/pops/adaptable.rb +199 -0
  566. data/lib/puppet/pops/adapters.rb +159 -0
  567. data/lib/puppet/pops/evaluator/access_operator.rb +732 -0
  568. data/lib/puppet/pops/evaluator/callable_signature.rb +108 -0
  569. data/lib/puppet/pops/evaluator/closure.rb +370 -0
  570. data/lib/puppet/pops/evaluator/collector_transformer.rb +237 -0
  571. data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +88 -0
  572. data/lib/puppet/pops/evaluator/collectors/catalog_collector.rb +30 -0
  573. data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +71 -0
  574. data/lib/puppet/pops/evaluator/collectors/fixed_set_collector.rb +38 -0
  575. data/lib/puppet/pops/evaluator/compare_operator.rb +269 -0
  576. data/lib/puppet/pops/evaluator/deferred_resolver.rb +227 -0
  577. data/lib/puppet/pops/evaluator/epp_evaluator.rb +121 -0
  578. data/lib/puppet/pops/evaluator/evaluator_impl.rb +1317 -0
  579. data/lib/puppet/pops/evaluator/external_syntax_support.rb +47 -0
  580. data/lib/puppet/pops/evaluator/json_strict_literal_evaluator.rb +83 -0
  581. data/lib/puppet/pops/evaluator/literal_evaluator.rb +100 -0
  582. data/lib/puppet/pops/evaluator/puppet_proc.rb +72 -0
  583. data/lib/puppet/pops/evaluator/relationship_operator.rb +188 -0
  584. data/lib/puppet/pops/evaluator/runtime3_converter.rb +225 -0
  585. data/lib/puppet/pops/evaluator/runtime3_resource_support.rb +119 -0
  586. data/lib/puppet/pops/evaluator/runtime3_support.rb +528 -0
  587. data/lib/puppet/pops/functions/dispatch.rb +107 -0
  588. data/lib/puppet/pops/functions/dispatcher.rb +76 -0
  589. data/lib/puppet/pops/functions/function.rb +137 -0
  590. data/lib/puppet/pops/issue_reporter.rb +140 -0
  591. data/lib/puppet/pops/issues.rb +933 -0
  592. data/lib/puppet/pops/label_provider.rb +92 -0
  593. data/lib/puppet/pops/loader/base_loader.rb +178 -0
  594. data/lib/puppet/pops/loader/dependency_loader.rb +95 -0
  595. data/lib/puppet/pops/loader/gem_support.rb +54 -0
  596. data/lib/puppet/pops/loader/generic_plan_instantiator.rb +30 -0
  597. data/lib/puppet/pops/loader/loader.rb +221 -0
  598. data/lib/puppet/pops/loader/loader_paths.rb +413 -0
  599. data/lib/puppet/pops/loader/module_loaders.rb +552 -0
  600. data/lib/puppet/pops/loader/predefined_loader.rb +28 -0
  601. data/lib/puppet/pops/loader/puppet_function_instantiator.rb +88 -0
  602. data/lib/puppet/pops/loader/puppet_plan_instantiator.rb +97 -0
  603. data/lib/puppet/pops/loader/puppet_resource_type_impl_instantiator.rb +80 -0
  604. data/lib/puppet/pops/loader/ruby_data_type_instantiator.rb +43 -0
  605. data/lib/puppet/pops/loader/ruby_function_instantiator.rb +49 -0
  606. data/lib/puppet/pops/loader/ruby_legacy_function_instantiator.rb +130 -0
  607. data/lib/puppet/pops/loader/runtime3_type_loader.rb +104 -0
  608. data/lib/puppet/pops/loader/simple_environment_loader.rb +20 -0
  609. data/lib/puppet/pops/loader/static_loader.rb +133 -0
  610. data/lib/puppet/pops/loader/task_instantiator.rb +46 -0
  611. data/lib/puppet/pops/loader/type_definition_instantiator.rb +104 -0
  612. data/lib/puppet/pops/loader/typed_name.rb +56 -0
  613. data/lib/puppet/pops/loader/uri_helper.rb +24 -0
  614. data/lib/puppet/pops/loaders.rb +550 -0
  615. data/lib/puppet/pops/lookup/configured_data_provider.rb +95 -0
  616. data/lib/puppet/pops/lookup/context.rb +208 -0
  617. data/lib/puppet/pops/lookup/data_adapter.rb +29 -0
  618. data/lib/puppet/pops/lookup/data_dig_function_provider.rb +146 -0
  619. data/lib/puppet/pops/lookup/data_hash_function_provider.rb +128 -0
  620. data/lib/puppet/pops/lookup/data_provider.rb +94 -0
  621. data/lib/puppet/pops/lookup/environment_data_provider.rb +37 -0
  622. data/lib/puppet/pops/lookup/explainer.rb +597 -0
  623. data/lib/puppet/pops/lookup/function_provider.rb +112 -0
  624. data/lib/puppet/pops/lookup/global_data_provider.rb +76 -0
  625. data/lib/puppet/pops/lookup/hiera_config.rb +823 -0
  626. data/lib/puppet/pops/lookup/interpolation.rb +166 -0
  627. data/lib/puppet/pops/lookup/invocation.rb +272 -0
  628. data/lib/puppet/pops/lookup/key_recorder.rb +21 -0
  629. data/lib/puppet/pops/lookup/location_resolver.rb +101 -0
  630. data/lib/puppet/pops/lookup/lookup_adapter.rb +533 -0
  631. data/lib/puppet/pops/lookup/lookup_key.rb +101 -0
  632. data/lib/puppet/pops/lookup/lookup_key_function_provider.rb +94 -0
  633. data/lib/puppet/pops/lookup/module_data_provider.rb +92 -0
  634. data/lib/puppet/pops/lookup/sub_lookup.rb +96 -0
  635. data/lib/puppet/pops/lookup.rb +102 -0
  636. data/lib/puppet/pops/merge_strategy.rb +447 -0
  637. data/lib/puppet/pops/migration/migration_checker.rb +61 -0
  638. data/lib/puppet/pops/model/ast.pp +669 -0
  639. data/lib/puppet/pops/model/ast.rb +4776 -0
  640. data/lib/puppet/pops/model/ast_transformer.rb +131 -0
  641. data/lib/puppet/pops/model/factory.rb +1157 -0
  642. data/lib/puppet/pops/model/model_label_provider.rb +137 -0
  643. data/lib/puppet/pops/model/model_tree_dumper.rb +447 -0
  644. data/lib/puppet/pops/model/pn_transformer.rb +384 -0
  645. data/lib/puppet/pops/model/tree_dumper.rb +62 -0
  646. data/lib/puppet/pops/parser/code_merger.rb +29 -0
  647. data/lib/puppet/pops/parser/egrammar.ra +889 -0
  648. data/lib/puppet/pops/parser/eparser.rb +3184 -0
  649. data/lib/puppet/pops/parser/epp_parser.rb +52 -0
  650. data/lib/puppet/pops/parser/epp_support.rb +266 -0
  651. data/lib/puppet/pops/parser/evaluating_parser.rb +166 -0
  652. data/lib/puppet/pops/parser/heredoc_support.rb +153 -0
  653. data/lib/puppet/pops/parser/interpolation_support.rb +249 -0
  654. data/lib/puppet/pops/parser/lexer2.rb +789 -0
  655. data/lib/puppet/pops/parser/lexer_support.rb +221 -0
  656. data/lib/puppet/pops/parser/locatable.rb +23 -0
  657. data/lib/puppet/pops/parser/locator.rb +361 -0
  658. data/lib/puppet/pops/parser/parser_support.rb +252 -0
  659. data/lib/puppet/pops/parser/pn_parser.rb +318 -0
  660. data/lib/puppet/pops/parser/slurp_support.rb +119 -0
  661. data/lib/puppet/pops/patterns.rb +60 -0
  662. data/lib/puppet/pops/pcore.rb +136 -0
  663. data/lib/puppet/pops/pn.rb +239 -0
  664. data/lib/puppet/pops/puppet_stack.rb +63 -0
  665. data/lib/puppet/pops/resource/param.rb +56 -0
  666. data/lib/puppet/pops/resource/resource_type_impl.rb +296 -0
  667. data/lib/puppet/pops/resource/resource_type_set.pcore +22 -0
  668. data/lib/puppet/pops/semantic_error.rb +31 -0
  669. data/lib/puppet/pops/serialization/abstract_reader.rb +182 -0
  670. data/lib/puppet/pops/serialization/abstract_writer.rb +224 -0
  671. data/lib/puppet/pops/serialization/deserializer.rb +83 -0
  672. data/lib/puppet/pops/serialization/extension.rb +166 -0
  673. data/lib/puppet/pops/serialization/from_data_converter.rb +231 -0
  674. data/lib/puppet/pops/serialization/instance_reader.rb +21 -0
  675. data/lib/puppet/pops/serialization/instance_writer.rb +16 -0
  676. data/lib/puppet/pops/serialization/json.rb +301 -0
  677. data/lib/puppet/pops/serialization/json_path.rb +129 -0
  678. data/lib/puppet/pops/serialization/object.rb +73 -0
  679. data/lib/puppet/pops/serialization/serializer.rb +144 -0
  680. data/lib/puppet/pops/serialization/time_factory.rb +68 -0
  681. data/lib/puppet/pops/serialization/to_data_converter.rb +316 -0
  682. data/lib/puppet/pops/serialization/to_stringified_converter.rb +227 -0
  683. data/lib/puppet/pops/serialization.rb +45 -0
  684. data/lib/puppet/pops/time/timespan.rb +728 -0
  685. data/lib/puppet/pops/time/timestamp.rb +167 -0
  686. data/lib/puppet/pops/types/annotatable.rb +37 -0
  687. data/lib/puppet/pops/types/annotation.rb +73 -0
  688. data/lib/puppet/pops/types/class_loader.rb +134 -0
  689. data/lib/puppet/pops/types/implementation_registry.rb +137 -0
  690. data/lib/puppet/pops/types/iterable.rb +375 -0
  691. data/lib/puppet/pops/types/p_binary_type.rb +232 -0
  692. data/lib/puppet/pops/types/p_init_type.rb +241 -0
  693. data/lib/puppet/pops/types/p_meta_type.rb +95 -0
  694. data/lib/puppet/pops/types/p_object_type.rb +1142 -0
  695. data/lib/puppet/pops/types/p_object_type_extension.rb +229 -0
  696. data/lib/puppet/pops/types/p_runtime_type.rb +117 -0
  697. data/lib/puppet/pops/types/p_sem_ver_range_type.rb +191 -0
  698. data/lib/puppet/pops/types/p_sem_ver_type.rb +155 -0
  699. data/lib/puppet/pops/types/p_sensitive_type.rb +81 -0
  700. data/lib/puppet/pops/types/p_timespan_type.rb +194 -0
  701. data/lib/puppet/pops/types/p_timestamp_type.rb +74 -0
  702. data/lib/puppet/pops/types/p_type_set_type.rb +394 -0
  703. data/lib/puppet/pops/types/p_uri_type.rb +198 -0
  704. data/lib/puppet/pops/types/puppet_object.rb +41 -0
  705. data/lib/puppet/pops/types/recursion_guard.rb +142 -0
  706. data/lib/puppet/pops/types/ruby_generator.rb +477 -0
  707. data/lib/puppet/pops/types/ruby_method.rb +32 -0
  708. data/lib/puppet/pops/types/string_converter.rb +1144 -0
  709. data/lib/puppet/pops/types/tree_iterators.rb +250 -0
  710. data/lib/puppet/pops/types/type_acceptor.rb +27 -0
  711. data/lib/puppet/pops/types/type_asserter.rb +49 -0
  712. data/lib/puppet/pops/types/type_assertion_error.rb +27 -0
  713. data/lib/puppet/pops/types/type_calculator.rb +829 -0
  714. data/lib/puppet/pops/types/type_conversion_error.rb +7 -0
  715. data/lib/puppet/pops/types/type_factory.rb +640 -0
  716. data/lib/puppet/pops/types/type_formatter.rb +796 -0
  717. data/lib/puppet/pops/types/type_mismatch_describer.rb +1105 -0
  718. data/lib/puppet/pops/types/type_parser.rb +690 -0
  719. data/lib/puppet/pops/types/type_set_reference.rb +62 -0
  720. data/lib/puppet/pops/types/type_with_members.rb +43 -0
  721. data/lib/puppet/pops/types/types.rb +3651 -0
  722. data/lib/puppet/pops/utils.rb +117 -0
  723. data/lib/puppet/pops/validation/checker4_0.rb +1155 -0
  724. data/lib/puppet/pops/validation/tasks_checker.rb +95 -0
  725. data/lib/puppet/pops/validation/validator_factory_4_0.rb +45 -0
  726. data/lib/puppet/pops/validation.rb +462 -0
  727. data/lib/puppet/pops/visitable.rb +8 -0
  728. data/lib/puppet/pops/visitor.rb +136 -0
  729. data/lib/puppet/pops.rb +124 -0
  730. data/lib/puppet/property/boolean.rb +9 -0
  731. data/lib/puppet/property/ensure.rb +107 -0
  732. data/lib/puppet/property/keyvalue.rb +159 -0
  733. data/lib/puppet/property/list.rb +71 -0
  734. data/lib/puppet/property/ordered_list.rb +30 -0
  735. data/lib/puppet/property.rb +610 -0
  736. data/lib/puppet/provider/aix_object.rb +491 -0
  737. data/lib/puppet/provider/command.rb +27 -0
  738. data/lib/puppet/provider/confine.rb +8 -0
  739. data/lib/puppet/provider/exec/posix.rb +63 -0
  740. data/lib/puppet/provider/exec/shell.rb +27 -0
  741. data/lib/puppet/provider/exec/windows.rb +57 -0
  742. data/lib/puppet/provider/exec.rb +107 -0
  743. data/lib/puppet/provider/file/posix.rb +162 -0
  744. data/lib/puppet/provider/file/windows.rb +151 -0
  745. data/lib/puppet/provider/group/aix.rb +101 -0
  746. data/lib/puppet/provider/group/directoryservice.rb +24 -0
  747. data/lib/puppet/provider/group/groupadd.rb +180 -0
  748. data/lib/puppet/provider/group/ldap.rb +51 -0
  749. data/lib/puppet/provider/group/pw.rb +52 -0
  750. data/lib/puppet/provider/group/windows_adsi.rb +116 -0
  751. data/lib/puppet/provider/ldap.rb +143 -0
  752. data/lib/puppet/provider/nameservice/directoryservice.rb +522 -0
  753. data/lib/puppet/provider/nameservice/objectadd.rb +22 -0
  754. data/lib/puppet/provider/nameservice/pw.rb +21 -0
  755. data/lib/puppet/provider/nameservice.rb +297 -0
  756. data/lib/puppet/provider/network_device.rb +74 -0
  757. data/lib/puppet/provider/package/aix.rb +171 -0
  758. data/lib/puppet/provider/package/appdmg.rb +113 -0
  759. data/lib/puppet/provider/package/apple.rb +49 -0
  760. data/lib/puppet/provider/package/apt.rb +265 -0
  761. data/lib/puppet/provider/package/aptitude.rb +35 -0
  762. data/lib/puppet/provider/package/aptrpm.rb +87 -0
  763. data/lib/puppet/provider/package/blastwave.rb +109 -0
  764. data/lib/puppet/provider/package/dnf.rb +57 -0
  765. data/lib/puppet/provider/package/dnfmodule.rb +143 -0
  766. data/lib/puppet/provider/package/dpkg.rb +191 -0
  767. data/lib/puppet/provider/package/fink.rb +99 -0
  768. data/lib/puppet/provider/package/freebsd.rb +49 -0
  769. data/lib/puppet/provider/package/gem.rb +296 -0
  770. data/lib/puppet/provider/package/hpux.rb +46 -0
  771. data/lib/puppet/provider/package/macports.rb +112 -0
  772. data/lib/puppet/provider/package/nim.rb +290 -0
  773. data/lib/puppet/provider/package/openbsd.rb +263 -0
  774. data/lib/puppet/provider/package/opkg.rb +85 -0
  775. data/lib/puppet/provider/package/pacman.rb +270 -0
  776. data/lib/puppet/provider/package/pip.rb +347 -0
  777. data/lib/puppet/provider/package/pip2.rb +18 -0
  778. data/lib/puppet/provider/package/pip3.rb +18 -0
  779. data/lib/puppet/provider/package/pkg.rb +300 -0
  780. data/lib/puppet/provider/package/pkgdmg.rb +159 -0
  781. data/lib/puppet/provider/package/pkgin.rb +88 -0
  782. data/lib/puppet/provider/package/pkgng.rb +178 -0
  783. data/lib/puppet/provider/package/pkgutil.rb +186 -0
  784. data/lib/puppet/provider/package/portage.rb +314 -0
  785. data/lib/puppet/provider/package/ports.rb +94 -0
  786. data/lib/puppet/provider/package/portupgrade.rb +233 -0
  787. data/lib/puppet/provider/package/puppet_gem.rb +25 -0
  788. data/lib/puppet/provider/package/puppetserver_gem.rb +174 -0
  789. data/lib/puppet/provider/package/rpm.rb +255 -0
  790. data/lib/puppet/provider/package/rug.rb +51 -0
  791. data/lib/puppet/provider/package/sun.rb +137 -0
  792. data/lib/puppet/provider/package/sunfreeware.rb +11 -0
  793. data/lib/puppet/provider/package/tdnf.rb +35 -0
  794. data/lib/puppet/provider/package/up2date.rb +40 -0
  795. data/lib/puppet/provider/package/urpmi.rb +57 -0
  796. data/lib/puppet/provider/package/windows/exe_package.rb +108 -0
  797. data/lib/puppet/provider/package/windows/msi_package.rb +72 -0
  798. data/lib/puppet/provider/package/windows/package.rb +113 -0
  799. data/lib/puppet/provider/package/windows.rb +131 -0
  800. data/lib/puppet/provider/package/xbps.rb +127 -0
  801. data/lib/puppet/provider/package/yum.rb +390 -0
  802. data/lib/puppet/provider/package/zypper.rb +206 -0
  803. data/lib/puppet/provider/package.rb +61 -0
  804. data/lib/puppet/provider/package_targetable.rb +71 -0
  805. data/lib/puppet/provider/parsedfile.rb +494 -0
  806. data/lib/puppet/provider/service/base.rb +135 -0
  807. data/lib/puppet/provider/service/bsd.rb +53 -0
  808. data/lib/puppet/provider/service/daemontools.rb +196 -0
  809. data/lib/puppet/provider/service/debian.rb +77 -0
  810. data/lib/puppet/provider/service/freebsd.rb +141 -0
  811. data/lib/puppet/provider/service/gentoo.rb +47 -0
  812. data/lib/puppet/provider/service/init.rb +194 -0
  813. data/lib/puppet/provider/service/launchd.rb +391 -0
  814. data/lib/puppet/provider/service/openbsd.rb +101 -0
  815. data/lib/puppet/provider/service/openrc.rb +72 -0
  816. data/lib/puppet/provider/service/openwrt.rb +37 -0
  817. data/lib/puppet/provider/service/rcng.rb +53 -0
  818. data/lib/puppet/provider/service/redhat.rb +75 -0
  819. data/lib/puppet/provider/service/runit.rb +107 -0
  820. data/lib/puppet/provider/service/service.rb +67 -0
  821. data/lib/puppet/provider/service/smf.rb +322 -0
  822. data/lib/puppet/provider/service/src.rb +147 -0
  823. data/lib/puppet/provider/service/systemd.rb +232 -0
  824. data/lib/puppet/provider/service/upstart.rb +385 -0
  825. data/lib/puppet/provider/service/windows.rb +179 -0
  826. data/lib/puppet/provider/user/aix.rb +365 -0
  827. data/lib/puppet/provider/user/directoryservice.rb +687 -0
  828. data/lib/puppet/provider/user/hpux.rb +93 -0
  829. data/lib/puppet/provider/user/ldap.rb +135 -0
  830. data/lib/puppet/provider/user/openbsd.rb +79 -0
  831. data/lib/puppet/provider/user/pw.rb +109 -0
  832. data/lib/puppet/provider/user/user_role_add.rb +243 -0
  833. data/lib/puppet/provider/user/useradd.rb +417 -0
  834. data/lib/puppet/provider/user/windows_adsi.rb +176 -0
  835. data/lib/puppet/provider.rb +613 -0
  836. data/lib/puppet/reference/configuration.rb +105 -0
  837. data/lib/puppet/reference/function.rb +19 -0
  838. data/lib/puppet/reference/indirection.rb +76 -0
  839. data/lib/puppet/reference/metaparameter.rb +35 -0
  840. data/lib/puppet/reference/providers.rb +119 -0
  841. data/lib/puppet/reference/report.rb +22 -0
  842. data/lib/puppet/reference/type.rb +111 -0
  843. data/lib/puppet/relationship.rb +85 -0
  844. data/lib/puppet/reports/http.rb +45 -0
  845. data/lib/puppet/reports/log.rb +15 -0
  846. data/lib/puppet/reports/store.rb +71 -0
  847. data/lib/puppet/reports.rb +95 -0
  848. data/lib/puppet/resource/catalog.rb +655 -0
  849. data/lib/puppet/resource/status.rb +231 -0
  850. data/lib/puppet/resource/type.rb +449 -0
  851. data/lib/puppet/resource/type_collection.rb +235 -0
  852. data/lib/puppet/resource.rb +673 -0
  853. data/lib/puppet/runtime.rb +67 -0
  854. data/lib/puppet/scheduler/job.rb +55 -0
  855. data/lib/puppet/scheduler/scheduler.rb +46 -0
  856. data/lib/puppet/scheduler/splay_job.rb +45 -0
  857. data/lib/puppet/scheduler/timer.rb +15 -0
  858. data/lib/puppet/scheduler.rb +18 -0
  859. data/lib/puppet/settings/alias_setting.rb +37 -0
  860. data/lib/puppet/settings/array_setting.rb +18 -0
  861. data/lib/puppet/settings/autosign_setting.rb +23 -0
  862. data/lib/puppet/settings/base_setting.rb +228 -0
  863. data/lib/puppet/settings/boolean_setting.rb +34 -0
  864. data/lib/puppet/settings/certificate_revocation_setting.rb +22 -0
  865. data/lib/puppet/settings/config_file.rb +148 -0
  866. data/lib/puppet/settings/directory_setting.rb +20 -0
  867. data/lib/puppet/settings/duration_setting.rb +33 -0
  868. data/lib/puppet/settings/enum_setting.rb +18 -0
  869. data/lib/puppet/settings/environment_conf.rb +228 -0
  870. data/lib/puppet/settings/errors.rb +14 -0
  871. data/lib/puppet/settings/file_or_directory_setting.rb +37 -0
  872. data/lib/puppet/settings/file_setting.rb +232 -0
  873. data/lib/puppet/settings/http_extra_headers_setting.rb +26 -0
  874. data/lib/puppet/settings/ini_file.rb +228 -0
  875. data/lib/puppet/settings/integer_setting.rb +19 -0
  876. data/lib/puppet/settings/path_setting.rb +10 -0
  877. data/lib/puppet/settings/port_setting.rb +17 -0
  878. data/lib/puppet/settings/priority_setting.rb +44 -0
  879. data/lib/puppet/settings/server_list_setting.rb +30 -0
  880. data/lib/puppet/settings/string_setting.rb +11 -0
  881. data/lib/puppet/settings/symbolic_enum_setting.rb +19 -0
  882. data/lib/puppet/settings/terminus_setting.rb +16 -0
  883. data/lib/puppet/settings/ttl_setting.rb +53 -0
  884. data/lib/puppet/settings/value_translator.rb +16 -0
  885. data/lib/puppet/settings.rb +1650 -0
  886. data/lib/puppet/ssl/base.rb +152 -0
  887. data/lib/puppet/ssl/certificate.rb +98 -0
  888. data/lib/puppet/ssl/certificate_request.rb +320 -0
  889. data/lib/puppet/ssl/certificate_request_attributes.rb +40 -0
  890. data/lib/puppet/ssl/certificate_signer.rb +39 -0
  891. data/lib/puppet/ssl/digest.rb +22 -0
  892. data/lib/puppet/ssl/error.rb +29 -0
  893. data/lib/puppet/ssl/oids.rb +199 -0
  894. data/lib/puppet/ssl/openssl_loader.rb +26 -0
  895. data/lib/puppet/ssl/ssl_context.rb +27 -0
  896. data/lib/puppet/ssl/ssl_provider.rb +354 -0
  897. data/lib/puppet/ssl/state_machine.rb +605 -0
  898. data/lib/puppet/ssl/verifier.rb +143 -0
  899. data/lib/puppet/ssl.rb +25 -0
  900. data/lib/puppet/syntax_checkers/base64.rb +42 -0
  901. data/lib/puppet/syntax_checkers/epp.rb +35 -0
  902. data/lib/puppet/syntax_checkers/json.rb +35 -0
  903. data/lib/puppet/syntax_checkers/pp.rb +35 -0
  904. data/lib/puppet/syntax_checkers.rb +5 -0
  905. data/lib/puppet/test/test_helper.rb +251 -0
  906. data/lib/puppet/thread_local.rb +6 -0
  907. data/lib/puppet/transaction/additional_resource_generator.rb +225 -0
  908. data/lib/puppet/transaction/event.rb +171 -0
  909. data/lib/puppet/transaction/event_manager.rb +180 -0
  910. data/lib/puppet/transaction/persistence.rb +119 -0
  911. data/lib/puppet/transaction/report.rb +511 -0
  912. data/lib/puppet/transaction/resource_harness.rb +331 -0
  913. data/lib/puppet/transaction.rb +493 -0
  914. data/lib/puppet/trusted_external.rb +46 -0
  915. data/lib/puppet/type/component.rb +96 -0
  916. data/lib/puppet/type/exec.rb +730 -0
  917. data/lib/puppet/type/file/checksum.rb +54 -0
  918. data/lib/puppet/type/file/checksum_value.rb +56 -0
  919. data/lib/puppet/type/file/content.rb +180 -0
  920. data/lib/puppet/type/file/ctime.rb +22 -0
  921. data/lib/puppet/type/file/data_sync.rb +101 -0
  922. data/lib/puppet/type/file/ensure.rb +194 -0
  923. data/lib/puppet/type/file/group.rb +50 -0
  924. data/lib/puppet/type/file/mode.rb +192 -0
  925. data/lib/puppet/type/file/mtime.rb +21 -0
  926. data/lib/puppet/type/file/owner.rb +52 -0
  927. data/lib/puppet/type/file/selcontext.rb +143 -0
  928. data/lib/puppet/type/file/source.rb +380 -0
  929. data/lib/puppet/type/file/target.rb +86 -0
  930. data/lib/puppet/type/file/type.rb +21 -0
  931. data/lib/puppet/type/file.rb +1139 -0
  932. data/lib/puppet/type/filebucket.rb +123 -0
  933. data/lib/puppet/type/group.rb +238 -0
  934. data/lib/puppet/type/notify.rb +48 -0
  935. data/lib/puppet/type/package.rb +715 -0
  936. data/lib/puppet/type/resources.rb +192 -0
  937. data/lib/puppet/type/schedule.rb +441 -0
  938. data/lib/puppet/type/service.rb +310 -0
  939. data/lib/puppet/type/stage.rb +29 -0
  940. data/lib/puppet/type/tidy.rb +382 -0
  941. data/lib/puppet/type/user.rb +865 -0
  942. data/lib/puppet/type/whit.rb +35 -0
  943. data/lib/puppet/type.rb +2629 -0
  944. data/lib/puppet/util/at_fork/noop.rb +20 -0
  945. data/lib/puppet/util/at_fork/solaris.rb +158 -0
  946. data/lib/puppet/util/at_fork.rb +37 -0
  947. data/lib/puppet/util/autoload.rb +221 -0
  948. data/lib/puppet/util/backups.rb +88 -0
  949. data/lib/puppet/util/character_encoding.rb +83 -0
  950. data/lib/puppet/util/checksums.rb +380 -0
  951. data/lib/puppet/util/classgen.rb +223 -0
  952. data/lib/puppet/util/colors.rb +102 -0
  953. data/lib/puppet/util/command_line/puppet_option_parser.rb +89 -0
  954. data/lib/puppet/util/command_line/trollop.rb +847 -0
  955. data/lib/puppet/util/command_line.rb +198 -0
  956. data/lib/puppet/util/constant_inflector.rb +25 -0
  957. data/lib/puppet/util/diff.rb +80 -0
  958. data/lib/puppet/util/docs.rb +132 -0
  959. data/lib/puppet/util/errors.rb +161 -0
  960. data/lib/puppet/util/execution.rb +446 -0
  961. data/lib/puppet/util/execution_stub.rb +28 -0
  962. data/lib/puppet/util/feature.rb +129 -0
  963. data/lib/puppet/util/file_watcher.rb +31 -0
  964. data/lib/puppet/util/fileparsing.rb +404 -0
  965. data/lib/puppet/util/filetype.rb +358 -0
  966. data/lib/puppet/util/http_proxy.rb +6 -0
  967. data/lib/puppet/util/inifile.rb +335 -0
  968. data/lib/puppet/util/instance_loader.rb +69 -0
  969. data/lib/puppet/util/json.rb +94 -0
  970. data/lib/puppet/util/json_lockfile.rb +47 -0
  971. data/lib/puppet/util/ldap/connection.rb +75 -0
  972. data/lib/puppet/util/ldap/generator.rb +44 -0
  973. data/lib/puppet/util/ldap/manager.rb +283 -0
  974. data/lib/puppet/util/ldap.rb +4 -0
  975. data/lib/puppet/util/libuser.conf +15 -0
  976. data/lib/puppet/util/libuser.rb +13 -0
  977. data/lib/puppet/util/limits.rb +14 -0
  978. data/lib/puppet/util/lockfile.rb +66 -0
  979. data/lib/puppet/util/log/destination.rb +50 -0
  980. data/lib/puppet/util/log/destinations.rb +253 -0
  981. data/lib/puppet/util/log.rb +436 -0
  982. data/lib/puppet/util/logging.rb +304 -0
  983. data/lib/puppet/util/metaid.rb +22 -0
  984. data/lib/puppet/util/metric.rb +68 -0
  985. data/lib/puppet/util/monkey_patches.rb +114 -0
  986. data/lib/puppet/util/multi_match.rb +55 -0
  987. data/lib/puppet/util/network_device/base.rb +24 -0
  988. data/lib/puppet/util/network_device/config.rb +105 -0
  989. data/lib/puppet/util/network_device/transport/base.rb +26 -0
  990. data/lib/puppet/util/network_device/transport.rb +7 -0
  991. data/lib/puppet/util/network_device.rb +19 -0
  992. data/lib/puppet/util/package/version/debian.rb +177 -0
  993. data/lib/puppet/util/package/version/gem.rb +18 -0
  994. data/lib/puppet/util/package/version/pip.rb +173 -0
  995. data/lib/puppet/util/package/version/range/eq.rb +17 -0
  996. data/lib/puppet/util/package/version/range/gt.rb +17 -0
  997. data/lib/puppet/util/package/version/range/gt_eq.rb +17 -0
  998. data/lib/puppet/util/package/version/range/lt.rb +17 -0
  999. data/lib/puppet/util/package/version/range/lt_eq.rb +17 -0
  1000. data/lib/puppet/util/package/version/range/min_max.rb +26 -0
  1001. data/lib/puppet/util/package/version/range/simple.rb +13 -0
  1002. data/lib/puppet/util/package/version/range.rb +57 -0
  1003. data/lib/puppet/util/package/version/rpm.rb +75 -0
  1004. data/lib/puppet/util/package.rb +43 -0
  1005. data/lib/puppet/util/pidlock.rb +103 -0
  1006. data/lib/puppet/util/platform.rb +72 -0
  1007. data/lib/puppet/util/plist.rb +161 -0
  1008. data/lib/puppet/util/posix.rb +206 -0
  1009. data/lib/puppet/util/profiler/aggregate.rb +82 -0
  1010. data/lib/puppet/util/profiler/around_profiler.rb +68 -0
  1011. data/lib/puppet/util/profiler/logging.rb +50 -0
  1012. data/lib/puppet/util/profiler/object_counts.rb +19 -0
  1013. data/lib/puppet/util/profiler/wall_clock.rb +36 -0
  1014. data/lib/puppet/util/profiler.rb +55 -0
  1015. data/lib/puppet/util/provider_features.rb +183 -0
  1016. data/lib/puppet/util/psych_support.rb +32 -0
  1017. data/lib/puppet/util/rdoc/code_objects.rb +293 -0
  1018. data/lib/puppet/util/rdoc/generators/puppet_generator.rb +902 -0
  1019. data/lib/puppet/util/rdoc/generators/template/puppet/puppet.rb +1068 -0
  1020. data/lib/puppet/util/rdoc/parser/puppet_parser_core.rb +262 -0
  1021. data/lib/puppet/util/rdoc/parser/puppet_parser_rdoc2.rb +16 -0
  1022. data/lib/puppet/util/rdoc/parser.rb +14 -0
  1023. data/lib/puppet/util/rdoc.rb +54 -0
  1024. data/lib/puppet/util/reference.rb +94 -0
  1025. data/lib/puppet/util/resource_template.rb +63 -0
  1026. data/lib/puppet/util/retry_action.rb +47 -0
  1027. data/lib/puppet/util/rpm_compare.rb +196 -0
  1028. data/lib/puppet/util/rubygems.rb +67 -0
  1029. data/lib/puppet/util/run_mode.rb +164 -0
  1030. data/lib/puppet/util/selinux.rb +331 -0
  1031. data/lib/puppet/util/skip_tags.rb +15 -0
  1032. data/lib/puppet/util/splayer.rb +20 -0
  1033. data/lib/puppet/util/storage.rb +100 -0
  1034. data/lib/puppet/util/suidmanager.rb +167 -0
  1035. data/lib/puppet/util/symbolic_file_mode.rb +156 -0
  1036. data/lib/puppet/util/tag_set.rb +29 -0
  1037. data/lib/puppet/util/tagging.rb +131 -0
  1038. data/lib/puppet/util/terminal.rb +18 -0
  1039. data/lib/puppet/util/user_attr.rb +23 -0
  1040. data/lib/puppet/util/warnings.rb +35 -0
  1041. data/lib/puppet/util/watched_file.rb +40 -0
  1042. data/lib/puppet/util/watcher/change_watcher.rb +35 -0
  1043. data/lib/puppet/util/watcher/periodic_watcher.rb +38 -0
  1044. data/lib/puppet/util/watcher/timer.rb +21 -0
  1045. data/lib/puppet/util/watcher.rb +17 -0
  1046. data/lib/puppet/util/windows/access_control_entry.rb +86 -0
  1047. data/lib/puppet/util/windows/access_control_list.rb +116 -0
  1048. data/lib/puppet/util/windows/adsi.rb +662 -0
  1049. data/lib/puppet/util/windows/com.rb +228 -0
  1050. data/lib/puppet/util/windows/daemon.rb +340 -0
  1051. data/lib/puppet/util/windows/error.rb +86 -0
  1052. data/lib/puppet/util/windows/eventlog.rb +191 -0
  1053. data/lib/puppet/util/windows/file.rb +359 -0
  1054. data/lib/puppet/util/windows/monkey_patches/process.rb +413 -0
  1055. data/lib/puppet/util/windows/principal.rb +204 -0
  1056. data/lib/puppet/util/windows/process.rb +360 -0
  1057. data/lib/puppet/util/windows/registry.rb +443 -0
  1058. data/lib/puppet/util/windows/root_certs.rb +110 -0
  1059. data/lib/puppet/util/windows/security.rb +909 -0
  1060. data/lib/puppet/util/windows/security_descriptor.rb +64 -0
  1061. data/lib/puppet/util/windows/service.rb +708 -0
  1062. data/lib/puppet/util/windows/sid.rb +291 -0
  1063. data/lib/puppet/util/windows/string.rb +17 -0
  1064. data/lib/puppet/util/windows/user.rb +551 -0
  1065. data/lib/puppet/util/windows.rb +58 -0
  1066. data/lib/puppet/util/yaml.rb +67 -0
  1067. data/lib/puppet/util.rb +759 -0
  1068. data/lib/puppet/vendor/require_vendored.rb +4 -0
  1069. data/lib/puppet/vendor.rb +59 -0
  1070. data/lib/puppet/version.rb +98 -0
  1071. data/lib/puppet/x509/cert_provider.rb +405 -0
  1072. data/lib/puppet/x509/pem_store.rb +57 -0
  1073. data/lib/puppet/x509.rb +13 -0
  1074. data/lib/puppet.rb +348 -0
  1075. data/lib/puppet_pal.rb +10 -0
  1076. data/lib/puppet_x.rb +16 -0
  1077. data/locales/config.yaml +29 -0
  1078. data/locales/en/puppet.po +19 -0
  1079. data/locales/puppet.pot +9738 -0
  1080. data/man/man5/puppet.conf.5 +1407 -0
  1081. data/man/man8/puppet-agent.8 +135 -0
  1082. data/man/man8/puppet-apply.8 +67 -0
  1083. data/man/man8/puppet-catalog.8 +194 -0
  1084. data/man/man8/puppet-config.8 +103 -0
  1085. data/man/man8/puppet-describe.8 +35 -0
  1086. data/man/man8/puppet-device.8 +83 -0
  1087. data/man/man8/puppet-doc.8 +30 -0
  1088. data/man/man8/puppet-epp.8 +232 -0
  1089. data/man/man8/puppet-facts.8 +156 -0
  1090. data/man/man8/puppet-filebucket.8 +134 -0
  1091. data/man/man8/puppet-generate.8 +54 -0
  1092. data/man/man8/puppet-help.8 +46 -0
  1093. data/man/man8/puppet-lookup.8 +71 -0
  1094. data/man/man8/puppet-module.8 +220 -0
  1095. data/man/man8/puppet-node.8 +142 -0
  1096. data/man/man8/puppet-parser.8 +87 -0
  1097. data/man/man8/puppet-plugin.8 +50 -0
  1098. data/man/man8/puppet-report.8 +84 -0
  1099. data/man/man8/puppet-resource.8 +63 -0
  1100. data/man/man8/puppet-script.8 +48 -0
  1101. data/man/man8/puppet-ssl.8 +45 -0
  1102. data/man/man8/puppet.8 +98 -0
  1103. data/tasks/tag.rake +34 -0
  1104. metadata +1336 -0
@@ -0,0 +1,1317 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../../puppet/parser/scope'
4
+ require_relative '../../../puppet/pops/evaluator/compare_operator'
5
+ require_relative '../../../puppet/pops/evaluator/relationship_operator'
6
+ require_relative '../../../puppet/pops/evaluator/access_operator'
7
+ require_relative '../../../puppet/pops/evaluator/closure'
8
+ require_relative '../../../puppet/pops/evaluator/external_syntax_support'
9
+ require_relative '../../../puppet/pops/types/iterable'
10
+
11
+ module Puppet::Pops
12
+ module Evaluator
13
+ # This implementation of {Evaluator} performs evaluation using the puppet 3.x runtime system
14
+ # in a manner largely compatible with Puppet 3.x, but adds new features and introduces constraints.
15
+ #
16
+ # The evaluation uses _polymorphic dispatch_ which works by dispatching to the first found method named after
17
+ # the class or one of its super-classes. The EvaluatorImpl itself mainly deals with evaluation (it currently
18
+ # also handles assignment), and it uses a delegation pattern to more specialized handlers of some operators
19
+ # that in turn use polymorphic dispatch; this to not clutter EvaluatorImpl with too much responsibility).
20
+ #
21
+ # Since a pattern is used, only the main entry points are fully documented. The parameters _o_ and _scope_ are
22
+ # the same in all the polymorphic methods, (the type of the parameter _o_ is reflected in the method's name;
23
+ # either the actual class, or one of its super classes). The _scope_ parameter is always the scope in which
24
+ # the evaluation takes place. If nothing else is mentioned, the return is always the result of evaluation.
25
+ #
26
+ # See {Visitable} and {Visitor} for more information about
27
+ # polymorphic calling.
28
+ #
29
+ class EvaluatorImpl
30
+ include Utils
31
+
32
+ # Provides access to the Puppet 3.x runtime (scope, etc.)
33
+ # This separation has been made to make it easier to later migrate the evaluator to an improved runtime.
34
+ #
35
+ include Runtime3Support
36
+ include ExternalSyntaxSupport
37
+
38
+ COMMA_SEPARATOR = ', '
39
+
40
+ def initialize
41
+ @@initialized ||= static_initialize
42
+
43
+ # Use null migration checker unless given in context
44
+ @migration_checker = Puppet.lookup(:migration_checker) { Migration::MigrationChecker.singleton }
45
+ end
46
+
47
+ # @api private
48
+ def static_initialize
49
+ @@eval_visitor ||= Visitor.new(self, "eval", 1, 1)
50
+ @@lvalue_visitor ||= Visitor.new(self, "lvalue", 1, 1)
51
+ @@assign_visitor ||= Visitor.new(self, "assign", 3, 3)
52
+ @@string_visitor ||= Visitor.new(self, "string", 1, 1)
53
+
54
+ @@type_calculator ||= Types::TypeCalculator.singleton
55
+
56
+ @@compare_operator ||= CompareOperator.new
57
+ @@relationship_operator ||= RelationshipOperator.new
58
+ true
59
+ end
60
+ private :static_initialize
61
+
62
+ # @api private
63
+ def type_calculator
64
+ @@type_calculator
65
+ end
66
+
67
+ # Evaluates the given _target_ object in the given scope.
68
+ #
69
+ # @overload evaluate(target, scope)
70
+ # @param target [Object] evaluation target - see methods on the pattern assign_TYPE for actual supported types.
71
+ # @param scope [Object] the runtime specific scope class where evaluation should take place
72
+ # @return [Object] the result of the evaluation
73
+ #
74
+ # @api public
75
+ #
76
+ def evaluate(target, scope)
77
+ @@eval_visitor.visit_this_1(self, target, scope)
78
+ rescue SemanticError => e
79
+ # A raised issue may not know the semantic target, use errors call stack, but fill in the
80
+ # rest from a supplied semantic object, or the target instruction if there is not semantic
81
+ # object.
82
+ #
83
+ fail(e.issue, e.semantic || target, e.options, e)
84
+ rescue Puppet::PreformattedError => e
85
+ # Already formatted with location information, and with the wanted call stack.
86
+ # Note this is currently a specialized ParseError, so rescue-order is important
87
+ #
88
+ raise e
89
+ rescue Puppet::ParseError => e
90
+ # ParseError may be raised in ruby code without knowing the location
91
+ # in puppet code.
92
+ # Accept a ParseError that has file or line information available
93
+ # as an error that should be used verbatim. (Tests typically run without
94
+ # setting a file name).
95
+ # ParseError can supply an original - it is impossible to determine which
96
+ # call stack that should be propagated, using the ParseError's backtrace.
97
+ #
98
+ if e.file || e.line
99
+ raise e
100
+ else
101
+ # Since it had no location information, treat it as user intended a general purpose
102
+ # error. Pass on its call stack.
103
+ fail(Issues::RUNTIME_ERROR, target, { :detail => e.message }, e)
104
+ end
105
+ rescue Puppet::Error => e
106
+ # PuppetError has the ability to wrap an exception, if so, use the wrapped exception's
107
+ # call stack instead
108
+ fail(Issues::RUNTIME_ERROR, target, { :detail => e.message }, e.original || e)
109
+ rescue StopIteration => e
110
+ # Ensure these are not rescued as StandardError
111
+ raise e
112
+ rescue StandardError => e
113
+ # All other errors, use its message and call stack
114
+ fail(Issues::RUNTIME_ERROR, target, { :detail => e.message }, e)
115
+ end
116
+
117
+ # Assigns the given _value_ to the given _target_. The additional argument _o_ is the instruction that
118
+ # produced the target/value tuple and it is used to set the origin of the result.
119
+ #
120
+ # @param target [Object] assignment target - see methods on the pattern assign_TYPE for actual supported types.
121
+ # @param value [Object] the value to assign to `target`
122
+ # @param o [Model::PopsObject] originating instruction
123
+ # @param scope [Object] the runtime specific scope where evaluation should take place
124
+ #
125
+ # @api private
126
+ #
127
+ def assign(target, value, o, scope)
128
+ @@assign_visitor.visit_this_3(self, target, value, o, scope)
129
+ end
130
+
131
+ # Computes a value that can be used as the LHS in an assignment.
132
+ # @param o [Object] the expression to evaluate as a left (assignable) entity
133
+ # @param scope [Object] the runtime specific scope where evaluation should take place
134
+ #
135
+ # @api private
136
+ #
137
+ def lvalue(o, scope)
138
+ @@lvalue_visitor.visit_this_1(self, o, scope)
139
+ end
140
+
141
+ # Produces a String representation of the given object _o_ as used in interpolation.
142
+ # @param o [Object] the expression of which a string representation is wanted
143
+ # @param scope [Object] the runtime specific scope where evaluation should take place
144
+ #
145
+ # @api public
146
+ #
147
+ def string(o, scope)
148
+ @@string_visitor.visit_this_1(self, o, scope)
149
+ end
150
+
151
+ # Evaluate a BlockExpression in a new scope with variables bound to the
152
+ # given values.
153
+ #
154
+ # @param scope [Puppet::Parser::Scope] the parent scope
155
+ # @param variable_bindings [Hash{String => Object}] the variable names and values to bind (names are keys, bound values are values)
156
+ # @param block [Model::BlockExpression] the sequence of expressions to evaluate in the new scope
157
+ #
158
+ # @api private
159
+ #
160
+ def evaluate_block_with_bindings(scope, variable_bindings, block_expr)
161
+ scope.with_guarded_scope do
162
+ # change to create local scope_from - cannot give it file and line -
163
+ # that is the place of the call, not "here"
164
+ create_local_scope_from(variable_bindings, scope)
165
+ evaluate(block_expr, scope)
166
+ end
167
+ end
168
+
169
+ # Implementation of case option matching.
170
+ #
171
+ # This is the type of matching performed in a case option, using == for every type
172
+ # of value except regular expression where a match is performed.
173
+ #
174
+ def match?(left, right)
175
+ @@compare_operator.match(left, right, nil)
176
+ end
177
+
178
+ protected
179
+
180
+ def lvalue_VariableExpression(o, scope)
181
+ # evaluate the name
182
+ evaluate(o.expr, scope)
183
+ end
184
+
185
+ # Catches all illegal lvalues
186
+ #
187
+ def lvalue_Object(o, scope)
188
+ fail(Issues::ILLEGAL_ASSIGNMENT, o)
189
+ end
190
+
191
+ # An array is assignable if all entries are lvalues
192
+ def lvalue_LiteralList(o, scope)
193
+ o.values.map { |x| lvalue(x, scope) }
194
+ end
195
+
196
+ # Assign value to named variable.
197
+ # The '$' sign is never part of the name.
198
+ # @example In Puppet DSL
199
+ # $name = value
200
+ # @param name [String] name of variable without $
201
+ # @param value [Object] value to assign to the variable
202
+ # @param o [Model::PopsObject] originating instruction
203
+ # @param scope [Object] the runtime specific scope where evaluation should take place
204
+ # @return [value<Object>]
205
+ #
206
+ def assign_String(name, value, o, scope)
207
+ if name =~ /::/
208
+ fail(Issues::CROSS_SCOPE_ASSIGNMENT, o.left_expr, { :name => name })
209
+ end
210
+
211
+ set_variable(name, value, o, scope)
212
+ value
213
+ end
214
+
215
+ def assign_Numeric(n, value, o, scope)
216
+ fail(Issues::ILLEGAL_NUMERIC_ASSIGNMENT, o.left_expr, { :varname => n.to_s })
217
+ end
218
+
219
+ # Catches all illegal assignment (e.g. 1 = 2, {'a'=>1} = 2, etc)
220
+ #
221
+ def assign_Object(name, value, o, scope)
222
+ fail(Issues::ILLEGAL_ASSIGNMENT, o)
223
+ end
224
+
225
+ def assign_Array(lvalues, values, o, scope)
226
+ case values
227
+ when Hash
228
+ lvalues.map do |lval|
229
+ assign(lval,
230
+ values.fetch(lval) { |k| fail(Issues::MISSING_MULTI_ASSIGNMENT_KEY, o, :key => k) },
231
+ o, scope)
232
+ end
233
+ when Puppet::Pops::Types::PClassType
234
+ if Puppet[:tasks]
235
+ fail(Issues::CATALOG_OPERATION_NOT_SUPPORTED_WHEN_SCRIPTING, o, { :operation => _('multi var assignment from class') })
236
+ end
237
+
238
+ # assign variables from class variables
239
+ # lookup class resource and return one or more parameter values
240
+ # TODO: behavior when class_name is nil
241
+ resource = find_resource(scope, 'class', values.class_name)
242
+ if resource
243
+ base_name = "#{values.class_name.downcase}::"
244
+ idx = -1
245
+ result = lvalues.map do |lval|
246
+ idx += 1
247
+ varname = "#{base_name}#{lval}"
248
+ if variable_exists?(varname, scope)
249
+ result = get_variable_value(varname, o, scope)
250
+ assign(lval, result, o, scope)
251
+ else
252
+ fail(Puppet::Pops::Issues::MISSING_MULTI_ASSIGNMENT_VARIABLE, o.left_expr.values[idx], { :name => varname })
253
+ end
254
+ end
255
+ else
256
+ fail(Issues::UNKNOWN_RESOURCE, o.right_expr, { :type_name => 'Class', :title => values.class_name })
257
+ end
258
+
259
+ else
260
+ values = [values] unless values.is_a?(Array)
261
+ if values.size != lvalues.size
262
+ fail(Issues::ILLEGAL_MULTI_ASSIGNMENT_SIZE, o, :expected => lvalues.size, :actual => values.size)
263
+ end
264
+
265
+ lvalues.zip(values).map { |lval, val| assign(lval, val, o, scope) }
266
+ end
267
+ end
268
+
269
+ def eval_Factory(o, scope)
270
+ evaluate(o.model, scope)
271
+ end
272
+
273
+ # Evaluates any object not evaluated to something else to itself.
274
+ def eval_Object o, scope
275
+ o
276
+ end
277
+
278
+ # Allows nil to be used as a Nop, Evaluates to nil
279
+ def eval_NilClass(o, scope)
280
+ nil
281
+ end
282
+
283
+ # Evaluates Nop to nil.
284
+ def eval_Nop(o, scope)
285
+ nil
286
+ end
287
+
288
+ # Captures all LiteralValues not handled elsewhere.
289
+ #
290
+ def eval_LiteralValue(o, scope)
291
+ o.value
292
+ end
293
+
294
+ # Reserved Words fail to evaluate
295
+ #
296
+ def eval_ReservedWord(o, scope)
297
+ if !o.future
298
+ fail(Issues::RESERVED_WORD, o, { :word => o.word })
299
+ else
300
+ o.word
301
+ end
302
+ end
303
+
304
+ def eval_LiteralDefault(o, scope)
305
+ :default
306
+ end
307
+
308
+ def eval_LiteralUndef(o, scope)
309
+ nil
310
+ end
311
+
312
+ # A QualifiedReference (i.e. a capitalized qualified name such as Foo, or Foo::Bar) evaluates to a PTypeType
313
+ #
314
+ def eval_QualifiedReference(o, scope)
315
+ type = Types::TypeParser.singleton.interpret(o)
316
+ fail(Issues::UNKNOWN_RESOURCE_TYPE, o, { :type_name => type.type_string }) if type.is_a?(Types::PTypeReferenceType)
317
+
318
+ type
319
+ end
320
+
321
+ def eval_NotExpression(o, scope)
322
+ !is_true?(evaluate(o.expr, scope), o.expr)
323
+ end
324
+
325
+ def eval_UnaryMinusExpression(o, scope)
326
+ - coerce_numeric(evaluate(o.expr, scope), o, scope)
327
+ end
328
+
329
+ def eval_UnfoldExpression(o, scope)
330
+ candidate = evaluate(o.expr, scope)
331
+ case candidate
332
+ when nil
333
+ []
334
+ when Array
335
+ candidate
336
+ when Hash
337
+ candidate.to_a
338
+ when Puppet::Pops::Types::Iterable
339
+ candidate.to_a
340
+ else
341
+ # turns anything else into an array (so result can be unfolded)
342
+ [candidate]
343
+ end
344
+ end
345
+
346
+ # Abstract evaluation, returns array [left, right] with the evaluated result of left_expr and
347
+ # right_expr
348
+ # @return <Array<Object, Object>> array with result of evaluating left and right expressions
349
+ #
350
+ def eval_BinaryExpression o, scope
351
+ [evaluate(o.left_expr, scope), evaluate(o.right_expr, scope)]
352
+ end
353
+
354
+ # Evaluates assignment with operators =, +=, -= and
355
+ #
356
+ # @example Puppet DSL
357
+ # $a = 1
358
+ # $a += 1
359
+ # $a -= 1
360
+ #
361
+ def eval_AssignmentExpression(o, scope)
362
+ name = lvalue(o.left_expr, scope)
363
+ value = evaluate(o.right_expr, scope)
364
+
365
+ if o.operator == '='
366
+ assign(name, value, o, scope)
367
+ else
368
+ fail(Issues::UNSUPPORTED_OPERATOR, o, { :operator => o.operator })
369
+ end
370
+ value
371
+ end
372
+
373
+ ARITHMETIC_OPERATORS = ['+', '-', '*', '/', '%', '<<', '>>'].freeze
374
+ COLLECTION_OPERATORS = ['+', '-', '<<'].freeze
375
+
376
+ # Handles binary expression where lhs and rhs are array/hash or numeric and operator is +, - , *, % / << >>
377
+ #
378
+ def eval_ArithmeticExpression(o, scope)
379
+ left = evaluate(o.left_expr, scope)
380
+ right = evaluate(o.right_expr, scope)
381
+
382
+ begin
383
+ result = calculate(left, right, o, scope)
384
+ rescue ArgumentError => e
385
+ fail(Issues::RUNTIME_ERROR, o, { :detail => e.message }, e)
386
+ end
387
+ result
388
+ end
389
+
390
+ # Handles binary expression where lhs and rhs are array/hash or numeric and operator is +, - , *, % / << >>
391
+ #
392
+ def calculate(left, right, bin_expr, scope)
393
+ operator = bin_expr.operator
394
+ unless ARITHMETIC_OPERATORS.include?(operator)
395
+ fail(Issues::UNSUPPORTED_OPERATOR, bin_expr, { :operator => operator })
396
+ end
397
+
398
+ left_o = bin_expr.left_expr
399
+ if (left.is_a?(URI) || left.is_a?(Types::PBinaryType::Binary)) && operator == '+'
400
+ concatenate(left, right)
401
+ elsif (left.is_a?(Array) || left.is_a?(Hash)) && COLLECTION_OPERATORS.include?(operator)
402
+ # Handle operation on collections
403
+ case operator
404
+ when '+'
405
+ concatenate(left, right)
406
+ when '-'
407
+ delete(left, right)
408
+ when '<<'
409
+ unless left.is_a?(Array)
410
+ fail(Issues::OPERATOR_NOT_APPLICABLE, left_o, { :operator => operator, :left_value => left })
411
+ end
412
+
413
+ left + [right]
414
+ end
415
+ else
416
+ # Handle operation on numeric
417
+ left = coerce_numeric(left, left_o, scope)
418
+ right = coerce_numeric(right, bin_expr.right_expr, scope)
419
+ begin
420
+ if operator == '%' && (left.is_a?(Float) || right.is_a?(Float))
421
+ # Deny users the fun of seeing severe rounding errors and confusing results
422
+ fail(Issues::OPERATOR_NOT_APPLICABLE, left_o, { :operator => operator, :left_value => left }) if left.is_a?(Float)
423
+
424
+ fail(Issues::OPERATOR_NOT_APPLICABLE_WHEN, left_o, { :operator => operator, :left_value => left, :right_value => right })
425
+ end
426
+ if right.is_a?(Time::TimeData) && !left.is_a?(Time::TimeData)
427
+ if operator == '+' || operator == '*' && right.is_a?(Time::Timespan)
428
+ # Switch places. Let the TimeData do the arithmetic
429
+ x = left
430
+ left = right
431
+ right = x
432
+ elsif operator == '-' && right.is_a?(Time::Timespan)
433
+ left = Time::Timespan.new((left * Time::NSECS_PER_SEC).to_i)
434
+ else
435
+ fail(Issues::OPERATOR_NOT_APPLICABLE_WHEN, left_o, { :operator => operator, :left_value => left, :right_value => right })
436
+ end
437
+ end
438
+ result = left.send(operator, right)
439
+ rescue NoMethodError
440
+ fail(Issues::OPERATOR_NOT_APPLICABLE, left_o, { :operator => operator, :left_value => left })
441
+ rescue ZeroDivisionError
442
+ fail(Issues::DIV_BY_ZERO, bin_expr.right_expr)
443
+ end
444
+ case result
445
+ when Float
446
+ if result == Float::INFINITY || result == -Float::INFINITY
447
+ fail(Issues::RESULT_IS_INFINITY, left_o, { :operator => operator })
448
+ end
449
+ when Integer
450
+ if result < MIN_INTEGER || result > MAX_INTEGER
451
+ fail(Issues::NUMERIC_OVERFLOW, bin_expr, { :value => result })
452
+ end
453
+ end
454
+ result
455
+ end
456
+ end
457
+
458
+ def eval_EppExpression(o, scope)
459
+ contains_sensitive = false
460
+
461
+ scope["@epp"] = []
462
+ evaluate(o.body, scope)
463
+ result = scope["@epp"].map do |r|
464
+ if r.instance_of?(Puppet::Pops::Types::PSensitiveType::Sensitive)
465
+ contains_sensitive = true
466
+ string(r.unwrap, scope)
467
+ else
468
+ r
469
+ end
470
+ end.join
471
+
472
+ if contains_sensitive
473
+ Puppet::Pops::Types::PSensitiveType::Sensitive.new(result)
474
+ else
475
+ result
476
+ end
477
+ end
478
+
479
+ def eval_RenderStringExpression(o, scope)
480
+ scope["@epp"] << o.value.dup
481
+ nil
482
+ end
483
+
484
+ def eval_RenderExpression(o, scope)
485
+ result = evaluate(o.expr, scope)
486
+ if result.instance_of?(Puppet::Pops::Types::PSensitiveType::Sensitive)
487
+ scope["@epp"] << result
488
+ else
489
+ scope["@epp"] << string(result, scope)
490
+ end
491
+ nil
492
+ end
493
+
494
+ # Evaluates Puppet DSL ->, ~>, <-, and <~
495
+ def eval_RelationshipExpression(o, scope)
496
+ # First level evaluation, reduction to basic data types or puppet types, the relationship operator then translates this
497
+ # to the final set of references (turning strings into references, which can not naturally be done by the main evaluator since
498
+ # all strings should not be turned into references.
499
+ #
500
+ real = eval_BinaryExpression(o, scope)
501
+ @@relationship_operator.evaluate(real, o, scope)
502
+ end
503
+
504
+ # Evaluates x[key, key, ...]
505
+ #
506
+ def eval_AccessExpression(o, scope)
507
+ left = evaluate(o.left_expr, scope)
508
+ keys = o.keys || []
509
+ if left.is_a?(Types::PClassType)
510
+ # Evaluate qualified references without errors no undefined types
511
+ keys = keys.map { |key| key.is_a?(Model::QualifiedReference) ? Types::TypeParser.singleton.interpret(key) : evaluate(key, scope) }
512
+ else
513
+ keys = keys.map { |key| evaluate(key, scope) }
514
+ # Resource[File] becomes File
515
+ return keys[0] if Types::PResourceType::DEFAULT == left && keys.size == 1 && keys[0].is_a?(Types::PResourceType)
516
+ end
517
+ AccessOperator.new(o).access(left, scope, *keys)
518
+ end
519
+
520
+ # Evaluates <, <=, >, >=, and ==
521
+ #
522
+ def eval_ComparisonExpression o, scope
523
+ left = evaluate(o.left_expr, scope)
524
+ right = evaluate(o.right_expr, scope)
525
+
526
+ begin
527
+ # Left is a type
528
+ if left.is_a?(Types::PAnyType)
529
+ case o.operator
530
+ when '=='
531
+ @@type_calculator.equals(left, right)
532
+
533
+ when '!='
534
+ !@@type_calculator.equals(left, right)
535
+
536
+ when '<'
537
+ # left can be assigned to right, but they are not equal
538
+ @@type_calculator.assignable?(right, left) && !@@type_calculator.equals(left, right)
539
+ when '<='
540
+ # left can be assigned to right
541
+ @@type_calculator.assignable?(right, left)
542
+ when '>'
543
+ # right can be assigned to left, but they are not equal
544
+ @@type_calculator.assignable?(left, right) && !@@type_calculator.equals(left, right)
545
+ when '>='
546
+ # right can be assigned to left
547
+ @@type_calculator.assignable?(left, right)
548
+ else
549
+ fail(Issues::UNSUPPORTED_OPERATOR, o, { :operator => o.operator })
550
+ end
551
+ else
552
+ case o.operator
553
+ when '=='
554
+ @@compare_operator.equals(left, right)
555
+ when '!='
556
+ !@@compare_operator.equals(left, right)
557
+ when '<'
558
+ @@compare_operator.compare(left, right) < 0
559
+ when '<='
560
+ @@compare_operator.compare(left, right) <= 0
561
+ when '>'
562
+ @@compare_operator.compare(left, right) > 0
563
+ when '>='
564
+ @@compare_operator.compare(left, right) >= 0
565
+ else
566
+ fail(Issues::UNSUPPORTED_OPERATOR, o, { :operator => o.operator })
567
+ end
568
+ end
569
+ rescue ArgumentError => e
570
+ fail(Issues::COMPARISON_NOT_POSSIBLE, o, {
571
+ :operator => o.operator,
572
+ :left_value => left,
573
+ :right_value => right,
574
+ :detail => e.message
575
+ }, e)
576
+ end
577
+ end
578
+
579
+ # Evaluates matching expressions with type, string or regexp rhs expression.
580
+ # If RHS is a type, the =~ matches compatible (instance? of) type.
581
+ #
582
+ # @example
583
+ # x =~ /abc.*/
584
+ # @example
585
+ # x =~ "abc.*/"
586
+ # @example
587
+ # y = "abc"
588
+ # x =~ "${y}.*"
589
+ # @example
590
+ # [1,2,3] =~ Array[Integer[1,10]]
591
+ #
592
+ # Note that a string is not instance? of Regexp, only Regular expressions are.
593
+ # The Pattern type should instead be used as it is specified as subtype of String.
594
+ #
595
+ # @return [Boolean] if a match was made or not. Also sets $0..$n to matchdata in current scope.
596
+ #
597
+ def eval_MatchExpression o, scope
598
+ left = evaluate(o.left_expr, scope)
599
+ pattern = evaluate(o.right_expr, scope)
600
+
601
+ # matches RHS types as instance of for all types except a parameterized Regexp[R]
602
+ if pattern.is_a?(Types::PAnyType)
603
+ # evaluate as instance? of type check
604
+ matched = pattern.instance?(left)
605
+ # convert match result to Boolean true, or false
606
+ return o.operator == '=~' ? !!matched : !matched
607
+ end
608
+
609
+ if pattern.is_a?(SemanticPuppet::VersionRange)
610
+ # evaluate if range includes version
611
+ matched = Types::PSemVerRangeType.include?(pattern, left)
612
+ return o.operator == '=~' ? matched : !matched
613
+ end
614
+
615
+ begin
616
+ pattern = Regexp.new(pattern) unless pattern.is_a?(Regexp)
617
+ rescue StandardError => e
618
+ fail(Issues::MATCH_NOT_REGEXP, o.right_expr, { :detail => e.message }, e)
619
+ end
620
+ unless left.is_a?(String)
621
+ fail(Issues::MATCH_NOT_STRING, o.left_expr, { :left_value => left })
622
+ end
623
+
624
+ matched = pattern.match(left) # nil, or MatchData
625
+ set_match_data(matched, scope) # creates ephemeral
626
+
627
+ # convert match result to Boolean true, or false
628
+ o.operator == '=~' ? !!matched : !matched
629
+ end
630
+
631
+ # Evaluates Puppet DSL `in` expression
632
+ #
633
+ def eval_InExpression o, scope
634
+ left = evaluate(o.left_expr, scope)
635
+ right = evaluate(o.right_expr, scope)
636
+ @@compare_operator.include?(right, left, scope)
637
+ end
638
+
639
+ # @example
640
+ # $a and $b
641
+ # b is only evaluated if a is true
642
+ #
643
+ def eval_AndExpression o, scope
644
+ is_true?(evaluate(o.left_expr, scope), o.left_expr) ? is_true?(evaluate(o.right_expr, scope), o.right_expr) : false
645
+ end
646
+
647
+ # @example
648
+ # a or b
649
+ # b is only evaluated if a is false
650
+ #
651
+ def eval_OrExpression o, scope
652
+ is_true?(evaluate(o.left_expr, scope), o.left_expr) ? true : is_true?(evaluate(o.right_expr, scope), o.right_expr)
653
+ end
654
+
655
+ # Evaluates each entry of the literal list and creates a new Array
656
+ # Supports unfolding of entries
657
+ # @return [Array] with the evaluated content
658
+ #
659
+ def eval_LiteralList o, scope
660
+ unfold([], o.values, scope)
661
+ end
662
+
663
+ # Evaluates each entry of the literal hash and creates a new Hash.
664
+ # @return [Hash] with the evaluated content
665
+ #
666
+ def eval_LiteralHash o, scope
667
+ # optimized
668
+ o.entries.each_with_object({}) { |entry, h| h[evaluate(entry.key, scope)] = evaluate(entry.value, scope); }
669
+ end
670
+
671
+ # Evaluates all statements and produces the last evaluated value
672
+ #
673
+ def eval_BlockExpression o, scope
674
+ o.statements.reduce(nil) { |_memo, s| evaluate(s, scope) }
675
+ end
676
+
677
+ # Performs optimized search over case option values, lazily evaluating each
678
+ # until there is a match. If no match is found, the case expression's default expression
679
+ # is evaluated (it may be nil or Nop if there is no default, thus producing nil).
680
+ # If an option matches, the result of evaluating that option is returned.
681
+ # @return [Object, nil] what a matched option returns, or nil if nothing matched.
682
+ #
683
+ def eval_CaseExpression(o, scope)
684
+ # memo scope level before evaluating test - don't want a match in the case test to leak $n match vars
685
+ # to expressions after the case expression.
686
+ #
687
+ scope.with_guarded_scope do
688
+ test = evaluate(o.test, scope)
689
+
690
+ result = nil
691
+ the_default = nil
692
+ if o.options.find do |co|
693
+ # the first case option that matches
694
+ next unless co.values.find do |c|
695
+ c = unwind_parentheses(c)
696
+ case c
697
+ when Model::LiteralDefault
698
+ the_default = co.then_expr
699
+ next false
700
+ when Model::UnfoldExpression
701
+ # not ideal for error reporting, since it is not known which unfolded result
702
+ # that caused an error - the entire unfold expression is blamed (i.e. the var c, passed to is_match?)
703
+ evaluate(c, scope).any? { |v| is_match?(test, v, c, co, scope) }
704
+ else
705
+ is_match?(test, evaluate(c, scope), c, co, scope)
706
+ end
707
+ end
708
+
709
+ result = evaluate(co.then_expr, scope)
710
+ true # the option was picked
711
+ end
712
+ result # an option was picked, and produced a result
713
+ else
714
+ evaluate(the_default, scope) # evaluate the default (should be a nop/nil) if there is no default).
715
+ end
716
+ end
717
+ end
718
+
719
+ # Evaluates a CollectExpression by creating a collector transformer. The transformer
720
+ # will evaluate the collection, create the appropriate collector, and hand it off
721
+ # to the compiler to collect the resources specified by the query.
722
+ #
723
+ def eval_CollectExpression o, scope
724
+ if o.query.is_a?(Model::ExportedQuery)
725
+ optionally_fail(Issues::RT_NO_STORECONFIGS, o);
726
+ end
727
+ CollectorTransformer.new().transform(o, scope)
728
+ end
729
+
730
+ def eval_ParenthesizedExpression(o, scope)
731
+ evaluate(o.expr, scope)
732
+ end
733
+
734
+ # This evaluates classes, nodes and resource type definitions to nil, since 3x:
735
+ # instantiates them, and evaluates their parameters and body. This is achieved by
736
+ # providing bridge AST classes in Puppet::Parser::AST::PopsBridge that bridges a
737
+ # Pops Program and a Pops Expression.
738
+ #
739
+ # Since all Definitions are handled "out of band", they are treated as a no-op when
740
+ # evaluated.
741
+ #
742
+ def eval_Definition(o, scope)
743
+ nil
744
+ end
745
+
746
+ def eval_Program(o, scope)
747
+ file = o.locator.file
748
+ line = 0
749
+ # Add stack frame for "top scope" logic. See Puppet::Pops::PuppetStack
750
+ Puppet::Pops::PuppetStack.stack(file, line, self, 'evaluate', [o.body, scope])
751
+ # evaluate(o.body, scope)
752
+ rescue Puppet::Pops::Evaluator::PuppetStopIteration => ex
753
+ # breaking out of a file level program is not allowed
754
+ # TRANSLATOR break() is a method that should not be translated
755
+ raise Puppet::ParseError.new(_("break() from context where this is illegal"), ex.file, ex.line)
756
+ end
757
+
758
+ # Produces Array[PAnyType], an array of resource references
759
+ #
760
+ def eval_ResourceExpression(o, scope)
761
+ exported = o.exported
762
+ virtual = o.virtual
763
+
764
+ # Get the type name
765
+ type_name =
766
+ if (tmp_name = o.type_name).is_a?(Model::QualifiedName)
767
+ tmp_name.value # already validated as a name
768
+ else
769
+ type_name_acceptable =
770
+ case o.type_name
771
+ when Model::QualifiedReference
772
+ true
773
+ when Model::AccessExpression
774
+ o.type_name.left_expr.is_a?(Model::QualifiedReference)
775
+ end
776
+
777
+ evaluated_name = evaluate(tmp_name, scope)
778
+ unless type_name_acceptable
779
+ actual = type_calculator.generalize(type_calculator.infer(evaluated_name)).to_s
780
+ fail(Issues::ILLEGAL_RESOURCE_TYPE, o.type_name, { :actual => actual })
781
+ end
782
+
783
+ # must be a CatalogEntry subtype
784
+ case evaluated_name
785
+ when Types::PClassType
786
+ unless evaluated_name.class_name.nil?
787
+ fail(Issues::ILLEGAL_RESOURCE_TYPE, o.type_name, { :actual => evaluated_name.to_s })
788
+ end
789
+
790
+ 'class'
791
+
792
+ when Types::PResourceType
793
+ unless evaluated_name.title().nil?
794
+ fail(Issues::ILLEGAL_RESOURCE_TYPE, o.type_name, { :actual => evaluated_name.to_s })
795
+ end
796
+
797
+ evaluated_name.type_name # assume validated
798
+
799
+ when Types::PTypeReferenceType
800
+ fail(Issues::UNKNOWN_RESOURCE_TYPE, o.type_string, { :type_name => evaluated_name.to_s })
801
+
802
+ else
803
+ actual = type_calculator.generalize(type_calculator.infer(evaluated_name)).to_s
804
+ fail(Issues::ILLEGAL_RESOURCE_TYPE, o.type_name, { :actual => actual })
805
+ end
806
+ end
807
+
808
+ # This is a runtime check - the model is valid, but will have runtime issues when evaluated
809
+ # and storeconfigs is not set.
810
+ if o.exported
811
+ optionally_fail(Issues::RT_NO_STORECONFIGS_EXPORT, o);
812
+ end
813
+
814
+ titles_to_body = {}
815
+ body_to_titles = {}
816
+ body_to_params = {}
817
+
818
+ # titles are evaluated before attribute operations
819
+ o.bodies.map do |body|
820
+ titles = evaluate(body.title, scope)
821
+
822
+ # Title may not be nil
823
+ # Titles may be given as an array, it is ok if it is empty, but not if it contains nil entries
824
+ # Titles may not be an empty String
825
+ # Titles must be unique in the same resource expression
826
+ # There may be a :default entry, its entries apply with lower precedence
827
+ #
828
+ if titles.nil?
829
+ fail(Issues::MISSING_TITLE, body.title)
830
+ end
831
+
832
+ titles = [titles].flatten
833
+
834
+ # Check types of evaluated titles and duplicate entries
835
+ titles.each_with_index do |title, index|
836
+ if title.nil?
837
+ fail(Issues::MISSING_TITLE_AT, body.title, { :index => index })
838
+
839
+ elsif !title.is_a?(String) && title != :default
840
+ actual = type_calculator.generalize(type_calculator.infer(title)).to_s
841
+ fail(Issues::ILLEGAL_TITLE_TYPE_AT, body.title, { :index => index, :actual => actual })
842
+
843
+ elsif title == EMPTY_STRING
844
+ fail(Issues::EMPTY_STRING_TITLE_AT, body.title, { :index => index })
845
+
846
+ elsif titles_to_body[title]
847
+ fail(Issues::DUPLICATE_TITLE, o, { :title => title })
848
+ end
849
+
850
+ titles_to_body[title] = body
851
+ end
852
+
853
+ # Do not create a real instance from the :default case
854
+ titles.delete(:default)
855
+
856
+ body_to_titles[body] = titles
857
+
858
+ # Store evaluated parameters in a hash associated with the body, but do not yet create resource
859
+ # since the entry containing :defaults may appear later
860
+ body_to_params[body] = body.operations.each_with_object({}) do |op, param_memo|
861
+ params = evaluate(op, scope)
862
+ params = [params] unless params.is_a?(Array)
863
+ params.each do |p|
864
+ if param_memo.include? p.name
865
+ fail(Issues::DUPLICATE_ATTRIBUTE, o, { :attribute => p.name })
866
+ end
867
+
868
+ param_memo[p.name] = p
869
+ end
870
+ end
871
+ end
872
+
873
+ # Titles and Operations have now been evaluated and resources can be created
874
+ # Each production is a PResource, and an array of all is produced as the result of
875
+ # evaluating the ResourceExpression.
876
+ #
877
+ defaults_hash = body_to_params[titles_to_body[:default]] || {}
878
+ o.bodies.map do |body|
879
+ titles = body_to_titles[body]
880
+ params = defaults_hash.merge(body_to_params[body] || {})
881
+ create_resources(o, scope, virtual, exported, type_name, titles, params.values)
882
+ end.flatten.compact
883
+ end
884
+
885
+ def eval_ResourceOverrideExpression(o, scope)
886
+ evaluated_resources = evaluate(o.resources, scope)
887
+ evaluated_parameters = o.operations.map { |op| evaluate(op, scope) }
888
+ create_resource_overrides(o, scope, [evaluated_resources].flatten, evaluated_parameters)
889
+ evaluated_resources
890
+ end
891
+
892
+ def eval_ApplyExpression(o, scope)
893
+ # All expressions are wrapped in an ApplyBlockExpression so we can identify the contents of
894
+ # that block. However we don't want to serialize the block expression, so unwrap here.
895
+ body = if o.body.statements.count == 1
896
+ o.body.statements[0]
897
+ else
898
+ Model::BlockExpression.from_asserted_hash(o.body._pcore_init_hash)
899
+ end
900
+
901
+ Puppet.lookup(:apply_executor).apply(unfold([], o.arguments, scope), body, scope)
902
+ end
903
+
904
+ # Produces 3x parameter
905
+ def eval_AttributeOperation(o, scope)
906
+ create_resource_parameter(o, scope, o.attribute_name, evaluate(o.value_expr, scope), o.operator)
907
+ end
908
+
909
+ def eval_AttributesOperation(o, scope)
910
+ hashed_params = evaluate(o.expr, scope)
911
+ unless hashed_params.is_a?(Hash)
912
+ actual = type_calculator.generalize(type_calculator.infer(hashed_params)).to_s
913
+ fail(Issues::TYPE_MISMATCH, o.expr, { :expected => 'Hash', :actual => actual })
914
+ end
915
+ hashed_params.map { |k, v| create_resource_parameter(o, scope, k, v, '=>') }
916
+ end
917
+
918
+ # Sets default parameter values for a type, produces the type
919
+ #
920
+ def eval_ResourceDefaultsExpression(o, scope)
921
+ type = evaluate(o.type_ref, scope)
922
+ type_name =
923
+ if type.is_a?(Types::PResourceType) && !type.type_name.nil? && type.title.nil?
924
+ type.type_name # assume it is a valid name
925
+ else
926
+ actual = type_calculator.generalize(type_calculator.infer(type))
927
+ fail(Issues::ILLEGAL_RESOURCE_TYPE, o.type_ref, { :actual => actual })
928
+ end
929
+ evaluated_parameters = o.operations.map { |op| evaluate(op, scope) }
930
+ create_resource_defaults(o, scope, type_name, evaluated_parameters)
931
+ # Produce the type
932
+ type
933
+ end
934
+
935
+ # Evaluates function call by name.
936
+ #
937
+ def eval_CallNamedFunctionExpression(o, scope)
938
+ # If LHS is a type (i.e. Integer, or Integer[...]
939
+ # the call is taken as an instantiation of the given type
940
+ #
941
+ functor = o.functor_expr
942
+ if functor.is_a?(Model::QualifiedReference) ||
943
+ functor.is_a?(Model::AccessExpression) && functor.left_expr.is_a?(Model::QualifiedReference)
944
+ # instantiation
945
+ type = evaluate(functor, scope)
946
+ return call_function_with_block('new', unfold([type], o.arguments || [], scope), o, scope)
947
+ end
948
+
949
+ # The functor expression is not evaluated, it is not possible to select the function to call
950
+ # via an expression like $a()
951
+ case functor
952
+ when Model::QualifiedName
953
+ # ok
954
+ when Model::RenderStringExpression
955
+ # helpful to point out this easy to make Epp error
956
+ fail(Issues::ILLEGAL_EPP_PARAMETERS, o)
957
+ else
958
+ fail(Issues::ILLEGAL_EXPRESSION, o.functor_expr, { :feature => 'function name', :container => o })
959
+ end
960
+ name = o.functor_expr.value
961
+ call_function_with_block(name, unfold([], o.arguments, scope), o, scope)
962
+ end
963
+
964
+ # Evaluation of CallMethodExpression handles a NamedAccessExpression functor (receiver.function_name)
965
+ #
966
+ def eval_CallMethodExpression(o, scope)
967
+ unless o.functor_expr.is_a? Model::NamedAccessExpression
968
+ fail(Issues::ILLEGAL_EXPRESSION, o.functor_expr, { :feature => 'function accessor', :container => o })
969
+ end
970
+
971
+ receiver = unfold([], [o.functor_expr.left_expr], scope)
972
+ name = o.functor_expr.right_expr
973
+ unless name.is_a? Model::QualifiedName
974
+ fail(Issues::ILLEGAL_EXPRESSION, o.functor_expr, { :feature => 'function name', :container => o })
975
+ end
976
+
977
+ name = name.value # the string function name
978
+
979
+ obj = receiver[0]
980
+ receiver_type = Types::TypeCalculator.infer_callable_methods_t(obj)
981
+ if receiver_type.is_a?(Types::TypeWithMembers)
982
+ member = receiver_type[name]
983
+ unless member.nil?
984
+ args = unfold([], o.arguments || [], scope)
985
+ return o.lambda.nil? ? member.invoke(obj, scope, args) : member.invoke(obj, scope, args, &proc_from_lambda(o.lambda, scope))
986
+ end
987
+ end
988
+
989
+ call_function_with_block(name, unfold(receiver, o.arguments || [], scope), o, scope)
990
+ end
991
+
992
+ def call_function_with_block(name, evaluated_arguments, o, scope)
993
+ if o.lambda.nil?
994
+ call_function(name, evaluated_arguments, o, scope)
995
+ else
996
+ call_function(name, evaluated_arguments, o, scope, &proc_from_lambda(o.lambda, scope))
997
+ end
998
+ end
999
+ private :call_function_with_block
1000
+
1001
+ def proc_from_lambda(lambda, scope)
1002
+ closure = Closure::Dynamic.new(self, lambda, scope)
1003
+ PuppetProc.new(closure) { |*args| closure.call(*args) }
1004
+ end
1005
+ private :proc_from_lambda
1006
+
1007
+ # @example
1008
+ # $x ? { 10 => true, 20 => false, default => 0 }
1009
+ #
1010
+ def eval_SelectorExpression o, scope
1011
+ # memo scope level before evaluating test - don't want a match in the case test to leak $n match vars
1012
+ # to expressions after the selector expression.
1013
+ #
1014
+ scope.with_guarded_scope do
1015
+ test = evaluate(o.left_expr, scope)
1016
+
1017
+ the_default = nil
1018
+ selected = o.selectors.find do |s|
1019
+ me = unwind_parentheses(s.matching_expr)
1020
+ case me
1021
+ when Model::LiteralDefault
1022
+ the_default = s.value_expr
1023
+ false
1024
+ when Model::UnfoldExpression
1025
+ # not ideal for error reporting, since it is not known which unfolded result
1026
+ # that caused an error - the entire unfold expression is blamed (i.e. the var c, passed to is_match?)
1027
+ evaluate(me, scope).any? { |v| is_match?(test, v, me, s, scope) }
1028
+ else
1029
+ is_match?(test, evaluate(me, scope), me, s, scope)
1030
+ end
1031
+ end
1032
+ if selected
1033
+ evaluate(selected.value_expr, scope)
1034
+ elsif the_default
1035
+ evaluate(the_default, scope)
1036
+ else
1037
+ fail(Issues::UNMATCHED_SELECTOR, o.left_expr, :param_value => test)
1038
+ end
1039
+ end
1040
+ end
1041
+
1042
+ # Evaluates Puppet DSL Heredoc
1043
+ def eval_HeredocExpression o, scope
1044
+ expr = o.text_expr
1045
+ result = evaluate(o.text_expr, scope)
1046
+ unless expr.is_a?(Model::LiteralString)
1047
+ # When expr is a LiteralString, validation has already validated this
1048
+ assert_external_syntax(scope, result, o.syntax, o.text_expr)
1049
+ end
1050
+ result
1051
+ end
1052
+
1053
+ # Evaluates Puppet DSL `if`
1054
+ def eval_IfExpression o, scope
1055
+ scope.with_guarded_scope do
1056
+ if is_true?(evaluate(o.test, scope), o.test)
1057
+ evaluate(o.then_expr, scope)
1058
+ else
1059
+ evaluate(o.else_expr, scope)
1060
+ end
1061
+ end
1062
+ end
1063
+
1064
+ # Evaluates Puppet DSL `unless`
1065
+ def eval_UnlessExpression o, scope
1066
+ scope.with_guarded_scope do
1067
+ if is_true?(evaluate(o.test, scope), o.test)
1068
+ evaluate(o.else_expr, scope)
1069
+ else
1070
+ evaluate(o.then_expr, scope)
1071
+ end
1072
+ end
1073
+ end
1074
+
1075
+ # Evaluates a variable (getting its value)
1076
+ # The evaluator is lenient; any expression producing a String is used as a name
1077
+ # of a variable.
1078
+ #
1079
+ def eval_VariableExpression o, scope
1080
+ # Evaluator is not too fussy about what constitutes a name as long as the result
1081
+ # is a String and a valid variable name
1082
+ #
1083
+ name = evaluate(o.expr, scope)
1084
+
1085
+ # Should be caught by validation, but make this explicit here as well, or mysterious evaluation issues
1086
+ # may occur for some evaluation use cases.
1087
+ case name
1088
+ when String
1089
+ # do nothing
1090
+ when Numeric
1091
+ # do nothing
1092
+ else
1093
+ fail(Issues::ILLEGAL_VARIABLE_EXPRESSION, o.expr)
1094
+ end
1095
+ get_variable_value(name, o, scope)
1096
+ end
1097
+
1098
+ # Evaluates double quoted strings that may contain interpolation
1099
+ #
1100
+ def eval_ConcatenatedString o, scope
1101
+ o.segments.collect { |expr| string(evaluate(expr, scope), scope) }.join
1102
+ end
1103
+
1104
+ # If the wrapped expression is a QualifiedName, it is taken as the name of a variable in scope.
1105
+ # Note that this is different from the 3.x implementation, where an initial qualified name
1106
+ # is accepted. (e.g. `"---${var + 1}---"` is legal. This implementation requires such concrete
1107
+ # syntax to be expressed in a model as `(TextExpression (+ (Variable var) 1)` - i.e. moving the decision to
1108
+ # the parser.
1109
+ #
1110
+ # Semantics; the result of an expression is turned into a string, nil is silently transformed to empty
1111
+ # string.
1112
+ # @return [String] the interpolated result
1113
+ #
1114
+ def eval_TextExpression o, scope
1115
+ if o.expr.is_a?(Model::QualifiedName)
1116
+ string(get_variable_value(o.expr.value, o, scope), scope)
1117
+ else
1118
+ string(evaluate(o.expr, scope), scope)
1119
+ end
1120
+ end
1121
+
1122
+ def string_Object(o, scope)
1123
+ o.to_s
1124
+ end
1125
+
1126
+ def string_Symbol(o, scope)
1127
+ if :undef == o # optimized comparison 1.44 vs 1.95
1128
+ EMPTY_STRING
1129
+ else
1130
+ o.to_s
1131
+ end
1132
+ end
1133
+
1134
+ def string_Array(o, scope)
1135
+ "[#{o.map { |e| string(e, scope) }.join(COMMA_SEPARATOR)}]"
1136
+ end
1137
+
1138
+ def string_Hash(o, scope)
1139
+ "{#{o.map { |k, v| "#{string(k, scope)} => #{string(v, scope)}" }.join(COMMA_SEPARATOR)}}"
1140
+ end
1141
+
1142
+ def string_Regexp(o, scope)
1143
+ Types::PRegexpType.regexp_to_s_with_delimiters(o)
1144
+ end
1145
+
1146
+ def string_PAnyType(o, scope)
1147
+ o.to_s
1148
+ end
1149
+
1150
+ # Produces concatenation / merge of x and y.
1151
+ #
1152
+ # When x is an Array, y of type produces:
1153
+ #
1154
+ # * Array => concatenation `[1,2], [3,4] => [1,2,3,4]`
1155
+ # * Hash => concatenation of hash as array `[key, value, key, value, ...]`
1156
+ # * any other => concatenation of single value
1157
+ #
1158
+ # When x is a Hash, y of type produces:
1159
+ #
1160
+ # * Array => merge of array interpreted as `[key, value, key, value,...]`
1161
+ # * Hash => a merge, where entries in `y` overrides
1162
+ # * any other => error
1163
+ #
1164
+ # When x is a URI, y of type produces:
1165
+ #
1166
+ # * String => merge of URI interpreted x + URI(y) using URI merge semantics
1167
+ # * URI => merge of URI interpreted x + y using URI merge semantics
1168
+ # * any other => error
1169
+ #
1170
+ # When x is nil, an empty array is used instead.
1171
+ #
1172
+ # @note to concatenate an Array, nest the array - i.e. `[1,2], [[2,3]]`
1173
+ #
1174
+ # @overload concatenate(obj_x, obj_y)
1175
+ # @param obj_x [Object] object to wrap in an array and concatenate to; see other overloaded methods for return type
1176
+ # @param ary_y [Object] array to concatenate at end of `ary_x`
1177
+ # @return [Object] wraps obj_x in array before using other overloaded option based on type of obj_y
1178
+ # @overload concatenate(ary_x, ary_y)
1179
+ # @param ary_x [Array] array to concatenate to
1180
+ # @param ary_y [Array] array to concatenate at end of `ary_x`
1181
+ # @return [Array] new array with `ary_x` + `ary_y`
1182
+ # @overload concatenate(ary_x, hsh_y)
1183
+ # @param ary_x [Array] array to concatenate to
1184
+ # @param hsh_y [Hash] converted to array form, and concatenated to array
1185
+ # @return [Array] new array with `ary_x` + `hsh_y` converted to array
1186
+ # @overload concatenate (ary_x, obj_y)
1187
+ # @param ary_x [Array] array to concatenate to
1188
+ # @param obj_y [Object] non array or hash object to add to array
1189
+ # @return [Array] new array with `ary_x` + `obj_y` added as last entry
1190
+ # @overload concatenate(hsh_x, ary_y)
1191
+ # @param hsh_x [Hash] the hash to merge with
1192
+ # @param ary_y [Array] array interpreted as even numbered sequence of key, value merged with `hsh_x`
1193
+ # @return [Hash] new hash with `hsh_x` merged with `ary_y` interpreted as hash in array form
1194
+ # @overload concatenate(hsh_x, hsh_y)
1195
+ # @param hsh_x [Hash] the hash to merge to
1196
+ # @param hsh_y [Hash] hash merged with `hsh_x`
1197
+ # @return [Hash] new hash with `hsh_x` merged with `hsh_y`
1198
+ # @overload concatenate(uri_x, uri_y)
1199
+ # @param uri_x [URI] the uri to merge to
1200
+ # @param uri_y [URI] uri to merged with `uri_x`
1201
+ # @return [URI] new uri with `uri_x` merged with `uri_y`
1202
+ # @overload concatenate(uri_x, string_y)
1203
+ # @param uri_x [URI] the uri to merge to
1204
+ # @param string_y [String] string to merge with `uri_x`
1205
+ # @return [URI] new uri with `uri_x` merged with `string_y`
1206
+ # @raise [ArgumentError] when `xxx_x` is neither an Array nor a Hash
1207
+ # @raise [ArgumentError] when `xxx_x` is a Hash, and `xxx_y` is neither Array nor Hash.
1208
+ #
1209
+ def concatenate(x, y)
1210
+ case x
1211
+ when Array
1212
+ y = case y
1213
+ when Array then y
1214
+ when Hash then y.to_a
1215
+ else [y]
1216
+ end
1217
+ x + y # new array with concatenation
1218
+ when Hash
1219
+ y = case y
1220
+ when Hash then y
1221
+ when Array
1222
+ # Hash[[a, 1, b, 2]] => {}
1223
+ # Hash[a,1,b,2] => {a => 1, b => 2}
1224
+ # Hash[[a,1], [b,2]] => {[a,1] => [b,2]}
1225
+ # Hash[[[a,1], [b,2]]] => {a => 1, b => 2}
1226
+ # Use type calculator to determine if array is Array[Array[?]], and if so use second form
1227
+ # of call
1228
+ t = @@type_calculator.infer(y)
1229
+ if t.element_type.is_a? Types::PArrayType
1230
+ y.to_h
1231
+ else
1232
+ Hash[*y]
1233
+ end
1234
+ else
1235
+ raise ArgumentError, _('Can only append Array or Hash to a Hash')
1236
+ end
1237
+ x.merge y # new hash with overwrite
1238
+ when URI
1239
+ raise ArgumentError, _('An URI can only be merged with an URI or String') unless y.is_a?(String) || y.is_a?(URI)
1240
+
1241
+ x + y
1242
+ when Types::PBinaryType::Binary
1243
+ raise ArgumentError, _('Can only append Binary to a Binary') unless y.is_a?(Types::PBinaryType::Binary)
1244
+
1245
+ Types::PBinaryType::Binary.from_binary_string(x.binary_buffer + y.binary_buffer)
1246
+ else
1247
+ concatenate([x], y)
1248
+ end
1249
+ end
1250
+
1251
+ # Produces the result x \ y (set difference)
1252
+ # When `x` is an Array, `y` is transformed to an array and then all matching elements removed from x.
1253
+ # When `x` is a Hash, all contained keys are removed from x as listed in `y` if it is an Array, or all its keys if it is a Hash.
1254
+ # The difference is returned. The given `x` and `y` are not modified by this operation.
1255
+ # @raise [ArgumentError] when `x` is neither an Array nor a Hash
1256
+ #
1257
+ def delete(x, y)
1258
+ result = x.dup
1259
+ case x
1260
+ when Array
1261
+ y = case y
1262
+ when Array then y
1263
+ when Hash then y.to_a
1264
+ else [y]
1265
+ end
1266
+ y.each { |e| result.delete(e) }
1267
+ when Hash
1268
+ y = case y
1269
+ when Array then y
1270
+ when Hash then y.keys
1271
+ else [y]
1272
+ end
1273
+ y.each { |e| result.delete(e) }
1274
+ else
1275
+ raise ArgumentError, _("Can only delete from an Array or Hash.")
1276
+ end
1277
+ result
1278
+ end
1279
+
1280
+ # Implementation of case option matching.
1281
+ #
1282
+ # This is the type of matching performed in a case option, using == for every type
1283
+ # of value except regular expression where a match is performed.
1284
+ #
1285
+ def is_match?(left, right, o, option_expr, scope)
1286
+ @@compare_operator.match(left, right, scope)
1287
+ end
1288
+
1289
+ # Maps the expression in the given array to their product except for UnfoldExpressions which are first unfolded.
1290
+ # The result is added to the given result Array.
1291
+ # @param result [Array] Where to add the result (may contain information to add to)
1292
+ # @param array [Array[Model::Expression] the expressions to map
1293
+ # @param scope [Puppet::Parser::Scope] the scope to evaluate in
1294
+ # @return [Array] the given result array with content added from the operation
1295
+ #
1296
+ def unfold(result, array, scope)
1297
+ array.each do |x|
1298
+ x = unwind_parentheses(x)
1299
+ if x.is_a?(Model::UnfoldExpression)
1300
+ result.concat(evaluate(x, scope))
1301
+ else
1302
+ result << evaluate(x, scope)
1303
+ end
1304
+ end
1305
+ result
1306
+ end
1307
+ private :unfold
1308
+
1309
+ def unwind_parentheses(o)
1310
+ return o unless o.is_a?(Model::ParenthesizedExpression)
1311
+
1312
+ unwind_parentheses(o.expr)
1313
+ end
1314
+ private :unwind_parentheses
1315
+ end
1316
+ end
1317
+ end