Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

wip: add steep and RBS #81

Draft
wants to merge 1 commit into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 0 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,6 @@ jobs:
strategy:
matrix:
ruby-version:
- '2.5'
- '2.6'
- '2.7'
- '3.0'
steps:
- uses: actions/checkout@v2
Expand Down
2 changes: 1 addition & 1 deletion .rubocop.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ require:
- rubocop-rspec

AllCops:
TargetRubyVersion: '2.5'
TargetRubyVersion: '3.0'
NewCops: enable

Layout/EmptyLineAfterGuardClause:
Expand Down
14 changes: 13 additions & 1 deletion Rakefile
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,19 @@ task :hadolint do
sh 'docker run --rm -i hadolint/hadolint:v1.18.0 hadolint --ignore DL3018 - < docker/Dockerfile'
end

task default: [:rubocop, :spec, 'bundle:audit', :solargraph]
desc 'Run experimental steep type checker'
task :steep do
sh 'steep check'
end

namespace :steep do
desc 'Output coverage stats from steep'
task :stats do
sh 'steep stats --log-level=fatal | awk -F\',\' \'{ printf "%-50s %-9s %-12s %-14s %-10s\n", $2, $3, $4, $5, $7 }\''
end
end

task default: [:rubocop, :spec, 'bundle:audit', :solargraph, :steep]

desc 'Run all tasks desired for CI'
task ci: ['solargraph:init', :default, :hadolint]
11 changes: 11 additions & 0 deletions Steepfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# frozen_string_literal: true

target :lib do
signature 'sig'

check 'lib'
ignore 'lib/dyndnsd/updater/zone_transfer_server.rb'

library 'date'
library 'forwardable'
end
5 changes: 3 additions & 2 deletions dyndnsd.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ Gem::Specification.new do |s|
s.executables = ['dyndnsd']
s.extra_rdoc_files = Dir['README.md', 'CHANGELOG.md', 'LICENSE']

s.required_ruby_version = '>= 2.5'
s.required_ruby_version = '>= 3.0'

s.add_runtime_dependency 'async-dns', '~> 1.2.0'
s.add_runtime_dependency 'jaeger-client', '~> 1.1.0'
Expand All @@ -40,8 +40,9 @@ Gem::Specification.new do |s|
s.add_development_dependency 'rack-test'
s.add_development_dependency 'rake'
s.add_development_dependency 'rspec'
s.add_development_dependency 'rubocop', '~> 1.8.1'
s.add_development_dependency 'rubocop', '~> 1.7.0'
s.add_development_dependency 'rubocop-rake', '~> 0.5.1'
s.add_development_dependency 'rubocop-rspec', '~> 2.1.0'
s.add_development_dependency 'solargraph', '~> 0.40.0'
s.add_development_dependency 'steep', '~> 0.39.0'
end
2 changes: 1 addition & 1 deletion lib/dyndnsd.rb
Original file line number Diff line number Diff line change
Expand Up @@ -276,7 +276,7 @@ def handle_dyndns_request(env)
reporter = Metriks::Reporter::Graphite.new(host, port, options)
reporter.start
elsif config['textfile']
file = config['textfile']['file'] || '/tmp/dyndnsd-metrics.prom'
file = (config['textfile']['file'] || '/tmp/dyndnsd-metrics.prom').to_s
options = {}
options[:prefix] = config['textfile']['prefix'] if config['textfile']['prefix']
reporter = Dyndnsd::TextfileReporter.new(file, options)
Expand Down
2 changes: 2 additions & 0 deletions lib/dyndnsd/responder/dyndns_style.rb
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ def decorate_dyndnsd_response(status_code, headers, body)
when 422
error_response_map[headers['X-DynDNS-Response']]
end
# TODO: possible nil response!
end

# @param status_code [Integer]
Expand All @@ -46,6 +47,7 @@ def decorate_other_response(status_code, headers, _body)
when 401
[status_code, headers, ['badauth']]
end
# TODO: possible nil response!
end

# @param changes [Array<Symbol>]
Expand Down
2 changes: 2 additions & 0 deletions lib/dyndnsd/responder/rest_style.rb
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ def decorate_dyndnsd_response(status_code, headers, body)
when 422
error_response_map[headers['X-DynDNS-Response']]
end
# TODO: possible nil response!
end

# @param status_code [Integer]
Expand All @@ -46,6 +47,7 @@ def decorate_other_response(status_code, headers, _body)
when 401
[status_code, headers, ['Unauthorized']]
end
# TODO: possible nil response!
end

# @param changes [Array<Symbol>]
Expand Down
2 changes: 1 addition & 1 deletion lib/dyndnsd/textfile_reporter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ def write
end
end

# @param file [String]
# @param file [File]
# @param base_name [String]
# @param metric [Object]
# @param keys [Array<Symbol>]
Expand Down
69 changes: 69 additions & 0 deletions sig/dyndnsd.rbs
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
module Dyndnsd
type config = Hash[String, untyped]
type env = Hash[String, String]
type headers = Hash[String, String]
type response = Array[int | Hash[string, string] | Array[string]]

interface _App
def call: (env env) -> response
end


# @return [Logger]
def self.logger: () -> untyped

# @param logger [Logger]
# @return [Logger]
def self.logger=: (untyped logger) -> untyped

class LogFormatter
# @param lvl [Object]
# @param _time [DateTime]
# @param _progname [String]
# @param msg [Object]
# @return [String]
def call: (untyped lvl, DateTime _time, String _progname, untyped msg) -> String
end

class Daemon
# @param config [Hash{String => Object}]
# @param db [Dyndnsd::Database]
# @param updater [#update]
def initialize: (untyped config, untyped db, untyped updater) -> void

# @param username [String]
# @param password [String]
# @return [Boolean]
def authorized?: (String username, String password) -> bool

def call: (env env) -> response

def self.run!: () -> void

private

# @param params [Hash{String => String}]
# @return [Array<String>]
def extract_v4_and_v6_address: (untyped params) -> (::Array[untyped] | untyped)

# @param env [Hash{String => String}]
# @param params [Hash{String => String}]
# @return [Array<String>]
def extract_myips: (untyped env, untyped params) -> (untyped | ::Array[untyped])

# @param hostnames [String]
# @param myips [Array<String>]
# @return [Array<Symbol>]
def process_changes: (untyped hostnames, untyped myips) -> untyped

def update_db: () -> void

def handle_dyndns_request: (env env) -> response

def self.setup_logger: (config config) -> void
def self.setup_traps: () -> void
def self.setup_monitoring: (config config) -> void
def self.setup_tracing: (config config) -> void
def self.setup_rack: (config config) -> void
end
end
21 changes: 21 additions & 0 deletions sig/dyndnsd/database.rbs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
module Dyndnsd
class Database
extend Forwardable

def initialize: (string db_file) -> void

def load: () -> void

def save: () -> void

def changed?: () -> bool

def []: (string key) -> untyped

def []=: (string key, untyped value) -> void

def each: () { (string key, untyped value) -> void } -> void

def has_key?: (string key) -> bool
end
end
9 changes: 9 additions & 0 deletions sig/dyndnsd/generator/bind.rbs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
module Dyndnsd
module Generator
class Bind
def initialize: (String domain, Hash[String, untyped] updater_params) -> void

def generate: (Dyndnsd::Database db) -> string
end
end
end
32 changes: 32 additions & 0 deletions sig/dyndnsd/helper.rbs
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
module Dyndnsd
type users = Hash[String, Hash[String, String]]
type hosts = Hash[String, Array[String]]

class Helper
# @param hostname [String]
# @param domain [String]
# @return [Boolean]
def self.fqdn_valid?: (String hostname, String domain) -> bool

# @param ip [String]
# @return [Boolean]
def self.ip_valid?: (String ip) -> bool

# @param username [String]
# @param password [String]
# @param users [Hash]
# @return [Boolean]
def self.user_allowed?: (String username, String password, users users) -> bool

# @param hostname [String]
# @param myips [Array]
# @param hosts [Hash]
# @return [Boolean]
def self.changed?: (String hostname, Array[String] myips, hosts hosts) -> bool

# @param operation [String]
# @param block [Proc]
# @return [void]
def self.span: (String operation) { (untyped) -> untyped } -> untyped
end
end
19 changes: 19 additions & 0 deletions sig/dyndnsd/responder/dyndns_style.rbs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
module Dyndnsd
module Responder
class DynDNSStyle
def initialize: (_App app) -> void

def call: (env env) -> response?

private

def decorate_dyndnsd_response: (int status_code, headers headers, Array[untyped] body) -> response?

def decorate_other_response: (int status_code, headers headers, Array[untyped] _body) -> response?

def get_success_body: (Array[Symbol] changes, Array[string] myips) -> string

def error_response_map: () -> Hash[string, response]
end
end
end
19 changes: 19 additions & 0 deletions sig/dyndnsd/responder/rest_style.rbs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
module Dyndnsd
module Responder
class RestStyle
def initialize: (_App app) -> void

def call: (env env) -> response?

private

def decorate_dyndnsd_response: (int status_code, headers headers, Array[untyped] body) -> response?

def decorate_other_response: (int status_code, headers headers, Array[untyped] _body) -> response?

def get_success_body: (Array[Symbol] changes, Array[string] myips) -> string

def error_response_map: () -> Hash[string, response]
end
end
end
17 changes: 17 additions & 0 deletions sig/dyndnsd/textfile_reporter.rbs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
module Dyndnsd
class TextfileReporter
attr_reader file: String

def initialize: (String file, ?Hash[Symbol, untyped] options) -> void

def start: () -> void

def stop: () -> void

def restart: () -> void

def write: () -> void

def write_metric: (File file, String base_name, untyped metric, Array[Symbol] keys, Array[Symbol] snapshot_keys) -> void
end
end
9 changes: 9 additions & 0 deletions sig/dyndnsd/updater/command_with_bind_zone.rbs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
module Dyndnsd
module Updater
class CommandWithBindZone
def initialize: (String domain, Hash[String, untyped] updater_params) -> void

def update: (Dyndnsd::Database db) -> void
end
end
end
39 changes: 39 additions & 0 deletions sig/dyndnsd/updater/zone_transfer_server.rbs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
module Dyndnsd
module Updater
class ZoneTransferServer
DEFAULT_SERVER_LISTENS: Array[String]

def initialize: (String domain, Hash[String, untyped] updater_params) -> void

def update: (Dyndnsd::Database db) -> void

# converts into suitable parameter form for Async::DNS::Resolver or Async::DNS::Server
#
# @param endpoint_list [Array<String>]
# @return [Array{Array{Object}}]
def self.parse_endpoints: (Array[String] endpoint_list) -> Array[Array[untyped]]

private

# creates correct Resolv::DNS::Resource object for IP address type
#
# @param ip_string [String]
# @return [Resolv::DNS::Resource::IN::A,Resolv::DNS::Resource::IN::AAAA]
def create_addr_rr_for_ip: (String ip_string) -> untyped

def send_dns_notify: () -> void
end

class ZoneTransferServerHelper #< Async::DNS::Server
attr_accessor axfr_rrs: untyped

def initialize: (untyped endpoints, String domain) -> void

# @param name [String]
# @param resource_class [Resolv::DNS::Resource]
# Since solargraph cannot parse this: param transaction [Async::DNS::Transaction]
# @return [void]
def process: (String name, untyped resource_class, untyped transaction) -> void
end
end
end
3 changes: 3 additions & 0 deletions sig/dyndnsd/version.rbs
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module Dyndnsd
VERSION: ::String
end