view release on metacpan or search on metacpan
lib/Tie/Cycle.pm view on Meta::CPAN
view all matches for this distribution
272829303132333435Does nothing, successfully
=cut
sub do_nothing()
{
return 1;
}
view release on metacpan or search on metacpan
inc/Test/Base.pm view on Meta::CPAN
6465666768697071727374
$default_object
||=
$default_class
->new;
return
$default_object
;
}
my
$import_called
= 0;
sub
import
() {
$import_called
= 1;
my
$class
= (
grep
/^-base$/i,
@_
)
?
scalar
(
caller
)
:
$_
[0];
if
(not
defined
$default_class
) {
inc/Test/Base.pm view on Meta::CPAN
130131132133134135136137138139140141142143144145146147
$caller
=~ s/.*:://;
croak
"Too late to call $caller()"
}
}
sub
find_my_self() {
my
$self
=
ref
(
$_
[0]) eq
$default_class
?
splice
(
@_
, 0, 1)
: default_object();
return
$self
,
@_
;
}
sub
blocks() {
(
my
(
$self
),
@_
) = find_my_self(
@_
);
croak
"Invalid arguments passed to 'blocks'"
if
@_
> 1;
croak
sprintf
(
"'%s' is invalid argument to blocks()"
,
shift
(
@_
))
inc/Test/Base.pm view on Meta::CPAN
164165166167168169170171172173174
}
return
(
@blocks
);
}
sub
next_block() {
(
my
(
$self
),
@_
) = find_my_self(
@_
);
my
$list
=
$self
->_next_list;
if
(
@$list
== 0) {
$list
= [@{
$self
->block_list},
undef
];
$self
->_next_list(
$list
);
inc/Test/Base.pm view on Meta::CPAN
178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
$block
->run_filters;
}
return
$block
;
}
sub
first_block() {
(
my
(
$self
),
@_
) = find_my_self(
@_
);
$self
->_next_list([]);
$self
->next_block;
}
sub
filters_delay() {
(
my
(
$self
),
@_
) = find_my_self(
@_
);
$self
->_filters_delay(
defined
$_
[0] ?
shift
: 1);
}
sub
no_diag_on_only() {
(
my
(
$self
),
@_
) = find_my_self(
@_
);
$self
->_no_diag_on_only(
defined
$_
[0] ?
shift
: 1);
}
sub
delimiters() {
(
my
(
$self
),
@_
) = find_my_self(
@_
);
$self
->check_late;
my
(
$block_delimiter
,
$data_delimiter
) =
@_
;
$block_delimiter
||=
$self
->block_delim_default;
$data_delimiter
||=
$self
->data_delim_default;
$self
->block_delim(
$block_delimiter
);
$self
->data_delim(
$data_delimiter
);
return
$self
;
}
sub
spec_file() {
(
my
(
$self
),
@_
) = find_my_self(
@_
);
$self
->check_late;
$self
->_spec_file(
shift
);
return
$self
;
}
sub
spec_string() {
(
my
(
$self
),
@_
) = find_my_self(
@_
);
$self
->check_late;
$self
->_spec_string(
shift
);
return
$self
;
}
sub
filters() {
(
my
(
$self
),
@_
) = find_my_self(
@_
);
if
(
ref
(
$_
[0]) eq
'HASH'
) {
$self
->_filters_map(
shift
);
}
else
{
inc/Test/Base.pm view on Meta::CPAN
231232233234235236237238239240241242243244245246247248249250251
push
@$filters
,
@_
;
}
return
$self
;
}
sub
filter_arguments() {
$Test::Base::Filter::arguments
;
}
sub
have_text_diff {
$Text::Diff::VERSION
>= 0.35 &&
$Algorithm::Diff::VERSION
>= 1.15;
}
sub
is($$;$) {
(
my
(
$self
),
@_
) = find_my_self(
@_
);
my
(
$actual
,
$expected
,
$name
) =
@_
;
local
$Test::Builder::Level
=
$Test::Builder::Level
+ 1;
if
(
$ENV
{TEST_SHOW_NO_DIFFS} or
not
defined
$actual
or
inc/Test/Base.pm view on Meta::CPAN
261262263264265266267268269270271
ok
$actual
eq
$expected
,
$name
.
"\n"
. Text::Diff::diff(\
$expected
, \
$actual
);
}
}
sub
run(&;$) {
(
my
(
$self
),
@_
) = find_my_self(
@_
);
my
$callback
=
shift
;
for
my
$block
(@{
$self
->block_list}) {
$block
->run_filters
unless
$block
->is_filtered;
&{
$callback
}(
$block
);
inc/Test/Base.pm view on Meta::CPAN
291292293294295296297298299300301sub
END {
run_compare()
unless
$Have_Plan
or
$DIED
or not
$import_called
;
}
sub
run_compare() {
(
my
(
$self
),
@_
) = find_my_self(
@_
);
$self
->_assert_plan;
my
(
$x
,
$y
) =
$self
->_section_names(
@_
);
local
$Test::Builder::Level
=
$Test::Builder::Level
+ 1;
for
my
$block
(@{
$self
->block_list}) {
inc/Test/Base.pm view on Meta::CPAN
313314315316317318319320321322323
is(
$block
->
$x
,
$block
->
$y
,
$block
->name ?
$block
->name : ());
}
}
}
sub
run_is() {
(
my
(
$self
),
@_
) = find_my_self(
@_
);
$self
->_assert_plan;
my
(
$x
,
$y
) =
$self
->_section_names(
@_
);
local
$Test::Builder::Level
=
$Test::Builder::Level
+ 1;
for
my
$block
(@{
$self
->block_list}) {
inc/Test/Base.pm view on Meta::CPAN
327328329330331332333334335336337
$block
->name ?
$block
->name : ()
);
}
}
sub
run_is_deeply() {
(
my
(
$self
),
@_
) = find_my_self(
@_
);
$self
->_assert_plan;
my
(
$x
,
$y
) =
$self
->_section_names(
@_
);
for
my
$block
(@{
$self
->block_list}) {
next
unless
exists
(
$block
->{
$x
}) and
exists
(
$block
->{
$y
});
inc/Test/Base.pm view on Meta::CPAN
340341342343344345346347348349350
$block
->name ?
$block
->name : ()
);
}
}
sub
run_like() {
(
my
(
$self
),
@_
) = find_my_self(
@_
);
$self
->_assert_plan;
my
(
$x
,
$y
) =
$self
->_section_names(
@_
);
for
my
$block
(@{
$self
->block_list}) {
next
unless
exists
(
$block
->{
$x
}) and
defined
(
$y
);
inc/Test/Base.pm view on Meta::CPAN
354355356357358359360361362363364
$block
->name ?
$block
->name : ()
);
}
}
sub
run_unlike() {
(
my
(
$self
),
@_
) = find_my_self(
@_
);
$self
->_assert_plan;
my
(
$x
,
$y
) =
$self
->_section_names(
@_
);
for
my
$block
(@{
$self
->block_list}) {
next
unless
exists
(
$block
->{
$x
}) and
defined
(
$y
);
inc/Test/Base.pm view on Meta::CPAN
480481482483484485486487488489490
};
}
return
$spec
;
}
sub
_strict_warnings() {
my
$done
= 0;
Filter::Util::Call::filter_add(
sub
{
return
0
if
$done
;
inc/Test/Base.pm view on Meta::CPAN
502503504505506507508509510511
$done
= 1;
}
);
}
sub
tie_output() {
my
$handle
=
shift
;
die
"No buffer to tie"
unless
@_
;
tie
$handle
,
'Test::Base::Handle'
,
$_
[0];
}
inc/Test/Base.pm view on Meta::CPAN
514515516517518519520521522523524
$ENV
{TEST_SHOW_NO_DIFFS} = 1;
}
package
Test::Base::Handle;
sub
TIEHANDLE() {
my
$class
=
shift
;
bless
\
$_
[0],
$class
;
}
sub
PRINT {
inc/Test/Base.pm view on Meta::CPAN
view all matches for this distribution
537538539540541542543544545546547sub
AUTOLOAD {
return
;
}
sub
block_accessor() {
my
$accessor
=
shift
;
no
strict
'refs'
;
return
if
defined
&$accessor
;
*$accessor
=
sub
{
my
$self
=
shift
;
view release on metacpan or search on metacpan
inc/Test/More.pm view on Meta::CPAN
view all matches for this distribution
114115116117118119120121122123}
#line 425
sub
cmp_ok($$$;$) {
my
$tb
= Test::More->builder;
$tb
->cmp_ok(
@_
);
}
view release on metacpan or search on metacpan
local/lib/perl5/Future/Utils.pm view on Meta::CPAN
130131132133134135136137138139(This is equivalent to using C<< Future->call >>, but is duplicated here
for
completeness).
=cut
sub call(&)
{
my ( $code ) = @_;
return Future->call( $code );
}
local/lib/perl5/Future/Utils.pm view on Meta::CPAN
160161162163164165166167168169(This can be considered similar to C<call-
with
-escape-continuation> as found
in some Scheme implementations).
=cut
sub call_with_escape(&)
{
my ( $code ) = @_;
my $escape_f = Future->new;
local/lib/perl5/Future/Utils.pm view on Meta::CPAN
335336337338339340341342343344345
# redo
undef
$$trialp
;
}
}
sub
repeat(&@)
{
my
$code
=
shift
;
my
%args
=
@_
;
# This makes it easier to account for other conditions
local/lib/perl5/Future/Utils.pm view on Meta::CPAN
424425426427428429430431432433Code that specifically wishes to
catch
failures in trial futures and retry
=cut
sub try_repeat(&@)
{
# defeat prototype
&repeat( @_, try => 1 );
}
local/lib/perl5/Future/Utils.pm view on Meta::CPAN
445446447448449450451452453454455This function used to be called C<repeat_until_success>, and is currently
aliased as this name as well.
=cut
sub try_repeat_until_success(&@)
{
my $code = shift;
my %args = @_;
# TODO: maybe merge while/until conditions one day...
local/lib/perl5/Future/Utils.pm view on Meta::CPAN
665666667668669670671672673674675This function is also available under the name of simply C<fmap> to emphasise
its similarity to perl's C<
map
> keyword.
=cut
sub fmap_concat(&@)
{
my $code = shift;
my %args = @_;
_fmap( $code, %args, collect => "array" )->then( sub {
local/lib/perl5/Future/Utils.pm view on Meta::CPAN
693694695696697698699700701702703This function is also available under the shorter name of C<fmap1>.
=cut
sub fmap_scalar(&@)
{
my $code = shift;
my %args = @_;
_fmap( $code, %args, collect => "scalar" )
local/lib/perl5/Future/Utils.pm view on Meta::CPAN
view all matches for this distribution
721722723724725726727728729730731This function is also available under the shorter name of C<fmap0>.
=cut
sub fmap_void(&@)
{
my $code = shift;
my %args = @_;
_fmap( $code, %args, collect => "void" )
view release on metacpan or search on metacpan
lib/Acme/Test/42.pm view on Meta::CPAN
view all matches for this distribution
89101112131415161718192021our
@ISA
=
qw(Test::Builder::Module)
;
our
@EXPORT
=
qw(ok not_ok)
;
my
$CLASS
= __PACKAGE__;
sub
ok($;$) {
return
$CLASS
->builder->ok(
$_
[0] eq 42,
$_
[1]);
}
sub
not_ok($;$) {
return
$CLASS
->builder->ok(
$_
[0] ne 42,
$_
[1]);
}
42;
view release on metacpan or search on metacpan
lib/Acme/Test/Buffy.pm view on Meta::CPAN
view all matches for this distribution
6869707172737475767778# here's where we define the subroutine "is_buffy" that will be
# exported. Note the prototype that does the right thing. More
# can be found out about prototypes in the 'perlsub' perldoc.
# This one simply says "one scalar argument and possibly another"
sub
is_buffy($;$)
{
# simply call the other subroutine. There's no reason why this
# couldn't be done here, I just want to show how to call other
# subroutines in this class. This supplied a default test
# description
view release on metacpan or search on metacpan
2575257625772578257925802581258225832584
splice
@$ar
, binsearch(
$v
,
$ar
,1,
$Pushsort_cmpsub
)+1, 0,
$v
;
}
0+
@$ar
}
sub
pushsortstr(\@@){
local
$Pushsort_cmpsub
=
sub
{
$_
[0]cmp
$_
[1]}; pushsort(
@_
) }
#speedup: copy sub pushsort
=head2 binsearch
Returns the position of an element in a numerically sorted array. Returns undef if the element is not found.
3988398939903991399239933994399539963997sort
(uniq(
'a'
,
'dup'
,
'z'
,
'dup'
));
# better, probably what you meant
distinct(
'a'
,
'dup'
,
'z'
,
'dup'
));
# same, distinct includes alphanumeric sort
=cut
sub uniq(@) { my %seen; grep !$seen{$_}++, @_ }
=head1 HASHES
=head2 subhash
60116012601360146015601660176018601960206021my
@arr
= globr
"{01..11}b"
;
# 01b 02b 03b 04b 05b 06b 07b 08b 09b 10b 11b (keep leading zero)
my
@arr
= globr
"{01..12..3}b"
;
# 01b 04b 07b 10b
=cut
sub globr($) {
my $p=shift;
$p=~s{
\{(-?\w+)\.\.(-?\w+)(\.\.(-?\d+))?\}
}{
my $i=0;
view all matches for this distribution
70997100710171027103710471057106710771087109sub
sys($){
my
$s
=
shift
;
my
$r
=
system
(
$s
);
$r
==0 or croak
"ERROR: system($s)==$r ($!) ($?)"
}
=cut
sub sys($){ my$s=shift; my$r=system($s); $r==0 or croak"ERROR: system($s)==$r ($!) ($?)" }
=head2 recursed
Returns true or false (actually 1 or 0) depending on whether the
current sub has been called by itself or not.
view release on metacpan or search on metacpan
lib/Acme/VarMess.pm view on Meta::CPAN
view all matches for this distribution
2526272829303132333435sub
dont_blow {
%invar
=
map
{
$_
=>1}
@_
;
}
sub
blow($$;$) {
my
(
$src
,
$outputfile
) =
@_
;
my
$doc
;
if
(
ref
$src
){
$doc
= PPI::Document->new(
$$src
);
}
view release on metacpan or search on metacpan
inc/Test/More.pm view on Meta::CPAN
120121122123124125126127128129
return
$tb
->unlike(
@_
);
}
#line 471
sub
cmp_ok($$$;$) {
my
$tb
= Test::More->builder;
return
$tb
->cmp_ok(
@_
);
}
inc/Test/More.pm view on Meta::CPAN
view all matches for this distribution
247248249250251252253254255256257
return
$obj
;
}
#line 719
sub
subtest($&) {
my
(
$name
,
$subtests
) =
@_
;
my
$tb
= Test::More->builder;
return
$tb
->subtest(
@_
);
}
view release on metacpan or search on metacpan
lib/Aion/Format.pm view on Meta::CPAN
353637383940414243444546474849505152535455};
#@category Ловушки
# Ловушка Ð´Ð»Ñ STDERR
sub
trapperr(&) {
my
$sub
=
shift
;
local
*STDERR
;
open
STDERR,
'>:utf8'
, \
my
$f
;
$sub
->();
close
STDERR;
$f
}
# Ловушка Ð´Ð»Ñ STDOUT
sub
trappout(&) {
my
$sub
=
shift
;
local
*STDOUT
;
open
STDOUT,
'>:utf8'
, \
my
$f
;
$sub
->();
close
STDOUT;
lib/Aion/Format.pm view on Meta::CPAN
57585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104}
#@category Цвет
# Колоризирует текÑÑ‚ escape-поÑледовательноÑÑ‚Ñми: coloring("#{BOLD RED}ya#{}100!#RESET"), а затем - заменÑет формат sprintf-ом
sub
coloring(@) {
my
$s
=
shift
;
$s
=~ s!
#\{(?<x>[\w \t]*)\}|#(?<x>\w+)!
my
$x
= $+{x};
$x
=
"RESET"
if
$x
~~ [
qw/r R/
];
Term::ANSIColor::color(
$x
)
!nge;
sprintf
$s
,
@_
}
# Печатает в STDOUT вывод coloring
sub
printcolor(@) {
coloring
@_
}
# Печатает в STDERR вывод coloring
sub
warncolor(@) {
STDERR coloring
@_
}
# Ð”Ð»Ñ ÐºÑ€Ð¾Ð½Ð°: Пишет в STDOUT
sub
accesslog(@) {
"["
, POSIX::strftime(
"%F %T"
,
localtime
),
"] "
, coloring
@_
;
}
# Ð”Ð»Ñ ÐºÑ€Ð¾Ð½Ð°: Пишет в STDIN
sub
errorlog(@) {
STDERR
"["
, POSIX::strftime(
"%F %T"
,
localtime
),
"] "
, coloring
@_
;
}
#@category ПреобразованиÑ
# Проводит ÑоответÑтвиÑ
#
# matches "...", qr/.../ => sub {...}, ...
#
sub
matches($@) {
my
$s
=
shift
;
my
$i
= 0;
my
$re
=
join
"\n| "
,
map
{
$i
++ % 2 == 0?
"(?<I$i> $_ )"
: () }
@_
;
my
$arg
= \
@_
;
my
$fn
=
sub
{
lib/Aion/Format.pm view on Meta::CPAN
124125126127128129130131132133134135136137138139140
е e н n ф f ы y
ё jo о o х kh ь
q
ж zh
з z
/;
sub
transliterate($) {
my
(
$s
) =
@_
;
$s
=~ s/[а-ÑÑ‘]/
lc
($&) eq $&?
$TRANS
{$&}:
ucfirst
$TRANS
{
lc
$&}/gier;
}
# ТранÑлитетрирует текÑÑ‚, оÑтавлÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ латинÑкие буквы и тире
sub
trans($) {
my
(
$s
) =
@_
;
$s
= transliterate
$s
;
$s
=~ s{[-\s_]+}{-}g;
$s
=~ s![^a-z-]!!gi;
$s
=~ s!^-*(.*?)-*\z!$1!;
lib/Aion/Format.pm view on Meta::CPAN
142143144145146147148149150151152153154155156157158159160161162163164165166167168}
#@category Строки
# Преобразует в Ñтроку perl
sub
to_str(;$) {
my
(
$s
) =
@_
== 0?
$_
:
@_
;
$s
=~ s/[\\']/\\$&/g;
$s
=~ s/^(.*)\z/
'$1'
/s;
$s
}
# Преобразует из Ñтроки perl
sub
from_str(;$) {
my
(
$s
) =
@_
== 0?
$_
:
@_
;
$s
=~ s/^
'(.*)'
\z/$1/s;
$s
=~ s/\\([\\'])/$1/g;
$s
}
# Упрощённый Ñзык регулÑрок
sub
nous($) {
my
(
$templates
) =
@_
;
my
$x
=
join
"|"
,
map
{
matches
$_
,
# Срезаем вÑе пробелы Ñ ÐºÐ¾Ð½Ñ†Ð°:
qr!\s*$!
=>
sub
{},
lib/Aion/Format.pm view on Meta::CPAN
192193194195196197198199200201202
qr/$x/
xsmn
}
# формирует человекочитабельный интервал
sub
sinterval($) {
my
(
$interval
) =
@_
;
if
(0 ==
int
$interval
) {
return
sprintf
"%.6f mks"
,
$interval
*1000_000
if
0 ==
int
(
$interval
*1000_000);
return
sprintf
"%.7f ms"
,
$interval
*1000
if
0 ==
int
(
$interval
*1000);
lib/Aion/Format.pm view on Meta::CPAN
218219220221222223224225226227228our
@RIM_CIF
= (
[
''
,
'I'
,
'II'
,
'III'
,
'IV'
,
'V'
,
'VI'
,
'VII'
,
'VIII'
,
'IX'
],
[
''
,
'X'
,
'XX'
,
'XXX'
,
'XL'
,
'L'
,
'LX'
,
'LXX'
,
'LXXX'
,
'XC'
],
[
''
,
'C'
,
'CC'
,
'CCC'
,
'CD'
,
'D'
,
'DC'
,
'DCC'
,
'DCCC'
,
'CM'
]
);
sub
rim($) {
my
(
$a
) =
@_
;
my
$s
;
for
( ;
$a
!= 0 ;
$a
=
int
(
$a
/ 1000 ) ) {
my
$v
=
$a
% 1000;
lib/Aion/Format.pm view on Meta::CPAN
253254255256257258259260261262263
" "
,
# пробел
(
map
chr
, 0 .. 0x1F, 0x7F),
# управлÑющие Ñимволы ASCII
# Ñимвол 152 (0x98) в cp1251 отÑутÑтвует.
;
# Переводит натуральное чиÑло в заданную ÑиÑтему ÑчиÑлениÑ
sub
to_radix($;$) {
my
(
$n
,
$radix
) =
@_
;
$radix
//= 64;
die
"to_radix: The number system $radix is too large. Use NS before "
. (1 +
length
$CIF
)
if
$radix
>
length
$CIF
;
$n
+=0;
$radix
+=0;
lib/Aion/Format.pm view on Meta::CPAN
270271272273274275276277278279280
}
return
$x
;
}
# ПарÑит натуральное чиÑло в указанной ÑиÑтеме ÑчиÑлениÑ
sub
from_radix(@) {
my
(
$s
,
$radix
) =
@_
;
$radix
//= 64;
$radix
+=0;
die
"from_radix: The number system $radix is too large. Use NS before "
. (1 +
length
$CIF
)
if
$radix
>
length
$CIF
;
lib/Aion/Format.pm view on Meta::CPAN
284285286287288289290291292293294295296297298299300301302303304
}
return
$x
;
}
# ОкруглÑет до указанного разрÑда чиÑла
sub
round($;$) {
my
(
$x
,
$dec
) =
@_
;
$dec
//= 0;
my
$prec
= 10*
*$dec
;
int
(
$x
*$prec
+ 0.5) /
$prec
}
#@category Меры (measure)
# добавлÑет разделители между разрÑдами чиÑла
sub
num($) {
my
(
$s
) =
@_
;
my
$sep
=
"Â "
;
# Ðеразрывный пробел
my
$dec
=
"."
;
lib/Aion/Format.pm view on Meta::CPAN
313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
$x
=~ s!
$sep
([+-]?)$!$1!;
reverse
(
$x
) .
$y
;
}
# ДобавлÑет разрÑды чиÑел и добавлÑет единицу измерениÑ
sub
kb_size($) {
my
(
$n
) =
@_
;
return
num(round(
$n
/ 1024 / 1024 / 1024)) .
"G"
if
$n
>= 1024 * 1024 * 1024;
return
num(round(
$n
/ 1024 / 1024)) .
"M"
if
$n
>= 1024 * 1024;
return
num(round(
$n
/ 1024)) .
"k"
if
$n
>= 1024;
return
num(round(
$n
)) .
"b"
;
}
# ОÑтавлÑет $n цифр до и поÑле точки: 10.11 = 10, 0.00012 = 0.00012, 1.2345 = 1.2, еÑли $n = 2
sub
sround($;$) {
my
(
$number
,
$digits
) =
@_
;
$digits
//= 2;
my
$num
=
sprintf
(
"%.100f"
,
$number
);
$num
=~ /^-?0?(\d*)\.(0*)[1-9]/;
return
""
. round(
$num
,
$digits
+
length
$2)
if
length
($1) == 0;
my
$k
=
$digits
-
length
$1;
return
""
. round(
$num
,
$k
< 0? 0:
$k
);
}
# Кибибайт
sub
KiB() { 2**10 }
# Мебибайт
sub
MiB() { 2**20 }
# Гибибайт
sub
GiB() { 2**30 }
# Тебибайт
sub
TiB() { 2**40 }
# МакÑимум в данных TinyText Марии
sub
xxS { 255 }
# МакÑимум в данных Text Марии
lib/Aion/Format.pm view on Meta::CPAN
view all matches for this distribution
375376377378379380381382383384385
20
=>
"Ð´Ð»Ñ Ð¼Ð°Ð³Ð¸Ñтров"
,
10
=>
"Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ„ÐµÑÑионалов"
,
0
=>
"Ð´Ð»Ñ Ð°ÐºÐ°Ð´ÐµÐ¼Ð¸ÐºÐ¾Ð²"
,
);
sub
flesch_index_human($) {
my
(
$flesch_index
) =
@_
;
$FLESCH_INDEX_NAMES
{
int
(
$flesch_index
/ 10) * 10} //
"неÑвÑзный руÑÑкий текÑÑ‚"
}
1;
view release on metacpan or search on metacpan
lib/Aion/Fs.pm view on Meta::CPAN
323334353637383940414243
RISCOS
=>
'riscos'
,
MACOS
=>
'macos'
,
VMESA
=>
'vmesa'
,
};
sub
_fs();
sub
_match($$) {
my
(
$match
,
$fs
) =
@_
;
my
@res
;
my
@remove
;
my
$trans
=
$fs
->{before_split} //
sub
{
$_
[0]};
for
my
$key
(
@$match
) {
next
unless
exists
$_
->{
$key
};
lib/Aion/Fs.pm view on Meta::CPAN
5556575859606162636465
delete
@res
{
keys
%{
$fs
->{remove}->{
$_
}}}
for
@remove
;
return
%res
,
%$_
;
}
sub
_join(@) {
my
(
$match
,
@format
) =
@_
;
my
$fs
= _fs;
my
$trans
=
$fs
->{before_split} //
sub
{
$_
[0]};
my
%f
= _match
$match
,
$fs
;
join
""
, List::Util::pairmap {
lib/Aion/Fs.pm view on Meta::CPAN
363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406
my
$x
=
$_
;
ref
$_
->{name}? (
map
{ (
$_
=>
$x
) } @{
$_
->{name}}): (
$_
->{name} =>
$_
)
}
@FS
;
sub
_fs() {
$FS
{
lc
$^O} //
$FS
{unix} }
# Мы находимÑÑ Ð² ОС ÑемейÑтва UNIX
sub
isUNIX() { _fs->{name} eq
"unix"
}
# Разбивает директорию на ÑоÑтавлÑющие
sub
splitdir(;$) {
my
(
$dir
) =
@_
== 0?
$_
:
@_
;
(
$dir
) =
@$dir
if
ref
$dir
;
my
$fs
= _fs;
$dir
=
$fs
->{before_split}->(
$dir
)
if
exists
$fs
->{before_split};
split
$fs
->{symdirquote},
$dir
, -1
}
# ОбъединÑет директорию из ÑоÑтавлÑющих
sub
joindir(@) {
join
_fs->{symdir},
@_
}
# Разбивает раÑширение (тип файла) на ÑоÑтавлÑющие
sub
splitext(;$) {
my
(
$ext
) =
@_
== 0?
$_
:
@_
;
(
$ext
) =
@$ext
if
ref
$ext
;
split
_fs->{symextquote},
$ext
, -1
}
# ОбъединÑет раÑширение (тип файла) из ÑоÑтавлÑющих
sub
joinext(@) {
join
_fs->{symext},
@_
}
# ВыделÑет в пути ÑоÑтавлÑющие, а еÑли получает хеш, то объединÑет его в путь
sub
path(;$) {
my
(
$path
) =
@_
== 0?
$_
:
@_
;
my
$fs
= _fs;
if
(
ref
$path
eq
"HASH"
) {
lib/Aion/Fs.pm view on Meta::CPAN
487488489490491492493494495496497
$path
}
# Считывает файл
sub
cat(;$) {
my
(
$file
) =
@_
== 0?
$_
:
@_
;
my
$layer
=
":utf8"
;
(
$file
,
$layer
) =
@$file
if
ref
$file
;
open
my
$f
,
"<$layer"
,
$file
or
die
"cat $file: $!"
;
read
$f
,
my
$x
, -s
$f
;
lib/Aion/Fs.pm view on Meta::CPAN
536537538539540541542543544545546547548549550551552553
BLKSIZE_NO
=> 11,
# Размер блока ввода-вывода
BLOCKS_NO
=> 12,
# КоличеÑтво выделенных блоков
};
# Вернуть Ð²Ñ€ÐµÐ¼Ñ Ð¼Ð¾Ð´Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ файла
sub
mtime(;$) {
my
(
$file
) =
@_
== 0?
$_
:
@_
;
(
$file
) =
@$file
if
ref
$file
;
(Time::HiRes::
stat
$file
)[MTIME_NO] //
die
"mtime $file: $!"
}
# Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ файле в виде хеша
sub
sta(;$) {
my
(
$path
) =
@_
== 0?
$_
:
@_
;
(
$path
) =
@$path
if
ref
$path
;
my
%sta
= (
path
=>
$path
);
@sta
{
qw/dev ino mode nlink uid gid rdev size atime mtime ctime blksize blocks/
} = Time::HiRes::
stat
$path
or
die
"sta $path: $!"
;
lib/Aion/Fs.pm view on Meta::CPAN
560561562563564565566567568569570# );
\
%sta
}
# Файловые фильтры
sub
_filters(@) {
map
{
if
(
ref
$_
eq
"CODE"
) {
$_
}
elsif
(
ref
$_
eq
"Regexp"
) {
my
$re
=
$_
;
sub
{
$_
=~
$re
} }
elsif
(/^-([a-z]+)$/) {
eval
join
""
,
"sub { "
, (
join
" && "
,
map
"-$_()"
,
split
//, $1),
" }"
lib/Aion/Fs.pm view on Meta::CPAN
572573574575576577578579580581582
else
{
my
$re
= wildcard();
sub
{
$_
=~
$re
} }
}
@_
}
# Ðайти файлы
sub
find(;@) {
my
$file
=
@_
?
shift
:
$_
;
$file
= [
$file
]
unless
ref
$file
;
my
@noenters
;
my
$errorenter
=
sub
{};
my
$ex
=
@_
&&
ref
(
$_
[
$#_
]) =~ /^Aion::Fs::(noenter|errorenter)\z/ ?
pop
:
undef
;
lib/Aion/Fs.pm view on Meta::CPAN
633634635636637638639640641642643644645646647648649650651652653654655656657658
wantarray
?
@ret
:
$count
}
# Ðе входить в подкаталоги
sub
noenter(@) {
bless
[
@_
],
"Aion::Fs::noenter"
}
# ВызываетÑÑ Ð´Ð»Ñ Ð²Ñех ошибок ввода-вывода
sub
errorenter(&) {
bless
shift
,
"Aion::Fs::errorenter"
}
# ОÑтанавливает find будучи вызван Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ из его фильтров, errorenter или noenter
sub
find_stop() {
die
bless
{},
"Aion::Fs::stop"
}
# Производит замену во вÑех указанных файлах. Возвращает файлы в которых замен не было
sub
replace(&@) {
my
$fn
=
shift
;
my
@noreplace
;
local
$_
;
my
$pkg
=
caller
;
my
$aref
=
"${pkg}::a"
;
my
$bref
=
"${pkg}::b"
;
for
$$aref
(
@_
) {
if
(
ref
$$aref
) { (
$$aref
,
$$bref
) = @
$$aref
}
else
{
$$bref
=
":utf8"
}
lib/Aion/Fs.pm view on Meta::CPAN
662663664665666667668669670671672673674675676677678
}
@noreplace
}
# Стирает вÑе указанные файлы. Возвращает переданные файлы
sub
erase(@) {
-d?
rmdir
:
unlink
or
die
"erase ${\(-d? 'dir': 'file')} $_: $!"
for
@_
;
@_
}
# Переводит вилдкард в регулÑрку
sub
wildcard(;$) {
my
(
$wildcard
) =
@_
;
$wildcard
=
$_
if
@_
== 0;
$wildcard
=~ s{
(?<file> \*\*)
| (?<path> \*)
lib/Aion/Fs.pm view on Meta::CPAN
view all matches for this distribution
695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731
qr/^$wildcard$/
ns
}
# Открывает файл на указанной Ñтроке в редакторе
sub
goto_editor($$) {
my
(
$path
,
$line
) =
@_
;
my
$p
= EDITOR;
$p
=~ s!
%p
!
$path
!;
$p
=~ s!
%l
!
$line
!;
my
$status
=
system
$p
;
die
"$path:$line --> $status"
if
$status
;
return
;
}
# Из пакета в файловый путь
sub
from_pkg(;$) {
my
(
$pkg
) =
@_
== 0?
$_
:
@_
;
$pkg
=~ s!::!/!g;
"$pkg.pm"
}
# Из файлового пути в пакет
sub
to_pkg(;$) {
my
(
$path
) =
@_
== 0?
$_
:
@_
;
$path
=~ s!\.\w+$!!;
$path
=~ s!/!::!g;
$path
}
# Подключает модуль, еÑли он ещё не подключён, и возвращает его
sub
include(;$) {
my
(
$pkg
) =
@_
== 0?
$_
:
@_
;
return
$pkg
if
$pkg
->can(
"new"
) ||
$pkg
->can(
"has"
);
my
$path
= from_pkg
$pkg
;
return
$pkg
if
exists
$INC
{
$path
};
require
$path
;
view release on metacpan or search on metacpan
lib/Aion/Query.pm view on Meta::CPAN
3334353637383940414243
BQ
=> 1,
};
# Формирует DSN на оÑнове конфига
our
$DEFAULT_DSN
;
sub
default_dsn() {
$DEFAULT_DSN
//=
do
{
if
(
defined
DSN) {DSN}
elsif
(DRV =~ /mysql|mariadb/i) {
my
$sock
= SOCK;
$sock
//=
"/var/run/mysqld/mysqld.sock"
if
!
defined
HOST;
lib/Aion/Query.pm view on Meta::CPAN
5455565758596061626364
else
{
die
"Using DSN! DRV: ${\ DRV} is'nt supported."
}
}
}
my
$CONN
;
sub
default_connect_options() {
return
default_dsn, USER, PASS,
$CONN
//= CONN //
do
{
if
(DRV =~ /mysql|mariadb/i) {[
"SET NAMES utf8"
,
"SET sql_mode='NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'"
,
]}
lib/Aion/Query.pm view on Meta::CPAN
118119120121122123124125126127128}
# ЗапроÑÑ‹ к базе
our
@DEBUG
;
sub
sql_debug(@) {
my
(
$fn
,
$query
) =
@_
;
my
$msg
=
"$fn: "
. (
ref
$query
? np(
$query
):
$query
);
push
@DEBUG
,
$msg
;
STDERR
$msg
,
"\n"
if
DEBUG;
}
lib/Aion/Query.pm view on Meta::CPAN
141142143144145146147148149150151152153154155156# $_[0]->{SQL_DEBUG} = \@DEBUG;
# return;
# }
sub
LAST_INSERT_ID() {
$base
->last_insert_id
}
# Преобразует в бинарную Ñтроку принÑтую в MYSQL
sub
_to_hex_str($) {
my
(
$s
) =
@_
;
no
utf8;
$s
=~ s/./
sprintf
"%02X"
,
ord
$&/gaes;
"X'$s'"
lib/Aion/Query.pm view on Meta::CPAN
166167168169170171172173174175176177
return
$s
unless
BQ;
$s
=~ s/°|[^\Q
$Aion::Format::CIF
\E]/
"°${\ to_radix(ord $&, 254) }\x7F"
/ge;
$s
}
sub
quote(;$);
sub
quote(;$) {
my
$k
=
@_
== 0?
$_
:
$_
[0];
my
$ref
;
!
defined
(
$k
)?
"NULL"
:
ref
$k
eq
"ARRAY"
&&
ref
$k
->[0] eq
"ARRAY"
?
lib/Aion/Query.pm view on Meta::CPAN
250251252253254255256257258259260
!imgex;
$query
}
# ВыполнÑет sql-запроÑ
sub
query_do($;$) {
my
(
$query
,
$columns
) =
@_
;
sql_debug
query
=>
$query
;
connect_respavn(
$base
,
$base_connection_id
);
my
$res
=
eval
{
lib/Aion/Query.pm view on Meta::CPAN
284285286287288289290291292293294
die
+(
length
(
$query
)>MAX_QUERY_ERROR?
substr
(
$query
, 0, MAX_QUERY_ERROR) .
" ..."
:
$query
) .
"\n\n$@"
if
$@;
$res
}
sub
query_ref(@) {
my
(
$query
,
%kw
) =
@_
;
my
$map
=
delete
$kw
{MAP};
$query
= query_prepare(
$query
,
%kw
)
if
@_
>1;
my
$res
= query_do(
$query
);
if
(
$map
&&
ref
$res
eq
"ARRAY"
) {
lib/Aion/Query.pm view on Meta::CPAN
297298299300301302303304305306307308309310311312313
}
else
{
$res
}
}
sub
query(@) {
my
$ref
= query_ref(
@_
);
wantarray
&&
ref
$ref
?
@$ref
:
$ref
;
}
# Возвращает sth
sub
query_sth(@) {
my
(
$query
,
%kw
) =
@_
;
$query
= query_prepare(
$query
,
%kw
)
if
@_
>1;
my
$sth
=
$base
->prepare(
$query
);
$sth
->execute;
$sth
lib/Aion/Query.pm view on Meta::CPAN
327328329330331332333334335336337338#
# TODO: query_slice [] => word, "SELECT word, id FROM word WHERE word in (1,2,3)" -> [{id => 10, word => 1}, {id => 20, word => 2}]
#
# TODO: [ "id", "name", "jinni" ] -> [{ id=>1, items => [{ name => "hi!", items => [{ jinni=>2, items => [{...}] }] }] }]
#
sub
query_slice(@);
sub
query_slice(@) {
my
(
$key
,
$val
,
@args
) =
@_
;
my
$is_array
=
ref
$val
eq
"ARRAY"
&&
@$val
&&
ref
$val
->[0] eq
"ARRAY"
;
return
$is_array
? [ query_slice
@_
]: +{ query_slice
@_
}
if
!
wantarray
;
lib/Aion/Query.pm view on Meta::CPAN
395396397398399400401402403404405# Выбрать один колумн
#
# query_col "SELECT id FROM word WHERE word in (1,2,3)" -> [1,2,3]
#
sub
query_col(@);
sub
query_col(@) {
return
[query_col
@_
]
if
!
wantarray
;
my
$rows
= query_ref(
@_
);
die
"Only one column is acceptable!"
if
@$rows
and 1 !=
keys
%{
$rows
->[0]};
lib/Aion/Query.pm view on Meta::CPAN
409410411412413414415416417418419420421422423424425426427428429# Выбрать Ñтроку
#
# query_row_ref "SELECT id, word FROM word WHERE word = 1" -> {id=>1, word=>"Ñеребро"}
#
sub
query_row_ref(@) {
my
$rows
= query_ref(
@_
);
die
"A few lines!"
if
@$rows
>1;
$rows
->[0]
}
# Выбрать Ñтроку
#
# ($id, $word) = query_row_ref "SELECT id, word FROM word WHERE word = 1"
#
sub
query_row(@) {
return
query_row_ref(
@_
)
unless
wantarray
;
my
$sql
= query_prepare(
@_
);
my
$rows
= query_do(
$sql
,
my
$columns
);
die
"A few lines!"
if
@$rows
> 1;
my
$row
=
$rows
->[0];
lib/Aion/Query.pm view on Meta::CPAN
432433434435436437438439440441442# Выбрать значение
#
# query_scalar "SELECT word FROM word WHERE id = 1" -> "золото"
#
sub
query_scalar(@) {
my
$rows
= query_ref(
@_
);
die
"A few lines!"
if
@$rows
>1;
die
"Only one column is acceptable! "
.
keys
%{
$rows
->[0]}
if
@$rows
and 1 !=
keys
%{
$rows
->[0]};
my
(
$k
,
$v
) = %{
$rows
->[0]};
$v
lib/Aion/Query.pm view on Meta::CPAN
446447448449450451452453454455456#
# ("concat(size,',',likes)", "(size < 10 OR size = 10 AND likes >= 12)", ["size", "likes"]) = make_query_for_order "size desc, likes", "10,12"
#
# ("concat(size,',',likes)", 1) = make_query_for_order "size desc, likes", ""
#
sub
make_query_for_order(@) {
my
(
$order
,
$next
) =
@_
;
my
@orders
=
split
/\s*,\s*/,
$order
;
my
@order_direct
;
my
@order_sel
=
map
{
my
$x
=
$_
;
push
@order_direct
,
$x
=~s/\s+(asc|desc)\s*$//ie ?
lc
$1:
"asc"
;
$x
}
@orders
;
lib/Aion/Query.pm view on Meta::CPAN
489490491492493494495496497498499
return
$select
,
"($where)"
, \
@order_sel
;
}
# УÑтанавливает или возвращает ключ из таблицы settings
sub
settings($;$) {
my
(
$id
,
$value
) =
@_
;
if
(
@_
== 1) {
my
$v
= query_scalar(
"SELECT value FROM settings WHERE id=:id"
,
id
=>
$id
);
return
defined
(
$v
)? Aion::Format::Json::from_json(
$v
):
$v
;
}
lib/Aion/Query.pm view on Meta::CPAN
505506507508509510511512513514
value
=> Aion::Format::Json::to_json(
$value
),
);
}
# возвращает запиÑÑŒ по её pk
sub
load_by_id(@) {
my
(
$tab
,
$pk
,
$fields
,
@options
) =
@_
;
$fields
//=
"*"
;
query_row(
"SELECT $fields FROM $tab WHERE id=:id LIMIT 2"
,
@options
,
id
=>
$pk
)
}
lib/Aion/Query.pm view on Meta::CPAN
518519520521522523524525526527528
my
(
$dbh
,
$drv
) =
@_
;
$dbh
->{Driver}{Name} =~ /^(
$drv
)/ain
}
# ДобавлÑет запиÑÑŒ и возвращает её id
sub
insert(@) {
my
(
$tab
,
%x
) =
@_
;
if
(_check_drv(
$base
,
"mysql|mariadb"
)) {
query
"INSERT INTO $tab SET :set"
,
set
=> \
%x
;
}
else
{
stores(
$tab
, [\
%x
],
insert
=> 1);
lib/Aion/Query.pm view on Meta::CPAN
532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561# ОбновлÑет запиÑÑŒ по её id
#
# update "tab" => 123, word => 123 -> 6
#
sub
update(@) {
my
(
$tab
,
$id
,
%x
) =
@_
;
die
"Row $tab.id=$id is not!"
if
!query
"UPDATE $tab SET :set WHERE id=:id"
,
id
=>
$id
,
set
=> \
%x
;
$id
}
# УдалÑет запиÑÑŒ по её id
#
# remove "tab" => 123 -> 123
#
sub
remove(@) {
my
(
$tab
,
$id
) =
@_
;
die
"Row $tab.id=$id does not exist!"
if
!query
"DELETE FROM $tab WHERE id=:id"
,
id
=>
$id
;
$id
}
# Возвращает ключ по другим полÑм
#
# query_id "tab", word => 123 -> 6
#
sub
query_id(@) {
my
$tab
=
shift
;
my
%row
=
@_
;
my
$pk
=
delete
(
$row
{
'-pk'
}) //
"id"
;
my
$fields
=
ref
$pk
?
join
(
", "
,
@$pk
):
$pk
;
lib/Aion/Query.pm view on Meta::CPAN
570571572573574575576577578579580# UPSERT: ÑохранÑет данные (update или insert)
#
# stores "tab", [{word=>1}, {word=>2}];
#
sub
stores(@);
sub
stores(@) {
my
(
$tab
,
$rows
,
%opt
) =
@_
;
my
(
$ignore
,
$insert
) =
delete
@opt
{
qw/ignore insert/
};
die
"Keys ${\ join('', )}"
if
keys
%opt
;
lib/Aion/Query.pm view on Meta::CPAN
view all matches for this distribution
632633634635636637638639640641642
my
$tab
=
shift
;
stores
$tab
, [+{
@_
}];
}
# Ð¡Ð²ÐµÑ€Ñ…Ð¼Ð¾Ñ‰Ð½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ: возвращает pk, а еÑли его нет - Ñоздаёт или обновлÑет запиÑÑŒ и вÑÑ‘ равно возвращает
sub
touch(@) {
my
$sub
;
$sub
=
pop
@_
if
ref
$_
[
$#_
] eq
"CODE"
;
my
$pk
= query_id
@_
;
return
$pk
if
defined
$pk
;
view release on metacpan or search on metacpan
lib/Aion/Spirit.pm view on Meta::CPAN
1516171819202122232425#@category ÐÑпект-ориентированное программирование
# Оборачивает функции в пакете в указанную по регулÑрке.
# Ð˜Ð¼Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸ идёт вмеÑте Ñ Ð¿Ð°ÐºÐµÑ‚Ð¾Ð¼
sub
aroundsub($$;$) {
my
(
$pkg
,
$re
,
$around
) =
@_
==3?
@_
: (
scalar
caller
,
@_
);
my
$x
= \%{
"${pkg}::"
};
for
my
$g
(
values
%$x
) {
next
if
ref
\
$g
ne
"GLOB"
;
lib/Aion/Spirit.pm view on Meta::CPAN
view all matches for this distribution
3031323334353637383940
}
}
}
# Оборачивает функцию в другую
sub
wrapsub($$) {
my
(
$sub
,
$around
) =
@_
;
my
$s
=
sub
{
unshift
@_
,
$sub
;
goto
&$around
};
my
$subname
= Sub::Util::subname
$sub
;
view release on metacpan or search on metacpan
lib/Aion/Surf.pm view on Meta::CPAN
33343536373839404142434445464748$ua
->cookie_jar(HTTP::Cookies->new);
# Между вызовами делаем Ñлучайный интервал (Ð´Ð»Ñ Ð³Ñ€Ð°Ð±Ð±Ð¸Ð½Ð³Ð° - чтобы не быть заблокированным за автоматичеÑкие обращениÑ)
our
$SLEEP
= 0;
our
$LAST_REQUEST
= Time::HiRes::
time
();
sub
_sleep(;$) {
Time::HiRes::
sleep
(
rand
+ .5)
if
Time::HiRes::
time
() -
$LAST_REQUEST
< 2;
$LAST_REQUEST
= Time::HiRes::
time
();
}
sub
surf(@) {
my
$method
=
$_
[0] =~ /^(\w+)\z/ ?
shift
:
"GET"
;
my
$url
=
shift
;
my
$headers
;
my
$data
=
ref
$_
[0]?
shift
:
undef
;
$headers
=
$data
,
undef
$data
if
$method
=~ /^(GET|HEAD)\z/n;
lib/Aion/Surf.pm view on Meta::CPAN
147148149150151152153154155156157158159160161162163164sub
head (;$) {
my
$x
=
@_
== 0?
$_
:
shift
; surf
HEAD
=>
ref
$x
? @{
$x
}:
$x
}
sub
get (;$) {
my
$x
=
@_
== 0?
$_
:
shift
; surf
GET
=>
ref
$x
? @{
$x
}:
$x
}
sub
post (@) {
my
$x
=
@_
== 0?
$_
: \
@_
; surf
POST
=>
ref
$x
? @{
$x
}:
$x
}
sub
put (@) {
my
$x
=
@_
== 0?
$_
: \
@_
; surf
PUT
=>
ref
$x
? @{
$x
}:
$x
}
sub
patch(@) {
my
$x
=
@_
== 0?
$_
: \
@_
; surf
PATCH
=>
ref
$x
? @{
$x
}:
$x
}
sub
del (;$) {
my
$x
=
@_
== 0?
$_
:
shift
; surf
DELETE
=>
ref
$x
? @{
$x
}:
$x
}
# ОтправлÑет Ñообщение телеграм
sub
chat_message($$) {
my
(
$chat_id
,
$message
) =
@_
;
my
$ok
= post
"https://api.telegram.org/bot${\ TELEGRAM_BOT_TOKEN}/sendMessage"
,
response
=> \
my
$response
,
json
=> {
chat_id
=>
$chat_id
,
text
=>
$message
,
lib/Aion/Surf.pm view on Meta::CPAN
view all matches for this distribution
174175176177178179180181182183184185186187188189190# ОтправлÑет Ñообщение в телеграм-бот
sub
bot_message(;$) { chat_message TELEGRAM_BOT_CHAT_ID,
@_
== 0?
$_
:
$_
[0] }
# ОтправлÑет Ñообщение в техничеÑкий телеграм канал
sub
tech_message(;$) { chat_message TELEGRAM_BOT_TECH_ID,
@_
== 0?
$_
:
$_
[0] }
# Получает поÑледние ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ‹Ðµ боту
sub
bot_update() {
my
@updates
;
for
(
my
$offset
= 0;;) {
view release on metacpan or search on metacpan
lib/Aion/Telemetry.pm view on Meta::CPAN
4344454647484950515253
$mark
->{interval} +=
$now
-
$REFMARK_LAST_TIME
;
$REFMARK_LAST_TIME
=
$now
;
}
}
sub
refmark(;$) {
my
(
$mark
) =
@_
== 0? (
caller
1)[3]:
@_
;
my
$now
= Time::HiRes::
time
();
$REFMARKS
[
$#REFMARKS
]->{interval} +=
$now
-
$REFMARK_LAST_TIME
if
@REFMARKS
;
$REFMARK_LAST_TIME
=
$now
;
lib/Aion/Telemetry.pm view on Meta::CPAN
view all matches for this distribution
56575859606162636465
bless
\
$mark
,
'Aion::Refmark'
}
# Создаёт отчёт по реперным точкам
sub
refreport(;$) {
my
(
$clean
) =
@_
;
my
@v
=
values
%REFMARK
;
%REFMARK
= (),
undef
$REFMARK_LAST_TIME
if
$clean
;
view release on metacpan or search on metacpan
lib/Aion.pm view on Meta::CPAN
1314151617181920212223# wo - только при уÑтановке
# rw - при выдаче и уcтановке
# no - никогда не проверÑть
sub
export($@);
# КлаÑÑÑ‹ в которых подключён Aion Ñ Ð¼ÐµÑ‚Ð°Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸ÐµÐ¹
our
%META
;
# ВызываетÑÑ Ð¸Ð· другого пакета, Ð´Ð»Ñ Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚Ð° данного
lib/Aion.pm view on Meta::CPAN
525354555657585960616263646566676869707172
eval
"package $pkg; use Aion::Types; 1"
or
die
;
}
# ÐкÑпортирует функции в пакет, еÑли их там ещё нет
sub
export($@) {
my
$pkg
=
shift
;
for
my
$sub
(
@_
) {
my
$can
=
$pkg
->can(
$sub
);
die
"$pkg can $sub!"
if
$can
&&
$can
!= \
&$sub
;
*{
"${pkg}::$sub"
} = \
&$sub
unless
$can
;
}
}
# ÐкÑпортирует функции в пакет, еÑли их там ещё нет
sub
is_aion($) {
my
$pkg
=
shift
;
die
"$pkg is'nt class of Aion!"
if
!
exists
$META
{
$pkg
};
}
#@category Aspects
lib/Aion.pm view on Meta::CPAN
189190191192193194195196197198199
die
"Is DESTROY in Aion class ($cls): not set aion destroy!"
if
$cls
->can(
'DESTROY'
) != \
&destroy
;
}
# РаÑширÑет клаÑÑ Ð¸Ð»Ð¸ роль
sub
inherits($$@) {
my
$pkg
=
shift
;
my
$with
=
shift
;
is_aion
$pkg
;
my
$FEATURE
=
$Aion::META
{
$pkg
}{feature};
lib/Aion.pm view on Meta::CPAN
223224225226227228229230231232233
return
;
}
# ÐаÑледование клаÑÑов
sub
extends
(@) {
my
$pkg
=
caller
;
is_aion
$pkg
;
push
@{
"${pkg}::ISA"
},
@_
;
lib/Aion.pm view on Meta::CPAN
236237238239240241242243244245246
unshift
@_
,
$pkg
, 0;
goto
&inherits
;
}
# РаÑширение ролÑми
sub
with
(@) {
my
$pkg
=
caller
;
is_aion
$pkg
;
push
@{
"${pkg}::ISA"
},
@_
;
lib/Aion.pm view on Meta::CPAN
249250251252253254255256257258259260261262263264265266267268
unshift
@_
,
$pkg
, 1;
goto
&inherits
;
}
# ТребуютÑÑ Ð¿Ð¾Ð´Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹
sub
requires(@) {
my
$pkg
=
caller
;
is_aion
$pkg
;
push
@{
$Aion::META
{
$pkg
}{requires}},
@_
;
return
;
}
# ДобавлÑетÑÑ Ð°Ñпект
sub
aspect($$) {
my
(
$name
,
$sub
) =
@_
;
my
$pkg
=
caller
;
is_aion
$pkg
;
lib/Aion.pm view on Meta::CPAN
view all matches for this distribution
319320321322323324325326327328329
delete
@$self
{
@_
};
$self
}
# Создаёт ÑвойÑтво
sub
has
(@) {
my
$property
=
shift
;
return
exists
$property
->{
$_
[0]}
if
blessed
$property
;
my
$pkg
=
caller
;
view release on metacpan or search on metacpan
script/album view on Meta::CPAN
12121213121412151216121712181219122012211222my
$fmt_medium_page
;
my
$fmt_index_page
;
my
$fmt_journal_page
;
# <<HereDoc helper to retain a nice program layout.
sub
heredoc($$) {
my
(
$doc
,
$indent
) =
@_
;
$indent
=
" "
x
$indent
;
my
$res
=
""
;
foreach
(
split
(/\n/,
$doc
) ) {
my
$line
= detab(
$_
);
script/album view on Meta::CPAN
14691470147114721473147414751476147714781479
</script>
EOD
$js
;
}
sub
button($$;$$) {
my
(
$tag
,
$link
,
$level
,
$active
) =
@_
;
my
$Tag
=
ucfirst
(
$tag
);
$level
= 0
unless
defined
$level
;
$active
= 1
unless
defined
$active
;
script/album view on Meta::CPAN
14831484148514861487148814891490149114921493
my
$b
= img(
"${level}icons/$tag.png"
,
align
=>
"top"
,
border
=> 0,
alt
=>
"[$Tag]"
);
$active
?
"<a class='info' href='$link' alt='[$Tag]'>$b</a>"
:
$b
;
}
sub
ixname($) {
my
(
$x
) =
@_
;
"index"
. (
$x
?
$x
:
""
) .
".html"
;
}
# To aid XHTML compliancy.
script/album view on Meta::CPAN
14961497149814991500150115021503150415051506# Pseudo-smart approach to creating paired single/double quotes.
# Note that the (s-|s\s|t\s) case is specific to the dutch language,
# but probably won't harm other languages...
# Yes, you'll get stupid results with input like rock'n'roll.
sub
fixquotes($) {
my
(
$t
) =
@_
;
# HTML::Entities will already have turned " into " -- undo.
$t
=~ s/\
"
;/"/g;
while
(
$t
=~ /^([^
"]*)"
([^
"]+)"
(.*)/s ) {
script/album view on Meta::CPAN
15211522152315241525152615271528152915301531# Escape sensitive characters in HTML.
# Two variants: one using HTML::Entities, the other a dumber stub.
# If HTML::Entities is available, it will be used.
sub
html($) {
eval
{
# Apply Latin-9 instead of Latin-1.
no
warnings
'once'
;
for
( \
%HTML::Entities::char2entity
) {
script/album view on Meta::CPAN
155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603
fixquotes(
$t
);
}
if
$@;
goto
&html
;
}
sub
htmln($) {
# Escape HTML sensitive characters, and turn newlines into <br>.
my
$t
= html(
shift
);
return
''
unless
$t
;
$t
=~ s/\n+/
$br
/go;
$t
;
}
sub
indent($$) {
# Shift contents to the right so it fits pretty.
my
(
$t
,
$n
) =
@_
;
$n
=
" "
x
$n
;
return
$n
unless
$t
;
$t
= detab(
$t
);
$t
=~ s/\n+$//;
$t
=~ s/\n/\n
$n
/g;
$t
;
}
sub
img($%) {
my
(
$file
,
%atts
) =
@_
;
my
$ret
=
"<img src='"
.
$file
.
"'"
;
foreach
(
sort
(
keys
(
%atts
)) ) {
$ret
.=
" $_='"
.
$atts
{
$_
} .
"'"
;
}
$ret
.
">"
;
}
#### Size helpers.
sub
bytes($) {
my
$t
=
shift
;
return
$t
.
"b"
if
$t
< 10*1024;
return
(
$t
>> 10) .
"kb"
if
$t
< 10*1024*1024;
(
$t
>> 20) .
"Mb"
;
}
sub
size_info($;$) {
my
(
$el
,
$med
) =
@_
;
return
unless
$el
->width;
my
$ret
=
""
;
$ret
.=
$el
->width .
"x"
.
$el
->height
if
$el
->width;
script/album view on Meta::CPAN
16091610161116121613161416151616161716181619
$ret
;
}
#### EXIF helpers.
sub
restyle_exif($) {
my
(
$el
) =
@_
;
my
$ret
=
""
;
my
$v
;
my
$app
=
sub
{
script/album view on Meta::CPAN
16501651165216531654165516561657165816591660
if
$v
=
$el
->Make;
}
#### Caption helpers.
sub
f_caption($) {
my
(
$el
) =
@_
;
my
$s
= htmln(
$el
->dest_name);
if
(
$el
->Make ) {
$s
=
" $s<a href='#' class='info'> <span>"
.
"<table border='1' width='100%'>\n"
.
script/album view on Meta::CPAN
166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691
"</span></a>"
;
}
$s
;
}
sub
s_caption($) {
my
(
$el
) =
@_
;
size_info(
$el
,
$medium
);
}
sub
t_caption($) {
my
(
$el
) =
@_
;
$el
->tag ? htmln(
$el
->tag) :
""
;
}
sub
c_caption($) {
my
(
$el
) =
@_
;
my
$t
=
$el
->description ||
""
;
$t
=~ s/\n.*//;
htmln(
$t
);
}
#### Misc.
sub
update_if_needed($$) {
my
(
$fname
,
$new
) =
@_
;
# Do not overwrite unless modified.
if
( -s
$fname
&& -s _ ==
length
(
$new
) ) {
local
($/);
script/album view on Meta::CPAN
view all matches for this distribution
17031704170517061707170817091710171117121713
$fh
$new
;
close
(
$fh
);
1;
}
sub
uptodate($$) {
my
(
$type
,
$mod
) =
@_
;
if
(
$mod
) {
STDERR (
"(Needed to write "
,
$mod
,
" $type page"
,
$mod
== 1 ?
""
:
"s"
,
")\n"
);
}
view release on metacpan or search on metacpan
inc/Test/More.pm view on Meta::CPAN
view all matches for this distribution
120121122123124125126127128129
return
$tb
->unlike(
@_
);
}
#line 476
sub
cmp_ok($$$;$) {
my
$tb
= Test::More->builder;
return
$tb
->cmp_ok(
@_
);
}
view release on metacpan or search on metacpan
t/01-base.t view on Meta::CPAN
view all matches for this distribution
148149150151152153154155156157158DONE_TESTING:
done_testing;
# XXX temporary function
sub
rand_between_ok(&$$) {
my
(
$block
,
$min
,
$max
,
$name
) =
@_
;
my
@res
;
my
%res
;
for
(1..30) {
my
$res
=
$block
->();
view release on metacpan or search on metacpan
view all matches for this distribution
2728293031323334353637
$DB::single
= 1;
warn
@_
;
};
}
sub
Ok($$) {
@_
=
reverse
@_
;
goto
&ok
}
my
(
$first
,
$a
,
$b
,
$hunks
);
for
my
$pair
(
[
"a b c e h j l m n p"
,
" b c d e f j k l m r s t"
, 9 ],
view release on metacpan or search on metacpan
view all matches for this distribution
2223242526272829303132
$DB::single
= 1;
warn
@_
;
};
}
sub
Ok($$) {
@_
=
reverse
@_
;
goto
&ok
}
my
(
$first
,
$a
,
$b
,
$hunks
);
for
my
$pair
(
[
"a b c e h j l m n p"
,
" b c d e f j k l m r s t"
, 9 ],
view release on metacpan or search on metacpan
lib/Algorithm/Diff.pm view on Meta::CPAN
view all matches for this distribution
540541542543544545546547548549550551552553554555556557558########################################
my
$Root
= __PACKAGE__;
package
Algorithm::Diff::_impl;
use
strict;
sub
_Idx() { 0 }
# $me->[_Idx]: Ref to array of hunk indices
# 1 # $me->[1]: Ref to first sequence
# 2 # $me->[2]: Ref to second sequence
sub
_End() { 3 }
# $me->[_End]: Diff between forward and reverse pos
sub
_Same() { 4 }
# $me->[_Same]: 1 if pos 1 contains unchanged items
sub
_Base() { 5 }
# $me->[_Base]: Added to range's min and max
sub
_Pos() { 6 }
# $me->[_Pos]: Which hunk is currently selected
sub
_Off() { 7 }
# $me->[_Off]: Offset into _Idx for current position
sub
_Min() { -2 }
# Added to _Off to get min instead of max+1
sub
Die
{
Carp::confess(
@_
);
view release on metacpan or search on metacpan
inc/Test/Base.pm view on Meta::CPAN
6465666768697071727374
$default_object
||=
$default_class
->new;
return
$default_object
;
}
my
$import_called
= 0;
sub
import
() {
$import_called
= 1;
my
$class
= (
grep
/^-base$/i,
@_
)
?
scalar
(
caller
)
:
$_
[0];
if
(not
defined
$default_class
) {
inc/Test/Base.pm view on Meta::CPAN
130131132133134135136137138139140141142143144145146147
$caller
=~ s/.*:://;
croak
"Too late to call $caller()"
}
}
sub
find_my_self() {
my
$self
=
ref
(
$_
[0]) eq
$default_class
?
splice
(
@_
, 0, 1)
: default_object();
return
$self
,
@_
;
}
sub
blocks() {
(
my
(
$self
),
@_
) = find_my_self(
@_
);
croak
"Invalid arguments passed to 'blocks'"
if
@_
> 1;
croak
sprintf
(
"'%s' is invalid argument to blocks()"
,
shift
(
@_
))
inc/Test/Base.pm view on Meta::CPAN
164165166167168169170171172173174
}
return
(
@blocks
);
}
sub
next_block() {
(
my
(
$self
),
@_
) = find_my_self(
@_
);
my
$list
=
$self
->_next_list;
if
(
@$list
== 0) {
$list
= [@{
$self
->block_list},
undef
];
$self
->_next_list(
$list
);
inc/Test/Base.pm view on Meta::CPAN
178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
$block
->run_filters;
}
return
$block
;
}
sub
first_block() {
(
my
(
$self
),
@_
) = find_my_self(
@_
);
$self
->_next_list([]);
$self
->next_block;
}
sub
filters_delay() {
(
my
(
$self
),
@_
) = find_my_self(
@_
);
$self
->_filters_delay(
defined
$_
[0] ?
shift
: 1);
}
sub
no_diag_on_only() {
(
my
(
$self
),
@_
) = find_my_self(
@_
);
$self
->_no_diag_on_only(
defined
$_
[0] ?
shift
: 1);
}
sub
delimiters() {
(
my
(
$self
),
@_
) = find_my_self(
@_
);
$self
->check_late;
my
(
$block_delimiter
,
$data_delimiter
) =
@_
;
$block_delimiter
||=
$self
->block_delim_default;
$data_delimiter
||=
$self
->data_delim_default;
$self
->block_delim(
$block_delimiter
);
$self
->data_delim(
$data_delimiter
);
return
$self
;
}
sub
spec_file() {
(
my
(
$self
),
@_
) = find_my_self(
@_
);
$self
->check_late;
$self
->_spec_file(
shift
);
return
$self
;
}
sub
spec_string() {
(
my
(
$self
),
@_
) = find_my_self(
@_
);
$self
->check_late;
$self
->_spec_string(
shift
);
return
$self
;
}
sub
filters() {
(
my
(
$self
),
@_
) = find_my_self(
@_
);
if
(
ref
(
$_
[0]) eq
'HASH'
) {
$self
->_filters_map(
shift
);
}
else
{
inc/Test/Base.pm view on Meta::CPAN
231232233234235236237238239240241242243244245246247248249250251
push
@$filters
,
@_
;
}
return
$self
;
}
sub
filter_arguments() {
$Test::Base::Filter::arguments
;
}
sub
have_text_diff {
$Text::Diff::VERSION
>= 0.35 &&
$Algorithm::Diff::VERSION
>= 1.15;
}
sub
is($$;$) {
(
my
(
$self
),
@_
) = find_my_self(
@_
);
my
(
$actual
,
$expected
,
$name
) =
@_
;
local
$Test::Builder::Level
=
$Test::Builder::Level
+ 1;
if
(
$ENV
{TEST_SHOW_NO_DIFFS} or
not
defined
$actual
or
inc/Test/Base.pm view on Meta::CPAN
261262263264265266267268269270271
ok
$actual
eq
$expected
,
$name
.
"\n"
. Text::Diff::diff(\
$expected
, \
$actual
);
}
}
sub
run(&;$) {
(
my
(
$self
),
@_
) = find_my_self(
@_
);
my
$callback
=
shift
;
for
my
$block
(@{
$self
->block_list}) {
$block
->run_filters
unless
$block
->is_filtered;
&{
$callback
}(
$block
);
inc/Test/Base.pm view on Meta::CPAN
291292293294295296297298299300301sub
END {
run_compare()
unless
$Have_Plan
or
$DIED
or not
$import_called
;
}
sub
run_compare() {
(
my
(
$self
),
@_
) = find_my_self(
@_
);
$self
->_assert_plan;
my
(
$x
,
$y
) =
$self
->_section_names(
@_
);
local
$Test::Builder::Level
=
$Test::Builder::Level
+ 1;
for
my
$block
(@{
$self
->block_list}) {
inc/Test/Base.pm view on Meta::CPAN
313314315316317318319320321322323
is(
$block
->
$x
,
$block
->
$y
,
$block
->name ?
$block
->name : ());
}
}
}
sub
run_is() {
(
my
(
$self
),
@_
) = find_my_self(
@_
);
$self
->_assert_plan;
my
(
$x
,
$y
) =
$self
->_section_names(
@_
);
local
$Test::Builder::Level
=
$Test::Builder::Level
+ 1;
for
my
$block
(@{
$self
->block_list}) {
inc/Test/Base.pm view on Meta::CPAN
327328329330331332333334335336337
$block
->name ?
$block
->name : ()
);
}
}
sub
run_is_deeply() {
(
my
(
$self
),
@_
) = find_my_self(
@_
);
$self
->_assert_plan;
my
(
$x
,
$y
) =
$self
->_section_names(
@_
);
for
my
$block
(@{
$self
->block_list}) {
next
unless
exists
(
$block
->{
$x
}) and
exists
(
$block
->{
$y
});
inc/Test/Base.pm view on Meta::CPAN
340341342343344345346347348349350
$block
->name ?
$block
->name : ()
);
}
}
sub
run_like() {
(
my
(
$self
),
@_
) = find_my_self(
@_
);
$self
->_assert_plan;
my
(
$x
,
$y
) =
$self
->_section_names(
@_
);
for
my
$block
(@{
$self
->block_list}) {
next
unless
exists
(
$block
->{
$x
}) and
defined
(
$y
);
inc/Test/Base.pm view on Meta::CPAN
354355356357358359360361362363364
$block
->name ?
$block
->name : ()
);
}
}
sub
run_unlike() {
(
my
(
$self
),
@_
) = find_my_self(
@_
);
$self
->_assert_plan;
my
(
$x
,
$y
) =
$self
->_section_names(
@_
);
for
my
$block
(@{
$self
->block_list}) {
next
unless
exists
(
$block
->{
$x
}) and
defined
(
$y
);
inc/Test/Base.pm view on Meta::CPAN
480481482483484485486487488489490
};
}
return
$spec
;
}
sub
_strict_warnings() {
my
$done
= 0;
Filter::Util::Call::filter_add(
sub
{
return
0
if
$done
;
inc/Test/Base.pm view on Meta::CPAN
502503504505506507508509510511
$done
= 1;
}
);
}
sub
tie_output() {
my
$handle
=
shift
;
die
"No buffer to tie"
unless
@_
;
tie
$handle
,
'Test::Base::Handle'
,
$_
[0];
}
inc/Test/Base.pm view on Meta::CPAN
514515516517518519520521522523524
$ENV
{TEST_SHOW_NO_DIFFS} = 1;
}
package
Test::Base::Handle;
sub
TIEHANDLE() {
my
$class
=
shift
;
bless
\
$_
[0],
$class
;
}
sub
PRINT {
inc/Test/Base.pm view on Meta::CPAN
view all matches for this distribution
537538539540541542543544545546547sub
AUTOLOAD {
return
;
}
sub
block_accessor() {
my
$accessor
=
shift
;
no
strict
'refs'
;
return
if
defined
&$accessor
;
*$accessor
=
sub
{
my
$self
=
shift
;
view release on metacpan or search on metacpan
lib/Algorithm/Evolutionary/Individual/Base.pm view on Meta::CPAN
view all matches for this distribution
224225226227228229230231232233
eventually. Returns a meaningful size; but should be reimplemented
by siblings
=cut
sub size() {
croak "To be implemented in derived classes!";
}
=head1 Known subclasses
view release on metacpan or search on metacpan
t/00_load.t view on Meta::CPAN
view all matches for this distribution
7891011121314151617my
$fec
= new Algorithm::FEC 3, 5, 70;
my
$test
= 0;
sub
ok($) {
$test
++;
$_
[0] ?
"ok $test\n"
:
"not ok $test\n"
;
}
my
@files
=
map
{
view release on metacpan or search on metacpan
inc/Test/More.pm view on Meta::CPAN
view all matches for this distribution
120121122123124125126127128129
return
$tb
->unlike(
@_
);
}
#line 476
sub
cmp_ok($$$;$) {
my
$tb
= Test::More->builder;
return
$tb
->cmp_ok(
@_
);
}
view release on metacpan or search on metacpan
inc/Test/More.pm view on Meta::CPAN
120121122123124125126127128129
return
$tb
->unlike(
@_
);
}
#line 471
sub
cmp_ok($$$;$) {
my
$tb
= Test::More->builder;
return
$tb
->cmp_ok(
@_
);
}
inc/Test/More.pm view on Meta::CPAN
view all matches for this distribution
247248249250251252253254255256257
return
$obj
;
}
#line 719
sub
subtest($&) {
my
(
$name
,
$subtests
) =
@_
;
my
$tb
= Test::More->builder;
return
$tb
->subtest(
@_
);
}
view release on metacpan or search on metacpan
lib/Algorithm/Heapify/XS.pm view on Meta::CPAN
view all matches for this distribution
38394041424344454647484950515253545556our
$VERSION
=
'0.04'
;
require
XSLoader;
XSLoader::load(
'Algorithm::Heapify::XS'
,
$VERSION
);
sub
heap_parent_idx($) {
die
"index must be non-negative"
if
$_
[0] < 0;
return
$_
[0] ?
int
((
$_
[0] - 1) / 2) :
undef
;
}
sub
heap_left_child_idx($) {
die
"index must be non-negative"
if
$_
[0] < 0;
return
2
*$_
[0]+1;
}
sub
heap_right_child_idx($) {
die
"index must be non-negative"
if
$_
[0] < 0;
return
2
*$_
[0]+2;
}
view release on metacpan or search on metacpan
t/encode_bitstring.t view on Meta::CPAN
view all matches for this distribution
1011121314151617181920sub
myrand($) {
return
int
(
rand
(
int
rand
shift
() ) + 1 );
}
# Create a random counting
my
%counting
=
map
{ random_string(
'c'
x myrand MAX_SUBSTRING_LENGTH)
view release on metacpan or search on metacpan
inc/Test/More.pm view on Meta::CPAN
120121122123124125126127128129
return
$tb
->unlike(
@_
);
}
#line 471
sub
cmp_ok($$$;$) {
my
$tb
= Test::More->builder;
return
$tb
->cmp_ok(
@_
);
}
inc/Test/More.pm view on Meta::CPAN
view all matches for this distribution
247248249250251252253254255256257
return
$obj
;
}
#line 736
sub
subtest($&) {
my
(
$name
,
$subtests
) =
@_
;
my
$tb
= Test::More->builder;
return
$tb
->subtest(
@_
);
}