puppet 4.3.0 → 4.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (560) hide show
  1. checksums.yaml +7 -0
  2. data/COMMITTERS.md +2 -2
  3. data/CONTRIBUTING.md +6 -6
  4. data/LICENSE +1 -1
  5. data/README.md +8 -9
  6. data/conf/auth.conf +2 -2
  7. data/ext/README.environment +1 -1
  8. data/ext/build_defaults.yaml +1 -1
  9. data/ext/debian/README.source +1 -1
  10. data/ext/debian/control +1 -1
  11. data/ext/debian/copyright +4 -4
  12. data/ext/debian/puppetmaster.README.debian +11 -9
  13. data/ext/emacs/puppet-mode.el +1 -1
  14. data/ext/envpuppet +2 -2
  15. data/ext/ips/puppetagent.xml +1 -1
  16. data/ext/ips/puppetmaster.xml +1 -1
  17. data/ext/project_data.yaml +8 -0
  18. data/ext/puppet-test +3 -3
  19. data/ext/rack/example-passenger-vhost.conf +1 -1
  20. data/ext/redhat/puppet.spec.erb +2 -2
  21. data/ext/regexp_nodes/regexp_nodes.rb +1 -1
  22. data/ext/solaris/pkginfo +1 -1
  23. data/ext/solaris/smf/puppet.xml +1 -1
  24. data/ext/suse/puppet.spec +2 -2
  25. data/ext/upload_facts.rb +1 -1
  26. data/ext/windows/puppet_interactive.bat +6 -0
  27. data/ext/windows/puppet_shell.bat +9 -0
  28. data/ext/windows/run_puppet_interactive.bat +9 -0
  29. data/ext/yaml_nodes.rb +1 -1
  30. data/install.rb +30 -20
  31. data/lib/hiera/scope.rb +1 -1
  32. data/lib/puppet/agent.rb +1 -1
  33. data/lib/puppet/application/agent.rb +4 -2
  34. data/lib/puppet/application/apply.rb +7 -4
  35. data/lib/puppet/application/cert.rb +1 -1
  36. data/lib/puppet/application/device.rb +1 -1
  37. data/lib/puppet/application/filebucket.rb +1 -1
  38. data/lib/puppet/application/inspect.rb +1 -1
  39. data/lib/puppet/application/lookup.rb +45 -47
  40. data/lib/puppet/application/master.rb +2 -2
  41. data/lib/puppet/application/resource.rb +1 -1
  42. data/lib/puppet/configurer.rb +100 -22
  43. data/lib/puppet/data_providers/hiera_config.rb +28 -3
  44. data/lib/puppet/data_providers/hiera_interpolate.rb +30 -15
  45. data/lib/puppet/data_providers/hiera_support.rb +1 -1
  46. data/lib/puppet/data_providers/json_data_provider_factory.rb +2 -2
  47. data/lib/puppet/data_providers/lookup_adapter.rb +73 -26
  48. data/lib/puppet/data_providers/yaml_data_provider_factory.rb +2 -2
  49. data/lib/puppet/defaults.rb +69 -22
  50. data/lib/puppet/environments.rb +3 -1
  51. data/lib/puppet/face/config.rb +1 -1
  52. data/lib/puppet/face/epp.rb +1 -1
  53. data/lib/puppet/face/help/man.erb +1 -1
  54. data/lib/puppet/face/module/install.rb +6 -6
  55. data/lib/puppet/face/parser.rb +12 -9
  56. data/lib/puppet/face/status.rb +2 -1
  57. data/lib/puppet/feature/cfpropertylist.rb +3 -0
  58. data/lib/puppet/feature/telnet.rb +9 -0
  59. data/lib/puppet/file_serving/http_metadata.rb +46 -0
  60. data/lib/puppet/file_serving/metadata.rb +18 -2
  61. data/lib/puppet/file_serving/terminus_selector.rb +2 -0
  62. data/lib/puppet/file_system/file_impl.rb +2 -2
  63. data/lib/puppet/file_system/memory_impl.rb +1 -1
  64. data/lib/puppet/file_system/uniquefile.rb +1 -1
  65. data/lib/puppet/file_system.rb +2 -2
  66. data/lib/puppet/forge/repository.rb +1 -31
  67. data/lib/puppet/forge.rb +1 -1
  68. data/lib/puppet/functions/assert_type.rb +9 -9
  69. data/lib/puppet/functions/each.rb +5 -13
  70. data/lib/puppet/functions/filter.rb +5 -14
  71. data/lib/puppet/functions/lookup.rb +126 -150
  72. data/lib/puppet/functions/map.rb +6 -14
  73. data/lib/puppet/functions/match.rb +1 -0
  74. data/lib/puppet/functions/reduce.rb +5 -13
  75. data/lib/puppet/functions/reverse_each.rb +82 -0
  76. data/lib/puppet/functions/scanf.rb +15 -18
  77. data/lib/puppet/functions/slice.rb +22 -36
  78. data/lib/puppet/functions/split.rb +2 -2
  79. data/lib/puppet/functions/step.rb +88 -0
  80. data/lib/puppet/functions/type.rb +70 -0
  81. data/lib/puppet/functions.rb +45 -6
  82. data/lib/puppet/graph/rb_tree_map.rb +1 -1
  83. data/lib/puppet/indirector/catalog/compiler.rb +188 -5
  84. data/lib/puppet/indirector/facts/facter.rb +2 -13
  85. data/lib/puppet/indirector/file_content/http.rb +15 -0
  86. data/lib/puppet/indirector/file_metadata/http.rb +27 -0
  87. data/lib/puppet/indirector/generic_http.rb +16 -0
  88. data/lib/puppet/indirector/hiera.rb +3 -1
  89. data/lib/puppet/indirector/indirection.rb +6 -2
  90. data/lib/puppet/indirector/json.rb +2 -2
  91. data/lib/puppet/indirector/node/exec.rb +1 -1
  92. data/lib/puppet/indirector/node/ldap.rb +1 -1
  93. data/lib/puppet/indirector/rest.rb +2 -1
  94. data/lib/puppet/info_service/class_information_service.rb +13 -12
  95. data/lib/puppet/loaders.rb +1 -0
  96. data/lib/puppet/module.rb +6 -2
  97. data/lib/puppet/module_tool/skeleton/templates/generator/Gemfile +9 -2
  98. data/lib/puppet/module_tool/skeleton/templates/generator/spec/classes/init_spec.rb.erb +1 -1
  99. data/lib/puppet/module_tool/skeleton/templates/generator/tests/init.pp.erb +2 -2
  100. data/lib/puppet/module_tool/tar/mini.rb +3 -3
  101. data/lib/puppet/network/http/pool.rb +9 -0
  102. data/lib/puppet/node/environment.rb +11 -2
  103. data/lib/puppet/node.rb +11 -2
  104. data/lib/puppet/parser/ast/pops_bridge.rb +19 -22
  105. data/lib/puppet/parser/compiler.rb +4 -11
  106. data/lib/puppet/parser/environment_compiler.rb +0 -1
  107. data/lib/puppet/parser/functions/fqdn_rand.rb +1 -1
  108. data/lib/puppet/parser/functions/inline_template.rb +1 -1
  109. data/lib/puppet/parser/functions/lookup.rb +128 -149
  110. data/lib/puppet/parser/functions/map.rb +1 -1
  111. data/lib/puppet/parser/functions/match.rb +1 -0
  112. data/lib/puppet/parser/functions/scanf.rb +15 -26
  113. data/lib/puppet/parser/functions/slice.rb +17 -24
  114. data/lib/puppet/parser/functions/split.rb +1 -1
  115. data/lib/puppet/parser/functions.rb +28 -16
  116. data/lib/puppet/parser/resource.rb +19 -17
  117. data/lib/puppet/parser/scope.rb +176 -5
  118. data/lib/puppet/plugins/data_providers/data_provider.rb +56 -14
  119. data/lib/puppet/pops/adaptable.rb +4 -1
  120. data/lib/puppet/pops/adapters.rb +80 -12
  121. data/lib/puppet/pops/binder/binder.rb +21 -17
  122. data/lib/puppet/pops/binder/binder_issues.rb +8 -6
  123. data/lib/puppet/pops/binder/bindings_checker.rb +12 -8
  124. data/lib/puppet/pops/binder/bindings_composer.rb +16 -12
  125. data/lib/puppet/pops/binder/bindings_factory.rb +108 -104
  126. data/lib/puppet/pops/binder/bindings_model.rb +49 -47
  127. data/lib/puppet/pops/binder/config/diagnostic_producer.rb +10 -6
  128. data/lib/puppet/pops/binder/injector.rb +53 -48
  129. data/lib/puppet/pops/binder/key_factory.rb +10 -6
  130. data/lib/puppet/pops/binder/producers.rb +67 -62
  131. data/lib/puppet/pops/evaluator/access_operator.rb +98 -96
  132. data/lib/puppet/pops/evaluator/closure.rb +122 -106
  133. data/lib/puppet/pops/evaluator/collector_transformer.rb +34 -14
  134. data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +0 -1
  135. data/lib/puppet/pops/evaluator/compare_operator.rb +13 -9
  136. data/lib/puppet/pops/evaluator/epp_evaluator.rb +9 -8
  137. data/lib/puppet/pops/evaluator/evaluator_impl.rb +78 -76
  138. data/lib/puppet/pops/evaluator/json_strict_literal_evaluator.rb +85 -0
  139. data/lib/puppet/pops/evaluator/relationship_operator.rb +13 -11
  140. data/lib/puppet/pops/evaluator/runtime3_converter.rb +5 -0
  141. data/lib/puppet/pops/evaluator/runtime3_support.rb +47 -42
  142. data/lib/puppet/pops/functions/function.rb +6 -2
  143. data/lib/puppet/pops/issue_reporter.rb +6 -4
  144. data/lib/puppet/pops/issues.rb +50 -11
  145. data/lib/puppet/pops/loader/base_loader.rb +1 -1
  146. data/lib/puppet/pops/loader/loader.rb +1 -1
  147. data/lib/puppet/pops/loader/loader_paths.rb +15 -0
  148. data/lib/puppet/pops/loader/module_loaders.rb +17 -13
  149. data/lib/puppet/pops/loader/puppet_function_instantiator.rb +18 -13
  150. data/lib/puppet/pops/loader/ruby_function_instantiator.rb +16 -3
  151. data/lib/puppet/pops/loader/type_definition_instantiator.rb +55 -0
  152. data/lib/puppet/pops/loaders.rb +51 -9
  153. data/lib/puppet/pops/lookup/explainer.rb +73 -3
  154. data/lib/puppet/pops/lookup/invocation.rb +21 -19
  155. data/lib/puppet/pops/lookup.rb +17 -12
  156. data/lib/puppet/pops/merge_strategy.rb +16 -19
  157. data/lib/puppet/pops/model/factory.rb +179 -157
  158. data/lib/puppet/pops/model/model.rb +17 -8
  159. data/lib/puppet/pops/model/model_label_provider.rb +14 -7
  160. data/lib/puppet/pops/model/model_meta.rb +17 -0
  161. data/lib/puppet/pops/model/model_tree_dumper.rb +8 -0
  162. data/lib/puppet/pops/parser/egrammar.ra +38 -14
  163. data/lib/puppet/pops/parser/eparser.rb +1353 -1276
  164. data/lib/puppet/pops/parser/epp_support.rb +11 -7
  165. data/lib/puppet/pops/parser/evaluating_parser.rb +17 -13
  166. data/lib/puppet/pops/parser/heredoc_support.rb +15 -11
  167. data/lib/puppet/pops/parser/lexer2.rb +428 -403
  168. data/lib/puppet/pops/parser/lexer_support.rb +85 -7
  169. data/lib/puppet/pops/parser/locator.rb +21 -0
  170. data/lib/puppet/pops/parser/parser_support.rb +19 -16
  171. data/lib/puppet/pops/parser/slurp_support.rb +16 -8
  172. data/lib/puppet/pops/types/class_loader.rb +23 -19
  173. data/lib/puppet/pops/types/enumeration.rb +9 -26
  174. data/lib/puppet/pops/types/iterable.rb +308 -0
  175. data/lib/puppet/pops/types/recursion_guard.rb +82 -0
  176. data/lib/puppet/pops/types/type_acceptor.rb +25 -0
  177. data/lib/puppet/pops/types/type_asserter.rb +10 -9
  178. data/lib/puppet/pops/types/type_calculator.rb +140 -387
  179. data/lib/puppet/pops/types/type_factory.rb +91 -57
  180. data/lib/puppet/pops/types/type_formatter.rb +334 -0
  181. data/lib/puppet/pops/types/type_mismatch_describer.rb +226 -59
  182. data/lib/puppet/pops/types/type_parser.rb +159 -112
  183. data/lib/puppet/pops/types/types.rb +2057 -1253
  184. data/lib/puppet/pops/utils.rb +11 -10
  185. data/lib/puppet/pops/validation/checker4_0.rb +115 -63
  186. data/lib/puppet/pops/validation/validator_factory_4_0.rb +8 -4
  187. data/lib/puppet/pops/validation.rb +11 -9
  188. data/lib/puppet/pops.rb +0 -8
  189. data/lib/puppet/provider/aixobject.rb +1 -1
  190. data/lib/puppet/provider/augeas/augeas.rb +1 -1
  191. data/lib/puppet/provider/cron/crontab.rb +1 -1
  192. data/lib/puppet/provider/exec/windows.rb +1 -1
  193. data/lib/puppet/provider/group/windows_adsi.rb +2 -2
  194. data/lib/puppet/provider/macauthorization/macauthorization.rb +10 -9
  195. data/lib/puppet/provider/nameservice/directoryservice.rb +35 -50
  196. data/lib/puppet/provider/package/appdmg.rb +3 -2
  197. data/lib/puppet/provider/package/dnf.rb +1 -1
  198. data/lib/puppet/provider/package/pip.rb +16 -9
  199. data/lib/puppet/provider/package/pip3.rb +1 -1
  200. data/lib/puppet/provider/package/pkg.rb +1 -1
  201. data/lib/puppet/provider/package/pkgdmg.rb +3 -2
  202. data/lib/puppet/provider/package/pkgng.rb +13 -4
  203. data/lib/puppet/provider/package/rpm.rb +0 -1
  204. data/lib/puppet/provider/package/windows.rb +1 -1
  205. data/lib/puppet/provider/package/yum.rb +2 -2
  206. data/lib/puppet/provider/package/zypper.rb +19 -0
  207. data/lib/puppet/provider/service/debian.rb +7 -20
  208. data/lib/puppet/provider/service/init.rb +7 -0
  209. data/lib/puppet/provider/service/launchd.rb +6 -12
  210. data/lib/puppet/provider/service/systemd.rb +9 -2
  211. data/lib/puppet/provider/sshkey/parsed.rb +1 -1
  212. data/lib/puppet/provider/user/aix.rb +1 -1
  213. data/lib/puppet/provider/user/directoryservice.rb +33 -58
  214. data/lib/puppet/provider/user/windows_adsi.rb +2 -2
  215. data/lib/puppet/provider/yumrepo/inifile.rb +6 -3
  216. data/lib/puppet/provider/zfs/zfs.rb +1 -1
  217. data/lib/puppet/provider/zpool/zpool.rb +1 -1
  218. data/lib/puppet/reference/configuration.rb +1 -1
  219. data/lib/puppet/reference/providers.rb +1 -1
  220. data/lib/puppet/resource/capability_finder.rb +20 -13
  221. data/lib/puppet/resource/catalog.rb +60 -3
  222. data/lib/puppet/resource/status.rb +11 -2
  223. data/lib/puppet/resource/type.rb +33 -42
  224. data/lib/puppet/resource.rb +15 -12
  225. data/lib/puppet/settings/config_file.rb +1 -1
  226. data/lib/puppet/settings/environment_conf.rb +13 -5
  227. data/lib/puppet/settings.rb +1 -1
  228. data/lib/puppet/ssl/certificate_factory.rb +3 -3
  229. data/lib/puppet/ssl/certificate_request.rb +4 -4
  230. data/lib/puppet/ssl/certificate_signer.rb +1 -1
  231. data/lib/puppet/ssl/validator/default_validator.rb +1 -1
  232. data/lib/puppet/test/test_helper.rb +16 -4
  233. data/lib/puppet/transaction/additional_resource_generator.rb +23 -5
  234. data/lib/puppet/transaction/report.rb +31 -1
  235. data/lib/puppet/transaction/resource_harness.rb +0 -25
  236. data/lib/puppet/transaction.rb +15 -2
  237. data/lib/puppet/type/augeas.rb +1 -1
  238. data/lib/puppet/type/cron.rb +12 -12
  239. data/lib/puppet/type/file/checksum_value.rb +53 -0
  240. data/lib/puppet/type/file/content.rb +26 -111
  241. data/lib/puppet/type/file/data_sync.rb +84 -0
  242. data/lib/puppet/type/file/ensure.rb +17 -14
  243. data/lib/puppet/type/file/selcontext.rb +1 -1
  244. data/lib/puppet/type/file/source.rb +103 -18
  245. data/lib/puppet/type/file.rb +91 -39
  246. data/lib/puppet/type/filebucket.rb +1 -1
  247. data/lib/puppet/type/group.rb +6 -2
  248. data/lib/puppet/type/interface.rb +8 -3
  249. data/lib/puppet/type/macauthorization.rb +1 -1
  250. data/lib/puppet/type/package.rb +6 -0
  251. data/lib/puppet/type/schedule.rb +1 -1
  252. data/lib/puppet/type/stage.rb +1 -1
  253. data/lib/puppet/type/user.rb +19 -17
  254. data/lib/puppet/type/yumrepo.rb +20 -0
  255. data/lib/puppet/type.rb +11 -11
  256. data/lib/puppet/util/autoload.rb +16 -11
  257. data/lib/puppet/util/checksums.rb +74 -31
  258. data/lib/puppet/util/execution.rb +1 -1
  259. data/lib/puppet/util/http_proxy.rb +72 -0
  260. data/lib/puppet/util/log.rb +2 -0
  261. data/lib/puppet/util/logging.rb +43 -1
  262. data/lib/puppet/util/monkey_patches.rb +2 -2
  263. data/lib/puppet/util/multi_match.rb +51 -0
  264. data/lib/puppet/util/network_device/cisco/device.rb +10 -2
  265. data/lib/puppet/util/network_device/cisco/interface.rb +21 -8
  266. data/lib/puppet/util/network_device/transport/ssh.rb +7 -3
  267. data/lib/puppet/util/network_device/transport/telnet.rb +39 -36
  268. data/lib/puppet/util/plist.rb +130 -0
  269. data/lib/puppet/util/resource_template.rb +1 -1
  270. data/lib/puppet/util/run_mode.rb +2 -2
  271. data/lib/puppet/util/skip_tags.rb +9 -0
  272. data/lib/puppet/util/windows/access_control_entry.rb +1 -1
  273. data/lib/puppet/util/windows/access_control_list.rb +3 -3
  274. data/lib/puppet/util/windows/adsi.rb +65 -28
  275. data/lib/puppet/util/windows/api_types.rb +24 -18
  276. data/lib/puppet/util/windows/com.rb +3 -3
  277. data/lib/puppet/util/windows/error.rb +1 -1
  278. data/lib/puppet/util/windows/file.rb +8 -8
  279. data/lib/puppet/util/windows/principal.rb +190 -0
  280. data/lib/puppet/util/windows/process.rb +78 -11
  281. data/lib/puppet/util/windows/registry.rb +22 -16
  282. data/lib/puppet/util/windows/root_certs.rb +5 -5
  283. data/lib/puppet/util/windows/security.rb +33 -35
  284. data/lib/puppet/util/windows/security_descriptor.rb +1 -1
  285. data/lib/puppet/util/windows/sid.rb +84 -15
  286. data/lib/puppet/util/windows/taskscheduler.rb +15 -15
  287. data/lib/puppet/util/windows/user.rb +10 -10
  288. data/lib/puppet/util/windows.rb +4 -0
  289. data/lib/puppet/util.rb +109 -22
  290. data/lib/puppet/vendor/deep_merge/deep_merge.gemspec +1 -1
  291. data/lib/puppet/vendor/pathspec/LICENSE +2 -2
  292. data/lib/puppet/vendor/pathspec/README.md +1 -1
  293. data/lib/puppet/vendor/rgen/README.rdoc +1 -1
  294. data/lib/puppet/vendor/semantic/lib/semantic/dependency/module_release.rb +14 -0
  295. data/lib/puppet/version.rb +1 -1
  296. data/lib/puppet.rb +17 -0
  297. data/lib/semver.rb +17 -1
  298. data/man/man5/puppet.conf.5 +12 -12
  299. data/man/man8/extlookup2hiera.8 +1 -1
  300. data/man/man8/puppet-agent.8 +2 -2
  301. data/man/man8/puppet-apply.8 +2 -2
  302. data/man/man8/puppet-ca.8 +2 -2
  303. data/man/man8/puppet-catalog.8 +2 -2
  304. data/man/man8/puppet-cert.8 +2 -2
  305. data/man/man8/puppet-certificate.8 +2 -2
  306. data/man/man8/puppet-certificate_request.8 +2 -2
  307. data/man/man8/puppet-certificate_revocation_list.8 +2 -2
  308. data/man/man8/puppet-config.8 +3 -3
  309. data/man/man8/puppet-describe.8 +1 -1
  310. data/man/man8/puppet-device.8 +1 -1
  311. data/man/man8/puppet-doc.8 +1 -1
  312. data/man/man8/puppet-epp.8 +2 -2
  313. data/man/man8/puppet-facts.8 +2 -2
  314. data/man/man8/puppet-file.8 +2 -2
  315. data/man/man8/puppet-filebucket.8 +2 -2
  316. data/man/man8/puppet-help.8 +2 -2
  317. data/man/man8/puppet-inspect.8 +2 -2
  318. data/man/man8/puppet-key.8 +2 -2
  319. data/man/man8/puppet-man.8 +2 -2
  320. data/man/man8/puppet-master.8 +2 -2
  321. data/man/man8/puppet-module.8 +9 -9
  322. data/man/man8/puppet-node.8 +2 -2
  323. data/man/man8/puppet-parser.8 +2 -2
  324. data/man/man8/puppet-plugin.8 +2 -2
  325. data/man/man8/puppet-report.8 +2 -2
  326. data/man/man8/puppet-resource.8 +2 -2
  327. data/man/man8/puppet-resource_type.8 +2 -2
  328. data/man/man8/puppet-status.8 +3 -3
  329. data/man/man8/puppet.8 +1 -1
  330. data/spec/fixtures/module.tar.gz +0 -0
  331. data/spec/fixtures/unit/application/environments/production/data/common.yaml +4 -0
  332. data/spec/fixtures/unit/application/environments/production/manifests/site.pp +1 -0
  333. data/spec/fixtures/unit/application/environments/puppet_func_provider/environment.conf +1 -0
  334. data/spec/fixtures/unit/application/environments/puppet_func_provider/functions/data.pp +10 -0
  335. data/spec/fixtures/unit/application/environments/puppet_func_provider/manifests/site.pp +1 -0
  336. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/data/common.yaml +4 -0
  337. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/data/specific.yaml +4 -0
  338. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/hiera.yaml +7 -0
  339. data/spec/fixtures/unit/data_providers/environments/hiera_modules/data/common.yaml +4 -0
  340. data/spec/fixtures/unit/data_providers/environments/hiera_modules/data/specific.yaml +4 -0
  341. data/spec/fixtures/unit/data_providers/environments/hiera_modules/environment.conf +2 -0
  342. data/spec/fixtures/unit/data_providers/environments/hiera_modules/hiera.yaml +7 -0
  343. data/spec/fixtures/unit/data_providers/environments/hiera_modules/manifests/site.pp +1 -0
  344. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/data/common.yaml +6 -0
  345. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/hiera.yaml +5 -0
  346. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/manifests/init.pp +2 -0
  347. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/metadata.json +9 -0
  348. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/data/common.yaml +4 -0
  349. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/hiera.yaml +5 -0
  350. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/manifests/init.pp +3 -0
  351. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/metadata.json +9 -0
  352. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/lib/puppet/functions/bad_data/data.rb +1 -0
  353. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/manifests/init.pp +0 -1
  354. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/data/empty.json +0 -0
  355. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/hiera.yaml +5 -0
  356. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/manifests/init.pp +2 -0
  357. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/metadata.json +9 -0
  358. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/data/empty.yaml +1 -0
  359. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/hiera.yaml +5 -0
  360. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/manifests/init.pp +2 -0
  361. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/metadata.json +9 -0
  362. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/data/first.json +2 -1
  363. data/spec/fixtures/unit/module/trailing-comma.json +1 -1
  364. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/functions/usee_puppet.pp +3 -0
  365. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/lib/puppet/functions/usee/usee_ruby.rb +6 -0
  366. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/manifests/init.pp +8 -0
  367. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/types/zero.pp +1 -0
  368. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee2/lib/puppet/functions/usee2/callee.rb +5 -0
  369. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_puppet.pp +5 -0
  370. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_puppet_init.pp +5 -0
  371. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_ruby.pp +5 -0
  372. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/caller2.rb +5 -0
  373. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_puppet.rb +5 -0
  374. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_puppet_init.rb +5 -0
  375. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_ruby.rb +5 -0
  376. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/manifests/init.pp +81 -0
  377. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{user → modules/user}/metadata.json +2 -1
  378. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseeone.pp +1 -0
  379. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseezero.pp +1 -0
  380. data/spec/fixtures/unit/provider/package/yum/yum-check-update-broken-notices.txt +187 -0
  381. data/spec/fixtures/unit/provider/sshkey/parsed/sample_with_blank_lines +8 -0
  382. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_fetch_if_not_on_the_local_disk.yml +205 -0
  383. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_not_update_if_content_on_disk_is_up-to-date.yml +213 -0
  384. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +213 -0
  385. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_mtime_is_older_on_disk.yml +205 -0
  386. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +197 -0
  387. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_not_on_the_local_disk.yml +205 -0
  388. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_not_update_if_mtime_is_newer_on_disk.yml +205 -0
  389. data/spec/integration/defaults_spec.rb +14 -2
  390. data/spec/integration/file_system/uniquefile_spec.rb +29 -0
  391. data/spec/integration/module_tool/tar/mini_spec.rb +28 -0
  392. data/spec/integration/node/environment_spec.rb +13 -0
  393. data/spec/integration/parser/collection_spec.rb +8 -0
  394. data/spec/integration/parser/dynamic_scoping_spec.rb +67 -0
  395. data/spec/integration/parser/parameter_defaults_spec.rb +336 -0
  396. data/spec/integration/parser/undef_param_spec.rb +8 -0
  397. data/spec/integration/provider/yumrepo_spec.rb +1 -1
  398. data/spec/integration/test/test_helper_spec.rb +28 -0
  399. data/spec/integration/transaction/report_spec.rb +16 -0
  400. data/spec/integration/transaction_spec.rb +11 -0
  401. data/spec/integration/type/file_spec.rb +194 -4
  402. data/spec/integration/type/package_spec.rb +5 -1
  403. data/spec/integration/type/tidy_spec.rb +21 -9
  404. data/spec/integration/util/execution_spec.rb +22 -0
  405. data/spec/integration/util/windows/principal_spec.rb +201 -0
  406. data/spec/integration/util/windows/process_spec.rb +31 -0
  407. data/spec/{unit → integration}/util/windows/registry_spec.rb +91 -1
  408. data/spec/integration/util/windows/security_spec.rb +8 -8
  409. data/spec/integration/util/windows/user_spec.rb +1 -1
  410. data/spec/integration/util_spec.rb +49 -27
  411. data/spec/lib/puppet_spec/compiler.rb +17 -0
  412. data/spec/lib/puppet_spec/files.rb +2 -2
  413. data/spec/lib/puppet_spec/pops.rb +13 -0
  414. data/spec/shared_behaviours/iterative_functions.rb +1 -1
  415. data/spec/shared_contexts/types_setup.rb +96 -0
  416. data/spec/unit/agent_spec.rb +1 -0
  417. data/spec/unit/application/agent_spec.rb +10 -0
  418. data/spec/unit/application/apply_spec.rb +9 -0
  419. data/spec/unit/application/lookup_spec.rb +138 -28
  420. data/spec/unit/configurer/downloader_spec.rb +5 -5
  421. data/spec/unit/configurer_spec.rb +271 -39
  422. data/spec/unit/data_providers/hiera_data_provider_spec.rb +182 -5
  423. data/spec/unit/data_providers/hiera_interpolation_spec.rb +57 -0
  424. data/spec/unit/defaults_spec.rb +15 -0
  425. data/spec/unit/environments_spec.rb +24 -4
  426. data/spec/unit/face/epp_face_spec.rb +2 -2
  427. data/spec/unit/face/parser_spec.rb +43 -2
  428. data/spec/unit/file_serving/http_metadata_spec.rb +85 -0
  429. data/spec/unit/file_serving/metadata_spec.rb +50 -0
  430. data/spec/unit/file_serving/terminus_selector_spec.rb +12 -2
  431. data/spec/unit/file_system_spec.rb +26 -0
  432. data/spec/unit/functions/assert_type_spec.rb +36 -2
  433. data/spec/unit/functions/defined_spec.rb +2 -2
  434. data/spec/unit/functions/epp_spec.rb +17 -9
  435. data/spec/unit/functions/inline_epp_spec.rb +4 -4
  436. data/spec/unit/functions/lookup_spec.rb +88 -16
  437. data/spec/unit/functions/regsubst_spec.rb +1 -1
  438. data/spec/unit/functions/reverse_each_spec.rb +108 -0
  439. data/spec/unit/functions/step_spec.rb +113 -0
  440. data/spec/unit/functions/type_spec.rb +35 -0
  441. data/spec/unit/functions4_spec.rb +62 -6
  442. data/spec/unit/hiera/scope_spec.rb +5 -2
  443. data/spec/unit/indirector/catalog/compiler_spec.rb +705 -4
  444. data/spec/unit/indirector/file_bucket_file/file_spec.rb +1 -1
  445. data/spec/unit/indirector/indirection_spec.rb +1 -1
  446. data/spec/unit/indirector/json_spec.rb +1 -1
  447. data/spec/unit/info_service_spec.rb +94 -32
  448. data/spec/unit/module_spec.rb +14 -0
  449. data/spec/unit/module_tool/applications/builder_spec.rb +4 -4
  450. data/spec/unit/network/authstore_spec.rb +1 -1
  451. data/spec/unit/network/http/connection_spec.rb +1 -0
  452. data/spec/unit/network/http/pool_spec.rb +30 -0
  453. data/spec/unit/node_spec.rb +8 -0
  454. data/spec/unit/parser/compiler_spec.rb +16 -18
  455. data/spec/unit/parser/scope_spec.rb +28 -11
  456. data/spec/unit/pops/evaluator/access_ops_spec.rb +7 -7
  457. data/spec/unit/pops/evaluator/comparison_ops_spec.rb +3 -0
  458. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +8 -2
  459. data/spec/unit/pops/evaluator/evaluator_rspec_helper.rb +4 -4
  460. data/spec/unit/pops/evaluator/json_strict_literal_evaluator_spec.rb +63 -0
  461. data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +6 -0
  462. data/spec/unit/pops/loaders/dependency_loader_spec.rb +53 -0
  463. data/spec/unit/pops/loaders/loaders_spec.rb +127 -2
  464. data/spec/unit/pops/parser/lexer2_spec.rb +118 -3
  465. data/spec/unit/pops/parser/parse_calls_spec.rb +8 -0
  466. data/spec/unit/pops/parser/parser_rspec_helper.rb +5 -0
  467. data/spec/unit/pops/parser/parser_spec.rb +10 -0
  468. data/spec/unit/pops/parser/source_pos_adapter_spec.rb +26 -0
  469. data/spec/unit/pops/types/iterable_spec.rb +262 -0
  470. data/spec/unit/pops/types/recursion_guard_spec.rb +91 -0
  471. data/spec/unit/pops/types/type_acceptor_spec.rb +105 -0
  472. data/spec/unit/pops/types/type_asserter_spec.rb +43 -0
  473. data/spec/unit/pops/types/type_calculator_spec.rb +275 -390
  474. data/spec/unit/pops/types/type_formatter_spec.rb +280 -0
  475. data/spec/unit/pops/types/type_mismatch_describer_spec.rb +152 -0
  476. data/spec/unit/pops/types/type_parser_spec.rb +58 -13
  477. data/spec/unit/pops/types/types_spec.rb +241 -0
  478. data/spec/unit/pops/validator/validator_spec.rb +159 -15
  479. data/spec/unit/provider/cron/parsed_spec.rb +1 -0
  480. data/spec/unit/provider/group/windows_adsi_spec.rb +8 -8
  481. data/spec/unit/provider/macauthorization_spec.rb +5 -2
  482. data/spec/unit/provider/nameservice/directoryservice_spec.rb +14 -19
  483. data/spec/unit/provider/package/appdmg_spec.rb +3 -3
  484. data/spec/unit/provider/package/dnf_spec.rb +16 -0
  485. data/spec/unit/provider/package/pip3_spec.rb +60 -42
  486. data/spec/unit/provider/package/pip_spec.rb +88 -47
  487. data/spec/unit/provider/package/pkgdmg_spec.rb +18 -9
  488. data/spec/unit/provider/package/pkgng_spec.rb +4 -2
  489. data/spec/unit/provider/package/rpm_spec.rb +2 -25
  490. data/spec/unit/provider/package/yum_spec.rb +12 -1
  491. data/spec/unit/provider/package/zypper_spec.rb +14 -0
  492. data/spec/unit/provider/service/debian_spec.rb +6 -24
  493. data/spec/unit/provider/service/init_spec.rb +11 -1
  494. data/spec/unit/provider/service/launchd_spec.rb +18 -25
  495. data/spec/unit/provider/service/systemd_spec.rb +25 -12
  496. data/spec/unit/provider/service/upstart_spec.rb +57 -0
  497. data/spec/unit/provider/sshkey/parsed_spec.rb +20 -19
  498. data/spec/unit/provider/user/directoryservice_spec.rb +40 -59
  499. data/spec/unit/provider/user/windows_adsi_spec.rb +5 -5
  500. data/spec/unit/provider/yumrepo/inifile_spec.rb +16 -0
  501. data/spec/unit/resource/capability_finder_spec.rb +28 -15
  502. data/spec/unit/resource/catalog_spec.rb +33 -1
  503. data/spec/unit/resource/type_spec.rb +149 -7
  504. data/spec/unit/resource_spec.rb +99 -50
  505. data/spec/unit/settings/environment_conf_spec.rb +18 -1
  506. data/spec/unit/ssl/certificate_revocation_list_spec.rb +3 -3
  507. data/spec/unit/transaction/report_spec.rb +27 -0
  508. data/spec/unit/transaction/resource_harness_spec.rb +0 -47
  509. data/spec/unit/transaction_spec.rb +5 -0
  510. data/spec/unit/type/file/checksum_spec.rb +6 -0
  511. data/spec/unit/type/file/checksum_value_spec.rb +286 -0
  512. data/spec/unit/type/file/content_spec.rb +12 -193
  513. data/spec/unit/type/file/source_spec.rb +211 -119
  514. data/spec/unit/type/file_spec.rb +133 -34
  515. data/spec/unit/type/interface_spec.rb +32 -0
  516. data/spec/unit/type/macauthorization_spec.rb +4 -1
  517. data/spec/unit/type/yumrepo_spec.rb +2 -2
  518. data/spec/unit/util/filetype_spec.rb +1 -1
  519. data/spec/unit/util/http_proxy_spec.rb +2 -2
  520. data/spec/unit/util/log/destinations_spec.rb +0 -2
  521. data/spec/unit/util/logging_spec.rb +69 -0
  522. data/spec/unit/util/multi_match_spec.rb +39 -0
  523. data/spec/unit/util/network_device/cisco/device_spec.rb +253 -216
  524. data/spec/unit/util/network_device/transport/telnet_spec.rb +60 -58
  525. data/spec/unit/util/plist_spec.rb +110 -0
  526. data/spec/unit/util/resource_template_spec.rb +2 -2
  527. data/spec/unit/util/run_mode_spec.rb +27 -3
  528. data/spec/unit/util/windows/adsi_spec.rb +46 -38
  529. data/spec/unit/util/windows/api_types_spec.rb +42 -0
  530. data/spec/unit/util/windows/security_descriptor_spec.rb +3 -3
  531. data/spec/unit/util/windows/sid_spec.rb +48 -11
  532. data/spec/unit/util_spec.rb +123 -13
  533. data/tasks/cfpropertylist.rake +15 -0
  534. metadata +3342 -3195
  535. data/lib/puppet/vendor/load_plist.rb +0 -1
  536. data/lib/puppet/vendor/plist/CHANGELOG +0 -82
  537. data/lib/puppet/vendor/plist/MIT-LICENSE +0 -21
  538. data/lib/puppet/vendor/plist/PUPPET_README.md +0 -6
  539. data/lib/puppet/vendor/plist/README +0 -36
  540. data/lib/puppet/vendor/plist/Rakefile +0 -144
  541. data/lib/puppet/vendor/plist/docs/USAGE +0 -104
  542. data/lib/puppet/vendor/plist/docs/jamis-template.rb +0 -591
  543. data/lib/puppet/vendor/plist/lib/plist/generator.rb +0 -224
  544. data/lib/puppet/vendor/plist/lib/plist/parser.rb +0 -225
  545. data/lib/puppet/vendor/plist/lib/plist.rb +0 -22
  546. data/lib/puppet/vendor/plist/test/assets/AlbumData.xml +0 -203
  547. data/lib/puppet/vendor/plist/test/assets/Cookies.plist +0 -104
  548. data/lib/puppet/vendor/plist/test/assets/commented.plist +0 -9
  549. data/lib/puppet/vendor/plist/test/assets/example_data.bin +0 -0
  550. data/lib/puppet/vendor/plist/test/assets/example_data.jpg +0 -0
  551. data/lib/puppet/vendor/plist/test/assets/example_data.plist +0 -259
  552. data/lib/puppet/vendor/plist/test/assets/test_data_elements.plist +0 -24
  553. data/lib/puppet/vendor/plist/test/assets/test_empty_key.plist +0 -13
  554. data/lib/puppet/vendor/plist/test/test_data_elements.rb +0 -115
  555. data/lib/puppet/vendor/plist/test/test_generator.rb +0 -59
  556. data/lib/puppet/vendor/plist/test/test_generator_basic_types.rb +0 -58
  557. data/lib/puppet/vendor/plist/test/test_generator_collections.rb +0 -82
  558. data/lib/puppet/vendor/plist/test/test_parser.rb +0 -90
  559. /data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{usee → modules/usee}/lib/puppet/functions/usee/callee.rb +0 -0
  560. /data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{user → modules/user}/lib/puppet/functions/user/caller.rb +0 -0
@@ -0,0 +1,241 @@
1
+ require 'spec_helper'
2
+ require 'puppet/pops'
3
+
4
+ module Puppet::Pops
5
+ module Types
6
+ describe 'Puppet Type System' do
7
+ let(:tf) { TypeFactory }
8
+ context 'Integer type' do
9
+ let!(:a) { tf.range(10, 20) }
10
+ let!(:b) { tf.range(18, 28) }
11
+ let!(:c) { tf.range( 2, 12) }
12
+ let!(:d) { tf.range(12, 18) }
13
+ let!(:e) { tf.range( 8, 22) }
14
+ let!(:f) { tf.range( 8, 9) }
15
+ let!(:g) { tf.range(21, 22) }
16
+ let!(:h) { tf.range(30, 31) }
17
+ let!(:i) { tf.float_range(1.0, 30.0) }
18
+ let!(:j) { tf.float_range(1.0, 9.0) }
19
+
20
+ context 'when testing if ranges intersect' do
21
+ it 'detects an intersection when self is before its argument' do
22
+ expect(a.intersect?(b)).to be_truthy
23
+ end
24
+
25
+ it 'detects an intersection when self is after its argument' do
26
+ expect(a.intersect?(c)).to be_truthy
27
+ end
28
+
29
+ it 'detects an intersection when self covers its argument' do
30
+ expect(a.intersect?(d)).to be_truthy
31
+ end
32
+
33
+ it 'detects an intersection when self equals its argument' do
34
+ expect(a.intersect?(a)).to be_truthy
35
+ end
36
+
37
+ it 'detects an intersection when self is covered by its argument' do
38
+ expect(a.intersect?(e)).to be_truthy
39
+ end
40
+
41
+ it 'does not consider an adjacent range to be intersecting' do
42
+ [f, g].each {|x| expect(a.intersect?(x)).to be_falsey }
43
+ end
44
+
45
+ it 'does not consider an range that is apart to be intersecting' do
46
+ expect(a.intersect?(h)).to be_falsey
47
+ end
48
+
49
+ it 'does not consider an overlapping float range to be intersecting' do
50
+ expect(a.intersect?(i)).to be_falsey
51
+ end
52
+ end
53
+
54
+ context 'when testing if ranges are adjacent' do
55
+ it 'detects an adjacent type when self is after its argument' do
56
+ expect(a.adjacent?(f)).to be_truthy
57
+ end
58
+
59
+ it 'detects an adjacent type when self is before its argument' do
60
+ expect(a.adjacent?(g)).to be_truthy
61
+ end
62
+
63
+ it 'does not consider overlapping types to be adjacent' do
64
+ [a, b, c, d, e].each { |x| expect(a.adjacent?(x)).to be_falsey }
65
+ end
66
+
67
+ it 'does not consider an range that is apart to be adjacent' do
68
+ expect(a.adjacent?(h)).to be_falsey
69
+ end
70
+
71
+ it 'does not consider an adjacent float range to be adjancent' do
72
+ expect(a.adjacent?(j)).to be_falsey
73
+ end
74
+ end
75
+
76
+ context 'when merging ranges' do
77
+ it 'will merge intersecting ranges' do
78
+ expect(a.merge(b)).to eq(tf.range(10, 28))
79
+ end
80
+
81
+ it 'will merge adjacent ranges' do
82
+ expect(a.merge(g)).to eq(tf.range(10, 22))
83
+ end
84
+
85
+ it 'will not merge ranges that are apart' do
86
+ expect(a.merge(h)).to be_nil
87
+ end
88
+
89
+ it 'will not merge overlapping float ranges' do
90
+ expect(a.merge(i)).to be_nil
91
+ end
92
+
93
+ it 'will not merge adjacent float ranges' do
94
+ expect(a.merge(j)).to be_nil
95
+ end
96
+ end
97
+ end
98
+
99
+ context 'Float type' do
100
+ let!(:a) { tf.float_range(10.0, 20.0) }
101
+ let!(:b) { tf.float_range(18.0, 28.0) }
102
+ let!(:c) { tf.float_range( 2.0, 12.0) }
103
+ let!(:d) { tf.float_range(12.0, 18.0) }
104
+ let!(:e) { tf.float_range( 8.0, 22.0) }
105
+ let!(:f) { tf.float_range(30.0, 31.0) }
106
+ let!(:g) { tf.range(1, 30) }
107
+
108
+ context 'when testing if ranges intersect' do
109
+ it 'detects an intersection when self is before its argument' do
110
+ expect(a.intersect?(b)).to be_truthy
111
+ end
112
+
113
+ it 'detects an intersection when self is after its argument' do
114
+ expect(a.intersect?(c)).to be_truthy
115
+ end
116
+
117
+ it 'detects an intersection when self covers its argument' do
118
+ expect(a.intersect?(d)).to be_truthy
119
+ end
120
+
121
+ it 'detects an intersection when self equals its argument' do
122
+ expect(a.intersect?(a)).to be_truthy
123
+ end
124
+
125
+ it 'detects an intersection when self is covered by its argument' do
126
+ expect(a.intersect?(e)).to be_truthy
127
+ end
128
+
129
+ it 'does not consider an range that is apart to be intersecting' do
130
+ expect(a.intersect?(f)).to be_falsey
131
+ end
132
+
133
+ it 'does not consider an overlapping integer range to be intersecting' do
134
+ expect(a.intersect?(g)).to be_falsey
135
+ end
136
+ end
137
+
138
+ context 'when merging ranges' do
139
+ it 'will merge intersecting ranges' do
140
+ expect(a.merge(b)).to eq(tf.float_range(10.0, 28.0))
141
+ end
142
+
143
+ it 'will not merge ranges that are apart' do
144
+ expect(a.merge(f)).to be_nil
145
+ end
146
+
147
+ it 'will not merge overlapping integer ranges' do
148
+ expect(a.merge(g)).to be_nil
149
+ end
150
+ end
151
+ end
152
+
153
+ context 'Optional type' do
154
+ let!(:overlapping_ints) { tf.variant(tf.range(10, 20), tf.range(18, 28)) }
155
+ let!(:optoptopt) { tf.optional(tf.optional(tf.optional(overlapping_ints))) }
156
+ let!(:optnu) { tf.optional(tf.not_undef(overlapping_ints)) }
157
+
158
+ context 'when normalizing' do
159
+ it 'compacts optional in optional in optional to just optional' do
160
+ expect(optoptopt.normalize).to eq(tf.optional(tf.range(10, 28)))
161
+ end
162
+ end
163
+
164
+ it 'compacts NotUndef in Optional to just Optional' do
165
+ expect(optnu.normalize).to eq(tf.optional(tf.range(10, 28)))
166
+ end
167
+ end
168
+
169
+ context 'NotUndef type' do
170
+ let!(:nununu) { tf.not_undef(tf.not_undef(tf.not_undef(tf.any))) }
171
+ let!(:nuopt) { tf.not_undef(tf.optional(tf.any)) }
172
+
173
+ context 'when normalizing' do
174
+ it 'compacts NotUndef in NotUndef in NotUndef to just NotUndef' do
175
+ expect(nununu.normalize).to eq(tf.not_undef(tf.any))
176
+ end
177
+
178
+ it 'compacts Optional in NotUndef to just NotUndef' do
179
+ expect(nuopt.normalize).to eq(tf.not_undef(tf.any))
180
+ end
181
+ end
182
+ end
183
+
184
+ context 'Variant type' do
185
+ let!(:overlapping_ints) { tf.variant(tf.range(10, 20), tf.range(18, 28)) }
186
+ let!(:adjacent_ints) { tf.variant(tf.range(10, 20), tf.range(8, 9)) }
187
+ let!(:mix_ints) { tf.variant(overlapping_ints, adjacent_ints) }
188
+ let!(:overlapping_floats) { tf.variant(tf.float_range(10.0, 20.0), tf.float_range(18.0, 28.0)) }
189
+ let!(:enums) { tf.variant(tf.enum('a', 'b'), tf.enum('b', 'c')) }
190
+ let!(:patterns) { tf.variant(tf.pattern('a', 'b'), tf.pattern('b', 'c')) }
191
+ let!(:with_undef) { tf.variant(tf.undef, tf.range(1,10)) }
192
+ let!(:all_optional) { tf.variant(tf.optional(tf.range(1,10)), tf.optional(tf.range(11,20))) }
193
+ let!(:groups) { tf.variant(mix_ints, overlapping_floats, enums, patterns, with_undef, all_optional) }
194
+
195
+ context 'when normalizing contained types that' do
196
+ it 'are overlapping ints, the result is a range' do
197
+ expect(overlapping_ints.normalize).to eq(tf.range(10, 28))
198
+ end
199
+
200
+ it 'are adjacent ints, the result is a range' do
201
+ expect(adjacent_ints.normalize).to eq(tf.range(8, 20))
202
+ end
203
+
204
+ it 'are mixed variants with adjacent and overlapping ints, the result is a range' do
205
+ expect(mix_ints.normalize).to eq(tf.range(8, 28))
206
+ end
207
+
208
+ it 'are overlapping floats, the result is a float range' do
209
+ expect(overlapping_floats.normalize).to eq(tf.float_range(10.0, 28.0))
210
+ end
211
+
212
+ it 'are enums, the result is an enum' do
213
+ expect(enums.normalize).to eq(tf.enum('a', 'b', 'c'))
214
+ end
215
+
216
+ it 'are patterns, the result is a pattern' do
217
+ expect(patterns.normalize).to eq(tf.pattern('a', 'b', 'c'))
218
+ end
219
+
220
+ it 'contains an Undef, the result is Optional' do
221
+ expect(with_undef.normalize).to eq(tf.optional(tf.range(1,10)))
222
+ end
223
+
224
+ it 'are all Optional, the result is an Optional with normalized type' do
225
+ expect(all_optional.normalize).to eq(tf.optional(tf.range(1,20)))
226
+ end
227
+
228
+ it 'can be normalized in groups, the result is a Variant containing the resulting normalizations' do
229
+ expect(groups.normalize).to eq(tf.variant(
230
+ tf.range(8, 28),
231
+ tf.float_range(10.0, 28.0),
232
+ tf.enum('a', 'b', 'c'),
233
+ tf.pattern('a', 'b', 'c'),
234
+ tf.optional(tf.range(1,20)))
235
+ )
236
+ end
237
+ end
238
+ end
239
+ end
240
+ end
241
+ end
@@ -107,11 +107,51 @@ describe "validating 4x" do
107
107
  SOURCE
108
108
  expect(validate(parse(source))).to have_issue(Puppet::Pops::Issues::IDEM_NOT_ALLOWED_LAST)
109
109
  end
110
+
111
+ it "detects a resource declared without title in #{type} when it is the only declaration present" do
112
+ source = <<-SOURCE
113
+ #{type} nope {
114
+ notify { message => 'Nope' }
115
+ }
116
+ SOURCE
117
+ expect(validate(parse(source))).to have_issue(Puppet::Pops::Issues::RESOURCE_WITHOUT_TITLE)
118
+ end
119
+
120
+ it "detects a resource declared without title in #{type} when it is in between other declarations" do
121
+ source = <<-SOURCE
122
+ #{type} nope {
123
+ notify { succ: message => 'Nope' }
124
+ notify { message => 'Nope' }
125
+ notify { pred: message => 'Nope' }
126
+ }
127
+ SOURCE
128
+ expect(validate(parse(source))).to have_issue(Puppet::Pops::Issues::RESOURCE_WITHOUT_TITLE)
129
+ end
130
+
131
+ it "detects a resource declared without title in #{type} when it is declarated first" do
132
+ source = <<-SOURCE
133
+ #{type} nope {
134
+ notify { message => 'Nope' }
135
+ notify { pred: message => 'Nope' }
136
+ }
137
+ SOURCE
138
+ expect(validate(parse(source))).to have_issue(Puppet::Pops::Issues::RESOURCE_WITHOUT_TITLE)
139
+ end
140
+
141
+ it "detects a resource declared without title in #{type} when it is declarated last" do
142
+ source = <<-SOURCE
143
+ #{type} nope {
144
+ notify { succ: message => 'Nope' }
145
+ notify { message => 'Nope' }
146
+ }
147
+ SOURCE
148
+ expect(validate(parse(source))).to have_issue(Puppet::Pops::Issues::RESOURCE_WITHOUT_TITLE)
149
+ end
110
150
  end
111
151
  end
112
152
 
113
153
  context 'for reserved words' do
114
- ['private', 'type', 'attr'].each do |word|
154
+ ['private', 'attr'].each do |word|
115
155
  it "produces an error for the word '#{word}'" do
116
156
  source = "$a = #{word}"
117
157
  expect(validate(parse(source))).to have_issue(Puppet::Pops::Issues::RESERVED_WORD)
@@ -177,6 +217,67 @@ describe "validating 4x" do
177
217
  end
178
218
  end
179
219
 
220
+ context 'for keywords' do
221
+ it "should allow using the 'type' as the name of a function with no parameters" do
222
+ source = "type()"
223
+ expect(validate(parse(source))).not_to have_any_issues
224
+ end
225
+
226
+ it "should allow using the keyword 'type' as the name of a function with parameters" do
227
+ source = "type('a', 'b')"
228
+ expect(validate(parse(source))).not_to have_any_issues
229
+ end
230
+ it "should allow using the 'type' as the name of a function with no parameters and a block" do
231
+ source = "type() |$x| { $x }"
232
+ expect(validate(parse(source))).not_to have_any_issues
233
+ end
234
+
235
+ it "should allow using the keyword 'type' as the name of a function with parameters and a block" do
236
+ source = "type('a', 'b') |$x| { $x }"
237
+ expect(validate(parse(source))).not_to have_any_issues
238
+ end
239
+ end
240
+
241
+ context 'for parameter names' do
242
+ ['class', 'define'].each do |word|
243
+ it "should require that #{word} parameter names are unique" do
244
+ expect(validate(parse("#{word} foo($a = 10, $a = 20) {}"))).to have_issue(Puppet::Pops::Issues::DUPLICATE_PARAMETER)
245
+ end
246
+ end
247
+
248
+ it "should require that template parameter names are unique" do
249
+ expect(validate(parse_epp("<%-| $a, $a |-%><%= $a == doh %>"))).to have_issue(Puppet::Pops::Issues::DUPLICATE_PARAMETER)
250
+ end
251
+ end
252
+
253
+ context 'for parameter defaults' do
254
+ ['class', 'define'].each do |word|
255
+ it "should not permit assignments in #{word} parameter default expressions" do
256
+ expect { parse("#{word} foo($a = $x = 10) {}") }.to raise_error(Puppet::ParseErrorWithIssue, /Syntax error at '='/)
257
+ end
258
+ end
259
+
260
+ ['class', 'define'].each do |word|
261
+ it "should not permit assignments in #{word} parameter default nested expressions" do
262
+ expect(validate(parse("#{word} foo($a = [$x = 10]) {}"))).to have_issue(Puppet::Pops::Issues::ILLEGAL_ASSIGNMENT_CONTEXT)
263
+ end
264
+
265
+ it "should not permit assignments to subsequently declared parameters in #{word} parameter default nested expressions" do
266
+ expect(validate(parse("#{word} foo($a = ($b = 3), $b = 5) {}"))).to have_issue(Puppet::Pops::Issues::ILLEGAL_ASSIGNMENT_CONTEXT)
267
+ end
268
+
269
+ it "should not permit assignments to previously declared parameters in #{word} parameter default nested expressions" do
270
+ expect(validate(parse("#{word} foo($a = 10, $b = ($a = 10)) {}"))).to have_issue(Puppet::Pops::Issues::ILLEGAL_ASSIGNMENT_CONTEXT)
271
+ end
272
+
273
+ it "should permit assignments in #{word} parameter default inside nested lambda expressions" do
274
+ expect(validate(parse(
275
+ "#{word} foo($a = [1,2,3], $b = 0, $c = $a.map |$x| { $b = $x; $b * $a.reduce |$x, $y| {$x + $y}}) {}"))).not_to(
276
+ have_issue(Puppet::Pops::Issues::ILLEGAL_ASSIGNMENT_CONTEXT))
277
+ end
278
+ end
279
+ end
280
+
180
281
  context 'for reserved parameter names' do
181
282
  ['name', 'title'].each do |word|
182
283
  it "produces an error when $#{word} is used as a parameter in a class" do
@@ -220,25 +321,68 @@ describe "validating 4x" do
220
321
  end
221
322
  end
222
323
 
223
- context 'top level constructs in conditionals' do
224
- ['class', 'define', 'node'].each do |word|
225
- it "produces an error when $#{word} is nested in an if expression" do
226
- source = "if true { #{word} x {} }"
227
- expect(validate(parse(source))).to have_issue(Puppet::Pops::Issues::NOT_TOP_LEVEL)
228
- end
324
+ context 'top level constructs' do
325
+ def issue(at_top)
326
+ at_top ? Puppet::Pops::Issues::NOT_ABSOLUTE_TOP_LEVEL : Puppet::Pops::Issues::NOT_TOP_LEVEL
229
327
  end
230
328
 
231
- ['class', 'define', 'node'].each do |word|
232
- it "produces an error when $#{word} is nested in an if-else expression" do
233
- source = "if false {} else { #{word} x {} }"
234
- expect(validate(parse(source))).to have_issue(Puppet::Pops::Issues::NOT_TOP_LEVEL)
329
+ # Top level. Defines the expressions that are tested inside of other things
330
+ {
331
+ 'a class' => ['class x{}', false],
332
+ 'a define' => ['define x{}', false],
333
+ 'a node' => ['node x{}', false],
334
+ 'a function' => ['function x() {}', true],
335
+ 'a type alias' => ['type A = Data', true],
336
+ 'a type alias for a complex type' => ['type C = Hash[String[1],Integer]', true],
337
+ 'a type definition' => ['type A {}', true]
338
+ }.each_pair do |word, (decl, at_top)|
339
+ # Nesting level. Defines how each of the top level expressions are nested in
340
+ # another expression
341
+ {
342
+ 'a define' => ["define y{ #{decl} }", at_top],
343
+ 'a function' => ["function y() { #{decl} }", at_top],
344
+ 'a type definition' => ["type A { #{decl} }", at_top],
345
+ 'an if expression' => ["if true { #{decl} }", false],
346
+ 'an if-else expression' => ["if false {} else { #{decl} }", false],
347
+ 'an unless' => ["unless false { #{decl} }", false]
348
+ }.each_pair do |nester, (source, abs_top)|
349
+ # Tests each top level expression in each nested expression
350
+ it "produces an error when #{word} is nested in #{nester}" do
351
+ expect(validate(parse(source))).to have_issue(issue(abs_top))
352
+ end
353
+ end
354
+
355
+ # Test that the expression can exist anywhere in a top level block
356
+
357
+ it "will allow #{word} as the only statement in a top level block" do
358
+ expect(validate(parse(decl))).not_to have_issue(issue(at_top))
359
+ end
360
+
361
+ it "will allow #{word} as the last statement in a top level block" do
362
+ source = "$a = 10\n#{decl}"
363
+ expect(validate(parse(source))).not_to have_issue(issue(at_top))
364
+ end
365
+
366
+ it "will allow #{word} as the first statement in a top level block" do
367
+ source = "#{decl}\n$a = 10"
368
+ expect(validate(parse(source))).not_to have_issue(issue(at_top))
369
+ end
370
+
371
+ it "will allow #{word} in between other statements in a top level block" do
372
+ source = "$a = 10\n#{decl}\n$b = 20"
373
+ expect(validate(parse(source))).not_to have_issue(issue(at_top))
235
374
  end
236
375
  end
237
376
 
238
- ['class', 'define', 'node'].each do |word|
239
- it "produces an error when $#{word} is nested in an unless expression" do
240
- source = "unless false { #{word} x {} }"
241
- expect(validate(parse(source))).to have_issue(Puppet::Pops::Issues::NOT_TOP_LEVEL)
377
+ context 'that are type aliases' do
378
+ it 'raises errors when RHS is a name that is an invalid reference' do
379
+ source = 'type MyInt = integer'
380
+ expect(validate(parse(source))).to have_issue(Puppet::Pops::Issues::ILLEGAL_EXPRESSION)
381
+ end
382
+
383
+ it 'raises errors when RHS is an AccessExpression with a name that is an invalid reference on LHS' do
384
+ source = 'type IntegerArray = array[Integer]'
385
+ expect(validate(parse(source))).to have_issue(Puppet::Pops::Issues::ILLEGAL_EXPRESSION)
242
386
  end
243
387
  end
244
388
  end
@@ -139,6 +139,7 @@ describe Puppet::Type.type(:cron).provider(:crontab) do
139
139
  expect(described_class.parse_line('MAILTO=""')).to eq({:record_type => :environment, :line => 'MAILTO=""'})
140
140
  expect(described_class.parse_line('FOO=BAR')).to eq({:record_type => :environment, :line => 'FOO=BAR'})
141
141
  expect(described_class.parse_line('FOO_BAR=BAR')).to eq({:record_type => :environment, :line => 'FOO_BAR=BAR'})
142
+ expect(described_class.parse_line('SPACE = BAR')).to eq({:record_type => :environment, :line => 'SPACE = BAR'})
142
143
  end
143
144
 
144
145
  it "should extract a cron entry" do
@@ -32,9 +32,9 @@ describe Puppet::Type.type(:group).provider(:windows_adsi), :if => Puppet.featur
32
32
 
33
33
  describe "group type :members property helpers" do
34
34
 
35
- let(:user1) { stub(:account => 'user1', :domain => '.', :to_s => 'user1sid') }
36
- let(:user2) { stub(:account => 'user2', :domain => '.', :to_s => 'user2sid') }
37
- let(:user3) { stub(:account => 'user3', :domain => '.', :to_s => 'user3sid') }
35
+ let(:user1) { stub(:account => 'user1', :domain => '.', :sid => 'user1sid') }
36
+ let(:user2) { stub(:account => 'user2', :domain => '.', :sid => 'user2sid') }
37
+ let(:user3) { stub(:account => 'user3', :domain => '.', :sid => 'user3sid') }
38
38
  let(:invalid_user) { SecureRandom.uuid }
39
39
 
40
40
  before :each do
@@ -183,9 +183,9 @@ describe Puppet::Type.type(:group).provider(:windows_adsi), :if => Puppet.featur
183
183
  provider.group.stubs(:members).returns ['user1', 'user2']
184
184
 
185
185
  member_sids = [
186
- stub(:account => 'user1', :domain => 'testcomputername'),
187
- stub(:account => 'user2', :domain => 'testcomputername'),
188
- stub(:account => 'user3', :domain => 'testcomputername'),
186
+ stub(:account => 'user1', :domain => 'testcomputername', :sid => 1),
187
+ stub(:account => 'user2', :domain => 'testcomputername', :sid => 2),
188
+ stub(:account => 'user3', :domain => 'testcomputername', :sid => 3),
189
189
  ]
190
190
 
191
191
  provider.group.stubs(:member_sids).returns(member_sids[0..1])
@@ -241,8 +241,8 @@ describe Puppet::Type.type(:group).provider(:windows_adsi), :if => Puppet.featur
241
241
  end
242
242
 
243
243
  it "should be able to test whether a group exists" do
244
- Puppet::Util::Windows::ADSI.stubs(:sid_uri_safe).returns(nil)
245
- Puppet::Util::Windows::ADSI.stubs(:connect).returns stub('connection')
244
+ Puppet::Util::Windows::SID.stubs(:name_to_sid_object).returns(nil)
245
+ Puppet::Util::Windows::ADSI.stubs(:connect).returns stub('connection', :Class => 'Group')
246
246
  expect(provider).to be_exists
247
247
 
248
248
  Puppet::Util::Windows::ADSI.stubs(:connect).returns nil
@@ -6,7 +6,9 @@
6
6
  require 'spec_helper'
7
7
 
8
8
  require 'puppet'
9
- require 'plist'
9
+
10
+ module Puppet::Util::Plist
11
+ end
10
12
 
11
13
  provider_class = Puppet::Type.type(:macauthorization).provider(:macauthorization)
12
14
 
@@ -26,7 +28,8 @@ describe provider_class do
26
28
  authdb["rights"] = { "fooright" => "foo" }
27
29
 
28
30
  # Stub out Plist::parse_xml
29
- Plist.stubs(:parse_xml).returns(authdb)
31
+ Puppet::Util::Plist.stubs(:parse_plist).returns(authdb)
32
+ Puppet::Util::Plist.stubs(:write_plist_file)
30
33
 
31
34
  # A catch all; no parameters set
32
35
  @resource.stubs(:[]).returns(nil)
@@ -1,6 +1,9 @@
1
1
  #! /usr/bin/env ruby
2
2
  require 'spec_helper'
3
3
 
4
+ module Puppet::Util::Plist
5
+ end
6
+
4
7
  # We use this as a reasonable way to obtain all the support infrastructure.
5
8
  [:group].each do |type_for_this_round|
6
9
  provider_class = Puppet::Type.type(type_for_this_round).provider(:directoryservice)
@@ -79,19 +82,17 @@ describe 'DirectoryService password behavior' do
79
82
  end
80
83
 
81
84
  let :shadow_hash_data do
82
- {'ShadowHashData' => [StringIO.new(binary_plist)]}
85
+ {'ShadowHashData' => [binary_plist]}
83
86
  end
84
87
 
85
88
  subject do
86
89
  Puppet::Provider::NameService::DirectoryService
87
90
  end
88
91
 
89
- it 'should execute convert_binary_to_xml once when getting the password' do
90
- subject.expects(:convert_binary_to_xml).returns({'SALTED-SHA512' => StringIO.new(pw_string)})
92
+ it 'should execute convert_binary_to_hash once when getting the password' do
93
+ subject.expects(:convert_binary_to_hash).returns({'SALTED-SHA512' => pw_string})
91
94
  Puppet::FileSystem.expects(:exist?).with(plist_path).once.returns(true)
92
- Plist.expects(:parse_xml).returns(shadow_hash_data)
93
- # On Mac OS X 10.7 we first need to convert to xml when reading the password
94
- subject.expects(:plutil).with('-convert', 'xml1', '-o', '/dev/stdout', plist_path)
95
+ Puppet::Util::Plist.expects(:read_plist_file).returns(shadow_hash_data)
95
96
  subject.get_password('uid', 'jeff')
96
97
  end
97
98
 
@@ -102,25 +103,19 @@ describe 'DirectoryService password behavior' do
102
103
  end
103
104
 
104
105
  it 'should convert xml-to-binary and binary-to-xml when setting the pw on >= 10.7' do
105
- subject.expects(:convert_binary_to_xml).returns({'SALTED-SHA512' => StringIO.new(pw_string)})
106
- subject.expects(:convert_xml_to_binary).returns(binary_plist)
106
+ subject.expects(:convert_binary_to_hash).returns({'SALTED-SHA512' => pw_string})
107
+ subject.expects(:convert_hash_to_binary).returns(binary_plist)
107
108
  Puppet::FileSystem.expects(:exist?).with(plist_path).once.returns(true)
108
- Plist.expects(:parse_xml).returns(shadow_hash_data)
109
- # On Mac OS X 10.7 we first need to convert to xml
110
- subject.expects(:plutil).with('-convert', 'xml1', '-o', '/dev/stdout', plist_path)
111
- # And again back to a binary plist or DirectoryService will complain
112
- subject.expects(:plutil).with('-convert', 'binary1', plist_path)
113
- Plist::Emit.expects(:save_plist).with(shadow_hash_data, plist_path)
109
+ Puppet::Util::Plist.expects(:read_plist_file).returns(shadow_hash_data)
110
+ Puppet::Util::Plist.expects(:write_plist_file).with(shadow_hash_data, plist_path, :binary)
114
111
  subject.set_password('jeff', 'uid', sha512_hash)
115
112
  end
116
113
 
117
114
  it '[#13686] should handle an empty ShadowHashData field in the users plist' do
118
- subject.expects(:convert_xml_to_binary).returns(binary_plist)
115
+ subject.expects(:convert_hash_to_binary).returns(binary_plist)
119
116
  Puppet::FileSystem.expects(:exist?).with(plist_path).once.returns(true)
120
- Plist.expects(:parse_xml).returns({'ShadowHashData' => nil})
121
- subject.expects(:plutil).with('-convert', 'xml1', '-o', '/dev/stdout', plist_path)
122
- subject.expects(:plutil).with('-convert', 'binary1', plist_path)
123
- Plist::Emit.expects(:save_plist)
117
+ Puppet::Util::Plist.expects(:read_plist_file).returns({'ShadowHashData' => nil})
118
+ Puppet::Util::Plist.expects(:write_plist_file)
124
119
  subject.set_password('jeff', 'uid', sha512_hash)
125
120
  end
126
121
  end
@@ -7,8 +7,7 @@ describe Puppet::Type.type(:package).provider(:appdmg) do
7
7
 
8
8
  describe "when installing an appdmg" do
9
9
  let(:fake_mountpoint) { "/tmp/dmg.foo" }
10
- let(:empty_hdiutil_plist) { Plist::Emit.dump({}) }
11
- let(:fake_hdiutil_plist) { Plist::Emit.dump({"system-entities" => [{"mount-point" => fake_mountpoint}]}) }
10
+ let(:fake_hdiutil_plist) { {"system-entities" => [{"mount-point" => fake_mountpoint}]} }
12
11
 
13
12
  before do
14
13
  fh = mock 'filehandle'
@@ -32,7 +31,8 @@ describe Puppet::Type.type(:package).provider(:appdmg) do
32
31
  described_class.expects(:curl).with do |*args|
33
32
  args[0] == "-o" && args[1].include?(tmpdir) && ! args.include?("-k")
34
33
  end
35
- described_class.stubs(:hdiutil).returns fake_hdiutil_plist
34
+ described_class.stubs(:hdiutil).returns 'a plist'
35
+ Puppet::Util::Plist.expects(:parse_plist).with('a plist').returns fake_hdiutil_plist
36
36
  described_class.expects(:installapp)
37
37
 
38
38
  provider.install
@@ -35,6 +35,22 @@ describe provider_class do
35
35
  it { is_expected.to be_virtual_packages }
36
36
  end
37
37
 
38
+ describe "default provider" do
39
+ before do
40
+ Facter.expects(:value).with(:operatingsystem).returns("fedora")
41
+ end
42
+
43
+ it "should be the default provider on Fedora 22" do
44
+ Facter.expects(:value).with(:operatingsystemmajrelease).returns('22')
45
+ expect(described_class.default?).to be_truthy
46
+ end
47
+
48
+ it "should be the default provider on Fedora 23" do
49
+ Facter.expects(:value).with(:operatingsystemmajrelease).returns('23')
50
+ expect(described_class.default?).to be_truthy
51
+ end
52
+ end
53
+
38
54
  # provider should repond to the following methods
39
55
  [:install, :latest, :update, :purge, :install_options].each do |method|
40
56
  it "should have a(n) #{method}" do