active_metadata 0.3.1 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
data/db/test.sqlite3 CHANGED
Binary file
@@ -95,7 +95,7 @@ module ActiveMetadata
95
95
  # Conflicts
96
96
  # ====
97
97
  # * @conflicts[:warnings] contains any conflict that "apply cleanly" or where the submit value has not been modified by the user that is saving
98
- # the data
98
+ # the data.
99
99
  #
100
100
  # * @conflicts[:fatals] contains any conflict that "do not apply cleanly" or where the passed value does not match the last history value and was modified
101
101
  # by the user that is submittig the data
@@ -120,14 +120,11 @@ module ActiveMetadata
120
120
  #if the timestamp is previous of the last history change
121
121
  if timestamp < latest_history.created_at.to_f
122
122
 
123
- # there is a conflict so ensure the actual value
124
- self[key.to_sym] = self.changes[key][0]
125
-
126
123
  # We have a conflict.
127
124
  # Check if the actual submission has been modified
128
- histories.each do |h|
125
+ histories.each_with_index do |h,i|
129
126
  # Looking for the value that was loaded by the user. First history with a ts that is younger than the form ts
130
- next if timestamp > h.created_at.to_f
127
+ next if h.created_at.to_f > timestamp
131
128
 
132
129
  # History stores values as strings so any boolean is stored as "0" or "1"
133
130
  # We need to translate the params passed for a safer comparison.
@@ -135,11 +132,16 @@ module ActiveMetadata
135
132
  b_val = to_bool(h.value)
136
133
  end
137
134
 
135
+ # conflict ensure the actual value is not modified
136
+ self[key.to_sym] = self.changes[key][0]
137
+
138
138
  if [h.value, b_val].include? val
139
- self.conflicts[:warnings] << {key.to_sym => [val, h]}
139
+ self.conflicts[:warnings] << {key.to_sym => latest_history}
140
140
  else
141
- self.conflicts[:fatals] << {key.to_sym => [val, h]}
141
+ self.conflicts[:fatals] << {key.to_sym => latest_history}
142
142
  end
143
+
144
+ break #done for this field
143
145
  end
144
146
 
145
147
  end
@@ -1,3 +1,3 @@
1
1
  module ActiveMetadata
2
- VERSION = "0.3.1"
2
+ VERSION = "0.3.2"
3
3
  end
@@ -93,6 +93,52 @@ describe "Manage Concurrency" do
93
93
 
94
94
  end
95
95
 
96
+ it "should register a warning if the history newest value is different from the submitted once but the submitting user has not modified the value" do
97
+ #fixtures
98
+ value = @document.name
99
+ form_timestamp = Time.now
100
+ params = {:name => "nuovo nome"}
101
+
102
+ #someone change the field value
103
+ sleep 0.2.seconds
104
+ @document.update_attributes(params)
105
+
106
+ # user submit a different value
107
+ sleep 0.2.seconds
108
+ different_params = {:name => value, :active_metadata_timestamp => form_timestamp}
109
+ @document.update_attributes(different_params)
110
+
111
+ #assetions
112
+ warnings = @document.conflicts[:warnings]
113
+ warnings.size.should eq 1
114
+ warnings[0][:name].value.should eq "nuovo nome"
115
+
116
+ @document.conflicts[:fatals].should be_empty
117
+ end
118
+
119
+ it "when a warning is registered the submitted value is skipped" do
120
+ #fixtures
121
+ value = @document.name
122
+ form_timestamp = Time.now
123
+ params = {:name => "nuovo nome"}
124
+
125
+ #someone change the field value
126
+ sleep 0.2.seconds
127
+ @document.update_attributes(params)
128
+
129
+ # user submit a different value
130
+ sleep 0.2.seconds
131
+ different_params = {:name => value, :active_metadata_timestamp => form_timestamp}
132
+ @document.update_attributes(different_params)
133
+
134
+ #assetions
135
+ hs = @document.history_for(:name)
136
+ hs.count.should eq 2
137
+ hs.first.value.should eq "nuovo nome"
138
+ Document.last.name.should eq "nuovo nome"
139
+
140
+ end
141
+
96
142
  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
97
143
  #fixtures
98
144
  form_timestamp = Time.now
@@ -102,7 +148,7 @@ describe "Manage Concurrency" do
102
148
  sleep 0.2.seconds
103
149
  @document.update_attributes(params)
104
150
 
105
- # user submit a new value
151
+ # user submit a different value
106
152
  sleep 0.2.seconds
107
153
  different_params = {:name => "altro nome", :active_metadata_timestamp => form_timestamp}
108
154
  @document.update_attributes(different_params)
@@ -110,8 +156,26 @@ describe "Manage Concurrency" do
110
156
  #assetions
111
157
  fatals = @document.conflicts[:fatals]
112
158
  fatals.size.should eq 1
113
- fatals[0][:name][0].should eq "altro nome"
159
+ fatals[0][:name].value.should eq "nuovo nome"
114
160
  @document.conflicts[:warnings].should be_empty
161
+
162
+ end
163
+
164
+ it "when a fatal conflict occurs the submitted value is skipped" do
165
+ #fixtures
166
+ form_timestamp = Time.now
167
+ params = {:name => "nuovo nome"}
168
+
169
+ #someone change the field value
170
+ sleep 0.2.seconds
171
+ @document.update_attributes(params)
172
+
173
+ # user submit a different value
174
+ sleep 0.2.seconds
175
+ different_params = {:name => "altro nome", :active_metadata_timestamp => form_timestamp}
176
+ @document.update_attributes(different_params)
177
+
178
+ #assetions
115
179
  hs = @document.history_for(:name)
116
180
  hs.count.should eq 2
117
181
  hs.first.value.should eq "nuovo nome"
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.1
4
+ version: 0.3.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,11 +10,11 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2011-10-20 00:00:00.000000000Z
13
+ date: 2011-10-21 00:00:00.000000000Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rspec-rails
17
- requirement: &2165045260 !ruby/object:Gem::Requirement
17
+ requirement: &2168900840 !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: *2165045260
25
+ version_requirements: *2168900840
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: sqlite3
28
- requirement: &2165044820 !ruby/object:Gem::Requirement
28
+ requirement: &2168900260 !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: *2165044820
36
+ version_requirements: *2168900260
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: sqlite3-ruby
39
- requirement: &2165044400 !ruby/object:Gem::Requirement
39
+ requirement: &2168899660 !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: *2165044400
47
+ version_requirements: *2168899660
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: cucumber
50
- requirement: &2165043980 !ruby/object:Gem::Requirement
50
+ requirement: &2168898680 !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: *2165043980
58
+ version_requirements: *2168898680
59
59
  - !ruby/object:Gem::Dependency
60
60
  name: ci_reporter
61
- requirement: &2165043480 !ruby/object:Gem::Requirement
61
+ requirement: &2168897840 !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: *2165043480
69
+ version_requirements: *2168897840
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: rails
72
- requirement: &2165042740 !ruby/object:Gem::Requirement
72
+ requirement: &2168896740 !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: *2165042740
80
+ version_requirements: *2168896740
81
81
  - !ruby/object:Gem::Dependency
82
82
  name: activerecord
83
- requirement: &2165041060 !ruby/object:Gem::Requirement
83
+ requirement: &2168895600 !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: *2165041060
91
+ version_requirements: *2168895600
92
92
  - !ruby/object:Gem::Dependency
93
93
  name: paperclip
94
- requirement: &2165040000 !ruby/object:Gem::Requirement
94
+ requirement: &2168894400 !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: *2165040000
102
+ version_requirements: *2168894400
103
103
  - !ruby/object:Gem::Dependency
104
104
  name: to_xls
105
- requirement: &2165038720 !ruby/object:Gem::Requirement
105
+ requirement: &2168893600 !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: *2165038720
113
+ version_requirements: *2168893600
114
114
  description: First implementation will write metadata on mongodb
115
115
  email:
116
116
  - acampolonghi@gmail.com