bubble-wrap 1.2.0 → 1.3.0.osx

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.
Files changed (79) hide show
  1. checksums.yaml +8 -8
  2. data/CHANGELOG.md +4 -2
  3. data/Gemfile.lock +1 -1
  4. data/README.md +217 -7
  5. data/Rakefile +23 -2
  6. data/lib/bubble-wrap/camera.rb +10 -6
  7. data/lib/bubble-wrap/core.rb +14 -1
  8. data/lib/bubble-wrap/ext/motion_project_app.rb +8 -0
  9. data/lib/bubble-wrap/font.rb +3 -1
  10. data/lib/bubble-wrap/http.rb +2 -0
  11. data/lib/bubble-wrap/loader.rb +17 -2
  12. data/lib/bubble-wrap/location.rb +9 -6
  13. data/lib/bubble-wrap/media.rb +10 -6
  14. data/lib/bubble-wrap/test.rb +6 -1
  15. data/lib/bubble-wrap/ui.rb +5 -2
  16. data/lib/bubble-wrap/version.rb +2 -7
  17. data/motion/core.rb +6 -1
  18. data/motion/core/app.rb +3 -64
  19. data/motion/core/device.rb +0 -55
  20. data/motion/core/device/{camera.rb → ios/camera.rb} +0 -0
  21. data/motion/core/device/{camera_wrapper.rb → ios/camera_wrapper.rb} +0 -0
  22. data/motion/core/device/ios/screen.rb +75 -0
  23. data/motion/core/device/osx/screen.rb +18 -0
  24. data/motion/core/device/screen.rb +1 -69
  25. data/motion/core/ios/app.rb +71 -0
  26. data/motion/core/ios/device.rb +59 -0
  27. data/motion/core/osx/app.rb +15 -0
  28. data/motion/core/osx/device.rb +6 -0
  29. data/motion/core/string.rb +3 -2
  30. data/motion/http.rb +0 -364
  31. data/motion/http/query.rb +367 -0
  32. data/motion/http/response.rb +32 -0
  33. data/motion/test_suite_delegate.rb +58 -0
  34. data/motion/ui/ui_alert_view.rb +169 -0
  35. data/motion/ui/ui_bar_button_item.rb +55 -53
  36. data/motion/util/constants.rb +34 -32
  37. data/samples/alert/.gitignore +16 -0
  38. data/samples/alert/Gemfile +3 -0
  39. data/samples/alert/Rakefile +10 -0
  40. data/samples/alert/app/app_delegate.rb +8 -0
  41. data/samples/alert/app/controllers/alert_view_controller.rb +74 -0
  42. data/samples/alert/resources/Default-568h@2x.png +0 -0
  43. data/samples/alert/spec/main_spec.rb +9 -0
  44. data/samples/media/.gitignore +16 -0
  45. data/samples/media/Rakefile +11 -0
  46. data/samples/media/app/app_delegate.rb +8 -0
  47. data/samples/media/app/controllers/play_controller.rb +46 -0
  48. data/samples/media/resources/Default-568h@2x.png +0 -0
  49. data/samples/media/resources/test.mp3 +0 -0
  50. data/samples/media/spec/main_spec.rb +9 -0
  51. data/samples/osx/Gemfile +3 -0
  52. data/samples/osx/Gemfile.lock +10 -0
  53. data/samples/osx/Rakefile +11 -0
  54. data/samples/osx/app/app_delegate.rb +69 -0
  55. data/samples/osx/app/menu.rb +108 -0
  56. data/samples/osx/resources/Credits.rtf +29 -0
  57. data/samples/osx/spec/main_spec.rb +9 -0
  58. data/spec/motion/core/app_spec.rb +5 -164
  59. data/spec/motion/core/device/{camera_spec.rb → ios/camera_spec.rb} +0 -0
  60. data/spec/motion/core/device/{camera_wrapper_spec.rb → ios/camera_wrapper_spec.rb} +0 -0
  61. data/spec/motion/core/device/ios/device_spec.rb +74 -0
  62. data/spec/motion/core/device/{screen_spec.rb → ios/screen_spec.rb} +2 -1
  63. data/spec/motion/core/device/osx/screen_spec.rb +26 -0
  64. data/spec/motion/core/device_spec.rb +0 -71
  65. data/spec/motion/core/ios/app_spec.rb +180 -0
  66. data/spec/motion/core/kvo_spec.rb +23 -7
  67. data/spec/motion/core/ns_index_path_spec.rb +10 -2
  68. data/spec/motion/core/osx/app_spec.rb +15 -0
  69. data/spec/motion/core/string_spec.rb +11 -5
  70. data/spec/motion/core_spec.rb +13 -2
  71. data/spec/motion/http/query_spec.rb +731 -0
  72. data/spec/motion/http/response_spec.rb +44 -0
  73. data/spec/motion/http_spec.rb +0 -722
  74. data/spec/motion/{core → ui}/gestures_spec.rb +0 -0
  75. data/spec/motion/ui/ui_alert_view_spec.rb +1188 -0
  76. data/spec/motion/{core → ui}/ui_bar_button_item_spec.rb +80 -24
  77. data/spec/motion/{core → ui}/ui_control_spec.rb +0 -0
  78. data/spec/motion/util/constants_spec.rb +4 -4
  79. metadata +86 -26
@@ -0,0 +1,169 @@
1
+ module BW
2
+ class UIAlertView < ::UIAlertView
3
+ @callbacks = [
4
+ :will_present,
5
+ :did_present,
6
+ :on_system_cancel,
7
+ :enable_first_other_button?,
8
+ :on_click,
9
+ :will_dismiss,
10
+ :did_dismiss
11
+ ]
12
+
13
+ class << self
14
+ attr_reader :callbacks
15
+
16
+ def new(options = {}, &block)
17
+ view = alloc.initWithTitle(options[:title],
18
+ message: options[:message],
19
+ delegate: nil,
20
+ cancelButtonTitle: nil,
21
+ otherButtonTitles: nil
22
+ )
23
+
24
+ Array(options[:buttons]).each { |title| view.addButtonWithTitle(title) }
25
+
26
+ view.style = options[:style]
27
+ view.delegate = view
28
+ view.cancel_button_index = options[:cancel_button_index]
29
+
30
+ view.instance_variable_set(:@handlers, {})
31
+ options[:on_click] ||= block
32
+
33
+ callbacks.each do |callback|
34
+ view.send(callback, &options[callback]) if options[callback]
35
+ end
36
+
37
+ view
38
+ end
39
+
40
+ def default(options = {}, &block)
41
+ options = { buttons: "OK" }.merge!(options)
42
+ new(options.merge!(style: :default), &block)
43
+ end
44
+
45
+ def plain_text_input(options = {}, &block)
46
+ options = { buttons: ["Cancel", "OK"], cancel_button_index: 0 }.merge!(options)
47
+ new(options.merge!(style: :plain_text_input), &block)
48
+ end
49
+
50
+ def secure_text_input(options = {}, &block)
51
+ options = { buttons: ["Cancel", "OK"], cancel_button_index: 0 }.merge!(options)
52
+ new(options.merge!(style: :secure_text_input), &block)
53
+ end
54
+
55
+ def login_and_password_input(options = {}, &block)
56
+ options = { buttons: ["Cancel", "Log in"], cancel_button_index: 0 }.merge!(options)
57
+ new(options.merge!(style: :login_and_password_input), &block)
58
+ end
59
+ end
60
+
61
+ def style
62
+ alertViewStyle
63
+ end
64
+
65
+ def style=(value)
66
+ self.alertViewStyle = Constants.get("UIAlertViewStyle", value) if value
67
+ end
68
+
69
+ def cancel_button_index
70
+ cancelButtonIndex
71
+ end
72
+
73
+ def cancel_button_index=(value)
74
+ self.cancelButtonIndex = value if value
75
+ end
76
+
77
+ ###############################################################################################
78
+
79
+ attr_accessor :clicked_button
80
+ protected :clicked_button=
81
+
82
+ class ClickedButton
83
+ def initialize(alert, index)
84
+ @index = index
85
+ @title = alert.buttonTitleAtIndex(index)
86
+ @cancel = alert.cancelButtonIndex == index
87
+ end
88
+
89
+ attr_reader :index, :title
90
+ def cancel?; @cancel end
91
+ end
92
+
93
+ ###############################################################################################
94
+
95
+ attr_reader :handlers
96
+ protected :handlers
97
+
98
+ callbacks.each do |callback|
99
+ define_method(callback) do |&block|
100
+ return handlers[callback] unless block
101
+
102
+ handlers[callback] = block if block
103
+ self
104
+ end
105
+ end
106
+
107
+ # UIAlertViewDelegate protocol ################################################################
108
+
109
+ def willPresentAlertView(alert)
110
+ alert.clicked_button = nil
111
+ handlers[:will_present].call(alert) if handlers[:will_present]
112
+ end
113
+
114
+ def didPresentAlertView(alert)
115
+ alert.clicked_button = nil
116
+ handlers[:did_present].call(alert) if handlers[:did_present]
117
+ end
118
+
119
+ def alertViewCancel(alert)
120
+ alert.clicked_button = nil
121
+ handlers[:on_system_cancel].call(alert) if handlers[:on_system_cancel]
122
+ end
123
+
124
+ def alertViewShouldEnableFirstOtherButton(alert)
125
+ alert.clicked_button = nil
126
+ handlers[:enable_first_other_button?].call(alert) if handlers[:enable_first_other_button?]
127
+ end
128
+
129
+ def alertView(alert, clickedButtonAtIndex:index)
130
+ alert.clicked_button = ClickedButton.new(alert, index)
131
+ handlers[:on_click].call(alert) if handlers[:on_click]
132
+ end
133
+
134
+ def alertView(alert, willDismissWithButtonIndex:index)
135
+ alert.clicked_button = ClickedButton.new(alert, index)
136
+ handlers[:will_dismiss].call(alert) if handlers[:will_dismiss]
137
+ end
138
+
139
+ def alertView(alert, didDismissWithButtonIndex:index)
140
+ alert.clicked_button = ClickedButton.new(alert, index)
141
+ handlers[:did_dismiss].call(alert) if handlers[:did_dismiss]
142
+ end
143
+
144
+ ###############################################################################################
145
+
146
+ def plain_text_field
147
+ textFieldAtIndex(0) if style == UIAlertViewStylePlainTextInput
148
+ end
149
+
150
+ def secure_text_field
151
+ textFieldAtIndex(0) if style == UIAlertViewStyleSecureTextInput
152
+ end
153
+
154
+ def login_text_field
155
+ textFieldAtIndex(0) if style == UIAlertViewStyleLoginAndPasswordInput
156
+ end
157
+
158
+ def password_text_field
159
+ textFieldAtIndex(1) if style == UIAlertViewStyleLoginAndPasswordInput
160
+ end
161
+ end
162
+
163
+ Constants.register(
164
+ UIAlertViewStyleDefault,
165
+ UIAlertViewStylePlainTextInput,
166
+ UIAlertViewStyleSecureTextInput,
167
+ UIAlertViewStyleLoginAndPasswordInput
168
+ )
169
+ end
@@ -1,68 +1,70 @@
1
1
  module BW
2
- module UIBarButtonItem
3
- module_function
2
+ class UIBarButtonItem < ::UIBarButtonItem
3
+ class << self
4
+ def styled(type, *objects, &block)
5
+ action = block ? :call : nil
6
+ object = objects.size == 1 ? objects.first : objects
7
+ style = Constants.get("UIBarButtonItemStyle", type)
4
8
 
5
- def styled(type, *objects, &block)
6
- action = block ? :call : nil
7
- object = objects.size == 1 ? objects.first : objects
8
- style = Constants.get("UIBarButtonItemStyle", type)
9
+ item = if object.is_a?(String)
10
+ alloc.initWithTitle(object,
11
+ style:style,
12
+ target:block,
13
+ action:action
14
+ )
15
+ elsif object.is_a?(UIImage)
16
+ alloc.initWithImage(object,
17
+ style:style,
18
+ target:block,
19
+ action:action
20
+ )
21
+ elsif object.is_a?(Array) && object.size == 2 && object.all? { |o| o.is_a?(UIImage) }
22
+ alloc.initWithImage(object[0],
23
+ landscapeImagePhone:object[1],
24
+ style:style,
25
+ target:block,
26
+ action:action
27
+ )
28
+ else
29
+ raise ArgumentError, "invalid object - #{object.inspect}"
30
+ end
9
31
 
10
- item = if object.is_a?(String)
11
- ::UIBarButtonItem.alloc.initWithTitle(object,
12
- style:style,
13
- target:block,
14
- action:action
15
- )
16
- elsif object.is_a?(UIImage)
17
- ::UIBarButtonItem.alloc.initWithImage(object,
18
- style:style,
19
- target:block,
20
- action:action
21
- )
22
- elsif object.is_a?(Array) && object.size == 2 && object.all? { |o| o.is_a?(UIImage) }
23
- ::UIBarButtonItem.alloc.initWithImage(object[0],
24
- landscapeImagePhone:object[1],
25
- style:style,
26
- target:block,
27
- action:action
28
- )
29
- else
30
- raise ArgumentError, "invalid object - #{object.inspect}"
32
+ item.instance_variable_set(:@target, block)
33
+ item
31
34
  end
32
35
 
33
- item.instance_variable_set(:@target, block)
34
- item
35
- end
36
+ def system(type, &block)
37
+ action = block ? :call : nil
38
+ system_item = Constants.get("UIBarButtonSystemItem", type)
36
39
 
37
- def system(type, &block)
38
- action = block ? :call : nil
39
- system_item = Constants.get("UIBarButtonSystemItem", type)
40
+ item = alloc.initWithBarButtonSystemItem(system_item, target:block, action:action)
41
+ item.instance_variable_set(:@target, block)
42
+ item
43
+ end
40
44
 
41
- item = ::UIBarButtonItem.alloc.initWithBarButtonSystemItem(system_item,
42
- target:block,
43
- action:action
44
- )
45
- item.instance_variable_set(:@target, block)
46
- item
47
- end
45
+ def custom(view, &block)
46
+ view.when_tapped(true, &block) if block
47
+ alloc.initWithCustomView(view)
48
+ end
48
49
 
49
- def custom(view, &block)
50
- view.when_tapped(true, &block) if block
51
- ::UIBarButtonItem.alloc.initWithCustomView(view)
52
- end
50
+ def new(options = {}, &block)
51
+ if options[:styled]
52
+ args = options.values_at(:title, :image, :landscape).compact
53
+ return styled(options[:styled], *args, &block)
54
+ end
53
55
 
54
- def build(options = {}, &block)
55
- if options[:styled]
56
- args = options.values_at(:title, :image, :landscape).compact
57
- return styled(options[:styled], *args, &block)
58
- end
56
+ return system(options[:system], &block) if options[:system]
59
57
 
60
- return system(options[:system], &block) if options[:system]
58
+ return custom(options[:custom], &block) if options[:custom]
59
+ return custom(options[:view], &block) if options[:view]
61
60
 
62
- return custom(options[:custom], &block) if options[:custom]
63
- return custom(options[:view], &block) if options[:view]
61
+ raise ArgumentError, "invalid options - #{options.inspect}"
62
+ end
64
63
 
65
- raise ArgumentError, "invalid options - #{options.inspect}"
64
+ def build(options = {}, &block)
65
+ NSLog "[DEPRECATED - BW::UIBarButtonItem.build] please use .new instead."
66
+ new(options, &block)
67
+ end
66
68
  end
67
69
  end
68
70
 
@@ -1,38 +1,40 @@
1
1
  # Stupid hack because the RubyMotion dependency detection has a bug.
2
- module Kernel.const_get("BubbleWrap")::Constants
3
- module_function
2
+ module BubbleWrap
3
+ module Constants
4
+ module_function
4
5
 
5
- # Looks like RubyMotiononly adds UIKit constants
6
- # at compile time. If you don't use these
7
- # directly in your code, they don't get added
8
- # to Kernel and Constants.get crashes.
9
- # Examples
10
- # Constants.register UIReturnKeyDone, UIReturnKeyNext
11
- def register(*ui_constants)
12
- # do nothing, just get the constants in the code
13
- end
6
+ # Looks like RubyMotiononly adds UIKit constants
7
+ # at compile time. If you don't use these
8
+ # directly in your code, they don't get added
9
+ # to Kernel and Constants.get crashes.
10
+ # Examples
11
+ # Constants.register UIReturnKeyDone, UIReturnKeyNext
12
+ def register(*ui_constants)
13
+ # do nothing, just get the constants in the code
14
+ end
14
15
 
15
- # @param [String] base of the constant
16
- # @param [Integer, NSArray, String, Symbol] the suffix of the constant
17
- # when NSArray, will return the bitmask of all suffixes in the array
18
- # @return [Integer] the constant for this base and suffix
19
- # Examples
20
- # get("UIReturnKey", :done) => UIReturnKeyDone == 9
21
- # get("UIReturnKey", "done") => UIReturnKeyDone == 9
22
- # get("UIReturnKey", 9) => 9
23
- # get("UIImagePickerControllerSourceType", ["photo_library", "camera", "saved_photos_album"]) => 3
24
- def get(base, *values)
25
- value = values.size == 1 ? values.first : values.flatten
26
- case value
27
- when Numeric
28
- value.to_i
29
- when NSArray
30
- value.reduce { |i, j|
31
- get(base, i) | get(base, j)
32
- }
33
- else
34
- value = value.to_s.camelize
35
- Kernel.const_get("#{base}#{value}")
16
+ # @param [String] base of the constant
17
+ # @param [Integer, NSArray, String, Symbol] the suffix of the constant
18
+ # when NSArray, will return the bitmask of all suffixes in the array
19
+ # @return [Integer] the constant for this base and suffix
20
+ # Examples
21
+ # get("UIReturnKey", :done) => UIReturnKeyDone == 9
22
+ # get("UIReturnKey", "done") => UIReturnKeyDone == 9
23
+ # get("UIReturnKey", 9) => 9
24
+ # get("UIImagePickerControllerSourceType", ["photo_library", "camera", "saved_photos_album"]) => 3
25
+ def get(base, *values)
26
+ value = values.size == 1 ? values.first : values.flatten
27
+ case value
28
+ when Numeric
29
+ value.to_i
30
+ when NSArray
31
+ value.reduce { |i, j|
32
+ get(base, i) | get(base, j)
33
+ }
34
+ else
35
+ value = value.to_s.camelize
36
+ Kernel.const_get("#{base}#{value}")
37
+ end
36
38
  end
37
39
  end
38
40
  end
@@ -0,0 +1,16 @@
1
+ .repl_history
2
+ build
3
+ tags
4
+ app/pixate_code.rb
5
+ resources/*.nib
6
+ resources/*.momd
7
+ resources/*.storyboardc
8
+ .DS_Store
9
+ nbproject
10
+ .redcar
11
+ #*#
12
+ *~
13
+ *.sw[po]
14
+ .eprj
15
+ .sass-cache
16
+ .idea
@@ -0,0 +1,3 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem "bubble-wrap", :path => "../../"
@@ -0,0 +1,10 @@
1
+ # -*- coding: utf-8 -*-
2
+ $:.unshift("/Library/RubyMotion/lib")
3
+ require 'motion/project'
4
+ require 'bundler'
5
+ Bundler.require
6
+
7
+ Motion::Project::App.setup do |app|
8
+ # Use `rake config' to see complete project settings.
9
+ app.name = 'alert'
10
+ end
@@ -0,0 +1,8 @@
1
+ class AppDelegate
2
+ def application(application, didFinishLaunchingWithOptions:launchOptions)
3
+ @window = UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds)
4
+ @window.rootViewController = AlertViewController.alloc.init
5
+ @window.makeKeyAndVisible
6
+ true
7
+ end
8
+ end
@@ -0,0 +1,74 @@
1
+ class AlertViewController < UIViewController
2
+ attr_reader :text_view
3
+ attr_reader :buttons
4
+ attr_reader :alerts
5
+
6
+ def init
7
+ super.tap do
8
+ @text_view = build_text_view
9
+
10
+ @buttons = []
11
+ @alerts = []
12
+
13
+ [:default, :plain_text_input, :secure_text_input, :login_and_password_input].each do |style|
14
+ @buttons << build_button(style.to_s)
15
+ @alerts << built_alert(style)
16
+ end
17
+ end
18
+ end
19
+
20
+ def viewDidLoad
21
+ super
22
+
23
+ self.view.backgroundColor = UIColor.grayColor
24
+
25
+ self.view.addSubview(self.text_view)
26
+
27
+ self.buttons.each_with_index do |button, index|
28
+ self.view.addSubview(button)
29
+
30
+ button.when(UIControlEventTouchUpInside) { self.alerts[index].show }
31
+ end
32
+ end
33
+
34
+ def build_text_view
35
+ text_view = UITextView.alloc.initWithFrame([[0, 0], [320, 194]])
36
+ text_view.editable = false
37
+ text_view.text = "Waiting..."
38
+ text_view
39
+ end
40
+
41
+ def build_button(title)
42
+ button = UIButton.buttonWithType(UIButtonTypeRoundedRect)
43
+ button.setTitle(title, forState:UIControlStateNormal)
44
+
45
+ rect = self.buttons.empty? ? CGRectMake(20, 150, 280, 44) : self.buttons.last.frame
46
+ button.frame = [[rect.origin.x, rect.origin.y + rect.size.height + 20], rect.size]
47
+
48
+ button
49
+ end
50
+
51
+ def built_alert(method)
52
+ options = {
53
+ :title => method,
54
+ :will_present => build_callback(:will_present, method),
55
+ :did_present => build_callback(:did_present, method),
56
+ :on_click => build_callback(:on_click, method),
57
+ :will_dismiss => build_callback(:will_dismiss, method),
58
+ :did_dismiss => build_callback(:did_dismiss, method)
59
+ }
60
+ BW::UIAlertView.send(method, options)
61
+ end
62
+
63
+ def build_callback(name, method)
64
+ lambda do |alert|
65
+ message = []
66
+ message << "\n\n" + method.to_s if name == :will_present
67
+ message << "\n" + name.to_s
68
+ message << "\n" + alert.clicked_button.inspect if alert.clicked_button
69
+
70
+ self.text_view.text += message.join
71
+ self.text_view.selectedRange = NSMakeRange(self.text_view.text.length, 0)
72
+ end
73
+ end
74
+ end