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
@@ -26,6 +26,10 @@ describe "egrammar parsing function calls" do
26
26
  expect(dump(parse("foo(bar)"))).to eq("(invoke foo bar)")
27
27
  end
28
28
 
29
+ it "notice {a=>2}" do
30
+ expect(dump(parse("notice {a => 2}"))).to eq("(invoke notice ({} ('a' 2)))")
31
+ end
32
+
29
33
  it "foo(bar,)" do
30
34
  expect(dump(parse("foo(bar,)"))).to eq("(invoke foo bar)")
31
35
  end
@@ -37,6 +41,10 @@ describe "egrammar parsing function calls" do
37
41
  it "notice fqdn_rand(30)" do
38
42
  expect(dump(parse("notice fqdn_rand(30)"))).to eq('(invoke notice (call fqdn_rand 30))')
39
43
  end
44
+
45
+ it "notice type(42)" do
46
+ expect(dump(parse("notice type(42)"))).to eq('(invoke notice (call type 42))')
47
+ end
40
48
  end
41
49
 
42
50
  context "in nested scopes" do
@@ -31,6 +31,16 @@ describe Puppet::Pops::Parser::Parser do
31
31
  expect(adapter.length).to eq(0)
32
32
  end
33
33
 
34
+ it "multi byte characters in a comment are counted as individual bytes" do
35
+ parser = Puppet::Pops::Parser::Parser.new()
36
+ model = parser.parse_string("# \u{0400}comment\n").current
37
+ expect(model.class).to eq(Puppet::Pops::Model::Program)
38
+ expect(model.body.class).to eq(Puppet::Pops::Model::Nop)
39
+ adapter = Puppet::Pops::Adapters::SourcePosAdapter.adapt(model.body)
40
+ expect(adapter.offset).to eq(12)
41
+ expect(adapter.length).to eq(0)
42
+ end
43
+
34
44
  it "should raise an error with position information when error is raised from within parser" do
35
45
  parser = Puppet::Pops::Parser::Parser.new()
36
46
  the_error = nil
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+ require 'puppet/pops'
3
+
4
+ describe Puppet::Pops::Adapters::SourcePosAdapter do
5
+
6
+ it "multi byte characters in a comment does not interfere with AST node text extraction" do
7
+ parser = Puppet::Pops::Parser::Parser.new()
8
+ model = parser.parse_string("# \u{0400}comment\nabcdef#XXXXXXXXXX").current
9
+ expect(model.class).to eq(Puppet::Pops::Model::Program)
10
+ adapter = Puppet::Pops::Adapters::SourcePosAdapter.adapt(model.body)
11
+ expect(adapter.offset).to eq(12)
12
+ expect(adapter.length).to eq(6)
13
+ expect(adapter.extract_text).to eq('abcdef')
14
+ end
15
+
16
+ it "multi byte characters in a comment does not interfere with AST node text extraction" do
17
+ parser = Puppet::Pops::Parser::Parser.new()
18
+ model = parser.parse_string("# \u{0400}comment\n1 + 2#XXXXXXXXXX").current
19
+ expect(model.class).to eq(Puppet::Pops::Model::Program)
20
+ adapter = Puppet::Pops::Adapters::SourcePosAdapter.adapt(model.body)
21
+ expect(adapter.offset).to eq(14) # The '+'
22
+ expect(adapter.length).to eq(1)
23
+ expect(adapter.extract_tree_text).to eq('1 + 2')
24
+ end
25
+
26
+ end
@@ -0,0 +1,262 @@
1
+ require 'spec_helper'
2
+ require 'puppet/pops'
3
+
4
+ module Puppet::Pops::Types
5
+ describe 'The iterable support' do
6
+
7
+ [
8
+ 0,
9
+ 5,
10
+ (3..10),
11
+ %w(a b c),
12
+ {'a'=>2},
13
+ 'hello',
14
+ PIntegerType.new(1, 4),
15
+ PEnumType.new(%w(yes no))
16
+ ].each do |obj|
17
+ it "should consider instances of #{obj.class.name} to be Iterable" do
18
+ expect(PIterableType::DEFAULT.instance?(obj)).to eq(true)
19
+ end
20
+
21
+ it "should yield an Iterable instance when Iterable.on is called with a #{obj.class.name}" do
22
+ expect(Iterable.on(obj)).to be_a(Iterable)
23
+ end
24
+ end
25
+
26
+ {
27
+ -1 => 'a negative Integer',
28
+ 5.times => 'an Enumerable',
29
+ PIntegerType.new(nil, nil) => 'an unbounded Integer type'
30
+ }.each_pair do |obj, desc|
31
+ it "does not consider #{desc} to be Iterable" do
32
+ expect(PIterableType::DEFAULT.instance?(obj)).to eq(false)
33
+ end
34
+
35
+ it "does not yield an Iterable when Iterable.on is called with #{desc}" do
36
+ expect(Iterable.on(obj)).to be_nil
37
+ end
38
+ end
39
+
40
+ context 'when testing assignability' do
41
+ iterable_types = [
42
+ PIntegerType::DEFAULT,
43
+ PStringType::DEFAULT,
44
+ PIterableType::DEFAULT,
45
+ PIteratorType::DEFAULT,
46
+ PCollectionType::DEFAULT,
47
+ PArrayType::DEFAULT,
48
+ PHashType::DEFAULT,
49
+ PTupleType::DEFAULT,
50
+ PStructType::DEFAULT,
51
+ PUnitType::DEFAULT
52
+ ]
53
+ iterable_types << PType.new(PIntegerType.new(0, 10))
54
+ iterable_types << PType.new(PEnumType.new(%w(yes no)))
55
+ iterable_types << PRuntimeType.new(:ruby, 'Puppet::Pops::Types::Iterator')
56
+ iterable_types << PVariantType.new(iterable_types.clone)
57
+
58
+ not_iterable_types = [
59
+ PAnyType::DEFAULT,
60
+ PBooleanType::DEFAULT,
61
+ PCallableType::DEFAULT,
62
+ PCatalogEntryType::DEFAULT,
63
+ PDataType::DEFAULT,
64
+ PDefaultType::DEFAULT,
65
+ PFloatType::DEFAULT,
66
+ PHostClassType::DEFAULT,
67
+ PNotUndefType::DEFAULT,
68
+ PNumericType::DEFAULT,
69
+ POptionalType::DEFAULT,
70
+ PPatternType::DEFAULT,
71
+ PRegexpType::DEFAULT,
72
+ PResourceType::DEFAULT,
73
+ PRuntimeType::DEFAULT,
74
+ PScalarType::DEFAULT,
75
+ PType::DEFAULT,
76
+ PUndefType::DEFAULT
77
+ ]
78
+ not_iterable_types << PType.new(PIntegerType::DEFAULT)
79
+ not_iterable_types << PVariantType.new([iterable_types[0], not_iterable_types[0]])
80
+
81
+ iterable_types.each do |type|
82
+ it "should consider #{type} to be assignable to Iterable type" do
83
+ expect(PIterableType::DEFAULT.assignable?(type)).to eq(true)
84
+ end
85
+ end
86
+
87
+ not_iterable_types.each do |type|
88
+ it "should not consider #{type} to be assignable to Iterable type" do
89
+ expect(PIterableType::DEFAULT.assignable?(type)).to eq(false)
90
+ end
91
+ end
92
+
93
+ it "should consider Type[Integer[0,5]] to be assignable to Iterable[Integer[0,5]]" do
94
+ expect(PIterableType.new(PIntegerType.new(0,5)).assignable?(PType.new(PIntegerType.new(0,5)))).to eq(true)
95
+ end
96
+
97
+ it "should consider Type[Enum[yes,no]] to be assignable to Iterable[Enum[yes,no]]" do
98
+ expect(PIterableType.new(PEnumType.new(%w(yes no))).assignable?(PType.new(PEnumType.new(%w(yes no))))).to eq(true)
99
+ end
100
+
101
+ it "should not consider Type[Enum[ok,fail]] to be assignable to Iterable[Enum[yes,no]]" do
102
+ expect(PIterableType.new(PEnumType.new(%w(ok fail))).assignable?(PType.new(PEnumType.new(%w(yes no))))).to eq(false)
103
+ end
104
+
105
+ it "should not consider Type[String] to be assignable to Iterable[String]" do
106
+ expect(PIterableType.new(PStringType::DEFAULT).assignable?(PType.new(PStringType::DEFAULT))).to eq(false)
107
+ end
108
+ end
109
+
110
+ it 'does not wrap an Iterable in another Iterable' do
111
+ x = Iterable.on(5)
112
+ expect(Iterable.on(x)).to equal(x)
113
+ end
114
+
115
+ it 'produces a "times" iterable on integer' do
116
+ expect{ |b| Iterable.on(3).each(&b) }.to yield_successive_args(0,1,2)
117
+ end
118
+
119
+ it 'produces an iterable with element type Integer[0,X-1] for an iterable on an integer X' do
120
+ expect(Iterable.on(3).element_type).to eq(PIntegerType.new(0,2))
121
+ end
122
+
123
+ it 'produces a step iterable on an integer' do
124
+ expect{ |b| Iterable.on(8).step(3, &b) }.to yield_successive_args(0, 3, 6)
125
+ end
126
+
127
+ it 'produces a reverse iterable on an integer' do
128
+ expect{ |b| Iterable.on(5).reverse_each(&b) }.to yield_successive_args(4,3,2,1,0)
129
+ end
130
+
131
+ it 'produces an iterable on a integer range' do
132
+ expect{ |b| Iterable.on(2..7).each(&b) }.to yield_successive_args(2,3,4,5,6,7)
133
+ end
134
+
135
+ it 'produces an iterable with element type Integer[X,Y] for an iterable on an integer range (X..Y)' do
136
+ expect(Iterable.on(2..7).element_type).to eq(PIntegerType.new(2,7))
137
+ end
138
+
139
+ it 'produces an iterable on a character range' do
140
+ expect{ |b| Iterable.on('a'..'f').each(&b) }.to yield_successive_args('a', 'b', 'c', 'd', 'e', 'f')
141
+ end
142
+
143
+ it 'produces a step iterable on a range' do
144
+ expect{ |b| Iterable.on(1..5).step(2, &b) }.to yield_successive_args(1,3,5)
145
+ end
146
+
147
+ it 'produces a reverse iterable on a range' do
148
+ expect{ |b| Iterable.on(2..7).reverse_each(&b) }.to yield_successive_args(7,6,5,4,3,2)
149
+ end
150
+
151
+ it 'produces an iterable with element type String with a size constraint for an iterable on a character range' do
152
+ expect(Iterable.on('a'..'fe').element_type).to eq(PStringType.new(PIntegerType.new(1,2)))
153
+ end
154
+
155
+ it 'produces an iterable on a bounded Integer type' do
156
+ expect{ |b| Iterable.on(PIntegerType.new(2,7)).each(&b) }.to yield_successive_args(2,3,4,5,6,7)
157
+ end
158
+
159
+ it 'produces an iterable with element type Integer[X,Y] for an iterable on Integer[X,Y]' do
160
+ expect(Iterable.on(PIntegerType.new(2,7)).element_type).to eq(PIntegerType.new(2,7))
161
+ end
162
+
163
+ it 'produces an iterable on String' do
164
+ expect{ |b| Iterable.on('eat this').each(&b) }.to yield_successive_args('e', 'a', 't', ' ', 't', 'h', 'i', 's')
165
+ end
166
+
167
+ it 'produces an iterable with element type String[1,1] for an iterable created on a String' do
168
+ expect(Iterable.on('eat this').element_type).to eq(PStringType.new(PIntegerType.new(1,1)))
169
+ end
170
+
171
+ it 'produces an iterable on Array' do
172
+ expect{ |b| Iterable.on([1,5,9]).each(&b) }.to yield_successive_args(1,5,9)
173
+ end
174
+
175
+ it 'produces an iterable with element type inferred from the array elements for an iterable on Array' do
176
+ expect(Iterable.on([1,5,5,9,9,9]).element_type).to eq(PVariantType.new([PIntegerType.new(1,1), PIntegerType.new(5,5), PIntegerType.new(9,9)]))
177
+ end
178
+
179
+ it 'can chain reverse_each after step on Iterable' do
180
+ expect{ |b| Iterable.on(6).step(2).reverse_each(&b) }.to yield_successive_args(4,2,0)
181
+ end
182
+
183
+ it 'can chain reverse_each after step on Integer range' do
184
+ expect{ |b| Iterable.on(PIntegerType.new(0, 5)).step(2).reverse_each(&b) }.to yield_successive_args(4,2,0)
185
+ end
186
+
187
+ it 'can chain step after reverse_each on Iterable' do
188
+ expect{ |b| Iterable.on(6).reverse_each.step(2, &b) }.to yield_successive_args(5,3,1)
189
+ end
190
+
191
+ it 'can chain step after reverse_each on Integer range' do
192
+ expect{ |b| Iterable.on(PIntegerType.new(0, 5)).reverse_each.step(2, &b) }.to yield_successive_args(5,3,1)
193
+ end
194
+
195
+ it 'will produce the same result for each as for reverse_each.reverse_each' do
196
+ x1 = Iterable.on(5)
197
+ x2 = Iterable.on(5)
198
+ expect(x1.reduce([]) { |a,i| a << i; a}).to eq(x2.reverse_each.reverse_each.reduce([]) { |a,i| a << i; a})
199
+ end
200
+
201
+ it 'can chain many nested step/reverse_each calls' do
202
+ # x = Iterable.on(18).step(3) (0, 3, 6, 9, 12, 15)
203
+ # x = x.reverse_each (15, 12, 9, 6, 3, 0)
204
+ # x = x.step(2) (15, 9, 3)
205
+ # x = x.reverse_each(3, 9, 15)
206
+ expect{ |b| Iterable.on(18).step(3).reverse_each.step(2).reverse_each(&b) }.to yield_successive_args(3, 9, 15)
207
+ end
208
+
209
+ it 'can chain many nested step/reverse_each calls on Array iterable' do
210
+ expect{ |b| Iterable.on(18.times.to_a).step(3).reverse_each.step(2).reverse_each(&b) }.to yield_successive_args(3, 9, 15)
211
+ end
212
+
213
+ it 'produces an steppable iterable for Array' do
214
+ expect{ |b| Iterable.on(%w(a b c d e f g h i)).step(3, &b) }.to yield_successive_args('a', 'd', 'g')
215
+ end
216
+
217
+ it 'produces an reverse steppable iterable for Array' do
218
+ expect{ |b| Iterable.on(%w(a b c d e f g h i)).reverse_each.step(3, &b) }.to yield_successive_args('i', 'f', 'c')
219
+ end
220
+
221
+ it 'responds false when a bounded Iterable is passed to Iterable.unbounded?' do
222
+ expect(Iterable.unbounded?(Iterable.on(%w(a b c d e f g h i)))).to eq(false)
223
+ end
224
+
225
+ it 'can create an Array from a bounded Iterable' do
226
+ expect(Iterable.on(%w(a b c d e f g h i)).to_a).to eq(%w(a b c d e f g h i))
227
+ end
228
+
229
+ class TestUnboundedIterator
230
+ include Enumerable
231
+ include Iterable
232
+
233
+ def step(step_size)
234
+ if block_given?
235
+ begin
236
+ current = 0
237
+ loop do
238
+ yield(@current)
239
+ current = current + step_size
240
+ end
241
+ rescue StopIteration
242
+ end
243
+ end
244
+ self
245
+ end
246
+ end
247
+
248
+ it 'responds true when an unbounded Iterable is passed to Iterable.unbounded?' do
249
+ ubi = TestUnboundedIterator.new
250
+ expect(Iterable.unbounded?(Iterable.on(ubi))).to eq(true)
251
+ end
252
+
253
+ it 'can not create an Array from an unbounded Iterable' do
254
+ ubi = TestUnboundedIterator.new
255
+ expect{ Iterable.on(ubi).to_a }.to raise_error(Puppet::Error, /Attempt to create an Array from an unbounded Iterable/)
256
+ end
257
+
258
+ it 'will produce the string Iterator[T] on to_s on an iterator instance with element type T' do
259
+ expect(Iterable.on(18).to_s).to eq('Iterator[Integer] value')
260
+ end
261
+ end
262
+ end
@@ -0,0 +1,91 @@
1
+ require 'spec_helper'
2
+ require 'puppet/pops/types/recursion_guard'
3
+
4
+ describe 'the Puppet::Pops::Types::RecursionGuard' do
5
+ let(:guard) { Puppet::Pops::Types::RecursionGuard.new }
6
+
7
+ it "should detect recursion in 'this' context" do
8
+ x = Object.new
9
+ expect(guard.add_this(x)).to eq(Puppet::Pops::Types::RecursionGuard::NO_SELF_RECURSION)
10
+ expect(guard.add_this(x)).to eq(Puppet::Pops::Types::RecursionGuard::SELF_RECURSION_IN_THIS)
11
+ end
12
+
13
+ it "should detect recursion in 'that' context" do
14
+ x = Object.new
15
+ expect(guard.add_that(x)).to eq(Puppet::Pops::Types::RecursionGuard::NO_SELF_RECURSION)
16
+ expect(guard.add_that(x)).to eq(Puppet::Pops::Types::RecursionGuard::SELF_RECURSION_IN_THAT)
17
+ end
18
+
19
+ it "should keep 'this' and 'that' context separate" do
20
+ x = Object.new
21
+ expect(guard.add_this(x)).to eq(Puppet::Pops::Types::RecursionGuard::NO_SELF_RECURSION)
22
+ expect(guard.add_that(x)).to eq(Puppet::Pops::Types::RecursionGuard::NO_SELF_RECURSION)
23
+ end
24
+
25
+ it "should detect when there's a recursion in both 'this' and 'that' context" do
26
+ x = Object.new
27
+ y = Object.new
28
+ expect(guard.add_this(x)).to eq(Puppet::Pops::Types::RecursionGuard::NO_SELF_RECURSION)
29
+ expect(guard.add_that(y)).to eq(Puppet::Pops::Types::RecursionGuard::NO_SELF_RECURSION)
30
+ expect(guard.add_this(x)).to eq(Puppet::Pops::Types::RecursionGuard::SELF_RECURSION_IN_THIS)
31
+ expect(guard.add_that(y)).to eq(Puppet::Pops::Types::RecursionGuard::SELF_RECURSION_IN_BOTH)
32
+ end
33
+
34
+ it "should report that 'this' is recursive after a recursion has been detected" do
35
+ x = Object.new
36
+ guard.add_this(x)
37
+ guard.add_this(x)
38
+ expect(guard.recursive_this?(x)).to be_truthy
39
+ end
40
+
41
+ it "should report that 'that' is recursive after a recursion has been detected" do
42
+ x = Object.new
43
+ guard.add_that(x)
44
+ guard.add_that(x)
45
+ expect(guard.recursive_that?(x)).to be_truthy
46
+ end
47
+
48
+ it "should not report that 'this' is recursive after a recursion of 'that' has been detected" do
49
+ x = Object.new
50
+ guard.add_that(x)
51
+ guard.add_that(x)
52
+ expect(guard.recursive_this?(x)).to be_falsey
53
+ end
54
+
55
+ it "should not report that 'that' is recursive after a recursion of 'this' has been detected" do
56
+ x = Object.new
57
+ guard.add_that(x)
58
+ guard.add_that(x)
59
+ expect(guard.recursive_this?(x)).to be_falsey
60
+ end
61
+
62
+ it "should not call 'hash' on an added instance" do
63
+ x = mock
64
+ x.expects(:hash).never
65
+ expect(guard.add_that(x)).to eq(Puppet::Pops::Types::RecursionGuard::NO_SELF_RECURSION)
66
+ end
67
+
68
+ it "should not call '==' on an added instance" do
69
+ x = mock
70
+ x.expects(:==).never
71
+ expect(guard.add_that(x)).to eq(Puppet::Pops::Types::RecursionGuard::NO_SELF_RECURSION)
72
+ end
73
+
74
+ it "should not call 'eq?' on an added instance" do
75
+ x = mock
76
+ x.expects(:eq?).never
77
+ expect(guard.add_that(x)).to eq(Puppet::Pops::Types::RecursionGuard::NO_SELF_RECURSION)
78
+ end
79
+
80
+ it "should not call 'eql?' on an added instance" do
81
+ x = mock
82
+ x.expects(:eql?).never
83
+ expect(guard.add_that(x)).to eq(Puppet::Pops::Types::RecursionGuard::NO_SELF_RECURSION)
84
+ end
85
+
86
+ it "should not call 'equal?' on an added instance" do
87
+ x = mock
88
+ x.expects(:equal?).never
89
+ expect(guard.add_that(x)).to eq(Puppet::Pops::Types::RecursionGuard::NO_SELF_RECURSION)
90
+ end
91
+ end
@@ -0,0 +1,105 @@
1
+ require 'spec_helper'
2
+ require 'puppet/pops/types/type_acceptor'
3
+
4
+ module Puppet::Pops::Types
5
+ describe 'the Puppet::Pops::Types::TypeAcceptor' do
6
+ let!(:acceptor_class) do
7
+ Class.new do
8
+ include TypeAcceptor
9
+ attr_reader :visitors, :guard
10
+
11
+ def initialize
12
+ @visitors = []
13
+ @guard = nil
14
+ end
15
+
16
+ def visit(type, guard)
17
+ @visitors << type
18
+ @guard = guard
19
+ end
20
+ end
21
+ end
22
+
23
+ let(:acceptor) { acceptor_class.new }
24
+ let(:guard) { RecursionGuard.new }
25
+
26
+ it "should get a visit from the type that accepts it" do
27
+ PAnyType::DEFAULT.accept(acceptor, nil)
28
+ expect(acceptor.visitors).to include(PAnyType::DEFAULT)
29
+ end
30
+
31
+ it "should receive the guard as an argument" do
32
+ PAnyType::DEFAULT.accept(acceptor, guard)
33
+ expect(acceptor.guard).to equal(guard)
34
+ end
35
+
36
+ it "should get a visit from the type of a Type that accepts it" do
37
+ t = PType.new(PAnyType::DEFAULT)
38
+ t.accept(acceptor, nil)
39
+ expect(acceptor.visitors).to include(t, PAnyType::DEFAULT)
40
+ end
41
+
42
+ [
43
+ PType,
44
+ PNotUndefType,
45
+ PIterableType,
46
+ PIteratorType,
47
+ POptionalType
48
+ ].each do |tc|
49
+ it "should get a visit from the contained type of an #{tc.class.name} that accepts it" do
50
+ t = tc.new(PDataType::DEFAULT)
51
+ t.accept(acceptor, nil)
52
+ expect(acceptor.visitors).to include(t, PDataType::DEFAULT)
53
+ end
54
+ end
55
+
56
+ it "should get a visit from the size type of String type that accepts it" do
57
+ sz = PIntegerType.new(0,4)
58
+ t = PStringType.new(sz)
59
+ t.accept(acceptor, nil)
60
+ expect(acceptor.visitors).to include(t, sz)
61
+ end
62
+
63
+ it "should get a visit from all contained types of an Array type that accepts it" do
64
+ sz = PIntegerType.new(0,4)
65
+ t = PArrayType.new(PAnyType::DEFAULT, sz)
66
+ t.accept(acceptor, nil)
67
+ expect(acceptor.visitors).to include(t, PAnyType::DEFAULT, sz)
68
+ end
69
+
70
+ it "should get a visit from all contained types of a Hash type that accepts it" do
71
+ sz = PIntegerType.new(0,4)
72
+ t = PHashType.new(PStringType::DEFAULT, PAnyType::DEFAULT, sz)
73
+ t.accept(acceptor, nil)
74
+ expect(acceptor.visitors).to include(t, PStringType::DEFAULT, PAnyType::DEFAULT, sz)
75
+ end
76
+
77
+ it "should get a visit from all contained types of a Tuple type that accepts it" do
78
+ sz = PIntegerType.new(0,4)
79
+ t = PTupleType.new([PStringType::DEFAULT, PIntegerType::DEFAULT], sz)
80
+ t.accept(acceptor, nil)
81
+ expect(acceptor.visitors).to include(t, PStringType::DEFAULT, PIntegerType::DEFAULT, sz)
82
+ end
83
+
84
+ it "should get a visit from all contained types of a Struct type that accepts it" do
85
+ t = PStructType.new([PStructElement.new(PStringType::DEFAULT, PIntegerType::DEFAULT)])
86
+ t.accept(acceptor, nil)
87
+ expect(acceptor.visitors).to include(t, PStringType::DEFAULT, PIntegerType::DEFAULT)
88
+ end
89
+
90
+ it "should get a visit from all contained types of a Callable type that accepts it" do
91
+ sz = PIntegerType.new(0,4)
92
+ args = PTupleType.new([PStringType::DEFAULT, PIntegerType::DEFAULT], sz)
93
+ block = PCallableType::DEFAULT
94
+ t = PCallableType.new(args, block)
95
+ t.accept(acceptor, nil)
96
+ expect(acceptor.visitors).to include(t, PStringType::DEFAULT, PIntegerType::DEFAULT, sz, args, block)
97
+ end
98
+
99
+ it "should get a visit from all contained types of a Variant type that accepts it" do
100
+ t = PVariantType.new([PStringType::DEFAULT, PIntegerType::DEFAULT])
101
+ t.accept(acceptor, nil)
102
+ expect(acceptor.visitors).to include(t, PStringType::DEFAULT, PIntegerType::DEFAULT)
103
+ end
104
+ end
105
+ end