frank-cucumber 1.1.4.pre1 → 1.1.5
Sign up to get free protection for your applications and to get access to all the features.
- data/frank-skeleton/frankify.xcconfig.tt +1 -0
- data/frank-skeleton/libCocoaHTTPServer.a +0 -0
- data/frank-skeleton/libCocoaHTTPServerMac.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 +38 -20
- data/lib/frank-cucumber/frank_helper.rb +2 -0
- data/lib/frank-cucumber/frankifier.rb +18 -7
- data/lib/frank-cucumber/gesture_helper.rb +68 -0
- data/lib/frank-cucumber/mac_launcher.rb +35 -0
- data/lib/frank-cucumber/version.rb +1 -1
- metadata +9 -5
@@ -1,4 +1,5 @@
|
|
1
1
|
INSTALL_PATH = /./
|
2
2
|
|
3
3
|
FRANK_LDFLAGS = -all_load -ObjC -framework CFNetwork -framework Security -lShelley <%= @without_http_server ? "" : "-lCocoaHTTPServer" %> -lFrank
|
4
|
+
FRANK_MAC_LDFLAGS = -all_load -ObjC -framework CFNetwork -framework Security -LFrank <%= @without_http_server ? "" : "-lCocoaHTTPServerMac" %> -lFrankMac
|
4
5
|
GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = FRANKIFIED
|
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
@@ -1,12 +1,13 @@
|
|
1
|
-
begin
|
1
|
+
begin
|
2
2
|
require 'pry'
|
3
|
-
rescue LoadError
|
3
|
+
rescue LoadError
|
4
4
|
end
|
5
5
|
|
6
6
|
require 'thor'
|
7
7
|
require 'frank-cucumber/launcher'
|
8
8
|
require 'frank-cucumber/console'
|
9
9
|
require 'frank-cucumber/frankifier'
|
10
|
+
require 'frank-cucumber/mac_launcher'
|
10
11
|
|
11
12
|
module Frank
|
12
13
|
class CLI < Thor
|
@@ -36,7 +37,7 @@ module Frank
|
|
36
37
|
desc "update", "updates the frank server components inside your Frank directory"
|
37
38
|
long_desc "This updates the parts of Frank that are embedded inside your app (e.g. libFrank.a and frank_static_resources.bundle)"
|
38
39
|
def update
|
39
|
-
%w{libFrank.a libShelley.a}.each do |f|
|
40
|
+
%w{libFrank.a libCocoaHTTPServer.a libShelley.a libFrankMac.a libCocoaHTTPServerMac.a}.each do |f|
|
40
41
|
copy_file f, File.join( 'Frank', f ), :force => true
|
41
42
|
end
|
42
43
|
directory( 'frank_static_resources.bundle', 'Frank/frank_static_resources.bundle', :force => true )
|
@@ -48,6 +49,7 @@ module Frank
|
|
48
49
|
method_option option
|
49
50
|
end
|
50
51
|
method_option 'arch', :type => :string, :default => 'i386'
|
52
|
+
method_option 'mac', :type => :boolean, :default => false
|
51
53
|
method_option :noclean, :type => :boolean, :default => false, :aliases => '--nc', :desc => "Don't clean the build directory before building"
|
52
54
|
def build
|
53
55
|
clean = !options['noclean']
|
@@ -75,22 +77,36 @@ module Frank
|
|
75
77
|
build_steps = 'clean ' + build_steps
|
76
78
|
end
|
77
79
|
|
78
|
-
extra_opts = XCODEBUILD_OPTIONS.map{ |o| "-#{o} #{options[o]}" if options[o] }.compact.join(' ')
|
79
|
-
extra_opts += " -arch #{options['arch']}"
|
80
|
+
extra_opts = XCODEBUILD_OPTIONS.map{ |o| "-#{o} \"#{options[o]}\"" if options[o] }.compact.join(' ')
|
80
81
|
|
81
|
-
|
82
|
+
if options['mac']
|
83
|
+
run %Q|xcodebuild -xcconfig Frank/frankify.xcconfig #{build_steps} #{extra_opts} -configuration Debug DEPLOYMENT_LOCATION=YES DSTROOT="#{build_output_dir}" FRANK_LIBRARY_SEARCH_PATHS="\\"#{frank_lib_directory}\\""|
|
84
|
+
else
|
85
|
+
extra_opts += " -arch #{options['arch']}"
|
86
|
+
|
87
|
+
run %Q|xcodebuild -xcconfig Frank/frankify.xcconfig #{build_steps} #{extra_opts} -configuration Debug -sdk iphonesimulator DEPLOYMENT_LOCATION=YES DSTROOT="#{build_output_dir}" FRANK_LIBRARY_SEARCH_PATHS="\\"#{frank_lib_directory}\\""|
|
88
|
+
end
|
82
89
|
|
83
90
|
app = Dir.glob("#{build_output_dir}/*.app").delete_if { |x| x =~ /\/#{app_bundle_name}$/ }
|
84
91
|
app = app.first
|
85
92
|
FileUtils.cp_r("#{app}/.", frankified_app_dir)
|
86
93
|
|
87
|
-
|
94
|
+
if options['mac']
|
95
|
+
in_root do
|
96
|
+
FileUtils.cp_r(
|
97
|
+
File.join( 'Frank',static_bundle),
|
98
|
+
File.join( frankified_app_dir, "Contents", "Resources", static_bundle )
|
99
|
+
)
|
100
|
+
end
|
101
|
+
else
|
102
|
+
fix_frankified_apps_bundle_identifier
|
88
103
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
104
|
+
in_root do
|
105
|
+
FileUtils.cp_r(
|
106
|
+
File.join( 'Frank',static_bundle),
|
107
|
+
File.join( frankified_app_dir, static_bundle )
|
108
|
+
)
|
109
|
+
end
|
94
110
|
end
|
95
111
|
end
|
96
112
|
|
@@ -102,7 +118,7 @@ module Frank
|
|
102
118
|
|
103
119
|
desc "launch", "open the Frankified app in the simulator"
|
104
120
|
method_option :debug, :type => :boolean, :default => false
|
105
|
-
method_option :idiom, :banner => 'iphone|ipad', :type => :string, :default => (ENV['FRANK_SIM_IDIOM'] || 'iphone')
|
121
|
+
method_option :idiom, :banner => 'iphone|ipad|mac', :type => :string, :default => (ENV['FRANK_SIM_IDIOM'] || 'iphone')
|
106
122
|
def launch
|
107
123
|
$DEBUG = options[:debug]
|
108
124
|
launcher = case options[:idiom].downcase
|
@@ -110,8 +126,10 @@ module Frank
|
|
110
126
|
SimLauncher::DirectClient.for_iphone_app( frankified_app_dir )
|
111
127
|
when 'ipad'
|
112
128
|
SimLauncher::DirectClient.for_ipad_app( frankified_app_dir )
|
129
|
+
when 'mac'
|
130
|
+
Frank::MacLauncher.new( frankified_app_dir )
|
113
131
|
else
|
114
|
-
say "idiom must be either iphone or
|
132
|
+
say "idiom must be either iphone, ipad, or mac. You supplied '#{options[:idiom]}'", :red
|
115
133
|
exit 10
|
116
134
|
end
|
117
135
|
|
@@ -138,15 +156,15 @@ module Frank
|
|
138
156
|
desc 'console', "launch a ruby console connected to your Frankified app"
|
139
157
|
def console
|
140
158
|
# TODO: check whether app is running (using ps or similar), and launch it if it's not
|
141
|
-
|
159
|
+
|
142
160
|
begin
|
143
161
|
require 'pry'
|
144
162
|
rescue LoadError
|
145
163
|
say 'The Frank console requires the pry gem.'
|
146
164
|
say 'Simply run `sudo gem install pry` (the `sudo` bit might be optional), and then try again. Thanks!'
|
147
|
-
exit 41
|
165
|
+
exit 41
|
148
166
|
end
|
149
|
-
|
167
|
+
|
150
168
|
Frank::Cucumber::FrankHelper.use_shelley_from_now_on
|
151
169
|
console = Frank::Console.new
|
152
170
|
if console.check_for_running_app
|
@@ -163,7 +181,7 @@ module Frank
|
|
163
181
|
def app_bundle_name
|
164
182
|
"#{product_name}.app"
|
165
183
|
end
|
166
|
-
|
184
|
+
|
167
185
|
def frank_lib_directory
|
168
186
|
File.expand_path "Frank"
|
169
187
|
end
|
@@ -178,9 +196,9 @@ module Frank
|
|
178
196
|
|
179
197
|
def fix_frankified_apps_bundle_identifier
|
180
198
|
# as of iOS 6 the iOS Simulator locks up with a black screen if you try and launch an app which has the same
|
181
|
-
# bundle identifier as a previously installed app but which is in fact a different app. This impacts us because our
|
199
|
+
# bundle identifier as a previously installed app but which is in fact a different app. This impacts us because our
|
182
200
|
# Frankified app is different but has the same bundle identifier as the standard non-Frankified app which most users
|
183
|
-
# will want to have installed in the simulator as well.
|
201
|
+
# will want to have installed in the simulator as well.
|
184
202
|
#
|
185
203
|
# We work around this by modifying the Frankified app's bundle identifier inside its Info.plist.
|
186
204
|
inside frankified_app_dir do
|
@@ -4,6 +4,7 @@ require 'frank-cucumber/host_scripting'
|
|
4
4
|
require 'frank-cucumber/wait_helper'
|
5
5
|
require 'frank-cucumber/keyboard_helper'
|
6
6
|
require 'frank-cucumber/scroll_helper'
|
7
|
+
require 'frank-cucumber/gesture_helper'
|
7
8
|
require 'frank-cucumber/location_helper'
|
8
9
|
require 'frank-cucumber/bonjour'
|
9
10
|
|
@@ -27,6 +28,7 @@ module FrankHelper
|
|
27
28
|
include WaitHelper
|
28
29
|
include KeyboardHelper
|
29
30
|
include ScrollHelper
|
31
|
+
include GestureHelper
|
30
32
|
include HostScripting
|
31
33
|
include LocationHelper
|
32
34
|
|
@@ -41,7 +41,7 @@ class Frankifier
|
|
41
41
|
projects.first
|
42
42
|
else
|
43
43
|
choice = ask_menu(
|
44
|
-
"I found more than one .xcodeproj. Which is the main app project that you wish to Frankify?",
|
44
|
+
"I found more than one .xcodeproj. Which is the main app project that you wish to Frankify?",
|
45
45
|
projects.map(&:basename)
|
46
46
|
)
|
47
47
|
projects[choice]
|
@@ -60,7 +60,7 @@ class Frankifier
|
|
60
60
|
targets.first
|
61
61
|
else
|
62
62
|
choice = ask_menu(
|
63
|
-
"I found more than one target in this project. Which is the main app target that you wish to Frankify?",
|
63
|
+
"I found more than one target in this project. Which is the main app target that you wish to Frankify?",
|
64
64
|
targets.map(&:name)
|
65
65
|
)
|
66
66
|
targets.to_a[choice]
|
@@ -71,8 +71,19 @@ class Frankifier
|
|
71
71
|
puts "Frankifying target [#{@target.name}] in project #{@xcodeproj_path.basename}"
|
72
72
|
end
|
73
73
|
|
74
|
+
def target_is_mac
|
75
|
+
settings = @target.build_configurations.first.build_settings['SDKROOT'] \
|
76
|
+
|| @project.build_configurations.first.build_settings['SDKROOT']
|
77
|
+
|
78
|
+
return settings.include? 'macosx'
|
79
|
+
end
|
80
|
+
|
74
81
|
def add_linker_flag
|
75
|
-
|
82
|
+
if target_is_mac
|
83
|
+
add_frank_entry_to_build_setting( 'OTHER_LDFLAGS', 'FRANK_MAC_LDFLAGS' )
|
84
|
+
else
|
85
|
+
add_frank_entry_to_build_setting( 'OTHER_LDFLAGS', 'FRANK_LDFLAGS' )
|
86
|
+
end
|
76
87
|
end
|
77
88
|
|
78
89
|
def add_library_search_path
|
@@ -97,16 +108,16 @@ class Frankifier
|
|
97
108
|
end
|
98
109
|
|
99
110
|
def check_target_build_configuration_is_valid!
|
100
|
-
unless @target.build_configuration_list.build_settings(@target_build_configuration)
|
111
|
+
unless @target.build_configuration_list.build_settings(@target_build_configuration)
|
101
112
|
say %Q|I'm trying to Frankify the '#{@target_build_configuration}' build configuration, but I don't see it that build configuration in your XCode target. Here's a list of the build configurations I see:|
|
102
|
-
@target.build_configuration_list.build_configurations.each do |bc|
|
113
|
+
@target.build_configuration_list.build_configurations.each do |bc|
|
103
114
|
say " '#{bc.name}'"
|
104
115
|
end
|
105
116
|
say ''
|
106
117
|
say %Q|Please specify one of those build configurations using the --build_configuration flag|
|
107
118
|
exit
|
108
119
|
end
|
109
|
-
|
120
|
+
|
110
121
|
end
|
111
122
|
|
112
123
|
def build_settings_to_edit
|
@@ -121,7 +132,7 @@ class Frankifier
|
|
121
132
|
def ask_menu message, options
|
122
133
|
option_lines = options.each_with_index.map{ |o,i| "#{i+1}: #{o}" }
|
123
134
|
full_message = ([message,'']+option_lines+[">"]).join("\n")
|
124
|
-
|
135
|
+
|
125
136
|
allowed_range = (1..options.length)
|
126
137
|
valid_choice = nil
|
127
138
|
until valid_choice
|
@@ -0,0 +1,68 @@
|
|
1
|
+
module Frank
|
2
|
+
module Cucumber
|
3
|
+
module GestureHelper
|
4
|
+
|
5
|
+
# Touch and hold the selector for a given duration
|
6
|
+
#
|
7
|
+
# @param [String] selector a view selector.
|
8
|
+
# @param [Number] duration the duration of the touch, the default is 1.
|
9
|
+
#
|
10
|
+
# @return [Array<Boolean>] an array indicating for each view which matched the selector whether it was touched or not.
|
11
|
+
#
|
12
|
+
# @raise an expection if no views matched the selector
|
13
|
+
# @raise an expection if no views which matched the selector could be touched
|
14
|
+
def tap_and_hold( selector, duration = 1 )
|
15
|
+
touch_successes = frankly_map( selector, "touchAndHold:", duration )
|
16
|
+
raise "Could not find anything matching [#{selector}] to long touch" if touch_successes.empty?
|
17
|
+
raise "Some views could not be long touched (probably because they are not within the current viewport)" if touch_successes.include?(false)
|
18
|
+
end
|
19
|
+
|
20
|
+
# Touch and hold the selector at a specific point for a given duration
|
21
|
+
#
|
22
|
+
# @param [String] selector a view selector.
|
23
|
+
# @param [Number] duration the duration of the touch, the default is 1.
|
24
|
+
# @param [Number] x the x-coordinate to touch
|
25
|
+
# @param [Number] y the y-coordinate to touch
|
26
|
+
#
|
27
|
+
# @return [Array<Boolean>] an array indicating for each view which matched the selector whether it was touched or not.
|
28
|
+
#
|
29
|
+
# @raise an expection if no views matched the selector
|
30
|
+
# @raise an expection if no views which matched the selector could be touched
|
31
|
+
def tap_and_hold_point( selector, x, y, duration = 1 )
|
32
|
+
touch_successes = frankly_map( selector, "touchAndHold:x:y:", duration, x, y )
|
33
|
+
raise "Could not find anything matching [#{selector}] to long touch" if touch_successes.empty?
|
34
|
+
raise "Some views could not be long touched (probably because they are not within the current viewport)" if touch_successes.include?(false)
|
35
|
+
end
|
36
|
+
|
37
|
+
# Double tap the selector
|
38
|
+
#
|
39
|
+
# @param [String] selector a view selector.
|
40
|
+
#
|
41
|
+
# @return [Array<Boolean>] an array indicating for each view which matched the selector whether it was touched or not.
|
42
|
+
#
|
43
|
+
# @raise an expection if no views matched the selector
|
44
|
+
# @raise an expection if no views which matched the selector could be touched
|
45
|
+
def double_tap( selector )
|
46
|
+
touch_successes = frankly_map( selector, "doubleTap" )
|
47
|
+
raise "Could not find anything matching [#{selector}] to double tap" if touch_successes.empty?
|
48
|
+
raise "Some views could not be double tap (probably because they are not within the current viewport)" if touch_successes.include?(false)
|
49
|
+
end
|
50
|
+
|
51
|
+
# Double tap the selector at a specific point
|
52
|
+
#
|
53
|
+
# @param [String] selector a view selector.
|
54
|
+
# @param [Number] x the x-coordinate to touch
|
55
|
+
# @param [Number] y the y-coordinate to touch
|
56
|
+
#
|
57
|
+
# @return [Array<Boolean>] an array indicating for each view which matched the selector whether it was touched or not.
|
58
|
+
#
|
59
|
+
# @raise an expection if no views matched the selector
|
60
|
+
# @raise an expection if no views which matched the selector could be touched
|
61
|
+
def double_tap_point( selector, x, y )
|
62
|
+
touch_successes = frankly_map( selector, "doubleTapx:y:", x, y )
|
63
|
+
raise "Could not find anything matching [#{selector}] to double tap" if touch_successes.empty?
|
64
|
+
raise "Some views could not be double tap (probably because they are not within the current viewport)" if touch_successes.include?(false)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require "timeout"
|
2
|
+
|
3
|
+
module Frank
|
4
|
+
class MacLauncher
|
5
|
+
|
6
|
+
def initialize(app_path)
|
7
|
+
@app_path = app_path
|
8
|
+
end
|
9
|
+
|
10
|
+
def launch
|
11
|
+
`open "#{@app_path}"`
|
12
|
+
end
|
13
|
+
|
14
|
+
def quit_if_running
|
15
|
+
pid = `ps -ax | grep "#{@app_path}" | grep -v grep`
|
16
|
+
|
17
|
+
if pid != ""
|
18
|
+
pid = pid.strip.split[0]
|
19
|
+
`kill #{pid}`
|
20
|
+
end
|
21
|
+
|
22
|
+
Timeout::timeout(60) {
|
23
|
+
while pid != ""
|
24
|
+
pid = `ps -ax | grep "#{@app_path}" | grep -v grep`
|
25
|
+
end
|
26
|
+
}
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
def relaunch
|
31
|
+
self.quit_if_running
|
32
|
+
self.launch
|
33
|
+
end
|
34
|
+
end
|
35
|
+
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.5
|
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:
|
13
|
+
date: 2013-01-16 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: cucumber
|
@@ -240,7 +240,9 @@ files:
|
|
240
240
|
- frank-skeleton/features/support/env.rb
|
241
241
|
- frank-skeleton/frankify.xcconfig.tt
|
242
242
|
- frank-skeleton/libCocoaHTTPServer.a
|
243
|
+
- frank-skeleton/libCocoaHTTPServerMac.a
|
243
244
|
- frank-skeleton/libFrank.a
|
245
|
+
- frank-skeleton/libFrankMac.a
|
244
246
|
- frank-skeleton/libShelley.a
|
245
247
|
- lib/frank-cucumber.rb
|
246
248
|
- lib/frank-cucumber/app_bundle_locator.rb
|
@@ -253,11 +255,13 @@ files:
|
|
253
255
|
- lib/frank-cucumber/frank_localize.rb
|
254
256
|
- lib/frank-cucumber/frankifier.rb
|
255
257
|
- lib/frank-cucumber/gateway.rb
|
258
|
+
- lib/frank-cucumber/gesture_helper.rb
|
256
259
|
- lib/frank-cucumber/host_scripting.rb
|
257
260
|
- lib/frank-cucumber/keyboard_helper.rb
|
258
261
|
- lib/frank-cucumber/launcher.rb
|
259
262
|
- lib/frank-cucumber/localize.yml
|
260
263
|
- lib/frank-cucumber/location_helper.rb
|
264
|
+
- lib/frank-cucumber/mac_launcher.rb
|
261
265
|
- lib/frank-cucumber/rect.rb
|
262
266
|
- lib/frank-cucumber/scroll_helper.rb
|
263
267
|
- lib/frank-cucumber/version.rb
|
@@ -365,9 +369,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
365
369
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
366
370
|
none: false
|
367
371
|
requirements:
|
368
|
-
- - ! '
|
372
|
+
- - ! '>='
|
369
373
|
- !ruby/object:Gem::Version
|
370
|
-
version:
|
374
|
+
version: '0'
|
371
375
|
requirements: []
|
372
376
|
rubyforge_project:
|
373
377
|
rubygems_version: 1.8.24
|