diff --git a/Pipfile b/Pipfile index 7d1430f..5f2473b 100644 --- a/Pipfile +++ b/Pipfile @@ -5,10 +5,8 @@ name = "pypi" [packages] pyinotify = {version = "*", platform_system = "== 'Linux'"} -pypiwin32 = {version = "*", platform_system = "== 'Windows'"} -macfsevents = {version = "*", platform_system = "== 'Darwin'"} +pywin32 = {version = "*", platform_system = "== 'Windows'"} [dev-packages] twine = "*" pytest = "*" -pylint = "*" diff --git a/Pipfile.lock b/Pipfile.lock index de2314e..175ab68 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "5f5888d59a1c8ef82bfa47ae5d942678a2bd114b0a0a76ce203ad4d92b49dcac" + "sha256": "a39c087ffd4a9519e033aa07a5871075d1c15bc75dd27d4889324fd72222bc2a" }, "pipfile-spec": 6, "requires": {}, @@ -14,14 +14,6 @@ ] }, "default": { - "macfsevents": { - "hashes": [ - "sha256:1324b66b356051de662ba87d84f73ada062acd42b047ed1246e60a449f833e10" - ], - "index": "pypi", - "markers": "platform_system == 'Darwin'", - "version": "==0.8.1" - }, "pyinotify": { "hashes": [ "sha256:9c998a5d7606ca835065cdabc013ae6c66eb9ea76a00a1e3bc6e0cfe2b4f71f4" @@ -30,15 +22,6 @@ "markers": "platform_system == 'Linux'", "version": "==0.9.6" }, - "pypiwin32": { - "hashes": [ - "sha256:67adf399debc1d5d14dffc1ab5acacb800da569754fafdc576b2a039485aa775", - "sha256:71be40c1fbd28594214ecaecb58e7aa8b708eabfa0125c8a109ebd51edbd776a" - ], - "index": "pypi", - "markers": "platform_system == 'Windows'", - "version": "==223" - }, "pywin32": { "hashes": [ "sha256:22e218832a54ed206452c8f3ca9eff07ef327f8e597569a4c2828be5eaa09a77", @@ -50,17 +33,12 @@ "sha256:6dbc4219fe45ece6a0cc6baafe0105604fdee551b5e876dc475d3955b77190ec", "sha256:9bd07746ce7f2198021a9fa187fa80df7b221ec5e4c234ab6f00ea355a3baf99" ], + "index": "pypi", + "markers": "platform_system == 'Windows'", "version": "==224" } }, "develop": { - "astroid": { - "hashes": [ - "sha256:292fa429e69d60e4161e7612cb7cc8fa3609e2e309f80c224d93a76d5e7b58be", - "sha256:c7013d119ec95eb626f7a2011f0b63d0c9a095df9ad06d8507b37084eada1a8d" - ], - "version": "==2.0.4" - }, "atomicwrites": { "hashes": [ "sha256:0312ad34fcad8fac3704d441f7b317e50af620823353ec657a53e981f92920c0", @@ -84,10 +62,10 @@ }, "certifi": { "hashes": [ - "sha256:339dc09518b07e2fa7eda5450740925974815557727d6bd35d319c1524a04a4c", - "sha256:6d58c986d22b038c8c0df30d639f23a3e6d172a05c3583e766f4c0b785c0986a" + "sha256:376690d6f16d32f9d1fe8932551d80b23e9d393a8578c5633a2ed39a64861638", + "sha256:456048c7e371c089d0a77a5212fb37a2c2dce1e24146e3b7e0261736aaeaa22a" ], - "version": "==2018.10.15" + "version": "==2018.8.24" }, "cffi": { "hashes": [ @@ -187,55 +165,6 @@ ], "version": "==2.7" }, - "isort": { - "hashes": [ - "sha256:1153601da39a25b14ddc54955dbbacbb6b2d19135386699e2ad58517953b34af", - "sha256:b9c40e9750f3d77e6e4d441d8b0266cf555e7cdabdcff33c4fd06366ca761ef8", - "sha256:ec9ef8f4a9bc6f71eec99e1806bfa2de401650d996c59330782b89a5555c1497" - ], - "version": "==4.3.4" - }, - "lazy-object-proxy": { - "hashes": [ - "sha256:0ce34342b419bd8f018e6666bfef729aec3edf62345a53b537a4dcc115746a33", - "sha256:1b668120716eb7ee21d8a38815e5eb3bb8211117d9a90b0f8e21722c0758cc39", - "sha256:209615b0fe4624d79e50220ce3310ca1a9445fd8e6d3572a896e7f9146bbf019", - "sha256:27bf62cb2b1a2068d443ff7097ee33393f8483b570b475db8ebf7e1cba64f088", - "sha256:27ea6fd1c02dcc78172a82fc37fcc0992a94e4cecf53cb6d73f11749825bd98b", - "sha256:2c1b21b44ac9beb0fc848d3993924147ba45c4ebc24be19825e57aabbe74a99e", - "sha256:2df72ab12046a3496a92476020a1a0abf78b2a7db9ff4dc2036b8dd980203ae6", - "sha256:320ffd3de9699d3892048baee45ebfbbf9388a7d65d832d7e580243ade426d2b", - "sha256:50e3b9a464d5d08cc5227413db0d1c4707b6172e4d4d915c1c70e4de0bbff1f5", - "sha256:5276db7ff62bb7b52f77f1f51ed58850e315154249aceb42e7f4c611f0f847ff", - "sha256:61a6cf00dcb1a7f0c773ed4acc509cb636af2d6337a08f362413c76b2b47a8dd", - "sha256:6ae6c4cb59f199d8827c5a07546b2ab7e85d262acaccaacd49b62f53f7c456f7", - "sha256:7661d401d60d8bf15bb5da39e4dd72f5d764c5aff5a86ef52a042506e3e970ff", - "sha256:7bd527f36a605c914efca5d3d014170b2cb184723e423d26b1fb2fd9108e264d", - "sha256:7cb54db3535c8686ea12e9535eb087d32421184eacc6939ef15ef50f83a5e7e2", - "sha256:7f3a2d740291f7f2c111d86a1c4851b70fb000a6c8883a59660d95ad57b9df35", - "sha256:81304b7d8e9c824d058087dcb89144842c8e0dea6d281c031f59f0acf66963d4", - "sha256:933947e8b4fbe617a51528b09851685138b49d511af0b6c0da2539115d6d4514", - "sha256:94223d7f060301b3a8c09c9b3bc3294b56b2188e7d8179c762a1cda72c979252", - "sha256:ab3ca49afcb47058393b0122428358d2fbe0408cf99f1b58b295cfeb4ed39109", - "sha256:bd6292f565ca46dee4e737ebcc20742e3b5be2b01556dafe169f6c65d088875f", - "sha256:cb924aa3e4a3fb644d0c463cad5bc2572649a6a3f68a7f8e4fbe44aaa6d77e4c", - "sha256:d0fc7a286feac9077ec52a927fc9fe8fe2fabab95426722be4c953c9a8bede92", - "sha256:ddc34786490a6e4ec0a855d401034cbd1242ef186c20d79d2166d6a4bd449577", - "sha256:e34b155e36fa9da7e1b7c738ed7767fc9491a62ec6af70fe9da4a057759edc2d", - "sha256:e5b9e8f6bda48460b7b143c3821b21b452cb3a835e6bbd5dd33aa0c8d3f5137d", - "sha256:e81ebf6c5ee9684be8f2c87563880f93eedd56dd2b6146d8a725b50b7e5adb0f", - "sha256:eb91be369f945f10d3a49f5f9be8b3d0b93a4c2be8f8a5b83b0571b8123e0a7a", - "sha256:f460d1ceb0e4a5dcb2a652db0904224f367c9b3c1470d5a7683c0480e582468b" - ], - "version": "==1.3.1" - }, - "mccabe": { - "hashes": [ - "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42", - "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f" - ], - "version": "==0.6.1" - }, "more-itertools": { "hashes": [ "sha256:c187a73da93e7a8acc0001572aebc7e3c69daf7bf6881a2cea10650bd4420092", @@ -253,10 +182,10 @@ }, "pluggy": { "hashes": [ - "sha256:447ba94990e8014ee25ec853339faf7b0fc8050cdc3289d4d71f7f410fb90095", - "sha256:bde19360a8ec4dfd8a20dcb811780a30998101f078fc7ded6162f0076f50508f" + "sha256:6e3836e39f4d36ae72840833db137f7b7d35105079aee6ec4a62d9f80d594dd1", + "sha256:95eb8364a4708392bae89035f45341871286a333f749c3141c20573d2b3876e1" ], - "version": "==0.8.0" + "version": "==0.7.1" }, "py": { "hashes": [ @@ -278,21 +207,13 @@ ], "version": "==2.2.0" }, - "pylint": { - "hashes": [ - "sha256:1d6d3622c94b4887115fe5204982eee66fdd8a951cf98635ee5caee6ec98c3ec", - "sha256:31142f764d2a7cd41df5196f9933b12b7ee55e73ef12204b648ad7e556c119fb" - ], - "index": "pypi", - "version": "==2.1.1" - }, "pytest": { "hashes": [ - "sha256:10e59f84267370ab20cec9305bafe7505ba4d6b93ecbf66a1cce86193ed511d5", - "sha256:8c827e7d4816dfe13e9329c8226aef8e6e75d65b939bc74fda894143b6d1df59" + "sha256:7e258ee50338f4e46957f9e09a0f10fb1c2d05493fa901d113a8dafd0790de4e", + "sha256:9332147e9af2dcf46cd7ceb14d5acadb6564744ddff1fe8c17f0ce60ece7d9a2" ], "index": "pypi", - "version": "==3.9.1" + "version": "==3.8.2" }, "readme-renderer": { "hashes": [ @@ -303,10 +224,10 @@ }, "requests": { "hashes": [ - "sha256:99dcfdaaeb17caf6e526f32b6a7b780461512ab3f1d992187801694cba42770c", - "sha256:a84b8c9ab6239b578f22d1c21d51b696dcfe004032bb80ea832398d6909d7279" + "sha256:63b52e3c866428a224f97cab011de738c36aec0185aa91cfacd418b5d58911d1", + "sha256:ec22d826a36ed72a7358ff3fe56cbd4ba69dd7a6718ffd450ff0e9df7a47ce6a" ], - "version": "==2.20.0" + "version": "==2.19.1" }, "requests-toolbelt": { "hashes": [ @@ -324,10 +245,10 @@ }, "tqdm": { "hashes": [ - "sha256:3c4d4a5a41ef162dd61f1edb86b0e1c7859054ab656b2e7c7b77e7fbf6d9f392", - "sha256:5b4d5549984503050883bc126280b386f5f4ca87e6c023c5d015655ad75bdebb" + "sha256:18f1818ce951aeb9ea162ae1098b43f583f7d057b34d706f66939353d1208889", + "sha256:df02c0650160986bac0218bb07952245fc6960d23654648b5d5526ad5a4128c9" ], - "version": "==4.28.1" + "version": "==4.26.0" }, "twine": { "hashes": [ @@ -339,10 +260,10 @@ }, "urllib3": { "hashes": [ - "sha256:41c3db2fc01e5b907288010dec72f9d0a74e37d6994e6eb56849f59fea2265ae", - "sha256:8819bba37a02d143296a4d032373c4dd4aca11f6d4c9973335ca75f9c8475f59" + "sha256:a68ac5e15e76e7e5dd2b8f94007233e01effe3e50e8daddf69acfd81cb686baf", + "sha256:b5725a0bd4ba422ab0e66e89e030c806576753ea3ee08554382c14e685d117b5" ], - "version": "==1.24" + "version": "==1.23" }, "webencodings": { "hashes": [ @@ -350,12 +271,6 @@ "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923" ], "version": "==0.5.1" - }, - "wrapt": { - "hashes": [ - "sha256:d4d560d479f2c21e1b5443bbd15fe7ec4b37fe7e53d335d3b9b0a7b1226fe3c6" - ], - "version": "==1.10.11" } } } diff --git a/README.md b/README.md index 0e1d153..4e15f73 100755 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ > Watch folders for file/directory events with a simple API. ## Supports -* Linux, Windows, Mac +* Linux & Windows * Python 2.7 & 3.4-3.7 ## Installation @@ -115,34 +115,8 @@ FolderSpy.watch(SaveFolder()) """An event occurred that was on a directory.""" ``` -### Mac -```python - def process_IN_ATTRIB(self, event): - """Metadata changed for a file.""" - - def process_IN_CREATE(self, event): - """A file/directory was created in watched directory.""" - - def process_IN_DELETE(self, event): - """A file/directory was deleted in watched directory.""" - - def process_IN_MODIFY(self, event): - """A file was modified.""" - - def process_IN_MOVED_FROM(self, event): - """A file/directory was moved away from the current watched directory.""" - - def process_IN_MOVED_TO(self, event): - """A file/directory was moved into the current watched directory.""" -``` - -## Dependencies -* Linux: ```pyinotify``` -* Windows: ```pypiwin32``` -* Mac: ```macfsevents``` - ## To-Do -* Start/Exit Events +* MacOS Support * Tests * Clean-up diff --git a/folderspy/__init__.py b/folderspy/__init__.py index f30b616..9a4f42c 100755 --- a/folderspy/__init__.py +++ b/folderspy/__init__.py @@ -1,12 +1,8 @@ -__version__ = '0.0.4' - import platform if platform.system() == 'Windows': from .windows import WatchableFolder, FolderSpy elif platform.system() == 'Linux': from .linux import WatchableFolder, FolderSpy -elif platform.system() == 'Darwin': - from .mac import WatchableFolder, FolderSpy else: raise Exception('{0} is not a supported.'.format(platform.system())) diff --git a/folderspy/__version__.py b/folderspy/__version__.py index bbef8c1..c1615a6 100755 --- a/folderspy/__version__.py +++ b/folderspy/__version__.py @@ -1 +1 @@ -__version__ = '0.0.4' +__version__ = '0.0.3' diff --git a/folderspy/linux/spy.py b/folderspy/linux/spy.py index ffc496e..57b30bc 100755 --- a/folderspy/linux/spy.py +++ b/folderspy/linux/spy.py @@ -21,9 +21,9 @@ def _setup_watchers(folders): proc_fun=folder, rec=folder.recursive ) - + @staticmethod - def _event_loop(folders, **kwargs): + def _event_loop(folders): """Kicks off the event loop that begins watching for events.""" asyncore.loop() diff --git a/folderspy/mac/__init__.py b/folderspy/mac/__init__.py deleted file mode 100644 index 8ec4baa..0000000 --- a/folderspy/mac/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from .folder import WatchableFolder -from .spy import FolderSpy diff --git a/folderspy/mac/folder.py b/folderspy/mac/folder.py deleted file mode 100644 index c2317ff..0000000 --- a/folderspy/mac/folder.py +++ /dev/null @@ -1,57 +0,0 @@ -import os.path - -from fsevents import Stream -from fsevents import IN_MODIFY, IN_ATTRIB, IN_CREATE, IN_DELETE, IN_MOVED_FROM, IN_MOVED_TO - - -class FileEvent(object): - - def __init__(self, full_path, maskname): - self.name = os.path.basename(full_path) - self.pathname = full_path - self.maskname = maskname - - -class WatchableFolder(object): - - MASK_NAMES = { - IN_MODIFY: 'IN_MODIFY', - IN_ATTRIB: 'IN_ATTRIB', - IN_CREATE: 'IN_CREATE', - IN_DELETE: 'IN_DELETE', - IN_MOVED_FROM: 'IN_MOVED_FROM', - IN_MOVED_TO: 'IN_MOVED_TO' - } - - def __init__(self, path='', recursive=False, listen_to=None): - self.path = path - self.recursive = recursive - self.listen_to = listen_to - self.stream = Stream(self._on_event, self.path, file_events=True) - - def _on_event(self, event): - """Called when any event is triggered.""" - - mask_name = self.MASK_NAMES[event.mask] - - getattr(self, 'process_{0}'.format(mask_name))( - FileEvent(event.name, mask_name) - ) - - def process_IN_ATTRIB(self, event): - """Metadata changed for a file.""" - - def process_IN_CREATE(self, event): - """A file/directory was created in watched directory.""" - - def process_IN_DELETE(self, event): - """A file/directory was deleted in watched directory.""" - - def process_IN_MODIFY(self, event): - """A file was modified.""" - - def process_IN_MOVED_FROM(self, event): - """A file/directory was moved away from the current watched directory.""" - - def process_IN_MOVED_TO(self, event): - """A file/directory was moved into the current watched directory.""" diff --git a/folderspy/mac/spy.py b/folderspy/mac/spy.py deleted file mode 100644 index d48ce1b..0000000 --- a/folderspy/mac/spy.py +++ /dev/null @@ -1,31 +0,0 @@ -from fsevents import Observer, Stream - -from folderspy.spy import Spy - - -class FolderSpy(Spy): - - def _setup_watchers(self, folders): - """Setup watchers for all folders.""" - - return {'observer': Observer()} - - def _event_loop(self, folders, **kwargs): - """Kicks off the event loop that begins watching for events.""" - - observer = kwargs['observer'] - - for folder in folders: - observer.schedule(folder.stream) - - observer.start() - - def _on_exit(self, folders, **kwargs): - """Called when folder spying ends.""" - - observer = kwargs['observer'] - - observer.stop() - for folder in folders: - observer.unschedule(folder.stream) - observer.join() diff --git a/folderspy/spy.py b/folderspy/spy.py index b6379fc..5248c86 100755 --- a/folderspy/spy.py +++ b/folderspy/spy.py @@ -8,28 +8,17 @@ class Spy(object): @classmethod def watch(cls, *args): """Set up watches and begin loop to trigger events on folders.""" - - instance = cls() - kwargs = instance._setup_watchers(args) - + cls._setup_watchers(args) try: - instance._event_loop(args, **kwargs) + cls._event_loop(args) except KeyboardInterrupt: - for folder in args: - try: - folder.on_exit() - except AttributeError: - pass - - instance._on_exit(args, **kwargs) sys.exit(0) - def _setup_watchers(self, folders): - """Setup watchers for all folders.""" - - def _event_loop(self, folders, **kwargs): + @staticmethod + def _event_loop(folders): """Kicks off the event loop that begins watching for events.""" - def _on_exit(self, folders, **kwargs): - """Called when folder spying ends.""" \ No newline at end of file + @staticmethod + def _setup_watchers(folders): + """Setup watchers for all folders.""" diff --git a/folderspy/windows/spy.py b/folderspy/windows/spy.py index 6c5076f..3b2a927 100755 --- a/folderspy/windows/spy.py +++ b/folderspy/windows/spy.py @@ -6,14 +6,15 @@ class FolderSpy(Spy): - def _event_loop(self, folders, **kwargs): + @staticmethod + def _event_loop(folders): """Kicks off the event loop that begins watching for events.""" event_queue = queue.Queue() for folder in folders: FolderWatcher(folder, queue=event_queue) - while True: + while 1: try: folder, events = event_queue.get_nowait() for event in events: diff --git a/setup.py b/setup.py index 5054041..e6e062e 100755 --- a/setup.py +++ b/setup.py @@ -79,8 +79,7 @@ def run(self): packages=find_packages(exclude=['tests']), install_requires=[ 'pyinotify ; platform_system == "Linux"', - 'pypiwin32 ; platform_system == "Windows"', - 'MacFSEvents ; platform_system == "Darwin"' + 'pypiwin32 ; platform_system == "Windows"' ], cmdclass={ 'publish': PublishCommand