freeform 0.0.4 → 1.0.0

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