take_care 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # TakeCare
2
2
 
3
- Sidekiq wrapper for activerecord model
3
+ Sidekiq wrapper for activerecord model (or any class which instances are fetched by #id)
4
4
 
5
- Method #take_care(method, *args) that delegates actual performing to sidekiq
5
+ Method #take_care(method, *args) that delegates actual performing of own method to sidekiq
6
6
 
7
7
  ## Installation
8
8
 
@@ -35,6 +35,13 @@ human = Human.create(name: 'Alex')
35
35
 
36
36
  human.take_care :hard_work, 'heavy box', 'second heavy box' # This goes to sidekiq
37
37
 
38
+ human.take_care_of :hard_work, 'heavy box', 'second heavy box' # Same using alias
39
+
40
+ # Same using dynamic methods (method is defined after first call)
41
+ human.take_care_hard_work 'heavy box', 'second heavy box'
42
+ # Or
43
+ human.take_care_of_hard_work 'heavy box', 'second heavy box'
44
+
38
45
  ```
39
46
 
40
47
  ## Contributing
@@ -1,8 +1,24 @@
1
1
  module TakeCare
2
2
  module Reliable
3
- def take_care(method, *args)
4
- TakeCare::Worker.perform_async(self.class.to_s, self.id, method, *args)
3
+ def take_care(method_name, *args)
4
+ TakeCare::Worker.perform_async(self.class.to_s, self.id, method_name, *args)
5
5
  end
6
6
  alias_method :take_care_of, :take_care
7
+
8
+ def respond_to?(method_name)
9
+ return false if self.class.private_method_defined?(method_name)
10
+ /\Atake_care_(?:of_)?(.+)\Z/ =~ method_name && self.respond_to?($1) || super
11
+ end
12
+
13
+ def method_missing(method_name, *args, &block)
14
+ if self.class.private_method_defined?(method_name)
15
+ raise NoMethodError, "private method `#{method_name}' called for #{self}"
16
+ end
17
+ return super unless /\Atake_care_(?:of_)?(.+)\Z/ =~ method_name && self.respond_to?($1)
18
+ self.class.__send__(:define_method, method_name) do |*args|
19
+ self.take_care($1.to_sym, *args)
20
+ end
21
+ self.take_care($1.to_sym, *args)
22
+ end
7
23
  end
8
24
  end
@@ -1,3 +1,3 @@
1
1
  module TakeCare
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -1,8 +1,20 @@
1
- class Human
2
- def id
3
- 4
4
- end
1
+ module HumanMacros
2
+ def redefine_human_class
3
+ before :each do
4
+ Object.__send__ :remove_const, "Human" if Object.const_defined? "Human"
5
+ Object.const_set("Human", Class.new do
6
+ include TakeCare::Reliable
7
+ def id
8
+ 4
9
+ end
5
10
 
6
- def hard_work(box1, box2)
11
+ def hard_work(box1, box2)
12
+ end
13
+ end)
14
+ end
7
15
  end
8
16
  end
17
+
18
+ RSpec.configure do |config|
19
+ config.extend HumanMacros
20
+ end
@@ -1,26 +1,56 @@
1
1
  require "spec_helper"
2
2
 
3
3
  describe TakeCare::Reliable do
4
- let(:human) { Human.new.extend(TakeCare::Reliable) }
4
+ redefine_human_class
5
+ subject { Human.new }
5
6
 
6
7
  describe "#take_care" do
7
8
  it "delegates method calls to Worker" do
8
9
  TakeCare::Worker.should_receive(:perform_async).with("Human", 4, :hard_work, :box1, :box2)
9
- human.take_care :hard_work, :box1, :box2
10
+ subject.take_care :hard_work, :box1, :box2
10
11
  end
11
12
  end
12
13
 
13
14
  describe "#take_care_of (alias of #take_care)" do
14
15
  it "delegates method calls to Worker" do
15
16
  TakeCare::Worker.should_receive(:perform_async).with("Human", 4, :hard_work, :box1, :box2)
16
- human.take_care_of :hard_work, :box1, :box2
17
+ subject.take_care_of :hard_work, :box1, :box2
17
18
  end
18
19
  end
19
20
 
20
- # context "Dinamic methods 'take_care_...'" do
21
- # it "delegates method calls to Worker" do
22
- # TakeCare::Worker.should_receive(:perform_async).with("Human", 4, :hard_work, :box1, :box2)
23
- # human.take_care_of_hard_work :box1, :box2
24
- # end
25
- # end
21
+ context 'Dynamic methods "take_care_..."' do
22
+ describe "#method_missing" do
23
+ it "delegates method calls to Worker" do
24
+ TakeCare::Worker.should_receive(:perform_async).with("Human", 4, :hard_work, :box1, :box2)
25
+ subject.take_care_hard_work :box1, :box2
26
+ end
27
+
28
+ it "defines dynamic method after first call (method missing should not be called after that)" do
29
+ TakeCare::Worker.stub(:perform_async)
30
+ subject.take_care_hard_work :box1, :box2
31
+ Human.instance_methods(false).should be_include :take_care_hard_work
32
+ end
33
+
34
+ it "second time acts same as first (dynamically defined method)" do
35
+ TakeCare::Worker.should_receive(:perform_async).with("Human", 4, :hard_work, :box1, :box2).twice
36
+ subject.take_care_hard_work :box1, :box2
37
+ subject.take_care_hard_work :box1, :box2
38
+ end
39
+
40
+ it "raises error if exists private method with same name" do
41
+ Human.class_eval { private; def take_care_hard_work; end }
42
+ expect { subject.take_care_hard_work :box1, :box2 }.to raise_error NameError
43
+ end
44
+ end
45
+
46
+ describe "#respond_to?" do
47
+ it { should be_respond_to :take_care_hard_work }
48
+ it { should be_respond_to :take_care_of_hard_work }
49
+
50
+ it "is false if exists private method with such name" do
51
+ Human.class_eval { private; def take_care_hard_work; end }
52
+ should_not be_respond_to :take_care_hard_work
53
+ end
54
+ end
55
+ end
26
56
  end
@@ -1,12 +1,14 @@
1
1
  require "spec_helper"
2
2
 
3
3
  describe TakeCare::Worker do
4
+ redefine_human_class
5
+
4
6
  describe '#perform' do
5
7
  it "should include Sidekiq::Worker" do
6
8
  described_class.ancestors.should include Sidekiq::Worker
7
9
  end
8
10
 
9
- it "finds class instance by id and calls mathod with received args" do
11
+ it "finds class instance by id and calls method with received args" do
10
12
  duty = double("Human instance")
11
13
  Human.should_receive(:find).with(4).and_return(duty)
12
14
  duty.should_receive(:hard_work).with(:box1, :box2)
metadata CHANGED
@@ -1,46 +1,52 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: take_care
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
+ prerelease:
5
6
  platform: ruby
6
7
  authors:
7
8
  - Alexander Avoyants
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2013-10-22 00:00:00.000000000 Z
12
+ date: 2013-10-23 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: sidekiq
15
16
  requirement: !ruby/object:Gem::Requirement
17
+ none: false
16
18
  requirements:
17
- - - '>='
19
+ - - ! '>='
18
20
  - !ruby/object:Gem::Version
19
21
  version: '0'
20
22
  type: :runtime
21
23
  prerelease: false
22
24
  version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
23
26
  requirements:
24
- - - '>='
27
+ - - ! '>='
25
28
  - !ruby/object:Gem::Version
26
29
  version: '0'
27
30
  - !ruby/object:Gem::Dependency
28
31
  name: activesupport
29
32
  requirement: !ruby/object:Gem::Requirement
33
+ none: false
30
34
  requirements:
31
- - - '>='
35
+ - - ! '>='
32
36
  - !ruby/object:Gem::Version
33
37
  version: '0'
34
38
  type: :runtime
35
39
  prerelease: false
36
40
  version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
37
42
  requirements:
38
- - - '>='
43
+ - - ! '>='
39
44
  - !ruby/object:Gem::Version
40
45
  version: '0'
41
46
  - !ruby/object:Gem::Dependency
42
47
  name: bundler
43
48
  requirement: !ruby/object:Gem::Requirement
49
+ none: false
44
50
  requirements:
45
51
  - - ~>
46
52
  - !ruby/object:Gem::Version
@@ -48,6 +54,7 @@ dependencies:
48
54
  type: :development
49
55
  prerelease: false
50
56
  version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
51
58
  requirements:
52
59
  - - ~>
53
60
  - !ruby/object:Gem::Version
@@ -55,29 +62,33 @@ dependencies:
55
62
  - !ruby/object:Gem::Dependency
56
63
  name: rake
57
64
  requirement: !ruby/object:Gem::Requirement
65
+ none: false
58
66
  requirements:
59
- - - '>='
67
+ - - ! '>='
60
68
  - !ruby/object:Gem::Version
61
69
  version: '0'
62
70
  type: :development
63
71
  prerelease: false
64
72
  version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
65
74
  requirements:
66
- - - '>='
75
+ - - ! '>='
67
76
  - !ruby/object:Gem::Version
68
77
  version: '0'
69
78
  - !ruby/object:Gem::Dependency
70
79
  name: rspec
71
80
  requirement: !ruby/object:Gem::Requirement
81
+ none: false
72
82
  requirements:
73
- - - '>='
83
+ - - ! '>='
74
84
  - !ruby/object:Gem::Version
75
85
  version: '0'
76
86
  type: :development
77
87
  prerelease: false
78
88
  version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
79
90
  requirements:
80
- - - '>='
91
+ - - ! '>='
81
92
  - !ruby/object:Gem::Version
82
93
  version: '0'
83
94
  description: Sidekiq wrapper for activerecord model
@@ -104,26 +115,33 @@ files:
104
115
  homepage: ''
105
116
  licenses:
106
117
  - MIT
107
- metadata: {}
108
118
  post_install_message:
109
119
  rdoc_options: []
110
120
  require_paths:
111
121
  - lib
112
122
  required_ruby_version: !ruby/object:Gem::Requirement
123
+ none: false
113
124
  requirements:
114
- - - '>='
125
+ - - ! '>='
115
126
  - !ruby/object:Gem::Version
116
127
  version: '0'
128
+ segments:
129
+ - 0
130
+ hash: 4157606556185016579
117
131
  required_rubygems_version: !ruby/object:Gem::Requirement
132
+ none: false
118
133
  requirements:
119
- - - '>='
134
+ - - ! '>='
120
135
  - !ruby/object:Gem::Version
121
136
  version: '0'
137
+ segments:
138
+ - 0
139
+ hash: 4157606556185016579
122
140
  requirements: []
123
141
  rubyforge_project:
124
- rubygems_version: 2.0.6
142
+ rubygems_version: 1.8.23
125
143
  signing_key:
126
- specification_version: 4
144
+ specification_version: 3
127
145
  summary: Sidekiq wrapper for activerecord model (any class which instances fetched
128
146
  by id)
129
147
  test_files:
checksums.yaml DELETED
@@ -1,7 +0,0 @@
1
- ---
2
- SHA1:
3
- metadata.gz: fa95c237faea234849c224d4c8e00e69fc37af63
4
- data.tar.gz: 7a3006a04abcdb2afcccd02407cac1efbe068d14
5
- SHA512:
6
- metadata.gz: fc341db5e388cdae6c349a1870d6429d137977ce0641fd9f4d4963e07385418c1d320a8830734ffd480c5fbcb5e516ae0902d0b9f74999a111c38bd9740dbcbe
7
- data.tar.gz: ba4dec1f20f71aa8347ec9d1f9e9422e2f39a21a6ae1f0dd8984cd276c639e0ebe03057a47217977fc132f321a8fa045e63ebe80649cbc5c7e4ea7c12f61fa2b