firespring_dev_commands 2.1.33.pre.alpha.1 → 2.5.0.pre.alpha.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/firespring_dev_commands/audit/report.rb +2 -9
- data/lib/firespring_dev_commands/aws/cloudformation.rb +3 -10
- data/lib/firespring_dev_commands/common.rb +2 -22
- data/lib/firespring_dev_commands/docker/status.rb +0 -20
- data/lib/firespring_dev_commands/docker.rb +16 -86
- data/lib/firespring_dev_commands/eol.rb +2 -12
- data/lib/firespring_dev_commands/git.rb +22 -17
- data/lib/firespring_dev_commands/jira/issue.rb +1 -3
- data/lib/firespring_dev_commands/node.rb +1 -1
- data/lib/firespring_dev_commands/php.rb +12 -28
- data/lib/firespring_dev_commands/platform.rb +31 -38
- data/lib/firespring_dev_commands/ruby.rb +3 -6
- data/lib/firespring_dev_commands/target_process/query.rb +4 -30
- data/lib/firespring_dev_commands/target_process.rb +1 -3
- data/lib/firespring_dev_commands/templates/aws.rb +6 -14
- data/lib/firespring_dev_commands/templates/docker/application.rb +2 -2
- data/lib/firespring_dev_commands/templates/docker/node/application.rb +5 -28
- data/lib/firespring_dev_commands/templates/docker/php/application.rb +16 -31
- data/lib/firespring_dev_commands/templates/docker/ruby/application.rb +5 -27
- data/lib/firespring_dev_commands/templates/eol.rb +2 -3
- data/lib/firespring_dev_commands/templates/git.rb +0 -17
- data/lib/firespring_dev_commands/version.rb +1 -1
- data/lib/firespring_dev_commands.rb +1 -1
- metadata +35 -48
- data/lib/firespring_dev_commands/bloom_growth/rock.rb +0 -34
- data/lib/firespring_dev_commands/bloom_growth/seat.rb +0 -16
- data/lib/firespring_dev_commands/bloom_growth/user.rb +0 -43
- data/lib/firespring_dev_commands/bloom_growth.rb +0 -132
- data/lib/firespring_dev_commands/certificate.rb +0 -59
- data/lib/firespring_dev_commands/coverage/base.rb +0 -16
- data/lib/firespring_dev_commands/coverage/cobertura.rb +0 -86
- data/lib/firespring_dev_commands/coverage/none.rb +0 -21
- data/lib/firespring_dev_commands/docker/desktop.rb +0 -59
- data/lib/firespring_dev_commands/jira/parent.rb +0 -19
- data/lib/firespring_dev_commands/os.rb +0 -35
- data/lib/firespring_dev_commands/port.rb +0 -24
- data/lib/firespring_dev_commands/templates/certificate.rb +0 -41
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e146e8c9d9c3422dfd7641c6a09ca8c2cdfad6ed430d73aec5808de28ed5d880
|
4
|
+
data.tar.gz: 273923aae5ccce231fc77174ed89cbe0e4f5ad59b52219b04303f983e9966e1d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 67223e6ba12a10f798d7fee6b1cab844da41cd3dc65a449330e8c8bd0ef86180cc297889b7365b7b68f5ca8054919e9881693707ecfde02e539d0a7e22c6af51
|
7
|
+
data.tar.gz: ada0e13a3f2d8022687a2542503bad6bc847bf32fc17604116d17e06ed46ee7efa18aea35635c31a26c07f5ccdd6a3c5083235edaafd77684528bc487c17f3c7
|
@@ -3,12 +3,11 @@ module Dev
|
|
3
3
|
class Audit
|
4
4
|
# The class containing standardized information about an audit report
|
5
5
|
class Report
|
6
|
-
attr_accessor :items, :min_severity, :
|
6
|
+
attr_accessor :items, :min_severity, :ignorelist, :filtered_items
|
7
7
|
|
8
8
|
def initialize(
|
9
9
|
items,
|
10
10
|
min_severity: ENV.fetch('MIN_SEVERITY', nil),
|
11
|
-
error_on_unknown: ENV.fetch('ERROR_ON_UNKNOWN', nil),
|
12
11
|
ignorelist: ENV['IGNORELIST'].to_s.split(/\s*,\s*/)
|
13
12
|
)
|
14
13
|
# Items should be an array of Item objects
|
@@ -16,18 +15,12 @@ module Dev
|
|
16
15
|
raise 'items must all be report items' unless @items.all?(Dev::Audit::Report::Item)
|
17
16
|
|
18
17
|
@min_severity = min_severity || Level::HIGH
|
19
|
-
@error_on_unknown = error_on_unknown
|
20
18
|
@ignorelist = Array(ignorelist).compact
|
21
19
|
end
|
22
20
|
|
23
21
|
# Get all severities greater than or equal to the minimum severity
|
24
22
|
def desired_severities
|
25
|
-
|
26
|
-
-1
|
27
|
-
else
|
28
|
-
-2
|
29
|
-
end
|
30
|
-
LEVELS.slice(LEVELS.find_index(min_severity)..max_severity)
|
23
|
+
LEVELS.slice(LEVELS.find_index(min_severity)..-1)
|
31
24
|
end
|
32
25
|
|
33
26
|
# Run the filters against the report items and filter out any which should be excluded
|
@@ -21,10 +21,9 @@ module Dev
|
|
21
21
|
# Finished status
|
22
22
|
FINISHED = :finished
|
23
23
|
|
24
|
-
attr_accessor :client, :name, :template_filename, :parameters, :capabilities, :failure_behavior, :
|
24
|
+
attr_accessor :client, :name, :template_filename, :parameters, :capabilities, :failure_behavior, :state
|
25
25
|
|
26
|
-
def initialize(name, template_filename, parameters: Dev::Aws::Cloudformation::Parameters.new, capabilities: [], failure_behavior: 'ROLLBACK'
|
27
|
-
preserve_parameters_on_update: false)
|
26
|
+
def initialize(name, template_filename, parameters: Dev::Aws::Cloudformation::Parameters.new, capabilities: [], failure_behavior: 'ROLLBACK')
|
28
27
|
raise 'parameters must be an intsance of parameters' unless parameters.is_a?(Dev::Aws::Cloudformation::Parameters)
|
29
28
|
|
30
29
|
@client = nil
|
@@ -33,7 +32,6 @@ module Dev
|
|
33
32
|
@parameters = parameters
|
34
33
|
@capabilities = capabilities
|
35
34
|
@failure_behavior = failure_behavior
|
36
|
-
@preserve_parameters_on_update = preserve_parameters_on_update
|
37
35
|
@state = NOT_STARTED
|
38
36
|
end
|
39
37
|
|
@@ -83,16 +81,11 @@ module Dev
|
|
83
81
|
# Call upload function to get the s3 url
|
84
82
|
template_url = upload(template_filename)
|
85
83
|
|
86
|
-
update_parameters = if preserve_parameters_on_update
|
87
|
-
parameters.preserve
|
88
|
-
else
|
89
|
-
parameters.default
|
90
|
-
end
|
91
84
|
# Update the cloudformation stack
|
92
85
|
client.update_stack(
|
93
86
|
stack_name: name,
|
94
87
|
template_url:,
|
95
|
-
parameters:
|
88
|
+
parameters: parameters.preserve,
|
96
89
|
capabilities:
|
97
90
|
)
|
98
91
|
@state = STARTED
|
@@ -100,8 +100,8 @@ module Dev
|
|
100
100
|
# Receive a string from the user on stdin unless non_interactive is set to true
|
101
101
|
# If a default value was specified and no answer was given, return the default
|
102
102
|
def gather_input(default: nil)
|
103
|
-
answer = $stdin.gets unless ENV['NON_INTERACTIVE'] == 'true'
|
104
|
-
answer
|
103
|
+
answer = $stdin.gets.to_s.strip unless ENV['NON_INTERACTIVE'] == 'true'
|
104
|
+
answer.to_s.strip
|
105
105
|
return default if default && answer.empty?
|
106
106
|
|
107
107
|
answer
|
@@ -187,25 +187,5 @@ module Dev
|
|
187
187
|
return false
|
188
188
|
end
|
189
189
|
end
|
190
|
-
|
191
|
-
# Center the string and pad on either side with the given padding character
|
192
|
-
def center_pad(string = '', pad: '-', len: 80)
|
193
|
-
string = " #{string} " unless string.strip.empty?
|
194
|
-
center_dash = len / 2
|
195
|
-
string = string.to_s
|
196
|
-
center_str = string.length / 2
|
197
|
-
string.rjust(center_dash + center_str - 1, pad).ljust(len - 1, pad)
|
198
|
-
end
|
199
|
-
|
200
|
-
# Print the given filesize using the most appropriate units
|
201
|
-
def filesize(size)
|
202
|
-
return '0.0 B' if size.to_i.zero?
|
203
|
-
|
204
|
-
units = %w(B KB MB GB TB Pb EB)
|
205
|
-
exp = (Math.log(size) / Math.log(1024)).to_i
|
206
|
-
exp = 6 if exp > 6
|
207
|
-
|
208
|
-
format('%.1f %s', size.to_f / (1024**exp), units[exp])
|
209
|
-
end
|
210
190
|
end
|
211
191
|
end
|
@@ -33,26 +33,6 @@ module Dev
|
|
33
33
|
EXITED,
|
34
34
|
DEAD
|
35
35
|
].freeze
|
36
|
-
|
37
|
-
# TODO: Can we use 'curses' here and overwrite the correct line?
|
38
|
-
def response_callback(response)
|
39
|
-
response.split("\n").each do |line|
|
40
|
-
data = JSON.parse(line)
|
41
|
-
if data.include?('status')
|
42
|
-
if data['id']
|
43
|
-
LOG.info "#{data['id']}: #{data['status']}"
|
44
|
-
else
|
45
|
-
LOG.info (data['status']).to_s
|
46
|
-
end
|
47
|
-
elsif data.include?('errorDetail')
|
48
|
-
raise data['errorDetail']['message']
|
49
|
-
elsif data.include?('aux')
|
50
|
-
next
|
51
|
-
else
|
52
|
-
raise "Unrecognized message from docker: #{data}"
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
36
|
end
|
57
37
|
end
|
58
38
|
end
|
@@ -103,7 +103,7 @@ module Dev
|
|
103
103
|
LOG.info "\nDeleted #{type.capitalize}"
|
104
104
|
deleted_items = info["#{type}Deleted"] || []
|
105
105
|
deleted_items.each { |it| LOG.info " #{it}" }
|
106
|
-
LOG.info "Total reclaimed space: #{
|
106
|
+
LOG.info "Total reclaimed space: #{filesize(info['SpaceReclaimed'])}"
|
107
107
|
end
|
108
108
|
|
109
109
|
# Print the given filesize using the most appropriate units
|
@@ -117,44 +117,6 @@ module Dev
|
|
117
117
|
format('%.1f %s', size.to_f / (1024**exp), units[exp])
|
118
118
|
end
|
119
119
|
|
120
|
-
# Push the local version of the docker image to the defined remote repository
|
121
|
-
def push_image(image, name, tag = nil)
|
122
|
-
unless tag
|
123
|
-
if name.include?(':')
|
124
|
-
name, tag = name.split(':')
|
125
|
-
else
|
126
|
-
tag = 'latest'
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
puts "Pushing to #{name}:#{tag}"
|
131
|
-
image.push(::Docker.creds, repo_tag: "#{name}:#{tag}") { |response| Dev::Docker::Status.new.response_callback(response) }
|
132
|
-
end
|
133
|
-
|
134
|
-
# Push the remote version of the docker image from the defined remote repository
|
135
|
-
def pull_image(name, tag = nil)
|
136
|
-
unless tag
|
137
|
-
if name.include?(':')
|
138
|
-
name, tag = name.split(':')
|
139
|
-
else
|
140
|
-
tag = 'latest'
|
141
|
-
end
|
142
|
-
end
|
143
|
-
|
144
|
-
puts "\nPulling #{name}:#{tag}"
|
145
|
-
opts = {
|
146
|
-
fromImage: "#{name}:#{tag}",
|
147
|
-
platform: Dev::Platform.new.architecture
|
148
|
-
}
|
149
|
-
::Docker::Image.create(**opts) { |response| Dev::Docker::Status.new.response_callback(response) }
|
150
|
-
end
|
151
|
-
|
152
|
-
# Remove the local version of the given docker image
|
153
|
-
def untag_image(image, name, tag)
|
154
|
-
puts "Untagging #{name}:#{tag}"
|
155
|
-
image.remove(name: "#{name}:#{tag}")
|
156
|
-
end
|
157
|
-
|
158
120
|
# Remove docker images with the "force" option set to true
|
159
121
|
# This will remove the images even if they are currently in use and cause unintended side effects.
|
160
122
|
def force_remove_images(name_and_tag)
|
@@ -176,59 +138,27 @@ module Dev
|
|
176
138
|
Docker::Compose.new.mapped_public_port(name, private_port)
|
177
139
|
end
|
178
140
|
|
179
|
-
# Gets the default working dir of the container
|
180
|
-
def working_dir(container)
|
181
|
-
container.json['Config']['WorkingDir']
|
182
|
-
end
|
183
|
-
|
184
141
|
# Copies the source path on your local machine to the destination path on the container
|
185
|
-
def copy_to_container(container,
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
filetype_cmd = [
|
196
|
-
'bash',
|
197
|
-
'-c',
|
198
|
-
"set -e; [ ! -e '#{destination}' ] && exit #{noexist_code}; [ -f '#{destination}' ] " \
|
199
|
-
"&& exit #{file_code}; [ -d '#{destination}' ] && exit #{directory_code}; exit #{unknown_code}"
|
200
|
-
]
|
201
|
-
destination_filetype_code = container.exec(filetype_cmd).last
|
202
|
-
|
203
|
-
# If destination_filetype_code is a file - that means the user passed in a destination filename
|
204
|
-
# Unfortunately the archive_in command does not support that so we will strip it off and use it later (if needed)
|
205
|
-
source_filename = File.basename(source)
|
206
|
-
destination_filename = File.basename(source)
|
207
|
-
destination, _, destination_filename = destination.rpartition(File::SEPARATOR) if destination_filetype_code == file_code
|
208
|
-
|
209
|
-
container.archive_in(source, destination, overwrite: true)
|
210
|
-
|
211
|
-
if File.directory?(source)
|
212
|
-
# If the source was a directory, then the archive_in command leaves it as a tar on the system - so we need to unpack it
|
213
|
-
# TODO: Can we find a better solution for this? Seems pretty brittle
|
214
|
-
retcode = container.exec(['bash', '-c', "cd #{destination}; tar -xf #{destination_filename}; rm -f #{destination_filename}"]).last
|
215
|
-
raise 'Unable to unpack on container' unless retcode.zero?
|
216
|
-
elsif destination_filetype_code == file_code && source_filename != destination_filename
|
217
|
-
# If the destination was a file _and_ the filename is different than the source filename, then we need to rename it
|
218
|
-
retcode = container.exec(['bash', '-c', "cd #{destination}; mv #{source_filename} #{destination_filename}"]).last
|
219
|
-
raise "Unable to rename '#{source_filename}' to '#{destination_filename}' on container" unless retcode.zero?
|
220
|
-
end
|
142
|
+
def copy_to_container(container, source_path, dest_path)
|
143
|
+
LOG.info "Copying #{source_path} to #{dest_path}... "
|
144
|
+
|
145
|
+
container.archive_in(source_path, dest_path, overwrite: true)
|
146
|
+
return unless File.directory?(source_path)
|
147
|
+
|
148
|
+
dest_file = File.basename(source_path)
|
149
|
+
# TODO: Can we find a better solution for this? Seems pretty brittle
|
150
|
+
retcode = container.exec(['bash', '-c', "cd #{dest_path}; tar -xf #{dest_file}; rm -f #{dest_file}"])[-1]
|
151
|
+
raise 'Unable to unpack on container' unless retcode.zero?
|
221
152
|
end
|
222
153
|
|
223
154
|
# Copies the source path on the container to the destination path on your local machine
|
224
155
|
# If required is set to true, the command will fail if the source path does not exist on the container
|
225
|
-
def copy_from_container(container,
|
226
|
-
|
227
|
-
LOG.info "Copying #{source} to #{destination}..."
|
156
|
+
def copy_from_container(container, source_path, dest_path, required: true)
|
157
|
+
LOG.info "Copying #{source_path} to #{dest_path}... "
|
228
158
|
|
229
159
|
tar = StringIO.new
|
230
160
|
begin
|
231
|
-
container.archive_out(
|
161
|
+
container.archive_out(source_path) do |chunk|
|
232
162
|
tar.write(chunk)
|
233
163
|
end
|
234
164
|
rescue => e
|
@@ -237,7 +167,7 @@ module Dev
|
|
237
167
|
puts 'Not Found'
|
238
168
|
end
|
239
169
|
|
240
|
-
Dev::Tar.new(tar).unpack(
|
170
|
+
Dev::Tar.new(tar).unpack(source_path, dest_path)
|
241
171
|
end
|
242
172
|
|
243
173
|
# rubocop:disable Metrics/ParameterLists
|
@@ -275,7 +205,7 @@ module Dev
|
|
275
205
|
arch = "#{arch}/#{variant}" if variant
|
276
206
|
id = image.info&.dig('id')&.split(':')&.last&.slice(0..11)
|
277
207
|
created = timesince(Time.at(image.info&.dig('Created')))
|
278
|
-
size =
|
208
|
+
size = filesize(image.info&.dig('Size'))
|
279
209
|
|
280
210
|
repo_urls = image.info&.dig('RepoTags')
|
281
211
|
repo_urls ||= ["#{image.info&.dig('RepoDigests')&.first&.split(':')&.first&.split('@')&.first}:<none>"]
|
@@ -46,23 +46,13 @@ module Dev
|
|
46
46
|
@products
|
47
47
|
end
|
48
48
|
|
49
|
-
# Prints all of the product version statuses
|
50
|
-
def status
|
51
|
-
product_versions.sort_by(&:name).each(&:print_status)
|
52
|
-
end
|
53
|
-
|
54
|
-
# Returns true if any of the products are EOL
|
55
|
-
def eol?
|
56
|
-
product_versions.any?(&:eol)
|
57
|
-
end
|
58
|
-
|
59
49
|
# Prints all of the product version statuses
|
60
50
|
# Raises an error if any products are EOL
|
61
51
|
def check
|
62
52
|
puts
|
63
|
-
|
53
|
+
product_versions.sort_by(&:name).each(&:print_status)
|
64
54
|
puts
|
65
|
-
raise 'found EOL versions' if eol
|
55
|
+
raise 'found EOL versions' if product_versions.any?(&:eol)
|
66
56
|
end
|
67
57
|
end
|
68
58
|
end
|
@@ -113,10 +113,10 @@ module Dev
|
|
113
113
|
next unless File.exist?(project_dir)
|
114
114
|
|
115
115
|
repo_basename = File.basename(File.realpath(project_dir))
|
116
|
-
header = "#{repo_basename} (#{original_branches[project_dir]})"
|
117
|
-
puts
|
116
|
+
header = " #{repo_basename} (#{original_branches[project_dir]}) "
|
117
|
+
puts center_pad(header).light_green
|
118
118
|
@success &= status(dir: project_dir)
|
119
|
-
puts
|
119
|
+
puts center_pad.light_green
|
120
120
|
end
|
121
121
|
puts
|
122
122
|
|
@@ -165,10 +165,10 @@ module Dev
|
|
165
165
|
next unless File.exist?(project_dir)
|
166
166
|
|
167
167
|
repo_basename = File.basename(File.realpath(project_dir))
|
168
|
-
header = "#{repo_basename} (#{original_branches[project_dir]})"
|
169
|
-
puts
|
168
|
+
header = " #{repo_basename} (#{original_branches[project_dir]}) "
|
169
|
+
puts center_pad(header).light_green
|
170
170
|
reset(dir: project_dir)
|
171
|
-
puts
|
171
|
+
puts center_pad.light_green
|
172
172
|
end
|
173
173
|
puts
|
174
174
|
end
|
@@ -191,9 +191,10 @@ module Dev
|
|
191
191
|
next unless File.exist?(project_dir)
|
192
192
|
|
193
193
|
repo_basename = File.basename(File.realpath(project_dir))
|
194
|
-
|
194
|
+
header = " #{repo_basename} "
|
195
|
+
puts center_pad(header).light_green
|
195
196
|
@success &= checkout(branch, dir: project_dir)
|
196
|
-
puts
|
197
|
+
puts center_pad.light_green
|
197
198
|
end
|
198
199
|
puts
|
199
200
|
|
@@ -284,9 +285,10 @@ module Dev
|
|
284
285
|
next unless File.exist?(project_dir)
|
285
286
|
|
286
287
|
repo_basename = File.basename(File.realpath(project_dir))
|
287
|
-
|
288
|
+
header = " #{repo_basename} "
|
289
|
+
puts center_pad(header).light_green
|
288
290
|
@success &= merge(branch, dir: project_dir)
|
289
|
-
puts
|
291
|
+
puts center_pad.light_green
|
290
292
|
end
|
291
293
|
puts
|
292
294
|
|
@@ -332,9 +334,10 @@ module Dev
|
|
332
334
|
next unless File.exist?(project_dir)
|
333
335
|
|
334
336
|
repo_basename = File.basename(File.realpath(project_dir))
|
335
|
-
|
337
|
+
header = " #{repo_basename} "
|
338
|
+
puts center_pad(header).light_green
|
336
339
|
@success &= pull(dir: project_dir)
|
337
|
-
puts
|
340
|
+
puts center_pad.light_green
|
338
341
|
end
|
339
342
|
puts
|
340
343
|
|
@@ -370,9 +373,10 @@ module Dev
|
|
370
373
|
next unless File.exist?(project_dir)
|
371
374
|
|
372
375
|
repo_basename = File.basename(File.realpath(project_dir))
|
373
|
-
|
376
|
+
header = " #{repo_basename} "
|
377
|
+
puts center_pad(header).light_green
|
374
378
|
@success &= push(dir: project_dir)
|
375
|
-
puts
|
379
|
+
puts center_pad.light_green
|
376
380
|
end
|
377
381
|
puts
|
378
382
|
|
@@ -435,10 +439,11 @@ module Dev
|
|
435
439
|
end
|
436
440
|
|
437
441
|
# Center the string and pad on either side with the given padding character
|
438
|
-
# @deprecated Please use {Dev::Common#center_pad} instead
|
439
442
|
def center_pad(string = '', pad: '-', len: 80)
|
440
|
-
|
441
|
-
|
443
|
+
center_dash = len / 2
|
444
|
+
string = string.to_s
|
445
|
+
center_str = string.length / 2
|
446
|
+
string.rjust(center_dash + center_str - 1, pad).ljust(len - 1, pad)
|
442
447
|
end
|
443
448
|
|
444
449
|
# Exclude the command from the message and print all error lines
|
@@ -5,13 +5,11 @@ module Dev
|
|
5
5
|
# Issue subtypes which do not map to a story type
|
6
6
|
NON_STORY_TYPES = ['epic', 'review', 'sub-task', 'code review sub-task', 'pre-deploy sub-task', 'deploy sub-task', 'devops sub-task'].freeze
|
7
7
|
|
8
|
-
attr_accessor :data, :project, :
|
9
|
-
:last_in_progress_history, :first_in_review_history, :last_closed_history
|
8
|
+
attr_accessor :data, :project, :id, :title, :points, :assignee, :resolved_date, :histories, :last_in_progress_history, :first_in_review_history, :last_closed_history
|
10
9
|
|
11
10
|
def initialize(data)
|
12
11
|
@data = data
|
13
12
|
@project = Jira::Project.new(data)
|
14
|
-
@parent = Jira::Parent.new(data) if data.respond_to?(:parent)
|
15
13
|
@id = data.key
|
16
14
|
@title = data.summary
|
17
15
|
@points = calculate_points(data)
|
@@ -8,12 +8,11 @@ module Dev
|
|
8
8
|
DEFAULT_PACKAGE_FILE = 'composer.json'.freeze
|
9
9
|
|
10
10
|
# Config object for setting top level git config options
|
11
|
-
Config = Struct.new(:container_path, :local_path, :package_file
|
11
|
+
Config = Struct.new(:container_path, :local_path, :package_file) do
|
12
12
|
def initialize
|
13
13
|
self.container_path = DEFAULT_PATH
|
14
14
|
self.local_path = DEV_COMMANDS_ROOT_DIR
|
15
15
|
self.package_file = DEFAULT_PACKAGE_FILE
|
16
|
-
self.coverage = nil
|
17
16
|
end
|
18
17
|
end
|
19
18
|
|
@@ -31,14 +30,12 @@ module Dev
|
|
31
30
|
alias_method :configure, :config
|
32
31
|
end
|
33
32
|
|
34
|
-
attr_accessor :container_path, :local_path, :package_file
|
33
|
+
attr_accessor :container_path, :local_path, :package_file
|
35
34
|
|
36
|
-
def initialize(container_path: nil, local_path: nil, package_file: nil
|
35
|
+
def initialize(container_path: nil, local_path: nil, package_file: nil)
|
37
36
|
@container_path = container_path || self.class.config.container_path
|
38
37
|
@local_path = local_path || self.class.config.local_path
|
39
38
|
@package_file = package_file || self.class.config.package_file
|
40
|
-
@coverage = coverage || Dev::Coverage::None.new
|
41
|
-
raise 'coverage must be an instance of the base class' unless @coverage.is_a?(Dev::Coverage::Base)
|
42
39
|
end
|
43
40
|
|
44
41
|
# The base npm command that is the starting point for all subsequent commands
|
@@ -61,12 +58,9 @@ module Dev
|
|
61
58
|
end
|
62
59
|
|
63
60
|
# Build the command to fix any security vulnerabilities that were found
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
# audit_fix.concat(Dev::Common.new.tokenize(ENV['OPTS'].to_s))
|
68
|
-
# audit_fix
|
69
|
-
# end
|
61
|
+
def audit_fix_command
|
62
|
+
raise 'not implemented'
|
63
|
+
end
|
70
64
|
|
71
65
|
# Build the php install command
|
72
66
|
def install_command
|
@@ -79,7 +73,7 @@ module Dev
|
|
79
73
|
# Build the php lint command
|
80
74
|
def lint_command
|
81
75
|
lint = base_command
|
82
|
-
lint << 'lint'
|
76
|
+
lint << 'run' << 'lint'
|
83
77
|
lint.concat(Dev::Common.new.tokenize(ENV['OPTS'].to_s))
|
84
78
|
lint
|
85
79
|
end
|
@@ -87,7 +81,7 @@ module Dev
|
|
87
81
|
# Build the php lint fix command
|
88
82
|
def lint_fix_command
|
89
83
|
lint_fix = base_command
|
90
|
-
lint_fix << 'lint-fix'
|
84
|
+
lint_fix << 'run' << 'lint-fix'
|
91
85
|
lint_fix.concat(Dev::Common.new.tokenize(ENV['OPTS'].to_s))
|
92
86
|
lint_fix
|
93
87
|
end
|
@@ -95,24 +89,14 @@ module Dev
|
|
95
89
|
# Build the php test command
|
96
90
|
def test_command
|
97
91
|
test = []
|
98
|
-
|
99
|
-
test.concat(coverage.php_options) if coverage
|
92
|
+
lint_fix << 'run' << 'test'
|
100
93
|
test.concat(Dev::Common.new.tokenize(ENV['OPTS'].to_s))
|
101
94
|
test
|
102
95
|
end
|
103
96
|
|
104
|
-
#
|
105
|
-
def
|
106
|
-
|
107
|
-
end
|
108
|
-
|
109
|
-
# Build the php fast test command
|
110
|
-
def test_fast_command(processes = 4)
|
111
|
-
test = []
|
112
|
-
test << './vendor/bin/paratest'
|
113
|
-
test.concat(Dev::Common.new.tokenize(ENV['OPTS'].to_s))
|
114
|
-
test << "-p#{processes}" << '--runner=WrapperRunner'
|
115
|
-
test
|
97
|
+
# Build the php test (with coverage) command
|
98
|
+
def test_coverage_command
|
99
|
+
raise 'not implemented'
|
116
100
|
end
|
117
101
|
end
|
118
102
|
end
|
@@ -1,46 +1,39 @@
|
|
1
1
|
module Dev
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
# If an architecture was specified in the ENV, use that. Otherwise auto-deted based of the OS reported architecture
|
8
|
-
def architecture
|
9
|
-
arch = env_architecture || os_architecture
|
10
|
-
raise "Invalid DOCKER_ARCHITECTURE: #{arch} (allowed are #{ALLOWED_ARCHITECTURES.join(', ')})" unless ALLOWED_ARCHITECTURES.include?(arch)
|
11
|
-
|
12
|
-
arch
|
13
|
-
end
|
14
|
-
|
15
|
-
# Check to see if a docker architecture has been specified in the ENV
|
16
|
-
# If it has, verify the format and the value
|
17
|
-
private def env_architecture
|
18
|
-
arch = ENV['DOCKER_ARCHITECTURE'].to_s.strip.downcase
|
19
|
-
return nil if arch.empty?
|
2
|
+
class Common
|
3
|
+
# Class which returns information about the current platform
|
4
|
+
class Platform
|
5
|
+
# Constant containing all supported architectures
|
6
|
+
ALLOWED_ARCHITECTURES = %w(arm64 amd64).freeze
|
20
7
|
|
21
|
-
|
22
|
-
|
23
|
-
|
8
|
+
# Normalize the ruby platform to return a docker platform architecture format
|
9
|
+
def determine_compute_architecture
|
10
|
+
case RUBY_PLATFORM
|
11
|
+
when /x86_64|amd64/
|
12
|
+
'linux/amd64' # 64-bit Intel/AMD architecture
|
13
|
+
when /arm|aarch64/
|
14
|
+
'linux/arm64' # ARM architecture
|
15
|
+
else
|
16
|
+
raise 'Unknown or unsupported architecture'
|
17
|
+
end
|
18
|
+
end
|
24
19
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
20
|
+
# Determine the platform architecture
|
21
|
+
# If one was specified in the DOCKER_ARCHITECTURE variable, use it
|
22
|
+
# Otherwise, use the RUBY_PLATFORM built-in to auto-detect and architecture
|
23
|
+
def architecture
|
24
|
+
docker_architecture = ENV['DOCKER_ARCHITECTURE'].to_s.strip.downcase
|
25
|
+
if docker_architecture.empty?
|
26
|
+
determine_compute_architecture
|
27
|
+
else
|
28
|
+
raise "Missing 'linux/' prefix in DOCKER_ARCHITECTURE: #{docker_architecture}" unless docker_architecture.start_with?('linux/')
|
29
29
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
end
|
30
|
+
architecture_name = docker_architecture.split('/')[1]
|
31
|
+
unless ALLOWED_ARCHITECTURES.include?(architecture_name)
|
32
|
+
raise "Invalid DOCKER_ARCHITECTURE: #{architecture_name}. Allowed architectures are #{ALLOWED_ARCHITECTURES.join(', ')}"
|
33
|
+
end
|
34
34
|
|
35
|
-
|
36
|
-
|
37
|
-
# Class which returns information about the current platform
|
38
|
-
class Platform < Platform
|
39
|
-
# Initializer for the deprecated class
|
40
|
-
# @deprecated Please use {Dev::Platform#new} instead
|
41
|
-
def initialize
|
42
|
-
warn '[DEPRECATION] `Dev::Common::Platform#new` is deprecated. Please use `Dev::Platform#new` instead.'
|
43
|
-
super
|
35
|
+
docker_architecture
|
36
|
+
end
|
44
37
|
end
|
45
38
|
end
|
46
39
|
end
|
@@ -90,16 +90,14 @@ module Dev
|
|
90
90
|
|
91
91
|
# Build the bundle lint command
|
92
92
|
def lint_command
|
93
|
-
lint =
|
94
|
-
lint << 'exec' << 'rubocop'
|
93
|
+
lint = ['rubocop']
|
95
94
|
lint.concat(Dev::Common.new.tokenize(ENV['OPTS'].to_s))
|
96
95
|
lint
|
97
96
|
end
|
98
97
|
|
99
98
|
# Build the bundle lint fix command
|
100
99
|
def lint_fix_command
|
101
|
-
lint_fix =
|
102
|
-
lint_fix << 'exec' << 'rubocop'
|
100
|
+
lint_fix = ['rubocop']
|
103
101
|
lint_fix << '-A'
|
104
102
|
lint_fix.concat(Dev::Common.new.tokenize(ENV['OPTS'].to_s))
|
105
103
|
lint_fix
|
@@ -107,8 +105,7 @@ module Dev
|
|
107
105
|
|
108
106
|
# Build the bundle test command
|
109
107
|
def test_command
|
110
|
-
test =
|
111
|
-
test << 'exec' << 'rspec'
|
108
|
+
test = ['rspec']
|
112
109
|
test.concat(Dev::Common.new.tokenize(ENV['OPTS'].to_s))
|
113
110
|
test
|
114
111
|
end
|