lib/perfectsched.rb in perfectsched-0.7.19 vs lib/perfectsched.rb in perfectsched-0.8.0
- old
+ new
@@ -1,4 +1,98 @@
-require 'perfectsched/engine'
-require 'perfectsched/croncalc'
-require 'perfectsched/backend'
-require 'perfectsched/version'
+#
+# PerfectSched
+#
+# Copyright (C) 2012 FURUHASHI Sadayuki
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+module PerfectSched
+ require 'json'
+ require 'thread' # Mutex, CoditionVariable
+
+ {
+ :Application => 'perfectsched/application',
+ :Backend => 'perfectsched/backend',
+ :BackendHelper => 'perfectsched/backend',
+ :BlockingFlag => 'perfectsched/blocking_flag',
+ :Client => 'perfectsched/client',
+ :DaemonsLogger => 'perfectsched/daemons_logger',
+ :Engine => 'perfectsched/engine',
+ :Model => 'perfectsched/model',
+ :Runner => 'perfectsched/runner',
+ :ScheduleCollection => 'perfectsched/schedule_collection',
+ :Schedule => 'perfectsched/schedule',
+ :ScheduleWithMetadata => 'perfectsched/schedule',
+ :ScheduleMetadata => 'perfectsched/schedule_metadata',
+ :ScheduleMetadataAccessors => 'perfectsched/schedule_metadata',
+ :SignalQueue => 'perfectsched/signal_queue',
+ :Task => 'perfectsched/task',
+ :Worker => 'perfectsched/worker',
+ }.each_pair {|k,v|
+ autoload k, File.expand_path(v, File.dirname(__FILE__))
+ }
+ [
+ 'perfectsched/version',
+ 'perfectsched/error',
+ ].each {|v|
+ require File.expand_path(v, File.dirname(__FILE__))
+ }
+
+ require 'cron-spec'
+ require 'tzinfo'
+
+ def self.open(config, &block)
+ c = Client.new(config)
+ begin
+ q = ScheduleCollection.new(c)
+ if block
+ block.call(q)
+ else
+ c = nil
+ return q
+ end
+ ensure
+ c.close if c
+ end
+ end
+
+ def self.cron_time(cron, timestamp, timezone)
+ begin
+ tab = CronSpec::CronSpecification.new(cron)
+ rescue
+ raise ArgumentError, "invalid cron format: #{$!}: #{cron.inspect}"
+ end
+
+ begin
+ tz = TZInfo::Timezone.get(timezone) if timezone
+ rescue
+ raise ArgumentError, "unknown timezone: #{$!}: #{timezone.inspect}"
+ end
+
+ ts = (timestamp + 59) / 60 * 60
+ while true
+ t = Time.at(ts).utc
+ t = tz.utc_to_local(t) if tz
+ if tab.is_specification_in_effect?(t)
+ return ts
+ end
+ ts += 60
+ # FIXME break
+ end
+ end
+
+ def self.next_time(cron, before_timestamp, timezone)
+ cron_time(cron, before_timestamp+1, timezone)
+ end
+end
+