waylon 0.2.0 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
data/exe/waylon CHANGED
@@ -7,7 +7,290 @@ logger = Logger.new($stdout)
7
7
  logger.level = Logger::INFO
8
8
  action = ARGV[0]
9
9
 
10
+ def validate_project_name(name)
11
+ name.downcase =~ /^[a-z][a-z0-9_-]+$/
12
+ end
13
+
14
+ def rubocop_template
15
+ <<~TEMPLATE
16
+ AllCops:
17
+ TargetRubyVersion: 3.1
18
+ NewCops: enable
19
+
20
+ Style/StringLiterals:
21
+ Enabled: true
22
+ EnforcedStyle: double_quotes
23
+
24
+ Style/StringLiteralsInInterpolation:
25
+ Enabled: true
26
+ EnforcedStyle: double_quotes
27
+
28
+ Layout/LineLength:
29
+ Max: 120
30
+ TEMPLATE
31
+ end
32
+
33
+ def ruby_version_template
34
+ "3.1.2\n"
35
+ end
36
+
37
+ def dockerfile_template
38
+ <<~TEMPLATE
39
+ FROM ruby:3.1
40
+
41
+ RUN mkdir -p /app
42
+
43
+ COPY config.ru /app/
44
+ COPY Gemfile.lock /app/
45
+ COPY plugins.rb /app/
46
+
47
+ RUN apt update && apt upgrade -y && apt install -y curl libsodium-dev
48
+ RUN useradd waylon -d /app -M -c "Waylon Bot User"
49
+
50
+ USER waylon
51
+ WORKDIR /app
52
+ RUN gem install waylon
53
+
54
+ ENTRYPOINT ["waylon"]
55
+ TEMPLATE
56
+ end
57
+
58
+ def bot_gemfile_template
59
+ <<~TEMPLATE
60
+ # frozen_string_literal: true
61
+
62
+ source "https://rubygems.org"
63
+
64
+ require_relative "plugins"
65
+ gem "waylon"
66
+
67
+ Plugins.plugins.each_key do |gem_name|
68
+ gem gem_name
69
+ end
70
+ TEMPLATE
71
+ end
72
+
73
+ def bot_rakefile_template
74
+ <<~TEMPLATE
75
+ # frozen_string_literal: true
76
+
77
+ require "resque/tasks"
78
+ require "waylon"
79
+
80
+ task "resque:setup" do
81
+ require_relative "plugins"
82
+
83
+ Waylon::Config.instance.load_env
84
+
85
+ Plugins.plugins.each_value do |plugin|
86
+ require plugin
87
+ end
88
+ Resque.redis = ENV.fetch("REDIS", "localhost:6379")
89
+ Resque.logger = Waylon::Logger.logger
90
+ end
91
+ TEMPLATE
92
+ end
93
+
94
+ def skill_rakefile_template
95
+ <<~TEMPLATE
96
+ # frozen_string_literal: true
97
+
98
+ require "bundler/gem_tasks"
99
+ require "rspec/core/rake_task"
100
+ require "rubocop/rake_task"
101
+ require "redis/errors"
102
+ require "resque/tasks"
103
+ require "yard"
104
+ require "waylon/core"
105
+
106
+ RSpec::Core::RakeTask.new(:spec)
107
+ RuboCop::RakeTask.new
108
+ YARD::Rake::YardocTask.new do |y|
109
+ y.options = [
110
+ "--markup", "markdown"
111
+ ]
112
+ end
113
+
114
+ task default: %i[spec rubocop yard]
115
+
116
+ task :demo do
117
+ require_relative "lib/waylon/skills/#{@project_name}"
118
+ Waylon::Logger.logger = ::Logger.new("/dev/null")
119
+ Waylon::Cache.storage = Moneta.new(:Cookie)
120
+ Waylon::Storage.storage = Moneta.new(:Cookie)
121
+ require "waylon/rspec/test_server"
122
+ end
123
+ TEMPLATE
124
+ end
125
+
126
+ def skill_skeleton_template
127
+ <<~TEMPLATE
128
+ # frozen_string_literal: true
129
+
130
+ module Waylon
131
+ module Skills
132
+ # A Waylon Skill
133
+ class #{@project_name.capitalize} < Waylon::Skill
134
+ route(
135
+ /#{@project_name}/i,
136
+ :do_the_thing,
137
+ help: {
138
+ usage: "FILL IN HOW TO USE THIS",
139
+ description: "EXPLAIN WHAT THIS DOES"
140
+ },
141
+ mention_only: true # this means your message must mention Waylon
142
+ )
143
+
144
+ def do_the_thing
145
+ # TODO: Fill this in...
146
+
147
+ # Some example capabilities:
148
+ #
149
+ # react :wave
150
+ #
151
+ # That will react to a chat message, assuming the Sense supports reactions
152
+
153
+ # If you need access to the message, use this:
154
+ #
155
+ # tokens
156
+ #
157
+ # It provides an Array, with `tokens[0]` being the entire message
158
+
159
+ # To send a message back, use:
160
+ #
161
+ # reply "some message"
162
+ #
163
+ # You could also reply in a thread:
164
+ #
165
+ # threaded_reply "this is a response in a thread!"
166
+ end
167
+ end
168
+ end
169
+ end
170
+ TEMPLATE
171
+ end
172
+
173
+ def config_ru_template
174
+ <<~TEMPLATE
175
+ # frozen_string_literal: true
176
+
177
+ require_relative "plugins"
178
+
179
+ require "waylon"
180
+ require "waylon/services/ping"
181
+
182
+ Plugins.plugins.each_value do |plugin|
183
+ require plugin
184
+ end
185
+
186
+ use Rack::ShowExceptions
187
+
188
+ Waylon::Config.instance.load_env
189
+
190
+ services = {
191
+ "/ping" => Waylon::Services::Ping.new
192
+ }
193
+ run Rack::URLMap.new(
194
+ services.merge(Waylon::WebhookRegistry.instance.to_hash)
195
+ )
196
+ TEMPLATE
197
+ end
198
+
199
+ def plugins_rb_template
200
+ <<~TEMPLATE
201
+ # frozen_string_literal: true
202
+
203
+ # Used to help package up the plugins you'd like to load for Waylon
204
+ module Plugins
205
+ # Should return a Hash like:
206
+ # { "waylon-plugin-gem" => "waylon/plugin/gem" }
207
+ #
208
+ # Where "waylon-plugin-gem" is the name of the gem to install and
209
+ # "waylon/plugin/gem" is what you `require` to use it
210
+
211
+ def self.plugins
212
+ {
213
+ # Choose a Sense plugin to send messages to your bot
214
+ # Read more about this plugin here: https://github.com/jgnagy/waylon-slack
215
+ "waylon-slack" => "waylon/slack",
216
+
217
+ # Add some Skill plugins to let your bot do things
218
+ # Read more about this plugin here: https://github.com/jgnagy/waylon-dice
219
+ "waylon-dice" => "waylon/dice"
220
+ }
221
+ end
222
+ end
223
+ TEMPLATE
224
+ end
225
+
226
+ def bot_template_mapping
227
+ {
228
+ config_ru_template: "config.ru",
229
+ dockerfile_template: "Dockerfile",
230
+ gemfile_template: "Gemfile",
231
+ plugins_rb_template: "plugins.rb",
232
+ bot_rakefile_template: "Rakefile",
233
+ rubocop_template: ".rubocop.yml",
234
+ ruby_version_template: ".ruby-version"
235
+ }
236
+ end
237
+
238
+ def skill_template_mapping(project_name)
239
+ {
240
+ skill_rakefile_template: "Rakefile",
241
+ rubocop_template: ".rubocop.yml",
242
+ ruby_version_template: ".ruby-version",
243
+ skill_skeleton_template: "lib/waylon/skills/#{project_name}.rb"
244
+ }
245
+ end
246
+
10
247
  case action
248
+ when "init"
249
+ project_name = ARGV[1]
250
+ unless project_name
251
+ logger.fatal "Missing Project Name for new bot!"
252
+ exit 1
253
+ end
254
+
255
+ unless validate_project_name(project_name)
256
+ logger.fatal "Invalid Project Name: #{project_name}"
257
+ exit 2
258
+ end
259
+
260
+ logger.info "Initializing new Waylon bot project '#{project_name}'..."
261
+ system("git init #{project_name}")
262
+ Dir.chdir(project_name) do
263
+ bot_template_mapping.each do |func, file|
264
+ logger.info "Rendering #{File.expand_path(File.join(project_name, file))}"
265
+ File.write(file, send(func))
266
+ end
267
+ end
268
+ logger.info "Done!"
269
+ when "skill"
270
+ project_name = ARGV[1]
271
+ unless project_name
272
+ logger.fatal "Missing Project Name for new Skill plugin!"
273
+ exit 1
274
+ end
275
+
276
+ unless validate_project_name(project_name)
277
+ logger.fatal "Invalid Skill Name: #{project_name}"
278
+ exit 2
279
+ end
280
+
281
+ gem_name = project_name.start_with?("waylon-") ? project_name : "waylon-#{project_name}"
282
+ @project_name = project_name # for rendering templates
283
+
284
+ logger.info "Initializing new Waylon Skill plugin '#{gem_name}'..."
285
+ system("bundle gem --test=rspec --no-exe #{gem_name}")
286
+ Dir.chdir(gem_name) do
287
+ FileUtils.mkdir_p("lib/waylon/skills")
288
+ skill_template_mapping(project_name).each do |func, file|
289
+ logger.info "Rendering #{File.expand_path(File.join(gem_name, file))}"
290
+ File.write(file, send(func))
291
+ end
292
+ end
293
+ logger.info "Done!"
11
294
  when "worker"
12
295
  logger.info "Starting Worker..."
13
296
  ENV["INTERVAL"] ||= "0.5"
data/scripts/test.sh CHANGED
@@ -1,5 +1,7 @@
1
1
  #!/bin/sh
2
2
 
3
+ apt-get update && apt-get install -y libsodium-dev
4
+
3
5
  gem install bundler -v '~> 2.3'
4
6
  bundle install
5
7
  bundle exec rake
data/waylon.gemspec CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Waylon
4
4
  # Update this to match the desired Waylon::Core::VERSION to release
5
- VERSION = "0.2.0"
5
+ VERSION = "0.2.2"
6
6
  end
7
7
 
8
8
  Gem::Specification.new do |spec|
@@ -39,5 +39,6 @@ Gem::Specification.new do |spec|
39
39
  spec.add_development_dependency "rubocop-rake", "~> 0.6"
40
40
  spec.add_development_dependency "rubocop-rspec", "~> 2.6"
41
41
  spec.add_development_dependency "simplecov", "~> 0.21"
42
+ spec.add_development_dependency "solargraph", "~> 0.45"
42
43
  spec.add_development_dependency "yard", "~> 0.9", ">= 0.9.27"
43
44
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: waylon
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonathan Gnagy
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-06-19 00:00:00.000000000 Z
11
+ date: 2022-08-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -122,6 +122,20 @@ dependencies:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0.21'
125
+ - !ruby/object:Gem::Dependency
126
+ name: solargraph
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '0.45'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '0.45'
125
139
  - !ruby/object:Gem::Dependency
126
140
  name: yard
127
141
  requirement: !ruby/object:Gem::Requirement
@@ -162,6 +176,24 @@ files:
162
176
  - README.md
163
177
  - Rakefile
164
178
  - bin/setup
179
+ - examples/deploying/helm/waylon/.helmignore
180
+ - examples/deploying/helm/waylon/Chart.yaml
181
+ - examples/deploying/helm/waylon/README.md
182
+ - examples/deploying/helm/waylon/templates/_helpers.tpl
183
+ - examples/deploying/helm/waylon/templates/redis-pv.yaml
184
+ - examples/deploying/helm/waylon/templates/redis-pvc.yaml
185
+ - examples/deploying/helm/waylon/templates/redis-statefulset.yaml
186
+ - examples/deploying/helm/waylon/templates/web-deployment.yaml
187
+ - examples/deploying/helm/waylon/templates/web-ingress.yaml
188
+ - examples/deploying/helm/waylon/templates/web-service.yaml
189
+ - examples/deploying/helm/waylon/templates/worker-deployment.yaml
190
+ - examples/deploying/helm/waylon/values.yaml
191
+ - examples/deploying/k8s/README.md
192
+ - examples/deploying/k8s/redis-statefulset.yaml
193
+ - examples/deploying/k8s/web-deployment.yaml
194
+ - examples/deploying/k8s/web-ingress.yaml
195
+ - examples/deploying/k8s/web-service.yaml
196
+ - examples/deploying/k8s/worker-deployment.yaml
165
197
  - exe/waylon
166
198
  - lib/waylon.rb
167
199
  - scripts/release.sh