aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordakkar <dakkar@thenautilus.net>2023-02-28 11:03:28 +0000
committerdakkar <dakkar@thenautilus.net>2023-02-28 11:03:28 +0000
commit8acdf4ee8df09dac893c95fc1e1cac3a0966ad62 (patch)
tree35ce0e455fe12be86b759d462080b7b195ffc66a
parentv1.0.5 (diff)
downloadSietima-8acdf4ee8df09dac893c95fc1e1cac3a0966ad62.tar.gz
Sietima-8acdf4ee8df09dac893c95fc1e1cac3a0966ad62.tar.bz2
Sietima-8acdf4ee8df09dac893c95fc1e1cac3a0966ad62.zip
port to 5.36
* even more signatures * use latest `Type::Params` API
-rw-r--r--lib/Sietima.pm26
-rw-r--r--lib/Sietima/HeaderURI.pm26
-rw-r--r--lib/Sietima/MailStore/FS.pm56
-rw-r--r--lib/Sietima/Policy.pm8
-rw-r--r--lib/Sietima/Role/SubscriberOnly.pm8
-rw-r--r--lib/Sietima/Subscriber.pm13
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<send_message> >>.
=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<envelope|Sietima::Message/envelope> 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<subject> and C<body>. 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<header_raw_set>|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->@*;
}