briar 0.0.4
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.
- 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
|
+
|