0.09
* MooseX::Storage::Util
- added support to deal with utf8 strings correctly
+
+ * MooseX::Storage::Engine::File
+ MooseX::Storage::Engine::AtomicFile
+ - fixed utf8 handling when storing string
+ - added tests for this
* t/
- added a test for the utf8 handling
package MooseX::Storage::Engine::IO::AtomicFile;
use Moose;
+use utf8 ();
use IO::AtomicFile;
-our $VERSION = '0.02';
+our $VERSION = '0.03';
our $AUTHORITY = 'cpan:STEVAN';
extends 'MooseX::Storage::Engine::IO::File';
my ($self, $data) = @_;
my $fh = IO::AtomicFile->new($self->file, 'w')
|| confess "Unable to open file (" . $self->file . ") for storing : $!";
+ $fh->binmode(':utf8') if utf8::is_utf8($data);
print $fh $data;
$fh->close()
|| confess "Could not write atomic file (" . $self->file . ") because: $!";
package MooseX::Storage::Engine::IO::File;
use Moose;
+use utf8 ();
use IO::File;
-our $VERSION = '0.02';
+our $VERSION = '0.03';
our $AUTHORITY = 'cpan:STEVAN';
has 'file' => (
my ($self, $data) = @_;
my $fh = IO::File->new($self->file, 'w')
|| confess "Unable to open file (" . $self->file . ") for storing : $!";
+ $fh->binmode(':utf8') if utf8::is_utf8($data);
print $fh $data;
}
--- /dev/null
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use Test::More;
+
+BEGIN {
+ # NOTE:
+ # this is because JSON::XS is
+ # the only one which really gets
+ # utf8 correct
+ # - SL
+ BEGIN {
+ $ENV{JSON_ANY_ORDER} = qw(XS);
+ $ENV{JSON_ANY_CONFIG} = "utf8=1";
+ }
+ plan tests => 8;
+ use_ok('MooseX::Storage');
+}
+
+use utf8;
+
+{
+ package Foo;
+ use Moose;
+ use MooseX::Storage;
+
+ with Storage( 'format' => 'JSON', 'io' => 'File' );
+
+ has 'utf8_string' => (
+ is => 'rw',
+ isa => 'Str',
+ default => sub { "ネットスーパー (Internet Shopping)" }
+ );
+}
+
+my $file = 'temp.json';
+
+{
+ my $foo = Foo->new;
+ isa_ok( $foo, 'Foo' );
+
+ $foo->store($file);
+}
+
+{
+ my $foo = Foo->load($file);
+ isa_ok($foo, 'Foo');
+
+ is($foo->utf8_string,
+ "ネットスーパー (Internet Shopping)",
+ '... got the string we expected');
+}
+
+no utf8;
+
+unlink $file;
+
+{
+ my $foo = Foo->new(
+ utf8_string => 'Escritório'
+ );
+ isa_ok( $foo, 'Foo' );
+
+ $foo->store($file);
+}
+
+{
+ my $foo = Foo->load($file);
+ isa_ok($foo, 'Foo');
+
+ ok(utf8::is_utf8($foo->utf8_string), '... the string is still utf8');
+
+ is($foo->utf8_string,
+ "Escritório",
+ '... got the string we expected');
+}
+
+unlink $file;
--- /dev/null
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use Test::More;
+
+BEGIN {
+ # NOTE:
+ # this is because JSON::XS is
+ # the only one which really gets
+ # utf8 correct
+ # - SL
+ BEGIN {
+ $ENV{JSON_ANY_ORDER} = qw(XS);
+ $ENV{JSON_ANY_CONFIG} = "utf8=1";
+ }
+ plan tests => 8;
+ use_ok('MooseX::Storage');
+}
+
+use utf8;
+
+{
+ package Foo;
+ use Moose;
+ use MooseX::Storage;
+
+ with Storage( 'format' => 'JSON', 'io' => 'AtomicFile' );
+
+ has 'utf8_string' => (
+ is => 'rw',
+ isa => 'Str',
+ default => sub { "ネットスーパー (Internet Shopping)" }
+ );
+}
+
+my $file = 'temp.json';
+
+{
+ my $foo = Foo->new;
+ isa_ok( $foo, 'Foo' );
+
+ $foo->store($file);
+}
+
+{
+ my $foo = Foo->load($file);
+ isa_ok($foo, 'Foo');
+
+ is($foo->utf8_string,
+ "ネットスーパー (Internet Shopping)",
+ '... got the string we expected');
+}
+
+no utf8;
+
+unlink $file;
+
+{
+ my $foo = Foo->new(
+ utf8_string => 'Escritório'
+ );
+ isa_ok( $foo, 'Foo' );
+
+ $foo->store($file);
+}
+
+{
+ my $foo = Foo->load($file);
+ isa_ok($foo, 'Foo');
+
+ ok(utf8::is_utf8($foo->utf8_string), '... the string is still utf8');
+
+ is($foo->utf8_string,
+ "Escritório",
+ '... got the string we expected');
+}
+
+unlink $file;