frank-cucumber 1.1.9.pre1 → 1.1.10
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/frank-cucumber.gemspec +1 -1
- data/frank-skeleton/frank_static_resources.bundle/js/controller.js +7 -18
- data/frank-skeleton/frank_static_resources.bundle/js/ersatz_model.js +2 -1
- data/frank-skeleton/frank_static_resources.bundle/js/ersatz_view.js +37 -30
- data/frank-skeleton/frank_static_resources.bundle/js/frank.js +29 -1
- data/frank-skeleton/libCocoaAsyncSocket.a +0 -0
- data/frank-skeleton/libCocoaAsyncSocketMac.a +0 -0
- data/frank-skeleton/libCocoaHTTPServer.a +0 -0
- data/frank-skeleton/libCocoaHTTPServerMac.a +0 -0
- data/frank-skeleton/libCocoaLumberjack.a +0 -0
- data/frank-skeleton/libCocoaLumberjackMac.a +0 -0
- data/frank-skeleton/libFrank.a +0 -0
- data/frank-skeleton/libFrankMac.a +0 -0
- data/frank-skeleton/libShelley.a +0 -0
- data/lib/frank-cucumber/cli.rb +90 -5
- data/lib/frank-cucumber/frankifier.rb +13 -1
- data/lib/frank-cucumber/gesture_helper.rb +31 -0
- data/lib/frank-cucumber/version.rb +1 -1
- metadata +7 -7
data/frank-cucumber.gemspec
CHANGED
|
@@ -28,7 +28,7 @@ Gem::Specification.new do |s|
|
|
|
28
28
|
s.add_dependency( "json" ) # TODO: figure out how to be more permissive as to which JSON gems we allow
|
|
29
29
|
s.add_dependency( "dnssd" )
|
|
30
30
|
s.add_dependency( "thor" )
|
|
31
|
-
s.add_dependency( "xcodeproj" )
|
|
31
|
+
s.add_dependency( "xcodeproj", [">=0.5.3"] )
|
|
32
32
|
|
|
33
33
|
s.add_development_dependency( "rr" )
|
|
34
34
|
s.add_development_dependency( "yard" )
|
|
@@ -1,22 +1,9 @@
|
|
|
1
1
|
(function() {
|
|
2
|
-
var RELOAD_INTERVAL,
|
|
2
|
+
var RELOAD_INTERVAL,
|
|
3
3
|
__slice = [].slice;
|
|
4
4
|
|
|
5
5
|
RELOAD_INTERVAL = 500;
|
|
6
6
|
|
|
7
|
-
guessAtDeviceFamilyBasedOnViewDump = function(viewHier) {
|
|
8
|
-
switch (viewHier.accessibilityFrame.size.height) {
|
|
9
|
-
case 1024:
|
|
10
|
-
return 'ipad';
|
|
11
|
-
case 480:
|
|
12
|
-
case 568:
|
|
13
|
-
return 'iphone';
|
|
14
|
-
default:
|
|
15
|
-
console.warn("couldn't recognize device family based on screen height of " + viewHeir.accessibilityFrame.size.height + "px");
|
|
16
|
-
return 'unknown';
|
|
17
|
-
}
|
|
18
|
-
};
|
|
19
|
-
|
|
20
7
|
define(['frank'], function(frank) {
|
|
21
8
|
var createController;
|
|
22
9
|
createController = function(_arg) {
|
|
@@ -117,12 +104,14 @@
|
|
|
117
104
|
reload = function() {
|
|
118
105
|
var deferable;
|
|
119
106
|
deferable = $.Deferred();
|
|
120
|
-
$.when(frank.fetchViewHierarchy(), frank.fetchOrientation()).done(function(_arg1, orientation) {
|
|
121
|
-
var accessibleViews,
|
|
107
|
+
$.when(frank.fetchViewHierarchy(), frank.fetchResolution(), frank.fetchOrientation(), frank.fetchDevice()).done(function(_arg1, resolution, orientation, deviceFamily) {
|
|
108
|
+
var accessibleViews, rawHier;
|
|
122
109
|
rawHier = _arg1[0];
|
|
123
|
-
deviceFamily
|
|
110
|
+
if (deviceFamily == 'mac') {
|
|
111
|
+
$liveButton.hide();
|
|
112
|
+
}
|
|
124
113
|
treeView.model.resetViewHier(rawHier);
|
|
125
|
-
ersatzView.model.resetViews(treeView.model.get('allViews'), deviceFamily, orientation);
|
|
114
|
+
ersatzView.model.resetViews(treeView.model.get('allViews'), resolution, deviceFamily, orientation);
|
|
126
115
|
accessibleViews = treeView.model.getAccessibleViews();
|
|
127
116
|
accessibleViewsView.collection.reset(accessibleViews);
|
|
128
117
|
ersatzView.render();
|
|
@@ -15,8 +15,9 @@
|
|
|
15
15
|
return _this.temporaryHighlightTimeout = void 0;
|
|
16
16
|
}, 1500);
|
|
17
17
|
},
|
|
18
|
-
resetViews: function(views, deviceFamily, orientation) {
|
|
18
|
+
resetViews: function(views, resolution, deviceFamily, orientation) {
|
|
19
19
|
this.set('allViews', views);
|
|
20
|
+
this.set('resolution', resolution);
|
|
20
21
|
this.set('deviceFamily', deviceFamily);
|
|
21
22
|
this.set('orientation', orientation);
|
|
22
23
|
this.set('highlightFrames', []);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
(function() {
|
|
2
|
-
var ISO_MAJOR_OFFSET, ISO_MINOR_OFFSET, ISO_SKEW,
|
|
2
|
+
var ISO_MAJOR_OFFSET, ISO_MINOR_OFFSET, ISO_SKEW,
|
|
3
3
|
__slice = [].slice;
|
|
4
4
|
|
|
5
5
|
ISO_SKEW = 15;
|
|
@@ -8,35 +8,29 @@
|
|
|
8
8
|
|
|
9
9
|
ISO_MINOR_OFFSET = 5;
|
|
10
10
|
|
|
11
|
-
SCREEN_BOUNDS = {
|
|
12
|
-
iphone: {
|
|
13
|
-
x: 0,
|
|
14
|
-
y: 0,
|
|
15
|
-
width: 320,
|
|
16
|
-
height: 480
|
|
17
|
-
},
|
|
18
|
-
ipad: {
|
|
19
|
-
x: 0,
|
|
20
|
-
y: 0,
|
|
21
|
-
width: 768,
|
|
22
|
-
height: 1024
|
|
23
|
-
}
|
|
24
|
-
};
|
|
25
|
-
|
|
26
11
|
define(['transform_stack', 'ersatz_model'], function(transformStack, ErsatzModel) {
|
|
27
12
|
var ErsatzView, ErsatzViewSnapshotView, drawStaticBackdropAndReturnTransformer, transformFromBaseForViewModel;
|
|
28
|
-
drawStaticBackdropAndReturnTransformer = function(paper, deviceFamily, orientation, isoSkew) {
|
|
29
|
-
var isiPhone, rotation, rotationPoint, transformer;
|
|
13
|
+
drawStaticBackdropAndReturnTransformer = function(paper, resolution, deviceFamily, orientation, isoSkew) {
|
|
14
|
+
var isiPhone, isiPad, rotation, rotationPoint, transformer;
|
|
30
15
|
paper.clear();
|
|
31
16
|
paper.canvas.setAttribute("width", "100%");
|
|
32
17
|
paper.canvas.setAttribute("height", "100%");
|
|
33
18
|
isiPhone = 'iphone' === deviceFamily;
|
|
19
|
+
isiPad = 'ipad' == deviceFamily;
|
|
34
20
|
if (isiPhone) {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
21
|
+
width = resolution.width + 60;
|
|
22
|
+
height = resolution.height + 240;
|
|
23
|
+
paper.canvas.setAttribute("viewBox", "0 0 " + width + " " + height);
|
|
24
|
+
rotationPoint = [width / 2, height / 2];
|
|
25
|
+
} else if (isiPad) {
|
|
26
|
+
width = resolution.width + 108;
|
|
27
|
+
height = resolution.height + 176;
|
|
28
|
+
paper.canvas.setAttribute("viewBox", "0 0 " + width + " " + height);
|
|
29
|
+
rotationPoint = [width / 2, height / 2];
|
|
30
|
+
}
|
|
31
|
+
else
|
|
32
|
+
{
|
|
33
|
+
paper.canvas.setAttribute("viewBox", "0 0 " + resolution.width + " " + resolution.height);
|
|
40
34
|
}
|
|
41
35
|
transformer = transformStack();
|
|
42
36
|
transformer.skew(0, isoSkew).translate(6, 6);
|
|
@@ -56,29 +50,36 @@
|
|
|
56
50
|
transformer.rotateAroundPoint.apply(transformer, [rotation].concat(__slice.call(rotationPoint)));
|
|
57
51
|
}
|
|
58
52
|
if (isiPhone) {
|
|
59
|
-
|
|
53
|
+
width = resolution.width + 40;
|
|
54
|
+
height = resolution.height + 228;
|
|
55
|
+
paper.rect(0, 0, width, height, 40).attr({
|
|
60
56
|
fill: "black",
|
|
61
57
|
stroke: "gray",
|
|
62
58
|
"stroke-width": 4
|
|
63
59
|
}).transform(transformer.desc());
|
|
64
|
-
} else {
|
|
65
|
-
|
|
60
|
+
} else if (isiPad) {
|
|
61
|
+
width = resolution.width + 108;
|
|
62
|
+
height = resolution.height + 86;
|
|
63
|
+
paper.rect(10, 10, width, height, 20).attr({
|
|
66
64
|
'fill': 'black',
|
|
67
65
|
'stroke': 'gray',
|
|
68
66
|
'stroke-width': 6
|
|
69
67
|
}).transform(transformer.desc());
|
|
70
68
|
}
|
|
71
69
|
if (isiPhone) {
|
|
72
|
-
|
|
70
|
+
x = resolution.width / 2 + 20;
|
|
71
|
+
y = resolution.height + 175;
|
|
72
|
+
transformer.push().translate(x, y);
|
|
73
73
|
paper.circle(0, 0, 34).transform(transformer.desc()).attr("fill", "90-#303030-#101010");
|
|
74
74
|
paper.rect(0, 0, 22, 22, 5).attr({
|
|
75
75
|
stroke: "gray",
|
|
76
76
|
"stroke-width": 2
|
|
77
77
|
}).transform(transformer.push().translate(-11, -11).descAndPop());
|
|
78
78
|
transformer.translate(20, 120);
|
|
79
|
-
} else {
|
|
79
|
+
} else if (isiPad) {
|
|
80
80
|
transformer.translate(50, 50);
|
|
81
81
|
}
|
|
82
|
+
|
|
82
83
|
if (isoSkew > 0) {
|
|
83
84
|
transformer.translate(-ISO_MAJOR_OFFSET, 0);
|
|
84
85
|
}
|
|
@@ -137,7 +138,7 @@
|
|
|
137
138
|
var isoSkew;
|
|
138
139
|
this.highlights = [];
|
|
139
140
|
isoSkew = (this.model.get('isAsploded') ? ISO_SKEW : 0);
|
|
140
|
-
this.backdropTransformer = drawStaticBackdropAndReturnTransformer(this.paper, this.model.get('deviceFamily'), this.model.get('orientation'), isoSkew);
|
|
141
|
+
this.backdropTransformer = drawStaticBackdropAndReturnTransformer(this.paper, this.model.get('resolution'), this.model.get('deviceFamily'), this.model.get('orientation'), isoSkew);
|
|
141
142
|
this.backdrop = this.paper.image();
|
|
142
143
|
this.refreshBaseScreenshot();
|
|
143
144
|
if (this.model.get('isAsploded')) {
|
|
@@ -147,7 +148,13 @@
|
|
|
147
148
|
return this.el;
|
|
148
149
|
},
|
|
149
150
|
screenBounds: function() {
|
|
150
|
-
|
|
151
|
+
resolution = this.model.get('resolution');
|
|
152
|
+
return {
|
|
153
|
+
x: 0,
|
|
154
|
+
y: 0,
|
|
155
|
+
width: resolution.width,
|
|
156
|
+
height: resolution.height
|
|
157
|
+
};
|
|
151
158
|
},
|
|
152
159
|
refreshBaseScreenshot: function() {
|
|
153
160
|
var newScreenshotUrl;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
(function() {
|
|
2
|
-
var baseUrlFor, cacheBust, displayErrorResponse, fetchOrientation, fetchViewHierarchy, isErrorResponse, requestSnapshotRefresh, sendMapRequest;
|
|
2
|
+
var baseUrlFor, cacheBust, displayErrorResponse, fetchResolution, fetchOrientation, fetchViewHierarchy, fetchDevice, isErrorResponse, requestSnapshotRefresh, sendMapRequest;
|
|
3
3
|
|
|
4
4
|
cacheBust = function(url) {
|
|
5
5
|
return "" + url + "?" + ((new Date()).getTime());
|
|
@@ -26,6 +26,19 @@
|
|
|
26
26
|
});
|
|
27
27
|
};
|
|
28
28
|
|
|
29
|
+
fetchResolution = function() {
|
|
30
|
+
var deferable, request;
|
|
31
|
+
deferable = new $.Deferred();
|
|
32
|
+
request = $.ajax({
|
|
33
|
+
type: "GET",
|
|
34
|
+
dataType: "json",
|
|
35
|
+
url: baseUrlFor("/resolution")
|
|
36
|
+
}).done(function(response) {
|
|
37
|
+
return deferable.resolve(response || 'unknown');
|
|
38
|
+
}).fail(deferable.reject);
|
|
39
|
+
return deferable.promise();
|
|
40
|
+
};
|
|
41
|
+
|
|
29
42
|
fetchOrientation = function() {
|
|
30
43
|
var deferable, request;
|
|
31
44
|
deferable = new $.Deferred();
|
|
@@ -39,6 +52,19 @@
|
|
|
39
52
|
return deferable.promise();
|
|
40
53
|
};
|
|
41
54
|
|
|
55
|
+
fetchDevice = function() {
|
|
56
|
+
var deferable, request;
|
|
57
|
+
deferable = new $.Deferred();
|
|
58
|
+
request = $.ajax({
|
|
59
|
+
type: "GET",
|
|
60
|
+
dataType: "json",
|
|
61
|
+
url: baseUrlFor("/device")
|
|
62
|
+
}).done(function(response) {
|
|
63
|
+
return deferable.resolve(response && response.device || 'unknown');
|
|
64
|
+
}).fail(deferable.reject);
|
|
65
|
+
return deferable.promise();
|
|
66
|
+
};
|
|
67
|
+
|
|
42
68
|
requestSnapshotRefresh = function() {
|
|
43
69
|
return $.ajax({
|
|
44
70
|
type: 'GET',
|
|
@@ -83,7 +109,9 @@
|
|
|
83
109
|
define(function() {
|
|
84
110
|
return {
|
|
85
111
|
fetchViewHierarchy: fetchViewHierarchy,
|
|
112
|
+
fetchResolution: fetchResolution,
|
|
86
113
|
fetchOrientation: fetchOrientation,
|
|
114
|
+
fetchDevice: fetchDevice,
|
|
87
115
|
requestSnapshotRefresh: requestSnapshotRefresh,
|
|
88
116
|
baseScreenshotUrl: function() {
|
|
89
117
|
return cacheBust(baseUrlFor('/screenshot'));
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
data/frank-skeleton/libFrank.a
CHANGED
|
Binary file
|
|
Binary file
|
data/frank-skeleton/libShelley.a
CHANGED
|
Binary file
|
data/lib/frank-cucumber/cli.rb
CHANGED
|
@@ -8,6 +8,7 @@ require 'frank-cucumber/launcher'
|
|
|
8
8
|
require 'frank-cucumber/console'
|
|
9
9
|
require 'frank-cucumber/frankifier'
|
|
10
10
|
require 'frank-cucumber/mac_launcher'
|
|
11
|
+
require 'xcodeproj'
|
|
11
12
|
|
|
12
13
|
module Frank
|
|
13
14
|
class CLI < Thor
|
|
@@ -32,6 +33,7 @@ module Frank
|
|
|
32
33
|
method_option WITHOUT_LUMBERJACK, :type => :boolean
|
|
33
34
|
method_option :build_configuration, :aliases=>'--conf', :type=>:string, :default => 'Debug'
|
|
34
35
|
method_option :target, :type=>:string
|
|
36
|
+
method_option :project, :type=>:string
|
|
35
37
|
def setup
|
|
36
38
|
@libs = %w(Shelley CocoaAsyncSocket CocoaLumberjack CocoaHTTPServer Frank)
|
|
37
39
|
@libsMac = %w(CocoaAsyncSocketMac CocoaLumberjackMac CocoaHTTPServerMac FrankMac)
|
|
@@ -43,7 +45,7 @@ module Frank
|
|
|
43
45
|
@libsMac -= %w(CocoaLumberjackMac) if options[WITHOUT_LUMBERJACK]
|
|
44
46
|
directory ".", "Frank"
|
|
45
47
|
|
|
46
|
-
Frankifier.frankify!( File.expand_path('.'), :build_config => options[:build_configuration], :target => options[:target] )
|
|
48
|
+
Frankifier.frankify!( File.expand_path('.'), :build_config => options[:build_configuration], :target => options[:target], :project => options[:project] )
|
|
47
49
|
end
|
|
48
50
|
|
|
49
51
|
desc "update", "updates the frank server components inside your Frank directory"
|
|
@@ -55,13 +57,12 @@ module Frank
|
|
|
55
57
|
directory( 'frank_static_resources.bundle', 'Frank/frank_static_resources.bundle', :force => true )
|
|
56
58
|
end
|
|
57
59
|
|
|
58
|
-
XCODEBUILD_OPTIONS = %w{workspace scheme target configuration}
|
|
60
|
+
XCODEBUILD_OPTIONS = %w{workspace project scheme target configuration}
|
|
59
61
|
desc "build", "builds a Frankified version of your native app"
|
|
60
62
|
XCODEBUILD_OPTIONS.each do |option|
|
|
61
63
|
method_option option
|
|
62
64
|
end
|
|
63
65
|
method_option 'arch', :type => :string, :default => 'i386'
|
|
64
|
-
method_option 'mac', :type => :boolean, :default => false
|
|
65
66
|
method_option :noclean, :type => :boolean, :default => false, :aliases => '--nc', :desc => "Don't clean the build directory before building"
|
|
66
67
|
def build
|
|
67
68
|
clean = !options['noclean']
|
|
@@ -99,7 +100,9 @@ module Frank
|
|
|
99
100
|
separate_configuration_option = "-configuration Debug"
|
|
100
101
|
end
|
|
101
102
|
|
|
102
|
-
|
|
103
|
+
build_mac = determine_build_patform(options) == :osx
|
|
104
|
+
|
|
105
|
+
if build_mac
|
|
103
106
|
run %Q|xcodebuild -xcconfig Frank/frankify.xcconfig #{build_steps} #{extra_opts} #{separate_configuration_option} DEPLOYMENT_LOCATION=YES DSTROOT="#{build_output_dir}" FRANK_LIBRARY_SEARCH_PATHS="\\"#{frank_lib_directory}\\""|
|
|
104
107
|
else
|
|
105
108
|
extra_opts += " -arch #{options['arch']}"
|
|
@@ -111,7 +114,7 @@ module Frank
|
|
|
111
114
|
app = app.first
|
|
112
115
|
FileUtils.cp_r("#{app}/.", frankified_app_dir)
|
|
113
116
|
|
|
114
|
-
if
|
|
117
|
+
if build_mac
|
|
115
118
|
in_root do
|
|
116
119
|
FileUtils.cp_r(
|
|
117
120
|
File.join( 'Frank',static_bundle),
|
|
@@ -236,6 +239,88 @@ module Frank
|
|
|
236
239
|
end
|
|
237
240
|
end
|
|
238
241
|
|
|
242
|
+
# The xcodeproj gem doesn't currently support schemes, and schemes have been difficult
|
|
243
|
+
# to figure out. I plan to either implement schemes in xcodeproj at a later date, or
|
|
244
|
+
# wait for them to be implemented, and then fix this function
|
|
245
|
+
def determine_build_patform ( options )
|
|
246
|
+
project_path = nil
|
|
247
|
+
|
|
248
|
+
if options["workspace"] != nil
|
|
249
|
+
if options["scheme"] != nil
|
|
250
|
+
workspace = Xcodeproj::Workspace.new_from_xcworkspace(options["workspace"])
|
|
251
|
+
projects = workspace.projpaths
|
|
252
|
+
|
|
253
|
+
projects.each { | current_project |
|
|
254
|
+
lines = `xcodebuild -project #{current_project} -list`
|
|
255
|
+
|
|
256
|
+
found_schemes = false
|
|
257
|
+
|
|
258
|
+
lines.split("\n").each { | line |
|
|
259
|
+
if found_schemes
|
|
260
|
+
line = line[8..-1]
|
|
261
|
+
|
|
262
|
+
if line == ""
|
|
263
|
+
found_schemes = false
|
|
264
|
+
else
|
|
265
|
+
if line == options["scheme"]
|
|
266
|
+
project_path = current_project
|
|
267
|
+
end
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
else
|
|
271
|
+
line = line [4..-1]
|
|
272
|
+
|
|
273
|
+
if line == "Schemes:"
|
|
274
|
+
found_schemes = true
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
end
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
else
|
|
281
|
+
say "You must specify a scheme if you specify a workplace"
|
|
282
|
+
exit 10
|
|
283
|
+
end
|
|
284
|
+
else
|
|
285
|
+
project_path = options["project"]
|
|
286
|
+
end
|
|
287
|
+
|
|
288
|
+
if project_path == nil
|
|
289
|
+
Dir.foreach(Dir.pwd) { | file |
|
|
290
|
+
if file.end_with? ".xcodeproj"
|
|
291
|
+
if project_path != nil
|
|
292
|
+
say "You must specify a project if there are more than one .xcodeproj bundles in a directory"
|
|
293
|
+
exit 10
|
|
294
|
+
else
|
|
295
|
+
project_path = file
|
|
296
|
+
end
|
|
297
|
+
end
|
|
298
|
+
}
|
|
299
|
+
end
|
|
300
|
+
|
|
301
|
+
project = Xcodeproj::Project.new(project_path)
|
|
302
|
+
|
|
303
|
+
target = nil
|
|
304
|
+
|
|
305
|
+
if options["target"] != nil
|
|
306
|
+
project.targets.each { | proj_target |
|
|
307
|
+
if target.name == options["target"]
|
|
308
|
+
target = proj_target
|
|
309
|
+
end
|
|
310
|
+
}
|
|
311
|
+
else
|
|
312
|
+
target = project.targets[0]
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
if target == nil
|
|
316
|
+
say "Unable to determine a target from the options provided"
|
|
317
|
+
exit 10
|
|
318
|
+
end
|
|
319
|
+
|
|
320
|
+
return target.platform_name
|
|
321
|
+
|
|
322
|
+
end
|
|
323
|
+
|
|
239
324
|
end
|
|
240
325
|
end
|
|
241
326
|
|
|
@@ -14,10 +14,11 @@ class Frankifier
|
|
|
14
14
|
@root = Pathname.new( root_dir )
|
|
15
15
|
@target_build_configuration = options[:build_config]
|
|
16
16
|
@target_selection = options[:target]
|
|
17
|
+
load_xcode_proj_option(options[:project])
|
|
17
18
|
end
|
|
18
19
|
|
|
19
20
|
def frankify!
|
|
20
|
-
decide_on_project
|
|
21
|
+
decide_on_project if @project.nil?
|
|
21
22
|
decide_on_target
|
|
22
23
|
report_project_and_target
|
|
23
24
|
|
|
@@ -33,6 +34,17 @@ class Frankifier
|
|
|
33
34
|
end
|
|
34
35
|
|
|
35
36
|
private
|
|
37
|
+
def load_xcode_proj_option(xcodeproj)
|
|
38
|
+
if xcodeproj
|
|
39
|
+
unless File.exists?(xcodeproj)
|
|
40
|
+
raise "Project file '#{xcodeproj}' does not exist. Please specify the relative path."
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
@xcodeproj_path = Pathname.new(xcodeproj)
|
|
44
|
+
@project = Xcodeproj::Project.new(@xcodeproj_path)
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
36
48
|
def decide_on_project
|
|
37
49
|
projects = Pathname.glob( @root+'*.xcodeproj' )
|
|
38
50
|
xcodeproj = case projects.size
|
|
@@ -63,6 +63,37 @@ module Frank
|
|
|
63
63
|
raise "Could not find anything matching [#{selector}] to double tap" if touch_successes.empty?
|
|
64
64
|
raise "Some views could not be double tap (probably because they are not within the current viewport)" if touch_successes.include?(false)
|
|
65
65
|
end
|
|
66
|
+
|
|
67
|
+
# Drag the slider thumb to required value, taking the specified time
|
|
68
|
+
#
|
|
69
|
+
# @param [String] selector A view selector
|
|
70
|
+
# @param [Number] value The value up to which the slider should be dragged
|
|
71
|
+
# @param [Number] duration The time interval that the drag should take
|
|
72
|
+
#
|
|
73
|
+
# @return [Array<Boolean>] an array indicating for each view which matched the selector if the value was acceptable or not
|
|
74
|
+
#
|
|
75
|
+
# @raise an expection if no views matched the selector
|
|
76
|
+
# @raise an expection if no views which matched the selector could have their thumbs dragged
|
|
77
|
+
def drag_thumb_in_slider( selector, value, duration )
|
|
78
|
+
touch_successes = frankly_map( selector, "FEX_dragThumbToValue:withDuration:", value, duration)
|
|
79
|
+
raise "Could not find anything matching [#{selector}] to have its thumb dragged" if touch_successes.empty?
|
|
80
|
+
raise "Some views could not had their thumbs dragged (are they even UISLiders?)" if touch_successes.include?(false)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# Drag the slider thumb to required value
|
|
84
|
+
#
|
|
85
|
+
# @param [String] selector A view selector
|
|
86
|
+
# @param [Number] value The value up to which the slider should be dragged
|
|
87
|
+
#
|
|
88
|
+
# @return [Array<Boolean>] an array indicating for each view which matched the selector if the value was acceptable or not
|
|
89
|
+
#
|
|
90
|
+
# @raise an expection if no views matched the selector
|
|
91
|
+
# @raise an expection if no views which matched the selector could have their thumbs dragged
|
|
92
|
+
def drag_thumb_in_slider_with_default_duration( selector, value )
|
|
93
|
+
touch_successes = frankly_map( selector, "FEX_dragThumbToValue:", value )
|
|
94
|
+
raise "Could not find anything matching [#{selector}] to have its thumb dragged" if touch_successes.empty?
|
|
95
|
+
raise "Some views could not had their thumbs dragged (are they even UISLiders?)" if touch_successes.include?(false)
|
|
96
|
+
end
|
|
66
97
|
end
|
|
67
98
|
end
|
|
68
99
|
end
|
metadata
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: frank-cucumber
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.1.
|
|
5
|
-
prerelease:
|
|
4
|
+
version: 1.1.10
|
|
5
|
+
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
8
8
|
- Pete Hodgson
|
|
@@ -10,7 +10,7 @@ authors:
|
|
|
10
10
|
autorequire:
|
|
11
11
|
bindir: bin
|
|
12
12
|
cert_chain: []
|
|
13
|
-
date: 2013-
|
|
13
|
+
date: 2013-04-22 00:00:00.000000000 Z
|
|
14
14
|
dependencies:
|
|
15
15
|
- !ruby/object:Gem::Dependency
|
|
16
16
|
name: cucumber
|
|
@@ -147,7 +147,7 @@ dependencies:
|
|
|
147
147
|
requirements:
|
|
148
148
|
- - ! '>='
|
|
149
149
|
- !ruby/object:Gem::Version
|
|
150
|
-
version:
|
|
150
|
+
version: 0.5.3
|
|
151
151
|
type: :runtime
|
|
152
152
|
prerelease: false
|
|
153
153
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -155,7 +155,7 @@ dependencies:
|
|
|
155
155
|
requirements:
|
|
156
156
|
- - ! '>='
|
|
157
157
|
- !ruby/object:Gem::Version
|
|
158
|
-
version:
|
|
158
|
+
version: 0.5.3
|
|
159
159
|
- !ruby/object:Gem::Dependency
|
|
160
160
|
name: rr
|
|
161
161
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -376,9 +376,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
376
376
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
377
377
|
none: false
|
|
378
378
|
requirements:
|
|
379
|
-
- - ! '
|
|
379
|
+
- - ! '>='
|
|
380
380
|
- !ruby/object:Gem::Version
|
|
381
|
-
version:
|
|
381
|
+
version: '0'
|
|
382
382
|
requirements: []
|
|
383
383
|
rubyforge_project:
|
|
384
384
|
rubygems_version: 1.8.24
|