dm-accepts_nested_attributes_for 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +970 -0
- data/Gemfile +84 -0
- data/LICENSE +20 -0
- data/README.textile +94 -0
- data/Rakefile +25 -0
- data/TODO +6 -0
- data/VERSION +1 -0
- data/dm-accepts_nested_attributes.gemspec +114 -0
- data/lib/dm-accepts_nested_attributes.rb +13 -0
- data/lib/dm-accepts_nested_attributes/model.rb +144 -0
- data/lib/dm-accepts_nested_attributes/relationship.rb +82 -0
- data/lib/dm-accepts_nested_attributes/resource.rb +382 -0
- data/lib/dm-accepts_nested_attributes/version.rb +7 -0
- data/spec/accepts_nested_attributes_for_spec.rb +408 -0
- data/spec/assign_nested_attributes_for_spec.rb +101 -0
- data/spec/comb/1-1_disjoint_spec.rb +67 -0
- data/spec/comb/1-1_overlapping_spec.rb +66 -0
- data/spec/comb/1-1_subset_spec.rb +65 -0
- data/spec/comb/1-1_superset_spec.rb +67 -0
- data/spec/comb/1-m_disjoint_spec.rb +71 -0
- data/spec/comb/1-m_overlapping_spec.rb +70 -0
- data/spec/comb/1-m_subset_spec.rb +65 -0
- data/spec/comb/1-m_superset_spec.rb +71 -0
- data/spec/comb/m-1_disjoint_spec.rb +71 -0
- data/spec/comb/m-1_overlapping_spec.rb +70 -0
- data/spec/comb/m-1_subset_spec.rb +65 -0
- data/spec/comb/m-1_superset_spec.rb +71 -0
- data/spec/comb/n-m_composite_spec.rb +141 -0
- data/spec/comb/n-m_surrogate_spec.rb +154 -0
- data/spec/many_to_many_composite_spec.rb +120 -0
- data/spec/many_to_many_spec.rb +129 -0
- data/spec/many_to_one_composite_spec.rb +120 -0
- data/spec/many_to_one_spec.rb +101 -0
- data/spec/one_to_many_composite_spec.rb +120 -0
- data/spec/one_to_many_spec.rb +100 -0
- data/spec/one_to_one_composite_spec.rb +150 -0
- data/spec/one_to_one_spec.rb +115 -0
- data/spec/rcov.opts +6 -0
- data/spec/resource_spec.rb +65 -0
- data/spec/shared/many_to_many_composite_spec.rb +149 -0
- data/spec/shared/many_to_many_spec.rb +146 -0
- data/spec/shared/many_to_one_composite_spec.rb +160 -0
- data/spec/shared/many_to_one_spec.rb +130 -0
- data/spec/shared/one_to_many_composite_spec.rb +159 -0
- data/spec/shared/one_to_many_spec.rb +107 -0
- data/spec/shared/one_to_one_composite_spec.rb +114 -0
- data/spec/shared/one_to_one_spec.rb +111 -0
- data/spec/spec.opts +4 -0
- data/spec/spec_helper.rb +50 -0
- data/spec/update_dirty_spec.rb +113 -0
- data/spec/update_multiple_spec.rb +79 -0
- data/tasks/changelog.rake +20 -0
- data/tasks/ci.rake +1 -0
- data/tasks/local_gemfile.rake +18 -0
- data/tasks/spec.rake +22 -0
- data/tasks/yard.rake +9 -0
- data/tasks/yardstick.rake +19 -0
- metadata +216 -0
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "Person.has(n, :memberships)" do
|
4
|
+
|
5
|
+
before(:all) do
|
6
|
+
class ::Project
|
7
|
+
include DataMapper::Resource
|
8
|
+
extend ConstraintSupport
|
9
|
+
|
10
|
+
property :id, Integer, :key => true, :min => 0
|
11
|
+
property :name, String, :required => true
|
12
|
+
|
13
|
+
has n, :memberships, constraint(:destroy)
|
14
|
+
has n, :people, :through => :memberships
|
15
|
+
end
|
16
|
+
|
17
|
+
class ::Person
|
18
|
+
include DataMapper::Resource
|
19
|
+
extend ConstraintSupport
|
20
|
+
|
21
|
+
property :id, Integer, :key => true, :min => 0
|
22
|
+
property :name, String, :required => true
|
23
|
+
|
24
|
+
has n, :memberships, constraint(:destroy)
|
25
|
+
has n, :projects, :through => :memberships
|
26
|
+
accepts_nested_attributes_for :memberships, :allow_destroy => true
|
27
|
+
end
|
28
|
+
|
29
|
+
class ::Membership
|
30
|
+
include DataMapper::Resource
|
31
|
+
|
32
|
+
property :person_id, Integer, :key => true, :min => 0
|
33
|
+
property :project_id, Integer, :key => true, :min => 0
|
34
|
+
property :role, String, :required => true
|
35
|
+
|
36
|
+
belongs_to :person
|
37
|
+
belongs_to :project
|
38
|
+
|
39
|
+
accepts_nested_attributes_for :person
|
40
|
+
accepts_nested_attributes_for :project
|
41
|
+
end
|
42
|
+
|
43
|
+
DataMapper.auto_migrate!
|
44
|
+
end
|
45
|
+
|
46
|
+
before(:each) do
|
47
|
+
Membership.all.destroy!
|
48
|
+
Person.all.destroy!
|
49
|
+
Project.all.destroy!
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should add, update and remove memberships together in a single attribute assignment" do
|
53
|
+
person = Person.create(:id => 1, :name => 'snusnu')
|
54
|
+
project1 = Project.create(:id => 10, :name => 'dm-accepts_nested_attributes')
|
55
|
+
project2 = Project.create(:id => 20, :name => 'dm-core')
|
56
|
+
project3 = Project.create(:id => 30, :name => 'dm-validations')
|
57
|
+
Membership.create(:person => person, :project => project1, :role => 'maintainer')
|
58
|
+
Membership.create(:person => person, :project => project2, :role => 'contributor')
|
59
|
+
|
60
|
+
person.memberships_attributes = [
|
61
|
+
{ :project_id => project1.id, :role => 'still maintainer' }, # update
|
62
|
+
{ :project_id => project2.id, :_delete => true }, # remove
|
63
|
+
{ :project_id => project3.id, :role => 'user' }, # add
|
64
|
+
]
|
65
|
+
person.save
|
66
|
+
|
67
|
+
Person.all.size.should == 1
|
68
|
+
Person.first.attributes.should == { :id => 1, :name => 'snusnu' }
|
69
|
+
Project.all(:order => :id).map { |r| r.attributes }.should == [
|
70
|
+
{ :id => 10, :name => 'dm-accepts_nested_attributes' },
|
71
|
+
{ :id => 20, :name => 'dm-core' },
|
72
|
+
{ :id => 30, :name => 'dm-validations' }
|
73
|
+
]
|
74
|
+
Membership.all(:order => [:person_id, :project_id]).map { |r| r.attributes }.should == [
|
75
|
+
{ :person_id => 1, :project_id => 10, :role => 'still maintainer' },
|
76
|
+
{ :person_id => 1, :project_id => 30, :role => 'user' }
|
77
|
+
]
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'time'
|
2
|
+
|
3
|
+
desc 'update changelog'
|
4
|
+
task :changelog do
|
5
|
+
File.open('CHANGELOG', 'w+') do |changelog|
|
6
|
+
`git log -z --abbrev-commit`.split("\0").each do |commit|
|
7
|
+
next if commit =~ /^Merge: \d*/
|
8
|
+
ref, author, time, _, title, _, message = commit.split("\n", 7)
|
9
|
+
ref = ref[/commit ([0-9a-f]+)/, 1]
|
10
|
+
author = author[/Author: (.*)/, 1].strip
|
11
|
+
time = Time.parse(time[/Date: (.*)/, 1]).utc
|
12
|
+
title.strip!
|
13
|
+
|
14
|
+
changelog.puts "[#{ref} | #{time}] #{author}"
|
15
|
+
changelog.puts '', " * #{title}"
|
16
|
+
changelog.puts '', message.rstrip if message
|
17
|
+
changelog.puts
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/tasks/ci.rake
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
task :ci => [ :verify_measurements, 'metrics:all' ]
|
@@ -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
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'spec/rake/spectask'
|
2
|
+
require 'spec/rake/verify_rcov'
|
3
|
+
|
4
|
+
spec_defaults = lambda do |spec|
|
5
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
6
|
+
spec.libs << 'lib' << 'spec'
|
7
|
+
spec.spec_opts << '--options' << 'spec/spec.opts'
|
8
|
+
end
|
9
|
+
|
10
|
+
Spec::Rake::SpecTask.new(:spec, &spec_defaults)
|
11
|
+
|
12
|
+
Spec::Rake::SpecTask.new(:rcov) do |rcov|
|
13
|
+
spec_defaults.call(rcov)
|
14
|
+
rcov.rcov = true
|
15
|
+
rcov.rcov_opts = File.read('spec/rcov.opts').split(/\s+/)
|
16
|
+
end
|
17
|
+
|
18
|
+
RCov::VerifyTask.new(:verify_rcov => :rcov) do |rcov|
|
19
|
+
rcov.threshold = 100
|
20
|
+
end
|
21
|
+
|
22
|
+
task :default => :spec
|
data/tasks/yard.rake
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
begin
|
2
|
+
require 'pathname'
|
3
|
+
require 'yardstick/rake/measurement'
|
4
|
+
require 'yardstick/rake/verify'
|
5
|
+
|
6
|
+
# yardstick_measure task
|
7
|
+
Yardstick::Rake::Measurement.new
|
8
|
+
|
9
|
+
# verify_measurements task
|
10
|
+
Yardstick::Rake::Verify.new do |verify|
|
11
|
+
verify.threshold = 100
|
12
|
+
end
|
13
|
+
rescue LoadError
|
14
|
+
%w[ yardstick_measure verify_measurements ].each do |name|
|
15
|
+
task name.to_s do
|
16
|
+
abort "Yardstick is not available. In order to run #{name}, you must: gem install yardstick"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
metadata
ADDED
@@ -0,0 +1,216 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: dm-accepts_nested_attributes_for
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.2.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Martin Gamsjaeger (snusnu)
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-09-23 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: dm-core
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 1.2.0
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 1.2.0
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: dm-validations
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ~>
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 1.2.0
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 1.2.0
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: dm-constraints
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ~>
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 1.2.0
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 1.2.0
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: rake
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ~>
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 0.9.2
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 0.9.2
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: rspec
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ~>
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: 1.3.2
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ~>
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: 1.3.2
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: yard
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ~>
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: 0.7.2
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ~>
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: 0.7.2
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: jeweler
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ~>
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 1.6.4
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ~>
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: 1.6.4
|
126
|
+
description: A datamapper plugin that allows nested model assignment like activerecord.
|
127
|
+
email: gamsnjaga [a] gmail [d] com
|
128
|
+
executables: []
|
129
|
+
extensions: []
|
130
|
+
extra_rdoc_files:
|
131
|
+
- LICENSE
|
132
|
+
- README.textile
|
133
|
+
- TODO
|
134
|
+
files:
|
135
|
+
- CHANGELOG
|
136
|
+
- Gemfile
|
137
|
+
- LICENSE
|
138
|
+
- README.textile
|
139
|
+
- Rakefile
|
140
|
+
- TODO
|
141
|
+
- VERSION
|
142
|
+
- dm-accepts_nested_attributes.gemspec
|
143
|
+
- lib/dm-accepts_nested_attributes.rb
|
144
|
+
- lib/dm-accepts_nested_attributes/model.rb
|
145
|
+
- lib/dm-accepts_nested_attributes/relationship.rb
|
146
|
+
- lib/dm-accepts_nested_attributes/resource.rb
|
147
|
+
- lib/dm-accepts_nested_attributes/version.rb
|
148
|
+
- spec/accepts_nested_attributes_for_spec.rb
|
149
|
+
- spec/assign_nested_attributes_for_spec.rb
|
150
|
+
- spec/comb/1-1_disjoint_spec.rb
|
151
|
+
- spec/comb/1-1_overlapping_spec.rb
|
152
|
+
- spec/comb/1-1_subset_spec.rb
|
153
|
+
- spec/comb/1-1_superset_spec.rb
|
154
|
+
- spec/comb/1-m_disjoint_spec.rb
|
155
|
+
- spec/comb/1-m_overlapping_spec.rb
|
156
|
+
- spec/comb/1-m_subset_spec.rb
|
157
|
+
- spec/comb/1-m_superset_spec.rb
|
158
|
+
- spec/comb/m-1_disjoint_spec.rb
|
159
|
+
- spec/comb/m-1_overlapping_spec.rb
|
160
|
+
- spec/comb/m-1_subset_spec.rb
|
161
|
+
- spec/comb/m-1_superset_spec.rb
|
162
|
+
- spec/comb/n-m_composite_spec.rb
|
163
|
+
- spec/comb/n-m_surrogate_spec.rb
|
164
|
+
- spec/many_to_many_composite_spec.rb
|
165
|
+
- spec/many_to_many_spec.rb
|
166
|
+
- spec/many_to_one_composite_spec.rb
|
167
|
+
- spec/many_to_one_spec.rb
|
168
|
+
- spec/one_to_many_composite_spec.rb
|
169
|
+
- spec/one_to_many_spec.rb
|
170
|
+
- spec/one_to_one_composite_spec.rb
|
171
|
+
- spec/one_to_one_spec.rb
|
172
|
+
- spec/rcov.opts
|
173
|
+
- spec/resource_spec.rb
|
174
|
+
- spec/shared/many_to_many_composite_spec.rb
|
175
|
+
- spec/shared/many_to_many_spec.rb
|
176
|
+
- spec/shared/many_to_one_composite_spec.rb
|
177
|
+
- spec/shared/many_to_one_spec.rb
|
178
|
+
- spec/shared/one_to_many_composite_spec.rb
|
179
|
+
- spec/shared/one_to_many_spec.rb
|
180
|
+
- spec/shared/one_to_one_composite_spec.rb
|
181
|
+
- spec/shared/one_to_one_spec.rb
|
182
|
+
- spec/spec.opts
|
183
|
+
- spec/spec_helper.rb
|
184
|
+
- spec/update_dirty_spec.rb
|
185
|
+
- spec/update_multiple_spec.rb
|
186
|
+
- tasks/changelog.rake
|
187
|
+
- tasks/ci.rake
|
188
|
+
- tasks/local_gemfile.rake
|
189
|
+
- tasks/spec.rake
|
190
|
+
- tasks/yard.rake
|
191
|
+
- tasks/yardstick.rake
|
192
|
+
homepage: http://github.com/snusnu/dm-accepts_nested_attributes
|
193
|
+
licenses: []
|
194
|
+
post_install_message:
|
195
|
+
rdoc_options: []
|
196
|
+
require_paths:
|
197
|
+
- lib
|
198
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
199
|
+
none: false
|
200
|
+
requirements:
|
201
|
+
- - ! '>='
|
202
|
+
- !ruby/object:Gem::Version
|
203
|
+
version: '0'
|
204
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
205
|
+
none: false
|
206
|
+
requirements:
|
207
|
+
- - ! '>='
|
208
|
+
- !ruby/object:Gem::Version
|
209
|
+
version: '0'
|
210
|
+
requirements: []
|
211
|
+
rubyforge_project:
|
212
|
+
rubygems_version: 1.8.24
|
213
|
+
signing_key:
|
214
|
+
specification_version: 3
|
215
|
+
summary: Nested model assignment for datamapper
|
216
|
+
test_files: []
|