@@ -740,7 +740,7 @@ def test_os_rename(self):
740740 'rename_test_2/nest_1/nested_rename_test_3.sql' , overwrite = True ,
741741 )
742742
743- def test_stage_object (self ):
743+ def test_file_object (self ):
744744 st = self .wg .stage
745745
746746 st .mkdir ('obj_test' )
@@ -1028,3 +1028,275 @@ def test_job_with_database_target(self):
10281028 assert deleted
10291029 job = job_manager .get (job .job_id )
10301030 assert job .terminated_at is not None
1031+
1032+
1033+ @pytest .mark .management
1034+ class TestFileSpaces (unittest .TestCase ):
1035+
1036+ manager = None
1037+ personal_space = None
1038+ shared_space = None
1039+
1040+ @classmethod
1041+ def setUpClass (cls ):
1042+ cls .manager = s2 .manage_files ()
1043+ cls .personal_space = cls .manager .personal_space
1044+ cls .shared_space = cls .manager .shared_space
1045+
1046+ @classmethod
1047+ def tearDownClass (cls ):
1048+ cls .manager = None
1049+ cls .personal_space = None
1050+ cls .shared_space = None
1051+
1052+ def test_upload_file (self ):
1053+ for space in [self .personal_space , self .shared_space ]:
1054+ root = space .info ('/' )
1055+ assert str (root .path ) == '/'
1056+ assert root .type == 'directory'
1057+
1058+ # Upload files
1059+ f = space .upload_file (
1060+ TEST_DIR / 'test.ipynb' ,
1061+ 'upload_test.ipynb' ,
1062+ )
1063+ assert str (f .path ) == 'upload_test.ipynb'
1064+ assert f .type == 'notebook'
1065+
1066+ # Download and compare to original
1067+ txt = f .download (encoding = 'utf-8' )
1068+ assert txt == open (TEST_DIR / 'test.ipynb' ).read ()
1069+
1070+ # Make sure we can't overwrite
1071+ with self .assertRaises (OSError ):
1072+ space .upload_file (
1073+ TEST_DIR / 'test.ipynb' ,
1074+ 'upload_test.ipynb' ,
1075+ )
1076+
1077+ # Force overwrite with new content
1078+ f = space .upload_file (
1079+ TEST_DIR / 'test2.ipynb' ,
1080+ 'upload_test.ipynb' , overwrite = True ,
1081+ )
1082+ assert str (f .path ) == 'upload_test.ipynb'
1083+ assert f .type == 'notebook'
1084+
1085+ # Verify new content
1086+ txt = f .download (encoding = 'utf-8' )
1087+ assert txt == open (TEST_DIR / 'test2.ipynb' ).read ()
1088+
1089+ # Make sure we can't upload a folder
1090+ with self .assertRaises (s2 .ManagementError ):
1091+ space .upload_folder (TEST_DIR , 'test' )
1092+
1093+ # Cleanup
1094+ space .remove ('upload_test.ipynb' )
1095+
1096+ def test_open (self ):
1097+ for space in [self .personal_space , self .shared_space ]:
1098+ # See if error is raised for non-existent file
1099+ with self .assertRaises (s2 .ManagementError ):
1100+ space .open ('open_test.ipynb' , 'r' )
1101+
1102+ # Load test file
1103+ space .upload_file (TEST_DIR / 'test.ipynb' , 'open_test.ipynb' )
1104+
1105+ # Read file using `open`
1106+ with space .open ('open_test.ipynb' , 'r' ) as rfile :
1107+ assert rfile .read () == open (TEST_DIR / 'test.ipynb' ).read ()
1108+
1109+ # Read file using `open` with 'rt' mode
1110+ with space .open ('open_test.ipynb' , 'rt' ) as rfile :
1111+ assert rfile .read () == open (TEST_DIR / 'test.ipynb' ).read ()
1112+
1113+ # Read file using `open` with 'rb' mode
1114+ with space .open ('open_test.ipynb' , 'rb' ) as rfile :
1115+ assert rfile .read () == open (TEST_DIR / 'test.ipynb' , 'rb' ).read ()
1116+
1117+ # Read file using `open` with 'rb' mode
1118+ with self .assertRaises (ValueError ):
1119+ with space .open ('open_test.ipynb' , 'b' ) as rfile :
1120+ pass
1121+
1122+ # Attempt overwrite file using `open` with mode 'x'
1123+ with self .assertRaises (OSError ):
1124+ with space .open ('open_test.ipynb' , 'x' ) as wfile :
1125+ pass
1126+
1127+ # Attempt overwrite file using `open` with mode 'w'
1128+ with space .open ('open_test.ipynb' , 'w' ) as wfile :
1129+ wfile .write (open (TEST_DIR / 'test2.ipynb' ).read ())
1130+
1131+ txt = space .download_file ('open_test.ipynb' , encoding = 'utf-8' )
1132+
1133+ assert txt == open (TEST_DIR / 'test2.ipynb' ).read ()
1134+
1135+ # Test writer without context manager
1136+ wfile = space .open ('open_raw_test.ipynb' , 'w' )
1137+ for line in open (TEST_DIR / 'test.ipynb' ):
1138+ wfile .write (line )
1139+ wfile .close ()
1140+
1141+ txt = space .download_file (
1142+ 'open_raw_test.ipynb' ,
1143+ encoding = 'utf-8' ,
1144+ )
1145+
1146+ assert txt == open (TEST_DIR / 'test.ipynb' ).read ()
1147+
1148+ # Test reader without context manager
1149+ rfile = space .open ('open_raw_test.ipynb' , 'r' )
1150+ txt = ''
1151+ for line in rfile :
1152+ txt += line
1153+ rfile .close ()
1154+
1155+ assert txt == open (TEST_DIR / 'test.ipynb' ).read ()
1156+
1157+ # Cleanup
1158+ space .remove ('open_test.ipynb' )
1159+ space .remove ('open_raw_test.ipynb' )
1160+
1161+ def test_obj_open (self ):
1162+ for space in [self .personal_space , self .shared_space ]:
1163+ # Load test file
1164+ f = space .upload_file (
1165+ TEST_DIR / 'test.ipynb' ,
1166+ 'obj_open_test.ipynb' ,
1167+ )
1168+
1169+ # Read file using `open`
1170+ with f .open () as rfile :
1171+ assert rfile .read () == open (TEST_DIR / 'test.ipynb' ).read ()
1172+
1173+ # Make sure directories error out
1174+ with self .assertRaises (s2 .ManagementError ):
1175+ space .mkdir ('obj_open_dir' )
1176+
1177+ # Write file using `open`
1178+ with f .open ('w' , encoding = 'utf-8' ) as wfile :
1179+ wfile .write (open (TEST_DIR / 'test2.ipynb' ).read ())
1180+
1181+ assert f .download (encoding = 'utf-8' ) == open (TEST_DIR / 'test2.ipynb' ).read ()
1182+
1183+ # Test writer without context manager
1184+ wfile = f .open ('w' )
1185+ for line in open (TEST_DIR / 'test.ipynb' ):
1186+ wfile .write (line )
1187+ wfile .close ()
1188+
1189+ txt = space .download_file (f .path , encoding = 'utf-8' )
1190+
1191+ assert txt == open (TEST_DIR / 'test.ipynb' ).read ()
1192+
1193+ # Test reader without context manager
1194+ rfile = f .open ('r' )
1195+ txt = ''
1196+ for line in rfile :
1197+ txt += line
1198+ rfile .close ()
1199+
1200+ assert txt == open (TEST_DIR / 'test.ipynb' ).read ()
1201+
1202+ # Cleanup
1203+ space .remove ('obj_open_test.ipynb' )
1204+
1205+ def test_os_directories (self ):
1206+ for space in [self .personal_space , self .shared_space ]:
1207+ # Make sure directories error out
1208+ with self .assertRaises (s2 .ManagementError ):
1209+ space .mkdir ('mkdir_test_1' )
1210+
1211+ with self .assertRaises (s2 .ManagementError ):
1212+ space .exists ('mkdir_test_1/' )
1213+
1214+ out = space .listdir ('/' )
1215+ assert 'mkdir_test_1/' not in out
1216+
1217+ with self .assertRaises (s2 .ManagementError ):
1218+ space .rmdir ('mkdir_test_1/' )
1219+
1220+ def test_os_rename (self ):
1221+ for space in [self .personal_space , self .shared_space ]:
1222+ space .upload_file (
1223+ TEST_DIR / 'test.ipynb' ,
1224+ 'rename_test.ipynb' ,
1225+ )
1226+ assert 'rename_test.ipynb' in space .listdir ('/' )
1227+ assert 'rename_test_2.ipynb' not in space .listdir ('/' )
1228+
1229+ space .rename (
1230+ 'rename_test.ipynb' ,
1231+ 'rename_test_2.ipynb' ,
1232+ )
1233+ assert 'rename_test.ipynb' not in space .listdir ('/' )
1234+ assert 'rename_test_2.ipynb' in space .listdir ('/' )
1235+
1236+ # non-existent file
1237+ with self .assertRaises (OSError ):
1238+ space .rename ('rename_foo.ipynb' , 'rename_foo_2.ipynb' )
1239+
1240+ space .upload_file (
1241+ TEST_DIR / 'test.ipynb' ,
1242+ 'rename_test_3.ipynb' ,
1243+ )
1244+
1245+ # overwrite
1246+ with self .assertRaises (OSError ):
1247+ space .rename (
1248+ 'rename_test_2.ipynb' ,
1249+ 'rename_test_3.ipynb' ,
1250+ )
1251+
1252+ space .rename (
1253+ 'rename_test_2.ipynb' ,
1254+ 'rename_test_3.ipynb' , overwrite = True ,
1255+ )
1256+
1257+ # Cleanup
1258+ space .remove ('rename_test_3.ipynb' )
1259+
1260+ def test_file_object (self ):
1261+ for space in [self .personal_space , self .shared_space ]:
1262+ f = space .upload_file (
1263+ TEST_DIR / 'test.ipynb' ,
1264+ 'obj_test.ipynb' ,
1265+ )
1266+
1267+ assert not f .is_dir ()
1268+ assert f .is_file ()
1269+
1270+ # abspath / basename / dirname / exists
1271+ assert f .abspath () == 'obj_test.ipynb'
1272+ assert f .basename () == 'obj_test.ipynb'
1273+ assert f .dirname () == '/'
1274+ assert f .exists ()
1275+
1276+ # download
1277+ assert f .download (encoding = 'utf-8' ) == \
1278+ open (TEST_DIR / 'test.ipynb' , 'r' ).read ()
1279+ assert f .download () == open (TEST_DIR / 'test.ipynb' , 'rb' ).read ()
1280+
1281+ assert space .is_file ('obj_test.ipynb' )
1282+ f .remove ()
1283+ assert not space .is_file ('obj_test.ipynb' )
1284+
1285+ # mtime / ctime
1286+ assert f .getmtime () > 0
1287+ assert f .getctime () > 0
1288+
1289+ # rename
1290+ f = space .upload_file (
1291+ TEST_DIR / 'test.ipynb' ,
1292+ 'obj_test.ipynb' ,
1293+ )
1294+ assert space .exists ('obj_test.ipynb' )
1295+ assert not space .exists ('obj_test_2.ipynb' )
1296+ f .rename ('obj_test_2.ipynb' )
1297+ assert not space .exists ('obj_test.ipynb' )
1298+ assert space .exists ('obj_test_2.ipynb' )
1299+ assert f .abspath () == 'obj_test_2.ipynb'
1300+
1301+ # Cleanup
1302+ space .remove ('obj_test_2.ipynb' )
0 commit comments