vidibus-version_scheduler 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 Andre Pankratz
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,36 @@
1
+ # Vidibus::VersionScheduler [![](http://travis-ci.org/vidibus/vidibus-version_scheduler.png)](http://travis-ci.org/vidibus/vidibus-version_scheduler) [![](http://stillmaintained.com/vidibus/vidibus-version_scheduler.png)](http://stillmaintained.com/vidibus/vidibus-version_scheduler)
2
+
3
+ Schedules migration to future versions created by Vidibus::Versioning.
4
+
5
+ This gem is part of [Vidibus](http://vidibus.org), an open source toolset for building distributed (video) applications.
6
+
7
+
8
+ ## Installation
9
+
10
+ Add `gem "vidibus-version_scheduler"` to your Gemfile. Then call `bundle install` on your console.
11
+
12
+
13
+ ## Usage
14
+
15
+ To use scheduling on a versioned model, just include the lib and you're done:
16
+
17
+ ```ruby
18
+ class Book
19
+ include Mongoid::Document
20
+ include Vidibus::Versioning::Mongoid
21
+ include Vidibus::VersionScheduler::Mongoid
22
+ end
23
+ ```
24
+
25
+ Whenever a version gets created that has a future `created_at` timestamp, a `DelayedJob` will be created to
26
+ migrate your model to that version at the specified time.
27
+
28
+
29
+ ## TODO
30
+
31
+ * Solve the serious bug with DelayedJob and Mongoid. See ISSUES.md
32
+
33
+
34
+ ## Copyright
35
+
36
+ © 2011 Andre Pankratz. See LICENSE for details.
data/Rakefile ADDED
@@ -0,0 +1,25 @@
1
+ require "bundler"
2
+ require "rdoc/task"
3
+ require "rspec"
4
+ require "rspec/core/rake_task"
5
+
6
+ Bundler::GemHelper.install_tasks
7
+
8
+ $LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
9
+ require "vidibus/version_scheduler/version"
10
+
11
+ RSpec::Core::RakeTask.new(:rcov) do |t|
12
+ t.pattern = "spec/**/*_spec.rb"
13
+ t.rcov = true
14
+ t.rcov_opts = ["--exclude", "^spec,/gems/"]
15
+ end
16
+
17
+ Rake::RDocTask.new do |rdoc|
18
+ rdoc.rdoc_dir = "rdoc"
19
+ rdoc.title = "vidibus-sysinfo #{Vidibus::VersionScheduler::VERSION}"
20
+ rdoc.rdoc_files.include("README*")
21
+ rdoc.rdoc_files.include("lib/**/*.rb")
22
+ rdoc.options << "--charset=utf-8"
23
+ end
24
+
25
+ task :default => :rcov
@@ -0,0 +1,7 @@
1
+ require "mongoid"
2
+ require "delayed_job"
3
+ require "delayed_job_mongoid"
4
+ require "vidibus-uuid"
5
+ require "vidibus-versioning"
6
+
7
+ require "vidibus/version_scheduler"
@@ -0,0 +1,7 @@
1
+ require "vidibus/version_scheduler/mongoid"
2
+ require "vidibus/version_scheduler/scheduled_version"
3
+ require "vidibus/version_scheduler/migration_job"
4
+ require "vidibus/version_scheduler/version_observer"
5
+
6
+ Mongoid.observers = Vidibus::VersionScheduler::VersionObserver
7
+ Mongoid.instantiate_observers
@@ -0,0 +1,19 @@
1
+ module Vidibus
2
+ module VersionScheduler
3
+ class MigrationJob < Struct.new(:version_uuid)
4
+ def initialize(uuid)
5
+ self.version_uuid = uuid or raise(ArgumentError)
6
+ end
7
+
8
+ def perform
9
+ return unless version = Vidibus::Versioning::Version.where(:uuid => version_uuid).first
10
+ return unless versioned = version.versioned
11
+ begin
12
+ versioned.migrate!(version.number)
13
+ ScheduledVersion.where(:version_uuid => version.uuid).destroy_all
14
+ rescue Vidibus::Versioning::MigrationError
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,15 @@
1
+ module Vidibus
2
+ module VersionScheduler
3
+ module Mongoid
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ has_many :scheduled_versions, :as => :scheduled, :class_name => "Vidibus::VersionScheduler::ScheduledVersion", :dependent => :destroy
8
+ end
9
+
10
+ def next_scheduled_version
11
+ @next_scheduled_version ||= scheduled_versions.where(:run_at.gt => Time.now).asc(:run_at).limit(1).first
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,49 @@
1
+ module Vidibus
2
+ module VersionScheduler
3
+ class ScheduledVersion
4
+ include ::Mongoid::Document
5
+
6
+ belongs_to :scheduled, :polymorphic => true
7
+
8
+ field :run_at, :type => Time
9
+ field :version_uuid, :type => String
10
+ field :job_id, :type => String
11
+
12
+ before_validation :set_run_at
13
+ validates :version_uuid, :version, :presence => true
14
+
15
+ before_create :ensure_job
16
+ before_destroy :remove_job
17
+
18
+ def version
19
+ @version ||= Vidibus::Versioning::Version.where(:uuid => version_uuid).first
20
+ end
21
+
22
+ def job
23
+ @job ||= begin
24
+ Delayed::Backend::Mongoid::Job.find(job_id) if job_id
25
+ rescue ::Mongoid::Errors::DocumentNotFound
26
+ end
27
+ end
28
+
29
+ protected
30
+
31
+ def set_run_at
32
+ return unless version
33
+ self.run_at ||= version.created_at
34
+ end
35
+
36
+ def ensure_job
37
+ return if job
38
+ if version and Time.now < run_at
39
+ @job = Delayed::Job.enqueue(MigrationJob.new(version_uuid), :priority => 1, :run_at => run_at)
40
+ self.job_id = @job.id
41
+ end
42
+ end
43
+
44
+ def remove_job
45
+ job.destroy if job
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,5 @@
1
+ module Vidibus
2
+ module VersionScheduler
3
+ VERSION = "0.1.0"
4
+ end
5
+ end
@@ -0,0 +1,39 @@
1
+ module Vidibus
2
+ module VersionScheduler
3
+ class VersionObserver < ::Mongoid::Observer
4
+ observe Vidibus::Versioning::Version
5
+
6
+ def after_save(version)
7
+ schedule(version) if scheduled?(version)
8
+ end
9
+
10
+ def after_destroy(version)
11
+ unschedule(version) if scheduled?(version)
12
+ end
13
+
14
+ protected
15
+
16
+ def scheduled?(version)
17
+ version.versioned_type.constantize.ancestors.include?(Vidibus::VersionScheduler::Mongoid)
18
+ end
19
+
20
+ def schedule(version)
21
+ scheduled = ScheduledVersion.where(:version_uuid => version.uuid)
22
+ if version.created_at > Time.now
23
+ different = scheduled.where(:run_at.ne => version.created_at)
24
+ different.destroy_all if different.any?
25
+ ScheduledVersion.create!(:version_uuid => version.uuid, :scheduled => version.versioned) unless scheduled.any?
26
+ else
27
+ unschedule(version)
28
+ end
29
+ end
30
+
31
+ def unschedule(version)
32
+ scheduled = ScheduledVersion.where(:version_uuid => version.uuid)
33
+ if scheduled.any?
34
+ scheduled.destroy_all
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
metadata ADDED
@@ -0,0 +1,206 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: vidibus-version_scheduler
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ - 0
9
+ version: 0.1.0
10
+ platform: ruby
11
+ authors:
12
+ - Andre Pankratz
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2011-07-14 00:00:00 +02:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: mongoid
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ~>
26
+ - !ruby/object:Gem::Version
27
+ segments:
28
+ - 2
29
+ version: "2"
30
+ type: :runtime
31
+ version_requirements: *id001
32
+ - !ruby/object:Gem::Dependency
33
+ name: delayed_job
34
+ prerelease: false
35
+ requirement: &id002 !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ segments:
40
+ - 0
41
+ version: "0"
42
+ type: :runtime
43
+ version_requirements: *id002
44
+ - !ruby/object:Gem::Dependency
45
+ name: delayed_job_mongoid
46
+ prerelease: false
47
+ requirement: &id003 !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ segments:
52
+ - 0
53
+ version: "0"
54
+ type: :runtime
55
+ version_requirements: *id003
56
+ - !ruby/object:Gem::Dependency
57
+ name: vidibus-uuid
58
+ prerelease: false
59
+ requirement: &id004 !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ segments:
64
+ - 0
65
+ version: "0"
66
+ type: :runtime
67
+ version_requirements: *id004
68
+ - !ruby/object:Gem::Dependency
69
+ name: vidibus-versioning
70
+ prerelease: false
71
+ requirement: &id005 !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ segments:
76
+ - 0
77
+ version: "0"
78
+ type: :runtime
79
+ version_requirements: *id005
80
+ - !ruby/object:Gem::Dependency
81
+ name: bundler
82
+ prerelease: false
83
+ requirement: &id006 !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ segments:
88
+ - 1
89
+ - 0
90
+ - 0
91
+ version: 1.0.0
92
+ type: :development
93
+ version_requirements: *id006
94
+ - !ruby/object:Gem::Dependency
95
+ name: rdoc
96
+ prerelease: false
97
+ requirement: &id007 !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ segments:
102
+ - 0
103
+ version: "0"
104
+ type: :development
105
+ version_requirements: *id007
106
+ - !ruby/object:Gem::Dependency
107
+ name: rake
108
+ prerelease: false
109
+ requirement: &id008 !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ segments:
114
+ - 0
115
+ version: "0"
116
+ type: :development
117
+ version_requirements: *id008
118
+ - !ruby/object:Gem::Dependency
119
+ name: rspec
120
+ prerelease: false
121
+ requirement: &id009 !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ~>
124
+ - !ruby/object:Gem::Version
125
+ segments:
126
+ - 2
127
+ version: "2"
128
+ type: :development
129
+ version_requirements: *id009
130
+ - !ruby/object:Gem::Dependency
131
+ name: rr
132
+ prerelease: false
133
+ requirement: &id010 !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ segments:
138
+ - 0
139
+ version: "0"
140
+ type: :development
141
+ version_requirements: *id010
142
+ - !ruby/object:Gem::Dependency
143
+ name: rcov
144
+ prerelease: false
145
+ requirement: &id011 !ruby/object:Gem::Requirement
146
+ requirements:
147
+ - - ">="
148
+ - !ruby/object:Gem::Version
149
+ segments:
150
+ - 0
151
+ version: "0"
152
+ type: :development
153
+ version_requirements: *id011
154
+ description: Schedules migration to future versions created by Vidibus::Versioning.
155
+ email: andre@vidibus.com
156
+ executables: []
157
+
158
+ extensions: []
159
+
160
+ extra_rdoc_files: []
161
+
162
+ files:
163
+ - lib/vidibus/version_scheduler/migration_job.rb
164
+ - lib/vidibus/version_scheduler/mongoid.rb
165
+ - lib/vidibus/version_scheduler/scheduled_version.rb
166
+ - lib/vidibus/version_scheduler/version.rb
167
+ - lib/vidibus/version_scheduler/version_observer.rb
168
+ - lib/vidibus/version_scheduler.rb
169
+ - lib/vidibus-version_scheduler.rb
170
+ - LICENSE
171
+ - README.md
172
+ - Rakefile
173
+ has_rdoc: true
174
+ homepage: https://github.com/vidibus/vidibus-version_scheduler
175
+ licenses: []
176
+
177
+ post_install_message:
178
+ rdoc_options: []
179
+
180
+ require_paths:
181
+ - lib
182
+ required_ruby_version: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - ">="
185
+ - !ruby/object:Gem::Version
186
+ segments:
187
+ - 0
188
+ version: "0"
189
+ required_rubygems_version: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - ">="
192
+ - !ruby/object:Gem::Version
193
+ segments:
194
+ - 1
195
+ - 3
196
+ - 6
197
+ version: 1.3.6
198
+ requirements: []
199
+
200
+ rubyforge_project: vidibus-version_scheduler
201
+ rubygems_version: 1.3.6
202
+ signing_key:
203
+ specification_version: 3
204
+ summary: Provides scheduling of future versions
205
+ test_files: []
206
+