mobb 0.2.0 → 0.3.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f1786f31311eda789fd50527e7a5cbdbce91c63388668ba248db37f32f5c2578
4
- data.tar.gz: c89c89b84d4e6298152dd78113d941bc397dfa2c65ea352bafa084caa5a5d009
3
+ metadata.gz: 37a6be9b2a1986d9bee5a4d1b65db94b9439b43851f9a251573ea979744f28a3
4
+ data.tar.gz: 4473258177b3a6c6dc409300930281507e44505705a1751981c23aad1882d504
5
5
  SHA512:
6
- metadata.gz: 74778071b90f9656e2cd2e29b8b88e98ccf6168c05f33c0af44c82036f1214eac7ac8bc6742cd6658a2039849fa35bc117cf55e515cb409e0945cc80b859b03c
7
- data.tar.gz: a0c47902564e323ccb4be959451ec21d433ceedb66f656efa1d56762e1705e0fea316f92ce1c03444bc1100f5ebe45e3381a9bb75e59c9b4ed3bd14db77f4600
6
+ metadata.gz: d39ac2495a95a3aec44d99e6fed4362e177c135f54bf1b0b0ae8d46e164d56bad8bcd919fcd422fe13309f55da71d70b9a417a90ef5e235147e72f6b4ce06ee6
7
+ data.tar.gz: d0956d5143950ef3ef82e6ccc63c4347baf37b8431b221157b7b924cda36857f2871418b14e6826ced801b59aac9cec2aef341945be22d877a83e20709626783
@@ -9,15 +9,16 @@ end
9
9
 
10
10
  # Warning this is bad implementation
11
11
  # inifinity loop happend
12
- receive "Yo", laziness: true do
13
- "Yo"
14
- end
12
+ # TODO: now broken
13
+ #receive "Yo", laziness: true do
14
+ # "Yo"
15
+ #end
15
16
 
16
17
  receive /hey (\w+)/ do |someone|
17
18
  "hey #{someone}, waz up?"
18
19
  end
19
20
 
20
- # This function is not implements yet
21
- #every 1.day, at: '15:30', exclude: :holiday do
22
- # 'Stund up daily meeting time!'
23
- #end
21
+ # Need dest_to condition to cron/every task
22
+ every :day, at: '12:30', dest_to: 'times_kinoppyd' do
23
+ 'Stund up daily meeting time!'
24
+ end
@@ -1,20 +1,24 @@
1
1
  require 'repp'
2
+ require 'whenever'
3
+ require 'parse-cron'
4
+
2
5
  require "mobb/version"
3
6
 
4
7
  module Mobb
5
8
  class Matcher
6
- def initialize(pattern, options) @pattern, @options = pattern, options; end
9
+ def initialize(pattern, options = {}) @pattern, @options = pattern, options; end
7
10
  def regexp?; pattern.is_a?(Regexp); end
8
11
  def inspect; "pattern: #{@pattern}, options #{@options}"; end
9
- def invoke(time = Time.now) @options[:last_invoked] = time; end
12
+ def cron?; pattern.is_a?(CronParser); end
13
+ def tick(time = Time.now) @options[:last_tick] = time; end
14
+ def last_tick; @options[:last_tick] end
10
15
 
11
16
  def match?(context)
12
17
  case context
13
18
  when String
14
19
  string_matcher(context)
15
20
  when Time
16
- # TODO: do something
17
- false
21
+ cron_matcher(context)
18
22
  when Array
19
23
  context.all? { |c| match?(c) }
20
24
  else
@@ -43,6 +47,13 @@ module Mobb
43
47
  false
44
48
  end
45
49
  end
50
+
51
+ def cron_matcher(time)
52
+ last = last_tick
53
+ tick(time) if !last || time > last
54
+ return false if time < last
55
+ pattern.next(time) == pattern.next(last) ? false : true
56
+ end
46
57
  end
47
58
 
48
59
  class Base
@@ -50,20 +61,12 @@ module Mobb
50
61
  dup.call!(env)
51
62
  end
52
63
 
53
- def tick(env)
54
- dup.tick!(env)
55
- end
56
-
57
64
  def call!(env)
58
65
  @env = env
59
66
  invoke { dispatch! }
60
67
  [@body, @attachments]
61
68
  end
62
69
 
63
- def tick!(env)
64
- fail # TODO: write logic here
65
- end
66
-
67
70
  def dispatch!
68
71
  # TODO: encode input messages
69
72
 
@@ -92,9 +95,12 @@ module Mobb
92
95
 
93
96
  def handle_event(base = settings, passed_block = nil)
94
97
  if responds = base.events[@env.event_type]
95
- responds.each do |pattern, block, conditions|
96
- process_event(pattern, conditions) do |*args|
97
- event_eval { block[*args] }
98
+ responds.each do |pattern, block, before_conditions, after_conditions|
99
+ process_event(pattern, before_conditions) do |*args|
100
+ event_eval do
101
+ res = block[*args]
102
+ after_conditions.inject(res) { |acc, c| c.bind(self).call(acc) }
103
+ end
98
104
  end
99
105
  end
100
106
  end
@@ -140,7 +146,8 @@ module Mobb
140
146
 
141
147
  def reset!
142
148
  @events = {}
143
- @conditions = []
149
+ @before_conditions = []
150
+ @after_conditions = []
144
151
  end
145
152
 
146
153
  def settings
@@ -150,27 +157,44 @@ module Mobb
150
157
  def receive(pattern, options = {}, &block) event(:message, pattern, options, &block); end
151
158
  alias :on :receive
152
159
 
153
- #def every(pattern, options = {}, &block) event(:cron, pattern, options, &block); end
160
+ def every(pattern, options = {}, &block) event(:ticker, pattern, options, &block); end
161
+
162
+ def cron(pattern, options = {}, &block) event(:ticker, pattern, options, &block); end
154
163
 
155
164
  def event(type, pattern, options, &block)
156
165
  (@events[type] ||= []) << compile!(type, pattern, options, &block)
157
166
  end
158
167
 
159
168
  def compile!(type, pattern, options, &block)
169
+ at = options.delete(:at)
160
170
  options.each_pair { |option, args| send(option, *args) }
161
171
 
162
- matcher = compile(pattern, options)
172
+ matcher = case type
173
+ when :message
174
+ compile(pattern, options)
175
+ when :ticker
176
+ compile_cron(pattern, at)
177
+ end
163
178
  unbound_method = generate_method("#{type}", &block)
164
- conditions, @conditions = @conditions, []
179
+ before_conditions, @before_conditions = @before_conditions, []
180
+ after_conditions, @after_conditions = @after_conditions, []
165
181
  wrapper = block.arity != 0 ?
166
182
  proc { |instance, args| unbound_method.bind(instance).call(*args) } :
167
183
  proc { |instance, args| unbound_method.bind(instance).call }
168
184
 
169
- [ matcher, wrapper, conditions ]
185
+ [ matcher, wrapper, before_conditions, after_conditions ]
170
186
  end
171
187
 
172
188
  def compile(pattern, options) Matcher.new(pattern, options); end
173
189
 
190
+ def compile_cron(time, at)
191
+ if String === time
192
+ Matcher.new(CronParser.new(time))
193
+ else
194
+ Matcher.new(CronParser.new(Whenever::Output::Cron.new(time, nil, at).time_in_cron_syntax))
195
+ end
196
+ end
197
+
174
198
  def generate_method(name, &block)
175
199
  define_method(name, &block)
176
200
  method = instance_method(name)
@@ -224,7 +248,18 @@ module Mobb
224
248
  end
225
249
 
226
250
  def condition(name = "#{caller.first[/`.*'/]} condition", &block)
227
- @conditions << generate_method(name, &block)
251
+ @before_conditions << generate_method(name, &block)
252
+ end
253
+ alias :before_condition :condition
254
+
255
+ def after_condition(name = "#{caller.first[/`.*'/]} condition", &block)
256
+ @after_conditions << generate_method(name) do |res|
257
+ if String === res
258
+ res = [res, {}]
259
+ end
260
+ block.call(res)
261
+ res
262
+ end
228
263
  end
229
264
 
230
265
  def ignore_bot(cond)
@@ -239,6 +274,12 @@ module Mobb
239
274
  end
240
275
  end
241
276
 
277
+ def dest_to(channel)
278
+ after_condition do |res|
279
+ res.last[:dest_channel] = channel
280
+ end
281
+ end
282
+
242
283
  def enable(*options) options.each { |option| set(option, true) }; end
243
284
  def disable(*options) options.each { |option| set(option, false) }; end
244
285
  def clear(*options) options.each { |option| set(option, nil) }; end
@@ -372,7 +413,7 @@ module Mobb
372
413
  end
373
414
  end
374
415
 
375
- delegate :receive, :on, #:every,
416
+ delegate :receive, :on, :every, :cron,
376
417
  :set, :enable, :disable, :clear,
377
418
  :helpers
378
419
 
@@ -1,3 +1,3 @@
1
1
  module Mobb
2
- VERSION = "0.2.0"
2
+ VERSION = "0.3.0"
3
3
  end
@@ -19,7 +19,9 @@ Gem::Specification.new do |spec|
19
19
  end
20
20
  spec.require_paths = ["lib"]
21
21
 
22
- spec.add_dependency "repp", "~> 0.2"
22
+ spec.add_dependency "repp", "~> 0.3"
23
+ spec.add_dependency "whenever", "~> 0.10"
24
+ spec.add_dependency "parse-cron", "~> 0.1"
23
25
 
24
26
  spec.add_development_dependency "bundler", "~> 1.16"
25
27
  spec.add_development_dependency "rake", "~> 10.0"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mobb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - kinoppyd
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-08-26 00:00:00.000000000 Z
11
+ date: 2018-09-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: repp
@@ -16,14 +16,42 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0.2'
19
+ version: '0.3'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0.2'
26
+ version: '0.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: whenever
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.10'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.10'
41
+ - !ruby/object:Gem::Dependency
42
+ name: parse-cron
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.1'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.1'
27
55
  - !ruby/object:Gem::Dependency
28
56
  name: bundler
29
57
  requirement: !ruby/object:Gem::Requirement