take_care 0.0.1 → 0.0.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.
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