dm-accepts_nested_attributes 0.12.0 → 1.0.0.rc1

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 CHANGED
@@ -23,4 +23,7 @@ _Yardoc
23
23
  */ri
24
24
  measurements
25
25
  tmp
26
+ .bundle
27
+ Gemfile.local
28
+ Gemfile.lock
26
29
 
data/Gemfile ADDED
@@ -0,0 +1,145 @@
1
+ # If you're working on more than one datamapper gem at a time, then it's
2
+ # recommended to create a local Gemfile and use this instead of the git
3
+ # sources. This will make sure that you are developing against your
4
+ # other local datamapper sources that you currently work on. Gemfile.local
5
+ # will behave identically to the standard Gemfile apart from the fact that
6
+ # it fetches the datamapper gems from local paths. This means that you can use
7
+ # the same environment variables, like ADAPTER(S) or PLUGIN(S) when running
8
+ # bundle commands. Gemfile.local is added to .gitignore, so you don't need to
9
+ # worry about accidentally checking local development paths into git.
10
+ # In order to create a local Gemfile, all you need to do is run:
11
+ #
12
+ # bundle exec rake local_gemfile
13
+ #
14
+ # This will give you a Gemfile.local file that points to your local clones of
15
+ # the various datamapper gems. It's assumed that all datamapper repo clones
16
+ # reside in the same directory. You can use the Gemfile.local like so for
17
+ # running any bundle command:
18
+ #
19
+ # BUNDLE_GEMFILE=Gemfile.local bundle foo
20
+ #
21
+ # You can also specify which adapter(s) should be part of the bundle by setting
22
+ # an environment variable. This of course also works when using the Gemfile.local
23
+ #
24
+ # bundle foo # dm-sqlite-adapter
25
+ # ADAPTER=mysql bundle foo # dm-mysql-adapter
26
+ # ADAPTERS=sqlite,mysql bundle foo # dm-sqlite-adapter and dm-mysql-adapter
27
+ #
28
+ # Of course you can also use the ADAPTER(S) variable when using the Gemfile.local
29
+ # and running specs against selected adapters.
30
+ #
31
+ # For easily working with adapters supported on your machine, it's recommended
32
+ # that you first install all adapters that you are planning to use or work on
33
+ # by doing something like
34
+ #
35
+ # ADAPTERS=sqlite,mysql,postgres bundle install
36
+ #
37
+ # This will clone the various repositories and make them available to bundler.
38
+ # Once you have them installed you can easily switch between adapters for the
39
+ # various development tasks. Running something like
40
+ #
41
+ # ADAPTER=mysql bundle exec rake spec
42
+ #
43
+ # will make sure that the dm-mysql-adapter is part of the bundle, and will be used
44
+ # when running the specs.
45
+ #
46
+ # You can also specify which plugin(s) should be part of the bundle by setting
47
+ # an environment variable. This also works when using the Gemfile.local
48
+ #
49
+ # bundle foo # dm-migrations
50
+ # PLUGINS=dm-validations bundle foo # dm-migrations and dm-validations
51
+ # PLUGINS=dm-validations,dm-types bundle foo # dm-migrations, dm-validations and dm-types
52
+ #
53
+ # Of course you can combine the PLUGIN(S) and ADAPTER(S) env vars to run specs
54
+ # for certain adapter/plugin combinations.
55
+ #
56
+ # Finally, to speed up running specs and other tasks, it's recommended to run
57
+ #
58
+ # bundle lock
59
+ #
60
+ # after running 'bundle install' for the first time. This will make 'bundle exec' run
61
+ # a lot faster compared to the unlocked version. With an unlocked bundle you would
62
+ # typically just run 'bundle install' from time to time to fetch the latest sources from
63
+ # upstream. When you locked your bundle, you need to run
64
+ #
65
+ # bundle install --relock
66
+ #
67
+ # to make sure to fetch the latest updates and then lock the bundle again. Gemfile.lock
68
+ # is added to the .gitignore file, so you don't need to worry about accidentally checking
69
+ # it into version control.
70
+
71
+ source 'http://rubygems.org'
72
+
73
+ DATAMAPPER = 'git://github.com/datamapper'
74
+ DM_VERSION = '~> 1.0.0.rc1'
75
+
76
+
77
+ group :runtime do # Runtime dependencies (as in the gemspec)
78
+
79
+ if ENV['EXTLIB']
80
+ gem 'extlib', '~> 0.9.15', :git => "#{DATAMAPPER}/extlib.git"
81
+ else
82
+ gem 'activesupport', '~> 3.0.0.beta3', :git => 'git://github.com/rails/rails.git', :require => nil
83
+ end
84
+
85
+ gem 'dm-core', DM_VERSION, :git => "#{DATAMAPPER}/dm-core.git"
86
+
87
+ end
88
+
89
+ group(:development) do # Development dependencies (as in the gemspec)
90
+
91
+ gem 'dm-validations', DM_VERSION, :git => "#{DATAMAPPER}/dm-validations.git"
92
+ gem 'dm-constraints', DM_VERSION, :git => "#{DATAMAPPER}/dm-constraints.git"
93
+
94
+ gem 'rake', '~> 0.8.7'
95
+ gem 'rspec', '~> 1.3'
96
+ gem 'yard', '~> 0.5'
97
+ gem 'rcov', '~> 0.9.7'
98
+ gem 'jeweler', '~> 1.4'
99
+
100
+ end
101
+
102
+ group :quality do # These gems contain rake tasks that check the quality of the source code
103
+
104
+ gem 'yardstick', '~> 0.1'
105
+ gem 'metric_fu', '~> 1.3'
106
+ gem 'reek', '~> 1.2.7'
107
+ gem 'roodi', '~> 2.1'
108
+
109
+ end
110
+
111
+ group :datamapper do # We need this because we want to pin these dependencies to their git master sources
112
+
113
+ adapters = ENV['ADAPTER'] || ENV['ADAPTERS']
114
+ adapters = adapters.to_s.gsub(',',' ').split(' ') - ['in_memory']
115
+
116
+ unless adapters.empty?
117
+
118
+ DO_VERSION = '~> 0.10.2'
119
+ DM_DO_ADAPTERS = %w[sqlite postgres mysql oracle sqlserver]
120
+
121
+ gem 'data_objects', DO_VERSION, :git => "#{DATAMAPPER}/do.git"
122
+
123
+ adapters.each do |adapter|
124
+ if DM_DO_ADAPTERS.any? { |dm_do_adapter| dm_do_adapter =~ /#{adapter}/ }
125
+ adapter = 'sqlite3' if adapter == 'sqlite'
126
+ gem "do_#{adapter}", DO_VERSION, :git => "#{DATAMAPPER}/do.git"
127
+ end
128
+ end
129
+
130
+ gem 'dm-do-adapter', DM_VERSION, :git => "#{DATAMAPPER}/dm-do-adapter.git"
131
+
132
+ adapters.each do |adapter|
133
+ gem "dm-#{adapter}-adapter", DM_VERSION, :git => "#{DATAMAPPER}/dm-#{adapter}-adapter.git"
134
+ end
135
+
136
+ end
137
+
138
+ plugins = ENV['PLUGINS'] || ENV['PLUGIN']
139
+ plugins = (plugins.to_s.gsub(',',' ').split(' ') + ['dm-migrations']).uniq
140
+
141
+ plugins.each do |plugin|
142
+ gem plugin, DM_VERSION, :git => "#{DATAMAPPER}/#{plugin}.git"
143
+ end
144
+
145
+ end
data/Rakefile CHANGED
@@ -1,35 +1,30 @@
1
1
  require 'rubygems'
2
2
  require 'rake'
3
3
 
4
- require File.expand_path('../lib/dm-accepts_nested_attributes/version', __FILE__)
5
-
6
- FileList['tasks/**/*.rake'].each { |task| load task }
7
-
8
4
  begin
9
5
 
10
- gem 'jeweler', '~> 1.4'
11
6
  require 'jeweler'
12
7
 
13
8
  Jeweler::Tasks.new do |gem|
14
9
 
15
- gem.version = DataMapper::NestedAttributes::VERSION
16
-
17
10
  gem.name = 'dm-accepts_nested_attributes'
18
11
  gem.summary = 'Nested model assignment for datamapper'
19
12
  gem.description = 'A datamapper plugin that allows nested model assignment like activerecord.'
20
13
  gem.email = 'gamsnjaga [a] gmail [d] com'
21
14
  gem.homepage = 'http://github.com/snusnu/dm-accepts_nested_attributes'
22
- gem.authors = [ 'Martin Gamsjaeger' ]
15
+ gem.authors = [ 'Martin Gamsjaeger (snusnu)' ]
23
16
 
24
- gem.add_dependency 'dm-core', '~> 0.10.2'
17
+ gem.add_dependency 'dm-core', '~> 1.0.0.rc1'
25
18
 
26
- gem.add_development_dependency 'rspec', '~> 1.2.9'
27
- gem.add_development_dependency 'yard', '~> 0.4.0'
19
+ gem.add_development_dependency 'rspec', '~> 1.3'
20
+ gem.add_development_dependency 'yard', '~> 0.5'
28
21
 
29
22
  end
30
23
 
31
24
  Jeweler::GemcutterTasks.new
32
25
 
26
+ FileList['tasks/**/*.rake'].each { |task| import task }
27
+
33
28
  rescue LoadError
34
29
  puts 'Jeweler (or a dependency) not available. Install it with: gem install jeweler'
35
30
  end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 1.0.0.rc1
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{dm-accepts_nested_attributes}
8
- s.version = "0.12.0"
8
+ s.version = "1.0.0.rc1"
9
9
 
10
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Martin Gamsjaeger"]
12
- s.date = %q{2010-01-23}
10
+ s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Martin Gamsjaeger (snusnu)"]
12
+ s.date = %q{2010-05-20}
13
13
  s.description = %q{A datamapper plugin that allows nested model assignment like activerecord.}
14
14
  s.email = %q{gamsnjaga [a] gmail [d] com}
15
15
  s.extra_rdoc_files = [
@@ -20,16 +20,16 @@ Gem::Specification.new do |s|
20
20
  s.files = [
21
21
  ".gitignore",
22
22
  "CHANGELOG",
23
+ "Gemfile",
23
24
  "LICENSE",
24
25
  "README.textile",
25
26
  "Rakefile",
26
27
  "TODO",
28
+ "VERSION",
27
29
  "dm-accepts_nested_attributes.gemspec",
28
30
  "lib/dm-accepts_nested_attributes.rb",
29
- "lib/dm-accepts_nested_attributes/error_collecting.rb",
30
31
  "lib/dm-accepts_nested_attributes/model.rb",
31
32
  "lib/dm-accepts_nested_attributes/resource.rb",
32
- "lib/dm-accepts_nested_attributes/transactional_save.rb",
33
33
  "lib/dm-accepts_nested_attributes/version.rb",
34
34
  "spec/accepts_nested_attributes_for_spec.rb",
35
35
  "spec/many_to_many_spec.rb",
@@ -45,6 +45,7 @@ Gem::Specification.new do |s|
45
45
  "spec/spec_helper.rb",
46
46
  "tasks/changelog.rake",
47
47
  "tasks/ci.rake",
48
+ "tasks/local_gemfile.rake",
48
49
  "tasks/metrics.rake",
49
50
  "tasks/spec.rake",
50
51
  "tasks/yard.rake",
@@ -53,7 +54,7 @@ Gem::Specification.new do |s|
53
54
  s.homepage = %q{http://github.com/snusnu/dm-accepts_nested_attributes}
54
55
  s.rdoc_options = ["--charset=UTF-8"]
55
56
  s.require_paths = ["lib"]
56
- s.rubygems_version = %q{1.3.5}
57
+ s.rubygems_version = %q{1.3.7}
57
58
  s.summary = %q{Nested model assignment for datamapper}
58
59
  s.test_files = [
59
60
  "spec/accepts_nested_attributes_for_spec.rb",
@@ -72,19 +73,19 @@ Gem::Specification.new do |s|
72
73
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
73
74
  s.specification_version = 3
74
75
 
75
- if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
76
- s.add_runtime_dependency(%q<dm-core>, ["~> 0.10.2"])
77
- s.add_development_dependency(%q<rspec>, ["~> 1.2.9"])
78
- s.add_development_dependency(%q<yard>, ["~> 0.4.0"])
76
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
77
+ s.add_runtime_dependency(%q<dm-core>, ["~> 1.0.0.rc1"])
78
+ s.add_development_dependency(%q<rspec>, ["~> 1.3"])
79
+ s.add_development_dependency(%q<yard>, ["~> 0.5"])
79
80
  else
80
- s.add_dependency(%q<dm-core>, ["~> 0.10.2"])
81
- s.add_dependency(%q<rspec>, ["~> 1.2.9"])
82
- s.add_dependency(%q<yard>, ["~> 0.4.0"])
81
+ s.add_dependency(%q<dm-core>, ["~> 1.0.0.rc1"])
82
+ s.add_dependency(%q<rspec>, ["~> 1.3"])
83
+ s.add_dependency(%q<yard>, ["~> 0.5"])
83
84
  end
84
85
  else
85
- s.add_dependency(%q<dm-core>, ["~> 0.10.2"])
86
- s.add_dependency(%q<rspec>, ["~> 1.2.9"])
87
- s.add_dependency(%q<yard>, ["~> 0.4.0"])
86
+ s.add_dependency(%q<dm-core>, ["~> 1.0.0.rc1"])
87
+ s.add_dependency(%q<rspec>, ["~> 1.3"])
88
+ s.add_dependency(%q<yard>, ["~> 0.5"])
88
89
  end
89
90
  end
90
91
 
@@ -56,16 +56,6 @@ module DataMapper
56
56
 
57
57
  include ::DataMapper::NestedAttributes::Resource
58
58
 
59
- # TODO i wonder if this is the best place here?
60
- # the transactional save behavior is definitely not needed for all resources,
61
- # but it's necessary for resources that accept nested attributes
62
- # FIXME this leads to weird "no such table" errors when specs are run
63
- add_transactional_save_behavior # TODO if repository.adapter.supports_transactions?
64
-
65
- # TODO make this do something
66
- # it's only here now to remind me that this is probably the best place to put it
67
- add_error_collection_behavior if DataMapper.const_defined?('Validate')
68
-
69
59
  type = relationship.max > 1 ? :collection : :resource
70
60
 
71
61
  define_method "#{association_name}_attributes" do
@@ -87,34 +77,6 @@ module DataMapper
87
77
 
88
78
  private
89
79
 
90
- ##
91
- # Provides a hook to include or disable customized transactional save behavior.
92
- # Override this method to customize the implementation or disable it altogether.
93
- # The current implementation in @see DataMapper::NestedAttributes::TransactionalSave
94
- # simply wraps the saving of the complete object tree inside a transaction
95
- # and rolls back in case any exceptions are raised, or any of the calls to
96
- # @see DataMapper::Resource#save returned false
97
- #
98
- # @return Not specified
99
- #
100
- def add_transactional_save_behavior
101
- require 'dm-accepts_nested_attributes/transactional_save'
102
- include ::DataMapper::NestedAttributes::TransactionalSave
103
- end
104
-
105
- ##
106
- # Provides a hook to include or disable customized error collecting behavior.
107
- # Overwrite this method to customize the implementation or disable it altogether.
108
- # The current implementation in @see DataMapper::NestedAttributes::ValidationErrorCollecting
109
- # simply attaches all errors of related resources to the object that was initially saved.
110
- #
111
- # @return Not specified
112
- #
113
- def add_error_collection_behavior
114
- require 'dm-accepts_nested_attributes/error_collecting'
115
- include ::DataMapper::NestedAttributes::ValidationErrorCollecting
116
- end
117
-
118
80
  ##
119
81
  # Checks options passed to @see accepts_nested_attributes_for
120
82
  # If any of the given options is invalid, this method will raise
@@ -4,7 +4,7 @@ describe "DataMapper::Model.accepts_nested_attributes_for" do
4
4
 
5
5
  FIXTURES = <<-RUBY
6
6
 
7
- class Branch
7
+ class ::Branch
8
8
  include DataMapper::Resource
9
9
  property :id, Serial
10
10
  has 1, :shop
@@ -12,20 +12,20 @@ describe "DataMapper::Model.accepts_nested_attributes_for" do
12
12
  has n, :bookings, :through => :items
13
13
  end
14
14
 
15
- class Shop
15
+ class ::Shop
16
16
  include DataMapper::Resource
17
17
  property :id, Serial
18
18
  belongs_to :branch
19
19
  end
20
20
 
21
- class Item
21
+ class ::Item
22
22
  include DataMapper::Resource
23
23
  property :id, Serial
24
24
  belongs_to :branch
25
25
  has n, :bookings
26
26
  end
27
27
 
28
- class Booking
28
+ class ::Booking
29
29
  include DataMapper::Resource
30
30
  property :id, Serial
31
31
  belongs_to :item
@@ -4,7 +4,7 @@ describe "Person.has(n, :projects, :through => :project_memberships);" do
4
4
 
5
5
  before(:all) do
6
6
 
7
- class Person
7
+ class ::Person
8
8
 
9
9
  include DataMapper::Resource
10
10
  extend ConstraintSupport
@@ -18,7 +18,7 @@ describe "Person.has(n, :projects, :through => :project_memberships);" do
18
18
 
19
19
  end
20
20
 
21
- class Project
21
+ class ::Project
22
22
 
23
23
  include DataMapper::Resource
24
24
  extend ConstraintSupport
@@ -32,7 +32,7 @@ describe "Person.has(n, :projects, :through => :project_memberships);" do
32
32
 
33
33
  end
34
34
 
35
- class ProjectMembership
35
+ class ::ProjectMembership
36
36
 
37
37
  include DataMapper::Resource
38
38
 
@@ -43,7 +43,7 @@ describe "Person.has(n, :projects, :through => :project_memberships);" do
43
43
 
44
44
  end
45
45
 
46
- class Task
46
+ class ::Task
47
47
 
48
48
  include DataMapper::Resource
49
49
 
@@ -54,7 +54,7 @@ describe "Person.has(n, :projects, :through => :project_memberships);" do
54
54
 
55
55
  end
56
56
 
57
- DataMapper.auto_upgrade!
57
+ DataMapper.auto_migrate!
58
58
 
59
59
  end
60
60
 
@@ -4,7 +4,7 @@ describe "Profile.belongs_to(:person);" do
4
4
 
5
5
  before(:all) do
6
6
 
7
- class Person
7
+ class ::Person
8
8
 
9
9
  include DataMapper::Resource
10
10
  extend ConstraintSupport
@@ -16,7 +16,7 @@ describe "Profile.belongs_to(:person);" do
16
16
 
17
17
  end
18
18
 
19
- class Profile
19
+ class ::Profile
20
20
 
21
21
  include DataMapper::Resource
22
22
 
@@ -28,7 +28,7 @@ describe "Profile.belongs_to(:person);" do
28
28
 
29
29
  end
30
30
 
31
- DataMapper.auto_upgrade!
31
+ DataMapper.auto_migrate!
32
32
 
33
33
  end
34
34
 
@@ -4,7 +4,7 @@ describe "Project.has(n, :tasks);" do
4
4
 
5
5
  before(:all) do
6
6
 
7
- class Project
7
+ class ::Project
8
8
 
9
9
  include DataMapper::Resource
10
10
  extend ConstraintSupport
@@ -16,7 +16,7 @@ describe "Project.has(n, :tasks);" do
16
16
 
17
17
  end
18
18
 
19
- class Task
19
+ class ::Task
20
20
 
21
21
  include DataMapper::Resource
22
22
 
@@ -27,7 +27,7 @@ describe "Project.has(n, :tasks);" do
27
27
 
28
28
  end
29
29
 
30
- DataMapper.auto_upgrade!
30
+ DataMapper.auto_migrate!
31
31
 
32
32
  end
33
33
 
@@ -4,7 +4,7 @@ describe "Person.has(1, :profile);" do
4
4
 
5
5
  before(:all) do
6
6
 
7
- class Person
7
+ class ::Person
8
8
 
9
9
  include DataMapper::Resource
10
10
  extend ConstraintSupport
@@ -17,7 +17,7 @@ describe "Person.has(1, :profile);" do
17
17
 
18
18
  end
19
19
 
20
- class Profile
20
+ class ::Profile
21
21
 
22
22
  include DataMapper::Resource
23
23
 
@@ -29,7 +29,7 @@ describe "Person.has(1, :profile);" do
29
29
 
30
30
  end
31
31
 
32
- class Address
32
+ class ::Address
33
33
 
34
34
  include DataMapper::Resource
35
35
 
@@ -41,7 +41,7 @@ describe "Person.has(1, :profile);" do
41
41
 
42
42
  end
43
43
 
44
- DataMapper.auto_upgrade!
44
+ DataMapper.auto_migrate!
45
45
 
46
46
  end
47
47
 
@@ -1,26 +1,28 @@
1
1
  describe "every accessible many_to_many association", :shared => true do
2
2
 
3
3
  it "should allow to update an existing project via Person#projects_attributes" do
4
- Person.all.size.should == 0
5
- Project.all.size.should == 0
6
- ProjectMembership.all.size.should == 0
4
+ pending_if "#{DataMapper::Spec.adapter_name} doesn't support M2M", !HAS_M2M_SUPPORT do
5
+ Person.all.size.should == 0
6
+ Project.all.size.should == 0
7
+ ProjectMembership.all.size.should == 0
7
8
 
8
- person = Person.create :name => 'snusnu'
9
- project = Project.create(:name => 'dm-accepts_nested_attributes')
10
- project_membership = ProjectMembership.create(:person => person, :project => project)
9
+ person = Person.create :name => 'snusnu'
10
+ project = Project.create(:name => 'dm-accepts_nested_attributes')
11
+ project_membership = ProjectMembership.create(:person => person, :project => project)
11
12
 
12
- Person.all.size.should == 1
13
- Project.all.size.should == 1
14
- ProjectMembership.all.size.should == 1
13
+ Person.all.size.should == 1
14
+ Project.all.size.should == 1
15
+ ProjectMembership.all.size.should == 1
15
16
 
16
- person.projects_attributes = [{ :id => project.id, :name => 'still dm-accepts_nested_attributes' }]
17
- person.save
17
+ person.projects_attributes = [{ :id => project.id, :name => 'still dm-accepts_nested_attributes' }]
18
+ person.save
18
19
 
19
- Person.all.size.should == 1
20
- ProjectMembership.all.size.should == 1
21
- Project.all.size.should == 1
20
+ Person.all.size.should == 1
21
+ ProjectMembership.all.size.should == 1
22
+ Project.all.size.should == 1
22
23
 
23
- Project.first.name.should == 'still dm-accepts_nested_attributes'
24
+ Project.first.name.should == 'still dm-accepts_nested_attributes'
25
+ end
24
26
  end
25
27
 
26
28
  it "should return the attributes written to Person#projects_attributes from the Person#projects_attributes reader" do
@@ -83,26 +85,6 @@ describe "every accessible many_to_many association with no reject_if proc", :sh
83
85
  Project.first.name.should == 'dm-accepts_nested_attributes'
84
86
  end
85
87
 
86
- it "should perform atomic commits" do
87
-
88
- person = Person.new :name => 'snusnu'
89
- person.projects_attributes = [{ :name => nil }] # should fail because of validations
90
- person.save
91
-
92
- Person.all.size.should == 0 # TODO think more if this should be '1'
93
- ProjectMembership.all.size.should == 0
94
- Project.all.size.should == 0
95
-
96
- person.name = nil # should fail because of validations
97
- person.projects_attributes = [{ :name => nil }]
98
- person.save
99
-
100
- Person.all.size.should == 0
101
- ProjectMembership.all.size.should == 0
102
- Project.all.size.should == 0
103
-
104
- end
105
-
106
88
  end
107
89
 
108
90
  describe "every accessible many_to_many association with :allow_destroy => false", :shared => true do
@@ -135,28 +117,30 @@ end
135
117
  describe "every accessible many_to_many association with :allow_destroy => true", :shared => true do
136
118
 
137
119
  it "should allow to delete an existing project via Person#projects_attributes" do
138
- person = Person.create :name => 'snusnu'
120
+ pending_if "#{DataMapper::Spec.adapter_name} doesn't support M2M", !HAS_M2M_SUPPORT do
121
+ person = Person.create :name => 'snusnu'
139
122
 
140
- project_1 = Project.create(:name => 'dm-accepts_nested_attributes')
141
- project_2 = Project.create(:name => 'dm-is-localizable')
142
- project_membership_1 = ProjectMembership.create(:person => person, :project => project_1)
143
- project_membership_2 = ProjectMembership.create(:person => person, :project => project_2)
123
+ project_1 = Project.create(:name => 'dm-accepts_nested_attributes')
124
+ project_2 = Project.create(:name => 'dm-is-localizable')
125
+ project_membership_1 = ProjectMembership.create(:person => person, :project => project_1)
126
+ project_membership_2 = ProjectMembership.create(:person => person, :project => project_2)
144
127
 
145
- Person.all.size.should == 1
146
- ProjectMembership.all.size.should == 2
147
- Project.all.size.should == 2
128
+ Person.all.size.should == 1
129
+ ProjectMembership.all.size.should == 2
130
+ Project.all.size.should == 2
148
131
 
149
- person.projects_attributes = [{ :id => project_1.id, :_delete => true }]
132
+ person.projects_attributes = [{ :id => project_1.id, :_delete => true }]
150
133
 
151
- Person.all.size.should == 1
152
- ProjectMembership.all.size.should == 2
153
- Project.all.size.should == 2
134
+ Person.all.size.should == 1
135
+ ProjectMembership.all.size.should == 2
136
+ Project.all.size.should == 2
154
137
 
155
- person.save
138
+ person.save
156
139
 
157
- Person.all.size.should == 1
158
- ProjectMembership.all.size.should == 1
159
- Project.all.size.should == 1
140
+ Person.all.size.should == 1
141
+ ProjectMembership.all.size.should == 1
142
+ Project.all.size.should == 1
143
+ end
160
144
  end
161
145
 
162
146
  end
@@ -21,27 +21,6 @@ describe "every accessible many_to_one association", :shared => true do
21
21
  Person.first.name.should == 'Martin Gamsjaeger'
22
22
  end
23
23
 
24
- it "should perform atomic commits" do
25
- Profile.all.size.should == 0
26
- Person.all.size.should == 0
27
-
28
- # related resource is invalid
29
- profile = Profile.new :nick => 'snusnu'
30
- profile.person_attributes = { :name => nil }
31
- profile.save.should be_false
32
-
33
- Profile.all.size.should == 0
34
- Person.all.size.should == 0
35
-
36
- # self is invalid
37
- profile.nick = nil
38
- profile.person_attributes = { :name => 'Martin' }
39
- profile.save.should be_false
40
-
41
- Profile.all.size.should == 0
42
- Person.all.size.should == 0
43
- end
44
-
45
24
  it "should return the attributes written to Profile#person_attributes from the Profile#person_attributes reader" do
46
25
  profile = Profile.new :nick => 'snusnu'
47
26
  profile.person_attributes.should be_nil
@@ -63,10 +42,11 @@ describe "every accessible many_to_one association with a valid reject_if proc",
63
42
  Profile.all.size.should == 0
64
43
  Person.all.size.should == 0
65
44
 
66
- profile.save.should be_false
67
-
68
- Profile.all.size.should == 0
69
- Person.all.size.should == 0
45
+ begin
46
+ profile.save.should be(false)
47
+ rescue
48
+ # swallow native FK errors which is basically like expecting save to be false
49
+ end
70
50
  end
71
51
 
72
52
  end
@@ -61,27 +61,6 @@ describe "every accessible one_to_many association with no reject_if proc", :sha
61
61
  Task.first.name.should == 'write specs'
62
62
  end
63
63
 
64
- it "should perform atomic commits" do
65
- Project.all.size.should == 0
66
- Task.all.size.should == 0
67
-
68
- # self is invalid
69
- project = Project.new :name => nil
70
- project.tasks_attributes = [{ :name => 'write specs' }]
71
- project.save.should be_false
72
-
73
- Project.all.size.should == 0
74
- Task.all.size.should == 0
75
-
76
- # related resource is invalid
77
- project.name = 'dm-accepts_nested_attributes'
78
- project.tasks_attributes = [{ :name => nil }] # will fail because of validations
79
- project.save
80
-
81
- Project.all.size.should == 0
82
- Task.all.size.should == 0
83
- end
84
-
85
64
  end
86
65
 
87
66
  describe "every accessible one_to_many association with :allow_destroy => false", :shared => true do
@@ -60,25 +60,6 @@ describe "every accessible one_to_one association with no reject_if proc", :shar
60
60
  Profile.first.nick.should == 'snusnu'
61
61
  end
62
62
 
63
- it "should perform atomic commits" do
64
-
65
- # related resource is invalid
66
- person = Person.new :name => 'Martin'
67
- person.profile_attributes = { :nick => nil } # will fail because of validations
68
- person.save.should be_false
69
-
70
- Person.all.size.should == 0
71
- Profile.all.size.should == 0
72
-
73
- # self is invalid
74
- person.name = nil # will fail because of validations
75
- person.profile_attributes = { :nick => 'snusnu' }
76
- person.save.should be_false
77
-
78
- Person.all.size.should == 0
79
- Profile.all.size.should == 0
80
- end
81
-
82
63
  end
83
64
 
84
65
  describe "every accessible one_to_one association with :allow_destroy => false", :shared => true do
data/spec/spec_helper.rb CHANGED
@@ -1,44 +1,16 @@
1
- require 'rubygems'
2
- require 'pathname'
3
- require 'spec'
1
+ require 'dm-core/spec/setup'
2
+ require 'dm-core/spec/lib/pending_helpers'
4
3
 
5
- # require the plugin
6
4
  require 'dm-accepts_nested_attributes'
7
5
 
8
- # allow testing with dm-validations enabled
9
- # must be required after the plugin, since
10
- # dm-validations seems to need dm-core
11
- require 'dm-validations'
12
- require 'dm-constraints'
13
-
14
- ENV["SQLITE3_SPEC_URI"] ||= 'sqlite3::memory:'
15
- ENV["MYSQL_SPEC_URI"] ||= 'mysql://localhost/dm-accepts_nested_attributes_test'
16
- ENV["POSTGRES_SPEC_URI"] ||= 'postgres://postgres@localhost/dm-accepts_nested_attributes_test'
17
-
18
-
19
- def setup_adapter(name, default_uri = nil)
20
- begin
21
- DataMapper.setup(name, ENV["#{ENV['ADAPTER'].to_s.upcase}_SPEC_URI"] || default_uri)
22
- Object.const_set('ADAPTER', ENV['ADAPTER'].to_sym) if name.to_s == ENV['ADAPTER']
23
- true
24
- rescue Exception => e
25
- if name.to_s == ENV['ADAPTER']
26
- Object.const_set('ADAPTER', nil)
27
- warn "Could not load do_#{name}: #{e}"
28
- end
29
- false
30
- end
31
- end
32
-
33
- ENV['ADAPTER'] ||= 'mysql'
34
- setup_adapter(:default)
35
-
36
-
37
6
  require 'shared/many_to_many_spec'
38
7
  require 'shared/many_to_one_spec'
39
8
  require 'shared/one_to_many_spec'
40
9
  require 'shared/one_to_one_spec'
41
10
 
11
+ DataMapper::Spec.setup
12
+
13
+ HAS_M2M_SUPPORT = !%w[in_memory yaml].include?(DataMapper::Spec.adapter_name)
42
14
 
43
15
  module ConstraintSupport
44
16
 
@@ -51,3 +23,15 @@ module ConstraintSupport
51
23
  end
52
24
 
53
25
  end
26
+
27
+ Spec::Runner.configure do |config|
28
+
29
+ config.include(DataMapper::Spec::PendingHelpers)
30
+
31
+ config.after(:suite) do
32
+ if DataMapper.respond_to?(:auto_migrate_down!, true)
33
+ DataMapper.send(:auto_migrate_down!, DataMapper::Spec.adapter.name)
34
+ end
35
+ end
36
+
37
+ end
@@ -0,0 +1,18 @@
1
+ desc "Support bundling from local source code (allows BUNDLE_GEMFILE=Gemfile.local bundle foo)"
2
+ task :local_gemfile do |t|
3
+
4
+ root = Pathname(__FILE__).dirname.parent
5
+ datamapper = root.parent
6
+
7
+ source_regex = /DATAMAPPER = 'git:\/\/github.com\/datamapper'/
8
+ gem_source_regex = /:git => \"#\{DATAMAPPER\}\/(.+?)(?:\.git)?\"/
9
+
10
+ root.join('Gemfile.local').open('w') do |f|
11
+ root.join('Gemfile').open.each do |line|
12
+ line.sub!(source_regex, "DATAMAPPER = '#{datamapper}'")
13
+ line.sub!(gem_source_regex, ':path => "#{DATAMAPPER}/\1"')
14
+ f.puts line
15
+ end
16
+ end
17
+
18
+ end
data/tasks/spec.rake CHANGED
@@ -19,7 +19,4 @@ RCov::VerifyTask.new(:verify_rcov => :rcov) do |rcov|
19
19
  rcov.threshold = 100
20
20
  end
21
21
 
22
- task :spec => :check_dependencies
23
- task :rcov => :check_dependencies
24
-
25
22
  task :default => :spec
metadata CHANGED
@@ -1,47 +1,71 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dm-accepts_nested_attributes
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.12.0
4
+ hash: 144173629
5
+ prerelease: true
6
+ segments:
7
+ - 1
8
+ - 0
9
+ - 0
10
+ - rc1
11
+ version: 1.0.0.rc1
5
12
  platform: ruby
6
13
  authors:
7
- - Martin Gamsjaeger
14
+ - Martin Gamsjaeger (snusnu)
8
15
  autorequire:
9
16
  bindir: bin
10
17
  cert_chain: []
11
18
 
12
- date: 2010-01-23 00:00:00 +01:00
19
+ date: 2010-05-20 00:00:00 +02:00
13
20
  default_executable:
14
21
  dependencies:
15
22
  - !ruby/object:Gem::Dependency
16
23
  name: dm-core
17
- type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
24
+ prerelease: false
25
+ requirement: &id001 !ruby/object:Gem::Requirement
26
+ none: false
20
27
  requirements:
21
28
  - - ~>
22
29
  - !ruby/object:Gem::Version
23
- version: 0.10.2
24
- version:
30
+ hash: 144173629
31
+ segments:
32
+ - 1
33
+ - 0
34
+ - 0
35
+ - rc1
36
+ version: 1.0.0.rc1
37
+ type: :runtime
38
+ version_requirements: *id001
25
39
  - !ruby/object:Gem::Dependency
26
40
  name: rspec
27
- type: :development
28
- version_requirement:
29
- version_requirements: !ruby/object:Gem::Requirement
41
+ prerelease: false
42
+ requirement: &id002 !ruby/object:Gem::Requirement
43
+ none: false
30
44
  requirements:
31
45
  - - ~>
32
46
  - !ruby/object:Gem::Version
33
- version: 1.2.9
34
- version:
47
+ hash: 9
48
+ segments:
49
+ - 1
50
+ - 3
51
+ version: "1.3"
52
+ type: :development
53
+ version_requirements: *id002
35
54
  - !ruby/object:Gem::Dependency
36
55
  name: yard
37
- type: :development
38
- version_requirement:
39
- version_requirements: !ruby/object:Gem::Requirement
56
+ prerelease: false
57
+ requirement: &id003 !ruby/object:Gem::Requirement
58
+ none: false
40
59
  requirements:
41
60
  - - ~>
42
61
  - !ruby/object:Gem::Version
43
- version: 0.4.0
44
- version:
62
+ hash: 1
63
+ segments:
64
+ - 0
65
+ - 5
66
+ version: "0.5"
67
+ type: :development
68
+ version_requirements: *id003
45
69
  description: A datamapper plugin that allows nested model assignment like activerecord.
46
70
  email: gamsnjaga [a] gmail [d] com
47
71
  executables: []
@@ -55,16 +79,16 @@ extra_rdoc_files:
55
79
  files:
56
80
  - .gitignore
57
81
  - CHANGELOG
82
+ - Gemfile
58
83
  - LICENSE
59
84
  - README.textile
60
85
  - Rakefile
61
86
  - TODO
87
+ - VERSION
62
88
  - dm-accepts_nested_attributes.gemspec
63
89
  - lib/dm-accepts_nested_attributes.rb
64
- - lib/dm-accepts_nested_attributes/error_collecting.rb
65
90
  - lib/dm-accepts_nested_attributes/model.rb
66
91
  - lib/dm-accepts_nested_attributes/resource.rb
67
- - lib/dm-accepts_nested_attributes/transactional_save.rb
68
92
  - lib/dm-accepts_nested_attributes/version.rb
69
93
  - spec/accepts_nested_attributes_for_spec.rb
70
94
  - spec/many_to_many_spec.rb
@@ -80,6 +104,7 @@ files:
80
104
  - spec/spec_helper.rb
81
105
  - tasks/changelog.rake
82
106
  - tasks/ci.rake
107
+ - tasks/local_gemfile.rake
83
108
  - tasks/metrics.rake
84
109
  - tasks/spec.rake
85
110
  - tasks/yard.rake
@@ -94,21 +119,29 @@ rdoc_options:
94
119
  require_paths:
95
120
  - lib
96
121
  required_ruby_version: !ruby/object:Gem::Requirement
122
+ none: false
97
123
  requirements:
98
124
  - - ">="
99
125
  - !ruby/object:Gem::Version
126
+ hash: 3
127
+ segments:
128
+ - 0
100
129
  version: "0"
101
- version:
102
130
  required_rubygems_version: !ruby/object:Gem::Requirement
131
+ none: false
103
132
  requirements:
104
- - - ">="
133
+ - - ">"
105
134
  - !ruby/object:Gem::Version
106
- version: "0"
107
- version:
135
+ hash: 25
136
+ segments:
137
+ - 1
138
+ - 3
139
+ - 1
140
+ version: 1.3.1
108
141
  requirements: []
109
142
 
110
143
  rubyforge_project:
111
- rubygems_version: 1.3.5
144
+ rubygems_version: 1.3.7
112
145
  signing_key:
113
146
  specification_version: 3
114
147
  summary: Nested model assignment for datamapper
@@ -1,35 +0,0 @@
1
- module DataMapper
2
- module NestedAttributes
3
-
4
- module ValidationErrorCollecting
5
-
6
- # collect errors on parent associations
7
- def before_save_parent_association(association, context)
8
- if association.respond_to?(:each)
9
- association.each do |r|
10
- unless r.valid?(context)
11
- r.errors.each { |e| self.errors.add(:general, e) }
12
- end
13
- end
14
- else
15
- unless association.valid?(context)
16
- association.errors.each { |e| self.errors.add(:general, e) }
17
- end
18
- end
19
- end
20
-
21
- # collect errors on child associations
22
- def before_save_child_association(association, context)
23
- if association.respond_to?(:valid?)
24
- unless association.valid?(context)
25
- association.errors.each { |e| self.errors.add(:general, e) }
26
- end
27
- else
28
- self.errors.add(:general, "child association is missing")
29
- end
30
- end
31
-
32
- end
33
-
34
- end
35
- end
@@ -1,24 +0,0 @@
1
- module DataMapper
2
- module NestedAttributes
3
-
4
- module TransactionalSave
5
-
6
- ##
7
- # Overrides @see DataMapper::Resource#save to perform inside a transaction.
8
- # The current implementation simply wraps the saving of the complete object tree
9
- # inside a transaction and rolls back in case any exceptions are raised,
10
- # or any of the calls to
11
- #
12
- # @see DataMapper::Resource#save
13
- #
14
- # @return [Boolean]
15
- # true if all related resources were saved properly
16
- #
17
- def save
18
- transaction { |t| super || t.rollback && false }
19
- end
20
-
21
- end
22
-
23
- end
24
- end