Devel-IPerl

 view release on metacpan or  search on metacpan

lib/Devel/IPerl/Kernel/Callback/REPL.pm  view on Meta::CPAN

	### Send back warnings
	if( defined $exec_result->warning ) {
		# send back exception
		my $err = $msg->new_reply_to(
			msg_type => 'error',
			content => {
				ename => $exec_result->warning_name,
				evalue => "@{[ $exec_result->warning_value ]}", # must be string
				traceback => $exec_result->warning_traceback,
			}
		);
		$kernel->send_message( $kernel->iopub, $err );
	}

	### Send back errors
	if( defined $exec_result->error ) {
		# send back exception
		my $err = $msg->new_reply_to(
			msg_type => 'error',
			content => {
				ename => $exec_result->exception_name,
				evalue => "@{[ $exec_result->exception_value ]}", # must be string
				traceback => $exec_result->exception_traceback,
			}
		);
		$kernel->send_message( $kernel->iopub, $err );
	}

	$exec_result;
}

sub display_data {
	my ($self, @data) = @_;
	my $msg = $IPerl::current_msg;
	my $kernel = $IPerl::current_kernel;
	for my $data (@data) {
		my $data_formats = Devel::IPerl::DisplayableHandler->display_data_format_handler( $data );
		if( defined $data_formats ) {
			my $display_data_msg = $msg->new_reply_to(
				msg_type => 'display_data',
				content => {
					data => $data_formats,
					metadata => {},
				},
				metadata => {},
			);
			$kernel->send_message( $kernel->iopub, $display_data_msg );
		}
	}
}

sub display_data_from_exec_result {
	my ($self, $kernel, $msg, $exec_result) = @_;
	$self->display_data( @{ $exec_result->results || [] } );
}


sub msg_execute_request {
	my ($self, $kernel, $msg ) = @_;

	### send kernel status : busy
	my $status_busy = Devel::IPerl::Message::Helper->kernel_status( $msg, 'busy' );
	$log->tracef('send kernel status: %s', 'busy');
	$kernel->send_message( $kernel->iopub, $status_busy );

	### Send back execution status
	my $exec_result = $self->execute( $kernel, $msg );
	$self->execute_reply( $kernel, $msg, $exec_result );

	### send kernel status : idle
	my $status_idle = Devel::IPerl::Message::Helper->kernel_status( $msg, 'idle' );
	$log->tracef('send kernel status: %s', 'idle');
	$kernel->send_message( $kernel->iopub, $status_idle );
}

sub execute_reply {
	my ($self, $kernel, $msg, $exec_result) = @_;
	$log->tracef('send back execution result: %s', $exec_result);
	my %extra_fields;
	if( $exec_result->is_status_ok ) {
		%extra_fields = (
			payload => [],
			user_variables => {},
			user_expressions => {},
		);
	} elsif( $exec_result->is_status_error ) {
		my @ename;
		my @evalue;
		my @traceback;
		if( $exec_result->warning_name ) {
			push @ename, $exec_result->warning_name;
			push @evalue, $exec_result->warning_value;
			push @traceback, @{ $exec_result->warning_traceback };
		}
		if( $exec_result->error ) {
			push @ename, $exec_result->exception_name;
			push @evalue, $exec_result->exception_value;
			push @traceback, @{ $exec_result->exception_traceback };
		}
		%extra_fields = (
			ename => (join " ", @ename),
			evalue => (join "\n", @evalue), # must be string
			traceback => \@traceback,
		);
	}
	my $execute_reply = $msg->new_reply_to(
		msg_type => 'execute_reply',
		content => {
			status => $exec_result->status,
			execution_count => $self->execution_count,
			%extra_fields,
		}
	);
	$kernel->send_message( $kernel->shell, $execute_reply );
}

sub msg_complete_request {
	my ($self, $kernel, $msg, $socket ) = @_;

	### send kernel status : busy
	my $status_busy = Devel::IPerl::Message::Helper->kernel_status( $msg, 'busy' );
	$kernel->send_message( $kernel->iopub, $status_busy );

	my $code = $msg->content->{code};
	my $cursor_pos = $msg->content->{cursor_pos};

	my @matches = ();
	my $metadata = {};
	my ($status, $cursor_start, $cursor_end);
	my $matched_text = "";
	if( $self->backend->can('completion') ) {
		try {
			@matches = $self->backend->completion( $code, $cursor_pos );
			$cursor_start = $cursor_pos;
			my $len = 0;
			if( @matches ) {
				my $line_end = substr $msg->content->{code}, 0, $cursor_pos;
				my $first_match = $matches[0];
				my $first_match_len = length $first_match;
				for my $z ( reverse 0..$first_match_len ) {
					my $suffix = substr $line_end, -$z;
					my $prefix = substr $first_match, 0, $z;
					if( $suffix eq $prefix ) {
						$cursor_start = $cursor_pos - $z;
						$len = $z;
						last;
					}
				}
				$matched_text = substr($msg->content->{code}, $cursor_start, $len)
			}
			$cursor_end = $cursor_pos;
			$status = 'ok';
		} catch {
			$status = $_;
		};
	} else {
		$cursor_start = $cursor_pos;
		$cursor_end = $cursor_pos;
		$matched_text = "";
		$status = 'ok';
	}
	my $content = {
		status => $status,
		cursor_start => $cursor_start,
		cursor_end => $cursor_end,
		metadata => $metadata,
		#matched_text => $matched_text,
		matches => \@matches,
	};
	my $complete_reply = $msg->new_reply_to(
		msg_type => 'complete_reply',
		content => $content,
	);
	#use DDP; p $complete_reply;
	$kernel->send_message( $kernel->shell, $complete_reply );

	### send kernel status : idle
	my $status_idle = Devel::IPerl::Message::Helper->kernel_status( $msg, 'idle' );
	$kernel->send_message( $kernel->iopub, $status_idle );
}

sub msg_is_complete_request {
    my ($self, $kernel, $msg, $socket ) = @_;

    ### send kernel status : busy
    my $status_busy = Devel::IPerl::Message::Helper->kernel_status( $msg, 'busy' );
    $kernel->send_message( $kernel->iopub, $status_busy );

    my $content;
    if ($self->backend->is_complete( $msg->{content}{code} )) {
        $content = {
            status => 'complete',
        };
    } else {
        $content = {
            status => 'incomplete',
            indent => '',
        };
    }
    my $is_complete_reply = $msg->new_reply_to(
        msg_type => 'is_complete_reply',
        content => $content,
    );
    $kernel->send_message( $kernel->shell, $is_complete_reply );

    ### send kernel status : idle
    my $status_idle = Devel::IPerl::Message::Helper->kernel_status( $msg, 'idle' );
    $kernel->send_message( $kernel->iopub, $status_idle );
}


1;

__END__

=pod

=encoding UTF-8

=head1 NAME

Devel::IPerl::Kernel::Callback::REPL

=head1 VERSION

version 0.012

=head1 AUTHOR

Zakariyya Mughal <zmughal@cpan.org>

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2014 by Zakariyya Mughal.

This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.

=cut



( run in 0.692 second using v1.01-cache-2.11-cpan-98e64b0badf )