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