firespring_dev_commands 2.1.21.pre.alpha.9 → 2.1.22.pre.alpha.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4189e443ce57ccf4e992178ad2dd0de137017a8d78f6d63a4e4f7b55f76fe61b
4
- data.tar.gz: ab87b579efff5fe40edfad306c6088504b176b61f4d0997e8ab8804f65a61177
3
+ metadata.gz: 7846bf81995b28016a6f50953c105e3e6ffd5254f840c5d1932d5809d74ec5db
4
+ data.tar.gz: 398648a97d3b46270bfec9e5d9f954c743bef815f37e8bf2bcae97461e4619aa
5
5
  SHA512:
6
- metadata.gz: 329dc4520ff98700950aef5c5b67920e8f8b520d6f8eba693150526e7144c962b55c31924e0d956b108fe8914777d4d21daf14c20393bb3f61902c19dd92a315
7
- data.tar.gz: 873fcd5623d4e007cd2018285656caa029fdbf9dc34714b64df4223a10cb118b95919bbc428176ee7d68b29da6aea130163881a5480cd0fe2db7a033795af8ae
6
+ metadata.gz: 3feaa407786cb229b54e028f24e3771163ccfd615468a749f830e8a03f79fc0c45178762fff603902df216837ad95a128937e89fff56ffd6238cdd898c0465f1
7
+ data.tar.gz: ce23794f53be4086d5df5edbcaa2ce99ed506ef098b550d8b68a19a81b11b82549b41c60d4a3d42d59de9c13ad610c95e743df612147381dcc67075e474e1804
@@ -138,14 +138,8 @@ module Dev
138
138
  Docker::Compose.new.mapped_public_port(name, private_port)
139
139
  end
140
140
 
141
- # Gets the default working dir of the container
142
- def working_dir(container)
143
- container.json['Config']['WorkingDir']
144
- end
145
-
146
141
  # Copies the source path on your local machine to the destination path on the container
147
142
  def copy_to_container(container, source_path, dest_path)
148
- dest_path = File.join(working_dir(container), dest_path) unless dest_path.start_with?(File::SEPARATOR)
149
143
  LOG.info "Copying #{source_path} to #{dest_path}... "
150
144
 
151
145
  container.archive_in(source_path, dest_path, overwrite: true)
@@ -160,7 +154,6 @@ module Dev
160
154
  # Copies the source path on the container to the destination path on your local machine
161
155
  # If required is set to true, the command will fail if the source path does not exist on the container
162
156
  def copy_from_container(container, source_path, dest_path, required: true)
163
- source_path = File.join(working_dir(container), source_path) unless source_path.start_with?(File::SEPARATOR)
164
157
  LOG.info "Copying #{source_path} to #{dest_path}... "
165
158
 
166
159
  tar = StringIO.new
@@ -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,13 +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
39
  end
42
40
 
43
41
  # The base npm command that is the starting point for all subsequent commands
@@ -95,16 +93,10 @@ module Dev
95
93
  def test_command
96
94
  test = []
97
95
  test << './vendor/bin/phpunit'
98
- test.concat(coverage.php_options) if coverage
99
96
  test.concat(Dev::Common.new.tokenize(ENV['OPTS'].to_s))
100
97
  test
101
98
  end
102
99
 
103
- # Run the check to ensure code coverage meets the desired threshold
104
- def check_test_coverage(application:)
105
- coverage.check(application:)
106
- end
107
-
108
100
  # Build the php fast test command
109
101
  def test_fast_command(processes = 4)
110
102
  test = []
@@ -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`
@@ -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?
@@ -20,12 +20,10 @@ module Dev
20
20
  container_path: nil,
21
21
  local_path: nil,
22
22
  start_container_dependencies_on_test: true,
23
- coverage: nil,
24
23
  exclude: []
25
24
  )
26
- @php = Dev::Php.new(container_path:, local_path:, coverage:)
25
+ @php = Dev::Php.new(container_path:, local_path:)
27
26
  @start_container_dependencies_on_test = start_container_dependencies_on_test
28
-
29
27
  super(application, exclude:)
30
28
  end
31
29
 
@@ -135,7 +133,6 @@ module Dev
135
133
  options = []
136
134
  options << '-T' if Dev::Common.new.running_codebuild?
137
135
  Dev::Docker::Compose.new(services: application, options:).exec(*php.test_command)
138
- php.check_test_coverage(application:)
139
136
  end
140
137
  end
141
138
  end
@@ -6,6 +6,6 @@ module Dev
6
6
  # Use 'v.v.v.pre.alpha.v' for pre-release vesions
7
7
  # Use 'v.v.v.beta.v for beta versions
8
8
  # Use semantic versioning for any releases (https://semver.org/)
9
- VERSION = '2.1.21.pre.alpha.9'.freeze
9
+ VERSION = '2.1.22.pre.alpha.1'.freeze
10
10
  end
11
11
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: firespring_dev_commands
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.21.pre.alpha.9
4
+ version: 2.1.22.pre.alpha.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Firespring
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-01-02 00:00:00.000000000 Z
11
+ date: 2024-01-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -333,9 +333,6 @@ files:
333
333
  - lib/firespring_dev_commands/bloom_growth/user.rb
334
334
  - lib/firespring_dev_commands/boolean.rb
335
335
  - lib/firespring_dev_commands/common.rb
336
- - lib/firespring_dev_commands/coverage/base.rb
337
- - lib/firespring_dev_commands/coverage/cobertura.rb
338
- - lib/firespring_dev_commands/coverage/none.rb
339
336
  - lib/firespring_dev_commands/daterange.rb
340
337
  - lib/firespring_dev_commands/docker.rb
341
338
  - lib/firespring_dev_commands/docker/compose.rb
@@ -1,13 +0,0 @@
1
- module Dev
2
- module Coverage
3
- class Base
4
- def php_options
5
- raise 'not implemented'
6
- end
7
-
8
- def check(*)
9
- raise 'not implemented'
10
- end
11
- end
12
- end
13
- end
@@ -1,86 +0,0 @@
1
- module Dev
2
- # Module containing different classes for interfacing with coverage files
3
- module Coverage
4
- # Class for checking code coverage using cobertura
5
- class Cobertura < Base
6
- attr_reader :local_filename, :container_filename, :filename, :threshold, :exclude
7
-
8
- def initialize(filename: File.join('coverage', 'cobertura.xml'), threshold: nil, container_path: nil, local_path: nil, exclude: nil)
9
- super()
10
-
11
- @filename = filename
12
- @local_filename = File.join(local_path || '.', @filename)
13
- @container_filename = File.join(container_path || '.', @filename)
14
- @threshold = threshold
15
- @exclude = (exclude || []).map do |it|
16
- next it if it.is_a?(Regex)
17
-
18
- Regex.new(it)
19
- end
20
- end
21
-
22
- # Remove any previous versions of the local file that will be output
23
- # return the phpunit options needed to regenerate the cobertura xml file
24
- def php_options
25
- # Remove any previous coverage info
26
- FileUtils.rm_f(local_filename, verbose: true)
27
-
28
- # Return the needed php commands to generate the cobertura report
29
- %W(--coverage-cobertura #{container_filename})
30
- end
31
-
32
- # Parse the cobertura file and check the lines missed against the desired threshold
33
- def check(application: nil)
34
- # If an application has been specified and the file does not exist locally, attempt to copy it back from the docker container
35
- if application && !File.exist?(local_filename)
36
- container = Dev::Docker::Compose.new.container_by_name(application)
37
- Dev::Docker.new.copy_from_container(container, container_filename, local_filename, required: true)
38
- end
39
-
40
- report = Ox.load(File.read(local_filename))
41
- total_missed = report.coverage.locate('packages/package').sum { |package| parse_package_missed(package) }
42
- puts "Lines missing coverage was #{total_missed}"
43
- puts "Configured threshold was #{threshold}" if threshold
44
- raise 'Code coverage not met' if threshold && total_missed > threshold
45
- end
46
-
47
- # Go through the package and add up all of the lines that were missed
48
- # Ignore if the file was in the exlude list
49
- private def parse_package_missed(package)
50
- filename = package.attributes[:name]
51
- return if exclude.any? { |it| it.match(filename) }
52
-
53
- missed = 0
54
- lines_processed = Set.new
55
- package.locate('classes/class/lines/line').each do |line|
56
- # Don't count lines multiple times
57
- line_number = line.attributes[:number]
58
- next if lines_processed.include?(line_number)
59
-
60
- lines_processed << line_number
61
- missed += 1 unless line.attributes[:hits].to_i.positive?
62
- end
63
- total = lines_processed.length
64
-
65
- sanity_check_coverage_against_cobertura_values(package, missed, total)
66
- missed
67
- end
68
-
69
- # Calculate the coverage percent based off the numbers we got and compare to the
70
- # value cobertura reported. This is meant as a sanity check that we are reading the data correctly
71
- # TODO: This should be removed after the above logic has been vetted
72
- private def sanity_check_coverage_against_cobertura_values(package, missed, total)
73
- line_rate = package.attributes[:'line-rate']
74
- cobertura_reported_coverage = line_rate.to_f
75
- cobertura_reported_precision = line_rate.split('.').last.length
76
-
77
- file_coverage = 0.0
78
- file_coverage = ((total - missed).to_f / total).round(cobertura_reported_precision) if total.positive?
79
- return if file_coverage == cobertura_reported_coverage
80
-
81
- filename = package.attributes[:name]
82
- puts "WARNINNG: #{filename} coverage (#{file_coverage}) differed from what cobertura reported (#{cobertura_reported_coverage})"
83
- end
84
- end
85
- end
86
- end
@@ -1,17 +0,0 @@
1
- module Dev
2
- module Coverage
3
- class None < Base
4
- def initialize(*)
5
- super()
6
- end
7
-
8
- def php_options
9
- []
10
- end
11
-
12
- def check(*)
13
- puts 'Coverage not configured'
14
- end
15
- end
16
- end
17
- end