uispecrunner 0.2.1
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/.gitignore +21 -0
- data/LICENSE +20 -0
- data/README.md +37 -0
- data/Rakefile +45 -0
- data/VERSION +1 -0
- data/bin/uispec +4 -0
- data/lib/uispecrunner/application.rb +31 -0
- data/lib/uispecrunner/options.rb +101 -0
- data/lib/uispecrunner.rb +129 -0
- data/spec/options_spec.rb +8 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +9 -0
- data/spec/uispecrunner_spec.rb +7 -0
- data/src/UISpec+UISpecRunner.h +27 -0
- data/src/UISpec+UISpecRunner.m +68 -0
- data/src/main.m +23 -0
- data/uispecrunner.gemspec +64 -0
- metadata +94 -0
data/.gitignore
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2009 Blake Watters
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
# UISpecRunner
|
2
|
+
### By Blake Watters <blake@twotoasters.com>
|
3
|
+
### [http://github.com/twotoasters/UISpecRunner]()
|
4
|
+
|
5
|
+
A flexible CLI test runner for use with the UISpec iOS BDD framework.
|
6
|
+
|
7
|
+
Install the gem and run: `uispec -h` for details.
|
8
|
+
|
9
|
+
## Requirements
|
10
|
+
To utilize the uispec utility, you must add the UISpecRunner category
|
11
|
+
to your project. This category provides support for running specs by
|
12
|
+
Protocol and provides a general environment variable based runner. The
|
13
|
+
category header and implementation file as well as a main.m are available
|
14
|
+
in the src/ directory with this gem. Use `gem edit uispecrunner` or pull
|
15
|
+
them from Github.
|
16
|
+
|
17
|
+
## Provides support for:
|
18
|
+
- Running all specs
|
19
|
+
- Running all specs in a class
|
20
|
+
- Running a specific spec class and method
|
21
|
+
- Switches for targeting different iOS SDK versions, project files,
|
22
|
+
configurations and targets
|
23
|
+
- Starting securityd daemon to allow interaction with the keychain
|
24
|
+
- Support for reading configuration settings from
|
25
|
+
- A Ruby API for configuring your own spec runners
|
26
|
+
- Will read common arguments from uispec.opts file for easy per project configuration
|
27
|
+
|
28
|
+
## TODO
|
29
|
+
- Auto-detect SDK versions available
|
30
|
+
- Rake file template
|
31
|
+
- Support for running specific files
|
32
|
+
- Support for running non-headless (either via AppleScript or iphonesim)
|
33
|
+
- Generate a Kicker script
|
34
|
+
|
35
|
+
## Copyright
|
36
|
+
|
37
|
+
Copyright (c) 2010 Blake Watters. See LICENSE for details.
|
data/Rakefile
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'jeweler'
|
6
|
+
Jeweler::Tasks.new do |gem|
|
7
|
+
gem.name = "uispecrunner"
|
8
|
+
gem.summary = %Q{Flexible spec runner for UISpec on iOS}
|
9
|
+
gem.description = %Q{Provides a simple Ruby interface for running UISpec iPhone tests}
|
10
|
+
gem.email = "blake@twotoasters.com"
|
11
|
+
gem.homepage = "http://github.com/twotoasters/UISpecRunner"
|
12
|
+
gem.authors = ["Blake Watters"]
|
13
|
+
gem.add_development_dependency "rspec", ">= 1.2.9"
|
14
|
+
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
15
|
+
end
|
16
|
+
Jeweler::GemcutterTasks.new
|
17
|
+
rescue LoadError
|
18
|
+
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
19
|
+
end
|
20
|
+
|
21
|
+
require 'spec/rake/spectask'
|
22
|
+
Spec::Rake::SpecTask.new(:spec) do |spec|
|
23
|
+
spec.libs << 'lib' << 'spec'
|
24
|
+
spec.spec_files = FileList['spec/**/*_spec.rb']
|
25
|
+
end
|
26
|
+
|
27
|
+
Spec::Rake::SpecTask.new(:rcov) do |spec|
|
28
|
+
spec.libs << 'lib' << 'spec'
|
29
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
30
|
+
spec.rcov = true
|
31
|
+
end
|
32
|
+
|
33
|
+
task :spec => :check_dependencies
|
34
|
+
|
35
|
+
task :default => :spec
|
36
|
+
|
37
|
+
require 'rake/rdoctask'
|
38
|
+
Rake::RDocTask.new do |rdoc|
|
39
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
40
|
+
|
41
|
+
rdoc.rdoc_dir = 'rdoc'
|
42
|
+
rdoc.title = "UISpecRunner #{version}"
|
43
|
+
rdoc.rdoc_files.include('README*')
|
44
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
45
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.2.1
|
data/bin/uispec
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'uispecrunner'
|
2
|
+
require 'uispecrunner/options'
|
3
|
+
|
4
|
+
class UISpecRunner
|
5
|
+
class Application
|
6
|
+
def self.run!(*arguments)
|
7
|
+
options = UISpecRunner::Options.new(arguments)
|
8
|
+
|
9
|
+
if options[:invalid_argument]
|
10
|
+
$stderr.puts options[:invalid_argument]
|
11
|
+
options[:show_help] = true
|
12
|
+
end
|
13
|
+
|
14
|
+
if options[:show_help]
|
15
|
+
$stderr.puts options.opts
|
16
|
+
return 1
|
17
|
+
end
|
18
|
+
|
19
|
+
# Read standard arguments from uispec.opts
|
20
|
+
options_file = 'uispec.opts'
|
21
|
+
if File.exists?(options_file)
|
22
|
+
option_file_args = File.readlines(options_file).map {|l| l.chomp.split " "}.flatten
|
23
|
+
options = options.merge(UISpecRunner::Options.new(option_file_args))
|
24
|
+
end
|
25
|
+
|
26
|
+
runner = UISpecRunner.new(options)
|
27
|
+
runner.run!
|
28
|
+
return 0
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
class UISpecRunner
|
2
|
+
class Options < Hash
|
3
|
+
attr_reader :opts, :orig_args
|
4
|
+
|
5
|
+
def initialize(args)
|
6
|
+
super()
|
7
|
+
|
8
|
+
@orig_args = args.clone
|
9
|
+
|
10
|
+
# Configure default settings
|
11
|
+
self[:run_mode] = :all
|
12
|
+
self[:target] = 'UISpec'
|
13
|
+
self[:configuration] = 'Debug'
|
14
|
+
self[:build_dir] = './build'
|
15
|
+
self[:verbose] = false
|
16
|
+
self[:sdk_version] = '3.0'
|
17
|
+
|
18
|
+
require 'optparse'
|
19
|
+
@opts = OptionParser.new do |o|
|
20
|
+
o.banner = "Usage: #{File.basename($0)} [options]\ne.g. #{File.basename($0)}"
|
21
|
+
|
22
|
+
o.separator ""
|
23
|
+
o.separator "Run Modes:"
|
24
|
+
|
25
|
+
o.on('-s', '--spec [CLASS]', 'Run the specified UISpec class') do |spec|
|
26
|
+
self[:spec] = spec
|
27
|
+
self[:run_mode] = :spec
|
28
|
+
end
|
29
|
+
|
30
|
+
o.on('-e', '--example [METHOD]', 'Run the specified example method (requires --spec)') do |example|
|
31
|
+
self[:example] = example
|
32
|
+
self[:run_mode] = :example
|
33
|
+
# TODO: Need to raise exception if method is specified without class
|
34
|
+
end
|
35
|
+
|
36
|
+
o.on('-p', '--protocol [PROTOCOL]', 'Run all UISpec classes implementing the Objective-C protocol') do |protocol|
|
37
|
+
self[:protocol] = protocol
|
38
|
+
self[:run_mode] = :protocol
|
39
|
+
end
|
40
|
+
|
41
|
+
o.separator ""
|
42
|
+
o.separator "Environment options:"
|
43
|
+
|
44
|
+
o.on('--project [PROJECT_FILE]',
|
45
|
+
'Run the UISpec target in specified project',
|
46
|
+
'Default: auto-detect project in current directory') do |project|
|
47
|
+
self[:project] = project
|
48
|
+
end
|
49
|
+
|
50
|
+
o.on('--sdk [VERSION]',
|
51
|
+
'Run the UISpec target against the iPhone SDK version',
|
52
|
+
'Default: 3.0') do |sdk_version|
|
53
|
+
self[:sdk_version] = sdk_version
|
54
|
+
end
|
55
|
+
|
56
|
+
o.on('-c', '--configuration [CONFIGURATION]',
|
57
|
+
'Build with specified XCode configuration.',
|
58
|
+
'Default: Debug') do |configuration|
|
59
|
+
self[:configuration] = configuration
|
60
|
+
end
|
61
|
+
|
62
|
+
o.on('-t', '--target [TARGET]',
|
63
|
+
'Run the specified XCode target.',
|
64
|
+
'Default: UISpec') do |target|
|
65
|
+
self[:target] = target
|
66
|
+
end
|
67
|
+
|
68
|
+
o.on('--builddir [BUILD_DIR]',
|
69
|
+
'Run app in the build directory.',
|
70
|
+
'Default: ./build') do |build_dir|
|
71
|
+
self[:build_dir] = build_dir
|
72
|
+
end
|
73
|
+
|
74
|
+
o.on('--securityd',
|
75
|
+
'Start the securityd daemon before running specs. This allow interaction with the keychain.') do |securityd|
|
76
|
+
self[:securityd] = securityd
|
77
|
+
end
|
78
|
+
|
79
|
+
o.on('-v', '--[no-]verbose', "Run verbosely") do |v|
|
80
|
+
self[:verbose] = v
|
81
|
+
end
|
82
|
+
|
83
|
+
o.on_tail('-h', '--help', 'display this help and exit') do
|
84
|
+
self[:show_help] = true
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
begin
|
89
|
+
@opts.parse!(args)
|
90
|
+
# TODO: Support running specific files
|
91
|
+
#self[:project_name] = args.shift
|
92
|
+
rescue OptionParser::InvalidOption => e
|
93
|
+
self[:invalid_argument] = e.message
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def merge(other)
|
98
|
+
self.class.new(@orig_args + other.orig_args)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
data/lib/uispecrunner.rb
ADDED
@@ -0,0 +1,129 @@
|
|
1
|
+
# UISpec Runner
|
2
|
+
# By: Blake Watters <blake@twotoasters.com>
|
3
|
+
# Portions borrowed from Eloy Duran's Kicker script (http://github.com/alloy/UISpec)
|
4
|
+
|
5
|
+
require 'tmpdir'
|
6
|
+
|
7
|
+
class UISpecRunner
|
8
|
+
attr_accessor :project, :target, :configuration, :sdk_version, :build_dir, :verbose, :securityd
|
9
|
+
|
10
|
+
# private
|
11
|
+
attr_accessor :run_mode, :spec, :example, :protocol
|
12
|
+
|
13
|
+
def initialize(options = {})
|
14
|
+
options.each { |k,v| self.send("#{k}=", v) }
|
15
|
+
self.target ||= 'UISpec'
|
16
|
+
self.configuration ||= 'Debug'
|
17
|
+
self.build_dir ||= './build'
|
18
|
+
self.run_mode ||= :all
|
19
|
+
end
|
20
|
+
|
21
|
+
def run!
|
22
|
+
case run_mode
|
23
|
+
when :all
|
24
|
+
run_all!
|
25
|
+
when :spec
|
26
|
+
run_spec!(self.spec)
|
27
|
+
when :example
|
28
|
+
run_spec_example!(self.spec, self.example)
|
29
|
+
when :protocol
|
30
|
+
run_protocol!(self.protocol_name)
|
31
|
+
else
|
32
|
+
raise ArgumentError, "Unknown run mode: #{run_mode}"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def run_all!
|
37
|
+
run_specs
|
38
|
+
end
|
39
|
+
|
40
|
+
def run_protocol!(protocol_name)
|
41
|
+
run_specs('UISPEC_PROTOCOL' => protocol_name)
|
42
|
+
end
|
43
|
+
|
44
|
+
def run_spec!(spec_name)
|
45
|
+
run_specs('UISPEC_SPEC' => spec_name)
|
46
|
+
end
|
47
|
+
|
48
|
+
def run_spec_example!(spec_name, example_name)
|
49
|
+
run_specs('UISPEC_SPEC' => spec_name, 'UISPEC_EXAMPLE' => example_name)
|
50
|
+
end
|
51
|
+
|
52
|
+
def verbose?
|
53
|
+
self.verbose
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
def run_command(command)
|
58
|
+
puts "Executing: #{command}" if verbose?
|
59
|
+
system(command)
|
60
|
+
end
|
61
|
+
|
62
|
+
def path_to_securityd
|
63
|
+
"#{sdk_dir}/usr/libexec/securityd"
|
64
|
+
end
|
65
|
+
|
66
|
+
def start_securityd
|
67
|
+
run_command("launchctl submit -l UISpecRunnerDaemons -- #{path_to_securityd}")
|
68
|
+
@securityd_running = true
|
69
|
+
Signal.trap("INT") { stop_securityd }
|
70
|
+
Signal.trap("TERM") { stop_securityd }
|
71
|
+
Signal.trap("EXIT") { stop_securityd }
|
72
|
+
end
|
73
|
+
|
74
|
+
def stop_securityd
|
75
|
+
run_command("launchctl remove UISpecRunnerDaemons") if @securityd_running
|
76
|
+
@securityd_running = false
|
77
|
+
end
|
78
|
+
|
79
|
+
def run_specs(env = {})
|
80
|
+
if build_project!
|
81
|
+
env.merge!('DYLD_ROOT_PATH' => sdk_dir, 'IPHONE_SIMULATOR_ROOT' => sdk_dir, 'CFFIXED_USER_HOME' => tmpdir)
|
82
|
+
puts "Setting environment variables: #{env.inspect}" if verbose?
|
83
|
+
with_env(env) do
|
84
|
+
start_securityd if securityd
|
85
|
+
command = "#{build_dir}/#{configuration}-iphonesimulator/#{target}.app/#{target} -RegisterForSystemEvents"
|
86
|
+
puts "Executing: #{command}" if verbose?
|
87
|
+
output = `#{command}`
|
88
|
+
exit_code = $?
|
89
|
+
unless exit_code == 0
|
90
|
+
puts "[!] Failed to run UISpec target: #{output}"
|
91
|
+
exit 1
|
92
|
+
end
|
93
|
+
end
|
94
|
+
else
|
95
|
+
puts "[!] Failed to build UISpecs.app"
|
96
|
+
exit 1
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def sdk_dir
|
101
|
+
"/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator#{sdk_version}.sdk"
|
102
|
+
end
|
103
|
+
|
104
|
+
def tmpdir
|
105
|
+
Dir.tmpdir
|
106
|
+
end
|
107
|
+
|
108
|
+
def project_switch
|
109
|
+
"-project #{project}" if project
|
110
|
+
end
|
111
|
+
|
112
|
+
def sdk_switch
|
113
|
+
"-sdk #{sdk_dir}" if sdk_version
|
114
|
+
end
|
115
|
+
|
116
|
+
def build_project!
|
117
|
+
command = "xcodebuild #{project_switch} -target #{target} -configuration #{configuration} #{sdk_switch} > /dev/null"
|
118
|
+
puts "Building project with: #{command}" if verbose?
|
119
|
+
system(command)
|
120
|
+
end
|
121
|
+
|
122
|
+
def with_env(env)
|
123
|
+
before = env.inject({}) { |h, (k, _)| h[k] = ENV[k]; h }
|
124
|
+
env.each { |k, v| ENV[k] = v }
|
125
|
+
yield
|
126
|
+
ensure
|
127
|
+
before.each { |k, v| ENV[k] = v }
|
128
|
+
end
|
129
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe UISpecRunner::Options do
|
4
|
+
it "should set the command to run_protocol" do
|
5
|
+
options = UISpecRunner::Options.new('-p UISpecIntegration')
|
6
|
+
options[:command].should == :run_protocol
|
7
|
+
end
|
8
|
+
end
|
data/spec/spec.opts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
//
|
2
|
+
// UISpec+UISpecRunner.h
|
3
|
+
// UISpecRunner
|
4
|
+
//
|
5
|
+
// Created by Blake Watters on 7/15/10.
|
6
|
+
// Copyright 2010 Two Toasters. All rights reserved.
|
7
|
+
//
|
8
|
+
|
9
|
+
#import <Foundation/Foundation.h>
|
10
|
+
#import "UISpec.h"
|
11
|
+
|
12
|
+
@interface UISpec (UISpecRunner)
|
13
|
+
|
14
|
+
/**
|
15
|
+
* Run all UISpec classes conforming to a given protocol
|
16
|
+
*/
|
17
|
+
+(void)runSpecsConformingToProtocol:(Protocol *)protocol afterDelay:(NSTimeInterval)delay;
|
18
|
+
|
19
|
+
/**
|
20
|
+
* Infers which set of UISpec classes to run from the following environment variables:
|
21
|
+
* UISPEC_PROTOCOL - Specifies a protocol to run
|
22
|
+
* UISPEC_SPEC - Specifies a spec class to run
|
23
|
+
* UISPEC_METHOD - Specifies an example to run (requires UISPEC_SPEC to be set)
|
24
|
+
*/
|
25
|
+
+(void)runSpecsFromEnvironmentAfterDelay:(int)seconds;
|
26
|
+
|
27
|
+
@end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
//
|
2
|
+
// UISpec+UISpecRunner.m
|
3
|
+
// UISpecRunner
|
4
|
+
//
|
5
|
+
// Created by Blake Watters on 7/15/10.
|
6
|
+
// Copyright 2010 Two Toasters. All rights reserved.
|
7
|
+
//
|
8
|
+
|
9
|
+
#import "UISpec+UISpecRunner.h"
|
10
|
+
|
11
|
+
@implementation UISpec (UISpecRunner)
|
12
|
+
|
13
|
+
+(BOOL)class:(Class)class conformsToProtocol:(Protocol *)protocol {
|
14
|
+
while (class) {
|
15
|
+
if (class_conformsToProtocol(class, protocol)) {
|
16
|
+
return YES;
|
17
|
+
}
|
18
|
+
class = class_getSuperclass(class);
|
19
|
+
}
|
20
|
+
return NO;
|
21
|
+
}
|
22
|
+
|
23
|
+
+(NSArray*)specClassesConformingToProtocol:(Protocol *)protocol {
|
24
|
+
NSMutableArray *array = [NSMutableArray array];
|
25
|
+
int numClasses = objc_getClassList(NULL, 0);
|
26
|
+
if (numClasses > 0) {
|
27
|
+
Class *classes = malloc(sizeof(Class) * numClasses);
|
28
|
+
(void) objc_getClassList (classes, numClasses);
|
29
|
+
int i;
|
30
|
+
for (i = 0; i < numClasses; i++) {
|
31
|
+
Class c = classes[i];
|
32
|
+
if ([self isASpec:c] && [self class:c conformsToProtocol:protocol]) {
|
33
|
+
[array addObject:c];
|
34
|
+
}
|
35
|
+
}
|
36
|
+
free(classes);
|
37
|
+
}
|
38
|
+
return array;
|
39
|
+
}
|
40
|
+
|
41
|
+
+(void)runSpecsConformingToProtocol:(Protocol *)protocol afterDelay:(NSTimeInterval)delay {
|
42
|
+
NSArray* specClasses = [self specClassesConformingToProtocol:protocol];
|
43
|
+
[self performSelector:@selector(runSpecClasses:) withObject:specClasses afterDelay:delay];
|
44
|
+
}
|
45
|
+
|
46
|
+
+(void)runSpecsFromEnvironmentAfterDelay:(int)seconds {
|
47
|
+
char* protocolName = getenv("UISPEC_PROTOCOL");
|
48
|
+
char* specName = getenv("UISPEC_SPEC");
|
49
|
+
char* exampleName = getenv("UISPEC_EXAMPLE");
|
50
|
+
if (protocolName) {
|
51
|
+
Protocol* protocol = NSProtocolFromString([NSString stringWithUTF8String:protocolName]);
|
52
|
+
NSLog(@"[UISpecRunner] Running Specs conforming to Protocol: %@", [NSString stringWithUTF8String:protocolName]);
|
53
|
+
[UISpec runSpecsConformingToProtocol:protocol afterDelay:seconds];
|
54
|
+
} else if (exampleName) {
|
55
|
+
if (nil == specName) {
|
56
|
+
[NSException raise:nil format:@"UISPEC_EXAMPLE cannot be specified without providing UISPEC_SPEC"];
|
57
|
+
}
|
58
|
+
NSLog(@"[UISpecRunner] Running Examples %s on Spec %s", exampleName, specName);
|
59
|
+
[UISpec runSpec:[NSString stringWithUTF8String:specName] example:[NSString stringWithUTF8String:exampleName] afterDelay:seconds];
|
60
|
+
} else if (specName) {
|
61
|
+
NSLog(@"[UISpecRunner] Running Spec %s", specName);
|
62
|
+
[UISpec runSpec:[NSString stringWithUTF8String:specName] afterDelay:seconds];
|
63
|
+
} else {
|
64
|
+
[UISpec runSpecsAfterDelay:seconds];
|
65
|
+
}
|
66
|
+
}
|
67
|
+
|
68
|
+
@end
|
data/src/main.m
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
//
|
2
|
+
// main.m
|
3
|
+
// UISpecRunner
|
4
|
+
//
|
5
|
+
// Created by Blake Watters on 4/20/10.
|
6
|
+
// Copyright 2010 Two Toasters. All rights reserved.
|
7
|
+
//
|
8
|
+
|
9
|
+
#import <UIKit/UIKit.h>
|
10
|
+
#import <UISpec.h>
|
11
|
+
#import "UISpec+UISpecRunner.h"
|
12
|
+
|
13
|
+
int main(int argc, char *argv[]) {
|
14
|
+
|
15
|
+
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
|
16
|
+
|
17
|
+
// Run the specs
|
18
|
+
[UISpec runSpecsFromEnvironmentAfterDelay:0.5];
|
19
|
+
|
20
|
+
int retVal = UIApplicationMain(argc, argv, nil, nil);
|
21
|
+
[pool release];
|
22
|
+
return retVal;
|
23
|
+
}
|
@@ -0,0 +1,64 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{uispecrunner}
|
8
|
+
s.version = "0.2.1"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Blake Watters"]
|
12
|
+
s.date = %q{2010-07-15}
|
13
|
+
s.default_executable = %q{uispec}
|
14
|
+
s.description = %q{Provides a simple Ruby interface for running UISpec iPhone tests}
|
15
|
+
s.email = %q{blake@twotoasters.com}
|
16
|
+
s.executables = ["uispec"]
|
17
|
+
s.extra_rdoc_files = [
|
18
|
+
"LICENSE",
|
19
|
+
"README.md"
|
20
|
+
]
|
21
|
+
s.files = [
|
22
|
+
".gitignore",
|
23
|
+
"LICENSE",
|
24
|
+
"README.md",
|
25
|
+
"Rakefile",
|
26
|
+
"VERSION",
|
27
|
+
"bin/uispec",
|
28
|
+
"lib/uispecrunner.rb",
|
29
|
+
"lib/uispecrunner/application.rb",
|
30
|
+
"lib/uispecrunner/options.rb",
|
31
|
+
"spec/options_spec.rb",
|
32
|
+
"spec/spec.opts",
|
33
|
+
"spec/spec_helper.rb",
|
34
|
+
"spec/uispecrunner_spec.rb",
|
35
|
+
"src/UISpec+UISpecRunner.h",
|
36
|
+
"src/UISpec+UISpecRunner.m",
|
37
|
+
"src/main.m",
|
38
|
+
"uispecrunner.gemspec"
|
39
|
+
]
|
40
|
+
s.homepage = %q{http://github.com/twotoasters/UISpecRunner}
|
41
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
42
|
+
s.require_paths = ["lib"]
|
43
|
+
s.rubygems_version = %q{1.3.6}
|
44
|
+
s.summary = %q{Flexible spec runner for UISpec on iOS}
|
45
|
+
s.test_files = [
|
46
|
+
"spec/options_spec.rb",
|
47
|
+
"spec/spec_helper.rb",
|
48
|
+
"spec/uispecrunner_spec.rb"
|
49
|
+
]
|
50
|
+
|
51
|
+
if s.respond_to? :specification_version then
|
52
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
53
|
+
s.specification_version = 3
|
54
|
+
|
55
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
56
|
+
s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
|
57
|
+
else
|
58
|
+
s.add_dependency(%q<rspec>, [">= 1.2.9"])
|
59
|
+
end
|
60
|
+
else
|
61
|
+
s.add_dependency(%q<rspec>, [">= 1.2.9"])
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
metadata
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: uispecrunner
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 2
|
8
|
+
- 1
|
9
|
+
version: 0.2.1
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Blake Watters
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2010-07-15 00:00:00 -04:00
|
18
|
+
default_executable: uispec
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: rspec
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 1
|
29
|
+
- 2
|
30
|
+
- 9
|
31
|
+
version: 1.2.9
|
32
|
+
type: :development
|
33
|
+
version_requirements: *id001
|
34
|
+
description: Provides a simple Ruby interface for running UISpec iPhone tests
|
35
|
+
email: blake@twotoasters.com
|
36
|
+
executables:
|
37
|
+
- uispec
|
38
|
+
extensions: []
|
39
|
+
|
40
|
+
extra_rdoc_files:
|
41
|
+
- LICENSE
|
42
|
+
- README.md
|
43
|
+
files:
|
44
|
+
- .gitignore
|
45
|
+
- LICENSE
|
46
|
+
- README.md
|
47
|
+
- Rakefile
|
48
|
+
- VERSION
|
49
|
+
- bin/uispec
|
50
|
+
- lib/uispecrunner.rb
|
51
|
+
- lib/uispecrunner/application.rb
|
52
|
+
- lib/uispecrunner/options.rb
|
53
|
+
- spec/options_spec.rb
|
54
|
+
- spec/spec.opts
|
55
|
+
- spec/spec_helper.rb
|
56
|
+
- spec/uispecrunner_spec.rb
|
57
|
+
- src/UISpec+UISpecRunner.h
|
58
|
+
- src/UISpec+UISpecRunner.m
|
59
|
+
- src/main.m
|
60
|
+
- uispecrunner.gemspec
|
61
|
+
has_rdoc: true
|
62
|
+
homepage: http://github.com/twotoasters/UISpecRunner
|
63
|
+
licenses: []
|
64
|
+
|
65
|
+
post_install_message:
|
66
|
+
rdoc_options:
|
67
|
+
- --charset=UTF-8
|
68
|
+
require_paths:
|
69
|
+
- lib
|
70
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
segments:
|
75
|
+
- 0
|
76
|
+
version: "0"
|
77
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - ">="
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
segments:
|
82
|
+
- 0
|
83
|
+
version: "0"
|
84
|
+
requirements: []
|
85
|
+
|
86
|
+
rubyforge_project:
|
87
|
+
rubygems_version: 1.3.6
|
88
|
+
signing_key:
|
89
|
+
specification_version: 3
|
90
|
+
summary: Flexible spec runner for UISpec on iOS
|
91
|
+
test_files:
|
92
|
+
- spec/options_spec.rb
|
93
|
+
- spec/spec_helper.rb
|
94
|
+
- spec/uispecrunner_spec.rb
|