fwtoolkit 0.5.4 → 0.6.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.
- data/bin/fwt +15 -7
- data/lib/fwtoolkit/tasks.rb +24 -0
- data/lib/fwtoolkit/tasks/build.rb +111 -0
- data/lib/fwtoolkit/tasks/ci.rb +26 -0
- data/lib/fwtoolkit/tasks/cocoapods.rb +28 -0
- data/lib/fwtoolkit/tasks/frank.rb +110 -0
- data/lib/fwtoolkit/tasks/services.rb +41 -0
- data/lib/fwtoolkit/version.rb +1 -1
- data/templates/fwt/Gemfile.erb +1 -1
- data/templates/fwt/Rakefile.erb +1 -1
- metadata +26 -6
- data/lib/fwtoolkit/tasks/build_tasks.rb +0 -252
- data/lib/fwtoolkit/tasks/frank_tasks.rb +0 -41
data/bin/fwt
CHANGED
@@ -12,7 +12,10 @@ class FWT < Thor
|
|
12
12
|
end
|
13
13
|
|
14
14
|
desc "new APP_PATH PREFIX", "Creates a new Future Workshops iOS project"
|
15
|
-
def new(app_path, prefix)
|
15
|
+
def new(app_path, prefix)
|
16
|
+
|
17
|
+
setup_cocoapods
|
18
|
+
|
16
19
|
@app_name = File.basename(app_path)
|
17
20
|
@prefix = prefix.upcase
|
18
21
|
@path = app_path
|
@@ -21,7 +24,7 @@ class FWT < Thor
|
|
21
24
|
@project = Xcodeproj::Project.new
|
22
25
|
@project.root_object.build_configuration_list
|
23
26
|
@project.add_system_framework('UIKit')
|
24
|
-
|
27
|
+
@project.add_system_framework('CoreGraphics') # bug in latest RestKit pod?
|
25
28
|
|
26
29
|
info_plist = "#{@app_name}-Info.plist"
|
27
30
|
process_template("Info.plist.erb", info_plist, supporting_files)
|
@@ -54,15 +57,20 @@ class FWT < Thor
|
|
54
57
|
sleep 5
|
55
58
|
|
56
59
|
inside(@path) do
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
+
run "rvm gemset create #{@app_name}", {:capture => true}
|
61
|
+
run "rvm gemset use #{@app_name}", {:capture => true}
|
62
|
+
run 'bundle', {:capture => true}
|
63
|
+
run 'rake pod:clean_install', {:capture => true}
|
64
|
+
run "rake frank:setup['#{@app_name}','#{@prefix}']", {:capture => true}
|
60
65
|
end
|
61
66
|
end
|
62
67
|
|
63
68
|
private
|
64
|
-
def
|
65
|
-
|
69
|
+
def setup_cocoapods
|
70
|
+
unless Dir.exists?(File.join(Dir.home, '.cocoapods', 'fw'))
|
71
|
+
run 'gem install cocoapods', {:capture => true}
|
72
|
+
run 'pod repo add fw git@github.com:FutureWorkshops/FWTPodspecs.git', {:capture => true}
|
73
|
+
end
|
66
74
|
end
|
67
75
|
|
68
76
|
def process_template(template_filename, destination_filename, destination_group = "", template_project = 'default_project')
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'thor'
|
2
|
+
|
3
|
+
require 'fwtoolkit/tasks/build'
|
4
|
+
require 'fwtoolkit/tasks/cocoapods'
|
5
|
+
require 'fwtoolkit/tasks/frank'
|
6
|
+
require 'fwtoolkit/tasks/services'
|
7
|
+
require 'fwtoolkit/tasks/ci'
|
8
|
+
|
9
|
+
FWToolkit::Tasks::Cocoapods.new.install_tasks
|
10
|
+
FWToolkit::Tasks::Frank.new.install_tasks
|
11
|
+
FWToolkit::Tasks::Services.new.install_tasks
|
12
|
+
FWToolkit::Tasks::CI.new.install_tasks
|
13
|
+
|
14
|
+
# monkey patching string to add the ruby_format method
|
15
|
+
# used in frank:model tasks
|
16
|
+
class String
|
17
|
+
def ruby_format
|
18
|
+
self.gsub(/(.)([A-Z])/,'\1_\2').downcase
|
19
|
+
end
|
20
|
+
|
21
|
+
def ruby_format!
|
22
|
+
replace ruby_format
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
require 'rake/tasklib'
|
2
|
+
require 'rubygems'
|
3
|
+
require 'xcodebuild'
|
4
|
+
require 'cucumber/rake/task'
|
5
|
+
require 'core_data'
|
6
|
+
require 'erb'
|
7
|
+
require 'xcodeproj'
|
8
|
+
|
9
|
+
module XcodeBuild
|
10
|
+
def self.run(args = "", output_buffer = STDOUT)
|
11
|
+
command = "xcodebuild #{args} DSTROOT=/tmp/artifacts 2>&1"
|
12
|
+
#puts command
|
13
|
+
IO.popen(command) do |io|
|
14
|
+
begin
|
15
|
+
while line = io.readline
|
16
|
+
begin
|
17
|
+
output_buffer << line
|
18
|
+
rescue StandardError => e
|
19
|
+
puts "Error from output buffer: #{e.inspect}"
|
20
|
+
puts e.backtrace
|
21
|
+
end
|
22
|
+
end
|
23
|
+
rescue EOFError
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
$?.exitstatus
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
module FWToolkit
|
32
|
+
module Tasks
|
33
|
+
class BuildTask < ::Rake::TaskLib
|
34
|
+
|
35
|
+
TEMPLATES_DIR = File.expand_path('../../../templates/', File.dirname(__FILE__))
|
36
|
+
|
37
|
+
include Rake::DSL if defined?(Rake::DSL)
|
38
|
+
|
39
|
+
attr_accessor :workspace
|
40
|
+
attr_accessor :scheme
|
41
|
+
attr_accessor :bundle_identifier
|
42
|
+
attr_accessor :certificate
|
43
|
+
attr_accessor :provisioning_profile
|
44
|
+
|
45
|
+
def initialize(&block)
|
46
|
+
yield self if block_given?
|
47
|
+
define
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
def define
|
53
|
+
namespace :xcode do
|
54
|
+
XcodeBuild::Tasks::BuildTask.new :debug_simulator do |t|
|
55
|
+
t.invoke_from_within = '.'
|
56
|
+
t.configuration = "Debug"
|
57
|
+
t.sdk = "iphonesimulator"
|
58
|
+
t.workspace = @workspace
|
59
|
+
t.scheme = @scheme
|
60
|
+
t.formatter = XcodeBuild::Formatters::ProgressFormatter.new
|
61
|
+
end
|
62
|
+
|
63
|
+
XcodeBuild::Tasks::BuildTask.new :release_iphoneos do |t|
|
64
|
+
t.invoke_from_within = '.'
|
65
|
+
t.configuration = "Release"
|
66
|
+
t.sdk = "iphoneos"
|
67
|
+
t.workspace = @workspace
|
68
|
+
t.scheme = @scheme
|
69
|
+
t.formatter = XcodeBuild::Formatters::ProgressFormatter.new
|
70
|
+
end
|
71
|
+
|
72
|
+
desc 'Build IPA file'
|
73
|
+
task :ipa do
|
74
|
+
command = "xcrun -sdk 'iphoneos' PackageApplication -v '/tmp/artifacts/Applications/#{scheme}.app' -o '/tmp/artifacts/Applications/#{scheme}.ipa' --sign '#{certificate}' --embed '#{provisioning_profile}'"
|
75
|
+
sh command
|
76
|
+
end
|
77
|
+
|
78
|
+
task :validate_auth_token do
|
79
|
+
unless ENV['FWBUILD_AUTH_TOKEN']
|
80
|
+
abort 'Please set FWBUILD_AUTH_TOKEN environment variable'
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
task :upload do
|
85
|
+
auth_token = ENV['FWBUILD_AUTH_TOKEN']
|
86
|
+
file_name = "#{scheme}.ipa"
|
87
|
+
key = File.join('uploads', file_name)
|
88
|
+
sh("curl -X POST -F 'key=#{key}' -F 'acl=bucket-owner-full-control' -F 'file=@/tmp/artifacts/Applications/#{scheme}.ipa' https://fw.fwbuild.production.s3.amazonaws.com/ --progress-bar")
|
89
|
+
sh("curl -X POST -d 'bundle_identifier=#{@bundle_identifier}&s3_upload_name=#{file_name}&auth_token=#{auth_token}&build[version]=#{DateTime.now.to_s}' http://fwbuild.futureworkshops.com/apps/builds.json")
|
90
|
+
end
|
91
|
+
|
92
|
+
desc 'Build and Upload IPA'
|
93
|
+
task :build_upload => [:validate_auth_token, 'release_iphoneos:archive', :ipa, :upload]
|
94
|
+
end
|
95
|
+
|
96
|
+
namespace :fwbuild do
|
97
|
+
task :upload do
|
98
|
+
S3Cmd.put("path/to/a/file.ext", "s3://fw.fwbuild.production/uploads/") do |progress|
|
99
|
+
puts progress
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
task :build_upload => ["xcode:release_device:clean", "xcode:release_device:archive", "upload"]
|
104
|
+
end
|
105
|
+
|
106
|
+
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module FWToolkit
|
2
|
+
module Tasks
|
3
|
+
class CI < Thor
|
4
|
+
|
5
|
+
include Rake::DSL if defined?(Rake::DSL)
|
6
|
+
include Thor::Actions
|
7
|
+
|
8
|
+
no_tasks do
|
9
|
+
def install_tasks
|
10
|
+
namespace :ci do
|
11
|
+
|
12
|
+
task :bundle do
|
13
|
+
run 'bundle'
|
14
|
+
end
|
15
|
+
|
16
|
+
desc 'Clean, build and test'
|
17
|
+
task :build => ["ci:bundle", "xcode:debug_simulator:cleanbuild", "frank:build", "frank:ci_test"]
|
18
|
+
|
19
|
+
desc 'Clean, build and test for Cocoapods projects'
|
20
|
+
task :pod_build => ["ci:bundle", "pod:clean_install", "ci:build"]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module FWToolkit
|
2
|
+
module Tasks
|
3
|
+
class Cocoapods < Thor
|
4
|
+
|
5
|
+
include Rake::DSL if defined?(Rake::DSL)
|
6
|
+
include Thor::Actions
|
7
|
+
|
8
|
+
no_tasks do
|
9
|
+
def install_tasks
|
10
|
+
namespace :pod do
|
11
|
+
task :clean do
|
12
|
+
remove_dir 'Pods'
|
13
|
+
end
|
14
|
+
|
15
|
+
task :install do
|
16
|
+
run 'pod install'
|
17
|
+
end
|
18
|
+
|
19
|
+
desc 'Clean and install Pods'
|
20
|
+
task :clean_install => [:clean, :install]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
@@ -0,0 +1,110 @@
|
|
1
|
+
module FWToolkit
|
2
|
+
module Tasks
|
3
|
+
class Frank < Thor
|
4
|
+
|
5
|
+
include Rake::DSL if defined?(Rake::DSL)
|
6
|
+
include Thor::Actions
|
7
|
+
|
8
|
+
def self.source_root
|
9
|
+
File.join(File.dirname(__FILE__), '..', '..', '..')
|
10
|
+
end
|
11
|
+
|
12
|
+
no_tasks do
|
13
|
+
def install_tasks
|
14
|
+
namespace :frank do
|
15
|
+
desc 'Setup Frank'
|
16
|
+
task :setup, [:target, :prefix] do |t, args|
|
17
|
+
args.with_defaults(:prefix => '')
|
18
|
+
setup(args[:target], args[:prefix])
|
19
|
+
end
|
20
|
+
|
21
|
+
desc 'Create Frank model files from CoreData'
|
22
|
+
task :model, [:model_file, :prefix] do |t, args|
|
23
|
+
args.with_defaults(:model_file => nil)
|
24
|
+
args.with_defaults(:prefix => 'true')
|
25
|
+
prefix = args[:prefix].eql? 'true'
|
26
|
+
@no_prefix = !prefix
|
27
|
+
|
28
|
+
# validation step - core_data_model should be of type .xcdatamodel
|
29
|
+
output_dir = File.join('Frank', 'features', 'support', 'models')
|
30
|
+
makedirs output_dir unless Dir.exists? output_dir
|
31
|
+
|
32
|
+
model = CoreData::DataModel.new(File.join(args[:model_file], 'contents'))
|
33
|
+
@models = model.entities
|
34
|
+
|
35
|
+
@models.each do |entity|
|
36
|
+
@model = entity
|
37
|
+
@class_name = class_name(@model)
|
38
|
+
factory_template = File.join 'models', 'model.rb.erb'
|
39
|
+
template(factory_template, File.join(output_dir, "#{class_name(@model).ruby_format}.rb"))
|
40
|
+
end
|
41
|
+
|
42
|
+
factory_template = File.join 'models', 'factories.rb.erb'
|
43
|
+
template(factory_template, File.join(output_dir, 'factories.rb'))
|
44
|
+
end
|
45
|
+
|
46
|
+
desc 'Build the frankified App'
|
47
|
+
task :build do
|
48
|
+
run "frank build --workspace #{@workspace} --scheme #{@scheme}"
|
49
|
+
end
|
50
|
+
|
51
|
+
Cucumber::Rake::Task.new(:ci_test, 'Run Frank acceptance tests with CI options') do |t|
|
52
|
+
ENV['APP_BUNDLE_PATH'] = File.join( Dir.pwd, 'Frank/frankified_build/Frankified.app' )
|
53
|
+
ENV['USE_SIM_LAUNCHER_SERVER'] = 'YES'
|
54
|
+
artifacts_dir = ENV['CC_BUILD_ARTIFACTS'] ? ENV['CC_BUILD_ARTIFACTS'] : '/tmp'
|
55
|
+
t.cucumber_opts = "Frank/features --tags ~@wip --format pretty --format html --out '#{artifacts_dir}/frank_results.html' --format rerun --out '#{artifacts_dir}/frank_rerun.txt'"
|
56
|
+
end
|
57
|
+
|
58
|
+
desc 'Run Frank acceptance tests'
|
59
|
+
task :test, :cucumber_options do |t, args|
|
60
|
+
args.with_defaults(:cucumber_options => 'Frank/features --tag ~@wip')
|
61
|
+
|
62
|
+
ENV['APP_BUNDLE_PATH'] = File.join( Dir.pwd, 'Frank/frankified_build/Frankified.app' )
|
63
|
+
ENV['USE_SIM_LAUNCHER_SERVER'] = nil
|
64
|
+
run "cucumber #{args.cucumber_options}"
|
65
|
+
end
|
66
|
+
|
67
|
+
desc 'Run Frank acceptance tests for a tag'
|
68
|
+
task :tag, :tag_name do |t, args|
|
69
|
+
args.with_defaults(:tag_name => '')
|
70
|
+
cucumber_options = "Frank/features --tag #{args.tag_name}"
|
71
|
+
|
72
|
+
ENV['APP_BUNDLE_PATH'] = File.join( Dir.pwd, 'Frank/frankified_build/Frankified.app' )
|
73
|
+
ENV['USE_SIM_LAUNCHER_SERVER'] = nil
|
74
|
+
run "cucumber #{cucumber_options}"
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def class_name(entity)
|
80
|
+
@no_prefix ? entity.name : entity.name[3..-1]
|
81
|
+
end
|
82
|
+
|
83
|
+
def setup(target = nil, prefix = nil, project_directory = target, project_file = "#{target}.xcodeproj")
|
84
|
+
run 'frank setup'
|
85
|
+
features_dir = File.join('Frank', 'features')
|
86
|
+
remove_file(File.join(features_dir, 'my_first.feature'))
|
87
|
+
|
88
|
+
if target
|
89
|
+
test_dir = File.join(FWToolkit::Tasks::BuildTask::TEMPLATES_DIR, 'cucumber')
|
90
|
+
directory(File.join(FWToolkit::Tasks::BuildTask::TEMPLATES_DIR, 'cucumber', 'features'), features_dir, {:force => true})
|
91
|
+
|
92
|
+
@prefix = prefix
|
93
|
+
template 'templates/cucumber/AppDelegate+Frank.h.erb', File.join(project_directory, "#{prefix}AppDelegate+Frank.h")
|
94
|
+
template 'templates/cucumber/AppDelegate+Frank.m.erb', File.join(project_directory, "#{prefix}AppDelegate+Frank.m")
|
95
|
+
|
96
|
+
project = Xcodeproj::Project.new(project_file)
|
97
|
+
project.new_file(File.join(project_directory, "#{prefix}AppDelegate+Frank.h"), project_directory)
|
98
|
+
frank_app_d_m = project.new_file(File.join(project_directory, "#{prefix}AppDelegate+Frank.m"), project_directory)
|
99
|
+
|
100
|
+
target = project.targets.select{|t| t.name.eql? target}[0]
|
101
|
+
target.add_file_references([frank_app_d_m])
|
102
|
+
|
103
|
+
project.save_as(project_file)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module FWToolkit
|
2
|
+
module Tasks
|
3
|
+
class Services < Thor
|
4
|
+
|
5
|
+
include Rake::DSL if defined?(Rake::DSL)
|
6
|
+
include Thor::Actions
|
7
|
+
|
8
|
+
no_tasks do
|
9
|
+
def install_tasks
|
10
|
+
namespace :services do
|
11
|
+
|
12
|
+
task :environment do
|
13
|
+
require 'fwtoolkit'
|
14
|
+
Dir[File.join( Dir.pwd, 'Frank/features/support/models/*.rb')].each {|file| require file }
|
15
|
+
Dir[File.join( Dir.pwd, 'Frank/features/support/views/*.rb')].each {|file| require file }
|
16
|
+
end
|
17
|
+
|
18
|
+
desc 'Seed objects into the service'
|
19
|
+
task :seed => [:environment] do
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
require 'daemons'
|
24
|
+
desc 'Run a service'
|
25
|
+
task :run, [:service_name] => [:environment, :seed] do |t, args|
|
26
|
+
args.with_defaults(:service_name => 'mimic', :seeds_name => nil)
|
27
|
+
|
28
|
+
require File.join( Dir.pwd, "Frank/features/support/#{args.service_name}.rb")
|
29
|
+
say "Service #{args.service_name} running"
|
30
|
+
loop do
|
31
|
+
sleep(5)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/lib/fwtoolkit/version.rb
CHANGED
data/templates/fwt/Gemfile.erb
CHANGED
data/templates/fwt/Rakefile.erb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fwtoolkit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-12-
|
12
|
+
date: 2012-12-12 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: cucumber
|
@@ -251,6 +251,22 @@ dependencies:
|
|
251
251
|
- - '='
|
252
252
|
- !ruby/object:Gem::Version
|
253
253
|
version: 0.4.0
|
254
|
+
- !ruby/object:Gem::Dependency
|
255
|
+
name: pry
|
256
|
+
requirement: !ruby/object:Gem::Requirement
|
257
|
+
none: false
|
258
|
+
requirements:
|
259
|
+
- - '='
|
260
|
+
- !ruby/object:Gem::Version
|
261
|
+
version: 0.9.10
|
262
|
+
type: :runtime
|
263
|
+
prerelease: false
|
264
|
+
version_requirements: !ruby/object:Gem::Requirement
|
265
|
+
none: false
|
266
|
+
requirements:
|
267
|
+
- - '='
|
268
|
+
- !ruby/object:Gem::Version
|
269
|
+
version: 0.9.10
|
254
270
|
description: A collection of iOS development tools used by Future Workshops
|
255
271
|
email:
|
256
272
|
- matt@futureworkshops.com
|
@@ -262,8 +278,12 @@ files:
|
|
262
278
|
- bin/fwt
|
263
279
|
- lib/fwtoolkit.rb
|
264
280
|
- lib/fwtoolkit/cli.rb
|
265
|
-
- lib/fwtoolkit/tasks
|
266
|
-
- lib/fwtoolkit/tasks/
|
281
|
+
- lib/fwtoolkit/tasks.rb
|
282
|
+
- lib/fwtoolkit/tasks/build.rb
|
283
|
+
- lib/fwtoolkit/tasks/ci.rb
|
284
|
+
- lib/fwtoolkit/tasks/cocoapods.rb
|
285
|
+
- lib/fwtoolkit/tasks/frank.rb
|
286
|
+
- lib/fwtoolkit/tasks/services.rb
|
267
287
|
- lib/fwtoolkit/test/frank_model.rb
|
268
288
|
- lib/fwtoolkit/test/misc_steps.rb
|
269
289
|
- lib/fwtoolkit/test/model_helper.rb
|
@@ -306,7 +326,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
306
326
|
version: '0'
|
307
327
|
segments:
|
308
328
|
- 0
|
309
|
-
hash:
|
329
|
+
hash: 4014457021948550821
|
310
330
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
311
331
|
none: false
|
312
332
|
requirements:
|
@@ -315,7 +335,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
315
335
|
version: '0'
|
316
336
|
segments:
|
317
337
|
- 0
|
318
|
-
hash:
|
338
|
+
hash: 4014457021948550821
|
319
339
|
requirements: []
|
320
340
|
rubyforge_project:
|
321
341
|
rubygems_version: 1.8.24
|
@@ -1,252 +0,0 @@
|
|
1
|
-
require 'rake/tasklib'
|
2
|
-
require 'rubygems'
|
3
|
-
require 'xcodebuild'
|
4
|
-
require 'cucumber/rake/task'
|
5
|
-
require 'core_data'
|
6
|
-
require 'erb'
|
7
|
-
require 'xcodeproj'
|
8
|
-
require 'fwtoolkit/tasks/frank_tasks'
|
9
|
-
|
10
|
-
class String
|
11
|
-
def ruby_format
|
12
|
-
self.gsub(/(.)([A-Z])/,'\1_\2').downcase
|
13
|
-
end
|
14
|
-
|
15
|
-
def ruby_format!
|
16
|
-
replace ruby_format
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
module XcodeBuild
|
21
|
-
def self.run(args = "", output_buffer = STDOUT)
|
22
|
-
command = "xcodebuild #{args} DSTROOT=/tmp/artifacts 2>&1"
|
23
|
-
#puts command
|
24
|
-
IO.popen(command) do |io|
|
25
|
-
begin
|
26
|
-
while line = io.readline
|
27
|
-
begin
|
28
|
-
output_buffer << line
|
29
|
-
rescue StandardError => e
|
30
|
-
puts "Error from output buffer: #{e.inspect}"
|
31
|
-
puts e.backtrace
|
32
|
-
end
|
33
|
-
end
|
34
|
-
rescue EOFError
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
$?.exitstatus
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
module FWToolkit
|
43
|
-
module Tasks
|
44
|
-
class BuildTask < ::Rake::TaskLib
|
45
|
-
|
46
|
-
TEMPLATES_DIR = File.expand_path('../../../templates/', File.dirname(__FILE__))
|
47
|
-
|
48
|
-
include Rake::DSL if defined?(Rake::DSL)
|
49
|
-
|
50
|
-
attr_accessor :workspace
|
51
|
-
attr_accessor :scheme
|
52
|
-
attr_accessor :bundle_identifier
|
53
|
-
attr_accessor :certificate
|
54
|
-
attr_accessor :provisioning_profile
|
55
|
-
|
56
|
-
def initialize(&block)
|
57
|
-
yield self if block_given?
|
58
|
-
define
|
59
|
-
end
|
60
|
-
|
61
|
-
private
|
62
|
-
|
63
|
-
def define
|
64
|
-
namespace :xcode do
|
65
|
-
XcodeBuild::Tasks::BuildTask.new :debug_simulator do |t|
|
66
|
-
t.invoke_from_within = '.'
|
67
|
-
t.configuration = "Debug"
|
68
|
-
t.sdk = "iphonesimulator"
|
69
|
-
t.workspace = @workspace
|
70
|
-
t.scheme = @scheme
|
71
|
-
t.formatter = XcodeBuild::Formatters::ProgressFormatter.new
|
72
|
-
end
|
73
|
-
|
74
|
-
XcodeBuild::Tasks::BuildTask.new :release_iphoneos do |t|
|
75
|
-
t.invoke_from_within = '.'
|
76
|
-
t.configuration = "Release"
|
77
|
-
t.sdk = "iphoneos"
|
78
|
-
t.workspace = @workspace
|
79
|
-
t.scheme = @scheme
|
80
|
-
t.formatter = XcodeBuild::Formatters::ProgressFormatter.new
|
81
|
-
end
|
82
|
-
|
83
|
-
desc 'Build IPA file'
|
84
|
-
task :ipa do
|
85
|
-
command = "xcrun -sdk 'iphoneos' PackageApplication -v '/tmp/artifacts/Applications/#{scheme}.app' -o '/tmp/artifacts/Applications/#{scheme}.ipa' --sign '#{certificate}' --embed '#{provisioning_profile}'"
|
86
|
-
sh command
|
87
|
-
end
|
88
|
-
|
89
|
-
task :validate_auth_token do
|
90
|
-
unless ENV['FWBUILD_AUTH_TOKEN']
|
91
|
-
abort 'Please set FWBUILD_AUTH_TOKEN environment variable'
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
task :upload do
|
96
|
-
auth_token = ENV['FWBUILD_AUTH_TOKEN']
|
97
|
-
file_name = "#{scheme}.ipa"
|
98
|
-
key = File.join('uploads', file_name)
|
99
|
-
sh("curl -X POST -F 'key=#{key}' -F 'acl=bucket-owner-full-control' -F 'file=@/tmp/artifacts/Applications/#{scheme}.ipa' https://fw.fwbuild.production.s3.amazonaws.com/ --progress-bar")
|
100
|
-
sh("curl -X POST -d 'bundle_identifier=#{@bundle_identifier}&s3_upload_name=#{file_name}&auth_token=#{auth_token}&build[version]=#{DateTime.now.to_s}' http://fwbuild.futureworkshops.com/apps/builds.json")
|
101
|
-
end
|
102
|
-
|
103
|
-
desc 'Build and Upload IPA'
|
104
|
-
task :build_upload => [:validate_auth_token, 'release_iphoneos:archive', :ipa, :upload]
|
105
|
-
end
|
106
|
-
|
107
|
-
namespace :frank do
|
108
|
-
desc 'Setup Frank'
|
109
|
-
task :setup, [:target, :prefix] do |t, args|
|
110
|
-
args.with_defaults(:prefix => '')
|
111
|
-
|
112
|
-
FWToolkit::Tasks::FrankTasks.new.setup(args[:target], args[:prefix])
|
113
|
-
|
114
|
-
end
|
115
|
-
|
116
|
-
def template(template_file, output_file)
|
117
|
-
puts "c #{output_file}"
|
118
|
-
output = ERB.new(File.read(File.join(TEMPLATES_DIR, template_file))).result(binding)
|
119
|
-
File.open(output_file, "w+") do |f|
|
120
|
-
f.write(output)
|
121
|
-
end
|
122
|
-
end
|
123
|
-
|
124
|
-
def class_name(entity)
|
125
|
-
@no_prefix ? entity.name : entity.name[3..-1]
|
126
|
-
end
|
127
|
-
|
128
|
-
desc 'Create Frank model files from CoreData'
|
129
|
-
task :model, [:model_file, :prefix] do |t, args|
|
130
|
-
args.with_defaults(:model_file => nil)
|
131
|
-
args.with_defaults(:prefix => 'true')
|
132
|
-
prefix = args[:prefix].eql? 'true'
|
133
|
-
@no_prefix = !prefix
|
134
|
-
|
135
|
-
# validation step - core_data_model should be of type .xcdatamodel
|
136
|
-
output_dir = File.join('Frank', 'features', 'support', 'models')
|
137
|
-
makedirs output_dir unless Dir.exists? output_dir
|
138
|
-
|
139
|
-
model = CoreData::DataModel.new(File.join(args[:model_file], 'contents'))
|
140
|
-
@models = model.entities
|
141
|
-
|
142
|
-
@models.each do |entity|
|
143
|
-
@model = entity
|
144
|
-
@class_name = class_name(@model)
|
145
|
-
factory_template = File.join 'models', 'model.rb.erb'
|
146
|
-
template(factory_template, File.join(output_dir, "#{class_name(@model).ruby_format}.rb"))
|
147
|
-
end
|
148
|
-
|
149
|
-
factory_template = File.join 'models', 'factories.rb.erb'
|
150
|
-
template(factory_template, File.join(output_dir, 'factories.rb'))
|
151
|
-
end
|
152
|
-
|
153
|
-
desc 'Build the frankified App'
|
154
|
-
task :build do
|
155
|
-
sh "frank build --workspace #{@workspace} --scheme #{@scheme}"
|
156
|
-
end
|
157
|
-
|
158
|
-
Cucumber::Rake::Task.new(:ci_test, 'Run Frank acceptance tests with CI options') do |t|
|
159
|
-
ENV['APP_BUNDLE_PATH'] = File.join( Dir.pwd, 'Frank/frankified_build/Frankified.app' )
|
160
|
-
ENV['USE_SIM_LAUNCHER_SERVER'] = 'YES'
|
161
|
-
artifacts_dir = ENV['CC_BUILD_ARTIFACTS'] ? ENV['CC_BUILD_ARTIFACTS'] : '/tmp'
|
162
|
-
t.cucumber_opts = "Frank/features --tags ~@wip --format pretty --format html --out '#{artifacts_dir}/frank_results.html' --format rerun --out '#{artifacts_dir}/frank_rerun.txt'"
|
163
|
-
end
|
164
|
-
|
165
|
-
desc 'Run Frank acceptance tests'
|
166
|
-
task :test, :cucumber_options do |t, args|
|
167
|
-
args.with_defaults(:cucumber_options => 'Frank/features --tag ~@wip')
|
168
|
-
|
169
|
-
ENV['APP_BUNDLE_PATH'] = File.join( Dir.pwd, 'Frank/frankified_build/Frankified.app' )
|
170
|
-
ENV['USE_SIM_LAUNCHER_SERVER'] = nil
|
171
|
-
sh "cucumber #{args.cucumber_options}"
|
172
|
-
end
|
173
|
-
|
174
|
-
desc 'Run Frank acceptance tests for a tag'
|
175
|
-
task :tag, :tag_name do |t, args|
|
176
|
-
args.with_defaults(:tag_name => '')
|
177
|
-
cucumber_options = "Frank/features --tag #{args.tag_name}"
|
178
|
-
|
179
|
-
ENV['APP_BUNDLE_PATH'] = File.join( Dir.pwd, 'Frank/frankified_build/Frankified.app' )
|
180
|
-
ENV['USE_SIM_LAUNCHER_SERVER'] = nil
|
181
|
-
sh "cucumber #{cucumber_options}"
|
182
|
-
end
|
183
|
-
end
|
184
|
-
|
185
|
-
namespace :services do
|
186
|
-
|
187
|
-
task :environment do
|
188
|
-
require 'fwtoolkit'
|
189
|
-
Dir[File.join( Dir.pwd, 'Frank/features/support/models/*.rb')].each {|file| require file }
|
190
|
-
Dir[File.join( Dir.pwd, 'Frank/features/support/views/*.rb')].each {|file| require file }
|
191
|
-
end
|
192
|
-
|
193
|
-
desc 'Seed objects into the service'
|
194
|
-
task :seed => [:environment] do
|
195
|
-
|
196
|
-
end
|
197
|
-
|
198
|
-
require 'daemons'
|
199
|
-
desc 'Run a service'
|
200
|
-
task :run, [:service_name] => [:environment, :seed] do |t, args|
|
201
|
-
args.with_defaults(:service_name => 'mimic', :seeds_name => nil)
|
202
|
-
|
203
|
-
require File.join( Dir.pwd, "Frank/features/support/#{args.service_name}.rb")
|
204
|
-
puts "Service #{args.service_name} running"
|
205
|
-
loop do
|
206
|
-
sleep(5)
|
207
|
-
end
|
208
|
-
end
|
209
|
-
|
210
|
-
end
|
211
|
-
|
212
|
-
namespace :bundle do
|
213
|
-
task :install do
|
214
|
-
sh 'bundle'
|
215
|
-
end
|
216
|
-
end
|
217
|
-
|
218
|
-
namespace :pod do
|
219
|
-
task :clean do
|
220
|
-
FileUtils.rm_rf('Pods')
|
221
|
-
end
|
222
|
-
|
223
|
-
task :install do
|
224
|
-
sh 'pod install'
|
225
|
-
end
|
226
|
-
|
227
|
-
desc 'Clean and install Pods'
|
228
|
-
task :clean_install => [:clean, :install]
|
229
|
-
end
|
230
|
-
|
231
|
-
namespace :fwbuild do
|
232
|
-
task :upload do
|
233
|
-
S3Cmd.put("path/to/a/file.ext", "s3://fw.fwbuild.production/uploads/") do |progress|
|
234
|
-
puts progress
|
235
|
-
end
|
236
|
-
end
|
237
|
-
|
238
|
-
task :build_upload => ["xcode:release_device:clean", "xcode:release_device:archive", "upload"]
|
239
|
-
end
|
240
|
-
|
241
|
-
namespace :ci do
|
242
|
-
desc 'Clean, build and test'
|
243
|
-
task :build => ["bundle:install", "xcode:debug_simulator:cleanbuild", "frank:build", "frank:ci_test"]
|
244
|
-
|
245
|
-
desc 'Clean, build and test for Cocoapods projects'
|
246
|
-
task :pod_build => ["bundle:install", "pod:clean_install", "ci:build"]
|
247
|
-
end
|
248
|
-
end
|
249
|
-
|
250
|
-
end
|
251
|
-
end
|
252
|
-
end
|
@@ -1,41 +0,0 @@
|
|
1
|
-
require 'thor'
|
2
|
-
|
3
|
-
module FWToolkit
|
4
|
-
module Tasks
|
5
|
-
class FrankTasks < Thor
|
6
|
-
|
7
|
-
include Thor::Actions
|
8
|
-
|
9
|
-
def self.source_root
|
10
|
-
File.join(File.dirname(__FILE__), '..', '..', '..')
|
11
|
-
end
|
12
|
-
|
13
|
-
no_tasks do
|
14
|
-
def setup(target = nil, prefix = nil, project_directory = target, project_file = "#{target}.xcodeproj")
|
15
|
-
run 'frank setup'
|
16
|
-
features_dir = File.join('Frank', 'features')
|
17
|
-
remove_file(File.join(features_dir, 'my_first.feature'))
|
18
|
-
|
19
|
-
if target
|
20
|
-
test_dir = File.join(FWToolkit::Tasks::BuildTask::TEMPLATES_DIR, 'cucumber')
|
21
|
-
directory(File.join(FWToolkit::Tasks::BuildTask::TEMPLATES_DIR, 'cucumber', 'features'), features_dir, {:force => true})
|
22
|
-
|
23
|
-
@prefix = prefix
|
24
|
-
template 'templates/cucumber/AppDelegate+Frank.h.erb', File.join(project_directory, "#{prefix}AppDelegate+Frank.h")
|
25
|
-
template 'templates/cucumber/AppDelegate+Frank.m.erb', File.join(project_directory, "#{prefix}AppDelegate+Frank.m")
|
26
|
-
|
27
|
-
project = Xcodeproj::Project.new(project_file)
|
28
|
-
project.new_file(File.join(project_directory, "#{prefix}AppDelegate+Frank.h"), project_directory)
|
29
|
-
frank_app_d_m = project.new_file(File.join(project_directory, "#{prefix}AppDelegate+Frank.m"), project_directory)
|
30
|
-
|
31
|
-
target = project.targets.select{|t| t.name.eql? target}[0]
|
32
|
-
target.add_file_references([frank_app_d_m])
|
33
|
-
|
34
|
-
project.save_as(project_file)
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|