xcodebuild-helper 1.0.0 → 1.1.0

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
  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