pdk 2.4.0 → 2.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (153) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1336 -1329
  3. data/LICENSE +201 -201
  4. data/README.md +163 -163
  5. data/exe/pdk +10 -10
  6. data/lib/pdk/analytics/client/google_analytics.rb +143 -143
  7. data/lib/pdk/analytics/client/noop.rb +25 -25
  8. data/lib/pdk/analytics/util.rb +19 -19
  9. data/lib/pdk/analytics.rb +30 -30
  10. data/lib/pdk/answer_file.rb +12 -12
  11. data/lib/pdk/bolt.rb +19 -19
  12. data/lib/pdk/cli/build.rb +82 -82
  13. data/lib/pdk/cli/bundle.rb +48 -48
  14. data/lib/pdk/cli/config/get.rb +26 -26
  15. data/lib/pdk/cli/config.rb +22 -22
  16. data/lib/pdk/cli/console.rb +148 -148
  17. data/lib/pdk/cli/convert.rb +52 -52
  18. data/lib/pdk/cli/env.rb +52 -52
  19. data/lib/pdk/cli/errors.rb +25 -25
  20. data/lib/pdk/cli/exec/command.rb +293 -293
  21. data/lib/pdk/cli/exec/interactive_command.rb +114 -114
  22. data/lib/pdk/cli/exec.rb +84 -84
  23. data/lib/pdk/cli/exec_group.rb +104 -104
  24. data/lib/pdk/cli/get/config.rb +24 -24
  25. data/lib/pdk/cli/get.rb +20 -20
  26. data/lib/pdk/cli/module/build.rb +12 -12
  27. data/lib/pdk/cli/module/generate.rb +47 -47
  28. data/lib/pdk/cli/module.rb +14 -14
  29. data/lib/pdk/cli/new/class.rb +32 -32
  30. data/lib/pdk/cli/new/defined_type.rb +32 -32
  31. data/lib/pdk/cli/new/fact.rb +29 -29
  32. data/lib/pdk/cli/new/function.rb +29 -29
  33. data/lib/pdk/cli/new/module.rb +53 -53
  34. data/lib/pdk/cli/new/provider.rb +29 -29
  35. data/lib/pdk/cli/new/task.rb +34 -34
  36. data/lib/pdk/cli/new/test.rb +52 -52
  37. data/lib/pdk/cli/new/transport.rb +27 -27
  38. data/lib/pdk/cli/new.rb +21 -21
  39. data/lib/pdk/cli/release/prep.rb +39 -39
  40. data/lib/pdk/cli/release/publish.rb +50 -50
  41. data/lib/pdk/cli/release.rb +194 -194
  42. data/lib/pdk/cli/remove/config.rb +80 -80
  43. data/lib/pdk/cli/remove.rb +20 -20
  44. data/lib/pdk/cli/set/config.rb +119 -119
  45. data/lib/pdk/cli/set.rb +20 -20
  46. data/lib/pdk/cli/test/unit.rb +90 -90
  47. data/lib/pdk/cli/test.rb +11 -11
  48. data/lib/pdk/cli/update.rb +64 -64
  49. data/lib/pdk/cli/util/command_redirector.rb +27 -27
  50. data/lib/pdk/cli/util/interview.rb +72 -72
  51. data/lib/pdk/cli/util/option_normalizer.rb +55 -55
  52. data/lib/pdk/cli/util/option_validator.rb +68 -68
  53. data/lib/pdk/cli/util/spinner.rb +13 -13
  54. data/lib/pdk/cli/util/update_manager_printer.rb +82 -82
  55. data/lib/pdk/cli/util.rb +305 -305
  56. data/lib/pdk/cli/validate.rb +116 -116
  57. data/lib/pdk/cli.rb +175 -175
  58. data/lib/pdk/config/analytics_schema.json +26 -26
  59. data/lib/pdk/config/errors.rb +5 -5
  60. data/lib/pdk/config/ini_file.rb +183 -183
  61. data/lib/pdk/config/ini_file_setting.rb +39 -39
  62. data/lib/pdk/config/json.rb +34 -34
  63. data/lib/pdk/config/json_schema_namespace.rb +142 -142
  64. data/lib/pdk/config/json_schema_setting.rb +53 -53
  65. data/lib/pdk/config/json_with_schema.rb +49 -49
  66. data/lib/pdk/config/namespace.rb +354 -354
  67. data/lib/pdk/config/setting.rb +135 -135
  68. data/lib/pdk/config/validator.rb +31 -31
  69. data/lib/pdk/config/yaml.rb +46 -46
  70. data/lib/pdk/config/yaml_with_schema.rb +59 -59
  71. data/lib/pdk/config.rb +390 -390
  72. data/lib/pdk/context/control_repo.rb +60 -60
  73. data/lib/pdk/context/module.rb +28 -28
  74. data/lib/pdk/context/none.rb +22 -22
  75. data/lib/pdk/context.rb +99 -99
  76. data/lib/pdk/control_repo.rb +90 -90
  77. data/lib/pdk/generate/defined_type.rb +43 -43
  78. data/lib/pdk/generate/fact.rb +25 -25
  79. data/lib/pdk/generate/function.rb +48 -48
  80. data/lib/pdk/generate/module.rb +352 -352
  81. data/lib/pdk/generate/provider.rb +28 -28
  82. data/lib/pdk/generate/puppet_class.rb +43 -43
  83. data/lib/pdk/generate/puppet_object.rb +232 -232
  84. data/lib/pdk/generate/task.rb +68 -68
  85. data/lib/pdk/generate/transport.rb +33 -33
  86. data/lib/pdk/generate.rb +24 -24
  87. data/lib/pdk/i18n.rb +4 -4
  88. data/lib/pdk/logger.rb +45 -45
  89. data/lib/pdk/module/build.rb +322 -322
  90. data/lib/pdk/module/convert.rb +296 -296
  91. data/lib/pdk/module/metadata.rb +202 -202
  92. data/lib/pdk/module/release.rb +260 -260
  93. data/lib/pdk/module/update.rb +131 -131
  94. data/lib/pdk/module/update_manager.rb +227 -227
  95. data/lib/pdk/module.rb +30 -30
  96. data/lib/pdk/report/event.rb +370 -370
  97. data/lib/pdk/report.rb +121 -121
  98. data/lib/pdk/template/fetcher/git.rb +85 -85
  99. data/lib/pdk/template/fetcher/local.rb +28 -28
  100. data/lib/pdk/template/fetcher.rb +98 -98
  101. data/lib/pdk/template/renderer/v1/legacy_template_dir.rb +116 -116
  102. data/lib/pdk/template/renderer/v1/renderer.rb +132 -132
  103. data/lib/pdk/template/renderer/v1/template_file.rb +102 -102
  104. data/lib/pdk/template/renderer/v1.rb +25 -25
  105. data/lib/pdk/template/renderer.rb +96 -96
  106. data/lib/pdk/template/template_dir.rb +67 -67
  107. data/lib/pdk/template.rb +59 -59
  108. data/lib/pdk/tests/unit.rb +252 -252
  109. data/lib/pdk/util/bundler.rb +259 -259
  110. data/lib/pdk/util/changelog_generator.rb +137 -137
  111. data/lib/pdk/util/env.rb +47 -47
  112. data/lib/pdk/util/filesystem.rb +138 -138
  113. data/lib/pdk/util/git.rb +179 -179
  114. data/lib/pdk/util/json_finder.rb +85 -85
  115. data/lib/pdk/util/puppet_strings.rb +125 -125
  116. data/lib/pdk/util/puppet_version.rb +266 -266
  117. data/lib/pdk/util/ruby_version.rb +179 -179
  118. data/lib/pdk/util/template_uri.rb +295 -295
  119. data/lib/pdk/util/vendored_file.rb +93 -93
  120. data/lib/pdk/util/version.rb +43 -43
  121. data/lib/pdk/util/windows/api_types.rb +82 -82
  122. data/lib/pdk/util/windows/file.rb +36 -36
  123. data/lib/pdk/util/windows/process.rb +79 -79
  124. data/lib/pdk/util/windows/string.rb +16 -16
  125. data/lib/pdk/util/windows.rb +15 -15
  126. data/lib/pdk/util.rb +278 -278
  127. data/lib/pdk/validate/control_repo/control_repo_validator_group.rb +23 -23
  128. data/lib/pdk/validate/control_repo/environment_conf_validator.rb +98 -98
  129. data/lib/pdk/validate/external_command_validator.rb +208 -208
  130. data/lib/pdk/validate/internal_ruby_validator.rb +100 -100
  131. data/lib/pdk/validate/invokable_validator.rb +228 -228
  132. data/lib/pdk/validate/metadata/metadata_json_lint_validator.rb +86 -86
  133. data/lib/pdk/validate/metadata/metadata_syntax_validator.rb +78 -78
  134. data/lib/pdk/validate/metadata/metadata_validator_group.rb +20 -20
  135. data/lib/pdk/validate/puppet/puppet_epp_validator.rb +133 -133
  136. data/lib/pdk/validate/puppet/puppet_lint_validator.rb +66 -66
  137. data/lib/pdk/validate/puppet/puppet_syntax_validator.rb +137 -137
  138. data/lib/pdk/validate/puppet/puppet_validator_group.rb +21 -21
  139. data/lib/pdk/validate/ruby/ruby_rubocop_validator.rb +80 -80
  140. data/lib/pdk/validate/ruby/ruby_validator_group.rb +19 -19
  141. data/lib/pdk/validate/tasks/tasks_metadata_lint_validator.rb +88 -88
  142. data/lib/pdk/validate/tasks/tasks_name_validator.rb +50 -50
  143. data/lib/pdk/validate/tasks/tasks_validator_group.rb +20 -20
  144. data/lib/pdk/validate/validator.rb +118 -118
  145. data/lib/pdk/validate/validator_group.rb +104 -104
  146. data/lib/pdk/validate/yaml/yaml_syntax_validator.rb +95 -95
  147. data/lib/pdk/validate/yaml/yaml_validator_group.rb +19 -19
  148. data/lib/pdk/validate.rb +94 -94
  149. data/lib/pdk/version.rb +4 -4
  150. data/lib/pdk.rb +76 -76
  151. data/locales/config.yaml +21 -21
  152. data/locales/pdk.pot +2111 -2094
  153. metadata +3 -3
@@ -1,202 +1,202 @@
1
- require 'pdk'
2
-
3
- module PDK
4
- module Module
5
- class Metadata
6
- attr_accessor :data
7
-
8
- OPERATING_SYSTEMS = {
9
- 'RedHat based Linux' => [
10
- {
11
- 'operatingsystem' => 'CentOS',
12
- 'operatingsystemrelease' => ['7'],
13
- },
14
- {
15
- 'operatingsystem' => 'OracleLinux',
16
- 'operatingsystemrelease' => ['7'],
17
- },
18
- {
19
- 'operatingsystem' => 'RedHat',
20
- 'operatingsystemrelease' => ['8'],
21
- },
22
- {
23
- 'operatingsystem' => 'Scientific',
24
- 'operatingsystemrelease' => ['7'],
25
- },
26
- ],
27
- 'Debian based Linux' => [
28
- {
29
- 'operatingsystem' => 'Debian',
30
- 'operatingsystemrelease' => ['10'],
31
- },
32
- {
33
- 'operatingsystem' => 'Ubuntu',
34
- 'operatingsystemrelease' => ['18.04'],
35
- },
36
- ],
37
- 'Fedora' => {
38
- 'operatingsystem' => 'Fedora',
39
- 'operatingsystemrelease' => ['29'],
40
- },
41
- 'OSX' => {
42
- 'operatingsystem' => 'Darwin',
43
- 'operatingsystemrelease' => ['16'],
44
- },
45
- 'SLES' => {
46
- 'operatingsystem' => 'SLES',
47
- 'operatingsystemrelease' => ['15'],
48
- },
49
- 'Solaris' => {
50
- 'operatingsystem' => 'Solaris',
51
- 'operatingsystemrelease' => ['11'],
52
- },
53
- 'Windows' => {
54
- 'operatingsystem' => 'windows',
55
- 'operatingsystemrelease' => %w[2019 10],
56
- },
57
- 'AIX' => {
58
- 'operatingsystem' => 'AIX',
59
- 'operatingsystemrelease' => %w[6.1 7.1 7.2],
60
- },
61
- }.freeze
62
-
63
- DEFAULT_OPERATING_SYSTEMS = [
64
- 'RedHat based Linux',
65
- 'Debian based Linux',
66
- 'Windows',
67
- ].freeze
68
-
69
- DEFAULTS = {
70
- 'name' => nil,
71
- 'version' => '0.1.0',
72
- 'author' => nil,
73
- 'summary' => '',
74
- 'license' => 'Apache-2.0',
75
- 'source' => '',
76
- 'project_page' => nil,
77
- 'issues_url' => nil,
78
- 'dependencies' => [],
79
- 'data_provider' => nil,
80
- 'operatingsystem_support' => DEFAULT_OPERATING_SYSTEMS.map { |os_name|
81
- OPERATING_SYSTEMS[os_name]
82
- }.flatten,
83
- 'requirements' => [
84
- { 'name' => 'puppet', 'version_requirement' => '>= 6.21.0 < 8.0.0' },
85
- ],
86
- }.freeze
87
-
88
- def initialize(params = {})
89
- @data = DEFAULTS.dup
90
- update!(params) if params
91
- end
92
-
93
- def self.from_file(metadata_json_path)
94
- if metadata_json_path.nil?
95
- raise ArgumentError, _('Cannot read metadata from file: no path to file was given.')
96
- end
97
-
98
- unless PDK::Util::Filesystem.file?(metadata_json_path)
99
- raise ArgumentError, _("'%{file}' does not exist or is not a file.") % { file: metadata_json_path }
100
- end
101
-
102
- unless PDK::Util::Filesystem.readable?(metadata_json_path)
103
- raise ArgumentError, _("Unable to open '%{file}' for reading.") % { file: metadata_json_path }
104
- end
105
-
106
- require 'json'
107
- begin
108
- data = JSON.parse(PDK::Util::Filesystem.read_file(metadata_json_path))
109
- rescue JSON::JSONError => e
110
- raise ArgumentError, _('Invalid JSON in metadata.json: %{msg}') % { msg: e.message }
111
- end
112
-
113
- require 'pdk/util'
114
- data['template-url'] = PDK::Util::TemplateURI.default_template_uri.metadata_format if PDK::Util.package_install? && data['template-url'] == PDK::Util::TemplateURI::PACKAGED_TEMPLATE_KEYWORD
115
- new(data)
116
- end
117
-
118
- def update!(data)
119
- # TODO: validate all data
120
- process_name(data) if data['name']
121
- @data.merge!(data)
122
- self
123
- end
124
-
125
- def to_json
126
- require 'json'
127
-
128
- JSON.pretty_generate(@data.dup.delete_if { |_key, value| value.nil? })
129
- end
130
-
131
- def write!(path)
132
- PDK::Util::Filesystem.write_file(path, to_json)
133
- end
134
-
135
- def forge_ready?
136
- missing_fields.empty?
137
- end
138
-
139
- def interview_for_forge!
140
- require 'pdk/generate/module'
141
-
142
- PDK::Generate::Module.module_interview(self, only_ask: missing_fields)
143
- end
144
-
145
- def validate_puppet_version_requirement!
146
- msgs = {
147
- no_reqs: _('Module metadata does not contain any requirements.'),
148
- no_puppet_req: _('Module metadata does not contain a "puppet" requirement.'),
149
- no_puppet_ver: _('The "puppet" requirement in module metadata does not specify a "version_requirement".'),
150
- }
151
-
152
- raise ArgumentError, msgs[:no_reqs] unless @data.key?('requirements')
153
- raise ArgumentError, msgs[:no_puppet_req] if puppet_requirement.nil?
154
- raise ArgumentError, msgs[:no_puppet_ver] unless puppet_requirement.key?('version_requirement')
155
- raise ArgumentError, msgs[:no_puppet_ver] if puppet_requirement['version_requirement'].empty?
156
- end
157
-
158
- def puppet_requirement
159
- @data['requirements'].find do |r|
160
- r.key?('name') && r['name'] == 'puppet'
161
- end
162
- end
163
-
164
- def missing_fields
165
- fields = DEFAULTS.keys - %w[data_provider requirements dependencies]
166
- fields.select { |key| @data[key].nil? || @data[key].empty? }
167
- end
168
-
169
- private
170
-
171
- # Do basic validation and parsing of the name parameter.
172
- def process_name(data)
173
- validate_name(data['name'])
174
- author, modname = data['name'].split(%r{[-/]}, 2)
175
- data['name'] = [author, modname].join('-')
176
-
177
- data['author'] ||= author if @data['author'] == DEFAULTS['author']
178
- end
179
-
180
- # Validates that the given module name is both namespaced and well-formed.
181
- def validate_name(name)
182
- return if name =~ %r{\A[a-z0-9]+[-\/][a-z][a-z0-9_]*\Z}i
183
-
184
- namespace, modname = name.split(%r{[-/]}, 2)
185
- modname = :namespace_missing if namespace == ''
186
-
187
- err = case modname
188
- when nil, '', :namespace_missing
189
- _('Field must be a dash-separated user name and module name.')
190
- when %r{[^a-z0-9_]}i
191
- _('Module name must contain only alphanumeric or underscore characters.')
192
- when %r{^[^a-z]}i
193
- _('Module name must begin with a letter.')
194
- else
195
- _('Namespace must contain only alphanumeric characters.')
196
- end
197
-
198
- raise ArgumentError, _("Invalid 'name' field in metadata.json: %{err}") % { err: err }
199
- end
200
- end
201
- end
202
- end
1
+ require 'pdk'
2
+
3
+ module PDK
4
+ module Module
5
+ class Metadata
6
+ attr_accessor :data
7
+
8
+ OPERATING_SYSTEMS = {
9
+ 'RedHat based Linux' => [
10
+ {
11
+ 'operatingsystem' => 'CentOS',
12
+ 'operatingsystemrelease' => ['7'],
13
+ },
14
+ {
15
+ 'operatingsystem' => 'OracleLinux',
16
+ 'operatingsystemrelease' => ['7'],
17
+ },
18
+ {
19
+ 'operatingsystem' => 'RedHat',
20
+ 'operatingsystemrelease' => ['8'],
21
+ },
22
+ {
23
+ 'operatingsystem' => 'Scientific',
24
+ 'operatingsystemrelease' => ['7'],
25
+ },
26
+ ],
27
+ 'Debian based Linux' => [
28
+ {
29
+ 'operatingsystem' => 'Debian',
30
+ 'operatingsystemrelease' => ['10'],
31
+ },
32
+ {
33
+ 'operatingsystem' => 'Ubuntu',
34
+ 'operatingsystemrelease' => ['18.04'],
35
+ },
36
+ ],
37
+ 'Fedora' => {
38
+ 'operatingsystem' => 'Fedora',
39
+ 'operatingsystemrelease' => ['29'],
40
+ },
41
+ 'OSX' => {
42
+ 'operatingsystem' => 'Darwin',
43
+ 'operatingsystemrelease' => ['16'],
44
+ },
45
+ 'SLES' => {
46
+ 'operatingsystem' => 'SLES',
47
+ 'operatingsystemrelease' => ['15'],
48
+ },
49
+ 'Solaris' => {
50
+ 'operatingsystem' => 'Solaris',
51
+ 'operatingsystemrelease' => ['11'],
52
+ },
53
+ 'Windows' => {
54
+ 'operatingsystem' => 'windows',
55
+ 'operatingsystemrelease' => %w[2019 10],
56
+ },
57
+ 'AIX' => {
58
+ 'operatingsystem' => 'AIX',
59
+ 'operatingsystemrelease' => %w[6.1 7.1 7.2],
60
+ },
61
+ }.freeze
62
+
63
+ DEFAULT_OPERATING_SYSTEMS = [
64
+ 'RedHat based Linux',
65
+ 'Debian based Linux',
66
+ 'Windows',
67
+ ].freeze
68
+
69
+ DEFAULTS = {
70
+ 'name' => nil,
71
+ 'version' => '0.1.0',
72
+ 'author' => nil,
73
+ 'summary' => '',
74
+ 'license' => 'Apache-2.0',
75
+ 'source' => '',
76
+ 'project_page' => nil,
77
+ 'issues_url' => nil,
78
+ 'dependencies' => [],
79
+ 'data_provider' => nil,
80
+ 'operatingsystem_support' => DEFAULT_OPERATING_SYSTEMS.map { |os_name|
81
+ OPERATING_SYSTEMS[os_name]
82
+ }.flatten,
83
+ 'requirements' => [
84
+ { 'name' => 'puppet', 'version_requirement' => '>= 6.21.0 < 8.0.0' },
85
+ ],
86
+ }.freeze
87
+
88
+ def initialize(params = {})
89
+ @data = DEFAULTS.dup
90
+ update!(params) if params
91
+ end
92
+
93
+ def self.from_file(metadata_json_path)
94
+ if metadata_json_path.nil?
95
+ raise ArgumentError, _('Cannot read metadata from file: no path to file was given.')
96
+ end
97
+
98
+ unless PDK::Util::Filesystem.file?(metadata_json_path)
99
+ raise ArgumentError, _("'%{file}' does not exist or is not a file.") % { file: metadata_json_path }
100
+ end
101
+
102
+ unless PDK::Util::Filesystem.readable?(metadata_json_path)
103
+ raise ArgumentError, _("Unable to open '%{file}' for reading.") % { file: metadata_json_path }
104
+ end
105
+
106
+ require 'json'
107
+ begin
108
+ data = JSON.parse(PDK::Util::Filesystem.read_file(metadata_json_path))
109
+ rescue JSON::JSONError => e
110
+ raise ArgumentError, _('Invalid JSON in metadata.json: %{msg}') % { msg: e.message }
111
+ end
112
+
113
+ require 'pdk/util'
114
+ data['template-url'] = PDK::Util::TemplateURI.default_template_uri.metadata_format if PDK::Util.package_install? && data['template-url'] == PDK::Util::TemplateURI::PACKAGED_TEMPLATE_KEYWORD
115
+ new(data)
116
+ end
117
+
118
+ def update!(data)
119
+ # TODO: validate all data
120
+ process_name(data) if data['name']
121
+ @data.merge!(data)
122
+ self
123
+ end
124
+
125
+ def to_json
126
+ require 'json'
127
+
128
+ JSON.pretty_generate(@data.dup.delete_if { |_key, value| value.nil? })
129
+ end
130
+
131
+ def write!(path)
132
+ PDK::Util::Filesystem.write_file(path, to_json)
133
+ end
134
+
135
+ def forge_ready?
136
+ missing_fields.empty?
137
+ end
138
+
139
+ def interview_for_forge!
140
+ require 'pdk/generate/module'
141
+
142
+ PDK::Generate::Module.module_interview(self, only_ask: missing_fields)
143
+ end
144
+
145
+ def validate_puppet_version_requirement!
146
+ msgs = {
147
+ no_reqs: _('Module metadata does not contain any requirements.'),
148
+ no_puppet_req: _('Module metadata does not contain a "puppet" requirement.'),
149
+ no_puppet_ver: _('The "puppet" requirement in module metadata does not specify a "version_requirement".'),
150
+ }
151
+
152
+ raise ArgumentError, msgs[:no_reqs] unless @data.key?('requirements')
153
+ raise ArgumentError, msgs[:no_puppet_req] if puppet_requirement.nil?
154
+ raise ArgumentError, msgs[:no_puppet_ver] unless puppet_requirement.key?('version_requirement')
155
+ raise ArgumentError, msgs[:no_puppet_ver] if puppet_requirement['version_requirement'].empty?
156
+ end
157
+
158
+ def puppet_requirement
159
+ @data['requirements'].find do |r|
160
+ r.key?('name') && r['name'] == 'puppet'
161
+ end
162
+ end
163
+
164
+ def missing_fields
165
+ fields = DEFAULTS.keys - %w[data_provider requirements dependencies]
166
+ fields.select { |key| @data[key].nil? || @data[key].empty? }
167
+ end
168
+
169
+ private
170
+
171
+ # Do basic validation and parsing of the name parameter.
172
+ def process_name(data)
173
+ validate_name(data['name'])
174
+ author, modname = data['name'].split(%r{[-/]}, 2)
175
+ data['name'] = [author, modname].join('-')
176
+
177
+ data['author'] ||= author if @data['author'] == DEFAULTS['author']
178
+ end
179
+
180
+ # Validates that the given module name is both namespaced and well-formed.
181
+ def validate_name(name)
182
+ return if name =~ %r{\A[a-z0-9]+[-\/][a-z][a-z0-9_]*\Z}i
183
+
184
+ namespace, modname = name.split(%r{[-/]}, 2)
185
+ modname = :namespace_missing if namespace == ''
186
+
187
+ err = case modname
188
+ when nil, '', :namespace_missing
189
+ _('Field must be a dash-separated user name and module name.')
190
+ when %r{[^a-z0-9_]}i
191
+ _('Module name must contain only alphanumeric or underscore characters.')
192
+ when %r{^[^a-z]}i
193
+ _('Module name must begin with a letter.')
194
+ else
195
+ _('Namespace must contain only alphanumeric characters.')
196
+ end
197
+
198
+ raise ArgumentError, _("Invalid 'name' field in metadata.json: %{err}") % { err: err }
199
+ end
200
+ end
201
+ end
202
+ end