puppet 3.2.4 → 3.3.0.rc2

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 (562) hide show
  1. data/COMMITTERS.md +101 -42
  2. data/Gemfile +15 -4
  3. data/README.md +5 -1
  4. data/README_DEVELOPER.md +117 -54
  5. data/Rakefile +4 -0
  6. data/ext/build_defaults.yaml +3 -2
  7. data/ext/debian/puppet-common.manpages +33 -1
  8. data/ext/gentoo/init.d/puppet +1 -1
  9. data/ext/gentoo/init.d/puppetmaster +1 -1
  10. data/ext/redhat/puppet.spec.erb +0 -1
  11. data/install.rb +2 -1
  12. data/lib/hiera/backend/puppet_backend.rb +1 -1
  13. data/lib/puppet/application.rb +10 -9
  14. data/lib/puppet/application/agent.rb +87 -93
  15. data/lib/puppet/application/apply.rb +0 -2
  16. data/lib/puppet/application/device.rb +3 -3
  17. data/lib/puppet/application/kick.rb +2 -2
  18. data/lib/puppet/application/master.rb +41 -19
  19. data/lib/puppet/application/queue.rb +5 -3
  20. data/lib/puppet/bindings.rb +147 -0
  21. data/lib/puppet/configurer.rb +25 -15
  22. data/lib/puppet/configurer/fact_handler.rb +2 -9
  23. data/lib/puppet/daemon.rb +44 -33
  24. data/lib/puppet/defaults.rb +57 -26
  25. data/lib/puppet/error.rb +1 -1
  26. data/lib/puppet/external/dot.rb +2 -2
  27. data/lib/puppet/external/nagios/base.rb +1 -6
  28. data/lib/puppet/external/pson/common.rb +2 -2
  29. data/lib/puppet/external/pson/pure/generator.rb +2 -2
  30. data/lib/puppet/external/pson/pure/parser.rb +1 -1
  31. data/lib/puppet/face/ca.rb +1 -1
  32. data/lib/puppet/face/config.rb +1 -1
  33. data/lib/puppet/face/help.rb +2 -2
  34. data/lib/puppet/face/module/list.rb +2 -2
  35. data/lib/puppet/feature/rails.rb +1 -1
  36. data/lib/puppet/file_bucket/dipper.rb +0 -1
  37. data/lib/puppet/file_serving/base.rb +1 -1
  38. data/lib/puppet/file_serving/configuration/parser.rb +20 -14
  39. data/lib/puppet/forge.rb +0 -32
  40. data/lib/puppet/forge/cache.rb +1 -1
  41. data/lib/puppet/forge/errors.rb +3 -3
  42. data/lib/puppet/forge/repository.rb +7 -42
  43. data/lib/puppet/graph.rb +11 -0
  44. data/lib/puppet/graph/key.rb +26 -0
  45. data/lib/puppet/graph/prioritizer.rb +29 -0
  46. data/lib/puppet/graph/random_prioritizer.rb +16 -0
  47. data/lib/puppet/{rb_tree_map.rb → graph/rb_tree_map.rb} +3 -3
  48. data/lib/puppet/graph/relationship_graph.rb +246 -0
  49. data/lib/puppet/graph/sequential_prioritizer.rb +31 -0
  50. data/lib/puppet/{simple_graph.rb → graph/simple_graph.rb} +22 -3
  51. data/lib/puppet/graph/title_hash_prioritizer.rb +16 -0
  52. data/lib/puppet/indirector.rb +2 -2
  53. data/lib/puppet/indirector/catalog/compiler.rb +10 -7
  54. data/lib/puppet/indirector/catalog/static_compiler.rb +50 -0
  55. data/lib/puppet/indirector/certificate/rest.rb +1 -1
  56. data/lib/puppet/indirector/exec.rb +1 -1
  57. data/lib/puppet/indirector/facts/facter.rb +2 -2
  58. data/lib/puppet/indirector/facts/inventory_active_record.rb +0 -1
  59. data/lib/puppet/indirector/facts/network_device.rb +1 -1
  60. data/lib/puppet/indirector/file_bucket_file/file.rb +0 -1
  61. data/lib/puppet/indirector/indirection.rb +2 -2
  62. data/lib/puppet/indirector/memory.rb +9 -0
  63. data/lib/puppet/indirector/node/ldap.rb +2 -4
  64. data/lib/puppet/indirector/report/processor.rb +1 -2
  65. data/lib/puppet/indirector/report/rest.rb +1 -1
  66. data/lib/puppet/indirector/request.rb +32 -10
  67. data/lib/puppet/indirector/resource/rest.rb +1 -1
  68. data/lib/puppet/indirector/resource_type/parser.rb +31 -12
  69. data/lib/puppet/interface.rb +1 -1
  70. data/lib/puppet/interface/documentation.rb +7 -11
  71. data/lib/puppet/interface/option.rb +1 -1
  72. data/lib/puppet/interface/option_builder.rb +1 -1
  73. data/lib/puppet/metatype/manager.rb +2 -2
  74. data/lib/puppet/module.rb +7 -1
  75. data/lib/puppet/module_tool.rb +1 -1
  76. data/lib/puppet/module_tool/applications/application.rb +10 -0
  77. data/lib/puppet/module_tool/applications/installer.rb +6 -3
  78. data/lib/puppet/module_tool/dependency.rb +2 -0
  79. data/lib/puppet/module_tool/errors/upgrader.rb +1 -1
  80. data/lib/puppet/module_tool/metadata.rb +25 -13
  81. data/lib/puppet/module_tool/modulefile.rb +7 -7
  82. data/lib/puppet/module_tool/shared_behaviors.rb +4 -2
  83. data/lib/puppet/module_tool/skeleton.rb +1 -1
  84. data/lib/puppet/module_tool/skeleton/templates/generator/manifests/init.pp.erb +5 -5
  85. data/lib/puppet/module_tool/skeleton/templates/generator/tests/init.pp.erb +5 -4
  86. data/lib/puppet/network/auth_config_parser.rb +3 -0
  87. data/lib/puppet/network/authconfig.rb +0 -1
  88. data/lib/puppet/network/authorization.rb +1 -1
  89. data/lib/puppet/network/authstore.rb +2 -2
  90. data/lib/puppet/network/format_handler.rb +25 -114
  91. data/lib/puppet/network/format_support.rb +106 -0
  92. data/lib/puppet/network/formats.rb +10 -4
  93. data/lib/puppet/network/http/compression.rb +1 -1
  94. data/lib/puppet/network/http/connection.rb +76 -32
  95. data/lib/puppet/network/http/handler.rb +122 -61
  96. data/lib/puppet/network/http/rack/rest.rb +1 -1
  97. data/lib/puppet/network/http/webrick/rest.rb +9 -3
  98. data/lib/puppet/network/http_pool.rb +2 -2
  99. data/lib/puppet/network/resolver.rb +1 -0
  100. data/lib/puppet/network/server.rb +5 -81
  101. data/lib/puppet/node/environment.rb +256 -13
  102. data/lib/puppet/node/facts.rb +28 -2
  103. data/lib/puppet/parameter.rb +27 -18
  104. data/lib/puppet/parameter/boolean.rb +20 -0
  105. data/lib/puppet/parameter/path.rb +1 -1
  106. data/lib/puppet/parameter/value.rb +1 -1
  107. data/lib/puppet/parameter/value_collection.rb +1 -1
  108. data/lib/puppet/parser/ast/arithmetic_operator.rb +8 -0
  109. data/lib/puppet/parser/ast/casestatement.rb +0 -3
  110. data/lib/puppet/parser/ast/lambda.rb +25 -6
  111. data/lib/puppet/parser/ast/leaf.rb +10 -3
  112. data/lib/puppet/parser/ast/nop.rb +1 -1
  113. data/lib/puppet/parser/ast/resource_override.rb +0 -2
  114. data/lib/puppet/parser/compiler.rb +92 -34
  115. data/lib/puppet/parser/files.rb +0 -5
  116. data/lib/puppet/parser/functions/create_resources.rb +23 -46
  117. data/lib/puppet/parser/functions/each.rb +0 -2
  118. data/lib/puppet/parser/functions/extlookup.rb +2 -2
  119. data/lib/puppet/parser/functions/foreach.rb +0 -2
  120. data/lib/puppet/parser/functions/hiera_include.rb +1 -1
  121. data/lib/puppet/parser/functions/lookup.rb +44 -0
  122. data/lib/puppet/parser/functions/slice.rb +1 -1
  123. data/lib/puppet/parser/grammar.ra +0 -1
  124. data/lib/puppet/parser/lexer.rb +0 -1
  125. data/lib/puppet/parser/parser.rb +0 -1
  126. data/lib/puppet/parser/parser_factory.rb +3 -2
  127. data/lib/puppet/parser/parser_support.rb +1 -1
  128. data/lib/puppet/parser/relationship.rb +1 -1
  129. data/lib/puppet/parser/scope.rb +49 -24
  130. data/lib/puppet/parser/type_loader.rb +13 -18
  131. data/lib/puppet/pops.rb +45 -0
  132. data/lib/puppet/pops/adaptable.rb +2 -2
  133. data/lib/puppet/pops/adapters.rb +4 -0
  134. data/lib/puppet/pops/binder/binder.rb +421 -0
  135. data/lib/puppet/pops/binder/binder_issues.rb +142 -0
  136. data/lib/puppet/pops/binder/bindings_checker.rb +217 -0
  137. data/lib/puppet/pops/binder/bindings_composer.rb +241 -0
  138. data/lib/puppet/pops/binder/bindings_factory.rb +847 -0
  139. data/lib/puppet/pops/binder/bindings_label_provider.rb +46 -0
  140. data/lib/puppet/pops/binder/bindings_loader.rb +79 -0
  141. data/lib/puppet/pops/binder/bindings_model.rb +215 -0
  142. data/lib/puppet/pops/binder/bindings_model_dumper.rb +205 -0
  143. data/lib/puppet/pops/binder/bindings_validator_factory.rb +28 -0
  144. data/lib/puppet/pops/binder/config/binder_config.rb +139 -0
  145. data/lib/puppet/pops/binder/config/binder_config_checker.rb +183 -0
  146. data/lib/puppet/pops/binder/config/diagnostic_producer.rb +32 -0
  147. data/lib/puppet/pops/binder/config/issues.rb +106 -0
  148. data/lib/puppet/pops/binder/hiera2.rb +10 -0
  149. data/lib/puppet/pops/binder/hiera2/bindings_provider.rb +148 -0
  150. data/lib/puppet/pops/binder/hiera2/config.rb +69 -0
  151. data/lib/puppet/pops/binder/hiera2/config_checker.rb +68 -0
  152. data/lib/puppet/pops/binder/hiera2/diagnostic_producer.rb +36 -0
  153. data/lib/puppet/pops/binder/hiera2/issues.rb +67 -0
  154. data/lib/puppet/pops/binder/hiera2/json_backend.rb +18 -0
  155. data/lib/puppet/pops/binder/hiera2/yaml_backend.rb +21 -0
  156. data/lib/puppet/pops/binder/injector.rb +688 -0
  157. data/lib/puppet/pops/binder/injector_entry.rb +53 -0
  158. data/lib/puppet/pops/binder/key_factory.rb +61 -0
  159. data/lib/puppet/pops/binder/producers.rb +829 -0
  160. data/lib/puppet/pops/binder/scheme_handler/confdir_hiera_scheme.rb +67 -0
  161. data/lib/puppet/pops/binder/scheme_handler/confdir_scheme.rb +34 -0
  162. data/lib/puppet/pops/binder/scheme_handler/module_hiera_scheme.rb +92 -0
  163. data/lib/puppet/pops/binder/scheme_handler/module_scheme.rb +84 -0
  164. data/lib/puppet/pops/binder/scheme_handler/symbolic_scheme.rb +54 -0
  165. data/lib/puppet/pops/binder/system_bindings.rb +72 -0
  166. data/lib/puppet/pops/issue_reporter.rb +75 -0
  167. data/lib/puppet/pops/issues.rb +9 -5
  168. data/lib/puppet/pops/model/ast_transformer.rb +4 -4
  169. data/lib/puppet/pops/model/ast_tree_dumper.rb +1 -1
  170. data/lib/puppet/pops/model/factory.rb +25 -13
  171. data/lib/puppet/pops/model/model.rb +1 -1
  172. data/lib/puppet/pops/model/tree_dumper.rb +2 -2
  173. data/lib/puppet/pops/parser/egrammar.ra +0 -1
  174. data/lib/puppet/pops/parser/eparser.rb +1 -2
  175. data/lib/puppet/pops/parser/evaluating_parser.rb +162 -0
  176. data/lib/puppet/pops/parser/lexer.rb +8 -6
  177. data/lib/puppet/pops/types/class_loader.rb +118 -0
  178. data/lib/puppet/pops/types/type_calculator.rb +557 -0
  179. data/lib/puppet/pops/types/type_factory.rb +147 -0
  180. data/lib/puppet/pops/types/type_parser.rb +117 -0
  181. data/lib/puppet/pops/types/types.rb +132 -0
  182. data/lib/puppet/pops/validation.rb +146 -17
  183. data/lib/puppet/pops/validation/checker3_1.rb +1 -1
  184. data/lib/puppet/pops/validation/validator_factory_3_1.rb +6 -16
  185. data/lib/puppet/property.rb +3 -3
  186. data/lib/puppet/property/keyvalue.rb +1 -1
  187. data/lib/puppet/provider.rb +2 -2
  188. data/lib/puppet/provider/aixobject.rb +19 -21
  189. data/lib/puppet/provider/augeas/augeas.rb +3 -1
  190. data/lib/puppet/provider/command.rb +2 -2
  191. data/lib/puppet/provider/group/aix.rb +1 -1
  192. data/lib/puppet/provider/group/ldap.rb +1 -1
  193. data/lib/puppet/provider/macauthorization/macauthorization.rb +1 -1
  194. data/lib/puppet/provider/mailalias/aliases.rb +3 -8
  195. data/lib/puppet/provider/mcx/mcxcontent.rb +7 -1
  196. data/lib/puppet/provider/mount.rb +8 -3
  197. data/lib/puppet/provider/nameservice.rb +1 -1
  198. data/lib/puppet/provider/nameservice/directoryservice.rb +5 -5
  199. data/lib/puppet/provider/package/appdmg.rb +1 -1
  200. data/lib/puppet/provider/package/apt.rb +0 -1
  201. data/lib/puppet/provider/package/dpkg.rb +86 -32
  202. data/lib/puppet/provider/package/fink.rb +0 -2
  203. data/lib/puppet/provider/package/freebsd.rb +0 -2
  204. data/lib/puppet/provider/package/openbsd.rb +57 -10
  205. data/lib/puppet/provider/package/opkg.rb +0 -1
  206. data/lib/puppet/provider/package/pacman.rb +0 -1
  207. data/lib/puppet/provider/package/pip.rb +1 -1
  208. data/lib/puppet/provider/package/pkgdmg.rb +17 -6
  209. data/lib/puppet/provider/package/pkgutil.rb +1 -1
  210. data/lib/puppet/provider/package/portage.rb +9 -1
  211. data/lib/puppet/provider/package/ports.rb +2 -2
  212. data/lib/puppet/provider/package/rpm.rb +29 -12
  213. data/lib/puppet/provider/package/rug.rb +1 -1
  214. data/lib/puppet/provider/package/urpmi.rb +11 -15
  215. data/lib/puppet/provider/package/windows/exe_package.rb +1 -1
  216. data/lib/puppet/provider/package/windows/package.rb +1 -26
  217. data/lib/puppet/provider/package/yum.rb +1 -1
  218. data/lib/puppet/provider/package/zypper.rb +22 -3
  219. data/lib/puppet/provider/parsedfile.rb +1 -12
  220. data/lib/puppet/provider/scheduled_task/win32_taskscheduler.rb +1 -1
  221. data/lib/puppet/provider/service/base.rb +1 -1
  222. data/lib/puppet/provider/service/daemontools.rb +3 -3
  223. data/lib/puppet/provider/service/debian.rb +1 -1
  224. data/lib/puppet/provider/service/init.rb +14 -20
  225. data/lib/puppet/provider/service/openrc.rb +3 -1
  226. data/lib/puppet/provider/service/redhat.rb +5 -8
  227. data/lib/puppet/provider/service/runit.rb +3 -2
  228. data/lib/puppet/provider/service/systemd.rb +1 -1
  229. data/lib/puppet/provider/ssh_authorized_key/parsed.rb +1 -1
  230. data/lib/puppet/provider/sshkey/parsed.rb +0 -2
  231. data/lib/puppet/provider/user/aix.rb +25 -12
  232. data/lib/puppet/provider/user/directoryservice.rb +4 -7
  233. data/lib/puppet/provider/user/ldap.rb +0 -1
  234. data/lib/puppet/provider/user/user_role_add.rb +2 -0
  235. data/lib/puppet/provider/user/useradd.rb +1 -1
  236. data/lib/puppet/provider/zone/solaris.rb +1 -2
  237. data/lib/puppet/reference/metaparameter.rb +1 -1
  238. data/lib/puppet/reference/type.rb +1 -1
  239. data/lib/puppet/reports/rrdgraph.rb +1 -1
  240. data/lib/puppet/reports/tagmail.rb +1 -1
  241. data/lib/puppet/resource.rb +16 -4
  242. data/lib/puppet/resource/catalog.rb +111 -173
  243. data/lib/puppet/resource/status.rb +42 -3
  244. data/lib/puppet/resource/type.rb +33 -46
  245. data/lib/puppet/resource/type_collection.rb +19 -15
  246. data/lib/puppet/run.rb +5 -1
  247. data/lib/puppet/scheduler/scheduler.rb +14 -15
  248. data/lib/puppet/settings.rb +78 -41
  249. data/lib/puppet/settings/boolean_setting.rb +0 -2
  250. data/lib/puppet/settings/config_file.rb +0 -2
  251. data/lib/puppet/settings/directory_setting.rb +0 -2
  252. data/lib/puppet/settings/duration_setting.rb +0 -2
  253. data/lib/puppet/settings/enum_setting.rb +16 -0
  254. data/lib/puppet/settings/file_setting.rb +0 -2
  255. data/lib/puppet/settings/path_setting.rb +0 -2
  256. data/lib/puppet/settings/string_setting.rb +0 -3
  257. data/lib/puppet/settings/terminus_setting.rb +0 -2
  258. data/lib/puppet/ssl/certificate_authority.rb +102 -9
  259. data/lib/puppet/test/test_helper.rb +1 -0
  260. data/lib/puppet/transaction.rb +130 -292
  261. data/lib/puppet/transaction/additional_resource_generator.rb +126 -0
  262. data/lib/puppet/transaction/event.rb +16 -1
  263. data/lib/puppet/transaction/report.rb +34 -14
  264. data/lib/puppet/transaction/resource_harness.rb +16 -19
  265. data/lib/puppet/type.rb +59 -53
  266. data/lib/puppet/type/component.rb +0 -2
  267. data/lib/puppet/type/cron.rb +13 -2
  268. data/lib/puppet/type/exec.rb +5 -7
  269. data/lib/puppet/type/file.rb +9 -32
  270. data/lib/puppet/type/file/content.rb +4 -1
  271. data/lib/puppet/type/file/ctime.rb +3 -1
  272. data/lib/puppet/type/file/ensure.rb +1 -1
  273. data/lib/puppet/type/file/mode.rb +0 -1
  274. data/lib/puppet/type/file/mtime.rb +2 -1
  275. data/lib/puppet/type/group.rb +7 -9
  276. data/lib/puppet/type/host.rb +1 -2
  277. data/lib/puppet/type/mcx.rb +0 -1
  278. data/lib/puppet/type/mount.rb +38 -6
  279. data/lib/puppet/type/package.rb +2 -2
  280. data/lib/puppet/type/resources.rb +5 -4
  281. data/lib/puppet/type/schedule.rb +1 -4
  282. data/lib/puppet/type/selmodule.rb +1 -1
  283. data/lib/puppet/type/service.rb +1 -3
  284. data/lib/puppet/type/tidy.rb +3 -3
  285. data/lib/puppet/type/user.rb +9 -13
  286. data/lib/puppet/type/yumrepo.rb +11 -7
  287. data/lib/puppet/util.rb +14 -7
  288. data/lib/puppet/util/autoload.rb +0 -1
  289. data/lib/puppet/util/backups.rb +1 -3
  290. data/lib/puppet/util/classgen.rb +1 -1
  291. data/lib/puppet/util/command_line/puppet_option_parser.rb +1 -3
  292. data/lib/puppet/util/command_line/trollop.rb +1 -1
  293. data/lib/puppet/util/constant_inflector.rb +1 -2
  294. data/lib/puppet/util/errors.rb +1 -0
  295. data/lib/puppet/util/file_watcher.rb +28 -0
  296. data/lib/puppet/util/fileparsing.rb +1 -3
  297. data/lib/puppet/util/filetype.rb +0 -1
  298. data/lib/puppet/util/http_proxy.rb +38 -0
  299. data/lib/puppet/util/ldap/manager.rb +1 -2
  300. data/lib/puppet/util/log.rb +31 -10
  301. data/lib/puppet/util/log/destinations.rb +0 -50
  302. data/lib/puppet/util/metric.rb +8 -1
  303. data/lib/puppet/util/monkey_patches.rb +14 -148
  304. data/lib/puppet/util/network_device/cisco/facts.rb +1 -1
  305. data/lib/puppet/util/network_device/config.rb +6 -9
  306. data/lib/puppet/util/network_device/transport/ssh.rb +1 -1
  307. data/lib/puppet/util/pidlock.rb +3 -0
  308. data/lib/puppet/util/posix.rb +1 -1
  309. data/lib/puppet/util/profiler.rb +1 -1
  310. data/lib/puppet/util/rdoc.rb +1 -1
  311. data/lib/puppet/util/rdoc/generators/puppet_generator.rb +0 -1
  312. data/lib/puppet/util/rdoc/generators/template/puppet/puppet.rb +50 -42
  313. data/lib/puppet/util/retryaction.rb +0 -1
  314. data/lib/puppet/util/symbolic_file_mode.rb +5 -1
  315. data/lib/puppet/util/tagging.rb +0 -2
  316. data/lib/puppet/util/warnings.rb +3 -0
  317. data/lib/puppet/util/watched_file.rb +37 -0
  318. data/lib/puppet/util/watcher.rb +17 -0
  319. data/lib/puppet/util/watcher/change_watcher.rb +33 -0
  320. data/lib/puppet/util/watcher/periodic_watcher.rb +37 -0
  321. data/lib/puppet/util/watcher/timer.rb +19 -0
  322. data/lib/puppet/util/windows/user.rb +1 -1
  323. data/lib/puppet/version.rb +1 -1
  324. data/lib/puppetx.rb +109 -0
  325. data/lib/puppetx/puppet/bindings_scheme_handler.rb +130 -0
  326. data/lib/puppetx/puppet/hiera2_backend.rb +31 -0
  327. data/lib/puppetx/puppet/syntax_checker.rb +91 -0
  328. data/lib/puppetx/puppetlabs/syntax_checkers/json.rb +39 -0
  329. data/lib/semver.rb +1 -1
  330. data/man/man8/puppet-kick.8 +1 -1
  331. data/spec/fixtures/integration/provider/cron/crontab/unspecialized +15 -0
  332. data/spec/fixtures/unit/pops/binder/bindings_composer/hiera1config/binder_config.yaml +18 -0
  333. data/spec/fixtures/unit/pops/binder/bindings_composer/hiera1config/hiera.yaml +8 -0
  334. data/spec/fixtures/unit/pops/binder/bindings_composer/hiera1config/modules/good/common.yaml +1 -0
  335. data/spec/fixtures/unit/pops/binder/bindings_composer/hiera1config/modules/good/hiera.yaml +10 -0
  336. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/binder_config.yaml +19 -0
  337. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/common.yaml +1 -0
  338. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/hiera.yaml +11 -0
  339. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/localhost.yaml +1 -0
  340. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/awesome/common.yaml +3 -0
  341. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/awesome/hiera.yaml +13 -0
  342. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/awesome/lib/puppet/bindings/awesome/default.rb +4 -0
  343. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/awesome/lib/puppetx/awesome/echo_backend.rb +11 -0
  344. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/awesome/lib/puppetx/awesome/echo_scheme_handler.rb +18 -0
  345. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/awesome/localhost.yaml +1 -0
  346. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/bad/common.yaml +3 -0
  347. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/bad/hiera_config.yaml +9 -0
  348. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/good/common.yaml +2 -0
  349. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/good/hiera.yaml +11 -0
  350. data/spec/fixtures/unit/pops/binder/config/binder_config/ok/binder_config.yaml +9 -0
  351. data/spec/fixtures/unit/pops/binder/hiera2/bindings_provider/ok/hiera.yaml +9 -0
  352. data/spec/fixtures/unit/pops/binder/hiera2/bindings_provider/ok/node.example.com.json +9 -0
  353. data/spec/fixtures/unit/pops/binder/hiera2/bindings_provider/ok/node.example.com.yaml +5 -0
  354. data/spec/fixtures/unit/pops/binder/hiera2/config/bad_syntax/hiera.yaml +10 -0
  355. data/spec/fixtures/unit/pops/binder/hiera2/config/malformed_hierarchy/hiera.yaml +8 -0
  356. data/spec/fixtures/unit/pops/binder/hiera2/config/missing/foo.txt +1 -0
  357. data/spec/fixtures/unit/pops/binder/hiera2/config/no_backends/hiera.yaml +7 -0
  358. data/spec/fixtures/unit/pops/binder/hiera2/config/no_hierarchy/hiera.yaml +4 -0
  359. data/spec/fixtures/unit/pops/binder/hiera2/config/not_a_hash/hiera.yaml +2 -0
  360. data/spec/fixtures/unit/pops/binder/hiera2/config/ok/hiera.yaml +8 -0
  361. data/spec/fixtures/unit/pops/binder/hiera2/yaml_backend/empty/common.yaml +0 -0
  362. data/spec/fixtures/unit/pops/binder/hiera2/yaml_backend/invalid/common.yaml +1 -0
  363. data/spec/fixtures/unit/pops/binder/hiera2/yaml_backend/ok/common.yaml +2 -0
  364. data/spec/fixtures/unit/provider/package/openbsd/pkginfo_flavors.list +2 -0
  365. data/spec/integration/agent/logging_spec.rb +178 -0
  366. data/spec/integration/configurer_spec.rb +1 -1
  367. data/spec/integration/defaults_spec.rb +0 -6
  368. data/spec/integration/network/authconfig_spec.rb +19 -0
  369. data/spec/integration/network/server/webrick_spec.rb +10 -11
  370. data/spec/integration/parser/catalog_spec.rb +85 -0
  371. data/spec/integration/provider/cron/crontab_spec.rb +11 -0
  372. data/spec/integration/provider/mount_spec.rb +1 -0
  373. data/spec/integration/transaction_spec.rb +8 -8
  374. data/spec/integration/type/file_spec.rb +1 -1
  375. data/spec/integration/util/settings_spec.rb +58 -11
  376. data/spec/lib/matchers/include_in_order.rb +21 -0
  377. data/spec/lib/matchers/include_in_order_spec.rb +30 -0
  378. data/spec/lib/matchers/relationship_graph_matchers.rb +48 -0
  379. data/spec/lib/puppet_spec/compiler.rb +24 -0
  380. data/spec/lib/puppet_spec/pops.rb +16 -0
  381. data/spec/spec_helper.rb +0 -1
  382. data/spec/unit/application/agent_spec.rb +145 -145
  383. data/spec/unit/application/apply_spec.rb +1 -1
  384. data/spec/unit/application/doc_spec.rb +1 -1
  385. data/spec/unit/application/face_base_spec.rb +3 -3
  386. data/spec/unit/application/facts_spec.rb +1 -0
  387. data/spec/unit/application/master_spec.rb +0 -15
  388. data/spec/unit/application/queue_spec.rb +6 -12
  389. data/spec/unit/application/resource_spec.rb +1 -1
  390. data/spec/unit/configurer/fact_handler_spec.rb +19 -50
  391. data/spec/unit/configurer_spec.rb +23 -7
  392. data/spec/unit/daemon_spec.rb +97 -121
  393. data/spec/unit/defaults_spec.rb +44 -0
  394. data/spec/unit/face/node_spec.rb +2 -2
  395. data/spec/unit/file_serving/configuration/parser_spec.rb +23 -33
  396. data/spec/unit/file_serving/configuration_spec.rb +2 -2
  397. data/spec/unit/file_serving/mount/file_spec.rb +4 -4
  398. data/spec/unit/forge/repository_spec.rb +9 -29
  399. data/spec/unit/graph/key_spec.rb +41 -0
  400. data/spec/unit/{rb_tree_map_spec.rb → graph/rb_tree_map_spec.rb} +7 -7
  401. data/spec/unit/graph/relationship_graph_spec.rb +393 -0
  402. data/spec/unit/graph/sequential_prioritizer_spec.rb +32 -0
  403. data/spec/unit/{simple_graph_spec.rb → graph/simple_graph.rb} +42 -254
  404. data/spec/unit/graph/title_hash_prioritizer_spec.rb +49 -0
  405. data/spec/unit/hiera_puppet_spec.rb +1 -1
  406. data/spec/unit/indirector/catalog/active_record_spec.rb +4 -2
  407. data/spec/unit/indirector/catalog/compiler_spec.rb +20 -26
  408. data/spec/unit/indirector/face_spec.rb +1 -1
  409. data/spec/unit/indirector/facts/facter_spec.rb +11 -1
  410. data/spec/unit/indirector/facts/network_device_spec.rb +11 -1
  411. data/spec/unit/indirector/hiera_spec.rb +1 -1
  412. data/spec/unit/indirector/instrumentation_data/local_spec.rb +1 -1
  413. data/spec/unit/indirector/instrumentation_listener/local_spec.rb +1 -1
  414. data/spec/unit/indirector/request_spec.rb +92 -39
  415. data/spec/unit/indirector/rest_spec.rb +1 -0
  416. data/spec/unit/indirector_spec.rb +2 -2
  417. data/spec/unit/interface/option_builder_spec.rb +1 -0
  418. data/spec/unit/interface/option_spec.rb +1 -0
  419. data/spec/unit/interface_spec.rb +2 -2
  420. data/spec/unit/module_tool/applications/installer_spec.rb +49 -2
  421. data/spec/unit/module_tool/metadata_spec.rb +13 -0
  422. data/spec/unit/network/authstore_spec.rb +1 -1
  423. data/spec/unit/network/format_handler_spec.rb +33 -282
  424. data/spec/unit/network/format_support_spec.rb +199 -0
  425. data/spec/unit/network/formats_spec.rb +2 -2
  426. data/spec/unit/network/http/connection_spec.rb +88 -7
  427. data/spec/unit/network/http/handler_spec.rb +271 -249
  428. data/spec/unit/network/http/rack/rest_spec.rb +1 -1
  429. data/spec/unit/network/http/webrick/rest_spec.rb +73 -22
  430. data/spec/unit/network/http_pool_spec.rb +40 -0
  431. data/spec/unit/network/server_spec.rb +18 -207
  432. data/spec/unit/node/facts_spec.rb +68 -17
  433. data/spec/unit/other/selinux_spec.rb +24 -20
  434. data/spec/unit/parameter/boolean_spec.rb +25 -0
  435. data/spec/unit/parameter/value_collection_spec.rb +7 -7
  436. data/spec/unit/parameter_spec.rb +10 -13
  437. data/spec/unit/parser/ast/function_spec.rb +4 -4
  438. data/spec/unit/parser/ast/leaf_spec.rb +45 -6
  439. data/spec/unit/parser/collector_spec.rb +3 -3
  440. data/spec/unit/parser/compiler_spec.rb +4 -3
  441. data/spec/unit/parser/functions/create_resources_spec.rb +9 -25
  442. data/spec/unit/parser/functions/extlookup_spec.rb +2 -2
  443. data/spec/unit/parser/functions/hiera_include_spec.rb +12 -0
  444. data/spec/unit/parser/functions/lookup_spec.rb +96 -0
  445. data/spec/unit/parser/functions/regsubst_spec.rb +2 -2
  446. data/spec/unit/parser/functions/split_spec.rb +2 -2
  447. data/spec/unit/parser/functions/sprintf_spec.rb +1 -1
  448. data/spec/unit/parser/functions/versioncmp_spec.rb +2 -2
  449. data/spec/unit/parser/functions_spec.rb +7 -7
  450. data/spec/unit/parser/lexer_spec.rb +1 -1
  451. data/spec/unit/parser/methods/collect_spec.rb +43 -0
  452. data/spec/unit/parser/resource_spec.rb +9 -9
  453. data/spec/unit/parser/scope_spec.rb +45 -2
  454. data/spec/unit/parser/type_loader_spec.rb +159 -175
  455. data/spec/unit/pops/binder/binder_spec.rb +62 -0
  456. data/spec/unit/pops/binder/bindings_checker_spec.rb +196 -0
  457. data/spec/unit/pops/binder/bindings_composer_spec.rb +89 -0
  458. data/spec/unit/pops/binder/bindings_validator_factory_spec.rb +18 -0
  459. data/spec/unit/pops/binder/config/binder_config_spec.rb +48 -0
  460. data/spec/unit/pops/binder/hiera2/bindings_provider_spec.rb +74 -0
  461. data/spec/unit/pops/binder/hiera2/config_spec.rb +61 -0
  462. data/spec/unit/pops/binder/hiera2/yaml_backend_spec.rb +33 -0
  463. data/spec/unit/pops/binder/injector_spec.rb +789 -0
  464. data/spec/unit/pops/containment_spec.rb +1 -0
  465. data/spec/unit/pops/issues_spec.rb +1 -1
  466. data/spec/unit/pops/parser/evaluating_parser_spec.rb +88 -0
  467. data/spec/unit/pops/parser/lexer_spec.rb +1 -1
  468. data/spec/unit/pops/parser/parse_calls_spec.rb +4 -0
  469. data/spec/unit/pops/parser/parser_spec.rb +1 -1
  470. data/spec/unit/pops/types/type_calculator_spec.rb +484 -0
  471. data/spec/unit/pops/types/type_factory_spec.rb +65 -0
  472. data/spec/unit/pops/types/type_parser_spec.rb +93 -0
  473. data/spec/unit/property/list_spec.rb +1 -1
  474. data/spec/unit/property/ordered_list_spec.rb +1 -1
  475. data/spec/unit/provider/aixobject_spec.rb +101 -0
  476. data/spec/unit/provider/augeas/augeas_spec.rb +14 -3
  477. data/spec/unit/provider/mcx/mcxcontent_spec.rb +52 -16
  478. data/spec/unit/provider/mount/parsed_spec.rb +44 -56
  479. data/spec/unit/provider/mount_spec.rb +11 -2
  480. data/spec/unit/provider/naginator_spec.rb +8 -0
  481. data/spec/unit/provider/package/apt_spec.rb +5 -1
  482. data/spec/unit/provider/package/aptitude_spec.rb +9 -5
  483. data/spec/unit/provider/package/aptrpm_spec.rb +2 -2
  484. data/spec/unit/provider/package/dpkg_spec.rb +274 -99
  485. data/spec/unit/provider/package/openbsd_spec.rb +84 -1
  486. data/spec/unit/provider/package/opkg_spec.rb +3 -3
  487. data/spec/unit/provider/package/pip_spec.rb +16 -0
  488. data/spec/unit/provider/package/pkgdmg_spec.rb +62 -7
  489. data/spec/unit/provider/package/rpm_spec.rb +112 -21
  490. data/spec/unit/provider/package/urpmi.rb +80 -0
  491. data/spec/unit/provider/package/windows/exe_package_spec.rb +1 -1
  492. data/spec/unit/provider/package/yum_spec.rb +85 -0
  493. data/spec/unit/provider/package/zypper_spec.rb +25 -6
  494. data/spec/unit/provider/parsedfile_spec.rb +3 -2
  495. data/spec/unit/provider/service/init_spec.rb +10 -10
  496. data/spec/unit/provider/service/openrc_spec.rb +16 -0
  497. data/spec/unit/provider/service/openwrt_spec.rb +1 -1
  498. data/spec/unit/provider/service/redhat_spec.rb +7 -0
  499. data/spec/unit/provider/ssh_authorized_key/parsed_spec.rb +2 -2
  500. data/spec/unit/provider/user/aix_spec.rb +89 -0
  501. data/spec/unit/provider/user/directoryservice_spec.rb +11 -4
  502. data/spec/unit/provider/user/user_role_add_spec.rb +18 -0
  503. data/spec/unit/provider_spec.rb +2 -13
  504. data/spec/unit/reports/http_spec.rb +1 -1
  505. data/spec/unit/resource/catalog_spec.rb +23 -97
  506. data/spec/unit/resource/resource_type.json +34 -0
  507. data/spec/unit/resource/status_spec.rb +56 -0
  508. data/spec/unit/resource/type_collection_spec.rb +6 -6
  509. data/spec/unit/resource/type_spec.rb +25 -5
  510. data/spec/unit/resource_spec.rb +68 -24
  511. data/spec/unit/run_spec.rb +16 -0
  512. data/spec/unit/scheduler/scheduler_spec.rb +14 -27
  513. data/spec/unit/semver_spec.rb +5 -0
  514. data/spec/unit/settings/enum_setting_spec.rb +27 -0
  515. data/spec/unit/settings_spec.rb +53 -44
  516. data/spec/unit/ssl/certificate_authority_spec.rb +155 -19
  517. data/spec/unit/transaction/additional_resource_generator_spec.rb +419 -0
  518. data/spec/unit/transaction/event_manager_spec.rb +2 -2
  519. data/spec/unit/transaction/event_spec.rb +57 -0
  520. data/spec/unit/transaction/report_spec.rb +66 -0
  521. data/spec/unit/transaction/resource_harness_spec.rb +27 -20
  522. data/spec/unit/transaction_spec.rb +182 -390
  523. data/spec/unit/type/augeas_spec.rb +3 -3
  524. data/spec/unit/type/component_spec.rb +0 -9
  525. data/spec/unit/type/computer_spec.rb +1 -1
  526. data/spec/unit/type/cron_spec.rb +2 -2
  527. data/spec/unit/type/exec_spec.rb +4 -2
  528. data/spec/unit/type/file/content_spec.rb +11 -0
  529. data/spec/unit/type/file/group_spec.rb +1 -1
  530. data/spec/unit/type/file_spec.rb +16 -8
  531. data/spec/unit/type/mount_spec.rb +445 -259
  532. data/spec/unit/type/package_spec.rb +4 -4
  533. data/spec/unit/type/resources_spec.rb +30 -1
  534. data/spec/unit/type/user_spec.rb +26 -3
  535. data/spec/unit/type/yumrepo_spec.rb +7 -27
  536. data/spec/unit/type/zone_spec.rb +4 -1
  537. data/spec/unit/type_spec.rb +66 -33
  538. data/spec/unit/util/backups_spec.rb +3 -3
  539. data/spec/unit/util/http_proxy_spec.rb +83 -0
  540. data/spec/unit/util/log_spec.rb +79 -8
  541. data/spec/unit/util/metric_spec.rb +12 -0
  542. data/spec/unit/util/monkey_patches_spec.rb +6 -0
  543. data/spec/unit/util/network_device/config_spec.rb +26 -64
  544. data/spec/unit/util/pidlock_spec.rb +4 -1
  545. data/spec/unit/util/tagging_spec.rb +5 -9
  546. data/spec/unit/util/warnings_spec.rb +1 -1
  547. data/spec/unit/util/watched_file_spec.rb +52 -0
  548. data/spec/unit/util/watcher/periodic_watcher_spec.rb +52 -0
  549. data/spec/unit/util/watcher_spec.rb +56 -0
  550. data/spec/unit/util_spec.rb +16 -0
  551. metadata +2767 -2576
  552. data/ext/debian/puppet.manpages +0 -32
  553. data/ext/osx/PackageInfo.plist +0 -36
  554. data/ext/osx/createpackage.sh +0 -187
  555. data/ext/redhat/rundir-perms.patch +0 -28
  556. data/lib/puppet/external/base64.rb +0 -19
  557. data/lib/puppet/util/graph.rb +0 -27
  558. data/lib/puppet/util/loadedfile.rb +0 -61
  559. data/lib/puppet/util/log_paths.rb +0 -22
  560. data/lib/puppet/util/subclass_loader.rb +0 -78
  561. data/spec/monkey_patches/publicize_methods.rb +0 -11
  562. data/spec/unit/util/loadedfile_spec.rb +0 -71
@@ -44,8 +44,12 @@ module Puppet::Pops::Issues
44
44
  # Create a Message Data where all hash keys become methods for convenient interpolation
45
45
  # in issue text.
46
46
  msgdata = MessageData.new(*arg_names)
47
- # Evaluate the message block in the msg data's binding
48
- msgdata.format(hash, &message_block)
47
+ begin
48
+ # Evaluate the message block in the msg data's binding
49
+ msgdata.format(hash, &message_block)
50
+ rescue StandardError => e
51
+ raise RuntimeError, "Error while reporting issue: #{issue_code}. #{e.message}", caller
52
+ end
49
53
  end
50
54
  end
51
55
 
@@ -91,8 +95,8 @@ module Puppet::Pops::Issues
91
95
  #
92
96
  # @param issue_code [Symbol] the issue code for the issue used as an identifier, should be the same as the constant
93
97
  # the issue is bound to.
94
- # @param *args [Symbol] required arguments that must be passed when formatting the message, may be empty
95
- # @param &block [Proc] a block producing the message string, evaluated in a MessageData scope. The produced string
98
+ # @param args [Symbol] required arguments that must be passed when formatting the message, may be empty
99
+ # @param block [Proc] a block producing the message string, evaluated in a MessageData scope. The produced string
96
100
  # should not end with a period as additional information may be appended.
97
101
  #
98
102
  # @see MessageData
@@ -123,7 +127,7 @@ module Puppet::Pops::Issues
123
127
  # @todo configuration
124
128
  #
125
129
  NAME_WITH_HYPHEN = issue :NAME_WITH_HYPHEN, :name do
126
- "#{label.a_an_uc(semantic)} may not have a name contain a hyphen. The name '#{name}' is not legal"
130
+ "#{label.a_an_uc(semantic)} may not have a name containing a hyphen. The name '#{name}' is not legal"
127
131
  end
128
132
 
129
133
  # When a variable name contains a hyphen and these are illegal.
@@ -93,7 +93,7 @@ class Puppet::Pops::Model::AstTransformer
93
93
  end
94
94
 
95
95
  def transform_ArithmeticExpression(o)
96
- ast o, AST::ArithmeticOperator, :lval => transform(o.left_expr), :rval=>transform(o.right_expr),
96
+ ast o, AST::ArithmeticOperator2, :lval => transform(o.left_expr), :rval=>transform(o.right_expr),
97
97
  :operator => o.operator.to_s
98
98
  end
99
99
 
@@ -533,7 +533,7 @@ class Puppet::Pops::Model::AstTransformer
533
533
  def transform_IfExpression(o)
534
534
  args = { :test => transform(o.test), :statements => transform(o.then_expr) }
535
535
  args[:else] = transform(o.else_expr) # Tests say Nop should be there (unless is_nop? o.else_expr), probably not needed
536
- result = ast o, AST::IfStatement, args
536
+ ast o, AST::IfStatement, args
537
537
  end
538
538
 
539
539
  # Unless is not an AST object, instead an AST::IfStatement is used with an AST::Not around the test
@@ -541,9 +541,9 @@ class Puppet::Pops::Model::AstTransformer
541
541
  def transform_UnlessExpression(o)
542
542
  args = { :test => ast(o, AST::Not, :value => transform(o.test)),
543
543
  :statements => transform(o.then_expr) }
544
- # AST 3.1 does not allow else on unless in the grammar, but it is ok since unless is encoded as a if !x
544
+ # AST 3.1 does not allow else on unless in the grammar, but it is ok since unless is encoded as an if !x
545
545
  args.merge!({:else => transform(o.else_expr)}) unless is_nop?(o.else_expr)
546
- result = ast o, AST::IfStatement, args
546
+ ast o, AST::IfStatement, args
547
547
  end
548
548
 
549
549
  # Puppet 3.1 AST only supports calling a function by name (it is not possible to produce a function
@@ -131,7 +131,7 @@ class Puppet::Pops::Model::AstTreeDumper < Puppet::Pops::Model::TreeDumper
131
131
 
132
132
  if o.is_a? String
133
133
  o # A Ruby String, not quoted
134
- elsif n = Puppet::Pops::Utils.to_n(o.value)
134
+ elsif Puppet::Pops::Utils.to_n(o.value)
135
135
  o.value # AST::String that is a number without quotes
136
136
  else
137
137
  "'#{o.value}'" # AST::String that is not a number
@@ -11,6 +11,8 @@ class Puppet::Pops::Model::Factory
11
11
 
12
12
  attr_accessor :current
13
13
 
14
+ alias_method :model, :current
15
+
14
16
  # Shared build_visitor, since there are many instances of Factory being used
15
17
  @@build_visitor = Puppet::Pops::Visitor.new(self, "build")
16
18
  # Initialize a factory with a single object, or a class with arguments applied to build of
@@ -180,10 +182,14 @@ class Puppet::Pops::Model::Factory
180
182
  end
181
183
 
182
184
  # Builds body :) from different kinds of input
183
- # @param body [nil] unchanged, produces nil
184
- # @param body [Array<Expression>] turns into a BlockExpression
185
- # @param body [Expression] produces the given expression
186
- # @param body [Object] produces the result of calling #build with body as argument
185
+ # @overload f_build_body(nothing)
186
+ # @param nothing [nil] unchanged, produces nil
187
+ # @overload f_build_body(array)
188
+ # @param array [Array<Expression>] turns into a BlockExpression
189
+ # @overload f_build_body(expr)
190
+ # @param expr [Expression] produces the given expression
191
+ # @overload f_build_body(obj)
192
+ # @param obj [Object] produces the result of calling #build with body as argument
187
193
  def f_build_body(body)
188
194
  case body
189
195
  when NilClass
@@ -429,7 +435,7 @@ class Puppet::Pops::Model::Factory
429
435
  # Does nothing if file is nil.
430
436
  #
431
437
  # @param file [String,nil] the file/path to the origin, may contain URI scheme of file: or some other URI scheme
432
- # @returns [Factory] returns self
438
+ # @return [Factory] returns self
433
439
  #
434
440
  def record_origin(file)
435
441
  return self unless file
@@ -457,11 +463,11 @@ class Puppet::Pops::Model::Factory
457
463
  a.documentation = doc_string
458
464
  end
459
465
 
460
- # Returns symbolic information about a expected share of a resource expression given the LHS of a resource expr.
466
+ # Returns symbolic information about an expected share of a resource expression given the LHS of a resource expr.
461
467
  #
462
468
  # * `name { }` => `:resource`, create a resource of the given type
463
- # * `Name { }` => ':defaults`, set defauls for the referenced type
464
- # * `Name[] { }` => `:override`, ioverrides nstances referenced by LHS
469
+ # * `Name { }` => ':defaults`, set defaults for the referenced type
470
+ # * `Name[] { }` => `:override`, overrides instances referenced by LHS
465
471
  # * _any other_ => ':error', all other are considered illegal
466
472
  #
467
473
  def self.resource_shape(expr)
@@ -657,14 +663,20 @@ class Puppet::Pops::Model::Factory
657
663
  memo[-1] = Puppet::Pops::Model::Factory.IMPORT(expr.is_a?(Array) ? expr : [expr])
658
664
  else
659
665
  memo[-1] = Puppet::Pops::Model::Factory.CALL_NAMED(name, false, expr.is_a?(Array) ? expr : [expr])
666
+ if expr.is_a?(Model::CallNamedFunctionExpression)
667
+ # Patch statement function call to expression style
668
+ # This is needed because it is first parsed as a "statement" and the requirement changes as it becomes
669
+ # an argument to the name to call transform above.
670
+ expr.rval_required = true
671
+ end
660
672
  end
661
673
  else
662
674
  memo << expr
663
- end
664
- if expr.is_a?(Model::CallNamedFunctionExpression)
665
- # patch expression function call to statement style
666
- # TODO: This is kind of meaningless, but to make it compatible...
667
- expr.rval_required = false
675
+ if expr.is_a?(Model::CallNamedFunctionExpression)
676
+ # Patch rvalue expression function call to statement style.
677
+ # This is not really required but done to be AST model compliant
678
+ expr.rval_required = false
679
+ end
668
680
  end
669
681
  memo
670
682
  end
@@ -5,7 +5,7 @@
5
5
  # It describes a Metamodel containing DSL instructions, a description of PuppetType and related
6
6
  # classes needed to evaluate puppet logic.
7
7
  # The metamodel resembles the existing AST model, but it is a semantic model of instructions and
8
- # the types that they operate on rather than a Abstract Syntax Tree, although closely related.
8
+ # the types that they operate on rather than an Abstract Syntax Tree, although closely related.
9
9
  #
10
10
  # The metamodel is anemic (has no behavior) except basic datatype and type
11
11
  # assertions and reference/containment assertions.
@@ -25,9 +25,9 @@ class Puppet::Pops::Model::TreeDumper
25
25
  parts.each_index do |i|
26
26
  if i > 0
27
27
  # separate with space unless previous ends with whitepsace or (
28
- result << ' ' if parts[i] != ")" && parts[i-1] !~ /.*(?:\s+|\()$/ && parts[i] !~ /\s+/
28
+ result << ' ' if parts[i] != ")" && parts[i-1] !~ /.*(?:\s+|\()$/ && parts[i] !~ /^\s+/
29
29
  end
30
- result << parts[i]
30
+ result << parts[i].to_s
31
31
  end
32
32
  result
33
33
  end
@@ -706,7 +706,6 @@ end
706
706
 
707
707
  ---- header ----
708
708
  require 'puppet'
709
- require 'puppet/util/loadedfile'
710
709
  require 'puppet/pops'
711
710
 
712
711
  module Puppet
@@ -7,7 +7,6 @@
7
7
  require 'racc/parser.rb'
8
8
 
9
9
  require 'puppet'
10
- require 'puppet/util/loadedfile'
11
10
  require 'puppet/pops'
12
11
 
13
12
  module Puppet
@@ -21,7 +20,7 @@ module Puppet
21
20
  module Parser
22
21
  class Parser < Racc::Parser
23
22
 
24
- module_eval(<<'...end egrammar.ra/module_eval...', 'egrammar.ra', 719)
23
+ module_eval(<<'...end egrammar.ra/module_eval...', 'egrammar.ra', 718)
25
24
 
26
25
  # Make emacs happy
27
26
  # Local Variables:
@@ -0,0 +1,162 @@
1
+
2
+ # Does not support "import" and parsing ruby files
3
+ #
4
+ class Puppet::Pops::Parser::EvaluatingParser
5
+
6
+ def initialize()
7
+ @parser = Puppet::Pops::Parser::Parser.new()
8
+ end
9
+
10
+ def parse_string(s, file_source = 'unknown')
11
+ @file_source = file_source
12
+ clear()
13
+ # Handling of syntax error can be much improved (in general), now it bails out of the parser
14
+ # and does not have as rich information (when parsing a string), need to update it with the file source
15
+ # (ideally, a syntax error should be entered as an issue, and not just thrown - but that is a general problem
16
+ # and an improvement that can be made in the eparser (rather than here).
17
+ # Also a possible improvement (if the YAML parser returns positions) is to provide correct output of position.
18
+ #
19
+ begin
20
+ assert_and_report(@parser.parse_string(s))
21
+ rescue Puppet::ParseError => e
22
+ e.file = @file_source unless e.file
23
+ raise e
24
+ end
25
+ end
26
+
27
+ def parse_file(file)
28
+ @file_source = file
29
+ clear()
30
+ assert_and_report(@parser.parse_file(file))
31
+ end
32
+
33
+ def evaluate_string(scope, s, file_source='unknown')
34
+ evaluate(scope, parse_string(s, file_source))
35
+ end
36
+
37
+ def evaluate_file(file)
38
+ evaluate(parse_file(file))
39
+ end
40
+
41
+ def clear()
42
+ @acceptor = nil
43
+ end
44
+
45
+ def evaluate(scope, model)
46
+ return nil unless model
47
+ ast = Puppet::Pops::Model::AstTransformer.new(@file_source, nil).transform(model)
48
+ return nil unless ast
49
+ ast.safeevaluate(scope)
50
+ end
51
+
52
+ def acceptor()
53
+ @acceptor ||= Puppet::Pops::Validation::Acceptor.new
54
+ @acceptor
55
+ end
56
+
57
+ def validator()
58
+ @validator ||= Puppet::Pops::Validation::ValidatorFactory_3_1.new().validator(acceptor)
59
+ end
60
+
61
+ def assert_and_report(parse_result)
62
+ return nil unless parse_result
63
+ # make sure the result has an origin (if parsed from a string)
64
+ unless Puppet::Pops::Adapters::OriginAdapter.get(parse_result.model)
65
+ Puppet::Pops::Adapters::OriginAdapter.adapt(parse_result.model).origin = @file_source
66
+ end
67
+ validator.validate(parse_result)
68
+
69
+ max_errors = Puppet[:max_errors]
70
+ max_warnings = Puppet[:max_warnings] + 1
71
+ max_deprecations = Puppet[:max_deprecations] + 1
72
+
73
+ # If there are warnings output them
74
+ warnings = acceptor.warnings
75
+ if warnings.size > 0
76
+ formatter = Puppet::Pops::Validation::DiagnosticFormatterPuppetStyle.new
77
+ emitted_w = 0
78
+ emitted_dw = 0
79
+ acceptor.warnings.each {|w|
80
+ if w.severity == :deprecation
81
+ # Do *not* call Puppet.deprecation_warning it is for internal deprecation, not
82
+ # deprecation of constructs in manifests! (It is not designed for that purpose even if
83
+ # used throughout the code base).
84
+ #
85
+ Puppet.warning(formatter.format(w)) if emitted_dw < max_deprecations
86
+ emitted_dw += 1
87
+ else
88
+ Puppet.warning(formatter.format(w)) if emitted_w < max_warnings
89
+ emitted_w += 1
90
+ end
91
+ break if emitted_w > max_warnings && emitted_dw > max_deprecations # but only then
92
+ }
93
+ end
94
+
95
+ # If there were errors, report the first found. Use a puppet style formatter.
96
+ errors = acceptor.errors
97
+ if errors.size > 0
98
+ formatter = Puppet::Pops::Validation::DiagnosticFormatterPuppetStyle.new
99
+ if errors.size == 1 || max_errors <= 1
100
+ # raise immediately
101
+ require 'debugger'; debugger
102
+ raise Puppet::ParseError.new(formatter.format(errors[0]))
103
+ end
104
+ emitted = 0
105
+ errors.each do |e|
106
+ Puppet.err(formatter.format(e))
107
+ emitted += 1
108
+ break if emitted >= max_errors
109
+ end
110
+ warnings_message = warnings.size > 0 ? ", and #{warnings.size} warnings" : ""
111
+ giving_up_message = "Found #{errors.size} errors#{warnings_message}. Giving up"
112
+ exception = Puppet::ParseError.new(giving_up_message)
113
+ exception.file = errors[0].file
114
+ raise exception
115
+ end
116
+ parse_result
117
+ end
118
+
119
+ def quote(x)
120
+ self.class.quote(x)
121
+ end
122
+
123
+ # Translates an already parsed string that contains control characters, quotes
124
+ # and backslashes into a quoted string where all such constructs have been escaped.
125
+ # Parsing the return value of this method using the puppet parser should yield
126
+ # exactly the same string as the argument passed to this method
127
+ #
128
+ # The method makes an exception for the two character sequences \$ and \s. They
129
+ # will not be escaped since they have a special meaning in puppet syntax.
130
+ #
131
+ # @param x [String] The string to quote and "unparse"
132
+ # @return [String] The quoted string
133
+ #
134
+ def self.quote(x)
135
+ escaped = '"'
136
+ p = nil
137
+ x.each_char do |c|
138
+ case p
139
+ when nil
140
+ # do nothing
141
+ when "\t"
142
+ escaped << '\\t'
143
+ when "\n"
144
+ escaped << '\\n'
145
+ when "\f"
146
+ escaped << '\\f'
147
+ # TODO: \cx is a range of characters - skip for now
148
+ # when "\c"
149
+ # escaped << '\\c'
150
+ when '"'
151
+ escaped << '\\"'
152
+ when '\\'
153
+ escaped << if c == '$' || c == 's'; p; else '\\\\'; end # don't escape \ when followed by s or $
154
+ else
155
+ escaped << p
156
+ end
157
+ p = c
158
+ end
159
+ escaped << p unless p.nil?
160
+ escaped << '"'
161
+ end
162
+ end
@@ -31,10 +31,14 @@ class Puppet::Pops::Parser::Lexer
31
31
  attr_accessor :regex, :name, :string, :skip, :skip_text
32
32
  alias skip? skip
33
33
 
34
- # @param string_or_regex[String] a literal string token matcher
35
- # @param string_or_regex[Regexp] a regular expression token text matcher
36
- # @param name [String] the token name (what it is known as in the grammar)
37
- # @param options [Hash] see {#set_options}
34
+ # @overload initialize(string)
35
+ # @param string [String] a literal string token matcher
36
+ # @param name [String] the token name (what it is known as in the grammar)
37
+ # @param options [Hash] see {#set_options}
38
+ # @overload initialize(regex)
39
+ # @param regex [Regexp] a regular expression token text matcher
40
+ # @param name [String] the token name (what it is known as in the grammar)
41
+ # @param options [Hash] see {#set_options}
38
42
  #
39
43
  def initialize(string_or_regex, name, options = {})
40
44
  if string_or_regex.is_a?(String)
@@ -565,7 +569,6 @@ class Puppet::Pops::Parser::Lexer
565
569
  skip
566
570
 
567
571
  until token_queue.empty? and @scanner.eos? do
568
- yielded = false
569
572
  offset = @scanner.pos
570
573
  matched_token, value = find_token
571
574
  end_offset = @scanner.pos
@@ -646,7 +649,6 @@ class Puppet::Pops::Parser::Lexer
646
649
  # we search for the next quote that isn't preceded by a
647
650
  # backslash; the caret is there to match empty strings
648
651
  last = @scanner.matched
649
- tmp_offset = @scanner.pos
650
652
  str = @scanner.scan_until(/([^\\]|^|[^\\])([\\]{2})*[#{terminators}]/) || lex_error(positioned_message("Unclosed quote after #{format_quote(last)} followed by '#{followed_by}'"))
651
653
  str.gsub!(/\\(.)/m) {
652
654
  ch = $1
@@ -0,0 +1,118 @@
1
+ require 'rgen/metamodel_builder'
2
+
3
+ # The ClassLoader provides a Class instance given a class name or a meta-type.
4
+ # If the class is not already loaded, it is loaded using the Puppet Autoloader.
5
+ # This means it can load a class from a gem, or from puppet modules.
6
+ #
7
+ class Puppet::Pops::Types::ClassLoader
8
+ @autoloader = Puppet::Util::Autoload.new("ClassLoader", "", :wrap => false)
9
+
10
+ # Returns a Class given a fully qualified class name.
11
+ # Lookup of class is never relative to the calling namespace.
12
+ # @param name [String, Array<String>, Array<Symbol>, Puppet::Pops::Types::PObjectType] A fully qualified
13
+ # class name String (e.g. '::Foo::Bar', 'Foo::Bar'), a PObjectType, or a fully qualified name in Array form where each part
14
+ # is either a String or a Symbol, e.g. `%w{Puppetx Puppetlabs SomeExtension}`.
15
+ # @return [Class, nil] the looked up class or nil if no such class is loaded
16
+ # @raise ArgumentError If the given argument has the wrong type
17
+ # @api public
18
+ #
19
+ def self.provide(name)
20
+ case name
21
+ when String
22
+ provide_from_string(name)
23
+
24
+ when Array
25
+ provide_from_name_path(name.join('::'), name)
26
+
27
+ when Puppet::Pops::Types::PObjectType, Puppet::Pops::Types::PType
28
+ provide_from_type(name)
29
+
30
+ else
31
+ raise ArgumentError, "Cannot provide a class from a '#{name.class.name}'"
32
+ end
33
+ end
34
+
35
+ private
36
+
37
+ def self.provide_from_type(type)
38
+ case type
39
+ when Puppet::Pops::Types::PRubyType
40
+ provide_from_string(type.ruby_class)
41
+
42
+ when Puppet::Pops::Types::PBooleanType
43
+ # There is no other thing to load except this Enum meta type
44
+ RGen::MetamodelBuilder::MMBase::Boolean
45
+
46
+ when Puppet::Pops::Types::PType
47
+ # TODO: PType should have a type argument (a PObjectType)
48
+ Class
49
+
50
+ # Although not expected to be the first choice for getting a concrete class for these
51
+ # types, these are of value if the calling logic just has a reference to type.
52
+ #
53
+ when Puppet::Pops::Types::PArrayType ; Array
54
+ when Puppet::Pops::Types::PHashType ; Hash
55
+ when Puppet::Pops::Types::PPatternType ; Regexp
56
+ when Puppet::Pops::Types::PIntegerType ; Integer
57
+ when Puppet::Pops::Types::PStringType ; String
58
+ when Puppet::Pops::Types::PFloatType ; Float
59
+ when Puppet::Pops::Types::PNilType ; NilClass
60
+ else
61
+ nil
62
+ end
63
+ end
64
+
65
+ def self.provide_from_string(name)
66
+ name_path = name.split('::')
67
+ # always from the root, so remove an empty first segment
68
+ if name_path[0].empty?
69
+ name_path = name_path[1..-1]
70
+ end
71
+ provide_from_name_path(name, name_path)
72
+ end
73
+
74
+ def self.provide_from_name_path(name, name_path)
75
+ # If class is already loaded, try this first
76
+ result = find_class(name_path)
77
+
78
+ unless result.is_a?(Class)
79
+ # Attempt to load it using the auto loader
80
+ loaded_path = nil
81
+ if paths_for_name(name).find {|path| loaded_path = path; @autoloader.load(path) }
82
+ result = find_class(name_path)
83
+ unless result.is_a?(Class)
84
+ raise RuntimeError, "Loading of #{name} using relative path: '#{loaded_path}' did not create expected class"
85
+ end
86
+ end
87
+ end
88
+ return nil unless result.is_a?(Class)
89
+ result
90
+ end
91
+
92
+ def self.find_class(name_path)
93
+ name_path.reduce(Object) do |ns, name|
94
+ begin
95
+ ns.const_get(name)
96
+ rescue NameError
97
+ return nil
98
+ end
99
+ end
100
+ end
101
+
102
+ def self.paths_for_name(fq_name)
103
+ [de_camel(fq_name), downcased_path(fq_name)]
104
+ end
105
+
106
+ def self.downcased_path(fq_name)
107
+ fq_name.to_s.gsub(/::/, '/').downcase
108
+ end
109
+
110
+ def self.de_camel(fq_name)
111
+ fq_name.to_s.gsub(/::/, '/').
112
+ gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
113
+ gsub(/([a-z\d])([A-Z])/,'\1_\2').
114
+ tr("-", "_").
115
+ downcase
116
+ end
117
+
118
+ end