formotion 0.0.3 → 0.5

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 (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