shenzhen 0.4.0 → 0.5.0

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
2
  SHA1:
3
- metadata.gz: 1f9a187824ca91b35c51b6bfe2e40f6695e1a8e5
4
- data.tar.gz: fda3a6e48445a993313b4ec17d541c589af08c74
3
+ metadata.gz: fb28a156e7d7ae587fd7111136ad03abcadbb2b0
4
+ data.tar.gz: 36b8b8fd8718548b6e2cc815fc7724297f4a639d
5
5
  SHA512:
6
- metadata.gz: 19fabb021e532109513e279beeb8ee561dbb85e65dd0ee78cc86bd7609bd880bf56714c7a22f52f18779802e2c8ef10695364060052652f9e1bb69964c5ad6c5
7
- data.tar.gz: 439c65ea3ce6e5e6f3dddf4b9b9727f9d90c1a476c89be95c34dd2665fa13d2c35c4cf5906dc7c8550bc400f01d2bbb3039cead2e1acd4dcd954e258e0cf14b4
6
+ metadata.gz: 5c18315a884e2e44e4c0630fcbdda1b23d8a31e762b26380766e48d4a47319f39d5f775d233ee5499170238bd3b86b4981b8b5f4caca90bb1fd98a022cece0f2
7
+ data.tar.gz: ef91e63e346f9b012a8d236e1a0cc9a17a90c04203094d7ddeedb731074b0f5500dfac8ab727210eb3880dbeddacc86ea30c2102fad47aa17a114114bab2d600
@@ -1,28 +1,39 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- shenzhen (0.4.0)
4
+ shenzhen (0.5.0)
5
+ aws-sdk (~> 1.0)
5
6
  commander (~> 4.1)
6
7
  dotenv (~> 0.7)
7
8
  faraday (~> 0.8)
8
9
  faraday_middleware (~> 0.9)
9
10
  json (~> 1.8)
11
+ net-sftp (~> 2.1.2)
10
12
 
11
13
  GEM
12
14
  remote: https://rubygems.org/
13
15
  specs:
14
- commander (4.1.3)
16
+ aws-sdk (1.20.0)
17
+ json (~> 1.4)
18
+ nokogiri (>= 1.4.4, < 1.6.0)
19
+ uuidtools (~> 2.1)
20
+ commander (4.1.5)
15
21
  highline (~> 1.6.11)
16
- dotenv (0.7.0)
17
- faraday (0.8.7)
18
- multipart-post (~> 1.1)
22
+ dotenv (0.9.0)
23
+ faraday (0.8.8)
24
+ multipart-post (~> 1.2.0)
19
25
  faraday_middleware (0.9.0)
20
26
  faraday (>= 0.7.4, < 0.9)
21
27
  highline (1.6.19)
22
28
  json (1.8.0)
23
29
  multipart-post (1.2.0)
30
+ net-sftp (2.1.2)
31
+ net-ssh (>= 2.6.5)
32
+ net-ssh (2.7.0)
33
+ nokogiri (1.5.10)
24
34
  rake (0.9.6)
25
35
  rspec (0.6.4)
36
+ uuidtools (2.1.4)
26
37
 
27
38
  PLATFORMS
28
39
  ruby
data/README.md CHANGED
@@ -24,6 +24,7 @@ Shenzhen adds the `ipa` command to your PATH:
24
24
  distribute:testflight Distribute an .ipa file over TestFlight
25
25
  distribute:hockeyapp Distribute an .ipa file over HockeyApp
26
26
  distribute:ftp Distribute an .ipa file over FTP
27
+ distribute:S3 Distribute an .ipa file over Amazon S3
27
28
  help Display global or [command] help documentation.
28
29
 
29
30
  Aliases:
@@ -50,11 +51,21 @@ Shenzhen adds the `ipa` command to your PATH:
50
51
 
51
52
  $ ipa distribute:hockeyapp -t API_TOKEN
52
53
 
53
- > Shenzhen will load credentials from the environment variables `TESTFLIGHT_API_TOKEN` and `TESTFLIGHT_TEAM_TOKEN` unless otherwise specified.
54
+ > Shenzhen will load credentials from the environment variable `HOCKEYAPP_API_TOKEN` unless otherwise specified.
54
55
 
55
56
  #### FTP Distribution
56
57
 
57
- $ ipa distribute:hockeyapp -h HOST -u USER -p PASSWORD -P FTP_PATH
58
+ $ ipa distribute:ftp --host HOST -u USER -p PASSWORD -P FTP_PATH
59
+
60
+ #### SFTP Distribution
61
+
62
+ $ ipa distribute:sftp --host HOST -u USER -p PASSWORD -P FTP_PATH
63
+
64
+ #### Amazon S3 Distribution
65
+
66
+ $ ipa distribute:s3 -a ACCESS_KEY_ID -s SECRET_ACCESS_KEY -b BUCKET
67
+
68
+ > Shenzhen will load credentials from the environment variable `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY` and `AWS_REGION` unless otherwise specified.
58
69
 
59
70
  ## Contact
60
71
 
data/Rakefile CHANGED
@@ -1,5 +1,4 @@
1
- require "bundler"
2
- Bundler.setup
1
+ require "bundler/setup"
3
2
 
4
3
  gemspec = eval(File.read("shenzhen.gemspec"))
5
4
 
@@ -1,5 +1,5 @@
1
1
  module Shenzhen
2
- VERSION = '0.4.0'
2
+ VERSION = '0.5.0'
3
3
  end
4
4
 
5
5
  require 'shenzhen/agvtool'
@@ -3,6 +3,7 @@ $:.push File.expand_path('../', __FILE__)
3
3
  require 'plugins/testflight'
4
4
  require 'plugins/hockeyapp'
5
5
  require 'plugins/ftp'
6
+ require 'plugins/s3'
6
7
 
7
8
  require 'commands/build'
8
9
  require 'commands/distribute'
@@ -1,3 +1,5 @@
1
+ require 'fileutils'
2
+
1
3
  command :build do |c|
2
4
  c.syntax = 'ipa build [options]'
3
5
  c.summary = 'Create a new .ipa file for your app'
@@ -9,6 +11,8 @@ command :build do |c|
9
11
  c.option '-s', '--scheme SCHEME', 'Scheme used to build app'
10
12
  c.option '--[no-]clean', 'Clean project before building'
11
13
  c.option '--[no-]archive', 'Archive project after building'
14
+ c.option '-d', '--destination DESTINATION', 'Destination. Defaults to current directory'
15
+ c.option '-m', '--embed PROVISION', 'Sign .ipa file with .mobileprovision'
12
16
 
13
17
  c.action do |args, options|
14
18
  validate_xcode_version!
@@ -20,6 +24,8 @@ command :build do |c|
20
24
 
21
25
  @scheme = options.scheme
22
26
  @configuration = options.configuration
27
+ @destination = options.destination || Dir.pwd
28
+ FileUtils.mkdir_p(@destination) unless File.directory?(@destination)
23
29
 
24
30
  determine_workspace_or_project! unless @workspace || @project
25
31
 
@@ -33,12 +39,24 @@ command :build do |c|
33
39
 
34
40
  log "xcodebuild", (@workspace || @project)
35
41
 
42
+ @configuration = options.configuration
43
+
36
44
  flags = []
37
45
  flags << "-sdk iphoneos"
38
46
  flags << "-workspace '#{@workspace}'" if @workspace
39
47
  flags << "-project '#{@project}'" if @project
40
48
  flags << "-scheme '#{@scheme}'" if @scheme
41
- flags << "-configuration '#{@configuration}'"
49
+ flags << "-configuration '#{@configuration}'" if @configuration
50
+
51
+ @target, @xcodebuild_settings = Shenzhen::XcodeBuild.settings(*flags).detect{|target, settings| settings['WRAPPER_EXTENSION'] == "app"}
52
+ say_error "App settings could not be found." and abort unless @xcodebuild_settings
53
+
54
+ if !@configuration
55
+ @configuration = @xcodebuild_settings['CONFIGURATION']
56
+ flags << "-configuration '#{@configuration}'"
57
+ end
58
+
59
+ say_warning "Building \"#{@workspace || @project}\" with Scheme \"#{@scheme}\" and Configuration \"#{@configuration}\"\n" unless options.quiet
42
60
 
43
61
  actions = []
44
62
  actions << :clean unless options.clean == false
@@ -53,17 +71,17 @@ command :build do |c|
53
71
 
54
72
  @app_path = File.join(@xcodebuild_settings['BUILT_PRODUCTS_DIR'], @xcodebuild_settings['WRAPPER_NAME'])
55
73
  @dsym_path = @app_path + ".dSYM"
56
- @dsym_filename = "#{@xcodebuild_settings['WRAPPER_NAME']}.dSYM"
74
+ @dsym_filename = File.expand_path("#{@xcodebuild_settings['WRAPPER_NAME']}.dSYM", @destination)
57
75
  @ipa_name = @xcodebuild_settings['WRAPPER_NAME'].gsub(@xcodebuild_settings['WRAPPER_SUFFIX'], "") + ".ipa"
58
- @ipa_path = File.join(Dir.pwd, @ipa_name)
76
+ @ipa_path = File.expand_path(@ipa_name, @destination)
59
77
 
60
78
  log "xcrun", "PackageApplication"
61
- abort unless system %{xcrun -sdk iphoneos PackageApplication -v "#{@app_path}" -o "#{@ipa_path}" --embed "#{@dsym_path}" 1> /dev/null}
79
+ abort unless system %{xcrun -sdk iphoneos PackageApplication -v "#{@app_path}" -o "#{@ipa_path}" --embed "#{options.embed || @dsym_path}" 1> /dev/null}
62
80
 
63
81
  log "zip", @dsym_filename
64
- abort unless system %{cp -r "#{@dsym_path}" . && zip -r "#{@dsym_filename}.zip" "#{@dsym_filename}" >/dev/null && rm -rf "#{@dsym_filename}"}
82
+ abort unless system %{cp -r "#{@dsym_path}" "#{@destination}" && zip -r "#{@dsym_filename}.zip" "#{@dsym_filename}" >/dev/null && rm -rf "#{@dsym_filename}"}
65
83
 
66
- say_ok "#{File.basename(@ipa_path)} successfully built" unless options.quiet
84
+ say_ok "#{@ipa_path} successfully built" unless options.quiet
67
85
  end
68
86
 
69
87
  private
@@ -1,45 +1,42 @@
1
1
  require 'net/ftp'
2
+ require 'net/sftp'
2
3
 
3
4
  module Shenzhen::Plugins
4
5
  module FTP
5
6
  class Client
6
7
 
7
- def initialize(host, user, pass)
8
- @host, @user, @password = host, user, pass
9
-
10
- @connection = Net::FTP.new
11
- @connection.passive = true
12
- @connection.connect(@host)
8
+ def initialize(host, user, password)
9
+ @host, @user, @password = host, user, password
13
10
  end
14
11
 
15
- def upload_build(ipa, options)
12
+ def upload(ipa, options = {})
13
+ connection = Net::FTP.new
14
+ connection.passive = true
15
+ connection.connect(@host)
16
+
16
17
  path = expand_path_with_substitutions_from_ipa_plist(ipa, options[:path])
17
18
 
18
19
  begin
19
- @connection.login(@user, @password) rescue raise "Login authentication failed"
20
+ connection.login(@user, @password) rescue raise "Login authentication failed"
20
21
 
21
22
  if options[:mkdir]
22
- components, pwd = path.split(/\//), nil
23
+ components, pwd = path.split(/\//).reject(&:empty?), nil
23
24
  components.each do |component|
24
25
  pwd = File.join(*[pwd, component].compact)
25
26
 
26
27
  begin
27
- @connection.mkdir pwd
28
+ connection.mkdir pwd
28
29
  rescue => exception
29
30
  raise exception unless /File exists/ === exception.message
30
31
  end
31
32
  end
32
33
  end
33
-
34
- @connection.chdir path unless path.empty?
35
- @connection.putbinaryfile ipa, File.basename(ipa)
36
-
37
- if dsym = options.delete(:dsym)
38
- @connection.putbinaryfile dsym, File.basename(dsym)
39
- end
40
-
34
+
35
+ connection.chdir path unless path.empty?
36
+ connection.putbinaryfile ipa, File.basename(ipa)
37
+ connection.putbinaryfile(options[:dsym], File.basename(options[:dsym])) if options[:dsym]
41
38
  ensure
42
- @connection.close
39
+ connection.close
43
40
  end
44
41
  end
45
42
 
@@ -68,6 +65,26 @@ module Shenzhen::Plugins
68
65
  end
69
66
  end
70
67
  end
68
+
69
+ module SFTP
70
+ class Client < Shenzhen::Plugins::FTP::Client
71
+ def upload(ipa, options = {})
72
+ session = Net::SSH.start(@host, @user, :password => @password)
73
+ connection = Net::SFTP::Session.new(session).connect!
74
+
75
+ path = expand_path_with_substitutions_from_ipa_plist(ipa, options[:path])
76
+
77
+ begin
78
+ connection.mkdir! path if options[:mkdir]
79
+ connection.upload! ipa, "#{path}/#{File.basename(ipa)}"
80
+ connection.upload! options[:dsym], "#{path}/#{File.basename(options[:dsym])}" if options[:dsym]
81
+ ensure
82
+ connection.close_channel
83
+ session.shutdown!
84
+ end
85
+ end
86
+ end
87
+ end
71
88
  end
72
89
 
73
90
  command :'distribute:ftp' do |c|
@@ -83,15 +100,17 @@ command :'distribute:ftp' do |c|
83
100
  c.option '-u', '--user USER', "FTP user"
84
101
  c.option '-p', '--password PASS', "FTP password"
85
102
  c.option '-P', '--path PATH', "FTP path. Values from Info.plist will be substituded for keys wrapped in {} \n\t\t eg. \"/path/to/folder/{CFBundleVersion}/\" could be evaluated as \"/path/to/folder/1.0.0/\""
103
+ c.option '--protocol [PROTOCOL]', [:ftp, :sftp], "Protocol to use (ftp, sftp)"
86
104
  c.option '--[no-]mkdir', "Create directories on FTP if they don't already exist"
87
105
 
88
106
  c.action do |args, options|
107
+ options.default :mkdir => true
89
108
 
90
109
  determine_file! unless @file = options.file
91
110
  say_error "Missing or unspecified .ipa file" and abort unless @file and File.exist?(@file)
92
111
 
93
112
  determine_dsym! unless @dsym = options.dsym
94
- say_error "Specified dSYM.zip file doesn't exist" unless @dsym and File.exist?(@dsym)
113
+ say_warning "Specified dSYM.zip file doesn't exist" unless @dsym and File.exist?(@dsym)
95
114
 
96
115
  determine_host! unless @host = options.host
97
116
  say_error "Missing FTP host" and abort unless @host
@@ -104,10 +123,15 @@ command :'distribute:ftp' do |c|
104
123
 
105
124
  @path = options.path || ""
106
125
 
107
- client = Shenzhen::Plugins::FTP::Client.new(@host, @user, @password)
126
+ client = case options.protocol
127
+ when :sftp
128
+ Shenzhen::Plugins::SFTP::Client.new(@host, @user, @password)
129
+ else
130
+ Shenzhen::Plugins::FTP::Client.new(@host, @user, @password)
131
+ end
108
132
 
109
133
  begin
110
- client.upload_build @file, {:path => @path, :dsym => @dsym, :mkdir => !!options.mkdir}
134
+ client.upload @file, {:path => @path, :dsym => @dsym, :mkdir => !!options.mkdir}
111
135
  say_ok "Build successfully uploaded to FTP" unless options.quiet
112
136
  rescue => exception
113
137
  say_error "Error while uploading to FTP: #{exception}"
@@ -128,3 +152,5 @@ command :'distribute:ftp' do |c|
128
152
  @password ||= password "Password:"
129
153
  end
130
154
  end
155
+
156
+ alias_command :'distribute:sftp', :'distribute:ftp', '--protocol', 'sftp'
@@ -1,3 +1,4 @@
1
+ require 'json'
1
2
  require 'openssl'
2
3
  require 'faraday'
3
4
  require 'faraday_middleware'
@@ -19,17 +20,17 @@ module Shenzhen::Plugins
19
20
  end
20
21
 
21
22
  def upload_build(ipa, options)
22
- options[:ipa] = Faraday::UploadIO.new(ipa, 'application/octet-stream')
23
+ options[:ipa] = Faraday::UploadIO.new(ipa, 'application/octet-stream') if ipa and File.exist?(ipa)
23
24
 
24
25
  if dsym_filename = options.delete(:dsym_filename)
25
26
  options[:dsym] = Faraday::UploadIO.new(dsym_filename, 'application/octet-stream')
26
27
  end
27
28
 
28
29
  @connection.post do |req|
29
- if options[:public_identifer].nil?
30
+ if options[:public_identifier].nil?
30
31
  req.url("/api/2/apps/upload")
31
32
  else
32
- req.url("/api/2/apps/#{options.delete(:public_identifer)}/app_versions")
33
+ req.url("/api/2/apps/#{options.delete(:public_identifier)}/app_versions/upload")
33
34
  end
34
35
  req.headers['X-HockeyAppToken'] = @api_token
35
36
  req.body = options
@@ -70,7 +71,7 @@ command :'distribute:hockeyapp' do |c|
70
71
  say_error "Missing release notes" and abort unless @notes
71
72
 
72
73
  parameters = {}
73
- parameters[:public_identifer] = options.identifier if options.identifier
74
+ parameters[:public_identifier] = options.identifier if options.identifier
74
75
  parameters[:notes] = @notes
75
76
  parameters[:notes_type] = options.markdown ? "1" : "0"
76
77
  parameters[:notify] = "1" if options.notify && !options.downloadOff
@@ -0,0 +1,133 @@
1
+ require 'aws-sdk'
2
+
3
+ module Shenzhen::Plugins
4
+ module S3
5
+ class Client
6
+ def initialize(access_key_id, secret_access_key, region)
7
+ @s3 = AWS::S3.new(:access_key_id => access_key_id,
8
+ :secret_access_key => secret_access_key,
9
+ :region => region)
10
+ end
11
+
12
+ def upload_build(ipa, options)
13
+ path = expand_path_with_substitutions_from_ipa_plist(ipa, options[:path])
14
+
15
+ @s3.buckets.create(options[:bucket]) if options[:create]
16
+
17
+ bucket = @s3.buckets[options[:bucket]]
18
+
19
+ files = []
20
+ files << ipa
21
+ files << options[:dsym]
22
+ files.each do |file|
23
+ key = File.join(path, File.basename(file))
24
+ bucket.objects.create(key, File.open(file), :acl => options[:acl])
25
+ end
26
+ end
27
+
28
+ private
29
+
30
+ def expand_path_with_substitutions_from_ipa_plist(ipa, path)
31
+ components = []
32
+
33
+ substitutions = path.scan(/\{CFBundle[^}]+\}/)
34
+ return path if substitutions.empty?
35
+
36
+ Dir.mktmpdir do |dir|
37
+ system "unzip -q #{ipa} -d #{dir} 2> /dev/null"
38
+
39
+ plist = Dir["#{dir}/**/Info.plist"].last
40
+
41
+ substitutions.uniq.each do |substitution|
42
+ key = substitution[1...-1]
43
+ value = Shenzhen::PlistBuddy.print(plist, key)
44
+
45
+ path.gsub!(Regexp.new(substitution), value) if value
46
+ end
47
+ end
48
+
49
+ return path
50
+ end
51
+ end
52
+ end
53
+ end
54
+
55
+ command :'distribute:s3' do |c|
56
+ c.syntax = "ipa distribute:s3 [options]"
57
+ c.summary = "Distribute an .ipa file over Amazon S3"
58
+ c.description = ""
59
+
60
+ c.example '', '$ ipa distribute:s3 -f ./file.ipa -a accesskeyid --bucket bucket-name'
61
+
62
+ c.option '-f', '--file FILE', ".ipa file for the build"
63
+ c.option '-d', '--dsym FILE', "zipped .dsym package for the build"
64
+ c.option '-a', '--access-key-id ACCESS_KEY_ID', "AWS Access Key ID"
65
+ c.option '-s', '--secret-access-key SECRET_ACCESS_KEY', "AWS Secret Access Key"
66
+ c.option '-b', '--bucket BUCKET', "S3 bucket"
67
+ c.option '--[no-]create', "Create bucket if it doesn't already exist"
68
+ c.option '-r', '--region REGION', "Optional AWS region (for bucket creation)"
69
+ c.option '--acl ACL', "Uploaded object permissions e.g public_read (default), private, public_read_write, authenticated_read"
70
+ c.option '--source-dir SOURCE', "Optional source directory e.g. ./build"
71
+ c.option '-P', '--path PATH', "S3 'path'. Values from Info.plist will be substituded for keys wrapped in {} \n\t\t eg. \"/path/to/folder/{CFBundleVersion}/\" could be evaluated as \"/path/to/folder/1.0.0/\""
72
+
73
+ c.action do |args, options|
74
+ Dir.chdir(options.source_dir) if options.source_dir
75
+
76
+ determine_file! unless @file = options.file
77
+ say_error "Missing or unspecified .ipa file" and abort unless @file and File.exist?(@file)
78
+
79
+ determine_dsym! unless @dsym = options.dsym
80
+ say_error "Specified dSYM.zip file doesn't exist" unless @dsym and File.exist?(@dsym)
81
+
82
+ determine_access_key_id! unless @access_key_id = options.access_key_id
83
+ say_error "Missing AWS Access Key ID" and abort unless @access_key_id
84
+
85
+ determine_secret_access_key! unless @secret_access_key = options.secret_access_key
86
+ say_error "Missing AWS Secret Access Key" and abort unless @secret_access_key
87
+
88
+ determine_bucket! unless @bucket = options.bucket
89
+ say_error "Missing bucket" and abort unless @bucket
90
+
91
+ determine_region! unless @region = options.region
92
+ say_error "Missing region" and abort unless @region
93
+
94
+ determine_acl! unless @acl = options.acl
95
+ say_error "Missing ACL" and abort unless @acl
96
+
97
+ @path = options.path || ""
98
+
99
+ client = Shenzhen::Plugins::S3::Client.new(@access_key_id, @secret_access_key, @region)
100
+
101
+ begin
102
+ client.upload_build @file, {:bucket => @bucket, :create => !!options.create, :acl => @acl, :dsym => @dsym, :path => @path}
103
+ say_ok "Build successfully uploaded to S3" unless options.quiet
104
+ rescue => exception
105
+ say_error "Error while uploading to S3: #{exception}"
106
+ end
107
+ end
108
+
109
+ private
110
+
111
+ def determine_access_key_id!
112
+ @access_key_id ||= ENV['AWS_ACCESS_KEY_ID']
113
+ @access_key_id ||= ask "Access Key ID:"
114
+ end
115
+
116
+ def determine_secret_access_key!
117
+ @secret_access_key ||= ENV['AWS_SECRET_ACCESS_KEY']
118
+ @secret_access_key ||= secret_access_key "Secret Access Key:"
119
+ end
120
+
121
+ def determine_bucket!
122
+ @bucket ||= ENV['S3_BUCKET']
123
+ @bucket ||= ask "S3 Bucket:"
124
+ end
125
+
126
+ def determine_region!
127
+ @region ||= ENV['AWS_REGION'] || ""
128
+ end
129
+
130
+ def determine_acl!
131
+ @acl ||= "public_read"
132
+ end
133
+ end
@@ -1,3 +1,4 @@
1
+ require 'json'
1
2
  require 'openssl'
2
3
  require 'faraday'
3
4
  require 'faraday_middleware'
File without changes
@@ -1,5 +1,6 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  $:.push File.expand_path("../lib", __FILE__)
3
+
3
4
  require "shenzhen"
4
5
 
5
6
  Gem::Specification.new do |s|
@@ -17,6 +18,8 @@ Gem::Specification.new do |s|
17
18
  s.add_dependency "faraday", "~> 0.8"
18
19
  s.add_dependency "faraday_middleware", "~> 0.9"
19
20
  s.add_dependency "dotenv", "~> 0.7"
21
+ s.add_dependency "aws-sdk", "~> 1.0"
22
+ s.add_dependency "net-sftp", "~> 2.1.2"
20
23
 
21
24
  s.add_development_dependency "rspec"
22
25
  s.add_development_dependency "rake"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shenzhen
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mattt Thompson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-05-30 00:00:00.000000000 Z
11
+ date: 2013-10-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: commander
@@ -80,32 +80,60 @@ dependencies:
80
80
  - - ~>
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0.7'
83
+ - !ruby/object:Gem::Dependency
84
+ name: aws-sdk
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ~>
88
+ - !ruby/object:Gem::Version
89
+ version: '1.0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ~>
95
+ - !ruby/object:Gem::Version
96
+ version: '1.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: net-sftp
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ~>
102
+ - !ruby/object:Gem::Version
103
+ version: 2.1.2
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ~>
109
+ - !ruby/object:Gem::Version
110
+ version: 2.1.2
83
111
  - !ruby/object:Gem::Dependency
84
112
  name: rspec
85
113
  requirement: !ruby/object:Gem::Requirement
86
114
  requirements:
87
- - - ! '>='
115
+ - - '>='
88
116
  - !ruby/object:Gem::Version
89
117
  version: '0'
90
118
  type: :development
91
119
  prerelease: false
92
120
  version_requirements: !ruby/object:Gem::Requirement
93
121
  requirements:
94
- - - ! '>='
122
+ - - '>='
95
123
  - !ruby/object:Gem::Version
96
124
  version: '0'
97
125
  - !ruby/object:Gem::Dependency
98
126
  name: rake
99
127
  requirement: !ruby/object:Gem::Requirement
100
128
  requirements:
101
- - - ! '>='
129
+ - - '>='
102
130
  - !ruby/object:Gem::Version
103
131
  version: '0'
104
132
  type: :development
105
133
  prerelease: false
106
134
  version_requirements: !ruby/object:Gem::Requirement
107
135
  requirements:
108
- - - ! '>='
136
+ - - '>='
109
137
  - !ruby/object:Gem::Version
110
138
  version: '0'
111
139
  description: CLI for Building & Distributing iOS Apps (.ipa Files)
@@ -124,10 +152,12 @@ files:
124
152
  - ./lib/shenzhen/plistbuddy.rb
125
153
  - ./lib/shenzhen/plugins/ftp.rb
126
154
  - ./lib/shenzhen/plugins/hockeyapp.rb
155
+ - ./lib/shenzhen/plugins/s3.rb
127
156
  - ./lib/shenzhen/plugins/testflight.rb
128
157
  - ./lib/shenzhen/xcodebuild.rb
129
158
  - ./lib/shenzhen.rb
130
159
  - ./LICENSE
160
+ - ./nada.ipa
131
161
  - ./Rakefile
132
162
  - ./README.md
133
163
  - ./shenzhen.gemspec
@@ -141,12 +171,12 @@ require_paths:
141
171
  - lib
142
172
  required_ruby_version: !ruby/object:Gem::Requirement
143
173
  requirements:
144
- - - ! '>='
174
+ - - '>='
145
175
  - !ruby/object:Gem::Version
146
176
  version: '0'
147
177
  required_rubygems_version: !ruby/object:Gem::Requirement
148
178
  requirements:
149
- - - ! '>='
179
+ - - '>='
150
180
  - !ruby/object:Gem::Version
151
181
  version: '0'
152
182
  requirements: []