asynchronize 0.1.1 → 0.1.2
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/asynchronize.gemspec +5 -3
- data/lib/asynchronize.rb +36 -14
- data/readme.md +2 -1
- data/spec/minitest_helper.rb +6 -0
- data/spec/spec.rb +31 -2
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: af0aada41350e739802a92c04ef32bc64fbb897dd4d3ff7b0450c1485f9a243a
|
4
|
+
data.tar.gz: 457e2ccdf4b87955b8dc68011f8e7d84be3458fa6a83333f56b755457729121f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d0f2214354035c147289553f31326709f7707a1a6a5a6101778f87198f18abd99c511763297f87662cec869426c20bae9ee5522d19232ce33878c4e238a573ae
|
7
|
+
data.tar.gz: 7abf0867f9c2e238f475b0925db4610194de9ef954baa48648d79492ae4fc89eaddba1e2801394cafc4034f675aaf5e5f4b0b80677c348404ef3b97cc81567af
|
data/asynchronize.gemspec
CHANGED
@@ -2,7 +2,7 @@ require 'date'
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = 'asynchronize'
|
5
|
-
s.version = '0.1.
|
5
|
+
s.version = '0.1.2'
|
6
6
|
s.date = Date.today.to_s
|
7
7
|
s.summary = 'Easily make multiple methods asynchronous with one line of code.'
|
8
8
|
s.description = 'Take any synchronous method, and run it asynchronously, ' +
|
@@ -12,12 +12,14 @@ Gem::Specification.new do |s|
|
|
12
12
|
s.files = [
|
13
13
|
'lib/asynchronize.rb',
|
14
14
|
'spec/spec.rb',
|
15
|
+
'spec/minitest_helper.rb',
|
15
16
|
'asynchronize.gemspec',
|
16
17
|
'Rakefile',
|
17
|
-
'readme.md'
|
18
|
+
'readme.md',
|
18
19
|
]
|
19
20
|
s.test_files = [
|
20
|
-
'spec/spec.rb'
|
21
|
+
'spec/spec.rb',
|
22
|
+
'spec/minitest_helper.rb'
|
21
23
|
]
|
22
24
|
s.homepage = 'https://github.com/kennycoc/asynchronize'
|
23
25
|
s.license = 'MIT'
|
data/lib/asynchronize.rb
CHANGED
@@ -11,6 +11,17 @@ module Asynchronize
|
|
11
11
|
# threads adding methods to your class.
|
12
12
|
@@methods_asyncing = Set.new
|
13
13
|
|
14
|
+
##
|
15
|
+
# Call to asynchronize a method.
|
16
|
+
# That method will be added to a list of methods to asynchronize.
|
17
|
+
# If the method already exists, it will be redefined to an asynchronous
|
18
|
+
# version. If it does not, method_missing will redefine it when it does.
|
19
|
+
# If the method is redefined afterwards, method_missing will also
|
20
|
+
# asynchronize that version.
|
21
|
+
#
|
22
|
+
# @param methods [Symbol] The methods to be asynchronized.
|
23
|
+
# @example To add any number of methods to be asynchronized.
|
24
|
+
# asynchronize :method1, :method2, :methodn
|
14
25
|
def self.asynchronize(*methods)
|
15
26
|
@@methods_to_async.merge(methods)
|
16
27
|
methods.each do |method|
|
@@ -20,22 +31,33 @@ module Asynchronize
|
|
20
31
|
end
|
21
32
|
end
|
22
33
|
|
34
|
+
# require 'pry'; binding.pry
|
23
35
|
# Save the old method_added so we don't overwrite it.
|
24
|
-
if
|
25
|
-
alias_method :old_method_added, :method_added
|
26
|
-
undef_method(:method_added)
|
36
|
+
if self.methods.include? :method_added
|
37
|
+
singleton_class.send(:alias_method, :old_method_added, :method_added)
|
38
|
+
singleton_class.undef_method(:method_added)
|
27
39
|
end
|
28
40
|
|
41
|
+
##
|
42
|
+
# Will asynchronize a method if it has not been asynchronized already, and
|
43
|
+
# it is in the list of methods to asynchronize. If method missing was
|
44
|
+
# already defined, it will call the previous method_missing before
|
45
|
+
# anything else Ruby calls this automatically when defining a method; it
|
46
|
+
# should not be called directly.
|
29
47
|
def self.method_added(method)
|
30
48
|
# Don't do anything else if we're not actually adding a new method
|
31
49
|
return if @@methods_asyncing.include? method
|
32
|
-
|
50
|
+
@@methods_asyncing.add(method)
|
51
|
+
self.old_method_added(method) if self.methods.include? :old_method_added
|
33
52
|
return unless @@methods_to_async.include? method
|
53
|
+
# This will delete from @@methods_asyncing
|
34
54
|
Asynchronize.create_new_method(method, self)
|
35
55
|
end
|
36
56
|
end
|
37
57
|
end
|
38
58
|
|
59
|
+
##
|
60
|
+
# Responsible for actually creating the new methods and removing the old.
|
39
61
|
def self.create_new_method(method, klass)
|
40
62
|
klass.instance_eval do
|
41
63
|
old_method = instance_method(method)
|
@@ -45,22 +67,22 @@ module Asynchronize
|
|
45
67
|
undef_method method
|
46
68
|
|
47
69
|
@@methods_asyncing.add(method)
|
48
|
-
define_method(method
|
49
|
-
return _build_thread(old_method, args, block)
|
50
|
-
end
|
70
|
+
define_method(method, Asynchronize._build_new_method(old_method))
|
51
71
|
@@methods_asyncing.delete(method)
|
52
72
|
@@asynced_methods.add(instance_method(method))
|
53
73
|
end
|
54
74
|
end
|
55
75
|
|
56
76
|
private
|
57
|
-
def
|
58
|
-
return
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
77
|
+
def self._build_new_method(old_method)
|
78
|
+
return Proc.new do |*args, &block|
|
79
|
+
return Thread.new(old_method, args, block) do |told_method, targs, tblock|
|
80
|
+
result = told_method.bind(self).call(*targs)
|
81
|
+
if tblock.nil?
|
82
|
+
Thread.current[:return_value] = result
|
83
|
+
else
|
84
|
+
tblock.call(result)
|
85
|
+
end
|
64
86
|
end
|
65
87
|
end
|
66
88
|
end
|
data/readme.md
CHANGED
@@ -1,11 +1,12 @@
|
|
1
1
|
[](https://travis-ci.org/kennycoc/asynchronize)
|
2
|
+
[](https://codeclimate.com/github/kennycoc/asynchronize/maintainability)
|
3
|
+
[](https://codeclimate.com/github/kennycoc/asynchronize/test_coverage)
|
2
4
|
# Asynchronize
|
3
5
|
### The easiest way to make multiple methods asynchronous.
|
4
6
|
|
5
7
|
Find yourself writing the same boilerplate for all your asynchronous methods?
|
6
8
|
Get dryyy with asynchronize.
|
7
9
|
|
8
|
-
There are no dependencies other than Ruby.
|
9
10
|
Just install with `gem install asynchronize` or add to your Gemfile and `bundle`
|
10
11
|
|
11
12
|
## Usage
|
data/spec/spec.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require './spec/minitest_helper.rb'
|
2
2
|
require './lib/asynchronize.rb'
|
3
3
|
|
4
4
|
class BasicSpec < Minitest::Test
|
@@ -82,8 +82,8 @@ class BasicSpec < Minitest::Test
|
|
82
82
|
|
83
83
|
describe "when we call asynchronized before defining the method" do
|
84
84
|
before do
|
85
|
-
Test.asynchronize :othertest
|
86
85
|
class Test
|
86
|
+
asynchronize :othertest
|
87
87
|
def othertest
|
88
88
|
return 5
|
89
89
|
end
|
@@ -104,5 +104,34 @@ class BasicSpec < Minitest::Test
|
|
104
104
|
temp.must_equal 5, "temp is equal to #{temp}."
|
105
105
|
end
|
106
106
|
end
|
107
|
+
|
108
|
+
describe "when there is an existing method_added" do
|
109
|
+
before do
|
110
|
+
if defined? AnotherTest
|
111
|
+
BasicSpec.send(:remove_const, :AnotherTest)
|
112
|
+
end
|
113
|
+
class AnotherTest
|
114
|
+
@running = false
|
115
|
+
def self.method_added(method)
|
116
|
+
return if @running
|
117
|
+
@running = true
|
118
|
+
old_method = instance_method(method)
|
119
|
+
undef_method(method)
|
120
|
+
define_method(method) do
|
121
|
+
return old_method.bind(self).call + 1
|
122
|
+
end
|
123
|
+
@running = false
|
124
|
+
end
|
125
|
+
include Asynchronize
|
126
|
+
asynchronize :test
|
127
|
+
def test
|
128
|
+
return 4
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
it "should call that method_added before, and only once." do
|
133
|
+
AnotherTest.new.test.join[:return_value].must_equal 5
|
134
|
+
end
|
135
|
+
end
|
107
136
|
end
|
108
137
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: asynchronize
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kenneth Cochran
|
@@ -21,6 +21,7 @@ files:
|
|
21
21
|
- asynchronize.gemspec
|
22
22
|
- lib/asynchronize.rb
|
23
23
|
- readme.md
|
24
|
+
- spec/minitest_helper.rb
|
24
25
|
- spec/spec.rb
|
25
26
|
homepage: https://github.com/kennycoc/asynchronize
|
26
27
|
licenses:
|
@@ -48,3 +49,4 @@ specification_version: 4
|
|
48
49
|
summary: Easily make multiple methods asynchronous with one line of code.
|
49
50
|
test_files:
|
50
51
|
- spec/spec.rb
|
52
|
+
- spec/minitest_helper.rb
|