active_metadata 0.2.4 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Binary file
data/db/test.sqlite3 CHANGED
Binary file
@@ -7,8 +7,8 @@ module ActiveMetadata
7
7
  module Base
8
8
 
9
9
  require 'paperclip'
10
- require "active_metadata/persistence/persistence"
11
- require "active_metadata/helpers"
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
- def active_metadata_timestamp
58
- metadata_root.active_metadata_timestamp || nil
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
- return if active_metadata_timestamp.nil? #if no timestamp no way to check concurrency so just skip
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
- latest_history = histories.first
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
- # if form timestamp is subsequent the history last change go on
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.
@@ -0,0 +1,11 @@
1
+ module ActionView
2
+ module Helpers
3
+ class FormBuilder
4
+
5
+ def active_metadata_timestamp
6
+ @template.hidden_field_tag "#{@object_name}[active_metadata_timestamp]", Time.now.to_f
7
+ end
8
+
9
+ end
10
+ end
11
+ end
@@ -1,3 +1,3 @@
1
1
  module ActiveMetadata
2
- VERSION = "0.2.4"
2
+ VERSION = "0.3.0"
3
3
  end
@@ -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 :cheese do
2
-
3
- desc "example gem rake task"
4
- task :report => :environment do
5
- puts "you just ran the example gem rake task"
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"])
@@ -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.2.4
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-19 00:00:00.000000000Z
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: &2169354520 !ruby/object:Gem::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: *2169354520
25
+ version_requirements: *2169814040
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: sqlite3
28
- requirement: &2169353840 !ruby/object:Gem::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: *2169353840
36
+ version_requirements: *2169813620
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: sqlite3-ruby
39
- requirement: &2169353240 !ruby/object:Gem::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: *2169353240
47
+ version_requirements: *2169813200
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: cucumber
50
- requirement: &2169352820 !ruby/object:Gem::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: *2169352820
58
+ version_requirements: *2169812780
59
59
  - !ruby/object:Gem::Dependency
60
60
  name: ci_reporter
61
- requirement: &2169352320 !ruby/object:Gem::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: *2169352320
69
+ version_requirements: *2169812300
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: rails
72
- requirement: &2169351620 !ruby/object:Gem::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: *2169351620
80
+ version_requirements: *2169811520
81
81
  - !ruby/object:Gem::Dependency
82
82
  name: activerecord
83
- requirement: &2169350680 !ruby/object:Gem::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: *2169350680
91
+ version_requirements: *2169810280
92
92
  - !ruby/object:Gem::Dependency
93
93
  name: paperclip
94
- requirement: &2169350180 !ruby/object:Gem::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: *2169350180
102
+ version_requirements: *2169803300
103
103
  - !ruby/object:Gem::Dependency
104
104
  name: to_xls
105
- requirement: &2169349300 !ruby/object:Gem::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: *2169349300
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/task.rb
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
@@ -1,6 +0,0 @@
1
- require 'rails'
2
- class Railtie < Rails::Railtie
3
- rake_tasks do
4
- require_relative '../rake/task.rb'
5
- end
6
- end
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