p4b 0.0.1.pre11 → 0.0.1.pre18

Sign up to get free protection for your applications and to get access to all the features.
data/bin/p4b-bus ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/ruby
2
+ # encoding: utf-8
3
+
4
+ require_relative '../lib/p4b/bus/implementation'
5
+
6
+ P4B::Bus::Implementation.start_service 'druby://localhost:6000/'
7
+ P4B::Bus::Implementation.wait
data/bin/p4b-db ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/ruby
2
+ # encoding: utf-8
3
+
data/bin/p4b-md ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/ruby
2
+ # encoding: utf-8
3
+
data/bin/p4b-web ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/ruby
2
+ # encoding: utf-8
data/bin/p4b-web-api ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/ruby
2
+ # encoding: utf-8
3
+
data/lib/p4b/bus.rb ADDED
@@ -0,0 +1,73 @@
1
+ # encoding: utf-8
2
+
3
+ require 'drb'
4
+
5
+ require_relative 'bus/version'
6
+
7
+ # External interface for p4b-bus.
8
+
9
+ module P4B::Bus
10
+
11
+ class Service
12
+
13
+ include P4B::Error::Checking
14
+
15
+ # @param [DRbObject] srv
16
+ def initialize srv
17
+ _type DRbObject, srv
18
+ @server = srv
19
+ methods = srv.registered_methods
20
+ methods.each do |m|
21
+ define_singleton_method(m) { |*a, &b| @server.start(m, *a, &b).value }
22
+ pm = "start_#{m}".intern
23
+ define_singleton_method(pm) { |*a, &b| @server.start(m, *a, &b) }
24
+ end
25
+ end
26
+
27
+ # @see Object#send
28
+ # @param [Symbol] name
29
+ # @param [*Array<Object>] args
30
+ # @yield
31
+ def call name, *args, &block
32
+ _type Symbol, name
33
+ @server.start(name, *args, &block).value
34
+ end
35
+
36
+ # @param [Symbol] name
37
+ # @param [*Array<Object>] args
38
+ # @yield
39
+ # @return [DRbObject<Thread>]
40
+ def start name, *args, &block
41
+ _type Symbol, name
42
+ @server.start(name, *args, &block)
43
+ end
44
+
45
+ end
46
+
47
+ class << self
48
+
49
+ include P4B::Error::Checking
50
+
51
+ # @param [String] uri
52
+ # @param [Hash] opts
53
+ # @return [DRbObject]
54
+ def connect uri, opts = {}
55
+ _type String, uri
56
+ _type Hash, opts
57
+ DRb.start_service nil, nil, opts
58
+ @server = DRbObject.new nil, uri
59
+ end
60
+
61
+ # @param [Symbol] name
62
+ # @return [Service]
63
+ def get name
64
+ _type Symbol, name
65
+ @services ||= {}
66
+ @services[name] ||= Service.new(@server.get(name))
67
+ end
68
+
69
+ alias :[] :get
70
+
71
+ end
72
+
73
+ end
@@ -0,0 +1,155 @@
1
+ # encoding: utf-8
2
+
3
+ require 'drb'
4
+ require 'drctrl'
5
+
6
+ require 'p4b'
7
+
8
+ require_relative 'version'
9
+
10
+ # Use in p4b-bus internal.
11
+
12
+ module P4B::Bus::Implementation
13
+
14
+ class Service
15
+
16
+ include DRbUndumped
17
+ include P4B::Error::Checking
18
+
19
+ def initialize
20
+ @mutex = Mutex.new
21
+ @ids = 0
22
+ @objects = {}
23
+ @queue = []
24
+ @registered_methods = []
25
+ end
26
+
27
+ attr_reader :registered_methods
28
+
29
+ # @param [Object] object
30
+ # @param [*Array<Symbol>] methods
31
+ # @return [Fixnum]
32
+ def add_instance object, *methods
33
+ _type DRbObject, object
34
+ _type Symbol, *methods
35
+ @mutex.synchronize do
36
+ id = @ids += 1
37
+ @objects[id] = object
38
+ @queue.push id
39
+ @registered_methods.concat methods.compact
40
+ @registered_methods.uniq!
41
+ id
42
+ end
43
+ end
44
+
45
+ # @param [Fixnum] id
46
+ # @return [Object, nil]
47
+ def remove_instance id
48
+ _type Fixnum, id
49
+ @mutex.synchronize do
50
+ value = @objects.delete id
51
+ @queue.delete id
52
+ value
53
+ end
54
+ end
55
+
56
+ # @return [Boolean]
57
+ def empty?
58
+ @mutex.synchronize { @objects.empty? }
59
+ end
60
+
61
+ # @param [Symbol] method
62
+ # @param [*Array<Object>] args
63
+ # @yield
64
+ # @return [Thread]
65
+ def start method, *args, &block
66
+ _type Symbol, method
67
+ Thread.start method, args, block, &method(:do_call)
68
+ end
69
+
70
+ private
71
+
72
+ # @param [Symbol] method
73
+ # @param [Array<Object>] args
74
+ # @param [Proc] block
75
+ # @return [Object]
76
+ def do_call method, args, block
77
+ if empty?
78
+ # TODO: Error
79
+ end
80
+ sleep 1.0 until (id = @mutex.synchronize { @queue.shift })
81
+ obj = @mutex.synchronize { @objects[id] }
82
+ result = obj.send method, *args, &block
83
+ @mutex.synchronize { @queue.push(id) }
84
+ result
85
+ end
86
+
87
+ end
88
+
89
+ class << self
90
+
91
+ include DRbUndumped
92
+ include P4B::Error::Checking
93
+
94
+ # @param [Symbol] name
95
+ # @param [Object] object
96
+ # @param [*Array<Symbol>] methods
97
+ # @return [Fixnum]
98
+ def register name, object, *methods
99
+ _type Symbol, name
100
+ _type DRbObject, object
101
+ _type Symbol, *methods
102
+ @mutex ||= Mutex.new
103
+ @mutex.synchronize do
104
+ @services ||= {}
105
+ @services[nm] ||= Service.new
106
+ @services[nm].add_instance object, *methods
107
+ end
108
+ end
109
+
110
+ # @param [Symbol] name
111
+ # @param [Fixnum] id
112
+ # @return [Object]
113
+ def unregister name, id
114
+ _type Symbol, name
115
+ _type Fixnum, id
116
+ @mutex ||= Mutex.new
117
+ @mutex.synchronize do
118
+ @services ||= {}
119
+ @services[nm] ||= Service.new
120
+ @services[nm].remove_instance id
121
+ end
122
+ end
123
+
124
+ # @param [Symbol] name
125
+ # @return [Service]
126
+ def get name
127
+ _type Symbol, name
128
+ @mutex ||= Mutex.new
129
+ @mutex.synchronize do
130
+ @services ||= {}
131
+ @services[nm] ||= Service.new
132
+ end
133
+ end
134
+
135
+ alias :[] :get
136
+
137
+ # @param [String] uri
138
+ # @param [Hash] opts
139
+ # @return [DRbServer]
140
+ def start_service uri, opts = {}
141
+ _type String, uri
142
+ _type Hash, opts
143
+ DRCtrl.start_service
144
+ DRb.start_service uri, self, opts
145
+ end
146
+
147
+ # @return [void]
148
+ def wait
149
+ DRCtrl.wait
150
+ end
151
+
152
+ end
153
+
154
+ end
155
+
@@ -0,0 +1,9 @@
1
+ # encoding: utf-8
2
+
3
+ module P4B; end
4
+
5
+ module P4B::Bus
6
+
7
+ VERSION = [ 0, 0, 1, :pre ]
8
+
9
+ end
data/lib/p4b/db.rb ADDED
@@ -0,0 +1 @@
1
+
@@ -0,0 +1,9 @@
1
+ # encoding: utf-8
2
+
3
+ module P4B; end
4
+
5
+ module P4B::Database
6
+
7
+ VERSION = [ 0, 0, 1, :pre ]
8
+
9
+ end
data/lib/p4b/md.rb ADDED
@@ -0,0 +1 @@
1
+
@@ -0,0 +1,9 @@
1
+ # encoding: utf-8
2
+
3
+ module P4B; end
4
+
5
+ module P4B::Microdata
6
+
7
+ VERSION = [ 0, 0, 1, :pre ]
8
+
9
+ end
data/lib/p4b/web.rb ADDED
@@ -0,0 +1 @@
1
+
@@ -0,0 +1 @@
1
+
@@ -0,0 +1,9 @@
1
+ # encoding: utf-8
2
+
3
+ module P4B; end
4
+
5
+ module P4B::Web::API
6
+
7
+ VERSION = [ 0, 0, 1, :pre ]
8
+
9
+ end
@@ -0,0 +1,9 @@
1
+ # encoding: utf-8
2
+
3
+ module P4B; end
4
+
5
+ module P4B::Web
6
+
7
+ VERSION = [ 0, 0, 1, :pre ]
8
+
9
+ end
data/share/p4b.css ADDED
@@ -0,0 +1 @@
1
+
data/share/p4b.html ADDED
@@ -0,0 +1,20 @@
1
+ <!DOCTYPE html>
2
+
3
+ <html>
4
+
5
+ <head>
6
+
7
+ <meta charset="UTF-8">
8
+
9
+ <script src="p4b.js"></script>
10
+
11
+ </head>
12
+
13
+ <body>
14
+
15
+
16
+ <script>init();</script>
17
+
18
+ </body>
19
+
20
+ </html>
data/share/p4b.js ADDED
@@ -0,0 +1,286 @@
1
+ /* encoding: utf-8 */
2
+
3
+ var P4B = {};
4
+
5
+ window.P4B_SESSION = 0;
6
+
7
+ function init() {
8
+
9
+ function $method(func) {
10
+ return {
11
+ value: func,
12
+ writable: false,
13
+ enumerable: true,
14
+ configurable: false
15
+ };
16
+ };
17
+ function $hidden_method(func) {
18
+ return {
19
+ value: func,
20
+ writable: false,
21
+ enumerable: false,
22
+ configurable: false
23
+ };
24
+ }
25
+ function $methods_desc() {
26
+ var result = {};
27
+ for (var i = 0, l = arguments.length; i < l; i++) {
28
+ var func = arguments[i];
29
+ result[func.name] = $method(func);
30
+ }
31
+ return result;
32
+ }
33
+ function $hidden_methods_desc() {
34
+ var result = {};
35
+ for (var i = 0, l = arguments.length; i < l; i++) {
36
+ var func = arguments[i];
37
+ result[func.name] = $hidden_method(func);
38
+ }
39
+ return result;
40
+ }
41
+
42
+ function $property_desc(name, rw) {
43
+ var result = {};
44
+ var _name = '_' + name;
45
+ result[_name] = {
46
+ value: null,
47
+ writable: true,
48
+ enumerable: false,
49
+ configurable: false
50
+ };
51
+ var getter = function() { return this[_name]; };
52
+ var setter;
53
+ if (rw) {
54
+ setter = function(val) {
55
+ this[_name] = val;
56
+ if (this.modify) {
57
+ this.modify();
58
+ }
59
+ };
60
+ }
61
+ result[name] = {
62
+ get: getter,
63
+ set: setter,
64
+ enumerable: true,
65
+ configurable: false
66
+ }
67
+ return result;
68
+ }
69
+ function $rw_desc() {
70
+ var result = {};
71
+ for (var i = 0, l = arguments.length; i < l; i++) {
72
+ var name = arguments[i];
73
+ var _name = '_' + name;
74
+ var desc = $property_desc(name, true);
75
+ result[name] = desc[name];
76
+ result[_name] = desc[_name];
77
+ }
78
+ return result;
79
+ }
80
+ function $ro_desc() {
81
+ var result = {};
82
+ for (var i = 0, l = arguments.length; i < l; i++) {
83
+ var name = arguments[i];
84
+ var _name = '_' + name;
85
+ var desc = $property_desc(name, false);
86
+ result[name] = desc[name];
87
+ result[_name] = desc[_name];
88
+ }
89
+ return result;
90
+ }
91
+
92
+ Object.defineProperties(
93
+ Object.prototype,
94
+ {
95
+ $add_methods: $hidden_method(function $add_methods() {
96
+ Object.defineProperties(
97
+ this,
98
+ $methods_desc.apply(this, arguments)
99
+ );
100
+ }),
101
+ $add_hidden_methods: $hidden_method(function $add_hidden_methods() {
102
+ Object.defineProperties(
103
+ this,
104
+ $hidden_methods_desc.apply(this, arguments)
105
+ );
106
+ }),
107
+ $add_rw_properties: $hidden_method(function $add_rw_properties() {
108
+ Object.defineProperties(
109
+ this,
110
+ $rw_desc.apply(this, arguments)
111
+ );
112
+ }),
113
+ $add_ro_properties: $hidden_method(function $add_ro_properties() {
114
+ Object.defineProperties(
115
+ this,
116
+ $ro_desc.apply(this, arguments)
117
+ );
118
+ })
119
+ }
120
+ );
121
+
122
+ Function.prototype.$add_hidden_methods(function $inherit(ancestor) {
123
+ Object.defineProperty(
124
+ this,
125
+ 'prototype',
126
+ {
127
+ writable: false,
128
+ enumerable: false,
129
+ configurable: false,
130
+ value: Object.create(ancestor.prototype, {
131
+ constructor: $hidden_method(this)
132
+ })
133
+ }
134
+ );
135
+ });
136
+
137
+ function lead(s, len) {
138
+ var res = s.toString();
139
+ while (res.length < len) {
140
+ res = '0' + res;
141
+ }
142
+ return res;
143
+ }
144
+
145
+ function user_id() {
146
+ return '00000000'; // placeholder, TODO!
147
+ }
148
+
149
+ function date_id() {
150
+ var now = new Date();
151
+ return [
152
+ lead(now.getUTCFullYear(), 4),
153
+ lead(now.getUTCMonth(), 2) + lead(now.getUTCDate(), 2),
154
+ lead(now.getUTCHours(), 2) + lead(now.getUTCMinutes(), 2)
155
+ ].join('-');
156
+ }
157
+
158
+ var _seed = null;
159
+ function seed_id() {
160
+ if (!_seed) {
161
+ _seed = lead(Math.floor(Math.random() * 0x10000).toString(16), 4);
162
+ }
163
+ return _seed;
164
+ }
165
+
166
+ function date_uid (date) {
167
+ return lead(date.getUTCFullYear(), 4) + '-' +
168
+ lead(date.getUTCMonth(), 2) + lead(date.getUTCDate(), 2) + '-' +
169
+ lead(date.getUTCHours(), 2) + lead(date.getUTCMinutes(), 2);
170
+ }
171
+
172
+ var _guid = 0;
173
+ function guid() {
174
+ return [
175
+ user_id(),
176
+ date_id(),
177
+ seed_id() + lead((++_guid).toString(), 8)
178
+ ].join('-');
179
+ }
180
+
181
+ function $guid(obj, data) {
182
+ var value = data['id'];
183
+ if (!value) {
184
+ obj._modified = true;
185
+ value = guid();
186
+ }
187
+ Object.defineProperty(
188
+ obj,
189
+ 'guid',
190
+ {
191
+ writable: false,
192
+ enumerable: true,
193
+ configurable: false,
194
+ value: value
195
+ }
196
+ );
197
+ }
198
+
199
+ var _luid = 0;
200
+ function luid() {
201
+ return ++_luid;
202
+ }
203
+
204
+ function $luid(obj) {
205
+ Object.defineProperty(
206
+ obj,
207
+ 'luid',
208
+ {
209
+ writable: false,
210
+ enumerable: true,
211
+ configurable: false,
212
+ value: luid()
213
+ }
214
+ );
215
+ }
216
+
217
+ var _list = {
218
+ guid: {},
219
+ luid: {}
220
+ };
221
+ function $list(obj) {
222
+ _list.guid[obj.guid] = obj;
223
+ _list.luid[obj.luid] = obj;
224
+ }
225
+ function $find(value) {
226
+ result = {
227
+ object: null,
228
+ guid: null,
229
+ luid: null
230
+ }
231
+ if (value instanceof Data) {
232
+ result.object = value;
233
+ result.guid = result.object.guid;
234
+ result.luid = result.object.luid;
235
+ } else if (typeof(value) === 'number') {
236
+ result = $find(_list.luid[value]);
237
+ } else if (typeof(value) === 'string') {
238
+ result = $find(_list.guid[value]);
239
+ }
240
+ return result;
241
+ }
242
+
243
+ function Data(data) {
244
+ data = data || {};
245
+ this._modified = false;
246
+ $guid(this, data);
247
+ $luid(this);
248
+ $list(this);
249
+ //
250
+ }
251
+ Data.$inherit(Object);
252
+ Data.prototype.$add_ro_properties('modified');
253
+ Data.prototype.$add_methods(function modify() { this._modified = true; });
254
+
255
+ function Item(data) {
256
+ Data.call(this, data);
257
+ //
258
+ }
259
+ Item.$inherit(Data);
260
+
261
+ function Group(data) {
262
+ Item.call(this, data);
263
+ //
264
+ }
265
+ Group.$inherit(Item);
266
+
267
+ function Element(data) {
268
+ Item.call(this, data);
269
+ //
270
+ }
271
+ Element.$inherit(Item);
272
+
273
+ P4B.$add_methods(Data, Item, Group, Element);
274
+
275
+ console.log(P4B);
276
+ e = new Element();
277
+ console.log(e);
278
+ console.log(e instanceof Data);
279
+ console.log(guid());
280
+ console.log(guid());
281
+ console.log(luid());
282
+ console.log(document.cookie);
283
+
284
+ }
285
+
286
+