vidibus-version_scheduler 0.1.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/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
+