briar 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/.gitignore +29 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +36 -0
- data/README.md +25 -0
- data/Rakefile +12 -0
- data/briar.gemspec +26 -0
- data/dotirbc_briar_additions +31 -0
- data/features/step_definitions/alerts_and_sheets/action_sheet_steps.rb +8 -0
- data/features/step_definitions/alerts_and_sheets/alert_view_steps.rb +25 -0
- data/features/step_definitions/bars/navbar_steps.rb +95 -0
- data/features/step_definitions/bars/tabbar_steps.rb +32 -0
- data/features/step_definitions/bars/toolbar_steps.rb +17 -0
- data/features/step_definitions/briar_core_steps.rb +9 -0
- data/features/step_definitions/control/button_steps.rb +57 -0
- data/features/step_definitions/control/segmented_control_steps.rb +85 -0
- data/features/step_definitions/control/slider_steps.rb +9 -0
- data/features/step_definitions/email_steps.rb +59 -0
- data/features/step_definitions/image_view_steps.rb +9 -0
- data/features/step_definitions/keyboard_steps.rb +21 -0
- data/features/step_definitions/label_steps.rb +21 -0
- data/features/step_definitions/picker/date_picker_steps.rb +216 -0
- data/features/step_definitions/picker/picker_steps.rb +58 -0
- data/features/step_definitions/scroll_view_steps.rb +20 -0
- data/features/step_definitions/table_steps.rb +186 -0
- data/features/step_definitions/text_field_steps.rb +37 -0
- data/features/step_definitions/text_view_steps.rb +44 -0
- data/features/support/env.rb +0 -0
- data/features/support/hooks.rb +0 -0
- data/features/support/launch.rb +0 -0
- data/lib/briar.rb +72 -0
- data/lib/briar/alerts_and_sheets/alert_view.rb +16 -0
- data/lib/briar/bars/navbar.rb +104 -0
- data/lib/briar/bars/tabbar.rb +38 -0
- data/lib/briar/bars/toolbar.rb +36 -0
- data/lib/briar/briar_core.rb +56 -0
- data/lib/briar/briar_steps.rb +26 -0
- data/lib/briar/control/button.rb +47 -0
- data/lib/briar/control/segmented_control.rb +22 -0
- data/lib/briar/control/slider.rb +34 -0
- data/lib/briar/cucumber.rb +49 -0
- data/lib/briar/email.rb +58 -0
- data/lib/briar/gestalt.rb +80 -0
- data/lib/briar/image_view.rb +27 -0
- data/lib/briar/keyboard.rb +104 -0
- data/lib/briar/label.rb +34 -0
- data/lib/briar/picker/date_picker.rb +598 -0
- data/lib/briar/picker/picker.rb +32 -0
- data/lib/briar/picker/picker_shared.rb +34 -0
- data/lib/briar/scroll_view.rb +10 -0
- data/lib/briar/table.rb +237 -0
- data/lib/briar/text_field.rb +57 -0
- data/lib/briar/text_view.rb +21 -0
- data/lib/briar/version.rb +3 -0
- data/spec/briar/gestalt_spec.rb +62 -0
- data/spec/spec_helper.rb +17 -0
- metadata +164 -0
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'calabash-cucumber'
|
2
|
+
|
3
|
+
module Briar
|
4
|
+
module Bars
|
5
|
+
def tabbar_visible?
|
6
|
+
element_exists("tabBar")
|
7
|
+
end
|
8
|
+
|
9
|
+
def should_see_tabbar
|
10
|
+
unless tabbar_visible?
|
11
|
+
screenshot_and_raise "i do not see the tabbar"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def index_of_tabbar_item(name)
|
16
|
+
if tabbar_visible?
|
17
|
+
tabs = query('tabBarButton', :accessibilityLabel)
|
18
|
+
tabs.index(name)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def touch_tabbar_item(name)
|
23
|
+
idx = index_of_tabbar_item name
|
24
|
+
if idx
|
25
|
+
touch "tabBarButton index:#{idx}"
|
26
|
+
step_pause
|
27
|
+
else
|
28
|
+
screenshot_and_raise "tabbar button with name #{name} does not exist"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def tabbar_item_is_at_index(name, index)
|
33
|
+
tabs = query('tabBarButton', :accessibilityLabel)
|
34
|
+
tabs.index(name) == index.to_i
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'calabash-cucumber'
|
2
|
+
|
3
|
+
module Briar
|
4
|
+
module Bars
|
5
|
+
def toolbar_exists? (id)
|
6
|
+
!query("toolbar marked:'#{id}'").empty?
|
7
|
+
end
|
8
|
+
|
9
|
+
def should_see_toolbar (id)
|
10
|
+
screenshot_and_raise "expected to see toolbar with id '#{id}'" unless toolbar_exists? id
|
11
|
+
end
|
12
|
+
|
13
|
+
def should_not_see_toolbar (id)
|
14
|
+
screenshot_and_raise "did not expect to see toolbar with id '#{id}'" if toolbar_exists? id
|
15
|
+
end
|
16
|
+
|
17
|
+
def toolbar_button_exists? (name_or_id)
|
18
|
+
query("toolbar descendant view marked:#{name_or_id}")
|
19
|
+
## look for text button
|
20
|
+
#text_button_arr = query("toolbar child toolbarTextButton child button child buttonLabel", :text)
|
21
|
+
#has_text_button = text_button_arr.index(name_or_id) != nil
|
22
|
+
## look for non_text button
|
23
|
+
#toolbar_button_arr = query("toolbar child toolbarButton", :accessibilityLabel)
|
24
|
+
#has_toolbar_button = toolbar_button_arr.index(name_or_id) != nil
|
25
|
+
#
|
26
|
+
#has_text_button or has_toolbar_button
|
27
|
+
end
|
28
|
+
|
29
|
+
def should_see_toolbar_button (name_or_id)
|
30
|
+
res = toolbar_button_exists? name_or_id
|
31
|
+
unless res
|
32
|
+
screenshot_and_raise "could not see toolbar button with name '#{name_or_id}'"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'calabash-cucumber'
|
2
|
+
|
3
|
+
module Briar
|
4
|
+
module Core
|
5
|
+
STEP_PAUSE = (ENV['STEP_PAUSE'] || 0.4).to_f
|
6
|
+
ANIMATION_PAUSE = (ENV['ANIMATION_PAUSE'] || 0.6).to_f
|
7
|
+
|
8
|
+
def step_pause
|
9
|
+
sleep(STEP_PAUSE)
|
10
|
+
end
|
11
|
+
|
12
|
+
def wait_for_animation
|
13
|
+
sleep(ANIMATION_PAUSE)
|
14
|
+
end
|
15
|
+
|
16
|
+
|
17
|
+
def view_exists? (view_id)
|
18
|
+
!query("view marked:'#{view_id}'").empty?
|
19
|
+
end
|
20
|
+
|
21
|
+
def should_see_view (view_id)
|
22
|
+
unless view_exists? view_id
|
23
|
+
screenshot_and_raise "no view found with id #{view_id}"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def view_exists_with_text? (text)
|
28
|
+
element_exists("view text:'#{text}'")
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
def should_see_view_after_animation (view_id)
|
33
|
+
wait_for_animation
|
34
|
+
should_see_view view_id
|
35
|
+
end
|
36
|
+
|
37
|
+
def should_not_see_view_after_animation (view_id)
|
38
|
+
wait_for_animation
|
39
|
+
if view_exists? view_id
|
40
|
+
screenshot_and_raise "did not expect to see view '#{view_id}'"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def should_see_view_with_text (text)
|
45
|
+
res = view_exists_with_text? text
|
46
|
+
unless res
|
47
|
+
screenshot_and_raise "No view found with text #{text}"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def touch_view_named(view_id)
|
52
|
+
touch("view marked:'#{view_id}'")
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions', "briar_core_steps")
|
2
|
+
|
3
|
+
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',"alerts_and_sheets", "action_sheet_steps")
|
4
|
+
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',"alerts_and_sheets", "alert_view_steps")
|
5
|
+
|
6
|
+
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',"bars", "tabbar_steps")
|
7
|
+
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',"bars", "navbar_steps")
|
8
|
+
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',"bars", "toolbar_steps")
|
9
|
+
|
10
|
+
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',"control", "button_steps")
|
11
|
+
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',"control", "segmented_control_steps")
|
12
|
+
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',"control", "slider_steps")
|
13
|
+
|
14
|
+
|
15
|
+
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',"picker", "picker_steps")
|
16
|
+
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',"picker", "date_picker_steps")
|
17
|
+
|
18
|
+
|
19
|
+
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',"email_steps")
|
20
|
+
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',"image_view_steps")
|
21
|
+
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',"keyboard_steps")
|
22
|
+
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',"label_steps")
|
23
|
+
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',"scroll_view_steps")
|
24
|
+
|
25
|
+
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',"table_steps")
|
26
|
+
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',"text_field_steps")
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'calabash-cucumber'
|
2
|
+
|
3
|
+
module Briar
|
4
|
+
module Control
|
5
|
+
module Button
|
6
|
+
include Briar::Core
|
7
|
+
def button_exists? (name)
|
8
|
+
res = query("button marked:'#{name}'", :alpha)
|
9
|
+
if res.empty?
|
10
|
+
false
|
11
|
+
else
|
12
|
+
res.first.to_i != 0
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def should_see_button (name)
|
17
|
+
unless button_exists? name
|
18
|
+
screenshot_and_raise "i did not see a button with marked #{name}"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def should_not_see_button (button_id)
|
23
|
+
screenshot_and_raise "i should not see button marked '#{button_id}'" if button_exists?(button_id)
|
24
|
+
end
|
25
|
+
|
26
|
+
def button_is_enabled (name)
|
27
|
+
enabled = query("button marked:'#{name}' isEnabled:1", :accessibilityIdentifier).first
|
28
|
+
enabled.eql? name
|
29
|
+
end
|
30
|
+
|
31
|
+
def should_see_button_with_title(name, title)
|
32
|
+
should_see_button name
|
33
|
+
if query("button marked:'#{title}' child label", :text).empty?
|
34
|
+
screenshot_and_raise "i do not see a button marked #{name} with title #{title}"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def touch_button (name)
|
39
|
+
should_see_button name
|
40
|
+
touch("button marked:'#{name}'")
|
41
|
+
step_pause
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require "calabash-cucumber"
|
2
|
+
|
3
|
+
module Briar
|
4
|
+
module Control
|
5
|
+
module Segmented_Control
|
6
|
+
def index_of_control_with_name (control_name)
|
7
|
+
controls = query("segmentedControl", :accessibilityIdentifier)
|
8
|
+
controls.index(control_name)
|
9
|
+
end
|
10
|
+
|
11
|
+
def index_of_segment_with_name_in_control_with_name(segment_name, control_name)
|
12
|
+
control_idx = index_of_control_with_name (control_name)
|
13
|
+
if control_idx
|
14
|
+
titles = query("segmentedControl index:#{control_idx} child segment child segmentLabel", :text).reverse
|
15
|
+
titles.index(segment_name)
|
16
|
+
else
|
17
|
+
nil
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'calabash-cucumber'
|
2
|
+
|
3
|
+
module Briar
|
4
|
+
module Control
|
5
|
+
module Slider
|
6
|
+
def change_slider_value_to(slider_id, value)
|
7
|
+
target = value.to_f
|
8
|
+
if target < 0
|
9
|
+
pending "value '#{value}' must be >= 0"
|
10
|
+
end
|
11
|
+
min_val = query("slider marked:'#{slider_id}'", :minimumValue).first
|
12
|
+
# will not work for min_val != 0
|
13
|
+
if min_val != 0
|
14
|
+
pending "sliders with non-zero minimum values are not supported - slider '#{slider_id}' has minimum value of '#{min_val}'"
|
15
|
+
end
|
16
|
+
max_val = query("slider marked:'#{slider_id}'", :maximumValue).first
|
17
|
+
if target > max_val
|
18
|
+
screenshot_and_raise "cannot change slider '#{slider_id}' to '#{value}' because the maximum allowed value is '#{max_val}'"
|
19
|
+
end
|
20
|
+
# the x offset is from the middle of the slider.
|
21
|
+
# ex. slider from 0 to 5
|
22
|
+
# to touch 3, x must be 0
|
23
|
+
# to touch 0, x must be -2.5
|
24
|
+
# to touch 5, x must be 2.5
|
25
|
+
half_val = (max_val/2)
|
26
|
+
width = query("slider marked:'#{slider_id}'", :frame).first["Width"]
|
27
|
+
x = ((width/2) * ((target - half_val)/half_val)).ceil
|
28
|
+
touch("slider marked:'#{slider_id}'", {:offset => {:x => x, :y => 0}})
|
29
|
+
#current = query("slider marked:'#{slider_id}'", :value).first
|
30
|
+
#puts "current => at '#{current}' with x => '#{x}'"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'briar/gestalt'
|
2
|
+
require 'briar/briar_core'
|
3
|
+
|
4
|
+
require 'briar/alerts_and_sheets/alert_view'
|
5
|
+
|
6
|
+
require 'briar/bars/tabbar'
|
7
|
+
require 'briar/bars/navbar'
|
8
|
+
require 'briar/bars/toolbar'
|
9
|
+
|
10
|
+
require 'briar/control/button'
|
11
|
+
require 'briar/control/segmented_control'
|
12
|
+
require 'briar/control/slider'
|
13
|
+
|
14
|
+
require 'briar/picker/picker_shared'
|
15
|
+
require 'briar/picker/picker'
|
16
|
+
require 'briar/picker/date_picker'
|
17
|
+
|
18
|
+
require 'briar/email'
|
19
|
+
require 'briar/image_view'
|
20
|
+
require 'briar/keyboard'
|
21
|
+
require 'briar/label'
|
22
|
+
require 'briar/scroll_view'
|
23
|
+
|
24
|
+
require 'briar/table'
|
25
|
+
require 'briar/text_field'
|
26
|
+
require 'briar/text_view'
|
27
|
+
|
28
|
+
World(Briar)
|
29
|
+
World(Briar::Core)
|
30
|
+
World(Briar::Alerts_and_Sheets)
|
31
|
+
World(Briar::Bars)
|
32
|
+
World(Briar::Control::Button)
|
33
|
+
World(Briar::Control::Segmented_Control)
|
34
|
+
World(Briar::Control::Slider)
|
35
|
+
World(Briar::Picker::Date)
|
36
|
+
World(Briar::Picker_Shared)
|
37
|
+
World(Briar::Picker)
|
38
|
+
World(Briar::Email)
|
39
|
+
World(Briar::ImageView)
|
40
|
+
World(Briar::Keyboard)
|
41
|
+
World(Briar::Label)
|
42
|
+
World(Briar::ScrollView)
|
43
|
+
World(Briar::Table)
|
44
|
+
World(Briar::TextField)
|
45
|
+
World(Briar::TextView)
|
46
|
+
|
47
|
+
AfterConfiguration do
|
48
|
+
require 'briar/briar_steps'
|
49
|
+
end
|
data/lib/briar/email.rb
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'calabash-cucumber'
|
2
|
+
|
3
|
+
module Briar
|
4
|
+
module Email
|
5
|
+
def email_body_first_line_is? (text)
|
6
|
+
if gestalt.is_ios6?
|
7
|
+
puts "WARN: cannot test for email body text on iOS 6 - see https://groups.google.com/d/topic/calabash-ios/Ff3XFsjp-B0/discussion"
|
8
|
+
else
|
9
|
+
actual_tokens = query("view:'MFComposeTextContentView'", :text).first.split("\n")
|
10
|
+
actual_tokens.include?(text)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def email_subject_is? (text)
|
15
|
+
if gestalt.is_ios6?
|
16
|
+
puts "WARN: cannot test for email subject text on iOS 6 - see https://groups.google.com/d/topic/calabash-ios/Ff3XFsjp-B0/discussion"
|
17
|
+
else
|
18
|
+
actual = query("view marked:'subjectField'", :text)
|
19
|
+
actual.length == 1 && actual.first.eql?(text)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def email_subject_has_text_like? (text)
|
24
|
+
if gestalt.is_ios6?
|
25
|
+
puts "WARN: cannot test for email subject text on iOS 6 - see https://groups.google.com/d/topic/calabash-ios/Ff3XFsjp-B0/discussion"
|
26
|
+
else
|
27
|
+
!query("view marked:'subjectField' {text LIKE '*#{text}*'}").empty?
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def email_to_field_is? (text)
|
32
|
+
if gestalt.is_ios6?
|
33
|
+
puts "WARN: iOS6 detected - cannot test for email 'to' field on iOS simulator or devices"
|
34
|
+
else
|
35
|
+
actual = query("view marked:'toField'", :text)
|
36
|
+
actual.length == 1 && actual.first.eql?(text)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def is_ios5_mail_view ()
|
41
|
+
query("view:'MFMailComposeRecipientView'").count == 3
|
42
|
+
#access_ids = query("view", :accessibilityIdentifier)
|
43
|
+
#access_ids.member?("toField") || access_ids.member?("subjectField")
|
44
|
+
end
|
45
|
+
|
46
|
+
def is_ios6_mail_view()
|
47
|
+
access_ids = query("view", :accessibilityIdentifier)
|
48
|
+
access_ids.member?("RemoteViewBridge")
|
49
|
+
end
|
50
|
+
|
51
|
+
def should_see_mail_view
|
52
|
+
wait_for_animation
|
53
|
+
unless is_ios5_mail_view || is_ios6_mail_view
|
54
|
+
screenshot_and_raise "expected to see email view"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module Briar
|
4
|
+
GESTALT_IPHONE = "iPhone"
|
5
|
+
GESTALT_IPAD = "iPad"
|
6
|
+
GESTALT_IPHONE5 = "Retina 4-inch"
|
7
|
+
GESTALT_SIM_SYS = "x86_64"
|
8
|
+
|
9
|
+
class Gestalt
|
10
|
+
|
11
|
+
attr_accessor :device_family
|
12
|
+
attr_accessor :simulator_details, :ios_version
|
13
|
+
attr_accessor :system
|
14
|
+
|
15
|
+
def initialize (json)
|
16
|
+
ht = JSON.parse json
|
17
|
+
simulator_device = ht["simulator_device"]
|
18
|
+
@system = ht["system"]
|
19
|
+
@device_family = @system.eql?(GESTALT_SIM_SYS) ? simulator_device : @system.split(/[\d,.]/).first
|
20
|
+
@simulator_details = ht["simulator"]
|
21
|
+
@ios_version = ht["iOS_version"]
|
22
|
+
end
|
23
|
+
|
24
|
+
def is_simulator?
|
25
|
+
self.system.eql?(GESTALT_SIM_SYS)
|
26
|
+
end
|
27
|
+
|
28
|
+
def is_device?
|
29
|
+
not self.is_simulator?
|
30
|
+
end
|
31
|
+
|
32
|
+
def is_iphone?
|
33
|
+
self.device_family.eql? GESTALT_IPHONE
|
34
|
+
end
|
35
|
+
|
36
|
+
def is_ipad?
|
37
|
+
self.device_family.eql? GESTALT_IPAD
|
38
|
+
end
|
39
|
+
|
40
|
+
def is_iphone_5?
|
41
|
+
return self.simulator_details.split(/[(),]/)[3].eql? GESTALT_IPHONE5 if self.is_simulator?
|
42
|
+
return self.system.split(/[\D]/).delete_if { |x| x.eql?("") }.first.eql?("5") if self.is_device?
|
43
|
+
end
|
44
|
+
|
45
|
+
def version_hash (version_str)
|
46
|
+
tokens = version_str.split(/[,.]/)
|
47
|
+
{:major_version => tokens[0],
|
48
|
+
:minor_version => tokens[1],
|
49
|
+
:bug_version => tokens[2]}
|
50
|
+
end
|
51
|
+
|
52
|
+
def ios_major_version
|
53
|
+
self.version_hash(self.ios_version)[:major_version]
|
54
|
+
end
|
55
|
+
|
56
|
+
def is_ios6?
|
57
|
+
self.version_hash(self.ios_version)[:major_version].eql?("6")
|
58
|
+
end
|
59
|
+
|
60
|
+
def is_ios5?
|
61
|
+
self.version_hash(self.ios_version)[:major_version].eql?("5")
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
#{"outcome":"SUCCESS","app_name":"Rise Up CAL","iOS_version":"5.1.1","app_version":"1.0","system":"iPad1,1","app_id":"org.recoverywarrriors.RiseUp-cal","version":"0.9.125"}=> true
|
68
|
+
|
69
|
+
# "iPhone Simulator 358.4, iPhone OS 6.0 (iPhone (Retina 4-inch)\/10A403)".split(/[(),]/)
|
70
|
+
# => ["iPhone Simulator 358.4", " iPhone OS 6.0 ", "iPhone ", "Retina 4-inch", "/10A403"]
|
71
|
+
|
72
|
+
# system ("curl --insecure #{url}")
|
73
|
+
# {"outcome":"SUCCESS","app_name":"Rise Up CAL","simulator_device":"iPhone","iOS_version":"6.0",
|
74
|
+
#"app_version":"1.0","system":"x86_64","app_id":"org.recoverywarrriors.RiseUp-cal",
|
75
|
+
#"version":"0.9.126","simulator":"iPhone Simulator 358.4, iPhone OS 6.0 (iPhone (Retina 4-inch)\/10A403)"}=> true
|
76
|
+
|
77
|
+
#{"outcome":"SUCCESS","app_name":"Rise Up CAL","iOS_version":"6.0.1","app_version":"1.0",
|
78
|
+
#"system":"iPhone4,1","app_id":"org.recoverywarrriors.RiseUp-cal","version":"0.9.125"}
|
79
|
+
|
80
|
+
|