xcjobs 0.0.5 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 74786dbd12794c4e84b2ed2b4e124a4c7962f1fd
4
- data.tar.gz: e85e77554cbf70d0ac3c91240970ce79d1828ca1
3
+ metadata.gz: fa2ca15377b59c6a3fe73d1aad2f4ef14511e3e8
4
+ data.tar.gz: 9cd9a4f8dd1a8f2ab9888d76fe5753baad89af5c
5
5
  SHA512:
6
- metadata.gz: 30d2392f658fd61db0b58815da14d0630b0db9f759f544d587500a4fa1a5f70672dbc82927cd3f65648ea300fa276dbb37582fa1f004a7e8e2f54b165778bc66
7
- data.tar.gz: 55fa6b6c013c8f6a7abfd9544de2e5a4cd219ac8d4255d04bf42e056aeb0764bd569fb98de48056f085e8cf5a7951f9ba0785e1b909aed5838a1375b622afc5b
6
+ metadata.gz: e207db9d73f1d33d3c88cf3e0731cdb099c2cf4ea0d2f2d74c2e1d7d102e4211949b4c1725b51ed38890b2fe3a6e7be43219f875b5a61005358fe75f72e74e87
7
+ data.tar.gz: afe3af894b8d54827ba0f0c863cf76fc59c5d5ba179a3a9d36d6da2523655ddba61e6b92dea00e0283439d6312a71aa64a03cf99e3a5c2c2c14c2169b824882a
@@ -0,0 +1,167 @@
1
+ require 'rake/tasklib'
2
+ require 'json'
3
+ require 'pathname'
4
+ require 'tempfile'
5
+ require 'open3'
6
+
7
+ module XCJobs
8
+ module Coverage
9
+
10
+ def self.run_gcov(configuration_temp_dir)
11
+ Dir.glob("#{configuration_temp_dir}/**/*.gcda").each do |file|
12
+ system %[(cd "#{File.dirname(file)}" && gcov -l "#{file}")]
13
+ end
14
+ end
15
+
16
+ class Coveralls < Rake::TaskLib
17
+ include Rake::DSL if defined?(Rake::DSL)
18
+
19
+ attr_accessor :repo_token
20
+ attr_accessor :service_name
21
+ attr_accessor :service_job_id
22
+
23
+ def initialize()
24
+ @service_name = 'travis-ci'
25
+ @service_job_id = ENV['TRAVIS_JOB_ID']
26
+
27
+ @extensions = []
28
+ @excludes = []
29
+ @exclude_patterns = []
30
+
31
+ yield self if block_given?
32
+ define
33
+ end
34
+
35
+ def add_extension(extension)
36
+ @extensions << extension
37
+ end
38
+
39
+ def add_exclude(exclude)
40
+ @excludes << exclude
41
+ end
42
+
43
+ def add_exclude_pattern(exclude_pattern)
44
+ if !exclude_pattern.kind_of?(Regexp)
45
+ exclude_pattern = Regexp.new(exclude_pattern)
46
+ end
47
+ @exclude_patterns << exclude_pattern
48
+ end
49
+
50
+ private
51
+
52
+ def define
53
+ namespace :coverage do
54
+ desc 'send coverage report to Coveralls'
55
+ task :coveralls do
56
+ root = %x[git rev-parse --show-toplevel].strip
57
+ report = collect(root)
58
+ file = write_report(report)
59
+ upload(file)
60
+ end
61
+ end
62
+ end
63
+
64
+ def collect(base_dir)
65
+ report = {}
66
+ report['repo_token'] = repo_token if repo_token
67
+ report['service_name'] = service_name if service_name
68
+ report['service_job_id'] = service_job_id if service_job_id
69
+ report['source_files'] = []
70
+
71
+ Dir.glob("#{base_dir}/**/*.gcov").each do |file|
72
+ File.open(file, "r") do |handle|
73
+ source_file = {}
74
+ name = ''
75
+ source = ''
76
+ coverage = []
77
+
78
+ handle.each_line do |line|
79
+ match = /^[ ]*([0-9]+|-|#####):[ ]*([0-9]+):(.*)/.match(line)
80
+ next unless match.to_a.count == 4
81
+ count, number, text = match.to_a[1..3]
82
+
83
+ if number.to_i == 0
84
+ key, val = /([^:]+):(.*)$/.match(text).to_a[1..2]
85
+ if key == 'Source'
86
+ name = Pathname(val).relative_path_from(Pathname(base_dir)).to_s
87
+ end
88
+ else
89
+ source << text + '\n'
90
+ coverage[number.to_i - 1] = case count.strip
91
+ when "-"
92
+ nil
93
+ when "#####"
94
+ if text.strip == '}'
95
+ nil
96
+ else
97
+ 0
98
+ end
99
+ else count.to_i
100
+ end
101
+ end
102
+ end
103
+
104
+ if !is_excluded_path(name)
105
+ source_file['name'] = name
106
+ source_file['source'] = source
107
+ source_file['coverage'] = coverage
108
+
109
+ report['source_files'] << source_file
110
+ end
111
+ end
112
+ end
113
+
114
+ report
115
+ end
116
+
117
+ def is_excluded_path(filepath)
118
+ if filepath.start_with?('..')
119
+ return true
120
+ end
121
+ @excludes.each do |exclude|
122
+ if filepath.start_with?(exclude)
123
+ return true
124
+ end
125
+ end
126
+ @exclude_patterns.each do |pattern|
127
+ if filepath.match(pattern)
128
+ return true
129
+ end
130
+ end
131
+ if !@extensions.empty?
132
+ @extensions.each do |extension|
133
+ if File.extname(filepath) == extension
134
+ return false
135
+ end
136
+ end
137
+ return true
138
+ else
139
+ return false
140
+ end
141
+ end
142
+
143
+ def write_report(report)
144
+ temp = Tempfile.new('report')
145
+ temp.puts(report.to_json)
146
+ temp.path
147
+ end
148
+
149
+ def upload(json_file)
150
+ curl_options = ['curl', '-sSf', '-F', "json_file=@#{json_file}", 'https://coveralls.io/api/v1/jobs']
151
+ puts curl_options.join(' ')
152
+ Open3.popen2e(*curl_options) do |stdin, stdout_err, wait_thr|
153
+ output = ''
154
+ while line = stdout_err.gets
155
+ puts line
156
+ output << line
157
+ end
158
+
159
+ status = wait_thr.value
160
+ if !status.success?
161
+ fail "upload failed (exited with status: #{status.exitstatus})"
162
+ end
163
+ end
164
+ end
165
+ end
166
+ end
167
+ end
@@ -1,4 +1,5 @@
1
1
  require 'rake/tasklib'
2
+ require 'open3'
2
3
 
3
4
  module XCJobs
4
5
  module Distribute
@@ -1,3 +1,3 @@
1
1
  module XCJobs
2
- VERSION = "0.0.5"
2
+ VERSION = "0.0.6"
3
3
  end
@@ -17,6 +17,7 @@ module XCJobs
17
17
  attr_accessor :signing_identity
18
18
  attr_accessor :provisioning_profile
19
19
  attr_accessor :build_dir
20
+ attr_accessor :coverage
20
21
  attr_accessor :formatter
21
22
 
22
23
  attr_reader :destinations
@@ -41,6 +42,21 @@ module XCJobs
41
42
  end
42
43
  end
43
44
 
45
+ def coverage=(coverage)
46
+ @coverage = coverage
47
+ if coverage
48
+ add_build_setting('GCC_INSTRUMENT_PROGRAM_FLOW_ARCS', 'YES')
49
+ add_build_setting('GCC_GENERATE_TEST_COVERAGE_FILES', 'YES')
50
+ else
51
+ @build_settings.delete('GCC_INSTRUMENT_PROGRAM_FLOW_ARCS')
52
+ @build_settings.delete('GCC_GENERATE_TEST_COVERAGE_FILES')
53
+ end
54
+ end
55
+
56
+ def coverage_enabled
57
+ @coverage
58
+ end
59
+
44
60
  def before_action(&block)
45
61
  @before_action = block
46
62
  end
@@ -67,6 +83,11 @@ module XCJobs
67
83
  def run(cmd)
68
84
  @before_action.call if @before_action
69
85
 
86
+ if coverage_enabled
87
+ out, status = Open3.capture2(*(cmd + ['-showBuildSettings']))
88
+ configuration_temp_dir = out.lines.grep(/\bCONFIGURATION_TEMP_DIR\b/).first.split('=').last.strip
89
+ end
90
+
70
91
  if @formatter
71
92
  puts (cmd + ['|', @formatter]).join(" ")
72
93
  else
@@ -83,6 +104,10 @@ module XCJobs
83
104
 
84
105
  status = wait_thrs.first.value
85
106
  if status.success?
107
+ if coverage_enabled
108
+ XCJobs::Coverage.run_gcov(configuration_temp_dir)
109
+ end
110
+
86
111
  @after_action.call(output, status) if @after_action
87
112
  else
88
113
  fail "xcodebuild failed (exited with status: #{status.exitstatus})"
@@ -98,6 +123,10 @@ module XCJobs
98
123
 
99
124
  status = wait_thr.value
100
125
  if status.success?
126
+ if coverage_enabled
127
+ XCJobs::Coverage.run_gcov(configuration_temp_dir)
128
+ end
129
+
101
130
  @after_action.call(output, status) if @after_action
102
131
  else
103
132
  fail "xcodebuild failed (exited with status: #{status.exitstatus})"
data/lib/xcjobs.rb CHANGED
@@ -3,3 +3,4 @@ require "xcjobs/xcodebuild"
3
3
  require "xcjobs/certificate"
4
4
  require "xcjobs/distribute"
5
5
  require "xcjobs/info_plist"
6
+ require "xcjobs/coverage"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xcjobs
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - kishikawa katsumi
@@ -82,6 +82,7 @@ files:
82
82
  - Rakefile
83
83
  - lib/xcjobs.rb
84
84
  - lib/xcjobs/certificate.rb
85
+ - lib/xcjobs/coverage.rb
85
86
  - lib/xcjobs/distribute.rb
86
87
  - lib/xcjobs/helper.rb
87
88
  - lib/xcjobs/info_plist.rb