firespring_dev_commands 2.5.0.pre.alpha.2 → 3.0.0.pre.alpha.1

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.
Files changed (28) hide show
  1. checksums.yaml +4 -4
  2. data/lib/firespring_dev_commands/audit/report.rb +9 -2
  3. data/lib/firespring_dev_commands/aws/account.rb +3 -7
  4. data/lib/firespring_dev_commands/aws/login.rb +0 -20
  5. data/lib/firespring_dev_commands/bloom_growth/rock.rb +34 -0
  6. data/lib/firespring_dev_commands/bloom_growth/seat.rb +16 -0
  7. data/lib/firespring_dev_commands/bloom_growth/user.rb +43 -0
  8. data/lib/firespring_dev_commands/bloom_growth.rb +132 -0
  9. data/lib/firespring_dev_commands/common.rb +11 -22
  10. data/lib/firespring_dev_commands/coverage/base.rb +21 -0
  11. data/lib/firespring_dev_commands/coverage/cobertura.rb +86 -0
  12. data/lib/firespring_dev_commands/coverage/none.rb +25 -0
  13. data/lib/firespring_dev_commands/docker.rb +23 -25
  14. data/lib/firespring_dev_commands/node.rb +13 -12
  15. data/lib/firespring_dev_commands/php.rb +14 -10
  16. data/lib/firespring_dev_commands/platform.rb +1 -1
  17. data/lib/firespring_dev_commands/ruby.rb +19 -7
  18. data/lib/firespring_dev_commands/target_process/query.rb +30 -4
  19. data/lib/firespring_dev_commands/target_process.rb +3 -1
  20. data/lib/firespring_dev_commands/templates/aws.rb +0 -2
  21. data/lib/firespring_dev_commands/templates/base_interface.rb +2 -2
  22. data/lib/firespring_dev_commands/templates/docker/application.rb +2 -2
  23. data/lib/firespring_dev_commands/templates/docker/node/application.rb +47 -10
  24. data/lib/firespring_dev_commands/templates/docker/php/application.rb +45 -19
  25. data/lib/firespring_dev_commands/templates/docker/ruby/application.rb +44 -8
  26. data/lib/firespring_dev_commands/version.rb +1 -1
  27. data/lib/firespring_dev_commands.rb +1 -1
  28. metadata +42 -35
@@ -8,11 +8,12 @@ module Dev
8
8
  DEFAULT_PACKAGE_FILE = 'package.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) do
11
+ Config = Struct.new(:container_path, :local_path, :package_file, :coverage) 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
16
17
  end
17
18
  end
18
19
 
@@ -30,12 +31,14 @@ module Dev
30
31
  alias_method :configure, :config
31
32
  end
32
33
 
33
- attr_accessor :container_path, :local_path, :package_file
34
+ attr_accessor :container_path, :local_path, :package_file, :coverage
34
35
 
35
- def initialize(container_path: nil, local_path: nil, package_file: nil)
36
+ def initialize(container_path: nil, local_path: nil, package_file: nil, coverage: nil)
36
37
  @container_path = container_path || self.class.config.container_path
37
38
  @local_path = local_path || self.class.config.local_path
38
39
  @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)
39
42
  end
40
43
 
41
44
  # The base npm command that is the starting point for all subsequent commands
@@ -75,7 +78,7 @@ module Dev
75
78
  # Build the node lint command
76
79
  def lint_command
77
80
  lint = base_command
78
- lint << 'run' << 'lint'
81
+ lint << 'run' << 'lint' << '--'
79
82
  lint.concat(Dev::Common.new.tokenize(ENV['OPTS'].to_s))
80
83
  lint
81
84
  end
@@ -83,7 +86,7 @@ module Dev
83
86
  # Build the node lint fix command
84
87
  def lint_fix_command
85
88
  lint_fix = base_command
86
- lint_fix << 'run' << 'lint-fix'
89
+ lint_fix << 'run' << 'lint-fix' << '--'
87
90
  lint_fix.concat(Dev::Common.new.tokenize(ENV['OPTS'].to_s))
88
91
  lint_fix
89
92
  end
@@ -91,17 +94,15 @@ module Dev
91
94
  # Build the node test command
92
95
  def test_command
93
96
  test = base_command
94
- test << 'run' << 'test'
97
+ test << 'run' << 'test' << '--'
98
+ test.concat(coverage.node_options) if coverage
95
99
  test.concat(Dev::Common.new.tokenize(ENV['OPTS'].to_s))
96
100
  test
97
101
  end
98
102
 
99
- # Build the node test (with coverage) command
100
- def test_coverage_command
101
- test = base_command
102
- test << 'run' << 'test:coverage'
103
- test.concat(Dev::Common.new.tokenize(ENV['OPTS'].to_s))
104
- test
103
+ # Run the check to ensure code coverage meets the desired threshold
104
+ def check_test_coverage(application:)
105
+ coverage.check(application:)
105
106
  end
106
107
  end
107
108
  end
@@ -8,11 +8,12 @@ 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) do
11
+ Config = Struct.new(:container_path, :local_path, :package_file, :coverage) 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
16
17
  end
17
18
  end
18
19
 
@@ -30,12 +31,14 @@ module Dev
30
31
  alias_method :configure, :config
31
32
  end
32
33
 
33
- attr_accessor :container_path, :local_path, :package_file
34
+ attr_accessor :container_path, :local_path, :package_file, :coverage
34
35
 
35
- def initialize(container_path: nil, local_path: nil, package_file: nil)
36
+ def initialize(container_path: nil, local_path: nil, package_file: nil, coverage: nil)
36
37
  @container_path = container_path || self.class.config.container_path
37
38
  @local_path = local_path || self.class.config.local_path
38
39
  @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)
39
42
  end
40
43
 
41
44
  # The base npm command that is the starting point for all subsequent commands
@@ -73,7 +76,7 @@ module Dev
73
76
  # Build the php lint command
74
77
  def lint_command
75
78
  lint = base_command
76
- lint << 'run' << 'lint'
79
+ lint << 'run' << 'lint' << '--'
77
80
  lint.concat(Dev::Common.new.tokenize(ENV['OPTS'].to_s))
78
81
  lint
79
82
  end
@@ -81,22 +84,23 @@ module Dev
81
84
  # Build the php lint fix command
82
85
  def lint_fix_command
83
86
  lint_fix = base_command
84
- lint_fix << 'run' << 'lint-fix'
87
+ lint_fix << 'run' << 'lint-fix' << '--'
85
88
  lint_fix.concat(Dev::Common.new.tokenize(ENV['OPTS'].to_s))
86
89
  lint_fix
87
90
  end
88
91
 
89
92
  # Build the php test command
90
93
  def test_command
91
- test = []
92
- test << 'run' << 'test'
94
+ test = base_command
95
+ test << 'run' << 'test' << '--'
96
+ test.concat(coverage.php_options) if coverage
93
97
  test.concat(Dev::Common.new.tokenize(ENV['OPTS'].to_s))
94
98
  test
95
99
  end
96
100
 
97
- # Build the php test (with coverage) command
98
- def test_coverage_command
99
- raise 'not implemented'
101
+ # Run the check to ensure code coverage meets the desired threshold
102
+ def check_test_coverage(application:)
103
+ coverage.check(application:)
100
104
  end
101
105
  end
102
106
  end
@@ -8,7 +8,7 @@ module Dev
8
8
  # Normalize the ruby platform to return a docker platform architecture format
9
9
  def determine_compute_architecture
10
10
  case RUBY_PLATFORM
11
- when /x86_64|amd64/
11
+ when /x86_64|amd64|x64-mingw/
12
12
  'linux/amd64' # 64-bit Intel/AMD architecture
13
13
  when /arm|aarch64/
14
14
  'linux/arm64' # ARM architecture
@@ -8,11 +8,12 @@ module Dev
8
8
  DEFAULT_PACKAGE_FILE = 'Gemfile'.freeze
9
9
 
10
10
  # Config object for setting top level git config options
11
- Config = Struct.new(:container_path, :local_path, :package_file, :min_version, :max_version) do
11
+ Config = Struct.new(:container_path, :local_path, :package_file, :min_version, :max_version, :coverage) 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
16
17
  self.min_version = nil
17
18
  self.max_version = nil
18
19
  end
@@ -37,12 +38,15 @@ module Dev
37
38
  end
38
39
  end
39
40
 
40
- attr_accessor :container_path, :local_path, :package_file
41
+ attr_accessor :container_path, :local_path, :package_file, :coverage
41
42
 
42
- def initialize(container_path: nil, local_path: nil, package_file: nil)
43
+ def initialize(container_path: nil, local_path: nil, package_file: nil, coverage: nil)
43
44
  @container_path = container_path || self.class.config.container_path
44
45
  @local_path = local_path || self.class.config.local_path
45
46
  @package_file = package_file || self.class.config.package_file
47
+ @coverage = coverage || Dev::Coverage::None.new
48
+ raise 'coverage must be an instance of the base class' unless @coverage.is_a?(Dev::Coverage::Base)
49
+
46
50
  check_version
47
51
  end
48
52
 
@@ -90,24 +94,32 @@ module Dev
90
94
 
91
95
  # Build the bundle lint command
92
96
  def lint_command
93
- lint = ['rubocop']
97
+ lint = base_command
98
+ lint << 'exec' << 'rake' << 'lint'
94
99
  lint.concat(Dev::Common.new.tokenize(ENV['OPTS'].to_s))
95
100
  lint
96
101
  end
97
102
 
98
103
  # Build the bundle lint fix command
99
104
  def lint_fix_command
100
- lint_fix = ['rubocop']
101
- lint_fix << '-A'
105
+ lint_fix = base_command
106
+ lint_fix << 'exec' << 'rake' << 'lint:fix'
102
107
  lint_fix.concat(Dev::Common.new.tokenize(ENV['OPTS'].to_s))
103
108
  lint_fix
104
109
  end
105
110
 
106
111
  # Build the bundle test command
107
112
  def test_command
108
- test = ['rspec']
113
+ test = base_command
114
+ test << 'exec' << 'rake' << 'test'
115
+ test.concat(coverage.ruby_options) if coverage
109
116
  test.concat(Dev::Common.new.tokenize(ENV['OPTS'].to_s))
110
117
  test
111
118
  end
119
+
120
+ # Run the check to ensure code coverage meets the desired threshold
121
+ def check_test_coverage(application:)
122
+ coverage.check(application:)
123
+ end
112
124
  end
113
125
  end
@@ -2,12 +2,13 @@ module Dev
2
2
  class TargetProcess
3
3
  # Class for writing target process query statements
4
4
  class Query
5
- attr_accessor :where, :incl, :take
5
+ attr_accessor :where, :incl, :take, :empty
6
6
 
7
7
  def initialize
8
8
  @where = []
9
9
  @incl = []
10
10
  @take = 250
11
+ @empty = false
11
12
  end
12
13
 
13
14
  # Add a new query clause
@@ -33,6 +34,11 @@ module Dev
33
34
  end
34
35
  end
35
36
 
37
+ # Check if any of the "in" statements were empty. If so then we don't want to actually run the query
38
+ def empty?
39
+ @empty == true
40
+ end
41
+
36
42
  # Generate the string representation for this query
37
43
  def generate
38
44
  {}.tap do |clause|
@@ -50,22 +56,38 @@ module Dev
50
56
  # TODO: Do these need moved to their associated entities?
51
57
  # Add a filter that looks for stories whose id is contained in the list of ids given
52
58
  def filter_by_user_story_ids(user_story_ids)
59
+ if user_story_ids.nil? || user_story_ids.empty?
60
+ @empty = true
61
+ return
62
+ end
53
63
  self << "(Id in ('#{user_story_ids.join("', '")}'))"
54
64
  end
55
65
 
56
66
  # Add a filter that looks for stories whose team id is contained in the list of ids given
57
67
  def filter_by_team_ids(team_ids)
58
- self << "(Team.Id in ('#{team_ids.join("', '")}'))" unless team_ids.nil? || team_ids.empty?
68
+ if team_ids.nil? || team_ids.empty?
69
+ @empty = true
70
+ return
71
+ end
72
+ self << "(Team.Id in ('#{team_ids.join("', '")}'))"
59
73
  end
60
74
 
61
75
  # Add a filter that looks for stories whose project id is contained in the list of ids given
62
76
  def filter_by_project(projects)
77
+ if projects.nil? || projects.empty?
78
+ @empty = true
79
+ return
80
+ end
63
81
  self << "(Project.Name in ('#{projects.join("', '")}'))"
64
82
  end
65
83
 
66
84
  # Add a filter that looks for stories whose state is contained in the list of states given
67
85
  def filter_by_states(states)
68
- self << "(EntityState.Name in ('#{states.join("', '")}'))" unless states.nil? || states.empty?
86
+ if states.nil? || states.empty?
87
+ @empty = true
88
+ return
89
+ end
90
+ self << "(EntityState.Name in ('#{states.join("', '")}'))"
69
91
  end
70
92
 
71
93
  # Add a filter that looks for stories whose state is set to final
@@ -114,7 +136,11 @@ module Dev
114
136
 
115
137
  # Add a filter that looks for assignable ids which are included in the given array
116
138
  def filter_by_entity_ids(entity_ids)
117
- self << "(Assignable.Id in ('#{entity_ids.join("', '")}'))" unless entity_ids.nil? || entity_ids.empty?
139
+ if entity_ids.nil? || entity_ids.empty?
140
+ @empty = true
141
+ return
142
+ end
143
+ self << "(Assignable.Id in ('#{entity_ids.join("', '")}'))"
118
144
  end
119
145
 
120
146
  # Add a filter that looks for a custom deploy date between the given dates`
@@ -15,7 +15,7 @@ module Dev
15
15
  # The text of the url variable key
16
16
  TP_URL = 'TP_URL'.freeze
17
17
 
18
- # Config object for setting top level jira config options
18
+ # Config object for setting top level target process config options
19
19
  Config = Struct.new(:username, :password, :url, :http_debug) do
20
20
  def initialize
21
21
  Dotenv.load(CONFIG_FILE) if File.exist?(CONFIG_FILE)
@@ -117,6 +117,8 @@ module Dev
117
117
  # Call the given block (if present) with each piece of data
118
118
  # Return all pieces of data
119
119
  def get(path, query, &)
120
+ return [] if query.empty?
121
+
120
122
  query_string = query.generate
121
123
  url = "/api/v1/#{path}"
122
124
  url << "?#{URI.encode_www_form(query_string)}" unless query_string.empty?
@@ -49,7 +49,6 @@ module Dev
49
49
  end
50
50
  end
51
51
 
52
- # rubocop:disable Metrics/MethodLength
53
52
  # Create the rake task for the aws credentials setup and login method
54
53
  def create_login_task!
55
54
  # Have to set a local variable to be accessible inside of the instance_eval block
@@ -92,7 +91,6 @@ module Dev
92
91
  end
93
92
  end
94
93
  end
95
- # rubocop:enable Metrics/MethodLength
96
94
 
97
95
  # Create the rake task for the eol method
98
96
  def create_eol_task!
@@ -47,14 +47,14 @@ end
47
47
  # Create the base init command
48
48
  DEV_COMMANDS_TOP_LEVEL.instance_eval do
49
49
  task :init do
50
- LOG.debug 'In base init'
50
+ # Placeholder for general initialization tasks
51
51
  end
52
52
  end
53
53
 
54
54
  # Create the base init_docker command
55
55
  DEV_COMMANDS_TOP_LEVEL.instance_eval do
56
56
  task init_docker: %w(init) do
57
- LOG.debug 'In base init docker'
57
+ # Placeholder for general docker initialization tasks
58
58
  end
59
59
  end
60
60
 
@@ -72,7 +72,7 @@ module Dev
72
72
  return if exclude.include?(:sh)
73
73
 
74
74
  desc "Open a shell into a running #{application} container"
75
- task sh: %W(init_docker #{application}:up _pre_sh_hooks) do
75
+ task sh: %W(init_docker #{application}:up_no_deps _pre_sh_hooks) do
76
76
  Dev::Docker::Compose.new(services: [application]).sh
77
77
  Rake::Task[:_post_sh_hooks].execute
78
78
  end
@@ -154,7 +154,7 @@ module Dev
154
154
  return if exclude.include?(:reload)
155
155
 
156
156
  desc "Reloads the #{application} container"
157
- task reload: %w(init_docker _pre_reload_hooks down up) do
157
+ task reload: %w(init_docker _pre_reload_hooks down up_no_deps) do
158
158
  Rake::Task[:_post_reload_hooks].execute
159
159
  end
160
160
  end
@@ -7,11 +7,30 @@ module Dev
7
7
  module Node
8
8
  # Class for default rake tasks associated with a node project
9
9
  class Application < Dev::Template::ApplicationInterface
10
- attr_reader :node
10
+ attr_reader :node, :start_container_dependencies_on_test, :test_isolation
11
+
12
+ # Create the templated rake tasks for the node application
13
+ #
14
+ # @param application [String] The name of the application
15
+ # @param container_path [String] The path to the application inside of the container
16
+ # @param local_path [String] The path to the application on your local system
17
+ # @param start_container_dependencies_on_test [Boolean] Whether or not to start up container dependencies when running tests
18
+ # @param test_isolation [Boolean] Whether or not to start tests in an isolated project and clean up after tests are run
19
+ # @param coverage [Dev::Coverage::Base] The coverage class which is an instance of Base to be used to evaluate coverage
20
+ # @param exclude [Array<Symbol>] An array of default template tasks to exclude
21
+ def initialize(
22
+ application,
23
+ container_path: nil,
24
+ local_path: nil,
25
+ start_container_dependencies_on_test: false,
26
+ test_isolation: false,
27
+ coverage: nil,
28
+ exclude: []
29
+ )
30
+ @node = Dev::Node.new(container_path:, local_path:, coverage:)
31
+ @start_container_dependencies_on_test = start_container_dependencies_on_test
32
+ @test_isolation = test_isolation
11
33
 
12
- # Allow for custom container path for the application
13
- def initialize(application, container_path: nil, local_path: nil, exclude: [])
14
- @node = Dev::Node.new(container_path:, local_path:)
15
34
  super(application, exclude:)
16
35
  end
17
36
 
@@ -30,9 +49,10 @@ module Dev
30
49
  end
31
50
 
32
51
  namespace :node do
33
- desc "Run the node linting software against the #{application}'s codebase"
52
+ desc "Run the node linting software against the #{application}'s codebase" \
53
+ "\n\t(optional) use OPTS=... to pass additional options to the command"
34
54
  task lint: %w(init_docker up_no_deps) do
35
- LOG.debug('Check for node linting errors')
55
+ LOG.debug("Check for node linting errors in the #{application} codebase")
36
56
 
37
57
  options = []
38
58
  options << '-T' if Dev::Common.new.running_codebuild?
@@ -42,7 +62,7 @@ module Dev
42
62
  namespace :lint do
43
63
  desc "Run the linting software against the #{application}'s codebase and apply all available fixes"
44
64
  task fix: %w(init_docker up_no_deps) do
45
- LOG.debug('Check and fix linting errors')
65
+ LOG.debug("Check and fix all node linting errors in the #{application} codebase")
46
66
 
47
67
  options = []
48
68
  options << '-T' if Dev::Common.new.running_codebuild?
@@ -59,6 +79,8 @@ module Dev
59
79
  application = @name
60
80
  node = @node
61
81
  exclude = @exclude
82
+ test_isolation = @test_isolation
83
+ up_cmd = @start_container_dependencies_on_test ? :up : :up_no_deps
62
84
  return if exclude.include?(:test)
63
85
 
64
86
  DEV_COMMANDS_TOP_LEVEL.instance_eval do
@@ -68,14 +90,28 @@ module Dev
68
90
  # This is just a placeholder to execute the dependencies
69
91
  end
70
92
 
93
+ task test_init_docker: %w(init_docker) do
94
+ Dev::Docker::Compose.configure do |c|
95
+ c.project_name = SecureRandom.hex if test_isolation
96
+ end
97
+ end
98
+
71
99
  namespace :node do
72
- desc "Run all node tests against the #{application}'s codebase"
73
- task test: %w(init_docker up) do
100
+ desc "Run all node tests against the #{application}'s codebase" \
101
+ "\n\t(optional) use OPTS=... to pass additional options to the command"
102
+ task test: %W(test_init_docker #{up_cmd}) do
74
103
  LOG.debug("Running all node tests in the #{application} codebase")
75
104
 
76
105
  options = []
77
106
  options << '-T' if Dev::Common.new.running_codebuild?
78
107
  Dev::Docker::Compose.new(services: application, options:).exec(*node.test_command)
108
+ node.check_test_coverage(application:)
109
+
110
+ # Clean up resources if we are on an isolated project name
111
+ if test_isolation
112
+ Dev::Docker::Compose.new.down
113
+ Dev::Docker.new.prune_project_volumes(project_name: Dev::Docker::Compose.config.project_name)
114
+ end
79
115
  end
80
116
  end
81
117
  end
@@ -120,7 +156,8 @@ module Dev
120
156
  namespace :node do
121
157
  desc 'Run NPM Audit on the target application' \
122
158
  "\n\tuse MIN_SEVERITY=(info low moderate high critical) to fetch only severity type selected and above (default=high)." \
123
- "\n\tuse IGNORELIST=(comma delimited list of ids) removes the entry from the list."
159
+ "\n\tuse IGNORELIST=(comma delimited list of ids) removes the entry from the list." \
160
+ "\n\t(optional) use OPTS=... to pass additional options to the command"
124
161
  task audit: %w(init_docker up_no_deps) do
125
162
  opts = []
126
163
  opts << '-T' if Dev::Common.new.running_codebuild?
@@ -1,5 +1,4 @@
1
1
  require_relative '../../base_interface'
2
- require 'securerandom'
3
2
 
4
3
  module Dev
5
4
  module Template
@@ -8,14 +7,28 @@ module Dev
8
7
  module Php
9
8
  # Class for default rake tasks associated with a php project
10
9
  class Application < Dev::Template::ApplicationInterface
11
- attr_reader :php, :siloed_tests
12
-
13
- # Allow for custom container path for the application
14
- def initialize(application, container_path: nil, local_path: nil, siloed_tests: nil, exclude: [])
15
- @php = Dev::Php.new(container_path:, local_path:)
16
- # TODO: Better name
17
- # TODO: Should this apply to all or just tests?
18
- @siloed_tests = siloed_tests
10
+ attr_reader :php, :start_container_dependencies_on_test, :test_isolation
11
+
12
+ # Create the templated rake tasks for the php application
13
+ #
14
+ # @param application [String] The name of the application
15
+ # @param container_path [String] The path to the application inside of the container
16
+ # @param local_path [String] The path to the application on your local system
17
+ # @param start_container_dependencies_on_test [Boolean] Whether or not to start up container dependencies when running tests
18
+ # @param test_isolation [Boolean] Whether or not to start tests in an isolated project and clean up after tests are run
19
+ # @param coverage [Dev::Coverage::Base] The coverage class which is an instance of Base to be used to evaluate coverage
20
+ def initialize(
21
+ application,
22
+ container_path: nil,
23
+ local_path: nil,
24
+ start_container_dependencies_on_test: false,
25
+ test_isolation: false,
26
+ coverage: nil,
27
+ exclude: []
28
+ )
29
+ @php = Dev::Php.new(container_path:, local_path:, coverage:)
30
+ @start_container_dependencies_on_test = start_container_dependencies_on_test
31
+ @test_isolation = test_isolation
19
32
 
20
33
  super(application, exclude:)
21
34
  end
@@ -79,7 +92,8 @@ module Dev
79
92
  end
80
93
 
81
94
  namespace :php do
82
- desc "Run the php linting software against the #{application}'s codebase"
95
+ desc "Run the php linting software against the #{application}'s codebase" \
96
+ "\n\t(optional) use OPTS=... to pass additional options to the command"
83
97
  task lint: %w(init_docker up_no_deps) do
84
98
  LOG.debug("Check for php linting errors in the #{application} codebase")
85
99
 
@@ -107,8 +121,9 @@ module Dev
107
121
  def create_test_task!
108
122
  application = @name
109
123
  php = @php
110
- siloed_tests = @siloed_tests
111
124
  exclude = @exclude
125
+ test_isolation = @test_isolation
126
+ up_cmd = @start_container_dependencies_on_test ? :up : :up_no_deps
112
127
  return if exclude.include?(:test)
113
128
 
114
129
  DEV_COMMANDS_TOP_LEVEL.instance_eval do
@@ -118,18 +133,28 @@ module Dev
118
133
  # This is just a placeholder to execute the dependencies
119
134
  end
120
135
 
136
+ task test_init_docker: %w(init_docker) do
137
+ Dev::Docker::Compose.configure do |c|
138
+ c.project_name = SecureRandom.hex if test_isolation
139
+ end
140
+ end
141
+
121
142
  namespace :php do
122
- desc "Run all php tests against the #{application}'s codebase"
123
- task test: %w(init_docker up) do
143
+ desc "Run all php tests against the #{application}'s codebase" \
144
+ "\n\t(optional) use OPTS=... to pass additional options to the command"
145
+ task test: %W(test_init_docker #{up_cmd}) do
124
146
  LOG.debug("Running all php tests in the #{application} codebase")
125
147
 
126
- project_name = nil
127
- project_name = SecureRandom.hex if siloed_tests
128
-
129
148
  options = []
130
149
  options << '-T' if Dev::Common.new.running_codebuild?
131
- Dev::Docker::Compose.new(project_name:, services: application, options:).exec(*php.test_command)
132
- # TODO: Add clean if we are siloed
150
+ Dev::Docker::Compose.new(services: application, options:).exec(*php.test_command)
151
+ php.check_test_coverage(application:)
152
+
153
+ # Clean up resources if we are on an isolated project name
154
+ if test_isolation
155
+ Dev::Docker::Compose.new.down
156
+ Dev::Docker.new.prune_project_volumes(project_name: Dev::Docker::Compose.config.project_name)
157
+ end
133
158
  end
134
159
  end
135
160
  end
@@ -174,7 +199,8 @@ module Dev
174
199
  namespace :php do
175
200
  desc 'Run Composer Audit on the target application' \
176
201
  "\n\tuse MIN_SEVERITY=(info low moderate high critical) to fetch only severity type selected and above (default=high)." \
177
- "\n\tuse IGNORELIST=(comma delimited list of cwe numbers) removes the entry from the list."
202
+ "\n\tuse IGNORELIST=(comma delimited list of cwe numbers) removes the entry from the list." \
203
+ "\n\t(optional) use OPTS=... to pass additional options to the command"
178
204
  task audit: %w(init_docker up_no_deps) do
179
205
  opts = []
180
206
  opts << '-T' if Dev::Common.new.running_codebuild?