formotion 0.0.3 → 0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. data/.gitignore +2 -1
  2. data/CHANGELOG.md +10 -0
  3. data/Gemfile +6 -0
  4. data/LIST_OF_ROW_TYPES.md +163 -0
  5. data/NEW_ROW_TYPES.md +73 -0
  6. data/README.md +11 -14
  7. data/Rakefile +6 -0
  8. data/app/app_delegate.rb +22 -0
  9. data/examples/KitchenSink/Rakefile +1 -1
  10. data/examples/KitchenSink/app/app_delegate.rb +50 -2
  11. data/examples/Login/.gitignore +5 -0
  12. data/examples/Login/Rakefile +9 -0
  13. data/examples/Login/app/app_delegate.rb +16 -0
  14. data/examples/Login/app/login_controller.rb +47 -0
  15. data/examples/Login/app/user_controller.rb +38 -0
  16. data/examples/Login/spec/main_spec.rb +9 -0
  17. data/lib/formotion.rb +7 -1
  18. data/lib/formotion/{form.rb → form/form.rb} +0 -0
  19. data/lib/formotion/{form_delegate.rb → form/form_delegate.rb} +10 -15
  20. data/lib/formotion/patch/object.rb +9 -0
  21. data/lib/formotion/patch/ui_action_sheet.rb +27 -0
  22. data/lib/formotion/patch/ui_text_view.rb +122 -0
  23. data/lib/formotion/patch/ui_text_view_placeholder.rb +65 -0
  24. data/lib/formotion/{row.rb → row/row.rb} +37 -27
  25. data/lib/formotion/row/row_cell_builder.rb +28 -0
  26. data/lib/formotion/row_type/base.rb +41 -0
  27. data/lib/formotion/row_type/check_row.rb +30 -0
  28. data/lib/formotion/row_type/date_row.rb +61 -0
  29. data/lib/formotion/row_type/email_row.rb +11 -0
  30. data/lib/formotion/row_type/image_row.rb +99 -0
  31. data/lib/formotion/row_type/number_row.rb +11 -0
  32. data/lib/formotion/row_type/options_row.rb +24 -0
  33. data/lib/formotion/row_type/phone_row.rb +11 -0
  34. data/lib/formotion/row_type/row_type.rb +21 -0
  35. data/lib/formotion/row_type/slider_row.rb +43 -0
  36. data/lib/formotion/row_type/static_row.rb +6 -0
  37. data/lib/formotion/row_type/string_row.rb +112 -0
  38. data/lib/formotion/row_type/submit_row.rb +34 -0
  39. data/lib/formotion/row_type/switch_row.rb +19 -0
  40. data/lib/formotion/row_type/text_row.rb +76 -0
  41. data/lib/formotion/{section.rb → section/section.rb} +3 -0
  42. data/lib/formotion/version.rb +1 -1
  43. data/spec/form_spec.rb +5 -4
  44. data/spec/functional/character_spec.rb +70 -0
  45. data/spec/functional/check_row_spec.rb +42 -0
  46. data/spec/functional/date_row_spec.rb +63 -0
  47. data/spec/functional/image_row_spec.rb +82 -0
  48. data/spec/functional/options_row_spec.rb +27 -0
  49. data/spec/functional/slider_row_spec.rb +27 -0
  50. data/spec/functional/submit_row_spec.rb +30 -0
  51. data/spec/functional/switch_row_spec.rb +28 -0
  52. data/spec/functional/text_row_spec.rb +60 -0
  53. data/spec/row_type/check_spec.rb +27 -0
  54. data/spec/row_type/date_spec.rb +69 -0
  55. data/spec/row_type/email_spec.rb +22 -0
  56. data/spec/row_type/image_spec.rb +43 -0
  57. data/spec/row_type/number_spec.rb +22 -0
  58. data/spec/row_type/options_spec.rb +37 -0
  59. data/spec/row_type/phone_spec.rb +22 -0
  60. data/spec/row_type/slider_spec.rb +47 -0
  61. data/spec/row_type/static_spec.rb +15 -0
  62. data/spec/row_type/string_spec.rb +52 -0
  63. data/spec/row_type/submit_spec.rb +28 -0
  64. data/spec/row_type/switch_spec.rb +27 -0
  65. data/spec/row_type/text_spec.rb +41 -0
  66. data/spec/support/ui_control_wrap_extension.rb +7 -0
  67. metadata +88 -9
  68. data/lib/formotion/row_cell_builder.rb +0 -168
  69. data/lib/formotion/row_type.rb +0 -33
@@ -0,0 +1,15 @@
1
+ describe "Static Row" do
2
+ before do
3
+ row_settings = {
4
+ title: "Static",
5
+ key: :static,
6
+ type: :static,
7
+ }
8
+ @row = Formotion::Row.new(row_settings)
9
+ @row.reuse_identifier = 'test'
10
+ end
11
+
12
+ it "should initialize with correct settings" do
13
+ @row.object.class.should == Formotion::RowType::StaticRow
14
+ end
15
+ end
@@ -0,0 +1,52 @@
1
+ # Tests character row behavior on a string type
2
+ describe "String Row Type" do
3
+ before do
4
+ row_settings = {
5
+ title: "String",
6
+ key: :string,
7
+ type: :string,
8
+ }
9
+ @row = Formotion::Row.new(row_settings)
10
+ @row.reuse_identifier = 'test'
11
+ end
12
+
13
+ it "should initialize with correct settings" do
14
+ @row.object.class.should == Formotion::RowType::StringRow
15
+ end
16
+
17
+ it "should build cell with textfield" do
18
+ cell = @row.make_cell
19
+ @row.text_field.class.should == UITextField
20
+ end
21
+
22
+ # Value
23
+ it "should have no value by default" do
24
+ cell = @row.make_cell
25
+ @row.text_field.text.should == ''
26
+ end
27
+
28
+ it "should use custom value" do
29
+ @row.value = 'init value'
30
+ cell = @row.make_cell
31
+
32
+ @row.text_field.text.should == 'init value'
33
+ end
34
+
35
+ # Placeholder
36
+ it "should have no placeholder by default" do
37
+ cell = @row.make_cell
38
+ @row.text_field.placeholder.should == nil
39
+ end
40
+
41
+ it "should use custom placeholder" do
42
+ @row.placeholder = 'placeholder'
43
+ cell = @row.make_cell
44
+ @row.text_field.placeholder.should == 'placeholder'
45
+ end
46
+
47
+ # Keyboard
48
+ it "should use default keyboard" do
49
+ cell = @row.make_cell
50
+ @row.text_field.keyboardType.should == UIKeyboardTypeDefault
51
+ end
52
+ end
@@ -0,0 +1,28 @@
1
+ describe "Submit Row" do
2
+ before do
3
+ row_settings = {
4
+ title: "Submit",
5
+ key: :submit,
6
+ type: :submit,
7
+ }
8
+ @row = Formotion::Row.new(row_settings)
9
+ @row.reuse_identifier = 'test'
10
+ end
11
+
12
+ it "should initialize with correct settings" do
13
+ @row.object.class.should == Formotion::RowType::SubmitRow
14
+ end
15
+
16
+ it "should submit on select" do
17
+ fake_delegate = FakeDelegateClass.new
18
+ @row.object.on_select(nil, fake_delegate)
19
+ fake_delegate.submit_called.should == true
20
+ end
21
+ end
22
+
23
+ class FakeDelegateClass
24
+ attr_accessor :submit_called
25
+ def submit
26
+ self.submit_called = true
27
+ end
28
+ end
@@ -0,0 +1,27 @@
1
+ describe "Switch Row" do
2
+ before do
3
+ row_settings = {
4
+ title: "Switch",
5
+ key: :switch,
6
+ type: :switch,
7
+ }
8
+ @row = Formotion::Row.new(row_settings)
9
+ @row.reuse_identifier = 'test'
10
+ end
11
+
12
+ it "should initialize with correct settings" do
13
+ @row.object.class.should == Formotion::RowType::SwitchRow
14
+ end
15
+
16
+ # Value
17
+ it "should be off by default" do
18
+ cell = @row.make_cell
19
+ cell.accessoryView.on?.should == false
20
+ end
21
+
22
+ it "should be on when true" do
23
+ @row.value = true
24
+ cell = @row.make_cell
25
+ cell.accessoryView.on?.should == true
26
+ end
27
+ end
@@ -0,0 +1,41 @@
1
+ describe "Text Row" do
2
+ before do
3
+ row_settings = {
4
+ title: "Text",
5
+ key: :text,
6
+ type: :text,
7
+ }
8
+ @row = Formotion::Row.new(row_settings)
9
+ @row.reuse_identifier = 'test'
10
+ end
11
+
12
+ it "should initialize with correct settings" do
13
+ @row.object.class.should == Formotion::RowType::TextRow
14
+ end
15
+
16
+ # Value
17
+ it "should have no value by default" do
18
+ cell = @row.make_cell
19
+ @row.text_field.text.should == ''
20
+ end
21
+
22
+ it "should use custom value" do
23
+ @row.value = 'init value'
24
+ cell = @row.make_cell
25
+
26
+ @row.text_field.text.should == 'init value'
27
+ end
28
+
29
+ # Placeholder
30
+ it "should have no placeholder by default" do
31
+ cell = @row.make_cell
32
+ @row.text_field.placeholder.should == nil
33
+ end
34
+
35
+ it "should use custom placeholder" do
36
+ @row.placeholder = 'placeholder'
37
+ cell = @row.make_cell
38
+ @row.text_field.placeholder.should == 'placeholder'
39
+ end
40
+
41
+ end
@@ -0,0 +1,7 @@
1
+ module UIControlWrap
2
+ # adds ability to trigger a defined callback that was previously defined by when
3
+ def trigger(events)
4
+ @callback ||= {}
5
+ @callback[events].call if @callback.has_key? events
6
+ end
7
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: formotion
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: '0.5'
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-07-03 00:00:00.000000000 Z
12
+ date: 2012-07-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bubble-wrap
@@ -51,8 +51,12 @@ extensions: []
51
51
  extra_rdoc_files: []
52
52
  files:
53
53
  - .gitignore
54
+ - CHANGELOG.md
54
55
  - Formotion.gemspec
56
+ - Gemfile
55
57
  - LICENSE
58
+ - LIST_OF_ROW_TYPES.md
59
+ - NEW_ROW_TYPES.md
56
60
  - README.md
57
61
  - Rakefile
58
62
  - app/app_delegate.rb
@@ -61,21 +65,68 @@ files:
61
65
  - examples/KitchenSink/Rakefile
62
66
  - examples/KitchenSink/app/app_delegate.rb
63
67
  - examples/KitchenSink/spec/main_spec.rb
68
+ - examples/Login/.gitignore
69
+ - examples/Login/Rakefile
70
+ - examples/Login/app/app_delegate.rb
71
+ - examples/Login/app/login_controller.rb
72
+ - examples/Login/app/user_controller.rb
73
+ - examples/Login/spec/main_spec.rb
64
74
  - lib/formotion.rb
65
75
  - lib/formotion/base.rb
66
76
  - lib/formotion/exceptions.rb
67
- - lib/formotion/form.rb
77
+ - lib/formotion/form/form.rb
78
+ - lib/formotion/form/form_delegate.rb
68
79
  - lib/formotion/form_controller.rb
69
- - lib/formotion/form_delegate.rb
80
+ - lib/formotion/patch/object.rb
81
+ - lib/formotion/patch/ui_action_sheet.rb
70
82
  - lib/formotion/patch/ui_text_field.rb
71
- - lib/formotion/row.rb
72
- - lib/formotion/row_cell_builder.rb
73
- - lib/formotion/row_type.rb
74
- - lib/formotion/section.rb
83
+ - lib/formotion/patch/ui_text_view.rb
84
+ - lib/formotion/patch/ui_text_view_placeholder.rb
85
+ - lib/formotion/row/row.rb
86
+ - lib/formotion/row/row_cell_builder.rb
87
+ - lib/formotion/row_type/base.rb
88
+ - lib/formotion/row_type/check_row.rb
89
+ - lib/formotion/row_type/date_row.rb
90
+ - lib/formotion/row_type/email_row.rb
91
+ - lib/formotion/row_type/image_row.rb
92
+ - lib/formotion/row_type/number_row.rb
93
+ - lib/formotion/row_type/options_row.rb
94
+ - lib/formotion/row_type/phone_row.rb
95
+ - lib/formotion/row_type/row_type.rb
96
+ - lib/formotion/row_type/slider_row.rb
97
+ - lib/formotion/row_type/static_row.rb
98
+ - lib/formotion/row_type/string_row.rb
99
+ - lib/formotion/row_type/submit_row.rb
100
+ - lib/formotion/row_type/switch_row.rb
101
+ - lib/formotion/row_type/text_row.rb
102
+ - lib/formotion/section/section.rb
75
103
  - lib/formotion/version.rb
76
104
  - spec/form_spec.rb
105
+ - spec/functional/character_spec.rb
106
+ - spec/functional/check_row_spec.rb
107
+ - spec/functional/date_row_spec.rb
108
+ - spec/functional/image_row_spec.rb
109
+ - spec/functional/options_row_spec.rb
110
+ - spec/functional/slider_row_spec.rb
111
+ - spec/functional/submit_row_spec.rb
112
+ - spec/functional/switch_row_spec.rb
113
+ - spec/functional/text_row_spec.rb
77
114
  - spec/row_spec.rb
115
+ - spec/row_type/check_spec.rb
116
+ - spec/row_type/date_spec.rb
117
+ - spec/row_type/email_spec.rb
118
+ - spec/row_type/image_spec.rb
119
+ - spec/row_type/number_spec.rb
120
+ - spec/row_type/options_spec.rb
121
+ - spec/row_type/phone_spec.rb
122
+ - spec/row_type/slider_spec.rb
123
+ - spec/row_type/static_spec.rb
124
+ - spec/row_type/string_spec.rb
125
+ - spec/row_type/submit_spec.rb
126
+ - spec/row_type/switch_spec.rb
127
+ - spec/row_type/text_spec.rb
78
128
  - spec/section_spec.rb
129
+ - spec/support/ui_control_wrap_extension.rb
79
130
  homepage: https://github.com/clayallsopp/Formotion
80
131
  licenses: []
81
132
  post_install_message:
@@ -88,12 +139,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
88
139
  - - ! '>='
89
140
  - !ruby/object:Gem::Version
90
141
  version: '0'
142
+ segments:
143
+ - 0
144
+ hash: -3547767700420537743
91
145
  required_rubygems_version: !ruby/object:Gem::Requirement
92
146
  none: false
93
147
  requirements:
94
148
  - - ! '>='
95
149
  - !ruby/object:Gem::Version
96
150
  version: '0'
151
+ segments:
152
+ - 0
153
+ hash: -3547767700420537743
97
154
  requirements: []
98
155
  rubyforge_project:
99
156
  rubygems_version: 1.8.24
@@ -102,6 +159,28 @@ specification_version: 3
102
159
  summary: Making iOS Forms insanely great with RubyMotion
103
160
  test_files:
104
161
  - spec/form_spec.rb
162
+ - spec/functional/character_spec.rb
163
+ - spec/functional/check_row_spec.rb
164
+ - spec/functional/date_row_spec.rb
165
+ - spec/functional/image_row_spec.rb
166
+ - spec/functional/options_row_spec.rb
167
+ - spec/functional/slider_row_spec.rb
168
+ - spec/functional/submit_row_spec.rb
169
+ - spec/functional/switch_row_spec.rb
170
+ - spec/functional/text_row_spec.rb
105
171
  - spec/row_spec.rb
172
+ - spec/row_type/check_spec.rb
173
+ - spec/row_type/date_spec.rb
174
+ - spec/row_type/email_spec.rb
175
+ - spec/row_type/image_spec.rb
176
+ - spec/row_type/number_spec.rb
177
+ - spec/row_type/options_spec.rb
178
+ - spec/row_type/phone_spec.rb
179
+ - spec/row_type/slider_spec.rb
180
+ - spec/row_type/static_spec.rb
181
+ - spec/row_type/string_spec.rb
182
+ - spec/row_type/submit_spec.rb
183
+ - spec/row_type/switch_spec.rb
184
+ - spec/row_type/text_spec.rb
106
185
  - spec/section_spec.rb
107
- has_rdoc:
186
+ - spec/support/ui_control_wrap_extension.rb
@@ -1,168 +0,0 @@
1
- #################
2
- #
3
- # Formotion::RowCellBuilder
4
- # RowCellBuilder handles taking Formotion::Rows
5
- # and configuring UITableViewCells based on their properties.
6
- #
7
- #################
8
- module Formotion
9
- class RowCellBuilder
10
- # The new UITextField in a UITableViewCell
11
- # will be assigned this tag, if applicable.
12
- TEXT_FIELD_TAG=1000
13
-
14
- # PARAMS row.is_a? Formotion::Row
15
- # RETURNS [cell configured to that row, a UITextField for that row if applicable or nil]
16
- def self.make_cell(row)
17
- cell, text_field = nil
18
-
19
- cell = UITableViewCell.alloc.initWithStyle(UITableViewCellStyleSubtitle, reuseIdentifier:row.reuse_identifier)
20
-
21
- cell.accessoryType = UITableViewCellAccessoryNone
22
- cell.textLabel.text = row.title
23
- cell.detailTextLabel.text = row.subtitle
24
-
25
- if row.submit_button?
26
- make_submit_cell(row, cell)
27
- elsif row.switchable?
28
- make_switch_cell(row, cell)
29
- elsif row.checkable?
30
- make_check_cell(row, cell)
31
- elsif row.editable?
32
- text_field = make_text_field(row, cell)
33
- end
34
- [cell, text_field]
35
- end
36
-
37
- # This is actually called whenever again cell is checked/unchecked
38
- # in the UITableViewDelegate callbacks. So (for now) don't
39
- # instantiate long-lived objects in them.
40
- # Maybe that logic should be moved elsewhere?
41
- def self.make_check_cell(row, cell)
42
- cell.accessoryType = row.value ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone
43
- end
44
-
45
- def self.make_switch_cell(row, cell)
46
- cell.selectionStyle = UITableViewCellSelectionStyleNone
47
- switchView = UISwitch.alloc.initWithFrame(CGRectZero)
48
- cell.accessoryView = switchView
49
- switchView.setOn(row.value || false, animated:false)
50
- switchView.when(UIControlEventValueChanged) do
51
- row.value = switchView.isOn
52
- end
53
- end
54
-
55
- # Does a clever little trick to override #layoutSubviews
56
- # for just this one UITableViewCell object, in order to
57
- # center it's labels horizontally.
58
- def self.make_submit_cell(row, cell)
59
- cell.class.send(:alias_method, :old_layoutSubviews, :layoutSubviews)
60
- cell.instance_eval do
61
- def layoutSubviews
62
- old_layoutSubviews
63
-
64
- center = lambda {|frame, dimen|
65
- ((self.frame.size.send(dimen) - frame.size.send(dimen)) / 2.0)
66
- }
67
-
68
- self.textLabel.center = CGPointMake(self.frame.size.width / 2 - 10, self.textLabel.center.y)
69
- self.detailTextLabel.center = CGPointMake(self.frame.size.width / 2 - 10, self.detailTextLabel.center.y)
70
- end
71
- end
72
- end
73
-
74
- # Configures the cell to have a new UITextField
75
- # which is used to enter data. Consists of
76
- # 1) setting up that field with the appropriate properties
77
- # specified by `row` 2) configures the callbacks on the field
78
- # to call any callbacks `row` listens for.
79
- # Also does the layoutSubviews swizzle trick
80
- # to size the UITextField so it won't bump into the titleLabel.
81
- def self.make_text_field(row, cell)
82
- field = UITextField.alloc.initWithFrame(CGRectZero)
83
- field.tag = TEXT_FIELD_TAG
84
-
85
- field.placeholder = row.placeholder
86
- field.text = row.value
87
-
88
- field.clearButtonMode = UITextFieldViewModeWhileEditing
89
- field.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter
90
- field.textAlignment = UITextAlignmentRight
91
-
92
- case row.type
93
- when RowType::EMAIL
94
- field.keyboardType = UIKeyboardTypeEmailAddress
95
- when RowType::PHONE
96
- field.keyboardType = UIKeyboardTypePhonePad
97
- when RowType::NUMBER
98
- field.keyboardType = UIKeyboardTypeDecimalPad
99
- else
100
- field.keyboardType = UIKeyboardTypeDefault
101
- end
102
-
103
- field.secureTextEntry = true if row.secure?
104
- field.returnKeyType = row.return_key || UIReturnKeyNext
105
- field.autocapitalizationType = row.auto_capitalization if row.auto_capitalization
106
- field.autocorrectionType = row.auto_correction if row.auto_correction
107
- field.clearButtonMode = row.clear_button || UITextFieldViewModeWhileEditing
108
-
109
- if row.on_enter_callback
110
- field.should_return? do |text_field|
111
- if row.on_enter_callback.arity == 0
112
- row.on_enter_callback.call
113
- elsif row.on_enter_callback.arity == 1
114
- row.on_enter_callback.call(row)
115
- end
116
- false
117
- end
118
- elsif field.returnKeyType == UIReturnKeyDone
119
- field.should_return? do |text_field|
120
- text_field.resignFirstResponder
121
- false
122
- end
123
- else
124
- field.should_return? do |text_field|
125
- if row.next_row && row.next_row.text_field
126
- row.next_row.text_field.becomeFirstResponder
127
- else
128
- text_field.resignFirstResponder
129
- end
130
- true
131
- end
132
- end
133
-
134
- field.on_begin do |text_field|
135
- row.on_begin_callback && row.on_begin_callback.call
136
- end
137
-
138
- field.should_begin? do |text_field|
139
- row.section.form.active_row = row
140
- true
141
- end
142
-
143
- field.on_change do |text_field|
144
- row.value = text_field.text
145
- end
146
-
147
- cell.class.send(:alias_method, :old_layoutSubviews, :layoutSubviews)
148
- cell.instance_eval do
149
- def layoutSubviews
150
- old_layoutSubviews
151
-
152
- # viewWithTag is terrible, but I think it's ok to use here...
153
- formotion_field = self.viewWithTag(Formotion::RowCellBuilder::TEXT_FIELD_TAG)
154
- formotion_field.sizeToFit
155
-
156
- field_frame = formotion_field.frame
157
- field_frame.origin.x = self.textLabel.frame.origin.x + self.textLabel.frame.size.width + 20
158
- field_frame.origin.y = ((self.frame.size.height - field_frame.size.height) / 2.0).round
159
- field_frame.size.width = self.frame.size.width - field_frame.origin.x - 20
160
- formotion_field.frame = field_frame
161
- end
162
- end
163
-
164
- cell.addSubview(field)
165
- field
166
- end
167
- end
168
- end