dm-sanitizer 0.1.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/History.txt ADDED
@@ -0,0 +1,18 @@
1
+ == 0.1.1 2009-06-01
2
+
3
+ * 2 enhancements
4
+ * Change mode options syntax
5
+ * Raise errors on undefined sanitization mode assigning
6
+
7
+ * 1 bug fix
8
+ * Don't sanitize clean values in old records
9
+
10
+ == 0.0.2 2009-05-30
11
+
12
+ * 1 bug fix:
13
+ * Don't sanitize nil and empty properties
14
+
15
+ == 0.0.1 2009-05-29
16
+
17
+ * 1 major enhancement:
18
+ * Initial release
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 Sergei Zimakov
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ 'Software'), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
17
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
18
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
19
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
20
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Manifest.txt ADDED
@@ -0,0 +1,12 @@
1
+ History.txt
2
+ LICENSE
3
+ Manifest.txt
4
+ Rakefile
5
+ README.txt
6
+ TODO
7
+ lib/dm-sanitizer.rb
8
+ lib/dm-sanitizer/version.rb
9
+ spec/dm-sanitizer_spec.rb
10
+ spec/spec.opts
11
+ spec/spec_helper.rb
12
+ tasks/hoe.rb
data/README.txt ADDED
@@ -0,0 +1,98 @@
1
+ = dm-sanitizer
2
+
3
+ * http://github.com/pat/dm-sanitizer
4
+
5
+ == Description:
6
+
7
+ This package lets DataMapper properties be easily sanitized using Sanitize.
8
+
9
+ == Features and problems:
10
+
11
+ === Features
12
+
13
+ * Sanitize String based properties by default
14
+ * Lets choose sanitization mode on per property basis
15
+ * Allows user defined sanitization modes
16
+
17
+ === problems
18
+
19
+ * None known. Contact me if you find them.
20
+
21
+ == Synopsis:
22
+
23
+ require 'rubygems'
24
+ require 'dm-core'
25
+ require 'dm-sanitizer'
26
+
27
+ DataMapper.setup(:default, 'sqlite3::memory:')
28
+
29
+ class SomeModel
30
+ include DataMapper::Resource
31
+
32
+ property :id, Serial
33
+ property :title, String
34
+ property :story, Text
35
+ end
36
+ SomeModel.auto_migrate!
37
+
38
+ obj = SomeModel.new
39
+ obj.title = '<h1>Hi there</h1>'
40
+ obj.story = '<em>Some sanitization <strong>needed</strong></em>'
41
+ obj.save
42
+ puts obj.title == 'Hi there'
43
+ puts obj.story == 'Some sanitization needed'
44
+
45
+ class SomeOtherModel
46
+ include DataMapper::Resource
47
+ sanitize :default_mode => :basic, :modes => {:restricted => :title}, :exclude => [:junk]
48
+
49
+ property :id, Serial
50
+ property :title, String
51
+ property :story, Text
52
+ property :junk, Text
53
+ end
54
+ SomeOtherModel.auto_migrate!
55
+
56
+ obj = SomeOtherModel.new
57
+ obj.title = '<h1><strong>Hi</strong> <a href="#">there</a></h1>'
58
+ obj.story = '<h3><a href="#">Scince</a> knows many gitiks</h3>'
59
+ obj.junk = '<script>alert("xss")</script>'
60
+ obj.save
61
+
62
+ puts obj.title == '<strong>Hi</strong> there'
63
+ puts obj.story == '<a href="#" rel="nofollow">Scince</a> knows many gitiks'
64
+ puts obj.junk == '<script>alert("xss")</script>'
65
+
66
+ == Requirements:
67
+
68
+ * DataMapper (dm-core)
69
+ * Sanitize (sanitize)
70
+
71
+ == Installation:
72
+
73
+ sudo gem install dm-sanitizer
74
+
75
+ == License
76
+
77
+ (The MIT License)
78
+
79
+ Copyright (c) 2009 Sergei Zimakov
80
+
81
+ Permission is hereby granted, free of charge, to any person obtaining
82
+ a copy of this software and associated documentation files (the
83
+ 'Software'), to deal in the Software without restriction, including
84
+ without limitation the rights to use, copy, modify, merge, publish,
85
+ distribute, sublicense, and/or sell copies of the Software, and to
86
+ permit persons to whom the Software is furnished to do so, subject to
87
+ the following conditions:
88
+
89
+ The above copyright notice and this permission notice shall be
90
+ included in all copies or substantial portions of the Software.
91
+
92
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
93
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
94
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
95
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
96
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
97
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
98
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,81 @@
1
+ require 'pathname'
2
+ require 'rubygems'
3
+ require 'rake'
4
+ require "rake/clean"
5
+ require "rake/gempackagetask"
6
+
7
+ ROOT = Pathname(__FILE__).dirname.expand_path
8
+ JRUBY = RUBY_PLATFORM =~ /java/
9
+ WINDOWS = Gem.win_platform?
10
+ SUDO = (WINDOWS || JRUBY) ? '' : ('sudo' unless ENV['SUDOLESS'])
11
+
12
+ require ROOT + 'lib/dm-sanitizer/version'
13
+
14
+ AUTHOR = 'Sergei Zimakov'
15
+ EMAIL = 'zimakov@gmail.com'
16
+ GEM_NAME = 'dm-sanitizer'
17
+ GEM_VERSION = DataMapper::Sanitizer::VERSION
18
+ GEM_DEPENDENCIES = [['dm-core', '>= 0.9.4'], ['sanitize', '>= 1.0.0']]
19
+ GEM_CLEAN = %w[ log pkg coverage ]
20
+ GEM_EXTRAS = { :has_rdoc => true, :extra_rdoc_files => %w[ README.txt LICENSE History.txt ] }
21
+
22
+ PROJECT_NAME = 'dm-sanitizer'
23
+ PROJECT_URL = "http://github.com/pat/#{GEM_NAME}/tree/master/"
24
+ PROJECT_DESCRIPTION = PROJECT_SUMMARY = 'DataMapper plugin for automated/configurable user input sanitization.'
25
+
26
+ [ ROOT ].each do |dir|
27
+ Pathname.glob(dir.join('tasks/**/*.rb').to_s).each { |f| require f }
28
+ end
29
+ #
30
+ # spec = Gem::Specification.new do |s|
31
+ # s.name = GEM_NAME
32
+ # s.version = GEM_VERSION
33
+ # s.platform = Gem::Platform::RUBY
34
+ # s.author = AUTHOR
35
+ # s.email = EMAIL
36
+ # s.homepage = PROJECT_URL
37
+ # s.summary = PROJECT_SUMMARY
38
+ # s.description = PROJECT_DESCRIPTION
39
+ # s.require_path = 'lib'
40
+ # s.files = %w[ LICENSE README.txt Rakefile History.txt TODO ] + Dir['lib/**/*'] + Dir['spec/**/*']
41
+ # s.rubyforge_project = GEM_NAME
42
+ #
43
+ # # rdoc
44
+ # s.has_rdoc = false
45
+ # s.extra_rdoc_files = %w[ LICENSE README.txt History.txt ]
46
+ #
47
+ # # Dependencies
48
+ # GEM_DEPENDENCIES.each {|dep| s.add_dependency( dep[0], dep[1] )}
49
+ # end
50
+ #
51
+ # Rake::GemPackageTask.new(spec) do |package|
52
+ # package.gem_spec = spec
53
+ # end
54
+ #
55
+ # Specs
56
+
57
+ begin
58
+ gem 'rspec', '~>1.2'
59
+ require 'spec'
60
+ require 'spec/rake/spectask'
61
+
62
+ task :default => [ :spec ]
63
+
64
+ desc 'Run specifications'
65
+ Spec::Rake::SpecTask.new(:spec) do |t|
66
+ t.spec_opts << '--options' << 'spec/spec.opts' if File.exists?('spec/spec.opts')
67
+ t.spec_files = Pathname.glob((ROOT + 'spec/**/*_spec.rb').to_s).map { |f| f.to_s }
68
+
69
+ begin
70
+ gem 'rcov', '~>0.8'
71
+ t.rcov = JRUBY ? false : (ENV.has_key?('NO_RCOV') ? ENV['NO_RCOV'] != 'true' : true)
72
+ t.rcov_opts << '--exclude' << 'spec'
73
+ t.rcov_opts << '--text-summary'
74
+ t.rcov_opts << '--sort' << 'coverage' << '--sort-reverse'
75
+ rescue LoadError
76
+ # rcov not installed
77
+ end
78
+ end
79
+ rescue LoadError
80
+ # rspec not installed
81
+ end
data/TODO ADDED
@@ -0,0 +1,8 @@
1
+ TODO list
2
+ =========
3
+
4
+ * add options for before :valid? hooking
5
+ * add options for redefining properties filtering method
6
+ * add spec heplers for testing property sanitization options
7
+ * add possibility for sanitizing dirty properties
8
+ * validate options
@@ -0,0 +1,111 @@
1
+ require 'pathname'
2
+ require 'rubygems'
3
+
4
+ require Pathname(__FILE__).dirname.expand_path + 'dm-sanitizer/version'
5
+
6
+ gem 'dm-core', '>= 0.9.4'
7
+ require 'dm-core'
8
+
9
+ gem 'sanitize', '>= 1.0.0'
10
+ require 'sanitize'
11
+
12
+ module DataMapper
13
+ module Sanitizer
14
+ def default_options
15
+ {
16
+ :mode_definitions => {
17
+ :default => Sanitize::Config::DEFAULT,
18
+ :restricted => Sanitize::Config::RESTRICTED,
19
+ :basic => Sanitize::Config::BASIC,
20
+ :relaxed => Sanitize::Config::RELAXED
21
+ },
22
+ :default_mode => :default
23
+ }
24
+ end
25
+ module_function :default_options
26
+
27
+ module ClassMethods
28
+ def sanitize(options={})
29
+ self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
30
+ def self.sanitization_options=(options)
31
+ @sanitization_options = options
32
+ end
33
+
34
+ def self.sanitization_options
35
+ @sanitization_options
36
+ end
37
+
38
+ def sanitization_options
39
+ self.class.sanitization_options
40
+ end
41
+ RUBY
42
+
43
+ self.sanitization_options = DataMapper::Sanitizer.default_options.merge(options)
44
+ remap_sanitization_modes!
45
+ check_sanitization_modes
46
+
47
+ before :save, :sanitize! unless hooks_with_scope(:instance)[:save][:before].include?({:name => :sanitize!, :from => self})
48
+ end
49
+
50
+ def disable_sanitization
51
+ self.sanitization_options[:disabled] = true
52
+ end
53
+
54
+ private
55
+ def remap_sanitization_modes!
56
+ return unless @sanitization_options[:modes]
57
+ result = {}
58
+ @sanitization_options[:modes].each do |mode, group|
59
+ if group.class == Array
60
+ group.each {|item| result[item] = mode}
61
+ else
62
+ result[group] = mode
63
+ end
64
+ end
65
+ @sanitization_options[:modes] = result
66
+ end
67
+
68
+ def check_sanitization_modes
69
+ return unless @sanitization_options[:modes]
70
+ @sanitization_options[:modes].each do |property, mode|
71
+ raise Exception.new("Sanitization mode :#{mode} is not defined") unless @sanitization_options[:mode_definitions].has_key?(mode)
72
+ end
73
+ end
74
+ end
75
+
76
+ module InstanceMethods
77
+ def sanitize!
78
+ options = self.class.sanitization_options
79
+ return false if options[:disabled]
80
+
81
+ self.class.properties.each do |property|
82
+ property_name = property.name.to_sym
83
+
84
+ next unless property.type == String || property.type == DataMapper::Types::Text
85
+ next if !new_record? && !attribute_dirty?(property.name.to_sym)
86
+ next if options[:exclude] && options[:exclude].include?(property_name)
87
+
88
+ property_mode = options[:modes] ? options[:modes][property_name] || options[:default_mode] : options[:default_mode]
89
+
90
+ sanitize_property!(property_name, property_mode)
91
+ end
92
+ return true
93
+ end
94
+
95
+ def sanitize_property!(name, mode)
96
+ value = self.send( name )
97
+ return if value.nil? || value.empty?
98
+ sanitized_value = Sanitize.clean(value, self.class.sanitization_options[:mode_definitions][mode])
99
+ self.send( name.to_s+'=', sanitized_value)
100
+ end
101
+ end
102
+
103
+ def self.included(receiver)
104
+ receiver.extend( ClassMethods )
105
+ receiver.send( :include, InstanceMethods )
106
+ receiver.send( :sanitize )
107
+ end
108
+ end
109
+ end
110
+
111
+ DataMapper::Resource.append_inclusions DataMapper::Sanitizer
@@ -0,0 +1,5 @@
1
+ module DataMapper
2
+ module Sanitizer
3
+ VERSION = '0.1.1'
4
+ end
5
+ end
@@ -0,0 +1,137 @@
1
+ require 'pathname'
2
+ require Pathname(__FILE__).dirname.expand_path + 'spec_helper'
3
+
4
+ if HAS_SQLITE3 || HAS_MYSQL || HAS_POSTGRES
5
+
6
+ class CleanCell
7
+ include DataMapper::Resource
8
+
9
+ property :id, Serial
10
+ property :title, String
11
+ property :story, Text
12
+ end
13
+ CleanCell.auto_migrate!
14
+
15
+ class DirtyCell
16
+ include DataMapper::Resource
17
+ disable_sanitization
18
+
19
+ property :id, Serial
20
+ property :title, String
21
+ property :story, Text
22
+ end
23
+ DirtyCell.auto_migrate!
24
+
25
+
26
+ describe DataMapper::Model do
27
+ it "should have options" do
28
+ CleanCell.new.sanitization_options.should be_an_instance_of(Hash)
29
+ end
30
+ end
31
+
32
+ describe DataMapper::Model, 'without sanitization' do
33
+ before(:each) do
34
+ @object = DirtyCell.new
35
+ end
36
+
37
+ it "should have disabling option" do
38
+ @object.sanitization_options[:disabled].should be_true
39
+ end
40
+
41
+ it "should not sanitize before save (sanitize! should return false)" do
42
+ @object.should_receive(:sanitize!).and_return(false)
43
+ @object.save
44
+ end
45
+ end
46
+
47
+ describe DataMapper::Model, "with sanitization" do
48
+ before(:each) do
49
+ @object = CleanCell.new
50
+ end
51
+
52
+ it "should call sanitize! once before save" do
53
+ @object.should_receive(:sanitize!).with().once.and_return(true)
54
+ @object.save
55
+ end
56
+
57
+ it "should sanitize String and Text properties by default" do
58
+ @object.should_receive(:sanitize_property!).with(:title,anything).once.ordered
59
+ @object.should_receive(:sanitize_property!).with(:story,anything).once.ordered
60
+ @object.save
61
+ end
62
+
63
+ it "should not sanitize property if its exluded" do
64
+ @object.class.sanitize :exclude => [:title]
65
+ @object.should_not_receive(:sanitize_property!).with(:title,anything)
66
+ @object.should_receive(:sanitize_property!).with(:story,anything).once.ordered
67
+ @object.save
68
+ end
69
+
70
+ it "should use changed default_mode" do
71
+ @object.class.sanitize :default_mode => :basic
72
+ @object.should_receive(:sanitize_property!).with(:title, :basic)
73
+ @object.should_receive(:sanitize_property!).with(:story, :basic)
74
+ @object.save
75
+ end
76
+
77
+ it "should use changed mode" do
78
+ @object.class.sanitize :modes => {:restricted => :title, :relaxed => :story}
79
+ @object.should_receive(:sanitize_property!).with(:title, :restricted)
80
+ @object.should_receive(:sanitize_property!).with(:story, :relaxed)
81
+ @object.save
82
+ end
83
+
84
+ it "should accept array style mode setting" do
85
+ @object.class.sanitize :modes => {:restricted => [:title, :story]}
86
+ @object.should_receive(:sanitize_property!).with(:title, :restricted)
87
+ @object.should_receive(:sanitize_property!).with(:story, :restricted)
88
+ @object.save
89
+ end
90
+
91
+ it "should raise error on undefined sanitization mode" do
92
+ lambda {
93
+ @object.class.sanitize :modes => {:desanitizedtwice => :title}
94
+ }.should raise_error
95
+ end
96
+
97
+ it "should not sanitize not dirty properties in not new records by default" do
98
+ @object.should_receive(:sanitize_property!).with(:title,anything).twice
99
+ @object.should_receive(:sanitize_property!).with(:story,anything).once
100
+ @object.save
101
+ @object.title = 'Really new <strong>value</strong>'
102
+ @object.save
103
+ end
104
+ end
105
+
106
+ describe "DataMapper::Model sanitize_property! method" do
107
+ before(:each) do
108
+ @object = CleanCell.new
109
+ @object.title = '<em>hi</em>'
110
+ end
111
+
112
+ it "should call Sanitize.clean with property and mode" do
113
+ Sanitize.should_receive(:clean).with(@object.title, @object.sanitization_options[:mode_definitions][:restricted])
114
+ @object.sanitize_property!(:title, :restricted)
115
+ end
116
+
117
+ it "should set property to sanitized value" do
118
+ @object.sanitize_property!(:title, :default)
119
+ @object.title.should == Sanitize.clean(@object.title, @object.sanitization_options[:mode_definitions][:default])
120
+ end
121
+
122
+ it "should not sanitize nil properties" do
123
+ @object.title = nil
124
+ Sanitize.should_not_receive(:clean)
125
+ @object.sanitize_property!(:title, :default)
126
+ @object.title.should == nil
127
+ end
128
+
129
+ it "should not sanitize empty properties" do
130
+ @object.title = ''
131
+ Sanitize.should_not_receive(:clean)
132
+ @object.sanitize_property!(:title, :default)
133
+ @object.title.should == ''
134
+ end
135
+ end
136
+
137
+ end
data/spec/spec.opts ADDED
@@ -0,0 +1 @@
1
+ --colour
@@ -0,0 +1,32 @@
1
+ require 'pathname'
2
+ require 'rubygems'
3
+
4
+ gem 'rspec', '~>1.2'
5
+ require 'spec'
6
+
7
+ gem 'dm-core', '>= 0.9.4'
8
+ require 'dm-core'
9
+
10
+ gem 'sanitize', '>= 1.0.0'
11
+ require 'sanitize'
12
+
13
+ require Pathname(__FILE__).dirname.parent.expand_path + 'lib/dm-sanitizer'
14
+
15
+ def load_driver(name, default_uri)
16
+ return false if ENV['ADAPTER'] != name.to_s
17
+
18
+ begin
19
+ DataMapper.setup(name, ENV["#{name.to_s.upcase}_SPEC_URI"] || default_uri)
20
+ DataMapper::Repository.adapters[:default] = DataMapper::Repository.adapters[name]
21
+ true
22
+ rescue LoadError => e
23
+ warn "Could not load do_#{name}: #{e}"
24
+ false
25
+ end
26
+ end
27
+
28
+ ENV['ADAPTER'] ||= 'sqlite3'
29
+
30
+ HAS_SQLITE3 = load_driver(:sqlite3, 'sqlite3::memory:')
31
+ HAS_MYSQL = load_driver(:mysql, 'mysql://localhost/dm_core_test')
32
+ HAS_POSTGRES = load_driver(:postgres, 'postgres://postgres@localhost/dm_core_test')
data/tasks/hoe.rb ADDED
@@ -0,0 +1,46 @@
1
+ require 'hoe'
2
+
3
+ @config_file = "~/.rubyforge/user-config.yml"
4
+ @config = nil
5
+ RUBYFORGE_USERNAME = "unknown"
6
+ def rubyforge_username
7
+ unless @config
8
+ begin
9
+ @config = YAML.load(File.read(File.expand_path(@config_file)))
10
+ rescue
11
+ puts <<-EOS
12
+ ERROR: No rubyforge config file found: #{@config_file}
13
+ Run 'rubyforge setup' to prepare your env for access to Rubyforge
14
+ - See http://newgem.rubyforge.org/rubyforge.html for more details
15
+ EOS
16
+ exit
17
+ end
18
+ end
19
+ RUBYFORGE_USERNAME.replace @config["username"]
20
+ end
21
+
22
+ # Remove hoe dependency
23
+ class Hoe
24
+ def extra_dev_deps
25
+ @extra_dev_deps.reject! { |dep| dep[0] == "hoe" }
26
+ @extra_dev_deps
27
+ end
28
+ end
29
+
30
+ hoe = Hoe.new(GEM_NAME, GEM_VERSION) do |p|
31
+
32
+ p.developer(AUTHOR, EMAIL)
33
+
34
+ p.description = PROJECT_DESCRIPTION
35
+ p.summary = PROJECT_SUMMARY
36
+ p.url = PROJECT_URL
37
+
38
+ p.rubyforge_name = PROJECT_NAME if PROJECT_NAME
39
+ p.clean_globs |= GEM_CLEAN
40
+ p.spec_extras = GEM_EXTRAS if GEM_EXTRAS
41
+
42
+ GEM_DEPENDENCIES.each do |dep|
43
+ p.extra_deps << dep
44
+ end
45
+
46
+ end
metadata ADDED
@@ -0,0 +1,87 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dm-sanitizer
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Sergei Zimakov
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-06-02 00:00:00 +04:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: dm-core
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 0.9.4
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: sanitize
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 1.0.0
34
+ version:
35
+ description: DataMapper plugin for automated/configurable user input sanitization.
36
+ email:
37
+ - zimakov@gmail.com
38
+ executables: []
39
+
40
+ extensions: []
41
+
42
+ extra_rdoc_files:
43
+ - README.txt
44
+ - LICENSE
45
+ - History.txt
46
+ files:
47
+ - History.txt
48
+ - LICENSE
49
+ - Manifest.txt
50
+ - Rakefile
51
+ - README.txt
52
+ - TODO
53
+ - lib/dm-sanitizer.rb
54
+ - lib/dm-sanitizer/version.rb
55
+ - spec/dm-sanitizer_spec.rb
56
+ - spec/spec.opts
57
+ - spec/spec_helper.rb
58
+ - tasks/hoe.rb
59
+ has_rdoc: true
60
+ homepage: http://github.com/pat/dm-sanitizer/tree/master/
61
+ post_install_message:
62
+ rdoc_options:
63
+ - --main
64
+ - README.txt
65
+ require_paths:
66
+ - lib
67
+ required_ruby_version: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ version: "0"
72
+ version:
73
+ required_rubygems_version: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ version: "0"
78
+ version:
79
+ requirements: []
80
+
81
+ rubyforge_project: dm-sanitizer
82
+ rubygems_version: 1.3.1
83
+ signing_key:
84
+ specification_version: 2
85
+ summary: DataMapper plugin for automated/configurable user input sanitization.
86
+ test_files: []
87
+