depcheck 0.2.0 → 0.3.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 46d4480b1f29047d2da3b5df66388319bc39c0c5
4
- data.tar.gz: 94b75c5b49164cf35818e74cfc2466f01bb88be3
3
+ metadata.gz: 6863c929258f574dcb55d2cf52c2a20ced2d5df0
4
+ data.tar.gz: c995b0f2409be6b1b1c4e8377bb9430f4c29625e
5
5
  SHA512:
6
- metadata.gz: c184b21af1c41f81e998eb3673f147271718f73de9cb29ad79b4bcb2a5fe1ac97a470acb0c17dffc54c098c6ad4d932c85fc710271d924ceb45db98c81d27ff0
7
- data.tar.gz: 013d9eec20b9708ab45c505a3dcc4f3ecd96cef718d3e0235cc0ce0980acd9adebb0263d358ea562987dda62d55b8715f85db6deb68d93ff482cf8952f4d1345
6
+ metadata.gz: c07d8d12f4e96f1cf579685fc2af5c24b675ddc20424aceb103f6a6945e69c0f666bd7ba85689ff97b74a9589ff2dcaea96b078f620cbfc1ed850a18661dda85
7
+ data.tar.gz: 2a4e6d5a2c27a5e7d8666d0fd9f1f83890bb760aa2a4e7a8036e3228b1d771e596c5e880b409e13dc4eee873eaf74c2c49443833f74070f22b38ecf7d993929f
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- depcheck (0.1.0)
4
+ depcheck (0.3.0)
5
5
  clamp (~> 0.6)
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -1,8 +1,10 @@
1
1
  # Depcheck
2
2
 
3
- `Depcheck` is a dependency analyzer tool for Swift projects. `Depcheck` reports dependencies per class, allowing you to easily detect classes that have too many dependencies. `Depcheck` can also report how many dependants a class have. Therefore you can spot the most used and unused classes.
3
+ `Depcheck` is a dependency analyzer tool for Swift projects. `Depcheck` reports dependencies per class, allowing you to easily detect classes that have too many dependencies. `Depcheck` can also report how many dependants a class have. Therefore you can spot the most used and unused classes. Additionaly you can generate *dependency graph* of your project.
4
4
 
5
- <img src="https://github.com/wojteklu/depcheck/blob/master/example/analyze.png?raw=true">
5
+ <img src="https://github.com/wojteklu/depcheck/blob/master/example/analyze.png?raw=true" width="600px">
6
+
7
+ <img src="https://github.com/wojteklu/depcheck/blob/master/example/graph.png?raw=true" height="360px">
6
8
 
7
9
  ## Installation
8
10
 
@@ -26,7 +28,7 @@ gem install depcheck
26
28
 
27
29
  ## Usage
28
30
 
29
- `Analyze` command reports dependencies per classes. `Usage` command reports how many dependants a class have.
31
+ `Analyze` command reports dependencies per classes. `Usage` command reports how many dependants a class have. `Graph` command generates dependency graph.
30
32
 
31
33
  Build your project, and then run:
32
34
 
@@ -45,6 +47,10 @@ $ depcheck analyze --workspace path/to/workspace.xcworkspace --scheme YourXcodeS
45
47
 
46
48
  I’d love to see your ideas for improving this library! The best way to contribute is by submitting a pull request. I’ll do my best to respond to your patch as soon as possible. You can also submit a [new GitHub issue](https://github.com/wojteklu/depcheck/issues/new) if you find bugs or have questions.
47
49
 
50
+ ## Author
51
+
52
+ Wojtek Lukaszuk [@wojteklu](http://twitter.com/wojteklu)
53
+
48
54
  ## License
49
55
 
50
56
  This project is licensed under the terms of the MIT license. See the LICENSE file.
@@ -4,12 +4,14 @@ require 'yaml'
4
4
  require_relative '../lib/depcheck'
5
5
  require_relative '../lib/depcheck/command/analyze_command'
6
6
  require_relative '../lib/depcheck/command/usage_command'
7
+ require_relative '../lib/depcheck/command/graph_command'
7
8
  require_relative '../lib/depcheck/command/version_command'
8
9
 
9
10
  class MainCommand < Clamp::Command
10
11
 
11
12
  subcommand 'analyze', 'Reports dependencies per class', AnalyzeCommand
12
13
  subcommand 'usage', 'Reports how many dependants a class have', UsageCommand
14
+ subcommand 'graph', 'Generates dependency graph', GraphCommand
13
15
  subcommand 'version', 'Prints depcheck version', VersionCommand
14
16
  end
15
17
 
@@ -119,6 +119,7 @@
119
119
  TargetAttributes = {
120
120
  2E845E151D638EFE0040B44C = {
121
121
  CreatedOnToolsVersion = 7.3.1;
122
+ LastSwiftMigration = 0800;
122
123
  };
123
124
  };
124
125
  };
@@ -283,6 +284,7 @@
283
284
  LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
284
285
  PRODUCT_BUNDLE_IDENTIFIER = com.depcheck.Example;
285
286
  PRODUCT_NAME = "$(TARGET_NAME)";
287
+ SWIFT_VERSION = 3.0;
286
288
  };
287
289
  name = Debug;
288
290
  };
@@ -294,6 +296,7 @@
294
296
  LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
295
297
  PRODUCT_BUNDLE_IDENTIFIER = com.depcheck.Example;
296
298
  PRODUCT_NAME = "$(TARGET_NAME)";
299
+ SWIFT_VERSION = 3.0;
297
300
  };
298
301
  name = Release;
299
302
  };
@@ -316,6 +319,7 @@
316
319
  2E845E2A1D638EFE0040B44C /* Release */,
317
320
  );
318
321
  defaultConfigurationIsVisible = 0;
322
+ defaultConfigurationName = Release;
319
323
  };
320
324
  /* End XCConfigurationList section */
321
325
  };
@@ -12,7 +12,7 @@ class ViewController: UIViewController {
12
12
  var model1: Model1!
13
13
  var model2: Model2!
14
14
 
15
- private func test() {
15
+ fileprivate func test() {
16
16
  _ = Model3()
17
17
  _ = Model4()
18
18
  }
Binary file
@@ -2,6 +2,7 @@ require 'depcheck/finder'
2
2
  require 'depcheck/analyzer'
3
3
  require 'depcheck/dependency_info'
4
4
  require 'depcheck/output/simple_output'
5
+ require 'depcheck/output/graph_output'
5
6
 
6
7
  module Depcheck
7
8
  Encoding.default_external = 'utf-8'
@@ -1,9 +1,9 @@
1
1
  require 'yaml'
2
2
 
3
3
  module Depcheck
4
- module Analyzer
4
+ class Analyzer
5
5
 
6
- def self.generate_dependencies(swiftdeps)
6
+ def generate_dependencies(swiftdeps)
7
7
  results = []
8
8
  usage = {}
9
9
 
@@ -45,15 +45,20 @@ module Depcheck
45
45
  results
46
46
  end
47
47
 
48
- def self.valid_dep?(dep)
49
- !dep.nil? && !/^(<\s)?\w/.match(dep).nil? && !keyword?(dep) && /^(CA|CF|CG|CI|CL|kCA|NS|UI)/.match(dep).nil?
48
+ def valid_dep?(dep)
49
+ !dep.nil? && !/^(<\s)?\w/.match(dep).nil? && !keyword?(dep) && !framework?(dep)
50
50
  end
51
- private_class_method :valid_dep?
51
+ private :valid_dep?
52
52
 
53
- def self.keyword?(dep)
53
+ def framework?(dep)
54
+ /^(CA|CF|CG|CI|CL|kCA|NS|UI)/.match(dep) != nil
55
+ end
56
+ private :framework?
57
+
58
+ def keyword?(dep)
54
59
  /^(Any|AnyBidirectionalCollection|AnyBidirectionalIndex|AnyClass|AnyForwardCollection|AnyForwardIndex|AnyObject|AnyRandomAccessCollection|AnyRandomAccessIndex|AnySequence|Array|ArraySlice|AutoreleasingUnsafeMutablePointer|BOOL|Bool|BooleanLiteralType|CBool|CChar|CChar16|CChar32|CDouble|CFloat|CInt|CLong|CLongLong|COpaquePointer|CShort|CSignedChar|CUnsignedChar|CUnsignedInt|CUnsignedLong|CUnsignedLongLong|CUnsignedShort|CVaListPointer|CWideChar|Character|ClosedInterval|ClusterType|CollectionOfOne|ContiguousArray|DISPATCH_|Dictionary|DictionaryGenerator|DictionaryIndex|DictionaryLiteral|Double|EmptyGenerator|EnumerateGenerator|EnumerateSequence|ExtendedGraphemeClusterType|FlattenBidirectionalCollection|FlattenBidirectionalCollectionIndex|FlattenCollectionIndex|FlattenSequence|Float|Float32|Float64|FloatLiteralType|GeneratorSequence|HalfOpenInterval|IndexingGenerator|Int|Int16|Int32|Int64|Int8|IntMax|IntegerLiteralType|JoinGenerator|JoinSequence|LazyCollection|LazyFilterCollection|LazyFilterGenerator|LazyFilterIndex|LazyFilterSequence|LazyMapCollection|LazyMapGenerator|LazyMapSequence|LazySequence|LiteralType|ManagedBufferPointer|Mirror|MutableSlice|ObjectIdentifier|Optional|PermutationGenerator|Range|RangeGenerator|RawByte|Repeat|ReverseCollection|ReverseIndex|ReverseRandomAccessCollection|ReverseRandomAccessIndex|ScalarType|Set|SetGenerator|SetIndex|Slice|StaticString|StrideThrough|StrideThroughGenerator|StrideTo|StrideToGenerator|String|String.CharacterView|String.CharacterView.Index|String.UTF16View|String.UTF16View.Index|String.UTF8View|String.UTF8View.Index|String.UnicodeScalarView|String.UnicodeScalarView.Generator|String.UnicodeScalarView.Index|StringLiteralType|UInt|UInt16|UInt32|UInt64|UInt8|UIntMax|UTF16|UTF32|UTF8|UnicodeScalar|UnicodeScalarType|Unmanaged|UnsafeBufferPointer|UnsafeBufferPointerGenerator|UnsafeMutableBufferPointer|UnsafeMutablePointer|UnsafePointer|Void|Zip2Generator|Zip2Sequence|abs|alignof|alignofValue|anyGenerator|anyGenerator|assert|assertionFailure|debugPrint|debugPrint|dispatch_|dump|dump|fatalError|getVaList|isUniquelyReferenced|isUniquelyReferencedNonObjC|isUniquelyReferencedNonObjC|max|max|min|min|numericCast|numericCast|numericCast|numericCast|precondition|preconditionFailure|print|print|readLine|sizeof|sizeofValue|strideof|strideofValue|swap|transcode|unsafeAddressOf|unsafeBitCast|unsafeDowncast|unsafeUnwrap|withExtendedLifetime|withExtendedLifetime|withUnsafeMutablePointer|withUnsafeMutablePointers|withUnsafeMutablePointers|withUnsafePointer|withUnsafePointers|withUnsafePointers|withVaList|withVaList|zip)$/.match(dep) != nil
55
60
  end
56
- private_class_method :keyword?
61
+ private :keyword?
57
62
 
58
63
  end
59
64
  end
@@ -11,7 +11,8 @@ class AnalyzeCommand < Clamp::Command
11
11
  end
12
12
 
13
13
  swiftdeps = Depcheck::Finder.find_swiftdeps(project, workspace, scheme)
14
- results = Depcheck::Analyzer.generate_dependencies(swiftdeps)
14
+ analyzer = Depcheck::Analyzer.new
15
+ results = analyzer.generate_dependencies(swiftdeps)
15
16
  Depcheck::SimpleOutput.post(results, verbose?)
16
17
  end
17
18
 
@@ -0,0 +1,19 @@
1
+ class GraphCommand < Clamp::Command
2
+ option ['--project'], 'PROJECT', 'Path to the xcodeproj'
3
+ option ['--scheme'], 'SCHEME', 'The scheme that the project was built in'
4
+ option ['--workspace'], 'WORKSPACE', 'Path to the workspace'
5
+
6
+ def execute
7
+
8
+ unless project || (workspace && scheme)
9
+ raise StandardError, 'Must provide project path or workspace path with scheme.'
10
+ end
11
+
12
+ swiftdeps = Depcheck::Finder.find_swiftdeps(project, workspace, scheme)
13
+ analyzer = Depcheck::Analyzer.new
14
+ results = analyzer.generate_dependencies(swiftdeps)
15
+ output = Depcheck::GraphOutput.new
16
+ output.post(results)
17
+ end
18
+
19
+ end
@@ -10,7 +10,8 @@ class UsageCommand < Clamp::Command
10
10
  end
11
11
 
12
12
  swiftdeps = Depcheck::Finder.find_swiftdeps(project, workspace, scheme)
13
- results = Depcheck::Analyzer.generate_dependencies(swiftdeps)
13
+ analyzer = Depcheck::Analyzer.new
14
+ results = analyzer.generate_dependencies(swiftdeps)
14
15
  Depcheck::SimpleOutput.post_usage(results)
15
16
  end
16
17
 
@@ -0,0 +1,54 @@
1
+ module Depcheck
2
+ class GraphOutput
3
+
4
+ def post(objs)
5
+
6
+ # installs graphviz if needed
7
+ system 'brew install graphviz' unless graphviz_installed?
8
+
9
+ # Check that this is in the user's PATH after installing
10
+ unless graphviz_installed?
11
+ fail "graphviz is not in the user's PATH, or it failed to install"
12
+ end
13
+
14
+ # generate graph description
15
+ graph = generate_graph_description(objs)
16
+
17
+ # create temporary graph dot file
18
+ file_name = 'graph'
19
+ File.open("#{file_name}.dot", 'w') do |f|
20
+ f.write(graph)
21
+ end
22
+
23
+ # run dot command
24
+ `dot -T png #{file_name}.dot > #{file_name}.png && open #{file_name}.png`
25
+
26
+ # remove temporary file
27
+ File.delete("#{file_name}.dot")
28
+ end
29
+
30
+ def generate_graph_description(objs)
31
+ nodes = []
32
+ objs.each do |obj|
33
+ obj.dependencies.each do |dep|
34
+ nodes << { source: obj.name, dep: dep }
35
+ end
36
+ end
37
+
38
+ desc = "digraph dependencies {\n node [fontname=monospace, fontsize=9, shape=box, style=rounded]\n"
39
+ nodes.each do |node|
40
+ desc += " \"#{node[:source]}\" -> \"#{node[:dep]}\"\n"
41
+ end
42
+ desc += "}\n"
43
+
44
+ desc
45
+ end
46
+ private :generate_graph_description
47
+
48
+ def graphviz_installed?
49
+ `which dot`.strip.empty? == false
50
+ end
51
+ private :graphviz_installed?
52
+
53
+ end
54
+ end
@@ -15,7 +15,7 @@ module Depcheck
15
15
  objs = objs.sort_by(&:usage).reverse
16
16
 
17
17
  objs.each_with_index do |obj, index|
18
- puts "#{index + 1}. #{obj.name} - #{obj.usage} \n"
18
+ puts "#{index + 1}. #{obj.name} - #{obj.usage}\n"
19
19
  end
20
20
  end
21
21
 
@@ -1,3 +1,3 @@
1
1
  module Depcheck
2
- VERSION = '0.2.0'.freeze
2
+ VERSION = '0.3.0'.freeze
3
3
  end
@@ -0,0 +1,54 @@
1
+ require File.expand_path('../spec_helper', __FILE__)
2
+
3
+ module Depcheck
4
+
5
+ describe Analyzer do
6
+ before :all do
7
+ Analyzer.send(:public, *Analyzer.private_instance_methods)
8
+ @analyzer = Analyzer.new
9
+ end
10
+
11
+ describe :generate_dependencies do
12
+
13
+ it 'generates dependencies for files' do
14
+ files = ["./spec/fixtures/Model1.swiftdeps", "./spec/fixtures/Model4.swiftdeps"]
15
+ results = @analyzer.generate_dependencies(files)
16
+
17
+ expect(results[0].name).to eq "Model1"
18
+ expect(results[0].usage).to eq 1
19
+ expect(results[0].dependencies.count).to eq 2
20
+
21
+ expect(results[1].name).to eq "Model4"
22
+ expect(results[1].usage).to eq 0
23
+ expect(results[1].dependencies.count).to eq 1
24
+ end
25
+
26
+ end
27
+
28
+ describe :valid_dep? do
29
+ before do
30
+ allow_any_instance_of(Analyzer).to receive(:keyword?).and_return(false)
31
+ allow_any_instance_of(Analyzer).to receive(:framework?).and_return(false)
32
+ end
33
+
34
+ it 'validates nil values' do
35
+ expect(@analyzer.valid_dep?(nil)).to eq false
36
+ end
37
+
38
+ it 'validates keywords values' do
39
+ allow_any_instance_of(Analyzer).to receive(:keyword?).and_return(true)
40
+ expect(@analyzer.valid_dep?("test")).to eq false
41
+ end
42
+
43
+ it 'validates non-alphanumeric values' do
44
+ expect(@analyzer.valid_dep?("*")).to eq false
45
+ end
46
+
47
+ it 'validates framework prefixes' do
48
+ allow_any_instance_of(Analyzer).to receive(:framework?).and_return(true)
49
+ expect(@analyzer.valid_dep?("test")).to eq false
50
+ end
51
+ end
52
+
53
+ end
54
+ end
@@ -0,0 +1,36 @@
1
+ require File.expand_path('../spec_helper', __FILE__)
2
+
3
+ module Depcheck
4
+
5
+ describe Finder do
6
+
7
+ describe :find_derived_data_path do
8
+ before do
9
+ allow(Finder).to receive(:`).and_return(" OBJROOT = D/D\n PROJECT_NAME = P\n TARGET_NAME = T")
10
+ end
11
+
12
+ it 'finds derived data path' do
13
+ expected = "D/D/P.build/**/T.build"
14
+ expect(Finder.find_derived_data_path("Test", nil, nil)).to eq expected
15
+ end
16
+ end
17
+
18
+ describe :find_swiftdeps do
19
+ before do
20
+ allow(Finder).to receive(:find_derived_data_path).and_return('')
21
+ end
22
+
23
+ it 'finds swiftdeps files' do
24
+ expected = 2.times.map(&:to_s)
25
+ allow(Dir).to receive(:glob).and_return(expected)
26
+ expect(Finder.find_swiftdeps("Test", nil, nil)).to eq expected
27
+ end
28
+
29
+ it 'raises error if files not found' do
30
+ allow(Dir).to receive(:glob).and_return([])
31
+ expect{Finder.find_swiftdeps("Test", nil, nil)}.to raise_error(StandardError)
32
+ end
33
+
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,39 @@
1
+ ### Swift dependencies file v0 ###
2
+ provides-top-level:
3
+ - "Model1"
4
+ provides-nominal:
5
+ - "V7Example6Model1"
6
+ provides-member:
7
+ - ["V7Example6Model1", ""]
8
+ provides-dynamic-lookup:
9
+ depends-top-level:
10
+ - "Model3"
11
+ - "Model1"
12
+ - "Model2"
13
+ depends-member:
14
+ - ["V7Example6Model1", "Model2"]
15
+ - ["V7Example6Model1", "Model3"]
16
+ - ["V7Example6Model1", "deinit"]
17
+ - ["V7Example6Model1", "init"]
18
+ - ["V7Example6Model1", "model2"]
19
+ - ["V7Example6Model1", "model3"]
20
+ - ["V7Example6Model2", "deinit"]
21
+ - ["V7Example6Model2", "init"]
22
+ - ["V7Example6Model3", "deinit"]
23
+ - ["V7Example6Model3", "init"]
24
+ depends-nominal:
25
+ - "V7Example6Model1"
26
+ - "V7Example6Model2"
27
+ - "V7Example6Model3"
28
+ depends-dynamic-lookup:
29
+ depends-external:
30
+ - "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphonesimulator/x86_64/Swift.swiftmodule"
31
+ - "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphonesimulator/x86_64/SwiftOnoneSupport.swiftmodule"
32
+ - "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphonesimulator/x86_64/Foundation.swiftmodule"
33
+ - "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphonesimulator/x86_64/Darwin.swiftmodule"
34
+ - "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphonesimulator/x86_64/Dispatch.swiftmodule"
35
+ - "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphonesimulator/x86_64/ObjectiveC.swiftmodule"
36
+ - "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphonesimulator/x86_64/CoreGraphics.swiftmodule"
37
+ - "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphonesimulator/x86_64/UIKit.swiftmodule"
38
+ - "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphonesimulator/x86_64/CoreImage.swiftmodule"
39
+ interface-hash: "b86f30e6f04586ded1dc6782a6a1fe20"
@@ -0,0 +1,33 @@
1
+ ### Swift dependencies file v0 ###
2
+ provides-top-level:
3
+ - "Model4"
4
+ provides-nominal:
5
+ - "V7Example6Model4"
6
+ provides-member:
7
+ - ["V7Example6Model4", ""]
8
+ provides-dynamic-lookup:
9
+ depends-top-level:
10
+ - "Model1"
11
+ - "Model4"
12
+ depends-member:
13
+ - ["V7Example6Model1", "deinit"]
14
+ - ["V7Example6Model1", "init"]
15
+ - ["V7Example6Model4", "Model1"]
16
+ - ["V7Example6Model4", "deinit"]
17
+ - ["V7Example6Model4", "init"]
18
+ - ["V7Example6Model4", "model1"]
19
+ depends-nominal:
20
+ - "V7Example6Model1"
21
+ - "V7Example6Model4"
22
+ depends-dynamic-lookup:
23
+ depends-external:
24
+ - "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphonesimulator/x86_64/Swift.swiftmodule"
25
+ - "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphonesimulator/x86_64/SwiftOnoneSupport.swiftmodule"
26
+ - "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphonesimulator/x86_64/Foundation.swiftmodule"
27
+ - "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphonesimulator/x86_64/Darwin.swiftmodule"
28
+ - "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphonesimulator/x86_64/Dispatch.swiftmodule"
29
+ - "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphonesimulator/x86_64/ObjectiveC.swiftmodule"
30
+ - "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphonesimulator/x86_64/CoreGraphics.swiftmodule"
31
+ - "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphonesimulator/x86_64/UIKit.swiftmodule"
32
+ - "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphonesimulator/x86_64/CoreImage.swiftmodule"
33
+ interface-hash: "2d408e7605c6767ff621c9e3e9ba913e"
@@ -0,0 +1,36 @@
1
+ require File.expand_path('../spec_helper', __FILE__)
2
+
3
+ module Depcheck
4
+
5
+ describe SimpleOutput do
6
+ before :all do
7
+ @dependencies = 3.times.map do |i|
8
+ dep = DependencyInfo.new("A#{i}", "B#{i}", i.times.map(&:to_s))
9
+ dep.usage = 3-i
10
+ dep
11
+ end
12
+ end
13
+
14
+ describe :post do
15
+
16
+ it 'outputs results sorted by dependencies count' do
17
+ expected = "1. A2 - 2\n2. A1 - 1\n3. A0 - 0\n"
18
+ expect { Depcheck::SimpleOutput.post(@dependencies, false)}.to output(expected).to_stdout
19
+ end
20
+
21
+ it 'outputs results with dependencies list' do
22
+ expected = "1. A2 - 2 - [0, 1]\n2. A1 - 1 - [0]\n3. A0 - 0 - []\n"
23
+ expect { Depcheck::SimpleOutput.post(@dependencies, true)}.to output(expected).to_stdout
24
+ end
25
+ end
26
+
27
+ describe :post_usage do
28
+
29
+ it 'outputs results sorted by usage count' do
30
+ expected = "1. A0 - 3\n2. A1 - 2\n3. A2 - 1\n"
31
+ expect { Depcheck::SimpleOutput.post_usage(@dependencies)}.to output(expected).to_stdout
32
+ end
33
+ end
34
+
35
+ end
36
+ end
@@ -0,0 +1,15 @@
1
+ require 'pathname'
2
+ ROOT = Pathname.new(File.expand_path('../../', __FILE__))
3
+ $LOAD_PATH.unshift((ROOT + 'lib').to_s)
4
+ $LOAD_PATH.unshift((ROOT + 'spec').to_s)
5
+
6
+ require 'bundler/setup'
7
+ require 'rspec'
8
+ require 'depcheck'
9
+
10
+ # Use coloured output, it's the best.
11
+ RSpec.configure do |config|
12
+ config.filter_gems_from_backtrace 'bundler'
13
+ config.color = true
14
+ config.tty = true
15
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: depcheck
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wojciech Lukaszuk
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-08-27 00:00:00.000000000 Z
11
+ date: 2016-10-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -99,16 +99,25 @@ files:
99
99
  - example/Example/Models/Model5.swift
100
100
  - example/Example/ViewController.swift
101
101
  - example/analyze.png
102
+ - example/graph.png
102
103
  - example/usage.png
103
104
  - lib/depcheck.rb
104
105
  - lib/depcheck/analyzer.rb
105
106
  - lib/depcheck/command/analyze_command.rb
107
+ - lib/depcheck/command/graph_command.rb
106
108
  - lib/depcheck/command/usage_command.rb
107
109
  - lib/depcheck/command/version_command.rb
108
110
  - lib/depcheck/dependency_info.rb
109
111
  - lib/depcheck/finder.rb
112
+ - lib/depcheck/output/graph_output.rb
110
113
  - lib/depcheck/output/simple_output.rb
111
114
  - lib/depcheck/version.rb
115
+ - spec/analyzer_spec.rb
116
+ - spec/finder_spec.rb
117
+ - spec/fixtures/Model1.swiftdeps
118
+ - spec/fixtures/Model4.swiftdeps
119
+ - spec/simple_output_spec.rb
120
+ - spec/spec_helper.rb
112
121
  homepage: https://github.com/wojteklu/depcheck
113
122
  licenses:
114
123
  - MIT
@@ -133,4 +142,10 @@ rubygems_version: 2.6.6
133
142
  signing_key:
134
143
  specification_version: 4
135
144
  summary: Dependency analyzer tool for Swift projects
136
- test_files: []
145
+ test_files:
146
+ - spec/analyzer_spec.rb
147
+ - spec/finder_spec.rb
148
+ - spec/fixtures/Model1.swiftdeps
149
+ - spec/fixtures/Model4.swiftdeps
150
+ - spec/simple_output_spec.rb
151
+ - spec/spec_helper.rb