minimapper 0.2.4 → 0.2.5

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/README.md CHANGED
@@ -274,6 +274,10 @@ You need mysql and postgres installed (but they do not have to be running) to be
274
274
 
275
275
  ### Next
276
276
 
277
+ * Make it possible to override minimapper attributes with super (like it's done in https://github.com/barsoom/traco)
278
+ * Support default values for attributes (probably only using lambdas to avoid bugs).
279
+ * Built in way to set induvidual attributes in a way that bypasses protected attributes like you can do with an AR model.
280
+ - user.is_admin = true; user_mapper.update(user) should probably set is_admin to true, mass-assignment should not.
277
281
  * Extract entity and model class lookup code from the ar-mapper and reuse it in the memory mapper.
278
282
  * Change the memory mapper to store entity attributes, not entity instances.
279
283
  - Unless this makes it difficult to handle associated data.
data/lib/minimapper/ar.rb CHANGED
@@ -7,7 +7,7 @@ module Minimapper
7
7
  # Create
8
8
  def create(entity)
9
9
  if entity.valid?
10
- entity.id = record_klass.create!(entity.attributes).id
10
+ entity.id = record_klass.create!(accessible_attributes(entity)).id
11
11
  else
12
12
  false
13
13
  end
@@ -41,7 +41,7 @@ module Minimapper
41
41
  # Update
42
42
  def update(entity)
43
43
  if entity.valid?
44
- record_for(entity).update_attributes!(entity.attributes)
44
+ record_for(entity).update_attributes!(accessible_attributes(entity))
45
45
  true
46
46
  else
47
47
  false
@@ -81,6 +81,14 @@ module Minimapper
81
81
  @entity_class
82
82
  end
83
83
 
84
+ def accessible_attributes(entity)
85
+ entity.attributes.reject { |k, v| protected_attributes.include?(k.to_s) }
86
+ end
87
+
88
+ def protected_attributes
89
+ record_klass.protected_attributes
90
+ end
91
+
84
92
  def find_record_safely(id)
85
93
  find_record(id) ||
86
94
  raise(Common::CanNotFindEntity, :id => id)
@@ -1,3 +1,3 @@
1
1
  module Minimapper
2
- VERSION = "0.2.4"
2
+ VERSION = "0.2.5"
3
3
  end
data/spec/ar_spec.rb CHANGED
@@ -18,8 +18,10 @@ class TestMapper < Minimapper::AR
18
18
  end
19
19
 
20
20
  class Record < ActiveRecord::Base
21
- attr_accessible :name
21
+ attr_protected :visible
22
+
22
23
  self.table_name = :projects
24
+ self.mass_assignment_sanitizer = :strict
23
25
  end
24
26
  end
25
27
 
@@ -28,4 +30,38 @@ describe Minimapper::AR do
28
30
  let(:entity_class) { TestEntity }
29
31
 
30
32
  include_examples :mapper
33
+
34
+ describe "#create" do
35
+ it "does not include protected attributes" do
36
+ # because it leads to exceptions when mass_assignment_sanitizer is set to strict
37
+ entity = TestEntity.new
38
+ entity.attributes = { :visible => true, :name => "Joe" }
39
+ mapper.create(entity)
40
+
41
+ stored_entity = mapper.find(entity.id)
42
+ stored_entity.attributes[:visible].should be_nil
43
+ stored_entity.attributes[:name].should == "Joe"
44
+
45
+ entity = TestEntity.new
46
+ entity.attributes = { :visible => true, :name => "Joe" }
47
+ TestMapper::Record.stub(:protected_attributes => [])
48
+ lambda { mapper.create(entity) }.should raise_error(ActiveModel::MassAssignmentSecurity::Error)
49
+ end
50
+ end
51
+
52
+ describe "#update" do
53
+ it "does not include protected attributes" do
54
+ entity = TestEntity.new
55
+ mapper.create(entity)
56
+
57
+ entity.attributes = { :visible => true, :name => "Joe" }
58
+ mapper.update(entity)
59
+ stored_entity = mapper.find(entity.id)
60
+ stored_entity.attributes[:visible].should be_nil
61
+ stored_entity.attributes[:name].should == "Joe"
62
+
63
+ TestMapper::Record.stub(:protected_attributes => [])
64
+ lambda { mapper.update(entity) }.should raise_error(ActiveModel::MassAssignmentSecurity::Error)
65
+ end
66
+ end
31
67
  end
@@ -46,6 +46,7 @@ silence_stream(STDOUT) do
46
46
  ActiveRecord::Schema.define(:version => 0) do
47
47
  create_table :projects, :force => true do |t|
48
48
  t.string :name
49
+ t.boolean :visible
49
50
  end
50
51
  end
51
52
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: minimapper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 0.2.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-12-18 00:00:00.000000000 Z
12
+ date: 2012-12-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
16
- requirement: &70303088200960 !ruby/object:Gem::Requirement
16
+ requirement: &70274703776420 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,7 +21,7 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *70303088200960
24
+ version_requirements: *70274703776420
25
25
  description: A minimalistic way of separating your models from ORMs like ActiveRecord.
26
26
  email:
27
27
  - joakim.kolsjo@gmail.com
@@ -77,7 +77,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
77
77
  version: '0'
78
78
  segments:
79
79
  - 0
80
- hash: -3678706732154060402
80
+ hash: -1932883242687325558
81
81
  required_rubygems_version: !ruby/object:Gem::Requirement
82
82
  none: false
83
83
  requirements:
@@ -86,7 +86,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
86
86
  version: '0'
87
87
  segments:
88
88
  - 0
89
- hash: -3678706732154060402
89
+ hash: -1932883242687325558
90
90
  requirements: []
91
91
  rubyforge_project:
92
92
  rubygems_version: 1.8.5