ProMotion 2.0.1 → 2.1.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +7 -1
- data/lib/ProMotion.rb +20 -0
- data/lib/ProMotion/cocoatouch/navigation_controller.rb +2 -4
- data/lib/ProMotion/logger/logger.rb +9 -4
- data/lib/ProMotion/screen/nav_bar_module.rb +1 -0
- data/lib/ProMotion/screen/screen_module.rb +7 -2
- data/lib/ProMotion/styling/styling.rb +5 -3
- data/lib/ProMotion/table/cell/table_view_cell_module.rb +5 -3
- data/lib/ProMotion/table/data/table_data.rb +2 -1
- data/lib/ProMotion/table/table.rb +26 -15
- data/lib/ProMotion/table/table_utils.rb +6 -1
- data/lib/ProMotion/tabs/tabs.rb +17 -9
- data/lib/ProMotion/version.rb +1 -1
- data/lib/ProMotion/web/web_screen_module.rb +3 -1
- data/spec/functional/func_screen_spec.rb +13 -12
- data/spec/functional/func_split_screen_spec.rb +1 -0
- data/spec/functional/func_table_screen_spec.rb +15 -9
- data/spec/functional/func_table_screen_updating_spec.rb +52 -0
- data/spec/functional/func_web_screen_spec.rb +4 -1
- data/spec/helpers/test_helper.rb +12 -1
- data/spec/unit/screen_helpers_spec.rb +8 -7
- data/spec/unit/screen_spec.rb +1 -1
- data/spec/unit/split_screen_open_screen_spec.rb +3 -3
- data/spec/unit/tab_bar_spec.rb +7 -0
- data/spec/unit/tab_spec.rb +1 -1
- data/spec/unit/tables/table_module_spec.rb +28 -11
- data/spec/unit/tables/table_screen_spec.rb +0 -14
- data/spec/unit/tables/table_utils_spec.rb +34 -0
- data/spec/unit/tables/table_view_cell_spec.rb +2 -2
- metadata +13 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 069e30500b3574a7ff83d4a179af392513ffac2b
|
4
|
+
data.tar.gz: e7a65eb50f555d29c2b406deaf3f4bb0c9e88aa1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 24902da29b4aef04a2620dd41a527052c39a3d9e5bcba5f556d3048cf83a7558b58c8b72ed28ae54f04c92dfb8b6bee847ce842b85c5f2ac6f574ddb70bb3dab
|
7
|
+
data.tar.gz: 007f7044aa819c3ce5e1a9b4e16048886984bc65aaf8d8fd16757a43a481ef52753919a9e6d9eaa62ef54cbb217ab73865ed71c601167de11a744d2a8ef20e7c
|
data/README.md
CHANGED
@@ -1,4 +1,10 @@
|
|
1
|
-
# ProMotion
|
1
|
+
# ProMotion
|
2
|
+
|
3
|
+
[![Gem Version](https://badge.fury.io/rb/ProMotion.png)](http://badge.fury.io/rb/ProMotion)
|
4
|
+
[![Build Status](https://travis-ci.org/clearsightstudio/ProMotion.png)](https://travis-ci.org/clearsightstudio/ProMotion)
|
5
|
+
[![Code Climate](https://codeclimate.com/github/clearsightstudio/ProMotion.png)](https://codeclimate.com/github/clearsightstudio/ProMotion)
|
6
|
+
[![Dependency Status](https://gemnasium.com/clearsightstudio/ProMotion.png)](https://gemnasium.com/clearsightstudio/ProMotion)
|
7
|
+
[![omniref](https://www.omniref.com/ruby/gems/ProMotion.png)](https://www.omniref.com/ruby/gems/ProMotion)
|
2
8
|
|
3
9
|
## iPhone Apps, Ruby-style
|
4
10
|
|
data/lib/ProMotion.rb
CHANGED
@@ -9,4 +9,24 @@ Motion::Project::App.setup do |app|
|
|
9
9
|
Dir.glob(File.join(core_lib, '**/*.rb')).reverse.each do |file|
|
10
10
|
app.files.insert(insert_point, file)
|
11
11
|
end
|
12
|
+
|
13
|
+
# For compatibility with libraries that don't use detect_dependencies. :-(
|
14
|
+
app.files_dependencies({
|
15
|
+
"#{core_lib}/cocoatouch/table_view_cell.rb" => [ "#{core_lib}/table/cell/table_view_cell_module.rb" ],
|
16
|
+
"#{core_lib}/table/cell/table_view_cell_module.rb" => [ "#{core_lib}/styling/styling.rb" ],
|
17
|
+
"#{core_lib}/delegate/delegate.rb" => [ "#{core_lib}/delegate/delegate_parent.rb" ],
|
18
|
+
"#{core_lib}/delegate/delegate_parent.rb" => [ "#{core_lib}/delegate/delegate_module.rb" ],
|
19
|
+
"#{core_lib}/delegate/delegate_module.rb" => [ "#{core_lib}/tabs/tabs.rb", "#{core_lib}/ipad/split_screen.rb" ],
|
20
|
+
"#{core_lib}/screen/screen.rb" => [ "#{core_lib}/screen/screen_module.rb" ],
|
21
|
+
"#{core_lib}/screen/screen_module.rb" => [ "#{core_lib}/screen/screen_navigation.rb" ],
|
22
|
+
"#{core_lib}/table/data/table_data.rb" => [ "#{core_lib}/table/table.rb" ],
|
23
|
+
"#{core_lib}/table/table.rb" => [
|
24
|
+
"#{core_lib}/table/table_utils.rb",
|
25
|
+
"#{core_lib}/table/extensions/searchable.rb",
|
26
|
+
"#{core_lib}/table/extensions/refreshable.rb",
|
27
|
+
"#{core_lib}/table/extensions/indexable.rb",
|
28
|
+
"#{core_lib}/table/extensions/longpressable.rb"
|
29
|
+
],
|
30
|
+
"#{core_lib}/web/web_screen.rb" => [ "#{core_lib}/web/web_screen_module.rb" ],
|
31
|
+
})
|
12
32
|
end
|
@@ -2,10 +2,8 @@ module ProMotion
|
|
2
2
|
class NavigationController < UINavigationController
|
3
3
|
|
4
4
|
def popViewControllerAnimated(animated)
|
5
|
-
|
6
|
-
|
7
|
-
end
|
8
|
-
super animated
|
5
|
+
super
|
6
|
+
self.viewControllers.last.send(:on_back) if self.viewControllers.last.respond_to?(:on_back)
|
9
7
|
end
|
10
8
|
|
11
9
|
def shouldAutorotate
|
@@ -19,12 +19,17 @@ module ProMotion
|
|
19
19
|
error: [:error],
|
20
20
|
warn: [:error, :warn],
|
21
21
|
info: [:error, :warn, :info],
|
22
|
+
debug: [:error, :warn, :info, :debug],
|
22
23
|
verbose: [:error, :warn, :info, :debug, :verbose],
|
23
|
-
debug: [:error, :warn, :info, :debug, :verbose]
|
24
24
|
}
|
25
25
|
|
26
26
|
def level
|
27
|
-
@level ||= :debug
|
27
|
+
@level ||= (RUBYMOTION_ENV == "release" ? :error : :debug)
|
28
|
+
end
|
29
|
+
|
30
|
+
def level=(new_level)
|
31
|
+
log('LOG LEVEL', 'Setting PM.logger to :verbose will make everything REALLY SLOW!', :purple) if new_level == :verbose
|
32
|
+
@level = new_level
|
28
33
|
end
|
29
34
|
|
30
35
|
def levels
|
@@ -33,9 +38,9 @@ module ProMotion
|
|
33
38
|
|
34
39
|
# Usage: PM.logger.log("ERROR", "message here", :red)
|
35
40
|
def log(label, message_text, color)
|
36
|
-
return if defined?(RUBYMOTION_ENV) && RUBYMOTION_ENV == "test"
|
41
|
+
# return if defined?(RUBYMOTION_ENV) && RUBYMOTION_ENV == "test"
|
37
42
|
color = COLORS[color] || COLORS[:default]
|
38
|
-
puts color[0] + NAME + "[#{label}] #{message_text}" + color[1]
|
43
|
+
$stderr.puts color[0] + NAME + "[#{label}] #{message_text}" + color[1]
|
39
44
|
nil
|
40
45
|
end
|
41
46
|
|
@@ -11,9 +11,9 @@ module ProMotion
|
|
11
11
|
def screen_init(args = {})
|
12
12
|
check_ancestry
|
13
13
|
resolve_title
|
14
|
-
|
15
|
-
set_attributes self, args
|
14
|
+
apply_properties(args)
|
16
15
|
add_nav_bar(args) if args[:nav_bar]
|
16
|
+
tab_bar_setup
|
17
17
|
try :screen_setup
|
18
18
|
try :on_init
|
19
19
|
PM.logger.deprecated "In #{self.class.to_s}, #on_create has been deprecated and removed. Use #screen_init instead." if respond_to?(:on_create)
|
@@ -146,6 +146,11 @@ module ProMotion
|
|
146
146
|
|
147
147
|
private
|
148
148
|
|
149
|
+
def apply_properties(args)
|
150
|
+
reserved_args = [ :nav_bar, :hide_nav_bar, :hide_tab_bar, :animated, :close_all, :in_tab, :in_detail, :in_master, :to_screen ]
|
151
|
+
set_attributes self, args.dup.delete_if { |k,v| reserved_args.include?(k) }
|
152
|
+
end
|
153
|
+
|
149
154
|
def tab_bar_setup
|
150
155
|
self.tab_bar_item = self.class.send(:get_tab_bar_item)
|
151
156
|
self.refresh_tab_bar_item if self.tab_bar_item
|
@@ -18,9 +18,11 @@ module ProMotion
|
|
18
18
|
element.send("#{k}=", v)
|
19
19
|
elsif v.is_a?(Array) && element.respond_to?("#{k}") && element.method("#{k}").arity == v.length
|
20
20
|
element.send("#{k}", *v)
|
21
|
-
|
22
|
-
|
23
|
-
|
21
|
+
elsif k.to_s.include?("_") # Snake case?
|
22
|
+
set_attribute(element, camelize(k), v)
|
23
|
+
else # Warn
|
24
|
+
PM.logger.debug "set_attribute: #{element.inspect} does not respond to #{k}=."
|
25
|
+
PM.logger.log("BACKTRACE", caller(0).join("\n"), :default) if PM.logger.level == :verbose
|
24
26
|
end
|
25
27
|
element
|
26
28
|
end
|
@@ -23,14 +23,15 @@ module ProMotion
|
|
23
23
|
|
24
24
|
# TODO: Remove this in ProMotion 2.1. Just for migration purposes.
|
25
25
|
def check_deprecated_styles
|
26
|
-
whitelist = [ :title, :subtitle, :image, :remote_image, :accessory, :selection_style, :action, :long_press_action, :arguments, :cell_style, :cell_class, :cell_identifier, :editing_style, :search_text, :keep_selection, :height, :accessory_type, :style ]
|
26
|
+
whitelist = [ :title, :subtitle, :image, :remote_image, :accessory, :selection_style, :action, :long_press_action, :arguments, :cell_style, :cell_class, :cell_identifier, :editing_style, :search_text, :keep_selection, :height, :accessory_type, :style, :properties ]
|
27
27
|
if (data_cell.keys - whitelist).length > 0
|
28
|
-
PM.logger.deprecated("In #{self.table_screen.class.to_s}#table_data, you should set :#{(data_cell.keys - whitelist).join(", :")} in a `
|
28
|
+
PM.logger.deprecated("In #{self.table_screen.class.to_s}#table_data, you should set :#{(data_cell.keys - whitelist).join(", :")} in a `properties:` hash. See TableScreen documentation.")
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
32
|
def set_styles
|
33
|
-
|
33
|
+
data_cell[:properties] ||= data_cell[:style] || data_cell[:styles]
|
34
|
+
set_attributes self, data_cell[:properties] if data_cell[:properties]
|
34
35
|
end
|
35
36
|
|
36
37
|
def set_title
|
@@ -88,6 +89,7 @@ module ProMotion
|
|
88
89
|
private
|
89
90
|
|
90
91
|
def jm_image_cache?
|
92
|
+
return false if RUBYMOTION_ENV == 'test'
|
91
93
|
return true if self.imageView.respond_to?("setImageWithURL:placeholder:")
|
92
94
|
PM.logger.error "ProMotion Warning: to use remote_image with TableScreen you need to include the CocoaPod 'JMImageCache'."
|
93
95
|
false
|
@@ -24,7 +24,7 @@ module ProMotion
|
|
24
24
|
|
25
25
|
def cell(params={})
|
26
26
|
params = index_path_to_section_index(params)
|
27
|
-
table_section = self.section(params[:section])
|
27
|
+
table_section = params[:unfiltered] ? self.data[params[:section]] : self.section(params[:section])
|
28
28
|
c = table_section[:cells].at(params[:index].to_i)
|
29
29
|
set_data_cell_defaults c
|
30
30
|
end
|
@@ -67,6 +67,7 @@ module ProMotion
|
|
67
67
|
end
|
68
68
|
data_cell[:cell_class] ||= PM::TableViewCell
|
69
69
|
data_cell[:cell_identifier] ||= build_cell_identifier(data_cell)
|
70
|
+
data_cell[:properties] ||= data_cell[:style] || data_cell[:styles]
|
70
71
|
|
71
72
|
data_cell[:accessory] = {
|
72
73
|
view: data_cell[:accessory],
|
@@ -62,9 +62,17 @@ module ProMotion
|
|
62
62
|
self.promotion_table_data.search_string
|
63
63
|
end
|
64
64
|
|
65
|
-
def update_table_view_data(data)
|
65
|
+
def update_table_view_data(data, args = {})
|
66
66
|
self.promotion_table_data.data = data
|
67
|
-
|
67
|
+
if args[:index_paths]
|
68
|
+
args[:animation] ||= UITableViewRowAnimationNone
|
69
|
+
|
70
|
+
table_view.beginUpdates
|
71
|
+
table_view.reloadRowsAtIndexPaths(Array(args[:index_paths]), withRowAnimation: args[:animation])
|
72
|
+
table_view.endUpdates
|
73
|
+
else
|
74
|
+
table_view.reloadData
|
75
|
+
end
|
68
76
|
@table_search_display_controller.searchResultsTableView.reloadData if searching?
|
69
77
|
end
|
70
78
|
|
@@ -100,7 +108,7 @@ module ProMotion
|
|
100
108
|
deletable_index_paths << index_path
|
101
109
|
end
|
102
110
|
end
|
103
|
-
table_view.deleteRowsAtIndexPaths(deletable_index_paths, withRowAnimation:map_row_animation_symbol(animation)) if deletable_index_paths.length > 0
|
111
|
+
table_view.deleteRowsAtIndexPaths(deletable_index_paths, withRowAnimation: map_row_animation_symbol(animation)) if deletable_index_paths.length > 0
|
104
112
|
end
|
105
113
|
|
106
114
|
def table_view_cell(params={})
|
@@ -122,8 +130,11 @@ module ProMotion
|
|
122
130
|
table_cell
|
123
131
|
end
|
124
132
|
|
125
|
-
def update_table_data
|
126
|
-
|
133
|
+
def update_table_data(args = {})
|
134
|
+
# Try and detect if the args param is a NSIndexPath or an array of them
|
135
|
+
args = { index_paths: args } if args.is_a?(NSIndexPath) || (args.is_a?(Array) && array_all_members_of?(args, NSIndexPath))
|
136
|
+
|
137
|
+
self.update_table_view_data(self.table_data, args)
|
127
138
|
self.promotion_table_data.search(search_string) if searching?
|
128
139
|
end
|
129
140
|
|
@@ -133,11 +144,11 @@ module ProMotion
|
|
133
144
|
end
|
134
145
|
|
135
146
|
# Number of cells
|
136
|
-
def tableView(table_view, numberOfRowsInSection:section)
|
147
|
+
def tableView(table_view, numberOfRowsInSection: section)
|
137
148
|
self.promotion_table_data.section_length(section)
|
138
149
|
end
|
139
150
|
|
140
|
-
def tableView(table_view, titleForHeaderInSection:section)
|
151
|
+
def tableView(table_view, titleForHeaderInSection: section)
|
141
152
|
section = promotion_table_data.section(section)
|
142
153
|
section && section[:title]
|
143
154
|
end
|
@@ -149,29 +160,29 @@ module ProMotion
|
|
149
160
|
nil
|
150
161
|
end
|
151
162
|
|
152
|
-
def tableView(table_view, cellForRowAtIndexPath:index_path)
|
163
|
+
def tableView(table_view, cellForRowAtIndexPath: index_path)
|
153
164
|
table_view_cell(index_path: index_path)
|
154
165
|
end
|
155
166
|
|
156
167
|
def tableView(table_view, willDisplayCell: table_cell, forRowAtIndexPath: index_path)
|
157
168
|
data_cell = self.promotion_table_data.cell(index_path: index_path)
|
158
|
-
set_attributes table_cell, data_cell[:
|
169
|
+
set_attributes table_cell, data_cell[:properties] if data_cell[:properties]
|
159
170
|
table_cell.send(:will_display) if table_cell.respond_to?(:will_display)
|
160
171
|
table_cell.send(:restyle!) if table_cell.respond_to?(:restyle!) # Teacup compatibility
|
161
172
|
end
|
162
173
|
|
163
|
-
def tableView(table_view, heightForRowAtIndexPath:index_path)
|
174
|
+
def tableView(table_view, heightForRowAtIndexPath: index_path)
|
164
175
|
(self.promotion_table_data.cell(index_path: index_path)[:height] || table_view.rowHeight).to_f
|
165
176
|
end
|
166
177
|
|
167
|
-
def tableView(table_view, didSelectRowAtIndexPath:index_path)
|
178
|
+
def tableView(table_view, didSelectRowAtIndexPath: index_path)
|
168
179
|
data_cell = self.promotion_table_data.cell(index_path: index_path)
|
169
180
|
table_view.deselectRowAtIndexPath(index_path, animated: true) unless data_cell[:keep_selection] == true
|
170
181
|
trigger_action(data_cell[:action], data_cell[:arguments], index_path) if data_cell[:action]
|
171
182
|
end
|
172
183
|
|
173
184
|
def tableView(table_view, editingStyleForRowAtIndexPath: index_path)
|
174
|
-
data_cell = self.promotion_table_data.cell(index_path: index_path)
|
185
|
+
data_cell = self.promotion_table_data.cell(index_path: index_path, unfiltered: true)
|
175
186
|
map_cell_editing_style(data_cell[:editing_style])
|
176
187
|
end
|
177
188
|
|
@@ -181,18 +192,18 @@ module ProMotion
|
|
181
192
|
end
|
182
193
|
end
|
183
194
|
|
184
|
-
def tableView(tableView, sectionForSectionIndexTitle:title, atIndex:index)
|
195
|
+
def tableView(tableView, sectionForSectionIndexTitle: title, atIndex: index)
|
185
196
|
return index unless ["{search}", UITableViewIndexSearch].include?(self.table_data_index[0])
|
186
197
|
|
187
198
|
if index == 0
|
188
|
-
tableView.scrollRectToVisible(CGRectMake(0.0, 0.0, 1.0, 1.0), animated:false)
|
199
|
+
tableView.scrollRectToVisible(CGRectMake(0.0, 0.0, 1.0, 1.0), animated: false)
|
189
200
|
NSNotFound
|
190
201
|
else
|
191
202
|
index - 1
|
192
203
|
end
|
193
204
|
end
|
194
205
|
|
195
|
-
def deleteRowsAtIndexPaths(index_paths, withRowAnimation:animation)
|
206
|
+
def deleteRowsAtIndexPaths(index_paths, withRowAnimation: animation)
|
196
207
|
PM.logger.warn "ProMotion expects you to use 'delete_cell(index_paths, animation)'' instead of 'deleteRowsAtIndexPaths(index_paths, withRowAnimation:animation)'."
|
197
208
|
delete_row(index_paths, animation)
|
198
209
|
end
|
@@ -2,12 +2,17 @@ module ProMotion
|
|
2
2
|
module Table
|
3
3
|
module Utils
|
4
4
|
def index_path_to_section_index(params)
|
5
|
-
if params[:index_path]
|
5
|
+
if params.is_a?(Hash) && params[:index_path]
|
6
6
|
params[:section] = params[:index_path].section
|
7
7
|
params[:index] = params[:index_path].row
|
8
8
|
end
|
9
9
|
params
|
10
10
|
end
|
11
|
+
|
12
|
+
# Determines if all members of an array are a certain class
|
13
|
+
def array_all_members_of?(arr, klass)
|
14
|
+
arr.select{ |e| e.is_a?(klass) }.length == arr.length
|
15
|
+
end
|
11
16
|
end
|
12
17
|
end
|
13
18
|
end
|
data/lib/ProMotion/tabs/tabs.rb
CHANGED
@@ -38,13 +38,13 @@ module ProMotion
|
|
38
38
|
item_image = nil
|
39
39
|
end
|
40
40
|
|
41
|
-
item = UITabBarItem.alloc.initWithTitle(title, image:item_image, tag:tag)
|
41
|
+
item = UITabBarItem.alloc.initWithTitle(title, image: item_image, tag: tag)
|
42
42
|
|
43
43
|
if item_selected || item_unselected
|
44
44
|
item.setFinishedSelectedImage(item_selected, withFinishedUnselectedImage: item_unselected)
|
45
45
|
end
|
46
46
|
|
47
|
-
|
47
|
+
item
|
48
48
|
end
|
49
49
|
|
50
50
|
def create_tab_bar_item(tab={})
|
@@ -55,17 +55,24 @@ module ProMotion
|
|
55
55
|
tab[:item] ||= tab[:icon]
|
56
56
|
end
|
57
57
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
58
|
+
unless tab[:system_item] || tab[:item]
|
59
|
+
PM.logger.warn("You must provide either a `system_item:` or custom `item:` in `tab_bar_item`")
|
60
|
+
abort
|
61
|
+
end
|
62
|
+
|
63
|
+
title = tab[:title] || "Untitled"
|
62
64
|
|
63
|
-
tab_bar_item = UITabBarItem.alloc.initWithTabBarSystemItem(map_tab_symbol(tab[:system_item]), tag:
|
64
|
-
tab_bar_item = create_tab_bar_item_custom(title, tab[:item],
|
65
|
+
tab_bar_item = UITabBarItem.alloc.initWithTabBarSystemItem(map_tab_symbol(tab[:system_item]), tag: current_tag) if tab[:system_item]
|
66
|
+
tab_bar_item = create_tab_bar_item_custom(title, tab[:item], current_tag) if tab[:item]
|
65
67
|
|
66
68
|
tab_bar_item.badgeValue = tab[:badge_number].to_s unless tab[:badge_number].nil? || tab[:badge_number] <= 0
|
67
69
|
|
68
|
-
|
70
|
+
tab_bar_item
|
71
|
+
end
|
72
|
+
|
73
|
+
def current_tag
|
74
|
+
return @prev_tag = 0 unless @prev_tag
|
75
|
+
@prev_tag += 1
|
69
76
|
end
|
70
77
|
|
71
78
|
def replace_current_item(tab_bar_controller, view_controller: vc)
|
@@ -96,6 +103,7 @@ module ProMotion
|
|
96
103
|
def tab_bar_item(args={})
|
97
104
|
@tab_bar_item = args
|
98
105
|
end
|
106
|
+
|
99
107
|
def get_tab_bar_item
|
100
108
|
@tab_bar_item
|
101
109
|
end
|
data/lib/ProMotion/version.rb
CHANGED
@@ -36,7 +36,9 @@ module ProMotion
|
|
36
36
|
|
37
37
|
def set_initial_content
|
38
38
|
return unless self.respond_to?(:content)
|
39
|
-
|
39
|
+
current_content = content
|
40
|
+
return unless current_content
|
41
|
+
current_content.is_a?(NSURL) ? open_url(current_content) : set_content(current_content)
|
40
42
|
end
|
41
43
|
|
42
44
|
def set_content(content)
|
@@ -1,6 +1,8 @@
|
|
1
1
|
describe "ProMotion::Screen functionality" do
|
2
2
|
tests PM::Screen
|
3
3
|
|
4
|
+
before { UIView.setAnimationDuration 0.01 }
|
5
|
+
|
4
6
|
# Override controller to properly instantiate
|
5
7
|
def controller
|
6
8
|
rotate_device to: :portrait, button: :bottom
|
@@ -69,23 +71,22 @@ describe "ProMotion::Screen functionality" do
|
|
69
71
|
end
|
70
72
|
|
71
73
|
it "should call the on_back method on the root controller when navigating back" do
|
72
|
-
|
73
|
-
@presented_screen
|
74
|
-
@
|
75
|
-
|
76
|
-
@
|
74
|
+
presented_screen = PresentScreen.new
|
75
|
+
@controller.open presented_screen, animated: false
|
76
|
+
@controller.navigationController.viewControllers.should == [ @controller, presented_screen ]
|
77
|
+
presented_screen.close animated: false
|
78
|
+
@controller.on_back_fired.should == true
|
77
79
|
end
|
78
80
|
|
79
81
|
it "should call the correct on_back method when nesting screens" do
|
80
|
-
|
81
|
-
|
82
|
-
@grandchild_screen = @child_screen.open NavigationScreen.new
|
82
|
+
child_screen = @controller.open NavigationScreen.new, animated: false
|
83
|
+
grandchild_screen = child_screen.open NavigationScreen.new, animated: false
|
83
84
|
|
84
85
|
# start closing
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
@
|
86
|
+
grandchild_screen.close animated: false
|
87
|
+
child_screen.on_back_fired.should == true
|
88
|
+
child_screen.close animated: false
|
89
|
+
@controller.on_back_fired.should == true
|
89
90
|
end
|
90
91
|
|
91
92
|
it "should allow opening and closing a modal screen" do
|
@@ -15,9 +15,15 @@ describe "ProMotion::TableScreen functionality" do
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def confirmation_class
|
18
|
-
TestHelper.ios7 ? UITableViewCellDeleteConfirmationButton : UITableViewCellDeleteConfirmationControl
|
18
|
+
TestHelper.ios7 ? "UITableViewCellDeleteConfirmationButton" : "UITableViewCellDeleteConfirmationControl"
|
19
19
|
end
|
20
20
|
|
21
|
+
def table_label_class
|
22
|
+
TestHelper.ios7 ? "UILabel" : "UITableViewLabel"
|
23
|
+
end
|
24
|
+
|
25
|
+
before { UIView.setAnimationDuration 0.01 }
|
26
|
+
|
21
27
|
after { @table_screen = nil }
|
22
28
|
|
23
29
|
it "should have a navigation bar" do
|
@@ -31,7 +37,7 @@ describe "ProMotion::TableScreen functionality" do
|
|
31
37
|
|
32
38
|
it "should add a new table cell on tap" do
|
33
39
|
tap("Add New Row")
|
34
|
-
view("Dynamically Added").class.should ==
|
40
|
+
view("Dynamically Added").class.to_s.should == table_label_class
|
35
41
|
end
|
36
42
|
|
37
43
|
it "should do nothing when no action specified" do
|
@@ -47,7 +53,7 @@ describe "ProMotion::TableScreen functionality" do
|
|
47
53
|
it "should delete the specified row from the table view on tap" do
|
48
54
|
table_screen.tableView(table_screen.tableView, numberOfRowsInSection:0).should == 7
|
49
55
|
tap("Delete the row below")
|
50
|
-
wait 0.
|
56
|
+
wait 0.11 do
|
51
57
|
table_screen.tableView(table_screen.tableView, numberOfRowsInSection:0).should == 6
|
52
58
|
end
|
53
59
|
end
|
@@ -55,7 +61,7 @@ describe "ProMotion::TableScreen functionality" do
|
|
55
61
|
it "should delete the specified row from the table view on tap with an animation" do
|
56
62
|
table_screen.tableView(table_screen.tableView, numberOfRowsInSection:0).should == 7
|
57
63
|
tap("Delete the row below with an animation")
|
58
|
-
wait 0.
|
64
|
+
wait 0.11 do
|
59
65
|
table_screen.tableView(table_screen.tableView, numberOfRowsInSection:0).should == 6
|
60
66
|
end
|
61
67
|
end
|
@@ -66,12 +72,12 @@ describe "ProMotion::TableScreen functionality" do
|
|
66
72
|
table_screen.cell_was_deleted.should != true
|
67
73
|
flick("Just another deletable blank row", :to => :left)
|
68
74
|
|
69
|
-
wait 0.
|
75
|
+
wait 0.11 do
|
70
76
|
# Tap the delete button
|
71
77
|
view('Just another deletable blank row').superview.superview.subviews.each do |subview|
|
72
|
-
if subview.class == confirmation_class
|
78
|
+
if subview.class.to_s == confirmation_class
|
73
79
|
tap subview
|
74
|
-
wait 0.
|
80
|
+
wait 0.11 do
|
75
81
|
table_screen.tableView(table_screen.tableView, numberOfRowsInSection:0).should == 6
|
76
82
|
table_screen.cell_was_deleted.should == true
|
77
83
|
end
|
@@ -85,12 +91,12 @@ describe "ProMotion::TableScreen functionality" do
|
|
85
91
|
table_screen.cell_was_deleted.should != true
|
86
92
|
flick("A non-deletable blank row", :to => :left)
|
87
93
|
|
88
|
-
wait 0.
|
94
|
+
wait 0.11 do
|
89
95
|
# Tap the delete button
|
90
96
|
view('A non-deletable blank row').superview.superview.subviews.each do |subview|
|
91
97
|
if subview.class == confirmation_class
|
92
98
|
tap subview
|
93
|
-
wait 0.
|
99
|
+
wait 0.11 do
|
94
100
|
table_screen.tableView(table_screen.tableView, numberOfRowsInSection:0).should == 7
|
95
101
|
table_screen.cell_was_deleted.should != false
|
96
102
|
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
describe "ProMotion::TableScreen updating functionality" do
|
2
|
+
tests PM::UpdateTestTableScreen
|
3
|
+
|
4
|
+
before { UIView.setAnimationDuration 0.01 }
|
5
|
+
|
6
|
+
it 'should update a single row in the table view' do
|
7
|
+
table_screen = UpdateTestTableScreen.new
|
8
|
+
table_screen.make_more_cells
|
9
|
+
table_screen.update_table_data
|
10
|
+
table_screen.change_cells
|
11
|
+
|
12
|
+
table_screen.first_cell_title.should == "Cell 1"
|
13
|
+
table_screen.second_cell_title.should == "Cell 2"
|
14
|
+
|
15
|
+
table_screen.update_table_data(NSIndexPath.indexPathForRow(0, inSection:0))
|
16
|
+
|
17
|
+
table_screen.first_cell_title.should == "Cell A"
|
18
|
+
table_screen.second_cell_title.should == "Cell 2"
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'should allow multiple formats of index paths to be passed' do
|
22
|
+
table_screen = UpdateTestTableScreen.new
|
23
|
+
table_screen.make_more_cells
|
24
|
+
table_screen.update_table_data
|
25
|
+
table_screen.change_cells
|
26
|
+
|
27
|
+
# Single NSIndexPath
|
28
|
+
Proc.new {
|
29
|
+
table_screen.update_table_data(NSIndexPath.indexPathForRow(0, inSection:0))
|
30
|
+
}.should.not.raise(StandardError)
|
31
|
+
|
32
|
+
# Array of NSIndexPaths
|
33
|
+
Proc.new {
|
34
|
+
table_screen.update_table_data([NSIndexPath.indexPathForRow(0, inSection:0), NSIndexPath.indexPathForRow(1, inSection:0)])
|
35
|
+
}.should.not.raise(StandardError)
|
36
|
+
|
37
|
+
# # Hash with single NSIndexPath
|
38
|
+
Proc.new {
|
39
|
+
table_screen.update_table_data({index_paths: NSIndexPath.indexPathForRow(0, inSection:0)})
|
40
|
+
}.should.not.raise(StandardError)
|
41
|
+
|
42
|
+
# Hash with array of NSIndexPaths
|
43
|
+
Proc.new {
|
44
|
+
table_screen.update_table_data({index_paths: [NSIndexPath.indexPathForRow(0, inSection:0), NSIndexPath.indexPathForRow(1, inSection:0)]})
|
45
|
+
}.should.not.raise(StandardError)
|
46
|
+
|
47
|
+
# Hash with NSIndexPath and row animation
|
48
|
+
Proc.new {
|
49
|
+
table_screen.update_table_data({index_paths: NSIndexPath.indexPathForRow(0, inSection:0), animation: UITableViewRowAnimationFade})
|
50
|
+
}.should.not.raise(StandardError)
|
51
|
+
end
|
52
|
+
end
|
data/spec/helpers/test_helper.rb
CHANGED
@@ -1,6 +1,17 @@
|
|
1
1
|
class TestHelper
|
2
|
+
def self.ios6
|
3
|
+
UIDevice.currentDevice.systemVersion.to_f >= 6.0 &&
|
4
|
+
UIDevice.currentDevice.systemVersion.to_f < 7.0
|
5
|
+
end
|
6
|
+
|
2
7
|
def self.ios7
|
3
|
-
UIDevice.currentDevice.systemVersion.to_f >= 7.0
|
8
|
+
UIDevice.currentDevice.systemVersion.to_f >= 7.0 &&
|
9
|
+
UIDevice.currentDevice.systemVersion.to_f < 8.0
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.ios8
|
13
|
+
UIDevice.currentDevice.systemVersion.to_f >= 8.0 &&
|
14
|
+
UIDevice.currentDevice.systemVersion.to_f < 9.0
|
4
15
|
end
|
5
16
|
end
|
6
17
|
|
@@ -100,13 +100,13 @@ describe "screen helpers" do
|
|
100
100
|
|
101
101
|
it "#push_view_controller should use the default navigation controller if not provided" do
|
102
102
|
vcs = @screen.navigationController.viewControllers
|
103
|
-
@screen.push_view_controller @second_vc
|
103
|
+
@screen.push_view_controller @second_vc, @screen.navigationController, false
|
104
104
|
@screen.navigationController.viewControllers.count.should == vcs.count + 1
|
105
105
|
end
|
106
106
|
|
107
107
|
it "#push_view_controller should use a provided navigation controller" do
|
108
108
|
second_nav_controller = UINavigationController.alloc.initWithRootViewController @screen
|
109
|
-
@screen.push_view_controller @second_vc, second_nav_controller
|
109
|
+
@screen.push_view_controller @second_vc, second_nav_controller, false
|
110
110
|
second_nav_controller.viewControllers.count.should == 2
|
111
111
|
end
|
112
112
|
|
@@ -123,13 +123,14 @@ describe "screen helpers" do
|
|
123
123
|
end
|
124
124
|
|
125
125
|
it "should apply properties when opening a new screen" do
|
126
|
-
new_screen = @screen.send(:set_up_screen_for_open, BasicScreen, { title: 'Some Title', modal: true, hide_tab_bar: true, nav_bar: true })
|
126
|
+
new_screen = @screen.send(:set_up_screen_for_open, BasicScreen, { title: 'Some Title', modal: true, hide_tab_bar: true, nav_bar: true, hide_nav_bar: true })
|
127
127
|
|
128
128
|
new_screen.parent_screen.should == @screen
|
129
129
|
new_screen.title.should == 'Some Title'
|
130
130
|
new_screen.modal?.should == true
|
131
131
|
new_screen.hidesBottomBarWhenPushed.should == true
|
132
132
|
new_screen.nav_bar?.should == true
|
133
|
+
new_screen.navigationController.isNavigationBarHidden.should == true
|
133
134
|
end
|
134
135
|
|
135
136
|
it "should present the navigationController when showing a modal screen" do
|
@@ -199,7 +200,7 @@ describe "screen helpers" do
|
|
199
200
|
|
200
201
|
it "should ignore its own navigation controller if current screen has a navigation controller" do
|
201
202
|
basic = BasicScreen.new(nav_bar: true) # creates a dangling nav_bar that will be discarded.
|
202
|
-
screen = @screen.open basic
|
203
|
+
screen = @screen.open basic, animated: false
|
203
204
|
screen.should.be.kind_of BasicScreen
|
204
205
|
basic.navigationController.should == @screen.navigationController
|
205
206
|
end
|
@@ -301,13 +302,13 @@ describe "screen helpers" do
|
|
301
302
|
|
302
303
|
it "#send_on_return should pass args to the first screen with :root" do
|
303
304
|
first_screen = HomeScreen.new(nav_bar: true)
|
304
|
-
second_screen = first_screen.open(BasicScreen)
|
305
|
-
second_screen.open @screen
|
305
|
+
second_screen = first_screen.open(BasicScreen, animated: false)
|
306
|
+
second_screen.open @screen, animated: false
|
306
307
|
|
307
308
|
|
308
309
|
second_screen.stub!(:on_return) { |args| should.flunk "shouldn't call on_return on second_screen!" }
|
309
310
|
first_screen.mock!(:on_return) { |args| args[:key].should == :value }
|
310
|
-
@screen.close
|
311
|
+
@screen.close key: :value, to_screen: :root, animated: false
|
311
312
|
end
|
312
313
|
end
|
313
314
|
|
data/spec/unit/screen_spec.rb
CHANGED
@@ -60,7 +60,7 @@ describe "screen properties" do
|
|
60
60
|
# Issue https://github.com/clearsightstudio/ProMotion/issues/109
|
61
61
|
it "#should_autorotate should fire when shouldAutorotate fires when in a navigation bar" do
|
62
62
|
parent_screen = BasicScreen.new(nav_bar: true)
|
63
|
-
parent_screen.open @screen
|
63
|
+
parent_screen.open @screen, animated: false
|
64
64
|
@screen.mock!(:should_autorotate) { true.should == true }
|
65
65
|
parent_screen.navigationController.shouldAutorotate
|
66
66
|
end
|
@@ -31,14 +31,14 @@ describe "split screen `open` functionality" do
|
|
31
31
|
end
|
32
32
|
|
33
33
|
it "should open a new screen in the master view's navigation controller" do
|
34
|
-
screen = @master_screen.open @detail_screen_2
|
34
|
+
screen = @master_screen.open @detail_screen_2, animated: false
|
35
35
|
@split_screen.detail_screen.should == @detail_screen_1 # no change
|
36
36
|
@master_screen.navigationController.topViewController.should == @detail_screen_2
|
37
37
|
screen.should == @detail_screen_2
|
38
38
|
end
|
39
39
|
|
40
40
|
it "should open a new modal screen in the detail view" do
|
41
|
-
screen = @detail_screen_1.open @detail_screen_2, modal: true
|
41
|
+
screen = @detail_screen_1.open @detail_screen_2, modal: true, animated: false
|
42
42
|
@split_screen.detail_screen.should == @detail_screen_1
|
43
43
|
@detail_screen_1.presentedViewController.should == (@detail_screen_2.navigationController || @detail_screen_2)
|
44
44
|
screen.should == @detail_screen_2
|
@@ -47,7 +47,7 @@ describe "split screen `open` functionality" do
|
|
47
47
|
it "should not interfere with normal non-split screen navigation" do
|
48
48
|
home = HomeScreen.new(nav_bar: true)
|
49
49
|
child = BasicScreen.new
|
50
|
-
screen = home.open child, in_detail: true, in_master: true
|
50
|
+
screen = home.open child, in_detail: true, in_master: true, animated: false
|
51
51
|
home.navigationController.topViewController.should == child
|
52
52
|
screen.should == child
|
53
53
|
end
|
data/spec/unit/tab_bar_spec.rb
CHANGED
@@ -23,6 +23,13 @@ describe "PM::Tabs" do
|
|
23
23
|
tab_bar.viewControllers.length.should == 4
|
24
24
|
end
|
25
25
|
|
26
|
+
it "should have correct tags on each tabBarItem" do
|
27
|
+
@screen1.tabBarItem.tag.should == 0
|
28
|
+
@screen2.tabBarItem.tag.should == 1
|
29
|
+
@screen3.tabBarItem.tag.should == 2
|
30
|
+
@screen4.tabBarItem.tag.should == 3
|
31
|
+
end
|
32
|
+
|
26
33
|
it "should have the right screens in the right places" do
|
27
34
|
tab_bar.viewControllers[0].should == @screen1.navigationController
|
28
35
|
tab_bar.viewControllers[1].should == @screen2.navigationController
|
data/spec/unit/tab_spec.rb
CHANGED
@@ -28,7 +28,7 @@ describe "tab bar functionality" do
|
|
28
28
|
it "should have set the others to their respective titles" do
|
29
29
|
@tab_bar.tabBar.items[1].title.should == "Basic"
|
30
30
|
@tab_bar.tabBar.items[2].title.should == "Home"
|
31
|
-
@tab_bar.tabBar.items[3].title.should == "
|
31
|
+
@tab_bar.tabBar.items[3].title.should == "Test tab title"
|
32
32
|
end
|
33
33
|
|
34
34
|
it "should allow changing the tab bar item with set_tab_bar_item" do
|
@@ -5,7 +5,8 @@ describe "PM::Table module" do
|
|
5
5
|
end
|
6
6
|
|
7
7
|
def custom_cell
|
8
|
-
@image
|
8
|
+
@image ||= UIImage.imageNamed("list")
|
9
|
+
@pattern_image_color ||= UIColor.colorWithPatternImage(@image)
|
9
10
|
cell_factory({
|
10
11
|
title: "Crazy Full Featured Cell",
|
11
12
|
subtitle: "This is way too huge..see note",
|
@@ -29,13 +30,29 @@ describe "PM::Table module" do
|
|
29
30
|
size: 50,
|
30
31
|
radius: 15
|
31
32
|
},
|
32
|
-
|
33
|
-
|
34
|
-
|
33
|
+
properties: {
|
34
|
+
content_view: {
|
35
|
+
background_color: @pattern_image_color,
|
36
|
+
},
|
37
|
+
layer: {
|
38
|
+
masks_to_bounds: true,
|
39
|
+
},
|
35
40
|
}
|
36
41
|
})
|
37
42
|
end
|
38
43
|
|
44
|
+
def default_cell_height
|
45
|
+
return UITableViewAutomaticDimension if TestHelper.ios8
|
46
|
+
return 44.0 if TestHelper.ios7
|
47
|
+
end
|
48
|
+
|
49
|
+
def default_header_height
|
50
|
+
# Thanks, Apple.
|
51
|
+
return -1.0 if TestHelper.ios8
|
52
|
+
return 23.0 if TestHelper.ios7
|
53
|
+
return 22.0 if TestHelper.ios6
|
54
|
+
end
|
55
|
+
|
39
56
|
before do
|
40
57
|
@subject = TestTableScreen.new
|
41
58
|
@subject.mock! :table_data do
|
@@ -44,7 +61,7 @@ describe "PM::Table module" do
|
|
44
61
|
},{
|
45
62
|
title: "Table cell group 2", cells: [ cell_factory ]
|
46
63
|
},{
|
47
|
-
title: "Table cell group 3", cells: [ cell_factory(title: "3-1"), cell_factory({title: "3-2",
|
64
|
+
title: "Table cell group 3", cells: [ cell_factory(title: "3-1"), cell_factory({title: "3-2", properties: { background_color: UIColor.blueColor } }) ]
|
48
65
|
},{
|
49
66
|
title: "Table cell group 4", cells: [ custom_cell, cell_factory(title: "4-2"), cell_factory(title: "4-3"), cell_factory(title: "4-4") ]
|
50
67
|
},{
|
@@ -101,7 +118,7 @@ describe "PM::Table module" do
|
|
101
118
|
end
|
102
119
|
|
103
120
|
it "should return the table's cell height if none is given" do
|
104
|
-
@subject.tableView(@subject.table_view, heightForRowAtIndexPath:@ip).should ==
|
121
|
+
@subject.tableView(@subject.table_view, heightForRowAtIndexPath:@ip).should == default_cell_height
|
105
122
|
end
|
106
123
|
|
107
124
|
it "should allow setting a custom cell height" do
|
@@ -140,11 +157,12 @@ describe "PM::Table module" do
|
|
140
157
|
|
141
158
|
it "should set a custom cell background image" do
|
142
159
|
@image.should.not.be.nil
|
143
|
-
ip = NSIndexPath.indexPathForRow(0, inSection: 3) # Cell
|
160
|
+
ip = NSIndexPath.indexPathForRow(0, inSection: 3) # Cell 4-1
|
144
161
|
cell = @subject.tableView(@subject.table_view, cellForRowAtIndexPath: ip)
|
145
162
|
cell.should.be.kind_of(UITableViewCell)
|
146
|
-
cell.
|
147
|
-
cell.backgroundColor.should
|
163
|
+
cell.layer.masksToBounds.should == true
|
164
|
+
cell.contentView.backgroundColor.should.be.kind_of(UIColor)
|
165
|
+
cell.contentView.backgroundColor.should == @pattern_image_color
|
148
166
|
end
|
149
167
|
|
150
168
|
it "should set a custom cell background color" do
|
@@ -162,8 +180,7 @@ describe "PM::Table module" do
|
|
162
180
|
end
|
163
181
|
|
164
182
|
it "should use the default section height if none is specified" do
|
165
|
-
|
166
|
-
@subject.tableView(@subject.table_view, heightForHeaderInSection:4).should == header_height # Built-in default
|
183
|
+
@subject.tableView(@subject.table_view, heightForHeaderInSection:4).should == default_header_height
|
167
184
|
end
|
168
185
|
|
169
186
|
it "should use the set title_view_height if one is specified" do
|
@@ -112,20 +112,6 @@ describe "table screens" do
|
|
112
112
|
end
|
113
113
|
|
114
114
|
describe "test PM::TableScreen's updating functionality" do
|
115
|
-
before do
|
116
|
-
class UpdateTestTableScreen < PM::TableScreen
|
117
|
-
def table_data; @table_data ||= []; end
|
118
|
-
def on_load
|
119
|
-
@table_data = [{cells: []}]
|
120
|
-
update_table_data
|
121
|
-
end
|
122
|
-
|
123
|
-
def make_more_cells
|
124
|
-
@table_data = [{cells: [{title: "Cell 1"},{title: "Cell 2"}]}]
|
125
|
-
end
|
126
|
-
end
|
127
|
-
end
|
128
|
-
|
129
115
|
it 'should update the table data when update_table_data is called' do
|
130
116
|
@screen = UpdateTestTableScreen.new
|
131
117
|
@screen.tableView(@screen.tableView, numberOfRowsInSection:0).should == 0
|
@@ -0,0 +1,34 @@
|
|
1
|
+
describe "PM::Table utils" do
|
2
|
+
|
3
|
+
before do
|
4
|
+
@subject = TestTableScreen.new
|
5
|
+
@subject.on_load
|
6
|
+
@subject.update_table_data
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should convert an index path to a section index" do
|
10
|
+
index_path = NSIndexPath.indexPathForRow(12, inSection:2)
|
11
|
+
given = {index_path: index_path}
|
12
|
+
expected = {
|
13
|
+
index_path: index_path,
|
14
|
+
section: 2,
|
15
|
+
index: 12
|
16
|
+
}
|
17
|
+
|
18
|
+
@subject.index_path_to_section_index(given).should == expected
|
19
|
+
end
|
20
|
+
|
21
|
+
it "return the original param when converting an index path with incorrect values" do
|
22
|
+
@subject.index_path_to_section_index(17).should == 17
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should properly determine if all members of an array are the same class" do
|
26
|
+
@subject.array_all_members_of?([1, 2, 3, 4], Fixnum).should == true
|
27
|
+
@subject.array_all_members_of?(["string", 'string2'], String).should == true
|
28
|
+
@subject.array_all_members_of?([:sym1, :sym2, :sym3], Symbol).should == true
|
29
|
+
|
30
|
+
@subject.array_all_members_of?([1, 2, 3, 4, 'String'], Fixnum).should == false
|
31
|
+
@subject.array_all_members_of?([4.4, 2], Fixnum).should == false
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
@@ -19,7 +19,7 @@ describe "PM::TableViewCellModule" do
|
|
19
19
|
radius: 15
|
20
20
|
},
|
21
21
|
selection_style: :gray,
|
22
|
-
|
22
|
+
properties: {
|
23
23
|
layer: {
|
24
24
|
masks_to_bounds: true
|
25
25
|
},
|
@@ -48,7 +48,7 @@ describe "PM::TableViewCellModule" do
|
|
48
48
|
{
|
49
49
|
title: "",
|
50
50
|
cells: [
|
51
|
-
{ title: "Test 1",
|
51
|
+
{ title: "Test 1", properties: { accessory_type: UITableViewCellStateShowingEditControlMask } },
|
52
52
|
custom_cell,
|
53
53
|
{ title: "Test2", accessory: { view: button } },
|
54
54
|
attributed_cell
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ProMotion
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.1.0.beta1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jamon Holmgren
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2014-
|
13
|
+
date: 2014-10-31 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: methadone
|
@@ -18,28 +18,28 @@ dependencies:
|
|
18
18
|
requirements:
|
19
19
|
- - "~>"
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: '1.
|
21
|
+
version: '1.7'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
requirements:
|
26
26
|
- - "~>"
|
27
27
|
- !ruby/object:Gem::Version
|
28
|
-
version: '1.
|
28
|
+
version: '1.7'
|
29
29
|
- !ruby/object:Gem::Dependency
|
30
30
|
name: webstub
|
31
31
|
requirement: !ruby/object:Gem::Requirement
|
32
32
|
requirements:
|
33
33
|
- - "~>"
|
34
34
|
- !ruby/object:Gem::Version
|
35
|
-
version: '1.
|
35
|
+
version: '1.1'
|
36
36
|
type: :development
|
37
37
|
prerelease: false
|
38
38
|
version_requirements: !ruby/object:Gem::Requirement
|
39
39
|
requirements:
|
40
40
|
- - "~>"
|
41
41
|
- !ruby/object:Gem::Version
|
42
|
-
version: '1.
|
42
|
+
version: '1.1'
|
43
43
|
- !ruby/object:Gem::Dependency
|
44
44
|
name: motion-stump
|
45
45
|
requirement: !ruby/object:Gem::Requirement
|
@@ -134,6 +134,7 @@ files:
|
|
134
134
|
- spec/functional/func_screen_spec.rb
|
135
135
|
- spec/functional/func_split_screen_spec.rb
|
136
136
|
- spec/functional/func_table_screen_spec.rb
|
137
|
+
- spec/functional/func_table_screen_updating_spec.rb
|
137
138
|
- spec/functional/func_web_screen_spec.rb
|
138
139
|
- spec/helpers/test_helper.rb
|
139
140
|
- spec/unit/delegate_spec.rb
|
@@ -154,6 +155,7 @@ files:
|
|
154
155
|
- spec/unit/tables/table_indexable_spec.rb
|
155
156
|
- spec/unit/tables/table_module_spec.rb
|
156
157
|
- spec/unit/tables/table_screen_spec.rb
|
158
|
+
- spec/unit/tables/table_utils_spec.rb
|
157
159
|
- spec/unit/tables/table_view_cell_spec.rb
|
158
160
|
- spec/unit/view_helper_spec.rb
|
159
161
|
- spec/unit/view_title_screen.rb
|
@@ -173,12 +175,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
173
175
|
version: '0'
|
174
176
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
175
177
|
requirements:
|
176
|
-
- - "
|
178
|
+
- - ">"
|
177
179
|
- !ruby/object:Gem::Version
|
178
|
-
version:
|
180
|
+
version: 1.3.1
|
179
181
|
requirements: []
|
180
182
|
rubyforge_project:
|
181
|
-
rubygems_version: 2.
|
183
|
+
rubygems_version: 2.4.2
|
182
184
|
signing_key:
|
183
185
|
specification_version: 4
|
184
186
|
summary: ProMotion is a fast way to get started building RubyMotion apps. Instead
|
@@ -190,6 +192,7 @@ test_files:
|
|
190
192
|
- spec/functional/func_screen_spec.rb
|
191
193
|
- spec/functional/func_split_screen_spec.rb
|
192
194
|
- spec/functional/func_table_screen_spec.rb
|
195
|
+
- spec/functional/func_table_screen_updating_spec.rb
|
193
196
|
- spec/functional/func_web_screen_spec.rb
|
194
197
|
- spec/helpers/test_helper.rb
|
195
198
|
- spec/unit/delegate_spec.rb
|
@@ -210,8 +213,8 @@ test_files:
|
|
210
213
|
- spec/unit/tables/table_indexable_spec.rb
|
211
214
|
- spec/unit/tables/table_module_spec.rb
|
212
215
|
- spec/unit/tables/table_screen_spec.rb
|
216
|
+
- spec/unit/tables/table_utils_spec.rb
|
213
217
|
- spec/unit/tables/table_view_cell_spec.rb
|
214
218
|
- spec/unit/view_helper_spec.rb
|
215
219
|
- spec/unit/view_title_screen.rb
|
216
220
|
- spec/unit/web_spec.rb
|
217
|
-
has_rdoc:
|