active_metadata 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
data/db/test.sqlite3 CHANGED
Binary file
@@ -38,11 +38,20 @@ module ActiveMetadata
38
38
  include ActiveMetadata::Helpers
39
39
 
40
40
  def self.included(klass)
41
+
41
42
  [:notes, :attachments, :history].each do |item|
42
43
  klass.send(:define_method, "#{item.to_s}_cache_key".to_sym) do |field|
43
44
  "#{Rails.env}/active_metadata/#{item.to_s}/#{self.class}/#{metadata_id}/#{field}/"
44
45
  end
45
46
  end
47
+
48
+ [:fatals, :warnings].each do |conf|
49
+ klass.send(:define_method, "has_#{conf.to_s}_conflicts?".to_sym) do
50
+ return false if self.conflicts.nil? || self.conflicts[conf.to_sym].nil? || self.conflicts[conf.to_sym].empty?
51
+ true
52
+ end
53
+ end
54
+
46
55
  end
47
56
 
48
57
  def metadata_id
@@ -101,17 +110,18 @@ module ActiveMetadata
101
110
  self.attributes.each do |key, val|
102
111
  # ensure the query order
103
112
  histories = history_for key.to_sym, "created_at DESC"
104
- next if histories.count == 0 #if history does not exists yet cannot be a conflict
113
+
114
+ # if history does not exists yet cannot be a conflict OR
115
+ # if value has no change respect to the latest db saved we have no conflict
116
+ next if histories.count == 0 || self.changes[key].nil?
105
117
 
106
118
  latest_history = histories.first
107
119
 
108
120
  #if the timestamp is previous of the last history change
109
121
  if timestamp < latest_history.created_at.to_f
110
122
 
111
- begin
112
- self[key.to_sym] = self.changes[key][0]
113
- rescue
114
- end # there is a conflict so ensure the actual value if any change exists
123
+ # there is a conflict so ensure the actual value
124
+ self[key.to_sym] = self.changes[key][0]
115
125
 
116
126
  # We have a conflict.
117
127
  # Check if the actual submission has been modified
@@ -1,3 +1,3 @@
1
1
  module ActiveMetadata
2
- VERSION = "0.3.0"
2
+ VERSION = "0.3.1"
3
3
  end
@@ -37,6 +37,19 @@ describe "Manage Concurrency" do
37
37
 
38
38
  end
39
39
 
40
+ describe "has_fatals_conflicts" do
41
+
42
+ it "should return false if no fatals conflicts are present" do
43
+ @document.has_fatals_conflicts?.should be_false
44
+ end
45
+
46
+ it "should return true if model has generated fatals conflicts" do
47
+ @document.conflicts= {:fatals => [1]}
48
+ @document.has_fatals_conflicts?.should be_true
49
+ end
50
+
51
+ end
52
+
40
53
  describe "when a field is modified and the form ts is subsequent of the history ts" do
41
54
 
42
55
  it "should save the new value and history must be updated with the latest change" do
@@ -58,7 +71,7 @@ describe "Manage Concurrency" do
58
71
 
59
72
  describe "when a field is modified and the form ts is preceding the history ts" do
60
73
 
61
- it "should not change the model value and the history if the newest history value is equal to the submitted once, param should be retuned as warning" do
74
+ it "should not change the model value and the history if the newest history value is equal to the submitted once" do
62
75
  form_timestamp = Time.now
63
76
 
64
77
  #someone change the field value
@@ -69,11 +82,9 @@ describe "Manage Concurrency" do
69
82
  sleep 0.2.seconds
70
83
  @document.update_attributes({:name => "nuovo nome", :active_metadata_timestamp => form_timestamp})
71
84
 
72
- warnings = @document.conflicts[:warnings]
73
- warnings.size.should eq 1
74
- warnings[0][:name][0].should eq "nuovo nome"
75
-
85
+ @document.conflicts[:warnings].should be_empty
76
86
  @document.conflicts[:fatals].should be_empty
87
+
77
88
  hs = @document.history_for(:name)
78
89
  #last change shoudl not be recorded in history
79
90
  hs.count.should eq 2
@@ -82,7 +93,7 @@ describe "Manage Concurrency" do
82
93
 
83
94
  end
84
95
 
85
- it "should reject the change if the history newest value is different from the submitted once, param should be returned as fatal" do
96
+ it "should reject the change as fatal if the history newest value is different from the submitted once and both user has changed the value" do
86
97
  #fixtures
87
98
  form_timestamp = Time.now
88
99
  params = {:name => "nuovo nome"}
@@ -108,27 +119,6 @@ describe "Manage Concurrency" do
108
119
 
109
120
  end
110
121
 
111
- it "should return both fatals and warnings if required" do
112
- form_timestamp = Time.now
113
- params = {:name => "nuovo nome", :keep_alive => false}
114
-
115
- #someone change the field value
116
- sleep 0.2.seconds
117
- @document.update_attributes params
118
-
119
- # user submit a new value
120
- sleep 0.2.seconds
121
- different_params = {:name => "altro nome", :keep_alive => false, :active_metadata_timestamp => form_timestamp}
122
- @document.update_attributes(different_params)
123
-
124
- fatals = @document.conflicts[:fatals]
125
- fatals.size.should eq 1
126
- fatals[0][:name][0].should eq "altro nome"
127
- warnings = @document.conflicts[:warnings]
128
- warnings.size.should eq 1
129
- warnings[0][:keep_alive][0].should eq false
130
- end
131
-
132
122
  end
133
123
 
134
124
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_metadata
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -14,7 +14,7 @@ date: 2011-10-20 00:00:00.000000000Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rspec-rails
17
- requirement: &2169814040 !ruby/object:Gem::Requirement
17
+ requirement: &2165045260 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ! '>='
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: '0'
23
23
  type: :development
24
24
  prerelease: false
25
- version_requirements: *2169814040
25
+ version_requirements: *2165045260
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: sqlite3
28
- requirement: &2169813620 !ruby/object:Gem::Requirement
28
+ requirement: &2165044820 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ! '>='
@@ -33,10 +33,10 @@ dependencies:
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
- version_requirements: *2169813620
36
+ version_requirements: *2165044820
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: sqlite3-ruby
39
- requirement: &2169813200 !ruby/object:Gem::Requirement
39
+ requirement: &2165044400 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
42
  - - ! '>='
@@ -44,10 +44,10 @@ dependencies:
44
44
  version: '0'
45
45
  type: :development
46
46
  prerelease: false
47
- version_requirements: *2169813200
47
+ version_requirements: *2165044400
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: cucumber
50
- requirement: &2169812780 !ruby/object:Gem::Requirement
50
+ requirement: &2165043980 !ruby/object:Gem::Requirement
51
51
  none: false
52
52
  requirements:
53
53
  - - ! '>='
@@ -55,10 +55,10 @@ dependencies:
55
55
  version: '0'
56
56
  type: :development
57
57
  prerelease: false
58
- version_requirements: *2169812780
58
+ version_requirements: *2165043980
59
59
  - !ruby/object:Gem::Dependency
60
60
  name: ci_reporter
61
- requirement: &2169812300 !ruby/object:Gem::Requirement
61
+ requirement: &2165043480 !ruby/object:Gem::Requirement
62
62
  none: false
63
63
  requirements:
64
64
  - - ! '>='
@@ -66,10 +66,10 @@ dependencies:
66
66
  version: '0'
67
67
  type: :development
68
68
  prerelease: false
69
- version_requirements: *2169812300
69
+ version_requirements: *2165043480
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: rails
72
- requirement: &2169811520 !ruby/object:Gem::Requirement
72
+ requirement: &2165042740 !ruby/object:Gem::Requirement
73
73
  none: false
74
74
  requirements:
75
75
  - - =
@@ -77,10 +77,10 @@ dependencies:
77
77
  version: 3.0.1
78
78
  type: :runtime
79
79
  prerelease: false
80
- version_requirements: *2169811520
80
+ version_requirements: *2165042740
81
81
  - !ruby/object:Gem::Dependency
82
82
  name: activerecord
83
- requirement: &2169810280 !ruby/object:Gem::Requirement
83
+ requirement: &2165041060 !ruby/object:Gem::Requirement
84
84
  none: false
85
85
  requirements:
86
86
  - - =
@@ -88,10 +88,10 @@ dependencies:
88
88
  version: 3.0.1
89
89
  type: :runtime
90
90
  prerelease: false
91
- version_requirements: *2169810280
91
+ version_requirements: *2165041060
92
92
  - !ruby/object:Gem::Dependency
93
93
  name: paperclip
94
- requirement: &2169803300 !ruby/object:Gem::Requirement
94
+ requirement: &2165040000 !ruby/object:Gem::Requirement
95
95
  none: false
96
96
  requirements:
97
97
  - - ! '>='
@@ -99,10 +99,10 @@ dependencies:
99
99
  version: '0'
100
100
  type: :runtime
101
101
  prerelease: false
102
- version_requirements: *2169803300
102
+ version_requirements: *2165040000
103
103
  - !ruby/object:Gem::Dependency
104
104
  name: to_xls
105
- requirement: &2169802640 !ruby/object:Gem::Requirement
105
+ requirement: &2165038720 !ruby/object:Gem::Requirement
106
106
  none: false
107
107
  requirements:
108
108
  - - ! '>='
@@ -110,7 +110,7 @@ dependencies:
110
110
  version: '0'
111
111
  type: :runtime
112
112
  prerelease: false
113
- version_requirements: *2169802640
113
+ version_requirements: *2165038720
114
114
  description: First implementation will write metadata on mongodb
115
115
  email:
116
116
  - acampolonghi@gmail.com