procemon 0.1.3 → 0.1.4
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.
- data/README.md +10 -359
- data/VERSION +1 -1
- data/examples/how_to_inject_with_extra_process_a_method.rb +33 -0
- data/lib/procemon/function/meta/inject_methods.rb +14 -23
- data/lib/procemon/mpatch/proc.rb +7 -1
- data/test/test.rb +21 -5
- metadata +2 -1
data/README.md
CHANGED
|
@@ -11,362 +11,13 @@ tmp folder helpers, Application centralized datas, folder structure logic ,
|
|
|
11
11
|
meta data control, dynamic lib read etc
|
|
12
12
|
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
in
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
in Tmp_dir
|
|
26
|
-
|
|
27
|
-
init a tmpdir in the OS tmp folder with the application name
|
|
28
|
-
(by default this is the root folder name)
|
|
29
|
-
tmpdir_init
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
in Name
|
|
33
|
-
|
|
34
|
-
what it looks to be
|
|
35
|
-
set_app_name_by_root_folder
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
in Argv
|
|
39
|
-
|
|
40
|
-
what it looks to be
|
|
41
|
-
process_parameters
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
in Daemon
|
|
45
|
-
|
|
46
|
-
Checks to see if the current process is the child process and if not
|
|
47
|
-
will update the pid file with the child pid.
|
|
48
|
-
self.start pid, pidfile, outfile, errfile
|
|
49
|
-
|
|
50
|
-
Attempts to write the pid of the forked process to the pid file.
|
|
51
|
-
self.write pid, pidfile
|
|
52
|
-
|
|
53
|
-
Try and read the existing pid from the pid file and signal the
|
|
54
|
-
process. Returns true for a non blocking status.
|
|
55
|
-
self.kill(pidfile)
|
|
56
|
-
|
|
57
|
-
Send stdout and stderr to log files for the child process
|
|
58
|
-
self.redirect outfile, errfile
|
|
59
|
-
self.daemonize
|
|
60
|
-
self.kill_with_pid
|
|
61
|
-
self.terminate
|
|
62
|
-
self.kill_by_name(*args)
|
|
63
|
-
self.stop
|
|
64
|
-
self.init
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
in Inject_methods
|
|
68
|
-
|
|
69
|
-
this will inject a code block to a target instance method
|
|
70
|
-
by default the before or after sym is not required
|
|
71
|
-
default => before
|
|
72
|
-
|
|
73
|
-
Test.inject_singleton_method :hello do |*args|
|
|
74
|
-
puts "singleton extra, so{args[0]}"
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
inject_singleton_method(method,options=:before,&block)
|
|
78
|
-
|
|
79
|
-
Singleton.methods[self.object_id]= self.method(method)
|
|
80
|
-
this will inject a code block to a target singleton method
|
|
81
|
-
by default the before or after sym is not required
|
|
82
|
-
default => before
|
|
83
|
-
|
|
84
|
-
Test.inject_instance_method :hello, :before do |*args|
|
|
85
|
-
puts "singleton on a instance method and "+args[0]
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
inject_instance_method(method,options=:before,&block)
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
in Require
|
|
92
|
-
|
|
93
|
-
load meta-s
|
|
94
|
-
meta_load(app_folder= Dir.pwd)
|
|
95
|
-
|
|
96
|
-
find elements
|
|
97
|
-
get_meta_config(app_folder= Dir.pwd)
|
|
98
|
-
|
|
99
|
-
defaults
|
|
100
|
-
find elements
|
|
101
|
-
defaults
|
|
102
|
-
processing
|
|
103
|
-
return data
|
|
104
|
-
mount libs
|
|
105
|
-
mount_libs(app_folder= Dir.pwd)
|
|
106
|
-
|
|
107
|
-
load lib files
|
|
108
|
-
Offline repo activate
|
|
109
|
-
mount_modules(app_folder= Dir.pwd)
|
|
110
|
-
|
|
111
|
-
Return File_name => File_path
|
|
112
|
-
get_files(folder)
|
|
113
|
-
|
|
114
|
-
Validation
|
|
115
|
-
Check that does the folder is absolute or not
|
|
116
|
-
Get Files list
|
|
117
|
-
Return file_name:folder
|
|
118
|
-
require by absolute path directory's files
|
|
119
|
-
require_directory(folder)
|
|
120
|
-
|
|
121
|
-
require sender relative directory's files
|
|
122
|
-
require_relative_directory(folder)
|
|
123
|
-
|
|
124
|
-
generate config from yaml (default is app_root/config folder)
|
|
125
|
-
generate_config(target_config_hash= Application.config,app_folder= Dir.pwd)
|
|
126
|
-
|
|
127
|
-
try load all the ruby files marked with "generate" in they name from app_root/docs
|
|
128
|
-
generate_documentation(boolean= false,keyword= "generate",app_folder= Dir.pwd)
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
in Port
|
|
132
|
-
|
|
133
|
-
get_port(mint_port,max_port,host="0.0.0.0")
|
|
134
|
-
port_open?(port,host="0.0.0.0")
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
in Eval
|
|
138
|
-
|
|
139
|
-
NOT working yet, need to rework the exclude method
|
|
140
|
-
safe_eval(string [, binding [, filename [,lineno]]] *allowed_class/module_names ) -> obj
|
|
141
|
-
|
|
142
|
-
Evaluates the Ruby expression(s) in <em>string</em>. If
|
|
143
|
-
<em>binding</em> is given, which must be a <code>Binding</code>
|
|
144
|
-
object, the evaluation is performed in its context. If the
|
|
145
|
-
optional <em>filename</em> and <em>lineno</em> parameters are
|
|
146
|
-
present, they will be used when reporting syntax errors.
|
|
147
|
-
|
|
148
|
-
def get_binding(str)
|
|
149
|
-
return binding
|
|
150
|
-
end
|
|
151
|
-
str = "hello"
|
|
152
|
-
safe_eval "str + ' Fred'" ,Kernel#=> "hello Fred"
|
|
153
|
-
safe_eval "str + ' Fred'", get_binding("bye") ,Kernel#=> "bye Fred"
|
|
154
|
-
safe_eval(*args)
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
in Process
|
|
158
|
-
|
|
159
|
-
self.daemonize
|
|
160
|
-
self.stop
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
in String
|
|
164
|
-
|
|
165
|
-
Find string in othere string
|
|
166
|
-
positions(oth_string)
|
|
167
|
-
|
|
168
|
-
return value
|
|
169
|
-
Standard in rails. See official documentation
|
|
170
|
-
[http://api.rubyonrails.org/classes/ActiveSupport/CoreExtensions/String/Inflections.html]
|
|
171
|
-
camelize(first_letter = :upper)
|
|
172
|
-
|
|
173
|
-
Standard in rails. See official documentation
|
|
174
|
-
[http://api.rubyonrails.org/classes/ActiveSupport/CoreExtensions/String/Inflections.html]
|
|
175
|
-
dasherize
|
|
176
|
-
|
|
177
|
-
Standard in rails. See official documentation
|
|
178
|
-
[http://api.rubyonrails.org/classes/ActiveSupport/CoreExtensions/String/Inflections.html]
|
|
179
|
-
demodulize
|
|
180
|
-
|
|
181
|
-
Standard in rails. See official documentation
|
|
182
|
-
[http://api.rubyonrails.org/classes/ActiveSupport/CoreExtensions/String/Inflections.html]
|
|
183
|
-
underscore
|
|
184
|
-
|
|
185
|
-
Check that instance of String is start with an upper case or not
|
|
186
|
-
capitalized?
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
in Yml
|
|
190
|
-
|
|
191
|
-
self.save_file(file_path,config_hash)
|
|
192
|
-
|
|
193
|
-
self.load_file(file_path)
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
in Object
|
|
197
|
-
|
|
198
|
-
The hidden singleton lurks behind everyone
|
|
199
|
-
metaclass; class << self; self; end; end
|
|
200
|
-
|
|
201
|
-
extend the metaclass with an instance eval
|
|
202
|
-
meta_eval &blk; metaclass.instance_eval &blk; end
|
|
203
|
-
|
|
204
|
-
Adds methods to a metaclass
|
|
205
|
-
meta_name, &blk
|
|
206
|
-
|
|
207
|
-
Defines an instance method within a class
|
|
208
|
-
class_name, &blk
|
|
209
|
-
|
|
210
|
-
constantize object
|
|
211
|
-
constantize
|
|
212
|
-
|
|
213
|
-
find and replace object in object
|
|
214
|
-
find_and_replace(input,*params)
|
|
215
|
-
|
|
216
|
-
it was made only for fun to make same each to array and hash and everything
|
|
217
|
-
each_universal(&block)
|
|
218
|
-
|
|
219
|
-
map an object => experiment
|
|
220
|
-
map_object(symbol_key="$type")
|
|
221
|
-
|
|
222
|
-
is class?
|
|
223
|
-
class?
|
|
224
|
-
|
|
225
|
-
convert class instance instance variables into a hash object
|
|
226
|
-
convert_to_hash
|
|
227
|
-
|
|
228
|
-
this will check that the class is
|
|
229
|
-
defined or not in the runtime memory
|
|
230
|
-
class_exists?
|
|
231
|
-
|
|
232
|
-
This will convert a symbol or string and format to be a valid
|
|
233
|
-
constant name and create from it a class with instance attribute accessors
|
|
234
|
-
Best use is when you get raw data in string from external source
|
|
235
|
-
and you want make them class objects
|
|
236
|
-
|
|
237
|
-
:hello_world.to_class(:test)
|
|
238
|
-
HelloWorld.to_class(:sup)
|
|
239
|
-
hw_var = HelloWorld.new
|
|
240
|
-
hw_var.sup = "Fine thanks!"
|
|
241
|
-
hw_var.test = 5
|
|
242
|
-
|
|
243
|
-
puts hw_var.test
|
|
244
|
-
|
|
245
|
-
> produce 5 :Integer
|
|
246
|
-
|
|
247
|
-
you can also use this formats
|
|
248
|
-
:HelloWorld , "hello.world",
|
|
249
|
-
"hello/world", "Hello::World",
|
|
250
|
-
"hello:world"...
|
|
251
|
-
to_class(*attributes)
|
|
252
|
-
or
|
|
253
|
-
create_attributes(*attributes)
|
|
254
|
-
|
|
255
|
-
in File
|
|
256
|
-
|
|
257
|
-
self.create(route_name ,filemod="w",string_data=String.new)
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
in Array
|
|
261
|
-
|
|
262
|
-
remove arguments or array of
|
|
263
|
-
parameters from the main array
|
|
264
|
-
trim(*args)
|
|
265
|
-
|
|
266
|
-
return index of the target element
|
|
267
|
-
index_of(target_element)
|
|
268
|
-
|
|
269
|
-
remove n. element from the end
|
|
270
|
-
and return a new object
|
|
271
|
-
pinch n=1
|
|
272
|
-
|
|
273
|
-
remove n. element from the end
|
|
274
|
-
and return the original object
|
|
275
|
-
pinch! n=1
|
|
276
|
-
|
|
277
|
-
return boolean by other array
|
|
278
|
-
all element included or
|
|
279
|
-
not in the target array
|
|
280
|
-
contain?(oth_array)#anothere array
|
|
281
|
-
|
|
282
|
-
do safe transpose
|
|
283
|
-
safe_transpose
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
in Class
|
|
287
|
-
|
|
288
|
-
get singleton methods to target class without super class methods
|
|
289
|
-
class_methods
|
|
290
|
-
|
|
291
|
-
bind a singleton method to a class object
|
|
292
|
-
create_class_method(method,&block)
|
|
293
|
-
|
|
294
|
-
create an instance method
|
|
295
|
-
create_instance_method(method,&block)
|
|
296
|
-
|
|
297
|
-
Iterates over all subclasses (direct and indirect)
|
|
298
|
-
each_subclass
|
|
299
|
-
|
|
300
|
-
Returns an Array of subclasses (direct and indirect)
|
|
301
|
-
subclasses
|
|
302
|
-
|
|
303
|
-
Returns an Array of direct subclasses
|
|
304
|
-
direct_subclasses
|
|
305
|
-
|
|
306
|
-
create singleton attribute
|
|
307
|
-
class_attr_accessor(name)
|
|
308
|
-
|
|
309
|
-
GET
|
|
310
|
-
SET
|
|
311
|
-
create class instance attribute
|
|
312
|
-
instance_attr_accessor(name)
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
in Integer
|
|
316
|
-
|
|
317
|
-
because for i in integer/fixnum not working,
|
|
318
|
-
here is a little patch
|
|
319
|
-
each &block
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
in Random
|
|
323
|
-
|
|
324
|
-
string(length= 7,amount=1)
|
|
325
|
-
|
|
326
|
-
integer(length= 3)
|
|
327
|
-
|
|
328
|
-
boolean
|
|
329
|
-
|
|
330
|
-
time from = Time.at(1114924812), to = Time.now
|
|
331
|
-
|
|
332
|
-
date from = Time.at(1114924812), to = Time.now
|
|
333
|
-
|
|
334
|
-
datetime from = Time.at(1114924812), to = Time.now
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
in Hash
|
|
338
|
-
|
|
339
|
-
remove elements by keys,
|
|
340
|
-
array of keys,
|
|
341
|
-
hashTags,
|
|
342
|
-
strings
|
|
343
|
-
trim(*args)
|
|
344
|
-
|
|
345
|
-
pass single or array of keys, which will be removed, returning the remaining hash
|
|
346
|
-
remove!(*keys)
|
|
347
|
-
|
|
348
|
-
non-destructive version
|
|
349
|
-
remove(*keys)
|
|
350
|
-
|
|
351
|
-
Returns a new hash with +self+ and +other_hash+ merged recursively.
|
|
352
|
-
|
|
353
|
-
h1 = {:x => {:y => [4,5,6]}, :z => [7,8,9]}
|
|
354
|
-
h2 = {:x => {:y => [7,8,9]}, :z => "xyz"}
|
|
355
|
-
#
|
|
356
|
-
h1.deep_merge(h2#=> { :x => {:y => [7, 8, 9]}, :z => "xyz" }
|
|
357
|
-
h2.deep_merge(h1#=> { :x => {:y => [4, 5, 6]}, :z => [7, 8, 9] }
|
|
358
|
-
deep_merge(other_hash)
|
|
359
|
-
|
|
360
|
-
Same as +deep_merge+, but modifies +self+.
|
|
361
|
-
deep_merge!(other_hash)
|
|
362
|
-
|
|
363
|
-
return bool that does the sub hash all element include the hash who call this or not
|
|
364
|
-
deep_include?(sub_hash)
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
in Kernel
|
|
368
|
-
|
|
369
|
-
eats puts like formated printf method
|
|
370
|
-
just use an integer what will be the distance
|
|
371
|
-
between elements and the elements next to it
|
|
372
|
-
putsf(integer,*args)
|
|
14
|
+
There is really lot of helper method, i mean i even lose my life love if i want to start describe all of them
|
|
15
|
+
you can generate rdoc if you want, i more like examples, so from now on,
|
|
16
|
+
i will make examples!
|
|
17
|
+
|
|
18
|
+
The first one tells you how to NOT monkey patch methods in modules.
|
|
19
|
+
You want use a module? sure awsome !
|
|
20
|
+
You need to add plus functionality but dont want to follow the module updates
|
|
21
|
+
(in case of conflight with the monkey patch)
|
|
22
|
+
Than this is your tool. Tell the method to inject what method and it will , but remember
|
|
23
|
+
params are always have to obey to the original method!
|
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.1.
|
|
1
|
+
0.1.4
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
require 'procemon'
|
|
2
|
+
|
|
3
|
+
class TestT
|
|
4
|
+
|
|
5
|
+
def self.test
|
|
6
|
+
puts self
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def test
|
|
10
|
+
puts self
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
TestT.inject_instance_method :test do
|
|
16
|
+
|
|
17
|
+
puts "hello world! instance"
|
|
18
|
+
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
TestT.inject_singleton_method :test, :after do
|
|
22
|
+
|
|
23
|
+
puts "hello world! singleton"
|
|
24
|
+
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
TestT.test
|
|
28
|
+
TestT.new.test
|
|
29
|
+
|
|
30
|
+
#> TestT
|
|
31
|
+
#> hello world! singleton
|
|
32
|
+
#> hello world! instance
|
|
33
|
+
#> #<TestT:0x0000000288b808>
|
|
@@ -17,21 +17,17 @@ class Class
|
|
|
17
17
|
self.singleton_class.__send__ :undef_method, method
|
|
18
18
|
self.class_eval do
|
|
19
19
|
define_singleton_method method do |*arguments|
|
|
20
|
-
case true
|
|
21
20
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
original_method.call *arguments
|
|
26
|
-
end
|
|
21
|
+
if options == :before
|
|
22
|
+
block.source.to_proc(self.binding?).call *arguments
|
|
23
|
+
end
|
|
27
24
|
|
|
28
|
-
|
|
29
|
-
begin
|
|
30
|
-
original_method.call *arguments
|
|
31
|
-
block.call_with_binding self.get_binding, *arguments
|
|
32
|
-
end
|
|
25
|
+
original_method.call *arguments
|
|
33
26
|
|
|
27
|
+
if options == :after
|
|
28
|
+
block.source.to_proc(self.binding?).call *arguments
|
|
34
29
|
end
|
|
30
|
+
|
|
35
31
|
end
|
|
36
32
|
end
|
|
37
33
|
|
|
@@ -46,25 +42,20 @@ class Class
|
|
|
46
42
|
# end
|
|
47
43
|
#
|
|
48
44
|
def inject_instance_method(method,options=:before,&block)
|
|
45
|
+
|
|
49
46
|
self.class_eval do
|
|
50
47
|
alias_method :"old_#{method.to_s}", method
|
|
51
48
|
end
|
|
52
49
|
extended_process = Proc.new do |*args|
|
|
53
50
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
begin
|
|
58
|
-
block.call_with_binding self.get_binding, *args
|
|
59
|
-
self.__send__ :"old_#{method.to_s}", *args
|
|
60
|
-
end
|
|
51
|
+
if options == :before
|
|
52
|
+
block.source.to_proc(self.binding?).call *args
|
|
53
|
+
end
|
|
61
54
|
|
|
62
|
-
|
|
63
|
-
begin
|
|
64
|
-
self.__send__ :"old_#{method.to_s}", *args
|
|
65
|
-
block.call_with_binding self.get_binding, *args
|
|
66
|
-
end
|
|
55
|
+
self.__send__ :"old_#{method.to_s}", *args
|
|
67
56
|
|
|
57
|
+
if options == :after
|
|
58
|
+
block.source.to_proc(self.binding?).call *args
|
|
68
59
|
end
|
|
69
60
|
|
|
70
61
|
end
|
data/lib/procemon/mpatch/proc.rb
CHANGED
|
@@ -20,7 +20,6 @@ class Proc
|
|
|
20
20
|
return_string= String.new
|
|
21
21
|
block= 0
|
|
22
22
|
end
|
|
23
|
-
|
|
24
23
|
if @@source_cache.keys.include? self.object_id
|
|
25
24
|
return @@source_cache[self.object_id]
|
|
26
25
|
else
|
|
@@ -39,10 +38,17 @@ class Proc
|
|
|
39
38
|
|
|
40
39
|
return_string.sub!(/^[\w\W]*Proc.new\s*{/,'Proc.new{')
|
|
41
40
|
return_string.sub!(/}[^}]*$/,"}")
|
|
41
|
+
|
|
42
|
+
if !return_string.include?('Proc.new')
|
|
43
|
+
return_string.sub!(/^[^{]*(?!={)/,'Proc.new')
|
|
44
|
+
end
|
|
45
|
+
|
|
42
46
|
@@source_cache[self.object_id]= return_string
|
|
47
|
+
|
|
43
48
|
return return_string
|
|
44
49
|
end
|
|
45
50
|
|
|
46
51
|
end
|
|
52
|
+
alias :source_string :source
|
|
47
53
|
|
|
48
54
|
end
|
data/test/test.rb
CHANGED
|
@@ -1,17 +1,33 @@
|
|
|
1
1
|
require_relative "../lib/procemon.rb"
|
|
2
2
|
|
|
3
|
+
class TestT
|
|
4
|
+
|
|
5
|
+
def self.test
|
|
6
|
+
puts self
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def test
|
|
10
|
+
puts self
|
|
11
|
+
end
|
|
3
12
|
|
|
4
|
-
class Test1
|
|
5
13
|
end
|
|
6
14
|
|
|
7
|
-
|
|
15
|
+
TestT.inject_instance_method :test do
|
|
16
|
+
|
|
17
|
+
puts "hello world! instance"
|
|
8
18
|
|
|
9
19
|
end
|
|
10
20
|
|
|
21
|
+
TestT.inject_singleton_method :test, :after do
|
|
11
22
|
|
|
12
|
-
|
|
13
|
-
Test1.each_subclass{|c| ret.push c}
|
|
14
|
-
puts ret
|
|
23
|
+
puts "hello world! singleton"
|
|
15
24
|
|
|
25
|
+
end
|
|
16
26
|
|
|
27
|
+
TestT.test
|
|
28
|
+
TestT.new.test
|
|
17
29
|
|
|
30
|
+
#> TestT
|
|
31
|
+
#> hello world! singleton
|
|
32
|
+
#> hello world! instance
|
|
33
|
+
#> #<TestT:0x0000000288b808>
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: procemon
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.4
|
|
5
5
|
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -27,6 +27,7 @@ files:
|
|
|
27
27
|
- README.md
|
|
28
28
|
- Rakefile
|
|
29
29
|
- VERSION
|
|
30
|
+
- examples/how_to_inject_with_extra_process_a_method.rb
|
|
30
31
|
- files.rb
|
|
31
32
|
- lib/procemon.rb
|
|
32
33
|
- lib/procemon/function/application.rb
|