openvox 7.37.1

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