puppet 4.3.2 → 4.4.0

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

Potentially problematic release.


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

Files changed (487) hide show
  1. checksums.yaml +4 -4
  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/debian/README.source +1 -1
  9. data/ext/debian/control +1 -1
  10. data/ext/debian/copyright +4 -4
  11. data/ext/debian/puppetmaster.README.debian +11 -9
  12. data/ext/emacs/puppet-mode.el +1 -1
  13. data/ext/envpuppet +2 -2
  14. data/ext/ips/puppetagent.xml +1 -1
  15. data/ext/ips/puppetmaster.xml +1 -1
  16. data/ext/project_data.yaml +8 -0
  17. data/ext/puppet-test +3 -3
  18. data/ext/rack/example-passenger-vhost.conf +1 -1
  19. data/ext/redhat/puppet.spec.erb +2 -2
  20. data/ext/regexp_nodes/regexp_nodes.rb +1 -1
  21. data/ext/solaris/pkginfo +1 -1
  22. data/ext/solaris/smf/puppet.xml +1 -1
  23. data/ext/suse/puppet.spec +2 -2
  24. data/ext/upload_facts.rb +1 -1
  25. data/ext/windows/puppet_interactive.bat +6 -0
  26. data/ext/windows/puppet_shell.bat +9 -0
  27. data/ext/windows/run_puppet_interactive.bat +9 -0
  28. data/ext/yaml_nodes.rb +1 -1
  29. data/install.rb +30 -20
  30. data/lib/puppet/agent.rb +1 -1
  31. data/lib/puppet/application/agent.rb +4 -2
  32. data/lib/puppet/application/apply.rb +7 -4
  33. data/lib/puppet/application/cert.rb +1 -1
  34. data/lib/puppet/application/device.rb +1 -1
  35. data/lib/puppet/application/filebucket.rb +1 -1
  36. data/lib/puppet/application/inspect.rb +1 -1
  37. data/lib/puppet/application/lookup.rb +4 -4
  38. data/lib/puppet/application/master.rb +2 -2
  39. data/lib/puppet/application/resource.rb +1 -1
  40. data/lib/puppet/configurer.rb +100 -22
  41. data/lib/puppet/data_providers/hiera_config.rb +28 -3
  42. data/lib/puppet/data_providers/hiera_interpolate.rb +30 -15
  43. data/lib/puppet/data_providers/hiera_support.rb +1 -1
  44. data/lib/puppet/data_providers/json_data_provider_factory.rb +2 -2
  45. data/lib/puppet/data_providers/yaml_data_provider_factory.rb +2 -2
  46. data/lib/puppet/defaults.rb +65 -19
  47. data/lib/puppet/environments.rb +3 -1
  48. data/lib/puppet/face/config.rb +1 -1
  49. data/lib/puppet/face/epp.rb +1 -1
  50. data/lib/puppet/face/help/man.erb +1 -1
  51. data/lib/puppet/face/module/install.rb +6 -6
  52. data/lib/puppet/face/parser.rb +12 -9
  53. data/lib/puppet/face/status.rb +2 -1
  54. data/lib/puppet/feature/cfpropertylist.rb +3 -0
  55. data/lib/puppet/feature/telnet.rb +9 -0
  56. data/lib/puppet/file_serving/http_metadata.rb +46 -0
  57. data/lib/puppet/file_serving/metadata.rb +18 -2
  58. data/lib/puppet/file_serving/terminus_selector.rb +2 -0
  59. data/lib/puppet/file_system.rb +2 -2
  60. data/lib/puppet/file_system/file_impl.rb +2 -2
  61. data/lib/puppet/file_system/memory_impl.rb +1 -1
  62. data/lib/puppet/file_system/uniquefile.rb +1 -1
  63. data/lib/puppet/forge.rb +1 -1
  64. data/lib/puppet/forge/repository.rb +1 -31
  65. data/lib/puppet/functions.rb +45 -6
  66. data/lib/puppet/functions/assert_type.rb +9 -9
  67. data/lib/puppet/functions/each.rb +5 -13
  68. data/lib/puppet/functions/filter.rb +5 -14
  69. data/lib/puppet/functions/map.rb +6 -14
  70. data/lib/puppet/functions/reduce.rb +5 -13
  71. data/lib/puppet/functions/reverse_each.rb +82 -0
  72. data/lib/puppet/functions/scanf.rb +15 -18
  73. data/lib/puppet/functions/slice.rb +22 -36
  74. data/lib/puppet/functions/split.rb +2 -2
  75. data/lib/puppet/functions/step.rb +88 -0
  76. data/lib/puppet/functions/type.rb +70 -0
  77. data/lib/puppet/graph/rb_tree_map.rb +1 -1
  78. data/lib/puppet/indirector/catalog/compiler.rb +188 -5
  79. data/lib/puppet/indirector/file_content/http.rb +15 -0
  80. data/lib/puppet/indirector/file_metadata/http.rb +27 -0
  81. data/lib/puppet/indirector/generic_http.rb +16 -0
  82. data/lib/puppet/indirector/node/exec.rb +1 -1
  83. data/lib/puppet/indirector/node/ldap.rb +1 -1
  84. data/lib/puppet/indirector/rest.rb +2 -1
  85. data/lib/puppet/info_service/class_information_service.rb +13 -12
  86. data/lib/puppet/loaders.rb +1 -0
  87. data/lib/puppet/module.rb +3 -0
  88. data/lib/puppet/module_tool/skeleton/templates/generator/Gemfile +9 -2
  89. data/lib/puppet/module_tool/skeleton/templates/generator/spec/classes/init_spec.rb.erb +1 -1
  90. data/lib/puppet/module_tool/skeleton/templates/generator/tests/init.pp.erb +2 -2
  91. data/lib/puppet/module_tool/tar/mini.rb +3 -3
  92. data/lib/puppet/network/http/pool.rb +9 -0
  93. data/lib/puppet/node.rb +1 -1
  94. data/lib/puppet/node/environment.rb +11 -2
  95. data/lib/puppet/parser/ast/pops_bridge.rb +19 -22
  96. data/lib/puppet/parser/compiler.rb +3 -3
  97. data/lib/puppet/parser/environment_compiler.rb +0 -1
  98. data/lib/puppet/parser/functions.rb +28 -16
  99. data/lib/puppet/parser/functions/fqdn_rand.rb +1 -1
  100. data/lib/puppet/parser/functions/inline_template.rb +1 -1
  101. data/lib/puppet/parser/functions/map.rb +1 -1
  102. data/lib/puppet/parser/functions/scanf.rb +15 -26
  103. data/lib/puppet/parser/functions/slice.rb +17 -24
  104. data/lib/puppet/parser/functions/split.rb +1 -1
  105. data/lib/puppet/parser/resource.rb +19 -17
  106. data/lib/puppet/parser/scope.rb +176 -5
  107. data/lib/puppet/plugins/data_providers/data_provider.rb +54 -13
  108. data/lib/puppet/pops.rb +0 -8
  109. data/lib/puppet/pops/adaptable.rb +4 -1
  110. data/lib/puppet/pops/adapters.rb +38 -13
  111. data/lib/puppet/pops/binder/binder.rb +21 -17
  112. data/lib/puppet/pops/binder/binder_issues.rb +8 -6
  113. data/lib/puppet/pops/binder/bindings_checker.rb +12 -8
  114. data/lib/puppet/pops/binder/bindings_composer.rb +16 -12
  115. data/lib/puppet/pops/binder/bindings_factory.rb +108 -104
  116. data/lib/puppet/pops/binder/bindings_model.rb +49 -47
  117. data/lib/puppet/pops/binder/config/diagnostic_producer.rb +10 -6
  118. data/lib/puppet/pops/binder/injector.rb +53 -48
  119. data/lib/puppet/pops/binder/key_factory.rb +10 -6
  120. data/lib/puppet/pops/binder/producers.rb +67 -62
  121. data/lib/puppet/pops/evaluator/access_operator.rb +95 -93
  122. data/lib/puppet/pops/evaluator/closure.rb +84 -68
  123. data/lib/puppet/pops/evaluator/collector_transformer.rb +18 -14
  124. data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +0 -1
  125. data/lib/puppet/pops/evaluator/compare_operator.rb +13 -9
  126. data/lib/puppet/pops/evaluator/epp_evaluator.rb +9 -8
  127. data/lib/puppet/pops/evaluator/evaluator_impl.rb +78 -76
  128. data/lib/puppet/pops/evaluator/json_strict_literal_evaluator.rb +85 -0
  129. data/lib/puppet/pops/evaluator/relationship_operator.rb +13 -11
  130. data/lib/puppet/pops/evaluator/runtime3_converter.rb +5 -0
  131. data/lib/puppet/pops/evaluator/runtime3_support.rb +41 -45
  132. data/lib/puppet/pops/issue_reporter.rb +6 -4
  133. data/lib/puppet/pops/issues.rb +34 -11
  134. data/lib/puppet/pops/loader/base_loader.rb +1 -1
  135. data/lib/puppet/pops/loader/loader.rb +1 -1
  136. data/lib/puppet/pops/loader/loader_paths.rb +15 -0
  137. data/lib/puppet/pops/loader/module_loaders.rb +17 -13
  138. data/lib/puppet/pops/loader/puppet_function_instantiator.rb +16 -12
  139. data/lib/puppet/pops/loader/ruby_function_instantiator.rb +16 -3
  140. data/lib/puppet/pops/loader/type_definition_instantiator.rb +55 -0
  141. data/lib/puppet/pops/loaders.rb +51 -9
  142. data/lib/puppet/pops/lookup.rb +14 -12
  143. data/lib/puppet/pops/merge_strategy.rb +16 -19
  144. data/lib/puppet/pops/model/factory.rb +26 -2
  145. data/lib/puppet/pops/model/model.rb +8 -8
  146. data/lib/puppet/pops/model/model_label_provider.rb +13 -7
  147. data/lib/puppet/pops/model/model_meta.rb +17 -0
  148. data/lib/puppet/pops/model/model_tree_dumper.rb +8 -0
  149. data/lib/puppet/pops/parser/egrammar.ra +38 -14
  150. data/lib/puppet/pops/parser/eparser.rb +1353 -1276
  151. data/lib/puppet/pops/parser/epp_support.rb +11 -7
  152. data/lib/puppet/pops/parser/evaluating_parser.rb +14 -10
  153. data/lib/puppet/pops/parser/heredoc_support.rb +15 -11
  154. data/lib/puppet/pops/parser/lexer2.rb +26 -19
  155. data/lib/puppet/pops/parser/lexer_support.rb +85 -7
  156. data/lib/puppet/pops/parser/locator.rb +21 -0
  157. data/lib/puppet/pops/parser/parser_support.rb +19 -16
  158. data/lib/puppet/pops/parser/slurp_support.rb +11 -7
  159. data/lib/puppet/pops/types/class_loader.rb +23 -19
  160. data/lib/puppet/pops/types/enumeration.rb +9 -26
  161. data/lib/puppet/pops/types/iterable.rb +308 -0
  162. data/lib/puppet/pops/types/recursion_guard.rb +82 -0
  163. data/lib/puppet/pops/types/type_acceptor.rb +25 -0
  164. data/lib/puppet/pops/types/type_asserter.rb +10 -9
  165. data/lib/puppet/pops/types/type_calculator.rb +138 -381
  166. data/lib/puppet/pops/types/type_factory.rb +91 -57
  167. data/lib/puppet/pops/types/type_formatter.rb +334 -0
  168. data/lib/puppet/pops/types/type_mismatch_describer.rb +226 -59
  169. data/lib/puppet/pops/types/type_parser.rb +159 -112
  170. data/lib/puppet/pops/types/types.rb +2057 -1247
  171. data/lib/puppet/pops/utils.rb +11 -10
  172. data/lib/puppet/pops/validation.rb +11 -9
  173. data/lib/puppet/pops/validation/checker4_0.rb +83 -55
  174. data/lib/puppet/pops/validation/validator_factory_4_0.rb +8 -4
  175. data/lib/puppet/provider/aixobject.rb +1 -1
  176. data/lib/puppet/provider/augeas/augeas.rb +1 -1
  177. data/lib/puppet/provider/cron/crontab.rb +1 -1
  178. data/lib/puppet/provider/exec/windows.rb +1 -1
  179. data/lib/puppet/provider/macauthorization/macauthorization.rb +10 -9
  180. data/lib/puppet/provider/nameservice/directoryservice.rb +35 -50
  181. data/lib/puppet/provider/package/appdmg.rb +3 -2
  182. data/lib/puppet/provider/package/dnf.rb +1 -1
  183. data/lib/puppet/provider/package/pip.rb +5 -8
  184. data/lib/puppet/provider/package/pip3.rb +1 -1
  185. data/lib/puppet/provider/package/pkg.rb +1 -1
  186. data/lib/puppet/provider/package/pkgdmg.rb +3 -2
  187. data/lib/puppet/provider/package/pkgng.rb +13 -4
  188. data/lib/puppet/provider/package/windows.rb +1 -1
  189. data/lib/puppet/provider/package/yum.rb +1 -1
  190. data/lib/puppet/provider/package/zypper.rb +19 -0
  191. data/lib/puppet/provider/service/debian.rb +2 -2
  192. data/lib/puppet/provider/service/launchd.rb +6 -18
  193. data/lib/puppet/provider/service/systemd.rb +9 -2
  194. data/lib/puppet/provider/sshkey/parsed.rb +1 -1
  195. data/lib/puppet/provider/user/aix.rb +1 -1
  196. data/lib/puppet/provider/user/directoryservice.rb +33 -58
  197. data/lib/puppet/provider/zfs/zfs.rb +1 -1
  198. data/lib/puppet/provider/zpool/zpool.rb +1 -1
  199. data/lib/puppet/reference/configuration.rb +1 -1
  200. data/lib/puppet/reference/providers.rb +1 -1
  201. data/lib/puppet/resource.rb +15 -12
  202. data/lib/puppet/resource/capability_finder.rb +20 -13
  203. data/lib/puppet/resource/catalog.rb +60 -3
  204. data/lib/puppet/resource/status.rb +11 -2
  205. data/lib/puppet/resource/type.rb +28 -38
  206. data/lib/puppet/settings.rb +1 -1
  207. data/lib/puppet/settings/config_file.rb +1 -1
  208. data/lib/puppet/settings/environment_conf.rb +13 -5
  209. data/lib/puppet/ssl/certificate_factory.rb +3 -3
  210. data/lib/puppet/ssl/certificate_request.rb +4 -4
  211. data/lib/puppet/ssl/certificate_signer.rb +1 -1
  212. data/lib/puppet/ssl/validator/default_validator.rb +1 -1
  213. data/lib/puppet/test/test_helper.rb +16 -4
  214. data/lib/puppet/transaction.rb +15 -2
  215. data/lib/puppet/transaction/additional_resource_generator.rb +6 -2
  216. data/lib/puppet/transaction/report.rb +31 -1
  217. data/lib/puppet/transaction/resource_harness.rb +0 -25
  218. data/lib/puppet/type.rb +11 -11
  219. data/lib/puppet/type/augeas.rb +1 -1
  220. data/lib/puppet/type/cron.rb +12 -12
  221. data/lib/puppet/type/file.rb +91 -39
  222. data/lib/puppet/type/file/checksum_value.rb +53 -0
  223. data/lib/puppet/type/file/content.rb +26 -111
  224. data/lib/puppet/type/file/data_sync.rb +84 -0
  225. data/lib/puppet/type/file/ensure.rb +17 -14
  226. data/lib/puppet/type/file/selcontext.rb +1 -1
  227. data/lib/puppet/type/file/source.rb +103 -18
  228. data/lib/puppet/type/filebucket.rb +1 -1
  229. data/lib/puppet/type/interface.rb +8 -3
  230. data/lib/puppet/type/macauthorization.rb +1 -1
  231. data/lib/puppet/type/package.rb +6 -0
  232. data/lib/puppet/type/schedule.rb +1 -1
  233. data/lib/puppet/type/stage.rb +1 -1
  234. data/lib/puppet/type/user.rb +19 -17
  235. data/lib/puppet/type/yumrepo.rb +20 -0
  236. data/lib/puppet/util.rb +109 -22
  237. data/lib/puppet/util/autoload.rb +16 -11
  238. data/lib/puppet/util/checksums.rb +74 -31
  239. data/lib/puppet/util/execution.rb +1 -1
  240. data/lib/puppet/util/http_proxy.rb +72 -0
  241. data/lib/puppet/util/log.rb +2 -0
  242. data/lib/puppet/util/logging.rb +43 -1
  243. data/lib/puppet/util/monkey_patches.rb +2 -2
  244. data/lib/puppet/util/multi_match.rb +51 -0
  245. data/lib/puppet/util/network_device/cisco/device.rb +10 -2
  246. data/lib/puppet/util/network_device/cisco/interface.rb +21 -8
  247. data/lib/puppet/util/network_device/transport/ssh.rb +7 -3
  248. data/lib/puppet/util/network_device/transport/telnet.rb +39 -36
  249. data/lib/puppet/util/plist.rb +130 -0
  250. data/lib/puppet/util/resource_template.rb +1 -1
  251. data/lib/puppet/util/run_mode.rb +2 -2
  252. data/lib/puppet/util/skip_tags.rb +9 -0
  253. data/lib/puppet/util/windows/access_control_entry.rb +1 -1
  254. data/lib/puppet/util/windows/access_control_list.rb +3 -3
  255. data/lib/puppet/util/windows/adsi.rb +4 -4
  256. data/lib/puppet/util/windows/api_types.rb +24 -18
  257. data/lib/puppet/util/windows/com.rb +3 -3
  258. data/lib/puppet/util/windows/error.rb +1 -1
  259. data/lib/puppet/util/windows/file.rb +8 -8
  260. data/lib/puppet/util/windows/principal.rb +23 -14
  261. data/lib/puppet/util/windows/process.rb +78 -11
  262. data/lib/puppet/util/windows/registry.rb +1 -1
  263. data/lib/puppet/util/windows/root_certs.rb +5 -5
  264. data/lib/puppet/util/windows/security.rb +33 -35
  265. data/lib/puppet/util/windows/security_descriptor.rb +1 -1
  266. data/lib/puppet/util/windows/sid.rb +42 -4
  267. data/lib/puppet/util/windows/taskscheduler.rb +15 -15
  268. data/lib/puppet/util/windows/user.rb +10 -10
  269. data/lib/puppet/vendor/deep_merge/deep_merge.gemspec +1 -1
  270. data/lib/puppet/vendor/pathspec/LICENSE +2 -2
  271. data/lib/puppet/vendor/pathspec/README.md +1 -1
  272. data/lib/puppet/vendor/rgen/README.rdoc +1 -1
  273. data/lib/puppet/vendor/semantic/lib/semantic/dependency/module_release.rb +14 -0
  274. data/lib/puppet/version.rb +1 -1
  275. data/lib/semver.rb +17 -1
  276. data/man/man5/puppet.conf.5 +12 -12
  277. data/man/man8/extlookup2hiera.8 +1 -1
  278. data/man/man8/puppet-agent.8 +2 -2
  279. data/man/man8/puppet-apply.8 +2 -2
  280. data/man/man8/puppet-ca.8 +2 -2
  281. data/man/man8/puppet-catalog.8 +2 -2
  282. data/man/man8/puppet-cert.8 +2 -2
  283. data/man/man8/puppet-certificate.8 +2 -2
  284. data/man/man8/puppet-certificate_request.8 +2 -2
  285. data/man/man8/puppet-certificate_revocation_list.8 +2 -2
  286. data/man/man8/puppet-config.8 +3 -3
  287. data/man/man8/puppet-describe.8 +1 -1
  288. data/man/man8/puppet-device.8 +1 -1
  289. data/man/man8/puppet-doc.8 +1 -1
  290. data/man/man8/puppet-epp.8 +2 -2
  291. data/man/man8/puppet-facts.8 +2 -2
  292. data/man/man8/puppet-file.8 +2 -2
  293. data/man/man8/puppet-filebucket.8 +2 -2
  294. data/man/man8/puppet-help.8 +2 -2
  295. data/man/man8/puppet-inspect.8 +2 -2
  296. data/man/man8/puppet-key.8 +2 -2
  297. data/man/man8/puppet-man.8 +2 -2
  298. data/man/man8/puppet-master.8 +2 -2
  299. data/man/man8/puppet-module.8 +9 -9
  300. data/man/man8/puppet-node.8 +2 -2
  301. data/man/man8/puppet-parser.8 +2 -2
  302. data/man/man8/puppet-plugin.8 +2 -2
  303. data/man/man8/puppet-report.8 +2 -2
  304. data/man/man8/puppet-resource.8 +2 -2
  305. data/man/man8/puppet-resource_type.8 +2 -2
  306. data/man/man8/puppet-status.8 +3 -3
  307. data/man/man8/puppet.8 +1 -1
  308. data/spec/fixtures/module.tar.gz +0 -0
  309. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/lib/puppet/functions/bad_data/data.rb +1 -0
  310. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/manifests/init.pp +0 -1
  311. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/data/empty.json +0 -0
  312. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/hiera.yaml +5 -0
  313. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/manifests/init.pp +2 -0
  314. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/metadata.json +9 -0
  315. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/data/empty.yaml +1 -0
  316. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/hiera.yaml +5 -0
  317. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/manifests/init.pp +2 -0
  318. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/metadata.json +9 -0
  319. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/data/first.json +2 -1
  320. data/spec/fixtures/unit/module/trailing-comma.json +1 -1
  321. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/manifests/init.pp +3 -1
  322. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/types/zero.pp +1 -0
  323. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseeone.pp +1 -0
  324. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseezero.pp +1 -0
  325. data/spec/fixtures/unit/provider/package/yum/yum-check-update-broken-notices.txt +187 -0
  326. data/spec/fixtures/unit/provider/sshkey/parsed/sample_with_blank_lines +8 -0
  327. 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
  328. 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
  329. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +213 -0
  330. 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
  331. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +197 -0
  332. 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
  333. 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
  334. data/spec/integration/defaults_spec.rb +14 -2
  335. data/spec/integration/file_system/uniquefile_spec.rb +29 -0
  336. data/spec/integration/module_tool/tar/mini_spec.rb +28 -0
  337. data/spec/integration/node/environment_spec.rb +13 -0
  338. data/spec/integration/parser/dynamic_scoping_spec.rb +67 -0
  339. data/spec/integration/parser/parameter_defaults_spec.rb +336 -0
  340. data/spec/integration/parser/undef_param_spec.rb +8 -0
  341. data/spec/integration/provider/yumrepo_spec.rb +1 -1
  342. data/spec/integration/test/test_helper_spec.rb +28 -0
  343. data/spec/integration/transaction/report_spec.rb +16 -0
  344. data/spec/integration/transaction_spec.rb +11 -0
  345. data/spec/integration/type/file_spec.rb +194 -4
  346. data/spec/integration/type/package_spec.rb +5 -1
  347. data/spec/integration/type/tidy_spec.rb +21 -9
  348. data/spec/integration/util/execution_spec.rb +22 -0
  349. data/spec/integration/util/windows/principal_spec.rb +90 -4
  350. data/spec/integration/util/windows/process_spec.rb +31 -0
  351. data/spec/integration/util/windows/security_spec.rb +6 -6
  352. data/spec/integration/util/windows/user_spec.rb +1 -1
  353. data/spec/integration/util_spec.rb +49 -27
  354. data/spec/lib/puppet_spec/compiler.rb +17 -0
  355. data/spec/lib/puppet_spec/files.rb +2 -2
  356. data/spec/lib/puppet_spec/pops.rb +13 -0
  357. data/spec/shared_behaviours/iterative_functions.rb +1 -1
  358. data/spec/shared_contexts/types_setup.rb +96 -0
  359. data/spec/unit/agent_spec.rb +1 -0
  360. data/spec/unit/application/agent_spec.rb +10 -0
  361. data/spec/unit/application/apply_spec.rb +9 -0
  362. data/spec/unit/configurer/downloader_spec.rb +5 -5
  363. data/spec/unit/configurer_spec.rb +271 -39
  364. data/spec/unit/data_providers/hiera_interpolation_spec.rb +57 -0
  365. data/spec/unit/defaults_spec.rb +15 -0
  366. data/spec/unit/environments_spec.rb +24 -4
  367. data/spec/unit/face/parser_spec.rb +43 -2
  368. data/spec/unit/file_serving/http_metadata_spec.rb +85 -0
  369. data/spec/unit/file_serving/metadata_spec.rb +50 -0
  370. data/spec/unit/file_serving/terminus_selector_spec.rb +12 -2
  371. data/spec/unit/file_system_spec.rb +26 -0
  372. data/spec/unit/functions/assert_type_spec.rb +36 -2
  373. data/spec/unit/functions/defined_spec.rb +2 -2
  374. data/spec/unit/functions/epp_spec.rb +11 -3
  375. data/spec/unit/functions/lookup_spec.rb +58 -13
  376. data/spec/unit/functions/regsubst_spec.rb +1 -1
  377. data/spec/unit/functions/reverse_each_spec.rb +108 -0
  378. data/spec/unit/functions/step_spec.rb +113 -0
  379. data/spec/unit/functions/type_spec.rb +35 -0
  380. data/spec/unit/functions4_spec.rb +61 -5
  381. data/spec/unit/indirector/catalog/compiler_spec.rb +705 -4
  382. data/spec/unit/indirector/file_bucket_file/file_spec.rb +1 -1
  383. data/spec/unit/indirector/indirection_spec.rb +1 -1
  384. data/spec/unit/info_service_spec.rb +94 -32
  385. data/spec/unit/module_spec.rb +14 -0
  386. data/spec/unit/module_tool/applications/builder_spec.rb +4 -4
  387. data/spec/unit/network/authstore_spec.rb +1 -1
  388. data/spec/unit/network/http/connection_spec.rb +1 -0
  389. data/spec/unit/network/http/pool_spec.rb +30 -0
  390. data/spec/unit/node_spec.rb +1 -1
  391. data/spec/unit/parser/compiler_spec.rb +16 -0
  392. data/spec/unit/parser/scope_spec.rb +28 -11
  393. data/spec/unit/pops/evaluator/access_ops_spec.rb +3 -3
  394. data/spec/unit/pops/evaluator/comparison_ops_spec.rb +3 -0
  395. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +7 -1
  396. data/spec/unit/pops/evaluator/evaluator_rspec_helper.rb +4 -4
  397. data/spec/unit/pops/evaluator/json_strict_literal_evaluator_spec.rb +63 -0
  398. data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +6 -0
  399. data/spec/unit/pops/loaders/dependency_loader_spec.rb +53 -0
  400. data/spec/unit/pops/loaders/loaders_spec.rb +44 -1
  401. data/spec/unit/pops/parser/lexer2_spec.rb +112 -3
  402. data/spec/unit/pops/parser/parse_calls_spec.rb +8 -0
  403. data/spec/unit/pops/parser/parser_spec.rb +10 -0
  404. data/spec/unit/pops/parser/source_pos_adapter_spec.rb +26 -0
  405. data/spec/unit/pops/types/iterable_spec.rb +262 -0
  406. data/spec/unit/pops/types/recursion_guard_spec.rb +91 -0
  407. data/spec/unit/pops/types/type_acceptor_spec.rb +105 -0
  408. data/spec/unit/pops/types/type_asserter_spec.rb +43 -0
  409. data/spec/unit/pops/types/type_calculator_spec.rb +275 -373
  410. data/spec/unit/pops/types/type_formatter_spec.rb +280 -0
  411. data/spec/unit/pops/types/type_mismatch_describer_spec.rb +152 -0
  412. data/spec/unit/pops/types/type_parser_spec.rb +58 -13
  413. data/spec/unit/pops/types/types_spec.rb +241 -0
  414. data/spec/unit/pops/validator/validator_spec.rb +100 -43
  415. data/spec/unit/provider/cron/parsed_spec.rb +1 -0
  416. data/spec/unit/provider/macauthorization_spec.rb +5 -2
  417. data/spec/unit/provider/nameservice/directoryservice_spec.rb +14 -19
  418. data/spec/unit/provider/package/appdmg_spec.rb +3 -3
  419. data/spec/unit/provider/package/dnf_spec.rb +16 -0
  420. data/spec/unit/provider/package/pip3_spec.rb +60 -42
  421. data/spec/unit/provider/package/pip_spec.rb +47 -34
  422. data/spec/unit/provider/package/pkgdmg_spec.rb +18 -9
  423. data/spec/unit/provider/package/pkgng_spec.rb +4 -2
  424. data/spec/unit/provider/package/yum_spec.rb +11 -0
  425. data/spec/unit/provider/package/zypper_spec.rb +14 -0
  426. data/spec/unit/provider/service/launchd_spec.rb +17 -35
  427. data/spec/unit/provider/service/systemd_spec.rb +7 -0
  428. data/spec/unit/provider/sshkey/parsed_spec.rb +20 -19
  429. data/spec/unit/provider/user/directoryservice_spec.rb +40 -59
  430. data/spec/unit/resource/capability_finder_spec.rb +28 -15
  431. data/spec/unit/resource/catalog_spec.rb +33 -1
  432. data/spec/unit/resource/type_spec.rb +149 -7
  433. data/spec/unit/resource_spec.rb +96 -57
  434. data/spec/unit/settings/environment_conf_spec.rb +18 -1
  435. data/spec/unit/ssl/certificate_revocation_list_spec.rb +3 -3
  436. data/spec/unit/transaction/report_spec.rb +27 -0
  437. data/spec/unit/transaction/resource_harness_spec.rb +0 -47
  438. data/spec/unit/transaction_spec.rb +5 -0
  439. data/spec/unit/type/file/checksum_spec.rb +6 -0
  440. data/spec/unit/type/file/checksum_value_spec.rb +286 -0
  441. data/spec/unit/type/file/content_spec.rb +12 -193
  442. data/spec/unit/type/file/source_spec.rb +211 -119
  443. data/spec/unit/type/file_spec.rb +133 -34
  444. data/spec/unit/type/interface_spec.rb +32 -0
  445. data/spec/unit/type/macauthorization_spec.rb +4 -1
  446. data/spec/unit/type/yumrepo_spec.rb +2 -2
  447. data/spec/unit/util/filetype_spec.rb +1 -1
  448. data/spec/unit/util/http_proxy_spec.rb +2 -2
  449. data/spec/unit/util/log/destinations_spec.rb +0 -2
  450. data/spec/unit/util/logging_spec.rb +69 -0
  451. data/spec/unit/util/multi_match_spec.rb +39 -0
  452. data/spec/unit/util/network_device/cisco/device_spec.rb +253 -216
  453. data/spec/unit/util/network_device/transport/telnet_spec.rb +60 -58
  454. data/spec/unit/util/plist_spec.rb +110 -0
  455. data/spec/unit/util/resource_template_spec.rb +2 -2
  456. data/spec/unit/util/run_mode_spec.rb +27 -3
  457. data/spec/unit/util/windows/adsi_spec.rb +4 -4
  458. data/spec/unit/util/windows/api_types_spec.rb +42 -0
  459. data/spec/unit/util/windows/security_descriptor_spec.rb +3 -3
  460. data/spec/unit/util/windows/sid_spec.rb +1 -1
  461. data/spec/unit/util_spec.rb +123 -13
  462. data/tasks/cfpropertylist.rake +15 -0
  463. metadata +114 -26
  464. data/lib/puppet/vendor/load_plist.rb +0 -1
  465. data/lib/puppet/vendor/plist/CHANGELOG +0 -82
  466. data/lib/puppet/vendor/plist/MIT-LICENSE +0 -21
  467. data/lib/puppet/vendor/plist/PUPPET_README.md +0 -6
  468. data/lib/puppet/vendor/plist/README +0 -36
  469. data/lib/puppet/vendor/plist/Rakefile +0 -144
  470. data/lib/puppet/vendor/plist/docs/USAGE +0 -104
  471. data/lib/puppet/vendor/plist/docs/jamis-template.rb +0 -591
  472. data/lib/puppet/vendor/plist/lib/plist.rb +0 -22
  473. data/lib/puppet/vendor/plist/lib/plist/generator.rb +0 -224
  474. data/lib/puppet/vendor/plist/lib/plist/parser.rb +0 -225
  475. data/lib/puppet/vendor/plist/test/assets/AlbumData.xml +0 -203
  476. data/lib/puppet/vendor/plist/test/assets/Cookies.plist +0 -104
  477. data/lib/puppet/vendor/plist/test/assets/commented.plist +0 -9
  478. data/lib/puppet/vendor/plist/test/assets/example_data.bin +0 -0
  479. data/lib/puppet/vendor/plist/test/assets/example_data.jpg +0 -0
  480. data/lib/puppet/vendor/plist/test/assets/example_data.plist +0 -259
  481. data/lib/puppet/vendor/plist/test/assets/test_data_elements.plist +0 -24
  482. data/lib/puppet/vendor/plist/test/assets/test_empty_key.plist +0 -13
  483. data/lib/puppet/vendor/plist/test/test_data_elements.rb +0 -115
  484. data/lib/puppet/vendor/plist/test/test_generator.rb +0 -59
  485. data/lib/puppet/vendor/plist/test/test_generator_basic_types.rb +0 -58
  486. data/lib/puppet/vendor/plist/test/test_generator_collections.rb +0 -82
  487. data/lib/puppet/vendor/plist/test/test_parser.rb +0 -90
@@ -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
@@ -151,7 +151,7 @@ describe "validating 4x" do
151
151
  end
152
152
 
153
153
  context 'for reserved words' do
154
- ['private', 'type', 'attr'].each do |word|
154
+ ['private', 'attr'].each do |word|
155
155
  it "produces an error for the word '#{word}'" do
156
156
  source = "$a = #{word}"
157
157
  expect(validate(parse(source))).to have_issue(Puppet::Pops::Issues::RESERVED_WORD)
@@ -217,6 +217,27 @@ describe "validating 4x" do
217
217
  end
218
218
  end
219
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
+
220
241
  context 'for parameter names' do
221
242
  ['class', 'define'].each do |word|
222
243
  it "should require that #{word} parameter names are unique" do
@@ -229,6 +250,34 @@ describe "validating 4x" do
229
250
  end
230
251
  end
231
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
+
232
281
  context 'for reserved parameter names' do
233
282
  ['name', 'title'].each do |word|
234
283
  it "produces an error when $#{word} is used as a parameter in a class" do
@@ -272,61 +321,69 @@ describe "validating 4x" do
272
321
  end
273
322
  end
274
323
 
275
- context 'top level constructs in conditionals' do
276
- ['class', 'define', 'node'].each do |word|
277
- it "produces an error when $#{word} is nested in an if expression" do
278
- source = "if true { #{word} x {} }"
279
- expect(validate(parse(source))).to have_issue(Puppet::Pops::Issues::NOT_TOP_LEVEL)
280
- 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
281
327
  end
282
328
 
283
- ['class', 'define', 'node'].each do |word|
284
- it "produces an error when $#{word} is nested in an if-else expression" do
285
- source = "if false {} else { #{word} x {} }"
286
- 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
287
353
  end
288
- end
289
354
 
290
- ['class', 'define', 'node'].each do |word|
291
- it "produces an error when $#{word} is nested in an unless expression" do
292
- source = "unless false { #{word} x {} }"
293
- expect(validate(parse(source))).to have_issue(Puppet::Pops::Issues::NOT_TOP_LEVEL)
294
- end
295
- end
355
+ # Test that the expression can exist anywhere in a top level block
296
356
 
297
- ['class', 'define', 'node'].each do |word|
298
- it "produces an error when $#{word} is nested in an function" do
299
- source = "function y() { #{word} x {} }"
300
- expect(validate(parse(source))).to have_issue(Puppet::Pops::Issues::NOT_TOP_LEVEL)
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))
301
359
  end
302
- end
303
360
 
304
- it 'produces an error when a function is nested in an function' do
305
- source = 'function y() { function x() {} }'
306
- expect(validate(parse(source))).to have_issue(Puppet::Pops::Issues::NOT_ABSOLUTE_TOP_LEVEL)
307
- end
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
308
365
 
309
- ['class', 'define', 'node'].each do |word|
310
- it "produces an error when function is nested in a #{word}" do
311
- source = "#{word} x { function y() {} }"
312
- expect(validate(parse(source))).to have_issue(Puppet::Pops::Issues::NOT_ABSOLUTE_TOP_LEVEL)
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))
313
369
  end
314
- end
315
370
 
316
- it 'does not produce an error when function is at top level script' do
317
- source = 'function y() {}'
318
- expect(validate(parse(source))).not_to have_issue(Puppet::Pops::Issues::NOT_ABSOLUTE_TOP_LEVEL)
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))
374
+ end
319
375
  end
320
376
 
321
- it 'does not produce an error when function is at top level file' do
322
- source = 'function y() {}'
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
323
382
 
324
- # We simulate a file by inserting a block between the program and the contained function
325
- program = parse(source).current
326
- function = program.body
327
- program.body = Puppet::Pops::Model::BlockExpression.new
328
- program.body.addStatements(function)
329
- expect(validate(program)).not_to have_issue(Puppet::Pops::Issues::NOT_ABSOLUTE_TOP_LEVEL)
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)
386
+ end
330
387
  end
331
388
  end
332
389
 
@@ -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
@@ -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)