dont 0.1.2 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 403a3db127556cfce32a357144d5f4de3b5c3e54
4
- data.tar.gz: d39e2718237b61d04fe89b2c519b42424420b878
3
+ metadata.gz: 24d5eabf7ad968cb3d575076d120bf5ccc4808ae
4
+ data.tar.gz: f7dc01339e3629f8cad5ed1cfc3297afd4c0f0b9
5
5
  SHA512:
6
- metadata.gz: 3edaf5249591d2af3646f1b926aef81b1c5b84967e84ff873e00a2eba46f3c44556f7c18a618e5ba30fceb36486e2afb6a360870ae73699e535386cc86304b7f
7
- data.tar.gz: 260ad407d1c267df6352336c5da2e9a07b834fef1a93255245427c1c24d958573fa08f9055a3878aa70c7f1404757b03bc8610f55d94b5a8b7e8c7d847c488b1
6
+ metadata.gz: 5c2a8cf3e08e5aed86eff61fb3af1d1b612c9a56c9ca46c8655abe7ceb16904734b2f8c0e9a97cf77e6a090a752a6b303f2af693a359e6a42a8f15a6ecfd67b6
7
+ data.tar.gz: ff10f1eb7399ee41889c758e8d47c3ee87b410fafabd9a894e16c090fef129c7eadd37c04a4e83620c38174084fc064e2155093b879991a72dee28c644a7b9ed
@@ -1,5 +1,12 @@
1
1
  sudo: false
2
2
  language: ruby
3
3
  rvm:
4
+ - 2.2.5
4
5
  - 2.3.3
6
+ - ruby-head
7
+ - jruby-9.1.5.0
8
+ matrix:
9
+ allow_failures:
10
+ - rvm: ruby-head
11
+ - rvm: jruby-9.1.5.0
5
12
  before_install: gem install bundler -v 1.13.6
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # Dont
2
2
 
3
+ [![Build Status](https://travis-ci.org/datacamp/dont.svg?branch=master)](https://travis-ci.org/datacamp/dont) [![Gem Version](https://badge.fury.io/rb/dont.svg)](https://badge.fury.io/rb/dont)
4
+
3
5
  Easily deprecate methods.
4
6
 
5
7
  ## Installation
@@ -21,12 +23,10 @@ Or install it yourself as:
21
23
  ## Usage
22
24
 
23
25
  ```ruby
24
- # Register custom handlers
25
- #
26
- Dont.register_handler(:logger, ->(object, method) {
27
- class_name = object.class.name
28
- logger.warn("Don't use `#{class_name}##{method}`. It's deprecated.")
29
- })
26
+ # Register a deprecation handler.
27
+ # Anything that responds to `.call(deprecation)` will work.
28
+ LOGGER = Logger.new
29
+ Dont.register_handler(:logger, ->(deprecation) { LOGGER.warn(deprecation.message) })
30
30
  class Shouter
31
31
  include Dont.new(:logger)
32
32
 
@@ -37,25 +37,26 @@ class Shouter
37
37
  def scream(msg)
38
38
  shout(msg)
39
39
  end
40
- dont_use :scream
40
+ dont_use :scream, use: :shout
41
41
  end
42
42
 
43
- # This will log "Don't use `Shouter#scream`. It's deprecated.", and then
44
- # execute the method.
43
+ # Logs "DEPRECATED: Don't use Shouter#scream. It's deprecated in favor of
44
+ # shout.", before executing the method.
45
45
  Shouter.new.scream("hello")
46
- # => HELLO
47
46
 
48
- # There's also a builtin "exception" handler, which is handy for in development
47
+
48
+ # The :exception deprecation handler is provided by default.
49
+ # It raises an exception whenever the method is called, which is handy in
50
+ # test or development mode.
49
51
  class Person
50
52
  include Dont.new(:exception)
51
53
 
52
54
  attr_accessor :firstname
53
55
  attr_accessor :first_name
54
56
 
55
- dont_use :firstname
57
+ dont_use :firstname, use: :first_name
56
58
  end
57
-
58
- Person.new.firstname # => Dont::DeprecationError
59
+ Person.new.firstname # => fails with Dont::DeprecationError
59
60
  ```
60
61
 
61
62
  ## Development
@@ -22,6 +22,7 @@ Gem::Specification.new do |spec|
22
22
  spec.require_paths = ["lib"]
23
23
 
24
24
  spec.add_dependency "dry-container", ">= 0.6"
25
+ spec.add_dependency "dry-initializer", ">= 0.10.0"
25
26
 
26
27
  spec.add_development_dependency "bundler", "~> 1.13"
27
28
  spec.add_development_dependency "rake", "~> 10.0"
@@ -1,27 +1,16 @@
1
1
  require "dont/version"
2
2
  require "dry-container"
3
+ require "dry-initializer"
3
4
 
4
5
  # Defines a `dont_use` method which can be used to deprecate methods. Whenever
5
6
  # the deprecated method is used the specified handler will get triggered.
6
7
  #
7
8
  # @example
8
9
  #
9
- # class Person
10
- # include Dont.new(:exception)
11
- #
12
- # attr_accessor :firstname
13
- # attr_accessor :first_name
14
- #
15
- # dont_use :firstname
16
- # end
17
- #
18
- # Person.new.firstname # => Dont::DeprecationError
19
- #
20
- # # Register custom handlers
21
- # Dont.register_handler(:logger, ->(object, method) {
22
- # class_name = object.class.name
23
- # logger.warn("Don't use `#{class_name}##{method}`. It's deprecated.")
24
- # })
10
+ # # Register a deprecation handler.
11
+ # # Anything that responds to `.call(deprecation)` will work.
12
+ # LOGGER = Logger.new
13
+ # Dont.register_handler(:logger, ->(deprecation) { LOGGER.warn(deprecation.message) })
25
14
  # class Shouter
26
15
  # include Dont.new(:logger)
27
16
  #
@@ -32,36 +21,35 @@ require "dry-container"
32
21
  # def scream(msg)
33
22
  # shout(msg)
34
23
  # end
35
- # dont_use :scream
24
+ # dont_use :scream, use: :shout
36
25
  # end
37
26
  #
38
- # # This will log "Don't use `Shouter#scream`. It's deprecated.", and then
39
- # # execute the method.
27
+ # # Logs "DEPRECATED: Don't use Shouter#scream. It's deprecated in favor of
28
+ # # shout.", before executing the method.
40
29
  # Shouter.new.scream("hello")
41
- # # => HELLO
42
30
  #
43
31
  #
32
+ # # The :exception deprecation handler is provided by default.
33
+ # # It raises an exception whenever the method is called, which is handy in
34
+ # # test or development mode.
35
+ # class Person
36
+ # include Dont.new(:exception)
37
+ #
38
+ # attr_accessor :firstname
39
+ # attr_accessor :first_name
40
+ #
41
+ # dont_use :firstname, use: :first_name
42
+ # end
43
+ # Person.new.firstname # => fails with Dont::DeprecationError
44
+ #
44
45
  class Dont < Module
45
46
  Error = Class.new(StandardError)
46
47
  DeprecationError = Class.new(Error)
47
48
  MissingHandlerError = Class.new(Error)
48
- WrongArityError = Class.new(Error)
49
-
50
- HANDLERS = {
51
- exception: -> (object, method) {
52
- class_name = object.class.name
53
- fail DeprecationError, "Don't use `#{class_name}##{method}`. It's deprecated."
54
- },
55
- airbrake: -> (object, method) {
56
- class_name = object.class.name
57
- err = DeprecationError.new("Don't use `#{class_name}##{method}`. It's deprecated.")
58
- Airbrake.notify(err)
59
- },
60
- }
61
49
 
62
50
  def initialize(key)
63
51
  handler = Dont.fetch_handler(key)
64
- @implementation = ->(method) {
52
+ @implementation = ->(old_method, use: nil) {
65
53
  # The moment `dont_use` is called in ActiveRecord is before AR defines
66
54
  # the attributes in the model. So you get an error when calling
67
55
  # instance_method with the regular implementation.
@@ -70,19 +58,25 @@ class Dont < Module
70
58
  # adapts the code.
71
59
  is_ar_attribute = defined?(ActiveRecord::Base) &&
72
60
  ancestors.include?(ActiveRecord::Base) &&
73
- !method_defined?(method)
61
+ !method_defined?(old_method)
74
62
 
75
- old_method = instance_method(method) unless is_ar_attribute
76
- define_method(method) do |*args|
77
- handler.call(self, method)
63
+ original = instance_method(old_method) unless is_ar_attribute
64
+ define_method(old_method) do |*args|
65
+ deprecation = Deprecation.new(
66
+ subject: self,
67
+ new_method: use,
68
+ old_method: old_method,
69
+ )
70
+ handler.call(deprecation)
78
71
  if is_ar_attribute
79
- if method =~ /=$/
80
- self[method.to_s.gsub(/=$/, '')] = args.first
72
+ if old_method =~ /=\z/
73
+ attr = old_method.to_s.sub(/=\z/, '')
74
+ public_send(:[]=, attr, *args)
81
75
  else
82
- self[method.to_s.gsub(/\?$/, '')]
76
+ self[old_method.to_s.sub(/\?\z/, '')]
83
77
  end
84
78
  else
85
- old_method.bind(self).call(*args)
79
+ original.bind(self).call(*args)
86
80
  end
87
81
  end
88
82
  }
@@ -95,23 +89,46 @@ class Dont < Module
95
89
  end
96
90
 
97
91
  class << self
98
- def handlers
99
- @handlers ||= Dry::Container.new
100
- end
101
-
102
92
  def register_handler(key, callable)
103
93
  handlers.register(key, callable)
104
94
  end
105
95
 
106
96
  def fetch_handler(key)
107
- self.handlers.resolve(key)
97
+ handlers.resolve(key)
108
98
  rescue Dry::Container::Error => e
109
99
  fail MissingHandlerError, e.message
110
100
  end
101
+
102
+ protected
103
+
104
+ def handlers
105
+ @handlers ||= Dry::Container.new
106
+ end
107
+ end
108
+
109
+ # Contains info about the deprecated method being called
110
+ class Deprecation
111
+ extend Dry::Initializer::Mixin
112
+
113
+ option :subject
114
+ option :new_method
115
+ option :old_method, optional: true
116
+
117
+ # A message saying that the old_method is deprecated. It also mentions the
118
+ # new_method if provided.
119
+ #
120
+ # @return [String]
121
+ def message
122
+ klass = subject.class.name
123
+ if new_method && !new_method.empty?
124
+ "DEPRECATED: Don't use #{klass}##{old_method}. It's deprecated in favor of #{new_method}."
125
+ else
126
+ "DEPRECATED: Don't use #{klass}##{old_method}. It's deprecated."
127
+ end
128
+ end
111
129
  end
112
130
 
113
- register_handler(:exception, -> (object, method) {
114
- class_name = object.class.name
115
- fail Dont::DeprecationError, "Don't use `#{class_name}##{method}`. It's deprecated."
131
+ register_handler(:exception, -> (deprecation) {
132
+ fail Dont::DeprecationError, deprecation.message
116
133
  })
117
134
  end
@@ -1,3 +1,3 @@
1
1
  class Dont < Module
2
- VERSION = "0.1.2".freeze
2
+ VERSION = "0.2.0".freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dont
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Maarten Claes
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-12-09 00:00:00.000000000 Z
11
+ date: 2016-12-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dry-container
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0.6'
27
+ - !ruby/object:Gem::Dependency
28
+ name: dry-initializer
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 0.10.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 0.10.0
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: bundler
29
43
  requirement: !ruby/object:Gem::Requirement