active_metadata 0.2.4 → 0.3.0
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/development.sqlite3 +0 -0
- data/db/test.sqlite3 +0 -0
- data/lib/active_metadata/base.rb +13 -18
- data/lib/active_metadata/form_helper.rb +11 -0
- data/lib/active_metadata/version.rb +1 -1
- data/lib/active_metadata.rb +1 -1
- data/lib/rails/railties/tasks.rake +14 -6
- data/lib/rake/ci.rb +38 -0
- data/spec/concurrency_spec.rb +18 -0
- data/spec/spec_helper.rb +0 -2
- metadata +23 -22
- data/lib/active_metadata/railtie.rb +0 -6
- data/lib/rake/task.rb +0 -18
Binary file
|
data/db/test.sqlite3
CHANGED
Binary file
|
data/lib/active_metadata/base.rb
CHANGED
@@ -7,8 +7,8 @@ module ActiveMetadata
|
|
7
7
|
module Base
|
8
8
|
|
9
9
|
require 'paperclip'
|
10
|
-
require
|
11
|
-
require
|
10
|
+
require 'active_metadata/persistence/persistence'
|
11
|
+
require 'active_metadata/helpers'
|
12
12
|
|
13
13
|
def self.included(klass)
|
14
14
|
klass.class_eval do
|
@@ -37,11 +37,6 @@ module ActiveMetadata
|
|
37
37
|
|
38
38
|
include ActiveMetadata::Helpers
|
39
39
|
|
40
|
-
def attributes=(attributes)
|
41
|
-
attributes.delete(:active_metadata_timestamp) unless attributes[:active_metadata_timestamp].nil?
|
42
|
-
super
|
43
|
-
end
|
44
|
-
|
45
40
|
def self.included(klass)
|
46
41
|
[:notes, :attachments, :history].each do |item|
|
47
42
|
klass.send(:define_method, "#{item.to_s}_cache_key".to_sym) do |field|
|
@@ -54,8 +49,11 @@ module ActiveMetadata
|
|
54
49
|
metadata_root.id
|
55
50
|
end
|
56
51
|
|
57
|
-
|
58
|
-
|
52
|
+
# Normalize the active_metadata_timestamp into a float to be comparable with the history
|
53
|
+
def am_timestamp
|
54
|
+
ts = metadata_root.active_metadata_timestamp
|
55
|
+
return nil if ts.nil?
|
56
|
+
ts = ts.to_f
|
59
57
|
end
|
60
58
|
|
61
59
|
def current_user_id
|
@@ -78,7 +76,6 @@ module ActiveMetadata
|
|
78
76
|
|
79
77
|
# Resolve concurrency using the provided timestamps and the active_metadata histories.
|
80
78
|
# Conflicts are stored into @conflicts instance variable
|
81
|
-
#
|
82
79
|
# Timestamp used for versioning can be passed both as :
|
83
80
|
# ====
|
84
81
|
# * @object.active_metadata_timestamp = ....
|
@@ -95,7 +92,8 @@ module ActiveMetadata
|
|
95
92
|
# by the user that is submittig the data
|
96
93
|
#
|
97
94
|
def manage_concurrency
|
98
|
-
|
95
|
+
timestamp = self.am_timestamp
|
96
|
+
return if timestamp.nil? #if no timestamp no way to check concurrency so just skip
|
99
97
|
|
100
98
|
self.conflicts = { :warnings => [], :fatals => [] }
|
101
99
|
|
@@ -103,15 +101,12 @@ module ActiveMetadata
|
|
103
101
|
self.attributes.each do |key, val|
|
104
102
|
# ensure the query order
|
105
103
|
histories = history_for key.to_sym, "created_at DESC"
|
106
|
-
|
107
|
-
timestamp = self.active_metadata_timestamp
|
104
|
+
next if histories.count == 0 #if history does not exists yet cannot be a conflict
|
108
105
|
|
109
|
-
|
110
|
-
# if history does not exists yet go on
|
111
|
-
next if latest_history.nil? || timestamp > latest_history.created_at
|
106
|
+
latest_history = histories.first
|
112
107
|
|
113
108
|
#if the timestamp is previous of the last history change
|
114
|
-
if timestamp < latest_history.created_at
|
109
|
+
if timestamp < latest_history.created_at.to_f
|
115
110
|
|
116
111
|
begin
|
117
112
|
self[key.to_sym] = self.changes[key][0]
|
@@ -122,7 +117,7 @@ module ActiveMetadata
|
|
122
117
|
# Check if the actual submission has been modified
|
123
118
|
histories.each do |h|
|
124
119
|
# Looking for the value that was loaded by the user. First history with a ts that is younger than the form ts
|
125
|
-
next if timestamp > h.created_at
|
120
|
+
next if timestamp > h.created_at.to_f
|
126
121
|
|
127
122
|
# History stores values as strings so any boolean is stored as "0" or "1"
|
128
123
|
# We need to translate the params passed for a safer comparison.
|
data/lib/active_metadata.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module ActiveMetadata
|
2
2
|
require 'engine' if defined?(Rails) && Rails::VERSION::MAJOR == 3
|
3
3
|
require 'active_metadata/base'
|
4
|
-
require "active_metadata/railtie" if defined?(Rails)
|
5
4
|
require 'application_controller'
|
6
5
|
require "active_metadata/version"
|
6
|
+
require "active_metadata/form_helper"
|
7
7
|
end
|
@@ -1,8 +1,16 @@
|
|
1
|
-
namespace :
|
2
|
-
|
3
|
-
desc "
|
4
|
-
task :
|
5
|
-
|
1
|
+
namespace :active_metadata do
|
2
|
+
|
3
|
+
desc "Install the active_metadata gem requirements file ***TASK IS ON ALPHA STAGE***"
|
4
|
+
task :install do
|
5
|
+
|
6
|
+
FileUtils.cp File.expand_path('../../templates/active_metadata.yml',__FILE__), File.expand_path('config/')
|
7
|
+
puts "Installed active_metadata.yml"
|
8
|
+
|
9
|
+
puts "Copying migrations"
|
10
|
+
ts = Time.now.utc.strftime('%Y%m%d%H%M%S')
|
11
|
+
FileUtils.cp File.expand_path('../../templates/active_metadata_migrations',__FILE__), File.expand_path("db/migrate/#{ts}_active_metadata_migrations.rb")
|
12
|
+
puts "run rake db:migrate to complete the gem installation"
|
13
|
+
|
6
14
|
end
|
7
15
|
|
8
|
-
end
|
16
|
+
end
|
data/lib/rake/ci.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
begin
|
2
|
+
require 'ci/reporter/rake/rspec'
|
3
|
+
require 'ci/reporter/rake/cucumber'
|
4
|
+
|
5
|
+
namespace :ci do
|
6
|
+
|
7
|
+
ENV["DATABASE_ENV"] = 'test'
|
8
|
+
|
9
|
+
namespace :setup do
|
10
|
+
|
11
|
+
@reports_dir = ENV['CI_REPORTS'] || 'features/reports'
|
12
|
+
|
13
|
+
task :cucumber_report_cleanup do
|
14
|
+
rm_rf @reports_dir
|
15
|
+
end
|
16
|
+
|
17
|
+
task :cucumber => :cucumber_report_cleanup do
|
18
|
+
extra_opts = "--format junit --out #{@reports_dir}"
|
19
|
+
ENV["CUCUMBER_OPTS"] = "features/ #{ENV['CUCUMBER_OPTS']} #{extra_opts}"
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
task "spec" => ["rspec_run"]
|
25
|
+
task "cucumber" => ["cucumber_run"]
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
task "ci" => ["db:migrate", "ci:spec", "ci:cucumber"]
|
30
|
+
rescue LoadError
|
31
|
+
# ci_reporter isn't here for some reason
|
32
|
+
end
|
33
|
+
|
34
|
+
RSpec::Core::RakeTask.new(:rspec_run => ["ci:setup:rspec"]) do |t|
|
35
|
+
t.pattern = '**/*_spec.rb'
|
36
|
+
end
|
37
|
+
|
38
|
+
Cucumber::Rake::Task.new(:cucumber_run => ["ci:setup:cucumber"])
|
data/spec/concurrency_spec.rb
CHANGED
@@ -19,6 +19,24 @@ describe "Manage Concurrency" do
|
|
19
19
|
@document.conflicts.should be_nil
|
20
20
|
end
|
21
21
|
|
22
|
+
describe "am_timestamp" do
|
23
|
+
|
24
|
+
it "should return nil if active_metadata_timestamp has not been provided" do
|
25
|
+
@document.am_timestamp.should be_nil
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should return a float if active_metadata_timestamp is instance of Time" do
|
29
|
+
@document.active_metadata_timestamp = Time.now
|
30
|
+
@document.am_timestamp.should be_an_instance_of Float
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should return a float if active_metadata_timestamp is a String" do
|
34
|
+
@document.active_metadata_timestamp = Time.now.to_f.to_s
|
35
|
+
@document.am_timestamp.should be_an_instance_of Float
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
22
40
|
describe "when a field is modified and the form ts is subsequent of the history ts" do
|
23
41
|
|
24
42
|
it "should save the new value and history must be updated with the latest change" do
|
data/spec/spec_helper.rb
CHANGED
@@ -32,8 +32,6 @@ RAILS_CACHE = ActiveSupport::Cache::MemoryStore.new
|
|
32
32
|
require "#{File.dirname(__FILE__)}/../lib/engine.rb"
|
33
33
|
Dir["spec/support/*.rb"].each {|f| require "support/#{(File.basename(f, File.extname(f)) )}"}
|
34
34
|
|
35
|
-
Dir["app/models/*.rb"].each {|f| require "models/#{(File.basename(f, File.extname(f)) )}"}
|
36
|
-
|
37
35
|
RSpec.configure do |config|
|
38
36
|
# == Mock Framework
|
39
37
|
#
|
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.
|
4
|
+
version: 0.3.0
|
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-20 00:00:00.000000000Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rspec-rails
|
17
|
-
requirement: &
|
17
|
+
requirement: &2169814040 !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: *2169814040
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: sqlite3
|
28
|
-
requirement: &
|
28
|
+
requirement: &2169813620 !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: *2169813620
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
38
|
name: sqlite3-ruby
|
39
|
-
requirement: &
|
39
|
+
requirement: &2169813200 !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: *2169813200
|
48
48
|
- !ruby/object:Gem::Dependency
|
49
49
|
name: cucumber
|
50
|
-
requirement: &
|
50
|
+
requirement: &2169812780 !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: *2169812780
|
59
59
|
- !ruby/object:Gem::Dependency
|
60
60
|
name: ci_reporter
|
61
|
-
requirement: &
|
61
|
+
requirement: &2169812300 !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: *2169812300
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
71
|
name: rails
|
72
|
-
requirement: &
|
72
|
+
requirement: &2169811520 !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: *2169811520
|
81
81
|
- !ruby/object:Gem::Dependency
|
82
82
|
name: activerecord
|
83
|
-
requirement: &
|
83
|
+
requirement: &2169810280 !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: *2169810280
|
92
92
|
- !ruby/object:Gem::Dependency
|
93
93
|
name: paperclip
|
94
|
-
requirement: &
|
94
|
+
requirement: &2169803300 !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: *2169803300
|
103
103
|
- !ruby/object:Gem::Dependency
|
104
104
|
name: to_xls
|
105
|
-
requirement: &
|
105
|
+
requirement: &2169802640 !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: *2169802640
|
114
114
|
description: First implementation will write metadata on mongodb
|
115
115
|
email:
|
116
116
|
- acampolonghi@gmail.com
|
@@ -120,6 +120,7 @@ extensions: []
|
|
120
120
|
extra_rdoc_files: []
|
121
121
|
files:
|
122
122
|
- lib/active_metadata/base.rb
|
123
|
+
- lib/active_metadata/form_helper.rb
|
123
124
|
- lib/active_metadata/helpers.rb
|
124
125
|
- lib/active_metadata/persistence/active_record/attachment.rb
|
125
126
|
- lib/active_metadata/persistence/active_record/history.rb
|
@@ -127,7 +128,6 @@ files:
|
|
127
128
|
- lib/active_metadata/persistence/active_record/watcher.rb
|
128
129
|
- lib/active_metadata/persistence/active_record.rb
|
129
130
|
- lib/active_metadata/persistence/persistence.rb
|
130
|
-
- lib/active_metadata/railtie.rb
|
131
131
|
- lib/active_metadata/version.rb
|
132
132
|
- lib/active_metadata.rb
|
133
133
|
- lib/application_controller.rb
|
@@ -139,7 +139,7 @@ files:
|
|
139
139
|
- lib/model/active_record/watcher.rb
|
140
140
|
- lib/rails/railties/tasks.rake
|
141
141
|
- lib/rake/active_record_tasks.rb
|
142
|
-
- lib/rake/
|
142
|
+
- lib/rake/ci.rb
|
143
143
|
- lib/templates/active_metadata.yml
|
144
144
|
- lib/templates/active_metadata_migrations
|
145
145
|
- lib/templates/mongoid.yml
|
@@ -164,6 +164,7 @@ files:
|
|
164
164
|
- config/initializers/inflections.rb
|
165
165
|
- config/mongoid.yml
|
166
166
|
- config/routes.rb
|
167
|
+
- db/development.sqlite3
|
167
168
|
- db/migrate/01_create_test_resources.rb
|
168
169
|
- db/migrate/02_active_metadata_migrations.rb
|
169
170
|
- db/test.sqlite3
|
data/lib/rake/task.rb
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
require 'rake'
|
2
|
-
require 'fileutils'
|
3
|
-
|
4
|
-
namespace :active_metadata do
|
5
|
-
task :install do
|
6
|
-
#FileUtils.cp File.expand_path('../../templates/mongoid.yml',__FILE__), File.expand_path('config/')
|
7
|
-
#puts "Installed mongoid.yml"
|
8
|
-
|
9
|
-
FileUtils.cp File.expand_path('../../templates/active_metadata.yml',__FILE__), File.expand_path('config/')
|
10
|
-
puts "Installed active_metadata.yml"
|
11
|
-
|
12
|
-
puts "Copying migrations"
|
13
|
-
ts = Time.now.utc.strftime('%Y%m%d%H%M%S')
|
14
|
-
FileUtils.cp File.expand_path('../../templates/active_metadata_migrations',__FILE__), File.expand_path("db/migrate/#{ts}_active_metadata_migrations.rb")
|
15
|
-
puts "run rake db:migrate to complete the gem installation"
|
16
|
-
|
17
|
-
end
|
18
|
-
end
|