sudo_attributes 0.5.2 → 1.0.1
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/.travis.yml +3 -0
- data/Gemfile +5 -4
- data/Gemfile.lock +85 -75
- data/README.textile +13 -21
- data/Rakefile +23 -41
- data/VERSION +1 -1
- data/lib/sudo_attributes.rb +51 -59
- data/spec/spec_helper.rb +7 -21
- data/spec/sudo_attributes_spec.rb +136 -112
- data/sudo_attributes.gemspec +10 -21
- metadata +35 -101
data/.travis.yml
ADDED
data/Gemfile
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
source :rubygems
|
|
2
2
|
|
|
3
|
+
gem 'rails'
|
|
4
|
+
|
|
3
5
|
group :test do
|
|
4
6
|
gem 'rake'
|
|
5
|
-
gem 'jeweler', '1.4
|
|
6
|
-
gem 'rspec', '~> 2.
|
|
7
|
-
gem 'sqlite3
|
|
8
|
-
gem 'rails', '~> 3.0.0'
|
|
7
|
+
gem 'jeweler', '~> 1.6.4'
|
|
8
|
+
gem 'rspec', '~> 2.6.0'
|
|
9
|
+
gem 'sqlite3'
|
|
9
10
|
end
|
data/Gemfile.lock
CHANGED
|
@@ -1,96 +1,106 @@
|
|
|
1
1
|
GEM
|
|
2
2
|
remote: http://rubygems.org/
|
|
3
3
|
specs:
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
rack (~> 1.
|
|
15
|
-
rack-mount (~> 0.
|
|
16
|
-
rack-test (~> 0.
|
|
17
|
-
|
|
18
|
-
activemodel (3.0
|
|
19
|
-
activesupport (= 3.0
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
4
|
+
actionmailer (3.1.0)
|
|
5
|
+
actionpack (= 3.1.0)
|
|
6
|
+
mail (~> 2.3.0)
|
|
7
|
+
actionpack (3.1.0)
|
|
8
|
+
activemodel (= 3.1.0)
|
|
9
|
+
activesupport (= 3.1.0)
|
|
10
|
+
builder (~> 3.0.0)
|
|
11
|
+
erubis (~> 2.7.0)
|
|
12
|
+
i18n (~> 0.6)
|
|
13
|
+
rack (~> 1.3.2)
|
|
14
|
+
rack-cache (~> 1.0.3)
|
|
15
|
+
rack-mount (~> 0.8.2)
|
|
16
|
+
rack-test (~> 0.6.1)
|
|
17
|
+
sprockets (~> 2.0.0)
|
|
18
|
+
activemodel (3.1.0)
|
|
19
|
+
activesupport (= 3.1.0)
|
|
20
|
+
bcrypt-ruby (~> 3.0.0)
|
|
21
|
+
builder (~> 3.0.0)
|
|
22
|
+
i18n (~> 0.6)
|
|
23
|
+
activerecord (3.1.0)
|
|
24
|
+
activemodel (= 3.1.0)
|
|
25
|
+
activesupport (= 3.1.0)
|
|
26
|
+
arel (~> 2.2.1)
|
|
27
|
+
tzinfo (~> 0.3.29)
|
|
28
|
+
activeresource (3.1.0)
|
|
29
|
+
activemodel (= 3.1.0)
|
|
30
|
+
activesupport (= 3.1.0)
|
|
31
|
+
activesupport (3.1.0)
|
|
32
|
+
multi_json (~> 1.0)
|
|
33
|
+
arel (2.2.1)
|
|
34
|
+
bcrypt-ruby (3.0.0)
|
|
35
|
+
builder (3.0.0)
|
|
36
|
+
diff-lcs (1.1.3)
|
|
37
|
+
erubis (2.7.0)
|
|
37
38
|
git (1.2.5)
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
hike (1.2.1)
|
|
40
|
+
i18n (0.6.0)
|
|
41
|
+
jeweler (1.6.4)
|
|
42
|
+
bundler (~> 1.0)
|
|
41
43
|
git (>= 1.2.5)
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
mail (2.2.14)
|
|
45
|
-
activesupport (>= 2.3.6)
|
|
44
|
+
rake
|
|
45
|
+
mail (2.3.0)
|
|
46
46
|
i18n (>= 0.4.0)
|
|
47
47
|
mime-types (~> 1.16)
|
|
48
48
|
treetop (~> 1.4.8)
|
|
49
49
|
mime-types (1.16)
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
rack
|
|
50
|
+
multi_json (1.0.3)
|
|
51
|
+
polyglot (0.3.2)
|
|
52
|
+
rack (1.3.2)
|
|
53
|
+
rack-cache (1.0.3)
|
|
54
|
+
rack (>= 0.4)
|
|
55
|
+
rack-mount (0.8.3)
|
|
53
56
|
rack (>= 1.0.0)
|
|
54
|
-
rack-
|
|
57
|
+
rack-ssl (1.3.2)
|
|
58
|
+
rack
|
|
59
|
+
rack-test (0.6.1)
|
|
55
60
|
rack (>= 1.0)
|
|
56
|
-
rails (3.0
|
|
57
|
-
actionmailer (= 3.0
|
|
58
|
-
actionpack (= 3.0
|
|
59
|
-
activerecord (= 3.0
|
|
60
|
-
activeresource (= 3.0
|
|
61
|
-
activesupport (= 3.0
|
|
61
|
+
rails (3.1.0)
|
|
62
|
+
actionmailer (= 3.1.0)
|
|
63
|
+
actionpack (= 3.1.0)
|
|
64
|
+
activerecord (= 3.1.0)
|
|
65
|
+
activeresource (= 3.1.0)
|
|
66
|
+
activesupport (= 3.1.0)
|
|
62
67
|
bundler (~> 1.0)
|
|
63
|
-
railties (= 3.0
|
|
64
|
-
railties (3.0
|
|
65
|
-
actionpack (= 3.0
|
|
66
|
-
activesupport (= 3.0
|
|
68
|
+
railties (= 3.1.0)
|
|
69
|
+
railties (3.1.0)
|
|
70
|
+
actionpack (= 3.1.0)
|
|
71
|
+
activesupport (= 3.1.0)
|
|
72
|
+
rack-ssl (~> 1.3.2)
|
|
67
73
|
rake (>= 0.8.7)
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
rspec-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
rspec-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
74
|
+
rdoc (~> 3.4)
|
|
75
|
+
thor (~> 0.14.6)
|
|
76
|
+
rake (0.9.2)
|
|
77
|
+
rdoc (3.9.4)
|
|
78
|
+
rspec (2.6.0)
|
|
79
|
+
rspec-core (~> 2.6.0)
|
|
80
|
+
rspec-expectations (~> 2.6.0)
|
|
81
|
+
rspec-mocks (~> 2.6.0)
|
|
82
|
+
rspec-core (2.6.4)
|
|
83
|
+
rspec-expectations (2.6.0)
|
|
84
|
+
diff-lcs (~> 1.1.2)
|
|
85
|
+
rspec-mocks (2.6.0)
|
|
86
|
+
sprockets (2.0.0)
|
|
87
|
+
hike (~> 1.2)
|
|
88
|
+
rack (~> 1.0)
|
|
89
|
+
tilt (~> 1.1, != 1.3.0)
|
|
90
|
+
sqlite3 (1.3.4)
|
|
83
91
|
thor (0.14.6)
|
|
84
|
-
|
|
92
|
+
tilt (1.3.3)
|
|
93
|
+
treetop (1.4.10)
|
|
94
|
+
polyglot
|
|
85
95
|
polyglot (>= 0.3.1)
|
|
86
|
-
tzinfo (0.3.
|
|
96
|
+
tzinfo (0.3.29)
|
|
87
97
|
|
|
88
98
|
PLATFORMS
|
|
89
99
|
ruby
|
|
90
100
|
|
|
91
101
|
DEPENDENCIES
|
|
92
|
-
jeweler (
|
|
93
|
-
rails
|
|
102
|
+
jeweler (~> 1.6.4)
|
|
103
|
+
rails
|
|
94
104
|
rake
|
|
95
|
-
rspec (~> 2.
|
|
96
|
-
sqlite3
|
|
105
|
+
rspec (~> 2.6.0)
|
|
106
|
+
sqlite3
|
data/README.textile
CHANGED
|
@@ -12,7 +12,7 @@ The gem is hosted at "rubygems.org":https://rubygems.org/gems/sudo_attributes an
|
|
|
12
12
|
|
|
13
13
|
h2. The Problem
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
ActiveModel provides a convenient way to make your application more secure by using "protected" attributes. Protected attributes are assigned using either @attr_protected@ or @attr_accessible@. This adds security by preventing mass assignment of attributes when doing things like @user.update_attributes(params[:user])@. The issue is that it can be tedious to always manually assign protected attributes in an administrative area of your application. You may find yourself doing things like:
|
|
16
16
|
|
|
17
17
|
<pre>
|
|
18
18
|
user = User.find(params[:id])
|
|
@@ -22,15 +22,20 @@ user.something_else = true
|
|
|
22
22
|
user.save
|
|
23
23
|
</pre>
|
|
24
24
|
|
|
25
|
+
or the alternative in Rails 3.1:
|
|
26
|
+
|
|
27
|
+
<pre>
|
|
28
|
+
user.assign_attributes(params[:user], :without_protection => true)
|
|
29
|
+
user.save
|
|
30
|
+
</pre>
|
|
31
|
+
|
|
25
32
|
h2. The Solution
|
|
26
33
|
|
|
27
34
|
SudoAttributes adds a few 'sudo' methods to your models, allowing you to override the protected attributes **when you know the input can be trusted**.
|
|
28
35
|
|
|
29
|
-
It's as easy as adding one method call to your models like so:
|
|
30
|
-
|
|
31
36
|
<pre>
|
|
32
37
|
class User < ActiveRecord::Base
|
|
33
|
-
|
|
38
|
+
attr_protected :admin
|
|
34
39
|
end
|
|
35
40
|
|
|
36
41
|
user = User.find(params[:id])
|
|
@@ -39,18 +44,6 @@ user.sudo_update_attributes(params[:user])
|
|
|
39
44
|
|
|
40
45
|
h2. Class Methods
|
|
41
46
|
|
|
42
|
-
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.
|
|
43
|
-
|
|
44
|
-
Here are four different ways it can be used:
|
|
45
|
-
|
|
46
|
-
@sudo_attr_protected :attribute1, :attribute2@ - Defines protected attributes
|
|
47
|
-
|
|
48
|
-
@sudo_attr_accessible :attribute1, :attribute2@ - Defines accessible attributes
|
|
49
|
-
|
|
50
|
-
@sudo_attr_protected@ or @sudo_attr_accessible@ - With no arguments, it will rely on calls to @attr_protected@ or @attr_accessible@
|
|
51
|
-
|
|
52
|
-
Any model that calls @sudo_attr_*@ will also be able to create new instances that override protected attributes using the following methods:
|
|
53
|
-
|
|
54
47
|
@Model.sudo_create@ - Uses same syntax as @Model.create@ to instantiate and save an object with protected attributes
|
|
55
48
|
|
|
56
49
|
@Model.sudo_create!@ - Similar to @Model.sudo_create@, but it raises an ActiveRecord::RecordInvalid exception if there are invalid attributes
|
|
@@ -59,10 +52,9 @@ Any model that calls @sudo_attr_*@ will also be able to create new instances tha
|
|
|
59
52
|
|
|
60
53
|
h2. Instance Methods
|
|
61
54
|
|
|
62
|
-
|
|
55
|
+
@sudo_update_attributes@ - Uses identical syntax to @update_attributes@, but overrides protected attributes.
|
|
63
56
|
|
|
64
|
-
|
|
65
|
-
* @sudo_update_attributes!@ - Same as sudo_update_attributes, but raises ActiveRecord errors. Same as @update_attributes!@
|
|
57
|
+
@sudo_update_attributes!@ - Same as sudo_update_attributes, but raises ActiveRecord errors. Same as @update_attributes!@
|
|
66
58
|
|
|
67
59
|
h2. Examples
|
|
68
60
|
|
|
@@ -70,7 +62,7 @@ h2. Examples
|
|
|
70
62
|
|
|
71
63
|
<pre>
|
|
72
64
|
class User < ActiveRecord::Base
|
|
73
|
-
|
|
65
|
+
attr_protected :admin
|
|
74
66
|
end
|
|
75
67
|
</pre>
|
|
76
68
|
|
|
@@ -90,4 +82,4 @@ params[:user] = {:admin => false, :name => "Pete"}
|
|
|
90
82
|
|
|
91
83
|
h2. Copyright
|
|
92
84
|
|
|
93
|
-
Copyright (c)
|
|
85
|
+
Copyright (c) 2011 Peter Brown. See LICENSE for details.
|
data/Rakefile
CHANGED
|
@@ -1,52 +1,34 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
1
3
|
require 'rubygems'
|
|
2
4
|
require 'rake'
|
|
3
5
|
|
|
4
6
|
begin
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
gem.email = "github@lette.us"
|
|
11
|
-
gem.homepage = "http://github.com/beerlington/sudo_attributes"
|
|
12
|
-
gem.authors = ["Peter Brown"]
|
|
13
|
-
gem.add_development_dependency "rspec", "~> 2.0.0"
|
|
14
|
-
gem.add_development_dependency "rails", "~> 3.0.0"
|
|
15
|
-
gem.add_development_dependency "sqlite3-ruby"
|
|
16
|
-
gem.add_dependency "rails", ">= 2.3.0"
|
|
17
|
-
end
|
|
18
|
-
Jeweler::GemcutterTasks.new
|
|
19
|
-
rescue LoadError
|
|
20
|
-
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
|
7
|
+
Bundler.setup(:default, :development)
|
|
8
|
+
rescue Bundler::BundlerError => e
|
|
9
|
+
$stderr.puts e.message
|
|
10
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
|
11
|
+
exit e.status_code
|
|
21
12
|
end
|
|
13
|
+
require 'rake'
|
|
22
14
|
|
|
23
|
-
require '
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
15
|
+
require 'jeweler'
|
|
16
|
+
Jeweler::Tasks.new do |gem|
|
|
17
|
+
gem.name = "sudo_attributes"
|
|
18
|
+
gem.summary = %Q{Override ActiveRecord protected attributes with mass assignment}
|
|
19
|
+
gem.description = %Q{Adds 'sudo' methods to update protected ActiveRecord attributes with mass assignment}
|
|
20
|
+
gem.email = "github@lette.us"
|
|
21
|
+
gem.homepage = "http://github.com/beerlington/sudo_attributes"
|
|
22
|
+
gem.authors = ["Peter Brown"]
|
|
23
|
+
gem.license = "MIT"
|
|
24
|
+
# dependencies defined in Gemfile
|
|
27
25
|
end
|
|
26
|
+
Jeweler::RubygemsDotOrgTasks.new
|
|
28
27
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
test.pattern = 'test/**/test_*.rb'
|
|
34
|
-
test.verbose = true
|
|
35
|
-
end
|
|
36
|
-
rescue LoadError
|
|
37
|
-
task :rcov do
|
|
38
|
-
abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
|
|
39
|
-
end
|
|
28
|
+
require 'rspec/core'
|
|
29
|
+
require 'rspec/core/rake_task'
|
|
30
|
+
RSpec::Core::RakeTask.new(:spec) do |spec|
|
|
31
|
+
spec.pattern = FileList['spec/**/*_spec.rb']
|
|
40
32
|
end
|
|
41
33
|
|
|
42
34
|
task :default => :spec
|
|
43
|
-
|
|
44
|
-
require 'rake/rdoctask'
|
|
45
|
-
Rake::RDocTask.new do |rdoc|
|
|
46
|
-
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
|
47
|
-
|
|
48
|
-
rdoc.rdoc_dir = 'rdoc'
|
|
49
|
-
rdoc.title = "sudo_attributes #{version}"
|
|
50
|
-
rdoc.rdoc_files.include('README*')
|
|
51
|
-
rdoc.rdoc_files.include('lib/**/*.rb')
|
|
52
|
-
end
|
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.
|
|
1
|
+
1.0.1
|
data/lib/sudo_attributes.rb
CHANGED
|
@@ -1,59 +1,38 @@
|
|
|
1
1
|
module SudoAttributes
|
|
2
|
+
extend ActiveSupport::Concern
|
|
2
3
|
|
|
3
|
-
module Base
|
|
4
|
-
|
|
5
|
-
# Protect attributes using ActiveRecord's built in <tt>attr_protected</tt> class macro.
|
|
6
|
-
# When invoked, it also adds other sudo_attributes class and instance methods to model such as +sudo_create+
|
|
7
|
-
#
|
|
8
|
-
# ==== Example
|
|
9
|
-
# # Define attributes which are protected from mass assignment
|
|
10
|
-
# class User < ActiveRecord::Base
|
|
11
|
-
# sudo_attr_protected :admin
|
|
12
|
-
# end
|
|
13
|
-
def sudo_attr_protected(*attrs)
|
|
14
|
-
Private::set_attributes(self, attrs, :protected)
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
# Protect attributes using ActiveRecord's built in <tt>attr_accessible</tt> class macro.
|
|
18
|
-
# When invoked, it also adds other sudo_attributes class and instance methods to model such as +sudo_create+
|
|
19
|
-
#
|
|
20
|
-
# ==== Example
|
|
21
|
-
# # Define attributes which are not protected from mass assignment
|
|
22
|
-
# class User < ActiveRecord::Base
|
|
23
|
-
# sudo_attr_accessible :admin
|
|
24
|
-
# end
|
|
25
|
-
def sudo_attr_accessible(*attrs)
|
|
26
|
-
Private::set_attributes(self, attrs, :accessible)
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
module Private # :nodoc: all
|
|
31
|
-
|
|
32
|
-
# Used internally to assign protected attributes and include additional sudo_attributes functionality
|
|
33
|
-
def self.set_attributes(klass, attrs, type)
|
|
34
|
-
# Call attr_(accessible|protected) if attributes are passed in
|
|
35
|
-
klass.send("attr_#{type}", *attrs) unless attrs.empty?
|
|
36
|
-
|
|
37
|
-
klass.extend SudoAttributes::ClassMethods
|
|
38
|
-
klass.send :include, SudoAttributes::InstanceMethods
|
|
39
|
-
end
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
# Added to ActiveRecord model only if sudo_attr_(accessible|protected) is called
|
|
43
4
|
module ClassMethods
|
|
44
|
-
# Creates an object with protected attributes and saves it to the database, if validations pass.
|
|
5
|
+
# Creates an object (or multiple objects) with protected attributes and saves it to the database, if validations pass.
|
|
45
6
|
# The resulting object is returned whether the object was saved successfully to the database or not.
|
|
46
7
|
#
|
|
47
|
-
#
|
|
8
|
+
# The +attributes+ parameter can be either be a Hash or an Array of Hashes. These Hashes describe the
|
|
48
9
|
# attributes on the objects that are to be created.
|
|
49
10
|
#
|
|
50
|
-
# ====
|
|
51
|
-
# # Create a single new object
|
|
52
|
-
# User.sudo_create(:first_name => 'Pete'
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
11
|
+
# ==== Examples
|
|
12
|
+
# # Create a single new object
|
|
13
|
+
# User.sudo_create(:first_name => 'Pete')
|
|
14
|
+
#
|
|
15
|
+
# # Create an Array of new objects
|
|
16
|
+
# User.sudo_create([{ :first_name => 'Pete' }, { :first_name => 'Sebastian' }])
|
|
17
|
+
#
|
|
18
|
+
# # Create a single object and pass it into a block to set other attributes.
|
|
19
|
+
# User.sudo_create(:first_name => 'Pete') do |u|
|
|
20
|
+
# u.is_admin = false
|
|
21
|
+
# end
|
|
22
|
+
#
|
|
23
|
+
# # Creating an Array of new objects using a block, where the block is executed for each object:
|
|
24
|
+
# User.sudo_create([{ :first_name => 'Pete' }, { :first_name => 'Sebastian' }]) do |u|
|
|
25
|
+
# u.is_admin = false
|
|
26
|
+
# end
|
|
27
|
+
def sudo_create(attributes = nil, &block)
|
|
28
|
+
if attributes.is_a?(Array)
|
|
29
|
+
attributes.collect { |attr| sudo_create(attr, &block) }
|
|
30
|
+
else
|
|
31
|
+
object = sudo_new(attributes)
|
|
32
|
+
yield(object) if block_given?
|
|
33
|
+
object.save
|
|
34
|
+
object
|
|
35
|
+
end
|
|
57
36
|
end
|
|
58
37
|
|
|
59
38
|
# Creates an object just like sudo_create but calls save! instead of save so an exception is raised if the record is invalid
|
|
@@ -61,10 +40,15 @@ module SudoAttributes
|
|
|
61
40
|
# ==== Example
|
|
62
41
|
# # Create a single new object where admin is a protected attribute
|
|
63
42
|
# User.sudo_create!(:first_name => 'Pete', :admin => true)
|
|
64
|
-
def sudo_create!(attributes=nil)
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
43
|
+
def sudo_create!(attributes = nil, &block)
|
|
44
|
+
if attributes.is_a?(Array)
|
|
45
|
+
attributes.collect { |attr| sudo_create!(attr, &block) }
|
|
46
|
+
else
|
|
47
|
+
object = sudo_new(attributes)
|
|
48
|
+
yield(object) if block_given?
|
|
49
|
+
object.save!
|
|
50
|
+
object
|
|
51
|
+
end
|
|
68
52
|
end
|
|
69
53
|
|
|
70
54
|
# Instantiates an object just like ActiveRecord::Base.new, but allowing mass assignment of protected attributes
|
|
@@ -72,9 +56,9 @@ module SudoAttributes
|
|
|
72
56
|
# ==== Example
|
|
73
57
|
# # Instantiate an object where admin is a protected attribute
|
|
74
58
|
# User.sudo_new(:first_name => 'Pete', :admin => true)
|
|
75
|
-
def sudo_new(attributes=nil)
|
|
59
|
+
def sudo_new(attributes = nil)
|
|
76
60
|
instance = new(nil)
|
|
77
|
-
instance.
|
|
61
|
+
instance.sudo_assign_attributes(attributes)
|
|
78
62
|
instance
|
|
79
63
|
end
|
|
80
64
|
|
|
@@ -82,7 +66,6 @@ module SudoAttributes
|
|
|
82
66
|
|
|
83
67
|
end
|
|
84
68
|
|
|
85
|
-
# Added to ActiveRecord model only if sudo_attr_(accessible|protected) is called
|
|
86
69
|
module InstanceMethods
|
|
87
70
|
|
|
88
71
|
# Updates attributes of a model, including protected ones, from the passed-in hash and saves the
|
|
@@ -93,7 +76,7 @@ module SudoAttributes
|
|
|
93
76
|
# @user = User.find(params[:id])
|
|
94
77
|
# @user.sudo_update_attributes(params[:user])
|
|
95
78
|
def sudo_update_attributes(new_attributes)
|
|
96
|
-
|
|
79
|
+
sudo_assign_attributes(new_attributes)
|
|
97
80
|
save
|
|
98
81
|
end
|
|
99
82
|
|
|
@@ -105,10 +88,19 @@ module SudoAttributes
|
|
|
105
88
|
# @user = User.find(params[:id])
|
|
106
89
|
# @user.sudo_update_attributes!(params[:user])
|
|
107
90
|
def sudo_update_attributes!(new_attributes)
|
|
108
|
-
|
|
91
|
+
sudo_assign_attributes(new_attributes)
|
|
109
92
|
save!
|
|
110
93
|
end
|
|
94
|
+
|
|
95
|
+
# Used by sudo_attributes internally as a common API between Rails 3 and 3.1
|
|
96
|
+
def sudo_assign_attributes(attributes)
|
|
97
|
+
if respond_to? :assign_attributes
|
|
98
|
+
assign_attributes(attributes, :without_protection => true)
|
|
99
|
+
else
|
|
100
|
+
self.send(:attributes=, attributes, false)
|
|
101
|
+
end
|
|
102
|
+
end
|
|
111
103
|
end
|
|
112
104
|
end
|
|
113
105
|
|
|
114
|
-
ActiveRecord::Base.
|
|
106
|
+
ActiveRecord::Base.send(:include, SudoAttributes)
|
data/spec/spec_helper.rb
CHANGED
|
@@ -2,9 +2,9 @@ $LOAD_PATH.unshift(File.dirname(__FILE__))
|
|
|
2
2
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
|
3
3
|
|
|
4
4
|
require 'rubygems'
|
|
5
|
+
require 'rspec'
|
|
5
6
|
require 'active_record'
|
|
6
7
|
require 'sudo_attributes'
|
|
7
|
-
require 'spec'
|
|
8
8
|
|
|
9
9
|
ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
|
|
10
10
|
|
|
@@ -16,25 +16,11 @@ ActiveRecord::Schema.define(:version => 1) do
|
|
|
16
16
|
end
|
|
17
17
|
end
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
"sudo_attr_accessible :color, :age",
|
|
23
|
-
"attr_protected :name; sudo_attr_protected"
|
|
24
|
-
]
|
|
25
|
-
|
|
26
|
-
def self.build_cat_class(argument)
|
|
27
|
-
|
|
28
|
-
# Remove the Cat class if it's already been defined in previous run
|
|
29
|
-
Object.class_eval { remove_const "Cat" if const_defined? "Cat" }
|
|
30
|
-
|
|
31
|
-
# Create a new Cat class and evaluate 'has_sudo_attributes :arguments
|
|
32
|
-
klass = Class.new(ActiveRecord::Base)
|
|
33
|
-
Object.const_set("Cat", klass)
|
|
19
|
+
RSpec.configure do |config|
|
|
20
|
+
config.color_enabled = true
|
|
21
|
+
end
|
|
34
22
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
}
|
|
39
|
-
end
|
|
23
|
+
class Cat < ActiveRecord::Base
|
|
24
|
+
attr_protected :name
|
|
25
|
+
validates_presence_of :color
|
|
40
26
|
end
|
|
@@ -1,124 +1,148 @@
|
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
|
2
2
|
|
|
3
|
-
|
|
4
3
|
describe "Cat" do
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
context
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
4
|
+
let(:attributes) { {:name => "Smiles", :color => "gray", :age => 6} }
|
|
5
|
+
|
|
6
|
+
context "default rails initializer" do
|
|
7
|
+
let(:cat) { Cat.new(attributes) }
|
|
8
|
+
|
|
9
|
+
context 'baseline check' do
|
|
10
|
+
subject { cat }
|
|
11
|
+
its(:name) { should be_nil }
|
|
12
|
+
its(:color) { should eql('gray') }
|
|
13
|
+
its(:age) { should eql(6) }
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it "should not set the name with update_attributes" do
|
|
17
|
+
cat.update_attributes(:name => "Smiles")
|
|
18
|
+
cat.name.should be_nil
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it "should set the name with sudo_update_attributes" do
|
|
22
|
+
cat.sudo_update_attributes(:name => "Smiles")
|
|
23
|
+
cat.name.should == "Smiles"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it "should not raise an error with sudo_update_attributes" do
|
|
27
|
+
lambda { cat.sudo_update_attributes(:color => "") }.should_not raise_error(ActiveRecord::RecordInvalid)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it "should set the name with sudo_update_attributes!" do
|
|
31
|
+
cat.sudo_update_attributes!(:name => "Smiles")
|
|
32
|
+
cat.name.should == "Smiles"
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it "should raise an error with sudo_update_attributes!" do
|
|
36
|
+
lambda { cat.sudo_update_attributes!(:color => "") }.should raise_error(ActiveRecord::RecordInvalid)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Tests for sudo_new and sudo_build, aliases of each other
|
|
41
|
+
[:sudo_new, :sudo_build].each do |sudo_method|
|
|
42
|
+
|
|
43
|
+
context "#{sudo_method} initializer" do
|
|
44
|
+
let(:cat) { Cat.send(sudo_method, attributes) }
|
|
15
45
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
it "should not set the name with update_attributes" do
|
|
26
|
-
@cat.update_attributes(:name => "Smiles")
|
|
27
|
-
@cat.name.should be_nil
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
it "should set the name with sudo_update_attributes" do
|
|
31
|
-
@cat.sudo_update_attributes(:name => "Smiles")
|
|
32
|
-
@cat.name.should == "Smiles"
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
it "should not raise an error with sudo_update_attributes" do
|
|
36
|
-
lambda { @cat.sudo_update_attributes(:color => "") }.should_not raise_error(ActiveRecord::RecordInvalid)
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
it "should set the name with sudo_update_attributes!" do
|
|
40
|
-
@cat.sudo_update_attributes!(:name => "Smiles")
|
|
41
|
-
@cat.name.should == "Smiles"
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
it "should raise an error with sudo_update_attributes!" do
|
|
45
|
-
lambda { @cat.sudo_update_attributes!(:color => "") }.should raise_error(ActiveRecord::RecordInvalid)
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
it "should have a color" do
|
|
49
|
-
@cat.color.should == @attributes[:color]
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
it "should have an age" do
|
|
53
|
-
@cat.age.should == @attributes[:age]
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
# Tests for sudo_new and sudo_build, aliases of each other
|
|
59
|
-
[:sudo_new, :sudo_build].each do |sudo_method|
|
|
60
|
-
|
|
61
|
-
context "SudoAttributes #{sudo_method} initializer" do
|
|
62
|
-
before(:each) { @cat = Cat.send(sudo_method, @attributes)}
|
|
63
|
-
|
|
64
|
-
it "should have a name" do
|
|
65
|
-
@cat.name.should == @attributes[:name]
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
it "should set the name with sudo_update_attributes" do
|
|
69
|
-
@cat.sudo_update_attributes(:name => "Portia")
|
|
70
|
-
@cat.name.should == "Portia"
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
it "should have a color" do
|
|
74
|
-
@cat.color.should == @attributes[:color]
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
it "should not have an id" do
|
|
78
|
-
@cat.id.should be_nil
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
it "should have an age" do
|
|
82
|
-
@cat.age.should == @attributes[:age]
|
|
83
|
-
end
|
|
84
|
-
end
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
context "SudoAttributes sudo_create initializer" do
|
|
88
|
-
before(:each) { @cat = Cat.sudo_create @attributes}
|
|
89
|
-
|
|
90
|
-
it "should have a name" do
|
|
91
|
-
@cat.name.should == @attributes[:name]
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
it "should set the name with sudo_update_attributes" do
|
|
95
|
-
@cat.sudo_update_attributes(:name => "Portia")
|
|
96
|
-
@cat.name.should == "Portia"
|
|
97
|
-
end
|
|
98
|
-
|
|
99
|
-
it "should have a color" do
|
|
100
|
-
@cat.color.should == @attributes[:color]
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
it "should have an id" do
|
|
104
|
-
@cat.id.should_not be_nil
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
it "should have an age" do
|
|
108
|
-
@cat.age.should == @attributes[:age]
|
|
109
|
-
end
|
|
110
|
-
end
|
|
46
|
+
subject { cat }
|
|
47
|
+
its(:name) { should eql('Smiles') }
|
|
48
|
+
its(:color) { should eql('gray') }
|
|
49
|
+
its(:id) { should be_nil }
|
|
50
|
+
its(:age) { should eql(6) }
|
|
51
|
+
|
|
52
|
+
it "should set the name with sudo_update_attributes" do
|
|
53
|
+
cat.sudo_update_attributes(:name => "Portia")
|
|
54
|
+
cat.name.should == "Portia"
|
|
111
55
|
end
|
|
56
|
+
|
|
112
57
|
end
|
|
113
58
|
end
|
|
114
|
-
end
|
|
115
59
|
|
|
116
|
-
|
|
60
|
+
context "sudo_create initializer for single object" do
|
|
61
|
+
let(:cat) { Cat.sudo_create(attributes) }
|
|
117
62
|
|
|
118
|
-
|
|
119
|
-
|
|
63
|
+
subject { cat }
|
|
64
|
+
its(:name) { should eql('Smiles') }
|
|
65
|
+
its(:color) { should eql('gray') }
|
|
66
|
+
its(:id) { should_not be_nil }
|
|
67
|
+
its(:age) { should eql(6) }
|
|
120
68
|
end
|
|
121
69
|
|
|
70
|
+
context "sudo_create initializer w/block for single object" do
|
|
71
|
+
let(:cat) { Cat.sudo_create(attributes) {|u| u.color = 'white' } }
|
|
72
|
+
|
|
73
|
+
subject { cat }
|
|
74
|
+
its(:name) { should eql('Smiles') }
|
|
75
|
+
its(:color) { should eql('white') }
|
|
76
|
+
its(:id) { should_not be_nil }
|
|
77
|
+
its(:age) { should eql(6) }
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
context "sudo_create initializer for multiple objects" do
|
|
81
|
+
let(:attributes2) { {:name => "Portia", :color => "black", :age => 4} }
|
|
82
|
+
let(:cats) { Cat.sudo_create([attributes, attributes2]) }
|
|
83
|
+
|
|
84
|
+
context 'first object' do
|
|
85
|
+
subject { cats[0] }
|
|
86
|
+
its(:name) { should eql('Smiles') }
|
|
87
|
+
its(:color) { should eql('gray') }
|
|
88
|
+
its(:id) { should_not be_nil }
|
|
89
|
+
its(:age) { should eql(6) }
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
context 'second object' do
|
|
93
|
+
subject { cats[1] }
|
|
94
|
+
its(:name) { should eql('Portia') }
|
|
95
|
+
its(:color) { should eql('black') }
|
|
96
|
+
its(:id) { should_not be_nil }
|
|
97
|
+
its(:age) { should eql(4) }
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
context "sudo_create! initializer for single object" do
|
|
102
|
+
let(:cat) { Cat.sudo_create!(attributes) }
|
|
103
|
+
|
|
104
|
+
subject { cat }
|
|
105
|
+
its(:name) { should eql('Smiles') }
|
|
106
|
+
its(:color) { should eql('gray') }
|
|
107
|
+
its(:id) { should_not be_nil }
|
|
108
|
+
its(:age) { should eql(6) }
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
context "sudo_create! initializer w/block for single object" do
|
|
112
|
+
let(:cat) { Cat.sudo_create!(attributes) {|u| u.color = 'white' } }
|
|
113
|
+
|
|
114
|
+
subject { cat }
|
|
115
|
+
its(:name) { should eql('Smiles') }
|
|
116
|
+
its(:color) { should eql('white') }
|
|
117
|
+
its(:id) { should_not be_nil }
|
|
118
|
+
its(:age) { should eql(6) }
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
context "sudo_create! initializer for multiple objects" do
|
|
122
|
+
let(:attributes2) { {:name => "Portia", :color => "black", :age => 4} }
|
|
123
|
+
let(:cats) { Cat.sudo_create!([attributes, attributes2]) }
|
|
124
|
+
|
|
125
|
+
context 'first object' do
|
|
126
|
+
subject { cats[0] }
|
|
127
|
+
its(:name) { should eql('Smiles') }
|
|
128
|
+
its(:color) { should eql('gray') }
|
|
129
|
+
its(:id) { should_not be_nil }
|
|
130
|
+
its(:age) { should eql(6) }
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
context 'second object' do
|
|
134
|
+
subject { cats[1] }
|
|
135
|
+
its(:name) { should eql('Portia') }
|
|
136
|
+
its(:color) { should eql('black') }
|
|
137
|
+
its(:id) { should_not be_nil }
|
|
138
|
+
its(:age) { should eql(4) }
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
describe "A Cat" do
|
|
145
|
+
|
|
122
146
|
context "when initialized with invalid params using sudo_create!" do
|
|
123
147
|
|
|
124
148
|
it "should raise an ActiveRecord exception" do
|
|
@@ -142,8 +166,8 @@ describe "A Cat" do
|
|
|
142
166
|
end
|
|
143
167
|
|
|
144
168
|
it "should have a name" do
|
|
145
|
-
|
|
146
|
-
|
|
169
|
+
cat = Cat.sudo_create! :name => "Smiles", :color => "gray", :age => 12
|
|
170
|
+
cat.name.should == "Smiles"
|
|
147
171
|
end
|
|
148
172
|
end
|
|
149
173
|
end
|
data/sudo_attributes.gemspec
CHANGED
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
|
|
6
6
|
Gem::Specification.new do |s|
|
|
7
7
|
s.name = %q{sudo_attributes}
|
|
8
|
-
s.version = "0.
|
|
8
|
+
s.version = "1.0.1"
|
|
9
9
|
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
|
11
|
-
s.authors = [
|
|
12
|
-
s.date = %q{2011-
|
|
11
|
+
s.authors = [%q{Peter Brown}]
|
|
12
|
+
s.date = %q{2011-09-06}
|
|
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 = [
|
|
@@ -18,6 +18,7 @@ Gem::Specification.new do |s|
|
|
|
18
18
|
]
|
|
19
19
|
s.files = [
|
|
20
20
|
".document",
|
|
21
|
+
".travis.yml",
|
|
21
22
|
"Gemfile",
|
|
22
23
|
"Gemfile.lock",
|
|
23
24
|
"LICENSE",
|
|
@@ -32,33 +33,21 @@ Gem::Specification.new do |s|
|
|
|
32
33
|
"sudo_attributes.gemspec"
|
|
33
34
|
]
|
|
34
35
|
s.homepage = %q{http://github.com/beerlington/sudo_attributes}
|
|
35
|
-
s.
|
|
36
|
-
s.
|
|
36
|
+
s.licenses = [%q{MIT}]
|
|
37
|
+
s.require_paths = [%q{lib}]
|
|
38
|
+
s.rubygems_version = %q{1.8.6}
|
|
37
39
|
s.summary = %q{Override ActiveRecord protected attributes with mass assignment}
|
|
38
|
-
s.test_files = [
|
|
39
|
-
"spec/spec_helper.rb",
|
|
40
|
-
"spec/sudo_attributes_spec.rb"
|
|
41
|
-
]
|
|
42
40
|
|
|
43
41
|
if s.respond_to? :specification_version then
|
|
44
42
|
s.specification_version = 3
|
|
45
43
|
|
|
46
44
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
|
47
|
-
s.
|
|
48
|
-
s.add_development_dependency(%q<rails>, ["~> 3.0.0"])
|
|
49
|
-
s.add_development_dependency(%q<sqlite3-ruby>, [">= 0"])
|
|
50
|
-
s.add_runtime_dependency(%q<rails>, [">= 2.3.0"])
|
|
45
|
+
s.add_runtime_dependency(%q<rails>, [">= 0"])
|
|
51
46
|
else
|
|
52
|
-
s.add_dependency(%q<
|
|
53
|
-
s.add_dependency(%q<rails>, ["~> 3.0.0"])
|
|
54
|
-
s.add_dependency(%q<sqlite3-ruby>, [">= 0"])
|
|
55
|
-
s.add_dependency(%q<rails>, [">= 2.3.0"])
|
|
47
|
+
s.add_dependency(%q<rails>, [">= 0"])
|
|
56
48
|
end
|
|
57
49
|
else
|
|
58
|
-
s.add_dependency(%q<
|
|
59
|
-
s.add_dependency(%q<rails>, ["~> 3.0.0"])
|
|
60
|
-
s.add_dependency(%q<sqlite3-ruby>, [">= 0"])
|
|
61
|
-
s.add_dependency(%q<rails>, [">= 2.3.0"])
|
|
50
|
+
s.add_dependency(%q<rails>, [">= 0"])
|
|
62
51
|
end
|
|
63
52
|
end
|
|
64
53
|
|
metadata
CHANGED
|
@@ -1,96 +1,38 @@
|
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: sudo_attributes
|
|
3
|
-
version: !ruby/object:Gem::Version
|
|
4
|
-
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 1.0.1
|
|
5
5
|
prerelease:
|
|
6
|
-
segments:
|
|
7
|
-
- 0
|
|
8
|
-
- 5
|
|
9
|
-
- 2
|
|
10
|
-
version: 0.5.2
|
|
11
6
|
platform: ruby
|
|
12
|
-
authors:
|
|
7
|
+
authors:
|
|
13
8
|
- Peter Brown
|
|
14
9
|
autorequire:
|
|
15
10
|
bindir: bin
|
|
16
11
|
cert_chain: []
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
dependencies:
|
|
21
|
-
- !ruby/object:Gem::Dependency
|
|
22
|
-
type: :development
|
|
23
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
|
24
|
-
none: false
|
|
25
|
-
requirements:
|
|
26
|
-
- - ~>
|
|
27
|
-
- !ruby/object:Gem::Version
|
|
28
|
-
hash: 15
|
|
29
|
-
segments:
|
|
30
|
-
- 2
|
|
31
|
-
- 0
|
|
32
|
-
- 0
|
|
33
|
-
version: 2.0.0
|
|
34
|
-
name: rspec
|
|
35
|
-
version_requirements: *id001
|
|
36
|
-
prerelease: false
|
|
37
|
-
- !ruby/object:Gem::Dependency
|
|
38
|
-
type: :development
|
|
39
|
-
requirement: &id002 !ruby/object:Gem::Requirement
|
|
40
|
-
none: false
|
|
41
|
-
requirements:
|
|
42
|
-
- - ~>
|
|
43
|
-
- !ruby/object:Gem::Version
|
|
44
|
-
hash: 7
|
|
45
|
-
segments:
|
|
46
|
-
- 3
|
|
47
|
-
- 0
|
|
48
|
-
- 0
|
|
49
|
-
version: 3.0.0
|
|
12
|
+
date: 2011-09-06 00:00:00.000000000Z
|
|
13
|
+
dependencies:
|
|
14
|
+
- !ruby/object:Gem::Dependency
|
|
50
15
|
name: rails
|
|
51
|
-
|
|
52
|
-
prerelease: false
|
|
53
|
-
- !ruby/object:Gem::Dependency
|
|
54
|
-
type: :development
|
|
55
|
-
requirement: &id003 !ruby/object:Gem::Requirement
|
|
16
|
+
requirement: &70236626225500 !ruby/object:Gem::Requirement
|
|
56
17
|
none: false
|
|
57
|
-
requirements:
|
|
58
|
-
- -
|
|
59
|
-
- !ruby/object:Gem::Version
|
|
60
|
-
|
|
61
|
-
segments:
|
|
62
|
-
- 0
|
|
63
|
-
version: "0"
|
|
64
|
-
name: sqlite3-ruby
|
|
65
|
-
version_requirements: *id003
|
|
66
|
-
prerelease: false
|
|
67
|
-
- !ruby/object:Gem::Dependency
|
|
18
|
+
requirements:
|
|
19
|
+
- - ! '>='
|
|
20
|
+
- !ruby/object:Gem::Version
|
|
21
|
+
version: '0'
|
|
68
22
|
type: :runtime
|
|
69
|
-
requirement: &id004 !ruby/object:Gem::Requirement
|
|
70
|
-
none: false
|
|
71
|
-
requirements:
|
|
72
|
-
- - ">="
|
|
73
|
-
- !ruby/object:Gem::Version
|
|
74
|
-
hash: 3
|
|
75
|
-
segments:
|
|
76
|
-
- 2
|
|
77
|
-
- 3
|
|
78
|
-
- 0
|
|
79
|
-
version: 2.3.0
|
|
80
|
-
name: rails
|
|
81
|
-
version_requirements: *id004
|
|
82
23
|
prerelease: false
|
|
83
|
-
|
|
24
|
+
version_requirements: *70236626225500
|
|
25
|
+
description: Adds 'sudo' methods to update protected ActiveRecord attributes with
|
|
26
|
+
mass assignment
|
|
84
27
|
email: github@lette.us
|
|
85
28
|
executables: []
|
|
86
|
-
|
|
87
29
|
extensions: []
|
|
88
|
-
|
|
89
|
-
extra_rdoc_files:
|
|
30
|
+
extra_rdoc_files:
|
|
90
31
|
- LICENSE
|
|
91
32
|
- README.textile
|
|
92
|
-
files:
|
|
33
|
+
files:
|
|
93
34
|
- .document
|
|
35
|
+
- .travis.yml
|
|
94
36
|
- Gemfile
|
|
95
37
|
- Gemfile.lock
|
|
96
38
|
- LICENSE
|
|
@@ -103,40 +45,32 @@ files:
|
|
|
103
45
|
- spec/spec_helper.rb
|
|
104
46
|
- spec/sudo_attributes_spec.rb
|
|
105
47
|
- sudo_attributes.gemspec
|
|
106
|
-
has_rdoc: true
|
|
107
48
|
homepage: http://github.com/beerlington/sudo_attributes
|
|
108
|
-
licenses:
|
|
109
|
-
|
|
49
|
+
licenses:
|
|
50
|
+
- MIT
|
|
110
51
|
post_install_message:
|
|
111
52
|
rdoc_options: []
|
|
112
|
-
|
|
113
|
-
require_paths:
|
|
53
|
+
require_paths:
|
|
114
54
|
- lib
|
|
115
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
|
55
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
116
56
|
none: false
|
|
117
|
-
requirements:
|
|
118
|
-
- -
|
|
119
|
-
- !ruby/object:Gem::Version
|
|
120
|
-
|
|
121
|
-
segments:
|
|
57
|
+
requirements:
|
|
58
|
+
- - ! '>='
|
|
59
|
+
- !ruby/object:Gem::Version
|
|
60
|
+
version: '0'
|
|
61
|
+
segments:
|
|
122
62
|
- 0
|
|
123
|
-
|
|
124
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
63
|
+
hash: 1087971882480331192
|
|
64
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
125
65
|
none: false
|
|
126
|
-
requirements:
|
|
127
|
-
- -
|
|
128
|
-
- !ruby/object:Gem::Version
|
|
129
|
-
|
|
130
|
-
segments:
|
|
131
|
-
- 0
|
|
132
|
-
version: "0"
|
|
66
|
+
requirements:
|
|
67
|
+
- - ! '>='
|
|
68
|
+
- !ruby/object:Gem::Version
|
|
69
|
+
version: '0'
|
|
133
70
|
requirements: []
|
|
134
|
-
|
|
135
71
|
rubyforge_project:
|
|
136
|
-
rubygems_version: 1.
|
|
72
|
+
rubygems_version: 1.8.6
|
|
137
73
|
signing_key:
|
|
138
74
|
specification_version: 3
|
|
139
75
|
summary: Override ActiveRecord protected attributes with mass assignment
|
|
140
|
-
test_files:
|
|
141
|
-
- spec/spec_helper.rb
|
|
142
|
-
- spec/sudo_attributes_spec.rb
|
|
76
|
+
test_files: []
|