2525import types
2626import unittest
2727
28+ import pytest
2829from parameterized import param
2930from parameterized import parameterized
3031
3435from apache_beam .internal .pickler import loads
3536
3637
38+ def maybe_skip_if_no_dill (pickle_library ):
39+ if pickle_library == 'dill' :
40+ pytest .importorskip ("dill" )
41+
42+
43+ @pytest .mark .uses_dill
3744class PicklerTest (unittest .TestCase ):
3845
3946 NO_MAPPINGPROXYTYPE = not hasattr (types , "MappingProxyType" )
@@ -43,6 +50,7 @@ class PicklerTest(unittest.TestCase):
4350 param (pickle_lib = 'cloudpickle' ),
4451 ])
4552 def test_basics (self , pickle_lib ):
53+ maybe_skip_if_no_dill (pickle_lib )
4654 pickler .set_library (pickle_lib )
4755
4856 self .assertEqual ([1 , 'a' , ('z' , )], loads (dumps ([1 , 'a' , ('z' , )])))
@@ -55,6 +63,7 @@ def test_basics(self, pickle_lib):
5563 ])
5664 def test_lambda_with_globals (self , pickle_lib ):
5765 """Tests that the globals of a function are preserved."""
66+ maybe_skip_if_no_dill (pickle_lib )
5867 pickler .set_library (pickle_lib )
5968
6069 # The point of the test is that the lambda being called after unpickling
@@ -68,6 +77,7 @@ def test_lambda_with_globals(self, pickle_lib):
6877 param (pickle_lib = 'cloudpickle' ),
6978 ])
7079 def test_lambda_with_main_globals (self , pickle_lib ):
80+ maybe_skip_if_no_dill (pickle_lib )
7181 pickler .set_library (pickle_lib )
7282 self .assertEqual (unittest , loads (dumps (lambda : unittest ))())
7383
@@ -77,6 +87,7 @@ def test_lambda_with_main_globals(self, pickle_lib):
7787 ])
7888 def test_lambda_with_closure (self , pickle_lib ):
7989 """Tests that the closure of a function is preserved."""
90+ maybe_skip_if_no_dill (pickle_lib )
8091 pickler .set_library (pickle_lib )
8192 self .assertEqual (
8293 'closure: abc' ,
@@ -88,6 +99,7 @@ def test_lambda_with_closure(self, pickle_lib):
8899 ])
89100 def test_class (self , pickle_lib ):
90101 """Tests that a class object is pickled correctly."""
102+ maybe_skip_if_no_dill (pickle_lib )
91103 pickler .set_library (pickle_lib )
92104 self .assertEqual (['abc' , 'def' ],
93105 loads (dumps (module_test .Xyz ))().foo ('abc def' ))
@@ -98,6 +110,7 @@ def test_class(self, pickle_lib):
98110 ])
99111 def test_object (self , pickle_lib ):
100112 """Tests that a class instance is pickled correctly."""
113+ maybe_skip_if_no_dill (pickle_lib )
101114 pickler .set_library (pickle_lib )
102115 self .assertEqual (['abc' , 'def' ],
103116 loads (dumps (module_test .XYZ_OBJECT )).foo ('abc def' ))
@@ -108,6 +121,7 @@ def test_object(self, pickle_lib):
108121 ])
109122 def test_nested_class (self , pickle_lib ):
110123 """Tests that a nested class object is pickled correctly."""
124+ maybe_skip_if_no_dill (pickle_lib )
111125 pickler .set_library (pickle_lib )
112126 self .assertEqual (
113127 'X:abc' , loads (dumps (module_test .TopClass .NestedClass ('abc' ))).datum )
@@ -121,6 +135,7 @@ def test_nested_class(self, pickle_lib):
121135 ])
122136 def test_dynamic_class (self , pickle_lib ):
123137 """Tests that a nested class object is pickled correctly."""
138+ maybe_skip_if_no_dill (pickle_lib )
124139 pickler .set_library (pickle_lib )
125140 self .assertEqual (
126141 'Z:abc' , loads (dumps (module_test .create_class ('abc' ))).get ())
@@ -130,6 +145,7 @@ def test_dynamic_class(self, pickle_lib):
130145 param (pickle_lib = 'cloudpickle' ),
131146 ])
132147 def test_generators (self , pickle_lib ):
148+ maybe_skip_if_no_dill (pickle_lib )
133149 pickler .set_library (pickle_lib )
134150 with self .assertRaises (TypeError ):
135151 dumps ((_ for _ in range (10 )))
@@ -139,6 +155,7 @@ def test_generators(self, pickle_lib):
139155 param (pickle_lib = 'cloudpickle' ),
140156 ])
141157 def test_recursive_class (self , pickle_lib ):
158+ maybe_skip_if_no_dill (pickle_lib )
142159 pickler .set_library (pickle_lib )
143160 self .assertEqual (
144161 'RecursiveClass:abc' ,
@@ -149,6 +166,7 @@ def test_recursive_class(self, pickle_lib):
149166 param (pickle_lib = 'cloudpickle' ),
150167 ])
151168 def test_pickle_rlock (self , pickle_lib ):
169+ maybe_skip_if_no_dill (pickle_lib )
152170 pickler .set_library (pickle_lib )
153171 rlock_instance = threading .RLock ()
154172 rlock_type = type (rlock_instance )
@@ -160,6 +178,7 @@ def test_pickle_rlock(self, pickle_lib):
160178 param (pickle_lib = 'cloudpickle' ),
161179 ])
162180 def test_save_paths (self , pickle_lib ):
181+ maybe_skip_if_no_dill (pickle_lib )
163182 pickler .set_library (pickle_lib )
164183 f = loads (dumps (lambda x : x ))
165184 co_filename = f .__code__ .co_filename
@@ -171,6 +190,7 @@ def test_save_paths(self, pickle_lib):
171190 param (pickle_lib = 'cloudpickle' ),
172191 ])
173192 def test_dump_and_load_mapping_proxy (self , pickle_lib ):
193+ maybe_skip_if_no_dill (pickle_lib )
174194 pickler .set_library (pickle_lib )
175195 self .assertEqual (
176196 'def' , loads (dumps (types .MappingProxyType ({'abc' : 'def' })))['abc' ])
@@ -184,6 +204,7 @@ def test_dump_and_load_mapping_proxy(self, pickle_lib):
184204 param (pickle_lib = 'cloudpickle' ),
185205 ])
186206 def test_dataclass (self , pickle_lib ):
207+ maybe_skip_if_no_dill (pickle_lib )
187208 exec (
188209 '''
189210from apache_beam.internal.module_test import DataClass
@@ -195,6 +216,7 @@ def test_dataclass(self, pickle_lib):
195216 param (pickle_lib = 'cloudpickle' ),
196217 ])
197218 def test_class_states_not_changed_at_subsequent_loading (self , pickle_lib ):
219+ maybe_skip_if_no_dill (pickle_lib )
198220 pickler .set_library (pickle_lib )
199221
200222 class Local :
@@ -255,6 +277,7 @@ def maybe_get_sets_with_different_iteration_orders(self):
255277 return set1 , set2
256278
257279 def test_best_effort_determinism (self ):
280+ maybe_skip_if_no_dill ('dill' )
258281 pickler .set_library ('dill' )
259282 set1 , set2 = self .maybe_get_sets_with_different_iteration_orders ()
260283 self .assertEqual (
@@ -267,6 +290,7 @@ def test_best_effort_determinism(self):
267290 self .skipTest ('Set iteration orders matched. Test results inconclusive.' )
268291
269292 def test_disable_best_effort_determinism (self ):
293+ maybe_skip_if_no_dill ('dill' )
270294 pickler .set_library ('dill' )
271295 set1 , set2 = self .maybe_get_sets_with_different_iteration_orders ()
272296 # The test relies on the sets having different iteration orders for the
0 commit comments