ardm-rails 1.2.1

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.
Files changed (44) hide show
  1. checksums.yaml +7 -0
  2. data/.document +5 -0
  3. data/.gitignore +35 -0
  4. data/.travis.yml +11 -0
  5. data/Gemfile +47 -0
  6. data/LICENSE +20 -0
  7. data/README.rdoc +595 -0
  8. data/Rakefile +4 -0
  9. data/VERSION +1 -0
  10. data/ardm-rails.gemspec +27 -0
  11. data/lib/ardm-rails.rb +1 -0
  12. data/lib/dm-rails/configuration.rb +76 -0
  13. data/lib/dm-rails/mass_assignment_security.rb +89 -0
  14. data/lib/dm-rails/middleware/identity_map.rb +20 -0
  15. data/lib/dm-rails/multiparameter_attributes.rb +167 -0
  16. data/lib/dm-rails/railtie.rb +100 -0
  17. data/lib/dm-rails/railties/controller_runtime.rb +45 -0
  18. data/lib/dm-rails/railties/database.rake +106 -0
  19. data/lib/dm-rails/railties/i18n_support.rb +12 -0
  20. data/lib/dm-rails/railties/log_listener.rb +39 -0
  21. data/lib/dm-rails/railties/log_subscriber.rb +54 -0
  22. data/lib/dm-rails/session_store.rb +70 -0
  23. data/lib/dm-rails/setup.rb +84 -0
  24. data/lib/dm-rails/storage.rb +209 -0
  25. data/lib/dm-rails/version.rb +5 -0
  26. data/lib/dm-rails.rb +1 -0
  27. data/lib/generators/data_mapper/migration/migration_generator.rb +30 -0
  28. data/lib/generators/data_mapper/migration/templates/migration.rb +23 -0
  29. data/lib/generators/data_mapper/model/model_generator.rb +23 -0
  30. data/lib/generators/data_mapper/model/templates/model.rb +11 -0
  31. data/lib/generators/data_mapper/observer/observer_generator.rb +19 -0
  32. data/lib/generators/data_mapper/observer/templates/observer.rb +7 -0
  33. data/lib/generators/data_mapper.rb +82 -0
  34. data/spec/models/fake.rb +31 -0
  35. data/spec/models/topic.rb +11 -0
  36. data/spec/spec.opts +3 -0
  37. data/spec/spec_helper.rb +19 -0
  38. data/spec/unit/mass_assignment_security_spec.rb +43 -0
  39. data/spec/unit/multiparameter_attributes_spec.rb +168 -0
  40. data/tasks/clean.rake +6 -0
  41. data/tasks/spec.rake +17 -0
  42. data/tasks/yard.rake +9 -0
  43. data/tasks/yardstick.rake +20 -0
  44. metadata +188 -0
@@ -0,0 +1,43 @@
1
+ require 'spec_helper'
2
+ require 'dm-rails/mass_assignment_security'
3
+
4
+ # Because mass-assignment security is based on ActiveModel we just have to
5
+ # ensure that ActiveModel is called.
6
+ describe DataMapper::MassAssignmentSecurity do
7
+ before :all do
8
+ class Fake
9
+ super_module = Module.new do
10
+ def _super_attributes=(*args)
11
+ end
12
+
13
+ def attributes=(*args)
14
+ self.send(:_super_attributes=, *args)
15
+ end
16
+ end
17
+ include super_module
18
+
19
+ include ::DataMapper::MassAssignmentSecurity
20
+ end
21
+ end
22
+
23
+ describe '#attributes=' do
24
+ it 'calls super with sanitized attributes' do
25
+ attributes = { :name => 'John', :is_admin => true }
26
+ sanitized_attributes = { :name => 'John' }
27
+ model = Fake.new
28
+ model.should_receive(:sanitize_for_mass_assignment).with(attributes).and_return(sanitized_attributes)
29
+ model.should_receive(:_super_attributes=).with(sanitized_attributes)
30
+
31
+ model.attributes = attributes
32
+ end
33
+
34
+ it 'skips sanitation when called with true' do
35
+ attributes = { :name => 'John', :is_admin => true }
36
+ sanitized_attributes = { :name => 'John' }
37
+ model = Fake.new
38
+ model.should_receive(:_super_attributes=).with(attributes)
39
+
40
+ model.send(:attributes=, attributes, true)
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,168 @@
1
+ require 'spec_helper'
2
+ require 'dm-rails/multiparameter_attributes'
3
+
4
+ # Since multiparameters are a feature of Rails some tests are based on the test
5
+ # suite of Rails.
6
+ describe Rails::DataMapper::MultiparameterAttributes do
7
+ before :all do
8
+ load Pathname(__FILE__).dirname.parent.join('models/topic.rb').expand_path
9
+ load Pathname(__FILE__).dirname.parent.join('models/fake.rb').expand_path
10
+ DataMapper.finalize
11
+ model = ::Rails::DataMapper::Models::Topic
12
+ model.auto_migrate! if model.respond_to?(:auto_migrate!)
13
+ end
14
+
15
+ describe '#attributes=' do
16
+ date_inputs = [
17
+ [ 'date',
18
+ { 'last_read(1i)' => '2004', 'last_read(2i)' => '6', 'last_read(3i)' => '24' },
19
+ Date.new(2004, 6, 24) ],
20
+ [ 'date with empty year',
21
+ { 'last_read(1i)' => '', 'last_read(2i)' => '6', 'last_read(3i)' => '24' },
22
+ Date.new(1, 6, 24) ],
23
+ [ 'date with empty month',
24
+ { 'last_read(1i)' => '2004', 'last_read(2i)' => '', 'last_read(3i)' => '24' },
25
+ Date.new(2004, 1, 24) ],
26
+ [ 'date with empty day',
27
+ { 'last_read(1i)' => '2004', 'last_read(2i)' => '6', 'last_read(3i)' => '' },
28
+ Date.new(2004, 6, 1) ],
29
+ [ 'date with empty day and year',
30
+ { 'last_read(1i)' => '', 'last_read(2i)' => '6', 'last_read(3i)' => '' },
31
+ Date.new(1, 6, 1) ],
32
+ [ 'date with empty day and month',
33
+ { 'last_read(1i)' => '2004', 'last_read(2i)' => '', 'last_read(3i)' => '' },
34
+ Date.new(2004, 1, 1) ],
35
+ [ 'date with empty year and month',
36
+ { 'last_read(1i)' => '', 'last_read(2i)' => '', 'last_read(3i)' => '24' },
37
+ Date.new(1, 1, 24) ],
38
+ [ 'date with all empty',
39
+ { 'last_read(1i)' => '', 'last_read(2i)' => '', 'last_read(3i)' => '' },
40
+ nil ],
41
+ ]
42
+
43
+ date_inputs.each do |(name, attributes, date)|
44
+ it "converts #{name}" do
45
+ topic = ::Rails::DataMapper::Models::Topic.new
46
+ topic.attributes = attributes
47
+ topic.last_read.should == date
48
+ end
49
+ end
50
+
51
+ time_inputs = [
52
+ [ 'time',
53
+ { 'written_on(1i)' => '2004', 'written_on(2i)' => '6', 'written_on(3i)' => '24',
54
+ 'written_on(4i)' => '16', 'written_on(5i)' => '24', 'written_on(6i)' => '00' },
55
+ Time.local(2004, 6, 24, 16, 24, 0) ],
56
+ [ 'time with old date',
57
+ { 'written_on(1i)' => '1901', 'written_on(2i)' => '12', 'written_on(3i)' => '31',
58
+ 'written_on(4i)' => '23', 'written_on(5i)' => '59', 'written_on(6i)' => '59' },
59
+ Time.local(1901, 12, 31, 23, 59, 59) ],
60
+ [ 'time with all empty',
61
+ { 'written_on(1i)' => '', 'written_on(2i)' => '', 'written_on(3i)' => '',
62
+ 'written_on(4i)' => '', 'written_on(5i)' => '', 'written_on(6i)' => '' },
63
+ nil ],
64
+ [ 'time with empty seconds',
65
+ { 'written_on(1i)' => '2004', 'written_on(2i)' => '6', 'written_on(3i)' => '24',
66
+ 'written_on(4i)' => '16', 'written_on(5i)' => '24', 'written_on(6i)' => '' },
67
+ Time.local(2004, 6, 24, 16, 24, 0) ],
68
+ ]
69
+
70
+ time_inputs.each do |(name, attributes, time)|
71
+ it "converts #{name}" do
72
+ topic = ::Rails::DataMapper::Models::Topic.new
73
+ topic.attributes = attributes
74
+ topic.written_on.should == time
75
+ end
76
+ end
77
+
78
+ date_time_inputs = [
79
+ [ 'datetime',
80
+ { 'updated_at(1i)' => '2004', 'updated_at(2i)' => '6', 'updated_at(3i)' => '24',
81
+ 'updated_at(4i)' => '16', 'updated_at(5i)' => '24', 'updated_at(6i)' => '00' },
82
+ DateTime.new(2004, 6, 24, 16, 24, 0) ],
83
+ ]
84
+
85
+ date_time_inputs.each do |(name, attributes, time)|
86
+ it "converts #{name}" do
87
+ topic = ::Rails::DataMapper::Models::Topic.new
88
+ topic.attributes = attributes
89
+ topic.updated_at.should == time
90
+ end
91
+ end
92
+
93
+ it 'calls super with merged multiparameters' do
94
+ multiparameter_hash = {
95
+ 'composite(1)' => 'a string',
96
+ 'composite(2)' => '1.5',
97
+ 'composite(3i)' => '1.5',
98
+ 'composite(4f)' => '1.5',
99
+ 'composite(5)' => '',
100
+ 'composite(6i)' => '',
101
+ 'composite(7f)' => '',
102
+ }
103
+ attributes = { 'composite' => Object.new }
104
+
105
+ ::Rails::DataMapper::Models::Composite.
106
+ should_receive(:new).
107
+ with('a string', '1.5', '1.5'.to_i, '1.5'.to_f).
108
+ and_return(attributes['composite'])
109
+
110
+ composite_property = mock(::DataMapper::Property)
111
+ composite_property.stub!(:primitive).and_return(::Rails::DataMapper::Models::Composite)
112
+
113
+ resource = ::Rails::DataMapper::Models::Fake.new
114
+ resource.stub!(:properties).and_return('composite' => composite_property)
115
+
116
+ resource.should_receive(:_super_attributes=).with(attributes)
117
+
118
+ resource.attributes = multiparameter_hash
119
+ end
120
+
121
+ it 'raises exception on failure' do
122
+ multiparameter_hash = { 'composite(1)' => 'a string' }
123
+ attributes = { 'composite' => Object.new }
124
+
125
+ composite_exception = StandardError.new('foo')
126
+ ::Rails::DataMapper::Models::Composite.
127
+ should_receive(:new).with('a string').and_raise(composite_exception)
128
+
129
+ composite_property = mock(::DataMapper::Property)
130
+ composite_property.stub!(:primitive).and_return(::Rails::DataMapper::Models::Composite)
131
+
132
+ resource = ::Rails::DataMapper::Models::Fake.new
133
+ resource.stub!(:properties).and_return('composite' => composite_property)
134
+
135
+ lambda { resource.attributes = multiparameter_hash }.
136
+ should raise_error(::Rails::DataMapper::MultiparameterAssignmentErrors) { |ex|
137
+ ex.errors.size.should == 1
138
+
139
+ error = ex.errors[0]
140
+ error.attribute.should == 'composite'
141
+ error.values.should == ['a string']
142
+ error.exception.should == composite_exception
143
+ }
144
+ end
145
+ end
146
+
147
+ describe 'new' do
148
+ it "merges multiparameters" do
149
+ attributes = {
150
+ 'updated_at(1i)' => '2004', 'updated_at(2i)' => '6', 'updated_at(3i)' => '24',
151
+ 'updated_at(4i)' => '16', 'updated_at(5i)' => '24', 'updated_at(6i)' => '00' }
152
+
153
+ topic = ::Rails::DataMapper::Models::Topic.new(attributes)
154
+ topic.updated_at.should == DateTime.new(2004, 6, 24, 16, 24, 0)
155
+ end
156
+ end
157
+
158
+ describe 'create' do
159
+ it "merges multiparameters" do
160
+ attributes = {
161
+ 'updated_at(1i)' => '2004', 'updated_at(2i)' => '6', 'updated_at(3i)' => '24',
162
+ 'updated_at(4i)' => '16', 'updated_at(5i)' => '24', 'updated_at(6i)' => '00' }
163
+
164
+ topic = ::Rails::DataMapper::Models::Topic.create(attributes)
165
+ topic.updated_at.should == DateTime.new(2004, 6, 24, 16, 24, 0)
166
+ end
167
+ end
168
+ end
data/tasks/clean.rake ADDED
@@ -0,0 +1,6 @@
1
+ require 'rake/clean'
2
+
3
+ File.foreach('.gitignore') do |line|
4
+ line.strip!
5
+ CLOBBER << line unless line.empty? || line[0, 1] == '#'
6
+ end
data/tasks/spec.rake ADDED
@@ -0,0 +1,17 @@
1
+ spec_defaults = lambda do |spec|
2
+ spec.pattern = 'spec/**/*_spec.rb'
3
+ spec.libs << 'lib' << 'spec'
4
+ spec.spec_opts << '--options' << 'spec/spec.opts'
5
+ end
6
+
7
+ begin
8
+ require 'spec/rake/spectask'
9
+
10
+ Spec::Rake::SpecTask.new(:spec, &spec_defaults)
11
+ rescue LoadError
12
+ task :spec do
13
+ abort 'rspec is not available. In order to run spec, you must: gem install rspec'
14
+ end
15
+ end
16
+
17
+ task :default => :spec
data/tasks/yard.rake ADDED
@@ -0,0 +1,9 @@
1
+ begin
2
+ require 'yard'
3
+
4
+ YARD::Rake::YardocTask.new
5
+ rescue LoadError
6
+ task :yard do
7
+ abort 'YARD is not available. In order to run yard, you must: gem install yard'
8
+ end
9
+ end
@@ -0,0 +1,20 @@
1
+ begin
2
+ require 'pathname'
3
+ require 'yardstick'
4
+ require 'yardstick/rake/measurement'
5
+ require 'yardstick/rake/verify'
6
+
7
+ # yardstick_measure task
8
+ Yardstick::Rake::Measurement.new
9
+
10
+ # verify_measurements task
11
+ Yardstick::Rake::Verify.new do |verify|
12
+ verify.threshold = 100
13
+ end
14
+ rescue LoadError
15
+ %w[ yardstick_measure verify_measurements ].each do |name|
16
+ task name.to_s do
17
+ abort "Yardstick is not available. In order to run #{name}, you must: gem install yardstick"
18
+ end
19
+ end
20
+ end
metadata ADDED
@@ -0,0 +1,188 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ardm-rails
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.2.1
5
+ platform: ruby
6
+ authors:
7
+ - Martin Emde
8
+ - Martin Gamsjaeger (snusnu)
9
+ - Dan Kubb
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2015-01-29 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: ardm-core
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - "~>"
20
+ - !ruby/object:Gem::Version
21
+ version: '1.2'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - "~>"
27
+ - !ruby/object:Gem::Version
28
+ version: '1.2'
29
+ - !ruby/object:Gem::Dependency
30
+ name: ardm-active_model
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - "~>"
34
+ - !ruby/object:Gem::Version
35
+ version: '1.2'
36
+ type: :runtime
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - "~>"
41
+ - !ruby/object:Gem::Version
42
+ version: '1.2'
43
+ - !ruby/object:Gem::Dependency
44
+ name: actionpack
45
+ requirement: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: '3.0'
50
+ - - "<"
51
+ - !ruby/object:Gem::Version
52
+ version: '5.0'
53
+ type: :runtime
54
+ prerelease: false
55
+ version_requirements: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: '3.0'
60
+ - - "<"
61
+ - !ruby/object:Gem::Version
62
+ version: '5.0'
63
+ - !ruby/object:Gem::Dependency
64
+ name: railties
65
+ requirement: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '3.0'
70
+ - - "<"
71
+ - !ruby/object:Gem::Version
72
+ version: '5.0'
73
+ type: :runtime
74
+ prerelease: false
75
+ version_requirements: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: '3.0'
80
+ - - "<"
81
+ - !ruby/object:Gem::Version
82
+ version: '5.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rake
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0.9'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '0.9'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rspec
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '1.3'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '1.3'
111
+ description: DataMapper rails adapter
112
+ email:
113
+ - me@martinemde.com
114
+ - gamsnjaga@gmail.com
115
+ executables: []
116
+ extensions: []
117
+ extra_rdoc_files:
118
+ - LICENSE
119
+ - README.rdoc
120
+ files:
121
+ - ".document"
122
+ - ".gitignore"
123
+ - ".travis.yml"
124
+ - Gemfile
125
+ - LICENSE
126
+ - README.rdoc
127
+ - Rakefile
128
+ - VERSION
129
+ - ardm-rails.gemspec
130
+ - lib/ardm-rails.rb
131
+ - lib/dm-rails.rb
132
+ - lib/dm-rails/configuration.rb
133
+ - lib/dm-rails/mass_assignment_security.rb
134
+ - lib/dm-rails/middleware/identity_map.rb
135
+ - lib/dm-rails/multiparameter_attributes.rb
136
+ - lib/dm-rails/railtie.rb
137
+ - lib/dm-rails/railties/controller_runtime.rb
138
+ - lib/dm-rails/railties/database.rake
139
+ - lib/dm-rails/railties/i18n_support.rb
140
+ - lib/dm-rails/railties/log_listener.rb
141
+ - lib/dm-rails/railties/log_subscriber.rb
142
+ - lib/dm-rails/session_store.rb
143
+ - lib/dm-rails/setup.rb
144
+ - lib/dm-rails/storage.rb
145
+ - lib/dm-rails/version.rb
146
+ - lib/generators/data_mapper.rb
147
+ - lib/generators/data_mapper/migration/migration_generator.rb
148
+ - lib/generators/data_mapper/migration/templates/migration.rb
149
+ - lib/generators/data_mapper/model/model_generator.rb
150
+ - lib/generators/data_mapper/model/templates/model.rb
151
+ - lib/generators/data_mapper/observer/observer_generator.rb
152
+ - lib/generators/data_mapper/observer/templates/observer.rb
153
+ - spec/models/fake.rb
154
+ - spec/models/topic.rb
155
+ - spec/spec.opts
156
+ - spec/spec_helper.rb
157
+ - spec/unit/mass_assignment_security_spec.rb
158
+ - spec/unit/multiparameter_attributes_spec.rb
159
+ - tasks/clean.rake
160
+ - tasks/spec.rake
161
+ - tasks/yard.rake
162
+ - tasks/yardstick.rake
163
+ homepage: https://github.com/ar-dm/ardm-rails
164
+ licenses:
165
+ - MIT
166
+ metadata: {}
167
+ post_install_message:
168
+ rdoc_options: []
169
+ require_paths:
170
+ - lib
171
+ required_ruby_version: !ruby/object:Gem::Requirement
172
+ requirements:
173
+ - - ">="
174
+ - !ruby/object:Gem::Version
175
+ version: '0'
176
+ required_rubygems_version: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ requirements: []
182
+ rubyforge_project:
183
+ rubygems_version: 2.2.2
184
+ signing_key:
185
+ specification_version: 4
186
+ summary: Ardm fork of dm-rails
187
+ test_files: []
188
+ has_rdoc: