nested_form 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. data/CHANGELOG.rdoc +12 -0
  2. data/README.rdoc +30 -2
  3. data/Rakefile +23 -4
  4. data/lib/generators/nested_form/install_generator.rb +1 -1
  5. data/lib/nested_form/{builder.rb → builder_mixin.rb} +4 -4
  6. data/lib/nested_form/builders.rb +23 -0
  7. data/lib/nested_form/engine.rb +14 -0
  8. data/lib/nested_form/view_helper.rb +25 -9
  9. data/lib/nested_form.rb +1 -2
  10. data/spec/dummy/Rakefile +7 -0
  11. data/spec/dummy/app/assets/javascripts/application.js +5 -0
  12. data/spec/dummy/app/assets/javascripts/jquery.js +8981 -0
  13. data/spec/dummy/app/assets/javascripts/jquery_nested_form.js +71 -0
  14. data/spec/dummy/app/assets/javascripts/projects.js +2 -0
  15. data/spec/dummy/app/assets/javascripts/prototype.js +6082 -0
  16. data/{lib/generators/nested_form/templates → spec/dummy/app/assets/javascripts}/prototype_nested_form.js +0 -0
  17. data/spec/dummy/app/assets/stylesheets/application.css +7 -0
  18. data/spec/dummy/app/assets/stylesheets/projects.css +4 -0
  19. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  20. data/spec/dummy/app/controllers/projects_controller.rb +5 -0
  21. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  22. data/spec/dummy/app/helpers/projects_helper.rb +2 -0
  23. data/spec/dummy/app/models/milestone.rb +3 -0
  24. data/spec/dummy/app/models/project.rb +4 -0
  25. data/spec/dummy/app/models/task.rb +3 -0
  26. data/spec/dummy/app/views/layouts/application.html.erb +11 -0
  27. data/spec/dummy/app/views/projects/new.html.erb +14 -0
  28. data/spec/dummy/config/application.rb +42 -0
  29. data/spec/dummy/config/boot.rb +10 -0
  30. data/spec/dummy/config/database.yml +25 -0
  31. data/spec/dummy/config/environment.rb +5 -0
  32. data/spec/dummy/config/environments/development.rb +27 -0
  33. data/spec/dummy/config/environments/production.rb +54 -0
  34. data/spec/dummy/config/environments/test.rb +39 -0
  35. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  36. data/spec/dummy/config/initializers/inflections.rb +10 -0
  37. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  38. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  39. data/spec/dummy/config/initializers/session_store.rb +8 -0
  40. data/spec/dummy/config/initializers/wrap_parameters.rb +12 -0
  41. data/spec/dummy/config/locales/en.yml +5 -0
  42. data/spec/dummy/config/routes.rb +59 -0
  43. data/spec/dummy/config.ru +4 -0
  44. data/spec/dummy/db/development.sqlite3 +0 -0
  45. data/spec/dummy/db/migrate/20110710143903_initial_tables.rb +23 -0
  46. data/spec/dummy/db/schema.rb +29 -0
  47. data/spec/dummy/db/test.sqlite3 +0 -0
  48. data/spec/dummy/public/404.html +26 -0
  49. data/spec/dummy/public/422.html +26 -0
  50. data/spec/dummy/public/500.html +26 -0
  51. data/spec/dummy/public/favicon.ico +0 -0
  52. data/spec/dummy/script/rails +6 -0
  53. data/spec/dummy/test/functional/projects_controller_test.rb +7 -0
  54. data/spec/dummy/test/unit/helpers/projects_helper_test.rb +4 -0
  55. data/spec/form_spec.rb +31 -0
  56. data/spec/nested_form/builder_spec.rb +33 -31
  57. data/spec/nested_form/view_helper_spec.rb +26 -12
  58. data/spec/spec_helper.rb +9 -48
  59. metadata +84 -59
  60. data/Gemfile +0 -3
  61. data/lib/generators/nested_form/templates/jquery_nested_form.js +0 -51
@@ -1,40 +1,42 @@
1
1
  require "spec_helper"
2
2
 
3
- describe NestedForm::Builder do
4
- describe "with no options" do
5
- before(:each) do
6
- @project = Project.new
7
- @template = ActionView::Base.new
8
- @template.output_buffer = ""
9
- @builder = NestedForm::Builder.new(:item, @project, @template, {}, proc {})
10
- end
3
+ [NestedForm::Builder, NestedForm::SimpleBuilder, defined?(NestedForm::FormtasticBuilder) ? NestedForm::FormtasticBuilder : nil].compact.each do |builder|
4
+ describe builder do
5
+ describe "with no options" do
6
+ before(:each) do
7
+ @project = Project.new
8
+ @template = ActionView::Base.new
9
+ @template.output_buffer = ""
10
+ @builder = builder.new(:item, @project, @template, {}, proc {})
11
+ end
11
12
 
12
- it "has an add link which behaves similar to a Rails link_to" do
13
- @builder.link_to_add("Add", :tasks).should == '<a href="javascript:void(0)" class="add_nested_fields" data-association="tasks">Add</a>'
14
- @builder.link_to_add("Add", :tasks, :class => "foo", :href => "url").should == '<a href="url" class="foo add_nested_fields" data-association="tasks">Add</a>'
15
- @builder.link_to_add(:tasks) { "Add" }.should == '<a href="javascript:void(0)" class="add_nested_fields" data-association="tasks">Add</a>'
16
- end
13
+ it "has an add link which behaves similar to a Rails link_to" do
14
+ @builder.link_to_add("Add", :tasks).should == '<a href="javascript:void(0)" class="add_nested_fields" data-association="tasks">Add</a>'
15
+ @builder.link_to_add("Add", :tasks, :class => "foo", :href => "url").should == '<a href="url" class="foo add_nested_fields" data-association="tasks">Add</a>'
16
+ @builder.link_to_add(:tasks) { "Add" }.should == '<a href="javascript:void(0)" class="add_nested_fields" data-association="tasks">Add</a>'
17
+ end
17
18
 
18
- it "has a remove link which behaves similar to a Rails link_to" do
19
- @builder.link_to_remove("Remove").should == '<input id="item__destroy" name="item[_destroy]" type="hidden" value="false" /><a href="javascript:void(0)" class="remove_nested_fields">Remove</a>'
20
- @builder.link_to_remove("Remove", :class => "foo", :href => "url").should == '<input id="item__destroy" name="item[_destroy]" type="hidden" value="false" /><a href="url" class="foo remove_nested_fields">Remove</a>'
21
- @builder.link_to_remove { "Remove" }.should == '<input id="item__destroy" name="item[_destroy]" type="hidden" value="false" /><a href="javascript:void(0)" class="remove_nested_fields">Remove</a>'
22
- end
19
+ it "has a remove link which behaves similar to a Rails link_to" do
20
+ @builder.link_to_remove("Remove").should == '<input id="item__destroy" name="item[_destroy]" type="hidden" value="false" /><a href="javascript:void(0)" class="remove_nested_fields">Remove</a>'
21
+ @builder.link_to_remove("Remove", :class => "foo", :href => "url").should == '<input id="item__destroy" name="item[_destroy]" type="hidden" value="false" /><a href="url" class="foo remove_nested_fields">Remove</a>'
22
+ @builder.link_to_remove { "Remove" }.should == '<input id="item__destroy" name="item[_destroy]" type="hidden" value="false" /><a href="javascript:void(0)" class="remove_nested_fields">Remove</a>'
23
+ end
23
24
 
24
- it "should wrap nested fields each in a div with class" do
25
- 2.times { @project.tasks.build }
26
- @builder.fields_for(:tasks) do
27
- "Task"
28
- end.should == '<div class="fields">Task</div><div class="fields">Task</div>'
29
- end
25
+ it "should wrap nested fields each in a div with class" do
26
+ 2.times { @project.tasks.build }
27
+ @builder.fields_for(:tasks) do
28
+ "Task"
29
+ end.should == '<div class="fields">Task</div><div class="fields">Task</div>'
30
+ end
30
31
 
31
- it "should add task fields to hidden div after form" do
32
- pending
33
- output = ""
34
- mock(@template).after_nested_form(:tasks) { |arg, block| output << block.call }
35
- @builder.fields_for(:tasks) { "Task" }
36
- @builder.link_to_add("Add", :tasks)
37
- output.should == '<div id="tasks_fields_blueprint" style="display: none"><div class="fields">Task</div></div>'
32
+ it "should add task fields to hidden div after form" do
33
+ pending
34
+ output = ""
35
+ mock(@template).after_nested_form(:tasks) { |arg, block| output << block.call }
36
+ @builder.fields_for(:tasks) { "Task" }
37
+ @builder.link_to_add("Add", :tasks)
38
+ output.should == '<div id="tasks_fields_blueprint" style="display: none"><div class="fields">Task</div></div>'
39
+ end
38
40
  end
39
41
  end
40
42
  end
@@ -1,33 +1,47 @@
1
1
  require "spec_helper"
2
2
 
3
3
  describe NestedForm::ViewHelper do
4
+ include RSpec::Rails::HelperExampleGroup
5
+
4
6
  before(:each) do
5
- @template = ActionView::Base.new
6
- @template.output_buffer = ""
7
- @template.stubs(:url_for).returns("")
8
- @template.stubs(:projects_path).returns("")
9
- @template.stubs(:protect_against_forgery?).returns(false)
7
+ _routes.draw do
8
+ resources :projects
9
+ end
10
10
  end
11
11
 
12
12
  it "should pass nested form builder to form_for along with other options" do
13
13
  pending
14
- mock.proxy(@template).form_for(:first, :as => :second, :other => :arg, :builder => NestedForm::Builder) do |form_html|
14
+ mock.proxy(_view).form_for(:first, :as => :second, :other => :arg, :builder => NestedForm::Builder) do |form_html|
15
15
  form_html
16
16
  end
17
- @template.nested_form_for(:first, :as => :second, :other => :arg) {"form"}
17
+ _view.nested_form_for(:first, :as => :second, :other => :arg) {"form"}
18
18
  end
19
19
 
20
20
  it "should pass instance of NestedForm::Builder to nested_form_for block" do
21
- @template.nested_form_for(Project.new) do |f|
21
+ _view.nested_form_for(Project.new) do |f|
22
22
  f.should be_instance_of(NestedForm::Builder)
23
23
  end
24
24
  end
25
25
 
26
+ it "should pass instance of NestedForm::SimpleBuilder to simple_nested_form_for block" do
27
+ _view.simple_nested_form_for(Project.new) do |f|
28
+ f.should be_instance_of(NestedForm::SimpleBuilder)
29
+ end
30
+ end
31
+
32
+ if defined?(NestedForm::FormtasticBuilder)
33
+ it "should pass instance of NestedForm::FormtasticBuilder to semantic_nested_form_for block" do
34
+ _view.semantic_nested_form_for(Project.new) do |f|
35
+ f.should be_instance_of(NestedForm::FormtasticBuilder)
36
+ end
37
+ end
38
+ end
39
+
26
40
  it "should append content to end of nested form" do
27
- @template.after_nested_form(:tasks) { @template.concat("123") }
28
- @template.after_nested_form(:milestones) { @template.concat("456") }
29
- @template.nested_form_for(Project.new) {}
30
- @template.output_buffer.should include("123456")
41
+ _view.after_nested_form(:tasks) { _view.concat("123") }
42
+ _view.after_nested_form(:milestones) { _view.concat("456") }
43
+ _view.nested_form_for(Project.new) {}
44
+ _view.output_buffer.should include("123456")
31
45
  end
32
46
  end
33
47
 
data/spec/spec_helper.rb CHANGED
@@ -1,55 +1,16 @@
1
- require "rubygems"
2
- require "bundler/setup"
1
+ # Configure Rails Environment
2
+ ENV["RAILS_ENV"] = "test"
3
3
 
4
- require "action_view"
5
- require "active_record"
6
-
7
- Bundler.require(:default)
8
-
9
- # require 'active_model'
10
- # require 'active_record'
11
- # require 'action_controller'
12
- # require 'action_view'
13
- # require 'action_view/template'
14
- # require "active_support/all"
15
-
16
- # require 'nested_form/view_helper'
17
- # require 'nested_form/builder'
4
+ require File.expand_path("../dummy/config/environment.rb", __FILE__)
5
+ require 'rspec/rails'
6
+ require 'capybara/rspec'
18
7
 
8
+ Capybara.javascript_driver = :selenium
19
9
  RSpec.configure do |config|
20
10
  config.mock_with :mocha
21
11
  end
22
12
 
23
- class TablelessModel < ActiveRecord::Base
24
- def self.columns() @columns ||= []; end
25
-
26
- def self.column(name, sql_type = nil, default = nil, null = true)
27
- columns << ActiveRecord::ConnectionAdapters::Column.new(name.to_s, default, sql_type.to_s, null)
28
- end
29
-
30
- def self.quoted_table_name
31
- name.pluralize.underscore
32
- end
33
-
34
- def quoted_id
35
- "0"
36
- end
37
- end
38
-
39
- class Project < TablelessModel
40
- column :name, :string
41
- has_many :tasks
42
- accepts_nested_attributes_for :tasks
43
- end
44
-
45
- class Task < TablelessModel
46
- column :project_id, :integer
47
- column :name, :string
48
- belongs_to :project
49
- end
13
+ Rails.backtrace_cleaner.remove_silencers!
50
14
 
51
- class Milestone < TablelessModel
52
- column :task_id, :integer
53
- column :name, :string
54
- belongs_to :task
55
- end
15
+ # Load support files
16
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
metadata CHANGED
@@ -1,102 +1,127 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: nested_form
3
- version: !ruby/object:Gem::Version
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
4
5
  prerelease:
5
- version: 0.1.1
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - Ryan Bates
9
9
  - Andrea Singh
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
-
14
- date: 2011-04-23 00:00:00 -07:00
15
- default_executable:
16
- dependencies:
17
- - !ruby/object:Gem::Dependency
18
- name: rspec
19
- prerelease: false
20
- requirement: &id001 !ruby/object:Gem::Requirement
13
+ date: 2012-02-08 00:00:00.000000000Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rspec-rails
17
+ requirement: &2152812540 !ruby/object:Gem::Requirement
21
18
  none: false
22
- requirements:
19
+ requirements:
23
20
  - - ~>
24
- - !ruby/object:Gem::Version
25
- version: 2.1.0
21
+ - !ruby/object:Gem::Version
22
+ version: 2.6.0
26
23
  type: :development
27
- version_requirements: *id001
28
- - !ruby/object:Gem::Dependency
29
- name: mocha
30
24
  prerelease: false
31
- requirement: &id002 !ruby/object:Gem::Requirement
25
+ version_requirements: *2152812540
26
+ - !ruby/object:Gem::Dependency
27
+ name: mocha
28
+ requirement: &2152812140 !ruby/object:Gem::Requirement
32
29
  none: false
33
- requirements:
34
- - - ">="
35
- - !ruby/object:Gem::Version
36
- version: "0"
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
37
34
  type: :development
38
- version_requirements: *id002
39
- - !ruby/object:Gem::Dependency
40
- name: rails
41
35
  prerelease: false
42
- requirement: &id003 !ruby/object:Gem::Requirement
43
- none: false
44
- requirements:
45
- - - ~>
46
- - !ruby/object:Gem::Version
47
- version: 3.0.0
48
- type: :development
49
- version_requirements: *id003
50
- description: Gem to conveniently handle multiple models in a single form with Rails 3 and jQuery or Prototype.
36
+ version_requirements: *2152812140
37
+ description: Gem to conveniently handle multiple models in a single form with Rails
38
+ 3 and jQuery or Prototype.
51
39
  email: ryan@railscasts.com
52
40
  executables: []
53
-
54
41
  extensions: []
55
-
56
42
  extra_rdoc_files: []
57
-
58
- files:
43
+ files:
59
44
  - lib/generators/nested_form/install_generator.rb
60
- - lib/generators/nested_form/templates/jquery_nested_form.js
61
- - lib/generators/nested_form/templates/prototype_nested_form.js
62
- - lib/nested_form/builder.rb
45
+ - lib/nested_form/builder_mixin.rb
46
+ - lib/nested_form/builders.rb
47
+ - lib/nested_form/engine.rb
63
48
  - lib/nested_form/view_helper.rb
64
49
  - lib/nested_form.rb
50
+ - spec/dummy/app/assets/javascripts/application.js
51
+ - spec/dummy/app/assets/javascripts/jquery.js
52
+ - spec/dummy/app/assets/javascripts/jquery_nested_form.js
53
+ - spec/dummy/app/assets/javascripts/projects.js
54
+ - spec/dummy/app/assets/javascripts/prototype.js
55
+ - spec/dummy/app/assets/javascripts/prototype_nested_form.js
56
+ - spec/dummy/app/assets/stylesheets/application.css
57
+ - spec/dummy/app/assets/stylesheets/projects.css
58
+ - spec/dummy/app/controllers/application_controller.rb
59
+ - spec/dummy/app/controllers/projects_controller.rb
60
+ - spec/dummy/app/helpers/application_helper.rb
61
+ - spec/dummy/app/helpers/projects_helper.rb
62
+ - spec/dummy/app/models/milestone.rb
63
+ - spec/dummy/app/models/project.rb
64
+ - spec/dummy/app/models/task.rb
65
+ - spec/dummy/app/views/layouts/application.html.erb
66
+ - spec/dummy/app/views/projects/new.html.erb
67
+ - spec/dummy/config/application.rb
68
+ - spec/dummy/config/boot.rb
69
+ - spec/dummy/config/database.yml
70
+ - spec/dummy/config/environment.rb
71
+ - spec/dummy/config/environments/development.rb
72
+ - spec/dummy/config/environments/production.rb
73
+ - spec/dummy/config/environments/test.rb
74
+ - spec/dummy/config/initializers/backtrace_silencers.rb
75
+ - spec/dummy/config/initializers/inflections.rb
76
+ - spec/dummy/config/initializers/mime_types.rb
77
+ - spec/dummy/config/initializers/secret_token.rb
78
+ - spec/dummy/config/initializers/session_store.rb
79
+ - spec/dummy/config/initializers/wrap_parameters.rb
80
+ - spec/dummy/config/locales/en.yml
81
+ - spec/dummy/config/routes.rb
82
+ - spec/dummy/config.ru
83
+ - spec/dummy/db/development.sqlite3
84
+ - spec/dummy/db/migrate/20110710143903_initial_tables.rb
85
+ - spec/dummy/db/schema.rb
86
+ - spec/dummy/db/test.sqlite3
87
+ - spec/dummy/public/404.html
88
+ - spec/dummy/public/422.html
89
+ - spec/dummy/public/500.html
90
+ - spec/dummy/public/favicon.ico
91
+ - spec/dummy/Rakefile
92
+ - spec/dummy/script/rails
93
+ - spec/dummy/test/functional/projects_controller_test.rb
94
+ - spec/dummy/test/unit/helpers/projects_helper_test.rb
95
+ - spec/form_spec.rb
65
96
  - spec/nested_form/builder_spec.rb
66
97
  - spec/nested_form/view_helper_spec.rb
67
98
  - spec/spec_helper.rb
68
99
  - CHANGELOG.rdoc
69
- - Gemfile
70
100
  - LICENSE
71
101
  - Rakefile
72
102
  - README.rdoc
73
- has_rdoc: true
74
103
  homepage: http://github.com/ryanb/nested_form
75
104
  licenses: []
76
-
77
105
  post_install_message:
78
106
  rdoc_options: []
79
-
80
- require_paths:
107
+ require_paths:
81
108
  - lib
82
- required_ruby_version: !ruby/object:Gem::Requirement
109
+ required_ruby_version: !ruby/object:Gem::Requirement
83
110
  none: false
84
- requirements:
85
- - - ">="
86
- - !ruby/object:Gem::Version
87
- version: "0"
88
- required_rubygems_version: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - ! '>='
113
+ - !ruby/object:Gem::Version
114
+ version: '0'
115
+ required_rubygems_version: !ruby/object:Gem::Requirement
89
116
  none: false
90
- requirements:
91
- - - ">="
92
- - !ruby/object:Gem::Version
117
+ requirements:
118
+ - - ! '>='
119
+ - !ruby/object:Gem::Version
93
120
  version: 1.3.4
94
121
  requirements: []
95
-
96
122
  rubyforge_project: nested_form
97
- rubygems_version: 1.5.0
123
+ rubygems_version: 1.8.10
98
124
  signing_key:
99
125
  specification_version: 3
100
126
  summary: Gem to conveniently handle multiple models in a single form.
101
127
  test_files: []
102
-
data/Gemfile DELETED
@@ -1,3 +0,0 @@
1
- source "http://rubygems.org"
2
-
3
- gemspec
@@ -1,51 +0,0 @@
1
- jQuery(function($) {
2
- $('form a.add_nested_fields').live('click', function() {
3
- // Setup
4
- var assoc = $(this).attr('data-association'); // Name of child
5
- var content = $('#' + assoc + '_fields_blueprint').html(); // Fields template
6
-
7
- // Make the context correct by replacing new_<parents> with the generated ID
8
- // of each of the parent objects
9
- var context = ($(this).closest('.fields').find('input:first').attr('name') || '').replace(new RegExp('\[[a-z]+\]$'), '');
10
-
11
- // context will be something like this for a brand new form:
12
- // project[tasks_attributes][new_1255929127459][assignments_attributes][new_1255929128105]
13
- // or for an edit form:
14
- // project[tasks_attributes][0][assignments_attributes][1]
15
- if(context) {
16
- var parent_names = context.match(/[a-z_]+_attributes/g) || [];
17
- var parent_ids = context.match(/(new_)?[0-9]+/g) || [];
18
-
19
- for(i = 0; i < parent_names.length; i++) {
20
- if(parent_ids[i]) {
21
- content = content.replace(
22
- new RegExp('(_' + parent_names[i] + ')_.+?_', 'g'),
23
- '$1_' + parent_ids[i] + '_');
24
-
25
- content = content.replace(
26
- new RegExp('(\\[' + parent_names[i] + '\\])\\[.+?\\]', 'g'),
27
- '$1[' + parent_ids[i] + ']');
28
- }
29
- }
30
- }
31
-
32
- // Make a unique ID for the new child
33
- var regexp = new RegExp('new_' + assoc, 'g');
34
- var new_id = new Date().getTime();
35
- content = content.replace(regexp, "new_" + new_id);
36
-
37
- $(this).before(content);
38
- $(this).closest("form").trigger('nested:fieldAdded');
39
- return false;
40
- });
41
-
42
- $('form a.remove_nested_fields').live('click', function() {
43
- var hidden_field = $(this).prev('input[type=hidden]')[0];
44
- if(hidden_field) {
45
- hidden_field.value = '1';
46
- }
47
- $(this).closest('.fields').hide();
48
- $(this).closest("form").trigger('nested:fieldRemoved');
49
- return false;
50
- });
51
- });