freeform 0.0.4 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (129) hide show
  1. data/.gitignore +8 -17
  2. data/Gemfile +1 -1
  3. data/Gemfile.lock +150 -0
  4. data/MIT-LICENSE +20 -0
  5. data/README.md +31 -43
  6. data/Rakefile +32 -1
  7. data/freeform.gemspec +22 -15
  8. data/lib/freeform/builder/builder_mixin.rb +111 -0
  9. data/lib/freeform/builder/builders.rb +32 -0
  10. data/lib/freeform/builder/engine.rb +14 -0
  11. data/lib/freeform/builder/view_helper.rb +56 -0
  12. data/lib/freeform/form/form_input_key.rb +1 -1
  13. data/lib/freeform/form/nested.rb +17 -55
  14. data/lib/freeform/form/property.rb +82 -42
  15. data/lib/freeform/form/validation.rb +38 -11
  16. data/lib/freeform/form.rb +24 -27
  17. data/lib/freeform/version.rb +1 -1
  18. data/lib/freeform.rb +4 -0
  19. data/lib/generators/freeform/install_generator.rb +17 -0
  20. data/lib/tasks/freeform_tasks.rake +4 -0
  21. data/spec/acceptance_spec.rb +261 -155
  22. data/spec/builder/builder_spec.rb +215 -0
  23. data/spec/builder/view_helper_spec.rb +97 -0
  24. data/spec/dummy/README.rdoc +28 -0
  25. data/spec/dummy/Rakefile +6 -0
  26. data/spec/dummy/app/assets/images/.keep +0 -0
  27. data/spec/dummy/app/assets/javascripts/application.js +5 -0
  28. data/spec/dummy/app/assets/javascripts/jquery.js +9404 -0
  29. data/spec/dummy/app/assets/javascripts/jquery_events_test.js +19 -0
  30. data/spec/dummy/app/assets/javascripts/projects.js +2 -0
  31. data/spec/dummy/app/assets/javascripts/prototype.js +6082 -0
  32. data/spec/dummy/app/assets/javascripts/prototype_events_test.js +20 -0
  33. data/spec/dummy/app/assets/stylesheets/application.css +7 -0
  34. data/spec/dummy/app/assets/stylesheets/companies.css +4 -0
  35. data/spec/dummy/app/assets/stylesheets/projects.css +4 -0
  36. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  37. data/spec/dummy/app/controllers/companies_controller.rb +5 -0
  38. data/spec/dummy/app/controllers/projects_controller.rb +11 -0
  39. data/spec/dummy/app/forms/milestone_form.rb +4 -0
  40. data/spec/dummy/app/forms/project_form.rb +11 -0
  41. data/spec/dummy/app/forms/task_form.rb +10 -0
  42. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  43. data/spec/dummy/app/mailers/.keep +0 -0
  44. data/spec/dummy/app/models/.keep +0 -0
  45. data/spec/dummy/app/models/company.rb +5 -0
  46. data/spec/dummy/app/models/milestone.rb +6 -0
  47. data/spec/dummy/app/models/project.rb +9 -0
  48. data/spec/dummy/app/models/project_task.rb +3 -0
  49. data/spec/dummy/app/models/task.rb +7 -0
  50. data/spec/dummy/app/views/companies/new.html.erb +16 -0
  51. data/spec/dummy/app/views/layouts/application.html.erb +19 -0
  52. data/spec/dummy/app/views/projects/new.html.erb +13 -0
  53. data/spec/dummy/app/views/projects/without_intermediate_inputs.html.erb +11 -0
  54. data/spec/dummy/bin/bundle +3 -0
  55. data/spec/dummy/bin/rails +4 -0
  56. data/spec/dummy/bin/rake +4 -0
  57. data/spec/dummy/config/application.rb +35 -0
  58. data/spec/dummy/config/boot.rb +5 -0
  59. data/spec/dummy/config/database.yml +25 -0
  60. data/spec/dummy/config/environment.rb +5 -0
  61. data/spec/dummy/config/environments/development.rb +29 -0
  62. data/spec/dummy/config/environments/production.rb +80 -0
  63. data/spec/dummy/config/environments/test.rb +36 -0
  64. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  65. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  66. data/spec/dummy/config/initializers/inflections.rb +16 -0
  67. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  68. data/spec/dummy/config/initializers/secret_token.rb +13 -0
  69. data/spec/dummy/config/initializers/session_store.rb +3 -0
  70. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  71. data/spec/dummy/config/locales/en.yml +23 -0
  72. data/spec/dummy/config/routes.rb +5 -0
  73. data/spec/dummy/config.ru +4 -0
  74. data/spec/dummy/db/migrate/20110710143903_initial_tables.rb +38 -0
  75. data/spec/dummy/db/schema.rb +43 -0
  76. data/spec/dummy/db/test.sqlite3 +0 -0
  77. data/spec/dummy/lib/assets/.keep +0 -0
  78. data/spec/dummy/log/.keep +0 -0
  79. data/spec/dummy/log/development.log +0 -0
  80. data/spec/dummy/log/test.log +39736 -0
  81. data/spec/dummy/public/404.html +58 -0
  82. data/spec/dummy/public/422.html +58 -0
  83. data/spec/dummy/public/500.html +57 -0
  84. data/spec/dummy/public/favicon.ico +0 -0
  85. data/spec/dummy/tmp/cache/assets/C54/850/sprockets%2Fd484f47085686f151320ff7248bb5105 +0 -0
  86. data/spec/dummy/tmp/cache/assets/C76/160/sprockets%2F49c594d143212b346d11f1ecf9358103 +0 -0
  87. data/spec/dummy/tmp/cache/assets/C99/4D0/sprockets%2F5e30a6b911437f1428dc32c3ae182123 +0 -0
  88. data/spec/dummy/tmp/cache/assets/C99/7D0/sprockets%2F79513e6956e0ee8624976e041fd5636d +0 -0
  89. data/spec/dummy/tmp/cache/assets/CAA/C90/sprockets%2F1e6c8ee1258009385ccf5b84015424b3 +0 -0
  90. data/spec/dummy/tmp/cache/assets/CB2/CB0/sprockets%2F11cc8d161d71a716dd36f16849d90870 +0 -0
  91. data/spec/dummy/tmp/cache/assets/CB7/7F0/sprockets%2Fac97b043470f6fcc925c352f16956643 +0 -0
  92. data/spec/dummy/tmp/cache/assets/CBA/680/sprockets%2F912d84e091e5f2190b1ab7926de19679 +0 -0
  93. data/spec/dummy/tmp/cache/assets/CC7/430/sprockets%2F48e99a3e16ba3e65749e009d82546f94 +0 -0
  94. data/spec/dummy/tmp/cache/assets/CD8/370/sprockets%2F357970feca3ac29060c1e3861e2c0953 +0 -0
  95. data/spec/dummy/tmp/cache/assets/CDB/8A0/sprockets%2Faed2a2575c376263c26e93b56b57051d +0 -0
  96. data/spec/dummy/tmp/cache/assets/CF1/E80/sprockets%2F7735295e1e3085f2e1dc29d59a45e8e6 +0 -0
  97. data/spec/dummy/tmp/cache/assets/D0F/E60/sprockets%2F1123d9a479fdf5c2b8415087e2a43ec6 +0 -0
  98. data/spec/dummy/tmp/cache/assets/D1F/A10/sprockets%2F60317e62cb324bfd9987e8da9636fd06 +0 -0
  99. data/spec/dummy/tmp/cache/assets/D25/E20/sprockets%2F29ba1a4a2b611731334f54abb9e5b5d1 +0 -0
  100. data/spec/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
  101. data/spec/dummy/tmp/cache/assets/D35/760/sprockets%2F49e26620c5c743ac4cdab7703f54db06 +0 -0
  102. data/spec/dummy/tmp/cache/assets/D49/870/sprockets%2F90896142645585acc8baf56ad57e3afb +0 -0
  103. data/spec/dummy/tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655 +0 -0
  104. data/spec/dummy/tmp/cache/assets/D5A/EA0/sprockets%2Fd771ace226fc8215a3572e0aa35bb0d6 +0 -0
  105. data/spec/dummy/tmp/cache/assets/D62/F00/sprockets%2F6ac03a007f26b1c18ed3d53498ad3eb8 +0 -0
  106. data/spec/dummy/tmp/cache/assets/D79/BC0/sprockets%2F85a1db977361cc5130fcefb4637ff67e +0 -0
  107. data/spec/dummy/tmp/cache/assets/D87/1F0/sprockets%2F61c9ceafb877fb740c67416ff6f782a9 +0 -0
  108. data/spec/dummy/tmp/cache/assets/DA8/900/sprockets%2Fde7a2b3987b89b9d9afb268ce4204a4a +0 -0
  109. data/spec/dummy/tmp/cache/assets/DAD/4F0/sprockets%2F765acd1bf68dc90f7d3e61da78b1e659 +0 -0
  110. data/spec/dummy/tmp/cache/assets/DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994 +0 -0
  111. data/spec/dummy/tmp/cache/assets/E03/3F0/sprockets%2F82b37ae9eccec44c1ef44cfdd07d8534 +0 -0
  112. data/spec/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +0 -0
  113. data/spec/dummy/tmp/cache/assets/E0A/CA0/sprockets%2F7fe72ac1c0db1a7e8e7f59cf25e8a39e +0 -0
  114. data/spec/dummy/tmp/cache/assets/E20/9B0/sprockets%2F2fa6cd86b1af7bda41f5b7921cdadf10 +0 -0
  115. data/spec/dummy/tmp/cache/assets/E3A/A60/sprockets%2F7c72c96cfc66454caf5fc8ca0fedd4f3 +0 -0
  116. data/spec/dummy/tmp/cache/assets/E54/400/sprockets%2Fd0cbc16cc37efcf9dc41f242b5dbbf81 +0 -0
  117. data/spec/dummy/tmp/cache/assets/EB7/AB0/sprockets%2F801d29a5debdbfbfb4eef14d70d9bcdb +0 -0
  118. data/spec/dummy/tmp/cache/assets/F48/5E0/sprockets%2F26cd6ffcffbebbe2fd6cd1a8f0c2debc +0 -0
  119. data/spec/form/nested_spec.rb +75 -61
  120. data/spec/form/property_spec.rb +167 -14
  121. data/spec/form/validation_spec.rb +46 -23
  122. data/spec/javascript_spec.rb +60 -0
  123. data/spec/persistence_spec.rb +608 -0
  124. data/spec/spec_helper.rb +18 -2
  125. data/vendor/assets/javascripts/jquery_freeform.js +120 -0
  126. data/vendor/assets/javascripts/jquery_nested_form.js +0 -0
  127. data/vendor/assets/javascripts/prototype_freeform.js +69 -0
  128. data/vendor/assets/javascripts/prototype_nested_form.js +0 -0
  129. metadata +341 -3
@@ -0,0 +1,120 @@
1
+ (function($) {
2
+ window.NestedFormEvents = function() {
3
+ this.addFields = $.proxy(this.addFields, this);
4
+ this.removeFields = $.proxy(this.removeFields, this);
5
+ };
6
+
7
+ NestedFormEvents.prototype = {
8
+ addFields: function(e) {
9
+ // Setup
10
+ var link = e.currentTarget;
11
+ var assoc = $(link).data('association'); // Name of child
12
+ var blueprint = $('#' + $(link).data('blueprint-id'));
13
+ var content = blueprint.data('blueprint'); // Fields template
14
+
15
+ // Make the context correct by replacing <parents> with the generated ID
16
+ // of each of the parent objects
17
+ var context = ($(link).closest('.fields').closestChild('input, textarea, select').eq(0).attr('name') || '').replace(/\[[a-z_]+\]$/, '');
18
+
19
+ // If the parent has no inputs we need to strip off the last pair
20
+ var current = content.match(new RegExp('\\[([a-z_]+)\\]\\[new_' + assoc + '\\]'));
21
+ if (current) {
22
+ context = context.replace(new RegExp('\\[' + current[1] + '\\]\\[(new_)?\\d+\\]$'), '');
23
+ }
24
+
25
+ // context will be something like this for a brand new form:
26
+ // project[tasks_attributes][1255929127459][assignments_attributes][1255929128105]
27
+ // or for an edit form:
28
+ // project[tasks_attributes][0][assignments_attributes][1]
29
+ if (context) {
30
+ var parentNames = context.match(/[a-z_]+_attributes(?=\]\[(new_)?\d+\])/g) || [];
31
+ var parentIds = context.match(/[0-9]+/g) || [];
32
+
33
+ for(var i = 0; i < parentNames.length; i++) {
34
+ if(parentIds[i]) {
35
+ content = content.replace(
36
+ new RegExp('(_' + parentNames[i] + ')_.+?_', 'g'),
37
+ '$1_' + parentIds[i] + '_');
38
+
39
+ content = content.replace(
40
+ new RegExp('(\\[' + parentNames[i] + '\\])\\[.+?\\]', 'g'),
41
+ '$1[' + parentIds[i] + ']');
42
+ }
43
+ }
44
+ }
45
+
46
+ // Make a unique ID for the new child
47
+ var regexp = new RegExp('new_' + assoc, 'g');
48
+ var new_id = this.newId();
49
+ content = $.trim(content.replace(regexp, new_id));
50
+
51
+ var field = this.insertFields(content, assoc, link);
52
+ // bubble up event upto document (through form)
53
+ field
54
+ .trigger({ type: 'nested:fieldAdded', field: field })
55
+ .trigger({ type: 'nested:fieldAdded:' + assoc, field: field });
56
+ return false;
57
+ },
58
+ newId: function() {
59
+ return new Date().getTime();
60
+ },
61
+ insertFields: function(content, assoc, link) {
62
+ var target = $(link).data('target');
63
+ if (target) {
64
+ return $(content).appendTo($(target));
65
+ } else {
66
+ return $(content).insertBefore(link);
67
+ }
68
+ },
69
+ removeFields: function(e) {
70
+ var $link = $(e.currentTarget),
71
+ assoc = $link.data('association'); // Name of child to be removed
72
+
73
+ var hiddenField = $link.prev('input[type=hidden]');
74
+ hiddenField.val('1');
75
+
76
+ var field = $link.closest('.fields');
77
+ field.hide();
78
+
79
+ field
80
+ .trigger({ type: 'nested:fieldRemoved', field: field })
81
+ .trigger({ type: 'nested:fieldRemoved:' + assoc, field: field });
82
+ return false;
83
+ }
84
+ };
85
+
86
+ window.nestedFormEvents = new NestedFormEvents();
87
+ $(document)
88
+ .delegate('form a.add_nested_form', 'click', nestedFormEvents.addFields)
89
+ .delegate('form a.remove_nested_form', 'click', nestedFormEvents.removeFields);
90
+ })(jQuery);
91
+
92
+ // http://plugins.jquery.com/project/closestChild
93
+ /*
94
+ * Copyright 2011, Tobias Lindig
95
+ *
96
+ * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
97
+ * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
98
+ *
99
+ */
100
+ (function($) {
101
+ $.fn.closestChild = function(selector) {
102
+ // breadth first search for the first matched node
103
+ if (selector && selector != '') {
104
+ var queue = [];
105
+ queue.push(this);
106
+ while(queue.length > 0) {
107
+ var node = queue.shift();
108
+ var children = node.children();
109
+ for(var i = 0; i < children.length; ++i) {
110
+ var child = $(children[i]);
111
+ if (child.is(selector)) {
112
+ return child; //well, we found one
113
+ }
114
+ queue.push(child);
115
+ }
116
+ }
117
+ }
118
+ return $();//nothing found
119
+ };
120
+ })(jQuery);
File without changes
@@ -0,0 +1,69 @@
1
+ document.observe('click', function(e, el) {
2
+ if (el = e.findElement('form a.add_nested_form')) {
3
+ // Setup
4
+ var assoc = el.readAttribute('data-association'); // Name of child
5
+ var target = el.readAttribute('data-target');
6
+ var blueprint = $(el.readAttribute('data-blueprint-id'));
7
+ var content = blueprint.readAttribute('data-blueprint'); // Fields template
8
+
9
+ // Make the context correct by replacing <parents> with the generated ID
10
+ // of each of the parent objects
11
+ var context = (el.getOffsetParent('.fields').firstDescendant().readAttribute('name') || '').replace(/\[[a-z_]+\]$/, '');
12
+
13
+ // If the parent has no inputs we need to strip off the last pair
14
+ var current = content.match(new RegExp('\\[([a-z_]+)\\]\\[new_' + assoc + '\\]'));
15
+ if (current) {
16
+ context = context.replace(new RegExp('\\[' + current[1] + '\\]\\[(new_)?\\d+\\]$'), '');
17
+ }
18
+
19
+ // context will be something like this for a brand new form:
20
+ // project[tasks_attributes][1255929127459][assignments_attributes][1255929128105]
21
+ // or for an edit form:
22
+ // project[tasks_attributes][0][assignments_attributes][1]
23
+ if(context) {
24
+ var parent_names = context.match(/[a-z_]+_attributes(?=\]\[(new_)?\d+\])/g) || [];
25
+ var parent_ids = context.match(/[0-9]+/g) || [];
26
+
27
+ for(i = 0; i < parent_names.length; i++) {
28
+ if(parent_ids[i]) {
29
+ content = content.replace(
30
+ new RegExp('(_' + parent_names[i] + ')_.+?_', 'g'),
31
+ '$1_' + parent_ids[i] + '_');
32
+
33
+ content = content.replace(
34
+ new RegExp('(\\[' + parent_names[i] + '\\])\\[.+?\\]', 'g'),
35
+ '$1[' + parent_ids[i] + ']');
36
+ }
37
+ }
38
+ }
39
+
40
+ // Make a unique ID for the new child
41
+ var regexp = new RegExp('new_' + assoc, 'g');
42
+ var new_id = new Date().getTime();
43
+ content = content.replace(regexp, new_id);
44
+
45
+ var field;
46
+ if (target) {
47
+ field = $$(target)[0].insert(content);
48
+ } else {
49
+ field = el.insert({ before: content });
50
+ }
51
+ field.fire('nested:fieldAdded', {field: field});
52
+ field.fire('nested:fieldAdded:' + assoc, {field: field});
53
+ return false;
54
+ }
55
+ });
56
+
57
+ document.observe('click', function(e, el) {
58
+ if (el = e.findElement('form a.remove_nested_form')) {
59
+ var hidden_field = el.previous(0),
60
+ assoc = el.readAttribute('data-association'); // Name of child to be removed
61
+ if(hidden_field) {
62
+ hidden_field.value = '1';
63
+ }
64
+ var field = el.up('.fields').hide();
65
+ field.fire('nested:fieldRemoved', {field: field});
66
+ field.fire('nested:fieldRemoved:' + assoc, {field: field});
67
+ return false;
68
+ }
69
+ });
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: freeform
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 1.0.0
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: 2013-11-15 00:00:00.000000000 Z
12
+ date: 2014-01-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activemodel
@@ -27,6 +27,70 @@ dependencies:
27
27
  - - ! '>='
28
28
  - !ruby/object:Gem::Version
29
29
  version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: simple_form
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: formtastic
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: nested_form
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: 0.3.2
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: 0.3.2
78
+ - !ruby/object:Gem::Dependency
79
+ name: rails
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ~>
84
+ - !ruby/object:Gem::Version
85
+ version: 3.2.0
86
+ type: :runtime
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ version: 3.2.0
30
94
  - !ruby/object:Gem::Dependency
31
95
  name: bundler
32
96
  requirement: !ruby/object:Gem::Requirement
@@ -59,6 +123,22 @@ dependencies:
59
123
  - - ! '>='
60
124
  - !ruby/object:Gem::Version
61
125
  version: '0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: sqlite3
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ! '>='
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
62
142
  - !ruby/object:Gem::Dependency
63
143
  name: rspec
64
144
  requirement: !ruby/object:Gem::Requirement
@@ -75,6 +155,54 @@ dependencies:
75
155
  - - ! '>='
76
156
  - !ruby/object:Gem::Version
77
157
  version: '0'
158
+ - !ruby/object:Gem::Dependency
159
+ name: rspec-rails
160
+ requirement: !ruby/object:Gem::Requirement
161
+ none: false
162
+ requirements:
163
+ - - ~>
164
+ - !ruby/object:Gem::Version
165
+ version: '2.6'
166
+ type: :development
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ none: false
170
+ requirements:
171
+ - - ~>
172
+ - !ruby/object:Gem::Version
173
+ version: '2.6'
174
+ - !ruby/object:Gem::Dependency
175
+ name: mocha
176
+ requirement: !ruby/object:Gem::Requirement
177
+ none: false
178
+ requirements:
179
+ - - ! '>='
180
+ - !ruby/object:Gem::Version
181
+ version: '0'
182
+ type: :development
183
+ prerelease: false
184
+ version_requirements: !ruby/object:Gem::Requirement
185
+ none: false
186
+ requirements:
187
+ - - ! '>='
188
+ - !ruby/object:Gem::Version
189
+ version: '0'
190
+ - !ruby/object:Gem::Dependency
191
+ name: capybara
192
+ requirement: !ruby/object:Gem::Requirement
193
+ none: false
194
+ requirements:
195
+ - - ~>
196
+ - !ruby/object:Gem::Version
197
+ version: '1.1'
198
+ type: :development
199
+ prerelease: false
200
+ version_requirements: !ruby/object:Gem::Requirement
201
+ none: false
202
+ requirements:
203
+ - - ~>
204
+ - !ruby/object:Gem::Version
205
+ version: '1.1'
78
206
  description: Decouple your forms from your domain models
79
207
  email:
80
208
  - bryce.senz@gmail.com
@@ -86,23 +214,134 @@ files:
86
214
  - .project
87
215
  - .rspec
88
216
  - Gemfile
217
+ - Gemfile.lock
89
218
  - LICENSE.txt
219
+ - MIT-LICENSE
90
220
  - README.md
91
221
  - Rakefile
92
222
  - freeform.gemspec
93
223
  - lib/freeform.rb
224
+ - lib/freeform/builder/builder_mixin.rb
225
+ - lib/freeform/builder/builders.rb
226
+ - lib/freeform/builder/engine.rb
227
+ - lib/freeform/builder/view_helper.rb
94
228
  - lib/freeform/form.rb
95
229
  - lib/freeform/form/form_input_key.rb
96
230
  - lib/freeform/form/nested.rb
97
231
  - lib/freeform/form/property.rb
98
232
  - lib/freeform/form/validation.rb
99
233
  - lib/freeform/version.rb
234
+ - lib/generators/freeform/install_generator.rb
235
+ - lib/tasks/freeform_tasks.rake
100
236
  - spec/acceptance_spec.rb
237
+ - spec/builder/builder_spec.rb
238
+ - spec/builder/view_helper_spec.rb
239
+ - spec/dummy/README.rdoc
240
+ - spec/dummy/Rakefile
241
+ - spec/dummy/app/assets/images/.keep
242
+ - spec/dummy/app/assets/javascripts/application.js
243
+ - spec/dummy/app/assets/javascripts/jquery.js
244
+ - spec/dummy/app/assets/javascripts/jquery_events_test.js
245
+ - spec/dummy/app/assets/javascripts/projects.js
246
+ - spec/dummy/app/assets/javascripts/prototype.js
247
+ - spec/dummy/app/assets/javascripts/prototype_events_test.js
248
+ - spec/dummy/app/assets/stylesheets/application.css
249
+ - spec/dummy/app/assets/stylesheets/companies.css
250
+ - spec/dummy/app/assets/stylesheets/projects.css
251
+ - spec/dummy/app/controllers/application_controller.rb
252
+ - spec/dummy/app/controllers/companies_controller.rb
253
+ - spec/dummy/app/controllers/projects_controller.rb
254
+ - spec/dummy/app/forms/milestone_form.rb
255
+ - spec/dummy/app/forms/project_form.rb
256
+ - spec/dummy/app/forms/task_form.rb
257
+ - spec/dummy/app/helpers/application_helper.rb
258
+ - spec/dummy/app/mailers/.keep
259
+ - spec/dummy/app/models/.keep
260
+ - spec/dummy/app/models/company.rb
261
+ - spec/dummy/app/models/milestone.rb
262
+ - spec/dummy/app/models/project.rb
263
+ - spec/dummy/app/models/project_task.rb
264
+ - spec/dummy/app/models/task.rb
265
+ - spec/dummy/app/views/companies/new.html.erb
266
+ - spec/dummy/app/views/layouts/application.html.erb
267
+ - spec/dummy/app/views/projects/new.html.erb
268
+ - spec/dummy/app/views/projects/without_intermediate_inputs.html.erb
269
+ - spec/dummy/bin/bundle
270
+ - spec/dummy/bin/rails
271
+ - spec/dummy/bin/rake
272
+ - spec/dummy/config.ru
273
+ - spec/dummy/config/application.rb
274
+ - spec/dummy/config/boot.rb
275
+ - spec/dummy/config/database.yml
276
+ - spec/dummy/config/environment.rb
277
+ - spec/dummy/config/environments/development.rb
278
+ - spec/dummy/config/environments/production.rb
279
+ - spec/dummy/config/environments/test.rb
280
+ - spec/dummy/config/initializers/backtrace_silencers.rb
281
+ - spec/dummy/config/initializers/filter_parameter_logging.rb
282
+ - spec/dummy/config/initializers/inflections.rb
283
+ - spec/dummy/config/initializers/mime_types.rb
284
+ - spec/dummy/config/initializers/secret_token.rb
285
+ - spec/dummy/config/initializers/session_store.rb
286
+ - spec/dummy/config/initializers/wrap_parameters.rb
287
+ - spec/dummy/config/locales/en.yml
288
+ - spec/dummy/config/routes.rb
289
+ - spec/dummy/db/migrate/20110710143903_initial_tables.rb
290
+ - spec/dummy/db/schema.rb
291
+ - spec/dummy/db/test.sqlite3
292
+ - spec/dummy/lib/assets/.keep
293
+ - spec/dummy/log/.keep
294
+ - spec/dummy/log/development.log
295
+ - spec/dummy/log/test.log
296
+ - spec/dummy/public/404.html
297
+ - spec/dummy/public/422.html
298
+ - spec/dummy/public/500.html
299
+ - spec/dummy/public/favicon.ico
300
+ - spec/dummy/tmp/cache/assets/C54/850/sprockets%2Fd484f47085686f151320ff7248bb5105
301
+ - spec/dummy/tmp/cache/assets/C76/160/sprockets%2F49c594d143212b346d11f1ecf9358103
302
+ - spec/dummy/tmp/cache/assets/C99/4D0/sprockets%2F5e30a6b911437f1428dc32c3ae182123
303
+ - spec/dummy/tmp/cache/assets/C99/7D0/sprockets%2F79513e6956e0ee8624976e041fd5636d
304
+ - spec/dummy/tmp/cache/assets/CAA/C90/sprockets%2F1e6c8ee1258009385ccf5b84015424b3
305
+ - spec/dummy/tmp/cache/assets/CB2/CB0/sprockets%2F11cc8d161d71a716dd36f16849d90870
306
+ - spec/dummy/tmp/cache/assets/CB7/7F0/sprockets%2Fac97b043470f6fcc925c352f16956643
307
+ - spec/dummy/tmp/cache/assets/CBA/680/sprockets%2F912d84e091e5f2190b1ab7926de19679
308
+ - spec/dummy/tmp/cache/assets/CC7/430/sprockets%2F48e99a3e16ba3e65749e009d82546f94
309
+ - spec/dummy/tmp/cache/assets/CD8/370/sprockets%2F357970feca3ac29060c1e3861e2c0953
310
+ - spec/dummy/tmp/cache/assets/CDB/8A0/sprockets%2Faed2a2575c376263c26e93b56b57051d
311
+ - spec/dummy/tmp/cache/assets/CF1/E80/sprockets%2F7735295e1e3085f2e1dc29d59a45e8e6
312
+ - spec/dummy/tmp/cache/assets/D0F/E60/sprockets%2F1123d9a479fdf5c2b8415087e2a43ec6
313
+ - spec/dummy/tmp/cache/assets/D1F/A10/sprockets%2F60317e62cb324bfd9987e8da9636fd06
314
+ - spec/dummy/tmp/cache/assets/D25/E20/sprockets%2F29ba1a4a2b611731334f54abb9e5b5d1
315
+ - spec/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705
316
+ - spec/dummy/tmp/cache/assets/D35/760/sprockets%2F49e26620c5c743ac4cdab7703f54db06
317
+ - spec/dummy/tmp/cache/assets/D49/870/sprockets%2F90896142645585acc8baf56ad57e3afb
318
+ - spec/dummy/tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655
319
+ - spec/dummy/tmp/cache/assets/D5A/EA0/sprockets%2Fd771ace226fc8215a3572e0aa35bb0d6
320
+ - spec/dummy/tmp/cache/assets/D62/F00/sprockets%2F6ac03a007f26b1c18ed3d53498ad3eb8
321
+ - spec/dummy/tmp/cache/assets/D79/BC0/sprockets%2F85a1db977361cc5130fcefb4637ff67e
322
+ - spec/dummy/tmp/cache/assets/D87/1F0/sprockets%2F61c9ceafb877fb740c67416ff6f782a9
323
+ - spec/dummy/tmp/cache/assets/DA8/900/sprockets%2Fde7a2b3987b89b9d9afb268ce4204a4a
324
+ - spec/dummy/tmp/cache/assets/DAD/4F0/sprockets%2F765acd1bf68dc90f7d3e61da78b1e659
325
+ - spec/dummy/tmp/cache/assets/DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994
326
+ - spec/dummy/tmp/cache/assets/E03/3F0/sprockets%2F82b37ae9eccec44c1ef44cfdd07d8534
327
+ - spec/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af
328
+ - spec/dummy/tmp/cache/assets/E0A/CA0/sprockets%2F7fe72ac1c0db1a7e8e7f59cf25e8a39e
329
+ - spec/dummy/tmp/cache/assets/E20/9B0/sprockets%2F2fa6cd86b1af7bda41f5b7921cdadf10
330
+ - spec/dummy/tmp/cache/assets/E3A/A60/sprockets%2F7c72c96cfc66454caf5fc8ca0fedd4f3
331
+ - spec/dummy/tmp/cache/assets/E54/400/sprockets%2Fd0cbc16cc37efcf9dc41f242b5dbbf81
332
+ - spec/dummy/tmp/cache/assets/EB7/AB0/sprockets%2F801d29a5debdbfbfb4eef14d70d9bcdb
333
+ - spec/dummy/tmp/cache/assets/F48/5E0/sprockets%2F26cd6ffcffbebbe2fd6cd1a8f0c2debc
101
334
  - spec/form/form_input_key_spec.rb
102
335
  - spec/form/nested_spec.rb
103
336
  - spec/form/property_spec.rb
104
337
  - spec/form/validation_spec.rb
338
+ - spec/javascript_spec.rb
339
+ - spec/persistence_spec.rb
105
340
  - spec/spec_helper.rb
341
+ - vendor/assets/javascripts/jquery_freeform.js
342
+ - vendor/assets/javascripts/jquery_nested_form.js
343
+ - vendor/assets/javascripts/prototype_freeform.js
344
+ - vendor/assets/javascripts/prototype_nested_form.js
106
345
  homepage: https://github.com/brycesenz/freeform
107
346
  licenses:
108
347
  - MIT
@@ -128,11 +367,110 @@ rubygems_version: 1.8.25
128
367
  signing_key:
129
368
  specification_version: 3
130
369
  summary: FreeForm lets you compose forms however you like, explicitly guiding how
131
- each field maps back to your domain models. No more accepting nested attributes!
370
+ each field maps back to your domain models. No more accepting nested attributes!
132
371
  test_files:
133
372
  - spec/acceptance_spec.rb
373
+ - spec/builder/builder_spec.rb
374
+ - spec/builder/view_helper_spec.rb
375
+ - spec/dummy/README.rdoc
376
+ - spec/dummy/Rakefile
377
+ - spec/dummy/app/assets/images/.keep
378
+ - spec/dummy/app/assets/javascripts/application.js
379
+ - spec/dummy/app/assets/javascripts/jquery.js
380
+ - spec/dummy/app/assets/javascripts/jquery_events_test.js
381
+ - spec/dummy/app/assets/javascripts/projects.js
382
+ - spec/dummy/app/assets/javascripts/prototype.js
383
+ - spec/dummy/app/assets/javascripts/prototype_events_test.js
384
+ - spec/dummy/app/assets/stylesheets/application.css
385
+ - spec/dummy/app/assets/stylesheets/companies.css
386
+ - spec/dummy/app/assets/stylesheets/projects.css
387
+ - spec/dummy/app/controllers/application_controller.rb
388
+ - spec/dummy/app/controllers/companies_controller.rb
389
+ - spec/dummy/app/controllers/projects_controller.rb
390
+ - spec/dummy/app/forms/milestone_form.rb
391
+ - spec/dummy/app/forms/project_form.rb
392
+ - spec/dummy/app/forms/task_form.rb
393
+ - spec/dummy/app/helpers/application_helper.rb
394
+ - spec/dummy/app/mailers/.keep
395
+ - spec/dummy/app/models/.keep
396
+ - spec/dummy/app/models/company.rb
397
+ - spec/dummy/app/models/milestone.rb
398
+ - spec/dummy/app/models/project.rb
399
+ - spec/dummy/app/models/project_task.rb
400
+ - spec/dummy/app/models/task.rb
401
+ - spec/dummy/app/views/companies/new.html.erb
402
+ - spec/dummy/app/views/layouts/application.html.erb
403
+ - spec/dummy/app/views/projects/new.html.erb
404
+ - spec/dummy/app/views/projects/without_intermediate_inputs.html.erb
405
+ - spec/dummy/bin/bundle
406
+ - spec/dummy/bin/rails
407
+ - spec/dummy/bin/rake
408
+ - spec/dummy/config.ru
409
+ - spec/dummy/config/application.rb
410
+ - spec/dummy/config/boot.rb
411
+ - spec/dummy/config/database.yml
412
+ - spec/dummy/config/environment.rb
413
+ - spec/dummy/config/environments/development.rb
414
+ - spec/dummy/config/environments/production.rb
415
+ - spec/dummy/config/environments/test.rb
416
+ - spec/dummy/config/initializers/backtrace_silencers.rb
417
+ - spec/dummy/config/initializers/filter_parameter_logging.rb
418
+ - spec/dummy/config/initializers/inflections.rb
419
+ - spec/dummy/config/initializers/mime_types.rb
420
+ - spec/dummy/config/initializers/secret_token.rb
421
+ - spec/dummy/config/initializers/session_store.rb
422
+ - spec/dummy/config/initializers/wrap_parameters.rb
423
+ - spec/dummy/config/locales/en.yml
424
+ - spec/dummy/config/routes.rb
425
+ - spec/dummy/db/migrate/20110710143903_initial_tables.rb
426
+ - spec/dummy/db/schema.rb
427
+ - spec/dummy/db/test.sqlite3
428
+ - spec/dummy/lib/assets/.keep
429
+ - spec/dummy/log/.keep
430
+ - spec/dummy/log/development.log
431
+ - spec/dummy/log/test.log
432
+ - spec/dummy/public/404.html
433
+ - spec/dummy/public/422.html
434
+ - spec/dummy/public/500.html
435
+ - spec/dummy/public/favicon.ico
436
+ - spec/dummy/tmp/cache/assets/C54/850/sprockets%2Fd484f47085686f151320ff7248bb5105
437
+ - spec/dummy/tmp/cache/assets/C76/160/sprockets%2F49c594d143212b346d11f1ecf9358103
438
+ - spec/dummy/tmp/cache/assets/C99/4D0/sprockets%2F5e30a6b911437f1428dc32c3ae182123
439
+ - spec/dummy/tmp/cache/assets/C99/7D0/sprockets%2F79513e6956e0ee8624976e041fd5636d
440
+ - spec/dummy/tmp/cache/assets/CAA/C90/sprockets%2F1e6c8ee1258009385ccf5b84015424b3
441
+ - spec/dummy/tmp/cache/assets/CB2/CB0/sprockets%2F11cc8d161d71a716dd36f16849d90870
442
+ - spec/dummy/tmp/cache/assets/CB7/7F0/sprockets%2Fac97b043470f6fcc925c352f16956643
443
+ - spec/dummy/tmp/cache/assets/CBA/680/sprockets%2F912d84e091e5f2190b1ab7926de19679
444
+ - spec/dummy/tmp/cache/assets/CC7/430/sprockets%2F48e99a3e16ba3e65749e009d82546f94
445
+ - spec/dummy/tmp/cache/assets/CD8/370/sprockets%2F357970feca3ac29060c1e3861e2c0953
446
+ - spec/dummy/tmp/cache/assets/CDB/8A0/sprockets%2Faed2a2575c376263c26e93b56b57051d
447
+ - spec/dummy/tmp/cache/assets/CF1/E80/sprockets%2F7735295e1e3085f2e1dc29d59a45e8e6
448
+ - spec/dummy/tmp/cache/assets/D0F/E60/sprockets%2F1123d9a479fdf5c2b8415087e2a43ec6
449
+ - spec/dummy/tmp/cache/assets/D1F/A10/sprockets%2F60317e62cb324bfd9987e8da9636fd06
450
+ - spec/dummy/tmp/cache/assets/D25/E20/sprockets%2F29ba1a4a2b611731334f54abb9e5b5d1
451
+ - spec/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705
452
+ - spec/dummy/tmp/cache/assets/D35/760/sprockets%2F49e26620c5c743ac4cdab7703f54db06
453
+ - spec/dummy/tmp/cache/assets/D49/870/sprockets%2F90896142645585acc8baf56ad57e3afb
454
+ - spec/dummy/tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655
455
+ - spec/dummy/tmp/cache/assets/D5A/EA0/sprockets%2Fd771ace226fc8215a3572e0aa35bb0d6
456
+ - spec/dummy/tmp/cache/assets/D62/F00/sprockets%2F6ac03a007f26b1c18ed3d53498ad3eb8
457
+ - spec/dummy/tmp/cache/assets/D79/BC0/sprockets%2F85a1db977361cc5130fcefb4637ff67e
458
+ - spec/dummy/tmp/cache/assets/D87/1F0/sprockets%2F61c9ceafb877fb740c67416ff6f782a9
459
+ - spec/dummy/tmp/cache/assets/DA8/900/sprockets%2Fde7a2b3987b89b9d9afb268ce4204a4a
460
+ - spec/dummy/tmp/cache/assets/DAD/4F0/sprockets%2F765acd1bf68dc90f7d3e61da78b1e659
461
+ - spec/dummy/tmp/cache/assets/DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994
462
+ - spec/dummy/tmp/cache/assets/E03/3F0/sprockets%2F82b37ae9eccec44c1ef44cfdd07d8534
463
+ - spec/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af
464
+ - spec/dummy/tmp/cache/assets/E0A/CA0/sprockets%2F7fe72ac1c0db1a7e8e7f59cf25e8a39e
465
+ - spec/dummy/tmp/cache/assets/E20/9B0/sprockets%2F2fa6cd86b1af7bda41f5b7921cdadf10
466
+ - spec/dummy/tmp/cache/assets/E3A/A60/sprockets%2F7c72c96cfc66454caf5fc8ca0fedd4f3
467
+ - spec/dummy/tmp/cache/assets/E54/400/sprockets%2Fd0cbc16cc37efcf9dc41f242b5dbbf81
468
+ - spec/dummy/tmp/cache/assets/EB7/AB0/sprockets%2F801d29a5debdbfbfb4eef14d70d9bcdb
469
+ - spec/dummy/tmp/cache/assets/F48/5E0/sprockets%2F26cd6ffcffbebbe2fd6cd1a8f0c2debc
134
470
  - spec/form/form_input_key_spec.rb
135
471
  - spec/form/nested_spec.rb
136
472
  - spec/form/property_spec.rb
137
473
  - spec/form/validation_spec.rb
474
+ - spec/javascript_spec.rb
475
+ - spec/persistence_spec.rb
138
476
  - spec/spec_helper.rb