From 8acdf4ee8df09dac893c95fc1e1cac3a0966ad62 Mon Sep 17 00:00:00 2001 From: dakkar Date: Tue, 28 Feb 2023 11:03:28 +0000 Subject: port to 5.36 * even more signatures * use latest `Type::Params` API --- lib/Sietima.pm | 26 ++++++++++++------ lib/Sietima/HeaderURI.pm | 26 +++++++----------- lib/Sietima/MailStore/FS.pm | 56 +++++++++++++++++++++++++------------- lib/Sietima/Policy.pm | 8 ++---- lib/Sietima/Role/SubscriberOnly.pm | 8 ++++-- lib/Sietima/Subscriber.pm | 13 ++++----- 6 files changed, 78 insertions(+), 59 deletions(-) diff --git a/lib/Sietima.pm b/lib/Sietima.pm index 9115c05..59fe7bc 100644 --- a/lib/Sietima.pm +++ b/lib/Sietima.pm @@ -2,7 +2,7 @@ package Sietima; use Moo; use Sietima::Policy; use Types::Standard qw(ArrayRef Object FileHandle Maybe); -use Type::Params qw(compile); +use Type::Params -sigs; use Sietima::Types qw(Address AddressFromStr EmailMIME Message Subscriber SubscriberFromAddress SubscriberFromStr SubscriberFromHashRef @@ -163,9 +163,11 @@ then sends each of them by calling L<< /C >>. =cut +signature_for handle_mail => ( + method => Object, + positional => [ EmailMIME ], +); sub handle_mail($self,$incoming_mail) { - state $check = compile(Object,EmailMIME); $check->(@_); - my (@outgoing_messages) = $self->munge_mail($incoming_mail); for my $outgoing_message (@outgoing_messages) { $self->send_message($outgoing_message); @@ -187,9 +189,11 @@ some subscribers. =cut +signature_for subscribers_to_send_to => ( + method => Object, + positional => [ EmailMIME ], +); sub subscribers_to_send_to($self,$incoming_mail) { - state $check = compile(Object,EmailMIME); $check->(@_); - return $self->subscribers; } @@ -209,9 +213,11 @@ this method to alter the message. =cut +signature_for munge_mail => ( + method => Object, + positional => [ EmailMIME ], +); sub munge_mail($self,$incoming_mail) { - state $check = compile(Object,EmailMIME); $check->(@_); - return Sietima::Message->new({ mail => $incoming_mail, from => $self->return_path, @@ -229,9 +235,11 @@ L specifies some recipients. =cut +signature_for send_message => ( + method => Object, + positional => [ Message ], +); sub send_message($self,$outgoing_message) { - state $check = compile(Object,Message); $check->(@_); - my $envelope = $outgoing_message->envelope; if ($envelope->{to} && $envelope->{to}->@*) { $self->transport->send( diff --git a/lib/Sietima/HeaderURI.pm b/lib/Sietima/HeaderURI.pm index 347ca77..2196724 100644 --- a/lib/Sietima/HeaderURI.pm +++ b/lib/Sietima/HeaderURI.pm @@ -3,7 +3,7 @@ use Moo; use Sietima::Policy; use Sietima::Types qw(Address AddressFromStr is_Address); use Types::Standard qw(Str is_Str ClassName HashRef Optional); -use Type::Params qw(compile); +use Type::Params -sigs; use Types::URI qw(Uri is_Uri); use Email::Address; use namespace::clean; @@ -101,10 +101,7 @@ preserved. =cut -sub _args_from_address { - my ($address, $query) = @_; - $query ||= {}; - +sub _args_from_address($address, $query={}) { my $uri = URI->new($address->address,'mailto'); $uri->query_form($query->%*); @@ -119,8 +116,7 @@ sub _args_from_address { }; } -around BUILDARGS => sub { - my ($orig, $class, @args) = @_; +around BUILDARGS => sub($orig, $class, @args) { if (@args != 1 or ref($args[0]) eq 'HASH' and $args[0]->{uri}) { return $class->$orig(@args); } @@ -158,14 +154,14 @@ Common query keys are C and C. See RFC 6068 ("The =cut -sub new_from_address { - state $check = compile( - ClassName, +signature_for new_from_address => ( + method => Str, + positional => [ Address->plus_coercions(AddressFromStr), Optional[HashRef], - ); - my ($class, $address, $query) = $check->(@_); - + ], +); +sub new_from_address($class, $address, $query={}) { return $class->new(_args_from_address($address,$query)); } @@ -196,9 +192,7 @@ C|Email::Simple::Header/header_raw_set >>. =cut -sub as_header_raw { - my ($self) = @_; - +sub as_header_raw($self) { my $str = sprintf '<%s>',$self->uri; if (my $c = $self->comment) { $str .= sprintf ' (%s)',$c; diff --git a/lib/Sietima/MailStore/FS.pm b/lib/Sietima/MailStore/FS.pm index c429dfd..9a77c3c 100644 --- a/lib/Sietima/MailStore/FS.pm +++ b/lib/Sietima/MailStore/FS.pm @@ -2,8 +2,8 @@ package Sietima::MailStore::FS; use Moo; use Sietima::Policy; use Types::Path::Tiny qw(Dir); -use Types::Standard qw(Object ArrayRef Str slurpy); -use Type::Params qw(compile); +use Types::Standard qw(Object ArrayRef Str Slurpy); +use Type::Params -sigs; use Sietima::Types qw(EmailMIME TagName); use Digest::SHA qw(sha1_hex); use namespace::clean; @@ -72,15 +72,21 @@ get the same identifier. =cut -sub store($self,$mail,@tags) { - state $check = compile(Object,EmailMIME,slurpy ArrayRef[TagName]);$check->(@_); +signature_for store => ( + method => Object, + positional => [ + EmailMIME, + Slurpy[ArrayRef[TagName]], + ], +); +sub store($self,$mail,$tags) { my $str = $mail->as_string; my $id = sha1_hex($str); $self->_msgdir->child($id)->spew_raw($str); - $self->_tagdir->child($_)->append("$id\n") for @tags; + $self->_tagdir->child($_)->append("$id\n") for $tags->@*; return $id; } @@ -98,9 +104,11 @@ list context. =cut +signature_for retrieve_by_id => ( + method => Object, + positional => [ Str ], +); sub retrieve_by_id($self,$id) { - state $check = compile(Object,Str);$check->(@_); - my $msg_path = $self->_msgdir->child($id); return unless -e $msg_path; return Email::MIME->new($msg_path->slurp_raw); @@ -126,13 +134,17 @@ sub _tagged_by($self,$tag) { return $tag_file->lines({chomp=>1}); } -sub retrieve_ids_by_tags($self,@tags) { - state $check = compile(Object,slurpy ArrayRef[TagName]);$check->(@_); - +signature_for retrieve_ids_by_tags => ( + method => Object, + positional => [ + Slurpy[ArrayRef[TagName]], + ], +); +sub retrieve_ids_by_tags($self,$tags) { # this maps: id -> how many of the given @tags it has my %msgs; - if (@tags) { - for my $tag (@tags) { + if ($tags->@*) { + for my $tag ($tags->@*) { $_++ for @msgs{$self->_tagged_by($tag)}; } } @@ -144,7 +156,7 @@ sub retrieve_ids_by_tags($self,@tags) { for my $id (keys %msgs) { # if this message id does not have all the required tags, we # won't return it - next unless $msgs{$id} == @tags; + next unless $msgs{$id} == $tags->@*; push @ret, $id; } return \@ret; @@ -164,11 +176,15 @@ returns an arrayref of hashrefs like: =cut -sub retrieve_by_tags($self,@tags) { - state $check = compile(Object,slurpy ArrayRef[TagName]);$check->(@_); - +signature_for retrieve_by_tags => ( + method => Object, + positional => [ + Slurpy[ArrayRef[TagName]], + ], +); +sub retrieve_by_tags($self,$tags) { my @ret; - for my $id ($self->retrieve_ids_by_tags(@tags)->@*) { + for my $id ($self->retrieve_ids_by_tags($tags->@*)->@*) { push @ret, { id => $id, mail => $self->retrieve_by_id($id), @@ -187,9 +203,11 @@ from disk. Removing a non-existent message does nothing. =cut +signature_for remove => ( + method => Object, + positional => [ Str ], +); sub remove($self,$id) { - state $check = compile(Object,Str);$check->(@_); - for my $tag_file ($self->_tagdir->children) { $tag_file->edit_lines( sub { $_='' if /\A\Q$id\E\n?\z/ } ); } diff --git a/lib/Sietima/Policy.pm b/lib/Sietima/Policy.pm index 73af98e..a2c1dcf 100644 --- a/lib/Sietima/Policy.pm +++ b/lib/Sietima/Policy.pm @@ -1,9 +1,8 @@ package Sietima::Policy; -use 5.024; +use v5.36; use strict; use warnings; -use feature ':5.24'; -use experimental 'signatures'; +use feature ':5.36'; # VERSION # ABSTRACT: pragma for Sietima modules @@ -32,8 +31,7 @@ sub import { # so no need for import::into strict->import; warnings->import; - experimental->import('signatures'); - feature->import(':5.24'); + feature->import(':5.36'); return; } diff --git a/lib/Sietima/Role/SubscriberOnly.pm b/lib/Sietima/Role/SubscriberOnly.pm index 6524d39..bf845f7 100644 --- a/lib/Sietima/Role/SubscriberOnly.pm +++ b/lib/Sietima/Role/SubscriberOnly.pm @@ -4,7 +4,7 @@ use Sietima::Policy; use Email::Address; use List::AllUtils qw(any); use Types::Standard qw(Object CodeRef); -use Type::Params qw(compile); +use Type::Params -sigs; use namespace::clean; # VERSION @@ -79,9 +79,11 @@ modifications. =cut +signature_for ignoring_subscriberonly => ( + method => Object, + positional => [ CodeRef ], +); sub ignoring_subscriberonly($self,$code) { - state $check = compile(Object,CodeRef); $check->(@_); - local $let_it_pass = 1; return $code->($self); } diff --git a/lib/Sietima/Subscriber.pm b/lib/Sietima/Subscriber.pm index b62e44f..606f61d 100644 --- a/lib/Sietima/Subscriber.pm +++ b/lib/Sietima/Subscriber.pm @@ -2,7 +2,7 @@ package Sietima::Subscriber; use Moo; use Sietima::Policy; use Types::Standard qw(ArrayRef HashRef Object); -use Type::Params qw(compile); +use Type::Params -sigs; use Sietima::Types qw(Address AddressFromStr); use Email::Address; use List::AllUtils qw(any); @@ -87,12 +87,11 @@ a subscriber. =cut -sub match { - # we can't use the sub signature here, because we need the - # coercion - state $check = compile(Object,Address->plus_coercions(AddressFromStr)); - my ($self,$addr) = $check->(@_); - +signature_for match => ( + method => Object, + positional => [ Address->plus_coercions(AddressFromStr) ], +); +sub match($self,$addr) { return any { $addr->address eq $_->address } $self->primary, $self->aliases->@*; } -- cgit v1.2.3