active_metadata 0.3.1 → 0.3.2
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/db/test.sqlite3 +0 -0
- data/lib/active_metadata/base.rb +10 -8
- data/lib/active_metadata/version.rb +1 -1
- data/spec/concurrency_spec.rb +66 -2
- metadata +20 -20
data/db/test.sqlite3
CHANGED
Binary file
|
data/lib/active_metadata/base.rb
CHANGED
@@ -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.
|
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
|
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 =>
|
139
|
+
self.conflicts[:warnings] << {key.to_sym => latest_history}
|
140
140
|
else
|
141
|
-
self.conflicts[:fatals] << {key.to_sym =>
|
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
|
data/spec/concurrency_spec.rb
CHANGED
@@ -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
|
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]
|
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.
|
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-
|
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: &
|
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: *
|
25
|
+
version_requirements: *2168900840
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: sqlite3
|
28
|
-
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: *
|
36
|
+
version_requirements: *2168900260
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
38
|
name: sqlite3-ruby
|
39
|
-
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: *
|
47
|
+
version_requirements: *2168899660
|
48
48
|
- !ruby/object:Gem::Dependency
|
49
49
|
name: cucumber
|
50
|
-
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: *
|
58
|
+
version_requirements: *2168898680
|
59
59
|
- !ruby/object:Gem::Dependency
|
60
60
|
name: ci_reporter
|
61
|
-
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: *
|
69
|
+
version_requirements: *2168897840
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
71
|
name: rails
|
72
|
-
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: *
|
80
|
+
version_requirements: *2168896740
|
81
81
|
- !ruby/object:Gem::Dependency
|
82
82
|
name: activerecord
|
83
|
-
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: *
|
91
|
+
version_requirements: *2168895600
|
92
92
|
- !ruby/object:Gem::Dependency
|
93
93
|
name: paperclip
|
94
|
-
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: *
|
102
|
+
version_requirements: *2168894400
|
103
103
|
- !ruby/object:Gem::Dependency
|
104
104
|
name: to_xls
|
105
|
-
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: *
|
113
|
+
version_requirements: *2168893600
|
114
114
|
description: First implementation will write metadata on mongodb
|
115
115
|
email:
|
116
116
|
- acampolonghi@gmail.com
|