gym 0.3.2 → 0.3.3
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 +4 -4
- data/README.md +8 -2
- data/bin//360/237/222/252 +6 -0
- data/lib/gym.rb +9 -1
- data/lib/gym/error_handler.rb +8 -1
- data/lib/gym/manager.rb +1 -0
- data/lib/gym/options.rb +1 -4
- data/lib/gym/package_command_generator.rb +3 -11
- data/lib/gym/runner.rb +8 -45
- data/lib/gym/version.rb +1 -1
- data/lib/gym/xcodebuild_fixes/README.md +9 -0
- data/lib/gym/{xcode_fix.rb → xcodebuild_fixes/package_application_fix.rb} +17 -10
- data/lib/gym/xcodebuild_fixes/swift_fix.rb +45 -0
- data/lib/gym/xcodebuild_fixes/watchkit_fix.rb +35 -0
- metadata +9 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a8bddec4eefadb03f7101efb31470e229e97b256
|
4
|
+
data.tar.gz: d117764cec0e9985ba4814e415f28873b89771c9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9e8c5af75a48db478c218fea0470a1aa095300359f868b23dde81c21b513a058faa430a86496bef48e12466b38141afa0baac912be4dcd4dca3db089c85a4ed4
|
7
|
+
data.tar.gz: 4297f002c14cbd9efe12a0bcc93dcf5fbcef4087164d486d728686cfbbcf7a4161d86ddbd94a18fb3e0569835532fe1961bce932823d8d29285eb91c7735874f
|
data/README.md
CHANGED
@@ -119,6 +119,11 @@ For a list of all available parameters use
|
|
119
119
|
|
120
120
|
gym --help
|
121
121
|
|
122
|
+
If you run into any issues, use the `verbose` mode to get more information
|
123
|
+
|
124
|
+
|
125
|
+
gym --verbose
|
126
|
+
|
122
127
|
# Gymfile
|
123
128
|
|
124
129
|
Since you might want to manually trigger a new build but don't want to specify all the parameters every time, you can store your defaults in a so called `Gymfile`.
|
@@ -130,6 +135,8 @@ scheme "Example"
|
|
130
135
|
|
131
136
|
sdk "9.0"
|
132
137
|
|
138
|
+
clean true
|
139
|
+
|
133
140
|
output_directory "./build" # store the ipa in this folder
|
134
141
|
output_name "MyApp" # the name of the ipa file
|
135
142
|
```
|
@@ -190,8 +197,7 @@ Afterwards the `ipa` file is moved to the output folder. The `dSYM` file is comp
|
|
190
197
|
Download and install the [Provisioning Plugin](https://github.com/chockenberry/Provisioning).
|
191
198
|
|
192
199
|
# Need help?
|
193
|
-
|
194
|
-
- I'm available for contract work - drop me an email: gym@krausefx.com
|
200
|
+
Please submit an issue on GitHub and provide information about your setup
|
195
201
|
|
196
202
|
# License
|
197
203
|
This project is licensed under the terms of the MIT license. See the LICENSE file.
|
data/lib/gym.rb
CHANGED
@@ -8,7 +8,11 @@ require 'gym/runner'
|
|
8
8
|
require 'gym/error_handler'
|
9
9
|
require 'gym/options'
|
10
10
|
require 'gym/detect_values'
|
11
|
-
|
11
|
+
|
12
|
+
# Import all the fixes
|
13
|
+
require 'gym/xcodebuild_fixes/swift_fix'
|
14
|
+
require 'gym/xcodebuild_fixes/watchkit_fix'
|
15
|
+
require 'gym/xcodebuild_fixes/package_application_fix'
|
12
16
|
|
13
17
|
require 'fastlane_core'
|
14
18
|
require 'terminal-table'
|
@@ -27,6 +31,10 @@ module Gym
|
|
27
31
|
def gymfile_name
|
28
32
|
"Gymfile"
|
29
33
|
end
|
34
|
+
|
35
|
+
def xcode_path
|
36
|
+
@path ||= `xcode-select --print-path`.strip
|
37
|
+
end
|
30
38
|
end
|
31
39
|
|
32
40
|
Helper = FastlaneCore::Helper # you gotta love Ruby: Helper.* should use the Helper class contained in FastlaneCore
|
data/lib/gym/error_handler.rb
CHANGED
@@ -18,11 +18,18 @@ module Gym
|
|
18
18
|
print "Make sure you use the correct provisioning profile for this app"
|
19
19
|
print "Take a look at the ouptput above for more information"
|
20
20
|
print "You can follow this guide: https://github.com/KrauseFx/fastlane/blob/master/docs/CodeSigning.md"
|
21
|
-
when /provisioning profiles matching the bundle identifier
|
21
|
+
when /provisioning profiles matching the bundle identifier .(.*)./ # the . around the (.*) are for the strange "
|
22
22
|
print "You don't have the provisioning profile for '#{$1}' installed on the local machine"
|
23
23
|
print "Make sure you have the profile on this computer and it's properly installed"
|
24
24
|
print "You can use sigh (https://github.com/KrauseFx/sigh) to download and install the provisioning profile"
|
25
25
|
print "Follow this guide: https://github.com/KrauseFx/fastlane/blob/master/docs/CodeSigning.md"
|
26
|
+
when /matching the bundle identifier .(.*). were found/ # the . around the (.*) are for the strange "
|
27
|
+
print "You don't have a provisioning profile for the bundle identifier '#{$1}' installed on the local machine"
|
28
|
+
print "Make sure you have the profile on this computer and it's properly installed"
|
29
|
+
print "You can use sigh (https://github.com/KrauseFx/sigh) to download and install the provisioning profile"
|
30
|
+
print "Follow this guide: https://github.com/KrauseFx/fastlane/blob/master/docs/CodeSigning.md"
|
31
|
+
|
32
|
+
# Insert more code signing specific errors here
|
26
33
|
when /code signing is required/
|
27
34
|
print "Your project settings define invalid code signing settings"
|
28
35
|
print "To generate an ipa file you need to enable code signing for your project"
|
data/lib/gym/manager.rb
CHANGED
@@ -17,6 +17,7 @@ module Gym
|
|
17
17
|
rows << ["Workspace", config[:workspace]] if config[:workspace]
|
18
18
|
rows << ["Scheme", config[:scheme]] if config[:scheme]
|
19
19
|
rows << ["Configuration", config[:configuration]] if config[:configuration]
|
20
|
+
rows << ["Xcode path", Gym.xcode_path]
|
20
21
|
|
21
22
|
puts ""
|
22
23
|
puts Terminal::Table.new(
|
data/lib/gym/options.rb
CHANGED
@@ -49,10 +49,7 @@ module Gym
|
|
49
49
|
short_option: "-o",
|
50
50
|
env_name: "GYM_OUTPUT_DIRECTORY",
|
51
51
|
description: "The directory in which the ipa file should be stored in",
|
52
|
-
default_value: ".",
|
53
|
-
verify_block: proc do |value|
|
54
|
-
raise "Directory not found at path '#{File.expand_path(value)}'".red unless File.directory?(value)
|
55
|
-
end),
|
52
|
+
default_value: "."),
|
56
53
|
FastlaneCore::ConfigItem.new(key: :output_name,
|
57
54
|
short_option: "-n",
|
58
55
|
env_name: "GYM_OUTPUT_NAME",
|
@@ -6,12 +6,9 @@ module Gym
|
|
6
6
|
class PackageCommandGenerator
|
7
7
|
class << self
|
8
8
|
def generate
|
9
|
-
|
10
|
-
|
11
|
-
parts = ["/usr/bin/xcrun #{@patched_package_application} -v"]
|
9
|
+
parts = ["/usr/bin/xcrun #{XcodebuildFixes.patch_package_application} -v"]
|
12
10
|
parts += options
|
13
11
|
parts += pipe
|
14
|
-
parts += postfix
|
15
12
|
|
16
13
|
parts
|
17
14
|
end
|
@@ -38,13 +35,8 @@ module Gym
|
|
38
35
|
[""]
|
39
36
|
end
|
40
37
|
|
41
|
-
def postfix
|
42
|
-
# Remove the patched PackageApplication file after the export is finished
|
43
|
-
["&& rm '#{@patched_package_application}'"]
|
44
|
-
end
|
45
|
-
|
46
38
|
def appfile_path
|
47
|
-
Dir
|
39
|
+
Dir[BuildCommandGenerator.archive_path + "/**/*.app"].last
|
48
40
|
end
|
49
41
|
|
50
42
|
# We export it to the temporary folder and move it over to the actual output once it's finished and valid
|
@@ -54,7 +46,7 @@ module Gym
|
|
54
46
|
|
55
47
|
# The path the the dsym file for this app. Might be nil
|
56
48
|
def dsym_path
|
57
|
-
Dir[BuildCommandGenerator.archive_path + "/**/*.dSYM"].last
|
49
|
+
Dir[BuildCommandGenerator.archive_path + "/**/*.app.dSYM"].last
|
58
50
|
end
|
59
51
|
end
|
60
52
|
end
|
data/lib/gym/runner.rb
CHANGED
@@ -9,7 +9,9 @@ module Gym
|
|
9
9
|
build_app
|
10
10
|
verify_archive
|
11
11
|
package_app
|
12
|
-
swift_library_fix
|
12
|
+
Gym::XcodebuildFixes.swift_library_fix
|
13
|
+
Gym::XcodebuildFixes.watchkit_fix
|
14
|
+
Gym::XcodebuildFixes.clear_patched_package_application
|
13
15
|
move_results
|
14
16
|
end
|
15
17
|
|
@@ -23,12 +25,12 @@ module Gym
|
|
23
25
|
current = c.to_s.dup
|
24
26
|
next unless current.length > 0
|
25
27
|
|
26
|
-
|
28
|
+
match_default_parameter = current.match(/(-.*) '(.*)'/)
|
29
|
+
if match_default_parameter
|
27
30
|
# That's a default parameter, like `-project 'Name'`
|
28
|
-
|
29
|
-
current.split(" '")
|
31
|
+
match_default_parameter[1, 2]
|
30
32
|
else
|
31
|
-
current.gsub!("| ", "") # as the | will somehow break the terminal table
|
33
|
+
current.gsub!("| ", "\| ") # as the | will somehow break the terminal table
|
32
34
|
[current, ""]
|
33
35
|
end
|
34
36
|
end
|
@@ -86,50 +88,11 @@ module Gym
|
|
86
88
|
end)
|
87
89
|
end
|
88
90
|
|
89
|
-
# Determine whether it is a Swift project and, eventually, include all required libraries to copy from Xcode's toolchain directory.
|
90
|
-
# Since there's no "xcodebuild" target to do just that, it is done post-build when exporting an archived build.
|
91
|
-
def swift_library_fix
|
92
|
-
require 'fileutils'
|
93
|
-
|
94
|
-
ipa_swift_frameworks = Dir["#{PackageCommandGenerator.appfile_path}/Frameworks/libswift*"]
|
95
|
-
|
96
|
-
unless ipa_swift_frameworks.empty?
|
97
|
-
Dir.mktmpdir do |tmpdir|
|
98
|
-
# Copy all necessary Swift libraries to a temporary "SwiftSupport" directory so that we can
|
99
|
-
# easily add it to the .ipa later.
|
100
|
-
swift_support = File.join(tmpdir, "SwiftSupport")
|
101
|
-
|
102
|
-
Dir.mkdir(swift_support)
|
103
|
-
|
104
|
-
developer_dir = `xcode-select --print-path`.strip
|
105
|
-
ipa_swift_frameworks.each do |path|
|
106
|
-
framework = File.basename(path)
|
107
|
-
|
108
|
-
FileUtils.copy_file("#{developer_dir}/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphoneos/#{framework}", File.join(swift_support, framework))
|
109
|
-
end
|
110
|
-
|
111
|
-
# Add "SwiftSupport" to the .ipa archive
|
112
|
-
Dir.chdir(tmpdir) do
|
113
|
-
command_parts = ["zip --recurse-paths #{PackageCommandGenerator.ipa_path} SwiftSupport"]
|
114
|
-
command_parts << "> /dev/null" unless $verbose
|
115
|
-
print_command(command_parts, "Fix Swift embedded code if needed") if $verbose
|
116
|
-
|
117
|
-
FastlaneCore::CommandExecutor.execute(command: command_parts,
|
118
|
-
print_all: false,
|
119
|
-
print_command: !Gym.config[:silent],
|
120
|
-
error: proc do |output|
|
121
|
-
ErrorHandler.handle_package_error(output)
|
122
|
-
end)
|
123
|
-
end
|
124
|
-
end
|
125
|
-
end
|
126
|
-
end
|
127
|
-
|
128
91
|
# Moves over the binary and dsym file to the output directory
|
129
92
|
# @return (String) The path to the resulting ipa file
|
130
93
|
def move_results
|
131
94
|
require 'fileutils'
|
132
|
-
|
95
|
+
FileUtils.mkdir_p(Gym.config[:output_directory])
|
133
96
|
FileUtils.mv(PackageCommandGenerator.ipa_path, Gym.config[:output_directory], force: true)
|
134
97
|
|
135
98
|
if PackageCommandGenerator.dsym_path
|
data/lib/gym/version.rb
CHANGED
@@ -0,0 +1,9 @@
|
|
1
|
+
## Fixes
|
2
|
+
|
3
|
+
This directory contains all the (hopefully temporary) work-arounds to make the `ipa` export work.
|
4
|
+
|
5
|
+
`xcodebuild` doesn't get the same set of features as Xcode does (e.g. WatchKit app export, Swift export and more)
|
6
|
+
|
7
|
+
This directory should be empty as soon as all those `xcodebuild` issues are fixed.
|
8
|
+
|
9
|
+
In the mean-time we have all the workarounds in one central place
|
@@ -1,15 +1,14 @@
|
|
1
1
|
module Gym
|
2
|
-
class
|
2
|
+
class XcodebuildFixes
|
3
3
|
class << self
|
4
4
|
# Fix PackageApplication Perl script by Xcode to create the IPA from the archive
|
5
5
|
def patch_package_application
|
6
6
|
require 'fileutils'
|
7
7
|
|
8
8
|
# Initialization
|
9
|
-
|
10
|
-
patched_package_application_path = File.join("/tmp", "PackageApplication4Gym")
|
9
|
+
@patched_package_application_path = File.join("/tmp", "PackageApplication4Gym")
|
11
10
|
# Remove any previous patched PackageApplication
|
12
|
-
FileUtils.rm patched_package_application_path if File.exist?(patched_package_application_path)
|
11
|
+
FileUtils.rm @patched_package_application_path if File.exist?(@patched_package_application_path)
|
13
12
|
|
14
13
|
Dir.mktmpdir do |tmpdir|
|
15
14
|
# Check current PackageApplication MD5
|
@@ -19,29 +18,37 @@ module Gym
|
|
19
18
|
expected_md5 = File.read(path)
|
20
19
|
|
21
20
|
# If that location changes, search it using xcrun --sdk iphoneos -f PackageApplication
|
22
|
-
package_application_path = "#{
|
21
|
+
package_application_path = "#{Gym.xcode_path}/Platforms/iPhoneOS.platform/Developer/usr/bin/PackageApplication"
|
23
22
|
|
24
23
|
raise "Unable to patch the `PackageApplication` script bundled in XCode. This is not supported." unless expected_md5 == Digest::MD5.file(package_application_path).hexdigest
|
25
24
|
|
26
25
|
# Duplicate PackageApplication script to PackageApplication4Gym
|
27
|
-
FileUtils.copy_file(package_application_path, patched_package_application_path)
|
26
|
+
FileUtils.copy_file(package_application_path, @patched_package_application_path)
|
28
27
|
|
29
28
|
# Apply patches to PackageApplication4Gym from patches folder
|
30
29
|
Dir[File.join(Helper.gem_path("gym"), "lib/assets/package_application_patches/*.diff")].each do |patch|
|
31
|
-
Helper.log.info "Applying Package Application patch: #{File.basename(patch)}"
|
32
|
-
command = ["patch #{patched_package_application_path} < #{patch}"]
|
30
|
+
Helper.log.info "Applying Package Application patch: #{File.basename(patch)}" if $verbose
|
31
|
+
command = ["patch #{@patched_package_application_path} < #{patch}"]
|
33
32
|
Runner.new.print_command(command, "Applying Package Application patch: #{File.basename(patch)}") if $verbose
|
34
33
|
|
35
34
|
FastlaneCore::CommandExecutor.execute(command: command,
|
36
35
|
print_all: false,
|
37
|
-
print_command:
|
36
|
+
print_command: $verbose,
|
38
37
|
error: proc do |output|
|
39
38
|
ErrorHandler.handle_package_error(output)
|
40
39
|
end)
|
41
40
|
end
|
42
41
|
end
|
43
42
|
|
44
|
-
return patched_package_application_path # Return path to the patched PackageApplication
|
43
|
+
return @patched_package_application_path # Return path to the patched PackageApplication
|
44
|
+
end
|
45
|
+
|
46
|
+
# Remove the patched script after it was used
|
47
|
+
def clear_patched_package_application
|
48
|
+
if @patched_package_application_path and File.exist?(@patched_package_application_path)
|
49
|
+
Helper.log.debug "Removing patched PackageApplication file at path '#{@patched_package_application_path}'" if $verbose
|
50
|
+
File.delete(@patched_package_application_path)
|
51
|
+
end
|
45
52
|
end
|
46
53
|
end
|
47
54
|
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Gym
|
2
|
+
class XcodebuildFixes
|
3
|
+
class << self
|
4
|
+
# Determine whether it is a Swift project and, eventually, include all required libraries to copy from Xcode's toolchain directory.
|
5
|
+
# Since there's no "xcodebuild" target to do just that, it is done post-build when exporting an archived build.
|
6
|
+
def swift_library_fix
|
7
|
+
require 'fileutils'
|
8
|
+
|
9
|
+
ipa_swift_frameworks = Dir["#{PackageCommandGenerator.appfile_path}/Frameworks/libswift*"]
|
10
|
+
Helper.log.info "Checking for Swift framework" if $verbose
|
11
|
+
|
12
|
+
return if ipa_swift_frameworks.empty?
|
13
|
+
Helper.log.info "Packaging up the Swift Framework as the current app is a Swift app" if $verbose
|
14
|
+
|
15
|
+
Dir.mktmpdir do |tmpdir|
|
16
|
+
# Copy all necessary Swift libraries to a temporary "SwiftSupport" directory so that we can
|
17
|
+
# easily add it to the .ipa later.
|
18
|
+
swift_support = File.join(tmpdir, "SwiftSupport")
|
19
|
+
|
20
|
+
Dir.mkdir(swift_support)
|
21
|
+
|
22
|
+
ipa_swift_frameworks.each do |path|
|
23
|
+
framework = File.basename(path)
|
24
|
+
|
25
|
+
FileUtils.copy_file("#{Gym.xcode_path}/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphoneos/#{framework}", File.join(swift_support, framework))
|
26
|
+
end
|
27
|
+
|
28
|
+
# Add "SwiftSupport" to the .ipa archive
|
29
|
+
Dir.chdir(tmpdir) do
|
30
|
+
command_parts = ["zip --recurse-paths #{PackageCommandGenerator.ipa_path} SwiftSupport"]
|
31
|
+
command_parts << "> /dev/null" unless $verbose
|
32
|
+
print_command(command_parts, "Fix Swift embedded code if needed") if $verbose
|
33
|
+
|
34
|
+
FastlaneCore::CommandExecutor.execute(command: command_parts,
|
35
|
+
print_all: false,
|
36
|
+
print_command: !Gym.config[:silent],
|
37
|
+
error: proc do |output|
|
38
|
+
ErrorHandler.handle_package_error(output)
|
39
|
+
end)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Gym
|
2
|
+
class XcodebuildFixes
|
3
|
+
class << self
|
4
|
+
# Determine whether this app has WatchKit support and manually package up the WatchKit framework
|
5
|
+
def watchkit_fix
|
6
|
+
return unless watchkit?
|
7
|
+
|
8
|
+
Helper.log.info "Adding WatchKit support" if $verbose
|
9
|
+
|
10
|
+
Dir.mktmpdir do |tmpdir|
|
11
|
+
# Make watchkit support directory
|
12
|
+
watchkit_support = File.join(tmpdir, "WatchKitSupport")
|
13
|
+
Dir.mkdir(watchkit_support)
|
14
|
+
|
15
|
+
# Copy WK from Xcode into WatchKitSupport
|
16
|
+
FileUtils.copy_file("#{Gym.xcode_path}/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/Library/Application Support/WatchKit/WK", File.join(watchkit_support, "WK"))
|
17
|
+
|
18
|
+
# Add "WatchKitSupport" to the .ipa archive
|
19
|
+
Dir.chdir(tmpdir) do
|
20
|
+
abort unless system %(zip --recurse-paths "#{PackageCommandGenerator.ipa_path}" "WatchKitSupport" > /dev/null)
|
21
|
+
end
|
22
|
+
|
23
|
+
Helper.log.info "Successfully added WatchKit support" if $verbose
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# Does this application have a WatchKit target
|
28
|
+
def watchkit?
|
29
|
+
Dir["#{PackageCommandGenerator.appfile_path}/**/*.plist"].any? do |plist_path|
|
30
|
+
`/usr/libexec/PlistBuddy -c 'Print WKWatchKitApp' '#{plist_path}' 2>&1`.strip == 'true'
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gym
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Felix Krause
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-08-
|
11
|
+
date: 2015-08-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: fastlane_core
|
@@ -183,12 +183,14 @@ email:
|
|
183
183
|
- gym@krausefx.com
|
184
184
|
executables:
|
185
185
|
- gym
|
186
|
+
- "\U0001F4AA"
|
186
187
|
extensions: []
|
187
188
|
extra_rdoc_files: []
|
188
189
|
files:
|
189
190
|
- LICENSE
|
190
191
|
- README.md
|
191
192
|
- bin/gym
|
193
|
+
- "bin/\U0001F4AA"
|
192
194
|
- lib/assets/GymfileTemplate
|
193
195
|
- lib/assets/package_application_patches/0001_codesign_args_patch.diff
|
194
196
|
- lib/assets/package_application_patches/0002_no_strict_parameter_patch.diff
|
@@ -204,7 +206,10 @@ files:
|
|
204
206
|
- lib/gym/project.rb
|
205
207
|
- lib/gym/runner.rb
|
206
208
|
- lib/gym/version.rb
|
207
|
-
- lib/gym/
|
209
|
+
- lib/gym/xcodebuild_fixes/README.md
|
210
|
+
- lib/gym/xcodebuild_fixes/package_application_fix.rb
|
211
|
+
- lib/gym/xcodebuild_fixes/swift_fix.rb
|
212
|
+
- lib/gym/xcodebuild_fixes/watchkit_fix.rb
|
208
213
|
homepage: https://fastlane.tools
|
209
214
|
licenses:
|
210
215
|
- MIT
|
@@ -225,7 +230,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
225
230
|
version: '0'
|
226
231
|
requirements: []
|
227
232
|
rubyforge_project:
|
228
|
-
rubygems_version: 2.4.
|
233
|
+
rubygems_version: 2.4.6
|
229
234
|
signing_key:
|
230
235
|
specification_version: 4
|
231
236
|
summary: Building your iOS apps has never been easier
|