sudo_attributes 0.3.0 → 0.4.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/.gitignore CHANGED
@@ -19,3 +19,4 @@ rdoc
19
19
  pkg
20
20
 
21
21
  ## PROJECT::SPECIFIC
22
+ .bundle
data/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ source :rubygems
2
+
3
+ group :test do
4
+ gem 'rake'
5
+ gem 'jeweler', '1.4.0'
6
+ gem 'rspec', '~> 1.3.1'
7
+ gem 'sqlite3-ruby', :require => 'sqlite3'
8
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,24 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ gemcutter (0.6.1)
5
+ git (1.2.5)
6
+ jeweler (1.4.0)
7
+ gemcutter (>= 0.1.0)
8
+ git (>= 1.2.5)
9
+ rubyforge (>= 2.0.0)
10
+ json_pure (1.4.6)
11
+ rake (0.8.7)
12
+ rspec (1.3.1)
13
+ rubyforge (2.0.4)
14
+ json_pure (>= 1.1.7)
15
+ sqlite3-ruby (1.3.1)
16
+
17
+ PLATFORMS
18
+ ruby
19
+
20
+ DEPENDENCIES
21
+ jeweler (= 1.4.0)
22
+ rake
23
+ rspec (~> 1.3.1)
24
+ sqlite3-ruby
data/README.textile CHANGED
@@ -22,28 +22,28 @@ It's as easy as adding one method call to your models like so:
22
22
 
23
23
  <pre>
24
24
  class User < ActiveRecord::Base
25
- has_sudo_attributes :protected => :admin
25
+ sudo_attr_protected :admin
26
26
  end
27
27
  </pre>
28
28
 
29
29
  h2. Class Methods
30
30
 
31
- The class method *has_sudo_attributes* will be available to all rails models. When called with or without arguments, it adds numerous 'sudo' methods to the class. You may still use the default methods @attr_protected@ or @attr_accessible@ provided by rails, but you must still call @has_sudo_attributes@ in order to gain access to the sudo methods.
31
+ The class methods *sudo_attr_protected* and *sudo_attr_accessible* will be available to all ActiveRecord models. When called, it adds numerous 'sudo' methods to the class. You may still use the default methods @attr_protected@ or @attr_accessible@ provided by rails, but you must still call @has_sudo_attributes@ in order to gain access to the sudo methods.
32
32
 
33
33
  Here are four different ways it can be used:
34
34
 
35
- @has_sudo_attributes :attribute1, :attribute2@ - Defines protected attributes
35
+ @sudo_attr_protected :attribute1, :attribute2@ - Defines protected attributes
36
36
 
37
- @has_sudo_attributes :protected => :attribute1@ - Identical behavior to previous
37
+ @sudo_attr_accessible :attribute1, :attribute2@ - Defines accessible attributes
38
38
 
39
- @has_sudo_attributes :accessible => [:attribute1, :attribute2]@ - Defines accessible attributes
39
+ @sudo_attr_protected@ or @sudo_attr_accessible@ - With no arguments, it will rely on calls to @attr_protected@ or @attr_accessible@
40
40
 
41
- @has_sudo_attributes@ - With no arguments, it will rely on calls to @attr_protected@ or @attr_accessible@
42
-
43
- Any model that calls @has_sudo_attributes@ will also be able to create new instances that override protected attributes using the following methods:
41
+ Any model that calls @sudo_attr_*@ will also be able to create new instances that override protected attributes using the following methods:
44
42
 
45
43
  @Model.sudo_create@ - Uses same syntax as @Model.create@ to instantiate and save an object with protected attributes
46
44
 
45
+ @Model.sudo_create!@ - Similar to @Model.sudo_create@, but it raises an ActiveRecord::RecordInvalid exception if there are invalid attributes
46
+
47
47
  @Model.sudo_new@ - Uses same syntax as @Model.new@ to instantiate, but not save an object with protected attributes
48
48
 
49
49
  h2. Instance Methods
@@ -58,7 +58,7 @@ h2. Examples
58
58
 
59
59
  <pre>
60
60
  class User < ActiveRecord::Base
61
- has_sudo_attributes :protected => :admin
61
+ sudo_attr_protected :admin
62
62
  end
63
63
  </pre>
64
64
 
data/Rakefile CHANGED
@@ -38,8 +38,6 @@ rescue LoadError
38
38
  end
39
39
  end
40
40
 
41
- task :spec => :check_dependencies
42
-
43
41
  task :default => :spec
44
42
 
45
43
  require 'rake/rdoctask'
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.0
1
+ 0.4.0
@@ -1,48 +1,27 @@
1
1
  module SudoAttributes
2
-
3
- module Base
4
- # This is the method that will be called from each model you want to enable SudoAttributes in
5
- def has_sudo_attributes(*attrs)
6
- raise "Invalid argument passed to has_sudo_attributes" unless valid_attributes? attrs
7
2
 
8
- set_protected_attributes(attrs) unless attrs.empty?
9
-
10
- self.send :extend, SudoAttributes::ClassMethods
11
- self.send :include, SudoAttributes::InstanceMethods
12
- end
13
-
14
- private
15
-
16
- def valid_attributes?(attrs)
17
- attrs.empty? || hash_syntax?(attrs) || all_symbols?(attrs)
18
- end
19
-
20
- # True if argument is in the form ":protected => :field1" or ":accessible => :field2"
21
- def hash_syntax?(attrs)
22
- return false unless attrs.size == 1
23
-
24
- hash = attrs.first
25
-
26
- hash.is_a?(Hash) && (hash.has_key?(:protected) || hash.has_key?(:accessible))
3
+ module Base
4
+ def sudo_attr_protected(*attrs)
5
+ Private::set_attributes(self, attrs, :protected)
27
6
  end
28
-
29
- # True if argument is in the form ":field1, :field2, :field3"
30
- def all_symbols?(attrs)
31
- attrs.all? {|e| e.class == Symbol}
7
+
8
+ def sudo_attr_accessible(*attrs)
9
+ Private::set_attributes(self, attrs, :accessible)
32
10
  end
11
+ end
12
+
13
+ module Private
33
14
 
34
- # Set the protected attributes depending on the key
35
- def set_protected_attributes(attrs)
36
- if all_symbols? attrs
37
- self.attr_protected *attrs
38
- else
39
- key = attrs[0].has_key?(:protected) ? :protected : :accessible
15
+ def self.set_attributes(klass, attrs, type)
16
+ unless attrs.empty?
17
+ raise "Invalid argument passed to has_sudo_attributes" unless attrs.all? {|a| a.is_a? Symbol }
40
18
 
41
- # Call either attr_protected or attr_accessible
42
- self.send("attr_#{key}", *attrs[0][key])
19
+ klass.send("attr_#{type}", *attrs)
43
20
  end
21
+
22
+ klass.extend SudoAttributes::ClassMethods
23
+ klass.send :include, SudoAttributes::InstanceMethods
44
24
  end
45
-
46
25
  end
47
26
 
48
27
  # Added to ActiveRecord model only if has_sudo_attributes is called
@@ -60,16 +39,13 @@ module SudoAttributes
60
39
  end
61
40
 
62
41
  def sudo_new(attributes=nil)
63
- new(attributes, false)
42
+ instance = new(nil)
43
+ instance.send(:attributes=, attributes, false)
44
+ instance
64
45
  end
65
46
  end
66
47
 
67
48
  module InstanceMethods
68
- def initialize(attributes=nil, attributes_protected=true)
69
- super(nil)
70
- send(:attributes=, attributes, attributes_protected)
71
- end
72
-
73
49
  def sudo_update_attributes(new_attributes)
74
50
  self.send(:attributes=, new_attributes, false)
75
51
  save
@@ -77,4 +53,4 @@ module SudoAttributes
77
53
  end
78
54
  end
79
55
 
80
- ActiveRecord::Base.send :extend, SudoAttributes::Base
56
+ ActiveRecord::Base.extend SudoAttributes::Base
data/spec/spec_helper.rb CHANGED
@@ -18,13 +18,12 @@ end
18
18
 
19
19
  module SudoAttributesTest
20
20
  ARGUMENTS = [
21
- { :protected => :name},
22
- { :accessible => [:color, :age] },
23
- :name,
24
- nil # No arguments passed in
21
+ "sudo_attr_protected :name",
22
+ "sudo_attr_accessible :color, :age",
23
+ "attr_protected :name; sudo_attr_protected"
25
24
  ]
26
25
 
27
- def self.build_cat_class(arguments)
26
+ def self.build_cat_class(argument)
28
27
 
29
28
  # Remove the Cat class if it's already been defined in previous run
30
29
  Object.class_eval { remove_const "Cat" if const_defined? "Cat" }
@@ -33,16 +32,9 @@ module SudoAttributesTest
33
32
  klass = Class.new(ActiveRecord::Base)
34
33
  Object.const_set("Cat", klass)
35
34
 
36
- if arguments.nil?
37
- Cat.class_eval do
38
- attr_protected :name
39
- has_sudo_attributes
40
- end
41
- else
42
- Cat.class_eval do
43
- validates_presence_of :color
44
- has_sudo_attributes arguments
45
- end
46
- end
35
+ Cat.class_eval %{
36
+ validates_presence_of :color
37
+ #{argument}
38
+ }
47
39
  end
48
40
  end
@@ -99,7 +99,7 @@ end
99
99
  describe "A Cat" do
100
100
 
101
101
  before(:each) do
102
- SudoAttributesTest::build_cat_class(:name)
102
+ SudoAttributesTest::build_cat_class("sudo_attr_protected :name")
103
103
  end
104
104
 
105
105
  context "when initialized with invalid params using sudo_create!" do
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{sudo_attributes}
8
- s.version = "0.3.0"
8
+ s.version = "0.4.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Peter Brown"]
12
- s.date = %q{2010-10-07}
12
+ s.date = %q{2010-11-19}
13
13
  s.description = %q{Adds 'sudo' methods to update protected ActiveRecord attributes with mass assignment}
14
14
  s.email = %q{github@lette.us}
15
15
  s.extra_rdoc_files = [
@@ -19,6 +19,8 @@ Gem::Specification.new do |s|
19
19
  s.files = [
20
20
  ".document",
21
21
  ".gitignore",
22
+ "Gemfile",
23
+ "Gemfile.lock",
22
24
  "LICENSE",
23
25
  "README.textile",
24
26
  "Rakefile",
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sudo_attributes
3
3
  version: !ruby/object:Gem::Version
4
- hash: 19
4
+ hash: 15
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 3
8
+ - 4
9
9
  - 0
10
- version: 0.3.0
10
+ version: 0.4.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Peter Brown
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-10-07 00:00:00 -04:00
18
+ date: 2010-11-19 00:00:00 -05:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -76,6 +76,8 @@ extra_rdoc_files:
76
76
  files:
77
77
  - .document
78
78
  - .gitignore
79
+ - Gemfile
80
+ - Gemfile.lock
79
81
  - LICENSE
80
82
  - README.textile
81
83
  - Rakefile