@@ -707,6 +707,61 @@ def test_copy(self):
707707 dialect = csv .get_dialect (name )
708708 self .assertRaises (TypeError , copy .copy , dialect )
709709
710+ def test_replace (self ):
711+ dialect = csv .get_dialect ('excel' )
712+ new = copy .replace (dialect , delimiter = ';' , strict = True )
713+ self .assertIsInstance (new , type (dialect ))
714+ self .assertEqual (new .delimiter , ';' )
715+ self .assertTrue (new .strict )
716+ # Not replaced parameters are inherited from the original dialect.
717+ self .assertEqual (new .quotechar , dialect .quotechar )
718+ self .assertEqual (new .escapechar , dialect .escapechar )
719+ self .assertEqual (new .lineterminator , dialect .lineterminator )
720+ self .assertEqual (new .quoting , dialect .quoting )
721+ self .assertEqual (new .doublequote , dialect .doublequote )
722+ self .assertEqual (new .skipinitialspace , dialect .skipinitialspace )
723+ # The original dialect is left unchanged.
724+ self .assertEqual (dialect .delimiter , ',' )
725+ self .assertFalse (dialect .strict )
726+ self .assertEqual (list (csv .reader (['a;b' ], new )), [['a' , 'b' ]])
727+
728+ self .assertIs (copy .replace (dialect ), dialect )
729+ self .assertRaises (TypeError , copy .replace , dialect , delimeter = ';' )
730+ self .assertRaises (TypeError , copy .replace , dialect , delimiter = ';;' )
731+ self .assertRaises (TypeError , dialect .__replace__ , dialect )
732+
733+ def test_replace_dialect_subclass (self ):
734+ class mydialect (csv .Dialect ):
735+ delimiter = ";"
736+ quotechar = '"'
737+ doublequote = False
738+ skipinitialspace = True
739+ lineterminator = '\r \n '
740+ quoting = csv .QUOTE_ALL
741+
742+ dialect = mydialect ()
743+ new = copy .replace (dialect , delimiter = ':' , quoting = csv .QUOTE_MINIMAL )
744+ self .assertIsInstance (new , mydialect )
745+ self .assertEqual (new .delimiter , ':' )
746+ self .assertEqual (new .quoting , csv .QUOTE_MINIMAL )
747+ # Not replaced parameters are inherited from the original dialect.
748+ self .assertEqual (new .quotechar , '"' )
749+ self .assertEqual (new .escapechar , None )
750+ self .assertEqual (new .lineterminator , '\r \n ' )
751+ self .assertFalse (new .doublequote )
752+ self .assertTrue (new .skipinitialspace )
753+ # The original dialect is left unchanged.
754+ self .assertEqual (dialect .delimiter , ';' )
755+ self .assertEqual (dialect .quoting , csv .QUOTE_ALL )
756+ self .assertEqual (list (csv .reader (['a:b' ], new )), [['a' , 'b' ]])
757+ # "strict" is supported even if it is not set on the class.
758+ self .assertTrue (copy .replace (dialect , strict = True ).strict )
759+
760+ with self .assertRaises (csv .Error ):
761+ copy .replace (dialect , delimiter = '::' )
762+ with self .assertRaisesRegex (TypeError , "'delimeter'" ):
763+ copy .replace (dialect , delimeter = ':' )
764+
710765 def test_pickle (self ):
711766 for name in csv .list_dialects ():
712767 dialect = csv .get_dialect (name )
0 commit comments