xccoveralls 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 606f261288aa70308e1e1d13e26e59a0482de3188131aa7b510f3d39d1b49c4e
4
+ data.tar.gz: 2d31330cbfea3eba83010fa3ebdb45184c3c2c0db7eeb2b62be08bc85e59f7f0
5
+ SHA512:
6
+ metadata.gz: '068e529f033c304d7a9bb32c6112e045d24f6b19ac9bf716ae1e0e11a3b3a9ebda8857f330404ba28f65cce19ee1c2ec4162d8f1fe967ef8e97496281b5840db'
7
+ data.tar.gz: 8702ba1a73421a4c15ca6df01ae43a70701d1ae07564e4a5287758b0e9db168d342a6528bbd2e4e374b9fd5880bf3df4ad2c3f7f6aeaaab2aab53e0b189b6a9a
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2018 Atsushi NAGASE
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,38 @@
1
+ # `$ xccoveralls`
2
+
3
+ [![Gem Version](https://badge.fury.io/rb/xccoveralls.png)][gem]
4
+ [![CircleCI](https://circleci.com/gh/ngs/xccoveralls.svg?style=svg)](https://circleci.com/gh/ngs/xccoveralls)
5
+ [![Coverage Status](https://coveralls.io/repos/github/ngs/xccoveralls/badge.svg)](https://coveralls.io/github/ngs/xccoveralls)
6
+
7
+ Command line tool for sending Xcode 9.3+ coverage information to [Coveralls]
8
+
9
+ ## Installation
10
+
11
+ ```sh
12
+ $ [sudo] gem install xccoveralls
13
+ ```
14
+
15
+ ## Command
16
+
17
+ ```sh
18
+ $ xccoveralls report
19
+ ```
20
+
21
+ ## Options
22
+
23
+ | Name | Description | Env Name | Default | Required |
24
+ | --------------------------- | --------------------------- | ------------------------------- | --------------------------------------- | :------: |
25
+ | `-s`, `--source_path` | Path to project root | `XCCOVERALLS_SOURCE_PATH` | Top level of Git repository | |
26
+ | `-d`, `--derived_data_path` | Path to DerivedDat | `XCCOVERALLS_DERIVED_DATA_PATH` | `~/Library/Developer/Xcode/DerivedData` | |
27
+ | `-i`, `--ignorefile_path` | Path to Ignorefile | `XCCOVERALLS_IGNOREFILE_PATH` | `(source_path)/.coverallsignore` | |
28
+ | `-T`, `--repo_token` | Coveralls secret repo token | `XCCOVERALLS_REPO_TOKEN` | | * |
29
+
30
+
31
+ ## License
32
+
33
+ Copyright © 2018 [Atsushi Nagase]. MIT Licensed, see [LICENSE] for details.
34
+
35
+ [Coveralls]: https://coveralls.io/
36
+ [gem]: https://rubygems.org/gems/xccoveralls
37
+ [LICENSE]: LICENSE
38
+ [Atsushi Nagase]: https://ngs.io
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+ # vim ft=ruby
3
+ $LOAD_PATH.push File.expand_path('../lib', __dir__)
4
+
5
+ require 'xccoveralls'
6
+ require 'xccoveralls/command'
7
+ Xccoveralls::Command.run!
@@ -0,0 +1,7 @@
1
+ require 'xccoveralls/version'
2
+ require 'xccoveralls/options'
3
+
4
+ module Xccoveralls
5
+ class << self
6
+ end
7
+ end
@@ -0,0 +1,56 @@
1
+ require 'commander'
2
+ require 'fastlane_core'
3
+ require 'xccoveralls/options'
4
+ require 'xccoveralls/runner'
5
+ require 'xccoveralls/version'
6
+
7
+ HighLine.track_eof = false
8
+
9
+ module Xccoveralls
10
+ class Command
11
+ include Commander::Methods
12
+ FastlaneCore::CommanderGenerator.new.generate(Options.available_options)
13
+
14
+ def self.run!
15
+ FastlaneCore::UpdateChecker.start_looking_for_update NAME
16
+ new.run!
17
+ ensure
18
+ FastlaneCore::UpdateChecker.show_update_status NAME, VERSION
19
+ end
20
+
21
+ def initialize # rubocop:disable Metrics/MethodLength
22
+ program :version, VERSION
23
+ program :description, DESCRIPTION
24
+ program :help, 'Author', 'Atsushi Nagase <a@ngs.io>'
25
+ program :help, 'Blog', 'https://ngs.io'
26
+ program :help, 'GitHub', 'https://github.com/ngs/xccoveralls'
27
+ program :help_formatter, :compact
28
+
29
+ global_option('--verbose') do
30
+ FastlaneCore::Globals.verbose = true
31
+ ENV['COVERALLS_DEBUG'] = '1'
32
+ end
33
+
34
+ command(:report) { |command| setup_report(command) }
35
+ default_command :report
36
+ end
37
+
38
+ def setup_report(command)
39
+ command.syntax = NAME
40
+ command.description = 'Send Coverage information to Coveralls'
41
+ command.action { |args, options| run_report!(args, options) }
42
+ FastlaneCore::CommanderGenerator.new.generate(
43
+ Options.available_options,
44
+ command: command
45
+ )
46
+ end
47
+
48
+ def run_report!(_args, options)
49
+ config = FastlaneCore::Configuration.create(
50
+ Options.available_options,
51
+ options.__hash__.reject { |k, _v| k == :verbose }
52
+ )
53
+ Xccoveralls::Runner.new(config.values).run!
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,63 @@
1
+ require 'pathname'
2
+
3
+ ##
4
+ # Ignore things
5
+ # Originally bollowed from https://git.io/fbj4N
6
+ ##
7
+ module Xccoveralls
8
+ class Ignorefile
9
+ attr_reader :statements
10
+ COMMENT_OR_WHITESPACE = /^\s*(?:#.*)?$/
11
+
12
+ def initialize(*args)
13
+ @statements = []
14
+
15
+ args.each do |arg|
16
+ !arg.is_a?(Array) && File.exist?(arg) &&
17
+ (return load_file(arg))
18
+ push(arg)
19
+ end
20
+ end
21
+
22
+ def push(*arg)
23
+ statements.push(*arg.flatten.map(&:strip))
24
+
25
+ self
26
+ end
27
+ alias << push
28
+
29
+ def load_file(file)
30
+ file = Pathname.new(file)
31
+ return unless file.exist?
32
+
33
+ push(file.readlines.map(&:strip).reject do |line|
34
+ line.empty? || line =~ COMMENT_OR_WHITESPACE
35
+ end)
36
+
37
+ self
38
+ end
39
+
40
+ def ignored?(file) # rubocop:disable Metrics/AbcSize
41
+ return true if file.to_s.strip.empty?
42
+
43
+ path = Pathname.new file
44
+
45
+ includes = statements.reject { |statement| statement[0] == '!' }
46
+ .map { |statement| "*#{statement}*" }
47
+
48
+ excludes = statements.select { |statement| statement[0] == '!' }
49
+ .map { |statement| "*#{statement[1..-1]}*" }
50
+
51
+ includes.any? { |statement| path.fnmatch?(statement) } &&
52
+ excludes.all? { |statement| !path.fnmatch?(statement) }
53
+ end
54
+
55
+ def apply(files)
56
+ files.reject { |file| ignored?(file) }
57
+ end
58
+
59
+ def apply!(files)
60
+ files.reject! { |file| ignored?(file) }
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,70 @@
1
+ require 'fastlane_core'
2
+
3
+ module Xccoveralls
4
+ class Options
5
+ def self.available_options # rubocop:disable Metrics/MethodLength, Metrics/LineLength, Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
6
+ root_path = `git rev-parse --show-toplevel`.strip
7
+ [
8
+ FastlaneCore::ConfigItem.new(
9
+ key: :source_path,
10
+ short_option: '-s',
11
+ optional: true,
12
+ env_name: 'XCCOVERALLS_SOURCE_PATH',
13
+ description: 'Path to project root',
14
+ default_value: root_path,
15
+ verify_block: proc do |value|
16
+ v = File.expand_path(value.to_s)
17
+ File.exist?(v) ||
18
+ user_error!("Source path #{v} does not exist")
19
+ File.directory?(v) ||
20
+ user_error!("Source path #{v} is not a directory")
21
+ end
22
+ ),
23
+ FastlaneCore::ConfigItem.new(
24
+ key: :derived_data_path,
25
+ short_option: '-d',
26
+ optional: true,
27
+ env_name: 'XCCOVERALLS_DERIVED_DATA_PATH',
28
+ description: 'Path to DerivedData',
29
+ default_value: "#{ENV.fetch('HOME')}/Library/Developer/Xcode/DerivedData", # rubocop:disable Metrics/LineLength
30
+ verify_block: proc do |value|
31
+ v = File.expand_path(value.to_s)
32
+ File.exist?(v) ||
33
+ user_error!("Source path #{v} does not exist")
34
+ File.directory?(v) ||
35
+ user_error!("Source path #{v} is not a directory")
36
+ end
37
+ ),
38
+ FastlaneCore::ConfigItem.new(
39
+ key: :ignorefile_path,
40
+ short_option: '-i',
41
+ optional: true,
42
+ env_name: 'XCCOVERALLS_IGNOREFILE_PATH',
43
+ description: 'Path to Ignorefile',
44
+ default_value: nil,
45
+ verify_block: proc do |value|
46
+ value.nil? && return
47
+ v = File.expand_path(value.to_s)
48
+ File.exist?(v) ||
49
+ user_error!("Ignorefile does not exist at #{v}")
50
+ File.file?(v) ||
51
+ user_error!("#{v} is not a file")
52
+ end
53
+ ),
54
+ FastlaneCore::ConfigItem.new(
55
+ key: :repo_token,
56
+ short_option: '-T',
57
+ optional: true,
58
+ env_name: 'XCCOVERALLS_REPO_TOKEN',
59
+ description: 'Coveralls secret repo token'
60
+ )
61
+ ]
62
+ end
63
+
64
+ private_class_method
65
+
66
+ def self.user_error!(msg)
67
+ FastlaneCore::UI.user_error!(msg)
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,36 @@
1
+ require 'fastlane_core'
2
+ require 'xccoveralls/xccov'
3
+ require 'coveralls'
4
+
5
+ module Xccoveralls
6
+ class Runner
7
+ attr_reader :repo_token
8
+ attr_reader :xccov
9
+ attr_reader :coveralls_configuration
10
+
11
+ def initialize(
12
+ repo_token: nil, derived_data_path: nil,
13
+ source_path: nil, ignorefile_path: nil
14
+ )
15
+ options = {
16
+ derived_data_path: derived_data_path,
17
+ source_path: source_path, ignorefile_path: ignorefile_path
18
+ }
19
+ @xccov = Xccoveralls::Xccov.new(options)
20
+ @repo_token = repo_token
21
+
22
+ FastlaneCore::PrintTable.print_values(
23
+ config: options,
24
+ title: "Summary for #{Xccoveralls::NAME} #{Xccoveralls::VERSION}"
25
+ )
26
+ end
27
+
28
+ def run!
29
+ org_repo_token = ENV['COVERALLS_REPO_TOKEN']
30
+ ENV['COVERALLS_REPO_TOKEN'] = repo_token || org_repo_token
31
+ @coveralls_configuration = Coveralls::Configuration.configuration
32
+ Coveralls::API.post_json 'jobs', xccov.to_json
33
+ ENV['COVERALLS_REPO_TOKEN'] = org_repo_token
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,7 @@
1
+ module Xccoveralls
2
+ VERSION = '1.0.0'.freeze
3
+ # rubocop:disable Metrics/LineLength
4
+ DESCRIPTION = 'Command line tool for sending Xcode 9.3+ coverage information to Coveralls'.freeze
5
+ # rubocop:enable Metrics/LineLength
6
+ NAME = 'xccoveralls'.freeze
7
+ end
@@ -0,0 +1,106 @@
1
+ require 'fastlane_core'
2
+ require 'xccoveralls/ignorefile'
3
+
4
+ module Xccoveralls
5
+ class Xccov
6
+ attr_reader :source_path
7
+ attr_reader :derived_data_path
8
+ attr_reader :ignorefile_path
9
+
10
+ def initialize(
11
+ derived_data_path: nil,
12
+ source_path: nil,
13
+ ignorefile_path: nil
14
+ )
15
+ @source_path = source_path
16
+ @derived_data_path = derived_data_path
17
+ @ignorefile_path = ignorefile_path || File.join(
18
+ source_path, '.coverallsignore'
19
+ )
20
+ end
21
+
22
+ def test_logs_path
23
+ File.join derived_data_path, 'Logs', 'Test'
24
+ end
25
+
26
+ def archive_path
27
+ return @archive_path if @archive_path
28
+ ext = '.xccovarchive'
29
+ files = Dir[File.join(test_logs_path, "*#{ext}")]
30
+ @archive_path = files.sort_by { |filename| File.mtime(filename) }
31
+ .reverse.first
32
+ @archive_path ||
33
+ user_error!("Could not find any #{ext} in #{derived_data_path}")
34
+ @archive_path
35
+ end
36
+
37
+ def coverage(path)
38
+ file_paths.include?(path) ||
39
+ user_error!("No coverage data for #{path}")
40
+ res = exec(['--file', "'#{path}'"])
41
+ res.split("\n").map do |line|
42
+ line = line.strip.split(/[\s:]/).reject(&:empty?)
43
+ next unless line[0] =~ /^\d+$/
44
+ hits = line[1]
45
+ hits == '*' ? nil : hits.to_i
46
+ end
47
+ end
48
+
49
+ def source_digest(path)
50
+ File.file?(path) ||
51
+ user_error!("File at #{path} does not exist")
52
+ FastlaneCore::CommandExecutor.execute(
53
+ command: %w[git hash-object] + %W["#{path}"],
54
+ print_command: false
55
+ ).strip
56
+ end
57
+
58
+ def name(path)
59
+ path.start_with?(source_path) || (return path)
60
+ Pathname.new(path).relative_path_from(
61
+ Pathname.new(source_path)
62
+ ).to_s
63
+ end
64
+
65
+ # http://docs.coveralls.io/api-introduction#source-files
66
+ def file(path)
67
+ {
68
+ name: name(path),
69
+ source_digest: source_digest(path),
70
+ coverage: coverage(path)
71
+ }
72
+ end
73
+
74
+ def files
75
+ file_paths.map { |path| file(path) }
76
+ end
77
+
78
+ def to_json
79
+ { source_files: files }
80
+ end
81
+
82
+ def file_paths
83
+ return @file_paths if @file_paths
84
+ paths = exec(%w[--file-list]).split("\n")
85
+ if File.file?(ignorefile_path)
86
+ ignore = Ignorefile.new(ignorefile_path)
87
+ ignore.apply!(paths)
88
+ end
89
+ @file_paths = paths
90
+ end
91
+
92
+ def exec(args)
93
+ cmd = %w[xcrun xccov view] + args + %W["#{archive_path}"]
94
+ FastlaneCore::CommandExecutor.execute(
95
+ command: cmd,
96
+ print_command: false
97
+ ).strip
98
+ end
99
+
100
+ private_class_method
101
+
102
+ def user_error!(msg)
103
+ FastlaneCore::UI.user_error!(msg)
104
+ end
105
+ end
106
+ end
metadata ADDED
@@ -0,0 +1,257 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: xccoveralls
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Atsushi Nagase
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-07-07 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: coveralls
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0.8'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0.8'
27
+ - !ruby/object:Gem::Dependency
28
+ name: fastlane
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '2.82'
34
+ - - "<"
35
+ - !ruby/object:Gem::Version
36
+ version: '3.0'
37
+ type: :runtime
38
+ prerelease: false
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: '2.82'
44
+ - - "<"
45
+ - !ruby/object:Gem::Version
46
+ version: '3.0'
47
+ - !ruby/object:Gem::Dependency
48
+ name: bundler
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ - !ruby/object:Gem::Dependency
62
+ name: guard
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: guard-rspec
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ - !ruby/object:Gem::Dependency
90
+ name: guard-rubocop
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ - !ruby/object:Gem::Dependency
104
+ name: rake
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ - !ruby/object:Gem::Dependency
118
+ name: rspec
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ - !ruby/object:Gem::Dependency
132
+ name: rspec-collection_matchers
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: '0'
138
+ type: :development
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
145
+ - !ruby/object:Gem::Dependency
146
+ name: rspec-its
147
+ requirement: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - ">="
150
+ - !ruby/object:Gem::Version
151
+ version: '0'
152
+ type: :development
153
+ prerelease: false
154
+ version_requirements: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - ">="
157
+ - !ruby/object:Gem::Version
158
+ version: '0'
159
+ - !ruby/object:Gem::Dependency
160
+ name: rspec-mocks
161
+ requirement: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - ">="
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ type: :development
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - ">="
171
+ - !ruby/object:Gem::Version
172
+ version: '0'
173
+ - !ruby/object:Gem::Dependency
174
+ name: rspec_junit_formatter
175
+ requirement: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - ">="
178
+ - !ruby/object:Gem::Version
179
+ version: '0'
180
+ type: :development
181
+ prerelease: false
182
+ version_requirements: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - ">="
185
+ - !ruby/object:Gem::Version
186
+ version: '0'
187
+ - !ruby/object:Gem::Dependency
188
+ name: rubocop
189
+ requirement: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - '='
192
+ - !ruby/object:Gem::Version
193
+ version: '0.49'
194
+ type: :development
195
+ prerelease: false
196
+ version_requirements: !ruby/object:Gem::Requirement
197
+ requirements:
198
+ - - '='
199
+ - !ruby/object:Gem::Version
200
+ version: '0.49'
201
+ - !ruby/object:Gem::Dependency
202
+ name: simplecov
203
+ requirement: !ruby/object:Gem::Requirement
204
+ requirements:
205
+ - - ">="
206
+ - !ruby/object:Gem::Version
207
+ version: '0'
208
+ type: :development
209
+ prerelease: false
210
+ version_requirements: !ruby/object:Gem::Requirement
211
+ requirements:
212
+ - - ">="
213
+ - !ruby/object:Gem::Version
214
+ version: '0'
215
+ description: Command line tool for sending Xcode 9.3+ coverage information to Coveralls
216
+ email:
217
+ - a@ngs.io
218
+ executables:
219
+ - xccoveralls
220
+ extensions: []
221
+ extra_rdoc_files: []
222
+ files:
223
+ - LICENSE
224
+ - README.md
225
+ - bin/xccoveralls
226
+ - lib/xccoveralls.rb
227
+ - lib/xccoveralls/command.rb
228
+ - lib/xccoveralls/ignorefile.rb
229
+ - lib/xccoveralls/options.rb
230
+ - lib/xccoveralls/runner.rb
231
+ - lib/xccoveralls/version.rb
232
+ - lib/xccoveralls/xccov.rb
233
+ homepage: https://github.com/ngs/xccoveralls
234
+ licenses:
235
+ - MIT
236
+ metadata: {}
237
+ post_install_message:
238
+ rdoc_options: []
239
+ require_paths:
240
+ - lib
241
+ required_ruby_version: !ruby/object:Gem::Requirement
242
+ requirements:
243
+ - - ">="
244
+ - !ruby/object:Gem::Version
245
+ version: 2.0.0
246
+ required_rubygems_version: !ruby/object:Gem::Requirement
247
+ requirements:
248
+ - - ">="
249
+ - !ruby/object:Gem::Version
250
+ version: '0'
251
+ requirements: []
252
+ rubyforge_project:
253
+ rubygems_version: 2.7.7
254
+ signing_key:
255
+ specification_version: 4
256
+ summary: Command line tool for sending Xcode 9.3+ coverage information to Coveralls
257
+ test_files: []