vex 0.2

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.
Files changed (114) hide show
  1. data/Manifest +112 -0
  2. data/Rakefile +53 -0
  3. data/VERSION +1 -0
  4. data/config/README +2 -0
  5. data/config/dependencies.rb +10 -0
  6. data/config/gem.yml +7 -0
  7. data/init.rb +36 -0
  8. data/lib/nokogiri/nokogiri_ext.rb +96 -0
  9. data/lib/vex.rb +5 -0
  10. data/lib/vex/action_controller.rb +4 -0
  11. data/lib/vex/action_controller/verify_action.rb +97 -0
  12. data/lib/vex/action_controller/whitelisted_actions.rb +45 -0
  13. data/lib/vex/active_record.rb +3 -0
  14. data/lib/vex/active_record/__init__.rb +0 -0
  15. data/lib/vex/active_record/advisory_lock.rb +11 -0
  16. data/lib/vex/active_record/advisory_lock/mysql_adapter.rb +16 -0
  17. data/lib/vex/active_record/advisory_lock/sqlite_adapter.rb +78 -0
  18. data/lib/vex/active_record/belongs_to_many.rb +143 -0
  19. data/lib/vex/active_record/find_by_extension.rb +70 -0
  20. data/lib/vex/active_record/gem.rb +8 -0
  21. data/lib/vex/active_record/lite_table.rb +139 -0
  22. data/lib/vex/active_record/lite_view.rb +140 -0
  23. data/lib/vex/active_record/mass_load.rb +65 -0
  24. data/lib/vex/active_record/mysql_backup.rb +21 -0
  25. data/lib/vex/active_record/plugins/default_value_for/LICENSE.TXT +19 -0
  26. data/lib/vex/active_record/plugins/default_value_for/README.rdoc +421 -0
  27. data/lib/vex/active_record/plugins/default_value_for/Rakefile +6 -0
  28. data/lib/vex/active_record/plugins/default_value_for/init.rb +91 -0
  29. data/lib/vex/active_record/plugins/default_value_for/test.rb +279 -0
  30. data/lib/vex/active_record/plugins/default_value_for/test.sqlite3 +0 -0
  31. data/lib/vex/active_record/random_id.rb +56 -0
  32. data/lib/vex/active_record/resolver.rb +49 -0
  33. data/lib/vex/active_record/serialize_hash.rb +125 -0
  34. data/lib/vex/active_record/to_html.rb +53 -0
  35. data/lib/vex/active_record/validate.rb +76 -0
  36. data/lib/vex/active_record/validation_error_ext.rb +68 -0
  37. data/lib/vex/base.rb +2 -0
  38. data/lib/vex/base/app.rb +75 -0
  39. data/lib/vex/base/array/at_random.rb +17 -0
  40. data/lib/vex/base/array/cross.rb +26 -0
  41. data/lib/vex/base/array/each_batch.rb +32 -0
  42. data/lib/vex/base/array/parallel_map.rb +98 -0
  43. data/lib/vex/base/deprecation.rb +41 -0
  44. data/lib/vex/base/enumerable/deep.rb +95 -0
  45. data/lib/vex/base/enumerable/enumerable_ext.rb +59 -0
  46. data/lib/vex/base/enumerable/progress.rb +71 -0
  47. data/lib/vex/base/filesystem/fast_copy.rb +61 -0
  48. data/lib/vex/base/filesystem/grep.rb +34 -0
  49. data/lib/vex/base/filesystem/lock.rb +43 -0
  50. data/lib/vex/base/filesystem/lock.rb.test.lck +0 -0
  51. data/lib/vex/base/filesystem/lock.rb.test.pid +1 -0
  52. data/lib/vex/base/filesystem/make_dirs.rb +94 -0
  53. data/lib/vex/base/filesystem/parse_filename.rb +36 -0
  54. data/lib/vex/base/filesystem/tmp_file.rb +87 -0
  55. data/lib/vex/base/filesystem/write.rb +43 -0
  56. data/lib/vex/base/hash/compact.rb +38 -0
  57. data/lib/vex/base/hash/cross.rb +117 -0
  58. data/lib/vex/base/hash/easy_access.rb +141 -0
  59. data/lib/vex/base/hash/ensure_keys.rb +18 -0
  60. data/lib/vex/base/hash/extract.rb +71 -0
  61. data/lib/vex/base/hash/extras.rb +62 -0
  62. data/lib/vex/base/hash/inspect.rb +17 -0
  63. data/lib/vex/base/hash/simple_access_methods.rb +74 -0
  64. data/lib/vex/base/invalid_argument/invalid_argument.rb +97 -0
  65. data/lib/vex/base/local_conf.rb +35 -0
  66. data/lib/vex/base/net/http_ext.rb +227 -0
  67. data/lib/vex/base/net/socket_ext.rb +43 -0
  68. data/lib/vex/base/object/insp.rb +123 -0
  69. data/lib/vex/base/object/multiple_attributes.rb +58 -0
  70. data/lib/vex/base/object/singleton_methods.rb +23 -0
  71. data/lib/vex/base/object/with_benchmark.rb +110 -0
  72. data/lib/vex/base/range_array.rb +40 -0
  73. data/lib/vex/base/range_ext.rb +28 -0
  74. data/lib/vex/base/safe_token.rb +156 -0
  75. data/lib/vex/base/string/string_ext.rb +136 -0
  76. data/lib/vex/base/thread/deferred.rb +52 -0
  77. data/lib/vex/base/thread/sleep.rb +11 -0
  78. data/lib/vex/base/time/date_ext.rb +12 -0
  79. data/lib/vex/boot.rb +40 -0
  80. data/lib/vex/boot/array.rb +22 -0
  81. data/lib/vex/boot/blank.rb +41 -0
  82. data/lib/vex/boot/string.rb +60 -0
  83. data/migration/create_request_log.rb +28 -0
  84. data/r.rb +35 -0
  85. data/script/console +19 -0
  86. data/script/rebuild +7 -0
  87. data/tasks/echoe.rake +52 -0
  88. data/tasks/validate_db.rake +14 -0
  89. data/test/ar.rb +30 -0
  90. data/test/auto.rb +31 -0
  91. data/test/base-tests/local_conf.rb +25 -0
  92. data/test/base.rb +2 -0
  93. data/test/boot.rb +3 -0
  94. data/test/config/local.defaults.yml +4 -0
  95. data/test/config/local.yml +8 -0
  96. data/test/test.sqlite3 +0 -0
  97. data/test/test.sqlite3.Class#create.lck +0 -0
  98. data/test/test.sqlite3.Class#create.lck.lck +0 -0
  99. data/test/test.sqlite3.Class#create.lck.pid +1 -0
  100. data/test/test.sqlite3.Class#create.pid +1 -0
  101. data/test/test.sqlite3.LiteView.make.holders__view_dummy.lck +0 -0
  102. data/test/test.sqlite3.LiteView.make.holders__view_dummy.lck.lck +0 -0
  103. data/test/test.sqlite3.LiteView.make.holders__view_dummy.lck.pid +1 -0
  104. data/test/test.sqlite3.LiteView.make.holders__view_dummy.pid +1 -0
  105. data/test/test.sqlite3.vex.lck +0 -0
  106. data/test/test_helper.rb +49 -0
  107. data/test/tmp/copy.dat +1 -0
  108. data/test/tmp/lock.sqlite3 +0 -0
  109. data/test/tmp/lock.sqlite3.etest.lck +0 -0
  110. data/test/tmp/lock.sqlite3.etest.pid +1 -0
  111. data/test/tmp/somedata.dat +61 -0
  112. data/vex.gemspec +49 -0
  113. data/vex.tmproj +186 -0
  114. metadata +305 -0
data/Manifest ADDED
@@ -0,0 +1,112 @@
1
+ Manifest
2
+ Rakefile
3
+ VERSION
4
+ config/README
5
+ config/dependencies.rb
6
+ config/gem.yml
7
+ init.rb
8
+ lib/nokogiri/nokogiri_ext.rb
9
+ lib/vex.rb
10
+ lib/vex/action_controller.rb
11
+ lib/vex/action_controller/verify_action.rb
12
+ lib/vex/action_controller/whitelisted_actions.rb
13
+ lib/vex/active_record.rb
14
+ lib/vex/active_record/__init__.rb
15
+ lib/vex/active_record/advisory_lock.rb
16
+ lib/vex/active_record/advisory_lock/mysql_adapter.rb
17
+ lib/vex/active_record/advisory_lock/sqlite_adapter.rb
18
+ lib/vex/active_record/belongs_to_many.rb
19
+ lib/vex/active_record/find_by_extension.rb
20
+ lib/vex/active_record/gem.rb
21
+ lib/vex/active_record/lite_table.rb
22
+ lib/vex/active_record/lite_view.rb
23
+ lib/vex/active_record/mass_load.rb
24
+ lib/vex/active_record/mysql_backup.rb
25
+ lib/vex/active_record/plugins/default_value_for/LICENSE.TXT
26
+ lib/vex/active_record/plugins/default_value_for/README.rdoc
27
+ lib/vex/active_record/plugins/default_value_for/Rakefile
28
+ lib/vex/active_record/plugins/default_value_for/init.rb
29
+ lib/vex/active_record/plugins/default_value_for/test.rb
30
+ lib/vex/active_record/plugins/default_value_for/test.sqlite3
31
+ lib/vex/active_record/random_id.rb
32
+ lib/vex/active_record/resolver.rb
33
+ lib/vex/active_record/serialize_hash.rb
34
+ lib/vex/active_record/to_html.rb
35
+ lib/vex/active_record/validate.rb
36
+ lib/vex/active_record/validation_error_ext.rb
37
+ lib/vex/base.rb
38
+ lib/vex/base/app.rb
39
+ lib/vex/base/array/at_random.rb
40
+ lib/vex/base/array/cross.rb
41
+ lib/vex/base/array/each_batch.rb
42
+ lib/vex/base/array/parallel_map.rb
43
+ lib/vex/base/deprecation.rb
44
+ lib/vex/base/enumerable/deep.rb
45
+ lib/vex/base/enumerable/enumerable_ext.rb
46
+ lib/vex/base/enumerable/progress.rb
47
+ lib/vex/base/filesystem/fast_copy.rb
48
+ lib/vex/base/filesystem/grep.rb
49
+ lib/vex/base/filesystem/lock.rb
50
+ lib/vex/base/filesystem/lock.rb.test.lck
51
+ lib/vex/base/filesystem/lock.rb.test.pid
52
+ lib/vex/base/filesystem/make_dirs.rb
53
+ lib/vex/base/filesystem/parse_filename.rb
54
+ lib/vex/base/filesystem/tmp_file.rb
55
+ lib/vex/base/filesystem/write.rb
56
+ lib/vex/base/hash/compact.rb
57
+ lib/vex/base/hash/cross.rb
58
+ lib/vex/base/hash/easy_access.rb
59
+ lib/vex/base/hash/ensure_keys.rb
60
+ lib/vex/base/hash/extract.rb
61
+ lib/vex/base/hash/extras.rb
62
+ lib/vex/base/hash/inspect.rb
63
+ lib/vex/base/hash/simple_access_methods.rb
64
+ lib/vex/base/invalid_argument/invalid_argument.rb
65
+ lib/vex/base/local_conf.rb
66
+ lib/vex/base/net/http_ext.rb
67
+ lib/vex/base/net/socket_ext.rb
68
+ lib/vex/base/object/insp.rb
69
+ lib/vex/base/object/multiple_attributes.rb
70
+ lib/vex/base/object/singleton_methods.rb
71
+ lib/vex/base/object/with_benchmark.rb
72
+ lib/vex/base/range_array.rb
73
+ lib/vex/base/range_ext.rb
74
+ lib/vex/base/safe_token.rb
75
+ lib/vex/base/string/string_ext.rb
76
+ lib/vex/base/thread/deferred.rb
77
+ lib/vex/base/thread/sleep.rb
78
+ lib/vex/base/time/date_ext.rb
79
+ lib/vex/boot.rb
80
+ lib/vex/boot/array.rb
81
+ lib/vex/boot/blank.rb
82
+ lib/vex/boot/string.rb
83
+ migration/create_request_log.rb
84
+ r.rb
85
+ script/console
86
+ script/rebuild
87
+ tasks/echoe.rake
88
+ tasks/validate_db.rake
89
+ test/ar.rb
90
+ test/auto.rb
91
+ test/base-tests/local_conf.rb
92
+ test/base.rb
93
+ test/boot.rb
94
+ test/config/local.defaults.yml
95
+ test/config/local.yml
96
+ test/test.sqlite3
97
+ test/test.sqlite3.Class#create.lck
98
+ test/test.sqlite3.Class#create.lck.lck
99
+ test/test.sqlite3.Class#create.lck.pid
100
+ test/test.sqlite3.Class#create.pid
101
+ test/test.sqlite3.LiteView.make.holders__view_dummy.lck
102
+ test/test.sqlite3.LiteView.make.holders__view_dummy.lck.lck
103
+ test/test.sqlite3.LiteView.make.holders__view_dummy.lck.pid
104
+ test/test.sqlite3.LiteView.make.holders__view_dummy.pid
105
+ test/test.sqlite3.vex.lck
106
+ test/test_helper.rb
107
+ test/tmp/copy.dat
108
+ test/tmp/lock.sqlite3
109
+ test/tmp/lock.sqlite3.etest.lck
110
+ test/tmp/lock.sqlite3.etest.pid
111
+ test/tmp/somedata.dat
112
+ vex.tmproj
data/Rakefile ADDED
@@ -0,0 +1,53 @@
1
+ task :default => :"test:all"
2
+ task :test => :"test:all"
3
+ task :rcov => :"rcov:all"
4
+
5
+ namespace :test do
6
+ task :boot do
7
+ sh "ruby test/boot.rb"
8
+ end
9
+
10
+ task :base do
11
+ sh "ruby test/base.rb"
12
+ end
13
+
14
+ task :ar do
15
+ sh "ruby test/ar.rb"
16
+ end
17
+
18
+ task :auto do
19
+ sh "ruby test/auto.rb"
20
+ end
21
+
22
+ task :all => %w(boot base ar)
23
+ end
24
+
25
+ namespace :rcov do
26
+ task :boot do
27
+ sh "rcov -T -o coverage/boot -x ruby/.*/gems test/boot.rb"
28
+ end
29
+
30
+ task :base do
31
+ sh "rcov -T -o coverage/base -x /vex/boot/ -x ruby/.*/gems test/base.rb"
32
+ end
33
+
34
+ task :ar do
35
+ sh "rcov -T -o coverage/ar -x /vex/boot/ -x /plugins/ -x /vex/base/ -x ruby/.*/gems test/ar.rb"
36
+ end
37
+
38
+ task :all => %w(boot base)
39
+ end
40
+
41
+ task :rebuild => :test do
42
+ sh "rake -f tasks/echoe.rake rebuild"
43
+ end
44
+
45
+ task :manifest do
46
+ sh "rake -f tasks/echoe.rake manifest"
47
+ end
48
+
49
+ SKIP_ECHOE=true
50
+
51
+ Dir["#{File.dirname(__FILE__)}/tasks/*.rake"].sort.each do |ext|
52
+ load ext
53
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.2
data/config/README ADDED
@@ -0,0 +1,2 @@
1
+ #
2
+ # Ruby files in this directory will be loaded during loading "vex/base"
@@ -0,0 +1,10 @@
1
+ #
2
+ # require all dependent gems
3
+ require 'nokogiri'
4
+ require 'openssl'
5
+
6
+ require 'etest'
7
+ require 'sanitize'
8
+ require 'htmlentities'
9
+ require 'json'
10
+
data/config/gem.yml ADDED
@@ -0,0 +1,7 @@
1
+ description: "Vex: some ruby extensions"
2
+ url: http://github.com/pboy/vex
3
+ author: pboy
4
+ email: eno-pboy@open-lab.org
5
+ ignore_pattern:
6
+ - "tmp/*"
7
+ - "**/.*"
data/init.rb ADDED
@@ -0,0 +1,36 @@
1
+ #
2
+ # The initializer for the gem. Runs whenever the gem is loaded.
3
+ #
4
+ # DON'T CHANGE THIS FILE, CHANGE config/gem.rb INSTEAD!
5
+ #
6
+
7
+ __END__
8
+
9
+ gem_root = File.expand_path(File.dirname(__FILE__))
10
+ gem_name = File.basename gem_root
11
+
12
+ require "rubygems"
13
+
14
+ load "#{gem_root}/config/gem.rb"
15
+ load "#{gem_root}/config/dependencies.rb"
16
+ load "#{gem_root}/lib/#{gem_name}.rb"
17
+
18
+ dirs = Dir.glob("#{gem_root}/lib/*").select do |dir|
19
+ File.directory?(dir)
20
+ end.sort_by do |dir|
21
+ dir.ends_with?("boot") ? "" : dir
22
+ end
23
+
24
+ dirs.each do |dir|
25
+ if File.exists?("#{dir}/__init__.rb")
26
+ load("#{dir}/__init__.rb")
27
+ else
28
+ Dir.glob("#{dir}/*.rb").sort.each do |file|
29
+ load file
30
+ end
31
+ end
32
+ end
33
+
34
+ Dir.glob("#{gem_root}/lib/*.rb").sort.each do |file|
35
+ load file
36
+ end
@@ -0,0 +1,96 @@
1
+ module NokogiriExt
2
+ def full_name
3
+ ns = namespace
4
+ ns ? "#{ns}:#{name}" : name
5
+ end
6
+
7
+ def transform(&block)
8
+ case r = yield(self)
9
+ when false
10
+ self.remove
11
+ when String
12
+ Nokogiri::HTML.fragment(r).children.each do |n|
13
+ add_previous_sibling n
14
+ end
15
+
16
+ self.remove
17
+ when Nokogiri::XML::Node
18
+ add_previous_sibling r
19
+ self.remove
20
+ else
21
+ children.each do |child| child.transform(&block) end
22
+ end
23
+ end
24
+
25
+ def remove_blanks
26
+ transform do |n|
27
+ n.name != "text" || !n.text.blank?
28
+ end
29
+ end
30
+ end
31
+
32
+ class Nokogiri::XML::Node
33
+ include NokogiriExt
34
+ end
35
+
36
+ class Nokogiri::XML::Document
37
+ private :transform
38
+ end
39
+
40
+ module NokogiriExt::Etest
41
+ SOURCE = <<-XML
42
+ <bb>
43
+ <i:xy></i:xy>
44
+ </bb>
45
+ XML
46
+
47
+ def assert_xml_equals(expected, actual)
48
+ expected = Nokogiri::XML(expected)
49
+
50
+ if expected == actual
51
+ assert true
52
+ return
53
+ end
54
+
55
+ expected = expected.remove_blanks
56
+ actual = actual.remove_blanks
57
+
58
+ if expected == actual
59
+ assert true
60
+ return
61
+ end
62
+
63
+ expected = expected.to_s.gsub(/<\?xml version=\"1.0\"\?>\n/, "")
64
+ actual = actual.to_s.gsub(/<\?xml version=\"1.0\"\?>\n/, "")
65
+
66
+ assert_equal expected, actual
67
+ end
68
+
69
+ def test_assertion
70
+ doc = Nokogiri::XML SOURCE
71
+ assert_xml_equals SOURCE, doc
72
+ end
73
+
74
+ def test_transform
75
+ doc = Nokogiri::XML SOURCE
76
+ doc.root.transform do |s| "<cc />" end
77
+ assert_xml_equals "<cc/>", doc
78
+
79
+ doc = Nokogiri::XML SOURCE
80
+ doc.root.transform do |s| s.name != "xy" end
81
+ assert_xml_equals "<bb/>", doc
82
+ end
83
+
84
+ def test_transform2
85
+ doc = Nokogiri::XML SOURCE
86
+ doc.root.transform do |s|
87
+ if s.name == "xy"
88
+ "<cc />"
89
+ elsif s.name == "text" && s.text.blank?
90
+ false
91
+ end
92
+ end
93
+
94
+ assert_xml_equals "<bb><cc/></bb>", doc
95
+ end
96
+ end
data/lib/vex.rb ADDED
@@ -0,0 +1,5 @@
1
+ require "#{File.dirname(__FILE__)}/vex/boot"
2
+ Vex.load_directory "base"
3
+
4
+ Vex.load_directory "active_record" if defined?(ActiveRecord)
5
+ Vex.load_directory "action_controller" if defined?(ActionController)
@@ -0,0 +1,4 @@
1
+ require "#{File.dirname(__FILE__)}/boot"
2
+ Vex.load_directory "base"
3
+ Vex.load_directory "action_controller"
4
+
@@ -0,0 +1,97 @@
1
+ # This module adds/modifies ActionController::Verification. It adds
2
+ #
3
+ # - adds verify? and verify, which verifies conditions on a per action
4
+ # base. On error the former returns false, while the latter raises
5
+ # an exception.
6
+ # - adds improved error messages
7
+ #
8
+ module ActionController::VerifyAction
9
+ class Error < ArgumentError; end
10
+
11
+ def self.fail(options, better_msg=nil)
12
+ msg = "Action verification failed: #{options.inspect}"
13
+ msg += " #{better_msg}" if better_msg
14
+
15
+ raise Error, "#{msg}."
16
+ end
17
+
18
+ private
19
+
20
+ def fail(*args)
21
+ ActionController::VerifyAction.fail(*args)
22
+ end
23
+
24
+ # Rails 2.3's verify_action method does NOT return a value. Instead it
25
+ # 'executes' the add_flash, add_headers, render, and/or redirect_to
26
+ # options. We raise an additional exception here for a failed verification,
27
+ # which is to be catched later on to return true or false.
28
+ #
29
+ def apply_remaining_actions(options) # :nodoc:
30
+ super
31
+ fail(options)
32
+ end
33
+
34
+ # Override Rails' verify_action
35
+ def verify_action(opts, catch_error = true)
36
+ begin
37
+ super(opts)
38
+ true
39
+ rescue Error
40
+ raise unless catch_error
41
+ false
42
+ end
43
+ end
44
+
45
+ def verify?(opts)
46
+ verify_action(opts, true)
47
+ end
48
+
49
+ def verify(opts)
50
+ verify_action(opts, false)
51
+ end
52
+
53
+ # -- Reimplements Rails' verifications to add better error messages
54
+
55
+ def verify_presence_of_keys_in_hash(options, entry, hash) # :nodoc:
56
+ return unless keys = options[entry]
57
+ missing = if keys.is_a?(Array)
58
+ keys.find { |v| hash[v].nil? }
59
+ elsif hash[keys].nil?
60
+ keys
61
+ end
62
+
63
+ return unless missing
64
+
65
+ fail(options, "Missing key #{missing.inspect} in #{entry}")
66
+ end
67
+
68
+ def verify_presence_of_keys_in_hash_flash_or_params(options) # :nodoc:
69
+ verify_presence_of_keys_in_hash(options, :params, params) ||
70
+ verify_presence_of_keys_in_hash(options, :session, session) ||
71
+ verify_presence_of_keys_in_hash(options, :flash, flash)
72
+ end
73
+
74
+ def verify_method(options) # :nodoc:
75
+ methods = options[:method]
76
+ return if methods.nil?
77
+
78
+ if methods.is_a?(Array)
79
+ return if methods.include?(request.method)
80
+ return if methods.include?(request.method.to_s)
81
+ else
82
+ return if request.method == methods.to_sym
83
+ end
84
+
85
+ fail(options, "Invalid request method #{request.method}")
86
+ end
87
+
88
+ def verify_request_xhr_status(options) # :nodoc:
89
+ return if options[:xhr].nil?
90
+ return if request.xhr? == options[:xhr]
91
+ fail(options, "Unsupported XHR state #{request.xhr?}")
92
+ end
93
+ end
94
+
95
+ class ActionController::Base
96
+ include VerifyAction
97
+ end
@@ -0,0 +1,45 @@
1
+ class ActionController::Base
2
+ def self.whitelist_actions(*names)
3
+ extend WhitelistActions
4
+ include WhitelistControllerActions
5
+
6
+ before_filter :verify_whitelisted_actions
7
+
8
+ actions *names
9
+ end
10
+
11
+ module WhitelistControllerActions
12
+ def verify_whitelisted_actions
13
+ return if self.class.name.starts_with?("Clearance::")
14
+
15
+ valid_actions = self.class.whitelisted_actions
16
+ return if valid_actions == :skip || valid_actions.include?(action_name)
17
+
18
+ unless Rails.env.development?
19
+ error 404, "This page doesn't exist"
20
+ return
21
+ end
22
+
23
+ error 404, <<-TEXT
24
+ No such action exists: #{controller_name}##{action_name}.
25
+ Note: this application uses the whitelisted_actions plugin,
26
+ you might have to use the 'actions' method to whitelist your actions.
27
+ TEXT
28
+ end
29
+ end
30
+
31
+ module WhitelistActions
32
+ def whitelisted_actions
33
+ @whitelisted_actions ||
34
+ (superclass.respond_to?(:whitelisted_actions) ? superclass.whitelisted_actions : nil)
35
+ end
36
+
37
+ def skip_whitelist_actions
38
+ @whitelisted_actions = :skip
39
+ end
40
+
41
+ def actions(*names)
42
+ @whitelisted_actions = names.map(&:to_s).to_set
43
+ end
44
+ end
45
+ end