acread 0.5.3 → 0.6.0

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/Gemfile CHANGED
@@ -3,6 +3,10 @@ source 'http://rubygems.org/'
3
3
  # gem dependencies
4
4
  gem 'rails', '>= 3.0'
5
5
 
6
+ if Gem::Version.new(String.new(RUBY_VERSION)) > Gem::Version.new('1.9')
7
+ gem 'continuable', :path => '~/Projects/continuable'
8
+ end
9
+
6
10
  # dependencies to develop your gem here.
7
11
  # Include everything needed to run rake, tests, features, etc.
8
12
  group :development do
data/README.md CHANGED
@@ -9,6 +9,8 @@ When you deprecate an attribute, acread can helps you in 3 ways :
9
9
  1. ignore this atribute when serializing the object through to_json, to_xml ...
10
10
  1. helps your zero downtime migration by ignoring the attribute for objects already in memory when saving to database.
11
11
 
12
+ Have a look at this [London Ruby Group Lightning talk](http://skillsmatter.com/podcast/ajax-ria/hulk-smash) for a quick description of that 3 steps.
13
+
12
14
  # Usage
13
15
 
14
16
  ## Installation
@@ -29,21 +31,26 @@ end
29
31
  ## find attribute usage
30
32
  you can catch the `DeprecatedAttributeError` exception and for example put a backtrace in a specific logger.
31
33
 
34
+ If you are using ruby > 1.9, Acread use the gem continuable (https://github.com/cmaruz/continuable).
35
+ The DeprecatedAttributeError can then be continued, this mean you can catch it and continue normal ActiveRecord behavior.
36
+ You're code hunting can then be done without any effect on your datas by simply catching the exception, logging and continuing.
37
+
32
38
  ```ruby
33
39
  class ApplicationController
34
40
  rescue_from DeprecatedAttributeError, :with => :log_deprecate
35
-
41
+
36
42
  private
37
-
43
+
38
44
  def deprecated_logger
39
45
  @@deprecated_logger ||= Logger.new("#{Rails.root}/log/deprecated_calls.log")
40
46
  end
41
-
47
+
42
48
  def log_deprecated e
43
49
  deprecated_logger.error(e.stacktrace.join("\n"))
50
+ e.continue
44
51
  end
45
52
  end
46
- ```
53
+ ```
47
54
 
48
55
  ## zero downtime migration
49
56
  When you are done with cleaning your code from any usage of deprecated attributes, you can prepare a migration including some drop_columns.
@@ -62,7 +69,7 @@ class RemoveLongNames < ActiveRecord::Migration
62
69
  end
63
70
  end
64
71
  ```
65
-
72
+
66
73
  Then you can safely follow the steps :
67
74
 
68
75
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.5.3
1
+ 0.6.0
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "acread"
8
- s.version = "0.5.3"
8
+ s.version = "0.6.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["yann ARMAND", "Nick Campbell"]
12
- s.date = "2012-12-06"
12
+ s.date = "2013-02-18"
13
13
  s.description = "An ActiveRecord Extension to deprecate attributes"
14
14
  s.email = "yann@harakys.com"
15
15
  s.extra_rdoc_files = [
@@ -41,6 +41,7 @@ Gem::Specification.new do |s|
41
41
 
42
42
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
43
43
  s.add_runtime_dependency(%q<rails>, [">= 3.0"])
44
+ s.add_runtime_dependency(%q<continuable>, [">= 0"])
44
45
  s.add_development_dependency(%q<shoulda>, [">= 0"])
45
46
  s.add_development_dependency(%q<rdoc>, [">= 3.12"])
46
47
  s.add_development_dependency(%q<bundler>, [">= 1.0.0"])
@@ -48,6 +49,7 @@ Gem::Specification.new do |s|
48
49
  s.add_development_dependency(%q<sqlite3>, [">= 0"])
49
50
  else
50
51
  s.add_dependency(%q<rails>, [">= 3.0"])
52
+ s.add_dependency(%q<continuable>, [">= 0"])
51
53
  s.add_dependency(%q<shoulda>, [">= 0"])
52
54
  s.add_dependency(%q<rdoc>, [">= 3.12"])
53
55
  s.add_dependency(%q<bundler>, [">= 1.0.0"])
@@ -56,6 +58,7 @@ Gem::Specification.new do |s|
56
58
  end
57
59
  else
58
60
  s.add_dependency(%q<rails>, [">= 3.0"])
61
+ s.add_dependency(%q<continuable>, [">= 0"])
59
62
  s.add_dependency(%q<shoulda>, [">= 0"])
60
63
  s.add_dependency(%q<rdoc>, [">= 3.12"])
61
64
  s.add_dependency(%q<bundler>, [">= 1.0.0"])
@@ -1,2 +1,7 @@
1
- require 'acread/active_record_ext'
1
+ module Acread
2
+ def self.run_19?
3
+ Gem::Version.new(String.new(RUBY_VERSION)) > Gem::Version.new('1.9')
4
+ end
5
+ end
2
6
 
7
+ require 'acread/active_record_ext'
@@ -2,7 +2,8 @@ require 'active_record'
2
2
  require 'acread/deprecatable'
3
3
 
4
4
  class ActiveRecord::Base
5
- extend Deprecatable
5
+
6
+ include Deprecatable
6
7
 
7
8
  def columns
8
9
  self.class.columns.reject { |c| (self.class.deprecated_attributes || []).include? c.name.to_s}
@@ -1,32 +1,45 @@
1
+ require 'continuable' if Acread::run_19?
2
+
1
3
  module Deprecatable
2
4
 
5
+ def self.included(base)
6
+ base.extend ClassMethods
7
+ end
8
+
3
9
  ACCESSORS = [ '', '=', '_before_type_cast', '?', '_changed?', '_change', '_will_change!', '_was']
4
10
 
5
- def deprecate_attribute attr
6
- @deprecated_attributes ||=[]
7
- @deprecated_attributes << attr.to_s
8
- overide_accessors attr
9
- end
11
+ module ClassMethods
12
+ def deprecate_attribute(attr, opts={})
13
+ opts ||={}
14
+ @deprecated_attributes ||=[]
15
+ @deprecated_attributes << attr.to_s
16
+ overide_accessors attr, opts
17
+ end
10
18
 
11
- def deprecated_attributes
12
- @deprecated_attributes
13
- end
19
+ def deprecated_attributes
20
+ @deprecated_attributes
21
+ end
14
22
 
15
- def accessors
16
- # TODO: replace this constant by an ActiveRecord inspection
17
- ACCESSORS
18
- end
23
+ def accessors
24
+ # TODO: replace this constant by an ActiveRecord inspection
25
+ ACCESSORS
26
+ end
19
27
 
20
- def overide_accessors attr
21
- msg = "You can't access atribute #{attr}, it has been deprecated"
22
- accessors.each do |term|
23
- define_method("#{attr}#{term}") do |*args|
24
- raise DeprecatedAttributeError, msg
28
+ def overide_accessors(attr, opts)
29
+ msg = "You can't access atribute #{attr}, it has been deprecated"
30
+ accessors.each do |term|
31
+ define_method("#{attr}#{term}") do |*args|
32
+ raise DeprecatedAttributeError, msg
33
+ (args.length >0 ? super(args) : super()).first # call ActiveRecord behavior if previous exception have been continued
34
+ end
25
35
  end
26
36
  end
27
37
  end
28
38
 
29
- end
39
+ class DeprecatedAttributeError < Exception
40
+ include Continuable if Acread::run_19?
41
+ end
30
42
 
31
- class DeprecatedAttributeError < RuntimeError
32
43
  end
44
+
45
+
@@ -25,17 +25,28 @@ class TestAcread < Test::Unit::TestCase
25
25
  end
26
26
 
27
27
  def test_cretor_with_deprecated_field_raise_exception
28
- assert_raise(DeprecatedAttributeError) { Person.create(:long_name => 'should not see this') }
28
+ assert_raise(Deprecatable::DeprecatedAttributeError) { Person.create(:long_name => 'should not see this') }
29
29
  end
30
30
 
31
31
  def test_read_deprecated_raise_exception
32
- assert_raise(DeprecatedAttributeError) { @bob.long_name }
32
+ assert_raise(Deprecatable::DeprecatedAttributeError) { @bob.long_name }
33
33
  end
34
34
 
35
35
  def test_write_deprecated_raise_exception
36
- assert_raise(DeprecatedAttributeError) { @bob.long_name = 'Bon' }
36
+ assert_raise(Deprecatable::DeprecatedAttributeError) { @bob.long_name = 'Bon' }
37
37
  end
38
38
 
39
+ def test_write_dreprecated_with_continuation
40
+ return true unless Acread::run_19?
41
+ v = 'failure'
42
+ begin
43
+ @bob.long_name = 'bobob'
44
+ v = @bob.long_name
45
+ rescue Deprecatable::DeprecatedAttributeError => e
46
+ e.continue
47
+ end
48
+ assert_equal 'bobob', v
49
+ end
39
50
 
40
51
  def test_hash_exclude_deprecated_attributes
41
52
  h = @bob.serializable_hash
@@ -50,18 +61,18 @@ class TestAcread < Test::Unit::TestCase
50
61
  def test_non_deprecated_class_can_read_all_attributes
51
62
  assert @james.long_name.is_a? String
52
63
  end
53
-
64
+
54
65
  def test_non_deprecated_class_can_write_all_attributes
55
66
  s = 'james the short'
56
67
  @james.long_name = s
57
68
  assert @james.long_name == s
58
69
  end
59
-
70
+
60
71
  def test_non_deprecated_class_columns_output_all_attributes
61
72
  h = @james.send(:columns).map(&:name)
62
73
  assert h.include? 'long_name'
63
74
  end
64
-
75
+
65
76
  def test_non_deprecated_class_hash_output_all_attributes
66
77
  h = @james.serializable_hash
67
78
  assert h.keys.include? 'long_name'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: acread
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.3
4
+ version: 0.6.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-12-06 00:00:00.000000000 Z
13
+ date: 2013-02-18 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rails
@@ -28,6 +28,22 @@ dependencies:
28
28
  - - ! '>='
29
29
  - !ruby/object:Gem::Version
30
30
  version: '3.0'
31
+ - !ruby/object:Gem::Dependency
32
+ name: continuable
33
+ requirement: !ruby/object:Gem::Requirement
34
+ none: false
35
+ requirements:
36
+ - - ! '>='
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ type: :runtime
40
+ prerelease: false
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
31
47
  - !ruby/object:Gem::Dependency
32
48
  name: shoulda
33
49
  requirement: !ruby/object:Gem::Requirement
@@ -143,7 +159,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
143
159
  version: '0'
144
160
  segments:
145
161
  - 0
146
- hash: -1381916777911166831
162
+ hash: -2723091470666414279
147
163
  required_rubygems_version: !ruby/object:Gem::Requirement
148
164
  none: false
149
165
  requirements: