fixing the utf8 handling for files
Stevan Little [Tue, 23 Oct 2007 18:34:47 +0000 (18:34 +0000)]
Changes
lib/MooseX/Storage/Engine/IO/AtomicFile.pm
lib/MooseX/Storage/Engine/IO/File.pm
t/104_io_w_utf8.t [new file with mode: 0644]
t/105_io_atomic_w_utf8.t [new file with mode: 0644]

diff --git a/Changes b/Changes
index ef1400c..42246ab 100644 (file)
--- a/Changes
+++ b/Changes
@@ -3,6 +3,11 @@ Revision history for MooseX-Storage
 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
index 6c58228..fc081df 100644 (file)
@@ -2,9 +2,10 @@
 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';
@@ -13,6 +14,7 @@ sub store {
        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: $!";
index eb92a04..02d1bcd 100644 (file)
@@ -2,9 +2,10 @@
 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' => (
@@ -24,6 +25,7 @@ sub store {
        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;
 }
 
diff --git a/t/104_io_w_utf8.t b/t/104_io_w_utf8.t
new file mode 100644 (file)
index 0000000..39753ad
--- /dev/null
@@ -0,0 +1,80 @@
+#!/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;
diff --git a/t/105_io_atomic_w_utf8.t b/t/105_io_atomic_w_utf8.t
new file mode 100644 (file)
index 0000000..8b5678c
--- /dev/null
@@ -0,0 +1,80 @@
+#!/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;