nayutaya-active-form 0.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/MIT-LICENSE +20 -0
- data/README +15 -0
- data/Rakefile +22 -0
- data/lib/active_form.rb +65 -0
- data/lib/nayutaya-active-form.rb +2 -0
- data/nayutaya-active-form.gemspec +36 -0
- data/rails/init.rb +2 -0
- data/test/active_form_test.rb +139 -0
- metadata +62 -0
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2007, 2008 R.W. van 't Veer
|
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
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
= ActiveForm
|
2
|
+
|
3
|
+
This plugin provides a base class for making forms with ActiveRecord validations without having a corresponding database table. You can use ActiveForm for:
|
4
|
+
|
5
|
+
* making forms which don't needed storage, like simple email forms
|
6
|
+
* provide extra validations on existing ActiveRecord models
|
7
|
+
* make forms for composite objects
|
8
|
+
|
9
|
+
|
10
|
+
== Author
|
11
|
+
R.W. van 't Veer
|
12
|
+
|
13
|
+
|
14
|
+
== Copyright
|
15
|
+
Copyright (c) 2007, 2008 R.W. van 't Veer
|
data/Rakefile
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/testtask'
|
3
|
+
require 'rake/rdoctask'
|
4
|
+
|
5
|
+
desc 'Default: run unit tests.'
|
6
|
+
task :default => :test
|
7
|
+
|
8
|
+
desc 'Test the active_form plugin.'
|
9
|
+
Rake::TestTask.new(:test) do |t|
|
10
|
+
t.libs << 'lib'
|
11
|
+
t.pattern = 'test/**/*_test.rb'
|
12
|
+
t.verbose = true
|
13
|
+
end
|
14
|
+
|
15
|
+
desc 'Generate documentation for the active_form plugin.'
|
16
|
+
Rake::RDocTask.new(:rdoc) do |rdoc|
|
17
|
+
rdoc.rdoc_dir = 'rdoc'
|
18
|
+
rdoc.title = 'ActiveForm'
|
19
|
+
rdoc.options << '--line-numbers' << '--inline-source'
|
20
|
+
rdoc.rdoc_files.include('README')
|
21
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
22
|
+
end
|
data/lib/active_form.rb
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
# = ActiveForm - non persistent ActiveRecord
|
2
|
+
#
|
3
|
+
# Simple base class to make AR objects without a corresponding database
|
4
|
+
# table. These objects can still use AR validations but can't be saved
|
5
|
+
# to the database.
|
6
|
+
#
|
7
|
+
# == Example
|
8
|
+
#
|
9
|
+
# class FeedbackForm < ActiveForm
|
10
|
+
# column :email
|
11
|
+
# column :message, :type => :text
|
12
|
+
# validates_presence_of :email, :message
|
13
|
+
# end
|
14
|
+
#
|
15
|
+
class ActiveForm < ActiveRecord::Base
|
16
|
+
def self.columns # :nodoc:
|
17
|
+
@columns ||= []
|
18
|
+
end
|
19
|
+
|
20
|
+
# Define an attribute. It takes the following options:
|
21
|
+
# [+:type+] schema type
|
22
|
+
# [+:default+] default value
|
23
|
+
# [+:null+] whether it is nullable
|
24
|
+
# [+:human_name+] human readable name
|
25
|
+
def self.column(name, options = {})
|
26
|
+
name = name.to_s
|
27
|
+
options.each { |k,v| options[k] = v.to_s if Symbol === v }
|
28
|
+
|
29
|
+
if human_name = options.delete(:human_name)
|
30
|
+
name.instance_variable_set('@human_name', human_name)
|
31
|
+
def name.humanize; @human_name; end
|
32
|
+
end
|
33
|
+
|
34
|
+
columns << ActiveRecord::ConnectionAdapters::Column.new(
|
35
|
+
name,
|
36
|
+
options.delete(:default),
|
37
|
+
options.delete(:type),
|
38
|
+
options.include?(:null) ? options.delete(:null) : true
|
39
|
+
)
|
40
|
+
|
41
|
+
raise ArgumentError.new("unknown option(s) #{options.inspect}") unless options.empty?
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.abstract_class # :nodoc:
|
45
|
+
true
|
46
|
+
end
|
47
|
+
|
48
|
+
def save # :nodoc:
|
49
|
+
if result = valid?
|
50
|
+
callback(:before_save)
|
51
|
+
callback(:before_create)
|
52
|
+
|
53
|
+
# do nothing!
|
54
|
+
|
55
|
+
callback(:after_save)
|
56
|
+
callback(:after_create)
|
57
|
+
end
|
58
|
+
|
59
|
+
result
|
60
|
+
end
|
61
|
+
|
62
|
+
def save! # :nodoc:
|
63
|
+
save or raise ActiveRecord::RecordInvalid.new(self)
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
|
2
|
+
Gem::Specification.new do |s|
|
3
|
+
s.specification_version = 2
|
4
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0")
|
5
|
+
s.required_ruby_version = Gem::Requirement.new(">= 1.8.6")
|
6
|
+
|
7
|
+
s.name = "nayutaya-active-form"
|
8
|
+
s.version = "0.0.1"
|
9
|
+
s.date = "2009-12-02"
|
10
|
+
|
11
|
+
s.authors = ["Yuya Kato"]
|
12
|
+
s.email = "yuyakato@gmail.com"
|
13
|
+
|
14
|
+
s.summary = "Remco van 't Veer's ActiveForm plugin"
|
15
|
+
s.description = "a non-official gem package of Remco van 't Veer's ActiveForm plugin. packaged by Nayutaya."
|
16
|
+
s.homepage = "http://github.com/nayutaya/active_form"
|
17
|
+
|
18
|
+
s.rubyforge_project = nil
|
19
|
+
s.has_rdoc = false
|
20
|
+
s.require_paths = ["lib"]
|
21
|
+
|
22
|
+
s.files = [
|
23
|
+
"lib/active_form.rb",
|
24
|
+
"lib/nayutaya-active-form.rb",
|
25
|
+
"rails/init.rb",
|
26
|
+
"test/active_form_test.rb",
|
27
|
+
"MIT-LICENSE",
|
28
|
+
"README",
|
29
|
+
"Rakefile",
|
30
|
+
"nayutaya-active-form.gemspec",
|
31
|
+
]
|
32
|
+
s.test_files = [
|
33
|
+
"test/active_form_test.rb",
|
34
|
+
]
|
35
|
+
s.extra_rdoc_files = []
|
36
|
+
end
|
data/rails/init.rb
ADDED
@@ -0,0 +1,139 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'active_record'
|
3
|
+
|
4
|
+
require File.dirname(__FILE__) + '/../lib/active_form'
|
5
|
+
require 'test/unit'
|
6
|
+
|
7
|
+
class ActiveFormTest < Test::Unit::TestCase
|
8
|
+
def test_class_loads
|
9
|
+
assert_nothing_raised { ActiveForm }
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_can_add_columns
|
13
|
+
self.class.class_eval %q{
|
14
|
+
class CanAddColumns < ActiveForm
|
15
|
+
%w(foo bar test).each { |c| column c }
|
16
|
+
end
|
17
|
+
}
|
18
|
+
assert_equal 3, CanAddColumns.columns.size
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_type_properly_set
|
22
|
+
self.class.class_eval %q{
|
23
|
+
class TypeProperlySet < ActiveForm
|
24
|
+
%w(string text date datetime boolean).each do |type|
|
25
|
+
column "a_#{type}".to_sym, :type => type.to_sym
|
26
|
+
end
|
27
|
+
end
|
28
|
+
}
|
29
|
+
|
30
|
+
assert TypeProperlySet.columns.size > 0, 'no columns added'
|
31
|
+
|
32
|
+
%w(string text date datetime boolean).each do |type|
|
33
|
+
assert_equal type, TypeProperlySet.columns_hash["a_#{type}"].sql_type
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_default_properly_set
|
38
|
+
self.class.class_eval %q{
|
39
|
+
class DefaultPropertlySet < ActiveForm
|
40
|
+
column :bicycle, :default => 'batavus'
|
41
|
+
end
|
42
|
+
}
|
43
|
+
assert_equal 'batavus', DefaultPropertlySet.new.bicycle
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_columns_are_humanizable
|
47
|
+
self.class.class_eval %q{
|
48
|
+
class Humanizable < ActiveForm
|
49
|
+
column :bicycle, :human_name => 'fiets'
|
50
|
+
end
|
51
|
+
}
|
52
|
+
|
53
|
+
assert_equal 'fiets', Humanizable.columns_hash['bicycle'].human_name
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_fail_on_illegal_options
|
57
|
+
assert_raises ArgumentError do
|
58
|
+
self.class.class_eval %q{
|
59
|
+
class FailOnIllegalOption < ActiveForm
|
60
|
+
column :foo, :bar => 'yelp!'
|
61
|
+
end
|
62
|
+
}
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
CALLBACKS_CALLED_FOR_VALID = %w(before_validation after_validation before_validation_on_create after_validation_on_create before_save after_save before_create after_create)
|
67
|
+
CALLBACKS_NOT_CALLED_FOR_VALID = %w(before_validation_on_update after_validation_on_update)
|
68
|
+
CALLBACKS_FOR_VALID = CALLBACKS_CALLED_FOR_VALID + CALLBACKS_NOT_CALLED_FOR_VALID
|
69
|
+
|
70
|
+
def test_callbacks_called_on_valid
|
71
|
+
self.class.class_eval %q{
|
72
|
+
class WithCallbackSuccess < ActiveForm
|
73
|
+
CALLBACKS_FOR_VALID.each do |callback|
|
74
|
+
attr_accessor "#{callback}_called"
|
75
|
+
send(callback){|obj| obj.send("#{callback}_called=", true)}
|
76
|
+
end
|
77
|
+
end
|
78
|
+
}
|
79
|
+
|
80
|
+
obj = WithCallbackSuccess.new
|
81
|
+
assert obj.save
|
82
|
+
CALLBACKS_CALLED_FOR_VALID.each do |callback|
|
83
|
+
assert obj.send("#{callback}_called"), "expected #{callback} to be called"
|
84
|
+
end
|
85
|
+
CALLBACKS_NOT_CALLED_FOR_VALID.each do |callback|
|
86
|
+
assert !obj.send("#{callback}_called"), "expected #{callback} not to be called"
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
CALLBACKS_CALLED_FOR_INVALID = %w(before_validation before_validation_on_create after_validation after_validation_on_create)
|
91
|
+
CALLBACKS_NOT_CALLED_FOR_INVALID = %w(before_validation_on_update after_validation_on_update before_save after_save before_create after_create)
|
92
|
+
CALLBACKS_FOR_INVALID = CALLBACKS_CALLED_FOR_INVALID + CALLBACKS_NOT_CALLED_FOR_INVALID
|
93
|
+
|
94
|
+
def test_callbacks_called_on_invalid
|
95
|
+
self.class.class_eval %q{
|
96
|
+
class WithCallbackFailure < ActiveForm
|
97
|
+
column :required
|
98
|
+
validates_presence_of :required
|
99
|
+
|
100
|
+
CALLBACKS_FOR_INVALID.each do |callback|
|
101
|
+
attr_accessor "#{callback}_called"
|
102
|
+
send(callback){|obj| obj.send("#{callback}_called=", true)}
|
103
|
+
end
|
104
|
+
end
|
105
|
+
}
|
106
|
+
|
107
|
+
obj = WithCallbackFailure.new
|
108
|
+
assert !obj.save
|
109
|
+
CALLBACKS_CALLED_FOR_INVALID.each do |callback|
|
110
|
+
assert obj.send("#{callback}_called"), "expected #{callback} to be called"
|
111
|
+
end
|
112
|
+
CALLBACKS_NOT_CALLED_FOR_INVALID.each do |callback|
|
113
|
+
assert !obj.send("#{callback}_called"), "expected #{callback} not to be called"
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
def test_create_bang_raises_no_exception_on_valid
|
118
|
+
self.class.class_eval %q{
|
119
|
+
class CreateBangSuccess < ActiveForm; end
|
120
|
+
}
|
121
|
+
|
122
|
+
assert_nothing_raised do
|
123
|
+
CreateBangSuccess.create!
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
def test_create_bang_raises_exception_on_invalid
|
128
|
+
self.class.class_eval %q{
|
129
|
+
class CreateBangFailure < ActiveForm
|
130
|
+
column :required_field
|
131
|
+
validates_presence_of :required_field
|
132
|
+
end
|
133
|
+
}
|
134
|
+
|
135
|
+
assert_raises ActiveRecord::RecordInvalid do
|
136
|
+
CreateBangFailure.create!
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
metadata
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: nayutaya-active-form
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Yuya Kato
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-12-02 00:00:00 +09:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: a non-official gem package of Remco van 't Veer's ActiveForm plugin. packaged by Nayutaya.
|
17
|
+
email: yuyakato@gmail.com
|
18
|
+
executables: []
|
19
|
+
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files: []
|
23
|
+
|
24
|
+
files:
|
25
|
+
- lib/active_form.rb
|
26
|
+
- lib/nayutaya-active-form.rb
|
27
|
+
- rails/init.rb
|
28
|
+
- test/active_form_test.rb
|
29
|
+
- MIT-LICENSE
|
30
|
+
- README
|
31
|
+
- Rakefile
|
32
|
+
- nayutaya-active-form.gemspec
|
33
|
+
has_rdoc: true
|
34
|
+
homepage: http://github.com/nayutaya/active_form
|
35
|
+
licenses: []
|
36
|
+
|
37
|
+
post_install_message:
|
38
|
+
rdoc_options: []
|
39
|
+
|
40
|
+
require_paths:
|
41
|
+
- lib
|
42
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 1.8.6
|
47
|
+
version:
|
48
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
49
|
+
requirements:
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: "0"
|
53
|
+
version:
|
54
|
+
requirements: []
|
55
|
+
|
56
|
+
rubyforge_project:
|
57
|
+
rubygems_version: 1.3.3
|
58
|
+
signing_key:
|
59
|
+
specification_version: 2
|
60
|
+
summary: Remco van 't Veer's ActiveForm plugin
|
61
|
+
test_files:
|
62
|
+
- test/active_form_test.rb
|