slather 0.0.232 → 0.0.233
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 +4 -4
- data/bin/slather +43 -8
- data/lib/slather/coverage_file.rb +1 -1
- data/lib/slather/coverage_service/coveralls.rb +27 -0
- data/lib/slather/coverage_service/simple_output.rb +31 -0
- data/lib/slather/project.rb +49 -24
- data/lib/slather/version.rb +1 -1
- data/lib/slather.rb +2 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0dde61485c0ba365e1030ab355fceb8a83f54822
|
4
|
+
data.tar.gz: 5f52fc6736730b6c04d0fec21284d2972fa098a8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 68313dc2637e7b9e59cabd5961a092bd6546ae958624877311eaf1823b86fb2d4bcab0ab71728c0b31c304c57c572907b53ae8eab0eeadabec4ec55853ec50df
|
7
|
+
data.tar.gz: 8551d85897124c58a9895a8a0448a4fd2152af1c90f118263e92da4f8ecbd8fcb8e80644fb9cf21e8b6ee672430d6a5338b26a8defc5f89d7e96860e725c3eac
|
data/bin/slather
CHANGED
@@ -1,19 +1,54 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
require 'clamp'
|
4
|
+
require 'yaml'
|
4
5
|
require File.join(File.dirname(__FILE__), '..', 'lib', 'slather')
|
5
6
|
|
6
7
|
Clamp do
|
7
8
|
|
8
|
-
|
9
|
-
|
9
|
+
self.default_subcommand = "coverage"
|
10
|
+
|
11
|
+
subcommand "coverage", "Computes coverage for the supplised project" do
|
12
|
+
|
13
|
+
option "--project, -p", "PROJECT", "Path to the xcodeproj", :attribute_name => :xcodeproj_path
|
14
|
+
|
15
|
+
option ["--coveralls", "-c"], :flag, "Post coverage results to coveralls"
|
16
|
+
option ["--simple-output", "-s"], :flag, "Post coverage results to coveralls"
|
17
|
+
|
18
|
+
option ["--build-directory", "-b"], "BUILD_DIRECTORY", "The directory where gcno files will be written to. Defaults to derived data."
|
19
|
+
option ["--ignore", "-i"], "IGNORE", "ignore files conforming to a path", :multivalued => true
|
20
|
+
|
21
|
+
def execute
|
22
|
+
puts "Slathering..."
|
23
|
+
|
24
|
+
xcodeproj_path_to_open = xcodeproj_path || Slather::Project.yml_file["xcodeproj"]
|
25
|
+
|
26
|
+
project = Slather::Project.open(xcodeproj_path_to_open)
|
27
|
+
|
28
|
+
if coveralls?
|
29
|
+
project.extend(Slather::CoverageService::Coveralls)
|
30
|
+
elsif simple_output?
|
31
|
+
project.extend(Slather::CoverageService::SimpleOutput)
|
32
|
+
end
|
33
|
+
|
34
|
+
project.ignore_list = ignore_list if !ignore_list.empty?
|
35
|
+
project.build_directory = build_directory if build_directory
|
36
|
+
project.post
|
37
|
+
|
38
|
+
puts "Done slathering!"
|
39
|
+
end
|
10
40
|
|
11
|
-
def execute
|
12
|
-
puts "Slathering..."
|
13
|
-
project = Slather::Project.open(xcodeproj_path)
|
14
|
-
project.build_directory = build_directory
|
15
|
-
project.post_to_coveralls
|
16
|
-
puts "Done slathering!"
|
17
41
|
end
|
18
42
|
|
43
|
+
subcommand "setup", "Configures an xcodeproj for test coverage generation" do
|
44
|
+
|
45
|
+
parameter "[xcodeproj]", "Path to the xcodeproj", :attribute_name => :xcodeproj_path
|
46
|
+
|
47
|
+
def execute
|
48
|
+
project = Slather::Project.open(xcodeproj_path)
|
49
|
+
project.setup_for_coverage
|
50
|
+
project.save
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
19
54
|
end
|
@@ -11,7 +11,7 @@ module Slather
|
|
11
11
|
@source_file_pathname ||= begin
|
12
12
|
base_filename = gcno_file_pathname.basename.sub_ext("")
|
13
13
|
# TODO: Handle Swift
|
14
|
-
path = Dir["#{project.main_group.real_path}
|
14
|
+
path = Dir["#{project.main_group.real_path}/**/#{base_filename}.m"].first
|
15
15
|
path && Pathname(path)
|
16
16
|
end
|
17
17
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Slather
|
2
|
+
module CoverageService
|
3
|
+
module Coveralls
|
4
|
+
|
5
|
+
def coverage_file_class
|
6
|
+
Slather::CoverallsCoverageFile
|
7
|
+
end
|
8
|
+
|
9
|
+
def coveralls_coverage_data
|
10
|
+
{
|
11
|
+
:service_job_id => ENV['TRAVIS_JOB_ID'],
|
12
|
+
:service_name => "travis-ci",
|
13
|
+
:source_files => coverage_files.map(&:as_json)
|
14
|
+
}.to_json
|
15
|
+
end
|
16
|
+
private :coveralls_coverage_data
|
17
|
+
|
18
|
+
def post
|
19
|
+
f = File.open('coveralls_json_file', 'w+')
|
20
|
+
f.write(coveralls_coverage_data)
|
21
|
+
`curl -s --form json_file=@#{f.path} https://coveralls.io/api/v1/jobs`
|
22
|
+
FileUtils.rm(f)
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Slather
|
2
|
+
module CoverageService
|
3
|
+
module SimpleOutput
|
4
|
+
|
5
|
+
def coverage_file_class
|
6
|
+
Slather::CoverallsCoverageFile
|
7
|
+
end
|
8
|
+
|
9
|
+
def post
|
10
|
+
total_project_lines = 0
|
11
|
+
total_project_lines_tested = 0
|
12
|
+
coverage_files.each do |coverage_file|
|
13
|
+
# ignore lines that don't count towards coverage (comments, whitespace, etc). These are nil in the array.
|
14
|
+
coverage_data = coverage_file.coverage_data.compact
|
15
|
+
|
16
|
+
lines_tested = coverage_data.select { |cd| cd > 0 }.count
|
17
|
+
total_lines = coverage_data.count
|
18
|
+
percentage = '%.2f' % [(lines_tested / total_lines.to_f) * 100.0]
|
19
|
+
|
20
|
+
total_project_lines_tested += lines_tested
|
21
|
+
total_project_lines += total_lines
|
22
|
+
|
23
|
+
puts "#{coverage_file.source_file_pathname_relative_to_project_root}: #{lines_tested} of #{total_lines} lines (#{percentage}%)"
|
24
|
+
end
|
25
|
+
total_percentage = '%.2f' % [(total_project_lines_tested / total_project_lines.to_f) * 100.0]
|
26
|
+
puts "Test Coverage: #{total_percentage}%"
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/lib/slather/project.rb
CHANGED
@@ -1,11 +1,18 @@
|
|
1
1
|
require 'fileutils'
|
2
2
|
require 'xcodeproj'
|
3
3
|
require 'json'
|
4
|
+
require 'yaml'
|
4
5
|
|
5
6
|
module Slather
|
6
7
|
class Project < Xcodeproj::Project
|
7
8
|
|
8
|
-
attr_accessor :build_directory
|
9
|
+
attr_accessor :build_directory, :ignore_list
|
10
|
+
|
11
|
+
def self.open(xcodeproj)
|
12
|
+
proj = super
|
13
|
+
proj.configure_from_yml
|
14
|
+
proj
|
15
|
+
end
|
9
16
|
|
10
17
|
def derived_data_dir
|
11
18
|
File.expand_path('~') + "/Library/Developer/Xcode/DerivedData/"
|
@@ -18,37 +25,55 @@ module Slather
|
|
18
25
|
private :build_directory
|
19
26
|
|
20
27
|
def coverage_files
|
21
|
-
Dir["#{build_directory}/**/*.gcno"].map do |file|
|
22
|
-
coverage_file =
|
28
|
+
coverage_files = Dir["#{build_directory}/**/*.gcno"].map do |file|
|
29
|
+
coverage_file = coverage_file_class.new(file)
|
23
30
|
coverage_file.project = self
|
24
|
-
# If there's no source file for this gcno,
|
25
|
-
if coverage_file.source_file_pathname
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
else
|
30
|
-
puts "Skipping #{file} -- older than #{stale_seconds_limit} seconds ago."
|
31
|
-
end
|
31
|
+
# If there's no source file for this gcno, it probably belongs to another project.
|
32
|
+
if coverage_file.source_file_pathname && !(coverage_file.source_file_pathname_relative_to_project_root.to_s =~ /^(#{ignore_list.join("|")})$/)
|
33
|
+
coverage_file
|
34
|
+
else
|
35
|
+
nil
|
32
36
|
end
|
33
|
-
next nil
|
34
37
|
end.compact
|
38
|
+
|
39
|
+
if coverage_files.empty?
|
40
|
+
raise StandardError, "No coverage files found. Are you sure your project is setup for generating coverage files? Try `slather setup your/project.pbxproj`"
|
41
|
+
else
|
42
|
+
coverage_files
|
43
|
+
end
|
35
44
|
end
|
36
45
|
private :coverage_files
|
37
46
|
|
38
|
-
def
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
47
|
+
def self.yml_file
|
48
|
+
@yml_file ||= begin
|
49
|
+
yml_filename = '.slather.yml'
|
50
|
+
if File.exist?(yml_filename)
|
51
|
+
YAML.load_file(yml_filename)
|
52
|
+
else
|
53
|
+
{}
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def configure_from_yml
|
59
|
+
self.build_directory = self.class.yml_file["build_directory"] if self.class.yml_file["build_directory"]
|
60
|
+
self.ignore_list = self.class.yml_file["ignore"] || []
|
61
|
+
|
62
|
+
coverage_service = self.class.yml_file["coverage_service"]
|
63
|
+
if coverage_service == "coveralls"
|
64
|
+
extend(Slather::CoverageService::Coveralls)
|
65
|
+
elsif coverage_service == "terminal"
|
66
|
+
extend(Slather::CoverageService::SimpleOutput)
|
67
|
+
elsif !self.class.method_defined?(:post)
|
68
|
+
raise ArgumentError, "value `#{coverage_service}` not valid for key `coverage_service` in #{self.class.yml_file.path}. Try `terminal` or `coveralls`"
|
69
|
+
end
|
44
70
|
end
|
45
|
-
private :coveralls_coverage_data
|
46
71
|
|
47
|
-
def
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
72
|
+
def setup_for_coverage
|
73
|
+
build_configurations.each do |build_configuration|
|
74
|
+
build_configuration.build_settings["GCC_INSTRUMENT_PROGRAM_FLOW_ARCS"] = "YES"
|
75
|
+
build_configuration.build_settings["GCC_GENERATE_TEST_COVERAGE_FILES"] = "YES"
|
76
|
+
end
|
52
77
|
end
|
53
78
|
|
54
79
|
end
|
data/lib/slather/version.rb
CHANGED
data/lib/slather.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: slather
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.233
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mark Larsen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-06-
|
11
|
+
date: 2014-06-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -110,6 +110,8 @@ files:
|
|
110
110
|
- bin/slather
|
111
111
|
- lib/slather.rb
|
112
112
|
- lib/slather/coverage_file.rb
|
113
|
+
- lib/slather/coverage_service/coveralls.rb
|
114
|
+
- lib/slather/coverage_service/simple_output.rb
|
113
115
|
- lib/slather/coveralls_coverage_file.rb
|
114
116
|
- lib/slather/project.rb
|
115
117
|
- lib/slather/version.rb
|