cocoaseeds 0.0.3 → 0.0.4

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: 951e8b5214913a0838ccf3097355d1c76efd5d81
4
- data.tar.gz: 28a5cd47e476845404435bd5f44f1e51a8ef81cb
3
+ metadata.gz: 50c2bb77e4221a0d5d12dbc668fde037b3c10bf5
4
+ data.tar.gz: 0f0a2053fa975d0e61ef0cf791c6565ce6322c36
5
5
  SHA512:
6
- metadata.gz: 3f5a996f3c116c56a0735d959a4edb254875b3ca098f34895756ac929931755333e1d6ffcb46c409c7e6efffb49d96ee404a11d6b8e43fbfa235c64c0d404f09
7
- data.tar.gz: d08f4d66db90463dcc1fa70cfa478fe2ff7bda2d95230fd338cff5eeac1407bae3878588f752ed897e14ea5ce198259f86654a152dd3e381b355ceddbb89f8dc
6
+ metadata.gz: ad4e90e538a9a1a1bf6bf95892dbc5986684fa7684dc34e8b9288a0f84fa361d353c55c8799a303f37118ebda5724dcb05acaa35ff8177c91868add6e4429a34
7
+ data.tar.gz: dbf6da21eb9a40b4e3eec2b7171d9415c7329d45cfec5704614b1dceaec9c622722601a9245c24a9fe49c7655364909f21dd98fd420d90b9429e0765721535f4
data/README.md CHANGED
@@ -2,8 +2,9 @@ CocoaSeeds
2
2
  ==========
3
3
 
4
4
  [![Gem](https://img.shields.io/gem/v/cocoaseeds.svg)](https://rubygems.org/gems/cocoaseeds)
5
+ [![Build Status](https://travis-ci.org/devxoul/CocoaSeeds.svg?branch=master)](https://travis-ci.org/devxoul/CocoaSeeds)
5
6
 
6
- Git Submodule Alternative for Cocoa.
7
+ Git Submodule Alternative for Cocoa. Inspired by [CocoaPods](https://cocoapods.org).
7
8
 
8
9
 
9
10
  Why?
@@ -30,23 +31,33 @@ Seedfile
30
31
 
31
32
  You have to write a **Seedfile** in the same directory with **.xcodeproj**.
32
33
 
33
- ```ruby
34
- github 'Alamofire/Alamofire', '1.2.1', :files => 'Source/*.{swift,h}'
35
- github 'devxoul/JLToast', '1.2.2', :files => 'JLToast/*.{swift,h}'
36
- github 'Masonry/SnapKit', '0.10.0', :files => 'Source/*.{swift,h}'
37
- ```
38
-
39
34
  <pre>
40
35
  MyProject/
41
36
  |-- MyProject/
42
37
  | |-- AppDelegate.swift
43
38
  | `-- ...
44
39
  |-- MyProject.xcodeproj
45
- |-- <b>Seedfile</b>
40
+ |-- <b><i>Seedfile</i></b>
46
41
  `-- ...
47
42
  </pre>
48
43
 
49
44
 
45
+ **Seedfile**
46
+
47
+ ```ruby
48
+ # seeds for all targets
49
+ github "Alamofire/Alamofire", "1.2.1", :files => "Source/*.{swift,h}"
50
+ github "devxoul/JLToast", "1.2.2", :files => "JLToast/*.{swift,h}"
51
+ github "devxoul/SwipeBack", "1.0.4" # files default: */**.{h,m,mm,swift}
52
+ github "Masonry/SnapKit", "0.10.0", :files => "Source/*.{swift,h}"
53
+
54
+ # seeds for specific target
55
+ target :MyAppTest do
56
+ github "Quick/Quick", "v0.3.1", :files => "Quick/**.{swift,h}"
57
+ github "Quick/Nimble", "v0.4.2", :files => "Nimble/**.{swift,h}"
58
+ end
59
+ ```
60
+
50
61
  Using CocoaSeeds
51
62
  ----------------
52
63
 
data/bin/seed CHANGED
@@ -2,4 +2,4 @@
2
2
 
3
3
  require 'cocoaseeds'
4
4
 
5
- CocoaSeed::Command.run(ARGV)
5
+ Seeds::Command.run(ARGV)
@@ -1,13 +1,15 @@
1
- require 'colorize'
2
-
3
- module CocoaSeed
1
+ module Seeds
4
2
  class Command
5
3
  def self.run(argv)
6
4
  case argv[0]
7
5
  when 'install'
8
- CocoaSeed::Core.new(Dir.pwd).install
6
+ begin
7
+ Seeds::Core.new(Dir.pwd).install
8
+ rescue Seeds::Exception => e
9
+ puts "[!] #{e.message}".red
10
+ end
9
11
  when '--version'
10
- puts CocoaSeed::VERSION
12
+ puts Seeds::VERSION
11
13
  else
12
14
  self.help
13
15
  end
@@ -1,11 +1,8 @@
1
- require 'fileutils'
2
- require 'yaml'
3
-
4
- module CocoaSeed
1
+ module Seeds
5
2
  class Core
6
3
  attr_reader :root_path, :seedfile_path, :lockfile_path
7
4
  attr_accessor :project, :seedfile, :lockfile
8
- attr_reader :seeds, :locks
5
+ attr_reader :seeds, :locks, :targets
9
6
  attr_reader :source_files, :file_references
10
7
 
11
8
  def initialize(root_path)
@@ -14,6 +11,7 @@ module CocoaSeed
14
11
  @lockfile_path = File.join(root_path, "Seeds", "Seedfile.lock")
15
12
  @seeds = {}
16
13
  @locks = {}
14
+ @targets = {}
17
15
  @source_files = {}
18
16
  @file_references = []
19
17
  end
@@ -21,20 +19,24 @@ module CocoaSeed
21
19
  def install
22
20
  self.prepare_requirements
23
21
  self.analyze_dependencies
22
+ self.execute_seedfile
24
23
  self.remove_seeds
25
24
  self.install_seeds
26
25
  self.configure_project
27
26
  self.configure_phase
28
27
  self.project.save
29
28
  self.build_lockfile
29
+ @seeds = {}
30
+ @locks = {}
31
+ @source_files = {}
32
+ @file_references = []
30
33
  end
31
34
 
32
35
  def prepare_requirements
33
36
  # .xcodeproj
34
37
  project_filename = Dir.glob("#{root_path}/*.xcodeproj")[0]
35
38
  if not project_filename
36
- puts "Couldn't find .xcodeproj file.".red
37
- exit 1
39
+ raise Seeds::Exception.new "Couldn't find .xcodeproj file."
38
40
  end
39
41
  self.project = Xcodeproj::Project.open(project_filename)
40
42
 
@@ -42,8 +44,7 @@ module CocoaSeed
42
44
  begin
43
45
  self.seedfile = File.read(self.seedfile_path)
44
46
  rescue Errno::ENOENT
45
- puts "Couldn't find Seedfile.".red
46
- exit 1
47
+ raise Seeds::Exception.new "Couldn't find Seedfile."
47
48
  end
48
49
 
49
50
  # Seedfile.lock - optional
@@ -60,27 +61,53 @@ module CocoaSeed
60
61
  if self.lockfile
61
62
  locks = YAML.load(self.lockfile)
62
63
  locks["SEEDS"].each do |lock|
63
- seed = CocoaSeed::Seed.new
64
+ seed = Seeds::Seed.new
64
65
  seed.name = lock.split(' (')[0]
65
66
  seed.version = lock.split('(')[1].split(')')[0]
66
67
  self.locks[seed.name] = seed
67
68
  end
68
69
  end
69
-
70
- # Seedfile
71
- eval self.seedfile
72
70
  end
73
71
 
74
- def github(repo, tag, options={})
75
- seed = CocoaSeed::Seed::GitHub.new
76
- seed.url = "https://github.com/#{repo}"
77
- seed.name = repo.split('/')[1]
78
- seed.version = tag
79
- seed.files = options[:files] || '**/*.{h,m,mm,swift}'
80
- if seed.files.kind_of?(String)
81
- seed.files = [seed.files]
72
+ def execute_seedfile
73
+ def target(*names, &code)
74
+ names.each do |name|
75
+ name = name.to_s # use string instead of symbol
76
+ @current_target_name = name
77
+
78
+ target = self.project.target_named(name)
79
+ if not target
80
+ raise Seeds::Exception.new\
81
+ "#{self.project.path.basename} doesn't have a target `#{name}`"
82
+ end
83
+
84
+ code.call()
85
+ end
82
86
  end
83
- self.seeds[seed.name] = seed
87
+
88
+ def github(repo, tag, options={})
89
+ if not @current_target_name # apply to all targets
90
+ target *self.project.targets.map(&:name) do
91
+ send(__callee__, repo, tag, options)
92
+ end
93
+ @current_target_name = nil
94
+ else
95
+ seed = Seeds::Seed::GitHub.new
96
+ seed.url = "https://github.com/#{repo}"
97
+ seed.name = repo.split('/')[1]
98
+ seed.version = tag
99
+ seed.files = options[:files] || '**/*.{h,m,mm,swift}'
100
+ if seed.files.kind_of?(String)
101
+ seed.files = [seed.files]
102
+ end
103
+ self.seeds[seed.name] = seed
104
+ self.targets[@current_target_name] ||= []
105
+ self.targets[@current_target_name] << seed
106
+ end
107
+ end
108
+
109
+ eval seedfile
110
+ @current_target_name = nil
84
111
  end
85
112
 
86
113
  def remove_seeds
@@ -158,21 +185,12 @@ module CocoaSeed
158
185
  end
159
186
 
160
187
  def configure_phase
161
- targets = self.project.targets.select do |t|
162
- not t.name.end_with?('Tests')
163
- end
164
-
165
- targets.each do |target|
166
- # detect 'Compile Sources' build phase
167
- phases = target.build_phases.select do |phase|
168
- phase.kind_of?(Xcodeproj::Project::Object::PBXSourcesBuildPhase)
169
- end
170
- phase = phases[0]
171
-
188
+ self.targets.each do |target_name, seeds|
189
+ target = self.project.target_named(target_name)
190
+ phase = target.sources_build_phase
172
191
  if not phase
173
- puts "[!] Target `#{target}` doesn't have build phase "\
174
- "'Compile Sources'.".red
175
- exit 1
192
+ raise Seeds::Exception.new\
193
+ "Target `#{target}` doesn't have build phase 'Compile Sources'."
176
194
  end
177
195
 
178
196
  # remove zombie file references
@@ -185,8 +203,9 @@ module CocoaSeed
185
203
  end
186
204
 
187
205
  # add file references to sources build phase
206
+ seed_names = seeds.map { |seed| seed.name }
188
207
  self.file_references.each do |file|
189
- if not phase.include?(file)
208
+ if not phase.include?(file) and seed_names.include?(file.parent.name)
190
209
  phase.add_file_reference(file)
191
210
  end
192
211
  end
@@ -194,11 +213,14 @@ module CocoaSeed
194
213
  end
195
214
 
196
215
  def build_lockfile
197
- tree = { "SEEDS" => [] }
198
- self.seeds.each do |name, seed|
199
- tree["SEEDS"] << "#{name} (#{seed.version})"
216
+ if self.seeds.length > 0
217
+ tree = { "SEEDS" => [] }
218
+ self.seeds.each do |name, seed|
219
+ tree["SEEDS"] << "#{name} (#{seed.version})"
220
+ end
221
+ File.write(self.lockfile_path, YAML.dump(tree))
200
222
  end
201
- File.write(self.lockfile_path, YAML.dump(tree))
202
223
  end
224
+
203
225
  end
204
226
  end
@@ -0,0 +1,6 @@
1
+ module Seeds
2
+
3
+ class Exception < Exception
4
+ end
5
+
6
+ end
@@ -1,4 +1,4 @@
1
- module CocoaSeed
1
+ module Seeds
2
2
  class Seed
3
3
  attr_accessor :name, :version, :url, :files
4
4
 
@@ -1,3 +1,3 @@
1
- module CocoaSeed
2
- VERSION = '0.0.3'
1
+ module Seeds
2
+ VERSION = '0.0.4'
3
3
  end
@@ -0,0 +1,40 @@
1
+ module Xcodeproj
2
+ class Project
3
+ def target_named(name)
4
+ self.targets.each do |target|
5
+ if target.name == name.to_s
6
+ return target
7
+ end
8
+ end
9
+ nil
10
+ end
11
+ end
12
+ end
13
+
14
+ module Xcodeproj::Project::Object
15
+ class PBXNativeTarget
16
+ def sources_build_phase()
17
+ self.build_phases.each do |phase|
18
+ if phase.kind_of?(Xcodeproj::Project::Object::PBXSourcesBuildPhase)
19
+ return phase
20
+ end
21
+ end
22
+ nil
23
+ end
24
+ end
25
+
26
+ class PBXSourcesBuildPhase
27
+ def include_filename?(pattern)
28
+ filenames = self.file_display_names
29
+ if filenames.length == 0 and pattern
30
+ return false
31
+ end
32
+ filenames.each do |filename|
33
+ if not filename.match pattern
34
+ return false
35
+ end
36
+ end
37
+ return true
38
+ end
39
+ end
40
+ end
data/lib/cocoaseeds.rb CHANGED
@@ -1,9 +1,14 @@
1
+ require 'colorize'
2
+ require 'fileutils'
1
3
  require 'xcodeproj'
4
+ require 'yaml'
2
5
 
3
- module CocoaSeed
6
+ module Seeds
4
7
  require 'cocoaseeds/version'
8
+ require_relative 'cocoaseeds/xcodehelper'
5
9
 
6
- autoload :Command, 'cocoaseeds/command'
7
- autoload :Core, 'cocoaseeds/core'
8
- autoload :Seed, 'cocoaseeds/seed'
10
+ autoload :Command, 'cocoaseeds/command'
11
+ autoload :Core, 'cocoaseeds/core'
12
+ autoload :Exception, 'cocoaseeds/exception'
13
+ autoload :Seed, 'cocoaseeds/seed'
9
14
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cocoaseeds
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Suyeol Jeon
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-05-08 00:00:00.000000000 Z
11
+ date: 2015-05-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: xcodeproj
@@ -51,8 +51,10 @@ files:
51
51
  - lib/cocoaseeds.rb
52
52
  - lib/cocoaseeds/command.rb
53
53
  - lib/cocoaseeds/core.rb
54
+ - lib/cocoaseeds/exception.rb
54
55
  - lib/cocoaseeds/seed.rb
55
56
  - lib/cocoaseeds/version.rb
57
+ - lib/cocoaseeds/xcodehelper.rb
56
58
  homepage: https://github.com/devxoul/CocoaSeeds
57
59
  licenses:
58
60
  - MIT