xcperfect 0.0.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 856d2292fad7dc61c02839684c243049a2cf0f2f
4
+ data.tar.gz: 16f7d81e204f20d4d41a1aceb2579e48f063ae1e
5
+ SHA512:
6
+ metadata.gz: c81423d09bdeb9efe680980b4ace5ed652a564beeba4350d86e0a4103f031f654c8e7c27868ad4b3cdfa0d7fe102aa70a10cf0913bd0a3c33bc19c5f04a3faaa
7
+ data.tar.gz: b4f2343bf2b639e49a333c55727076bec0b5fda734244981ef68a6ae5eb37f06379b16b6d7571c1119f286f1dabcef455a1c977abf6f4370cc3d33947d04c0d7
data/.gitignore ADDED
@@ -0,0 +1,30 @@
1
+ # Visual Studio Code
2
+ .settings/
3
+ .vscode/
4
+ tsconfig.json
5
+ jsconfig.json
6
+
7
+ ### macOS ###
8
+ *.DS_Store
9
+ .AppleDouble
10
+ .LSOverride
11
+
12
+ ### Ruby ###
13
+ Gemfile.lock
14
+ *.gem
15
+ *.rbc
16
+ /.config
17
+ /coverage/
18
+ /InstalledFiles
19
+ /pkg/
20
+ /spec/reports/
21
+ /spec/examples.txt
22
+ /test/tmp/
23
+ /test/version_tmp/
24
+ /tmp/
25
+
26
+ ## Environment normalization:
27
+ /.bundle/
28
+ /vendor/bundle
29
+ /lib/bundler/man/
30
+ .rvmrc
data/.rubocop.yml ADDED
@@ -0,0 +1,58 @@
1
+ Layout/SpaceAroundEqualsInParameterDefault:
2
+ Enabled: false
3
+
4
+ Metrics/AbcSize:
5
+ Enabled: false
6
+
7
+ Metrics/BlockLength:
8
+ ExcludedMethods: ['new']
9
+
10
+ Metrics/LineLength:
11
+ Max: 80
12
+ Exclude:
13
+ - 'bin/xcperfect'
14
+ - 'lib/xcperfect/**/*.rb'
15
+
16
+ Metrics/MethodLength:
17
+ Enabled: false
18
+
19
+ Performance/Count:
20
+ Enabled: true
21
+
22
+ Performance/Size:
23
+ Enabled: true
24
+
25
+ Performance/StringReplacement:
26
+ Enabled: true
27
+
28
+ Style/BarePercentLiterals:
29
+ Enabled: false
30
+
31
+ # Configuration parameters: IndentWhenRelativeTo, SupportedStyles, IndentOneStep.
32
+ Style/DoubleNegation:
33
+ Exclude:
34
+ - 'lib/xcperfect/ansi.rb'
35
+
36
+ Style/PercentQLiterals:
37
+ Enabled: false
38
+
39
+ Style/PercentLiteralDelimiters:
40
+ Enabled: true
41
+ Exclude:
42
+ - 'xcperfect.gemspec'
43
+
44
+ Style/PerlBackrefs:
45
+ Enabled: false
46
+
47
+ Style/RegexpLiteral:
48
+ Enabled: false
49
+
50
+ Style/SignalException:
51
+ Enabled: false
52
+
53
+ Style/SpecialGlobalVars:
54
+ Enabled: false
55
+
56
+ Style/UnneededPercentQ:
57
+ Exclude:
58
+ - 'xcperfect.gemspec'
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm: 2.1.1
3
+ script:
4
+ "rake lint"
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in xcperfect.gemspec
4
+ gemspec
data/LICENSE.md ADDED
@@ -0,0 +1,22 @@
1
+ # MIT License
2
+
3
+ Copyright (c) 2018 Mike JS. Choi
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.
22
+
data/README.md ADDED
@@ -0,0 +1,56 @@
1
+ <p align="center">
2
+ <img src="./assets/banner.png">
3
+ <br>
4
+ <p align="center">
5
+ <a href="https://travis-ci.org/mkchoi212/xcperfect">
6
+ <img src="https://travis-ci.org/mkchoi212/xcperfect.svg?branch=master">
7
+ </a>
8
+ </p>
9
+ </p>
10
+ <br>
11
+
12
+ ## Installation
13
+
14
+ ```bash
15
+ $ gem install xcperfect
16
+ ```
17
+
18
+ ## Usage
19
+
20
+ ```bash
21
+ $ xcrun xccov --json [options] | xcperfect
22
+ ```
23
+
24
+ or
25
+
26
+ ```bash
27
+ $ xcrun xccov --json [options] > report.json
28
+ $ xcperfect report.json
29
+ ```
30
+
31
+ or
32
+
33
+ ```bash
34
+ $ xcperfect [--file | -f] report.json [options]
35
+ ```
36
+
37
+ ## Formats
38
+
39
+ - `--all`, `-a` **Default**
40
+
41
+ - `--simple`, `-s`
42
+
43
+ ![Simple Formatter](./assets/simple_formatter.png)
44
+
45
+ ## ✋ Contributing
46
+
47
+ This is an open source project so feel free to contribute by
48
+
49
+ - Opening an [issue](https://github.com/mkchoi212/xcperfect/issues/new)
50
+ - Sending me feedback via [email](mailto://mkchoi212@icloud.com)
51
+ - Or [tweet](https://twitter.com/Bananamlkshake2) at your boi!
52
+
53
+ ## LICENSE
54
+
55
+ Please look at [LICENSE.md](./LICENSE.md)
56
+
data/Rakefile ADDED
@@ -0,0 +1,5 @@
1
+ require 'bundler/gem_tasks'
2
+
3
+ task :lint do
4
+ sh 'bundle exec rubocop'
5
+ end
data/assets/banner.png ADDED
Binary file
Binary file
@@ -0,0 +1 @@
1
+ {"coveredLines":28,"lineCoverage":0.0071702944942381563,"targets":[{"coveredLines":15,"lineCoverage":1,"files":[{"coveredLines":15,"lineCoverage":1,"path":"\/Users\/mikechoi\/src\/vlckit\/Tests\/Sources\/VLCTimeTest.swift","functions":[{"coveredLines":15,"lineCoverage":1,"lineNumber":28,"executionCount":1,"name":"VLCKitTests.VLCMediaTest.testCodecNameForFourCC() -> ()","executableLines":15}],"name":"VLCTimeTest.swift","executableLines":15}],"name":"VLCKitTests.xctest","executableLines":15,"buildProductPath":"\/Users\/mikechoi\/src\/vlckit\/DerivedData\/VLCKitTests\/Build\/Products\/Debug\/VLCKitTests.xctest\/Contents\/MacOS\/VLCKitTests"},{"coveredLines":13,"lineCoverage":0.0033419023136246786,"files":[{"coveredLines":0,"lineCoverage":0,"path":"\/Users\/mikechoi\/src\/vlckit\/Sources\/VLCAudio.m","functions":[{"coveredLines":0,"lineCoverage":0,"lineNumber":50,"executionCount":0,"name":"-[VLCAudio instance]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":55,"executionCount":0,"name":"-[VLCAudio init]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":60,"executionCount":0,"name":"-[VLCAudio initWithMediaPlayer:]","executableLines":8},{"coveredLines":0,"lineCoverage":0,"lineNumber":70,"executionCount":0,"name":"-[VLCAudio dealloc]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":75,"executionCount":0,"name":"-[VLCAudio setMuted:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":80,"executionCount":0,"name":"-[VLCAudio setMute:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":85,"executionCount":0,"name":"-[VLCAudio isMuted]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":90,"executionCount":0,"name":"-[VLCAudio setPassthrough:]","executableLines":7},{"coveredLines":0,"lineCoverage":0,"lineNumber":99,"executionCount":0,"name":"-[VLCAudio passthrough]","executableLines":11},{"coveredLines":0,"lineCoverage":0,"lineNumber":112,"executionCount":0,"name":"-[VLCAudio setVolume:]","executableLines":7},{"coveredLines":0,"lineCoverage":0,"lineNumber":121,"executionCount":0,"name":"-[VLCAudio volumeUp]","executableLines":8},{"coveredLines":0,"lineCoverage":0,"lineNumber":131,"executionCount":0,"name":"-[VLCAudio volumeDown]","executableLines":8},{"coveredLines":0,"lineCoverage":0,"lineNumber":141,"executionCount":0,"name":"-[VLCAudio volume]","executableLines":3}],"name":"VLCAudio.m","executableLines":70},{"coveredLines":0,"lineCoverage":0,"path":"\/Users\/mikechoi\/src\/vlckit\/Sources\/VLCCustomDialogProvider.m","functions":[{"coveredLines":0,"lineCoverage":0,"lineNumber":46,"executionCount":0,"name":"displayErrorCallback","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":62,"executionCount":0,"name":"displayLoginCallback","executableLines":12},{"coveredLines":0,"lineCoverage":0,"lineNumber":83,"executionCount":0,"name":"displayQuestionCallback","executableLines":14},{"coveredLines":0,"lineCoverage":0,"lineNumber":105,"executionCount":0,"name":"displayProgressCallback","executableLines":13},{"coveredLines":0,"lineCoverage":0,"lineNumber":121,"executionCount":0,"name":"cancelCallback","executableLines":8},{"coveredLines":0,"lineCoverage":0,"lineNumber":134,"executionCount":0,"name":"updateProgressCallback","executableLines":10},{"coveredLines":0,"lineCoverage":0,"lineNumber":148,"executionCount":0,"name":"-[VLCCustomDialogProvider dealloc]","executableLines":5},{"coveredLines":0,"lineCoverage":0,"lineNumber":155,"executionCount":0,"name":"-[VLCCustomDialogProvider initWithLibrary:]","executableLines":27},{"coveredLines":0,"lineCoverage":0,"lineNumber":184,"executionCount":0,"name":"-[VLCCustomDialogProvider displayError:]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":195,"executionCount":0,"name":"-[VLCCustomDialogProvider displayLoginDialog:]","executableLines":13},{"coveredLines":0,"lineCoverage":0,"lineNumber":210,"executionCount":0,"name":"-[VLCCustomDialogProvider postUsername:andPassword:forDialogReference:store:]","executableLines":11},{"coveredLines":0,"lineCoverage":0,"lineNumber":223,"executionCount":0,"name":"-[VLCCustomDialogProvider displayQuestion:]","executableLines":15},{"coveredLines":0,"lineCoverage":0,"lineNumber":240,"executionCount":0,"name":"-[VLCCustomDialogProvider postAction:forDialogReference:]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":246,"executionCount":0,"name":"-[VLCCustomDialogProvider displayProgressDialog:]","executableLines":14},{"coveredLines":0,"lineCoverage":0,"lineNumber":262,"executionCount":0,"name":"-[VLCCustomDialogProvider updateDisplayedProgressDialog:]","executableLines":11},{"coveredLines":0,"lineCoverage":0,"lineNumber":275,"executionCount":0,"name":"-[VLCCustomDialogProvider cancelDialog:]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":286,"executionCount":0,"name":"-[VLCCustomDialogProvider dismissDialogWithReference:]","executableLines":3}],"name":"VLCCustomDialogProvider.m","executableLines":187},{"coveredLines":0,"lineCoverage":0,"path":"\/Users\/mikechoi\/src\/vlckit\/Sources\/VLCDialogProvider.m","functions":[{"coveredLines":0,"lineCoverage":0,"lineNumber":37,"executionCount":0,"name":"-[VLCDialogProvider initWithLibrary:customUI:]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":62,"executionCount":0,"name":"-[VLCDialogProvider postAction:forDialogReference:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":67,"executionCount":0,"name":"-[VLCDialogProvider postUsername:andPassword:forDialogReference:store:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":72,"executionCount":0,"name":"-[VLCDialogProvider dismissDialogWithReference:]","executableLines":3}],"name":"VLCDialogProvider.m","executableLines":18},{"coveredLines":0,"lineCoverage":0,"path":"\/Users\/mikechoi\/src\/vlckit\/Sources\/VLCEventManager.m","functions":[{"coveredLines":0,"lineCoverage":0,"lineNumber":54,"executionCount":0,"name":"-[message_t isEqual:]","executableLines":14},{"coveredLines":0,"lineCoverage":0,"lineNumber":91,"executionCount":0,"name":"EventDispatcherMainLoop","executableLines":7},{"coveredLines":0,"lineCoverage":0,"lineNumber":102,"executionCount":0,"name":"+[VLCEventManager sharedManager]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":105,"executionCount":0,"name":"__32+[VLCEventManager sharedManager]_block_invoke","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":113,"executionCount":0,"name":"-[VLCEventManager dummy]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":118,"executionCount":0,"name":"-[VLCEventManager init]","executableLines":17},{"coveredLines":0,"lineCoverage":0,"lineNumber":137,"executionCount":0,"name":"-[VLCEventManager dealloc]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":144,"executionCount":0,"name":"-[VLCEventManager startEventLoop]","executableLines":83},{"coveredLines":0,"lineCoverage":0,"lineNumber":213,"executionCount":0,"name":"__33-[VLCEventManager startEventLoop]_block_invoke","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":217,"executionCount":0,"name":"__33-[VLCEventManager startEventLoop]_block_invoke.99","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":229,"executionCount":0,"name":"-[VLCEventManager callOnMainThreadDelegateOfObject:withDelegateMethod:withNotificationName:]","executableLines":15},{"coveredLines":0,"lineCoverage":0,"lineNumber":246,"executionCount":0,"name":"-[VLCEventManager callOnMainThreadObject:withMethod:withArgumentAsObject:]","executableLines":15},{"coveredLines":0,"lineCoverage":0,"lineNumber":263,"executionCount":0,"name":"-[VLCEventManager cancelCallToObject:]","executableLines":42},{"coveredLines":0,"lineCoverage":0,"lineNumber":307,"executionCount":0,"name":"-[VLCEventManager addMessageToHandleOnMainThread:]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":315,"executionCount":0,"name":"-[VLCEventManager markMessageHandledOnMainThreadIfExists:]","executableLines":10},{"coveredLines":0,"lineCoverage":0,"lineNumber":327,"executionCount":0,"name":"-[VLCEventManager callDelegateOfObjectAndSendNotificationWithArgs:]","executableLines":16},{"coveredLines":0,"lineCoverage":0,"lineNumber":345,"executionCount":0,"name":"-[VLCEventManager callObjectMethodWithArgs:]","executableLines":8}],"name":"VLCEventManager.m","executableLines":258},{"coveredLines":0,"lineCoverage":0,"path":"\/Users\/mikechoi\/src\/vlckit\/Sources\/VLCHelperCode.m","functions":[{"coveredLines":0,"lineCoverage":0,"lineNumber":26,"executionCount":0,"name":"toNSStr","executableLines":3}],"name":"VLCHelperCode.m","executableLines":3},{"coveredLines":0,"lineCoverage":0,"path":"\/Users\/mikechoi\/src\/vlckit\/Sources\/VLCLibrary.m","functions":[{"coveredLines":0,"lineCoverage":0,"lineNumber":53,"executionCount":0,"name":"+[VLCLibrary sharedLibrary]","executableLines":7},{"coveredLines":0,"lineCoverage":0,"lineNumber":55,"executionCount":0,"name":"__27+[VLCLibrary sharedLibrary]_block_invoke","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":62,"executionCount":0,"name":"+[VLCLibrary sharedInstance]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":67,"executionCount":0,"name":"-[VLCLibrary init]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":75,"executionCount":0,"name":"-[VLCLibrary initWithOptions:]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":83,"executionCount":0,"name":"-[VLCLibrary prepareInstanceWithOptions:]","executableLines":14},{"coveredLines":0,"lineCoverage":0,"lineNumber":99,"executionCount":0,"name":"-[VLCLibrary _defaultOptions]","executableLines":23},{"coveredLines":0,"lineCoverage":0,"lineNumber":142,"executionCount":0,"name":"-[VLCLibrary setDebugLogging:]","executableLines":10},{"coveredLines":0,"lineCoverage":0,"lineNumber":154,"executionCount":0,"name":"-[VLCLibrary version]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":159,"executionCount":0,"name":"-[VLCLibrary compiler]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":164,"executionCount":0,"name":"-[VLCLibrary changeset]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":169,"executionCount":0,"name":"-[VLCLibrary setHumanReadableName:withHTTPUserAgent:]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":175,"executionCount":0,"name":"-[VLCLibrary setApplicationIdentifier:withVersion:andApplicationIconName:]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":181,"executionCount":0,"name":"-[VLCLibrary dealloc]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":193,"executionCount":0,"name":"HandleMessage","executableLines":21}],"name":"VLCLibrary.m","executableLines":114},{"coveredLines":13,"lineCoverage":0.01790633608815427,"path":"\/Users\/mikechoi\/src\/vlckit\/Sources\/VLCMedia.m","functions":[{"coveredLines":0,"lineCoverage":0,"lineNumber":120,"executionCount":0,"name":"LibVLCStateToMediaState","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":128,"executionCount":0,"name":"HandleMediaMetaChanged","executableLines":7},{"coveredLines":0,"lineCoverage":0,"lineNumber":137,"executionCount":0,"name":"HandleMediaDurationChanged","executableLines":8},{"coveredLines":0,"lineCoverage":0,"lineNumber":147,"executionCount":0,"name":"HandleMediaStateChanged","executableLines":7},{"coveredLines":0,"lineCoverage":0,"lineNumber":156,"executionCount":0,"name":"HandleMediaSubItemAdded","executableLines":7},{"coveredLines":0,"lineCoverage":0,"lineNumber":165,"executionCount":0,"name":"HandleMediaParsedChanged","executableLines":7},{"coveredLines":13,"lineCoverage":0.8125,"lineNumber":180,"executionCount":4,"name":"+[VLCMedia codecNameForFourCC:trackType:]","executableLines":16},{"coveredLines":0,"lineCoverage":0,"lineNumber":198,"executionCount":0,"name":"+[VLCMedia mediaWithURL:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":203,"executionCount":0,"name":"+[VLCMedia mediaWithPath:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":208,"executionCount":0,"name":"+[VLCMedia mediaAsNodeWithName:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":213,"executionCount":0,"name":"-[VLCMedia initWithPath:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":218,"executionCount":0,"name":"-[VLCMedia initWithURL:]","executableLines":21},{"coveredLines":0,"lineCoverage":0,"lineNumber":241,"executionCount":0,"name":"-[VLCMedia initAsNodeWithName:]","executableLines":10},{"coveredLines":0,"lineCoverage":0,"lineNumber":253,"executionCount":0,"name":"-[VLCMedia dealloc]","executableLines":14},{"coveredLines":0,"lineCoverage":0,"lineNumber":269,"executionCount":0,"name":"-[VLCMedia mediaType]","executableLines":19},{"coveredLines":0,"lineCoverage":0,"lineNumber":290,"executionCount":0,"name":"-[VLCMedia description]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":295,"executionCount":0,"name":"-[VLCMedia compare:]","executableLines":7},{"coveredLines":0,"lineCoverage":0,"lineNumber":304,"executionCount":0,"name":"-[VLCMedia length]","executableLines":10},{"coveredLines":0,"lineCoverage":0,"lineNumber":316,"executionCount":0,"name":"-[VLCMedia lengthWaitUntilDate:]","executableLines":23},{"coveredLines":0,"lineCoverage":0,"lineNumber":341,"executionCount":0,"name":"-[VLCMedia isParsed]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":347,"executionCount":0,"name":"-[VLCMedia parsedStatus]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":355,"executionCount":0,"name":"-[VLCMedia parse]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":361,"executionCount":0,"name":"-[VLCMedia synchronousParse]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":367,"executionCount":0,"name":"-[VLCMedia parseWithOptions:timeout:]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":378,"executionCount":0,"name":"-[VLCMedia parseWithOptions:]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":389,"executionCount":0,"name":"-[VLCMedia addOptions:]","executableLines":10},{"coveredLines":0,"lineCoverage":0,"lineNumber":391,"executionCount":0,"name":"__23-[VLCMedia addOptions:]_block_invoke","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":403,"executionCount":0,"name":"-[VLCMedia storeCookie:forHost:path:]","executableLines":7},{"coveredLines":0,"lineCoverage":0,"lineNumber":418,"executionCount":0,"name":"-[VLCMedia clearStoredCookies]","executableLines":5},{"coveredLines":0,"lineCoverage":0,"lineNumber":429,"executionCount":0,"name":"-[VLCMedia stats]","executableLines":25},{"coveredLines":0,"lineCoverage":0,"lineNumber":456,"executionCount":0,"name":"-[VLCMedia numberOfReadBytesOnInput]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":467,"executionCount":0,"name":"-[VLCMedia inputBitrate]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":478,"executionCount":0,"name":"-[VLCMedia numberOfReadBytesOnDemux]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":489,"executionCount":0,"name":"-[VLCMedia demuxBitrate]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":500,"executionCount":0,"name":"-[VLCMedia numberOfDecodedVideoBlocks]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":511,"executionCount":0,"name":"-[VLCMedia numberOfDecodedAudioBlocks]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":522,"executionCount":0,"name":"-[VLCMedia numberOfDisplayedPictures]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":533,"executionCount":0,"name":"-[VLCMedia numberOfLostPictures]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":544,"executionCount":0,"name":"-[VLCMedia numberOfPlayedAudioBuffers]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":555,"executionCount":0,"name":"-[VLCMedia numberOfLostAudioBuffers]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":566,"executionCount":0,"name":"-[VLCMedia numberOfSentPackets]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":577,"executionCount":0,"name":"-[VLCMedia numberOfSentBytes]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":588,"executionCount":0,"name":"-[VLCMedia streamOutputBitrate]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":599,"executionCount":0,"name":"-[VLCMedia numberOfCorruptedDataPackets]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":610,"executionCount":0,"name":"-[VLCMedia numberOfDiscontinuties]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":653,"executionCount":0,"name":"-[VLCMedia tracksInformation]","executableLines":58},{"coveredLines":0,"lineCoverage":0,"lineNumber":713,"executionCount":0,"name":"-[VLCMedia isMediaSizeSuitableForDevice]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":768,"executionCount":0,"name":"-[VLCMedia metadataForKey:]","executableLines":14},{"coveredLines":0,"lineCoverage":0,"lineNumber":784,"executionCount":0,"name":"-[VLCMedia setMetadata:forKey:]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":792,"executionCount":0,"name":"-[VLCMedia saveMetadata]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":804,"executionCount":0,"name":"+[VLCMedia stringToMetaType:]","executableLines":37},{"coveredLines":0,"lineCoverage":0,"lineNumber":843,"executionCount":0,"name":"+[VLCMedia metaTypeToString:]","executableLines":29},{"coveredLines":0,"lineCoverage":0,"lineNumber":874,"executionCount":0,"name":"-[VLCMedia initInternalMediaDescriptor]","executableLines":47},{"coveredLines":0,"lineCoverage":0,"lineNumber":923,"executionCount":0,"name":"-[VLCMedia fetchMetaInformationFromLibVLCWithType:]","executableLines":19},{"coveredLines":0,"lineCoverage":0,"lineNumber":945,"executionCount":0,"name":"-[VLCMedia fetchMetaInformationForArtWorkWithURL:]","executableLines":16},{"coveredLines":0,"lineCoverage":0,"lineNumber":963,"executionCount":0,"name":"-[VLCMedia setArtwork:]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":972,"executionCount":0,"name":"-[VLCMedia parseIfNeeded]","executableLines":5},{"coveredLines":0,"lineCoverage":0,"lineNumber":979,"executionCount":0,"name":"-[VLCMedia metaChanged:]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":987,"executionCount":0,"name":"-[VLCMedia subItemAdded]","executableLines":12},{"coveredLines":0,"lineCoverage":0,"lineNumber":1001,"executionCount":0,"name":"-[VLCMedia parsedChanged:]","executableLines":11},{"coveredLines":0,"lineCoverage":0,"lineNumber":1014,"executionCount":0,"name":"-[VLCMedia setStateAsNumber:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1046,"executionCount":0,"name":"-[VLCMedia metaDictionary]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1051,"executionCount":0,"name":"-[VLCMedia valueForKeyPath:]","executableLines":18},{"coveredLines":0,"lineCoverage":0,"lineNumber":1078,"executionCount":0,"name":"+[VLCMedia(LibVLCBridging) mediaWithLibVLCMediaDescriptor:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1083,"executionCount":0,"name":"+[VLCMedia(LibVLCBridging) mediaWithMedia:andLibVLCOptions:]","executableLines":12},{"coveredLines":0,"lineCoverage":0,"lineNumber":1097,"executionCount":0,"name":"-[VLCMedia(LibVLCBridging) initWithLibVLCMediaDescriptor:]","executableLines":11},{"coveredLines":0,"lineCoverage":0,"lineNumber":1110,"executionCount":0,"name":"-[VLCMedia(LibVLCBridging) libVLCMediaDescriptor]","executableLines":3}],"name":"VLCMedia.m","executableLines":726},{"coveredLines":0,"lineCoverage":0,"path":"\/Users\/mikechoi\/src\/vlckit\/Sources\/VLCMediaDiscoverer.m","functions":[{"coveredLines":0,"lineCoverage":0,"lineNumber":55,"executionCount":0,"name":"+[VLCMediaDiscoverer availableMediaDiscoverer]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":60,"executionCount":0,"name":"+[VLCMediaDiscoverer availableMediaDiscovererForCategoryType:]","executableLines":25},{"coveredLines":0,"lineCoverage":0,"lineNumber":87,"executionCount":0,"name":"-[VLCMediaDiscoverer initWithName:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":92,"executionCount":0,"name":"-[VLCMediaDiscoverer initWithName:libraryInstance:]","executableLines":23},{"coveredLines":0,"lineCoverage":0,"lineNumber":117,"executionCount":0,"name":"-[VLCMediaDiscoverer dealloc]","executableLines":13},{"coveredLines":0,"lineCoverage":0,"lineNumber":132,"executionCount":0,"name":"-[VLCMediaDiscoverer startDiscoverer]","executableLines":15},{"coveredLines":0,"lineCoverage":0,"lineNumber":149,"executionCount":0,"name":"-[VLCMediaDiscoverer stopDiscoverer]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":154,"executionCount":0,"name":"__36-[VLCMediaDiscoverer stopDiscoverer]_block_invoke","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":160,"executionCount":0,"name":"-[VLCMediaDiscoverer discoveredMedia]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":165,"executionCount":0,"name":"-[VLCMediaDiscoverer localizedName]","executableLines":14},{"coveredLines":0,"lineCoverage":0,"lineNumber":181,"executionCount":0,"name":"-[VLCMediaDiscoverer isRunning]","executableLines":3}],"name":"VLCMediaDiscoverer.m","executableLines":114},{"coveredLines":0,"lineCoverage":0,"path":"\/Users\/mikechoi\/src\/vlckit\/Sources\/VLCMediaLibrary.m","functions":[{"coveredLines":0,"lineCoverage":0,"lineNumber":46,"executionCount":0,"name":"+[VLCMediaLibrary sharedMediaLibrary]","executableLines":10},{"coveredLines":0,"lineCoverage":0,"lineNumber":50,"executionCount":0,"name":"__37+[VLCMediaLibrary sharedMediaLibrary]_block_invoke","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":58,"executionCount":0,"name":"-[VLCMediaLibrary init]","executableLines":7},{"coveredLines":0,"lineCoverage":0,"lineNumber":67,"executionCount":0,"name":"-[VLCMediaLibrary dealloc]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":73,"executionCount":0,"name":"-[VLCMediaLibrary allMedia]","executableLines":11},{"coveredLines":0,"lineCoverage":0,"lineNumber":74,"executionCount":0,"name":"__27-[VLCMediaLibrary allMedia]_block_invoke","executableLines":8}],"name":"VLCMediaLibrary.m","executableLines":43},{"coveredLines":0,"lineCoverage":0,"path":"\/Users\/mikechoi\/src\/vlckit\/Sources\/VLCMediaList.m","functions":[{"coveredLines":0,"lineCoverage":0,"lineNumber":56,"executionCount":0,"name":"HandleMediaListItemAdded","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":67,"executionCount":0,"name":"HandleMediaListItemDeleted","executableLines":8},{"coveredLines":0,"lineCoverage":0,"lineNumber":88,"executionCount":0,"name":"-[VLCMediaList init]","executableLines":13},{"coveredLines":0,"lineCoverage":0,"lineNumber":103,"executionCount":0,"name":"-[VLCMediaList initWithArray:]","executableLines":10},{"coveredLines":0,"lineCoverage":0,"lineNumber":115,"executionCount":0,"name":"-[VLCMediaList dealloc]","executableLines":13},{"coveredLines":0,"lineCoverage":0,"lineNumber":130,"executionCount":0,"name":"-[VLCMediaList description]","executableLines":7},{"coveredLines":0,"lineCoverage":0,"lineNumber":139,"executionCount":0,"name":"-[VLCMediaList lock]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":144,"executionCount":0,"name":"-[VLCMediaList unlock]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":149,"executionCount":0,"name":"-[VLCMediaList addMedia:]","executableLines":5},{"coveredLines":0,"lineCoverage":0,"lineNumber":156,"executionCount":0,"name":"-[VLCMediaList insertMedia:atIndex:]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":158,"executionCount":0,"name":"__36-[VLCMediaList insertMedia:atIndex:]_block_invoke","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":167,"executionCount":0,"name":"-[VLCMediaList removeMediaAtIndex:]","executableLines":11},{"coveredLines":0,"lineCoverage":0,"lineNumber":168,"executionCount":0,"name":"__35-[VLCMediaList removeMediaAtIndex:]_block_invoke","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":180,"executionCount":0,"name":"-[VLCMediaList mediaAtIndex:]","executableLines":7},{"coveredLines":0,"lineCoverage":0,"lineNumber":182,"executionCount":0,"name":"__29-[VLCMediaList mediaAtIndex:]_block_invoke","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":189,"executionCount":0,"name":"-[VLCMediaList indexOfMedia:]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":196,"executionCount":0,"name":"-[VLCMediaList countOfMedia]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":201,"executionCount":0,"name":"-[VLCMediaList objectInMediaAtIndex:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":206,"executionCount":0,"name":"-[VLCMediaList count]","executableLines":7},{"coveredLines":0,"lineCoverage":0,"lineNumber":208,"executionCount":0,"name":"__21-[VLCMediaList count]_block_invoke","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":215,"executionCount":0,"name":"-[VLCMediaList insertObject:inMediaAtIndex:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":220,"executionCount":0,"name":"-[VLCMediaList removeObjectFromMediaAtIndex:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":227,"executionCount":0,"name":"-[VLCMediaList isReadOnly]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":235,"executionCount":0,"name":"+[VLCMediaList(LibVLCBridging) mediaListWithLibVLCMediaList:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":240,"executionCount":0,"name":"-[VLCMediaList(LibVLCBridging) initWithLibVLCMediaList:]","executableLines":20},{"coveredLines":0,"lineCoverage":0,"lineNumber":250,"executionCount":0,"name":"__56-[VLCMediaList(LibVLCBridging) initWithLibVLCMediaList:]_block_invoke","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":262,"executionCount":0,"name":"-[VLCMediaList(LibVLCBridging) libVLCMediaList]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":269,"executionCount":0,"name":"-[VLCMediaList(Private) initInternalMediaList]","executableLines":13},{"coveredLines":0,"lineCoverage":0,"lineNumber":277,"executionCount":0,"name":"__46-[VLCMediaList(Private) initInternalMediaList]_block_invoke","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":284,"executionCount":0,"name":"-[VLCMediaList(Private) mediaListItemAdded:]","executableLines":33},{"coveredLines":0,"lineCoverage":0,"lineNumber":296,"executionCount":0,"name":"__44-[VLCMediaList(Private) mediaListItemAdded:]_block_invoke","executableLines":8},{"coveredLines":0,"lineCoverage":0,"lineNumber":308,"executionCount":0,"name":"__44-[VLCMediaList(Private) mediaListItemAdded:]_block_invoke.146","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":319,"executionCount":0,"name":"-[VLCMediaList(Private) mediaListItemRemoved:]","executableLines":17},{"coveredLines":0,"lineCoverage":0,"lineNumber":321,"executionCount":0,"name":"__46-[VLCMediaList(Private) mediaListItemRemoved:]_block_invoke","executableLines":3}],"name":"VLCMediaList.m","executableLines":249},{"coveredLines":0,"lineCoverage":0,"path":"\/Users\/mikechoi\/src\/vlckit\/Sources\/VLCMediaListPlayer.m","functions":[{"coveredLines":0,"lineCoverage":0,"lineNumber":47,"executionCount":0,"name":"-[VLCMediaListPlayer initWithOptions:andDrawable:]","executableLines":18},{"coveredLines":0,"lineCoverage":0,"lineNumber":67,"executionCount":0,"name":"-[VLCMediaListPlayer initWithOptions:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":72,"executionCount":0,"name":"-[VLCMediaListPlayer init]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":77,"executionCount":0,"name":"-[VLCMediaListPlayer initWithDrawable:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":82,"executionCount":0,"name":"-[VLCMediaListPlayer dealloc]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":88,"executionCount":0,"name":"-[VLCMediaListPlayer mediaPlayer]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":93,"executionCount":0,"name":"-[VLCMediaListPlayer setMediaList:]","executableLines":10},{"coveredLines":0,"lineCoverage":0,"lineNumber":105,"executionCount":0,"name":"-[VLCMediaListPlayer mediaList]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":110,"executionCount":0,"name":"-[VLCMediaListPlayer setRootMedia:]","executableLines":16},{"coveredLines":0,"lineCoverage":0,"lineNumber":128,"executionCount":0,"name":"-[VLCMediaListPlayer rootMedia]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":133,"executionCount":0,"name":"-[VLCMediaListPlayer playMedia:]","executableLines":5},{"coveredLines":0,"lineCoverage":0,"lineNumber":134,"executionCount":0,"name":"__32-[VLCMediaListPlayer playMedia:]_block_invoke","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":140,"executionCount":0,"name":"-[VLCMediaListPlayer play]","executableLines":5},{"coveredLines":0,"lineCoverage":0,"lineNumber":141,"executionCount":0,"name":"__26-[VLCMediaListPlayer play]_block_invoke","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":147,"executionCount":0,"name":"-[VLCMediaListPlayer pause]","executableLines":5},{"coveredLines":0,"lineCoverage":0,"lineNumber":148,"executionCount":0,"name":"__27-[VLCMediaListPlayer pause]_block_invoke","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":154,"executionCount":0,"name":"-[VLCMediaListPlayer stop]","executableLines":5},{"coveredLines":0,"lineCoverage":0,"lineNumber":155,"executionCount":0,"name":"__26-[VLCMediaListPlayer stop]_block_invoke","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":161,"executionCount":0,"name":"-[VLCMediaListPlayer next]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":166,"executionCount":0,"name":"-[VLCMediaListPlayer previous]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":171,"executionCount":0,"name":"-[VLCMediaListPlayer playItemAtIndex:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":176,"executionCount":0,"name":"-[VLCMediaListPlayer playItemAtNumber:]","executableLines":5},{"coveredLines":0,"lineCoverage":0,"lineNumber":177,"executionCount":0,"name":"__39-[VLCMediaListPlayer playItemAtNumber:]_block_invoke","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":183,"executionCount":0,"name":"-[VLCMediaListPlayer setRepeatMode:]","executableLines":20},{"coveredLines":0,"lineCoverage":0,"lineNumber":205,"executionCount":0,"name":"-[VLCMediaListPlayer repeatMode]","executableLines":3}],"name":"VLCMediaListPlayer.m","executableLines":138},{"coveredLines":0,"lineCoverage":0,"path":"\/Users\/mikechoi\/src\/vlckit\/Sources\/VLCMediaPlayer.m","functions":[{"coveredLines":0,"lineCoverage":0,"lineNumber":69,"executionCount":0,"name":"VLCMediaPlayerStateToString","executableLines":12},{"coveredLines":0,"lineCoverage":0,"lineNumber":101,"executionCount":0,"name":"HandleMediaTimeChanged","executableLines":11},{"coveredLines":0,"lineCoverage":0,"lineNumber":114,"executionCount":0,"name":"HandleMediaPositionChanged","executableLines":8},{"coveredLines":0,"lineCoverage":0,"lineNumber":124,"executionCount":0,"name":"HandleMediaInstanceStateChanged","executableLines":36},{"coveredLines":0,"lineCoverage":0,"lineNumber":162,"executionCount":0,"name":"HandleMediaPlayerMediaChanged","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":173,"executionCount":0,"name":"HandleMediaTitleChanged","executableLines":7},{"coveredLines":0,"lineCoverage":0,"lineNumber":182,"executionCount":0,"name":"HandleMediaChapterChanged","executableLines":7},{"coveredLines":0,"lineCoverage":0,"lineNumber":191,"executionCount":0,"name":"HandleMediaPlayerSnapshot","executableLines":13},{"coveredLines":0,"lineCoverage":0,"lineNumber":229,"executionCount":0,"name":"+[VLCMediaPlayer keyPathsForValuesAffectingValueForKey:]","executableLines":16},{"coveredLines":0,"lineCoverage":0,"lineNumber":248,"executionCount":0,"name":"-[VLCMediaPlayer init]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":253,"executionCount":0,"name":"-[VLCMediaPlayer initWithLibVLCInstance:andLibrary:]","executableLines":17},{"coveredLines":0,"lineCoverage":0,"lineNumber":273,"executionCount":0,"name":"-[VLCMediaPlayer initWithVideoView:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":278,"executionCount":0,"name":"-[VLCMediaPlayer initWithVideoLayer:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":283,"executionCount":0,"name":"-[VLCMediaPlayer initWithVideoView:options:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":288,"executionCount":0,"name":"-[VLCMediaPlayer initWithVideoLayer:options:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":294,"executionCount":0,"name":"-[VLCMediaPlayer initWithOptions:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":299,"executionCount":0,"name":"-[VLCMediaPlayer dealloc]","executableLines":30},{"coveredLines":0,"lineCoverage":0,"lineNumber":332,"executionCount":0,"name":"-[VLCMediaPlayer setVideoView:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":337,"executionCount":0,"name":"-[VLCMediaPlayer setVideoLayer:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":343,"executionCount":0,"name":"-[VLCMediaPlayer setDrawable:]","executableLines":10},{"coveredLines":0,"lineCoverage":0,"lineNumber":349,"executionCount":0,"name":"__30-[VLCMediaPlayer setDrawable:]_block_invoke","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":355,"executionCount":0,"name":"-[VLCMediaPlayer drawable]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":360,"executionCount":0,"name":"-[VLCMediaPlayer audio]","executableLines":5},{"coveredLines":0,"lineCoverage":0,"lineNumber":369,"executionCount":0,"name":"-[VLCMediaPlayer setCurrentVideoTrackIndex:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":374,"executionCount":0,"name":"-[VLCMediaPlayer currentVideoTrackIndex]","executableLines":7},{"coveredLines":0,"lineCoverage":0,"lineNumber":383,"executionCount":0,"name":"-[VLCMediaPlayer videoTrackNames]","executableLines":16},{"coveredLines":0,"lineCoverage":0,"lineNumber":401,"executionCount":0,"name":"-[VLCMediaPlayer videoTrackIndexes]","executableLines":16},{"coveredLines":0,"lineCoverage":0,"lineNumber":419,"executionCount":0,"name":"-[VLCMediaPlayer numberOfVideoTracks]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":427,"executionCount":0,"name":"-[VLCMediaPlayer setCurrentVideoSubTitleIndex:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":432,"executionCount":0,"name":"-[VLCMediaPlayer currentVideoSubTitleIndex]","executableLines":8},{"coveredLines":0,"lineCoverage":0,"lineNumber":442,"executionCount":0,"name":"-[VLCMediaPlayer videoSubTitlesNames]","executableLines":17},{"coveredLines":0,"lineCoverage":0,"lineNumber":461,"executionCount":0,"name":"-[VLCMediaPlayer videoSubTitlesIndexes]","executableLines":16},{"coveredLines":0,"lineCoverage":0,"lineNumber":479,"executionCount":0,"name":"-[VLCMediaPlayer numberOfSubtitlesTracks]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":484,"executionCount":0,"name":"-[VLCMediaPlayer openVideoSubTitlesFromFile:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":489,"executionCount":0,"name":"-[VLCMediaPlayer addPlaybackSlave:type:enforce:]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":500,"executionCount":0,"name":"-[VLCMediaPlayer setCurrentVideoSubTitleDelay:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":505,"executionCount":0,"name":"-[VLCMediaPlayer currentVideoSubTitleDelay]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":535,"executionCount":0,"name":"-[VLCMediaPlayer setVideoCropGeometry:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":540,"executionCount":0,"name":"-[VLCMediaPlayer videoCropGeometry]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":546,"executionCount":0,"name":"-[VLCMediaPlayer setVideoAspectRatio:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":551,"executionCount":0,"name":"-[VLCMediaPlayer videoAspectRatio]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":557,"executionCount":0,"name":"-[VLCMediaPlayer setScaleFactor:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":562,"executionCount":0,"name":"-[VLCMediaPlayer scaleFactor]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":567,"executionCount":0,"name":"-[VLCMediaPlayer saveVideoSnapshotAt:withWidth:andHeight:]","executableLines":5},{"coveredLines":0,"lineCoverage":0,"lineNumber":574,"executionCount":0,"name":"-[VLCMediaPlayer setDeinterlaceFilter:]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":582,"executionCount":0,"name":"-[VLCMediaPlayer setDeinterlace:withFilter:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":587,"executionCount":0,"name":"-[VLCMediaPlayer adjustFilterEnabled]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":591,"executionCount":0,"name":"-[VLCMediaPlayer setAdjustFilterEnabled:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":595,"executionCount":0,"name":"-[VLCMediaPlayer contrast]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":600,"executionCount":0,"name":"-[VLCMediaPlayer setContrast:]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":607,"executionCount":0,"name":"-[VLCMediaPlayer brightness]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":612,"executionCount":0,"name":"-[VLCMediaPlayer setBrightness:]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":620,"executionCount":0,"name":"-[VLCMediaPlayer hue]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":625,"executionCount":0,"name":"-[VLCMediaPlayer setHue:]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":633,"executionCount":0,"name":"-[VLCMediaPlayer saturation]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":638,"executionCount":0,"name":"-[VLCMediaPlayer setSaturation:]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":645,"executionCount":0,"name":"-[VLCMediaPlayer gamma]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":650,"executionCount":0,"name":"-[VLCMediaPlayer setGamma:]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":658,"executionCount":0,"name":"-[VLCMediaPlayer setRate:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":663,"executionCount":0,"name":"-[VLCMediaPlayer rate]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":668,"executionCount":0,"name":"-[VLCMediaPlayer videoSize]","executableLines":7},{"coveredLines":0,"lineCoverage":0,"lineNumber":677,"executionCount":0,"name":"-[VLCMediaPlayer hasVideoOut]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":682,"executionCount":0,"name":"-[VLCMediaPlayer framesPerSecond]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":687,"executionCount":0,"name":"-[VLCMediaPlayer setTime:]","executableLines":5},{"coveredLines":0,"lineCoverage":0,"lineNumber":694,"executionCount":0,"name":"-[VLCMediaPlayer time]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":699,"executionCount":0,"name":"-[VLCMediaPlayer remainingTime]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":706,"executionCount":0,"name":"-[VLCMediaPlayer setCurrentChapterIndex:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":711,"executionCount":0,"name":"-[VLCMediaPlayer currentChapterIndex]","executableLines":7},{"coveredLines":0,"lineCoverage":0,"lineNumber":720,"executionCount":0,"name":"-[VLCMediaPlayer nextChapter]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":725,"executionCount":0,"name":"-[VLCMediaPlayer previousChapter]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":730,"executionCount":0,"name":"-[VLCMediaPlayer chaptersForTitleIndex:]","executableLines":19},{"coveredLines":0,"lineCoverage":0,"lineNumber":754,"executionCount":0,"name":"-[VLCMediaPlayer setCurrentTitleIndex:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":759,"executionCount":0,"name":"-[VLCMediaPlayer currentTitleIndex]","executableLines":7},{"coveredLines":0,"lineCoverage":0,"lineNumber":768,"executionCount":0,"name":"-[VLCMediaPlayer numberOfTitles]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":773,"executionCount":0,"name":"-[VLCMediaPlayer countOfTitles]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":779,"executionCount":0,"name":"-[VLCMediaPlayer titles]","executableLines":28},{"coveredLines":0,"lineCoverage":0,"lineNumber":809,"executionCount":0,"name":"-[VLCMediaPlayer titleDescriptions]","executableLines":29},{"coveredLines":0,"lineCoverage":0,"lineNumber":840,"executionCount":0,"name":"-[VLCMediaPlayer indexOfLongestTitle]","executableLines":18},{"coveredLines":0,"lineCoverage":0,"lineNumber":860,"executionCount":0,"name":"-[VLCMediaPlayer numberOfChaptersForTitle:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":865,"executionCount":0,"name":"-[VLCMediaPlayer chapterDescriptionsOfTitle:]","executableLines":32},{"coveredLines":0,"lineCoverage":0,"lineNumber":901,"executionCount":0,"name":"-[VLCMediaPlayer setCurrentAudioTrackIndex:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":906,"executionCount":0,"name":"-[VLCMediaPlayer currentAudioTrackIndex]","executableLines":7},{"coveredLines":0,"lineCoverage":0,"lineNumber":915,"executionCount":0,"name":"-[VLCMediaPlayer audioTrackNames]","executableLines":17},{"coveredLines":0,"lineCoverage":0,"lineNumber":934,"executionCount":0,"name":"-[VLCMediaPlayer audioTrackIndexes]","executableLines":16},{"coveredLines":0,"lineCoverage":0,"lineNumber":952,"executionCount":0,"name":"-[VLCMediaPlayer numberOfAudioTracks]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":957,"executionCount":0,"name":"-[VLCMediaPlayer setAudioChannel:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":962,"executionCount":0,"name":"-[VLCMediaPlayer audioChannel]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":967,"executionCount":0,"name":"-[VLCMediaPlayer setCurrentAudioPlaybackDelay:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":972,"executionCount":0,"name":"-[VLCMediaPlayer currentAudioPlaybackDelay]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":980,"executionCount":0,"name":"-[VLCMediaPlayer setEqualizerEnabled:]","executableLines":12},{"coveredLines":0,"lineCoverage":0,"lineNumber":994,"executionCount":0,"name":"-[VLCMediaPlayer equalizerEnabled]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":999,"executionCount":0,"name":"-[VLCMediaPlayer equalizerProfiles]","executableLines":8},{"coveredLines":0,"lineCoverage":0,"lineNumber":1009,"executionCount":0,"name":"-[VLCMediaPlayer resetEqualizerFromProfile:]","executableLines":12},{"coveredLines":0,"lineCoverage":0,"lineNumber":1023,"executionCount":0,"name":"-[VLCMediaPlayer preAmplification]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":1031,"executionCount":0,"name":"-[VLCMediaPlayer setPreAmplification:]","executableLines":7},{"coveredLines":0,"lineCoverage":0,"lineNumber":1040,"executionCount":0,"name":"-[VLCMediaPlayer numberOfBands]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1045,"executionCount":0,"name":"-[VLCMediaPlayer frequencyOfBandAtIndex:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1050,"executionCount":0,"name":"-[VLCMediaPlayer setAmplification:forBand:]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":1058,"executionCount":0,"name":"-[VLCMediaPlayer amplificationOfBand:]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":1069,"executionCount":0,"name":"-[VLCMediaPlayer setMedia:]","executableLines":10},{"coveredLines":0,"lineCoverage":0,"lineNumber":1081,"executionCount":0,"name":"-[VLCMediaPlayer media]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1089,"executionCount":0,"name":"-[VLCMediaPlayer play]","executableLines":5},{"coveredLines":0,"lineCoverage":0,"lineNumber":1090,"executionCount":0,"name":"__22-[VLCMediaPlayer play]_block_invoke","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1096,"executionCount":0,"name":"-[VLCMediaPlayer pause]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":1098,"executionCount":0,"name":"__23-[VLCMediaPlayer pause]_block_invoke","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1104,"executionCount":0,"name":"-[VLCMediaPlayer stop]","executableLines":5},{"coveredLines":0,"lineCoverage":0,"lineNumber":1105,"executionCount":0,"name":"__22-[VLCMediaPlayer stop]_block_invoke","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1111,"executionCount":0,"name":"-[VLCMediaPlayer viewPoint]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":1119,"executionCount":0,"name":"-[VLCMediaPlayer updateViewpoint:pitch:roll:fov:absolute:]","executableLines":11},{"coveredLines":0,"lineCoverage":0,"lineNumber":1132,"executionCount":0,"name":"-[VLCMediaPlayer yaw]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":1140,"executionCount":0,"name":"-[VLCMediaPlayer pitch]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":1148,"executionCount":0,"name":"-[VLCMediaPlayer roll]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":1156,"executionCount":0,"name":"-[VLCMediaPlayer fov]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":1164,"executionCount":0,"name":"-[VLCMediaPlayer gotoNextFrame]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1169,"executionCount":0,"name":"-[VLCMediaPlayer fastForward]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1174,"executionCount":0,"name":"-[VLCMediaPlayer fastForwardAtRate:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1179,"executionCount":0,"name":"-[VLCMediaPlayer rewind]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1184,"executionCount":0,"name":"-[VLCMediaPlayer rewindAtRate:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1189,"executionCount":0,"name":"-[VLCMediaPlayer jumpBackward:]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":1197,"executionCount":0,"name":"-[VLCMediaPlayer jumpForward:]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":1205,"executionCount":0,"name":"-[VLCMediaPlayer extraShortJumpBackward]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1210,"executionCount":0,"name":"-[VLCMediaPlayer extraShortJumpForward]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1215,"executionCount":0,"name":"-[VLCMediaPlayer shortJumpBackward]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1220,"executionCount":0,"name":"-[VLCMediaPlayer shortJumpForward]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1225,"executionCount":0,"name":"-[VLCMediaPlayer mediumJumpBackward]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1230,"executionCount":0,"name":"-[VLCMediaPlayer mediumJumpForward]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1235,"executionCount":0,"name":"-[VLCMediaPlayer longJumpBackward]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1240,"executionCount":0,"name":"-[VLCMediaPlayer longJumpForward]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1245,"executionCount":0,"name":"-[VLCMediaPlayer performNavigationAction:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1250,"executionCount":0,"name":"+[VLCMediaPlayer keyPathsForValuesAffectingIsPlaying]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1255,"executionCount":0,"name":"-[VLCMediaPlayer isPlaying]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1260,"executionCount":0,"name":"-[VLCMediaPlayer willPlay]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1265,"executionCount":0,"name":"-[VLCMediaPlayer state]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1270,"executionCount":0,"name":"-[VLCMediaPlayer position]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1275,"executionCount":0,"name":"-[VLCMediaPlayer setPosition:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1280,"executionCount":0,"name":"-[VLCMediaPlayer isSeekable]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1285,"executionCount":0,"name":"-[VLCMediaPlayer canPause]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1290,"executionCount":0,"name":"-[VLCMediaPlayer snapshots]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1308,"executionCount":0,"name":"-[VLCMediaPlayer lastSnapshot]","executableLines":12},{"coveredLines":0,"lineCoverage":0,"lineNumber":1323,"executionCount":0,"name":"-[VLCMediaPlayer libVLCMediaPlayer]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1331,"executionCount":0,"name":"-[VLCMediaPlayer setRendererItem:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1339,"executionCount":0,"name":"-[VLCMediaPlayer(Private) initWithDrawable:options:]","executableLines":27},{"coveredLines":0,"lineCoverage":0,"lineNumber":1368,"executionCount":0,"name":"-[VLCMediaPlayer(Private) registerObservers]","executableLines":28},{"coveredLines":0,"lineCoverage":0,"lineNumber":1376,"executionCount":0,"name":"__44-[VLCMediaPlayer(Private) registerObservers]_block_invoke","executableLines":19},{"coveredLines":0,"lineCoverage":0,"lineNumber":1398,"executionCount":0,"name":"-[VLCMediaPlayer(Private) unregisterObservers]","executableLines":23},{"coveredLines":0,"lineCoverage":0,"lineNumber":1423,"executionCount":0,"name":"-[VLCMediaPlayer(Private) libVLCBackgroundQueue]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":1431,"executionCount":0,"name":"-[VLCMediaPlayer(Private) mediaPlayerTimeChanged:]","executableLines":13},{"coveredLines":0,"lineCoverage":0,"lineNumber":1447,"executionCount":0,"name":"-[VLCMediaPlayer(Private) delaySleep]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1453,"executionCount":0,"name":"-[VLCMediaPlayer(Private) mediaPlayerPositionChanged:]","executableLines":10},{"coveredLines":0,"lineCoverage":0,"lineNumber":1465,"executionCount":0,"name":"-[VLCMediaPlayer(Private) mediaPlayerStateChanged:]","executableLines":5},{"coveredLines":0,"lineCoverage":0,"lineNumber":1478,"executionCount":0,"name":"-[VLCMediaPlayer(Private) mediaPlayerMediaChanged:]","executableLines":18},{"coveredLines":0,"lineCoverage":0,"lineNumber":1498,"executionCount":0,"name":"-[VLCMediaPlayer(Private) mediaPlayerTitleChanged:]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":1504,"executionCount":0,"name":"-[VLCMediaPlayer(Private) mediaPlayerChapterChanged:]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":1510,"executionCount":0,"name":"-[VLCMediaPlayer(Private) mediaPlayerSnapshot:]","executableLines":9}],"name":"VLCMediaPlayer.m","executableLines":1074},{"coveredLines":0,"lineCoverage":0,"path":"\/Users\/mikechoi\/src\/vlckit\/Sources\/VLCMediaThumbnailer.m","functions":[{"coveredLines":0,"lineCoverage":0,"lineNumber":56,"executionCount":0,"name":"lock","executableLines":7},{"coveredLines":0,"lineCoverage":0,"lineNumber":70,"executionCount":0,"name":"unlock","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":76,"executionCount":0,"name":"display","executableLines":11},{"coveredLines":0,"lineCoverage":0,"lineNumber":99,"executionCount":0,"name":"+[VLCMediaThumbnailer thumbnailerWithMedia:andDelegate:]","executableLines":7},{"coveredLines":0,"lineCoverage":0,"lineNumber":108,"executionCount":0,"name":"+[VLCMediaThumbnailer thumbnailerWithMedia:delegate:andVLCLibrary:]","executableLines":10},{"coveredLines":0,"lineCoverage":0,"lineNumber":120,"executionCount":0,"name":"-[VLCMediaThumbnailer dealloc]","executableLines":10},{"coveredLines":0,"lineCoverage":0,"lineNumber":132,"executionCount":0,"name":"-[VLCMediaThumbnailer setLibVLCinstance:]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":138,"executionCount":0,"name":"-[VLCMediaThumbnailer libVLCinstance]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":143,"executionCount":0,"name":"-[VLCMediaThumbnailer fetchThumbnail]","executableLines":14},{"coveredLines":0,"lineCoverage":0,"lineNumber":159,"executionCount":0,"name":"-[VLCMediaThumbnailer startFetchingThumbnail]","executableLines":83},{"coveredLines":0,"lineCoverage":0,"lineNumber":244,"executionCount":0,"name":"-[VLCMediaThumbnailer mediaParsingTimedOut]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":252,"executionCount":0,"name":"-[VLCMediaThumbnailer observeValueForKeyPath:ofObject:change:context:]","executableLines":11},{"coveredLines":0,"lineCoverage":0,"lineNumber":265,"executionCount":0,"name":"-[VLCMediaThumbnailer didFetchThumbnail]","executableLines":57},{"coveredLines":0,"lineCoverage":0,"lineNumber":324,"executionCount":0,"name":"-[VLCMediaThumbnailer stopAsync]","executableLines":14},{"coveredLines":0,"lineCoverage":0,"lineNumber":340,"executionCount":0,"name":"-[VLCMediaThumbnailer endThumbnailing]","executableLines":8},{"coveredLines":0,"lineCoverage":0,"lineNumber":350,"executionCount":0,"name":"-[VLCMediaThumbnailer notifyDelegate]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":358,"executionCount":0,"name":"-[VLCMediaThumbnailer mediaThumbnailingTimedOut]","executableLines":7}],"name":"VLCMediaThumbnailer.m","executableLines":262},{"coveredLines":0,"lineCoverage":0,"path":"\/Users\/mikechoi\/src\/vlckit\/Sources\/VLCRendererDiscoverer.m","functions":[{"coveredLines":0,"lineCoverage":0,"lineNumber":39,"executionCount":0,"name":"HandleRendererDiscovererItemAdded","executableLines":8},{"coveredLines":0,"lineCoverage":0,"lineNumber":49,"executionCount":0,"name":"HandleRendererDiscovererItemDeleted","executableLines":8},{"coveredLines":0,"lineCoverage":0,"lineNumber":63,"executionCount":0,"name":"-[VLCRendererDiscovererDescription initWithName:longName:]","executableLines":11},{"coveredLines":0,"lineCoverage":0,"lineNumber":82,"executionCount":0,"name":"-[VLCRendererDiscoverer initWithName:]","executableLines":24},{"coveredLines":0,"lineCoverage":0,"lineNumber":108,"executionCount":0,"name":"-[VLCRendererDiscoverer start]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":113,"executionCount":0,"name":"-[VLCRendererDiscoverer stop]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":118,"executionCount":0,"name":"-[VLCRendererDiscoverer dealloc]","executableLines":14},{"coveredLines":0,"lineCoverage":0,"lineNumber":134,"executionCount":0,"name":"+[VLCRendererDiscoverer list]","executableLines":22},{"coveredLines":0,"lineCoverage":0,"lineNumber":158,"executionCount":0,"name":"-[VLCRendererDiscoverer discoveredItemsContainItem:]","executableLines":11},{"coveredLines":0,"lineCoverage":0,"lineNumber":171,"executionCount":0,"name":"-[VLCRendererDiscoverer renderers]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":178,"executionCount":0,"name":"-[VLCRendererDiscoverer itemAdded:]","executableLines":10},{"coveredLines":0,"lineCoverage":0,"lineNumber":190,"executionCount":0,"name":"-[VLCRendererDiscoverer itemDeleted:]","executableLines":9}],"name":"VLCRendererDiscoverer.m","executableLines":126},{"coveredLines":0,"lineCoverage":0,"path":"\/Users\/mikechoi\/src\/vlckit\/Sources\/VLCRendererItem.m","functions":[{"coveredLines":0,"lineCoverage":0,"lineNumber":35,"executionCount":0,"name":"-[VLCRendererItem dealloc]","executableLines":5},{"coveredLines":0,"lineCoverage":0,"lineNumber":46,"executionCount":0,"name":"-[VLCRendererItem(VLCRendererItemBridging) initWithRendererItem:]","executableLines":23},{"coveredLines":0,"lineCoverage":0,"lineNumber":71,"executionCount":0,"name":"-[VLCRendererItem(VLCRendererItemBridging) libVLCRendererItem]","executableLines":3}],"name":"VLCRendererItem.m","executableLines":31},{"coveredLines":0,"lineCoverage":0,"path":"\/Users\/mikechoi\/src\/vlckit\/Sources\/VLCStreamOutput.m","functions":[{"coveredLines":0,"lineCoverage":0,"lineNumber":39,"executionCount":0,"name":"-[VLCStreamOutput init]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":44,"executionCount":0,"name":"-[VLCStreamOutput initWithOptionDictionary:]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":51,"executionCount":0,"name":"-[VLCStreamOutput description]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":55,"executionCount":0,"name":"+[VLCStreamOutput streamOutputWithOptionDictionary:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":59,"executionCount":0,"name":"+[VLCStreamOutput rtpBroadcastStreamOutputWithSAPAnnounce:]","executableLines":12},{"coveredLines":0,"lineCoverage":0,"lineNumber":73,"executionCount":0,"name":"+[VLCStreamOutput rtpBroadcastStreamOutput]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":78,"executionCount":0,"name":"+[VLCStreamOutput ipodStreamOutputWithFilePath:]","executableLines":19},{"coveredLines":0,"lineCoverage":0,"lineNumber":99,"executionCount":0,"name":"+[VLCStreamOutput mpeg4StreamOutputWithFilePath:]","executableLines":15},{"coveredLines":0,"lineCoverage":0,"lineNumber":116,"executionCount":0,"name":"+[VLCStreamOutput streamOutputWithFilePath:]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":127,"executionCount":0,"name":"+[VLCStreamOutput mpeg2StreamOutputWithFilePath:]","executableLines":16},{"coveredLines":0,"lineCoverage":0,"lineNumber":147,"executionCount":0,"name":"-[VLCStreamOutput(LibVLCBridge) representedLibVLCOptions]","executableLines":79}],"name":"VLCStreamOutput.m","executableLines":168},{"coveredLines":0,"lineCoverage":0,"path":"\/Users\/mikechoi\/src\/vlckit\/Sources\/VLCStreamSession.m","functions":[{"coveredLines":0,"lineCoverage":0,"lineNumber":38,"executionCount":0,"name":"-[VLCStreamSession init]","executableLines":7},{"coveredLines":0,"lineCoverage":0,"lineNumber":47,"executionCount":0,"name":"-[VLCStreamSession dealloc]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":52,"executionCount":0,"name":"+[VLCStreamSession streamSession]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":58,"executionCount":0,"name":"-[VLCStreamSession startStreaming]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":64,"executionCount":0,"name":"-[VLCStreamSession stopStreaming]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":70,"executionCount":0,"name":"-[VLCStreamSession play]","executableLines":19},{"coveredLines":0,"lineCoverage":0,"lineNumber":91,"executionCount":0,"name":"+[VLCStreamSession keyPathsForValuesAffectingDescription]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":96,"executionCount":0,"name":"-[VLCStreamSession description]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":107,"executionCount":0,"name":"+[VLCStreamSession keyPathsForValuesAffectingEncounteredError]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":112,"executionCount":0,"name":"-[VLCStreamSession encounteredError]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":117,"executionCount":0,"name":"-[VLCStreamSession observeValueForKeyPath:ofObject:change:context:]","executableLines":24}],"name":"VLCStreamSession.m","executableLines":82},{"coveredLines":0,"lineCoverage":0,"path":"\/Users\/mikechoi\/src\/vlckit\/Sources\/VLCTime.m","functions":[{"coveredLines":0,"lineCoverage":0,"lineNumber":31,"executionCount":0,"name":"+[VLCTime nullTime]","executableLines":8},{"coveredLines":0,"lineCoverage":0,"lineNumber":34,"executionCount":0,"name":"__19+[VLCTime nullTime]_block_invoke","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":41,"executionCount":0,"name":"+[VLCTime timeWithNumber:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":46,"executionCount":0,"name":"+[VLCTime timeWithInt:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":52,"executionCount":0,"name":"-[VLCTime initWithNumber:]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":60,"executionCount":0,"name":"-[VLCTime initWithInt:]","executableLines":7},{"coveredLines":0,"lineCoverage":0,"lineNumber":70,"executionCount":0,"name":"-[VLCTime description]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":75,"executionCount":0,"name":"-[VLCTime numberValue]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":80,"executionCount":0,"name":"-[VLCTime stringValue]","executableLines":25},{"coveredLines":0,"lineCoverage":0,"lineNumber":107,"executionCount":0,"name":"-[VLCTime verboseStringValue]","executableLines":20},{"coveredLines":0,"lineCoverage":0,"lineNumber":129,"executionCount":0,"name":"-[VLCTime minuteStringValue]","executableLines":8},{"coveredLines":0,"lineCoverage":0,"lineNumber":139,"executionCount":0,"name":"-[VLCTime intValue]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":144,"executionCount":0,"name":"-[VLCTime compare:]","executableLines":8},{"coveredLines":0,"lineCoverage":0,"lineNumber":154,"executionCount":0,"name":"-[VLCTime isEqual:]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":162,"executionCount":0,"name":"-[VLCTime hash]","executableLines":3}],"name":"VLCTime.m","executableLines":109},{"coveredLines":0,"lineCoverage":0,"path":"\/Users\/mikechoi\/src\/vlckit\/Sources\/VLCVideoCommon.m","functions":[{"coveredLines":0,"lineCoverage":0,"lineNumber":36,"executionCount":0,"name":"+[VLCVideoLayoutManager layoutManager]","executableLines":8},{"coveredLines":0,"lineCoverage":0,"lineNumber":39,"executionCount":0,"name":"__38+[VLCVideoLayoutManager layoutManager]_block_invoke","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":47,"executionCount":0,"name":"-[VLCVideoLayoutManager layoutSublayersOfLayer:]","executableLines":22}],"name":"VLCVideoCommon.m","executableLines":33},{"coveredLines":0,"lineCoverage":0,"path":"\/Users\/mikechoi\/src\/vlckit\/Sources\/VLCVideoLayer.m","functions":[{"coveredLines":0,"lineCoverage":0,"lineNumber":59,"executionCount":0,"name":"-[VLCVideoLayer fillScreen]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":64,"executionCount":0,"name":"-[VLCVideoLayer setFillScreen:]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":77,"executionCount":0,"name":"-[VLCVideoLayer addVoutLayer:]","executableLines":19},{"coveredLines":0,"lineCoverage":0,"lineNumber":98,"executionCount":0,"name":"-[VLCVideoLayer removeVoutLayer:]","executableLines":10}],"name":"VLCVideoLayer.m","executableLines":36},{"coveredLines":0,"lineCoverage":0,"path":"\/Users\/mikechoi\/src\/vlckit\/Sources\/VLCVideoView.m","functions":[{"coveredLines":0,"lineCoverage":0,"lineNumber":72,"executionCount":0,"name":"-[VLCVideoView initWithFrame:]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":84,"executionCount":0,"name":"-[VLCVideoView drawRect:]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":92,"executionCount":0,"name":"-[VLCVideoView isOpaque]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":97,"executionCount":0,"name":"-[VLCVideoView fillScreen]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":102,"executionCount":0,"name":"-[VLCVideoView setFillScreen:]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":115,"executionCount":0,"name":"-[VLCVideoView addVoutLayer:]","executableLines":17},{"coveredLines":0,"lineCoverage":0,"lineNumber":134,"executionCount":0,"name":"-[VLCVideoView removeVoutLayer:]","executableLines":7}],"name":"VLCVideoView.m","executableLines":49}],"name":"VLCKit.framework","executableLines":3890,"buildProductPath":"\/Users\/mikechoi\/src\/vlckit\/DerivedData\/VLCKitTests\/Build\/Products\/Debug\/VLCKit.framework\/Versions\/A\/VLCKit"}],"executableLines":3905}
Binary file
data/bin/xcperfect ADDED
@@ -0,0 +1,80 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ if RUBY_VERSION < '2.0.0'
4
+ abort 'error: XCPerfect requires Ruby 2.0.0 or higher.'
5
+ end
6
+
7
+ if $PROGRAM_NAME == __FILE__
8
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
9
+ end
10
+
11
+ require 'xcperfect'
12
+ require 'optparse'
13
+ require 'json'
14
+
15
+ coverage_file_name = ''
16
+ coverage_targets = []
17
+
18
+ printer_options = {
19
+ ascii: false,
20
+ colorize: STDOUT.tty?,
21
+ formatter: XCPerfect::All
22
+ }
23
+
24
+ OptionParser.new do |opts|
25
+ opts.banner = 'Usage: xcrun xccov --json [options] | xcperfect'
26
+
27
+ opts.on('-a', '--all', 'Show all code coverage information (Default)') do
28
+ printer_options[:formatter] = XCPerfect::All
29
+ end
30
+
31
+ opts.on('-s', '--simple', 'Simplify coverage output') do
32
+ printer_options[:formatter] = XCPerfect::Simple
33
+ end
34
+
35
+ opts.on('--[no-]color', 'Toggle colorized output. Default depends on your terminal') do |value|
36
+ printer_options[:colorize] = value
37
+ end
38
+
39
+ opts.on('--ascii', 'Use characters in output. Default is false') do |value|
40
+ printer_options[:ascii] = value
41
+ end
42
+
43
+ opts.on('-t', '--targets x,y', Array, 'Select targets to display code coverage data') do |targets|
44
+ coverage_targets = targets
45
+ end
46
+
47
+ opts.on('-f', '--file FILENAME', 'Path to xccov generated json file') do |fname|
48
+ coverage_file_name = fname
49
+ end
50
+
51
+ opts.on_tail('-h', '--help', 'Show this help message') do
52
+ puts opts
53
+ exit
54
+ end
55
+
56
+ opts.on_tail('-v', '--version', 'Show xcperfect version') do
57
+ puts XCPerfect::VERSION
58
+ exit
59
+ end
60
+
61
+ opts.parse!
62
+ end
63
+
64
+ json = nil
65
+
66
+ if coverage_file_name. == ''
67
+ json = JSON.parse(STDIN.gets)
68
+ else
69
+ lines = File.readlines(coverage_file_name)
70
+ if lines.length == 1
71
+ json = JSON.parse(lines[0])
72
+ else
73
+ exit
74
+ end
75
+ end
76
+
77
+ json['name'] = 'Total coverage'
78
+
79
+ printer = XCPerfect::Printer.new(printer_options, json)
80
+ printer.pretty_print(coverage_targets)
@@ -0,0 +1,72 @@
1
+ module XCPerfect
2
+ # ANSI applies color & style to the output to make it
3
+ # look more appealing to the eye
4
+ module ANSI
5
+ attr_accessor :colorize
6
+
7
+ FORMATTED_MATCHER = %r{\e\[(\d+)[;]?(\d+)?m(.*)\e\[0m}
8
+
9
+ EFFECT = {
10
+ reset: '0',
11
+ bold: '1',
12
+ underline: '4'
13
+ }.freeze
14
+
15
+ COLORS = {
16
+ black: '30',
17
+ red: '31',
18
+ green: '32',
19
+ yellow: '33',
20
+ blue: '34',
21
+ cyan: '36',
22
+ white: '37',
23
+ plain: '39'
24
+ }.freeze
25
+
26
+ def colorize?
27
+ !!@colorize
28
+ end
29
+
30
+ def white(text)
31
+ ansi_parse(text, :plain, :bold)
32
+ end
33
+
34
+ def red(text)
35
+ ansi_parse(text, :red)
36
+ end
37
+
38
+ def green(text)
39
+ ansi_parse(text, :green, :bold)
40
+ end
41
+
42
+ def cyan(text)
43
+ ansi_parse(text, :cyan)
44
+ end
45
+
46
+ def yellow(text)
47
+ ansi_parse(text, :yellow)
48
+ end
49
+
50
+ def applied_effects(text)
51
+ effects = []
52
+ if text =~ FORMATTED_MATCHER
53
+ colors = COLORS.invert[$1]
54
+ effect = EFFECT.invert[$2]
55
+ effects << colors if colors
56
+ effects << effect if effect
57
+ end
58
+ effects
59
+ end
60
+
61
+ def strip(text)
62
+ text =~ FORMATTED_MATCHER ? $3 : text
63
+ end
64
+
65
+ def ansi_parse(text, color, effect=nil)
66
+ return text unless colorize?
67
+ colors_code = COLORS[color] || ''
68
+ effect_code = EFFECT[effect] ? ';' + EFFECT[effect] : ''
69
+ "\e[#{colors_code}#{effect_code}m#{text}\e[#{EFFECT[:reset]}m"
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,39 @@
1
+ module XCPerfect
2
+ # All prints all code coverage information provided by xccov
3
+ class All < Formatter
4
+ DOWN = '▼'.freeze
5
+ DOWN_ASCII = '->'.freeze
6
+
7
+ def pretty_name(target)
8
+ symbol = yellow(@use_ascii ? DOWN_ASCII : DOWN)
9
+ [symbol, white(target['name'])].join(' ')
10
+ end
11
+
12
+ def pretty_functions(file)
13
+ file['functions'].map do |function|
14
+ filename = file['name']
15
+ signature, covered, total, percentage = pretty_coverage_info(function)
16
+ line_stat = [covered, total].join(' / ').ljust(10)
17
+ stats = [line_stat, percentage].join("\t\t")
18
+ highlighted = Syntax.highlight(filename, signature)
19
+ delta = highlighted.length - signature.length
20
+ fill_size = (@terminal_width / 1.5) + delta
21
+ "\t\t" + [highlighted.ljust(fill_size), stats].join(' ')
22
+ end
23
+ end
24
+
25
+ def pretty_files(target)
26
+ target['files'].map do |file|
27
+ name = "\t" + pretty_name(file)
28
+ function = pretty_functions(file)
29
+ [name, function]
30
+ end.join("\n")
31
+ end
32
+
33
+ def pretty_format(desirables)
34
+ @parser.extract_targets(desirables).map do |target|
35
+ [pretty_name(target), pretty_files(target)]
36
+ end.join("\n")
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,65 @@
1
+ require 'xcperfect/ansi'
2
+ require 'xcperfect/parser'
3
+
4
+ module XCPerfect
5
+ # Formatter is the base adopted by `all.rb` and `simple.rb`
6
+ class Formatter
7
+ include ANSI
8
+
9
+ attr_reader :parser
10
+
11
+ def initialize(use_ascii, colorize, json)
12
+ @use_ascii = use_ascii
13
+ @colorize = colorize
14
+ @parser = Parser.new(json)
15
+ @terminal_width = Integer(`tput cols`)
16
+ end
17
+
18
+ def pretty_format(___)
19
+ puts @json
20
+ end
21
+
22
+ def color_percentage(percentage)
23
+ percent_str = percentage.to_s + ' %'
24
+
25
+ case percentage.round
26
+ when 0..33
27
+ red(percent_str)
28
+ when 33...66
29
+ orange(percent_str)
30
+ when 66..100
31
+ green(percent_str)
32
+ else
33
+ raise "Percentage of #{percentage} % is not possible :("
34
+ end
35
+ end
36
+
37
+ def pretty_coverage_info(target)
38
+ name, covered, total, percentage = @parser.extract_coverage_info(target)
39
+ [name, covered.to_s, total.to_s, color_percentage(percentage)]
40
+ end
41
+
42
+ def align_formats(arrays)
43
+ column_sizes = arrays.map(&:length)
44
+ common_column_size = column_sizes[0]
45
+ if column_sizes.to_set.length != 1
46
+ puts column_sizes
47
+ raise 'All rows must have same number of columns to be aligned'
48
+ end
49
+
50
+ (0...common_column_size).map do |column|
51
+ width = arrays.map { |row| strip(row[column]).length }.max
52
+ (width * 1.5).round
53
+ end
54
+ end
55
+
56
+ def align(arrays)
57
+ widths = align_formats(arrays)
58
+ arrays.map do |row|
59
+ row.each_with_index.map do |column, idx|
60
+ column.ljust(widths[idx])
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,26 @@
1
+ module XCPerfect
2
+ # Simple just prints the following information
3
+ # - Target Name
4
+ # - Number of lines hit
5
+ # - Total number of lines
6
+ # - Coverage percentage
7
+ class Simple < Formatter
8
+ def pretty_format(desirables)
9
+ output = [['Target', 'Covered', 'Out of', 'Percentage']]
10
+
11
+ @parser.extract_targets(desirables).each do |target|
12
+ output << pretty_coverage_info(target)
13
+ end
14
+ output << pretty_coverage_info(@parser.json)
15
+
16
+ rows = align(output)
17
+ sentences = rows.map { |row| row.join(' ') }
18
+
19
+ divider = '-' * sentences[0].length
20
+ sentences[0] = white(sentences[0])
21
+
22
+ sentences.insert(1, divider)
23
+ sentences.insert(sentences.length - 1, divider).join("\n")
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,53 @@
1
+ module XCPerfect
2
+ # Parser is used by `Formatter`s to extract information from the
3
+ # JSON file generated by xccov
4
+ class Parser
5
+ KEY_TARGETS = 'targets'.freeze
6
+ KEY_EXECUTABLE_LINES = 'executableLines'.freeze
7
+ KEY_COVERED_LINES = 'coveredLines'.freeze
8
+
9
+ attr_accessor :json
10
+
11
+ def initialize(json)
12
+ @json = json
13
+ end
14
+
15
+ def all_targets
16
+ @json[KEY_TARGETS]
17
+ end
18
+
19
+ def extract_targets(desirables)
20
+ if desirables.length.zero?
21
+ all_targets
22
+ else
23
+ all_targets.select do |target_info|
24
+ pure_name = target_info['name'].split('.')
25
+ pure_name.pop(1)
26
+ pure_name = pure_name.join('.')
27
+ desirables.include?(pure_name)
28
+ end
29
+ end
30
+ end
31
+
32
+ def extract_coverage_info(target)
33
+ [
34
+ target['name'],
35
+ covered_line_num(target),
36
+ total_line_num(target),
37
+ coverage_percentage(target)
38
+ ]
39
+ end
40
+
41
+ def coverage_percentage(target)
42
+ (target['lineCoverage'] * 100).round(2)
43
+ end
44
+
45
+ def covered_line_num(target)
46
+ target['coveredLines']
47
+ end
48
+
49
+ def total_line_num(target)
50
+ target['executableLines']
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,20 @@
1
+ require 'xcperfect/ansi'
2
+
3
+ module XCPerfect
4
+ # Printer handles the initialization of the output formatter
5
+ # and is directly called by the main `xcperfect` file during execution
6
+ class Printer
7
+ attr_reader :formatter
8
+
9
+ def initialize(params, json)
10
+ klass = params[:formatter]
11
+ @formatter = klass.new(params[:ascii], params[:colorize], json)
12
+ end
13
+
14
+ def pretty_print(targets)
15
+ formatted_text = formatter.pretty_format(targets)
16
+ STDOUT.print(formatted_text + "\n")
17
+ STDOUT.flush
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,51 @@
1
+ # Credit to xcpretty
2
+ # https://github.com/supermarin/xcpretty/blob/a770f152903f4eb672f5bae0a7fa6ecc4e35b397/lib/xcpretty/syntax.rb
3
+
4
+ begin
5
+ require 'rouge'
6
+ rescue LoadError
7
+ # rubocop:disable Style/ConstantName
8
+ Rouge = nil
9
+ # rubocop:enable Style/ConstantName
10
+ end
11
+
12
+ require 'xcpretty/snippet'
13
+
14
+ module XCPerfect
15
+ # Syntax highlights the function signatures displayed to the user
16
+ # while using the `all.rb` formatter
17
+ module Syntax
18
+ def self.highlight(filename, line)
19
+ return signature unless Rouge
20
+ highlight_with_formatter(filename, line, Rouge::Formatters::Terminal256.new)
21
+ end
22
+
23
+ def self.highlight_with_formatter(filename, line, formatter)
24
+ lexer = find_lexer(filename, line)
25
+ if lexer
26
+ formatter.format(lexer.lex(line)).rstrip
27
+ else
28
+ line
29
+ end
30
+ end
31
+
32
+ # @param [String] filename The filename
33
+ # @param String line of code to be highlighted
34
+ # @return [Rouge::Lexer]
35
+ def self.find_lexer(filename, line)
36
+ case File.extname(filename)
37
+ when '.cpp', '.cc', '.c++', '.cxx', '.hpp', '.h++', '.hxx'
38
+ Rouge::Lexers::Cpp
39
+ when '.m', '.h' then Rouge::Lexers::ObjectiveC
40
+ when '.swift' then Rouge::Lexers::Swift
41
+ when '.ruby', '.rb' then Rouge::Lexers::Ruby
42
+ else
43
+ options = {
44
+ filename: File.basename(filename),
45
+ source: line
46
+ }
47
+ Rouge::Lexer.guesses(options).first
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,5 @@
1
+ # VERSION is used in the `Gemfile`, and when displaying the
2
+ # version to the user via `xcperfect -v`
3
+ module XCPerfect
4
+ VERSION = '0.0.1'.freeze
5
+ end
data/lib/xcperfect.rb ADDED
@@ -0,0 +1,15 @@
1
+ require 'xcperfect/version'
2
+ require 'xcperfect/printer'
3
+ require 'xcperfect/parser'
4
+ require 'xcperfect/syntax'
5
+ require 'xcperfect/formatters/formatter'
6
+ require 'xcperfect/formatters/all'
7
+ require 'xcperfect/formatters/simple'
8
+
9
+ # XCPerfect contains class level functions
10
+ module XCPerfect
11
+ def self.exit_with_error(message)
12
+ $stderr.puts "[!] #{message}"
13
+ exit 1
14
+ end
15
+ end
data/xcperfect.gemspec ADDED
@@ -0,0 +1,30 @@
1
+ lib = File.expand_path('../lib', __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require 'xcperfect/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'xcperfect'
7
+ spec.version = XCPerfect::VERSION
8
+ spec.authors = ['Mike JS. Choi']
9
+ spec.email = ['mkchoi212@icloud.com']
10
+ spec.required_ruby_version = '>= 2.0.0'
11
+ spec.description =
12
+ %q{
13
+ Formatter for Apple's xccov json output because who doesn't
14
+ like pretty outputs? Am I rite?
15
+ }
16
+ spec.summary = %q(Make your xccov outputs prettier)
17
+ spec.homepage = 'https://github.com/mkchoi212/xcperfect'
18
+ spec.license = 'MIT'
19
+
20
+ spec.files = `git ls-files`.split($/)
21
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
22
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
23
+ spec.require_paths = ['lib']
24
+
25
+ spec.add_dependency 'rouge', '~> 2.0.7'
26
+
27
+ spec.add_development_dependency 'bundler', '~> 1.3'
28
+ spec.add_development_dependency 'rake'
29
+ spec.add_development_dependency 'rubocop', '~> 0.49.0'
30
+ end
metadata ADDED
@@ -0,0 +1,124 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: xcperfect
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Mike JS. Choi
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-06-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rouge
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 2.0.7
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 2.0.7
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.3'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.3'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubocop
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.49.0
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.49.0
69
+ description: "\n Formatter for Apple's xccov json output because who doesn't\n
70
+ \ like pretty outputs? Am I rite?\n "
71
+ email:
72
+ - mkchoi212@icloud.com
73
+ executables:
74
+ - xcperfect
75
+ extensions: []
76
+ extra_rdoc_files: []
77
+ files:
78
+ - ".gitignore"
79
+ - ".rubocop.yml"
80
+ - ".travis.yml"
81
+ - Gemfile
82
+ - LICENSE.md
83
+ - README.md
84
+ - Rakefile
85
+ - assets/banner.png
86
+ - assets/banner.sketch
87
+ - assets/coverage.json
88
+ - assets/simple_formatter.png
89
+ - bin/xcperfect
90
+ - lib/xcperfect.rb
91
+ - lib/xcperfect/ansi.rb
92
+ - lib/xcperfect/formatters/all.rb
93
+ - lib/xcperfect/formatters/formatter.rb
94
+ - lib/xcperfect/formatters/simple.rb
95
+ - lib/xcperfect/parser.rb
96
+ - lib/xcperfect/printer.rb
97
+ - lib/xcperfect/syntax.rb
98
+ - lib/xcperfect/version.rb
99
+ - xcperfect.gemspec
100
+ homepage: https://github.com/mkchoi212/xcperfect
101
+ licenses:
102
+ - MIT
103
+ metadata: {}
104
+ post_install_message:
105
+ rdoc_options: []
106
+ require_paths:
107
+ - lib
108
+ required_ruby_version: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - ">="
111
+ - !ruby/object:Gem::Version
112
+ version: 2.0.0
113
+ required_rubygems_version: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ requirements: []
119
+ rubyforge_project:
120
+ rubygems_version: 2.5.2
121
+ signing_key:
122
+ specification_version: 4
123
+ summary: Make your xccov outputs prettier
124
+ test_files: []