puppet 4.7.1 → 4.8.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of puppet might be problematic. Click here for more details.

Files changed (276) hide show
  1. data/Gemfile +0 -3
  2. data/MAINTAINERS +76 -0
  3. data/README.md +0 -6
  4. data/Rakefile +2 -2
  5. data/lib/puppet/agent.rb +3 -3
  6. data/lib/puppet/application/apply.rb +1 -1
  7. data/lib/puppet/configurer.rb +2 -2
  8. data/lib/puppet/data_providers.rb +1 -0
  9. data/lib/puppet/data_providers/data_adapter.rb +1 -0
  10. data/lib/puppet/data_providers/data_function_support.rb +1 -0
  11. data/lib/puppet/data_providers/function_env_data_provider.rb +1 -0
  12. data/lib/puppet/data_providers/function_module_data_provider.rb +1 -0
  13. data/lib/puppet/data_providers/hiera_config.rb +1 -0
  14. data/lib/puppet/data_providers/hiera_env_data_provider.rb +1 -0
  15. data/lib/puppet/data_providers/hiera_interpolate.rb +1 -0
  16. data/lib/puppet/data_providers/hiera_module_data_provider.rb +1 -0
  17. data/lib/puppet/data_providers/hiera_support.rb +1 -2
  18. data/lib/puppet/data_providers/json_data_provider_factory.rb +2 -0
  19. data/lib/puppet/data_providers/yaml_data_provider_factory.rb +2 -0
  20. data/lib/puppet/defaults.rb +20 -1
  21. data/lib/puppet/environments.rb +5 -2
  22. data/lib/puppet/face/catalog.rb +1 -1
  23. data/lib/puppet/face/epp.rb +57 -11
  24. data/lib/puppet/face/module/install.rb +6 -6
  25. data/lib/puppet/functions.rb +23 -24
  26. data/lib/puppet/functions/alert.rb +14 -0
  27. data/lib/puppet/functions/binary_file.rb +25 -0
  28. data/lib/puppet/functions/break.rb +22 -0
  29. data/lib/puppet/functions/contain.rb +33 -0
  30. data/lib/puppet/functions/crit.rb +14 -0
  31. data/lib/puppet/functions/debug.rb +14 -0
  32. data/lib/puppet/functions/emerg.rb +14 -0
  33. data/lib/puppet/functions/epp.rb +1 -1
  34. data/lib/puppet/functions/err.rb +14 -0
  35. data/lib/puppet/functions/find_file.rb +31 -0
  36. data/lib/puppet/functions/include.rb +21 -0
  37. data/lib/puppet/functions/info.rb +14 -0
  38. data/lib/puppet/functions/new.rb +1 -1
  39. data/lib/puppet/functions/next.rb +23 -0
  40. data/lib/puppet/functions/notice.rb +14 -0
  41. data/lib/puppet/functions/regsubst.rb +12 -16
  42. data/lib/puppet/functions/require.rb +37 -0
  43. data/lib/puppet/functions/return.rb +22 -0
  44. data/lib/puppet/functions/strftime.rb +35 -0
  45. data/lib/puppet/functions/warning.rb +14 -0
  46. data/lib/puppet/generate/models/type/type.rb +4 -0
  47. data/lib/puppet/generate/templates/type/pcore.erb +2 -1
  48. data/lib/puppet/indirector/face.rb +6 -1
  49. data/lib/puppet/network/http/error.rb +2 -2
  50. data/lib/puppet/network/http/handler.rb +2 -2
  51. data/lib/puppet/node/environment.rb +11 -0
  52. data/lib/puppet/parser/ast.rb +5 -0
  53. data/lib/puppet/parser/ast/pops_bridge.rb +17 -4
  54. data/lib/puppet/parser/compiler.rb +29 -1
  55. data/lib/puppet/parser/functions.rb +6 -0
  56. data/lib/puppet/parser/functions/assert_type.rb +1 -1
  57. data/lib/puppet/parser/functions/binary_file.rb +24 -0
  58. data/lib/puppet/parser/functions/break.rb +39 -0
  59. data/lib/puppet/parser/functions/contain.rb +7 -15
  60. data/lib/puppet/parser/functions/defined.rb +2 -2
  61. data/lib/puppet/parser/functions/dig.rb +1 -1
  62. data/lib/puppet/parser/functions/each.rb +1 -1
  63. data/lib/puppet/parser/functions/epp.rb +2 -2
  64. data/lib/puppet/parser/functions/filter.rb +1 -1
  65. data/lib/puppet/parser/functions/find_file.rb +28 -0
  66. data/lib/puppet/parser/functions/hiera.rb +4 -4
  67. data/lib/puppet/parser/functions/hiera_array.rb +1 -1
  68. data/lib/puppet/parser/functions/hiera_hash.rb +1 -1
  69. data/lib/puppet/parser/functions/hiera_include.rb +1 -1
  70. data/lib/puppet/parser/functions/include.rb +4 -8
  71. data/lib/puppet/parser/functions/inline_epp.rb +1 -1
  72. data/lib/puppet/parser/functions/lest.rb +1 -1
  73. data/lib/puppet/parser/functions/lookup.rb +4 -2
  74. data/lib/puppet/parser/functions/map.rb +1 -1
  75. data/lib/puppet/parser/functions/match.rb +1 -1
  76. data/lib/puppet/parser/functions/new.rb +414 -18
  77. data/lib/puppet/parser/functions/next.rb +38 -0
  78. data/lib/puppet/parser/functions/reduce.rb +1 -1
  79. data/lib/puppet/parser/functions/regsubst.rb +4 -2
  80. data/lib/puppet/parser/functions/require.rb +4 -27
  81. data/lib/puppet/parser/functions/return.rb +71 -0
  82. data/lib/puppet/parser/functions/reverse_each.rb +1 -1
  83. data/lib/puppet/parser/functions/scanf.rb +13 -8
  84. data/lib/puppet/parser/functions/slice.rb +1 -1
  85. data/lib/puppet/parser/functions/split.rb +1 -1
  86. data/lib/puppet/parser/functions/step.rb +1 -1
  87. data/lib/puppet/parser/functions/strftime.rb +185 -0
  88. data/lib/puppet/parser/functions/then.rb +1 -1
  89. data/lib/puppet/parser/functions/type.rb +1 -1
  90. data/lib/puppet/parser/functions/with.rb +3 -3
  91. data/lib/puppet/parser/resource.rb +8 -5
  92. data/lib/puppet/parser/scope.rb +1 -1
  93. data/lib/puppet/plugins/configuration.rb +8 -0
  94. data/lib/puppet/plugins/data_providers.rb +1 -0
  95. data/lib/puppet/plugins/data_providers/data_provider.rb +7 -28
  96. data/lib/puppet/plugins/data_providers/registry.rb +1 -0
  97. data/lib/puppet/pops.rb +4 -0
  98. data/lib/puppet/pops/evaluator/access_operator.rb +36 -5
  99. data/lib/puppet/pops/evaluator/closure.rb +81 -12
  100. data/lib/puppet/pops/evaluator/compare_operator.rb +24 -1
  101. data/lib/puppet/pops/evaluator/evaluator_impl.rb +29 -5
  102. data/lib/puppet/pops/evaluator/json_strict_literal_evaluator.rb +1 -1
  103. data/lib/puppet/pops/evaluator/runtime3_converter.rb +53 -62
  104. data/lib/puppet/pops/evaluator/runtime3_support.rb +15 -6
  105. data/lib/puppet/pops/functions/dispatch.rb +9 -2
  106. data/lib/puppet/pops/functions/dispatcher.rb +3 -1
  107. data/lib/puppet/pops/functions/function.rb +19 -2
  108. data/lib/puppet/pops/issues.rb +9 -0
  109. data/lib/puppet/pops/label_provider.rb +2 -2
  110. data/lib/puppet/pops/loader/loader.rb +17 -0
  111. data/lib/puppet/pops/loader/static_loader.rb +0 -41
  112. data/lib/puppet/pops/lookup.rb +12 -0
  113. data/lib/puppet/pops/lookup/context.rb +86 -0
  114. data/lib/puppet/pops/lookup/explainer.rb +46 -6
  115. data/lib/puppet/pops/lookup/invocation.rb +19 -0
  116. data/lib/puppet/pops/lookup/sub_lookup.rb +1 -1
  117. data/lib/puppet/pops/model/factory.rb +20 -8
  118. data/lib/puppet/pops/model/model_label_provider.rb +3 -0
  119. data/lib/puppet/pops/model/model_meta.rb +2 -0
  120. data/lib/puppet/pops/model/model_tree_dumper.rb +14 -0
  121. data/lib/puppet/pops/parser/egrammar.ra +11 -6
  122. data/lib/puppet/pops/parser/eparser.rb +1112 -1086
  123. data/lib/puppet/pops/parser/heredoc_support.rb +1 -2
  124. data/lib/puppet/pops/pcore.rb +1 -0
  125. data/lib/puppet/pops/puppet_stack.rb +3 -3
  126. data/lib/puppet/pops/resource/param.rb +5 -1
  127. data/lib/puppet/pops/resource/resource_type_impl.rb +8 -4
  128. data/lib/puppet/pops/resource/resource_type_set.pcore +1 -0
  129. data/lib/puppet/pops/serialization/abstract_reader.rb +19 -2
  130. data/lib/puppet/pops/serialization/abstract_writer.rb +16 -3
  131. data/lib/puppet/pops/serialization/deserializer.rb +5 -1
  132. data/lib/puppet/pops/serialization/extension.rb +2 -0
  133. data/lib/puppet/pops/serialization/json.rb +76 -26
  134. data/lib/puppet/pops/serialization/serializer.rb +5 -1
  135. data/lib/puppet/pops/serialization/time_factory.rb +2 -1
  136. data/lib/puppet/pops/time/timespan.rb +718 -0
  137. data/lib/puppet/pops/time/timestamp.rb +148 -0
  138. data/lib/puppet/pops/types/p_binary_type.rb +220 -0
  139. data/lib/puppet/pops/types/p_object_type.rb +12 -6
  140. data/lib/puppet/pops/types/p_sensitive_type.rb +5 -1
  141. data/lib/puppet/pops/types/p_timespan_type.rb +141 -0
  142. data/lib/puppet/pops/types/p_timestamp_type.rb +69 -0
  143. data/lib/puppet/pops/types/string_converter.rb +62 -0
  144. data/lib/puppet/pops/types/type_asserter.rb +1 -1
  145. data/lib/puppet/pops/types/type_calculator.rb +17 -3
  146. data/lib/puppet/pops/types/type_factory.rb +35 -1
  147. data/lib/puppet/pops/types/type_formatter.rb +64 -11
  148. data/lib/puppet/pops/types/type_mismatch_describer.rb +110 -61
  149. data/lib/puppet/pops/types/type_parser.rb +18 -4
  150. data/lib/puppet/pops/types/types.rb +98 -63
  151. data/lib/puppet/pops/validation.rb +9 -1
  152. data/lib/puppet/pops/validation/checker4_0.rb +7 -0
  153. data/lib/puppet/property.rb +1 -1
  154. data/lib/puppet/provider.rb +3 -6
  155. data/lib/puppet/provider/mcx/mcxcontent.rb +1 -1
  156. data/lib/puppet/provider/mount/parsed.rb +18 -4
  157. data/lib/puppet/provider/nameservice/directoryservice.rb +15 -7
  158. data/lib/puppet/provider/package/gem.rb +6 -1
  159. data/lib/puppet/provider/package/pip.rb +0 -1
  160. data/lib/puppet/provider/package/pkg.rb +5 -1
  161. data/lib/puppet/provider/package/pkgng.rb +1 -1
  162. data/lib/puppet/provider/package/yum.rb +10 -0
  163. data/lib/puppet/provider/service/launchd.rb +1 -0
  164. data/lib/puppet/provider/user/directoryservice.rb +6 -6
  165. data/lib/puppet/provider/yumrepo/inifile.rb +1 -1
  166. data/lib/puppet/provider/zpool/zpool.rb +1 -1
  167. data/lib/puppet/resource.rb +54 -12
  168. data/lib/puppet/resource/capability_finder.rb +15 -9
  169. data/lib/puppet/resource/catalog.rb +25 -6
  170. data/lib/puppet/resource/type.rb +3 -1
  171. data/lib/puppet/settings.rb +1 -1
  172. data/lib/puppet/settings/environment_conf.rb +12 -4
  173. data/lib/puppet/syntax_checkers/base64.rb +41 -0
  174. data/lib/puppet/syntax_checkers/json.rb +0 -2
  175. data/lib/puppet/transaction.rb +6 -0
  176. data/lib/puppet/transaction/additional_resource_generator.rb +5 -0
  177. data/lib/puppet/transaction/report.rb +7 -2
  178. data/lib/puppet/type.rb +2 -1
  179. data/lib/puppet/type/file/checksum.rb +1 -0
  180. data/lib/puppet/type/file/content.rb +4 -4
  181. data/lib/puppet/type/mount.rb +44 -0
  182. data/lib/puppet/type/ssh_authorized_key.rb +1 -1
  183. data/lib/puppet/type/tidy.rb +3 -0
  184. data/lib/puppet/type/user.rb +12 -6
  185. data/lib/puppet/util/log.rb +25 -0
  186. data/lib/puppet/util/plist.rb +8 -3
  187. data/lib/puppet/version.rb +1 -1
  188. data/lib/puppet_x.rb +7 -1
  189. data/spec/integration/application/apply_spec.rb +118 -0
  190. data/spec/integration/parser/compiler_spec.rb +28 -0
  191. data/spec/integration/parser/pcore_resource_spec.rb +40 -3
  192. data/spec/integration/provider/mount_spec.rb +2 -1
  193. data/spec/integration/util/windows/principal_spec.rb +2 -2
  194. data/spec/integration/util/windows/registry_spec.rb +4 -4
  195. data/spec/lib/puppet_spec/compiler.rb +5 -1
  196. data/spec/lib/puppet_spec/unindent.rb +5 -0
  197. data/spec/shared_contexts/types_setup.rb +6 -0
  198. data/spec/shared_examples/rhel_package_provider.rb +16 -0
  199. data/spec/spec_helper.rb +1 -0
  200. data/spec/unit/agent_spec.rb +11 -0
  201. data/spec/unit/application/lookup_spec.rb +94 -3
  202. data/spec/unit/capability_spec.rb +22 -0
  203. data/spec/unit/configurer_spec.rb +8 -0
  204. data/spec/unit/face/epp_face_spec.rb +22 -3
  205. data/spec/unit/functions/assert_type_spec.rb +3 -3
  206. data/spec/unit/functions/binary_file_spec.rb +46 -0
  207. data/spec/unit/functions/break_spec.rb +89 -0
  208. data/spec/unit/{parser/functions → functions}/contain_spec.rb +68 -3
  209. data/spec/unit/functions/find_file_spec.rb +69 -0
  210. data/spec/unit/functions/include_spec.rb +175 -0
  211. data/spec/unit/functions/logging_spec.rb +54 -0
  212. data/spec/unit/functions/lookup_spec.rb +3 -3
  213. data/spec/unit/functions/new_spec.rb +105 -5
  214. data/spec/unit/functions/next_spec.rb +93 -0
  215. data/spec/unit/functions/require_spec.rb +83 -0
  216. data/spec/unit/functions/return_spec.rb +105 -0
  217. data/spec/unit/{parser/functions → functions}/shared.rb +14 -11
  218. data/spec/unit/functions/strftime_spec.rb +152 -0
  219. data/spec/unit/functions4_spec.rb +22 -0
  220. data/spec/unit/indirector/face_spec.rb +10 -2
  221. data/spec/unit/network/http/error_spec.rb +1 -2
  222. data/spec/unit/network/http/handler_spec.rb +6 -5
  223. data/spec/unit/parser/functions/hiera_array_spec.rb +1 -1
  224. data/spec/unit/parser/functions/hiera_hash_spec.rb +1 -1
  225. data/spec/unit/parser/functions/hiera_include_spec.rb +1 -1
  226. data/spec/unit/parser/functions/hiera_spec.rb +1 -1
  227. data/spec/unit/parser/functions/lookup_spec.rb +1 -1
  228. data/spec/unit/parser/functions/regsubst_spec.rb +1 -1
  229. data/spec/unit/parser/functions/split_spec.rb +1 -1
  230. data/spec/unit/pops/evaluator/access_ops_spec.rb +81 -1
  231. data/spec/unit/pops/evaluator/arithmetic_ops_spec.rb +170 -0
  232. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +29 -4
  233. data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +112 -4
  234. data/spec/unit/pops/loaders/dependency_loader_spec.rb +12 -0
  235. data/spec/unit/pops/loaders/static_loader_spec.rb +0 -26
  236. data/spec/unit/pops/lookup/context_spec.rb +149 -0
  237. data/spec/unit/pops/parser/parse_functions_spec.rb +19 -0
  238. data/spec/unit/pops/parser/parse_lambda_spec.rb +19 -0
  239. data/spec/unit/pops/puppet_stack_spec.rb +1 -1
  240. data/spec/unit/pops/resource/resource_type_impl_spec.rb +74 -0
  241. data/spec/unit/pops/serialization/packer_spec.rb +34 -14
  242. data/spec/unit/pops/serialization/serialization_spec.rb +67 -5
  243. data/spec/unit/pops/time/timespan_spec.rb +121 -0
  244. data/spec/unit/pops/types/p_binary_type_spec.rb +243 -0
  245. data/spec/unit/pops/types/p_object_type_spec.rb +7 -7
  246. data/spec/unit/pops/types/p_sensitive_type_spec.rb +1 -1
  247. data/spec/unit/pops/types/p_timespan_type_spec.rb +273 -0
  248. data/spec/unit/pops/types/p_timestamp_type_spec.rb +311 -0
  249. data/spec/unit/pops/types/p_type_set_type_spec.rb +13 -13
  250. data/spec/unit/pops/types/ruby_generator_spec.rb +12 -12
  251. data/spec/unit/pops/types/string_converter_spec.rb +89 -0
  252. data/spec/unit/pops/types/type_asserter_spec.rb +3 -3
  253. data/spec/unit/pops/types/type_calculator_spec.rb +113 -5
  254. data/spec/unit/pops/types/type_formatter_spec.rb +40 -0
  255. data/spec/unit/pops/types/type_mismatch_describer_spec.rb +49 -38
  256. data/spec/unit/pops/types/type_parser_spec.rb +87 -4
  257. data/spec/unit/pops/types/types_spec.rb +1 -1
  258. data/spec/unit/pops/validator/validator_spec.rb +23 -0
  259. data/spec/unit/provider/mount/parsed_spec.rb +47 -29
  260. data/spec/unit/provider/package/pkg_spec.rb +109 -99
  261. data/spec/unit/provider/ssh_authorized_key/parsed_spec.rb +1 -0
  262. data/spec/unit/provider/user/aix_spec.rb +1 -1
  263. data/spec/unit/provider/user/directoryservice_spec.rb +101 -30
  264. data/spec/unit/resource/capability_finder_spec.rb +29 -7
  265. data/spec/unit/resource/catalog_spec.rb +127 -0
  266. data/spec/unit/ssl/certificate_request_spec.rb +1 -1
  267. data/spec/unit/transaction/additional_resource_generator_spec.rb +30 -0
  268. data/spec/unit/transaction/persistence_spec.rb +1 -6
  269. data/spec/unit/transaction/report_spec.rb +23 -0
  270. data/spec/unit/transaction_spec.rb +38 -0
  271. data/spec/unit/type/mount_spec.rb +5 -0
  272. data/spec/unit/util/plist_spec.rb +14 -2
  273. metadata +71 -12
  274. data/spec/integration/parser/functions/require_spec.rb +0 -43
  275. data/spec/unit/parser/functions/include_spec.rb +0 -55
  276. data/spec/unit/parser/functions/require_spec.rb +0 -68
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+ require 'puppet/pops'
3
+ require_relative 'parser_rspec_helper'
4
+
5
+ describe 'egrammar parsing function definitions' do
6
+ include ParserRspecHelper
7
+
8
+ context 'without return type' do
9
+ it 'function foo() { 1 }' do
10
+ expect(dump(parse('function foo() { 1 }'))).to eq("(function foo (block\n 1\n))")
11
+ end
12
+ end
13
+
14
+ context 'with return type' do
15
+ it 'function foo() >> Integer { 1 }' do
16
+ expect(dump(parse('function foo() >> Integer { 1 }'))).to eq("(function foo (return_type integer) (block\n 1\n))")
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+ require 'puppet/pops'
3
+ require_relative 'parser_rspec_helper'
4
+
5
+ describe 'egrammar parsing lambda definitions' do
6
+ include ParserRspecHelper
7
+
8
+ context 'without return type' do
9
+ it 'f() |$x| { 1 }' do
10
+ expect(dump(parse('f() |$x| { 1 }'))).to eq("(invoke f (lambda (parameters x) (block\n 1\n)))")
11
+ end
12
+ end
13
+
14
+ context 'with return type' do
15
+ it 'f() |$x| >> Integer { 1 }' do
16
+ expect(dump(parse('f() |$x| >> Integer { 1 }'))).to eq("(invoke f (lambda (parameters x) (return_type integer) (block\n 1\n)))")
17
+ end
18
+ end
19
+ end
@@ -50,7 +50,7 @@ describe 'Puppet::Pops::PuppetStack' do
50
50
  end
51
51
 
52
52
  it 'returns an array from stacktrace with information about each level with oldest frame last' do
53
- expect(StackTraceTest.new.two_levels).to eql([['two_levels.pp', 1237], ['level2.pp', 1240]])
53
+ expect(StackTraceTest.new.two_levels).to eql([['level2.pp', 1240], ['two_levels.pp', 1237]])
54
54
  end
55
55
 
56
56
  it 'accepts file to be nil' do
@@ -1,6 +1,7 @@
1
1
  #! /usr/bin/env ruby
2
2
  require 'spec_helper'
3
3
  require 'puppet/pops'
4
+ require 'puppet_spec/files'
4
5
  require 'puppet_spec/compiler'
5
6
 
6
7
  module Puppet::Pops
@@ -32,6 +33,79 @@ describe "Puppet::Pops::Resource" do
32
33
  expect(rt.valid_parameter?(:loglevel)).to be_truthy
33
34
  end
34
35
  end
36
+
37
+
38
+ context 'when used with capability resource with producers/consumers' do
39
+ include PuppetSpec::Files
40
+
41
+ let!(:env_name) { 'spec' }
42
+ let!(:env_dir) { tmpdir('environments') }
43
+ let!(:populated_env_dir) do
44
+ dir_contained_in(env_dir, env_name => {
45
+ '.resource_types' => {
46
+ 'capability.pp' => <<-PUPPET
47
+ Puppet::Resource::ResourceType3.new(
48
+ 'capability',
49
+ [],
50
+ [Puppet::Resource::Param(Any, 'name', true)],
51
+ { /(.*)/ => ['name'] },
52
+ true,
53
+ true)
54
+ PUPPET
55
+ },
56
+ 'modules' => {
57
+ 'test' => {
58
+ 'lib' => {
59
+ 'puppet' => {
60
+ 'type' => { 'capability.rb' => <<-RUBY
61
+ Puppet::Type.newtype(:capability, :is_capability => true) do
62
+ newparam :name, :namevar => true
63
+ raise Puppet::Error, 'Ruby resource was loaded'
64
+ end
65
+ RUBY
66
+ }
67
+ }
68
+ }
69
+ }
70
+ }
71
+ })
72
+ end
73
+
74
+ let!(:code) { <<-PUPPET }
75
+ define producer() {
76
+ notify { "producer":}
77
+ }
78
+
79
+ define consumer() {
80
+ notify { $title:}
81
+ }
82
+
83
+ Producer produces Capability {}
84
+
85
+ Consumer consumes Capability {}
86
+
87
+ producer {x: export => Capability[cap]}
88
+ consumer {x: consume => Capability[cap]}
89
+ consumer {y: require => Capability[cap]}
90
+ PUPPET
91
+
92
+ let(:environments) { Puppet::Environments::Directories.new(populated_env_dir, []) }
93
+ let(:env) { Puppet::Node::Environment.create(:'spec', [File.join(env_dir, 'spec', 'modules')]) }
94
+ let(:node) { Puppet::Node.new('test', :environment => env) }
95
+ around(:each) do |example|
96
+ Puppet[:app_management] = true
97
+ Puppet[:environment] = env_name
98
+ Puppet.override(:environments => environments, :current_environment => env) do
99
+ example.run
100
+ end
101
+ Puppet::Type.rmtype(:capability)
102
+ Puppet[:app_management] = false
103
+ end
104
+
105
+ it 'does not load the Ruby resource' do
106
+ expect { compile_to_catalog(code, node) }.not_to raise_error
107
+ end
108
+ end
35
109
  end
36
110
  end
37
111
  end
@@ -1,7 +1,8 @@
1
1
  require 'spec_helper'
2
2
  require 'puppet/pops/serialization'
3
3
 
4
- module Puppet::Pops::Serialization
4
+ module Puppet::Pops
5
+ module Serialization
5
6
  [JSON].each do |packer_module|
6
7
  describe "the Puppet::Pops::Serialization when using #{packer_module.name}" do
7
8
  let(:io) { StringIO.new }
@@ -21,7 +22,7 @@ describe "the Puppet::Pops::Serialization when using #{packer_module.name}" do
21
22
  count.nil? ? @deserializer.read : Array.new(count) { @deserializer.read }
22
23
  end
23
24
 
24
- context 'can write and read a Scalar' do
25
+ context 'can write and read a' do
25
26
  it 'String' do
26
27
  val = 'the value'
27
28
  write(val)
@@ -86,11 +87,28 @@ describe "the Puppet::Pops::Serialization when using #{packer_module.name}" do
86
87
  expect(val2).to eql(val)
87
88
  end
88
89
 
89
- it 'Time created by TimeFactory' do
90
- val = TimeFactory.now
90
+ it 'Sensitive' do
91
+ sval = 'the sensitive value'
92
+ val = Types::PSensitiveType::Sensitive.new(sval)
91
93
  write(val)
92
94
  val2 = read
93
- expect(val2).to be_a(Time)
95
+ expect(val2).to be_a(Types::PSensitiveType::Sensitive)
96
+ expect(val2.unwrap).to eql(sval)
97
+ end
98
+
99
+ it 'Timespan' do
100
+ val = Time::Timespan.from_fields(false, 3, 12, 40, 31, 123)
101
+ write(val)
102
+ val2 = read
103
+ expect(val2).to be_a(Time::Timespan)
104
+ expect(val2).to eql(val)
105
+ end
106
+
107
+ it 'Timestamp' do
108
+ val = Time::Timestamp.now
109
+ write(val)
110
+ val2 = read
111
+ expect(val2).to be_a(Time::Timestamp)
94
112
  expect(val2).to eql(val)
95
113
  end
96
114
 
@@ -110,21 +128,22 @@ describe "the Puppet::Pops::Serialization when using #{packer_module.name}" do
110
128
  expect(val2).to eql(val)
111
129
  end
112
130
 
113
- it 'will never fail write and read of Time created by TimeFactory' do
114
- val = Time.now
115
- val = TimeFactory.at(val.tv_sec, val.tv_nsec / 1000 + 0.123)
131
+ it 'Binary' do
132
+ val = Types::PBinaryType::Binary.from_base64('w5ZzdGVuIG1lZCByw7ZzdGVuCg==')
116
133
  write(val)
117
134
  val2 = read
118
- expect(val).to eq(val2)
135
+ expect(val2).to be_a(Types::PBinaryType::Binary)
136
+ expect(val2).to eql(val)
119
137
  end
120
138
 
121
- # Windows doesn't seem ot have fine enough granularity to provoke the problem
122
- it 'will fail on Time not created by TimeFactory' do
123
- val = Time.now
124
- val = Time.at(val.tv_sec, val.tv_nsec / 1000 + 0.123)
139
+ it 'Sensitive with rich data' do
140
+ sval = Time::Timestamp.now
141
+ val = Types::PSensitiveType::Sensitive.new(sval)
125
142
  write(val)
126
143
  val2 = read
127
- expect(val).not_to eq(val2)
144
+ expect(val2).to be_a(Types::PSensitiveType::Sensitive)
145
+ expect(val2.unwrap).to be_a(Time::Timestamp)
146
+ expect(val2.unwrap).to eql(sval)
128
147
  end
129
148
  end
130
149
 
@@ -151,3 +170,4 @@ describe "the Puppet::Pops::Serialization when using #{packer_module.name}" do
151
170
  end
152
171
  end
153
172
  end
173
+ end
@@ -37,7 +37,7 @@ module Serialization
37
37
  parser.parse_string(string, '/home/tester/experiments/manifests/init.pp').current
38
38
  end
39
39
 
40
- context 'can write and read a Scalar' do
40
+ context 'can write and read a' do
41
41
  it 'String' do
42
42
  val = 'the value'
43
43
  write(val)
@@ -94,12 +94,28 @@ module Serialization
94
94
  expect(val2).to eql(val)
95
95
  end
96
96
 
97
- it 'Time created by TimeFactory' do
98
- # It does succeed on rare occasions, so we need to repeat
99
- val = TimeFactory.now
97
+ it 'Sensitive' do
98
+ sval = 'the sensitive value'
99
+ val = Types::PSensitiveType::Sensitive.new(sval)
100
+ write(val)
101
+ val2 = read
102
+ expect(val2).to be_a(Types::PSensitiveType::Sensitive)
103
+ expect(val2.unwrap).to eql(sval)
104
+ end
105
+
106
+ it 'Timespan' do
107
+ val = Time::Timespan.from_fields(false, 3, 12, 40, 31, 123)
100
108
  write(val)
101
109
  val2 = read
102
- expect(val2).to be_a(Time)
110
+ expect(val2).to be_a(Time::Timespan)
111
+ expect(val2).to eql(val)
112
+ end
113
+
114
+ it 'Timestamp' do
115
+ val = Time::Timestamp.now
116
+ write(val)
117
+ val2 = read
118
+ expect(val2).to be_a(Time::Timestamp)
103
119
  expect(val2).to eql(val)
104
120
  end
105
121
 
@@ -120,6 +136,24 @@ module Serialization
120
136
  expect(val2).to be_a(Semantic::VersionRange)
121
137
  expect(val2).to eql(val)
122
138
  end
139
+
140
+ it 'Binary' do
141
+ val = Types::PBinaryType::Binary.from_base64('w5ZzdGVuIG1lZCByw7ZzdGVuCg==')
142
+ write(val)
143
+ val2 = read
144
+ expect(val2).to be_a(Types::PBinaryType::Binary)
145
+ expect(val2).to eql(val)
146
+ end
147
+
148
+ it 'Sensitive with rich data' do
149
+ sval = Time::Timestamp.now
150
+ val = Types::PSensitiveType::Sensitive.new(sval)
151
+ write(val)
152
+ val2 = read
153
+ expect(val2).to be_a(Types::PSensitiveType::Sensitive)
154
+ expect(val2.unwrap).to be_a(Time::Timestamp)
155
+ expect(val2.unwrap).to eql(sval)
156
+ end
123
157
  end
124
158
 
125
159
  context 'can write and read' do
@@ -169,6 +203,34 @@ module Serialization
169
203
  end
170
204
  end
171
205
 
206
+ it 'Array of rich data' do
207
+ # Sensitive omitted because it doesn't respond to ==
208
+ val = [
209
+ Time::Timespan.from_fields(false, 3, 12, 40, 31, 123),
210
+ Time::Timestamp.now,
211
+ Semantic::Version.parse('1.2.3-alpha2'),
212
+ Semantic::VersionRange.parse('>=1.2.3-alpha2 <1.2.4'),
213
+ Types::PBinaryType::Binary.from_base64('w5ZzdGVuIG1lZCByw7ZzdGVuCg==')
214
+ ]
215
+ write(val)
216
+ val2 = read
217
+ expect(val2).to eql(val)
218
+ end
219
+
220
+ it 'Hash of rich data' do
221
+ # Sensitive omitted because it doesn't respond to ==
222
+ val = {
223
+ 'duration' => Time::Timespan.from_fields(false, 3, 12, 40, 31, 123),
224
+ 'time' => Time::Timestamp.now,
225
+ 'version' => Semantic::Version.parse('1.2.3-alpha2'),
226
+ 'range' => Semantic::VersionRange.parse('>=1.2.3-alpha2 <1.2.4'),
227
+ 'binary' => Types::PBinaryType::Binary.from_base64('w5ZzdGVuIG1lZCByw7ZzdGVuCg==')
228
+ }
229
+ write(val)
230
+ val2 = read
231
+ expect(val2).to eql(val)
232
+ end
233
+
172
234
  context 'an AST model' do
173
235
  it "Locator" do
174
236
  val = Parser::Locator::Locator19.new('here is some text', '/tmp/foo', [5])
@@ -0,0 +1,121 @@
1
+ require 'spec_helper'
2
+ require 'puppet/pops'
3
+ require 'puppet_spec/compiler'
4
+
5
+ module Puppet::Pops
6
+ module Time
7
+ describe 'Timespan' do
8
+ include PuppetSpec::Compiler
9
+
10
+ let! (:simple) { Timespan.from_fields(false, 1, 3, 10, 11) }
11
+ let! (:all_fields_hash) { {'days' => 1, 'hours' => 7, 'minutes' => 10, 'seconds' => 11, 'milliseconds' => 123, 'microseconds' => 456, 'nanoseconds' => 789} }
12
+ let! (:complex) { Timespan.from_fields_hash(all_fields_hash) }
13
+
14
+ context 'can be created from a String' do
15
+ it 'using default format' do
16
+ expect(Timespan.parse('1-03:10:11')).to eql(simple)
17
+ end
18
+
19
+ it 'using explicit format' do
20
+ expect(Timespan.parse('1-7:10:11.123456789', '%D-%H:%M:%S.%N')).to eql(complex)
21
+ end
22
+
23
+ it 'using leading minus and explicit format' do
24
+ expect(Timespan.parse('-1-7:10:11.123456789', '%D-%H:%M:%S.%N')).to eql(-complex)
25
+ end
26
+
27
+ it 'using %H as the biggest quantity' do
28
+ expect(Timespan.parse('27:10:11', '%H:%M:%S')).to eql(simple)
29
+ end
30
+
31
+ it 'using %M as the biggest quantity' do
32
+ expect(Timespan.parse('1630:11', '%M:%S')).to eql(simple)
33
+ end
34
+
35
+ it 'using %S as the biggest quantity' do
36
+ expect(Timespan.parse('97811', '%S')).to eql(simple)
37
+ end
38
+
39
+ it 'where biggest quantity is not frist' do
40
+ expect(Timespan.parse('11:1630', '%S:%M')).to eql(simple)
41
+ end
42
+
43
+ it 'raises an error when using %L as the biggest quantity' do
44
+ expect { Timespan.parse('123', '%L') }.to raise_error(ArgumentError, /denotes fractions and must be used together with a specifier of higher magnitude/)
45
+ end
46
+
47
+ it 'raises an error when using %N as the biggest quantity' do
48
+ expect { Timespan.parse('123', '%N') }.to raise_error(ArgumentError, /denotes fractions and must be used together with a specifier of higher magnitude/)
49
+ end
50
+
51
+ it 'where %L is treated as fractions of a second' do
52
+ expect(Timespan.parse('0.4', '%S.%L')).to eql(Timespan.from_fields(false, 0, 0, 0, 0, 400))
53
+ end
54
+
55
+ it 'where %N is treated as fractions of a second' do
56
+ expect(Timespan.parse('0.4', '%S.%N')).to eql(Timespan.from_fields(false, 0, 0, 0, 0, 400))
57
+ end
58
+ end
59
+
60
+ context 'when presented as a String' do
61
+ it 'uses default format for #to_s' do
62
+ expect(simple.to_s).to eql('1-03:10:11.0')
63
+ end
64
+
65
+ context 'using a format' do
66
+ it 'produces a string containing all components' do
67
+ expect(complex.format('%D-%H:%M:%S.%N')).to eql('1-07:10:11.123456789')
68
+ end
69
+
70
+ it 'produces a literal % for %%' do
71
+ expect(complex.format('%D%%%H:%M:%S')).to eql('1%07:10:11')
72
+ end
73
+
74
+ it 'produces a leading dash for negative instance' do
75
+ expect((-complex).format('%D-%H:%M:%S')).to eql('-1-07:10:11')
76
+ end
77
+
78
+ it 'produces a string without trailing zeros for %-N' do
79
+ expect(Timespan.parse('2.345', '%S.%N').format('%-S.%-N')).to eql('2.345')
80
+ end
81
+
82
+ it 'produces a string with trailing zeros for %N' do
83
+ expect(Timespan.parse('2.345', '%S.%N').format('%-S.%N')).to eql('2.345000000')
84
+ end
85
+
86
+ it 'produces a string with trailing zeros for %0N' do
87
+ expect(Timespan.parse('2.345', '%S.%N').format('%-S.%0N')).to eql('2.345000000')
88
+ end
89
+
90
+ it 'produces a string with trailing spaces for %_N' do
91
+ expect(Timespan.parse('2.345', '%S.%N').format('%-S.%_N')).to eql('2.345 ')
92
+ end
93
+ end
94
+ end
95
+
96
+ context 'when converted to a hash' do
97
+ it 'produces a hash with all numeric keys' do
98
+ hash = complex.to_hash
99
+ expect(hash).to eql(all_fields_hash)
100
+ end
101
+
102
+ it 'produces a compact hash with seconds and nanoseconds for #to_hash(true)' do
103
+ hash = complex.to_hash(true)
104
+ expect(hash).to eql({'seconds' => 112211, 'nanoseconds' => 123456789})
105
+ end
106
+
107
+ context 'from a negative value' do
108
+ it 'produces a hash with all numeric keys and negative = true' do
109
+ hash = (-complex).to_hash
110
+ expect(hash).to eql(all_fields_hash.merge('negative' => true))
111
+ end
112
+
113
+ it 'produces a compact hash with negative seconds and negative nanoseconds for #to_hash(true)' do
114
+ hash = (-complex).to_hash(true)
115
+ expect(hash).to eql({'seconds' => -112211, 'nanoseconds' => -123456789})
116
+ end
117
+ end
118
+ end
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,243 @@
1
+ require 'spec_helper'
2
+ require 'puppet/pops'
3
+ require 'puppet_spec/compiler'
4
+
5
+ module Puppet::Pops
6
+ module Types
7
+ describe 'Binary Type' do
8
+ include PuppetSpec::Compiler
9
+
10
+ context 'as a type' do
11
+ it 'can be created with the type factory' do
12
+ t = TypeFactory.binary()
13
+ expect(t).to be_a(PBinaryType)
14
+ expect(t).to eql(PBinaryType::DEFAULT)
15
+ end
16
+ end
17
+
18
+ context 'a Binary instance' do
19
+ it 'can be created from a raw String using %r, raw string mode' do
20
+ str = [0xF1].pack("C*")
21
+ code = <<-CODE
22
+ $x = Binary($testing, '%r')
23
+ notice(assert_type(Binary, $x))
24
+ CODE
25
+ expect(eval_and_collect_notices(code, Puppet::Node.new('foonode'), { 'testing' => str })).to eql(['8Q=='])
26
+ end
27
+
28
+ it 'can be created from a String using %s, string mode' do
29
+ # the text 'binar' needs padding with '='
30
+ code = <<-CODE
31
+ $x = Binary('binary', '%s')
32
+ notice(assert_type(Binary, $x))
33
+ CODE
34
+ expect(eval_and_collect_notices(code)).to eql(['YmluYXJ5'])
35
+ end
36
+
37
+ it 'format %s errors if encoding is bad in given string when using format %s and a broken UTF-8 string' do
38
+ str = [0xF1].pack("C*")
39
+ str.force_encoding('UTF-8')
40
+ code = <<-CODE
41
+ $x = Binary($testing, '%s')
42
+ notice(assert_type(Binary, $x))
43
+ CODE
44
+ expect {
45
+ eval_and_collect_notices(code, Puppet::Node.new('foonode'), { 'testing' => str })
46
+ }.to raise_error(/.*The given string in encoding 'UTF-8' is invalid\. Cannot create a Binary UTF-8 representation.*/)
47
+ end
48
+
49
+ it 'format %s errors if encoding is correct but string cannot be transcoded to UTF-8' do
50
+ str = [0xF1].pack("C*")
51
+ code = <<-CODE
52
+ $x = Binary($testing, '%s')
53
+ notice(assert_type(Binary, $x))
54
+ CODE
55
+ expect {
56
+ eval_and_collect_notices(code, Puppet::Node.new('foonode'), { 'testing' => str })
57
+ }.to raise_error(/.*"\\xF1" from ASCII-8BIT to UTF-8.*/)
58
+ end
59
+
60
+ it 'can be created from a strict Base64 encoded String using default format' do
61
+ code = <<-CODE
62
+ $x = Binary('YmluYXI=')
63
+ notice(assert_type(Binary, $x))
64
+ CODE
65
+ expect(eval_and_collect_notices(code)).to eql(['YmluYXI='])
66
+ end
67
+
68
+ it 'will error creation in strict mode if padding is missing when using default format' do
69
+ # the text 'binar' needs padding with '=' (missing here to trigger error
70
+ code = <<-CODE
71
+ $x = Binary('YmluYXI')
72
+ notice(assert_type(Binary, $x))
73
+ CODE
74
+ expect{ eval_and_collect_notices(code) }.to raise_error(/invalid base64/)
75
+ end
76
+
77
+ it 'can be created from a Base64 encoded String using %B, strict mode' do
78
+ # the text 'binar' needs padding with '='
79
+ code = <<-CODE
80
+ $x = Binary('YmluYXI=', '%B')
81
+ notice(assert_type(Binary, $x))
82
+ CODE
83
+ expect(eval_and_collect_notices(code)).to eql(['YmluYXI='])
84
+ end
85
+
86
+ it 'will error creation in strict mode if padding is missing' do
87
+ # the text 'binar' needs padding with '=' (missing here to trigger error
88
+ code = <<-CODE
89
+ $x = Binary('YmluYXI', '%B')
90
+ notice(assert_type(Binary, $x))
91
+ CODE
92
+ expect{ eval_and_collect_notices(code) }.to raise_error(/invalid base64/)
93
+ end
94
+
95
+ it 'will not error creation in base mode if padding is missing' do
96
+ # the text 'binar' needs padding with '=' (missing here to trigger possible error)
97
+ code = <<-CODE
98
+ $x = Binary('YmluYXI', '%b')
99
+ notice(assert_type(Binary, $x))
100
+ CODE
101
+ expect(eval_and_collect_notices(code)).to eql(['YmluYXI='])
102
+ end
103
+
104
+ it 'will not error creation in base mode if padding is not required' do
105
+ # the text 'binary' does not need padding with '='
106
+ code = <<-CODE
107
+ $x = Binary('YmluYXJ5', '%b')
108
+ notice(assert_type(Binary, $x))
109
+ CODE
110
+ expect(eval_and_collect_notices(code)).to eql(['YmluYXJ5'])
111
+ end
112
+
113
+ it 'can be compared to another instance for equality' do
114
+ code = <<-CODE
115
+ $x = Binary('YmluYXJ5')
116
+ $y = Binary('YmluYXJ5')
117
+ notice($x == $y)
118
+ notice($x != $y)
119
+ CODE
120
+ expect(eval_and_collect_notices(code)).to eql(['true', 'false'])
121
+ end
122
+
123
+ it 'can be created from an array of byte values' do
124
+ # the text 'binar' needs padding with '='
125
+ code = <<-CODE
126
+ $x = Binary([251, 239, 255])
127
+ notice(assert_type(Binary, $x))
128
+ CODE
129
+ expect(eval_and_collect_notices(code)).to eql(['++//'])
130
+ end
131
+
132
+ it "can be created from an hash with value and format" do
133
+ # the text 'binar' needs padding with '='
134
+ code = <<-CODE
135
+ $x = Binary({value => '--__', format => '%u'})
136
+ notice(assert_type(Binary, $x))
137
+ CODE
138
+ expect(eval_and_collect_notices(code)).to eql(['++//'])
139
+ end
140
+
141
+ it "can be created from an hash with value and default format" do
142
+ code = <<-CODE
143
+ $x = Binary({value => 'YmluYXI='})
144
+ notice(assert_type(Binary, $x))
145
+ CODE
146
+ expect(eval_and_collect_notices(code)).to eql(['YmluYXI='])
147
+ end
148
+
149
+ it 'can be created from a hash with value being an array' do
150
+ # the text 'binar' needs padding with '='
151
+ code = <<-CODE
152
+ $x = Binary({value => [251, 239, 255]})
153
+ notice(assert_type(Binary, $x))
154
+ CODE
155
+ expect(eval_and_collect_notices(code)).to eql(['++//'])
156
+ end
157
+
158
+ it "can be created from an Base64 using URL safe encoding by specifying '%u' format'" do
159
+ # the text 'binar' needs padding with '='
160
+ code = <<-CODE
161
+ $x = Binary('--__', '%u')
162
+ notice(assert_type(Binary, $x))
163
+ CODE
164
+ expect(eval_and_collect_notices(code)).to eql(['++//'])
165
+ end
166
+
167
+ it "when created with URL safe encoding chars in '%b' format, these are skipped" do
168
+ code = <<-CODE
169
+ $x = Binary('--__YmluYXJ5', '%b')
170
+ notice(assert_type(Binary, $x))
171
+ CODE
172
+ expect(eval_and_collect_notices(code)).to eql(['YmluYXJ5'])
173
+ end
174
+
175
+ it "will error in strict format if string contains URL safe encoded chars" do
176
+ code = <<-CODE
177
+ $x = Binary('--__YmluYXJ5', '%B')
178
+ notice(assert_type(Binary, $x))
179
+ CODE
180
+ expect { eval_and_collect_notices(code) }.to raise_error(/invalid base64/)
181
+ end
182
+
183
+ [ '<',
184
+ '<=',
185
+ '>',
186
+ '>='
187
+ ].each do |op|
188
+ it "cannot be compared to another instance for magnitude using #{op}" do
189
+ code = <<-"CODE"
190
+ $x = Binary('YmluYXJ5')
191
+ $y = Binary('YmluYXJ5')
192
+ $x #{op} $y
193
+ CODE
194
+ expect { eval_and_collect_notices(code)}.to raise_error(/Comparison of: Binary #{op} Binary, is not possible/)
195
+ end
196
+ end
197
+
198
+ it 'can be matched against a Binary in case expression' do
199
+ code = <<-CODE
200
+ case Binary('YmluYXJ5') {
201
+ Binary('YWxpZW4='): {
202
+ notice('nope')
203
+ }
204
+ Binary('YmluYXJ5'): {
205
+ notice('yay')
206
+ }
207
+ default: {
208
+ notice('nope')
209
+ }
210
+ }
211
+ CODE
212
+ expect(eval_and_collect_notices(code)).to eql(['yay'])
213
+ end
214
+
215
+ it "can be matched against a Binary subsequence using 'in' expression" do
216
+ # finding 'one' in 'one two three'
217
+ code = <<-CODE
218
+ notice(Binary("b25l") in Binary("b25lIHR3byB0aHJlZQ=="))
219
+ notice(Binary("c25l") in Binary("b25lIHR3byB0aHJlZQ=="))
220
+ CODE
221
+ expect(eval_and_collect_notices(code)).to eql(['true', 'false'])
222
+ end
223
+
224
+ it "can be matched against a byte value using 'in' expression" do
225
+ # finding 'e' (ascii 101) in 'one two three'
226
+ code = <<-CODE
227
+ notice(101 in Binary("b25lIHR3byB0aHJlZQ=="))
228
+ notice(101.0 in Binary("b25lIHR3byB0aHJlZQ=="))
229
+ notice(102 in Binary("b25lIHR3byB0aHJlZQ=="))
230
+ CODE
231
+ expect(eval_and_collect_notices(code)).to eql(['true', 'true', 'false'])
232
+ end
233
+
234
+ it "has a length method in ruby returning the length measured in bytes" do
235
+ # \u{1f452} is "woman's hat emoji - 4 bytes in UTF-8"
236
+ a_binary = PBinaryType::Binary.new("\u{1f452}")
237
+ expect(a_binary.length).to be(4)
238
+ end
239
+ end
240
+
241
+ end
242
+ end
243
+ end