pandan 0.0.1 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 900b67b6cb939c129f2bf77dc1a35c310eab06fc
4
- data.tar.gz: fe743a16dfd898ea146b60befdfd512b37075dc9
2
+ SHA256:
3
+ metadata.gz: 7b66ee52e54b7cbf16f22755a11fdf1110daa4e93f1f17ae55794473598a0eb6
4
+ data.tar.gz: 697195fe39a325e97f3e53eee46c534259b9b84cb8e95f1d67e64f27a55450ca
5
5
  SHA512:
6
- metadata.gz: b73adbbefe5cdca382ac34722e2fb1fb8b192e2f0892849744cb6bd2a32a67112bb924cc9ca9eb2f7aa79b9ad5a4964edf8d60ee1340fa4c29649a617bb43ec9
7
- data.tar.gz: fe7aaecc55f3e6794db2f5a3259dff4525653ec6f7720bcab6e6f700472ddda6067bdc0e675e5d313458eae0f3a6a184a3e5ba60668da273f458c35f9fe9d334
6
+ metadata.gz: ab5c1d84f32c646eecc1351762aa753896844291193002b0f67c2b0840c0c26e04320728df03538c1a6d49509af8b95b4006ff02e39452ec96d29ed66560c4be
7
+ data.tar.gz: c6bb1cf22ac485a24118700d71d0d883641a05844caf2dd8d47d54b2f5d7f0316c5cce987b93e5d8c874daafc528e678a2b3e63bc2e9b8a72a2322a718a602e1
@@ -1,12 +1,19 @@
1
- inherit_from: .rubocop_todo.yml
1
+ AllCops:
2
+ TargetRubyVersion: 2.5
2
3
 
3
4
  Metrics/LineLength:
4
5
  Max: 120
6
+
5
7
  Metrics/MethodLength:
6
8
  Max: 20
9
+
7
10
  Metrics/ModuleLength:
8
11
  Exclude:
9
12
  - "**/*_spec.rb"
13
+
10
14
  Metrics/BlockLength:
11
15
  Exclude:
12
16
  - "**/*_spec.rb"
17
+
18
+ Style/Documentation:
19
+ Enabled: false
@@ -0,0 +1 @@
1
+ ruby-2.5.1
@@ -0,0 +1,8 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.3.7
4
+ - 2.4.4
5
+ - 2.5.1
6
+ script:
7
+ - bundle exec rspec
8
+ - bundle exec rubocop
data/Gemfile CHANGED
@@ -1,8 +1,6 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
2
4
 
3
5
  # Specify your gem's dependencies in pandan.gemspec
4
6
  gemspec
5
-
6
- group :development do
7
- gem 'rubocop'
8
- end
data/README.md CHANGED
@@ -1,5 +1,8 @@
1
1
  # Pandan
2
2
 
3
+ [![Build Status](http://img.shields.io/travis/xing/pandan/master.svg?style=flat)](https://travis-ci.org/xing/pandan)
4
+ [![Gem Version](http://img.shields.io/gem/v/pandan.svg?style=flat)](http://badge.fury.io/rb/pandan)
5
+
3
6
  > Pandanus amaryllifolius is a tropical plant in the Pandanus (screwpine) genus, which is commonly known as pandan leaves, and is used widely in South Asian and Southeast Asian cooking as a flavoring.
4
7
  > —[Wikipedia](https://en.wikipedia.org/wiki/Pandanus_amaryllifolius)
5
8
 
@@ -15,7 +18,7 @@ $ gem install pandan
15
18
 
16
19
  ## Motivation
17
20
 
18
- At XING, CocoaPods helped us to manage our Objective-C and Swift dependencies for a long time. But as our team grew, it was evident to us that CocoaPods was not tool we needed anymore. We decided to migrate all our projects to different setup that uses multiple Xcode projects, targets and xcconfig files under a single workspace, but we were lacking a tool that would give us dependency information out of the settings that are already in place in Xcode.
21
+ At XING, CocoaPods helped us manage our Objective-C and Swift dependencies for a long time. But as our team grew, it was evident to us that CocoaPods was not the tool we needed anymore. We decided to migrate all our projects to a different setup that uses multiple Xcode projects, targets and xcconfig files under a single workspace. However, we were lacking a tool that would give us dependency information based one the settings already in place in Xcode.
19
22
 
20
23
  ## Usage
21
24
 
data/Rakefile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'bundler/gem_tasks'
2
4
  require 'rspec/core/rake_task'
3
5
 
data/bin/pandan CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  $LOAD_PATH.push File.expand_path('../lib', File.dirname(__FILE__))
4
5
  require 'pandan'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'pandan/version'
2
4
  require 'pandan/command'
3
5
  require 'claide'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'claide'
2
4
  require 'pandan/version'
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'pandan/command'
2
4
  require 'pandan/parser'
3
5
  require 'pandan/graph'
@@ -25,6 +27,7 @@ module Pandan
25
27
  @save_gv = argv.flag?('graphviz')
26
28
  @save_png = argv.flag?('image')
27
29
  @filter = argv.option('filter')
30
+ @filter ||= '.*' # Match everything
28
31
  super
29
32
  end
30
33
 
@@ -64,9 +67,13 @@ module Pandan
64
67
  def graphviz_data(graph)
65
68
  graphviz = GraphViz.new(type: :digraph)
66
69
 
67
- graph.nodes.each do |_, node|
70
+ graph.nodes.each_value do |node|
71
+ next unless node.name.match?(/#{@filter}/)
72
+
68
73
  target_node = graphviz.add_node(node.name)
69
74
  node.neighbors.each do |dependency|
75
+ next unless dependency.name.match?(/#{@filter}/)
76
+
70
77
  dep_node = graphviz.add_node(dependency.name)
71
78
  graphviz.add_edge(target_node, dep_node)
72
79
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'pandan/command'
2
4
  require 'pandan/parser'
3
5
  require 'pandan/graph'
@@ -13,6 +15,7 @@ module Pandan
13
15
  [
14
16
  ['--xcworkspace=path/to/workspace', 'If not set, Pandan will try to find a workspace'],
15
17
  ['--reverse', 'If set, pandan will output the targets that depend on the argument'],
18
+ ['--implicit-dependencies', 'If set, pandan will look up for linker flags in all build configurations'],
16
19
  ['--comma-separated', 'If set, Pandan outputs a comma-separated list instead of multiple lines'],
17
20
  ['--filter=expression', 'If set, pandan will select all targets whose name match the regular expression']
18
21
  ].concat(super)
@@ -27,8 +30,10 @@ module Pandan
27
30
  @xcworkspace = argv.option('xcworkspace')
28
31
  @xcworkspace ||= XCWorkspace.find_workspace
29
32
  @reverse = argv.flag?('reverse')
33
+ @implicit_deps = argv.flag?('implicit-dependencies')
30
34
  @comma_separated = argv.flag?('comma-separated')
31
35
  @filter = argv.option('filter')
36
+ @filter ||= '.*' # Match everything
32
37
  super
33
38
  end
34
39
 
@@ -41,14 +46,16 @@ module Pandan
41
46
 
42
47
  def run
43
48
  parser = Parser.new(@xcworkspace, @filter)
44
- targets = parser.all_targets
45
49
  graph = Graph.new(@reverse)
50
+ targets = parser.all_targets
46
51
  graph.add_target_info(targets)
52
+ if @implicit_deps
53
+ ld_flags_info = parser.other_linker_flags
54
+ graph.add_other_ld_flags_info(ld_flags_info)
55
+ end
47
56
  deps = graph.resolve_dependencies(@target).map(&:name)
48
- unless @filter.nil?
49
- deps.select! do |dep|
50
- dep.name.include? @filter
51
- end
57
+ deps.select! do |dep|
58
+ dep =~ /#{@filter}/
52
59
  end
53
60
 
54
61
  if @comma_separated
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'pandan/command'
2
4
  require 'pandan/parser'
3
5
  require 'pandan/xcworkspace'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'xcodeproj'
2
4
  require 'pandan/xcodeproj/user_interface.rb'
3
5
 
@@ -27,22 +29,21 @@ module Pandan
27
29
  def add_target_info(targets)
28
30
  targets.each do |target|
29
31
  linked_libraries = find_linked_libraries(target)
30
- node = nodes[target.display_name]
31
- if node.nil?
32
- node = Node.new(target.display_name)
33
- nodes[target.display_name] = node
34
- end
32
+ node = node_for_target_display_name(target.display_name)
35
33
  linked_libraries.each do |library_name|
36
- library_node = nodes[library_name]
37
- if library_node.nil?
38
- library_node = Node.new(library_name)
39
- nodes[library_name] = library_node
40
- end
41
- if reverse
42
- library_node.add_neighbor(node)
43
- else
44
- node.add_neighbor(library_node)
45
- end
34
+ library_node = node_for_target_display_name(library_name)
35
+ add_neighbor(node, library_node)
36
+ end
37
+ end
38
+ end
39
+
40
+ def add_other_ld_flags_info(ld_flags_info)
41
+ ld_flags_info.each do |target, ld_flags_per_config|
42
+ node = node_for_target_display_name(target.display_name)
43
+ ld_flags_per_config.each_value do |ld_flags|
44
+ joined_flags = ld_flags.join(' ')
45
+ joined_flags.match(/-l"(.*?)"/).captures.each { |library| add_as_neighbor(node, library) }
46
+ joined_flags.match(/-framework "(.*?)"/).captures.each { |framework| add_as_neighbor(node, framework) }
46
47
  end
47
48
  end
48
49
  end
@@ -51,6 +52,7 @@ module Pandan
51
52
  resolved = []
52
53
  target_node = nodes[target]
53
54
  raise "Target #{target} not found" if target_node.nil?
55
+
54
56
  resolve(target_node, resolved)
55
57
  resolved.delete(target_node)
56
58
  resolved
@@ -58,18 +60,42 @@ module Pandan
58
60
 
59
61
  private
60
62
 
63
+ def add_as_neighbor(node, item)
64
+ add_neighbor(node, node_for_target_display_name(item))
65
+ end
66
+
67
+ def node_for_target_display_name(display_name)
68
+ node = nodes[display_name]
69
+ if node.nil?
70
+ node = Node.new(display_name)
71
+ nodes[display_name] = node
72
+ end
73
+ node
74
+ end
75
+
76
+ def add_neighbor(source, destination)
77
+ if reverse
78
+ destination.add_neighbor(source)
79
+ else
80
+ source.add_neighbor(destination)
81
+ end
82
+ end
83
+
61
84
  def find_linked_libraries(target)
62
85
  frameworks_build_phase = target.build_phases.find { |build_phase| build_phase.isa.eql? 'PBXFrameworksBuildPhase' }
86
+
87
+ return [] unless frameworks_build_phase
88
+
63
89
  frameworks_build_phase.files.map { |file| file.display_name.gsub '.framework', '' }
64
90
  end
65
91
 
66
92
  def resolve(node, resolved, resolving = [])
67
93
  resolving << node
68
94
  node.neighbors.each do |neighbor|
69
- unless resolved.include? neighbor
70
- raise "Found dependency cycle: #{node.name} -> #{neighbor.name}" if resolving.include? neighbor
71
- resolve(neighbor, resolved, resolving)
72
- end
95
+ next if resolved.include? neighbor
96
+ raise "Found dependency cycle: #{node.name} -> #{neighbor.name}" if resolving.include? neighbor
97
+
98
+ resolve(neighbor, resolved, resolving)
73
99
  end
74
100
  resolved << node
75
101
  resolving.delete(node)
@@ -1,19 +1,39 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'xcodeproj'
2
4
 
3
5
  module Pandan
4
6
  class Parser
5
- attr_reader :workspace, :regex
7
+ attr_reader :workspace, :workspace_dir, :regex
6
8
 
7
9
  def initialize(workspace_path, filter)
10
+ @workspace_dir = File.dirname(workspace_path)
8
11
  @workspace = Xcodeproj::Workspace.new_from_xcworkspace(workspace_path)
9
12
  @regex = filter
10
13
  @regex ||= '.*' # Match everything
11
14
  end
12
15
 
13
16
  def all_targets
14
- all_project_paths = workspace.file_references.map(&:path)
15
- projects = all_project_paths.map { |project_path| Xcodeproj::Project.open(project_path) }
17
+ @projects ||= projects
16
18
  projects.flat_map(&:targets).select { |target| target.name =~ /#{regex}/ }
17
19
  end
20
+
21
+ def other_linker_flags
22
+ @projects ||= projects
23
+ ld_flags_info = {}
24
+ projects.flat_map(&:targets).each do |target|
25
+ ld_flags_info[target] = target.resolved_build_setting('OTHER_LDFLAGS', true)
26
+ end
27
+ ld_flags_info
28
+ end
29
+
30
+ private
31
+
32
+ def projects
33
+ all_project_paths = workspace.file_references.map(&:path)
34
+ all_project_paths.map do |project_path|
35
+ Xcodeproj::Project.open(File.expand_path(project_path, @workspace_dir))
36
+ end
37
+ end
18
38
  end
19
39
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Pandan
2
- VERSION = '0.0.1'.freeze
4
+ VERSION = '0.0.3'
3
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Xcodeproj
2
4
  module UserInterface
3
5
  def self.warn(_message)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'xcodeproj'
2
4
 
3
5
  module Pandan
@@ -1,5 +1,6 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
5
  require 'pandan/version'
5
6
 
@@ -22,11 +23,13 @@ Gem::Specification.new do |spec|
22
23
  spec.executables = 'pandan'
23
24
  spec.require_paths = ['lib']
24
25
 
25
- spec.add_development_dependency 'bundler', '~> 1.14'
26
- spec.add_development_dependency 'rake', '~> 10.0'
27
- spec.add_development_dependency 'rspec', '~> 3.0'
26
+ spec.add_runtime_dependency 'claide', '~> 1.0'
27
+ spec.add_runtime_dependency 'ruby-graphviz', '~> 1.2'
28
+ spec.add_runtime_dependency 'xcodeproj', '~> 1.7'
28
29
 
29
- spec.add_runtime_dependency 'claide', '~> 1.0.0'
30
- spec.add_runtime_dependency 'xcodeproj', '~> 1.4.0'
31
- spec.add_dependency 'ruby-graphviz', '~> 1.2'
30
+ spec.add_development_dependency 'bundler'
31
+ spec.add_development_dependency 'rake'
32
+ spec.add_development_dependency 'rspec', '~> 3.0'
33
+ spec.add_development_dependency 'rspec_junit_formatter'
34
+ spec.add_development_dependency 'rubocop', '0.63'
32
35
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pandan
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Renzo Crisóstomo
@@ -10,92 +10,120 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2017-03-27 00:00:00.000000000 Z
13
+ date: 2020-04-10 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
- name: bundler
16
+ name: claide
17
17
  requirement: !ruby/object:Gem::Requirement
18
18
  requirements:
19
19
  - - "~>"
20
20
  - !ruby/object:Gem::Version
21
- version: '1.14'
22
- type: :development
21
+ version: '1.0'
22
+ type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  requirements:
26
26
  - - "~>"
27
27
  - !ruby/object:Gem::Version
28
- version: '1.14'
28
+ version: '1.0'
29
29
  - !ruby/object:Gem::Dependency
30
- name: rake
30
+ name: ruby-graphviz
31
31
  requirement: !ruby/object:Gem::Requirement
32
32
  requirements:
33
33
  - - "~>"
34
34
  - !ruby/object:Gem::Version
35
- version: '10.0'
36
- type: :development
35
+ version: '1.2'
36
+ type: :runtime
37
37
  prerelease: false
38
38
  version_requirements: !ruby/object:Gem::Requirement
39
39
  requirements:
40
40
  - - "~>"
41
41
  - !ruby/object:Gem::Version
42
- version: '10.0'
42
+ version: '1.2'
43
43
  - !ruby/object:Gem::Dependency
44
- name: rspec
44
+ name: xcodeproj
45
45
  requirement: !ruby/object:Gem::Requirement
46
46
  requirements:
47
47
  - - "~>"
48
48
  - !ruby/object:Gem::Version
49
- version: '3.0'
50
- type: :development
49
+ version: '1.7'
50
+ type: :runtime
51
51
  prerelease: false
52
52
  version_requirements: !ruby/object:Gem::Requirement
53
53
  requirements:
54
54
  - - "~>"
55
55
  - !ruby/object:Gem::Version
56
- version: '3.0'
56
+ version: '1.7'
57
57
  - !ruby/object:Gem::Dependency
58
- name: claide
58
+ name: bundler
59
59
  requirement: !ruby/object:Gem::Requirement
60
60
  requirements:
61
- - - "~>"
61
+ - - ">="
62
62
  - !ruby/object:Gem::Version
63
- version: 1.0.0
64
- type: :runtime
63
+ version: '0'
64
+ type: :development
65
65
  prerelease: false
66
66
  version_requirements: !ruby/object:Gem::Requirement
67
67
  requirements:
68
- - - "~>"
68
+ - - ">="
69
69
  - !ruby/object:Gem::Version
70
- version: 1.0.0
70
+ version: '0'
71
71
  - !ruby/object:Gem::Dependency
72
- name: xcodeproj
72
+ name: rake
73
73
  requirement: !ruby/object:Gem::Requirement
74
74
  requirements:
75
- - - "~>"
75
+ - - ">="
76
76
  - !ruby/object:Gem::Version
77
- version: 1.4.0
78
- type: :runtime
77
+ version: '0'
78
+ type: :development
79
79
  prerelease: false
80
80
  version_requirements: !ruby/object:Gem::Requirement
81
81
  requirements:
82
- - - "~>"
82
+ - - ">="
83
83
  - !ruby/object:Gem::Version
84
- version: 1.4.0
84
+ version: '0'
85
85
  - !ruby/object:Gem::Dependency
86
- name: ruby-graphviz
86
+ name: rspec
87
87
  requirement: !ruby/object:Gem::Requirement
88
88
  requirements:
89
89
  - - "~>"
90
90
  - !ruby/object:Gem::Version
91
- version: '1.2'
92
- type: :runtime
91
+ version: '3.0'
92
+ type: :development
93
93
  prerelease: false
94
94
  version_requirements: !ruby/object:Gem::Requirement
95
95
  requirements:
96
96
  - - "~>"
97
97
  - !ruby/object:Gem::Version
98
- version: '1.2'
98
+ version: '3.0'
99
+ - !ruby/object:Gem::Dependency
100
+ name: rspec_junit_formatter
101
+ requirement: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - ">="
104
+ - !ruby/object:Gem::Version
105
+ version: '0'
106
+ type: :development
107
+ prerelease: false
108
+ version_requirements: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - ">="
111
+ - !ruby/object:Gem::Version
112
+ version: '0'
113
+ - !ruby/object:Gem::Dependency
114
+ name: rubocop
115
+ requirement: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - '='
118
+ - !ruby/object:Gem::Version
119
+ version: '0.63'
120
+ type: :development
121
+ prerelease: false
122
+ version_requirements: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - '='
125
+ - !ruby/object:Gem::Version
126
+ version: '0.63'
99
127
  description: CLI tool that outputs dependency information from a set of Xcode projects
100
128
  with targets thatdepend on each other, it does it by creating a (reverse) dependency
101
129
  graph and doing abreadth-first search.
@@ -111,7 +139,8 @@ files:
111
139
  - ".gitignore"
112
140
  - ".rspec"
113
141
  - ".rubocop.yml"
114
- - ".rubocop_todo.yml"
142
+ - ".ruby-version"
143
+ - ".travis.yml"
115
144
  - CODE_OF_CONDUCT.md
116
145
  - CONTRIBUTING.md
117
146
  - Gemfile
@@ -152,7 +181,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
152
181
  version: '0'
153
182
  requirements: []
154
183
  rubyforge_project:
155
- rubygems_version: 2.6.11
184
+ rubygems_version: 2.7.6
156
185
  signing_key:
157
186
  specification_version: 4
158
187
  summary: Retrieve Xcode dependency information with ease.
@@ -1,26 +0,0 @@
1
- # This configuration was generated by
2
- # `rubocop --auto-gen-config`
3
- # on 2017-03-23 19:05:08 +0100 using RuboCop version 0.47.1.
4
- # The point is for the user to remove these configuration records
5
- # one by one as the offenses are removed from the code base.
6
- # Note that changes in the inspected code, or installation of new
7
- # versions of RuboCop, may require this file to be generated again.
8
-
9
- # Offense count: 1
10
- Metrics/AbcSize:
11
- Max: 21
12
-
13
- # Offense count: 10
14
- Style/Documentation:
15
- Exclude:
16
- - 'spec/**/*'
17
- - 'test/**/*'
18
- - 'lib/pandan.rb'
19
- - 'lib/pandan/command.rb'
20
- - 'lib/pandan/command/dependency_graph.rb'
21
- - 'lib/pandan/command/query.rb'
22
- - 'lib/pandan/command/targets.rb'
23
- - 'lib/pandan/graph.rb'
24
- - 'lib/pandan/parser.rb'
25
- - 'lib/pandan/xcodeproj/user_interface.rb'
26
- - 'lib/pandan/xcworkspace.rb'