makit 0.0.157 → 0.0.158
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +41 -41
- data/exe/makit +5 -5
- data/lib/makit/apache.rb +28 -28
- data/lib/makit/auto.rb +48 -48
- data/lib/makit/azure/blob_storage.rb +257 -257
- data/lib/makit/azure/cli.rb +284 -284
- data/lib/makit/cli/base.rb +17 -17
- data/lib/makit/cli/build_commands.rb +500 -500
- data/lib/makit/cli/generators/base_generator.rb +74 -74
- data/lib/makit/cli/generators/dotnet_generator.rb +50 -50
- data/lib/makit/cli/generators/generator_factory.rb +49 -49
- data/lib/makit/cli/generators/node_generator.rb +50 -50
- data/lib/makit/cli/generators/ruby_generator.rb +77 -77
- data/lib/makit/cli/generators/rust_generator.rb +50 -50
- data/lib/makit/cli/generators/templates/dotnet_templates.rb +167 -167
- data/lib/makit/cli/generators/templates/node_templates.rb +161 -161
- data/lib/makit/cli/generators/templates/ruby/gemfile.rb +26 -26
- data/lib/makit/cli/generators/templates/ruby/gemspec.rb +41 -41
- data/lib/makit/cli/generators/templates/ruby/main_lib.rb +33 -33
- data/lib/makit/cli/generators/templates/ruby/rakefile.rb +35 -35
- data/lib/makit/cli/generators/templates/ruby/readme.rb +63 -63
- data/lib/makit/cli/generators/templates/ruby/test.rb +39 -39
- data/lib/makit/cli/generators/templates/ruby/test_helper.rb +29 -29
- data/lib/makit/cli/generators/templates/ruby/version.rb +29 -29
- data/lib/makit/cli/generators/templates/rust_templates.rb +128 -128
- data/lib/makit/cli/main.rb +78 -78
- data/lib/makit/cli/pipeline_commands.rb +311 -311
- data/lib/makit/cli/project_commands.rb +868 -868
- data/lib/makit/cli/repository_commands.rb +661 -661
- data/lib/makit/cli/strategy_commands.rb +207 -207
- data/lib/makit/cli/utility_commands.rb +521 -521
- data/lib/makit/commands/factory.rb +359 -359
- data/lib/makit/commands/middleware/base.rb +73 -73
- data/lib/makit/commands/middleware/cache.rb +248 -248
- data/lib/makit/commands/middleware/command_logger.rb +312 -312
- data/lib/makit/commands/middleware/validator.rb +269 -269
- data/lib/makit/commands/request.rb +316 -316
- data/lib/makit/commands/result.rb +323 -323
- data/lib/makit/commands/runner.rb +386 -386
- data/lib/makit/commands/strategies/base.rb +171 -171
- data/lib/makit/commands/strategies/child_process.rb +162 -162
- data/lib/makit/commands/strategies/factory.rb +136 -136
- data/lib/makit/commands/strategies/synchronous.rb +139 -139
- data/lib/makit/commands.rb +50 -50
- data/lib/makit/configuration/dotnet_project.rb +48 -48
- data/lib/makit/configuration/gitlab_helper.rb +61 -61
- data/lib/makit/configuration/project.rb +292 -292
- data/lib/makit/configuration/rakefile_helper.rb +43 -43
- data/lib/makit/configuration/step.rb +34 -34
- data/lib/makit/configuration/timeout.rb +74 -74
- data/lib/makit/configuration.rb +21 -21
- data/lib/makit/content/default_gitignore.rb +7 -7
- data/lib/makit/content/default_gitignore.txt +225 -225
- data/lib/makit/content/default_rakefile.rb +13 -13
- data/lib/makit/content/gem_rakefile.rb +16 -16
- data/lib/makit/context.rb +1 -1
- data/lib/makit/data.rb +49 -49
- data/lib/makit/directories.rb +170 -170
- data/lib/makit/directory.rb +262 -262
- data/lib/makit/docs/files.rb +89 -89
- data/lib/makit/docs/rake.rb +102 -102
- data/lib/makit/dotnet/cli.rb +69 -69
- data/lib/makit/dotnet/project.rb +217 -217
- data/lib/makit/dotnet/solution.rb +38 -38
- data/lib/makit/dotnet/solution_classlib.rb +239 -239
- data/lib/makit/dotnet/solution_console.rb +264 -264
- data/lib/makit/dotnet/solution_maui.rb +354 -354
- data/lib/makit/dotnet/solution_wasm.rb +275 -275
- data/lib/makit/dotnet/solution_wpf.rb +304 -304
- data/lib/makit/dotnet.rb +102 -102
- data/lib/makit/email.rb +90 -90
- data/lib/makit/environment.rb +142 -142
- data/lib/makit/examples/runner.rb +370 -370
- data/lib/makit/exceptions.rb +45 -45
- data/lib/makit/fileinfo.rb +32 -32
- data/lib/makit/files.rb +43 -43
- data/lib/makit/gems.rb +40 -40
- data/lib/makit/git/cli.rb +78 -54
- data/lib/makit/git/repository.rb +100 -100
- data/lib/makit/git.rb +104 -104
- data/lib/makit/gitlab/pipeline.rb +857 -857
- data/lib/makit/gitlab/pipeline_service_impl.rb +1535 -1535
- data/lib/makit/gitlab_runner.rb +59 -59
- data/lib/makit/humanize.rb +218 -218
- data/lib/makit/indexer.rb +47 -47
- data/lib/makit/io/filesystem.rb +111 -111
- data/lib/makit/io/filesystem_service_impl.rb +337 -337
- data/lib/makit/lint.rb +212 -212
- data/lib/makit/logging/configuration.rb +309 -309
- data/lib/makit/logging/format_registry.rb +84 -84
- data/lib/makit/logging/formatters/base.rb +39 -39
- data/lib/makit/logging/formatters/console_formatter.rb +140 -140
- data/lib/makit/logging/formatters/json_formatter.rb +65 -65
- data/lib/makit/logging/formatters/plain_text_formatter.rb +71 -71
- data/lib/makit/logging/formatters/text_formatter.rb +64 -64
- data/lib/makit/logging/log_request.rb +119 -119
- data/lib/makit/logging/logger.rb +199 -199
- data/lib/makit/logging/sinks/base.rb +91 -91
- data/lib/makit/logging/sinks/console.rb +72 -72
- data/lib/makit/logging/sinks/file_sink.rb +92 -92
- data/lib/makit/logging/sinks/structured.rb +123 -123
- data/lib/makit/logging/sinks/unified_file_sink.rb +296 -296
- data/lib/makit/logging.rb +578 -578
- data/lib/makit/markdown.rb +75 -75
- data/lib/makit/mp/basic_object_mp.rb +17 -17
- data/lib/makit/mp/command_mp.rb +13 -13
- data/lib/makit/mp/command_request.mp.rb +17 -17
- data/lib/makit/mp/project_mp.rb +199 -199
- data/lib/makit/mp/string_mp.rb +205 -205
- data/lib/makit/nuget.rb +74 -74
- data/lib/makit/podman/podman.rb +458 -458
- data/lib/makit/podman/podman_service_impl.rb +1081 -1081
- data/lib/makit/port.rb +32 -32
- data/lib/makit/process.rb +377 -377
- data/lib/makit/protoc.rb +112 -112
- data/lib/makit/rake/cli.rb +196 -196
- data/lib/makit/rake/trace_controller.rb +174 -174
- data/lib/makit/rake.rb +81 -81
- data/lib/makit/ruby/cli.rb +185 -185
- data/lib/makit/ruby.rb +25 -25
- data/lib/makit/rubygems.rb +137 -0
- data/lib/makit/secrets/azure_key_vault.rb +322 -322
- data/lib/makit/secrets/azure_secrets.rb +183 -183
- data/lib/makit/secrets/local_secrets.rb +72 -72
- data/lib/makit/secrets/secrets_manager.rb +105 -105
- data/lib/makit/secrets.rb +16 -16
- data/lib/makit/serializer.rb +130 -130
- data/lib/makit/services/builder.rb +186 -186
- data/lib/makit/services/error_handler.rb +226 -226
- data/lib/makit/services/repository_manager.rb +367 -367
- data/lib/makit/services/validator.rb +112 -112
- data/lib/makit/setup/classlib.rb +101 -101
- data/lib/makit/setup/gem.rb +268 -268
- data/lib/makit/setup/pages.rb +11 -11
- data/lib/makit/setup/razorclasslib.rb +101 -101
- data/lib/makit/setup/runner.rb +54 -54
- data/lib/makit/setup.rb +5 -5
- data/lib/makit/show.rb +110 -110
- data/lib/makit/storage.rb +126 -126
- data/lib/makit/symbols.rb +175 -175
- data/lib/makit/task_info.rb +130 -130
- data/lib/makit/tasks/at_exit.rb +15 -15
- data/lib/makit/tasks/build.rb +22 -22
- data/lib/makit/tasks/bump.rb +7 -7
- data/lib/makit/tasks/clean.rb +13 -13
- data/lib/makit/tasks/configure.rb +10 -10
- data/lib/makit/tasks/format.rb +10 -10
- data/lib/makit/tasks/hook_manager.rb +443 -443
- data/lib/makit/tasks/info.rb +368 -368
- data/lib/makit/tasks/init.rb +49 -49
- data/lib/makit/tasks/integrate.rb +60 -56
- data/lib/makit/tasks/pull_incoming.rb +13 -13
- data/lib/makit/tasks/secrets.rb +7 -7
- data/lib/makit/tasks/setup.rb +16 -16
- data/lib/makit/tasks/sync.rb +14 -17
- data/lib/makit/tasks/tag.rb +27 -27
- data/lib/makit/tasks/task_monkey_patch.rb +81 -81
- data/lib/makit/tasks/test.rb +22 -22
- data/lib/makit/tasks/update.rb +18 -18
- data/lib/makit/tasks/version.rb +6 -6
- data/lib/makit/tasks.rb +24 -24
- data/lib/makit/test_cache.rb +239 -239
- data/lib/makit/tree.rb +37 -37
- data/lib/makit/v1/configuration/project_service_impl.rb +370 -370
- data/lib/makit/v1/git/git_repository_service_impl.rb +295 -295
- data/lib/makit/v1/makit.v1_pb.rb +35 -35
- data/lib/makit/v1/makit.v1_services_pb.rb +27 -27
- data/lib/makit/v1/services/repository_manager_service_impl.rb +572 -572
- data/lib/makit/version.rb +661 -503
- data/lib/makit/version_util.rb +21 -21
- data/lib/makit/wix.rb +95 -95
- data/lib/makit/yaml.rb +29 -29
- data/lib/makit/zip.rb +17 -17
- data/lib/makit copy.rb +44 -44
- data/lib/makit.rb +115 -114
- metadata +3 -2
data/lib/makit/lint.rb
CHANGED
|
@@ -1,212 +1,212 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require "json"
|
|
4
|
-
require "yaml"
|
|
5
|
-
|
|
6
|
-
# This module provides classes for the Makit gem.
|
|
7
|
-
module Makit
|
|
8
|
-
# Lint utilities for validating JSON and YAML files
|
|
9
|
-
#
|
|
10
|
-
# This class provides methods for linting JSON and YAML files,
|
|
11
|
-
# helping to catch syntax errors and validation issues early.
|
|
12
|
-
class Lint
|
|
13
|
-
# Default directories to exclude from linting
|
|
14
|
-
DEFAULT_EXCLUDE_PATTERNS = [
|
|
15
|
-
"artifacts/",
|
|
16
|
-
"bin/",
|
|
17
|
-
"obj/",
|
|
18
|
-
".nuget/",
|
|
19
|
-
".git/",
|
|
20
|
-
".specify/"
|
|
21
|
-
].freeze
|
|
22
|
-
|
|
23
|
-
# Lint JSON files based on a glob pattern or filename
|
|
24
|
-
#
|
|
25
|
-
# @param pattern [String] Glob pattern (e.g., "**/*.json") or specific filename
|
|
26
|
-
# @param exclude_patterns [Array<String>] Optional array of path prefixes to exclude
|
|
27
|
-
# @return [Hash] Hash with :valid (boolean), :errors (array), :file_count (integer)
|
|
28
|
-
def self.lint_json(pattern, exclude_patterns: DEFAULT_EXCLUDE_PATTERNS)
|
|
29
|
-
# Determine if pattern is a glob or specific file
|
|
30
|
-
if File.file?(pattern)
|
|
31
|
-
json_files = [pattern]
|
|
32
|
-
else
|
|
33
|
-
json_files = Dir.glob(pattern)
|
|
34
|
-
.reject { |f| exclude_patterns.any? { |exclude| f.start_with?(exclude) } }
|
|
35
|
-
.select { |f| File.file?(f) }
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
if json_files.empty?
|
|
39
|
-
return {
|
|
40
|
-
valid: true,
|
|
41
|
-
errors: [],
|
|
42
|
-
file_count: 0,
|
|
43
|
-
message: "No JSON files found to validate"
|
|
44
|
-
}
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
errors = []
|
|
48
|
-
json_files.each do |file|
|
|
49
|
-
begin
|
|
50
|
-
content = File.read(file)
|
|
51
|
-
# Remove BOM if present (UTF-8 BOM: EF BB BF)
|
|
52
|
-
content = content.force_encoding("UTF-8").sub(/\A\xEF\xBB\xBF/, "")
|
|
53
|
-
JSON.parse(content)
|
|
54
|
-
rescue JSON::ParserError => e
|
|
55
|
-
errors << { file: file, error: e.message }
|
|
56
|
-
end
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
{
|
|
60
|
-
valid: errors.empty?,
|
|
61
|
-
errors: errors,
|
|
62
|
-
file_count: json_files.length
|
|
63
|
-
}
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
# Lint JSON files and print results
|
|
67
|
-
#
|
|
68
|
-
# @param pattern [String] Glob pattern or filename
|
|
69
|
-
# @param exclude_patterns [Array<String>] Optional array of path prefixes to exclude
|
|
70
|
-
# @param verbose [Boolean] Whether to print progress dots
|
|
71
|
-
# @raise [RuntimeError] If validation fails
|
|
72
|
-
def self.lint_json!(pattern, exclude_patterns: DEFAULT_EXCLUDE_PATTERNS, verbose: true)
|
|
73
|
-
result = lint_json(pattern, exclude_patterns: exclude_patterns)
|
|
74
|
-
|
|
75
|
-
if result[:file_count] == 0
|
|
76
|
-
puts result[:message] if verbose
|
|
77
|
-
return result
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
if verbose
|
|
81
|
-
puts "Validating #{result[:file_count]} JSON file(s)..."
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
# Re-run to show progress dots
|
|
85
|
-
if verbose && result[:file_count] > 0
|
|
86
|
-
json_files = File.file?(pattern) ? [pattern] : Dir.glob(pattern)
|
|
87
|
-
.reject { |f| exclude_patterns.any? { |exclude| f.start_with?(exclude) } }
|
|
88
|
-
.select { |f| File.file?(f) }
|
|
89
|
-
|
|
90
|
-
json_files.each do |file|
|
|
91
|
-
begin
|
|
92
|
-
content = File.read(file)
|
|
93
|
-
content = content.force_encoding("UTF-8").sub(/\A\xEF\xBB\xBF/, "")
|
|
94
|
-
JSON.parse(content)
|
|
95
|
-
print "."
|
|
96
|
-
rescue JSON::ParserError
|
|
97
|
-
print "F"
|
|
98
|
-
end
|
|
99
|
-
end
|
|
100
|
-
puts "\n"
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
if result[:valid]
|
|
104
|
-
puts "✓ All JSON files are valid" if verbose
|
|
105
|
-
else
|
|
106
|
-
puts "\n✗ Found #{result[:errors].length} invalid JSON file(s):" if verbose
|
|
107
|
-
result[:errors].each do |err|
|
|
108
|
-
puts " - #{err[:file]}: #{err[:error]}" if verbose
|
|
109
|
-
end
|
|
110
|
-
raise "JSON validation failed"
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
result
|
|
114
|
-
end
|
|
115
|
-
|
|
116
|
-
# Lint YAML files based on a glob pattern or filename
|
|
117
|
-
#
|
|
118
|
-
# @param pattern [String] Glob pattern (e.g., "**/*.yml") or specific filename
|
|
119
|
-
# @param exclude_patterns [Array<String>] Optional array of path prefixes to exclude
|
|
120
|
-
# @return [Hash] Hash with :valid (boolean), :errors (array), :file_count (integer)
|
|
121
|
-
def self.lint_yaml(pattern, exclude_patterns: DEFAULT_EXCLUDE_PATTERNS)
|
|
122
|
-
# Determine if pattern is a glob or specific file
|
|
123
|
-
if File.file?(pattern)
|
|
124
|
-
yaml_files = [pattern]
|
|
125
|
-
else
|
|
126
|
-
yaml_files = Dir.glob(pattern)
|
|
127
|
-
.reject { |f| exclude_patterns.any? { |exclude| f.start_with?(exclude) } }
|
|
128
|
-
.select { |f| File.file?(f) }
|
|
129
|
-
end
|
|
130
|
-
|
|
131
|
-
if yaml_files.empty?
|
|
132
|
-
return {
|
|
133
|
-
valid: true,
|
|
134
|
-
errors: [],
|
|
135
|
-
file_count: 0,
|
|
136
|
-
message: "No YAML files found to validate"
|
|
137
|
-
}
|
|
138
|
-
end
|
|
139
|
-
|
|
140
|
-
errors = []
|
|
141
|
-
yaml_files.each do |file|
|
|
142
|
-
begin
|
|
143
|
-
content = File.read(file)
|
|
144
|
-
# Remove BOM if present (UTF-8 BOM: EF BB BF)
|
|
145
|
-
content = content.force_encoding("UTF-8").sub(/\A\xEF\xBB\xBF/, "")
|
|
146
|
-
YAML.load(content, permitted_classes: [Symbol, Date, Time], aliases: true)
|
|
147
|
-
rescue Psych::SyntaxError => e
|
|
148
|
-
errors << { file: file, error: e.message }
|
|
149
|
-
rescue => e
|
|
150
|
-
errors << { file: file, error: e.message }
|
|
151
|
-
end
|
|
152
|
-
end
|
|
153
|
-
|
|
154
|
-
{
|
|
155
|
-
valid: errors.empty?,
|
|
156
|
-
errors: errors,
|
|
157
|
-
file_count: yaml_files.length
|
|
158
|
-
}
|
|
159
|
-
end
|
|
160
|
-
|
|
161
|
-
# Lint YAML files and print results
|
|
162
|
-
#
|
|
163
|
-
# @param pattern [String] Glob pattern or filename
|
|
164
|
-
# @param exclude_patterns [Array<String>] Optional array of path prefixes to exclude
|
|
165
|
-
# @param verbose [Boolean] Whether to print progress dots
|
|
166
|
-
# @raise [RuntimeError] If validation fails
|
|
167
|
-
def self.lint_yaml!(pattern, exclude_patterns: DEFAULT_EXCLUDE_PATTERNS, verbose: true)
|
|
168
|
-
result = lint_yaml(pattern, exclude_patterns: exclude_patterns)
|
|
169
|
-
|
|
170
|
-
if result[:file_count] == 0
|
|
171
|
-
puts result[:message] if verbose
|
|
172
|
-
return result
|
|
173
|
-
end
|
|
174
|
-
|
|
175
|
-
if verbose
|
|
176
|
-
puts "Validating #{result[:file_count]} YAML file(s)..."
|
|
177
|
-
end
|
|
178
|
-
|
|
179
|
-
# Re-run to show progress dots
|
|
180
|
-
if verbose && result[:file_count] > 0
|
|
181
|
-
yaml_files = File.file?(pattern) ? [pattern] : Dir.glob(pattern)
|
|
182
|
-
.reject { |f| exclude_patterns.any? { |exclude| f.start_with?(exclude) } }
|
|
183
|
-
.select { |f| File.file?(f) }
|
|
184
|
-
|
|
185
|
-
yaml_files.each do |file|
|
|
186
|
-
begin
|
|
187
|
-
content = File.read(file)
|
|
188
|
-
content = content.force_encoding("UTF-8").sub(/\A\xEF\xBB\xBF/, "")
|
|
189
|
-
YAML.load(content, permitted_classes: [Symbol, Date, Time], aliases: true)
|
|
190
|
-
print "."
|
|
191
|
-
rescue
|
|
192
|
-
print "F"
|
|
193
|
-
end
|
|
194
|
-
end
|
|
195
|
-
puts "\n"
|
|
196
|
-
end
|
|
197
|
-
|
|
198
|
-
if result[:valid]
|
|
199
|
-
puts "✓ All YAML files are valid" if verbose
|
|
200
|
-
else
|
|
201
|
-
puts "\n✗ Found #{result[:errors].length} invalid YAML file(s):" if verbose
|
|
202
|
-
result[:errors].each do |err|
|
|
203
|
-
puts " - #{err[:file]}: #{err[:error]}" if verbose
|
|
204
|
-
end
|
|
205
|
-
raise "YAML validation failed"
|
|
206
|
-
end
|
|
207
|
-
|
|
208
|
-
result
|
|
209
|
-
end
|
|
210
|
-
end
|
|
211
|
-
end
|
|
212
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "json"
|
|
4
|
+
require "yaml"
|
|
5
|
+
|
|
6
|
+
# This module provides classes for the Makit gem.
|
|
7
|
+
module Makit
|
|
8
|
+
# Lint utilities for validating JSON and YAML files
|
|
9
|
+
#
|
|
10
|
+
# This class provides methods for linting JSON and YAML files,
|
|
11
|
+
# helping to catch syntax errors and validation issues early.
|
|
12
|
+
class Lint
|
|
13
|
+
# Default directories to exclude from linting
|
|
14
|
+
DEFAULT_EXCLUDE_PATTERNS = [
|
|
15
|
+
"artifacts/",
|
|
16
|
+
"bin/",
|
|
17
|
+
"obj/",
|
|
18
|
+
".nuget/",
|
|
19
|
+
".git/",
|
|
20
|
+
".specify/"
|
|
21
|
+
].freeze
|
|
22
|
+
|
|
23
|
+
# Lint JSON files based on a glob pattern or filename
|
|
24
|
+
#
|
|
25
|
+
# @param pattern [String] Glob pattern (e.g., "**/*.json") or specific filename
|
|
26
|
+
# @param exclude_patterns [Array<String>] Optional array of path prefixes to exclude
|
|
27
|
+
# @return [Hash] Hash with :valid (boolean), :errors (array), :file_count (integer)
|
|
28
|
+
def self.lint_json(pattern, exclude_patterns: DEFAULT_EXCLUDE_PATTERNS)
|
|
29
|
+
# Determine if pattern is a glob or specific file
|
|
30
|
+
if File.file?(pattern)
|
|
31
|
+
json_files = [pattern]
|
|
32
|
+
else
|
|
33
|
+
json_files = Dir.glob(pattern)
|
|
34
|
+
.reject { |f| exclude_patterns.any? { |exclude| f.start_with?(exclude) } }
|
|
35
|
+
.select { |f| File.file?(f) }
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
if json_files.empty?
|
|
39
|
+
return {
|
|
40
|
+
valid: true,
|
|
41
|
+
errors: [],
|
|
42
|
+
file_count: 0,
|
|
43
|
+
message: "No JSON files found to validate"
|
|
44
|
+
}
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
errors = []
|
|
48
|
+
json_files.each do |file|
|
|
49
|
+
begin
|
|
50
|
+
content = File.read(file)
|
|
51
|
+
# Remove BOM if present (UTF-8 BOM: EF BB BF)
|
|
52
|
+
content = content.force_encoding("UTF-8").sub(/\A\xEF\xBB\xBF/, "")
|
|
53
|
+
JSON.parse(content)
|
|
54
|
+
rescue JSON::ParserError => e
|
|
55
|
+
errors << { file: file, error: e.message }
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
{
|
|
60
|
+
valid: errors.empty?,
|
|
61
|
+
errors: errors,
|
|
62
|
+
file_count: json_files.length
|
|
63
|
+
}
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Lint JSON files and print results
|
|
67
|
+
#
|
|
68
|
+
# @param pattern [String] Glob pattern or filename
|
|
69
|
+
# @param exclude_patterns [Array<String>] Optional array of path prefixes to exclude
|
|
70
|
+
# @param verbose [Boolean] Whether to print progress dots
|
|
71
|
+
# @raise [RuntimeError] If validation fails
|
|
72
|
+
def self.lint_json!(pattern, exclude_patterns: DEFAULT_EXCLUDE_PATTERNS, verbose: true)
|
|
73
|
+
result = lint_json(pattern, exclude_patterns: exclude_patterns)
|
|
74
|
+
|
|
75
|
+
if result[:file_count] == 0
|
|
76
|
+
puts result[:message] if verbose
|
|
77
|
+
return result
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
if verbose
|
|
81
|
+
puts "Validating #{result[:file_count]} JSON file(s)..."
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# Re-run to show progress dots
|
|
85
|
+
if verbose && result[:file_count] > 0
|
|
86
|
+
json_files = File.file?(pattern) ? [pattern] : Dir.glob(pattern)
|
|
87
|
+
.reject { |f| exclude_patterns.any? { |exclude| f.start_with?(exclude) } }
|
|
88
|
+
.select { |f| File.file?(f) }
|
|
89
|
+
|
|
90
|
+
json_files.each do |file|
|
|
91
|
+
begin
|
|
92
|
+
content = File.read(file)
|
|
93
|
+
content = content.force_encoding("UTF-8").sub(/\A\xEF\xBB\xBF/, "")
|
|
94
|
+
JSON.parse(content)
|
|
95
|
+
print "."
|
|
96
|
+
rescue JSON::ParserError
|
|
97
|
+
print "F"
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
puts "\n"
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
if result[:valid]
|
|
104
|
+
puts "✓ All JSON files are valid" if verbose
|
|
105
|
+
else
|
|
106
|
+
puts "\n✗ Found #{result[:errors].length} invalid JSON file(s):" if verbose
|
|
107
|
+
result[:errors].each do |err|
|
|
108
|
+
puts " - #{err[:file]}: #{err[:error]}" if verbose
|
|
109
|
+
end
|
|
110
|
+
raise "JSON validation failed"
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
result
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# Lint YAML files based on a glob pattern or filename
|
|
117
|
+
#
|
|
118
|
+
# @param pattern [String] Glob pattern (e.g., "**/*.yml") or specific filename
|
|
119
|
+
# @param exclude_patterns [Array<String>] Optional array of path prefixes to exclude
|
|
120
|
+
# @return [Hash] Hash with :valid (boolean), :errors (array), :file_count (integer)
|
|
121
|
+
def self.lint_yaml(pattern, exclude_patterns: DEFAULT_EXCLUDE_PATTERNS)
|
|
122
|
+
# Determine if pattern is a glob or specific file
|
|
123
|
+
if File.file?(pattern)
|
|
124
|
+
yaml_files = [pattern]
|
|
125
|
+
else
|
|
126
|
+
yaml_files = Dir.glob(pattern)
|
|
127
|
+
.reject { |f| exclude_patterns.any? { |exclude| f.start_with?(exclude) } }
|
|
128
|
+
.select { |f| File.file?(f) }
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
if yaml_files.empty?
|
|
132
|
+
return {
|
|
133
|
+
valid: true,
|
|
134
|
+
errors: [],
|
|
135
|
+
file_count: 0,
|
|
136
|
+
message: "No YAML files found to validate"
|
|
137
|
+
}
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
errors = []
|
|
141
|
+
yaml_files.each do |file|
|
|
142
|
+
begin
|
|
143
|
+
content = File.read(file)
|
|
144
|
+
# Remove BOM if present (UTF-8 BOM: EF BB BF)
|
|
145
|
+
content = content.force_encoding("UTF-8").sub(/\A\xEF\xBB\xBF/, "")
|
|
146
|
+
YAML.load(content, permitted_classes: [Symbol, Date, Time], aliases: true)
|
|
147
|
+
rescue Psych::SyntaxError => e
|
|
148
|
+
errors << { file: file, error: e.message }
|
|
149
|
+
rescue => e
|
|
150
|
+
errors << { file: file, error: e.message }
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
{
|
|
155
|
+
valid: errors.empty?,
|
|
156
|
+
errors: errors,
|
|
157
|
+
file_count: yaml_files.length
|
|
158
|
+
}
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
# Lint YAML files and print results
|
|
162
|
+
#
|
|
163
|
+
# @param pattern [String] Glob pattern or filename
|
|
164
|
+
# @param exclude_patterns [Array<String>] Optional array of path prefixes to exclude
|
|
165
|
+
# @param verbose [Boolean] Whether to print progress dots
|
|
166
|
+
# @raise [RuntimeError] If validation fails
|
|
167
|
+
def self.lint_yaml!(pattern, exclude_patterns: DEFAULT_EXCLUDE_PATTERNS, verbose: true)
|
|
168
|
+
result = lint_yaml(pattern, exclude_patterns: exclude_patterns)
|
|
169
|
+
|
|
170
|
+
if result[:file_count] == 0
|
|
171
|
+
puts result[:message] if verbose
|
|
172
|
+
return result
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
if verbose
|
|
176
|
+
puts "Validating #{result[:file_count]} YAML file(s)..."
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
# Re-run to show progress dots
|
|
180
|
+
if verbose && result[:file_count] > 0
|
|
181
|
+
yaml_files = File.file?(pattern) ? [pattern] : Dir.glob(pattern)
|
|
182
|
+
.reject { |f| exclude_patterns.any? { |exclude| f.start_with?(exclude) } }
|
|
183
|
+
.select { |f| File.file?(f) }
|
|
184
|
+
|
|
185
|
+
yaml_files.each do |file|
|
|
186
|
+
begin
|
|
187
|
+
content = File.read(file)
|
|
188
|
+
content = content.force_encoding("UTF-8").sub(/\A\xEF\xBB\xBF/, "")
|
|
189
|
+
YAML.load(content, permitted_classes: [Symbol, Date, Time], aliases: true)
|
|
190
|
+
print "."
|
|
191
|
+
rescue
|
|
192
|
+
print "F"
|
|
193
|
+
end
|
|
194
|
+
end
|
|
195
|
+
puts "\n"
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
if result[:valid]
|
|
199
|
+
puts "✓ All YAML files are valid" if verbose
|
|
200
|
+
else
|
|
201
|
+
puts "\n✗ Found #{result[:errors].length} invalid YAML file(s):" if verbose
|
|
202
|
+
result[:errors].each do |err|
|
|
203
|
+
puts " - #{err[:file]}: #{err[:error]}" if verbose
|
|
204
|
+
end
|
|
205
|
+
raise "YAML validation failed"
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
result
|
|
209
|
+
end
|
|
210
|
+
end
|
|
211
|
+
end
|
|
212
|
+
|