def __init__(self, owner=None): super(Widget, self).__init__(owner) # make up a doc self.t = DirectoryScanner() if Platform.isMac: self.t.addPathsForScanning(['/Applications']) else: self.t.addPathsForScanning(['C:\\Program Files']) self.p = PersistentScanningState("demo.sqlite", echo_sql=False) self.initialScan() self.mergeScan() print "Info Is:", self.p.scanInfo() self.mapper = MergeScanMapper(self.p) self.ui = Ui_CustomTreeWidget() self.ui.setupUi(self) self.ui.treeView.setModel( MergeScanTreeModel(self.p, self.mapper, self.p.roots(), self)) self.ui.treeView.expandToDepth(1) model = self.ui.treeView.model() header = self.ui.treeView.header() header.setResizeMode(MergeScanTreeModel.COL_CHECKED, QHeaderView.ResizeToContents) header.setResizeMode(MergeScanTreeModel.COL_PERMISSIONS, QHeaderView.ResizeToContents) self.ui.treeView.setAttribute(Qt.WA_MacShowFocusRect, False)
def test_scan_with_exclusion_of_a_file(self): # scan the directory and store the number of files found there count_of_all = count_of(DirectoryScanner().performScan( utils.good_app_path())) self.assertTrue(count_of_all > 0) if Platform.isMac: self.t.file_excludes.append( r'.*/TextEdit.app/Contents/Info.plist$') else: self.t.file_excludes.append(r'.*python.exe$') count = count_of(self.t.performScan(utils.good_app_path())) self.assertEqual(count, count_of_all - 1)
def test_scan_is_stored(self): t = DirectoryScanner() t.addPathsForScanning([good_app_path()]) # since its an iterable, force its execution for x in self.p.storeFilesystemSnapshot(t): pass # and the dir count contains something values = self.p.session.query(FileSystemSnapshot).all() self.assertTrue(len(values) > 0) self.assertTrue(DocumentStorage.deleteDocumentNamed('test.sqlite'))
def test_can_store_changes_to_dir_exclusions(self): new_rule = ".* dir rule.*" # adds a new rule rules = self.r.dirExcludes() rules.append(new_rule) self.r.setDirExcludes(rules) self.assertEqual("FileWave", self.r.settings.organizationName()) self.assertEqual("UnitTest", self.r.settings.applicationName()) # fetch and test (the self.r rules are stored/read in default QSettings, unit test main sets this up) p = DirectoryScanner() self.assertTrue(new_rule not in p.file_excludes) self.assertTrue(new_rule in p.dir_excludes)
def setUp(self): self.t = DirectoryScanner() self.builder = DirectoryTreeBuilder() # construct a known directory structure, suitable for testing - it includes files, directories, ACL's, etc self.contents_path = self.builder.make_dir("BB/TextEdit.app/Contents", 0755) self.builder.make_dir("BB/TextEdit.app/Contents/Resources", 0755) self.builder.make_dir("BB/TextEdit.app/Contents/Frameworks", 0755) self.builder.create_file("BB/TextEdit.app/Contents/Stupid.txt", 0755, 425) # produce a single scan of the fake file-system entries self.p = PersistentScanningState("tree-tests.sqlite") self.t.addPathsForScanning([self.builder.rootDir]) self.initialScan() self.mergeScan()
def beginInitialScan(self, scan_paths, doc_name=None): # construct an initial scan, based on the selected items within the model... # workflow: scan to produce a persistent model, monitor/rescan, re-integrate changes into initial model (changed, deleted, added etc) scanner = DirectoryScanner() scanner.addPathsForScanning(scan_paths) # we want to store the results too - so build a storage device, its all being run via iterables # so its easy to chain these together. doc_path = DocumentStorage.getDocumentPathForName(doc_name, scan_paths) self.storage = PersistentScanningState(doc_path) self.storage.storePathsBeingScanned(scanner.paths_to_scan) self.storage.scanningStateChanged.connect( lambda x: self.scanStateChanged.emit(x)) self.isScanning = True self.scanStarted.emit(doc_path) # this one line performs a recursive disk scan on multiple folders, obtains file/dir info, persists # this to the DB and then finally exposes [idx, f] so the UI can display progress. Long live iterables... (and C++, you can die in a fire) total_found = 0 for idx, f in enumerate(self.storage.storeFilesystemSnapshot(scanner)): total_found = idx if not (idx % 100): self.scanProgress.emit(idx, f.abs_path) if not self.isScanning: break registryScanner = RegistryScanner() totalRegistry = 0 for idx, r in enumerate( self.storage.storeRegistryEntrySnapshot(registryScanner)): totalRegistry = idx if not (idx % 100): self.scanProgress.emit(idx, r.key_name) if not self.isScanning: break self.stopScanning() # complete the scan... self.scanFinished.emit(total_found) self.storage = None
def setUp(self): self.t = DirectoryScanner() self.builder = DirectoryTreeBuilder() # construct a known directory structure, suitable for testing - it includes files, directories, ACL's, etc self.contents_path = self.builder.make_dir("AA/TextEdit.app/Contents", 0755) self.builder.make_dir("AA/TextEdit.app/Contents/Resources", 0755) self.builder.make_dir("AA/TextEdit.app/Contents/Frameworks", 0755) self.dbName = "find-diffs.sqlite" self.removeDB() # produce a single scan of the fake file-system entries self.p = PersistentScanningState(self.dbName) self.t.addPathsForScanning([self.builder.rootDir]) self.initialScan()
def __beginChangesScanWithDocument(self): scan_paths = [p.abs_path for p in self.storage.pathsBeingScanned()] # kick off another scan scan = DirectoryScanner() scan.addPathsForScanning(scan_paths) self.scanStarted.emit(self.storage.filename) # now re-scan, we'll use a 'merge' facility from the persistent scanning state, it automatically # creates the required set of (added, modified, deleted) files. total_found = 0 merge = self.storage.storeSecondScan(scan) for idx, f in enumerate(merge): total_found = idx #yield idx, f if not (idx % 100): self.scanProgress.emit(idx, ensure_unicode(f.abs_path)) if not self.isScanning: break total_found = 0 registryScanner = RegistryScanner() for idx, r in enumerate( self.storage.storeSecondRegistryScan(registryScanner)): total_found = idx if not (idx % 100): self.scanProgress.emit(idx, ensure_unicode(r.key)) if not self.isScanning: break self.scanFinished.emit(total_found) self.mergeCompleted.emit() self.stopScanning() self.storage = None
def setUp(self): self.t = DirectoryScanner()