decoratable 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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6a8eadd3a9f64dd170469d9bf46f9765ce9d411a
4
- data.tar.gz: e0daa4b811d58ef5b10b867b89743219b7a3ac0e
3
+ metadata.gz: ec20dff74a6642c85271dcb977529bcd33ca8174
4
+ data.tar.gz: 9ff3c561a008fff52d078a61ec2ab68630756580
5
5
  SHA512:
6
- metadata.gz: b81d3a486e381d52d909002417d19c2578c63c3c784e5e2ee32357c7fe807eee8b902a5c4d640e7184d9fc4321de13f08f623a18c34c7decf7db01896b1f4208
7
- data.tar.gz: c49567ab494c3e5ccd247adc8c0492c4b0186eb7086bbce37a6e579d288ab2b34f9abab76243ad65943d7eb5f2b630aa4c9007480505f0dabae6caf800ba1071
6
+ metadata.gz: c940d91c425fd100b43d850ae9e78522ae385a5dc9a52bd321b73c82b8f2f8411e6f4a53597699c657d4a5647d359cf15e30c70abc7198161494f74eeee5d65a
7
+ data.tar.gz: 6ef5795b503abba017d278c6bfdcd52c3d04d1929d99a7901829d0f09b14ac10e6db41c87188de9cf4d24d41c19e1b01e6ae3d123986948478bc5445596acba2
data/.travis.yml CHANGED
@@ -1,8 +1,9 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 1.9.3
4
3
  - 2.0.0
5
- - 2.1.0
6
- - 2.2.0
4
+ - 2.1.6
5
+ - 2.2.2
7
6
  - ruby-head
8
7
  - jruby-head
8
+ before_install:
9
+ - gem install bundler
data/README.rdoc ADDED
@@ -0,0 +1,100 @@
1
+ = Decoratable
2
+
3
+ Provides an easy way to define decorations that add common behaviour to your methods.
4
+
5
+ == Installation
6
+
7
+ gem install decoratable
8
+
9
+ == Requirements
10
+
11
+ Decoratable does its magic via Module#prepend, which means:
12
+
13
+ * MRI (1.9.3 and up) OR
14
+ * JRuby 9000
15
+
16
+ == Usage
17
+
18
+ require "decoratable"
19
+
20
+ module Retryable
21
+ # All methods defined in this module can decorate methods
22
+ extend Decoratable
23
+
24
+ def retryable(tries = 1, options = { on: [RuntimeError] })
25
+ attempt = 0
26
+ # To invoke the original method, simply use `yield`
27
+ yield
28
+ rescue *options[:on]
29
+ attempt += 1
30
+ attempt > tries ? raise : retry
31
+ end
32
+ end
33
+
34
+ module Pryable
35
+ extend Decoratable
36
+
37
+ def pryable
38
+ yield
39
+ rescue => e
40
+ require "pry"
41
+ binding.pry
42
+ end
43
+ end
44
+
45
+ module Measurable
46
+ extend Decoratable
47
+
48
+ def measurable(logger = Logger.new(STDOUT))
49
+ start = Time.now
50
+ yield
51
+ ensure
52
+ # The decoration has access to the original method
53
+ # args and any block passed in the original method call are also available
54
+ # via __args__ and __block__ respectively
55
+ original_method = __decorated_method__
56
+
57
+ method_location, line = original_method.source_location
58
+ marker = "#{original_method.owner}##{original_method.name}[#{method_location}:#{line}]"
59
+ duration = (Time.now - start).round(2)
60
+
61
+ logger.info "#{marker} took #{duration}s to run."
62
+ end
63
+ end
64
+
65
+ class Client
66
+ extend Measurable
67
+ extend Pryable
68
+ extend Retryable
69
+
70
+ # This method will automatically retry on TimeoutErrors, up to 3 times
71
+ retryable(tries = 3, on: [TimeoutError])
72
+ def get
73
+
74
+ end
75
+
76
+ # If an error is raised in this method, we'll automatically get a pry session
77
+ # to help us debug it
78
+ pryable
79
+ def post
80
+
81
+ end
82
+
83
+ # Log the time this method takes to run
84
+ measurable
85
+ def delete
86
+
87
+ end
88
+ end
89
+
90
+ Decoratable provides a handful of decorations as part of the gem:
91
+
92
+ * require "decoratable/countable": keep a count each time a method gets called
93
+ * require "decoratable/debuggable": open a Ruby debug console (i.e. require "debug") if an error is raised
94
+ * require "decoratable/deprecatable": log a warning whenever a deprecated method gets called; logs the caller's location
95
+ * require "decoratable/hintable": add type hinting to your method arguments
96
+ * require "decoratable/memoizable": automatically memoize the return value of a method
97
+ * require "decoratable/pryable": open a Pry debug console (i.e. binding.pry) if an error is raised
98
+ * require "decoratable/retryable": automatically retry a number of times when a specified exception is raised
99
+
100
+ More to be added as time goes on.
data/decoratable.gemspec CHANGED
@@ -3,7 +3,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
3
 
4
4
  Gem::Specification.new do |spec|
5
5
  spec.name = "decoratable"
6
- spec.version = "0.0.1"
6
+ spec.version = "0.0.2"
7
7
  spec.authors = ["ecin"]
8
8
  spec.email = ["ecin@copypastel.com"]
9
9
  spec.description = "Decorate your methods."
@@ -16,5 +16,7 @@ Gem::Specification.new do |spec|
16
16
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
17
17
  spec.require_paths = ["lib"]
18
18
 
19
+ spec.add_development_dependency "minitest"
19
20
  spec.add_development_dependency "pry"
21
+ spec.add_development_dependency "rake", ">= 10.0.0"
20
22
  end
@@ -0,0 +1,12 @@
1
+ require "decoratable"
2
+
3
+ require "logger"
4
+
5
+ module Deprecatable
6
+ extend Decoratable
7
+
8
+ def deprecatable(logger = Logger.new(STDOUT))
9
+ logger.warn("#{__decorated_method__.name} is deprecated. Called from: #{__original_caller__[0]}")
10
+ yield
11
+ end
12
+ end
data/lib/decoratable.rb CHANGED
@@ -91,6 +91,10 @@ module Decoratable
91
91
  alias_method "method_added_without_#{decoration_name}", :method_added
92
92
  end
93
93
 
94
+ unless method_defined?(:__original_caller__)
95
+ define_method(:__original_caller__) { @__original_caller__ }
96
+ end
97
+
94
98
  unless method_defined?(:__decorated_method__)
95
99
  define_method(:__decorated_method__) { @__decorated_method__ }
96
100
  end
@@ -126,6 +130,7 @@ module Decoratable
126
130
  @__decorated_method__ = original_method
127
131
  @__args__ = args
128
132
  @__block__ = block
133
+ @__original_caller__ ||= caller
129
134
 
130
135
  decoration_method.bind(self).call(*decorator_args) do
131
136
  super(*args, &block)
@@ -134,6 +139,7 @@ module Decoratable
134
139
  @__decorated_method__ = nil
135
140
  @__args__ = nil
136
141
  @__block__ = nil
142
+ @__original_caller__ = nil
137
143
  end
138
144
  end
139
145
  end
@@ -0,0 +1,40 @@
1
+ require "test_helper"
2
+
3
+ require "decoratable/deprecatable"
4
+ require "decoratable/retryable"
5
+ require "decoratable/memoizable"
6
+
7
+ describe Deprecatable do
8
+ extend Memoizable
9
+
10
+ before do
11
+ # Need to assign to a local variable so it's accessible from
12
+ # the following class definition scope.
13
+ logger = mock_logger
14
+
15
+ klass = Class.new do
16
+ extend Deprecatable
17
+ extend Retryable
18
+
19
+ deprecatable(logger)
20
+ def old_method; end
21
+ end
22
+
23
+ @object = klass.new
24
+ end
25
+
26
+ it "prints a warning when a method is called" do
27
+ # If the `@object.old_method` line moves around, we'll have to modify the line arithmetic for the
28
+ # expected regex.
29
+ mock_logger.expect(:warn, nil, [/old_method is deprecated\. Called from: #{__FILE__}:#{__LINE__ + 2}/])
30
+
31
+ @object.old_method
32
+ mock_logger.verify
33
+ end
34
+
35
+ # Reusing library code in a test? Amazing!
36
+ memoizable
37
+ def mock_logger
38
+ Minitest::Mock.new
39
+ end
40
+ end
@@ -142,9 +142,7 @@ describe Decoratable do
142
142
 
143
143
  def mock_logger
144
144
  logger = Minitest::Mock.new
145
- logger.expect(:info, nil) do |message|
146
- message =~ /took \d+\.\d+s to run/
147
- end
145
+ logger.expect(:info, nil, [/took \d+\.\d+s to run/])
148
146
  logger
149
147
  end
150
148
  end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: decoratable
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - ecin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-04 00:00:00.000000000 Z
11
+ date: 2016-11-26 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: minitest
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: pry
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -24,6 +38,20 @@ dependencies:
24
38
  - - ">="
25
39
  - !ruby/object:Gem::Version
26
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: 10.0.0
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: 10.0.0
27
55
  description: Decorate your methods.
28
56
  email:
29
57
  - ecin@copypastel.com
@@ -33,16 +61,19 @@ extra_rdoc_files: []
33
61
  files:
34
62
  - ".travis.yml"
35
63
  - Gemfile
64
+ - README.rdoc
36
65
  - Rakefile
37
66
  - decoratable.gemspec
38
67
  - lib/decoratable.rb
39
68
  - lib/decoratable/countable.rb
40
69
  - lib/decoratable/debuggable.rb
70
+ - lib/decoratable/deprecatable.rb
41
71
  - lib/decoratable/hintable.rb
42
72
  - lib/decoratable/memoizable.rb
43
73
  - lib/decoratable/pryable.rb
44
74
  - lib/decoratable/retryable.rb
45
75
  - test/decoratable/countable_test.rb
76
+ - test/decoratable/deprecatable_test.rb
46
77
  - test/decoratable/hintable_test.rb
47
78
  - test/decoratable/memoizable_test.rb
48
79
  - test/decoratable/pryable_test.rb
@@ -69,16 +100,16 @@ required_rubygems_version: !ruby/object:Gem::Requirement
69
100
  version: '0'
70
101
  requirements: []
71
102
  rubyforge_project:
72
- rubygems_version: 2.4.3
103
+ rubygems_version: 2.5.1
73
104
  signing_key:
74
105
  specification_version: 4
75
106
  summary: Easily define decorations for your methods. Put a bow on it.
76
107
  test_files:
77
108
  - test/decoratable/countable_test.rb
109
+ - test/decoratable/deprecatable_test.rb
78
110
  - test/decoratable/hintable_test.rb
79
111
  - test/decoratable/memoizable_test.rb
80
112
  - test/decoratable/pryable_test.rb
81
113
  - test/decoratable/retryable_test.rb
82
114
  - test/decoratable_test.rb
83
115
  - test/test_helper.rb
84
- has_rdoc: