safe_attributes 1.0.2 → 1.0.3

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/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2010 C. Brian Jones
1
+ Copyright (c) 2010,2011 C. Brian Jones
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.rdoc CHANGED
@@ -26,6 +26,8 @@ that this module does not prevent the creation of:
26
26
 
27
27
  These largely should not run afoul of Ruby or ActiveRecord in most cases.
28
28
 
29
+ == Accessing Attributes
30
+
29
31
  To access an attribute in ActiveRecord without its normal getter or setter
30
32
  you can use a couple of different approaches.
31
33
 
@@ -35,6 +37,13 @@ you can use a couple of different approaches.
35
37
 
36
38
  You can read more about reserved words[http://oldwiki.rubyonrails.org/rails/pages/ReservedWords] and magic field names[http://oldwiki.rubyonrails.org/rails/pages/MagicFieldNames] on Rails' wiki pages.
37
39
 
40
+ == Validations
41
+
42
+ By including safe_attributes, an instance method read_attribute_for_validation
43
+ is defined in a way that will work for all attributes instead of the
44
+ default implementation that relies upon the default accessors. In other
45
+ words, `validates_presence_of :class' will work as of version 1.0.3.
46
+
38
47
  == Installing
39
48
 
40
49
  gem install safe_attributes
@@ -60,10 +69,12 @@ Add safe_attributes to your Gemfile.
60
69
 
61
70
  SafeAttributes is included into ActiveRecord::Base automatically. While
62
71
  nothing else should be necessary, you can still add to the list of bad
63
- attributes if you find it necessary.
72
+ attributes if you find it necessary. This list is a list of method names
73
+ not to generate.
64
74
 
65
75
  class MyModel < ActiveRecord::Base
66
76
  bad_attribute_names :my_attr
77
+ validates_presence_of :my_attr
67
78
  end
68
79
 
69
80
  === Outside of Rails
@@ -84,4 +95,8 @@ attributes if you find it necessary.
84
95
 
85
96
  == Copyright
86
97
 
87
- Copyright (c) 2010 C. Brian Jones. See LICENSE for details.
98
+ Copyright (c) 2010,2011 C. Brian Jones. See LICENSE for details.
99
+
100
+ == Thanks
101
+
102
+ * Jaime Bellmyer - http://kconrails.com
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.2
1
+ 1.0.3
@@ -1,47 +1,54 @@
1
1
  module SafeAttributes
2
- extend ActiveSupport::Concern
2
+ extend ActiveSupport::Concern
3
3
 
4
- module ClassMethods
5
- #
6
- # Within your model call this method once with a list of
7
- # methods matching either attribute() or attribute=() for
8
- # attributes (column names) you do not want to create the
9
- # the normal method for. You should not need to do this
10
- # but the option is there in case the default list is
11
- # inadequate
12
- #
13
- def bad_attribute_names(*attrs)
14
- @bad_attribute_names ||= lambda {
15
- methods = Array.new(attrs.collect { |x| x.to_s })
16
- methods += ActiveRecord::Base.public_instance_methods
17
- methods += ActiveRecord::Base.protected_instance_methods
18
- methods += ActiveRecord::Base.private_instance_methods
19
- methods -= ['id']
20
- return methods
21
- }.call
22
- end
4
+ module ClassMethods
5
+ #
6
+ # Within your model call this method once with a list of
7
+ # methods matching either attribute() or attribute=() for
8
+ # attributes (column names) you do not want to create the
9
+ # the normal method for. You should not need to do this
10
+ # but the option is there in case the default list is
11
+ # inadequate.
12
+ #
13
+ def bad_attribute_names(*attrs)
14
+ @bad_attribute_names ||= lambda {
15
+ methods = Array.new(attrs.collect { |x| x.to_s })
16
+ methods += ActiveRecord::Base.public_instance_methods
17
+ methods += ActiveRecord::Base.protected_instance_methods
18
+ methods += ActiveRecord::Base.private_instance_methods
19
+ methods -= ['id']
20
+ return methods
21
+ }.call
22
+ end
23
23
 
24
- #
25
- # Override the default implementation to not create the
26
- # attribute() method if that method name is in the list of
27
- # bad names
28
- #
29
- def define_method_attribute(attr_name)
30
- return if (bad_attribute_names.include?(attr_name))
31
- super(attr_name)
32
- end
24
+ #
25
+ # Override the default implementation to not create the
26
+ # attribute() method if that method name is in the list of
27
+ # bad names
28
+ #
29
+ def define_method_attribute(attr_name)
30
+ return if (bad_attribute_names.include?(attr_name))
31
+ super(attr_name)
32
+ end
33
33
 
34
- #
35
- # Override the default implementation to not create the
36
- # attribute= method if that method name is in the list of
37
- # bad names
38
- #
39
- def define_method_attribute=(attr_name)
40
- method = attr_name + '='
41
- return if (bad_attribute_names.include?(method))
42
- super(attr_name)
43
- end
34
+ #
35
+ # Override the default implementation to not create the
36
+ # attribute= method if that method name is in the list of
37
+ # bad names
38
+ #
39
+ def define_method_attribute=(attr_name)
40
+ method = attr_name + '='
41
+ return if (bad_attribute_names.include?(method))
42
+ super(attr_name)
44
43
  end
44
+ end
45
+
46
+ module InstanceMethods
47
+ def read_attribute_for_validation(attr)
48
+ self[attr.to_sym]
49
+ end
50
+ end
51
+
45
52
  end
46
53
 
47
54
  require 'safe_attributes/railtie.rb' if defined?(Rails)
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{safe_attributes}
8
- s.version = "1.0.2"
8
+ s.version = "1.0.3"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Brian Jones"]
12
- s.date = %q{2011-01-24}
12
+ s.date = %q{2011-02-01}
13
13
  s.description = %q{Better support for legacy database schemas for ActiveRecord, such as columns named class, or any other name that conflicts with an instance method of ActiveRecord.}
14
14
  s.email = %q{cbj@gnu.org}
15
15
  s.extra_rdoc_files = [
@@ -3,90 +3,99 @@ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
3
3
  # create the table for the test in the database
4
4
  ActiveRecord::Base.connection.execute("DROP TABLE IF EXISTS 'my_models'")
5
5
  ActiveRecord::Base.connection.create_table(:my_models) do |t|
6
- t.string :class
7
- t.string :bad_attribute
8
- t.string :good_attribute
6
+ t.string :class
7
+ t.string :bad_attribute
8
+ t.string :good_attribute
9
9
  end
10
10
 
11
11
  class MyModel < ActiveRecord::Base
12
- include SafeAttributes
13
- bad_attribute_names :bad_attribute, :bad_attribute=
12
+ include SafeAttributes
13
+ bad_attribute_names :bad_attribute, :bad_attribute=
14
+ validates_presence_of :class
14
15
  end
15
16
 
16
17
  describe MyModel do
17
18
 
18
- before(:each) do
19
- ActiveRecord::Base.connection.increment_open_transactions
20
- ActiveRecord::Base.connection.begin_db_transaction
21
- @model = MyModel.new
22
- end
23
-
24
- after(:each) do
25
- ActiveRecord::Base.connection.rollback_db_transaction
26
- ActiveRecord::Base.connection.decrement_open_transactions
27
- end
28
-
29
- it "inspecting class returns expected attribute names" do
30
- MyModel.inspect.should match 'class: string'
31
- end
32
-
33
- it "inspecting instance returns expected attribute names" do
34
- @model.inspect.should match 'class: nil'
35
- end
36
-
37
- it "does not redefine class()" do
38
- @model.class.name.should == 'MyModel'
39
- end
40
-
41
- it "defines class=()" do
42
- @model.respond_to?('class=') # to force method generation
43
- @model.methods.include?('class=').should be_true
44
- end
45
-
46
- it "does not define bad_attribute()" do
47
- @model.respond_to?('bad_attribute') # to force method generation
48
- @model.methods.include?('bad_attribute').should be_false
49
- end
50
-
51
- it "does not define bad_attribute=()" do
52
- @model.respond_to?('bad_attribute=') # to force method generation
53
- @model.methods.include?('bad_attribute=').should be_false
54
- end
55
-
56
- it "does define good_attribute()" do
57
- @model.respond_to?('good_attribute') # to force method generation
58
- @model.methods.include?('good_attribute').should be_true
59
- end
60
-
61
- it "does define good_attribute=()" do
62
- @model.respond_to?('good_attribute=') # to force method generation
63
- @model.methods.include?('good_attribute=').should be_true
64
- end
65
-
66
- it "does define id()" do
67
- @model.respond_to?('id') # to force method generation
68
- @model.methods.include?('id').should be_true
69
- end
70
-
71
- it "can create instance in database with special attribute name" do
72
- m = MyModel.create(:class => 'Foo')
73
- m = MyModel.find(m.id)
74
- m[:class].should == 'Foo'
75
- end
76
-
77
- it "has class attribute" do
78
- MyModel.new().has_attribute?('class').should be_true
79
- end
80
-
81
- it "can call class= without error" do
82
- m = MyModel.new()
83
- m.class = 'Foo'
84
- m[:class].should == 'Foo'
85
- end
86
-
87
- it "can use finders with attribute" do
88
- m = MyModel.find_all_by_class('Foo')
89
- m.size.should == 0
90
- end
19
+ before(:each) do
20
+ ActiveRecord::Base.connection.increment_open_transactions
21
+ ActiveRecord::Base.connection.begin_db_transaction
22
+ @model = MyModel.new
23
+ end
24
+
25
+ after(:each) do
26
+ ActiveRecord::Base.connection.rollback_db_transaction
27
+ ActiveRecord::Base.connection.decrement_open_transactions
28
+ end
29
+
30
+ it "inspecting class returns expected attribute names" do
31
+ MyModel.inspect.should match 'class: string'
32
+ end
33
+
34
+ it "inspecting instance returns expected attribute names" do
35
+ @model.inspect.should match 'class: nil'
36
+ end
37
+
38
+ it "does not redefine class()" do
39
+ @model.class.name.should == 'MyModel'
40
+ end
41
+
42
+ it "defines class=()" do
43
+ @model.respond_to?('class=') # to force method generation
44
+ @model.methods.include?('class=').should be_true
45
+ end
46
+
47
+ it "does not define bad_attribute()" do
48
+ @model.respond_to?('bad_attribute') # to force method generation
49
+ @model.methods.include?('bad_attribute').should be_false
50
+ end
51
+
52
+ it "does not define bad_attribute=()" do
53
+ @model.respond_to?('bad_attribute=') # to force method generation
54
+ @model.methods.include?('bad_attribute=').should be_false
55
+ end
56
+
57
+ it "does define good_attribute()" do
58
+ @model.respond_to?('good_attribute') # to force method generation
59
+ @model.methods.include?('good_attribute').should be_true
60
+ end
61
+
62
+ it "does define good_attribute=()" do
63
+ @model.respond_to?('good_attribute=') # to force method generation
64
+ @model.methods.include?('good_attribute=').should be_true
65
+ end
66
+
67
+ it "does define id()" do
68
+ @model.respond_to?('id') # to force method generation
69
+ @model.methods.include?('id').should be_true
70
+ end
71
+
72
+ it "can create instance in database with special attribute name" do
73
+ m = MyModel.create(:class => 'Foo')
74
+ m = MyModel.find(m.id)
75
+ m[:class].should == 'Foo'
76
+ end
77
+
78
+ it "has class attribute" do
79
+ MyModel.new().has_attribute?('class').should be_true
80
+ end
81
+
82
+ it "can call class= without error" do
83
+ m = MyModel.new()
84
+ m.class = 'Foo'
85
+ m[:class].should == 'Foo'
86
+ end
87
+
88
+ it "can use finders with attribute" do
89
+ m = MyModel.find_all_by_class('Foo')
90
+ m.size.should == 0
91
+ end
92
+
93
+ it "validates presence of class" do
94
+ @model.valid?.should be_false
95
+ Array(@model.errors[:class]).include?("can't be blank").should be_true
96
+
97
+ m = MyModel.new(:class => 'Foo')
98
+ m.valid?.should be_true
99
+ end
91
100
  end
92
101
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: safe_attributes
3
3
  version: !ruby/object:Gem::Version
4
- hash: 19
4
+ hash: 17
5
5
  prerelease: false
6
6
  segments:
7
7
  - 1
8
8
  - 0
9
- - 2
10
- version: 1.0.2
9
+ - 3
10
+ version: 1.0.3
11
11
  platform: ruby
12
12
  authors:
13
13
  - Brian Jones
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-01-24 00:00:00 -05:00
18
+ date: 2011-02-01 00:00:00 -05:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency