puppet 4.8.2-universal-darwin → 4.9.0-universal-darwin

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 (348) hide show
  1. checksums.yaml +15 -0
  2. data/CONTRIBUTING.md +25 -1
  3. data/Gemfile +6 -0
  4. data/Rakefile +1 -0
  5. data/ext/project_data.yaml +5 -1
  6. data/ext/windows/service/daemon.rb +2 -1
  7. data/install.rb +43 -6
  8. data/lib/hiera/puppet_function.rb +15 -17
  9. data/lib/hiera/scope.rb +12 -14
  10. data/lib/puppet/application/face_base.rb +4 -0
  11. data/lib/puppet/application/lookup.rb +4 -2
  12. data/lib/puppet/application/resource.rb +1 -1
  13. data/lib/puppet/data_providers/data_adapter.rb +6 -0
  14. data/lib/puppet/data_providers/data_function_support.rb +7 -0
  15. data/lib/puppet/data_providers/function_env_data_provider.rb +7 -0
  16. data/lib/puppet/data_providers/function_module_data_provider.rb +6 -0
  17. data/lib/puppet/data_providers/hiera_config.rb +31 -10
  18. data/lib/puppet/data_providers/hiera_env_data_provider.rb +6 -0
  19. data/lib/puppet/data_providers/hiera_interpolate.rb +2 -1
  20. data/lib/puppet/data_providers/hiera_module_data_provider.rb +6 -0
  21. data/lib/puppet/data_providers/hiera_support.rb +6 -0
  22. data/lib/puppet/data_providers/json_data_provider_factory.rb +12 -0
  23. data/lib/puppet/data_providers/yaml_data_provider_factory.rb +12 -0
  24. data/lib/puppet/data_providers.rb +6 -3
  25. data/lib/puppet/defaults.rb +25 -4
  26. data/lib/puppet/face/ca.rb +2 -0
  27. data/lib/puppet/face/certificate_request.rb +2 -0
  28. data/lib/puppet/face/certificate_revocation_list.rb +2 -0
  29. data/lib/puppet/face/file.rb +3 -0
  30. data/lib/puppet/face/help/face.erb +3 -0
  31. data/lib/puppet/face/help.rb +19 -17
  32. data/lib/puppet/face/key.rb +1 -0
  33. data/lib/puppet/face/man.rb +4 -2
  34. data/lib/puppet/face/module/generate.rb +1 -1
  35. data/lib/puppet/face/status.rb +2 -0
  36. data/lib/puppet/feature/base.rb +9 -2
  37. data/lib/puppet/feature/hocon.rb +3 -0
  38. data/lib/puppet/file_system/windows.rb +8 -0
  39. data/lib/puppet/file_system.rb +15 -3
  40. data/lib/puppet/forge/repository.rb +1 -2
  41. data/lib/puppet/forge.rb +6 -6
  42. data/lib/puppet/functions/binary_file.rb +4 -10
  43. data/lib/puppet/functions/hiera_array.rb +1 -1
  44. data/lib/puppet/functions/hiera_include.rb +1 -1
  45. data/lib/puppet/functions/hocon_data.rb +24 -0
  46. data/lib/puppet/functions/json_data.rb +18 -0
  47. data/lib/puppet/functions/yaml_data.rb +21 -0
  48. data/lib/puppet/generate/type.rb +1 -1
  49. data/lib/puppet/graph/simple_graph.rb +4 -2
  50. data/lib/puppet/indirector/file_bucket_file/file.rb +10 -2
  51. data/lib/puppet/indirector/request.rb +5 -1
  52. data/lib/puppet/interface/face_collection.rb +1 -1
  53. data/lib/puppet/interface.rb +14 -2
  54. data/lib/puppet/module.rb +14 -2
  55. data/lib/puppet/module_tool/applications/builder.rb +3 -2
  56. data/lib/puppet/module_tool/applications/installer.rb +14 -14
  57. data/lib/puppet/module_tool/applications/upgrader.rb +13 -13
  58. data/lib/puppet/module_tool/installed_modules.rb +7 -7
  59. data/lib/puppet/module_tool/local_tarball.rb +3 -3
  60. data/lib/puppet/module_tool/metadata.rb +1 -1
  61. data/lib/puppet/module_tool.rb +4 -4
  62. data/lib/puppet/network/http/connection.rb +2 -0
  63. data/lib/puppet/network/http/webrick.rb +2 -1
  64. data/lib/puppet/parser/functions/hiera.rb +14 -0
  65. data/lib/puppet/parser/functions/hiera_array.rb +14 -0
  66. data/lib/puppet/parser/functions/hiera_hash.rb +14 -0
  67. data/lib/puppet/parser/functions/hiera_include.rb +14 -0
  68. data/lib/puppet/parser/scope.rb +14 -20
  69. data/lib/puppet/plugins/data_providers/data_provider.rb +108 -17
  70. data/lib/puppet/plugins/data_providers/registry.rb +2 -36
  71. data/lib/puppet/plugins/data_providers.rb +2 -0
  72. data/lib/puppet/pops/adaptable.rb +0 -3
  73. data/lib/puppet/pops/binder/producers.rb +3 -3
  74. data/lib/puppet/pops/evaluator/access_operator.rb +4 -4
  75. data/lib/puppet/pops/evaluator/closure.rb +1 -1
  76. data/lib/puppet/pops/evaluator/compare_operator.rb +4 -4
  77. data/lib/puppet/pops/evaluator/evaluator_impl.rb +1 -1
  78. data/lib/puppet/pops/issues.rb +4 -0
  79. data/lib/puppet/pops/label_provider.rb +14 -0
  80. data/lib/puppet/pops/loader/loader_paths.rb +3 -1
  81. data/lib/puppet/pops/loader/module_loaders.rb +21 -7
  82. data/lib/puppet/pops/loader/typed_name.rb +0 -2
  83. data/lib/puppet/pops/loaders.rb +31 -12
  84. data/lib/puppet/pops/lookup/configured_data_provider.rb +87 -0
  85. data/lib/puppet/pops/lookup/context.rb +121 -71
  86. data/lib/puppet/pops/lookup/data_adapter.rb +27 -0
  87. data/lib/puppet/pops/lookup/data_dig_function_provider.rb +55 -0
  88. data/lib/puppet/pops/lookup/data_hash_function_provider.rb +111 -0
  89. data/lib/puppet/pops/lookup/data_provider.rb +102 -0
  90. data/lib/puppet/pops/lookup/environment_data_provider.rb +27 -0
  91. data/lib/puppet/pops/lookup/explainer.rb +122 -82
  92. data/lib/puppet/pops/lookup/function_provider.rb +82 -0
  93. data/lib/puppet/pops/lookup/global_data_provider.rb +49 -0
  94. data/lib/puppet/pops/lookup/hiera_config.rb +601 -0
  95. data/lib/puppet/pops/lookup/interpolation.rb +56 -35
  96. data/lib/puppet/pops/lookup/invocation.rb +179 -101
  97. data/lib/puppet/pops/lookup/location_resolver.rb +72 -0
  98. data/lib/puppet/pops/lookup/lookup_adapter.rb +451 -0
  99. data/lib/puppet/pops/lookup/lookup_key.rb +99 -0
  100. data/lib/puppet/pops/lookup/lookup_key_function_provider.rb +119 -0
  101. data/lib/puppet/pops/lookup/module_data_provider.rb +58 -0
  102. data/lib/puppet/pops/lookup/sub_lookup.rb +8 -4
  103. data/lib/puppet/pops/lookup.rb +4 -3
  104. data/lib/puppet/pops/merge_strategy.rb +120 -39
  105. data/lib/puppet/pops/parser/egrammar.ra +2 -0
  106. data/lib/puppet/pops/parser/eparser.rb +816 -808
  107. data/lib/puppet/pops/parser/locator.rb +3 -3
  108. data/lib/puppet/pops/parser/slurp_support.rb +4 -3
  109. data/lib/puppet/pops/pcore.rb +21 -12
  110. data/lib/puppet/pops/serialization/abstract_reader.rb +17 -7
  111. data/lib/puppet/pops/serialization/abstract_writer.rb +27 -12
  112. data/lib/puppet/pops/serialization/deserializer.rb +17 -4
  113. data/lib/puppet/pops/serialization/extension.rb +37 -8
  114. data/lib/puppet/pops/serialization/object.rb +14 -6
  115. data/lib/puppet/pops/serialization/rgen.rb +2 -1
  116. data/lib/puppet/pops/serialization/serializer.rb +30 -7
  117. data/lib/puppet/pops/types/implementation_registry.rb +1 -1
  118. data/lib/puppet/pops/types/p_object_type.rb +55 -12
  119. data/lib/puppet/pops/types/p_sem_ver_range_type.rb +27 -27
  120. data/lib/puppet/pops/types/p_sem_ver_type.rb +12 -12
  121. data/lib/puppet/pops/types/p_timespan_type.rb +6 -6
  122. data/lib/puppet/pops/types/p_timestamp_type.rb +2 -2
  123. data/lib/puppet/pops/types/p_type_set_type.rb +7 -16
  124. data/lib/puppet/pops/types/recursion_guard.rb +64 -20
  125. data/lib/puppet/pops/types/ruby_generator.rb +10 -0
  126. data/lib/puppet/pops/types/type_calculator.rb +23 -13
  127. data/lib/puppet/pops/types/type_factory.rb +20 -9
  128. data/lib/puppet/pops/types/type_formatter.rb +37 -17
  129. data/lib/puppet/pops/types/type_mismatch_describer.rb +7 -6
  130. data/lib/puppet/pops/types/type_parser.rb +6 -0
  131. data/lib/puppet/pops/types/types.rb +225 -132
  132. data/lib/puppet/pops/validation/checker4_0.rb +12 -2
  133. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
  134. data/lib/puppet/pops/validation.rb +1 -1
  135. data/lib/puppet/pops/visitor.rb +4 -3
  136. data/lib/puppet/pops.rb +6 -9
  137. data/lib/puppet/provider/mcx/mcxcontent.rb +2 -1
  138. data/lib/puppet/provider/nameservice.rb +15 -0
  139. data/lib/puppet/provider/package/appdmg.rb +1 -1
  140. data/lib/puppet/provider/package/dnf.rb +1 -1
  141. data/lib/puppet/provider/package/pkg.rb +1 -1
  142. data/lib/puppet/provider/package/pkgdmg.rb +1 -1
  143. data/lib/puppet/provider/package/pkgng.rb +1 -1
  144. data/lib/puppet/provider/package/rpm.rb +2 -2
  145. data/lib/puppet/provider/service/smf.rb +3 -3
  146. data/lib/puppet/provider/service/systemd.rb +5 -1
  147. data/lib/puppet/provider/user/directoryservice.rb +1 -0
  148. data/lib/puppet/provider/user/user_role_add.rb +15 -0
  149. data/lib/puppet/provider/yumrepo/inifile.rb +2 -2
  150. data/lib/puppet/provider/zone/solaris.rb +4 -1
  151. data/lib/puppet/reference/indirection.rb +1 -1
  152. data/lib/puppet/resource/catalog.rb +12 -4
  153. data/lib/puppet/resource/type.rb +3 -3
  154. data/lib/puppet/resource.rb +2 -3
  155. data/lib/puppet/settings/config_file.rb +2 -1
  156. data/lib/puppet/settings/directory_setting.rb +6 -0
  157. data/lib/puppet/settings/environment_conf.rb +6 -2
  158. data/lib/puppet/settings/file_or_directory_setting.rb +6 -0
  159. data/lib/puppet/settings/file_setting.rb +10 -0
  160. data/lib/puppet/settings.rb +1 -1
  161. data/lib/puppet/ssl/certificate_authority.rb +13 -2
  162. data/lib/puppet/ssl/host.rb +23 -1
  163. data/lib/puppet/transaction/additional_resource_generator.rb +7 -0
  164. data/lib/puppet/type/user.rb +16 -3
  165. data/lib/puppet/util/execution.rb +3 -3
  166. data/lib/puppet/util/filetype.rb +11 -5
  167. data/lib/puppet/util/logging.rb +2 -1
  168. data/lib/puppet/util/network_device/config.rb +1 -1
  169. data/lib/puppet/util/plist.rb +6 -0
  170. data/lib/puppet/util/profiler/aggregate.rb +1 -1
  171. data/lib/puppet/util/rdoc/generators/puppet_generator.rb +2 -2
  172. data/lib/puppet/util/rdoc/parser/puppet_parser_core.rb +2 -1
  173. data/lib/puppet/util/windows/adsi.rb +15 -12
  174. data/lib/puppet/util.rb +1 -0
  175. data/lib/puppet/vendor/load_semantic_puppet.rb +1 -0
  176. data/lib/puppet/vendor/pathspec/lib/pathspec.rb +2 -1
  177. data/lib/puppet/vendor/require_vendored.rb +0 -1
  178. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/graph.rb +2 -2
  179. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/graph_node.rb +2 -2
  180. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/dependency/module_release.rb +58 -0
  181. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/source.rb +2 -2
  182. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/unsatisfiable_graph.rb +2 -2
  183. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency.rb +7 -7
  184. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/gem_version.rb +3 -0
  185. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/locales/config.yaml +21 -0
  186. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/version.rb +48 -21
  187. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/version_range.rb +15 -17
  188. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet.rb +17 -0
  189. data/lib/puppet/version.rb +1 -1
  190. data/lib/puppet.rb +52 -0
  191. data/lib/semver.rb +19 -12
  192. data/locales/config.yaml +29 -0
  193. data/locales/puppet.pot +79 -0
  194. data/man/man5/puppet.conf.5 +1 -1
  195. data/spec/fixtures/unit/application/environments/puppet_func_provider/functions/{data.pp → environment/data.pp} +0 -0
  196. data/spec/fixtures/unit/data_providers/environments/hiera_misc/data/common.yaml +2 -0
  197. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/data/common.yaml +1 -1
  198. data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/hiera.yaml +5 -0
  199. data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/lib/puppet/bindings/backend/default.rb +9 -0
  200. data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/lib/puppet_x/backend/special_data_provider_factory.rb +23 -0
  201. data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/manifests/init.pp +5 -0
  202. data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/metadata.json +9 -0
  203. data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/lib/puppet_x/helindbe/sample_env_data.rb +1 -0
  204. data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/manifests/init.pp +1 -1
  205. data/spec/fixtures/unit/functions/lookup/data/common.yaml +19 -0
  206. data/spec/fixtures/unit/functions/lookup_fixture/data/common.yaml +19 -0
  207. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/environment.conf +0 -0
  208. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/lib/puppet/functions/environment/data.rb +0 -0
  209. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/abc/lib/puppet/bindings/abc/default.rb +0 -0
  210. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/abc/lib/puppet/functions/abc/data.rb +0 -0
  211. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/abc/manifests/init.pp +0 -0
  212. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bad_data/lib/puppet/bindings/bad_data/default.rb +0 -0
  213. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bad_data/lib/puppet/functions/bad_data/data.rb +0 -0
  214. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bad_data/manifests/init.pp +0 -0
  215. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bca/lib/puppet/bindings/bca/default.rb +0 -0
  216. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bca/lib/puppet/functions/bca/data.rb +0 -0
  217. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bca/manifests/init.pp +0 -0
  218. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_json/data/empty.json +0 -0
  219. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_json/hiera.yaml +0 -0
  220. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_json/manifests/init.pp +0 -0
  221. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_json/metadata.json +0 -0
  222. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_json/data/empty_key.json +0 -0
  223. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_json/hiera.yaml +0 -0
  224. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_json/manifests/init.pp +0 -0
  225. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_json/metadata.json +0 -0
  226. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_yaml/data/empty_key.yaml +0 -0
  227. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_yaml/hiera.yaml +0 -0
  228. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_yaml/manifests/init.pp +0 -0
  229. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_yaml/metadata.json +0 -0
  230. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_yaml/data/empty.yaml +0 -0
  231. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_yaml/hiera.yaml +0 -0
  232. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_yaml/manifests/init.pp +0 -0
  233. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_yaml/metadata.json +0 -0
  234. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/hieraprovider/data/first.json +0 -0
  235. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/hieraprovider/hiera.yaml +0 -0
  236. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/hieraprovider/manifests/init.pp +0 -0
  237. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/hieraprovider/metadata.json +0 -0
  238. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/meta/lib/puppet/functions/meta/data.rb +0 -0
  239. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/meta/manifests/init.pp +0 -0
  240. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/meta/metadata.json +0 -0
  241. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/metawcp/lib/puppet/bindings/metawcp/default.rb +0 -0
  242. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/metawcp/lib/puppet_x/thallgren/sample_module_data.rb +0 -0
  243. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/metawcp/manifests/init.pp +0 -0
  244. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/metawcp/metadata.json +0 -0
  245. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/no_provider/manifests/init.pp +0 -0
  246. data/spec/integration/application/apply_spec.rb +88 -2
  247. data/spec/integration/application/lookup_spec.rb +155 -0
  248. data/spec/integration/data_binding_spec.rb +5 -5
  249. data/spec/integration/defaults_spec.rb +13 -0
  250. data/spec/integration/environments/default_manifest_spec.rb +16 -16
  251. data/spec/integration/environments/setting_hooks_spec.rb +1 -1
  252. data/spec/integration/test/test_helper_spec.rb +6 -2
  253. data/spec/integration/transaction_spec.rb +74 -0
  254. data/spec/integration/util/execution_spec.rb +8 -0
  255. data/spec/lib/puppet_spec/module_tool/shared_functions.rb +2 -2
  256. data/spec/lib/puppet_spec/module_tool/stub_source.rb +1 -1
  257. data/spec/lib/puppet_spec/unindent.rb +2 -2
  258. data/spec/unit/application/face_base_spec.rb +16 -0
  259. data/spec/unit/application/lookup_spec.rb +262 -227
  260. data/spec/unit/data_providers/{sample_data_provider_spec.rb → custom_data_provider_spec.rb} +14 -16
  261. data/spec/unit/data_providers/function_data_provider_spec.rb +2 -2
  262. data/spec/unit/data_providers/hiera_data_provider_spec.rb +60 -97
  263. data/spec/unit/defaults_spec.rb +1 -1
  264. data/spec/unit/face/ca_spec.rb +10 -0
  265. data/spec/unit/face/certificate_request_spec.rb +10 -0
  266. data/spec/unit/face/certificate_revocation_list_spec.rb +10 -0
  267. data/spec/unit/face/file_spec.rb +4 -0
  268. data/spec/unit/face/help_spec.rb +17 -0
  269. data/spec/unit/face/key_spec.rb +10 -0
  270. data/spec/unit/face/status_spec.rb +10 -0
  271. data/spec/unit/file_system_spec.rb +143 -6
  272. data/spec/unit/functions/binary_file_spec.rb +1 -1
  273. data/spec/unit/functions/hiera_spec.rb +257 -47
  274. data/spec/unit/functions/lookup_fixture_spec.rb +693 -0
  275. data/spec/unit/functions/lookup_spec.rb +1319 -608
  276. data/spec/unit/functions/new_spec.rb +3 -3
  277. data/spec/unit/graph/rb_tree_map_spec.rb +1 -1
  278. data/spec/unit/graph/simple_graph_spec.rb +1 -1
  279. data/spec/unit/hiera/scope_spec.rb +4 -4
  280. data/spec/unit/indirector/request_spec.rb +9 -0
  281. data/spec/unit/interface_spec.rb +27 -0
  282. data/spec/unit/man_spec.rb +1 -1
  283. data/spec/unit/module_spec.rb +1 -1
  284. data/spec/unit/module_tool/applications/builder_spec.rb +16 -1
  285. data/spec/unit/module_tool/applications/installer_spec.rb +1 -1
  286. data/spec/unit/module_tool/applications/upgrader_spec.rb +1 -1
  287. data/spec/unit/module_tool/installed_modules_spec.rb +6 -6
  288. data/spec/unit/module_tool_spec.rb +3 -3
  289. data/spec/unit/network/http/connection_spec.rb +10 -0
  290. data/spec/unit/network/http/webrick_spec.rb +1 -1
  291. data/spec/unit/pops/evaluator/access_ops_spec.rb +2 -2
  292. data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +9 -9
  293. data/spec/unit/pops/loaders/environment_loader_spec.rb +172 -0
  294. data/spec/unit/pops/lookup/context_spec.rb +45 -16
  295. data/spec/unit/pops/lookup/interpolation_spec.rb +28 -20
  296. data/spec/unit/pops/lookup/lookup_spec.rb +197 -0
  297. data/spec/unit/pops/merge_strategy_spec.rb +18 -0
  298. data/spec/unit/pops/parser/lexer2_spec.rb +16 -1
  299. data/spec/unit/pops/parser/parse_site_spec.rb +4 -0
  300. data/spec/unit/pops/serialization/packer_spec.rb +4 -23
  301. data/spec/unit/pops/serialization/serialization_spec.rb +32 -8
  302. data/spec/unit/pops/types/p_object_type_spec.rb +68 -3
  303. data/spec/unit/pops/types/p_sem_ver_type_spec.rb +4 -4
  304. data/spec/unit/pops/types/p_type_set_type_spec.rb +31 -2
  305. data/spec/unit/pops/types/type_acceptor_spec.rb +18 -17
  306. data/spec/unit/pops/types/type_calculator_spec.rb +39 -40
  307. data/spec/unit/pops/types/type_factory_spec.rb +3 -3
  308. data/spec/unit/pops/types/type_formatter_spec.rb +7 -3
  309. data/spec/unit/pops/types/type_mismatch_describer_spec.rb +13 -2
  310. data/spec/unit/pops/types/types_spec.rb +25 -2
  311. data/spec/unit/pops/validator/validator_spec.rb +60 -4
  312. data/spec/unit/provider/nameservice_spec.rb +42 -0
  313. data/spec/unit/provider/package/aptrpm_spec.rb +1 -1
  314. data/spec/unit/provider/package/pkg_spec.rb +22 -0
  315. data/spec/unit/provider/package/pkgng_spec.rb +12 -0
  316. data/spec/unit/provider/package/rpm_spec.rb +8 -8
  317. data/spec/unit/provider/service/smf_spec.rb +13 -11
  318. data/spec/unit/provider/service/systemd_spec.rb +8 -1
  319. data/spec/unit/provider/user/useradd_spec.rb +1 -0
  320. data/spec/unit/puppet_spec.rb +14 -0
  321. data/spec/unit/resource/catalog_spec.rb +15 -9
  322. data/spec/unit/resource_spec.rb +20 -17
  323. data/spec/unit/semver_spec.rb +14 -0
  324. data/spec/unit/ssl/certificate_authority_spec.rb +12 -1
  325. data/spec/unit/transaction/additional_resource_generator_spec.rb +11 -0
  326. data/spec/unit/type/user_spec.rb +32 -6
  327. data/spec/unit/util/filetype_spec.rb +3 -3
  328. data/spec/unit/util/yaml_spec.rb +1 -1
  329. data/spec/unit/util_spec.rb +10 -2
  330. data/tasks/i18n.rake +20 -0
  331. metadata +2661 -2595
  332. data/lib/puppet/data_providers/lookup_adapter.rb +0 -254
  333. data/lib/puppet/vendor/load_semantic.rb +0 -1
  334. data/lib/puppet/vendor/semantic/Gemfile +0 -20
  335. data/lib/puppet/vendor/semantic/PUPPET_README.md +0 -6
  336. data/lib/puppet/vendor/semantic/Rakefile +0 -69
  337. data/lib/puppet/vendor/semantic/lib/semantic/dependency/module_release.rb +0 -60
  338. data/lib/puppet/vendor/semantic/lib/semantic.rb +0 -7
  339. data/lib/puppet/vendor/semantic/spec/spec_helper.rb +0 -24
  340. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/graph_node_spec.rb +0 -141
  341. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/graph_spec.rb +0 -162
  342. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/module_release_spec.rb +0 -143
  343. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/source_spec.rb +0 -5
  344. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/unsatisfiable_graph_spec.rb +0 -44
  345. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency_spec.rb +0 -383
  346. data/lib/puppet/vendor/semantic/spec/unit/semantic/version_range_spec.rb +0 -307
  347. data/lib/puppet/vendor/semantic/spec/unit/semantic/version_spec.rb +0 -608
  348. data/spec/fixtures/unit/data_providers/environments/sample/manifests/site.pp +0 -6
@@ -171,10 +171,23 @@ module Puppet
171
171
 
172
172
  newproperty(:comment) do
173
173
  desc "A description of the user. Generally the user's full name."
174
- if RUBY_VERSION < "2.1.0"
175
- munge do |v|
176
- v.respond_to?(:force_encoding) ? v.force_encoding(Encoding::ASCII_8BIT) : v
174
+ def insync?(is)
175
+ # nameservice provider requires special attention to encoding
176
+ # Overrides Puppet::Property#insync?
177
+ if !@should.empty? && provider.respond_to?(:comments_insync?)
178
+ return provider.comments_insync?(is, @should)
179
+ end
180
+ super(is)
181
+ end
182
+
183
+ # In the case that our comments have incompatible encodings, set external
184
+ # encoding to support concatenation for display.
185
+ # overrides Puppet::Property#change_to_s
186
+ def change_to_s(currentvalue, newvalue)
187
+ if newvalue.respond_to?(:force_encoding) && !Encoding.compatible?(currentvalue, newvalue)
188
+ return super(currentvalue, newvalue.dup.force_encoding(currentvalue.encoding))
177
189
  end
190
+ super(currentvalue, newvalue)
178
191
  end
179
192
  end
180
193
 
@@ -184,9 +184,9 @@ module Puppet::Util::Execution
184
184
  null_file = Puppet.features.microsoft_windows? ? 'NUL' : '/dev/null'
185
185
 
186
186
  begin
187
- stdin = File.open(options[:stdinfile] || null_file, 'r')
188
- stdout = options[:squelch] ? File.open(null_file, 'w') : Puppet::FileSystem::Uniquefile.new('puppet')
189
- stderr = options[:combine] ? stdout : File.open(null_file, 'w')
187
+ stdin = Puppet::FileSystem.open(options[:stdinfile] || null_file, nil, 'r')
188
+ stdout = options[:squelch] ? Puppet::FileSystem.open(null_file, nil, 'w') : Puppet::FileSystem::Uniquefile.new('puppet')
189
+ stderr = options[:combine] ? stdout : Puppet::FileSystem.open(null_file, nil, 'w')
190
190
 
191
191
  exec_args = [command, options, stdin, stdout, stderr]
192
192
 
@@ -105,7 +105,9 @@ class Puppet::Util::FileType
105
105
  # Read the file.
106
106
  def read
107
107
  if Puppet::FileSystem.exist?(@path)
108
- File.read(@path)
108
+ # this code path is used by many callers so the original default is
109
+ # being explicitly preserved
110
+ Puppet::FileSystem.read(@path, :encoding => Encoding.default_external)
109
111
  else
110
112
  return nil
111
113
  end
@@ -118,7 +120,8 @@ class Puppet::Util::FileType
118
120
 
119
121
  # Overwrite the file.
120
122
  def write(text)
121
- tf = Tempfile.new("puppet")
123
+ # this file is managed by the OS and should be using system encoding
124
+ tf = Tempfile.new("puppet", :encoding => Encoding.default_external)
122
125
  tf.print text; tf.flush
123
126
  File.chmod(@default_mode, tf.path) if @default_mode
124
127
  FileUtils.cp(tf.path, @path)
@@ -197,7 +200,8 @@ class Puppet::Util::FileType
197
200
  # Overwrite a specific @path's cron tab; must be passed the @path name
198
201
  # and the text with which to create the cron tab.
199
202
  def write(text)
200
- IO.popen("#{cmdbase()} -", "w") { |p|
203
+ # this file is managed by the OS and should be using system encoding
204
+ IO.popen("#{cmdbase()} -", "w", :encoding => Encoding.default_external) { |p|
201
205
  p.print text
202
206
  }
203
207
  end
@@ -242,7 +246,8 @@ class Puppet::Util::FileType
242
246
  # Overwrite a specific @path's cron tab; must be passed the @path name
243
247
  # and the text with which to create the cron tab.
244
248
  def write(text)
245
- output_file = Tempfile.new("puppet_suntab")
249
+ # this file is managed by the OS and should be using system encoding
250
+ output_file = Tempfile.new("puppet_suntab", :encoding => Encoding.default_external)
246
251
  begin
247
252
  output_file.print text
248
253
  output_file.close
@@ -284,7 +289,8 @@ class Puppet::Util::FileType
284
289
  # Overwrite a specific @path's cron tab; must be passed the @path name
285
290
  # and the text with which to create the cron tab.
286
291
  def write(text)
287
- output_file = Tempfile.new("puppet_aixtab")
292
+ # this file is managed by the OS and should be using system encoding
293
+ output_file = Tempfile.new("puppet_aixtab", :encoding => Encoding.default_external)
288
294
 
289
295
  begin
290
296
  output_file.print text
@@ -224,7 +224,8 @@ module Logging
224
224
  # find the same offender, and we'd end up logging it again.
225
225
  $logged_deprecation_warnings ||= {}
226
226
 
227
- File.open(deprecations_file, "a") do |f|
227
+ # Deprecation messages are UTF-8 as they are produced by Ruby
228
+ Puppet::FileSystem.open(deprecations_file, nil, "a:UTF-8") do |f|
228
229
  if ($deprecation_warnings) then
229
230
  $deprecation_warnings.each do |offender, message|
230
231
  if (! $logged_deprecation_warnings.has_key?(offender)) then
@@ -59,7 +59,7 @@ class Puppet::Util::NetworkDevice::Config
59
59
  device.options = { :debug => false }
60
60
  Puppet.debug "found device: #{device.name} at #{device.line}"
61
61
  devices[name] = device
62
- when /^\s*(type|url|debug)(\s+(.+))*$/
62
+ when /^\s*(type|url|debug)(\s+(.+)\s*)*$/
63
63
  parse_directive(device, $1, $3, count)
64
64
  else
65
65
  raise Puppet::Error, "Invalid line #{count}: #{line}"
@@ -78,6 +78,12 @@ module Puppet::Util::Plist
78
78
  # stubbing purposes
79
79
  #
80
80
  # @api private
81
+ #
82
+ # @param args [String] Extra file operation mode information to use
83
+ # (defaults to read-only mode 'r')
84
+ # This is the standard mechanism Ruby uses in the IO class, and therefore
85
+ # encoding may be explicitly like fmode : encoding or fmode : "BOM|UTF-*"
86
+ # for example, a:ASCII or w+:UTF-8
81
87
  def open_file_with_args(file, args)
82
88
  File.open(file, args).read
83
89
  end
@@ -42,7 +42,7 @@ class Puppet::Util::Profiler::Aggregate < Puppet::Util::Profiler::WallClock
42
42
  end
43
43
 
44
44
  def print_metrics(metrics_hash, prefix)
45
- metrics_hash.sort_by {|k,v| v.time }.reverse.each do |k,v|
45
+ metrics_hash.sort_by {|k,v| v.time }.reverse_each do |k,v|
46
46
  @logger.call("#{prefix}#{k}: #{v.time} s (#{v.count} calls)")
47
47
  print_metrics(metrics_hash[k], "#{prefix}#{k} -> ")
48
48
  end
@@ -225,7 +225,7 @@ module Generators
225
225
  'style_url' => style_url('', @options.css),
226
226
  }
227
227
 
228
- File.open(filename, "w") do |f|
228
+ Puppet::FileSystem.open(filename, nil, "w:UTF-8") do |f|
229
229
  template.write_html_on(f, values)
230
230
  end
231
231
  end
@@ -301,7 +301,7 @@ module Generators
301
301
  values["plugins"] = res4 if res4.size>0
302
302
  values["nodes"] = res5 if res5.size>0
303
303
 
304
- File.open(filename, "w") do |f|
304
+ Puppet::FileSystem.open(filename, nil, "w:UTF-8") do |f|
305
305
  template.write_html_on(f, values)
306
306
  end
307
307
  end
@@ -104,7 +104,8 @@ module RDoc::PuppetParserCore
104
104
  comment = ""
105
105
  %w{README README.rdoc}.each do |rfile|
106
106
  readme = File.join(File.dirname(File.dirname(@input_file_name)), rfile)
107
- comment = File.open(readme,"r") { |f| f.read } if FileTest.readable?(readme)
107
+ # module README should be UTF-8, not default system encoding
108
+ comment = File.open(readme,"r:UTF-8") { |f| f.read } if FileTest.readable?(readme)
108
109
  end
109
110
  look_for_directives_in(container, comment) unless comment.empty?
110
111
 
@@ -195,10 +195,9 @@ module Puppet::Util::Windows::ADSI
195
195
  end
196
196
 
197
197
  def [](attribute)
198
- value = native_user.Get(attribute)
199
- # Rubys WIN32OLE errantly converts UTF-16 values to Encoding.default_external
200
- return value.encode(Encoding::UTF_8) if value.is_a?(String)
201
- value
198
+ # Setting WIN32OLE.codepage in the microsoft_windows feature ensures
199
+ # values are returned as UTF-8
200
+ native_user.Get(attribute)
202
201
  end
203
202
 
204
203
  def []=(attribute, value)
@@ -248,8 +247,9 @@ module Puppet::Util::Windows::ADSI
248
247
  # https://msdn.microsoft.com/en-us/library/aa746342.aspx
249
248
  # WIN32OLE objects aren't enumerable, so no map
250
249
  groups = []
251
- # Rubys WIN32OLE errantly converts UTF-16 values to Encoding.default_external
252
- native_user.Groups.each {|g| groups << g.Name.encode(Encoding::UTF_8)} rescue nil
250
+ # Setting WIN32OLE.codepage in the microsoft_windows feature ensures
251
+ # values are returned as UTF-8
252
+ native_user.Groups.each {|g| groups << g.Name} rescue nil
253
253
  groups
254
254
  end
255
255
 
@@ -372,8 +372,9 @@ module Puppet::Util::Windows::ADSI
372
372
 
373
373
  users = []
374
374
  wql.each do |u|
375
- # Rubys WIN32OLE errantly converts UTF-16 values to Encoding.default_external
376
- users << new(u.name.encode(Encoding::UTF_8))
375
+ # Setting WIN32OLE.codepage in the microsoft_windows feature ensures
376
+ # values are returned as UTF-8
377
+ users << new(u.name)
377
378
  end
378
379
 
379
380
  users.each(&block)
@@ -465,8 +466,9 @@ module Puppet::Util::Windows::ADSI
465
466
  def members
466
467
  # WIN32OLE objects aren't enumerable, so no map
467
468
  members = []
468
- # Rubys WIN32OLE errantly converts UTF-16 values to Encoding.default_external
469
- native_group.Members.each {|m| members << m.Name.encode(Encoding::UTF_8)}
469
+ # Setting WIN32OLE.codepage in the microsoft_windows feature ensures
470
+ # values are returned as UTF-8
471
+ native_group.Members.each {|m| members << m.Name}
470
472
  members
471
473
  end
472
474
 
@@ -535,8 +537,9 @@ module Puppet::Util::Windows::ADSI
535
537
 
536
538
  groups = []
537
539
  wql.each do |g|
538
- # Rubys WIN32OLE errantly converts UTF-16 values to Encoding.default_external
539
- groups << new(g.name.encode(Encoding::UTF_8))
540
+ # Setting WIN32OLE.codepage in the microsoft_windows feature ensures
541
+ # values are returned as UTF-8
542
+ groups << new(g.name)
540
543
  end
541
544
 
542
545
  groups.each(&block)
data/lib/puppet/util.rb CHANGED
@@ -450,6 +450,7 @@ module Util
450
450
 
451
451
  begin
452
452
  file = Puppet::FileSystem.pathname(file)
453
+ # encoding for Uniquefile is not important here because the caller writes to it as it sees fit
453
454
  tempfile = Puppet::FileSystem::Uniquefile.new(Puppet::FileSystem.basename_string(file), Puppet::FileSystem.dir_string(file))
454
455
 
455
456
  # Set properties of the temporary file before we write the content, because
@@ -0,0 +1 @@
1
+ $: << File.join([File.dirname(__FILE__), "semantic_puppet/lib"])
@@ -75,7 +75,8 @@ class PathSpec
75
75
 
76
76
  # Generate specs from a filename, such as a .gitignore
77
77
  def self.from_filename(filename, type=:git)
78
- self.from_lines(File.open(filename, 'r'))
78
+ # .gitignore is a UTF-8 file
79
+ self.from_lines(File.open(filename, 'r', :encoding => Encoding::UTF_8), type)
79
80
  end
80
81
 
81
82
  def self.from_lines(lines, type=:git)
@@ -1,7 +1,6 @@
1
1
  # This adds upfront requirements on vendored code found under lib/vendor/x
2
2
  # Add one requirement per vendored package (or a comment if it is loaded on demand).
3
3
 
4
- # The vendored library 'semantic' is loaded on demand.
5
4
  # The vendored library 'rgen' is loaded on demand.
6
5
  # The vendored library 'pathspec' is loaded on demand.
7
6
  # The vendored library 'deep_merge' is loaded on demand.
@@ -1,6 +1,6 @@
1
- require 'semantic/dependency'
1
+ require 'semantic_puppet/dependency'
2
2
 
3
- module Semantic
3
+ module SemanticPuppet
4
4
  module Dependency
5
5
  class Graph
6
6
  include GraphNode
@@ -1,7 +1,7 @@
1
- require 'semantic/dependency'
1
+ require 'semantic_puppet/dependency'
2
2
  require 'set'
3
3
 
4
- module Semantic
4
+ module SemanticPuppet
5
5
  module Dependency
6
6
  module GraphNode
7
7
  include Comparable
@@ -0,0 +1,58 @@
1
+ require 'semantic_puppet/dependency'
2
+
3
+ module SemanticPuppet
4
+ module Dependency
5
+ class ModuleRelease
6
+ include GraphNode
7
+
8
+ attr_reader :name, :version
9
+
10
+ # Create a new instance of a module release.
11
+ #
12
+ # @param source [SemanticPuppet::Dependency::Source]
13
+ # @param name [String]
14
+ # @param version [SemanticPuppet::Version]
15
+ # @param dependencies [{String => SemanticPuppet::VersionRange}]
16
+ def initialize(source, name, version, dependencies = {})
17
+ @source = source
18
+ @name = name.freeze
19
+ @version = version.freeze
20
+
21
+ dependencies.each do |name, range|
22
+ add_constraint('initialize', name, range.to_s) do |node|
23
+ range === node.version
24
+ end
25
+
26
+ add_dependency(name)
27
+ end
28
+ end
29
+
30
+ def priority
31
+ @source.priority
32
+ end
33
+
34
+ def <=>(oth)
35
+ our_key = [ priority, name, version ]
36
+ their_key = [ oth.priority, oth.name, oth.version ]
37
+
38
+ return our_key <=> their_key
39
+ end
40
+
41
+ def eql?(other)
42
+ other.is_a?(ModuleRelease) &&
43
+ @name.eql?(other.name) &&
44
+ @version.eql?(other.version) &&
45
+ dependencies.eql?(other.dependencies)
46
+ end
47
+ alias == eql?
48
+
49
+ def hash
50
+ @name.hash ^ @version.hash
51
+ end
52
+
53
+ def to_s
54
+ "#<#{self.class} #{name}@#{version}>"
55
+ end
56
+ end
57
+ end
58
+ end
@@ -1,6 +1,6 @@
1
- require 'semantic/dependency'
1
+ require 'semantic_puppet/dependency'
2
2
 
3
- module Semantic
3
+ module SemanticPuppet
4
4
  module Dependency
5
5
  class Source
6
6
  def self.priority
@@ -1,6 +1,6 @@
1
- require 'semantic/dependency'
1
+ require 'semantic_puppet/dependency'
2
2
 
3
- module Semantic
3
+ module SemanticPuppet
4
4
  module Dependency
5
5
  class UnsatisfiableGraph < StandardError
6
6
  attr_reader :graph
@@ -1,15 +1,15 @@
1
- require 'semantic'
1
+ require 'semantic_puppet'
2
2
 
3
- module Semantic
3
+ module SemanticPuppet
4
4
  module Dependency
5
5
  extend self
6
6
 
7
- autoload :Graph, 'semantic/dependency/graph'
8
- autoload :GraphNode, 'semantic/dependency/graph_node'
9
- autoload :ModuleRelease, 'semantic/dependency/module_release'
10
- autoload :Source, 'semantic/dependency/source'
7
+ autoload :Graph, 'semantic_puppet/dependency/graph'
8
+ autoload :GraphNode, 'semantic_puppet/dependency/graph_node'
9
+ autoload :ModuleRelease, 'semantic_puppet/dependency/module_release'
10
+ autoload :Source, 'semantic_puppet/dependency/source'
11
11
 
12
- autoload :UnsatisfiableGraph, 'semantic/dependency/unsatisfiable_graph'
12
+ autoload :UnsatisfiableGraph, 'semantic_puppet/dependency/unsatisfiable_graph'
13
13
 
14
14
  # @!group Sources
15
15
 
@@ -0,0 +1,3 @@
1
+ module SemanticPuppet
2
+ VERSION = '0.1.4'
3
+ end
@@ -0,0 +1,21 @@
1
+ ---
2
+ # This is the project-specific configuration file for setting up
3
+ # fast_gettext for your project.
4
+ gettext:
5
+ # This is used for the name of the .pot and .po files; they will be
6
+ # called <project_name>.pot?
7
+ project_name: 'semantic_puppet'
8
+ # This is used in comments in the .pot and .po files to indicate what
9
+ # project the files belong to and should bea little more desctiptive than
10
+ # <project_name>
11
+ package_name: Semantic Puppet Gem
12
+ # The locale that the default messages in the .pot file are in
13
+ default_locale: en
14
+ # The email used for sending bug reports.
15
+ bugs_address: docs@puppetlabs.com
16
+ # The holder of the copyright.
17
+ copyright_holder: Puppet, Inc.
18
+ # Patterns for +Dir.glob+ used to find all files that might contain
19
+ # translatable content, relative to the project root directory
20
+ source_files:
21
+ - 'lib/**/*.rb'
@@ -1,8 +1,8 @@
1
- require 'semantic'
1
+ require 'semantic_puppet'
2
2
 
3
- module Semantic
3
+ module SemanticPuppet
4
4
 
5
- # @note Semantic::Version subclasses Numeric so that it has sane Range
5
+ # @note SemanticPuppet::Version subclasses Numeric so that it has sane Range
6
6
  # semantics in Ruby 1.9+.
7
7
  class Version < Numeric
8
8
  include Comparable
@@ -10,44 +10,47 @@ module Semantic
10
10
  class ValidationFailure < ArgumentError; end
11
11
 
12
12
  class << self
13
- LOOSE_REGEX = /
14
- \A
15
- (\d+)[.](\d+)[.](\d+) # Major . Minor . Patch
16
- (?: [-](.*?))? # Prerelease
17
- (?: [+](.*?))? # Build
18
- \Z
19
- /x
20
-
21
13
  # Parse a Semantic Version string.
22
14
  #
23
15
  # @param ver [String] the version string to parse
24
16
  # @return [Version] a comparable {Version} object
25
17
  def parse(ver)
26
- match, major, minor, patch, prerelease, build = *ver.match(LOOSE_REGEX)
18
+ match, major, minor, patch, prerelease, build = *ver.match(/\A#{REGEX_FULL}\Z/)
27
19
 
28
20
  if match.nil?
29
- raise 'Version numbers MUST begin with three dot-separated numbers'
30
- elsif [major, minor, patch].any? { |x| x =~ /^0\d+/ }
31
- raise 'Version numbers MUST NOT contain leading zeroes'
21
+ raise _("Unable to parse '%{version}' as a semantic version identifier") % {version: ver}
32
22
  end
33
23
 
34
24
  prerelease = parse_prerelease(prerelease) if prerelease
35
- build = parse_build_metadata(build) if build
25
+ # Build metadata is not yet supported in semantic_puppet, but we hope to.
26
+ # The following code prevents build metadata for now.
27
+ #build = parse_build_metadata(build) if build
28
+ if !build.nil?
29
+ raise _("'%{version}' MUST NOT include build identifiers") % {version: ver}
30
+ end
36
31
 
37
32
  self.new(major.to_i, minor.to_i, patch.to_i, prerelease, build)
38
33
  end
39
34
 
35
+ # Validate a Semantic Version string.
36
+ #
37
+ # @param ver [String] the version string to validate
38
+ # @return [bool] whether or not the string represents a valid Semantic Version
39
+ def valid?(ver)
40
+ !!(ver =~ /\A#{REGEX_FULL}\Z/)
41
+ end
42
+
40
43
  private
41
44
  def parse_prerelease(prerelease)
42
45
  subject = 'Prerelease identifiers'
43
46
  prerelease = prerelease.split('.', -1)
44
47
 
45
48
  if prerelease.empty? or prerelease.any? { |x| x.empty? }
46
- raise "#{subject} MUST NOT be empty"
49
+ raise _("%{subject} MUST NOT be empty") % {subject: subject}
47
50
  elsif prerelease.any? { |x| x =~ /[^0-9a-zA-Z-]/ }
48
- raise "#{subject} MUST use only ASCII alphanumerics and hyphens"
51
+ raise _("%{subject} MUST use only ASCII alphanumerics and hyphens") % {subject: subject}
49
52
  elsif prerelease.any? { |x| x =~ /^0\d+$/ }
50
- raise "#{subject} MUST NOT contain leading zeroes"
53
+ raise _("%{subject} MUST NOT contain leading zeroes") % {subject: subject}
51
54
  end
52
55
 
53
56
  return prerelease.map { |x| x =~ /^\d+$/ ? x.to_i : x }
@@ -58,9 +61,9 @@ module Semantic
58
61
  build = build.split('.', -1)
59
62
 
60
63
  if build.empty? or build.any? { |x| x.empty? }
61
- raise "#{subject} MUST NOT be empty"
64
+ raise _("%{subject} MUST NOT be empty") % {subject: subject}
62
65
  elsif build.any? { |x| x =~ /[^0-9a-zA-Z-]/ }
63
- raise "#{subject} MUST use only ASCII alphanumerics and hyphens"
66
+ raise _("%{subject} MUST use only ASCII alphanumerics and hyphens") % {subject: subject}
64
67
  end
65
68
 
66
69
  return build
@@ -112,6 +115,16 @@ module Semantic
112
115
  return compare_prerelease(other)
113
116
  end
114
117
 
118
+ def eql?(other)
119
+ other.is_a?(Version) &&
120
+ @major.eql?(other.major) &&
121
+ @minor.eql?(other.minor) &&
122
+ @patch.eql?(other.patch) &&
123
+ @prerelease.eql?(other.instance_variable_get(:@prerelease)) &&
124
+ @build.eql?(other.instance_variable_get(:@build))
125
+ end
126
+ alias == eql?
127
+
115
128
  def to_s
116
129
  "#{major}.#{minor}.#{patch}" +
117
130
  (@prerelease.nil? || prerelease.empty? ? '' : "-" + prerelease) +
@@ -164,5 +177,19 @@ module Semantic
164
177
  def first_prerelease
165
178
  self.class.new(@major, @minor, @patch, [])
166
179
  end
180
+
181
+ public
182
+
183
+ # Version string matching regexes
184
+ REGEX_NUMERIC = "(0|[1-9]\\d*)[.](0|[1-9]\\d*)[.](0|[1-9]\\d*)" # Major . Minor . Patch
185
+ REGEX_PRE = "(?:[-](.*?))?" # Prerelease
186
+ REGEX_BUILD = "(?:[+](.*?))?" # Build
187
+ REGEX_FULL = REGEX_NUMERIC + REGEX_PRE + REGEX_BUILD
188
+
189
+ # The lowest precedence Version possible
190
+ MIN = self.new(0, 0, 0, []).freeze
191
+
192
+ # The highest precedence Version possible
193
+ MAX = self.new((1.0/0.0), 0, 0).freeze
167
194
  end
168
195
  end
@@ -1,6 +1,6 @@
1
- require 'semantic'
1
+ require 'semantic_puppet'
2
2
 
3
- module Semantic
3
+ module SemanticPuppet
4
4
  class VersionRange < Range
5
5
  class << self
6
6
  # Parses a version range string into a comparable {VersionRange} instance.
@@ -46,7 +46,7 @@ module Semantic
46
46
  end
47
47
 
48
48
  rescue ArgumentError
49
- raise ArgumentError, "Unparsable version range: #{range_str.inspect}"
49
+ raise ArgumentError, _("Unparsable version range: %{range}") % {range: range_str.inspect}
50
50
  end
51
51
 
52
52
  private
@@ -123,7 +123,7 @@ module Semantic
123
123
  start = process_loose_expr(expr).last.send(:first_prerelease)
124
124
  end
125
125
 
126
- self.new(start, MAX_VERSION)
126
+ self.new(start, SemanticPuppet::Version::MAX)
127
127
  end
128
128
 
129
129
  # Returns a range covering all versions greater than or equal to the given
@@ -139,7 +139,7 @@ module Semantic
139
139
  start = process_loose_expr(expr).first.send(:first_prerelease)
140
140
  end
141
141
 
142
- self.new(start, MAX_VERSION)
142
+ self.new(start, SemanticPuppet::Version::MAX)
143
143
  end
144
144
 
145
145
  # Returns a range covering all versions less than the given `expr`.
@@ -154,7 +154,7 @@ module Semantic
154
154
  finish = process_loose_expr(expr).first.send(:first_prerelease)
155
155
  end
156
156
 
157
- self.new(MIN_VERSION, finish, true)
157
+ self.new(SemanticPuppet::Version::MIN, finish, true)
158
158
  end
159
159
 
160
160
  # Returns a range covering all versions less than or equal to the given
@@ -166,10 +166,10 @@ module Semantic
166
166
  def parse_lte_expression(expr)
167
167
  if expr =~ /^[^+]*-/
168
168
  finish = Version.parse(expr)
169
- self.new(MIN_VERSION, finish)
169
+ self.new(SemanticPuppet::Version::MIN, finish)
170
170
  else
171
171
  finish = process_loose_expr(expr).last.send(:first_prerelease)
172
- self.new(MIN_VERSION, finish, true)
172
+ self.new(SemanticPuppet::Version::MIN, finish, true)
173
173
  end
174
174
  end
175
175
 
@@ -190,7 +190,7 @@ module Semantic
190
190
  # @example "Reasonably close" minor version
191
191
  # "~1.2" # => (>=1.2.0 <1.3.0)
192
192
  # @example "Reasonably close" patch version
193
- # "~1.2.3" # => (1.2.3)
193
+ # "~1.2.3" # => (>=1.2.3 <1.3.0)
194
194
  # @example "Reasonably close" prerelease version
195
195
  # "~1.2.3-alpha" # => (>=1.2.3-alpha <1.2.4)
196
196
  #
@@ -201,6 +201,10 @@ module Semantic
201
201
 
202
202
  if parsed.stable?
203
203
  parsed = parsed.send(:first_prerelease)
204
+
205
+ # Handle the special case of "~1.2.3" expressions.
206
+ succ = succ.next(:minor) if ((parsed.major == succ.major) && (parsed.minor == succ.minor))
207
+
204
208
  succ = succ.send(:first_prerelease)
205
209
  self.new(parsed, succ, true)
206
210
  else
@@ -323,12 +327,6 @@ module Semantic
323
327
 
324
328
  private
325
329
 
326
- # The lowest precedence Version possible
327
- MIN_VERSION = Version.new(0, 0, 0, []).freeze
328
-
329
- # The highest precedence Version possible
330
- MAX_VERSION = Version.new((1.0/0.0), 0, 0).freeze
331
-
332
330
  # Determines whether this {VersionRange} has an earlier endpoint than the
333
331
  # give `other` range.
334
332
  #
@@ -342,13 +340,13 @@ module Semantic
342
340
  # Describes whether this range has an upper limit.
343
341
  # @return [Boolean] true if this range has no upper limit
344
342
  def open_end?
345
- self.end == MAX_VERSION
343
+ self.end == SemanticPuppet::Version::MAX
346
344
  end
347
345
 
348
346
  # Describes whether this range has a lower limit.
349
347
  # @return [Boolean] true if this range has no lower limit
350
348
  def open_begin?
351
- self.begin == MIN_VERSION
349
+ self.begin == SemanticPuppet::Version::MIN
352
350
  end
353
351
 
354
352
  # Describes whether this range follows the patterns for matching all
@@ -0,0 +1,17 @@
1
+ begin
2
+ require 'gettext-setup'
3
+ rescue LoadError
4
+ def _(msg)
5
+ msg
6
+ end
7
+ end
8
+
9
+ module SemanticPuppet
10
+ if defined?(GettextSetup)
11
+ GettextSetup.initialize(File.absolute_path('semantic_puppet/locales', File.dirname(__FILE__)))
12
+ end
13
+
14
+ autoload :Version, 'semantic_puppet/version'
15
+ autoload :VersionRange, 'semantic_puppet/version_range'
16
+ autoload :Dependency, 'semantic_puppet/dependency'
17
+ end