fwtoolkit 0.5.1 → 0.5.2
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 +75 -0
- data/lib/fwtoolkit.rb +1 -1
- data/lib/fwtoolkit/tasks/build_tasks.rb +10 -23
- data/lib/fwtoolkit/tasks/frank_tasks.rb +41 -0
- data/lib/fwtoolkit/test/model_helper.rb +4 -0
- data/lib/fwtoolkit/version.rb +1 -1
- data/templates/cucumber/{AppDelegate+Frank.h → AppDelegate+Frank.h.erb} +3 -3
- data/templates/cucumber/AppDelegate+Frank.m.erb +82 -0
- data/templates/cucumber/{example.feature → features/example.feature} +2 -1
- data/templates/cucumber/features/step_definitions/launch_steps.rb +15 -0
- data/templates/cucumber/{env.rb → features/support/env.rb} +0 -0
- data/templates/cucumber/{mimic.rb → features/support/mimic.rb} +1 -1
- data/templates/cucumber/{my_objects_json.erb → features/support/views/my_objects_json.erb} +0 -0
- data/templates/cucumber/{my_objects_xml.erb → features/support/views/my_objects_xml.erb} +0 -0
- data/templates/fwt/Gemfile.erb +3 -0
- data/templates/fwt/Podfile.erb +4 -0
- data/templates/{cucumber/Rakefile → fwt/Rakefile.erb} +7 -3
- data/templates/fwt/default_project/AppDelegate.h.erb +12 -0
- data/templates/fwt/default_project/AppDelegate.m.erb +20 -0
- data/templates/fwt/default_project/Info.plist.erb +45 -0
- data/templates/fwt/default_project/Prefix.pch.erb +6 -0
- data/templates/fwt/default_project/main.m.erb +15 -0
- data/templates/fwt/gitignore.erb +31 -0
- data/templates/fwt/rvmrc.erb +41 -0
- metadata +50 -32
- data/templates/cucumber/AppDelegate+Frank.m +0 -40
- data/templates/cucumber/launch_steps.rb +0 -29
data/bin/fwt
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'thor'
|
3
|
+
require 'xcodeproj'
|
4
|
+
require 'erb'
|
5
|
+
|
6
|
+
class FWT < Thor
|
7
|
+
|
8
|
+
include Thor::Actions
|
9
|
+
|
10
|
+
def self.source_root
|
11
|
+
File.join(File.dirname(__FILE__), '..')
|
12
|
+
end
|
13
|
+
|
14
|
+
desc "new APP_PATH PREFIX", "Creates a new Future Workshops iOS project"
|
15
|
+
def new(app_path, prefix)
|
16
|
+
@app_name = File.basename(app_path)
|
17
|
+
@prefix = prefix.upcase
|
18
|
+
@path = app_path
|
19
|
+
supporting_files = 'Supporting Files'
|
20
|
+
|
21
|
+
@project = Xcodeproj::Project.new
|
22
|
+
@project.root_object.build_configuration_list
|
23
|
+
@project.add_system_framework('UIKit')
|
24
|
+
#@project.add_system_framework('CoreGraphics') # bug in latest RestKit pod
|
25
|
+
|
26
|
+
info_plist = "#{@app_name}-Info.plist"
|
27
|
+
process_template("Info.plist.erb", info_plist, supporting_files)
|
28
|
+
|
29
|
+
target = @project.new_target(:application, @app_name, :ios)
|
30
|
+
target.build_settings('Debug').merge!(:INFOPLIST_FILE => "$(SRCROOT)/#{@app_name}/#{@app_name}-Info.plist")
|
31
|
+
target.build_settings('Debug').merge!(:GCC_PREFIX_HEADER => "#{@app_name}/#{@app_name}-Prefix.pch")
|
32
|
+
target.build_settings('Release').merge!(:INFOPLIST_FILE => "$(SRCROOT)/#{@app_name}/#{@app_name}-Info.plist")
|
33
|
+
target.build_settings('Release').merge!(:GCC_PREFIX_HEADER => "#{@app_name}/#{@app_name}-Prefix.pch")
|
34
|
+
|
35
|
+
app_d_h = process_template("AppDelegate.h.erb", "#{@prefix}AppDelegate.h")
|
36
|
+
app_d_m = process_template("AppDelegate.m.erb", "#{@prefix}AppDelegate.m")
|
37
|
+
main_m = process_template("main.m.erb", "main.m", supporting_files)
|
38
|
+
prefix_pch = process_template("Prefix.pch.erb", "#{@app_name}-Prefix.pch", supporting_files)
|
39
|
+
|
40
|
+
target.add_file_references([app_d_m, main_m])
|
41
|
+
|
42
|
+
# final save
|
43
|
+
@project.save_as File.join(@path, "#{@app_name}.xcodeproj")
|
44
|
+
@workspace = Xcodeproj::Workspace.new("#{@app_name}.xcodeproj")
|
45
|
+
@workspace.save_as File.join(@path, "#{@app_name}.xcworkspace")
|
46
|
+
|
47
|
+
# Ruby
|
48
|
+
template 'templates/fwt/rvmrc.erb', File.join(@path, '.rvmrc')
|
49
|
+
template 'templates/fwt/Gemfile.erb', File.join(@path, 'Gemfile')
|
50
|
+
template 'templates/fwt/Rakefile.erb', File.join(@path, 'Rakefile')
|
51
|
+
template 'templates/fwt/Podfile.erb', File.join(@path, 'Podfile')
|
52
|
+
template 'templates/fwt/gitignore.erb', File.join(@path, '.gitignore')
|
53
|
+
|
54
|
+
sleep 5
|
55
|
+
|
56
|
+
inside(@path) do
|
57
|
+
run_captured 'bundle'
|
58
|
+
run_captured 'rake pod:clean_install'
|
59
|
+
run_captured "rake frank:setup['#{@app_name}','#{@prefix}']"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
private
|
64
|
+
def run_captured(cmd)
|
65
|
+
run cmd, {:capture => true}
|
66
|
+
end
|
67
|
+
|
68
|
+
def process_template(template_filename, destination_filename, destination_group = "", template_project = 'default_project')
|
69
|
+
template "templates/fwt/#{template_project}/#{template_filename}", File.join(@path, @app_name, destination_filename)
|
70
|
+
@project.new_file(File.join(@app_name, destination_filename), File.join(@app_name, destination_group))
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
FWT.start
|
data/lib/fwtoolkit.rb
CHANGED
@@ -4,8 +4,8 @@ require 'xcodebuild'
|
|
4
4
|
require 'cucumber/rake/task'
|
5
5
|
require 'core_data'
|
6
6
|
require 'erb'
|
7
|
-
|
8
|
-
|
7
|
+
require 'xcodeproj'
|
8
|
+
require 'fwtoolkit/tasks/frank_tasks'
|
9
9
|
|
10
10
|
class String
|
11
11
|
def ruby_format
|
@@ -43,6 +43,8 @@ module FWToolkit
|
|
43
43
|
module Tasks
|
44
44
|
class BuildTask < ::Rake::TaskLib
|
45
45
|
|
46
|
+
TEMPLATES_DIR = File.expand_path('../../../templates/', File.dirname(__FILE__))
|
47
|
+
|
46
48
|
include Rake::DSL if defined?(Rake::DSL)
|
47
49
|
|
48
50
|
attr_accessor :workspace
|
@@ -86,8 +88,7 @@ module FWToolkit
|
|
86
88
|
|
87
89
|
task :validate_auth_token do
|
88
90
|
unless ENV['FWBUILD_AUTH_TOKEN']
|
89
|
-
|
90
|
-
exit(-1)
|
91
|
+
abort 'Please set FWBUILD_AUTH_TOKEN environment variable'
|
91
92
|
end
|
92
93
|
end
|
93
94
|
|
@@ -105,25 +106,11 @@ module FWToolkit
|
|
105
106
|
|
106
107
|
namespace :frank do
|
107
108
|
desc 'Setup Frank'
|
108
|
-
task :setup do
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
support_dir = File.join(features_dir, 'support')
|
114
|
-
steps_dir = File.join(features_dir, 'step_definitions')
|
115
|
-
views_dir = File.join(support_dir, 'views')
|
116
|
-
|
117
|
-
remove_file(File.join(features_dir, 'my_first.feature'))
|
118
|
-
cp(File.join(test_dir, 'env.rb'), support_dir)
|
119
|
-
cp(File.join(test_dir, 'mimic.rb'), support_dir)
|
120
|
-
mkdir(views_dir)
|
121
|
-
cp(File.join(test_dir, 'my_objects_json.erb'), views_dir)
|
122
|
-
cp(File.join(test_dir, 'my_objects_xml.erb'), views_dir)
|
123
|
-
cp(File.join(test_dir, 'launch_steps.rb'), steps_dir)
|
124
|
-
cp(File.join(test_dir, 'example.feature'), features_dir)
|
125
|
-
cp(File.join(test_dir, 'AppDelegate+Frank.h'), './')
|
126
|
-
cp(File.join(test_dir, 'AppDelegate+Frank.m'), './')
|
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
|
+
|
127
114
|
end
|
128
115
|
|
129
116
|
def template(template_file, output_file)
|
@@ -0,0 +1,41 @@
|
|
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
|
@@ -38,6 +38,10 @@ module FWToolkit
|
|
38
38
|
raise "IOS_SDK not defined. Please define this in your env.rb, i.e. IOS_SDK='5.1'" unless defined?(IOS_SDK)
|
39
39
|
IOS_SDK
|
40
40
|
end
|
41
|
+
|
42
|
+
def fwt_app_path
|
43
|
+
ENV['APP_BUNDLE_PATH'] || (defined?(APP_BUNDLE_PATH) && APP_BUNDLE_PATH)
|
44
|
+
end
|
41
45
|
|
42
46
|
def fwt_app_path
|
43
47
|
raise "APP_BUNDLE_PATH not defined. Please define this in your env.rb, i.e. APP_BUNDLE_PATH='File.expand_path( '../../../frankified_build/Frankified.app', __FILE__ )'" unless defined?(APP_BUNDLE_PATH)
|
data/lib/fwtoolkit/version.rb
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
//
|
2
|
-
// AppDelegate+Frank.h
|
2
|
+
// <%= @prefix %>AppDelegate+Frank.h
|
3
3
|
// FWToolkit
|
4
4
|
//
|
5
5
|
// Created by Matt Brooke-Smith on 14/10/2012.
|
6
6
|
// Copyright (c) 2012 Future Workshops. All rights reserved.
|
7
7
|
//
|
8
8
|
|
9
|
-
#import "AppDelegate.h"
|
9
|
+
#import "<%= @prefix %>AppDelegate.h"
|
10
10
|
|
11
|
-
@interface AppDelegate (Frank)
|
11
|
+
@interface <%= @prefix %>AppDelegate (Frank)
|
12
12
|
|
13
13
|
- (void) seedCoreData:(NSString *)json;
|
14
14
|
|
@@ -0,0 +1,82 @@
|
|
1
|
+
//
|
2
|
+
// <%= @prefix %>AppDelegate+Frank.m
|
3
|
+
// FWToolkit
|
4
|
+
//
|
5
|
+
// Created by Matt Brooke-Smith on 18/07/2012.
|
6
|
+
// Copyright (c) 2012 Future Workshops. All rights reserved.
|
7
|
+
//
|
8
|
+
|
9
|
+
#import "<%= @prefix %>AppDelegate+Frank.h"
|
10
|
+
#import <CoreData/CoreData.h>
|
11
|
+
#import <JSONKit/JSONKit.h>
|
12
|
+
#import <RestKit/RestKit.h>
|
13
|
+
|
14
|
+
@implementation <%= @prefix %>AppDelegate (Frank)
|
15
|
+
|
16
|
+
- (void) seedCoreData:(NSString *)json
|
17
|
+
{
|
18
|
+
NSDictionary *objectsDictionary = [json objectFromJSONString];
|
19
|
+
|
20
|
+
NSManagedObjectContext *managedObjectContext = [[RBSCoreDataManager sharedManager] managedObjectContext];
|
21
|
+
|
22
|
+
for (NSString *objectKey in objectsDictionary)
|
23
|
+
{
|
24
|
+
[self createObjectWithEntityName:objectKey configuredWithDictionary:[objectsDictionary objectForKey:objectKey] inManagedObjectContext:managedObjectContext];
|
25
|
+
}
|
26
|
+
|
27
|
+
NSError *error = nil;
|
28
|
+
if (![managedObjectContext save:&error]) {
|
29
|
+
NSLog(@"Error saving: %@", [error localizedDescription]);
|
30
|
+
}
|
31
|
+
}
|
32
|
+
|
33
|
+
- (NSManagedObject *)createObjectWithEntityName:(NSString *)entityName configuredWithDictionary:(NSDictionary *)dictionary inManagedObjectContext:(NSManagedObjectContext *)context
|
34
|
+
{
|
35
|
+
NSManagedObject *object = [NSEntityDescription insertNewObjectForEntityForName:entityName inManagedObjectContext:context];
|
36
|
+
|
37
|
+
NSEntityDescription *objectEntityDescription = [object entity];
|
38
|
+
|
39
|
+
NSDictionary *attributes = [objectEntityDescription attributesByName];
|
40
|
+
NSDictionary *relationships = [objectEntityDescription relationshipsByName];
|
41
|
+
|
42
|
+
for (NSString *key in [dictionary allKeys])
|
43
|
+
{
|
44
|
+
if ([[attributes allKeys] containsObject:key])
|
45
|
+
{
|
46
|
+
id value = [dictionary objectForKey:key];
|
47
|
+
if (value != [NSNull null])
|
48
|
+
{
|
49
|
+
[object setValue:value forKey:key];
|
50
|
+
}
|
51
|
+
}
|
52
|
+
else if ([[relationships allKeys] containsObject:key])
|
53
|
+
{
|
54
|
+
NSRelationshipDescription *relationshipDescription = [relationships objectForKey:key];
|
55
|
+
|
56
|
+
NSString *destinationEntityName = [[relationshipDescription destinationEntity] name];
|
57
|
+
|
58
|
+
if ([relationshipDescription isToMany])
|
59
|
+
{
|
60
|
+
NSMutableSet *relationshipSet = [NSMutableSet set];
|
61
|
+
for (NSDictionary *toManyRelationshipObject in [dictionary objectForKey:key])
|
62
|
+
{
|
63
|
+
NSManagedObject *destinationObject = [self createObjectWithEntityName:destinationEntityName configuredWithDictionary:toManyRelationshipObject inManagedObjectContext:context];
|
64
|
+
|
65
|
+
[relationshipSet addObject:destinationObject];
|
66
|
+
}
|
67
|
+
|
68
|
+
[object setValue:relationshipSet forKey:key];
|
69
|
+
}
|
70
|
+
else
|
71
|
+
{
|
72
|
+
NSManagedObject *destinationObject = [self createObjectWithEntityName:destinationEntityName configuredWithDictionary:[dictionary objectForKey:key] inManagedObjectContext:context];
|
73
|
+
|
74
|
+
[object setValue:destinationObject forKey:key];
|
75
|
+
}
|
76
|
+
}
|
77
|
+
}
|
78
|
+
|
79
|
+
return object;
|
80
|
+
}
|
81
|
+
|
82
|
+
@end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'pickle/world'
|
2
|
+
require 'fwtoolkit/test/model_helper'
|
3
|
+
|
4
|
+
Given /^I reset the iOS simulator$/ do
|
5
|
+
fwt_simulator_reset_data fwt_ios_sdk
|
6
|
+
end
|
7
|
+
|
8
|
+
Given /^I seed the (iPhone|iPad) simulator with #{capture_model}$/ do |device, capture_model|
|
9
|
+
launch_app fwt_app_path, fwt_ios_sdk, device.downcase
|
10
|
+
fwt_seed_app_with_pickle_models [capture_model]
|
11
|
+
end
|
12
|
+
|
13
|
+
Given /^I launch the app in the (iPhone|iPad) simulator$/ do |device|
|
14
|
+
launch_app app_path, fwt_ios_sdk, device.downcase
|
15
|
+
end
|
File without changes
|
@@ -4,7 +4,7 @@ require 'socket'
|
|
4
4
|
# Listen on the following :port
|
5
5
|
# Add the following to your objective-c code, in the place where your
|
6
6
|
# server root is configured
|
7
|
-
# #ifdef
|
7
|
+
# #ifdef FRANKIFIED
|
8
8
|
# server = "http://localhost:11988"
|
9
9
|
# #else
|
10
10
|
# server = <your production server>
|
File without changes
|
File without changes
|
@@ -1,11 +1,15 @@
|
|
1
1
|
require 'fwtoolkit/tasks/build_tasks'
|
2
2
|
|
3
3
|
FWToolkit::Tasks::BuildTask.new do |t|
|
4
|
-
|
5
|
-
t.
|
4
|
+
# Used for Frank testing
|
5
|
+
t.workspace = '<%= @app_name %>.xcworkspace'
|
6
|
+
t.scheme = '<%= @app_name %>'
|
7
|
+
t.bundle_identifier = 'com.futureworkshops.<%= @app_name %>'
|
8
|
+
|
9
|
+
# Used for FW Build upload
|
6
10
|
t.certificate = 'iPhone Developer: Matt Brooke-Smith (WQH444M434)'
|
7
11
|
t.provisioning_profile = '/Users/matt/Library/MobileDevice/Provisioning Profiles/72515CD9-7732-40D5-BE5F-8AE06BF5769C.mobileprovision'
|
8
|
-
|
12
|
+
|
9
13
|
end
|
10
14
|
|
11
15
|
namespace :services do
|
@@ -0,0 +1,12 @@
|
|
1
|
+
//
|
2
|
+
// <%= @app_name %>AppDelegate.m
|
3
|
+
// <%= @app_name %>
|
4
|
+
//
|
5
|
+
// Copyright (c) <%= Date.today.year %> Future Workshops. All rights reserved.
|
6
|
+
//
|
7
|
+
|
8
|
+
@interface <%= @prefix %>AppDelegate : UIResponder <UIApplicationDelegate>
|
9
|
+
|
10
|
+
@property (strong, nonatomic) UIWindow *window;
|
11
|
+
|
12
|
+
@end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
//
|
2
|
+
// <%= @app_name %>AppDelegate.m
|
3
|
+
// <%= @app_name %>
|
4
|
+
//
|
5
|
+
// Copyright (c) <%= Date.today.year %> Future Workshops. All rights reserved.
|
6
|
+
//
|
7
|
+
|
8
|
+
#import "<%= @prefix %>AppDelegate.h"
|
9
|
+
|
10
|
+
@implementation <%= @prefix %>AppDelegate
|
11
|
+
|
12
|
+
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
|
13
|
+
{
|
14
|
+
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
|
15
|
+
self.window.backgroundColor = [UIColor whiteColor];
|
16
|
+
[self.window makeKeyAndVisible];
|
17
|
+
return YES;
|
18
|
+
}
|
19
|
+
|
20
|
+
@end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
3
|
+
<plist version="1.0">
|
4
|
+
<dict>
|
5
|
+
<key>CFBundleDevelopmentRegion</key>
|
6
|
+
<string>en</string>
|
7
|
+
<key>CFBundleDisplayName</key>
|
8
|
+
<string>${PRODUCT_NAME}</string>
|
9
|
+
<key>CFBundleExecutable</key>
|
10
|
+
<string>${EXECUTABLE_NAME}</string>
|
11
|
+
<key>CFBundleIdentifier</key>
|
12
|
+
<string>com.futureworkshops.${PRODUCT_NAME:rfc1034identifier}</string>
|
13
|
+
<key>CFBundleInfoDictionaryVersion</key>
|
14
|
+
<string>6.0</string>
|
15
|
+
<key>CFBundleName</key>
|
16
|
+
<string>${PRODUCT_NAME}</string>
|
17
|
+
<key>CFBundlePackageType</key>
|
18
|
+
<string>APPL</string>
|
19
|
+
<key>CFBundleShortVersionString</key>
|
20
|
+
<string>1.0</string>
|
21
|
+
<key>CFBundleSignature</key>
|
22
|
+
<string>????</string>
|
23
|
+
<key>CFBundleVersion</key>
|
24
|
+
<string>1.0</string>
|
25
|
+
<key>LSRequiresIPhoneOS</key>
|
26
|
+
<true/>
|
27
|
+
<key>UIRequiredDeviceCapabilities</key>
|
28
|
+
<array>
|
29
|
+
<string>armv7</string>
|
30
|
+
</array>
|
31
|
+
<key>UISupportedInterfaceOrientations</key>
|
32
|
+
<array>
|
33
|
+
<string>UIInterfaceOrientationPortrait</string>
|
34
|
+
<string>UIInterfaceOrientationLandscapeLeft</string>
|
35
|
+
<string>UIInterfaceOrientationLandscapeRight</string>
|
36
|
+
</array>
|
37
|
+
<key>UISupportedInterfaceOrientations~ipad</key>
|
38
|
+
<array>
|
39
|
+
<string>UIInterfaceOrientationPortrait</string>
|
40
|
+
<string>UIInterfaceOrientationPortraitUpsideDown</string>
|
41
|
+
<string>UIInterfaceOrientationLandscapeLeft</string>
|
42
|
+
<string>UIInterfaceOrientationLandscapeRight</string>
|
43
|
+
</array>
|
44
|
+
</dict>
|
45
|
+
</plist>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
//
|
2
|
+
// main.m
|
3
|
+
// <%= @app_name %>
|
4
|
+
//
|
5
|
+
// Copyright (c) <%= Date.today.year %> Future Workshops. All rights reserved.
|
6
|
+
//
|
7
|
+
|
8
|
+
#import "<%= @prefix %>AppDelegate.h"
|
9
|
+
|
10
|
+
int main(int argc, char *argv[])
|
11
|
+
{
|
12
|
+
@autoreleasepool {
|
13
|
+
return UIApplicationMain(argc, argv, nil, NSStringFromClass([<%= @prefix %>AppDelegate class]));
|
14
|
+
}
|
15
|
+
}
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# Ruby
|
2
|
+
tmp/
|
3
|
+
log/
|
4
|
+
db/production.sqlite3
|
5
|
+
db/development.sqlite3
|
6
|
+
|
7
|
+
# Xcode
|
8
|
+
build/*
|
9
|
+
*.pbxuser
|
10
|
+
!default.pbxuser
|
11
|
+
*.mode1v3
|
12
|
+
!default.mode1v3
|
13
|
+
*.mode2v3
|
14
|
+
!default.mode2v3
|
15
|
+
*.perspectivev3
|
16
|
+
!default.perspectivev3
|
17
|
+
!default.xcworkspace
|
18
|
+
xcuserdata
|
19
|
+
profile
|
20
|
+
*.moved-aside
|
21
|
+
# Finder
|
22
|
+
.DS_Store
|
23
|
+
.svn
|
24
|
+
*.swp
|
25
|
+
*.~nib
|
26
|
+
|
27
|
+
# Frank
|
28
|
+
Frank/frankified_build/
|
29
|
+
|
30
|
+
# Cocoapods
|
31
|
+
/Pods/
|
@@ -0,0 +1,41 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
# This is an RVM Project .rvmrc file, used to automatically load the ruby
|
4
|
+
# development environment upon cd'ing into the directory
|
5
|
+
|
6
|
+
# First we specify our desired <ruby>[@<gemset>], the @gemset name is optional,
|
7
|
+
# Only full ruby name is supported here, for short names use:
|
8
|
+
# echo "rvm use 1.9.3" > .rvmrc
|
9
|
+
environment_id="ruby-1.9.3@<%= @app_name %>"
|
10
|
+
|
11
|
+
# First we attempt to load the desired environment directly from the environment
|
12
|
+
# file. This is very fast and efficient compared to running through the entire
|
13
|
+
# CLI and selector. If you want feedback on which environment was used then
|
14
|
+
# insert the word 'use' after --create as this triggers verbose mode.
|
15
|
+
if [[ -d "${rvm_path:-$HOME/.rvm}/environments"
|
16
|
+
&& -s "${rvm_path:-$HOME/.rvm}/environments/$environment_id" ]]
|
17
|
+
then
|
18
|
+
\. "${rvm_path:-$HOME/.rvm}/environments/$environment_id"
|
19
|
+
[[ -s "${rvm_path:-$HOME/.rvm}/hooks/after_use" ]] &&
|
20
|
+
\. "${rvm_path:-$HOME/.rvm}/hooks/after_use" || true
|
21
|
+
else
|
22
|
+
# If the environment file has not yet been created, use the RVM CLI to select.
|
23
|
+
rvm --create "$environment_id" || {
|
24
|
+
echo "Failed to create RVM environment '${environment_id}'."
|
25
|
+
return 1
|
26
|
+
}
|
27
|
+
fi
|
28
|
+
|
29
|
+
# Run bundler
|
30
|
+
#if [[ -s Gemfile ]] && {
|
31
|
+
# ! builtin command -v bundle >/dev/null ||
|
32
|
+
# builtin command -v bundle | GREP_OPTIONS= \grep $rvm_path/bin/bundle >/dev/null
|
33
|
+
#}
|
34
|
+
#then
|
35
|
+
# printf "%b" "The rubygem 'bundler' is not installed. Installing it now.\n"
|
36
|
+
# gem install bundler
|
37
|
+
#fi
|
38
|
+
#if [[ -s Gemfile ]] && builtin command -v bundle >/dev/null
|
39
|
+
#then
|
40
|
+
# bundle install | GREP_OPTIONS= \grep -vE '^Using|Your bundle is complete'
|
41
|
+
#fi
|
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.5.
|
4
|
+
version: 0.5.2
|
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
|
+
date: 2012-12-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: cucumber
|
@@ -59,22 +59,6 @@ dependencies:
|
|
59
59
|
- - ! '>='
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
|
-
- !ruby/object:Gem::Dependency
|
63
|
-
name: xcodeproj
|
64
|
-
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
|
-
requirements:
|
67
|
-
- - '='
|
68
|
-
- !ruby/object:Gem::Version
|
69
|
-
version: 0.3.5
|
70
|
-
type: :runtime
|
71
|
-
prerelease: false
|
72
|
-
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
|
-
requirements:
|
75
|
-
- - '='
|
76
|
-
- !ruby/object:Gem::Version
|
77
|
-
version: 0.3.5
|
78
62
|
- !ruby/object:Gem::Dependency
|
79
63
|
name: core_data
|
80
64
|
requirement: !ruby/object:Gem::Requirement
|
@@ -162,7 +146,7 @@ dependencies:
|
|
162
146
|
requirements:
|
163
147
|
- - '='
|
164
148
|
- !ruby/object:Gem::Version
|
165
|
-
version: 1.1.1
|
149
|
+
version: 1.1.1.fw.1
|
166
150
|
type: :runtime
|
167
151
|
prerelease: false
|
168
152
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -170,7 +154,7 @@ dependencies:
|
|
170
154
|
requirements:
|
171
155
|
- - '='
|
172
156
|
- !ruby/object:Gem::Version
|
173
|
-
version: 1.1.1
|
157
|
+
version: 1.1.1.fw.1
|
174
158
|
- !ruby/object:Gem::Dependency
|
175
159
|
name: CFPropertyList
|
176
160
|
requirement: !ruby/object:Gem::Requirement
|
@@ -226,7 +210,7 @@ dependencies:
|
|
226
210
|
requirements:
|
227
211
|
- - '='
|
228
212
|
- !ruby/object:Gem::Version
|
229
|
-
version: 0.
|
213
|
+
version: 0.16.0
|
230
214
|
type: :runtime
|
231
215
|
prerelease: false
|
232
216
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -234,7 +218,7 @@ dependencies:
|
|
234
218
|
requirements:
|
235
219
|
- - '='
|
236
220
|
- !ruby/object:Gem::Version
|
237
|
-
version: 0.
|
221
|
+
version: 0.16.0
|
238
222
|
- !ruby/object:Gem::Dependency
|
239
223
|
name: jbuilder
|
240
224
|
requirement: !ruby/object:Gem::Requirement
|
@@ -251,16 +235,35 @@ dependencies:
|
|
251
235
|
- - '='
|
252
236
|
- !ruby/object:Gem::Version
|
253
237
|
version: 0.8.2
|
238
|
+
- !ruby/object:Gem::Dependency
|
239
|
+
name: xcodeproj
|
240
|
+
requirement: !ruby/object:Gem::Requirement
|
241
|
+
none: false
|
242
|
+
requirements:
|
243
|
+
- - '='
|
244
|
+
- !ruby/object:Gem::Version
|
245
|
+
version: 0.4.0
|
246
|
+
type: :runtime
|
247
|
+
prerelease: false
|
248
|
+
version_requirements: !ruby/object:Gem::Requirement
|
249
|
+
none: false
|
250
|
+
requirements:
|
251
|
+
- - '='
|
252
|
+
- !ruby/object:Gem::Version
|
253
|
+
version: 0.4.0
|
254
254
|
description: ''
|
255
255
|
email:
|
256
256
|
- matt@futureworkshops.com
|
257
|
-
executables:
|
257
|
+
executables:
|
258
|
+
- fwt
|
258
259
|
extensions: []
|
259
260
|
extra_rdoc_files: []
|
260
261
|
files:
|
262
|
+
- bin/fwt
|
261
263
|
- lib/fwtoolkit.rb
|
262
264
|
- lib/fwtoolkit/cli.rb
|
263
265
|
- lib/fwtoolkit/tasks/build_tasks.rb
|
266
|
+
- lib/fwtoolkit/tasks/frank_tasks.rb
|
264
267
|
- lib/fwtoolkit/test/frank_model.rb
|
265
268
|
- lib/fwtoolkit/test/misc_steps.rb
|
266
269
|
- lib/fwtoolkit/test/model_helper.rb
|
@@ -269,15 +272,24 @@ files:
|
|
269
272
|
- lib/fwtoolkit/test/ui_helper.rb
|
270
273
|
- lib/fwtoolkit/test/ui_steps.rb
|
271
274
|
- lib/fwtoolkit/version.rb
|
272
|
-
- templates/cucumber/AppDelegate+Frank.h
|
273
|
-
- templates/cucumber/AppDelegate+Frank.m
|
274
|
-
- templates/cucumber/
|
275
|
-
- templates/cucumber/
|
276
|
-
- templates/cucumber/
|
277
|
-
- templates/cucumber/
|
278
|
-
- templates/cucumber/
|
279
|
-
- templates/cucumber/
|
280
|
-
- templates/
|
275
|
+
- templates/cucumber/AppDelegate+Frank.h.erb
|
276
|
+
- templates/cucumber/AppDelegate+Frank.m.erb
|
277
|
+
- templates/cucumber/features/example.feature
|
278
|
+
- templates/cucumber/features/step_definitions/launch_steps.rb
|
279
|
+
- templates/cucumber/features/support/env.rb
|
280
|
+
- templates/cucumber/features/support/mimic.rb
|
281
|
+
- templates/cucumber/features/support/views/my_objects_json.erb
|
282
|
+
- templates/cucumber/features/support/views/my_objects_xml.erb
|
283
|
+
- templates/fwt/Gemfile.erb
|
284
|
+
- templates/fwt/Podfile.erb
|
285
|
+
- templates/fwt/Rakefile.erb
|
286
|
+
- templates/fwt/default_project/AppDelegate.h.erb
|
287
|
+
- templates/fwt/default_project/AppDelegate.m.erb
|
288
|
+
- templates/fwt/default_project/Info.plist.erb
|
289
|
+
- templates/fwt/default_project/Prefix.pch.erb
|
290
|
+
- templates/fwt/default_project/main.m.erb
|
291
|
+
- templates/fwt/gitignore.erb
|
292
|
+
- templates/fwt/rvmrc.erb
|
281
293
|
- templates/models/factories.rb.erb
|
282
294
|
- templates/models/model.rb.erb
|
283
295
|
homepage: ''
|
@@ -292,12 +304,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
292
304
|
- - ! '>='
|
293
305
|
- !ruby/object:Gem::Version
|
294
306
|
version: '0'
|
307
|
+
segments:
|
308
|
+
- 0
|
309
|
+
hash: 1193230210254549573
|
295
310
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
296
311
|
none: false
|
297
312
|
requirements:
|
298
313
|
- - ! '>='
|
299
314
|
- !ruby/object:Gem::Version
|
300
315
|
version: '0'
|
316
|
+
segments:
|
317
|
+
- 0
|
318
|
+
hash: 1193230210254549573
|
301
319
|
requirements: []
|
302
320
|
rubyforge_project:
|
303
321
|
rubygems_version: 1.8.24
|
@@ -1,40 +0,0 @@
|
|
1
|
-
//
|
2
|
-
// AppDelegate+Frank.m
|
3
|
-
// FWToolkit
|
4
|
-
//
|
5
|
-
// Created by Matt Brooke-Smith on 18/07/2012.
|
6
|
-
// Copyright (c) 2012 Future Workshops. All rights reserved.
|
7
|
-
//
|
8
|
-
|
9
|
-
#import "AppDelegate+Frank.h"
|
10
|
-
#import <CoreData/CoreData.h>
|
11
|
-
#import <JSONKit/JSONKit.h>
|
12
|
-
#import <RestKit/RestKit.h>
|
13
|
-
|
14
|
-
@implementation AppDelegate (Frank)
|
15
|
-
|
16
|
-
- (void) seedCoreData:(NSString *)json
|
17
|
-
{
|
18
|
-
NSArray *objectsArray = [json objectFromJSONString];
|
19
|
-
NSManagedObjectContext *managedObjectContext = [[RKObjectManager sharedManager].objectStore managedObjectContextForCurrentThread];
|
20
|
-
for (NSDictionary *objectDictionary in objectsArray) {
|
21
|
-
NSString *entityName = [objectDictionary allKeys][0];
|
22
|
-
NSDictionary *dictionary = [objectDictionary objectForKey:entityName];
|
23
|
-
NSManagedObject *object = [NSEntityDescription insertNewObjectForEntityForName:entityName inManagedObjectContext:managedObjectContext];
|
24
|
-
for (NSString *nextKey in [dictionary allKeys]) {
|
25
|
-
if ([object respondsToSelector:NSSelectorFromString(nextKey)]) {
|
26
|
-
NSObject *value = [dictionary objectForKey:nextKey];
|
27
|
-
if (value != [NSNull null]) {
|
28
|
-
[object setValue:value forKey:nextKey];
|
29
|
-
}
|
30
|
-
}
|
31
|
-
}
|
32
|
-
}
|
33
|
-
|
34
|
-
NSError *error = nil;
|
35
|
-
if (![managedObjectContext save:&error]) {
|
36
|
-
NSLog(@"Error saving: %@", [error localizedDescription]);
|
37
|
-
}
|
38
|
-
}
|
39
|
-
|
40
|
-
@end
|
@@ -1,29 +0,0 @@
|
|
1
|
-
require 'pickle/world'
|
2
|
-
|
3
|
-
def ios_sdk
|
4
|
-
IOS_SDK
|
5
|
-
end
|
6
|
-
|
7
|
-
def xcode_version
|
8
|
-
XCODE_VERSION
|
9
|
-
end
|
10
|
-
|
11
|
-
def app_path
|
12
|
-
ENV['APP_BUNDLE_PATH'] || (defined?(APP_BUNDLE_PATH) && APP_BUNDLE_PATH)
|
13
|
-
end
|
14
|
-
|
15
|
-
Given /^I launch the app in the (iphone|ipad) simulator$/ do |device|
|
16
|
-
launch_app app_path, ios_sdk, device
|
17
|
-
end
|
18
|
-
|
19
|
-
Given /^I reset and launch the app in the (iphone|ipad) simulator$/ do |device|
|
20
|
-
fwt_simulator_reset_data ios_sdk
|
21
|
-
launch_app app_path, ios_sdk, device
|
22
|
-
end
|
23
|
-
|
24
|
-
Given /^I reset and launch the app in the (iphone|ipad) simulator, seeded with #{capture_model}$/ do |device, capture_model|
|
25
|
-
fwt_simulator_reset_data ios_sdk
|
26
|
-
launch_app app_path, ios_sdk, device
|
27
|
-
fwt_seed_app [capture_model]
|
28
|
-
launch_app app_path, ios_sdk, device
|
29
|
-
end
|