lib/slather/project.rb in slather-0.0.2 vs lib/slather/project.rb in slather-0.0.3
- old
+ new
@@ -1,48 +1,96 @@
require 'fileutils'
require 'xcodeproj'
require 'json'
+require 'yaml'
module Slather
class Project < Xcodeproj::Project
+ attr_accessor :build_directory, :ignore_list, :ci_service, :coverage_service
+
+ def self.open(xcodeproj)
+ proj = super
+ proj.configure_from_yml
+ proj
+ end
+
def derived_data_dir
File.expand_path('~') + "/Library/Developer/Xcode/DerivedData/"
end
private :derived_data_dir
+ def build_directory
+ @build_directory || derived_data_dir
+ end
+
def coverage_files
- Dir["#{derived_data_dir}/**/*.gcno"].map do |file|
- coverage_file = Slather::CoverallsCoverageFile.new(file)
- coverage_file.project = self
- # If there's no source file for this gcno, or the gcno is old, it probably belongs to another project.
- if coverage_file.source_file_pathname
- stale_seconds_limit = 60
- if (Time.now - File.mtime(file) < stale_seconds_limit)
- next coverage_file
- else
- puts "Skipping #{file} -- older than #{stale_seconds_limit} seconds ago."
- end
- end
- next nil
+ coverage_files = Dir["#{build_directory}/**/*.gcno"].map do |file|
+ coverage_file = coverage_file_class.new(self, file)
+ # If there's no source file for this gcno, it probably belongs to another project.
+ coverage_file.source_file_pathname && !coverage_file.ignored? ? coverage_file : nil
end.compact
+
+ if coverage_files.empty?
+ raise StandardError, "No coverage files found. Are you sure your project is setup for generating coverage files? Try `slather setup your/project.pbxproj`"
+ else
+ coverage_files
+ end
end
private :coverage_files
- def coveralls_coverage_data
- {
- :service_job_id => ENV['TRAVIS_JOB_ID'] || 27647662,
- :service_name => "travis-ci",
- :source_files => coverage_files.map(&:as_json)
- }.to_json
+ def self.yml_filename
+ '.slather.yml'
end
- private :coveralls_coverage_data
- def post_to_coveralls
- f = File.open('coveralls_json_file', 'w+')
- f.write(coveralls_coverage_data)
- `curl -s --form json_file=@#{f.path} https://coveralls.io/api/v1/jobs`
- FileUtils.rm(f)
+ def self.yml
+ @yml ||= File.exist?(yml_filename) ? YAML.load_file(yml_filename) : {}
+ end
+
+ def configure_from_yml
+ configure_build_directory_from_yml
+ configure_ignore_list_from_yml
+ configure_ci_service_from_yml
+ configure_coverage_service_from_yml
+ end
+
+ def configure_build_directory_from_yml
+ self.build_directory = self.class.yml["build_directory"] if self.class.yml["build_directory"] && !@build_directory
+ end
+
+ def configure_ignore_list_from_yml
+ self.ignore_list = [(self.class.yml["ignore"] || [])].flatten unless self.ignore_list
+ end
+
+ def configure_ci_service_from_yml
+ self.ci_service = (self.class.yml["ci_service"] || :travis_ci) unless self.ci_service
+ end
+
+ def ci_service=(service)
+ @ci_service = service && service.to_sym
+ end
+
+ def configure_coverage_service_from_yml
+ self.coverage_service = (self.class.yml["coverage_service"] || :terminal) unless coverage_service
+ end
+
+ def coverage_service=(service)
+ service = service && service.to_sym
+ if service == :coveralls
+ extend(Slather::CoverageService::Coveralls)
+ elsif service == :terminal
+ extend(Slather::CoverageService::SimpleOutput)
+ else
+ raise ArgumentError, "`#{coverage_service}` is not a valid coverage service. Try `terminal` or `coveralls`"
+ end
+ @coverage_service = service
+ end
+
+ def setup_for_coverage
+ build_configurations.each do |build_configuration|
+ build_configuration.build_settings["GCC_INSTRUMENT_PROGRAM_FLOW_ARCS"] = "YES"
+ build_configuration.build_settings["GCC_GENERATE_TEST_COVERAGE_FILES"] = "YES"
+ end
end
end
end
\ No newline at end of file