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
@@ -1,7 +1,4 @@
1
1
  require 'spec_helper'
2
- require 'freeform/form/property'
3
- require 'freeform/form/nested'
4
- require 'freeform/form/validation'
5
2
 
6
3
  describe FreeForm::Validation do
7
4
  let(:user) do
@@ -35,24 +32,39 @@ describe FreeForm::Validation do
35
32
 
36
33
  describe "validation", :validation => true do
37
34
  context "without model validation", :no_model_validation => true do
38
- let(:form_class) do
35
+ let!(:nested_class) do
39
36
  klass = Class.new(Module) do
40
37
  include ActiveModel::Validations
41
38
  include FreeForm::Property
42
39
  include FreeForm::Nested
43
40
  include FreeForm::Validation
41
+ declared_model :address
42
+ property :street, :on => :address
44
43
 
44
+ def initialize(h={})
45
+ h.each {|k,v| send("#{k}=",v)}
46
+ end
47
+ end
48
+ # This wrapper just avoids CONST warnings
49
+ v, $VERBOSE = $VERBOSE, nil
50
+ Module.const_set("AddressForm", klass)
51
+ $VERBOSE = v
52
+ klass
53
+ end
54
+
55
+ let(:form_class) do
56
+ klass = Class.new(Module) do
57
+ include ActiveModel::Validations
58
+ include FreeForm::Property
59
+ include FreeForm::Nested
60
+ include FreeForm::Validation
45
61
  form_model :user
46
62
  property :username, :on => :user
47
63
  validates :username, :presence => true
48
64
 
49
- nested_form :addresses, :class_initializer => :address_initializer do
50
- declared_model :address
51
-
52
- property :street, :on => :address
53
- end
65
+ nested_form :addresses, :class => Module::AddressForm, :default_initializer => :address_initializer
54
66
 
55
- def self.address_initializer
67
+ def address_initializer
56
68
  {:address => OpenStruct.new}
57
69
  end
58
70
 
@@ -89,32 +101,43 @@ describe FreeForm::Validation do
89
101
  end
90
102
 
91
103
  context "with model validation", :model_validation => true do
92
- let(:form_class) do
104
+ let!(:nested_class) do
93
105
  klass = Class.new(Module) do
94
106
  include ActiveModel::Validations
95
107
  include FreeForm::Property
96
108
  include FreeForm::Nested
97
109
  include FreeForm::Validation
110
+ declared_model :address
98
111
  validate_models
112
+ property :street, :on => :address
99
113
 
114
+ def initialize(h={})
115
+ h.each {|k,v| send("#{k}=",v)}
116
+ end
117
+ end
118
+ # This wrapper just avoids CONST warnings
119
+ v, $VERBOSE = $VERBOSE, nil
120
+ Module.const_set("AddressForm", klass)
121
+ $VERBOSE = v
122
+ klass
123
+ end
124
+
125
+ let(:form_class) do
126
+ klass = Class.new(Module) do
127
+ include ActiveModel::Validations
128
+ include FreeForm::Property
129
+ include FreeForm::Nested
130
+ include FreeForm::Validation
100
131
  form_model :user
132
+ validate_models
101
133
  property :username, :on => :user
102
134
  property :form_property
135
+
103
136
  validates :form_property, :presence => true
104
137
 
105
- nested_form :addresses, :class_initializer => :address_initializer do
106
- include ActiveModel::Validations
107
- include FreeForm::Property
108
- include FreeForm::Nested
109
- include FreeForm::Validation
110
- validate_models
111
- declared_model :address
112
-
113
- property :street, :on => :address
114
- property :city, :on => :address
115
- end
138
+ nested_form :addresses, :class => Module::AddressForm, :default_initializer => :address_initializer
116
139
 
117
- def self.address_initializer
140
+ def address_initializer
118
141
  {:address => OpenStruct.new}
119
142
  end
120
143
 
@@ -0,0 +1,60 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'JavaScript Behavior', :js => true do
4
+ include Capybara::DSL
5
+
6
+ [:jquery, :prototype].each do |js_framework|
7
+
8
+ url = case js_framework
9
+ when :jquery then '/projects/new'
10
+ when :prototype then '/projects/new?type=prototype'
11
+ end
12
+
13
+ context "with #{js_framework}" do
14
+ context 'when field was added' do
15
+ it 'emits general add event' do
16
+ visit url
17
+ click_link 'Add new task'
18
+
19
+ page.should have_content 'Added some field'
20
+ end
21
+
22
+ it 'emits add event for current association' do
23
+ visit url
24
+ click_link 'Add new task'
25
+
26
+ page.should have_content 'Added task field'
27
+ page.should_not have_content 'Added milestone field'
28
+
29
+ click_link 'Add new milestone'
30
+
31
+ page.should have_content 'Added milestone field'
32
+ end
33
+ end
34
+
35
+ context 'when field was removed' do
36
+ it 'emits general remove event' do
37
+ visit url
38
+ click_link 'Add new task'
39
+ click_link 'Remove'
40
+
41
+ page.should have_content 'Removed some field'
42
+ end
43
+
44
+ it 'emits remove event for current association' do
45
+ visit url
46
+ 2.times { click_link 'Add new task' }
47
+ click_link 'Remove'
48
+
49
+ page.should have_content 'Removed task field'
50
+ page.should_not have_content 'Removed milestone field'
51
+
52
+ click_link 'Add new milestone'
53
+ click_link 'Remove milestone'
54
+
55
+ page.should have_content 'Removed milestone field'
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end