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