lita-cron 0.0.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 08f6ba7f415a3be63193a21f40a2dafdde0d1f77
4
+ data.tar.gz: 5e5aba57698cdcea1b871183540bd8094cd2c868
5
+ SHA512:
6
+ metadata.gz: ff4b608f2cd0d141e17f178ecf411fd66ec2ef546aef72dbcc47cf8708deb7d249ec43d910d3c00b897ec84a4f3dcd41393d53e2cc6513590c5fd2b86ca0626d
7
+ data.tar.gz: b2c6504b065f66a2ad2d1b935633ab1ba0bf22682448b535508399fef65b25d5e1854a089078410047c2284951973da18474cd87b39bd9dea62ea4bb57a3b8df
data/.gitignore ADDED
@@ -0,0 +1 @@
1
+ .bundle/
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2014 Kit Plummer
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,26 @@
1
+ # lita-cron
2
+
3
+ A Lita handler for a cron-based message scheduler. Allows you to
4
+ create, list and delete scheduled messages - using standard
5
+ cron-line notation. Uses lita's redis backing to persist scheduled
6
+ deliveries through a lita restart (just recreates jobs from db.)
7
+
8
+ ## Installation
9
+
10
+ Add lita-answers to your Lita instance's Gemfile:
11
+
12
+ ``` ruby
13
+ gem "lita-cron"
14
+ ```
15
+
16
+ ## Usage
17
+
18
+ *CREATE* `@bot cron new 15 15 * * 1-5 @all Submit your timecard`
19
+
20
+ *LIST* `@bot cron list`
21
+
22
+ *DELETE* `@bot cron delete @all Submit your timecard`
23
+
24
+ ## License
25
+
26
+ [MIT](http://opensource.org/licenses/MIT)
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,117 @@
1
+ require "lita"
2
+ require "rufus-scheduler"
3
+ require 'json'
4
+
5
+ module Lita
6
+ module Handlers
7
+
8
+ @@scheduler = Rufus::Scheduler.start_new
9
+
10
+ def self.get_scheduler
11
+ @@scheduler
12
+ end
13
+
14
+ class Cron < Handler
15
+ REDIS_KEY = "cron"
16
+
17
+ # Need to initialize previous jobs for redis when starting
18
+
19
+ def initialize(robot)
20
+ super
21
+ end
22
+
23
+ def self.default_config(config)
24
+ end
25
+
26
+ on :loaded, :load_on_start
27
+
28
+ route(/^cron\s+new\s(.+)/i, :new, command: true, help: {
29
+ "cron new CRON_EXPRESSION MESSAGE" => "New cron job."
30
+ })
31
+
32
+ route(/^cron\s+delete\s(.+)/i, :delete, command: true, help: {
33
+ "cron delete MESSAGE" => "Delete cron job."
34
+ })
35
+
36
+ route(/^cron\s+list/i, :list, command: true, help: {
37
+ "cron list" => "List all cron jobs."
38
+ })
39
+
40
+
41
+ def load_on_start(payload)
42
+ log.info "Initializing existing cron jobs."
43
+ jobs = redis.hgetall(REDIS_KEY)
44
+ jobs.each do |k,v|
45
+ j = JSON.parse(v)
46
+ create_job(j['cron_line'], k)
47
+ log.info "Created cron job: #{j['cron_line']} #{k}."
48
+ end
49
+ end
50
+
51
+ def create_job(cron, message)
52
+ job = Lita::Handlers.get_scheduler.cron cron do |job|
53
+ response.reply(message)
54
+ end
55
+
56
+ redis.hset(REDIS_KEY, message, { :cron_line => job.cron_line.original, :j_id => job.job_id }.to_json)
57
+ jobs = Lita::Handlers.get_scheduler.cron_jobs
58
+ return "New cron job: #{cron} #{message}"
59
+ end
60
+
61
+ def new(response)
62
+ log.info "NEW: #{response.matches}"
63
+ input = response.matches[0][0].split(" ")
64
+ cron = input[0..4].join(" ")
65
+ message = input[5..input.count()-1].join(" ")
66
+
67
+ if(redis.hkeys(REDIS_KEY).include?(message))
68
+ response.reply "#{message} already exists, delete first."
69
+ else
70
+ begin
71
+ response.reply(create_job(cron, message))
72
+ rescue ArgumentError => e
73
+ response.reply "argument error, perhaps the cronline? #{e.message}"
74
+ end
75
+ end
76
+ end
77
+
78
+ def delete(response)
79
+ if redis.hexists(REDIS_KEY, response.matches[0][0])
80
+ job = JSON.parse(redis.hget(REDIS_KEY, response.matches[0][0]))
81
+
82
+ Lita::Handlers.get_scheduler.unschedule(job["j_id"])
83
+ redis.hdel(REDIS_KEY, response.matches[0][0]) >= 1
84
+ response.reply("Deleted #{response.matches[0][0]}.")
85
+ else
86
+ response.reply("#{response.matches[0][0]} isn't an existing cron job.")
87
+ end
88
+ end
89
+
90
+ def list(response)
91
+ keys = redis.hgetall(REDIS_KEY)
92
+ jobs = Lita::Handlers.get_scheduler.cron_jobs
93
+ if jobs.empty?
94
+ response.reply("No cron jobs currently running.")
95
+ else
96
+ keys.each do |k, v|
97
+ j = JSON.parse v
98
+ cron_line = [j['cron_line']]
99
+
100
+ response.reply("#{k}=>#{cron_line}")
101
+ end
102
+ end
103
+ end
104
+
105
+ private
106
+
107
+ def config
108
+ # None yet
109
+ Lita.config.handlers.cron
110
+ end
111
+
112
+ end
113
+
114
+ Lita.register_handler(Cron)
115
+
116
+ end
117
+ end
data/lib/lita-cron.rb ADDED
@@ -0,0 +1 @@
1
+ require "lita/handlers/cron"
data/lita-cron.gemspec ADDED
@@ -0,0 +1,25 @@
1
+ Gem::Specification.new do |spec|
2
+ spec.name = "lita-cron"
3
+ spec.version = "0.0.1"
4
+ spec.authors = ["Kit Plummer"]
5
+ spec.email = ["kitplummer@gmail.com"]
6
+ spec.description = %q{A Lita handler for creating cron-spec'd replies.}
7
+ spec.summary = %q{A Lita handler for creating cron-spec'd replies.}
8
+ spec.homepage = "http://kitplummer.github.com/"
9
+ spec.license = "MIT"
10
+ spec.metadata = { "lita_plugin_type" => "handler" }
11
+
12
+ spec.files = `git ls-files`.split($/)
13
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
14
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
15
+ spec.require_paths = ["lib"]
16
+
17
+ spec.add_runtime_dependency "lita", ">= 2.7"
18
+ spec.add_runtime_dependency "rufus-scheduler", "2.0.24"
19
+
20
+ spec.add_development_dependency "bundler", "~> 1.3"
21
+ spec.add_development_dependency "rake"
22
+ spec.add_development_dependency "rspec", ">= 3.0.0.beta2"
23
+ spec.add_development_dependency "simplecov"
24
+ spec.add_development_dependency "coveralls"
25
+ end
@@ -0,0 +1,46 @@
1
+ require "spec_helper"
2
+
3
+ describe Lita::Handlers::Cron, lita_handler: true do
4
+ it { routes_command("cron list").to(:list) }
5
+ it { routes_command("cron new 15 15 * * * rspec_test_job").to(:new) }
6
+ it { routes_command("cron delete rspec_test_job").to(:delete) }
7
+
8
+ describe "#cron list" do
9
+ it "replies to the 'cron list' command" do
10
+ send_command("cron list")
11
+ expect(replies.last).to eq("No cron jobs currently running.")
12
+ end
13
+
14
+ it "replies to the 'cron list' command with results" do
15
+ send_command("cron new 15 15 * * * rspec_test_job")
16
+
17
+ send_command("cron list")
18
+ expect(replies.last).to eq("rspec_test_job=>[\"15 15 * * *\"]")
19
+ end
20
+
21
+ end
22
+
23
+ describe "#cron delete doesnotexist" do
24
+ it "handles non-existant cron job, replying with status" do
25
+ send_command("cron delete doesnotexist")
26
+ expect(replies.last).to eq ("doesnotexist isn't an existing cron job.")
27
+ end
28
+ end
29
+
30
+ describe "#cron new 15 15 * * * rspec_test_job" do
31
+ before { subject.redis.flushdb }
32
+ it "creates a new cron job, replying with status" do
33
+ send_command("cron new 15 15 * * * rspec_test_job")
34
+ expect(replies.first).to eq("New cron job: 15 15 * * * rspec_test_job")
35
+ end
36
+ end
37
+
38
+ describe "#cron delete rspec_test_job" do
39
+ it "deletes a cron job, replying with status" do
40
+ send_command("cron new 15 15 * * * rspec_test_job")
41
+ send_command("cron delete rspec_test_job")
42
+ expect(replies).to include("Deleted rspec_test_job.")
43
+ end
44
+ end
45
+
46
+ end
@@ -0,0 +1,2 @@
1
+ require "lita/rspec"
2
+ require "lita-cron"
metadata ADDED
@@ -0,0 +1,155 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lita-cron
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Kit Plummer
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-05-23 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: lita
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '2.7'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '2.7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rufus-scheduler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '='
32
+ - !ruby/object:Gem::Version
33
+ version: 2.0.24
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '='
39
+ - !ruby/object:Gem::Version
40
+ version: 2.0.24
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.3'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: 3.0.0.beta2
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: 3.0.0.beta2
83
+ - !ruby/object:Gem::Dependency
84
+ name: simplecov
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: coveralls
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ description: A Lita handler for creating cron-spec'd replies.
112
+ email:
113
+ - kitplummer@gmail.com
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - ".gitignore"
119
+ - Gemfile
120
+ - LICENSE
121
+ - README.md
122
+ - Rakefile
123
+ - lib/lita-cron.rb
124
+ - lib/lita/handlers/cron.rb
125
+ - lita-cron.gemspec
126
+ - spec/lita/handlers/cron_spec.rb
127
+ - spec/spec_helper.rb
128
+ homepage: http://kitplummer.github.com/
129
+ licenses:
130
+ - MIT
131
+ metadata:
132
+ lita_plugin_type: handler
133
+ post_install_message:
134
+ rdoc_options: []
135
+ require_paths:
136
+ - lib
137
+ required_ruby_version: !ruby/object:Gem::Requirement
138
+ requirements:
139
+ - - ">="
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
142
+ required_rubygems_version: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - ">="
145
+ - !ruby/object:Gem::Version
146
+ version: '0'
147
+ requirements: []
148
+ rubyforge_project:
149
+ rubygems_version: 2.2.2
150
+ signing_key:
151
+ specification_version: 4
152
+ summary: A Lita handler for creating cron-spec'd replies.
153
+ test_files:
154
+ - spec/lita/handlers/cron_spec.rb
155
+ - spec/spec_helper.rb