@@ -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,290 @@ 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+ if space == self .personal_space :
1067+ space .upload_file (
1068+ TEST_DIR / 'test.sql' ,
1069+ 'upload_test.sql' ,
1070+ )
1071+
1072+ # Cleanup
1073+ space .remove ('upload_test.sql' )
1074+ elif space == self .shared_space :
1075+ with self .assertRaises (s2 .ManagementError ):
1076+ space .upload_file (
1077+ TEST_DIR / 'test.sql' ,
1078+ 'upload_test.sql' ,
1079+ )
1080+
1081+ # Download and compare to original
1082+ txt = f .download (encoding = 'utf-8' )
1083+ assert txt == open (TEST_DIR / 'test.ipynb' ).read ()
1084+
1085+ # Make sure we can't overwrite
1086+ with self .assertRaises (OSError ):
1087+ space .upload_file (
1088+ TEST_DIR / 'test.ipynb' ,
1089+ 'upload_test.ipynb' ,
1090+ )
1091+
1092+ # Force overwrite with new content
1093+ f = space .upload_file (
1094+ TEST_DIR / 'test2.ipynb' ,
1095+ 'upload_test.ipynb' , overwrite = True ,
1096+ )
1097+ assert str (f .path ) == 'upload_test.ipynb'
1098+ assert f .type == 'notebook'
1099+
1100+ # Verify new content
1101+ txt = f .download (encoding = 'utf-8' )
1102+ assert txt == open (TEST_DIR / 'test2.ipynb' ).read ()
1103+
1104+ # Make sure we can't upload a folder
1105+ with self .assertRaises (s2 .ManagementError ):
1106+ space .upload_folder (TEST_DIR , 'test' )
1107+
1108+ # Cleanup
1109+ space .remove ('upload_test.ipynb' )
1110+
1111+ def test_open (self ):
1112+ for space in [self .personal_space , self .shared_space ]:
1113+ # See if error is raised for non-existent file
1114+ with self .assertRaises (s2 .ManagementError ):
1115+ space .open ('open_test.ipynb' , 'r' )
1116+
1117+ # Load test file
1118+ space .upload_file (TEST_DIR / 'test.ipynb' , 'open_test.ipynb' )
1119+
1120+ # Read file using `open`
1121+ with space .open ('open_test.ipynb' , 'r' ) as rfile :
1122+ assert rfile .read () == open (TEST_DIR / 'test.ipynb' ).read ()
1123+
1124+ # Read file using `open` with 'rt' mode
1125+ with space .open ('open_test.ipynb' , 'rt' ) as rfile :
1126+ assert rfile .read () == open (TEST_DIR / 'test.ipynb' ).read ()
1127+
1128+ # Read file using `open` with 'rb' mode
1129+ with space .open ('open_test.ipynb' , 'rb' ) as rfile :
1130+ assert rfile .read () == open (TEST_DIR / 'test.ipynb' , 'rb' ).read ()
1131+
1132+ # Read file using `open` with 'rb' mode
1133+ with self .assertRaises (ValueError ):
1134+ with space .open ('open_test.ipynb' , 'b' ) as rfile :
1135+ pass
1136+
1137+ # Attempt overwrite file using `open` with mode 'x'
1138+ with self .assertRaises (OSError ):
1139+ with space .open ('open_test.ipynb' , 'x' ) as wfile :
1140+ pass
1141+
1142+ # Attempt overwrite file using `open` with mode 'w'
1143+ with space .open ('open_test.ipynb' , 'w' ) as wfile :
1144+ wfile .write (open (TEST_DIR / 'test2.ipynb' ).read ())
1145+
1146+ txt = space .download_file ('open_test.ipynb' , encoding = 'utf-8' )
1147+
1148+ assert txt == open (TEST_DIR / 'test2.ipynb' ).read ()
1149+
1150+ # Test writer without context manager
1151+ wfile = space .open ('open_raw_test.ipynb' , 'w' )
1152+ for line in open (TEST_DIR / 'test.ipynb' ):
1153+ wfile .write (line )
1154+ wfile .close ()
1155+
1156+ txt = space .download_file (
1157+ 'open_raw_test.ipynb' ,
1158+ encoding = 'utf-8' ,
1159+ )
1160+
1161+ assert txt == open (TEST_DIR / 'test.ipynb' ).read ()
1162+
1163+ # Test reader without context manager
1164+ rfile = space .open ('open_raw_test.ipynb' , 'r' )
1165+ txt = ''
1166+ for line in rfile :
1167+ txt += line
1168+ rfile .close ()
1169+
1170+ assert txt == open (TEST_DIR / 'test.ipynb' ).read ()
1171+
1172+ # Cleanup
1173+ space .remove ('open_test.ipynb' )
1174+ space .remove ('open_raw_test.ipynb' )
1175+
1176+ def test_obj_open (self ):
1177+ for space in [self .personal_space , self .shared_space ]:
1178+ # Load test file
1179+ f = space .upload_file (
1180+ TEST_DIR / 'test.ipynb' ,
1181+ 'obj_open_test.ipynb' ,
1182+ )
1183+
1184+ # Read file using `open`
1185+ with f .open () as rfile :
1186+ assert rfile .read () == open (TEST_DIR / 'test.ipynb' ).read ()
1187+
1188+ # Make sure directories error out
1189+ with self .assertRaises (s2 .ManagementError ):
1190+ space .mkdir ('obj_open_dir' )
1191+
1192+ # Write file using `open`
1193+ with f .open ('w' , encoding = 'utf-8' ) as wfile :
1194+ wfile .write (open (TEST_DIR / 'test2.ipynb' ).read ())
1195+
1196+ assert f .download (encoding = 'utf-8' ) == open (TEST_DIR / 'test2.ipynb' ).read ()
1197+
1198+ # Test writer without context manager
1199+ wfile = f .open ('w' )
1200+ for line in open (TEST_DIR / 'test.ipynb' ):
1201+ wfile .write (line )
1202+ wfile .close ()
1203+
1204+ txt = space .download_file (f .path , encoding = 'utf-8' )
1205+
1206+ assert txt == open (TEST_DIR / 'test.ipynb' ).read ()
1207+
1208+ # Test reader without context manager
1209+ rfile = f .open ('r' )
1210+ txt = ''
1211+ for line in rfile :
1212+ txt += line
1213+ rfile .close ()
1214+
1215+ assert txt == open (TEST_DIR / 'test.ipynb' ).read ()
1216+
1217+ # Cleanup
1218+ space .remove ('obj_open_test.ipynb' )
1219+
1220+ def test_os_directories (self ):
1221+ for space in [self .personal_space , self .shared_space ]:
1222+ # Make sure directories error out
1223+ with self .assertRaises (s2 .ManagementError ):
1224+ space .mkdir ('mkdir_test_1' )
1225+
1226+ with self .assertRaises (s2 .ManagementError ):
1227+ space .exists ('mkdir_test_1/' )
1228+
1229+ out = space .listdir ('/' )
1230+ assert 'mkdir_test_1/' not in out
1231+
1232+ with self .assertRaises (s2 .ManagementError ):
1233+ space .rmdir ('mkdir_test_1/' )
1234+
1235+ def test_os_rename (self ):
1236+ for space in [self .personal_space , self .shared_space ]:
1237+ space .upload_file (
1238+ TEST_DIR / 'test.ipynb' ,
1239+ 'rename_test.ipynb' ,
1240+ )
1241+ assert 'rename_test.ipynb' in space .listdir ('/' )
1242+ assert 'rename_test_2.ipynb' not in space .listdir ('/' )
1243+
1244+ space .rename (
1245+ 'rename_test.ipynb' ,
1246+ 'rename_test_2.ipynb' ,
1247+ )
1248+ assert 'rename_test.ipynb' not in space .listdir ('/' )
1249+ assert 'rename_test_2.ipynb' in space .listdir ('/' )
1250+
1251+ # non-existent file
1252+ with self .assertRaises (OSError ):
1253+ space .rename ('rename_foo.ipynb' , 'rename_foo_2.ipynb' )
1254+
1255+ space .upload_file (
1256+ TEST_DIR / 'test.ipynb' ,
1257+ 'rename_test_3.ipynb' ,
1258+ )
1259+
1260+ # overwrite
1261+ with self .assertRaises (OSError ):
1262+ space .rename (
1263+ 'rename_test_2.ipynb' ,
1264+ 'rename_test_3.ipynb' ,
1265+ )
1266+
1267+ space .rename (
1268+ 'rename_test_2.ipynb' ,
1269+ 'rename_test_3.ipynb' , overwrite = True ,
1270+ )
1271+
1272+ # Cleanup
1273+ space .remove ('rename_test_3.ipynb' )
1274+
1275+ def test_file_object (self ):
1276+ for space in [self .personal_space , self .shared_space ]:
1277+ f = space .upload_file (
1278+ TEST_DIR / 'test.ipynb' ,
1279+ 'obj_test.ipynb' ,
1280+ )
1281+
1282+ assert not f .is_dir ()
1283+ assert f .is_file ()
1284+
1285+ # abspath / basename / dirname / exists
1286+ assert f .abspath () == 'obj_test.ipynb'
1287+ assert f .basename () == 'obj_test.ipynb'
1288+ assert f .dirname () == '/'
1289+ assert f .exists ()
1290+
1291+ # download
1292+ assert f .download (encoding = 'utf-8' ) == \
1293+ open (TEST_DIR / 'test.ipynb' , 'r' ).read ()
1294+ assert f .download () == open (TEST_DIR / 'test.ipynb' , 'rb' ).read ()
1295+
1296+ assert space .is_file ('obj_test.ipynb' )
1297+ f .remove ()
1298+ assert not space .is_file ('obj_test.ipynb' )
1299+
1300+ # mtime / ctime
1301+ assert f .getmtime () > 0
1302+ assert f .getctime () > 0
1303+
1304+ # rename
1305+ f = space .upload_file (
1306+ TEST_DIR / 'test.ipynb' ,
1307+ 'obj_test.ipynb' ,
1308+ )
1309+ assert space .exists ('obj_test.ipynb' )
1310+ assert not space .exists ('obj_test_2.ipynb' )
1311+ f .rename ('obj_test_2.ipynb' )
1312+ assert not space .exists ('obj_test.ipynb' )
1313+ assert space .exists ('obj_test_2.ipynb' )
1314+ assert f .abspath () == 'obj_test_2.ipynb'
1315+
1316+ # Cleanup
1317+ space .remove ('obj_test_2.ipynb' )
0 commit comments