roovo-dm-form_friendly_integer 1.0.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.
@@ -0,0 +1 @@
1
+ v1.0.0. Initial Version
data/LICENSE ADDED
@@ -0,0 +1,23 @@
1
+ (The MIT License)
2
+
3
+ Copyright (c) 2009 roovo
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ 'Software'), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
20
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
+
@@ -0,0 +1,12 @@
1
+ autotest/discover.rb
2
+ CHANGELOG
3
+ lib/dm-form_friendly_integer.rb
4
+ lib/dm-types/form_friendly_integer.rb
5
+ LICENSE
6
+ Manifest
7
+ Rakefile
8
+ README.rdoc
9
+ spec/integration/form_friendly_integer_spec.rb
10
+ spec/spec.opts
11
+ spec/spec_helper.rb
12
+ tasks/spec.rake
@@ -0,0 +1,63 @@
1
+ = DataMapper::Types::FormFriendlyInteger
2
+
3
+ An adaptation of the DataMapper Integer type designed to work well with web forms.
4
+ It behaves in the same way as the standard DataMapper Integer type when writing
5
+ the property to the database but it doesn't immediately typecast the property unless
6
+ it is an integer string. The example below illustrates this.
7
+
8
+ The reason for wanting this behaviour is to ensure that if an invalid entry is
9
+ fed into a web form then when the form is re-displayed with it's errors, the
10
+ value in the form input will be as it was when it was entered.
11
+
12
+ == EXAMPLE:
13
+
14
+ model MyModel
15
+ include DataMapper::Resource
16
+
17
+ property :id, Serial
18
+ property :a_number, Integer
19
+ property :ff_number, FormFriendlyInteger
20
+ end
21
+
22
+ The +a_number+ property will behave as follows:
23
+
24
+ my_model = MyModel.new
25
+ my_model.a_number = 7
26
+ my_model.ff_number = 7
27
+ my_model.a_number # => 7
28
+ my_model.ff_number # => 7
29
+ my_model.save
30
+ Model.get(my_model.id).a_number # => 7
31
+ Model.get(my_model.id).ff_number # => 7
32
+
33
+ my_model = MyModel.new
34
+ my_model.a_number = -7
35
+ my_model.ff_number = -7
36
+ my_model.a_number # => -7
37
+ my_model.ff_number # => -7
38
+ my_model.save
39
+ Model.get(my_model.id).a_number # => -7
40
+ Model.get(my_model.id).ff_number # => -7
41
+
42
+ my_model = MyModel.new
43
+ my_model.a_number = "7.45"
44
+ my_model.ff_number = "7.45"
45
+ my_model.a_number # => 7
46
+ my_model.ff_number # => "7.45"
47
+ my_model.save
48
+ Model.get(my_model.id).a_number # => 7
49
+ Model.get(my_model.id).ff_number # => 7
50
+
51
+ my_model = MyModel.new
52
+ my_model.a_number = "not a number"
53
+ my_model.ff_number = "not a number"
54
+ my_model.a_number # => nil
55
+ my_model.ff_number # => "not a number"
56
+ my_model.save
57
+ Model.get(my_model.id).a_number # => 0
58
+ Model.get(my_model.id).ff_number # => 0
59
+
60
+ my_model = MyModel.new
61
+ my_model.a_number = [] # => nothing raised
62
+ my_model.ff_number = [] # => raise(ArgumentError, '+value+ must be nil or a String')
63
+
@@ -0,0 +1,18 @@
1
+ require 'pathname'
2
+ require 'rubygems'
3
+ require 'rake'
4
+ require 'echoe'
5
+
6
+ ROOT = Pathname(__FILE__).dirname.expand_path
7
+
8
+ Echoe.new('dm-form_friendly_integer') do |p|
9
+ p.description = "A DataMapper Integer type which behaves well on forms"
10
+ p.url = "http://github.com/roovo/dm-form_friendly_integer"
11
+ p.author = "roovo"
12
+ p.email = "roovo@roovoweb.com"
13
+ p.ignore_pattern = ["tmp/*", "script/*"]
14
+ p.development_dependencies = []
15
+ p.runtime_dependencies = ['dm-core']
16
+ end
17
+
18
+ Pathname.glob(ROOT.join('tasks/**/*.rb').to_s).each { |f| require f }
@@ -0,0 +1,4 @@
1
+ Autotest.add_discovery do
2
+ "rspec"
3
+ end
4
+
@@ -0,0 +1,34 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{dm-form_friendly_integer}
5
+ s.version = "1.0.0"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["roovo"]
9
+ s.date = %q{2009-04-19}
10
+ s.description = %q{A DataMapper Integer type which behaves well on forms}
11
+ s.email = %q{roovo@roovoweb.com}
12
+ s.extra_rdoc_files = ["CHANGELOG", "lib/dm-form_friendly_integer.rb", "lib/dm-types/form_friendly_integer.rb", "LICENSE", "README.rdoc", "tasks/spec.rake"]
13
+ s.files = ["autotest/discover.rb", "CHANGELOG", "lib/dm-form_friendly_integer.rb", "lib/dm-types/form_friendly_integer.rb", "LICENSE", "Manifest", "Rakefile", "README.rdoc", "spec/integration/form_friendly_integer_spec.rb", "spec/spec.opts", "spec/spec_helper.rb", "tasks/spec.rake", "dm-form_friendly_integer.gemspec"]
14
+ s.has_rdoc = true
15
+ s.homepage = %q{http://github.com/roovo/dm-form_friendly_integer}
16
+ s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Dm-form_friendly_integer", "--main", "README.rdoc"]
17
+ s.require_paths = ["lib"]
18
+ s.rubyforge_project = %q{dm-form_friendly_integer}
19
+ s.rubygems_version = %q{1.3.2}
20
+ s.summary = %q{A DataMapper Integer type which behaves well on forms}
21
+
22
+ if s.respond_to? :specification_version then
23
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
24
+ s.specification_version = 3
25
+
26
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
27
+ s.add_runtime_dependency(%q<dm-core>, [">= 0"])
28
+ else
29
+ s.add_dependency(%q<dm-core>, [">= 0"])
30
+ end
31
+ else
32
+ s.add_dependency(%q<dm-core>, [">= 0"])
33
+ end
34
+ end
@@ -0,0 +1,7 @@
1
+ require 'rubygems'
2
+ require 'pathname'
3
+
4
+ gem 'dm-core', '>=0.9.11'
5
+ require 'dm-core'
6
+
7
+ require Pathname(__FILE__).dirname.expand_path / 'dm-types' / 'form_friendly_integer'
@@ -0,0 +1,29 @@
1
+ module DataMapper
2
+ module Types
3
+ # An adaption of the Integer DataMapper type designed to work well on web forms
4
+ #
5
+ # See the README for details
6
+ class FormFriendlyInteger < DataMapper::Type
7
+ primitive Integer
8
+
9
+ def self.load(value, property) #:nodoc:
10
+ if value.is_a?(Integer) || value.nil?
11
+ value
12
+ else
13
+ raise ArgumentError.new("+value+ must be nil or a String")
14
+ end
15
+ end
16
+
17
+ def self.typecast(value, property) #:nodoc:
18
+ if value.kind_of?(String) && value =~ /\A[+-]?\d+\z/
19
+ value.to_i
20
+ elsif value.kind_of?(String)
21
+ value
22
+ else
23
+ load(value, property)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+
@@ -0,0 +1,68 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper.rb'
2
+
3
+ describe DataMapper::Types::FormFriendlyInteger do
4
+ before(:all) do
5
+ class ::FormFriendlyIntegerTest
6
+ include DataMapper::Resource
7
+
8
+ property :id, Serial
9
+ property :some_number, FormFriendlyInteger
10
+ end
11
+ FormFriendlyIntegerTest.auto_migrate!
12
+ end
13
+
14
+ before(:each) do
15
+ FormFriendlyIntegerTest.all.destroy!
16
+ end
17
+
18
+ it 'should immediately typecast positive integer string values' do
19
+ FormFriendlyIntegerTest.new(:some_number => '345').some_number.should == 345
20
+ end
21
+
22
+ it 'should immediately typecast negative integer string values' do
23
+ FormFriendlyIntegerTest.new(:some_number => '-345').some_number.should == -345
24
+ end
25
+
26
+ it 'should NOT typecast decimal string values' do
27
+ FormFriendlyIntegerTest.new(:some_number => '345.1').some_number.should == '345.1'
28
+ end
29
+
30
+ it 'should NOT typecast non-numeric string values' do
31
+ FormFriendlyIntegerTest.new(:some_number => 'not a number').some_number.should == 'not a number'
32
+ end
33
+
34
+ it 'should raise an error for a non-string value' do
35
+ lambda { FormFriendlyIntegerTest.new(:some_number => []) }.should raise_error(ArgumentError, '+value+ must be nil or a String')
36
+ end
37
+
38
+ it "should save the number to the db with a positive integer string value" do
39
+ repository(:default) do
40
+ FormFriendlyIntegerTest.create(:some_number => '345')
41
+ end
42
+
43
+ FormFriendlyIntegerTest.first.some_number.should == 345
44
+ end
45
+
46
+ it "should save the number to the db with a negative integer string value" do
47
+ repository(:default) do
48
+ FormFriendlyIntegerTest.create(:some_number => '-345')
49
+ end
50
+
51
+ FormFriendlyIntegerTest.first.some_number.should == -345
52
+ end
53
+
54
+ it "should save the integer part of the string to the db with a decimal input string value" do
55
+ repository(:default) do
56
+ FormFriendlyIntegerTest.create(:some_number => '345.9')
57
+ end
58
+
59
+ FormFriendlyIntegerTest.first.some_number.should == 345
60
+ end
61
+
62
+ it "should save 0 to the db with a non-numeric input string value" do
63
+ repository(:default) do
64
+ FormFriendlyIntegerTest.create(:some_number => 'not a number')
65
+ end
66
+ FormFriendlyIntegerTest.first.some_number.should be_zero
67
+ end
68
+ end
@@ -0,0 +1,4 @@
1
+ --colour
2
+ --format progress
3
+ --loadby mtime
4
+ --reverse
@@ -0,0 +1,18 @@
1
+ require 'pathname'
2
+ require 'rubygems'
3
+
4
+ gem 'rspec', '>=1.1.12'
5
+ require 'spec'
6
+
7
+ gem 'dm-core', '0.9.11'
8
+ require 'dm-core'
9
+
10
+ require Pathname(__FILE__).dirname.parent.expand_path + 'lib/dm-form_friendly_integer'
11
+
12
+ begin
13
+ DataMapper.setup(:default,'sqlite3::memory:')
14
+ Object.const_set('ADAPTER', :sqlite)
15
+ rescue Exception => e
16
+ Object.const_set('ADAPTER', nil)
17
+ warn "Could not load do_sqlite: #{e}"
18
+ end
File without changes
metadata ADDED
@@ -0,0 +1,84 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: roovo-dm-form_friendly_integer
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - roovo
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-04-19 00:00:00 -07: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"
24
+ version:
25
+ description: A DataMapper Integer type which behaves well on forms
26
+ email: roovo@roovoweb.com
27
+ executables: []
28
+
29
+ extensions: []
30
+
31
+ extra_rdoc_files:
32
+ - CHANGELOG
33
+ - lib/dm-form_friendly_integer.rb
34
+ - lib/dm-types/form_friendly_integer.rb
35
+ - LICENSE
36
+ - README.rdoc
37
+ - tasks/spec.rake
38
+ files:
39
+ - autotest/discover.rb
40
+ - CHANGELOG
41
+ - lib/dm-form_friendly_integer.rb
42
+ - lib/dm-types/form_friendly_integer.rb
43
+ - LICENSE
44
+ - Manifest
45
+ - Rakefile
46
+ - README.rdoc
47
+ - spec/integration/form_friendly_integer_spec.rb
48
+ - spec/spec.opts
49
+ - spec/spec_helper.rb
50
+ - tasks/spec.rake
51
+ - dm-form_friendly_integer.gemspec
52
+ has_rdoc: true
53
+ homepage: http://github.com/roovo/dm-form_friendly_integer
54
+ post_install_message:
55
+ rdoc_options:
56
+ - --line-numbers
57
+ - --inline-source
58
+ - --title
59
+ - Dm-form_friendly_integer
60
+ - --main
61
+ - README.rdoc
62
+ require_paths:
63
+ - lib
64
+ required_ruby_version: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: "0"
69
+ version:
70
+ required_rubygems_version: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: "1.2"
75
+ version:
76
+ requirements: []
77
+
78
+ rubyforge_project: dm-form_friendly_integer
79
+ rubygems_version: 1.2.0
80
+ signing_key:
81
+ specification_version: 3
82
+ summary: A DataMapper Integer type which behaves well on forms
83
+ test_files: []
84
+