puppet 3.4.3 → 3.5.0.rc1

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 (811) hide show
  1. data/CONTRIBUTING.md +6 -6
  2. data/Gemfile +22 -16
  3. data/LICENSE +1 -1
  4. data/README.md +33 -11
  5. data/Rakefile +1 -1
  6. data/conf/auth.conf +4 -0
  7. data/ext/build_defaults.yaml +1 -1
  8. data/ext/debian/control +6 -6
  9. data/ext/ips/transforms +1 -1
  10. data/ext/nagios/naggen +1 -1
  11. data/ext/project_data.yaml +21 -1
  12. data/ext/puppet-test +3 -3
  13. data/ext/redhat/puppet.spec.erb +28 -2
  14. data/ext/suse/puppet.spec +1 -1
  15. data/ext/upload_facts.rb +1 -1
  16. data/ext/windows/service/daemon.rb +99 -20
  17. data/lib/hiera_puppet.rb +2 -2
  18. data/lib/puppet.rb +68 -5
  19. data/lib/puppet/agent.rb +5 -1
  20. data/lib/puppet/application.rb +20 -11
  21. data/lib/puppet/application/agent.rb +1 -1
  22. data/lib/puppet/application/apply.rb +61 -41
  23. data/lib/puppet/application/cert.rb +3 -3
  24. data/lib/puppet/application/device.rb +7 -8
  25. data/lib/puppet/application/doc.rb +1 -1
  26. data/lib/puppet/application/filebucket.rb +3 -3
  27. data/lib/puppet/application/kick.rb +2 -2
  28. data/lib/puppet/application/master.rb +1 -1
  29. data/lib/puppet/application/queue.rb +9 -9
  30. data/lib/puppet/application/resource.rb +2 -2
  31. data/lib/puppet/bindings.rb +6 -6
  32. data/lib/puppet/configurer.rb +17 -14
  33. data/lib/puppet/configurer/fact_handler.rb +1 -1
  34. data/lib/puppet/confine/any.rb +26 -0
  35. data/lib/puppet/confine/exists.rb +1 -1
  36. data/lib/puppet/confiner.rb +1 -0
  37. data/lib/puppet/context.rb +55 -0
  38. data/lib/puppet/context/trusted_information.rb +56 -0
  39. data/lib/puppet/defaults.rb +97 -26
  40. data/lib/puppet/environments.rb +187 -0
  41. data/lib/puppet/error.rb +2 -1
  42. data/lib/puppet/external/pson/common.rb +1 -1
  43. data/lib/puppet/external/pson/pure/generator.rb +1 -1
  44. data/lib/puppet/external/pson/pure/parser.rb +1 -1
  45. data/lib/puppet/face/config.rb +73 -15
  46. data/lib/puppet/face/file/store.rb +1 -1
  47. data/lib/puppet/face/help.rb +2 -1
  48. data/lib/puppet/face/help/action.erb +1 -0
  49. data/lib/puppet/face/help/face.erb +1 -0
  50. data/lib/puppet/face/help/global.erb +1 -0
  51. data/lib/puppet/face/help/man.erb +9 -8
  52. data/lib/puppet/face/module/list.rb +13 -7
  53. data/lib/puppet/face/node/clean.rb +2 -2
  54. data/lib/puppet/face/parser.rb +11 -5
  55. data/lib/puppet/face/status.rb +1 -1
  56. data/lib/puppet/feature/external_facts.rb +2 -2
  57. data/lib/puppet/feature/libuser.rb +1 -1
  58. data/lib/puppet/feature/msgpack.rb +2 -0
  59. data/lib/puppet/feature/rails.rb +2 -2
  60. data/lib/puppet/file_bucket/dipper.rb +9 -9
  61. data/lib/puppet/file_bucket/file.rb +9 -5
  62. data/lib/puppet/file_serving/base.rb +1 -1
  63. data/lib/puppet/file_serving/configuration.rb +1 -1
  64. data/lib/puppet/file_serving/configuration/parser.rb +3 -3
  65. data/lib/puppet/file_serving/content.rb +2 -2
  66. data/lib/puppet/file_serving/fileset.rb +4 -4
  67. data/lib/puppet/file_serving/metadata.rb +69 -15
  68. data/lib/puppet/file_serving/mount/file.rb +1 -1
  69. data/lib/puppet/file_system.rb +361 -1
  70. data/lib/puppet/file_system/file18.rb +3 -3
  71. data/lib/puppet/file_system/file19.rb +3 -3
  72. data/lib/puppet/file_system/file19windows.rb +18 -23
  73. data/lib/puppet/file_system/file_impl.rb +145 -0
  74. data/lib/puppet/file_system/memory_file.rb +23 -9
  75. data/lib/puppet/file_system/memory_impl.rb +64 -0
  76. data/lib/puppet/forge.rb +4 -3
  77. data/lib/puppet/forge/repository.rb +0 -1
  78. data/lib/puppet/graph/relationship_graph.rb +7 -7
  79. data/lib/puppet/indirector.rb +1 -0
  80. data/lib/puppet/indirector/catalog/compiler.rb +3 -30
  81. data/lib/puppet/indirector/catalog/msgpack.rb +6 -0
  82. data/lib/puppet/indirector/catalog/static_compiler.rb +3 -7
  83. data/lib/puppet/indirector/data_binding/hiera.rb +1 -1
  84. data/lib/puppet/indirector/direct_file_server.rb +2 -2
  85. data/lib/puppet/indirector/exec.rb +1 -1
  86. data/lib/puppet/indirector/face.rb +3 -2
  87. data/lib/puppet/indirector/facts/facter.rb +1 -1
  88. data/lib/puppet/indirector/file_bucket_file/file.rb +25 -15
  89. data/lib/puppet/indirector/file_metadata/file.rb +1 -1
  90. data/lib/puppet/indirector/file_server.rb +1 -1
  91. data/lib/puppet/indirector/indirection.rb +1 -1
  92. data/lib/puppet/indirector/json.rb +4 -4
  93. data/lib/puppet/indirector/key/file.rb +8 -5
  94. data/lib/puppet/indirector/ldap.rb +1 -1
  95. data/lib/puppet/indirector/memory.rb +4 -0
  96. data/lib/puppet/indirector/msgpack.rb +82 -0
  97. data/lib/puppet/indirector/node/exec.rb +1 -1
  98. data/lib/puppet/indirector/node/ldap.rb +3 -3
  99. data/lib/puppet/indirector/node/msgpack.rb +7 -0
  100. data/lib/puppet/indirector/node/yaml.rb +15 -0
  101. data/lib/puppet/indirector/queue.rb +3 -2
  102. data/lib/puppet/indirector/report/msgpack.rb +11 -0
  103. data/lib/puppet/indirector/request.rb +17 -20
  104. data/lib/puppet/indirector/resource/rest.rb +1 -1
  105. data/lib/puppet/indirector/resource_type/parser.rb +3 -13
  106. data/lib/puppet/indirector/rest.rb +6 -7
  107. data/lib/puppet/indirector/ssl_file.rb +7 -7
  108. data/lib/puppet/indirector/yaml.rb +9 -13
  109. data/lib/puppet/metatype/manager.rb +12 -7
  110. data/lib/puppet/module.rb +14 -9
  111. data/lib/puppet/module_tool.rb +21 -26
  112. data/lib/puppet/module_tool/applications/application.rb +1 -1
  113. data/lib/puppet/module_tool/applications/generator.rb +2 -1
  114. data/lib/puppet/module_tool/applications/installer.rb +9 -4
  115. data/lib/puppet/module_tool/applications/uninstaller.rb +10 -7
  116. data/lib/puppet/module_tool/applications/unpacker.rb +1 -1
  117. data/lib/puppet/module_tool/applications/upgrader.rb +11 -8
  118. data/lib/puppet/module_tool/checksums.rb +1 -1
  119. data/lib/puppet/module_tool/contents_description.rb +2 -0
  120. data/lib/puppet/module_tool/dependency.rb +4 -5
  121. data/lib/puppet/module_tool/errors.rb +2 -0
  122. data/lib/puppet/module_tool/install_directory.rb +3 -0
  123. data/lib/puppet/module_tool/metadata.rb +3 -5
  124. data/lib/puppet/module_tool/modulefile.rb +3 -0
  125. data/lib/puppet/module_tool/shared_behaviors.rb +6 -1
  126. data/lib/puppet/module_tool/skeleton.rb +3 -0
  127. data/lib/puppet/module_tool/tar.rb +3 -0
  128. data/lib/puppet/network/auth_config_parser.rb +1 -1
  129. data/lib/puppet/network/authconfig.rb +5 -2
  130. data/lib/puppet/network/authentication.rb +7 -2
  131. data/lib/puppet/network/authorization.rb +2 -2
  132. data/lib/puppet/network/format_support.rb +4 -0
  133. data/lib/puppet/network/formats.rb +9 -14
  134. data/lib/puppet/network/http.rb +11 -0
  135. data/lib/puppet/network/http/api.rb +0 -2
  136. data/lib/puppet/network/http/api/v1.rb +146 -11
  137. data/lib/puppet/network/http/api/v2.rb +32 -0
  138. data/lib/puppet/network/http/api/v2/authorization.rb +13 -0
  139. data/lib/puppet/network/http/api/v2/environments.rb +21 -0
  140. data/lib/puppet/network/http/connection.rb +94 -37
  141. data/lib/puppet/network/http/error.rb +69 -0
  142. data/lib/puppet/network/http/handler.rb +28 -196
  143. data/lib/puppet/network/http/issues.rb +9 -0
  144. data/lib/puppet/network/http/memory_response.rb +13 -0
  145. data/lib/puppet/network/http/rack/rest.rb +10 -18
  146. data/lib/puppet/network/http/request.rb +56 -0
  147. data/lib/puppet/network/http/response.rb +11 -0
  148. data/lib/puppet/network/http/route.rb +91 -0
  149. data/lib/puppet/network/http/webrick.rb +1 -1
  150. data/lib/puppet/network/http/webrick/rest.rb +7 -12
  151. data/lib/puppet/network/http_pool.rb +3 -3
  152. data/lib/puppet/network/rights.rb +4 -4
  153. data/lib/puppet/node.rb +23 -14
  154. data/lib/puppet/node/environment.rb +149 -125
  155. data/lib/puppet/node/facts.rb +6 -5
  156. data/lib/puppet/parameter.rb +1 -1
  157. data/lib/puppet/parser/ast.rb +1 -1
  158. data/lib/puppet/parser/ast/block_expression.rb +1 -6
  159. data/lib/puppet/parser/ast/collexpr.rb +54 -2
  160. data/lib/puppet/parser/ast/lambda.rb +9 -0
  161. data/lib/puppet/parser/ast/leaf.rb +15 -0
  162. data/lib/puppet/parser/ast/pops_bridge.rb +168 -0
  163. data/lib/puppet/parser/code_merger.rb +13 -0
  164. data/lib/puppet/parser/collector.rb +1 -1
  165. data/lib/puppet/parser/compiler.rb +28 -30
  166. data/lib/puppet/parser/e4_parser_adapter.rb +81 -0
  167. data/lib/puppet/parser/e_parser_adapter.rb +0 -1
  168. data/lib/puppet/parser/files.rb +12 -7
  169. data/lib/puppet/parser/functions.rb +36 -29
  170. data/lib/puppet/parser/functions/collect.rb +1 -1
  171. data/lib/puppet/parser/functions/defined.rb +40 -16
  172. data/lib/puppet/parser/functions/each.rb +55 -41
  173. data/lib/puppet/parser/functions/epp.rb +41 -0
  174. data/lib/puppet/parser/functions/extlookup.rb +2 -2
  175. data/lib/puppet/parser/functions/file.rb +1 -1
  176. data/lib/puppet/parser/functions/filter.rb +68 -16
  177. data/lib/puppet/parser/functions/generate.rb +1 -1
  178. data/lib/puppet/parser/functions/include.rb +3 -2
  179. data/lib/puppet/parser/functions/inline_epp.rb +79 -0
  180. data/lib/puppet/parser/functions/inline_template.rb +1 -1
  181. data/lib/puppet/parser/functions/lookup.rb +127 -27
  182. data/lib/puppet/parser/functions/map.rb +64 -12
  183. data/lib/puppet/parser/functions/reduce.rb +40 -16
  184. data/lib/puppet/parser/functions/select.rb +1 -1
  185. data/lib/puppet/parser/functions/slice.rb +42 -23
  186. data/lib/puppet/parser/grammar.ra +3 -0
  187. data/lib/puppet/parser/lexer.rb +10 -9
  188. data/lib/puppet/parser/parser.rb +15 -12
  189. data/lib/puppet/parser/parser_factory.rb +26 -1
  190. data/lib/puppet/parser/parser_support.rb +13 -4
  191. data/lib/puppet/parser/resource.rb +1 -1
  192. data/lib/puppet/parser/scope.rb +246 -97
  193. data/lib/puppet/parser/templatewrapper.rb +1 -1
  194. data/lib/puppet/parser/type_loader.rb +13 -2
  195. data/lib/puppet/pops.rb +15 -1
  196. data/lib/puppet/pops/adapters.rb +64 -32
  197. data/lib/puppet/pops/binder/binder.rb +122 -150
  198. data/lib/puppet/pops/binder/binder_issues.rb +1 -21
  199. data/lib/puppet/pops/binder/bindings_checker.rb +0 -20
  200. data/lib/puppet/pops/binder/bindings_composer.rb +4 -70
  201. data/lib/puppet/pops/binder/bindings_factory.rb +16 -58
  202. data/lib/puppet/pops/binder/bindings_label_provider.rb +0 -3
  203. data/lib/puppet/pops/binder/bindings_loader.rb +13 -4
  204. data/lib/puppet/pops/binder/bindings_model.rb +17 -31
  205. data/lib/puppet/pops/binder/bindings_model_dumper.rb +2 -20
  206. data/lib/puppet/pops/binder/config/binder_config.rb +8 -40
  207. data/lib/puppet/pops/binder/config/binder_config_checker.rb +2 -43
  208. data/lib/puppet/pops/binder/config/issues.rb +1 -21
  209. data/lib/puppet/pops/binder/injector.rb +86 -7
  210. data/lib/puppet/pops/binder/injector_entry.rb +6 -2
  211. data/lib/puppet/pops/binder/key_factory.rb +7 -1
  212. data/lib/puppet/pops/binder/lookup.rb +191 -0
  213. data/lib/puppet/pops/binder/producers.rb +5 -5
  214. data/lib/puppet/pops/binder/scheme_handler/symbolic_scheme.rb +2 -3
  215. data/lib/puppet/pops/binder/system_bindings.rb +4 -16
  216. data/lib/puppet/pops/containment.rb +72 -5
  217. data/lib/puppet/pops/evaluator/access_operator.rb +548 -0
  218. data/lib/puppet/pops/evaluator/closure.rb +57 -0
  219. data/lib/puppet/pops/evaluator/compare_operator.rb +168 -0
  220. data/lib/puppet/pops/evaluator/epp_evaluator.rb +87 -0
  221. data/lib/puppet/pops/evaluator/evaluator_impl.rb +1069 -0
  222. data/lib/puppet/pops/evaluator/external_syntax_support.rb +49 -0
  223. data/lib/puppet/pops/evaluator/relationship_operator.rb +156 -0
  224. data/lib/puppet/pops/evaluator/runtime3_support.rb +489 -0
  225. data/lib/puppet/pops/issue_reporter.rb +8 -4
  226. data/lib/puppet/pops/issues.rb +199 -4
  227. data/lib/puppet/pops/label_provider.rb +5 -0
  228. data/lib/puppet/pops/model/ast_transformer.rb +55 -31
  229. data/lib/puppet/pops/model/ast_tree_dumper.rb +9 -1
  230. data/lib/puppet/pops/model/factory.rb +265 -111
  231. data/lib/puppet/pops/model/model.rb +179 -140
  232. data/lib/puppet/pops/model/model_label_provider.rb +38 -9
  233. data/lib/puppet/pops/model/model_tree_dumper.rb +38 -13
  234. data/lib/puppet/pops/parser/code_merger.rb +17 -0
  235. data/lib/puppet/pops/parser/egrammar.ra +110 -61
  236. data/lib/puppet/pops/parser/eparser.rb +1415 -1092
  237. data/lib/puppet/pops/parser/epp_parser.rb +51 -0
  238. data/lib/puppet/pops/parser/epp_support.rb +247 -0
  239. data/lib/puppet/pops/parser/evaluating_parser.rb +53 -15
  240. data/lib/puppet/pops/parser/heredoc_support.rb +139 -0
  241. data/lib/puppet/pops/parser/interpolation_support.rb +227 -0
  242. data/lib/puppet/pops/parser/lexer.rb +83 -192
  243. data/lib/puppet/pops/parser/lexer2.rb +684 -0
  244. data/lib/puppet/pops/parser/lexer_support.rb +107 -0
  245. data/lib/puppet/pops/parser/locatable.rb +23 -0
  246. data/lib/puppet/pops/parser/locator.rb +291 -0
  247. data/lib/puppet/pops/parser/makefile +1 -8
  248. data/lib/puppet/pops/parser/parser_support.rb +76 -48
  249. data/lib/puppet/pops/parser/slurp_support.rb +95 -0
  250. data/lib/puppet/pops/patterns.rb +13 -4
  251. data/lib/puppet/pops/types/class_loader.rb +2 -2
  252. data/lib/puppet/pops/types/enumeration.rb +34 -0
  253. data/lib/puppet/pops/types/type_calculator.rb +983 -58
  254. data/lib/puppet/pops/types/type_factory.rb +203 -15
  255. data/lib/puppet/pops/types/type_parser.rb +355 -12
  256. data/lib/puppet/pops/types/types.rb +314 -24
  257. data/lib/puppet/pops/utils.rb +23 -7
  258. data/lib/puppet/pops/validation.rb +14 -8
  259. data/lib/puppet/pops/validation/checker3_1.rb +17 -12
  260. data/lib/puppet/pops/validation/checker4_0.rb +514 -0
  261. data/lib/puppet/pops/validation/validator_factory_4_0.rb +31 -0
  262. data/lib/puppet/pops/visitor.rb +146 -4
  263. data/lib/puppet/property.rb +1 -1
  264. data/lib/puppet/property/ensure.rb +1 -1
  265. data/lib/puppet/provider.rb +47 -26
  266. data/lib/puppet/provider/aixobject.rb +3 -3
  267. data/lib/puppet/provider/augeas/augeas.rb +11 -11
  268. data/lib/puppet/provider/cron/crontab.rb +10 -1
  269. data/lib/puppet/provider/exec.rb +1 -1
  270. data/lib/puppet/provider/exec/posix.rb +1 -1
  271. data/lib/puppet/provider/exec/windows.rb +1 -1
  272. data/lib/puppet/provider/file/posix.rb +2 -2
  273. data/lib/puppet/provider/file/windows.rb +15 -9
  274. data/lib/puppet/provider/group/aix.rb +2 -2
  275. data/lib/puppet/provider/macauthorization/macauthorization.rb +3 -3
  276. data/lib/puppet/provider/mount.rb +7 -0
  277. data/lib/puppet/provider/mount/parsed.rb +0 -1
  278. data/lib/puppet/provider/naginator.rb +1 -1
  279. data/lib/puppet/provider/nameservice.rb +3 -3
  280. data/lib/puppet/provider/nameservice/directoryservice.rb +3 -3
  281. data/lib/puppet/provider/package/aix.rb +1 -1
  282. data/lib/puppet/provider/package/appdmg.rb +1 -4
  283. data/lib/puppet/provider/package/apple.rb +1 -1
  284. data/lib/puppet/provider/package/apt.rb +1 -1
  285. data/lib/puppet/provider/package/blastwave.rb +1 -1
  286. data/lib/puppet/provider/package/fink.rb +1 -1
  287. data/lib/puppet/provider/package/gem.rb +3 -3
  288. data/lib/puppet/provider/package/openbsd.rb +6 -4
  289. data/lib/puppet/provider/package/pacman.rb +58 -5
  290. data/lib/puppet/provider/package/pip.rb +2 -2
  291. data/lib/puppet/provider/package/pkgdmg.rb +25 -10
  292. data/lib/puppet/provider/package/pkgin.rb +48 -23
  293. data/lib/puppet/provider/package/pkgutil.rb +1 -1
  294. data/lib/puppet/provider/package/ports.rb +1 -1
  295. data/lib/puppet/provider/package/portupgrade.rb +7 -7
  296. data/lib/puppet/provider/package/rpm.rb +16 -8
  297. data/lib/puppet/provider/package/windows.rb +1 -1
  298. data/lib/puppet/provider/package/windows/package.rb +1 -1
  299. data/lib/puppet/provider/parsedfile.rb +1 -1
  300. data/lib/puppet/provider/selboolean/getsetsebool.rb +1 -1
  301. data/lib/puppet/provider/selmodule/semodule.rb +5 -5
  302. data/lib/puppet/provider/service/base.rb +1 -1
  303. data/lib/puppet/provider/service/bsd.rb +3 -3
  304. data/lib/puppet/provider/service/daemontools.rb +20 -20
  305. data/lib/puppet/provider/service/debian.rb +1 -1
  306. data/lib/puppet/provider/service/freebsd.rb +3 -3
  307. data/lib/puppet/provider/service/gentoo.rb +2 -2
  308. data/lib/puppet/provider/service/init.rb +5 -5
  309. data/lib/puppet/provider/service/launchd.rb +4 -4
  310. data/lib/puppet/provider/service/redhat.rb +2 -2
  311. data/lib/puppet/provider/service/runit.rb +4 -4
  312. data/lib/puppet/provider/service/service.rb +3 -4
  313. data/lib/puppet/provider/service/smf.rb +1 -1
  314. data/lib/puppet/provider/service/src.rb +3 -3
  315. data/lib/puppet/provider/service/systemd.rb +4 -4
  316. data/lib/puppet/provider/service/upstart.rb +22 -7
  317. data/lib/puppet/provider/service/windows.rb +7 -7
  318. data/lib/puppet/provider/ssh_authorized_key/parsed.rb +3 -3
  319. data/lib/puppet/provider/user/aix.rb +5 -5
  320. data/lib/puppet/provider/user/directoryservice.rb +8 -5
  321. data/lib/puppet/provider/user/ldap.rb +1 -1
  322. data/lib/puppet/provider/user/pw.rb +1 -1
  323. data/lib/puppet/provider/user/user_role_add.rb +2 -2
  324. data/lib/puppet/provider/user/useradd.rb +19 -5
  325. data/lib/puppet/provider/yumrepo/inifile.rb +187 -0
  326. data/lib/puppet/provider/zone/solaris.rb +4 -4
  327. data/lib/puppet/rails.rb +16 -11
  328. data/lib/puppet/rails/benchmark.rb +1 -1
  329. data/lib/puppet/rails/resource.rb +5 -1
  330. data/lib/puppet/reference/configuration.rb +1 -1
  331. data/lib/puppet/reference/report.rb +1 -1
  332. data/lib/puppet/relationship.rb +10 -5
  333. data/lib/puppet/reports/http.rb +8 -2
  334. data/lib/puppet/reports/rrdgraph.rb +1 -1
  335. data/lib/puppet/reports/store.rb +3 -3
  336. data/lib/puppet/reports/tagmail.rb +4 -4
  337. data/lib/puppet/resource.rb +37 -44
  338. data/lib/puppet/resource/catalog.rb +18 -20
  339. data/lib/puppet/resource/status.rb +7 -6
  340. data/lib/puppet/resource/type.rb +6 -5
  341. data/lib/puppet/resource/type_collection.rb +2 -2
  342. data/lib/puppet/run.rb +9 -8
  343. data/lib/puppet/settings.rb +395 -244
  344. data/lib/puppet/settings/base_setting.rb +10 -4
  345. data/lib/puppet/settings/config_file.rb +81 -44
  346. data/lib/puppet/settings/directory_setting.rb +1 -2
  347. data/lib/puppet/settings/file_setting.rb +12 -5
  348. data/lib/puppet/settings/ini_file.rb +171 -0
  349. data/lib/puppet/ssl/base.rb +4 -0
  350. data/lib/puppet/ssl/certificate_authority.rb +16 -11
  351. data/lib/puppet/ssl/certificate_authority/interface.rb +3 -2
  352. data/lib/puppet/ssl/certificate_factory.rb +50 -5
  353. data/lib/puppet/ssl/certificate_request.rb +2 -2
  354. data/lib/puppet/ssl/certificate_request_attributes.rb +1 -1
  355. data/lib/puppet/ssl/certificate_revocation_list.rb +3 -1
  356. data/lib/puppet/ssl/host.rb +9 -8
  357. data/lib/puppet/ssl/inventory.rb +1 -1
  358. data/lib/puppet/ssl/key.rb +1 -1
  359. data/lib/puppet/ssl/validator/default_validator.rb +1 -1
  360. data/lib/puppet/status.rb +8 -7
  361. data/lib/puppet/test/test_helper.rb +35 -4
  362. data/lib/puppet/transaction/event.rb +6 -5
  363. data/lib/puppet/transaction/report.rb +10 -10
  364. data/lib/puppet/type.rb +1 -3
  365. data/lib/puppet/type/augeas.rb +2 -1
  366. data/lib/puppet/type/cron.rb +41 -11
  367. data/lib/puppet/type/exec.rb +5 -5
  368. data/lib/puppet/type/file.rb +42 -4
  369. data/lib/puppet/type/file/content.rb +5 -6
  370. data/lib/puppet/type/file/ensure.rb +3 -3
  371. data/lib/puppet/type/file/source.rb +12 -6
  372. data/lib/puppet/type/file/target.rb +5 -5
  373. data/lib/puppet/type/k5login.rb +4 -4
  374. data/lib/puppet/type/mount.rb +1 -1
  375. data/lib/puppet/type/package.rb +79 -3
  376. data/lib/puppet/type/resources.rb +34 -5
  377. data/lib/puppet/type/selboolean.rb +1 -1
  378. data/lib/puppet/type/selmodule.rb +1 -1
  379. data/lib/puppet/type/ssh_authorized_key.rb +2 -1
  380. data/lib/puppet/type/sshkey.rb +2 -1
  381. data/lib/puppet/type/tidy.rb +1 -1
  382. data/lib/puppet/type/user.rb +4 -1
  383. data/lib/puppet/type/yumrepo.rb +219 -344
  384. data/lib/puppet/type/zone.rb +15 -5
  385. data/lib/puppet/util.rb +14 -13
  386. data/lib/puppet/util/adsi.rb +19 -3
  387. data/lib/puppet/util/autoload.rb +27 -24
  388. data/lib/puppet/util/backups.rb +6 -6
  389. data/lib/puppet/util/checksums.rb +2 -2
  390. data/lib/puppet/util/classgen.rb +1 -1
  391. data/lib/puppet/util/colors.rb +4 -12
  392. data/lib/puppet/util/command_line.rb +2 -2
  393. data/lib/puppet/util/command_line/trollop.rb +3 -3
  394. data/lib/puppet/util/docs.rb +2 -2
  395. data/lib/puppet/util/errors.rb +8 -1
  396. data/lib/puppet/util/execution.rb +12 -5
  397. data/lib/puppet/util/filetype.rb +5 -5
  398. data/lib/puppet/util/inifile.rb +19 -4
  399. data/lib/puppet/util/instrumentation/data.rb +5 -0
  400. data/lib/puppet/util/instrumentation/indirection_probe.rb +6 -1
  401. data/lib/puppet/util/instrumentation/listener.rb +6 -1
  402. data/lib/puppet/util/json_lockfile.rb +4 -1
  403. data/lib/puppet/util/ldap/connection.rb +1 -1
  404. data/lib/puppet/util/lockfile.rb +10 -6
  405. data/lib/puppet/util/log.rb +6 -1
  406. data/lib/puppet/util/log/destinations.rb +2 -2
  407. data/lib/puppet/util/metric.rb +9 -4
  408. data/lib/puppet/util/nagios_maker.rb +26 -1
  409. data/lib/puppet/util/network_device.rb +1 -1
  410. data/lib/puppet/util/network_device/config.rb +1 -1
  411. data/lib/puppet/util/network_device/transport/ssh.rb +3 -3
  412. data/lib/puppet/util/plugins.rb +1 -1
  413. data/lib/puppet/util/profiler.rb +13 -1
  414. data/lib/puppet/util/pson.rb +1 -1
  415. data/lib/puppet/util/queue/stomp.rb +2 -2
  416. data/lib/puppet/util/rdoc.rb +1 -1
  417. data/lib/puppet/util/rdoc/generators/puppet_generator.rb +1 -1
  418. data/lib/puppet/util/rdoc/parser/puppet_parser_core.rb +19 -19
  419. data/lib/puppet/util/reference.rb +1 -1
  420. data/lib/puppet/util/resource_template.rb +1 -1
  421. data/lib/puppet/util/retryaction.rb +1 -1
  422. data/lib/puppet/util/selinux.rb +2 -2
  423. data/lib/puppet/util/storage.rb +3 -3
  424. data/lib/puppet/util/symbolic_file_mode.rb +1 -1
  425. data/lib/puppet/util/tag_set.rb +15 -3
  426. data/lib/puppet/util/tagging.rb +12 -17
  427. data/lib/puppet/util/watched_file.rb +1 -1
  428. data/lib/puppet/util/watcher.rb +1 -1
  429. data/lib/puppet/util/windows/error.rb +2 -2
  430. data/lib/puppet/util/windows/file.rb +20 -4
  431. data/lib/puppet/util/windows/registry.rb +2 -2
  432. data/lib/puppet/vendor/safe_yaml/CHANGES.md +1 -1
  433. data/lib/puppet/version.rb +1 -1
  434. data/lib/puppetx.rb +1 -21
  435. data/lib/puppetx/puppet/syntax_checker.rb +1 -1
  436. data/lib/puppetx/puppetlabs/syntax_checkers/json.rb +9 -11
  437. data/spec/fixtures/integration/node/environment/sitedir/00_a.pp +2 -0
  438. data/spec/fixtures/integration/node/environment/sitedir/01_b.pp +6 -0
  439. data/spec/fixtures/{unit/pops/binder/hiera2/yaml_backend/empty/common.yaml → integration/node/environment/sitedir/03_empty.pp} +0 -0
  440. data/spec/fixtures/integration/node/environment/sitedir/04_include.pp +2 -0
  441. data/spec/fixtures/integration/provider/cron/crontab/purged +8 -0
  442. data/spec/fixtures/releases/jamtur01-apache/lib/puppet/provider/a2mod/debian.rb +1 -1
  443. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/binder_config.yaml +3 -12
  444. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/lib/puppet/bindings/confdirtest.rb +10 -0
  445. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/awesome2/lib/puppet/bindings/awesome2/default.rb +20 -0
  446. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/{awesome/lib/puppetx/awesome → awesome2/lib/puppetx/awesome2}/echo_scheme_handler.rb +2 -2
  447. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/bad/lib/puppet/bindings/bad/default.rb +5 -0
  448. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/good/lib/puppet/bindings/good/default.rb +6 -0
  449. data/spec/fixtures/unit/pops/binder/config/binder_config/ok/binder_config.yaml +2 -2
  450. data/spec/fixtures/unit/provider/service/systemd/{list_units → list_units_services} +0 -1
  451. data/spec/integration/agent/logging_spec.rb +1 -1
  452. data/spec/integration/application/apply_spec.rb +78 -3
  453. data/spec/integration/application/doc_spec.rb +3 -2
  454. data/spec/integration/configurer_spec.rb +5 -3
  455. data/spec/integration/directory_environments_spec.rb +50 -0
  456. data/spec/integration/indirector/direct_file_server_spec.rb +1 -1
  457. data/spec/integration/indirector/file_content/file_server_spec.rb +4 -5
  458. data/spec/integration/network/authconfig_spec.rb +4 -4
  459. data/spec/integration/network/formats_spec.rb +1 -1
  460. data/spec/integration/node/environment_spec.rb +67 -15
  461. data/spec/integration/node/facts_spec.rb +1 -1
  462. data/spec/integration/node_spec.rb +1 -1
  463. data/spec/integration/parser/catalog_spec.rb +100 -60
  464. data/spec/integration/parser/compiler_spec.rb +102 -13
  465. data/spec/integration/parser/future_compiler_spec.rb +416 -0
  466. data/spec/integration/parser/parser_spec.rb +44 -105
  467. data/spec/integration/parser/scope_spec.rb +614 -528
  468. data/spec/integration/provider/cron/crontab_spec.rb +21 -0
  469. data/spec/integration/provider/mount_spec.rb +15 -2
  470. data/spec/integration/resource/catalog_spec.rb +1 -1
  471. data/spec/integration/resource/type_collection_spec.rb +3 -4
  472. data/spec/integration/ssl/autosign_spec.rb +1 -1
  473. data/spec/integration/ssl/certificate_revocation_list_spec.rb +1 -1
  474. data/spec/integration/ssl/host_spec.rb +1 -1
  475. data/spec/integration/transaction_spec.rb +13 -13
  476. data/spec/integration/type/exec_spec.rb +2 -2
  477. data/spec/integration/type/file_spec.rb +114 -41
  478. data/spec/integration/type/nagios_spec.rb +80 -0
  479. data/spec/integration/type/tidy_spec.rb +2 -2
  480. data/spec/integration/util/execution_spec.rb +17 -0
  481. data/spec/integration/util/rdoc/parser_spec.rb +1 -1
  482. data/spec/integration/util/settings_spec.rb +1 -1
  483. data/spec/integration/util/windows/security_spec.rb +27 -2
  484. data/spec/lib/matchers/include.rb +27 -0
  485. data/spec/lib/matchers/include_spec.rb +32 -0
  486. data/spec/lib/matchers/json.rb +135 -79
  487. data/spec/lib/matchers/match_tokens2.rb +74 -0
  488. data/spec/lib/matchers/resource.rb +35 -0
  489. data/spec/lib/puppet/indirector/indirector_testing/memory.rb +7 -0
  490. data/spec/lib/puppet/indirector/indirector_testing/msgpack.rb +6 -0
  491. data/spec/lib/puppet/indirector_testing.rb +12 -2
  492. data/spec/lib/puppet_spec/files.rb +1 -0
  493. data/spec/lib/puppet_spec/matchers.rb +5 -0
  494. data/spec/lib/puppet_spec/modules.rb +1 -1
  495. data/spec/lib/puppet_spec/scope.rb +14 -0
  496. data/spec/shared_behaviours/file_server_terminus.rb +2 -2
  497. data/spec/spec_helper.rb +47 -17
  498. data/spec/unit/agent_spec.rb +8 -1
  499. data/spec/unit/application/agent_spec.rb +5 -4
  500. data/spec/unit/application/apply_spec.rb +34 -15
  501. data/spec/unit/application/device_spec.rb +27 -32
  502. data/spec/unit/application/doc_spec.rb +4 -4
  503. data/spec/unit/application/filebucket_spec.rb +1 -1
  504. data/spec/unit/application/master_spec.rb +2 -2
  505. data/spec/unit/application_spec.rb +1 -1
  506. data/spec/unit/configurer/downloader_spec.rb +1 -1
  507. data/spec/unit/configurer/fact_handler_spec.rb +5 -16
  508. data/spec/unit/configurer_spec.rb +2 -2
  509. data/spec/unit/confine/exists_spec.rb +5 -5
  510. data/spec/unit/context/trusted_information_spec.rb +124 -0
  511. data/spec/unit/context_spec.rb +74 -0
  512. data/spec/unit/environments_spec.rb +126 -0
  513. data/spec/unit/face/config_spec.rb +31 -16
  514. data/spec/unit/face/module/build_spec.rb +1 -0
  515. data/spec/unit/face/module/install_spec.rb +21 -104
  516. data/spec/unit/face/module/list_spec.rb +52 -36
  517. data/spec/unit/face/module/uninstall_spec.rb +18 -25
  518. data/spec/unit/face/parser_spec.rb +39 -23
  519. data/spec/unit/file_bucket/dipper_spec.rb +2 -2
  520. data/spec/unit/file_serving/base_spec.rb +9 -13
  521. data/spec/unit/file_serving/configuration/parser_spec.rb +8 -2
  522. data/spec/unit/file_serving/configuration_spec.rb +7 -7
  523. data/spec/unit/file_serving/content_spec.rb +7 -12
  524. data/spec/unit/file_serving/fileset_spec.rb +49 -53
  525. data/spec/unit/file_serving/metadata_spec.rb +83 -32
  526. data/spec/unit/file_serving/mount/file_spec.rb +10 -10
  527. data/spec/unit/file_system/tempfile_spec.rb +3 -3
  528. data/spec/unit/file_system_spec.rb +508 -0
  529. data/spec/unit/forge/errors_spec.rb +1 -1
  530. data/spec/unit/forge/repository_spec.rb +1 -3
  531. data/spec/unit/hiera/scope_spec.rb +6 -2
  532. data/spec/unit/hiera_puppet_spec.rb +13 -6
  533. data/spec/unit/indirector/catalog/msgpack_spec.rb +12 -0
  534. data/spec/unit/indirector/catalog/static_compiler_spec.rb +42 -11
  535. data/spec/unit/indirector/direct_file_server_spec.rb +6 -6
  536. data/spec/unit/indirector/facts/facter_spec.rb +5 -5
  537. data/spec/unit/indirector/file_bucket_file/file_spec.rb +4 -4
  538. data/spec/unit/indirector/file_metadata/file_spec.rb +2 -2
  539. data/spec/unit/indirector/file_server_spec.rb +4 -4
  540. data/spec/unit/indirector/json_spec.rb +6 -6
  541. data/spec/unit/indirector/key/file_spec.rb +8 -8
  542. data/spec/unit/indirector/msgpack_spec.rb +191 -0
  543. data/spec/unit/indirector/node/active_record_spec.rb +1 -1
  544. data/spec/unit/indirector/node/ldap_spec.rb +16 -7
  545. data/spec/unit/indirector/node/msgpack_spec.rb +24 -0
  546. data/spec/unit/indirector/node/plain_spec.rb +1 -1
  547. data/spec/unit/indirector/queue_spec.rb +1 -1
  548. data/spec/unit/indirector/report/msgpack_spec.rb +28 -0
  549. data/spec/unit/indirector/request_spec.rb +16 -8
  550. data/spec/unit/indirector/rest_spec.rb +0 -4
  551. data/spec/unit/indirector/ssl_file_spec.rb +12 -11
  552. data/spec/unit/indirector/yaml_spec.rb +4 -4
  553. data/spec/unit/man_spec.rb +32 -0
  554. data/spec/unit/module_spec.rb +60 -46
  555. data/spec/unit/module_tool/applications/checksummer_spec.rb +1 -1
  556. data/spec/unit/module_tool/applications/installer_spec.rb +53 -16
  557. data/spec/unit/module_tool/applications/uninstaller_spec.rb +26 -25
  558. data/spec/unit/module_tool/tar_spec.rb +1 -1
  559. data/spec/unit/module_tool_spec.rb +17 -90
  560. data/spec/unit/network/authconfig_spec.rb +3 -4
  561. data/spec/unit/network/authentication_spec.rb +20 -6
  562. data/spec/unit/network/authorization_spec.rb +11 -1
  563. data/spec/unit/network/formats_spec.rb +32 -9
  564. data/spec/unit/network/http/api/v1_spec.rb +365 -62
  565. data/spec/unit/network/http/api/v2/authorization_spec.rb +57 -0
  566. data/spec/unit/network/http/api/v2/environments_spec.rb +42 -0
  567. data/spec/unit/network/http/api/v2_spec.rb +14 -0
  568. data/spec/unit/network/http/connection_spec.rb +39 -5
  569. data/spec/unit/network/http/error_spec.rb +30 -0
  570. data/spec/unit/network/http/handler_spec.rb +69 -419
  571. data/spec/unit/network/http/rack/rest_spec.rb +20 -28
  572. data/spec/unit/network/http/route_spec.rb +75 -0
  573. data/spec/unit/network/http/webrick/rest_spec.rb +21 -58
  574. data/spec/unit/network/http_pool_spec.rb +3 -3
  575. data/spec/unit/network/rights_spec.rb +2 -2
  576. data/spec/unit/node/environment_spec.rb +108 -89
  577. data/spec/unit/node/facts_spec.rb +5 -12
  578. data/spec/unit/node_spec.rb +22 -22
  579. data/spec/unit/parser/ast/collection_spec.rb +1 -1
  580. data/spec/unit/parser/ast/leaf_spec.rb +2 -0
  581. data/spec/unit/parser/ast/resource_spec.rb +1 -1
  582. data/spec/unit/parser/compiler_spec.rb +5 -3
  583. data/spec/unit/parser/files_spec.rb +40 -50
  584. data/spec/unit/parser/functions/defined_spec.rb +80 -18
  585. data/spec/unit/parser/functions/epp_spec.rb +88 -0
  586. data/spec/unit/parser/functions/fqdn_rand_spec.rb +4 -1
  587. data/spec/unit/parser/functions/generate_spec.rb +6 -2
  588. data/spec/unit/parser/functions/hiera_array_spec.rb +5 -2
  589. data/spec/unit/parser/functions/hiera_hash_spec.rb +4 -1
  590. data/spec/unit/parser/functions/hiera_include_spec.rb +6 -3
  591. data/spec/unit/parser/functions/hiera_spec.rb +5 -2
  592. data/spec/unit/parser/functions/include_spec.rb +0 -1
  593. data/spec/unit/parser/functions/inline_epp_spec.rb +82 -0
  594. data/spec/unit/parser/functions/lookup_spec.rb +66 -16
  595. data/spec/unit/parser/functions_spec.rb +25 -91
  596. data/spec/unit/parser/lexer_spec.rb +1 -1
  597. data/spec/unit/parser/methods/filter_spec.rb +56 -0
  598. data/spec/unit/parser/methods/map_spec.rb +94 -5
  599. data/spec/unit/parser/methods/reduce_spec.rb +10 -0
  600. data/spec/unit/parser/methods/shared.rb +2 -18
  601. data/spec/unit/parser/methods/slice_spec.rb +39 -1
  602. data/spec/unit/parser/parser_spec.rb +14 -10
  603. data/spec/unit/parser/resource_spec.rb +3 -9
  604. data/spec/unit/parser/scope_spec.rb +81 -78
  605. data/spec/unit/parser/type_loader_spec.rb +0 -4
  606. data/spec/unit/pops/benchmark_spec.rb +142 -0
  607. data/spec/unit/pops/binder/binder_spec.rb +15 -34
  608. data/spec/unit/pops/binder/bindings_checker_spec.rb +0 -41
  609. data/spec/unit/pops/binder/bindings_composer_spec.rb +6 -31
  610. data/spec/unit/pops/binder/config/binder_config_spec.rb +5 -18
  611. data/spec/unit/pops/binder/injector_spec.rb +76 -81
  612. data/spec/unit/pops/evaluator/access_ops_spec.rb +376 -0
  613. data/spec/unit/pops/evaluator/arithmetic_ops_spec.rb +77 -0
  614. data/spec/unit/pops/evaluator/basic_expressions_spec.rb +103 -0
  615. data/spec/unit/pops/evaluator/collections_ops_spec.rb +111 -0
  616. data/spec/unit/pops/evaluator/comparison_ops_spec.rb +256 -0
  617. data/spec/unit/pops/evaluator/conditionals_spec.rb +190 -0
  618. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +1045 -0
  619. data/spec/unit/pops/evaluator/evaluator_rspec_helper.rb +75 -0
  620. data/spec/unit/pops/evaluator/logical_ops_spec.rb +90 -0
  621. data/spec/unit/pops/evaluator/string_interpolation_spec.rb +44 -0
  622. data/spec/unit/pops/evaluator/variables_spec.rb +194 -0
  623. data/spec/unit/pops/factory_spec.rb +6 -29
  624. data/spec/unit/pops/issues_spec.rb +1 -1
  625. data/spec/unit/pops/model/ast_transformer_spec.rb +6 -9
  626. data/spec/unit/pops/model/model_spec.rb +2 -2
  627. data/spec/unit/pops/parser/epp_parser_spec.rb +86 -0
  628. data/spec/unit/pops/parser/evaluating_parser_spec.rb +4 -2
  629. data/spec/unit/pops/parser/lexer2_spec.rb +428 -0
  630. data/spec/unit/pops/parser/lexer_spec.rb +25 -86
  631. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +29 -4
  632. data/spec/unit/pops/parser/parse_calls_spec.rb +10 -6
  633. data/spec/unit/pops/parser/parse_conditionals_spec.rb +0 -9
  634. data/spec/unit/pops/parser/parse_containers_spec.rb +43 -12
  635. data/spec/unit/pops/parser/parse_heredoc_spec.rb +73 -0
  636. data/spec/unit/pops/parser/parse_resource_spec.rb +14 -0
  637. data/spec/unit/pops/parser/parser_spec.rb +3 -1
  638. data/spec/unit/pops/transformer/transform_basic_expressions_spec.rb +4 -4
  639. data/spec/unit/pops/transformer/transform_calls_spec.rb +41 -6
  640. data/spec/unit/pops/transformer/transform_conditionals_spec.rb +0 -9
  641. data/spec/unit/pops/transformer/transform_containers_spec.rb +12 -4
  642. data/spec/unit/pops/types/enumeration_spec.rb +50 -0
  643. data/spec/unit/pops/types/type_calculator_spec.rb +1171 -196
  644. data/spec/unit/pops/types/type_factory_spec.rb +108 -4
  645. data/spec/unit/pops/types/type_parser_spec.rb +114 -10
  646. data/spec/unit/pops/validator/validator_spec.rb +36 -1
  647. data/spec/unit/provider/augeas/augeas_spec.rb +39 -16
  648. data/spec/unit/provider/cron/parsed_spec.rb +27 -31
  649. data/spec/unit/provider/file/posix_spec.rb +2 -2
  650. data/spec/unit/provider/group/windows_adsi_spec.rb +1 -0
  651. data/spec/unit/provider/mount_spec.rb +12 -1
  652. data/spec/unit/provider/nameservice/directoryservice_spec.rb +3 -3
  653. data/spec/unit/provider/package/apt_spec.rb +1 -1
  654. data/spec/unit/provider/package/aptrpm_spec.rb +1 -1
  655. data/spec/unit/provider/package/gem_spec.rb +12 -0
  656. data/spec/unit/provider/package/msi_spec.rb +4 -0
  657. data/spec/unit/provider/package/openbsd_spec.rb +10 -10
  658. data/spec/unit/provider/package/pacman_spec.rb +36 -7
  659. data/spec/unit/provider/package/pkgin_spec.rb +57 -55
  660. data/spec/unit/provider/package/rpm_spec.rb +51 -6
  661. data/spec/unit/provider/service/base_spec.rb +4 -4
  662. data/spec/unit/provider/service/daemontools_spec.rb +8 -13
  663. data/spec/unit/provider/service/freebsd_spec.rb +3 -3
  664. data/spec/unit/provider/service/gentoo_spec.rb +24 -24
  665. data/spec/unit/provider/service/init_spec.rb +15 -15
  666. data/spec/unit/provider/service/openbsd_spec.rb +16 -16
  667. data/spec/unit/provider/service/openrc_spec.rb +20 -20
  668. data/spec/unit/provider/service/openwrt_spec.rb +1 -1
  669. data/spec/unit/provider/service/runit_spec.rb +5 -8
  670. data/spec/unit/provider/service/src_spec.rb +4 -4
  671. data/spec/unit/provider/service/systemd_spec.rb +24 -14
  672. data/spec/unit/provider/service/upstart_spec.rb +12 -4
  673. data/spec/unit/provider/service/windows_spec.rb +1 -1
  674. data/spec/unit/provider/ssh_authorized_key/parsed_spec.rb +21 -23
  675. data/spec/unit/provider/user/directoryservice_spec.rb +7 -7
  676. data/spec/unit/provider/user/useradd_spec.rb +43 -15
  677. data/spec/unit/provider/user/windows_adsi_spec.rb +1 -0
  678. data/spec/unit/provider/yumrepo/inifile_spec.rb +105 -0
  679. data/spec/unit/provider/zone/solaris_spec.rb +1 -1
  680. data/spec/unit/provider_spec.rb +120 -62
  681. data/spec/unit/rails/host_spec.rb +1 -1
  682. data/spec/unit/rails/param_value_spec.rb +4 -0
  683. data/spec/unit/relationship_spec.rb +4 -4
  684. data/spec/unit/reports/http_spec.rb +14 -3
  685. data/spec/unit/reports/rrdgraph_spec.rb +0 -1
  686. data/spec/unit/reports/store_spec.rb +2 -2
  687. data/spec/unit/resource/catalog_spec.rb +17 -29
  688. data/spec/unit/resource/status_spec.rb +1 -1
  689. data/spec/unit/resource/type_collection_spec.rb +28 -47
  690. data/spec/unit/resource/type_spec.rb +12 -23
  691. data/spec/unit/resource_spec.rb +54 -93
  692. data/spec/unit/run_spec.rb +3 -3
  693. data/spec/unit/settings/autosign_setting_spec.rb +1 -1
  694. data/spec/unit/settings/config_file_spec.rb +68 -15
  695. data/spec/unit/settings/file_setting_spec.rb +2 -2
  696. data/spec/unit/settings/ini_file_spec.rb +184 -0
  697. data/spec/unit/settings_spec.rb +137 -79
  698. data/spec/unit/ssl/certificate_authority/interface_spec.rb +3 -1
  699. data/spec/unit/ssl/certificate_authority_spec.rb +11 -9
  700. data/spec/unit/ssl/certificate_factory_spec.rb +19 -4
  701. data/spec/unit/ssl/certificate_request_attributes_spec.rb +1 -1
  702. data/spec/unit/ssl/certificate_revocation_list_spec.rb +101 -72
  703. data/spec/unit/ssl/host_spec.rb +8 -20
  704. data/spec/unit/ssl/inventory_spec.rb +2 -2
  705. data/spec/unit/ssl/key_spec.rb +4 -4
  706. data/spec/unit/status_spec.rb +6 -4
  707. data/spec/unit/transaction/additional_resource_generator_spec.rb +3 -11
  708. data/spec/unit/transaction/event_spec.rb +2 -2
  709. data/spec/unit/transaction/report_spec.rb +24 -15
  710. data/spec/unit/transaction/resource_harness_spec.rb +1 -1
  711. data/spec/unit/type/cron_spec.rb +39 -1
  712. data/spec/unit/type/file/content_spec.rb +4 -5
  713. data/spec/unit/type/file/ctime_spec.rb +1 -1
  714. data/spec/unit/type/file/mode_spec.rb +5 -4
  715. data/spec/unit/type/file/mtime_spec.rb +1 -1
  716. data/spec/unit/type/file/source_spec.rb +30 -7
  717. data/spec/unit/type/file_spec.rb +8 -8
  718. data/spec/unit/type/k5login_spec.rb +3 -3
  719. data/spec/unit/type/nagios_spec.rb +6 -0
  720. data/spec/unit/type/package/package_settings_spec.rb +135 -0
  721. data/spec/unit/type/package_spec.rb +13 -1
  722. data/spec/unit/type/resources_spec.rb +155 -0
  723. data/spec/unit/type/service_spec.rb +3 -3
  724. data/spec/unit/type/ssh_authorized_key_spec.rb +96 -93
  725. data/spec/unit/type/sshkey_spec.rb +39 -30
  726. data/spec/unit/type/tidy_spec.rb +19 -12
  727. data/spec/unit/type/user_spec.rb +47 -2
  728. data/spec/unit/type/whit_spec.rb +2 -2
  729. data/spec/unit/type/yumrepo_spec.rb +32 -177
  730. data/spec/unit/type/zone_spec.rb +2 -2
  731. data/spec/unit/type_spec.rb +11 -0
  732. data/spec/unit/util/adsi_spec.rb +48 -1
  733. data/spec/unit/util/autoload_spec.rb +24 -39
  734. data/spec/unit/util/backups_spec.rb +25 -28
  735. data/spec/unit/util/checksums_spec.rb +1 -3
  736. data/spec/unit/util/colors_spec.rb +14 -0
  737. data/spec/unit/util/docs_spec.rb +9 -0
  738. data/spec/unit/util/execution_spec.rb +1 -1
  739. data/spec/unit/util/filetype_spec.rb +7 -7
  740. data/spec/unit/util/instrumentation/data_spec.rb +3 -1
  741. data/spec/unit/util/instrumentation/indirection_probe_spec.rb +2 -0
  742. data/spec/unit/util/instrumentation/listener_spec.rb +3 -2
  743. data/spec/unit/util/json_lockfile_spec.rb +25 -4
  744. data/spec/unit/util/lockfile_spec.rb +49 -7
  745. data/spec/unit/util/log/destinations_spec.rb +1 -0
  746. data/spec/unit/util/log_spec.rb +1 -1
  747. data/spec/unit/util/metric_spec.rb +1 -1
  748. data/spec/unit/util/pidlock_spec.rb +6 -6
  749. data/spec/unit/util/pson_spec.rb +2 -2
  750. data/spec/unit/util/rdoc/parser_spec.rb +32 -29
  751. data/spec/unit/util/resource_template_spec.rb +3 -3
  752. data/spec/unit/util/selinux_spec.rb +5 -5
  753. data/spec/unit/util/storage_spec.rb +4 -4
  754. data/spec/unit/util/tag_set_spec.rb +1 -1
  755. data/spec/unit/util/watcher_spec.rb +1 -4
  756. data/spec/unit/util/yaml_spec.rb +2 -2
  757. data/spec/unit/util_spec.rb +7 -7
  758. data/tasks/benchmark.rake +0 -1
  759. data/tasks/parallel.rake +408 -0
  760. data/tasks/yard.rake +59 -0
  761. metadata +2889 -2782
  762. checksums.yaml +0 -7
  763. data/README_DEVELOPER.md +0 -809
  764. data/lib/puppet/file_system/file.rb +0 -271
  765. data/lib/puppet/network/http/rack/httphandler.rb +0 -13
  766. data/lib/puppet/pops/binder/hiera2.rb +0 -10
  767. data/lib/puppet/pops/binder/hiera2/bindings_provider.rb +0 -148
  768. data/lib/puppet/pops/binder/hiera2/config.rb +0 -69
  769. data/lib/puppet/pops/binder/hiera2/config_checker.rb +0 -68
  770. data/lib/puppet/pops/binder/hiera2/diagnostic_producer.rb +0 -36
  771. data/lib/puppet/pops/binder/hiera2/issues.rb +0 -67
  772. data/lib/puppet/pops/binder/hiera2/json_backend.rb +0 -18
  773. data/lib/puppet/pops/binder/hiera2/yaml_backend.rb +0 -21
  774. data/lib/puppet/pops/binder/scheme_handler/confdir_hiera_scheme.rb +0 -67
  775. data/lib/puppet/pops/binder/scheme_handler/module_hiera_scheme.rb +0 -92
  776. data/lib/puppet/pops/parser/grammar.ra +0 -746
  777. data/lib/puppet/provider/port/parsed.rb +0 -173
  778. data/lib/puppet/type/port.rb +0 -119
  779. data/lib/puppetx/puppet/hiera2_backend.rb +0 -31
  780. data/spec/fixtures/unit/pops/binder/bindings_composer/hiera1config/binder_config.yaml +0 -18
  781. data/spec/fixtures/unit/pops/binder/bindings_composer/hiera1config/hiera.yaml +0 -8
  782. data/spec/fixtures/unit/pops/binder/bindings_composer/hiera1config/modules/good/common.yaml +0 -1
  783. data/spec/fixtures/unit/pops/binder/bindings_composer/hiera1config/modules/good/hiera.yaml +0 -10
  784. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/common.yaml +0 -1
  785. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/hiera.yaml +0 -11
  786. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/localhost.yaml +0 -1
  787. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/awesome/common.yaml +0 -3
  788. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/awesome/hiera.yaml +0 -13
  789. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/awesome/lib/puppet/bindings/awesome/default.rb +0 -4
  790. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/awesome/lib/puppetx/awesome/echo_backend.rb +0 -11
  791. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/awesome/localhost.yaml +0 -1
  792. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/bad/common.yaml +0 -3
  793. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/bad/hiera_config.yaml +0 -9
  794. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/good/common.yaml +0 -2
  795. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/good/hiera.yaml +0 -11
  796. data/spec/fixtures/unit/pops/binder/hiera2/bindings_provider/ok/hiera.yaml +0 -9
  797. data/spec/fixtures/unit/pops/binder/hiera2/bindings_provider/ok/node.example.com.json +0 -9
  798. data/spec/fixtures/unit/pops/binder/hiera2/bindings_provider/ok/node.example.com.yaml +0 -5
  799. data/spec/fixtures/unit/pops/binder/hiera2/config/bad_syntax/hiera.yaml +0 -10
  800. data/spec/fixtures/unit/pops/binder/hiera2/config/malformed_hierarchy/hiera.yaml +0 -8
  801. data/spec/fixtures/unit/pops/binder/hiera2/config/missing/foo.txt +0 -1
  802. data/spec/fixtures/unit/pops/binder/hiera2/config/no_backends/hiera.yaml +0 -7
  803. data/spec/fixtures/unit/pops/binder/hiera2/config/no_hierarchy/hiera.yaml +0 -4
  804. data/spec/fixtures/unit/pops/binder/hiera2/config/not_a_hash/hiera.yaml +0 -2
  805. data/spec/fixtures/unit/pops/binder/hiera2/config/ok/hiera.yaml +0 -8
  806. data/spec/fixtures/unit/pops/binder/hiera2/yaml_backend/invalid/common.yaml +0 -1
  807. data/spec/fixtures/unit/pops/binder/hiera2/yaml_backend/ok/common.yaml +0 -2
  808. data/spec/unit/file_system/file_spec.rb +0 -486
  809. data/spec/unit/pops/binder/hiera2/bindings_provider_spec.rb +0 -74
  810. data/spec/unit/pops/binder/hiera2/config_spec.rb +0 -61
  811. data/spec/unit/pops/binder/hiera2/yaml_backend_spec.rb +0 -33
@@ -4,7 +4,7 @@
4
4
  # It is required that custom producers inherit from this producer (directly or indirectly).
5
5
  #
6
6
  # The selection of a Producer is typically performed by the Innjector when it configures itself
7
- # from a Bindings model where a {Puppet::Pops::Binder::Bindings::ProducerDescriptor} describes
7
+ # from a Bindings model where a {Puppet::Pops::Binder::Bindings::ProducerDescriptor} describes
8
8
  # which producer to use. The configuration uses this to create the concrete producer.
9
9
  # It is possible to describe that a particular producer class is to be used, and also to describe that
10
10
  # a custom producer (derived from Producer) should be used. This is available for both regular
@@ -462,12 +462,12 @@ module Puppet::Pops::Binder::Producers
462
462
  end
463
463
 
464
464
  # This type of producer should only be created by the Injector.
465
- #
465
+ #
466
466
  # @api private
467
467
  #
468
468
  class AssistedInjectProducer < Producer
469
469
  # An Assisted Inject Producer is created when a lookup is made of a type that is
470
- # not bound. It does not support a transformer lambda.
470
+ # not bound. It does not support a transformer lambda.
471
471
  # @note This initializer has a different signature than all others. Do not use in regular logic.
472
472
  # @api private
473
473
  #
@@ -557,7 +557,7 @@ module Puppet::Pops::Binder::Producers
557
557
  # Collection accepts elements that comply with the array's element type, or the entire type (i.e. Array[element_type]).
558
558
  # If the type is restrictive - e.g. Array[String] and an Array[String] is contributed, the result will not be type
559
559
  # compliant without also using the `:flatten` option, and a type error will be raised. For an array with relaxed typing
560
- # i.e. Array[Data], it it valid to produce a result such as `['a', ['b', 'c'], 'd']` and no flattening is required
560
+ # i.e. Array[Data], it is valid to produce a result such as `['a', ['b', 'c'], 'd']` and no flattening is required
561
561
  # and no error is raised (but using the array needs to be aware of potential array, non-array entries.
562
562
  # The use of the option `:flatten` controls how the result is flattened.
563
563
  #
@@ -826,4 +826,4 @@ module Puppet::Pops::Binder::Producers
826
826
  end
827
827
  end
828
828
 
829
- end
829
+ end
@@ -19,10 +19,9 @@ class Puppet::Pops::Binder::SchemeHandler::SymbolicScheme < Puppetx::Puppet::Bin
19
19
  fqn = fqn_from_path(uri)[1]
20
20
  bindings = Puppet::Pops::Binder::BindingsLoader.provide(scope, fqn)
21
21
  raise ArgumentError, "Cannot load bindings '#{uri}' - no bindings found." unless bindings
22
- # Must clone as the the rest mutates the model
22
+ # Must clone as the rest mutates the model
23
23
  cloned_bindings = Marshal.load(Marshal.dump(bindings))
24
- # Give no effective categories (i.e. ok with whatever categories there is)
25
- Puppet::Pops::Binder::BindingsFactory.contributed_bindings(fqn, cloned_bindings, nil)
24
+ Puppet::Pops::Binder::BindingsFactory.contributed_bindings(fqn, cloned_bindings)
26
25
  end
27
26
 
28
27
  # @api private
@@ -20,18 +20,12 @@ class Puppet::Pops::Binder::SystemBindings
20
20
  @injector_boot_bindings
21
21
  end
22
22
 
23
- # def self.env_boot_bindings()
24
- # Puppet::Bindings[Puppet::Pops::Binder::SystemBindings::ENVIRONMENT_BOOT_BINDINGS_NAME]
25
- # end
26
-
27
23
  def self.final_contribution
28
- effective_categories = Factory.categories([['common', 'true']])
29
- Factory.contributed_bindings("puppet-final", [deep_clone(@extension_bindings.model)], effective_categories)
24
+ Factory.contributed_bindings("puppet-final", [deep_clone(@extension_bindings.model)])
30
25
  end
31
26
 
32
27
  def self.default_contribution
33
- effective_categories = Factory.categories([['common', 'true']])
34
- Factory.contributed_bindings("puppet-default", [deep_clone(@default_bindings.model)], effective_categories)
28
+ Factory.contributed_bindings("puppet-default", [deep_clone(@default_bindings.model)])
35
29
  end
36
30
 
37
31
  def self.injector_boot_contribution(env_boot_bindings)
@@ -46,14 +40,8 @@ class Puppet::Pops::Binder::SystemBindings
46
40
  #
47
41
  bindings << env_boot_bindings unless env_boot_bindings.nil?
48
42
 
49
- # Use an 'extension' category for extension bindings to allow them to override the default
50
- # bindings since they are placed in the same layer (this is done to avoid having a separate layer).
51
- # The purpose for allowing overrides is that someone may want to replace say 'yaml' with a different version,
52
- # (say one that uses a YAML implementation that actually works ok in ruby 1.8.7 ;-)), an encrypted parser, etc.
53
- effective_categories = Factory.categories([['extension', 'true'],['common', 'true']])
54
-
55
- # return the composition and the cateogires.
56
- Factory.contributed_bindings("puppet-injector-boot", bindings, effective_categories)
43
+ # return the composition
44
+ Factory.contributed_bindings("puppet-injector-boot", bindings)
57
45
  end
58
46
 
59
47
  def self.factory()
@@ -1,5 +1,6 @@
1
1
  # FIXME: This module should be updated when a newer version of RGen (>0.6.2) adds required meta model "e-method" supports.
2
2
  #
3
+ require 'rgen/ecore/ecore'
3
4
  module Puppet::Pops::Containment
4
5
  # Returns Enumerable, thus allowing
5
6
  # some_element.eAllContents each {|contained| }
@@ -9,10 +10,40 @@ module Puppet::Pops::Containment
9
10
  EAllContentsEnumerator.new(self)
10
11
  end
11
12
 
13
+ def eAllContainers
14
+ EAllContainersEnumerator.new(self)
15
+ end
16
+
17
+ class EAllContainersEnumerator
18
+ include Enumerable
19
+
20
+ def initialize o
21
+ @element = o
22
+ end
23
+
24
+ def each &block
25
+ if block_given?
26
+ eAllContainers(@element, &block)
27
+ else
28
+ self
29
+ end
30
+ end
31
+
32
+ def eAllContainers(element, &block)
33
+ x = element.eContainer
34
+ while !x.nil? do
35
+ yield x
36
+ x = x.eContainer
37
+ end
38
+ end
39
+
40
+ end
41
+
12
42
  class EAllContentsEnumerator
13
43
  include Enumerable
14
44
  def initialize o
15
45
  @element = o
46
+ @@cache ||= {}
16
47
  end
17
48
 
18
49
  def each &block
@@ -25,13 +56,49 @@ module Puppet::Pops::Containment
25
56
  end
26
57
 
27
58
  def eAllContents(element, &block)
28
- element.class.ecore.eAllReferences.select{|r| r.containment}.each do |r|
29
- children = element.getGenericAsArray(r.name)
30
- children.each do |c|
31
- block.call(c)
32
- eAllContents(c, &block)
59
+ # This method is performance critical and code has been manually in-lined.
60
+ # Resist the urge to make this pretty.
61
+ # The slow way is element.eAllContainments.each {|c| element.getGenericsAsArray(c.name) }
62
+ #
63
+ (@@cache[element.class] || all_containment_getters(element)).each do |r|
64
+ children = element.send(r)
65
+ if children.is_a?(Array)
66
+ children.each do |c|
67
+ yield c
68
+ eAllContents(c, &block)
69
+ end
70
+ elsif !children.nil?
71
+ yield children
72
+ eAllContents(children, &block)
73
+ end
74
+ end
75
+ end
76
+
77
+ private
78
+
79
+ def all_containment_getters(element)
80
+ elem_class = element.class
81
+ containments = []
82
+ collect_getters(elem_class.ecore, containments)
83
+ @@cache[elem_class] = containments
84
+ end
85
+
86
+ def collect_getters(eclass, containments)
87
+ eclass.eStructuralFeatures.select {|r| r.is_a?(RGen::ECore::EReference) && r.containment}.each do |r|
88
+ n = r.name
89
+ containments << :"get#{n[0..0].upcase + ( n[1..-1] || "" )}"
33
90
  end
91
+ eclass.eSuperTypes.each do |t|
92
+ if cached = @@cache[ t.instanceClass ]
93
+ containments.concat(cached)
94
+ else
95
+ super_containments = []
96
+ collect_getters(t, super_containments)
97
+ @@cache[ t.instanceClass ] = super_containments
98
+ containments.concat(super_containments)
99
+ end
34
100
  end
35
101
  end
102
+
36
103
  end
37
104
  end
@@ -0,0 +1,548 @@
1
+ # AccessOperator handles operator []
2
+ # This operator is part of evaluation.
3
+ #
4
+ class Puppet::Pops::Evaluator::AccessOperator
5
+ # Provides access to the Puppet 3.x runtime (scope, etc.)
6
+ # This separation has been made to make it easier to later migrate the evaluator to an improved runtime.
7
+ #
8
+ include Puppet::Pops::Evaluator::Runtime3Support
9
+
10
+ Issues = Puppet::Pops::Issues
11
+ TYPEFACTORY = Puppet::Pops::Types::TypeFactory
12
+
13
+ attr_reader :semantic
14
+
15
+ # Initialize with AccessExpression to enable reporting issues
16
+ # @param access_expression [Puppet::Pops::Model::AccessExpression] the semantic object being evaluated
17
+ # @return [void]
18
+ #
19
+ def initialize(access_expression)
20
+ @@access_visitor ||= Puppet::Pops::Visitor.new(self, "access", 2, nil)
21
+ @semantic = access_expression
22
+ end
23
+
24
+ def access (o, scope, *keys)
25
+ @@access_visitor.visit_this_2(self, o, scope, keys)
26
+ end
27
+
28
+ protected
29
+
30
+ def access_Object(o, scope, keys)
31
+ fail(Issues::OPERATOR_NOT_APPLICABLE, @semantic.left_expr, :operator=>'[]', :left_value => o)
32
+ end
33
+
34
+ def access_String(o, scope, keys)
35
+ keys.flatten!
36
+ result = case keys.size
37
+ when 0
38
+ fail(Puppet::Pops::Issues::BAD_STRING_SLICE_ARITY, @semantic.left_expr, {:actual => keys.size})
39
+ when 1
40
+ # Note that Ruby 1.8.7 requires a length of 1 to produce a String
41
+ k1 = coerce_numeric(keys[0], @semantic.keys, scope)
42
+ bad_access_key_type(o, 0, k1, Integer) unless k1.is_a?(Integer)
43
+ k2 = 1
44
+ k1 = k1 < 0 ? o.length + k1 : k1 # abs pos
45
+ # if k1 is outside, a length of 1 always produces an empty string
46
+ if k1 < 0
47
+ ''
48
+ else
49
+ o[ k1, k2 ]
50
+ end
51
+ when 2
52
+ k1 = coerce_numeric(keys[0], @semantic.keys, scope)
53
+ k2 = coerce_numeric(keys[1], @semantic.keys, scope)
54
+ [k1, k2].each_with_index { |k,i| bad_access_key_type(o, i, k, Integer) unless k.is_a?(Integer) }
55
+
56
+ k1 = k1 < 0 ? o.length + k1 : k1 # abs pos (negative is count from end)
57
+ k2 = k2 < 0 ? o.length - k1 + k2 + 1 : k2 # abs length (negative k2 is length from pos to end count)
58
+ # if k1 is outside, adjust to first position, and adjust length
59
+ if k1 < 0
60
+ k2 = k2 + k1
61
+ k1 = 0
62
+ end
63
+ o[ k1, k2 ]
64
+ else
65
+ fail(Puppet::Pops::Issues::BAD_STRING_SLICE_ARITY, @semantic.left_expr, {:actual => keys.size})
66
+ end
67
+ # Specified as: an index outside of range, or empty result == empty string
68
+ (result.nil? || result.empty?) ? '' : result
69
+ end
70
+
71
+ # Parameterizes a PRegexp Type with a pattern string or r ruby egexp
72
+ #
73
+ def access_PRegexpType(o, scope, keys)
74
+ keys.flatten!
75
+ unless keys.size == 1
76
+ blamed = keys.size == 0 ? @semantic : @semantic.keys[2]
77
+ fail(Puppet::Pops::Issues::BAD_TYPE_SLICE_ARITY, blamed, :base_type => o, :min=>1, :actual => keys.size)
78
+ end
79
+ assert_keys(keys, o, 1, 1, String, Regexp)
80
+ Puppet::Pops::Types::TypeFactory.regexp(*keys)
81
+ end
82
+
83
+ # Evaluates <ary>[] with 1 or 2 arguments. One argument is an index lookup, two arguments is a slice from/to.
84
+ #
85
+ def access_Array(o, scope, keys)
86
+ keys.flatten!
87
+ case keys.size
88
+ when 0
89
+ fail(Puppet::Pops::Issues::BAD_ARRAY_SLICE_ARITY, @semantic.left_expr, {:actual => keys.size})
90
+ when 1
91
+ k = coerce_numeric(keys[0], @semantic.keys[0], scope)
92
+ unless k.is_a?(Integer)
93
+ bad_access_key_type(o, 0, k, Integer)
94
+ end
95
+ o[k]
96
+ when 2
97
+ # A slice [from, to] with support for -1 to mean start, or end respectively.
98
+ k1 = coerce_numeric(keys[0], @semantic.keys[0], scope)
99
+ k2 = coerce_numeric(keys[1], @semantic.keys[1], scope)
100
+
101
+ [k1, k2].each_with_index { |k,i| bad_access_key_type(o, i, k, Integer) unless k.is_a?(Integer) }
102
+
103
+ # Help confused Ruby do the right thing (it truncates to the right, but negative index + length can never overlap
104
+ # the available range.
105
+ k1 = k1 < 0 ? o.length + k1 : k1 # abs pos (negative is count from end)
106
+ k2 = k2 < 0 ? o.length - k1 + k2 + 1 : k2 # abs length (negative k2 is length from pos to end count)
107
+ # if k1 is outside, adjust to first position, and adjust length
108
+ if k1 < 0
109
+ k2 = k2 + k1
110
+ k1 = 0
111
+ end
112
+ # Help ruby always return empty array when asking for a sub array
113
+ result = o[ k1, k2 ]
114
+ result.nil? ? [] : result
115
+ else
116
+ fail(Puppet::Pops::Issues::BAD_ARRAY_SLICE_ARITY, @semantic.left_expr, {:actual => keys.size})
117
+ end
118
+ end
119
+
120
+
121
+ # Evaluates <hsh>[] with support for one or more arguments. If more than one argument is used, the result
122
+ # is an array with each lookup.
123
+ # @note
124
+ # Does not flatten its keys to enable looking up with a structure
125
+ #
126
+ def access_Hash(o, scope, keys)
127
+ # Look up key in hash, if key is nil or :undef, try alternate form before giving up.
128
+ # This makes :undef and nil "be the same key". (The alternative is to always only write one or the other
129
+ # in all hashes - that is much harder to guarantee since the Hash is a regular Ruby hash.
130
+ #
131
+ result = keys.collect do |k|
132
+ o.fetch(k) do |key|
133
+ case key
134
+ when nil
135
+ o[:undef]
136
+ when :undef
137
+ o[:nil]
138
+ else
139
+ nil
140
+ end
141
+ end
142
+ end
143
+ case result.size
144
+ when 0
145
+ fail(Puppet::Pops::Issues::BAD_HASH_SLICE_ARITY, @semantic.left_expr, {:actual => keys.size})
146
+ when 1
147
+ result.pop
148
+ else
149
+ # remove nil elements and return
150
+ result.compact!
151
+ result
152
+ end
153
+ end
154
+
155
+ # Ruby does not have an infinity constant. TODO: Consider having one constant in Puppet. Now it is in several places.
156
+ INFINITY = 1.0 / 0.0
157
+
158
+ def access_PEnumType(o, scope, keys)
159
+ keys.flatten!
160
+ assert_keys(keys, o, 1, INFINITY, String)
161
+ Puppet::Pops::Types::TypeFactory.enum(*keys)
162
+ end
163
+
164
+ def access_PVariantType(o, scope, keys)
165
+ keys.flatten!
166
+ assert_keys(keys, o, 1, INFINITY, Puppet::Pops::Types::PAbstractType)
167
+ Puppet::Pops::Types::TypeFactory.variant(*keys)
168
+ end
169
+
170
+ def access_PTupleType(o, scope, keys)
171
+ keys.flatten!
172
+ if TYPEFACTORY.is_range_parameter?(keys[-2]) && TYPEFACTORY.is_range_parameter?(keys[-1])
173
+ size_type = TYPEFACTORY.range(keys[-2], keys[-1])
174
+ keys = keys[0, keys.size - 2]
175
+ elsif TYPEFACTORY.is_range_parameter?(keys[-1])
176
+ size_type = TYPEFACTORY.range(keys[-1], :default)
177
+ keys = keys[0, keys.size - 1]
178
+ end
179
+ assert_keys(keys, o, 1, INFINITY, Puppet::Pops::Types::PAbstractType)
180
+ t = Puppet::Pops::Types::TypeFactory.tuple(*keys)
181
+ # set size type, or nil for default (exactly 1)
182
+ t.size_type = size_type
183
+ t
184
+ end
185
+
186
+ def access_PStructType(o, scope, keys)
187
+ assert_keys(keys, o, 1, 1, Hash)
188
+ TYPEFACTORY.struct(keys[0])
189
+ end
190
+
191
+ def access_PStringType(o, scope, keys)
192
+ keys.flatten!
193
+ case keys.size
194
+ when 1
195
+ size_t = collection_size_t(0, keys[0])
196
+ when 2
197
+ size_t = collection_size_t(0, keys[0], keys[1])
198
+ else
199
+ fail(Puppet::Pops::Issues::BAD_STRING_SLICE_ARITY, @semantic, {:actual => keys.size})
200
+ end
201
+ string_t = Puppet::Pops::Types::TypeFactory.string()
202
+ string_t.size_type = size_t
203
+ string_t
204
+ end
205
+
206
+ # Asserts type of each key and calls fail with BAD_TYPE_SPECIFICATION
207
+ # @param keys [Array<Object>] the evaluated keys
208
+ # @param o [Object] evaluated LHS reported as :base_type
209
+ # @param min [Integer] the minimum number of keys (typically 1)
210
+ # @param max [Numeric] the maximum number of keys (use same as min, specific number, or INFINITY)
211
+ # @param allowed_classes [Class] a variable number of classes that each key must be an instance of (any)
212
+ # @api private
213
+ #
214
+ def assert_keys(keys, o, min, max, *allowed_classes)
215
+ size = keys.size
216
+ unless size.between?(min, max || INFINITY)
217
+ fail(Puppet::Pops::Issues::BAD_TYPE_SLICE_ARITY, blamed, :base_type => o, :min=>1, :max => max, :actual => keys.size)
218
+ end
219
+ keys.each_with_index do |k, i|
220
+ unless allowed_classes.any? {|clazz| k.is_a?(clazz) }
221
+ bad_type_specialization_key_type(o, i, k, *allowed_classes)
222
+ end
223
+ end
224
+ end
225
+
226
+ def bad_access_key_type(lhs, key_index, actual, *expected_classes)
227
+ fail(Puppet::Pops::Issues::BAD_SLICE_KEY_TYPE, @semantic.keys[key_index], {
228
+ :left_value => lhs,
229
+ :actual => bad_key_type_name(actual),
230
+ :expected_classes => expected_classes
231
+ })
232
+ end
233
+
234
+ def bad_key_type_name(actual)
235
+ case actual
236
+ when nil, :undef
237
+ 'Undef'
238
+ when :default
239
+ 'Default'
240
+ else
241
+ actual.class.name
242
+ end
243
+ end
244
+
245
+ def bad_type_specialization_key_type(type, key_index, actual, *expected_classes)
246
+ label_provider = Puppet::Pops::Model::ModelLabelProvider.new()
247
+ expected = expected_classes.map {|c| label_provider.label(c) }.join(' or ')
248
+ fail(Puppet::Pops::Issues::BAD_TYPE_SPECIALIZATION, @semantic.keys[key_index], {
249
+ :type => type,
250
+ :message => "Cannot use #{bad_key_type_name(actual)} where #{expected} is expected"
251
+ })
252
+ end
253
+
254
+ def access_PPatternType(o, scope, keys)
255
+ keys.flatten!
256
+ assert_keys(keys, o, 1, INFINITY, String, Regexp, Puppet::Pops::Types::PPatternType, Puppet::Pops::Types::PRegexpType)
257
+ Puppet::Pops::Types::TypeFactory.pattern(*keys)
258
+ end
259
+
260
+ def access_POptionalType(o, scope, keys)
261
+ keys.flatten!
262
+ if keys.size == 1
263
+ unless keys[0].is_a?(Puppet::Pops::Types::PAbstractType)
264
+ fail(Puppet::Pops::Issues::BAD_TYPE_SLICE_TYPE, @semantic.keys[0], {:base_type => 'Optional-Type', :actual => keys[0].class})
265
+ end
266
+ result = Puppet::Pops::Types::POptionalType.new()
267
+ result.optional_type = keys[0]
268
+ result
269
+ else
270
+ fail(Puppet::Pops::Issues::BAD_TYPE_SLICE_ARITY, @semantic, {:base_type => 'Optional-Type', :min => 1, :actual => keys.size})
271
+ end
272
+ end
273
+
274
+ def access_PType(o, scope, keys)
275
+ keys.flatten!
276
+ if keys.size == 1
277
+ unless keys[0].is_a?(Puppet::Pops::Types::PAbstractType)
278
+ fail(Puppet::Pops::Issues::BAD_TYPE_SLICE_TYPE, @semantic.keys[0], {:base_type => 'Type-Type', :actual => keys[0].class})
279
+ end
280
+ result = Puppet::Pops::Types::PType.new()
281
+ result.type = keys[0]
282
+ result
283
+ else
284
+ fail(Puppet::Pops::Issues::BAD_TYPE_SLICE_ARITY, @semantic, {:base_type => 'Type-Type', :min => 1, :actual => keys.size})
285
+ end
286
+ end
287
+
288
+ def access_PRubyType(o, scope, keys)
289
+ keys.flatten!
290
+ assert_keys(keys, o, 1, 1, String)
291
+ # create ruby type based on name of class, not inference of key's type
292
+ Puppet::Pops::Types::TypeFactory.ruby_type(keys[0])
293
+ end
294
+
295
+ def access_PIntegerType(o, scope, keys)
296
+ keys.flatten!
297
+ unless keys.size.between?(1, 2)
298
+ fail(Puppet::Pops::Issues::BAD_INTEGER_SLICE_ARITY, @semantic, {:actual => keys.size})
299
+ end
300
+ keys.each_with_index do |x, index|
301
+ fail(Puppet::Pops::Issues::BAD_INTEGER_SLICE_TYPE, @semantic.keys[index],
302
+ {:actual => x.class}) unless (x.is_a?(Integer) || x == :default)
303
+ end
304
+ ranged_integer = Puppet::Pops::Types::PIntegerType.new()
305
+ from, to = keys
306
+ ranged_integer.from = from == :default ? nil : from
307
+ ranged_integer.to = to == :default ? nil : to
308
+ ranged_integer
309
+ end
310
+
311
+ def access_PFloatType(o, scope, keys)
312
+ keys.flatten!
313
+ unless keys.size.between?(1, 2)
314
+ fail(Puppet::Pops::Issues::BAD_FLOAT_SLICE_ARITY, @semantic, {:actual => keys.size})
315
+ end
316
+ keys.each_with_index do |x, index|
317
+ fail(Puppet::Pops::Issues::BAD_FLOAT_SLICE_TYPE, @semantic.keys[index],
318
+ {:actual => x.class}) unless (x.is_a?(Float) || x.is_a?(Integer) || x == :default)
319
+ end
320
+ ranged_float = Puppet::Pops::Types::PFloatType.new()
321
+ from, to = keys
322
+ ranged_float.from = from == :default || from.nil? ? nil : Float(from)
323
+ ranged_float.to = to == :default || to.nil? ? nil : Float(to)
324
+ ranged_float
325
+ end
326
+
327
+ # A Hash can create a new Hash type, one arg sets value type, two args sets key and value type in new type.
328
+ # With 3 or 4 arguments, these are used to create a size constraint.
329
+ # It is not possible to create a collection of Hash types directly.
330
+ #
331
+ def access_PHashType(o, scope, keys)
332
+ keys.flatten!
333
+ keys[0,2].each_with_index do |k, index|
334
+ unless k.is_a?(Puppet::Pops::Types::PAbstractType)
335
+ fail(Puppet::Pops::Issues::BAD_TYPE_SLICE_TYPE, @semantic.keys[index], {:base_type => 'Hash-Type', :actual => k.class})
336
+ end
337
+ end
338
+ case keys.size
339
+ when 1
340
+ result = Puppet::Pops::Types::PHashType.new()
341
+ result.key_type = o.key_type.copy
342
+ result.element_type = keys[0]
343
+ result
344
+ when 2
345
+ result = Puppet::Pops::Types::PHashType.new()
346
+ result.key_type = keys[0]
347
+ result.element_type = keys[1]
348
+ result
349
+ when 3
350
+ result = Puppet::Pops::Types::PHashType.new()
351
+ result.key_type = keys[0]
352
+ result.element_type = keys[1]
353
+ size_t = collection_size_t(1, keys[2])
354
+ result
355
+ when 4
356
+ result = Puppet::Pops::Types::PHashType.new()
357
+ result.key_type = keys[0]
358
+ result.element_type = keys[1]
359
+ size_t = collection_size_t(1, keys[2], keys[3])
360
+ result
361
+ else
362
+ fail(Puppet::Pops::Issues::BAD_TYPE_SLICE_ARITY, @semantic, {
363
+ :base_type => 'Hash-Type', :min => 1, :max => 4, :actual => keys.size
364
+ })
365
+ end
366
+ result.size_type = size_t if size_t
367
+ result
368
+ end
369
+
370
+ # CollectionType is parameterized with a range
371
+ def access_PCollectionType(o, scope, keys)
372
+ keys.flatten!
373
+ case keys.size
374
+ when 1
375
+ size_t = collection_size_t(1, keys[0])
376
+ when 2
377
+ size_t = collection_size_t(1, keys[0], keys[1])
378
+ else
379
+ fail(Puppet::Pops::Issues::BAD_TYPE_SLICE_ARITY, @semantic,
380
+ {:base_type => 'Collection-Type', :min => 1, :max => 2, :actual => keys.size})
381
+ end
382
+ result = Puppet::Pops::Types::PCollectionType.new()
383
+ result.size_type = size_t
384
+ result
385
+ end
386
+
387
+ # An Array can create a new Array type. It is not possible to create a collection of Array types.
388
+ #
389
+ def access_PArrayType(o, scope, keys)
390
+ keys.flatten!
391
+ case keys.size
392
+ when 1
393
+ size_t = nil
394
+ when 2
395
+ size_t = collection_size_t(1, keys[1])
396
+ when 3
397
+ size_t = collection_size_t(1, keys[1], keys[2])
398
+ else
399
+ fail(Puppet::Pops::Issues::BAD_TYPE_SLICE_ARITY, @semantic,
400
+ {:base_type => 'Array-Type', :min => 1, :max => 3, :actual => keys.size})
401
+ end
402
+ unless keys[0].is_a?(Puppet::Pops::Types::PAbstractType)
403
+ fail(Puppet::Pops::Issues::BAD_TYPE_SLICE_TYPE, @semantic.keys[0], {:base_type => 'Array-Type', :actual => keys[0].class})
404
+ end
405
+ result = Puppet::Pops::Types::PArrayType.new()
406
+ result.element_type = keys[0]
407
+ result.size_type = size_t
408
+ result
409
+ end
410
+
411
+ # Produces an PIntegerType (range) given one or two keys.
412
+ def collection_size_t(start_index, *keys)
413
+ if keys.size == 1 && keys[0].is_a?(Puppet::Pops::Types::PIntegerType)
414
+ keys[0].copy
415
+ else
416
+ keys.each_with_index do |x, index|
417
+ fail(Puppet::Pops::Issues::BAD_COLLECTION_SLICE_TYPE, @semantic.keys[start_index + index],
418
+ {:actual => x.class}) unless (x.is_a?(Integer) || x == :default)
419
+ end
420
+ ranged_integer = Puppet::Pops::Types::PIntegerType.new()
421
+ from, to = keys
422
+ ranged_integer.from = from == :default ? nil : from
423
+ ranged_integer.to = to == :default ? nil : to
424
+ ranged_integer
425
+ end
426
+ end
427
+
428
+ # A Resource can create a new more specific Resource type, and/or an array of resource types
429
+ # If the given type has title set, it can not be specified further.
430
+ # @example
431
+ # Resource[File] # => File
432
+ # Resource[File, 'foo'] # => File[foo]
433
+ # Resource[File. 'foo', 'bar'] # => [File[foo], File[bar]]
434
+ # File['foo', 'bar'] # => [File[foo], File[bar]]
435
+ # File['foo']['bar'] # => Value of the 'bar' parameter in the File['foo'] resource
436
+ # Resource[File]['foo', 'bar'] # => [File[Foo], File[bar]]
437
+ # Resource[File, 'foo', 'bar'] # => [File[foo], File[bar]]
438
+ # Resource[File, 'foo']['bar'] # => Value of the 'bar' parameter in the File['foo'] resource
439
+ #
440
+ def access_PResourceType(o, scope, keys)
441
+ keys.flatten!
442
+ if keys.size == 0
443
+ fail(Puppet::Pops::Issues::BAD_TYPE_SLICE_ARITY, o,
444
+ :base_type => Puppet::Pops::Types::TypeCalculator.new().string(o), :min => 1, :actual => 0)
445
+ end
446
+ if !o.title.nil?
447
+ # lookup resource and return one or more parameter values
448
+ resource = find_resource(scope, o.type_name, o.title)
449
+ unless resource
450
+ fail(Puppet::Pops::Issues::UNKNOWN_RESOURCE, @semantic, {:type_name => o.type_name, :title => o.title})
451
+ end
452
+ result = keys.map do |k|
453
+ unless is_parameter_of_resource?(scope, resource, k)
454
+ fail(Puppet::Pops::Issues::UNKNOWN_RESOURCE_PARAMETER, @semantic,
455
+ {:type_name => o.type_name, :title => o.title, :param_name=>k})
456
+ end
457
+ get_resource_parameter_value(scope, resource, k)
458
+ end
459
+ return result.size <= 1 ? result.pop : result
460
+ end
461
+
462
+ # type_name is LHS type_name if set, else the first given arg
463
+ keys_orig_size = keys.size
464
+ type_name = o.type_name || keys.shift
465
+ type_name = case type_name
466
+ when Puppet::Pops::Types::PResourceType
467
+ type_name.type_name
468
+ when String
469
+ type_name.downcase
470
+ else
471
+ blame = keys_orig_size != keys.size ? @semantic.keys[0] : @semantic.left_expr
472
+ fail(Puppet::Pops::Issues::ILLEGAL_RESOURCE_SPECIALIZATION, blame, {:actual => type_name.class})
473
+ end
474
+
475
+ keys = [:no_title] if keys.size < 1 # if there was only a type_name and it was consumed
476
+ result = keys.each_with_index.map do |t, i|
477
+ unless t.is_a?(String) || t == :no_title
478
+ type_to_report = case t
479
+ when nil, :undef
480
+ 'Undef'
481
+ when :default
482
+ 'Default'
483
+ else
484
+ t.class.name
485
+ end
486
+ index = keys_orig_size != keys.size ? i+1 : i
487
+ fail(Puppet::Pops::Issues::BAD_TYPE_SPECIALIZATION, @semantic.keys[index], {
488
+ :type => o,
489
+ :message => "Cannot use #{type_to_report} where String is expected"
490
+ })
491
+ end
492
+
493
+ rtype = Puppet::Pops::Types::PResourceType.new()
494
+ rtype.type_name = type_name
495
+ rtype.title = (t == :no_title ? nil : t)
496
+ rtype
497
+ end
498
+ # returns single type as type, else an array of types
499
+ result.size == 1 ? result.pop : result
500
+ end
501
+
502
+ def access_PHostClassType(o, scope, keys)
503
+ keys.flatten!
504
+ if keys.size == 0
505
+ fail(Puppet::Pops::Issues::BAD_TYPE_SLICE_ARITY, o,
506
+ :base_type => Puppet::Pops::Types::TypeCalculator.new().string(o), :min => 1, :actual => 0)
507
+ end
508
+ if ! o.class_name.nil?
509
+ # lookup class resource and return one or more parameter values
510
+ resource = find_resource(scope, 'class', o.class_name)
511
+ unless resource
512
+ fail(Puppet::Pops::Issues::UNKNOWN_RESOURCE, @semantic, {:type_name => 'Class', :title => o.class_name})
513
+ end
514
+ result = keys.map do |k|
515
+ unless is_parameter_of_resource?(scope, resource, k)
516
+ fail(Puppet::Pops::Issues::UNKNOWN_RESOURCE_PARAMETER, @semantic,
517
+ {:type_name => 'Class', :title => o.class_name, :param_name=>k})
518
+ end
519
+ get_resource_parameter_value(scope, resource, k)
520
+ end
521
+ return result.size <= 1 ? result.pop : result
522
+ # TODO: if [] is applied to specific class, it should be treated the same as getting
523
+ # a resource parameter. Now it fails the operation
524
+ #
525
+ fail(Puppet::Pops::Issues::ILLEGAL_TYPE_SPECIALIZATION, semantic.left_expr, {:kind => 'Class'})
526
+ end
527
+ # The type argument may be a Resource Type - the Puppet Language allows a reference such as
528
+ # Class[Foo], and this is interpreted as Class[Resource[Foo]] - which is ok as long as the resource
529
+ # does not have a title. This should probably be deprecated.
530
+ #
531
+ result = keys.each_with_index.map do |c, i|
532
+ ctype = Puppet::Pops::Types::PHostClassType.new()
533
+ if c.is_a?(Puppet::Pops::Types::PResourceType) && !c.type_name.nil? && c.title.nil?
534
+ c = c.type_name.downcase
535
+ end
536
+ unless c.is_a?(String)
537
+ fail(Puppet::Pops::Issues::ILLEGAL_HOSTCLASS_NAME, @semantic.keys[i], {:name => c})
538
+ end
539
+ if c !~ Puppet::Pops::Patterns::NAME
540
+ fail(Issues::ILLEGAL_NAME, @semantic.keys[i], {:name=>c})
541
+ end
542
+ ctype.class_name = c
543
+ ctype
544
+ end
545
+ # returns single type as type, else an array of types
546
+ result.size == 1 ? result.pop : result
547
+ end
548
+ end