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
@@ -158,7 +158,7 @@ describe Puppet::Parser::Scope do
158
158
  expect { @scope[:foo] = 12 }.to raise_error(Puppet::ParseError, /Scope variable name .* not a string/)
159
159
  end
160
160
 
161
- it "should return nil for unset variables" do
161
+ it "should return nil for unset variables when --strict variables is not in effect" do
162
162
  expect(@scope["var"]).to be_nil
163
163
  end
164
164
 
@@ -208,6 +208,26 @@ describe Puppet::Parser::Scope do
208
208
  expect(@scope).not_to be_include("var")
209
209
  end
210
210
 
211
+ it "warns and return nil for non found unqualified variable" do
212
+ Puppet.expects(:warn_once)
213
+ expect(@scope["santa_clause"]).to be_nil
214
+ end
215
+
216
+ it "warns once for a non found variable" do
217
+ Puppet.expects(:warning).once
218
+ expect([@scope["santa_claus"],@scope["santa_claus"]]).to eq([nil, nil])
219
+ end
220
+
221
+ it "warns and return nil for non found qualified variable" do
222
+ Puppet.expects(:warn_once)
223
+ expect(@scope["north_pole::santa_clause"]).to be_nil
224
+ end
225
+
226
+ it "does not warn when a numeric variable is missing - they always exist" do
227
+ Puppet.expects(:warn_once).never
228
+ expect(@scope["1"]).to be_nil
229
+ end
230
+
211
231
  describe "and the variable is qualified" do
212
232
  before :each do
213
233
  @known_resource_types = @scope.known_resource_types
@@ -266,17 +286,16 @@ describe Puppet::Parser::Scope do
266
286
 
267
287
  it "should warn and return nil for qualified variables whose classes have not been evaluated" do
268
288
  klass = newclass("other::deep::klass")
269
- @scope.expects(:warning)
289
+ Puppet.expects(:warn_once)
270
290
  expect(@scope["other::deep::klass::var"]).to be_nil
271
291
  end
272
292
 
273
293
  it "should warn and return nil for qualified variables whose classes do not exist" do
274
- @scope.expects(:warning)
294
+ Puppet.expects(:warn_once)
275
295
  expect(@scope["other::deep::klass::var"]).to be_nil
276
296
  end
277
297
 
278
298
  it "should return nil when asked for a non-string qualified variable from a class that does not exist" do
279
- @scope.stubs(:warning)
280
299
  expect(@scope["other::deep::klass::var"]).to be_nil
281
300
  end
282
301
 
@@ -489,17 +508,15 @@ describe Puppet::Parser::Scope do
489
508
  expect(@scope.include?("1")).to be_falsey
490
509
  end
491
510
 
492
- describe "when calling unset_ephemeral_var with a level" do
511
+ describe "when using a guarded scope" do
493
512
  it "should remove ephemeral scopes up to this level" do
494
513
  @scope.set_match_data({1 => :value1})
495
514
  @scope.new_ephemeral
496
515
  @scope.set_match_data({1 => :value2})
497
- level = @scope.ephemeral_level()
498
- @scope.new_ephemeral
499
- @scope.set_match_data({1 => :value3})
500
-
501
- @scope.unset_ephemeral_var(level)
502
-
516
+ @scope.with_guarded_scope do
517
+ @scope.new_ephemeral
518
+ @scope.set_match_data({1 => :value3})
519
+ end
503
520
  expect(@scope["1"]).to eq(:value2)
504
521
  end
505
522
  end
@@ -120,7 +120,7 @@ describe 'Puppet::Pops::Evaluator::EvaluatorImpl/AccessOperator' do
120
120
 
121
121
  it 'produces an Integer[1]' do
122
122
  expr = fqr('Integer')[1]
123
- expect(evaluate(expr)).to eql(range(1,1))
123
+ expect(evaluate(expr)).to eql(range(1,:default))
124
124
  end
125
125
 
126
126
  it 'gives an error for Integer[from, <from]' do
@@ -146,12 +146,12 @@ describe 'Puppet::Pops::Evaluator::EvaluatorImpl/AccessOperator' do
146
146
 
147
147
  it 'produces a Float[1.0]' do
148
148
  expr = fqr('Float')[1.0]
149
- expect(evaluate(expr)).to eql(float_range(1.0,1.0))
149
+ expect(evaluate(expr)).to eql(float_range(1.0,:default))
150
150
  end
151
151
 
152
152
  it 'produces a Float[1]' do
153
153
  expr = fqr('Float')[1]
154
- expect(evaluate(expr)).to eql(float_range(1.0,1.0))
154
+ expect(evaluate(expr)).to eql(float_range(1.0,:default))
155
155
  end
156
156
 
157
157
  it 'gives an error for Float[from, <from]' do
@@ -86,6 +86,9 @@ describe 'Puppet::Pops::Evaluator::EvaluatorImpl' do
86
86
  it "'1.0' < 1.1 == true" do
87
87
  expect{evaluate(literal('1.0') < literal(1.1))}.to raise_error(/String < Float/)
88
88
  end
89
+ it "undef < 1.1 == true" do
90
+ expect{evaluate(literal(nil) < literal(1.1))}.to raise_error(/Undef Value < Float/)
91
+ end
89
92
  end
90
93
 
91
94
  context "of regular expressions" do
@@ -598,6 +598,11 @@ describe 'Puppet::Pops::Evaluator::EvaluatorImpl' do
598
598
  expect(result).to include(['b', 20])
599
599
  end
600
600
 
601
+ it "should create an array from an Iterator" do
602
+ expect(parser.evaluate_string(scope, '[1,2,3].reverse_each', __FILE__).is_a?(Array)).to be(false)
603
+ result = parser.evaluate_string(scope, '*[1,2,3].reverse_each', __FILE__)
604
+ expect(result).to eql([3,2,1])
605
+ end
601
606
  end
602
607
 
603
608
  context "When evaluator performs [] operations" do
@@ -861,7 +866,8 @@ describe 'Puppet::Pops::Evaluator::EvaluatorImpl' do
861
866
  # NOTE: these meta-esque parameters are not recognized as such
862
867
  "notify { id: message=>explicit} Notify[id][title]" => /does not have a parameter called 'title'/,
863
868
  "notify { id: message=>explicit} Notify[id]['type']" => /does not have a parameter called 'type'/,
864
- "notify { id: message=>explicit } Notify[id]{message=>override}" => /'message' is already set on Notify\[id\]/
869
+ "notify { id: message=>explicit } Notify[id]{message=>override}" => /'message' is already set on Notify\[id\]/,
870
+ "notify { id: message => 'once', message => 'twice' }" => /'message' has already been set/
865
871
  }.each do |source, result|
866
872
  it "should parse '#{source}' and raise error matching #{result}" do
867
873
  expect { parser.evaluate_string(scope, source, __FILE__)}.to raise_error(result)
@@ -55,10 +55,10 @@ module EvaluatorRspecHelper
55
55
  result = evaluator.evaluate(in_top_scope.current, top_scope)
56
56
  if in_local_scope
57
57
  # This is really bad in 3.x scope
58
- elevel = top_scope.ephemeral_level
59
- top_scope.new_ephemeral(true)
60
- result = evaluator.evaluate(in_local_scope.current, top_scope)
61
- top_scope.unset_ephemeral_var(elevel)
58
+ top_scope.with_guarded_scope do
59
+ top_scope.new_ephemeral(true)
60
+ result = evaluator.evaluate(in_local_scope.current, top_scope)
61
+ end
62
62
  end
63
63
  if in_top_scope_again
64
64
  result = evaluator.evaluate(in_top_scope_again.current, top_scope)
@@ -0,0 +1,63 @@
1
+ require 'spec_helper'
2
+
3
+ require 'puppet/pops'
4
+ require 'puppet/pops/evaluator/json_strict_literal_evaluator'
5
+
6
+ describe "Puppet::Pops::Evaluator::JsonStrictLiteralEvaluator" do
7
+ let(:parser) { Puppet::Pops::Parser::EvaluatingParser.new }
8
+ let(:leval) { Puppet::Pops::Evaluator::JsonStrictLiteralEvaluator.new }
9
+
10
+ { "1" => 1,
11
+ "3.14" => 3.14,
12
+ "true" => true,
13
+ "false" => false,
14
+ "'1'" => '1',
15
+ "'a'" => 'a',
16
+ '"a"' => 'a',
17
+ 'a' => 'a',
18
+ 'a::b' => 'a::b',
19
+ 'undef' => nil,
20
+
21
+ # collections
22
+ '[1,2,3]' => [1,2,3],
23
+ '{a=>1,b=>2}' => {'a' => 1, 'b' => 2},
24
+ '[undef]' => [nil],
25
+ '{a=>undef}' => { 'a' => nil }
26
+
27
+ }.each do |source, result|
28
+ it "evaluates '#{source}' to #{result}" do
29
+ expect(leval.literal(parser.parse_string(source))).to eq(result)
30
+ end
31
+ end
32
+
33
+ [ '1+1',
34
+ 'File',
35
+ '[1,2, 1+2]',
36
+ '{a=>1+1}',
37
+ 'Integer[1]',
38
+ '"x$y"',
39
+ '"x${y}z"'
40
+ ].each do |source|
41
+ it "throws :not_literal for non literal expression '#{source}'" do
42
+ expect{leval.literal(parser.parse_string('1+1'))}.to throw_symbol(:not_literal)
43
+ end
44
+ end
45
+
46
+ [ 'default',
47
+ '/.*/',
48
+ '{1=>100}',
49
+ '{undef => 10}',
50
+ '{default => 10}',
51
+ '{/.*/ => 10}',
52
+ '{"ok" => {1 => 100}}',
53
+ '[default]',
54
+ '[[default]]',
55
+ '[/.*/]',
56
+ '[[/.*/]]',
57
+ '[{1 => 100}]',
58
+ ].each do |source|
59
+ it "throws :not_literal for values not representable as pure JSON '#{source}'" do
60
+ expect{leval.literal(parser.parse_string('1+1'))}.to throw_symbol(:not_literal)
61
+ end
62
+ end
63
+ end
@@ -16,4 +16,10 @@ describe 'when converting to 3.x' do
16
16
  converted = Puppet::Pops::Evaluator::Runtime3Converter.instance.catalog_type_to_split_type_title(t)
17
17
  expect(converted).to eql(['class', 'kermit'])
18
18
  end
19
+
20
+ it "errors on attempts to convert an 'Iterator'" do
21
+ expect {
22
+ Puppet::Pops::Evaluator::Runtime3Converter.convert(Puppet::Pops::Types::Iterable.on((1..3)), {}, nil)
23
+ }.to raise_error(Puppet::Error, /Use of an Iterator is not supported here/)
24
+ end
19
25
  end
@@ -53,6 +53,59 @@ describe 'dependency loader' do
53
53
  expect(function.class.name).to eq('testmodule::foo')
54
54
  expect(function.is_a?(Puppet::Functions::Function)).to eq(true)
55
55
  end
56
+
57
+ describe "when parsing files from disk" do
58
+
59
+ # First line of Rune version of Rune poem at http://www.columbia.edu/~fdc/utf8/
60
+ # characters chosen since they will not parse on Windows with codepage 437 or 1252
61
+ # Section 3.2.1.3 of Ruby spec guarantees that \u strings are encoded as UTF-8
62
+ let (:node) { Puppet::Node.new('node') }
63
+ let (:rune_utf8) { "\u16A0\u16C7\u16BB" } # ᚠᛇᚻ
64
+ let (:code_utf8) do <<-CODE
65
+ Puppet::Functions.create_function('testmodule::foo') {
66
+ def foo
67
+ return \"#{rune_utf8}\"
68
+ end
69
+ }
70
+ CODE
71
+ end
72
+
73
+ context 'when loading files from disk' do
74
+ it 'should always read files as UTF-8' do
75
+ if Puppet.features.microsoft_windows? && Encoding.default_external == Encoding::UTF_8
76
+ raise 'This test must be run in a codepage other than 65001 to validate behavior'
77
+ end
78
+
79
+ module_dir = dir_containing('testmodule', {
80
+ 'lib' => { 'puppet' => { 'functions' => { 'testmodule' => {
81
+ 'foo.rb' => code_utf8
82
+ }}}}})
83
+
84
+ loader = loader_for('testmodule', module_dir)
85
+
86
+ function = loader.load_typed(typed_name(:function, 'testmodule::foo')).value
87
+ expect(function.call({})).to eq(rune_utf8)
88
+ end
89
+
90
+ it 'currently ignores the UTF-8 BOM (Byte Order Mark) when loading module files' do
91
+ bom = "\uFEFF"
92
+
93
+ if Puppet.features.microsoft_windows? && Encoding.default_external == Encoding::UTF_8
94
+ raise 'This test must be run in a codepage other than 65001 to validate behavior'
95
+ end
96
+
97
+ module_dir = dir_containing('testmodule', {
98
+ 'lib' => { 'puppet' => { 'functions' => { 'testmodule' => {
99
+ 'foo.rb' => "#{bom}#{code_utf8}"
100
+ }}}}})
101
+
102
+ loader = loader_for('testmodule', module_dir)
103
+
104
+ function = loader.load_typed(typed_name(:function, 'testmodule::foo')).value
105
+ expect(function.call({})).to eq(rune_utf8)
106
+ end
107
+ end
108
+ end
56
109
  end
57
110
 
58
111
  def loader_for(name, dir)
@@ -1,5 +1,6 @@
1
1
  require 'spec_helper'
2
2
  require 'puppet_spec/files'
3
+ require 'puppet_spec/compiler'
3
4
 
4
5
  require 'puppet/pops'
5
6
  require 'puppet/loaders'
@@ -25,6 +26,7 @@ end
25
26
 
26
27
  describe 'loaders' do
27
28
  include PuppetSpec::Files
29
+ include PuppetSpec::Compiler
28
30
 
29
31
  let(:module_without_metadata) { File.join(config_dir('wo_metadata_module'), 'modules') }
30
32
  let(:module_without_lib) { File.join(config_dir('module_no_lib'), 'modules') }
@@ -205,8 +207,49 @@ describe 'loaders' do
205
207
  end
206
208
  end
207
209
  end
208
- end
209
210
 
211
+ it "a type can reference an autoloaded type alias from another module when dependency is present in metadata.json" do
212
+ File.stubs(:read).with(user_metadata_path).returns user_metadata.merge('dependencies' => [ { 'name' => 'test-usee'} ]).to_pson
213
+ expect(eval_and_collect_notices(<<-CODE, node)).to eq(['ok'])
214
+ assert_type(Usee::Zero, 0)
215
+ notice(ok)
216
+ CODE
217
+ end
218
+
219
+ it "a type can reference an autoloaded type alias from another module when no metadata is present" do
220
+ Puppet::Module.any_instance.expects('has_metadata?').at_least_once.returns(false)
221
+ expect(eval_and_collect_notices(<<-CODE, node)).to eq(['ok'])
222
+ assert_type(Usee::Zero, 0)
223
+ notice(ok)
224
+ CODE
225
+ end
226
+
227
+ it "a type can reference a type alias from another module when other module has it declared in init.pp" do
228
+ File.stubs(:read).with(user_metadata_path).returns user_metadata.merge('dependencies' => [ { 'name' => 'test-usee'} ]).to_pson
229
+ expect(eval_and_collect_notices(<<-CODE, node)).to eq(['ok'])
230
+ include 'usee'
231
+ assert_type(Usee::One, 1)
232
+ notice(ok)
233
+ CODE
234
+ end
235
+
236
+ it "an autoloaded type can reference an autoloaded type alias from another module when dependency is present in metadata.json" do
237
+ File.stubs(:read).with(user_metadata_path).returns user_metadata.merge('dependencies' => [ { 'name' => 'test-usee'} ]).to_pson
238
+ expect(eval_and_collect_notices(<<-CODE, node)).to eq(['ok'])
239
+ assert_type(User::WithUseeZero, [0])
240
+ notice(ok)
241
+ CODE
242
+ end
243
+
244
+ it "an autoloaded type can reference an autoloaded type alias from another module when other module has it declared in init.pp" do
245
+ File.stubs(:read).with(user_metadata_path).returns user_metadata.merge('dependencies' => [ { 'name' => 'test-usee'} ]).to_pson
246
+ expect(eval_and_collect_notices(<<-CODE, node)).to eq(['ok'])
247
+ include 'usee'
248
+ assert_type(User::WithUseeOne, [1])
249
+ notice(ok)
250
+ CODE
251
+ end
252
+ end
210
253
 
211
254
  context 'when loading from a module without metadata' do
212
255
  it 'loads a ruby function with a qualified name' do
@@ -339,9 +339,9 @@ describe 'Lexer2' do
339
339
  "!~" => [:NOMATCH, "!~ /./"],
340
340
  "," => [:COMMA, ", /./"],
341
341
  "(" => [:LPAREN, "( /./"],
342
- "[" => [:LISTSTART, "[ /./"],
343
- "[" => [[:NAME, :LBRACK], "a[ /./"],
344
- "[" => [[:NAME, :LISTSTART], "a [ /./"],
342
+ "[ (liststart)" => [:LISTSTART, "[ /./"],
343
+ "[ (LBRACK)" => [[:NAME, :LBRACK], "a[ /./"],
344
+ "[ (liststart after name)" => [[:NAME, :LISTSTART], "a [ /./"],
345
345
  "{" => [:LBRACE, "{ /./"],
346
346
  "+" => [:PLUS, "+ /./"],
347
347
  "-" => [:MINUS, "- /./"],
@@ -477,6 +477,18 @@ describe 'Lexer2' do
477
477
  end
478
478
  end
479
479
  end
480
+ context 'when not given multi byte characters' do
481
+ it 'produces byte offsets for tokens' do
482
+ code = <<-"CODE"
483
+ 1 2\n3
484
+ CODE
485
+ expect(tokens_scanned_from(code)).to match_tokens2(
486
+ [:NUMBER, '1', {:line => 1, :offset => 0, :length=>1}],
487
+ [:NUMBER, '2', {:line => 1, :offset => 2, :length=>1}],
488
+ [:NUMBER, '3', {:line => 2, :offset => 4, :length=>1}]
489
+ )
490
+ end
491
+ end
480
492
 
481
493
  context 'when dealing with multi byte characters' do
482
494
  it 'should support unicode characters' do
@@ -486,6 +498,7 @@ describe 'Lexer2' do
486
498
  # >= Ruby 1.9.3 reports \u
487
499
  expect(tokens_scanned_from(code)).to match_tokens2([:STRING, "x\u2713y"])
488
500
  end
501
+
489
502
  it 'should support unicode characters in long form' do
490
503
  code = <<-CODE
491
504
  "x\\u{1f452}y"
@@ -493,6 +506,23 @@ describe 'Lexer2' do
493
506
  expect(tokens_scanned_from(code)).to match_tokens2([:STRING, "x\u{1f452}y"])
494
507
  end
495
508
 
509
+ it 'produces byte offsets that counts each byte in a comment' do
510
+ code = <<-"CODE"
511
+ # \u{0400}\na
512
+ CODE
513
+ expect(tokens_scanned_from(code.strip)).to match_tokens2([:NAME, 'a', {:line => 2, :offset => 5, :length=>1}])
514
+ end
515
+
516
+ it 'produces byte offsets that counts each byte in value token' do
517
+ code = <<-"CODE"
518
+ '\u{0400}'\na
519
+ CODE
520
+ expect(tokens_scanned_from(code.strip)).to match_tokens2(
521
+ [:STRING, "\u{400}", {:line => 1, :offset => 0, :length=>4}],
522
+ [:NAME, 'a', {:line => 2, :offset => 5, :length=>1}]
523
+ )
524
+ end
525
+
496
526
  it 'should not select LISTSTART token when preceded by multibyte chars' do
497
527
  # This test is sensitive to the number of multibyte characters and position of the expressions
498
528
  # within the string - it is designed to fail if the position is calculated on the byte offset of the '['
@@ -702,4 +732,83 @@ describe 'Lexer2' do
702
732
  expect_issue('"asd', Puppet::Pops::Issues::UNCLOSED_QUOTE)
703
733
  end
704
734
  end
735
+
736
+ context 'when dealing with non UTF-8 and Byte Order Marks (BOMs)' do
737
+ {
738
+ 'UTF_8' => [0xEF, 0xBB, 0xBF],
739
+ 'UTF_16_1' => [0xFE, 0xFF],
740
+ 'UTF_16_2' => [0xFF, 0xFE],
741
+ 'UTF_32_1' => [0x00, 0x00, 0xFE, 0xFF],
742
+ 'UTF_32_2' => [0xFF, 0xFE, 0x00, 0x00],
743
+ 'UTF_1' => [0xF7, 0x64, 0x4C],
744
+ 'UTF_EBCDIC' => [0xDD, 0x73, 0x66, 0x73],
745
+ 'SCSU' => [0x0E, 0xFE, 0xFF],
746
+ 'BOCU' => [0xFB, 0xEE, 0x28],
747
+ 'GB_18030' => [0x84, 0x31, 0x95, 0x33]
748
+ }.each do |key, bytes|
749
+ it "errors on the byte order mark for #{key} '[#{bytes.map() {|b| '%X' % b}.join(' ')}]'" do
750
+ format_name = key.split('_')[0,2].join('-')
751
+ bytes_str = "\\[#{bytes.map {|b| '%X' % b}.join(' ')}\\]"
752
+ fix = " - remove these from the puppet source"
753
+ expect {
754
+ tokens_scanned_from(bytes.pack('C*'))
755
+ }.to raise_error(Puppet::ParseErrorWithIssue,
756
+ /Illegal #{format_name} .* at beginning of input: #{bytes_str}#{fix}/)
757
+ end
758
+
759
+ it "can use a possibly 'broken' UTF-16 string without problems for #{key}" do
760
+ format_name = key.split('_')[0,2].join('-')
761
+ string = bytes.pack('C*').force_encoding('UTF-16')
762
+ bytes_str = "\\[#{string.bytes.map {|b| '%X' % b}.join(' ')}\\]"
763
+ fix = " - remove these from the puppet source"
764
+ expect {
765
+ tokens_scanned_from(string)
766
+ }.to raise_error(Puppet::ParseErrorWithIssue,
767
+ /Illegal #{format_name} .* at beginning of input: #{bytes_str}#{fix}/)
768
+ end
769
+ end
770
+ end
771
+ end
772
+
773
+ describe Puppet::Pops::Parser::Lexer2 do
774
+
775
+ include PuppetSpec::Files
776
+
777
+ # First line of Rune version of Rune poem at http://www.columbia.edu/~fdc/utf8/
778
+ # characters chosen since they will not parse on Windows with codepage 437 or 1252
779
+ # Section 3.2.1.3 of Ruby spec guarantees that \u strings are encoded as UTF-8
780
+ # Runes (may show up as garbage if font is not available): ᚠᛇᚻ᛫ᛒᛦᚦ᛫ᚠᚱᚩᚠᚢᚱ᛫ᚠᛁᚱᚪ᛫ᚷᛖᚻᚹᛦᛚᚳᚢᛗ
781
+ let (:rune_utf8) {
782
+ "\u16A0\u16C7\u16BB\u16EB\u16D2\u16E6\u16A6\u16EB\u16A0\u16B1\u16A9\u16A0\u16A2"
783
+ "\u16B1\u16EB\u16A0\u16C1\u16B1\u16AA\u16EB\u16B7\u16D6\u16BB\u16B9\u16E6\u16DA"
784
+ "\u16B3\u16A2\u16D7"
785
+ }
786
+
787
+ context 'when lexing files from disk' do
788
+ it 'should always read files as UTF-8' do
789
+ if Puppet.features.microsoft_windows? && Encoding.default_external == Encoding::UTF_8
790
+ raise 'This test must be run in a codepage other than 65001 to validate behavior'
791
+ end
792
+
793
+ manifest_code = "notify { '#{rune_utf8}': }"
794
+ manifest = file_containing('manifest.pp', manifest_code)
795
+ lexed_file = described_class.new.lex_file(manifest)
796
+
797
+ expect(lexed_file.string.encoding).to eq(Encoding::UTF_8)
798
+ expect(lexed_file.string).to eq(manifest_code)
799
+ end
800
+
801
+ it 'currently errors when the UTF-8 BOM (Byte Order Mark) is present when lexing files' do
802
+ bom = "\uFEFF"
803
+
804
+ manifest_code = "#{bom}notify { '#{rune_utf8}': }"
805
+ manifest = file_containing('manifest.pp', manifest_code)
806
+
807
+ expect {
808
+ lexed_file = described_class.new.lex_file(manifest)
809
+ }.to raise_error(Puppet::ParseErrorWithIssue,
810
+ 'Illegal UTF-8 Byte Order mark at beginning of input: [EF BB BF] - remove these from the puppet source')
811
+ end
812
+ end
813
+
705
814
  end