xcodebuild-helper 1.0.0 → 1.1.0

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: b3b4c4f399d788c87a4552d3cfb24e8dc0df5bb0
4
- data.tar.gz: 7907489264e4bc9785be226e892b360c8f9e65fa
3
+ metadata.gz: 13352acd9cf8b6adca60991c0633a004871712d0
4
+ data.tar.gz: fe4c7b2fb12e5d4a08cb59f5ac030b7830bef8a1
5
5
  SHA512:
6
- metadata.gz: 38122ba3e34aa153b25bd6736b4abef0d5f1914413e173a600cb8c976a83986b64501075e59d61bebeb9076662de79ad72fa1abc7bc4f892cd9da2ac30b3103a
7
- data.tar.gz: c541b7505510cdc456336532a6252dbc91269f0a6c9b7bcd4d9b2349946eaf6da0661cf63be4f3d8ac226816c7c1335ddfb837aa655a5714422be0d15a81746f
6
+ metadata.gz: 6f2f918fad5a452610f3650f175d1fa6ddbcca541ebdb90050af2067c4edc378cea81b46734e00a03212ffb60767a4e87c1aa49cb6c824983f72eb759df4a2ba
7
+ data.tar.gz: 20efb6da555ff792605a9df1be75b3b84967211b6c6ca7f8cdb4ac256a14bf1754a12ad46bc53c14aec06d9edcc3d469467b2f741625e2c59472636eb6f13ad2
data/Gemfile.lock CHANGED
@@ -1,7 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- xcodebuild-helper (1.0.0)
4
+ xcodebuild-helper (1.1.0)
5
+ nokogiri (~> 1.6)
5
6
  xcodeproj (~> 0.28)
6
7
  xcpretty (~> 0.2)
7
8
 
@@ -48,8 +49,11 @@ GEM
48
49
  rb-inotify (>= 0.9.7)
49
50
  lumberjack (1.0.10)
50
51
  method_source (0.8.2)
52
+ mini_portile2 (2.0.0)
51
53
  minitest (5.8.4)
52
54
  nenv (0.3.0)
55
+ nokogiri (1.6.7.2)
56
+ mini_portile2 (~> 2.0.0.rc2)
53
57
  notiffany (0.0.8)
54
58
  nenv (~> 0.1)
55
59
  shellany (~> 0.0)
data/assets/style.css ADDED
@@ -0,0 +1,102 @@
1
+ body{
2
+ width: 100%;
3
+ font-weight: 16px;
4
+ font-family: 'Helvetica', sans-serif;
5
+ color: rgb(68, 68, 68);
6
+ padding: 0;
7
+ margin: 0;
8
+ }
9
+
10
+ h1{
11
+ margin: 0.5em 1em;
12
+ }
13
+
14
+ .low{
15
+ color: rgb(189, 78, 62);
16
+ }
17
+
18
+ .mid{
19
+ color: rgb(212, 168, 103);
20
+ }
21
+
22
+ .high{
23
+ color: rgb(105, 173, 81);
24
+ }
25
+
26
+ a{
27
+ text-decoration: none;
28
+ color: rgb(56, 56, 56);
29
+ }
30
+
31
+ table{
32
+ border-collapse: collapse;
33
+ background-color: rgb(228, 240, 242);
34
+ width: 100%;
35
+ box-sizing: border-box;
36
+ }
37
+
38
+ table.main{
39
+ width: 100%;
40
+ }
41
+
42
+ .total_coverage{
43
+ font-weight: bold;
44
+ font-size: 2em;
45
+ margin: 0.5em 1em;
46
+ }
47
+
48
+ table.main tr{
49
+ float: left;
50
+ width: 50%;
51
+ }
52
+
53
+ tr:hover{
54
+ background-color: rgba(164, 164, 164, 0.32);
55
+ }
56
+
57
+ td{
58
+ padding: 5px;
59
+ }
60
+
61
+ tr.irrelevant{
62
+ background-color: transparent;
63
+ }
64
+
65
+ tr.covered{
66
+ background-color: rgb(153, 213, 174);
67
+ }
68
+
69
+ tr.covered:hover{
70
+ background-color: rgb(59, 196, 106);
71
+ cursor: pointer;
72
+ }
73
+
74
+ tr.uncovered{
75
+ background-color: rgb(205, 133, 123);
76
+ }
77
+
78
+ tr.uncovered:hover{
79
+ background-color: rgb(199, 76, 59);
80
+ cursor: pointer;
81
+ }
82
+
83
+ td.name, td.coverage, td.num{
84
+ font-weight: bold;
85
+ }
86
+
87
+ td.name{
88
+ width: 100%;
89
+ }
90
+
91
+ table.main td.coverage{
92
+ width: 100%;
93
+ }
94
+
95
+ td.coverage{
96
+ text-align: right;
97
+ }
98
+
99
+ td.num{
100
+ background-color: rgba(136, 136, 136, 0.52);
101
+ width: 3em;
102
+ }
@@ -0,0 +1,141 @@
1
+ require 'nokogiri'
2
+
3
+ module XCodeBuildHelper
4
+ LINE_NUMBER_CLASS = "num"
5
+ COVERAGE_CLASS = "coverage"
6
+ SRC_CLASS = "src"
7
+ LINE_BREAK_DELIMITER = "\n"
8
+ LINE_INFO_DELIMITER = "|"
9
+
10
+ class CoverageHtmlConverter
11
+ def self.preprocess_file(lines)
12
+ relevent_lines = 0.0
13
+ covered_lines = 0.0
14
+ lines.each do |line|
15
+ elements = line.split(LINE_INFO_DELIMITER).map { |l| l.strip }
16
+ if elements[0] != ""
17
+ relevent_lines += 1.0
18
+ covered_lines += 1.0 if elements[0].to_f > 0.0
19
+ end
20
+ end
21
+
22
+ covered_lines / relevent_lines
23
+ end
24
+
25
+ def self.threshold_class(value)
26
+ if value > 0.85
27
+ "high"
28
+ elsif value > 0.7
29
+ "mid"
30
+ else
31
+ "low"
32
+ end
33
+ end
34
+
35
+ def self.create_index(file_list)
36
+ total_coverage = 0.0
37
+ total = 0
38
+ file_list.each do |file|
39
+ total_coverage += file[:coverage]
40
+ total += 1.0
41
+ end
42
+ average_coverage = total_coverage / total
43
+
44
+ Nokogiri::HTML::Builder.new do |doc|
45
+ doc.html{
46
+ doc.head{
47
+ doc.link(:href => 'style.css', :media => "all", :rel => "stylesheet")
48
+ }
49
+ doc.body{
50
+ doc.h1{
51
+ doc.text "Code Coverage"
52
+ }
53
+
54
+ doc.div(:class => "total_coverage #{threshold_class(average_coverage)}"){
55
+ doc.text (average_coverage * 100).round(2).to_s + '%'
56
+ }
57
+
58
+ doc.table(:class => "main"){
59
+ file_list.each do |file|
60
+ doc.tr(:class => 'file'){
61
+ doc.td(:class => 'name'){
62
+ doc.a(:href => (file[:title] + '.html')){
63
+ doc.text file[:title]
64
+ }
65
+ }
66
+ doc.td(:class => "coverage #{threshold_class(file[:coverage])}"){
67
+ doc.text (file[:coverage] * 100).round(2).to_s + "%"
68
+ }
69
+ }
70
+ end
71
+ }
72
+ }
73
+ }
74
+ end
75
+ end
76
+
77
+ def self.convert_file(input)
78
+ lines = input.split(LINE_BREAK_DELIMITER)
79
+ title = File.basename(lines.first.gsub(/:$/, ''))
80
+ lines = lines[1..-1]
81
+
82
+ total_coverage = preprocess_file(lines)
83
+ coverage_string = (total_coverage * 100).round(2).to_s + "%"
84
+ builder = Nokogiri::HTML::Builder.new do |doc|
85
+ doc.html {
86
+ doc.head {
87
+ doc.link(:href => 'style.css', :media => "all", :rel => "stylesheet")
88
+ }
89
+
90
+ doc.body {
91
+ doc.h1 {
92
+ doc.text title
93
+ }
94
+ doc.div(:class => "total_coverage #{threshold_class(total_coverage)}"){
95
+ doc.text coverage_string
96
+ }
97
+ doc.table {
98
+ lines.each do |line|
99
+ elements = line.split(LINE_INFO_DELIMITER)
100
+ if elements[0].strip == ""
101
+ additional_class = "irrelevant"
102
+ elsif elements[0].to_f > 0.0
103
+ additional_class = "covered"
104
+ else
105
+ additional_class = "uncovered"
106
+ end
107
+ doc.tr(:class => additional_class) {
108
+ doc.td(:class => LINE_NUMBER_CLASS) {
109
+ if elements[1]
110
+ doc.text elements[1].strip
111
+ end
112
+ }
113
+ doc.td(:class => SRC_CLASS) {
114
+ doc.pre {
115
+ doc.code {
116
+ doc.text elements[2]
117
+ }
118
+ }
119
+ }
120
+
121
+
122
+ doc.td(:class => COVERAGE_CLASS) {
123
+ if elements[0] && elements[0].strip != ""
124
+ if elements[0].to_f > 0.0
125
+ doc.text elements[0].strip + "x"
126
+ else
127
+ doc.text "!"
128
+ end
129
+ end
130
+ }
131
+ }
132
+ end
133
+ }
134
+ }
135
+ }
136
+ end
137
+
138
+ {:content => builder, :title => title, :coverage => total_coverage}
139
+ end
140
+ end
141
+ end
data/lib/coverage_plan.rb CHANGED
@@ -15,5 +15,13 @@ module XCodeBuildHelper
15
15
  def get_source_files
16
16
  @source_files
17
17
  end
18
+
19
+ def output(name)
20
+ @output = name
21
+ end
22
+
23
+ def get_output
24
+ @output
25
+ end
18
26
  end
19
27
  end
data/lib/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module XCodeBuildHelper
2
- VERSION = "1.0.0"
2
+ VERSION = "1.1.0"
3
3
  end
@@ -1,5 +1,7 @@
1
1
  require 'xcode'
2
2
  require 'execute'
3
+ require 'coverage_html_converter'
4
+ require 'fileutils'
3
5
 
4
6
  module XCodeBuildHelper
5
7
  @registry = {}
@@ -7,6 +9,10 @@ module XCodeBuildHelper
7
9
  @registry[name]
8
10
  end
9
11
 
12
+ def self.gem_location
13
+ File.expand_path(File.dirname(__dir__))
14
+ end
15
+
10
16
  def self.define(name, &block)
11
17
  xcode = @registry[name]
12
18
  if xcode == nil
@@ -81,7 +87,26 @@ module XCodeBuildHelper
81
87
  xcode = @registry[name]
82
88
  unless xcode == nil
83
89
  coverage_plan = xcode.get_coverage_plan(plan)
84
- result = XCodeBuildHelper::Execute.call("xcrun llvm-cov show -instr-profile \"#{profdata_location(xcode)}\" \"#{app_binary_location(xcode)}\" #{coverage_plan.get_source_files.first}")
90
+ src_files = Dir.glob(coverage_plan.get_source_files.first).map{|file| file.gsub(/ /, "\\ ") }.join(' ')
91
+ result = XCodeBuildHelper::Execute.call("xcrun llvm-cov show -instr-profile \"#{profdata_location(xcode)}\" \"#{app_binary_location(xcode)}\" #{src_files}")
92
+ result = result.gsub(/^warning:.*\n/, '')
93
+ all_results = []
94
+ result.split("\n\n").each do |file|
95
+ converted_result = XCodeBuildHelper::CoverageHtmlConverter.convert_file file
96
+ all_results << converted_result
97
+ if converted_result
98
+ FileUtils::mkdir_p coverage_plan.get_output
99
+ basename = File.basename(converted_result[:title])
100
+ File.write(File.join(coverage_plan.get_output, basename + '.html'), converted_result[:content].to_html)
101
+ end
102
+ end
103
+
104
+ unless all_results.empty?
105
+ index_file = XCodeBuildHelper::CoverageHtmlConverter.create_index all_results
106
+ File.write(File.join(coverage_plan.get_output, 'index.html'), index_file.to_html)
107
+ end
108
+
109
+ FileUtils::cp(File.join(gem_location, 'assets/style.css'), coverage_plan.get_output)
85
110
  end
86
111
  end
87
112
 
@@ -0,0 +1,55 @@
1
+ require 'coverage_html_converter'
2
+ require 'nokogiri'
3
+
4
+ RSpec.describe XCodeBuildHelper::CoverageHtmlConverter do
5
+ context "#convert_file" do
6
+ it "should return a table element" do
7
+ input = "TITLE:\n1 | 12|# some random code\n0 | 13|# other random code"
8
+ output = XCodeBuildHelper::CoverageHtmlConverter.convert_file input
9
+ document = Nokogiri::HTML(output[:content].to_html)
10
+
11
+ expect(output[:title]).to eq "TITLE"
12
+ expect(output[:coverage]).to eq 0.5
13
+ # assert the look of the document
14
+ expect(document.xpath('//html/head/link[@href]').first[:href]).to eq 'style.css'
15
+ expect(document.css('body h1').first.to_html).to eq "<h1>TITLE</h1>"
16
+ expect(document.css('body div.total_coverage').first.to_html).to eq "<div class=\"total_coverage low\">50.0%</div>"
17
+ expect(document.css('body table tr').length).to eq 2
18
+ expect(document.css('body table tr').first.to_html.gsub("\n", "")).to eq "<tr class=\"covered\"><td class=\"num\">12</td><td class=\"src\"><pre><code># some random code</code></pre></td><td class=\"coverage\">1x</td></tr>"
19
+ end
20
+
21
+ it "should handle rows without coverage" do
22
+ input = "TITLE\n | 12|# some random code\n 1| 13|# other random code"
23
+ output = XCodeBuildHelper::CoverageHtmlConverter.convert_file input
24
+ document = Nokogiri::HTML(output[:content].to_html)
25
+
26
+ # assert the look of the document
27
+ expect(output[:coverage]).to eq 1.0
28
+ expect(document.css('body table tr').first.to_html.gsub("\n", "")).to eq "<tr class=\"irrelevant\"><td class=\"num\">12</td><td class=\"src\"><pre><code># some random code</code></pre></td><td class=\"coverage\"></td></tr>"
29
+ end
30
+
31
+ it "should handle rows without coverage" do
32
+ input = "TITLE\n 0| 12|# some random code\n 0| 13|# other random code"
33
+ output = XCodeBuildHelper::CoverageHtmlConverter.convert_file input
34
+ document = Nokogiri::HTML(output[:content].to_html)
35
+
36
+ # assert the look of the document
37
+ expect(output[:coverage]).to eq 0.0
38
+ expect(document.css('body table tr').first.to_html.gsub("\n", "")).to eq "<tr class=\"uncovered\"><td class=\"num\">12</td><td class=\"src\"><pre><code># some random code</code></pre></td><td class=\"coverage\">!</td></tr>"
39
+ end
40
+ end
41
+
42
+ context "#create_index" do
43
+ it "should create a table of all the files" do
44
+ input = [{:content => double(Nokogiri::HTML::Builder), :title => 'FILE_A', :coverage => 1.0}, {:content => double(Nokogiri::HTML::Builder), :title => 'FILE_B', :coverage => 0.5}]
45
+
46
+ output = XCodeBuildHelper::CoverageHtmlConverter.create_index input
47
+ document = Nokogiri::HTML(output.to_html)
48
+ expect(document.xpath('//html/head/link[@href]').first[:href]).to eq 'style.css'
49
+ expect(document.css('body h1').first.to_html).to eq "<h1>Code Coverage</h1>"
50
+ expect(document.css('body div.total_coverage').first.to_html).to eq "<div class=\"total_coverage mid\">75.0%</div>"
51
+ expect(document.css('body table.main tr').length).to eq 2
52
+ expect(document.css('body table.main tr').first.to_html.gsub("\n", "")).to eq "<tr class=\"file\"><td class=\"name\"><a href=\"FILE_A.html\">FILE_A</a></td><td class=\"coverage high\">100.0%</td></tr>"
53
+ end
54
+ end
55
+ end
@@ -14,5 +14,10 @@ RSpec.describe XCodeBuildHelper::CoveragePlan do
14
14
  @coverage_plan.source_files ["path/tofiles/*.m"]
15
15
  expect(@coverage_plan.get_source_files).to eq ["path/tofiles/*.m"]
16
16
  end
17
+
18
+ it "should set the output location" do
19
+ @coverage_plan.output "/path/to/output"
20
+ expect(@coverage_plan.get_output).to eq "/path/to/output"
21
+ end
17
22
  end
18
23
  end
@@ -1,6 +1,11 @@
1
1
  require 'xcodebuild-helper'
2
+ require 'nokogiri'
3
+ require 'fileutils'
2
4
 
3
5
  RSpec.describe "DSL actions" do
6
+ before(:each) do
7
+ allow(XCodeBuildHelper).to receive(:gem_location).and_return('gem/location')
8
+ end
4
9
  context "build" do
5
10
  before(:each) do
6
11
  XCodeBuildHelper.define :default do
@@ -75,8 +80,11 @@ RSpec.describe "DSL actions" do
75
80
  coverage_plan :plan_a do
76
81
  report_type "xml"
77
82
  source_files ["path/to/files/*"]
83
+ output "/build/reports"
78
84
  end
79
85
  end
86
+ allow(FileUtils).to receive(:mkdir_p)
87
+ allow(FileUtils).to receive(:cp)
80
88
  end
81
89
 
82
90
  it "will find the base app directory" do
@@ -99,9 +107,92 @@ RSpec.describe "DSL actions" do
99
107
  it "will return the CLI for finding code coverage" do
100
108
  allow(XCodeBuildHelper).to receive(:app_binary_location).and_return("/path/to/app/bin")
101
109
  allow(XCodeBuildHelper).to receive(:profdata_location).and_return("/path/to/app/prof")
102
- expect(XCodeBuildHelper::Execute).to receive(:call).with("xcrun llvm-cov show -instr-profile \"/path/to/app/prof\" \"/path/to/app/bin\" path/to/files/*")
110
+ allow(Dir).to receive(:glob).with('path/to/files/*').and_return(['path/to/files/file.m', 'path/to/files/supporting files/file.h'])
111
+ expect(XCodeBuildHelper::Execute).to receive(:call).with("xcrun llvm-cov show -instr-profile \"/path/to/app/prof\" \"/path/to/app/bin\" path/to/files/file.m path/to/files/supporting\\ files/file.h").and_return("")
103
112
  XCodeBuildHelper.generate_coverage(:default, :plan_a)
104
113
  end
114
+
115
+ context "converting results to html" do
116
+ it "will parse the results and call convert to html" do
117
+ allow(XCodeBuildHelper::Execute).to receive(:call).and_return("/path/to/file/FILE_A\n0 | 1|# some random code\n\nwarning: something went wrong here\n/path/to/file/FILE_B\n0| 2|#other random code")
118
+
119
+ mockIndex = double(Nokogiri::HTML::Builder)
120
+ allow(mockIndex).to receive(:to_html).and_return("INDEX STUFF")
121
+ allow(XCodeBuildHelper::CoverageHtmlConverter).to receive(:create_index).and_return(mockIndex)
122
+ allow(File).to receive(:write)
123
+
124
+ expect(XCodeBuildHelper::CoverageHtmlConverter).to receive(:convert_file).twice
125
+ XCodeBuildHelper.generate_coverage(:default, :plan_a)
126
+ end
127
+
128
+ it "will save the results to a the file name header" do
129
+ mockHtml = double(Nokogiri::HTML::Builder)
130
+ allow(mockHtml).to receive(:to_html).and_return("HTML STUFF")
131
+ converted_result = { :content => mockHtml, :title => "/path/to/file/FILE_A"}
132
+
133
+ mockIndex = double(Nokogiri::HTML::Builder)
134
+ allow(mockIndex).to receive(:to_html).and_return("INDEX STUFF")
135
+ allow(XCodeBuildHelper::CoverageHtmlConverter).to receive(:create_index).and_return(mockIndex)
136
+ allow(File).to receive(:write)
137
+
138
+ allow(XCodeBuildHelper::Execute).to receive(:call).and_return("warning:something went wrong\nFILE_A:\nHTML STUFF")
139
+ allow(XCodeBuildHelper::CoverageHtmlConverter).to receive(:convert_file).with("FILE_A:\nHTML STUFF").and_return(converted_result)
140
+ expect(File).to receive(:write).with("/build/reports/FILE_A.html", "HTML STUFF")
141
+
142
+ XCodeBuildHelper.generate_coverage(:default, :plan_a)
143
+ end
144
+
145
+ it "needs to create the output directory first" do
146
+ mockHtml = double(Nokogiri::HTML::Builder)
147
+ allow(mockHtml).to receive(:to_html).and_return("HTML STUFF")
148
+ converted_result = { :content => mockHtml, :title => "/path/to/file/FILE_A"}
149
+
150
+ mockIndex = double(Nokogiri::HTML::Builder)
151
+ allow(mockIndex).to receive(:to_html).and_return("INDEX STUFF")
152
+ allow(XCodeBuildHelper::CoverageHtmlConverter).to receive(:create_index).and_return(mockIndex)
153
+
154
+ allow(XCodeBuildHelper::Execute).to receive(:call).and_return("FILE_A:\nHTML STUFF")
155
+ allow(XCodeBuildHelper::CoverageHtmlConverter).to receive(:convert_file).and_return(converted_result)
156
+ expect(FileUtils).to receive(:mkdir_p).with('/build/reports')
157
+ allow(File).to receive(:write)
158
+
159
+ XCodeBuildHelper.generate_coverage(:default, :plan_a)
160
+ end
161
+
162
+ it "will create an index page" do
163
+ mockHtml = double(Nokogiri::HTML::Builder)
164
+ allow(mockHtml).to receive(:to_html).and_return("HTML STUFF")
165
+ converted_result = { :content => mockHtml, :title => "/path/to/file/FILE_A"}
166
+
167
+ mockIndex = double(Nokogiri::HTML::Builder)
168
+ allow(mockIndex).to receive(:to_html).and_return("INDEX STUFF")
169
+ allow(XCodeBuildHelper::CoverageHtmlConverter).to receive(:create_index).and_return(mockIndex)
170
+
171
+ allow(XCodeBuildHelper::Execute).to receive(:call).and_return("FILE_A:\nHTML STUFF")
172
+ allow(XCodeBuildHelper::CoverageHtmlConverter).to receive(:convert_file).and_return(converted_result)
173
+ allow(File).to receive(:write).with("/build/reports/FILE_A.html", "HTML STUFF")
174
+ expect(File).to receive(:write).with("/build/reports/index.html", "INDEX STUFF")
175
+
176
+ XCodeBuildHelper.generate_coverage(:default, :plan_a)
177
+ end
178
+
179
+ it "should copy the assets" do
180
+ mockHtml = double(Nokogiri::HTML::Builder)
181
+ allow(mockHtml).to receive(:to_html).and_return("HTML STUFF")
182
+ converted_result = { :content => mockHtml, :title => "/path/to/file/FILE_A"}
183
+
184
+ mockIndex = double(Nokogiri::HTML::Builder)
185
+ allow(mockIndex).to receive(:to_html).and_return("INDEX STUFF")
186
+ allow(XCodeBuildHelper::CoverageHtmlConverter).to receive(:create_index).and_return(mockIndex)
187
+
188
+ allow(XCodeBuildHelper::Execute).to receive(:call).and_return("FILE_A:\nHTML STUFF")
189
+ allow(XCodeBuildHelper::CoverageHtmlConverter).to receive(:convert_file).and_return(converted_result)
190
+ allow(File).to receive(:write)
191
+ expect(FileUtils).to receive(:cp).with('gem/location/assets/style.css', '/build/reports')
192
+
193
+ XCodeBuildHelper.generate_coverage(:default, :plan_a)
194
+ end
195
+ end
105
196
  end
106
197
 
107
198
  context "lint" do
data/spec/xcode_spec.rb CHANGED
@@ -56,12 +56,18 @@ RSpec.describe XCodeBuildHelper::XCode do
56
56
  before(:each) do
57
57
  @coverage_plan = XCodeBuildHelper::CoveragePlan.new
58
58
  @coverage_plan.source_files ["path/to/files/*.m"]
59
+ @coverage_plan.output "/path/to/output"
59
60
  end
60
61
 
61
62
  it "should set the source files" do
62
63
  @xcode.coverage_plan(:plan_a, @coverage_plan)
63
64
  expect(@xcode.get_coverage_plan(:plan_a).get_source_files).to eq ["path/to/files/*.m"]
64
65
  end
66
+
67
+ it "should get the output directory" do
68
+ @xcode.coverage_plan(:plan_a, @coverage_plan)
69
+ expect(@xcode.get_coverage_plan(:plan_a).get_output).to eq "/path/to/output"
70
+ end
65
71
  end
66
72
 
67
73
 
@@ -23,4 +23,5 @@ Gem::Specification.new do |s|
23
23
 
24
24
  s.add_dependency "xcpretty", ["~> 0.2"]
25
25
  s.add_dependency "xcodeproj", ["~> 0.28"]
26
+ s.add_dependency "nokogiri", ["~> 1.6"]
26
27
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xcodebuild-helper
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joshua Rasmussen
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0.28'
83
+ - !ruby/object:Gem::Dependency
84
+ name: nokogiri
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.6'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.6'
83
97
  description: Very useful when writing scripts to automate xcode development or when
84
98
  creating ci scripts to automate deployment
85
99
  email: xlr8runner@gmail.com
@@ -100,7 +114,7 @@ files:
100
114
  - Guardfile
101
115
  - README.md
102
116
  - Rakefile
103
- - TODO.md
117
+ - assets/style.css
104
118
  - bin/oclint
105
119
  - bin/oclint-0.8
106
120
  - bin/oclint-json-compilation-database
@@ -272,6 +286,7 @@ files:
272
286
  - externals/oclint/lib/oclint/rules/libUnusedLocalVariableRule.dylib
273
287
  - externals/oclint/lib/oclint/rules/libUnusedMethodParameterRule.dylib
274
288
  - externals/oclint/lib/oclint/rules/libUselessParenthesesRule.dylib
289
+ - lib/coverage_html_converter.rb
275
290
  - lib/coverage_plan.rb
276
291
  - lib/device.rb
277
292
  - lib/execute.rb
@@ -281,6 +296,7 @@ files:
281
296
  - lib/version.rb
282
297
  - lib/xcode.rb
283
298
  - lib/xcodebuild-helper.rb
299
+ - spec/coverage_html_coverter_spec.rb
284
300
  - spec/coverage_plan_spec.rb
285
301
  - spec/device_spec.rb
286
302
  - spec/lint_plan_spec.rb
@@ -316,6 +332,7 @@ signing_key:
316
332
  specification_version: 4
317
333
  summary: DSL to help call xcode CLI more easliy
318
334
  test_files:
335
+ - spec/coverage_html_coverter_spec.rb
319
336
  - spec/coverage_plan_spec.rb
320
337
  - spec/device_spec.rb
321
338
  - spec/lint_plan_spec.rb
data/TODO.md DELETED
@@ -1,3 +0,0 @@
1
- ### Things that need to get done ###
2
- * Configure the XCode DSL
3
- * Create a code coverage parser that creates XML