From e31998ffcccc4a63641bcf34fcce5b53ab93b32f Mon Sep 17 00:00:00 2001 From: eleksir Date: Sat, 19 Feb 2022 16:56:15 +0300 Subject: [PATCH] More critic! Also use Encode instead of utf8::encode --- .perlcriticrc | 36 +++++++++++++++++++++++++++++++++++- bin/aleesa-phrases | 25 +++++++++++++------------ bin/fortune_seed.pl | 2 +- bin/friday_seed.pl | 2 +- bin/proverb_seed.pl | 2 +- cpanfile | 11 +++++++---- lib/Conf.pm | 22 +++++++++++++++------- lib/Fortune.pm | 13 +++++++------ lib/Friday.pm | 11 ++++++----- lib/Karma.pm | 11 +++++------ lib/Phrases.pm | 28 ++++++++++++++-------------- lib/Proverb.pm | 13 +++++++------ 12 files changed, 112 insertions(+), 64 deletions(-) diff --git a/.perlcriticrc b/.perlcriticrc index 42ca195..815b127 100644 --- a/.perlcriticrc +++ b/.perlcriticrc @@ -1,3 +1,15 @@ +#!/usr/bin/env perlcritic +# Задействованные модули критика: +# +# Perl::Critic::More +# Perl::Critic::Pulp +# Perl::Critic::TooMuchCode +# Perl::Critic::Lax +# Perl::Critic::CognitiveComplexity +# Perl::Critic::Policy::CompileTime +# Perl::Critic::Policy::ProhibitImplicitImport +# Perl::Critic::Policy::Dynamic::NoIndirect + [-ControlStructures::ProhibitUnlessBlocks] # oh. c'mon. just a little bit @@ -51,4 +63,26 @@ # just shut the fuck up [-Subroutines::ProhibitSubroutinePrototypes] -# i like it! \ No newline at end of file +# i like it! + +[-TooMuchCode::ProhibitUnnecessaryUTF8Pragma] + +[-CodeLayout::RequireUseUTF8] + +[-Miscellanea::ProhibitUnrestrictedNoCritic] + +[-Editor::RequireEmacsFileVariables] + +[-CodeLayout::RequireASCII] + +[-TooMuchCode::ProhibitDuplicateLiteral] + +[-ErrorHandling::RequireUseOfExceptions] + +[-ValuesAndExpressions::RequireConstantOnLeftSideOfEquality] + +[-Lax::RequireConstantOnLeftSideOfEquality::ExceptEq] + +[-Lax::ProhibitEmptyQuotes::ExceptAsFallback] + +[-ValuesAndExpressions::RestrictLongStrings] diff --git a/bin/aleesa-phrases b/bin/aleesa-phrases index 6dd4aae..27a4d5b 100755 --- a/bin/aleesa-phrases +++ b/bin/aleesa-phrases @@ -1,6 +1,6 @@ #!/usr/bin/perl -use 5.018; +use 5.018; ## no critic (ProhibitImplicitImport) use strict; use warnings; use utf8; @@ -29,9 +29,10 @@ no Cwd; use Cwd::utf8 qw (chdir abs_path); use File::Basename qw (basename dirname); use File::Path qw (make_path); +use File::Spec qw (); use Log::Any qw ($log); -use Log::Any::Adapter; -use Log::Any::For::Std; +use Log::Any::Adapter (); +use Log::Any::For::Std (); use POSIX qw (setgid setuid setsid); use Conf qw (LoadConf); @@ -70,8 +71,8 @@ if ($UID == 0) { make_path ( $piddir, { uid => $uid, - group => $gid - } + group => $gid, + }, ); } @@ -98,7 +99,7 @@ if ($UID == 0) { if (defined $logfile) { Log::Any::Adapter->set ('File', $logfile, log_level => $loglevel); } else { - Log::Any::Adapter->set ('File', '/dev/null'); + Log::Any::Adapter->set ('File', File::Spec->devnull); } # По-умолчанию, демонизируемся, если явно не указано, что этого делать не надо @@ -142,7 +143,7 @@ $PROGRAM_NAME = abs_path $PROGRAM_NAME; ## no critic (Variables::Re # И запустим уже наш сервис RunPhrases (); -if (-f $pidfile) { +if (-e $pidfile) { unlink $pidfile; } @@ -150,11 +151,11 @@ exit 0; sub daemonize { __fork (); - POSIX::setsid (); - open STDIN, '<', '/dev/null'; ## no critic (InputOutput::RequireCheckedSyscalls, InputOutput::RequireCheckedOpen) + setsid (); + open STDIN, '<', File::Spec->devnull; ## no critic (InputOutput::RequireCheckedSyscalls, InputOutput::RequireCheckedOpen) # we handle STDOUT && STDERR via Log::Any::For::Std, so do not close them explicitly - #open STDOUT, '>', '/dev/null'; ## no critic (InputOutput::RequireCheckedSyscalls, InputOutput::RequireCheckedOpen) - #open STDERR, '>', '/dev/null'; ## no critic (InputOutput::RequireCheckedSyscalls, InputOutput::RequireCheckedOpen) + #open STDOUT, '>', File::Spec->devnull; ## no critic (InputOutput::RequireCheckedSyscalls, InputOutput::RequireCheckedOpen) + #open STDERR, '>', File::Spec->devnull; ## no critic (InputOutput::RequireCheckedSyscalls, InputOutput::RequireCheckedOpen) __fork (); umask 0; return; @@ -178,7 +179,7 @@ sub __fork { sub __signal_handler { $log->info ("[INFO] Caught a signal $OS_ERROR"); - if (-f $pidfile) { + if (-e $pidfile) { unlink $pidfile; } diff --git a/bin/fortune_seed.pl b/bin/fortune_seed.pl index c9c3c9d..7c0c937 100644 --- a/bin/fortune_seed.pl +++ b/bin/fortune_seed.pl @@ -1,6 +1,6 @@ #!/usr/bin/perl -use 5.018; +use 5.018; ## no critic (ProhibitImplicitImport) use strict; use warnings; use utf8; diff --git a/bin/friday_seed.pl b/bin/friday_seed.pl index 73e5050..cb81dbf 100644 --- a/bin/friday_seed.pl +++ b/bin/friday_seed.pl @@ -1,6 +1,6 @@ #!/usr/bin/perl -use 5.018; +use 5.018; ## no critic (ProhibitImplicitImport) use strict; use warnings; use utf8; diff --git a/bin/proverb_seed.pl b/bin/proverb_seed.pl index fd5bb49..9231c14 100644 --- a/bin/proverb_seed.pl +++ b/bin/proverb_seed.pl @@ -1,6 +1,6 @@ #!/usr/bin/perl -use 5.018; +use 5.018; ## no critic (ProhibitImplicitImport) use strict; use warnings; use utf8; diff --git a/cpanfile b/cpanfile index 13f3c7e..eb20413 100644 --- a/cpanfile +++ b/cpanfile @@ -1,14 +1,17 @@ +## no critic requires 'Carp', '==1.50'; requires 'Clone', '==0.45'; requires 'CHI', '==0.61'; -requires 'CHI::Driver::BerkeleyDB', '==0.05' ; +requires 'CHI::Driver::BerkeleyDB', '==0.05'; +requires 'Cwd', '==3.75'; requires 'Cwd::utf8', '==0.011'; requires 'Data::Dumper', '==2.183'; requires 'Encode', '==3.16'; requires 'English', '==1.11'; requires 'EV', '==4.33'; -requires 'File::Basename', '0'; +requires 'File::Basename', '==2.85'; requires 'File::Path', '==2.18'; +requires 'File::Spec', '==3.75'; requires 'JSON', '==4.03'; requires 'JSON::XS', '==4.03'; requires 'local::lib', '==2.000028'; @@ -21,9 +24,9 @@ requires 'Mojo::IOLoop', '0'; requires 'Mojo::IOLoop::Signal', '==0.003'; requires 'Mojo::Redis', '==3.27'; requires 'Mojo::Util', '0'; -requires 'open', '0'; +requires 'open', '==1.12'; requires 'POSIX', '0'; requires 'Protocol::Redis::XS', '0'; requires 'SQLite_File', '==0.1006'; requires 'utf8', '0'; -requires 'version', '0'; \ No newline at end of file +requires 'version', '==0.9929'; \ No newline at end of file diff --git a/lib/Conf.pm b/lib/Conf.pm index 4ab84b9..d9a167a 100644 --- a/lib/Conf.pm +++ b/lib/Conf.pm @@ -1,14 +1,13 @@ package Conf; -# Загружает конфиг +# Загружает конфиг файл -use 5.018; +use 5.018; ## no critic (ProhibitImplicitImport) use strict; use warnings; use utf8; use open qw (:std :utf8); use English qw ( -no_match_vars ); -use Encode qw (encode decode); -use JSON::XS; +use JSON::XS (); use version; our $VERSION = qw (1.0); use Exporter qw (import); @@ -16,17 +15,26 @@ our @EXPORT_OK = qw (LoadConf); sub LoadConf { my $c = 'data/config.json'; - open my $CH, '<', $c or die "[FATAL] No conf at $c: $OS_ERROR\n"; - my $json; + my $CH; + + unless (open $CH, '<', $c) { + die "[FATAL] No conf at $c: $OS_ERROR\n"; + } + my $len = (stat $c) [7]; + my $json; my $readlen = read $CH, $json, $len; - $json = encode 'UTF-8', $json; unless ($readlen) { close $CH; ## no critic (InputOutput::RequireCheckedSyscalls die "[FATAL] Unable to read $c: $OS_ERROR\n"; } + if ($readlen != $len) { + close $CH; ## no critic (InputOutput::RequireCheckedSyscalls + die "[FATAL] File $c is $len bytes on disk, but we read only $readlen bytes\n"; + } + close $CH; ## no critic (InputOutput::RequireCheckedSyscalls my $j = JSON::XS->new->utf8->relaxed; return $j->decode ($json); diff --git a/lib/Fortune.pm b/lib/Fortune.pm index f0b9abe..3d26368 100644 --- a/lib/Fortune.pm +++ b/lib/Fortune.pm @@ -1,17 +1,18 @@ package Fortune; # Прокатят любые источники из fortune_mod. Текстовой файл с разделителем "\n%\n" мнжду фразами. -use 5.018; +use 5.018; ## no critic (ProhibitImplicitImport) use strict; use warnings; use utf8; use open qw (:std :utf8); +use Encode qw (decode); use English qw ( -no_match_vars ); -use Carp qw (cluck croak); +use Carp qw (croak); use File::Path qw (make_path); use Log::Any qw ($log); use Math::Random::Secure qw (irand); -use SQLite_File; +use SQLite_File (); use Conf qw (LoadConf); @@ -30,7 +31,7 @@ sub Seed () { my $backingfile = sprintf '%s/fortune.sqlite', $dir; - if (-f $backingfile) { + if (-e $backingfile) { unlink $backingfile || croak "Unable to remove $backingfile: $OS_ERROR"; } @@ -41,7 +42,7 @@ sub Seed () { while (my $fortunefile = readdir $srcdirhandle) { my $srcfile = sprintf '%s/%s', $srcdir, $fortunefile; - unless (-f $srcfile) { + unless (-e $srcfile) { next; } @@ -77,7 +78,7 @@ sub Fortune () { my $phrase = $array[irand ($#array + 1)]; # decode? - utf8::decode $phrase; + $phrase = decode 'UTF-8', $phrase; untie @array; return $phrase; } diff --git a/lib/Friday.pm b/lib/Friday.pm index b5b0df8..b401acd 100644 --- a/lib/Friday.pm +++ b/lib/Friday.pm @@ -1,17 +1,18 @@ package Friday; # Данные модуля спёрты с https://raw.githubusercontent.com/isida/vi/master/data/friday.txt -use 5.018; +use 5.018; ## no critic (ProhibitImplicitImport) use strict; use warnings; use utf8; use open qw (:std :utf8); +use Encode qw (decode); use English qw ( -no_match_vars ); -use Carp qw (cluck croak); +use Carp qw (croak); use File::Path qw (make_path); use Log::Any qw ($log); use Math::Random::Secure qw (irand); -use SQLite_File; +use SQLite_File (); use Conf qw (LoadConf); @@ -34,7 +35,7 @@ sub Seed () { for (0..$#dow) { my $backingfile = sprintf '%s/%s.sqlite', $dir, $dow[$_]; - if (-f $backingfile) { + if (-e $backingfile) { unlink $backingfile || croak "Unable to remove $backingfile: $OS_ERROR\n"; } @@ -87,7 +88,7 @@ sub Friday () { }; my $phrase = $array[irand ($#array + 1)]; - utf8::decode $phrase; + $phrase = decode 'UTF-8', $phrase; untie @array; return $phrase; } diff --git a/lib/Karma.pm b/lib/Karma.pm index 2028d8c..64ab097 100644 --- a/lib/Karma.pm +++ b/lib/Karma.pm @@ -1,15 +1,14 @@ package Karma; -use 5.018; +use 5.018; ## no critic (ProhibitImplicitImport) use strict; use warnings; use utf8; use open qw (:std :utf8); use English qw ( -no_match_vars ); -use Carp qw (cluck); -use CHI; -use CHI::Driver::BerkeleyDB; +use CHI (); +use CHI::Driver::BerkeleyDB (); use Log::Any qw ($log); use Mojo::Util qw (trim); @@ -38,7 +37,7 @@ sub KarmaSet (@) { my $cache = CHI->new ( driver => 'BerkeleyDB', root_dir => $cachedir, - namespace => __PACKAGE__ . '_' . $chatid + namespace => __PACKAGE__ . '_' . $chatid, ); my $score = $cache->get ($phrase); @@ -90,7 +89,7 @@ sub KarmaGet (@) { my $cache = CHI->new ( driver => 'BerkeleyDB', root_dir => $cachedir, - namespace => __PACKAGE__ . '_' . $chatid + namespace => __PACKAGE__ . '_' . $chatid, ); my $score = $cache->get ($phrase); diff --git a/lib/Phrases.pm b/lib/Phrases.pm index 132a598..86115e8 100644 --- a/lib/Phrases.pm +++ b/lib/Phrases.pm @@ -1,7 +1,7 @@ package Phrases; # Общие модули - синтаксис, кодировки итд -use 5.018; +use 5.018; ## no critic (ProhibitImplicitImport) use strict; use warnings; use utf8; @@ -12,12 +12,12 @@ use Clone qw (clone); use Log::Any qw ($log); use Math::Random::Secure qw (irand); # Чтобы "уж точно" использовать hiredis-биндинги, загрузим этот модуль перед Mojo::Redis -use Protocol::Redis::XS; -use Mojo::Redis; -use Mojo::IOLoop; -use Mojo::IOLoop::Signal; +use Protocol::Redis::XS (); +use Mojo::Redis (); +use Mojo::IOLoop (); +use Mojo::IOLoop::Signal (); use Mojo::Util qw (trim); -use Data::Dumper; +use Data::Dumper qw (Dumper); use Conf qw (LoadConf); use Fortune qw (Fortune); @@ -107,7 +107,7 @@ my $parse_message = sub { $reply = KarmaSet ( $m->{chatid}, trim (substr $m->{message}, 0, -2), - substr $m->{message}, -2 + substr $m->{message}, -2, ); # Если у нас более одной строки - пусть с этим разбирается craniac, у него есть *мозги* } else { @@ -122,7 +122,7 @@ my $parse_message = sub { $answer->{message} = $reply; $self->json ($send_to)->notify ( - $send_to => $answer + $send_to => $answer, ); } @@ -133,7 +133,7 @@ my $__signal_handler = sub { my ($self, $name) = @_; $log->info ("[INFO] Caught a signal $name"); - if (defined $main::pidfile && -f $main::pidfile) { + if (defined $main::pidfile && -e $main::pidfile) { unlink $main::pidfile; } @@ -146,7 +146,7 @@ sub RunPhrases { $log->info ("[INFO] Connecting to $c->{server}, $c->{port}"); my $redis = Mojo::Redis->new ( - sprintf 'redis://%s:%s/1', $c->{server}, $c->{port} + sprintf 'redis://%s:%s/1', $c->{server}, $c->{port}, ); $log->info ('[INFO] Registering connection-event callback'); @@ -163,11 +163,11 @@ sub RunPhrases { my ($conn, $error) = @_; $log->error ("[ERROR] Redis connection error: $error"); return; - } + }, ); return; - } + }, ); my $pubsub = $redis->pubsub; @@ -178,13 +178,13 @@ sub RunPhrases { $log->debug ("[DEBUG] Subscribing to $channel"); $sub->{$channel} = $pubsub->json ($channel)->listen ( - $channel => sub { $parse_message->(@_); } + $channel => sub { $parse_message->(@_); }, ); } Mojo::IOLoop::Signal->on ( TERM => $__signal_handler, - INT => $__signal_handler + INT => $__signal_handler, ); do { Mojo::IOLoop->start } until Mojo::IOLoop->is_running; diff --git a/lib/Proverb.pm b/lib/Proverb.pm index c2903e9..01f7c61 100644 --- a/lib/Proverb.pm +++ b/lib/Proverb.pm @@ -1,18 +1,19 @@ package Proverb; # Пословицы и поговорки -use 5.018; +use 5.018; ## no critic (ProhibitImplicitImport) use strict; use warnings; use utf8; use open qw (:std :utf8); +use Encode qw (decode); use English qw ( -no_match_vars ); -use Carp qw (cluck croak); +use Carp qw (croak); use File::Path qw (make_path); use Log::Any qw ($log); use Math::Random::Secure qw (irand); use Mojo::Util qw (trim); -use SQLite_File; +use SQLite_File (); use Conf qw (LoadConf); @@ -31,7 +32,7 @@ sub Seed () { my $backingfile = sprintf '%s/proverb.sqlite', $dir; - if (-f $backingfile) { + if (-e $backingfile) { unlink $backingfile || croak "Unable to remove $backingfile: $OS_ERROR"; } @@ -41,7 +42,7 @@ sub Seed () { while (my $proverbfile = readdir $srcdirhandle) { my $srcfile = sprintf '%s/%s', $srcdir, $proverbfile; - unless (-f $srcfile) { + unless (-e $srcfile) { next; } @@ -79,7 +80,7 @@ sub Proverb () { my $phrase = $array[irand ($#array + 1)]; # decode? - utf8::decode $phrase; + $phrase = decode 'UTF-8', $phrase; untie @array; return $phrase; }