From f1d2f242193e10e4f4f781243fb084c06f8ea226 Mon Sep 17 00:00:00 2001 From: kinoppyd Date: Sat, 8 Sep 2018 15:47:25 +0900 Subject: [PATCH 1/2] Add dependency for whenecer and parse-cron --- mobb.gemspec | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mobb.gemspec b/mobb.gemspec index 5c84d41..1fe69e6 100644 --- a/mobb.gemspec +++ b/mobb.gemspec @@ -20,6 +20,8 @@ Gem::Specification.new do |spec| spec.require_paths = ["lib"] spec.add_dependency "repp", "~> 0.2" + spec.add_dependency "whenever", "~> 0.10" + spec.add_dependency "parse-cron", "~> 0.1" spec.add_development_dependency "bundler", "~> 1.16" spec.add_development_dependency "rake", "~> 10.0" From dfcff3d4afc6bf0bbeca0e38b770f2ee63800f82 Mon Sep 17 00:00:00 2001 From: kinoppyd Date: Sat, 15 Sep 2018 15:44:30 +0900 Subject: [PATCH 2/2] Implements every/cron --- lib/mobb/base.rb | 49 +++++++++++++++++++++++++++++++++--------------- mobb.gemspec | 2 +- 2 files changed, 35 insertions(+), 16 deletions(-) diff --git a/lib/mobb/base.rb b/lib/mobb/base.rb index 1aae74c..d69a8a7 100644 --- a/lib/mobb/base.rb +++ b/lib/mobb/base.rb @@ -1,20 +1,24 @@ require 'repp' +require 'whenever' +require 'parse-cron' + require "mobb/version" module Mobb class Matcher - def initialize(pattern, options) @pattern, @options = pattern, options; end + def initialize(pattern, options = {}) @pattern, @options = pattern, options; end def regexp?; pattern.is_a?(Regexp); end def inspect; "pattern: #{@pattern}, options #{@options}"; end - def invoke(time = Time.now) @options[:last_invoked] = time; end + def cron?; pattern.is_a?(CronParser); end + def tick(time = Time.now) @options[:last_tick] = time; end + def last_tick; @options[:last_tick] end def match?(context) case context when String string_matcher(context) when Time - # TODO: do something - false + cron_matcher(context) when Array context.all? { |c| match?(c) } else @@ -43,6 +47,13 @@ def string_matcher(string) false end end + + def cron_matcher(time) + last = last_tick + tick(time) if !last || time > last + return false if time < last + pattern.next(time) == pattern.next(last) ? false : true + end end class Base @@ -50,20 +61,12 @@ def call(env) dup.call!(env) end - def tick(env) - dup.tick!(env) - end - def call!(env) @env = env invoke { dispatch! } [@body, @attachments] end - def tick!(env) - fail # TODO: write logic here - end - def dispatch! # TODO: encode input messages @@ -154,16 +157,24 @@ def settings def receive(pattern, options = {}, &block) event(:message, pattern, options, &block); end alias :on :receive - #def every(pattern, options = {}, &block) event(:cron, pattern, options, &block); end + def every(pattern, options = {}, &block) event(:ticker, pattern, options, &block); end + + def cron(pattern, options = {}, &block) event(:ticker, pattern, options, &block); end def event(type, pattern, options, &block) (@events[type] ||= []) << compile!(type, pattern, options, &block) end def compile!(type, pattern, options, &block) + at = options.delete(:at) options.each_pair { |option, args| send(option, *args) } - matcher = compile(pattern, options) + matcher = case type + when :message + compile(pattern, options) + when :ticker + compile_cron(pattern, at) + end unbound_method = generate_method("#{type}", &block) before_conditions, @before_conditions = @before_conditions, [] after_conditions, @after_conditions = @after_conditions, [] @@ -176,6 +187,14 @@ def compile!(type, pattern, options, &block) def compile(pattern, options) Matcher.new(pattern, options); end + def compile_cron(time, at) + if String === time + Matcher.new(CronParser.new(time)) + else + Matcher.new(CronParser.new(Whenever::Output::Cron.new(time, nil, at).time_in_cron_syntax)) + end + end + def generate_method(name, &block) define_method(name, &block) method = instance_method(name) @@ -394,7 +413,7 @@ def self.delegate(*methods) end end - delegate :receive, :on, #:every, + delegate :receive, :on, :every, :cron, :set, :enable, :disable, :clear, :helpers diff --git a/mobb.gemspec b/mobb.gemspec index 1fe69e6..6f49726 100644 --- a/mobb.gemspec +++ b/mobb.gemspec @@ -19,7 +19,7 @@ Gem::Specification.new do |spec| end spec.require_paths = ["lib"] - spec.add_dependency "repp", "~> 0.2" + spec.add_dependency "repp", "~> 0.3" spec.add_dependency "whenever", "~> 0.10" spec.add_dependency "parse-cron", "~> 0.1"