mm_dirtier 0.1.2 → 0.1.3

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.
@@ -0,0 +1,50 @@
1
+ module MongoMapper
2
+ module Extensions
3
+ module Hash
4
+ def from_mongo(value)
5
+ value ||= {}
6
+ value.make_indifferent!
7
+ end
8
+ end
9
+ end
10
+ end
11
+
12
+ module IndifferentAccess
13
+ def [](key)
14
+ key = key.to_s
15
+ super(key)
16
+ end
17
+
18
+ def []=(key,val)
19
+ super(key.to_s,val)
20
+ end
21
+
22
+ def include?(key)
23
+ super(key.to_s)
24
+ end
25
+
26
+ def delete(key)
27
+ super(key.to_s)
28
+ end
29
+
30
+ def method_missing(sym,*args,&block)
31
+ return self[sym.to_s[0..-2]] = args[0] if sym.to_s =~ /.*=$/
32
+ return self[sym] if self.keys.include?(sym.to_s)
33
+ nil
34
+ end
35
+ end
36
+
37
+ class Hash
38
+ extend MongoMapper::Extensions::Hash
39
+
40
+ def make_indifferent!
41
+ return self if defined?(@is_indifferent) && @is_indifferent
42
+
43
+ stringify_keys!
44
+ extend IndifferentAccess
45
+ @is_indifferent = true
46
+
47
+ self
48
+ end
49
+ end
50
+
@@ -1,6 +1,6 @@
1
1
  # encoding: UTF-8
2
2
  module MongoMapper
3
3
  module Dirtier
4
- Version = '0.1.2'
4
+ Version = '0.1.3'
5
5
  end
6
6
  end
data/lib/mm_dirtier.rb CHANGED
@@ -9,7 +9,8 @@ base_dir = File.dirname(__FILE__)
9
9
  'in_array_proxy_listener',
10
10
  'one_embedded_proxy_listener',
11
11
  'extensions',
12
- 'plugins/dirtier'
12
+ 'plugins/dirtier',
13
+ 'support'
13
14
  ].each {|req| require File.join(base_dir,'mm_dirtier',req)}
14
15
 
15
16
 
@@ -2,11 +2,11 @@
2
2
  require 'test_helper'
3
3
 
4
4
  class ObservableKeysTest < Test::Unit::TestCase
5
- def setup
6
- @document = Doc { key :ary, Array }
7
- end
5
+ context "marking changes on observable array keys" do
6
+ setup do
7
+ @document = Doc { key :ary, Array }
8
+ end
8
9
 
9
- context "marking changes on observable keys" do
10
10
  should "not happen if there are none" do
11
11
  doc = @document.new
12
12
  doc.ary_changed?.should be_false
@@ -53,6 +53,29 @@ class ObservableKeysTest < Test::Unit::TestCase
53
53
  a2.unshift("hi there")
54
54
  doc.ary_changed?.should be_true
55
55
  end
56
+ end
56
57
 
58
+ context "marking changes on observable hash keys" do
59
+ setup do
60
+ @document = Doc { key :hash, Hash }
61
+ end
62
+
63
+ should "happen when change happens" do
64
+ doc = @document.new
65
+ doc.hash = {"Golly" => "Gee", "Willikers" => "Batman"}
66
+ doc.hash_changed?.should be_true
67
+ doc.hash_was.should == {}
68
+ doc.hash_change.should == [{}, {"Golly" => "Gee", "Willikers" => "Batman"}]
69
+ end
70
+
71
+ should "happen when modified in place" do
72
+ doc = @document.new
73
+ doc.hash = {"Golly" => "Gee", "Willikers" => "Batman"}
74
+ doc.save!
75
+ doc.hash["Willikers"] = "Robin"
76
+ doc.hash_changed?.should be_true
77
+ doc.hash_was.should == {"Golly" => "Gee", "Willikers" => "Batman"}
78
+ doc.hash_change.should == [{"Golly" => "Gee", "Willikers" => "Batman"},{"Golly" => "Gee", "Willikers" => "Robin"}]
79
+ end
57
80
  end
58
81
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mm_dirtier
3
3
  version: !ruby/object:Gem::Version
4
- hash: 31
4
+ hash: 29
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 2
10
- version: 0.1.2
9
+ - 3
10
+ version: 0.1.3
11
11
  platform: ruby
12
12
  authors:
13
13
  - Nathan Stults
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-12-08 00:00:00 -08:00
18
+ date: 2011-01-04 00:00:00 -08:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -104,6 +104,7 @@ extra_rdoc_files: []
104
104
 
105
105
  files:
106
106
  - lib/mm_dirtier/plugins/dirtier.rb
107
+ - lib/mm_dirtier/support.rb
107
108
  - lib/mm_dirtier/extensions.rb
108
109
  - lib/mm_dirtier/in_array_proxy_listener.rb
109
110
  - lib/mm_dirtier/many_embedded_proxy_listener.rb