firespring_dev_commands 2.1.34 → 2.5.0.pre.alpha.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/lib/firespring_dev_commands/audit/report.rb +2 -9
  4. data/lib/firespring_dev_commands/aws/cloudformation.rb +3 -10
  5. data/lib/firespring_dev_commands/common.rb +2 -22
  6. data/lib/firespring_dev_commands/docker/status.rb +0 -20
  7. data/lib/firespring_dev_commands/docker.rb +16 -86
  8. data/lib/firespring_dev_commands/eol/aws.rb +2 -10
  9. data/lib/firespring_dev_commands/eol.rb +2 -12
  10. data/lib/firespring_dev_commands/git.rb +22 -17
  11. data/lib/firespring_dev_commands/jira/issue.rb +1 -3
  12. data/lib/firespring_dev_commands/node.rb +1 -1
  13. data/lib/firespring_dev_commands/php.rb +12 -28
  14. data/lib/firespring_dev_commands/platform.rb +31 -38
  15. data/lib/firespring_dev_commands/ruby.rb +3 -6
  16. data/lib/firespring_dev_commands/target_process/query.rb +4 -30
  17. data/lib/firespring_dev_commands/target_process/release.rb +1 -1
  18. data/lib/firespring_dev_commands/target_process/team_assignment.rb +1 -1
  19. data/lib/firespring_dev_commands/target_process/user.rb +1 -13
  20. data/lib/firespring_dev_commands/target_process/user_story.rb +1 -1
  21. data/lib/firespring_dev_commands/target_process/user_story_history.rb +1 -1
  22. data/lib/firespring_dev_commands/target_process.rb +7 -24
  23. data/lib/firespring_dev_commands/templates/aws.rb +6 -14
  24. data/lib/firespring_dev_commands/templates/docker/application.rb +2 -2
  25. data/lib/firespring_dev_commands/templates/docker/node/application.rb +5 -28
  26. data/lib/firespring_dev_commands/templates/docker/php/application.rb +16 -31
  27. data/lib/firespring_dev_commands/templates/docker/ruby/application.rb +5 -27
  28. data/lib/firespring_dev_commands/templates/eol.rb +2 -3
  29. data/lib/firespring_dev_commands/templates/git.rb +0 -17
  30. data/lib/firespring_dev_commands/version.rb +1 -1
  31. data/lib/firespring_dev_commands.rb +1 -1
  32. metadata +37 -67
  33. data/lib/firespring_dev_commands/aws/route53.rb +0 -107
  34. data/lib/firespring_dev_commands/bloom_growth/rock.rb +0 -34
  35. data/lib/firespring_dev_commands/bloom_growth/seat.rb +0 -16
  36. data/lib/firespring_dev_commands/bloom_growth/user.rb +0 -43
  37. data/lib/firespring_dev_commands/bloom_growth.rb +0 -132
  38. data/lib/firespring_dev_commands/certificate.rb +0 -59
  39. data/lib/firespring_dev_commands/coverage/base.rb +0 -16
  40. data/lib/firespring_dev_commands/coverage/cobertura.rb +0 -86
  41. data/lib/firespring_dev_commands/coverage/none.rb +0 -21
  42. data/lib/firespring_dev_commands/docker/desktop.rb +0 -59
  43. data/lib/firespring_dev_commands/jira/parent.rb +0 -19
  44. data/lib/firespring_dev_commands/os.rb +0 -35
  45. data/lib/firespring_dev_commands/port.rb +0 -24
  46. data/lib/firespring_dev_commands/target_process/time.rb +0 -32
  47. data/lib/firespring_dev_commands/templates/aws/services/route53.rb +0 -106
  48. 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: aa188df0b1a042594409df9d0c288298a1c2899ccf0a420f213f34f6bd463950
4
- data.tar.gz: 474383072092cf5be3bbbcc5c92dcb5b0fbfc426a55ce93dd46e174e6a3b9217
3
+ metadata.gz: e146e8c9d9c3422dfd7641c6a09ca8c2cdfad6ed430d73aec5808de28ed5d880
4
+ data.tar.gz: 273923aae5ccce231fc77174ed89cbe0e4f5ad59b52219b04303f983e9966e1d
5
5
  SHA512:
6
- metadata.gz: 1d21358d2fcd8fe2dfed28327c553b6795e7095433ff6667d41bcca6d89268ab03367a0a166535d53d1623368716aadb15bcda65f24eb18e40efd895e7147d20
7
- data.tar.gz: 20a2bedaed3177859237c8d3cf4e7ab36c4d8382906068bd489456617de50cfd430a4c145afe917b4acb1963bd76435dd51fde2898ae5ed5190c1ba6b4af89a3
6
+ metadata.gz: 67223e6ba12a10f798d7fee6b1cab844da41cd3dc65a449330e8c8bd0ef86180cc297889b7365b7b68f5ca8054919e9881693707ecfde02e539d0a7e22c6af51
7
+ data.tar.gz: ada0e13a3f2d8022687a2542503bad6bc847bf32fc17604116d17e06ed46ee7efa18aea35635c31a26c07f5ccdd6a3c5083235edaafd77684528bc487c17f3c7
data/README.md CHANGED
@@ -28,7 +28,7 @@ Dev::Template::Docker::Node::Application.new('foo')
28
28
  ```
29
29
  * If you run `rake -T` now, you should have base rake commands and application rake commands for an app called `foo`
30
30
 
31
- * (optional) Add AWS login template commands
31
+ * (optinoal) Add AWS login template commands
32
32
  ```
33
33
  # Configure AWS accounts and create tasks
34
34
  Dev::Aws::Account::configure do |c|
@@ -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, :error_on_unknown, :ignorelist, :filtered_items
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
- max_severity = if error_on_unknown.to_s.strip == 'true'
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, :preserve_parameters_on_update, :state
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: update_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 = answer.to_s.strip
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: #{Dev::Common.new.filesize(info['SpaceReclaimed'])}"
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, source, destination)
186
- # Add the working dir of the container onto the destination (if it doesn't start a path separator)
187
- destination = File.join(working_dir(container), destination) unless destination.start_with?(File::SEPARATOR)
188
- LOG.info "Copying #{source} to #{destination}..."
189
-
190
- # Need to determine the type of the destination (file or directory or nonexistant)
191
- noexist_code = 22
192
- file_code = 33
193
- directory_code = 44
194
- unknown_code = 55
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, source, destination, required: true)
226
- source = File.join(working_dir(container), source) unless source.start_with?(File::SEPARATOR)
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(source) do |chunk|
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(source, destination)
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 = Dev::Common.new.filesize(image.info&.dig('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>"]
@@ -72,23 +72,19 @@ module Dev
72
72
  # Queries and returns product versions for rds instance products
73
73
  def rds_instance_products
74
74
  aws_engines = %w(mysql postgresql)
75
- aws_sqlserver_engines = %w(sqlserver-ee sqlserver-ex sqlserver-se sqlserver-web)
76
75
  client = ::Aws::RDS::Client.new
77
76
 
78
77
  [].tap do |ary|
79
78
  Dev::Aws.each_page(client, :describe_db_instances) do |response|
80
79
  response.db_instances.each do |instance|
81
80
  name = instance.db_instance_identifier
82
- engine = instance.engine.gsub('aurora-', '')
81
+ engine = instance.engine.tr('aurora-', '')
83
82
  product = if aws_engines.include?(engine)
84
83
  "amazon-rds-#{engine}"
85
- elsif aws_sqlserver_engines.include?(engine)
86
- 'mssqlserver'
87
84
  else
88
85
  engine
89
86
  end
90
87
  version = instance.engine_version.reverse.split('.')[-2..].join('.').reverse
91
- version.chop! if version.end_with?('.00')
92
88
  ary << Dev::EndOfLife::ProductVersion.new(product, version, name)
93
89
  end
94
90
  end
@@ -98,23 +94,19 @@ module Dev
98
94
  # Queries and returns product versions for rds cluster products
99
95
  def rds_cluster_products
100
96
  aws_engines = %w(mysql postgresql)
101
- aws_sqlserver_engines = %w(sqlserver-ee sqlserver-ex sqlserver-se sqlserver-web)
102
97
  client = ::Aws::RDS::Client.new
103
98
 
104
99
  [].tap do |ary|
105
100
  Dev::Aws.each_page(client, :describe_db_clusters) do |response|
106
101
  response.db_clusters.each do |cluster|
107
102
  name = cluster.db_cluster_identifier
108
- engine = cluster.engine.gsub('aurora-', '')
103
+ engine = cluster.engine.tr('aurora-', '')
109
104
  product = if aws_engines.include?(engine)
110
105
  "amazon-rds-#{engine}"
111
- elsif aws_sqlserver_engines.include?(engine)
112
- 'mssqlserver'
113
106
  else
114
107
  engine
115
108
  end
116
109
  version = cluster.engine_version.reverse.split('.')[-2..].join('.').reverse
117
- version.chop! if version.end_with?('.00')
118
110
  ary << Dev::EndOfLife::ProductVersion.new(product, version, name)
119
111
  end
120
112
  end
@@ -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
- status
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 Dev::Common.new.center_pad(header).light_green
116
+ header = " #{repo_basename} (#{original_branches[project_dir]}) "
117
+ puts center_pad(header).light_green
118
118
  @success &= status(dir: project_dir)
119
- puts Dev::Common.new.center_pad.light_green
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 Dev::Common.new.center_pad(header).light_green
168
+ header = " #{repo_basename} (#{original_branches[project_dir]}) "
169
+ puts center_pad(header).light_green
170
170
  reset(dir: project_dir)
171
- puts Dev::Common.new.center_pad.light_green
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
- puts Dev::Common.new.center_pad(repo_basename).light_green
194
+ header = " #{repo_basename} "
195
+ puts center_pad(header).light_green
195
196
  @success &= checkout(branch, dir: project_dir)
196
- puts Dev::Common.new.center_pad.light_green
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
- puts Dev::Common.new.center_pad(repo_basename).light_green
288
+ header = " #{repo_basename} "
289
+ puts center_pad(header).light_green
288
290
  @success &= merge(branch, dir: project_dir)
289
- puts Dev::Common.new.center_pad.light_green
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
- puts Dev::Common.new.center_pad(repo_basename).light_green
337
+ header = " #{repo_basename} "
338
+ puts center_pad(header).light_green
336
339
  @success &= pull(dir: project_dir)
337
- puts Dev::Common.new.center_pad.light_green
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
- puts Dev::Common.new.center_pad(repo_basename).light_green
376
+ header = " #{repo_basename} "
377
+ puts center_pad(header).light_green
374
378
  @success &= push(dir: project_dir)
375
- puts Dev::Common.new.center_pad.light_green
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
- warn '[DEPRECATION] `Dev::Git#center_pad` is deprecated. Please use `Dev::Common#center_pad` instead.'
441
- Dev::Common.new.center_pad(string, pad:, len:)
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, :parent, :id, :title, :points, :assignee, :resolved_date, :histories,
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)
@@ -96,7 +96,7 @@ module Dev
96
96
  test
97
97
  end
98
98
 
99
- # Build the node test command
99
+ # Build the node test (with coverage) command
100
100
  def test_coverage_command
101
101
  test = base_command
102
102
  test << 'run' << 'test:coverage'
@@ -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, :coverage) do
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, :coverage
33
+ attr_accessor :container_path, :local_path, :package_file
35
34
 
36
- def initialize(container_path: nil, local_path: nil, package_file: nil, coverage: 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
- # def audit_fix_command
65
- # audit_fix = base_command
66
- # audit_fix << 'audit' << 'fix'
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
- test << './vendor/bin/phpunit'
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
- # Run the check to ensure code coverage meets the desired threshold
105
- def check_test_coverage(application:)
106
- coverage.check(application:)
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