freeform 0.0.4 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +8 -17
- data/Gemfile +1 -1
- data/Gemfile.lock +150 -0
- data/MIT-LICENSE +20 -0
- data/README.md +31 -43
- data/Rakefile +32 -1
- data/freeform.gemspec +22 -15
- data/lib/freeform/builder/builder_mixin.rb +111 -0
- data/lib/freeform/builder/builders.rb +32 -0
- data/lib/freeform/builder/engine.rb +14 -0
- data/lib/freeform/builder/view_helper.rb +56 -0
- data/lib/freeform/form/form_input_key.rb +1 -1
- data/lib/freeform/form/nested.rb +17 -55
- data/lib/freeform/form/property.rb +82 -42
- data/lib/freeform/form/validation.rb +38 -11
- data/lib/freeform/form.rb +24 -27
- data/lib/freeform/version.rb +1 -1
- data/lib/freeform.rb +4 -0
- data/lib/generators/freeform/install_generator.rb +17 -0
- data/lib/tasks/freeform_tasks.rake +4 -0
- data/spec/acceptance_spec.rb +261 -155
- data/spec/builder/builder_spec.rb +215 -0
- data/spec/builder/view_helper_spec.rb +97 -0
- data/spec/dummy/README.rdoc +28 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/images/.keep +0 -0
- data/spec/dummy/app/assets/javascripts/application.js +5 -0
- data/spec/dummy/app/assets/javascripts/jquery.js +9404 -0
- data/spec/dummy/app/assets/javascripts/jquery_events_test.js +19 -0
- data/spec/dummy/app/assets/javascripts/projects.js +2 -0
- data/spec/dummy/app/assets/javascripts/prototype.js +6082 -0
- data/spec/dummy/app/assets/javascripts/prototype_events_test.js +20 -0
- data/spec/dummy/app/assets/stylesheets/application.css +7 -0
- data/spec/dummy/app/assets/stylesheets/companies.css +4 -0
- data/spec/dummy/app/assets/stylesheets/projects.css +4 -0
- data/spec/dummy/app/controllers/application_controller.rb +3 -0
- data/spec/dummy/app/controllers/companies_controller.rb +5 -0
- data/spec/dummy/app/controllers/projects_controller.rb +11 -0
- data/spec/dummy/app/forms/milestone_form.rb +4 -0
- data/spec/dummy/app/forms/project_form.rb +11 -0
- data/spec/dummy/app/forms/task_form.rb +10 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/mailers/.keep +0 -0
- data/spec/dummy/app/models/.keep +0 -0
- data/spec/dummy/app/models/company.rb +5 -0
- data/spec/dummy/app/models/milestone.rb +6 -0
- data/spec/dummy/app/models/project.rb +9 -0
- data/spec/dummy/app/models/project_task.rb +3 -0
- data/spec/dummy/app/models/task.rb +7 -0
- data/spec/dummy/app/views/companies/new.html.erb +16 -0
- data/spec/dummy/app/views/layouts/application.html.erb +19 -0
- data/spec/dummy/app/views/projects/new.html.erb +13 -0
- data/spec/dummy/app/views/projects/without_intermediate_inputs.html.erb +11 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/config/application.rb +35 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +29 -0
- data/spec/dummy/config/environments/production.rb +80 -0
- data/spec/dummy/config/environments/test.rb +36 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +13 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/routes.rb +5 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/db/migrate/20110710143903_initial_tables.rb +38 -0
- data/spec/dummy/db/schema.rb +43 -0
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/lib/assets/.keep +0 -0
- data/spec/dummy/log/.keep +0 -0
- data/spec/dummy/log/development.log +0 -0
- data/spec/dummy/log/test.log +39736 -0
- data/spec/dummy/public/404.html +58 -0
- data/spec/dummy/public/422.html +58 -0
- data/spec/dummy/public/500.html +57 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/tmp/cache/assets/C54/850/sprockets%2Fd484f47085686f151320ff7248bb5105 +0 -0
- data/spec/dummy/tmp/cache/assets/C76/160/sprockets%2F49c594d143212b346d11f1ecf9358103 +0 -0
- data/spec/dummy/tmp/cache/assets/C99/4D0/sprockets%2F5e30a6b911437f1428dc32c3ae182123 +0 -0
- data/spec/dummy/tmp/cache/assets/C99/7D0/sprockets%2F79513e6956e0ee8624976e041fd5636d +0 -0
- data/spec/dummy/tmp/cache/assets/CAA/C90/sprockets%2F1e6c8ee1258009385ccf5b84015424b3 +0 -0
- data/spec/dummy/tmp/cache/assets/CB2/CB0/sprockets%2F11cc8d161d71a716dd36f16849d90870 +0 -0
- data/spec/dummy/tmp/cache/assets/CB7/7F0/sprockets%2Fac97b043470f6fcc925c352f16956643 +0 -0
- data/spec/dummy/tmp/cache/assets/CBA/680/sprockets%2F912d84e091e5f2190b1ab7926de19679 +0 -0
- data/spec/dummy/tmp/cache/assets/CC7/430/sprockets%2F48e99a3e16ba3e65749e009d82546f94 +0 -0
- data/spec/dummy/tmp/cache/assets/CD8/370/sprockets%2F357970feca3ac29060c1e3861e2c0953 +0 -0
- data/spec/dummy/tmp/cache/assets/CDB/8A0/sprockets%2Faed2a2575c376263c26e93b56b57051d +0 -0
- data/spec/dummy/tmp/cache/assets/CF1/E80/sprockets%2F7735295e1e3085f2e1dc29d59a45e8e6 +0 -0
- data/spec/dummy/tmp/cache/assets/D0F/E60/sprockets%2F1123d9a479fdf5c2b8415087e2a43ec6 +0 -0
- data/spec/dummy/tmp/cache/assets/D1F/A10/sprockets%2F60317e62cb324bfd9987e8da9636fd06 +0 -0
- data/spec/dummy/tmp/cache/assets/D25/E20/sprockets%2F29ba1a4a2b611731334f54abb9e5b5d1 +0 -0
- data/spec/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
- data/spec/dummy/tmp/cache/assets/D35/760/sprockets%2F49e26620c5c743ac4cdab7703f54db06 +0 -0
- data/spec/dummy/tmp/cache/assets/D49/870/sprockets%2F90896142645585acc8baf56ad57e3afb +0 -0
- data/spec/dummy/tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655 +0 -0
- data/spec/dummy/tmp/cache/assets/D5A/EA0/sprockets%2Fd771ace226fc8215a3572e0aa35bb0d6 +0 -0
- data/spec/dummy/tmp/cache/assets/D62/F00/sprockets%2F6ac03a007f26b1c18ed3d53498ad3eb8 +0 -0
- data/spec/dummy/tmp/cache/assets/D79/BC0/sprockets%2F85a1db977361cc5130fcefb4637ff67e +0 -0
- data/spec/dummy/tmp/cache/assets/D87/1F0/sprockets%2F61c9ceafb877fb740c67416ff6f782a9 +0 -0
- data/spec/dummy/tmp/cache/assets/DA8/900/sprockets%2Fde7a2b3987b89b9d9afb268ce4204a4a +0 -0
- data/spec/dummy/tmp/cache/assets/DAD/4F0/sprockets%2F765acd1bf68dc90f7d3e61da78b1e659 +0 -0
- data/spec/dummy/tmp/cache/assets/DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994 +0 -0
- data/spec/dummy/tmp/cache/assets/E03/3F0/sprockets%2F82b37ae9eccec44c1ef44cfdd07d8534 +0 -0
- data/spec/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +0 -0
- data/spec/dummy/tmp/cache/assets/E0A/CA0/sprockets%2F7fe72ac1c0db1a7e8e7f59cf25e8a39e +0 -0
- data/spec/dummy/tmp/cache/assets/E20/9B0/sprockets%2F2fa6cd86b1af7bda41f5b7921cdadf10 +0 -0
- data/spec/dummy/tmp/cache/assets/E3A/A60/sprockets%2F7c72c96cfc66454caf5fc8ca0fedd4f3 +0 -0
- data/spec/dummy/tmp/cache/assets/E54/400/sprockets%2Fd0cbc16cc37efcf9dc41f242b5dbbf81 +0 -0
- data/spec/dummy/tmp/cache/assets/EB7/AB0/sprockets%2F801d29a5debdbfbfb4eef14d70d9bcdb +0 -0
- data/spec/dummy/tmp/cache/assets/F48/5E0/sprockets%2F26cd6ffcffbebbe2fd6cd1a8f0c2debc +0 -0
- data/spec/form/nested_spec.rb +75 -61
- data/spec/form/property_spec.rb +167 -14
- data/spec/form/validation_spec.rb +46 -23
- data/spec/javascript_spec.rb +60 -0
- data/spec/persistence_spec.rb +608 -0
- data/spec/spec_helper.rb +18 -2
- data/vendor/assets/javascripts/jquery_freeform.js +120 -0
- data/vendor/assets/javascripts/jquery_nested_form.js +0 -0
- data/vendor/assets/javascripts/prototype_freeform.js +69 -0
- data/vendor/assets/javascripts/prototype_nested_form.js +0 -0
- 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(:
|
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, :
|
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
|
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(:
|
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, :
|
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
|
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
|