pbind 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/pbind.rb +1 -88
- data/lib/pbind/command.rb +32 -2
- data/lib/pbind/command/mock.rb +109 -0
- data/lib/pbind/command/watch.rb +16 -21
- data/source/PBLiveLoader/PBDirectoryWatcher.h +38 -0
- data/source/PBLiveLoader/PBDirectoryWatcher.m +466 -0
- data/source/PBLiveLoader/PBLiveLoader.h +25 -0
- data/source/PBLiveLoader/PBLiveLoader.m +203 -0
- data/source/PBLocalhost/ignore.h +2 -2
- metadata +7 -6
- data/source/PBPlayground/PBPlayground.h +0 -19
- data/source/PBPlayground/PBPlayground.m +0 -237
- data/source/PBPlayground/SGDirWatchdog.h +0 -29
- data/source/PBPlayground/SGDirWatchdog.m +0 -163
@@ -1,29 +0,0 @@
|
|
1
|
-
//
|
2
|
-
// SGDirObserver.h
|
3
|
-
// DirectoryObserver
|
4
|
-
//
|
5
|
-
// Copyright (c) 2011 Simon Grätzer.
|
6
|
-
//
|
7
|
-
|
8
|
-
#include <targetconditionals.h>
|
9
|
-
|
10
|
-
#if (DEBUG && TARGET_IPHONE_SIMULATOR)
|
11
|
-
|
12
|
-
#import <Foundation/Foundation.h>
|
13
|
-
|
14
|
-
@interface SGDirWatchdog : NSObject
|
15
|
-
|
16
|
-
@property (readonly, nonatomic) NSString *path;
|
17
|
-
@property (copy, nonatomic) void (^update)(void);
|
18
|
-
|
19
|
-
+ (NSString *)documentsPath;
|
20
|
-
+ (id)watchtdogOnDocumentsDir:(void (^)(void))update;
|
21
|
-
|
22
|
-
- (id)initWithPath:(NSString *)path update:(void (^)(void))update;
|
23
|
-
|
24
|
-
- (void)start;
|
25
|
-
- (void)stop;
|
26
|
-
|
27
|
-
@end
|
28
|
-
|
29
|
-
#endif
|
@@ -1,163 +0,0 @@
|
|
1
|
-
//
|
2
|
-
// SGDirObserver.m
|
3
|
-
// DirectoryObserver
|
4
|
-
//
|
5
|
-
// Copyright (c) 2011 Simon Grätzer.
|
6
|
-
//
|
7
|
-
|
8
|
-
#import "SGDirWatchdog.h"
|
9
|
-
|
10
|
-
#if (DEBUG && TARGET_IPHONE_SIMULATOR)
|
11
|
-
|
12
|
-
#import <fcntl.h>
|
13
|
-
#import <unistd.h>
|
14
|
-
#import <sys/event.h>
|
15
|
-
|
16
|
-
@interface SGDirWatchdog ()
|
17
|
-
@property (nonatomic, readonly) CFFileDescriptorRef kqRef;
|
18
|
-
- (void)kqueueFired;
|
19
|
-
@end
|
20
|
-
|
21
|
-
|
22
|
-
static void KQCallback(CFFileDescriptorRef kqRef, CFOptionFlags callBackTypes, void *info) {
|
23
|
-
// Pick up the object passed in the "info" member of the CFFileDescriptorContext passed to CFFileDescriptorCreate
|
24
|
-
SGDirWatchdog* obj = (__bridge SGDirWatchdog*) info;
|
25
|
-
|
26
|
-
if ([obj isKindOfClass:[SGDirWatchdog class]] && // If we can call back to the proper sort of object ...
|
27
|
-
(kqRef == obj.kqRef) && // and the FD that issued the CB is the expected one ...
|
28
|
-
(callBackTypes == kCFFileDescriptorReadCallBack) ) // and we're processing the proper sort of CB ...
|
29
|
-
{
|
30
|
-
[obj kqueueFired]; // Invoke the instance's CB handler
|
31
|
-
}
|
32
|
-
}
|
33
|
-
|
34
|
-
@implementation SGDirWatchdog {
|
35
|
-
int _dirFD;
|
36
|
-
CFFileDescriptorRef _kqRef;
|
37
|
-
}
|
38
|
-
|
39
|
-
+ (NSString *)documentsPath {
|
40
|
-
NSArray *documentsPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
|
41
|
-
|
42
|
-
return documentsPaths[0]; // Path to the application's "Documents" directory
|
43
|
-
}
|
44
|
-
|
45
|
-
+ (id)watchtdogOnDocumentsDir:(void (^)(void))update; {
|
46
|
-
return [[SGDirWatchdog alloc]initWithPath:[self documentsPath] update:update];
|
47
|
-
}
|
48
|
-
|
49
|
-
|
50
|
-
- (id)initWithPath:(NSString *)path update:(void (^)(void))update; {
|
51
|
-
if ((self = [super init])) {
|
52
|
-
_path = path;
|
53
|
-
_update = [update copy];
|
54
|
-
}
|
55
|
-
return self;
|
56
|
-
}
|
57
|
-
|
58
|
-
- (void)dealloc {
|
59
|
-
[self stop];
|
60
|
-
|
61
|
-
|
62
|
-
}
|
63
|
-
|
64
|
-
#pragma mark -
|
65
|
-
#pragma mark Extension methods
|
66
|
-
|
67
|
-
- (void)kqueueFired {
|
68
|
-
// Pull the native FD around which the CFFileDescriptor was wrapped
|
69
|
-
int kq = CFFileDescriptorGetNativeDescriptor(_kqRef);
|
70
|
-
if (kq < 0) return;
|
71
|
-
|
72
|
-
// If we pull a single available event out of the queue, assume the directory was updated
|
73
|
-
struct kevent event;
|
74
|
-
struct timespec timeout = {0, 0};
|
75
|
-
if (kevent(kq, NULL, 0, &event, 1, &timeout) == 1 && _update) {
|
76
|
-
_update();
|
77
|
-
}
|
78
|
-
|
79
|
-
// (Re-)Enable a one-shot (the only kind) callback
|
80
|
-
CFFileDescriptorEnableCallBacks(_kqRef, kCFFileDescriptorReadCallBack);
|
81
|
-
}
|
82
|
-
|
83
|
-
|
84
|
-
- (void)start {
|
85
|
-
// One ping only
|
86
|
-
if (_kqRef != NULL) return;
|
87
|
-
|
88
|
-
// Fetch pathname of the directory to monitor
|
89
|
-
NSString* docPath = self.path;
|
90
|
-
if (!docPath) return;
|
91
|
-
|
92
|
-
// Open an event-only file descriptor associated with the directory
|
93
|
-
int dirFD = open([docPath fileSystemRepresentation], O_EVTONLY);
|
94
|
-
if (dirFD < 0) return;
|
95
|
-
|
96
|
-
// Create a new kernel event queue
|
97
|
-
int kq = kqueue();
|
98
|
-
if (kq < 0)
|
99
|
-
{
|
100
|
-
close(dirFD);
|
101
|
-
return;
|
102
|
-
}
|
103
|
-
|
104
|
-
// Set up a kevent to monitor
|
105
|
-
struct kevent eventToAdd; // Register an (ident, filter) pair with the kqueue
|
106
|
-
eventToAdd.ident = dirFD; // The object to watch (the directory FD)
|
107
|
-
eventToAdd.filter = EVFILT_VNODE; // Watch for certain events on the VNODE spec'd by ident
|
108
|
-
eventToAdd.flags = EV_ADD | EV_CLEAR; // Add a resetting kevent
|
109
|
-
eventToAdd.fflags = NOTE_WRITE; // The events to watch for on the VNODE spec'd by ident (writes)
|
110
|
-
eventToAdd.data = 0; // No filter-specific data
|
111
|
-
eventToAdd.udata = NULL; // No user data
|
112
|
-
|
113
|
-
// Add a kevent to monitor
|
114
|
-
if (kevent(kq, &eventToAdd, 1, NULL, 0, NULL)) {
|
115
|
-
close(kq);
|
116
|
-
close(dirFD);
|
117
|
-
return;
|
118
|
-
}
|
119
|
-
|
120
|
-
// Wrap a CFFileDescriptor around a native FD
|
121
|
-
CFFileDescriptorContext context = {0, (__bridge void *)(self), NULL, NULL, NULL};
|
122
|
-
_kqRef = CFFileDescriptorCreate(NULL, // Use the default allocator
|
123
|
-
kq, // Wrap the kqueue
|
124
|
-
true, // Close the CFFileDescriptor if kq is invalidated
|
125
|
-
KQCallback, // Fxn to call on activity
|
126
|
-
&context); // Supply a context to set the callback's "info" argument
|
127
|
-
if (_kqRef == NULL) {
|
128
|
-
close(kq);
|
129
|
-
close(dirFD);
|
130
|
-
return;
|
131
|
-
}
|
132
|
-
|
133
|
-
// Spin out a pluggable run loop source from the CFFileDescriptorRef
|
134
|
-
// Add it to the current run loop, then release it
|
135
|
-
CFRunLoopSourceRef rls = CFFileDescriptorCreateRunLoopSource(NULL, _kqRef, 0);
|
136
|
-
if (rls == NULL) {
|
137
|
-
CFRelease(_kqRef); _kqRef = NULL;
|
138
|
-
close(kq);
|
139
|
-
close(dirFD);
|
140
|
-
return;
|
141
|
-
}
|
142
|
-
CFRunLoopAddSource(CFRunLoopGetCurrent(), rls, kCFRunLoopDefaultMode);
|
143
|
-
CFRelease(rls);
|
144
|
-
|
145
|
-
// Store the directory FD for later closing
|
146
|
-
_dirFD = dirFD;
|
147
|
-
|
148
|
-
// Enable a one-shot (the only kind) callback
|
149
|
-
CFFileDescriptorEnableCallBacks(_kqRef, kCFFileDescriptorReadCallBack);
|
150
|
-
}
|
151
|
-
|
152
|
-
- (void)stop {
|
153
|
-
if (_kqRef) {
|
154
|
-
close(_dirFD);
|
155
|
-
CFFileDescriptorInvalidate(_kqRef);
|
156
|
-
CFRelease(_kqRef);
|
157
|
-
_kqRef = NULL;
|
158
|
-
}
|
159
|
-
}
|
160
|
-
|
161
|
-
@end
|
162
|
-
|
163
|
-
#endif
|