puppet 4.4.2-universal-darwin → 4.5.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 (218) hide show
  1. data/CONTRIBUTING.md +5 -5
  2. data/Gemfile +2 -2
  3. data/LICENSE +2 -2
  4. data/README.md +5 -0
  5. data/ext/project_data.yaml +2 -0
  6. data/lib/hiera_puppet.rb +6 -14
  7. data/lib/puppet/application/agent.rb +2 -3
  8. data/lib/puppet/data_providers/hiera_config.rb +2 -4
  9. data/lib/puppet/data_providers/hiera_interpolate.rb +12 -154
  10. data/lib/puppet/data_providers/json_data_provider_factory.rb +0 -7
  11. data/lib/puppet/data_providers/yaml_data_provider_factory.rb +2 -8
  12. data/lib/puppet/defaults.rb +70 -7
  13. data/lib/puppet/functions.rb +69 -0
  14. data/lib/puppet/functions/dig.rb +39 -0
  15. data/lib/puppet/functions/lest.rb +53 -0
  16. data/lib/puppet/functions/lookup.rb +40 -27
  17. data/lib/puppet/functions/new.rb +502 -0
  18. data/lib/puppet/functions/regsubst.rb +11 -10
  19. data/lib/puppet/functions/then.rb +74 -0
  20. data/lib/puppet/functions/type.rb +4 -4
  21. data/lib/puppet/functions/with.rb +1 -1
  22. data/lib/puppet/indirector/catalog/compiler.rb +2 -0
  23. data/lib/puppet/indirector/resource_type/parser.rb +5 -0
  24. data/lib/puppet/indirector/rest.rb +5 -1
  25. data/lib/puppet/loaders.rb +2 -0
  26. data/lib/puppet/metatype/manager.rb +19 -2
  27. data/lib/puppet/module_tool/applications/application.rb +1 -1
  28. data/lib/puppet/module_tool/skeleton/templates/generator/Gemfile +6 -2
  29. data/lib/puppet/module_tool/skeleton/templates/generator/Rakefile +19 -4
  30. data/lib/puppet/module_tool/skeleton/templates/generator/{tests → examples}/init.pp.erb +1 -1
  31. data/lib/puppet/module_tool/skeleton/templates/generator/spec/classes/init_spec.rb.erb +0 -1
  32. data/lib/puppet/network/http/api/master/v3/environment.rb +6 -2
  33. data/lib/puppet/parser/ast/pops_bridge.rb +20 -3
  34. data/lib/puppet/parser/compiler/catalog_validator/relationship_validator.rb +24 -2
  35. data/lib/puppet/parser/e4_parser_adapter.rb +13 -12
  36. data/lib/puppet/parser/environment_compiler.rb +2 -2
  37. data/lib/puppet/parser/resource.rb +14 -5
  38. data/lib/puppet/parser/scope.rb +18 -15
  39. data/lib/puppet/plugins/data_providers/data_provider.rb +19 -8
  40. data/lib/puppet/pops.rb +6 -0
  41. data/lib/puppet/pops/adapters.rb +5 -1
  42. data/lib/puppet/pops/evaluator/access_operator.rb +52 -14
  43. data/lib/puppet/pops/evaluator/compare_operator.rb +34 -4
  44. data/lib/puppet/pops/evaluator/evaluator_impl.rb +75 -22
  45. data/lib/puppet/pops/evaluator/literal_evaluator.rb +7 -6
  46. data/lib/puppet/pops/evaluator/runtime3_converter.rb +13 -1
  47. data/lib/puppet/pops/evaluator/runtime3_support.rb +14 -4
  48. data/lib/puppet/pops/functions/dispatcher.rb +1 -1
  49. data/lib/puppet/pops/issues.rb +18 -2
  50. data/lib/puppet/pops/loader/base_loader.rb +48 -7
  51. data/lib/puppet/pops/loader/dependency_loader.rb +27 -2
  52. data/lib/puppet/pops/loader/loader.rb +12 -0
  53. data/lib/puppet/pops/loader/predefined_loader.rb +29 -0
  54. data/lib/puppet/pops/loader/runtime3_type_loader.rb +57 -0
  55. data/lib/puppet/pops/loader/static_loader.rb +92 -5
  56. data/lib/puppet/pops/loader/type_definition_instantiator.rb +25 -3
  57. data/lib/puppet/pops/loaders.rb +84 -14
  58. data/lib/puppet/pops/lookup/explainer.rb +38 -1
  59. data/lib/puppet/pops/lookup/interpolation.rb +115 -0
  60. data/lib/puppet/pops/lookup/sub_lookup.rb +86 -0
  61. data/lib/puppet/pops/model/ast_transformer.rb +8 -1
  62. data/lib/puppet/pops/model/factory.rb +31 -8
  63. data/lib/puppet/pops/model/model.rb +8 -0
  64. data/lib/puppet/pops/model/model_label_provider.rb +1 -0
  65. data/lib/puppet/pops/model/model_meta.rb +7 -1
  66. data/lib/puppet/pops/model/model_tree_dumper.rb +4 -0
  67. data/lib/puppet/pops/parser/egrammar.ra +24 -7
  68. data/lib/puppet/pops/parser/eparser.rb +863 -798
  69. data/lib/puppet/pops/parser/evaluating_parser.rb +4 -0
  70. data/lib/puppet/pops/parser/locator.rb +8 -4
  71. data/lib/puppet/pops/pcore.rb +30 -0
  72. data/lib/puppet/pops/types/class_loader.rb +2 -4
  73. data/lib/puppet/pops/types/implementation_registry.rb +146 -0
  74. data/lib/puppet/pops/types/iterable.rb +4 -4
  75. data/lib/puppet/pops/types/p_object_type.rb +846 -0
  76. data/lib/puppet/pops/types/p_runtime_type.rb +102 -0
  77. data/lib/puppet/pops/types/p_sem_ver_range_type.rb +164 -0
  78. data/lib/puppet/pops/types/p_sem_ver_type.rb +113 -0
  79. data/lib/puppet/pops/types/puppet_object.rb +21 -0
  80. data/lib/puppet/pops/types/ruby_generator.rb +258 -0
  81. data/lib/puppet/pops/types/string_converter.rb +922 -0
  82. data/lib/puppet/pops/types/type_calculator.rb +29 -5
  83. data/lib/puppet/pops/types/type_conversion_error.rb +15 -0
  84. data/lib/puppet/pops/types/type_factory.rb +49 -16
  85. data/lib/puppet/pops/types/type_formatter.rb +335 -112
  86. data/lib/puppet/pops/types/type_mismatch_describer.rb +110 -29
  87. data/lib/puppet/pops/types/type_parser.rb +205 -197
  88. data/lib/puppet/pops/types/types.rb +481 -103
  89. data/lib/puppet/pops/validation.rb +1 -1
  90. data/lib/puppet/pops/validation/checker4_0.rb +66 -4
  91. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
  92. data/lib/puppet/pops/visitor.rb +3 -1
  93. data/lib/puppet/property.rb +1 -1
  94. data/lib/puppet/provider/augeas/augeas.rb +1 -1
  95. data/lib/puppet/provider/package/pip.rb +64 -20
  96. data/lib/puppet/provider/package/rpm.rb +112 -0
  97. data/lib/puppet/provider/package/yum.rb +7 -68
  98. data/lib/puppet/provider/service/daemontools.rb +3 -3
  99. data/lib/puppet/provider/service/init.rb +4 -2
  100. data/lib/puppet/provider/service/runit.rb +3 -3
  101. data/lib/puppet/provider/service/smf.rb +6 -3
  102. data/lib/puppet/provider/service/systemd.rb +59 -73
  103. data/lib/puppet/reference/providers.rb +1 -2
  104. data/lib/puppet/resource.rb +54 -37
  105. data/lib/puppet/resource/catalog.rb +31 -29
  106. data/lib/puppet/resource/type_collection.rb +23 -8
  107. data/lib/puppet/settings.rb +4 -2
  108. data/lib/puppet/settings/base_setting.rb +9 -3
  109. data/lib/puppet/settings/symbolic_enum_setting.rb +17 -0
  110. data/lib/puppet/test/test_helper.rb +0 -1
  111. data/lib/puppet/type.rb +9 -3
  112. data/lib/puppet/type/exec.rb +17 -17
  113. data/lib/puppet/type/file.rb +12 -0
  114. data/lib/puppet/type/file/content.rb +6 -6
  115. data/lib/puppet/type/file/ensure.rb +4 -4
  116. data/lib/puppet/type/file/source.rb +4 -4
  117. data/lib/puppet/type/file/target.rb +2 -2
  118. data/lib/puppet/type/mount.rb +18 -1
  119. data/lib/puppet/type/package.rb +3 -3
  120. data/lib/puppet/type/schedule.rb +4 -4
  121. data/lib/puppet/type/service.rb +15 -0
  122. data/lib/puppet/type/sshkey.rb +5 -3
  123. data/lib/puppet/type/tidy.rb +3 -3
  124. data/lib/puppet/type/zone.rb +5 -5
  125. data/lib/puppet/util/feature.rb +1 -1
  126. data/lib/puppet/util/monkey_patches.rb +8 -0
  127. data/lib/puppet/util/network_device/cisco/device.rb +16 -6
  128. data/lib/puppet/util/network_device/cisco/interface.rb +5 -6
  129. data/lib/puppet/util/plist.rb +3 -3
  130. data/lib/puppet/version.rb +1 -1
  131. data/spec/fixtures/unit/application/environments/production/data/common.yaml +13 -0
  132. data/spec/fixtures/unit/data_providers/environments/production/modules/abc/lib/puppet/functions/abc/data.rb +2 -1
  133. data/spec/fixtures/unit/data_providers/environments/production/modules/abc/manifests/init.pp +2 -1
  134. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_json/data/empty_key.json +1 -0
  135. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_json/hiera.yaml +5 -0
  136. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_json/manifests/init.pp +2 -0
  137. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_json/metadata.json +9 -0
  138. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_yaml/data/empty_key.yaml +1 -0
  139. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_yaml/hiera.yaml +5 -0
  140. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_yaml/manifests/init.pp +2 -0
  141. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_yaml/metadata.json +9 -0
  142. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/data/empty.yaml +1 -0
  143. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/lib/puppet/type/usee_type.rb +5 -0
  144. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/manifests/init.pp +6 -0
  145. data/spec/fixtures/unit/provider/service/smf/svcs.out +4 -3
  146. data/spec/integration/module_tool/tar/mini_spec.rb +27 -27
  147. data/spec/integration/parser/catalog_spec.rb +14 -2
  148. data/spec/integration/parser/compiler_spec.rb +94 -3
  149. data/spec/integration/parser/resource_expressions_spec.rb +1 -1
  150. data/spec/integration/resource/type_collection_spec.rb +8 -0
  151. data/spec/lib/puppet_spec/compiler.rb +11 -4
  152. data/spec/shared_contexts/types_setup.rb +4 -0
  153. data/spec/unit/application/lookup_spec.rb +91 -9
  154. data/spec/unit/appmgmt_spec.rb +44 -35
  155. data/spec/unit/capability_spec.rb +33 -53
  156. data/spec/unit/data_providers/function_data_provider_spec.rb +19 -1
  157. data/spec/unit/data_providers/hiera_data_provider_spec.rb +1 -1
  158. data/spec/unit/defaults_spec.rb +18 -0
  159. data/spec/unit/functions/assert_type_spec.rb +1 -1
  160. data/spec/unit/functions/dig_spec.rb +58 -0
  161. data/spec/unit/functions/lest_spec.rb +34 -0
  162. data/spec/unit/functions/lookup_spec.rb +108 -2
  163. data/spec/unit/functions/new_spec.rb +543 -0
  164. data/spec/unit/functions/regsubst_spec.rb +8 -0
  165. data/spec/unit/functions/then_spec.rb +40 -0
  166. data/spec/unit/functions4_spec.rb +78 -10
  167. data/spec/unit/hiera_puppet_spec.rb +49 -8
  168. data/spec/unit/indirector/resource_type/parser_spec.rb +5 -0
  169. data/spec/unit/indirector/rest_spec.rb +12 -0
  170. data/spec/unit/network/http/api/master/v3/environment_spec.rb +60 -0
  171. data/spec/unit/node/environment_spec.rb +10 -0
  172. data/spec/unit/parser/compiler_spec.rb +20 -1
  173. data/spec/unit/parser/functions/create_resources_spec.rb +2 -2
  174. data/spec/unit/parser/functions/shared.rb +1 -1
  175. data/spec/unit/parser/resource_spec.rb +8 -1
  176. data/spec/unit/parser/scope_spec.rb +45 -0
  177. data/spec/unit/pops/evaluator/access_ops_spec.rb +14 -0
  178. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +13 -5
  179. data/spec/unit/pops/loaders/static_loader_spec.rb +92 -1
  180. data/spec/unit/{data_providers/hiera_interpolation_spec.rb → pops/lookup/interpolation_spec.rb} +7 -5
  181. data/spec/unit/pops/parser/lexer2_spec.rb +2 -9
  182. data/spec/unit/pops/parser/parse_application_spec.rb +3 -8
  183. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +19 -0
  184. data/spec/unit/pops/parser/parse_capabilities_spec.rb +3 -10
  185. data/spec/unit/pops/parser/parse_site_spec.rb +19 -10
  186. data/spec/unit/pops/parser/parser_rspec_helper.rb +0 -4
  187. data/spec/unit/pops/types/enumeration_spec.rb +13 -12
  188. data/spec/unit/pops/types/iterable_spec.rb +2 -2
  189. data/spec/unit/pops/types/p_object_type_spec.rb +1060 -0
  190. data/spec/unit/pops/types/p_sem_ver_type_spec.rb +285 -0
  191. data/spec/unit/pops/types/recursion_guard_spec.rb +19 -17
  192. data/spec/unit/pops/types/ruby_generator_spec.rb +261 -0
  193. data/spec/unit/pops/types/string_converter_spec.rb +904 -0
  194. data/spec/unit/pops/types/type_calculator_spec.rb +430 -406
  195. data/spec/unit/pops/types/type_factory_spec.rb +119 -104
  196. data/spec/unit/pops/types/type_formatter_spec.rb +73 -6
  197. data/spec/unit/pops/types/type_mismatch_describer_spec.rb +2 -2
  198. data/spec/unit/pops/types/type_parser_spec.rb +54 -15
  199. data/spec/unit/pops/types/types_spec.rb +113 -8
  200. data/spec/unit/pops/validator/validator_spec.rb +84 -10
  201. data/spec/unit/provider/package/pip3_spec.rb +9 -270
  202. data/spec/unit/provider/package/pip_spec.rb +85 -30
  203. data/spec/unit/provider/package/rpm_spec.rb +160 -3
  204. data/spec/unit/provider/package/yum_spec.rb +23 -134
  205. data/spec/unit/provider/service/smf_spec.rb +14 -2
  206. data/spec/unit/provider/service/systemd_spec.rb +33 -41
  207. data/spec/unit/resource/capability_finder_spec.rb +10 -2
  208. data/spec/unit/settings/file_setting_spec.rb +6 -0
  209. data/spec/unit/transaction/additional_resource_generator_spec.rb +80 -65
  210. data/spec/unit/type/mount_spec.rb +51 -10
  211. data/spec/unit/type/service_spec.rb +16 -0
  212. data/spec/unit/type_spec.rb +14 -0
  213. data/spec/unit/util/feature_spec.rb +1 -1
  214. data/spec/unit/util/monkey_patches_spec.rb +60 -0
  215. data/spec/unit/util/network_device/cisco/device_spec.rb +1 -1
  216. metadata +63 -11
  217. data/lib/puppet/pops/types/types_meta.rb +0 -0
  218. data/spec/integration/provider/package_spec.rb +0 -35
@@ -1,307 +1,322 @@
1
1
  require 'spec_helper'
2
2
  require 'puppet/pops'
3
3
 
4
+ module Puppet::Pops
5
+ module Types
4
6
  describe 'The type factory' do
5
7
  context 'when creating' do
6
8
  it 'integer() returns PIntegerType' do
7
- expect(Puppet::Pops::Types::TypeFactory.integer().class()).to eq(Puppet::Pops::Types::PIntegerType)
9
+ expect(TypeFactory.integer().class()).to eq(PIntegerType)
8
10
  end
9
11
 
10
12
  it 'float() returns PFloatType' do
11
- expect(Puppet::Pops::Types::TypeFactory.float().class()).to eq(Puppet::Pops::Types::PFloatType)
13
+ expect(TypeFactory.float().class()).to eq(PFloatType)
12
14
  end
13
15
 
14
16
  it 'string() returns PStringType' do
15
- expect(Puppet::Pops::Types::TypeFactory.string().class()).to eq(Puppet::Pops::Types::PStringType)
17
+ expect(TypeFactory.string().class()).to eq(PStringType)
16
18
  end
17
19
 
18
20
  it 'boolean() returns PBooleanType' do
19
- expect(Puppet::Pops::Types::TypeFactory.boolean().class()).to eq(Puppet::Pops::Types::PBooleanType)
21
+ expect(TypeFactory.boolean().class()).to eq(PBooleanType)
20
22
  end
21
23
 
22
24
  it 'pattern() returns PPatternType' do
23
- expect(Puppet::Pops::Types::TypeFactory.pattern().class()).to eq(Puppet::Pops::Types::PPatternType)
25
+ expect(TypeFactory.pattern().class()).to eq(PPatternType)
24
26
  end
25
27
 
26
28
  it 'regexp() returns PRegexpType' do
27
- expect(Puppet::Pops::Types::TypeFactory.regexp().class()).to eq(Puppet::Pops::Types::PRegexpType)
29
+ expect(TypeFactory.regexp().class()).to eq(PRegexpType)
28
30
  end
29
31
 
30
32
  it 'enum() returns PEnumType' do
31
- expect(Puppet::Pops::Types::TypeFactory.enum().class()).to eq(Puppet::Pops::Types::PEnumType)
33
+ expect(TypeFactory.enum().class()).to eq(PEnumType)
32
34
  end
33
35
 
34
36
  it 'variant() returns PVariantType' do
35
- expect(Puppet::Pops::Types::TypeFactory.variant().class()).to eq(Puppet::Pops::Types::PVariantType)
37
+ expect(TypeFactory.variant().class()).to eq(PVariantType)
36
38
  end
37
39
 
38
40
  it 'scalar() returns PScalarType' do
39
- expect(Puppet::Pops::Types::TypeFactory.scalar().class()).to eq(Puppet::Pops::Types::PScalarType)
41
+ expect(TypeFactory.scalar().class()).to eq(PScalarType)
40
42
  end
41
43
 
42
44
  it 'data() returns PDataType' do
43
- expect(Puppet::Pops::Types::TypeFactory.data().class()).to eq(Puppet::Pops::Types::PDataType)
45
+ expect(TypeFactory.data().class()).to eq(PDataType)
44
46
  end
45
47
 
46
48
  it 'optional() returns POptionalType' do
47
- expect(Puppet::Pops::Types::TypeFactory.optional().class()).to eq(Puppet::Pops::Types::POptionalType)
49
+ expect(TypeFactory.optional().class()).to eq(POptionalType)
48
50
  end
49
51
 
50
52
  it 'collection() returns PCollectionType' do
51
- expect(Puppet::Pops::Types::TypeFactory.collection().class()).to eq(Puppet::Pops::Types::PCollectionType)
53
+ expect(TypeFactory.collection().class()).to eq(PCollectionType)
52
54
  end
53
55
 
54
56
  it 'catalog_entry() returns PCatalogEntryType' do
55
- expect(Puppet::Pops::Types::TypeFactory.catalog_entry().class()).to eq(Puppet::Pops::Types::PCatalogEntryType)
57
+ expect(TypeFactory.catalog_entry().class()).to eq(PCatalogEntryType)
56
58
  end
57
59
 
58
60
  it 'struct() returns PStructType' do
59
- expect(Puppet::Pops::Types::TypeFactory.struct().class()).to eq(Puppet::Pops::Types::PStructType)
61
+ expect(TypeFactory.struct().class()).to eq(PStructType)
62
+ end
63
+
64
+ it "object() returns PObjectType" do
65
+ expect(TypeFactory.object.class).to eq(PObjectType)
60
66
  end
61
67
 
62
68
  it 'tuple() returns PTupleType' do
63
- expect(Puppet::Pops::Types::TypeFactory.tuple.class()).to eq(Puppet::Pops::Types::PTupleType)
69
+ expect(TypeFactory.tuple.class()).to eq(PTupleType)
64
70
  end
65
71
 
66
72
  it 'undef() returns PUndefType' do
67
- expect(Puppet::Pops::Types::TypeFactory.undef().class()).to eq(Puppet::Pops::Types::PUndefType)
73
+ expect(TypeFactory.undef().class()).to eq(PUndefType)
74
+ end
75
+
76
+ it 'type_alias() returns PTypeAliasType' do
77
+ expect(TypeFactory.type_alias().class()).to eq(PTypeAliasType)
78
+ end
79
+
80
+ it 'sem_ver() returns PSemVerType' do
81
+ expect(TypeFactory.sem_ver.class).to eq(PSemVerType)
82
+ end
83
+
84
+ it 'sem_ver(r1, r2) returns constrained PSemVerType' do
85
+ expect(TypeFactory.sem_ver('1.x', '3.x').ranges).to include(Semantic::VersionRange.parse('1.x'), Semantic::VersionRange.parse('3.x'))
86
+ end
87
+
88
+ it 'sem_ver_range() returns PSemVerRangeType' do
89
+ expect(TypeFactory.sem_ver_range.class).to eq(PSemVerRangeType)
68
90
  end
69
91
 
70
92
  it 'default() returns PDefaultType' do
71
- expect(Puppet::Pops::Types::TypeFactory.default().class()).to eq(Puppet::Pops::Types::PDefaultType)
93
+ expect(TypeFactory.default().class()).to eq(PDefaultType)
72
94
  end
73
95
 
74
96
  it 'range(to, from) returns PIntegerType' do
75
- t = Puppet::Pops::Types::TypeFactory.range(1,2)
76
- expect(t.class()).to eq(Puppet::Pops::Types::PIntegerType)
97
+ t = TypeFactory.range(1,2)
98
+ expect(t.class()).to eq(PIntegerType)
77
99
  expect(t.from).to eq(1)
78
100
  expect(t.to).to eq(2)
79
101
  end
80
102
 
81
103
  it 'range(default, default) returns PIntegerType' do
82
- t = Puppet::Pops::Types::TypeFactory.range(:default,:default)
83
- expect(t.class()).to eq(Puppet::Pops::Types::PIntegerType)
104
+ t = TypeFactory.range(:default,:default)
105
+ expect(t.class()).to eq(PIntegerType)
84
106
  expect(t.from).to eq(nil)
85
107
  expect(t.to).to eq(nil)
86
108
  end
87
109
 
88
110
  it 'float_range(to, from) returns PFloatType' do
89
- t = Puppet::Pops::Types::TypeFactory.float_range(1.0, 2.0)
90
- expect(t.class()).to eq(Puppet::Pops::Types::PFloatType)
111
+ t = TypeFactory.float_range(1.0, 2.0)
112
+ expect(t.class()).to eq(PFloatType)
91
113
  expect(t.from).to eq(1.0)
92
114
  expect(t.to).to eq(2.0)
93
115
  end
94
116
 
95
117
  it 'float_range(default, default) returns PFloatType' do
96
- t = Puppet::Pops::Types::TypeFactory.float_range(:default, :default)
97
- expect(t.class()).to eq(Puppet::Pops::Types::PFloatType)
118
+ t = TypeFactory.float_range(:default, :default)
119
+ expect(t.class()).to eq(PFloatType)
98
120
  expect(t.from).to eq(nil)
99
121
  expect(t.to).to eq(nil)
100
122
  end
101
123
 
102
124
  it 'resource() creates a generic PResourceType' do
103
- pr = Puppet::Pops::Types::TypeFactory.resource()
104
- expect(pr.class()).to eq(Puppet::Pops::Types::PResourceType)
125
+ pr = TypeFactory.resource()
126
+ expect(pr.class()).to eq(PResourceType)
105
127
  expect(pr.type_name).to eq(nil)
106
128
  end
107
129
 
108
130
  it 'resource(x) creates a PResourceType[x]' do
109
- pr = Puppet::Pops::Types::TypeFactory.resource('x')
110
- expect(pr.class()).to eq(Puppet::Pops::Types::PResourceType)
111
- expect(pr.type_name).to eq('x')
131
+ pr = TypeFactory.resource('x')
132
+ expect(pr.class()).to eq(PResourceType)
133
+ expect(pr.type_name).to eq('X')
112
134
  end
113
135
 
114
136
  it 'host_class() creates a generic PHostClassType' do
115
- hc = Puppet::Pops::Types::TypeFactory.host_class()
116
- expect(hc.class()).to eq(Puppet::Pops::Types::PHostClassType)
137
+ hc = TypeFactory.host_class()
138
+ expect(hc.class()).to eq(PHostClassType)
117
139
  expect(hc.class_name).to eq(nil)
118
140
  end
119
141
 
120
142
  it 'host_class(x) creates a PHostClassType[x]' do
121
- hc = Puppet::Pops::Types::TypeFactory.host_class('x')
122
- expect(hc.class()).to eq(Puppet::Pops::Types::PHostClassType)
143
+ hc = TypeFactory.host_class('x')
144
+ expect(hc.class()).to eq(PHostClassType)
123
145
  expect(hc.class_name).to eq('x')
124
146
  end
125
147
 
126
148
  it 'host_class(::x) creates a PHostClassType[x]' do
127
- hc = Puppet::Pops::Types::TypeFactory.host_class('::x')
128
- expect(hc.class()).to eq(Puppet::Pops::Types::PHostClassType)
149
+ hc = TypeFactory.host_class('::x')
150
+ expect(hc.class()).to eq(PHostClassType)
129
151
  expect(hc.class_name).to eq('x')
130
152
  end
131
153
 
132
154
  it 'array_of(fixnum) returns PArrayType[PIntegerType]' do
133
- at = Puppet::Pops::Types::TypeFactory.array_of(1)
134
- expect(at.class()).to eq(Puppet::Pops::Types::PArrayType)
135
- expect(at.element_type.class).to eq(Puppet::Pops::Types::PIntegerType)
155
+ at = TypeFactory.array_of(1)
156
+ expect(at.class()).to eq(PArrayType)
157
+ expect(at.element_type.class).to eq(PIntegerType)
136
158
  end
137
159
 
138
160
  it 'array_of(PIntegerType) returns PArrayType[PIntegerType]' do
139
- at = Puppet::Pops::Types::TypeFactory.array_of(Puppet::Pops::Types::PIntegerType::DEFAULT)
140
- expect(at.class()).to eq(Puppet::Pops::Types::PArrayType)
141
- expect(at.element_type.class).to eq(Puppet::Pops::Types::PIntegerType)
161
+ at = TypeFactory.array_of(PIntegerType::DEFAULT)
162
+ expect(at.class()).to eq(PArrayType)
163
+ expect(at.element_type.class).to eq(PIntegerType)
142
164
  end
143
165
 
144
166
  it 'array_of_data returns PArrayType[PDataType]' do
145
- at = Puppet::Pops::Types::TypeFactory.array_of_data
146
- expect(at.class()).to eq(Puppet::Pops::Types::PArrayType)
147
- expect(at.element_type.class).to eq(Puppet::Pops::Types::PDataType)
167
+ at = TypeFactory.array_of_data
168
+ expect(at.class()).to eq(PArrayType)
169
+ expect(at.element_type.class).to eq(PDataType)
148
170
  end
149
171
 
150
172
  it 'hash_of_data returns PHashType[PScalarType,PDataType]' do
151
- ht = Puppet::Pops::Types::TypeFactory.hash_of_data
152
- expect(ht.class()).to eq(Puppet::Pops::Types::PHashType)
153
- expect(ht.key_type.class).to eq(Puppet::Pops::Types::PScalarType)
154
- expect(ht.element_type.class).to eq(Puppet::Pops::Types::PDataType)
173
+ ht = TypeFactory.hash_of_data
174
+ expect(ht.class()).to eq(PHashType)
175
+ expect(ht.key_type.class).to eq(PScalarType)
176
+ expect(ht.element_type.class).to eq(PDataType)
155
177
  end
156
178
 
157
179
  it 'ruby(1) returns PRuntimeType[ruby, \'Fixnum\']' do
158
- ht = Puppet::Pops::Types::TypeFactory.ruby(1)
159
- expect(ht.class()).to eq(Puppet::Pops::Types::PRuntimeType)
180
+ ht = TypeFactory.ruby(1)
181
+ expect(ht.class()).to eq(PRuntimeType)
160
182
  expect(ht.runtime).to eq(:ruby)
161
183
  expect(ht.runtime_type_name).to eq('Fixnum')
162
184
  end
163
185
 
164
186
  it 'a size constrained collection can be created from array' do
165
- t = Puppet::Pops::Types::TypeFactory.array_of(Puppet::Pops::Types::TypeFactory.data, Puppet::Pops::Types::TypeFactory.range(1,2))
166
- expect(t.size_type.class).to eq(Puppet::Pops::Types::PIntegerType)
187
+ t = TypeFactory.array_of(TypeFactory.data, TypeFactory.range(1,2))
188
+ expect(t.size_type.class).to eq(PIntegerType)
167
189
  expect(t.size_type.from).to eq(1)
168
190
  expect(t.size_type.to).to eq(2)
169
191
  end
170
192
 
171
193
  it 'a size constrained collection can be created from hash' do
172
- t = Puppet::Pops::Types::TypeFactory.hash_of(Puppet::Pops::Types::TypeFactory.scalar, Puppet::Pops::Types::TypeFactory.data, Puppet::Pops::Types::TypeFactory.range(1,2))
173
- expect(t.size_type.class).to eq(Puppet::Pops::Types::PIntegerType)
194
+ t = TypeFactory.hash_of(TypeFactory.scalar, TypeFactory.data, TypeFactory.range(1,2))
195
+ expect(t.size_type.class).to eq(PIntegerType)
174
196
  expect(t.size_type.from).to eq(1)
175
197
  expect(t.size_type.to).to eq(2)
176
198
  end
177
199
 
178
- it 'it is illegal to create a typed empty array' do
179
- expect {
180
- Puppet::Pops::Types::TypeFactory.array_of(Puppet::Pops::Types::TypeFactory.data, Puppet::Pops::Types::TypeFactory.range(0,0))
181
- }.to raise_error(/An empty collection may not specify an element type/)
182
- end
183
-
184
- it 'it is legal to create an empty array of unit element type' do
185
- t = Puppet::Pops::Types::TypeFactory.array_of(Puppet::Pops::Types::PUnitType::DEFAULT, Puppet::Pops::Types::TypeFactory.range(0,0))
200
+ it 'a typed empty array, the resulting array erases the type' do
201
+ t = Puppet::Pops::Types::TypeFactory.array_of(Puppet::Pops::Types::TypeFactory.data, Puppet::Pops::Types::TypeFactory.range(0,0))
186
202
  expect(t.size_type.class).to eq(Puppet::Pops::Types::PIntegerType)
187
203
  expect(t.size_type.from).to eq(0)
188
204
  expect(t.size_type.to).to eq(0)
205
+ expect(t.element_type).to eq(Puppet::Pops::Types::PUnitType::DEFAULT)
189
206
  end
190
207
 
191
- it 'it is illegal to create a typed empty hash' do
192
- expect {
193
- Puppet::Pops::Types::TypeFactory.hash_of(Puppet::Pops::Types::TypeFactory.scalar, Puppet::Pops::Types::TypeFactory.data, Puppet::Pops::Types::TypeFactory.range(0,0))
194
- }.to raise_error(/An empty collection may not specify an element type/)
195
- end
196
-
197
- it 'it is legal to create an empty hash where key and value types are of Unit type' do
198
- t = Puppet::Pops::Types::TypeFactory.hash_of(Puppet::Pops::Types::PUnitType::DEFAULT, Puppet::Pops::Types::PUnitType::DEFAULT, Puppet::Pops::Types::TypeFactory.range(0,0))
208
+ it 'a typed empty hash, the resulting hash erases the key and value type' do
209
+ t = Puppet::Pops::Types::TypeFactory.hash_of(Puppet::Pops::Types::TypeFactory.scalar, Puppet::Pops::Types::TypeFactory.data, Puppet::Pops::Types::TypeFactory.range(0,0))
199
210
  expect(t.size_type.class).to eq(Puppet::Pops::Types::PIntegerType)
200
211
  expect(t.size_type.from).to eq(0)
201
212
  expect(t.size_type.to).to eq(0)
213
+ expect(t.key_type).to eq(Puppet::Pops::Types::PUnitType::DEFAULT)
214
+ expect(t.element_type).to eq(Puppet::Pops::Types::PUnitType::DEFAULT)
202
215
  end
203
216
 
204
217
  context 'callable types' do
205
218
  it 'the callable methods produces a Callable' do
206
- t = Puppet::Pops::Types::TypeFactory.callable()
207
- expect(t.class).to be(Puppet::Pops::Types::PCallableType)
208
- expect(t.param_types.class).to be(Puppet::Pops::Types::PTupleType)
219
+ t = TypeFactory.callable()
220
+ expect(t.class).to be(PCallableType)
221
+ expect(t.param_types.class).to be(PTupleType)
209
222
  expect(t.param_types.types).to be_empty
210
223
  expect(t.block_type).to be_nil
211
224
  end
212
225
 
213
226
  it 'callable method with types produces the corresponding Tuple for parameters and generated names' do
214
- tf = Puppet::Pops::Types::TypeFactory
227
+ tf = TypeFactory
215
228
  t = tf.callable(tf.integer, tf.string)
216
- expect(t.class).to be(Puppet::Pops::Types::PCallableType)
217
- expect(t.param_types.class).to be(Puppet::Pops::Types::PTupleType)
229
+ expect(t.class).to be(PCallableType)
230
+ expect(t.param_types.class).to be(PTupleType)
218
231
  expect(t.param_types.types).to eql([tf.integer, tf.string])
219
232
  expect(t.block_type).to be_nil
220
233
  end
221
234
 
222
235
  it 'callable accepts min range to be given' do
223
- tf = Puppet::Pops::Types::TypeFactory
236
+ tf = TypeFactory
224
237
  t = tf.callable(tf.integer, tf.string, 1)
225
- expect(t.class).to be(Puppet::Pops::Types::PCallableType)
226
- expect(t.param_types.class).to be(Puppet::Pops::Types::PTupleType)
238
+ expect(t.class).to be(PCallableType)
239
+ expect(t.param_types.class).to be(PTupleType)
227
240
  expect(t.param_types.size_type.from).to eql(1)
228
241
  expect(t.param_types.size_type.to).to be_nil
229
242
  end
230
243
 
231
244
  it 'callable accepts max range to be given' do
232
- tf = Puppet::Pops::Types::TypeFactory
245
+ tf = TypeFactory
233
246
  t = tf.callable(tf.integer, tf.string, 1, 3)
234
- expect(t.class).to be(Puppet::Pops::Types::PCallableType)
235
- expect(t.param_types.class).to be(Puppet::Pops::Types::PTupleType)
247
+ expect(t.class).to be(PCallableType)
248
+ expect(t.param_types.class).to be(PTupleType)
236
249
  expect(t.param_types.size_type.from).to eql(1)
237
250
  expect(t.param_types.size_type.to).to eql(3)
238
251
  end
239
252
 
240
253
  it 'callable accepts max range to be given as :default' do
241
- tf = Puppet::Pops::Types::TypeFactory
254
+ tf = TypeFactory
242
255
  t = tf.callable(tf.integer, tf.string, 1, :default)
243
- expect(t.class).to be(Puppet::Pops::Types::PCallableType)
244
- expect(t.param_types.class).to be(Puppet::Pops::Types::PTupleType)
256
+ expect(t.class).to be(PCallableType)
257
+ expect(t.param_types.class).to be(PTupleType)
245
258
  expect(t.param_types.size_type.from).to eql(1)
246
259
  expect(t.param_types.size_type.to).to be_nil
247
260
  end
248
261
 
249
262
  it 'the all_callables method produces a Callable matching any Callable' do
250
- t = Puppet::Pops::Types::TypeFactory.all_callables()
251
- expect(t.class).to be(Puppet::Pops::Types::PCallableType)
263
+ t = TypeFactory.all_callables()
264
+ expect(t.class).to be(PCallableType)
252
265
  expect(t.param_types).to be_nil
253
266
  expect(t.block_type).to be_nil
254
267
  end
255
268
 
256
269
  it 'with block are created by placing a Callable last' do
257
- block_t = Puppet::Pops::Types::TypeFactory.callable(String)
258
- t = Puppet::Pops::Types::TypeFactory.callable(String, block_t)
270
+ block_t = TypeFactory.callable(String)
271
+ t = TypeFactory.callable(String, block_t)
259
272
  expect(t.block_type).to be(block_t)
260
273
  end
261
274
 
262
275
  it 'min size constraint can be used with a block last' do
263
- block_t = Puppet::Pops::Types::TypeFactory.callable(String)
264
- t = Puppet::Pops::Types::TypeFactory.callable(String, 1, block_t)
276
+ block_t = TypeFactory.callable(String)
277
+ t = TypeFactory.callable(String, 1, block_t)
265
278
  expect(t.block_type).to be(block_t)
266
279
  expect(t.param_types.size_type.from).to eql(1)
267
280
  expect(t.param_types.size_type.to).to be_nil
268
281
  end
269
282
 
270
283
  it 'min, max size constraint can be used with a block last' do
271
- block_t = Puppet::Pops::Types::TypeFactory.callable(String)
272
- t = Puppet::Pops::Types::TypeFactory.callable(String, 1, 3, block_t)
284
+ block_t = TypeFactory.callable(String)
285
+ t = TypeFactory.callable(String, 1, 3, block_t)
273
286
  expect(t.block_type).to be(block_t)
274
287
  expect(t.param_types.size_type.from).to eql(1)
275
288
  expect(t.param_types.size_type.to).to eql(3)
276
289
  end
277
290
 
278
291
  it 'the with_block methods decorates a Callable with a block_type' do
279
- t = Puppet::Pops::Types::TypeFactory.callable
280
- t2 = Puppet::Pops::Types::TypeFactory.callable(t)
292
+ t = TypeFactory.callable
293
+ t2 = TypeFactory.callable(t)
281
294
  block_t = t2.block_type
282
295
  # given t is returned after mutation
283
296
  expect(block_t).to be(t)
284
- expect(block_t.class).to be(Puppet::Pops::Types::PCallableType)
285
- expect(block_t.param_types.class).to be(Puppet::Pops::Types::PTupleType)
297
+ expect(block_t.class).to be(PCallableType)
298
+ expect(block_t.param_types.class).to be(PTupleType)
286
299
  expect(block_t.param_types.types).to be_empty
287
300
  expect(block_t.block_type).to be_nil
288
301
  end
289
302
 
290
303
  it 'the with_optional_block methods decorates a Callable with an optional block_type' do
291
- b = Puppet::Pops::Types::TypeFactory.callable
292
- t = Puppet::Pops::Types::TypeFactory.optional(b)
293
- t2 = Puppet::Pops::Types::TypeFactory.callable(t)
304
+ b = TypeFactory.callable
305
+ t = TypeFactory.optional(b)
306
+ t2 = TypeFactory.callable(t)
294
307
  opt_t = t2.block_type
295
- expect(opt_t.class).to be(Puppet::Pops::Types::POptionalType)
308
+ expect(opt_t.class).to be(POptionalType)
296
309
  block_t = opt_t.optional_type
297
310
  # given t is returned after mutation
298
311
  expect(opt_t).to be(t)
299
312
  expect(block_t).to be(b)
300
- expect(block_t.class).to be(Puppet::Pops::Types::PCallableType)
301
- expect(block_t.param_types.class).to be(Puppet::Pops::Types::PTupleType)
313
+ expect(block_t.class).to be(PCallableType)
314
+ expect(block_t.param_types.class).to be(PTupleType)
302
315
  expect(block_t.param_types.types).to be_empty
303
316
  expect(block_t.block_type).to be_nil
304
317
  end
305
318
  end
306
319
  end
307
320
  end
321
+ end
322
+ end
@@ -6,6 +6,68 @@ describe 'The type formatter' do
6
6
  let(:s) { TypeFormatter.new }
7
7
  let(:f) { TypeFactory }
8
8
 
9
+ def drop_indent(str)
10
+ ld = str.index("\n")
11
+ if ld.nil?
12
+ str
13
+ else
14
+ str.gsub(Regexp.compile("^ {#{ld - 1}}"), '')
15
+ end
16
+ end
17
+
18
+ context 'when representing a literal as a string' do
19
+ {
20
+ 'true' => true,
21
+ 'false' => false,
22
+ '?' => nil,
23
+ '23.4' => 23.4,
24
+ '145' => 145,
25
+ "'string'" => 'string',
26
+ '/expr/' => /expr/,
27
+ '[1, 2, 3]' => [1, 2, 3],
28
+ "{'a' => 32, 'b' => [1, 2, 3]}" => {'a' => 32,'b' => [1, 2, 3]}
29
+ }.each_pair do |str, value|
30
+ it "should yield '#{str}' for a value of #{str}" do
31
+ expect(s.string(value)).to eq(str)
32
+ end
33
+ end
34
+ end
35
+
36
+ context 'when using indent' do
37
+ it 'should put hash entries on new indented lines' do
38
+ expect(s.indented_string({'a' => 32,'b' => [1, 2, {'c' => 'd'}]})).to eq(<<-FORMATTED)
39
+ {
40
+ 'a' => 32,
41
+ 'b' => [1, 2, {
42
+ 'c' => 'd'
43
+ }]
44
+ }
45
+ FORMATTED
46
+ end
47
+
48
+ it 'should start on given indent level' do
49
+ expect(s.indented_string({'a' => 32,'b' => [1, 2, {'c' => 'd'}]}, 3)).to eq(<<-FORMATTED)
50
+ {
51
+ 'a' => 32,
52
+ 'b' => [1, 2, {
53
+ 'c' => 'd'
54
+ }]
55
+ }
56
+ FORMATTED
57
+ end
58
+
59
+ it 'should use given indent width' do
60
+ expect(s.indented_string({'a' => 32,'b' => [1, 2, {'c' => 'd'}]}, 2, 4)).to eq(<<-FORMATTED)
61
+ {
62
+ 'a' => 32,
63
+ 'b' => [1, 2, {
64
+ 'c' => 'd'
65
+ }]
66
+ }
67
+ FORMATTED
68
+ end
69
+ end
70
+
9
71
  context 'when representing the type as string' do
10
72
  include_context 'types_setup'
11
73
 
@@ -252,12 +314,12 @@ describe 'The type formatter' do
252
314
 
253
315
  it "should yield the name of an unparameterized type reference" do
254
316
  t = f.type_reference('What')
255
- expect(s.string(t)).to eq('What')
317
+ expect(s.string(t)).to eq("TypeReference['What']")
256
318
  end
257
319
 
258
320
  it "should yield the name and arguments of an parameterized type reference" do
259
- t = f.type_reference('What', [f.undef, f.string])
260
- expect(s.string(t)).to eq('What[Undef, String]')
321
+ t = f.type_reference('What[Undef, String]')
322
+ expect(s.string(t)).to eq("TypeReference['What[Undef, String]']")
261
323
  end
262
324
 
263
325
  it "should yield the name of a type alias" do
@@ -266,19 +328,24 @@ describe 'The type formatter' do
266
328
  end
267
329
 
268
330
  it "should yield 'Type[Runtime[ruby, Puppet]]' for the Puppet module" do
269
- expect(s.string(Puppet)).to eq('Runtime[ruby, "Puppet"]')
331
+ expect(s.string(Puppet)).to eq("Runtime[ruby, 'Puppet']")
270
332
  end
271
333
 
272
334
  it "should yield 'Type[Runtime[ruby, Puppet::Pops]]' for the Puppet::Resource class" do
273
- expect(s.string(Puppet::Resource)).to eq('Runtime[ruby, "Puppet::Resource"]')
335
+ expect(s.string(Puppet::Resource)).to eq("Runtime[ruby, 'Puppet::Resource']")
336
+ end
337
+
338
+ it "should yield \"SemVer['1.x', '3.x']\" for the PSemVerType['1.x', '3.x']" do
339
+ expect(s.string(PSemVerType.new('1.x', '3.x'))).to eq("SemVer['1.x', '3.x']")
274
340
  end
275
341
 
276
342
  it 'should present a valid simple name' do
277
- (all_types - [PType]).each do |t|
343
+ (all_types - [PType, PHostClassType]).each do |t|
278
344
  name = t::DEFAULT.simple_name
279
345
  expect(t.name).to match("^Puppet::Pops::Types::P#{name}Type$")
280
346
  end
281
347
  expect(PType::DEFAULT.simple_name).to eql('Type')
348
+ expect(PHostClassType::DEFAULT.simple_name).to eql('Class')
282
349
  end
283
350
  end
284
351
  end