active_metadata 0.3.0 → 0.3.1
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 +15 -5
- data/lib/active_metadata/version.rb +1 -1
- data/spec/concurrency_spec.rb +17 -27
- metadata +19 -19
data/db/test.sqlite3
CHANGED
Binary file
|
data/lib/active_metadata/base.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
112
|
-
|
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
|
data/spec/concurrency_spec.rb
CHANGED
@@ -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
|
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
|
-
|
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
|
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.
|
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: &
|
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: *
|
25
|
+
version_requirements: *2165045260
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: sqlite3
|
28
|
-
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: *
|
36
|
+
version_requirements: *2165044820
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
38
|
name: sqlite3-ruby
|
39
|
-
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: *
|
47
|
+
version_requirements: *2165044400
|
48
48
|
- !ruby/object:Gem::Dependency
|
49
49
|
name: cucumber
|
50
|
-
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: *
|
58
|
+
version_requirements: *2165043980
|
59
59
|
- !ruby/object:Gem::Dependency
|
60
60
|
name: ci_reporter
|
61
|
-
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: *
|
69
|
+
version_requirements: *2165043480
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
71
|
name: rails
|
72
|
-
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: *
|
80
|
+
version_requirements: *2165042740
|
81
81
|
- !ruby/object:Gem::Dependency
|
82
82
|
name: activerecord
|
83
|
-
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: *
|
91
|
+
version_requirements: *2165041060
|
92
92
|
- !ruby/object:Gem::Dependency
|
93
93
|
name: paperclip
|
94
|
-
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: *
|
102
|
+
version_requirements: *2165040000
|
103
103
|
- !ruby/object:Gem::Dependency
|
104
104
|
name: to_xls
|
105
|
-
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: *
|
113
|
+
version_requirements: *2165038720
|
114
114
|
description: First implementation will write metadata on mongodb
|
115
115
|
email:
|
116
116
|
- acampolonghi@gmail.com
|