Commit d1ba155
Changed files (26)
bin
exe
lib
spec
bin/console
@@ -1,4 +1,5 @@
#!/usr/bin/env ruby
+# frozen_string_literal: true
require 'bundler/setup'
require 'del'
exe/del
@@ -1,4 +1,5 @@
#!/usr/bin/env ruby
+# frozen_string_literal: true
require 'del/cli'
lib/del/examples/routes.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
Del.configure do |x|
puts 'Registering custom routes.'
lib/del/cli.rb
@@ -1,21 +1,23 @@
-require "del"
-require "pathname"
-require "thor"
+# frozen_string_literal: true
+
+require 'del'
+require 'pathname'
+require 'thor'
module Del
class CLI < Thor
- DEFAULT_RC=Pathname.new(Dir.home).join(".delrc")
- class_option :configuration_file, default: ENV.fetch("DELRC", DEFAULT_RC)
+ DEFAULT_RC = Pathname.new(Dir.home).join('.delrc')
+ class_option :configuration_file, default: ENV.fetch('DELRC', DEFAULT_RC)
class_option :socket_file, default: Del::Configuration::SOCKET_FILE
- class_option :log_level, default: ENV.fetch("LOG_LEVEL", Logger::INFO).to_i
+ class_option :log_level, default: ENV.fetch('LOG_LEVEL', Logger::INFO).to_i
- desc "server <routes.rb>", "start server"
+ desc 'server <routes.rb>', 'start server'
def server(startup_file = nil)
- settings = YAML.load(IO.read(options[:configuration_file]))
- settings.merge!(log_level: options[:log_level])
- settings.merge!(socket_file: options[:socket_file])
- settings.merge!(start_server: true)
- settings.merge!(startup_file: startup_file)
+ settings = YAML.safe_load(IO.read(options[:configuration_file]))
+ settings[:log_level] = options[:log_level]
+ settings[:socket_file] = options[:socket_file]
+ settings[:start_server] = true
+ settings[:startup_file] = startup_file
Del.start(settings)
rescue Errno::ENOENT => error
@@ -23,53 +25,55 @@ module Del
say "run 'del setup'", :yellow
end
- desc "console <config.rb>", "start read-eval-print-loop"
+ desc 'console <config.rb>', 'start read-eval-print-loop'
def console(startup_file = nil)
- require "irb"
+ require 'irb'
- settings = YAML.load(IO.read(options[:configuration_file]))
- settings.merge!(log_level: options[:log_level])
- settings.merge!(socket_file: options[:socket_file])
- settings.merge!(start_server: false)
- settings.merge!(startup_file: startup_file)
+ settings = YAML.safe_load(IO.read(options[:configuration_file]))
+ settings[:log_level] = options[:log_level]
+ settings[:socket_file] = options[:socket_file]
+ settings[:start_server] = false
+ settings[:startup_file] = startup_file
Del.start(settings)
ARGV.clear
IRB.start
end
- desc "message <jid> <message>", "send a message to the Jabber ID"
+ desc 'message <jid> <message>', 'send a message to the Jabber ID'
def message(jid, message)
socket = UNIXSocket.new(options[:socket_file])
- socket.puts(JSON.generate(command: :send_message, jid: jid, message: message))
+ socket.puts(
+ JSON.generate(command: :send_message, jid: jid, message: message)
+ )
say socket.readline, :green
rescue EOFError => error
say error.message, :red
rescue Errno::ECONNREFUSED => error
say error.message, :red
- say "You must start the del server first.", :yellow
+ say 'You must start the del server first.', :yellow
ensure
socket&.close
end
- desc "setup", "setup your $HOME/.delrc"
+ desc 'setup', 'setup your $HOME/.delrc'
def setup
settings = {
host: ask("Where is your xmpp server? (E.g. 'chat.hipchat.com')"),
- jid: ask("What is your jabber Id?"),
+ jid: ask('What is your jabber Id?'),
muc_domain: ask("What is your MUC domain? (E.g. 'conf.hipchat.com')"),
- full_name: ask("What is your name?"),
- password: ask("What is your password?", echo: false),
+ full_name: ask('What is your name?'),
+ password: ask('What is your password?', echo: false),
}
- say ""
- say "Writing your configuration to: #{options[:configuration_file]}", :green
yaml = YAML.dump(settings)
IO.write(options[:configuration_file], yaml)
- File.chmod(0600, options[:configuration_file])
+ File.chmod(0o600, options[:configuration_file])
+ say ''
+ say "Configuration saved to: #{options[:configuration_file]}", :green
end
- desc "version", "Print the version of this gem"
+ desc 'version', 'Print the version of this gem'
def version
say Del::VERSION, :green
end
lib/del/configuration.rb
@@ -1,17 +1,19 @@
+# frozen_string_literal: true
+
module Del
+ # This is used to contain all configuration.
class Configuration
- SOCKET_FILE = '/tmp/del.sock'.freeze
+ SOCKET_FILE = '/tmp/del.sock'
attr_accessor :default_rooms
attr_accessor :host
attr_accessor :jid
- attr_accessor :jid
attr_accessor :logger
attr_accessor :muc_domain
attr_accessor :name
attr_accessor :password
attr_accessor :router
- attr_accessor :users
attr_accessor :socket_file
+ attr_accessor :users
def initialize(settings = {})
@default_rooms = settings.fetch(:rooms, [])
lib/del/connection.rb
@@ -1,4 +1,7 @@
+# frozen_string_literal: true
+
module Del
+ # An XMPP Connection
class Connection
attr_reader :configuration
@@ -55,7 +58,7 @@ module Del
def deliver_to_room(jid, message)
muc = @mucs[jid.strip.to_s]
- muc.say(encode_string(message)) if muc
+ muc&.say(encode_string(message))
end
def disconnect
@@ -75,14 +78,15 @@ module Del
@jid ||= jid_for(configuration.jid, 'chat.hipchat.com', 'bot')
end
- # def list_rooms(muc_domain)
- # Jabber::MUC::MUCBrowser.new(client).muc_rooms(muc_domain).map do |jid, name|
- # jid.to_s
- # end
- # end
+ def list_rooms(muc_domain)
+ browser = Jabber::MUC::MUCBrowser.new(client)
+ browser.muc_rooms(muc_domain).map do |jid, _name|
+ jid.to_s
+ end
+ end
- def encode_string(s)
- s.to_s.encode('UTF-8', invalid: :replace, undef: :replace)
+ def encode_string(item)
+ item.to_s.encode('UTF-8', invalid: :replace, undef: :replace)
end
def jid_for(jid, domain, resource)
lib/del/default_router.rb
@@ -1,4 +1,8 @@
+# frozen_string_literal: true
+
module Del
+ # This class is the default router used
+ # to route chat messages to chat routes.
class DefaultRouter
def initialize(routes = [])
@routes = routes
@@ -10,7 +14,7 @@ module Del
def route(message)
@routes.each do |route|
- next unless matches = route[:pattern].match(message.text)
+ next unless (matches = route[:pattern].match(message.text))
begin
route[:command].call(message, matches)
rescue StandardError => error
lib/del/message.rb
@@ -1,6 +1,9 @@
+# frozen_string_literal: true
+
module Del
+ # An XMPP Message
class Message
- PREFIX = '/code'.freeze
+ PREFIX = '/code'
attr_reader :text, :robot, :source
def initialize(text, robot:, source:)
lib/del/repository.rb
@@ -1,4 +1,7 @@
+# frozen_string_literal: true
+
module Del
+ # This class is a facade for backend data storage.
class Repository
def initialize(storage: {}, mapper:)
@storage = storage
lib/del/robot.rb
@@ -1,4 +1,7 @@
+# frozen_string_literal: true
+
module Del
+ # A funky robo-sapien.
class Robot
attr_reader :jid, :name
@@ -18,7 +21,9 @@ module Del
def receive(message, source:)
return if source.from?(self)
- configuration.router.route(Message.new(message, robot: self, source: source))
+ configuration.router.route(
+ Message.new(message, robot: self, source: source)
+ )
end
def send_message(jid, message)
@@ -48,7 +53,8 @@ module Del
end
def socket_server
- @socket_server ||= SocketServer.new(socket_file: configuration.socket_file)
+ @socket_server ||=
+ SocketServer.new(socket_file: configuration.socket_file)
end
def user?(jid)
lib/del/shell_command.rb
@@ -1,4 +1,8 @@
+# frozen_string_literal: true
+
module Del
+ # Executes shell commands and pipes the
+ # results back to the caller.
class ShellCommand
def initialize(command)
@command = Array(command).flatten.join(' ')
lib/del/socket_connection.rb
@@ -1,14 +1,16 @@
+# frozen_string_literal: true
+
module Del
class SocketConnection
def initialize(path:)
- File.unlink(path) if File.exists?(path)
+ File.unlink(path) if File.exist?(path)
@server = UNIXServer.new(path)
end
def on_receive
socket = @server.accept
yield socket
- rescue => error
+ rescue StandardError => error
Del.logger.error(error)
ensure
socket&.close
lib/del/socket_server.rb
@@ -1,4 +1,8 @@
+# frozen_string_literal: true
+
module Del
+ # A Socket server for client/server communication
+ # overs a UNIX socket.
class SocketServer
def initialize(socket_file:)
@connection = SocketConnection.new(path: socket_file)
lib/del/source.rb
@@ -1,4 +1,7 @@
+# frozen_string_literal: true
+
module Del
+ # This represents the source of a chat message.
class Source
attr_reader :user, :room
lib/del/user.rb
@@ -1,4 +1,7 @@
+# frozen_string_literal: true
+
module Del
+ # An XMPP user.
class User
attr_reader :jid, :attributes
lib/del/version.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module Del
- VERSION = '0.1.16'.freeze
+ VERSION = '0.1.16'
end
lib/del.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
require 'json'
require 'logger'
require 'net/hippie'
@@ -22,6 +24,7 @@ require 'del/source'
require 'del/user'
require 'del/version'
+# Del the funky robosapien.
module Del
def self.start(settings)
@configuration = Configuration.new(settings)
spec/default_router_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
RSpec.describe Del::DefaultRouter do
subject { described_class.new }
spec/del_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
RSpec.describe Del do
specify { expect(Del::VERSION).not_to be(nil) }
end
spec/message_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
require 'spec_helper'
RSpec.describe Del::Message do
spec/repository_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
require 'spec_helper'
RSpec.describe Del::Repository do
spec/spec_helper.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
require 'bundler/setup'
require 'del'
spec/user_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
require 'spec_helper'
RSpec.describe Del::User do
.rubocop.yml
@@ -0,0 +1,41 @@
+AllCops:
+ Exclude:
+ - 'coverage/**/*'
+ - 'pkg/**/*'
+ - 'spec/**/*'
+ - 'tmp/**/*'
+ - 'vendor/**/*'
+ TargetRubyVersion: 2.5
+
+Layout/ClassStructure:
+ Enabled: true
+ Categories:
+ module_inclusion:
+ - include
+ - prepend
+ - extend
+ ExpectedOrder:
+ - module_inclusion
+ - constants
+ - public_class_methods
+ - initializer
+ - instance_methods
+ - protected_methods
+ - private_methods
+
+Layout/EndOfLine:
+ EnforcedStyle: lf
+
+Layout/IndentArray:
+ EnforcedStyle: consistent
+
+Layout/IndentHeredoc:
+ EnforcedStyle: active_support
+
+Metrics/BlockLength:
+ Exclude:
+ - '*.gemspec'
+ - 'Rakefile'
+
+Style/Documentation:
+ Enabled: false
del.gemspec
@@ -1,4 +1,6 @@
+# frozen_string_literal: true
+
lib = File.expand_path('lib', __dir__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require 'del/version'
@@ -20,6 +22,7 @@ Gem::Specification.new do |spec|
spec.bindir = 'exe'
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
spec.require_paths = ['lib']
+ spec.required_ruby_version = '>= 2.5.0'
spec.add_dependency 'bundler-audit', '~> 0.6'
spec.add_dependency 'net-hippie', '~> 0.1'
Gemfile
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
source 'https://rubygems.org'
git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }