simple_form 0.4.0 → 0.5

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.

Potentially problematic release.


This version of simple_form might be problematic. Click here for more details.

data/CHANGELOG CHANGED
@@ -1,3 +1,13 @@
1
+ * Version 0.5
2
+
3
+ * SimpleForm is deprecated in favor of MailForm:
4
+
5
+ http://github.com/plataformatec/mail_form/tree/v1.0
6
+
7
+ For a Rails 2.3 version, please install:
8
+
9
+ gem install mail_form --version=1.0
10
+
1
11
  * Version 0.4
2
12
 
3
13
  * Added support to template
@@ -1,184 +1,9 @@
1
- == Simple Form
1
+ == Deprecation
2
2
 
3
- Simple Form is a ready to go contact form. Just the following lines are needed
4
- to have a contact form (including the e-mail):
3
+ SimpleForm is deprecated in favor of MailForm:
5
4
 
6
- class ContactForm < SimpleForm
7
- subject "My Contact Form"
8
- recipients "your.email@your.domain.com"
9
- sender{|c| %{"#{c.name}" <#{c.email}>} }
5
+ http://github.com/plataformatec/mail_form/tree/v1.0
6
+
7
+ For a Rails 2.3 version, please install:
10
8
 
11
- attribute :name, :validate => true
12
- attribute :email, :validate => /[^@]+@[^\.]+\.[\w\.\-]+/
13
- attribute :file, :attachment => true
14
-
15
- attribute :message
16
- attribute :nickname, :captcha => true
17
- end
18
-
19
- Then you start a script/console and type:
20
-
21
- c = ContactForm.new(:name => 'José', :email => 'jose@email.com', :message => 'Cool!')
22
- c.deliver
23
-
24
- Check your inbox and the e-mail will be there, with the sent fields (assuming
25
- that you configured your smtp properly).
26
-
27
- SimpleForm also support attachments, I18n, error messages like in ActiveRecord
28
- (so it works with custom FormBuilders) and can also send the user request information
29
- in the contact mail.
30
-
31
- It's tested and compatible with Rails 2.2.x and Rails 2.3.x.
32
-
33
- == Installation
34
-
35
- Install Simple Form is very easy. It is stored in Gemcutter, so just run the following:
36
-
37
- gem sources -a http://gemcutter.org
38
- sudo gem install simple_form
39
-
40
- If you want it as plugin, just do:
41
-
42
- script/plugin install git://github.com/josevalim/simple_form.git
43
-
44
- == Request
45
-
46
- SimpleForm makes easy to append user information to the contact mail. You just
47
- have to do:
48
-
49
- class ContactForm < SimpleForm
50
- append :remote_ip, :user_agent, :session
51
- # ...
52
- end
53
-
54
- And in your controller:
55
-
56
- @contact_form = ContactForm.new(params[:contact_form], request)
57
-
58
- And the remote ip, user agent and session will be sent in the e-mail in a
59
- request information session. You can give to append any method that the
60
- request object responds to.
61
-
62
- == API Overview
63
-
64
- ==== attributes(*attributes)
65
-
66
- Declare your form attributes. All attributes declared here will be appended
67
- to the e-mail, except the ones :captcha is true.
68
-
69
- Options:
70
-
71
- * :validate - When true, validates the attributes can't be blank.
72
- When a regexp is given, check if the attribute matches is not blank and
73
- then if it matches the regexp.
74
-
75
- Whenever :validate is a symbol, the method given as symbol will be
76
- called. You can then add validations as you do in ActiveRecord (errors.add).
77
-
78
- * :attachment - When given, expects a file to be sent and attaches
79
- it to the e-mail. Don't forget to set your form to multitype.
80
-
81
- * :captcha - When true, validates the attributes must be blank.
82
- This is a simple way to avoid spam and the input should be hidden with CSS.
83
-
84
- Examples:
85
-
86
- class ContactForm < SimpleForm
87
- attributes :name, :validate => true
88
- attributes :email, :validate => /[^@]+@[^\.]+\.[\w\.\-]+/
89
- attributes :message
90
- attributes :screenshot, :attachment => true, :validate => :screenshot_required?
91
- attributes :nickname, :captcha => true
92
-
93
- def screenshot_required?
94
- # ...
95
- end
96
- end
97
-
98
- c = ContactForm.new(:nickname => 'not_blank', :email => 'your@email.com', :name => 'José')
99
- c.valid? #=> true
100
- c.spam? #=> true (raises an error in development, to remember you to hide it)
101
- c.deliver #=> false (just delivers if is not a spam and is valid)
102
-
103
- c = ContactForm.new(:email => 'invalid')
104
- c.valid? #=> false
105
- c.errors.inspect #=> { :name => :blank, :email => :invalid }
106
- c.errors.full_messages #=> [ "Name can't be blank", "Email is invalid" ]
107
-
108
- c = ContactForm.new(:name => 'José', :email => 'your@email.com')
109
- # save is an alias to deliver to allow it to work with InheritedResources
110
- c.save #=> true
111
-
112
- ==== subject(string_or_symbol_or_block)
113
-
114
- Declares the subject of the contact email. It can be a string or a proc or a symbol.
115
-
116
- When a symbol is given, it will call a method on the form object with the same
117
- name as the symbol. As a proc, it receives a simple form instance. It defaults
118
- to the class human name.
119
-
120
- subject "My Contact Form"
121
- subject { |c| "Contacted by #{c.name}" }
122
-
123
- ==== sender(string_or_symbol_or_block)
124
-
125
- Declares contact email sender. It can be a string or a proc or a symbol.
126
-
127
- When a symbol is given, it will call a method on the form object with the same
128
- name as the symbol. As a proc, it receives a simple form instance. By default is:
129
-
130
- sender{ |c| c.email }
131
-
132
- This requires that your SimpleForm object have an email attribute.
133
-
134
- ==== recipients(string_or_array_or_symbol_or_block)
135
-
136
- Who will receive the e-mail. Can be a string or array or a symbol or a proc.
137
-
138
- When a symbol is given, it will call a method on the form object with the same
139
- name as the symbol. As a proc, it receives a simple form instance.
140
-
141
- Both the proc and the symbol must return a string or an array. By default is nil.
142
-
143
- ==== template(string_or_symbol_or_proc)
144
-
145
- Allow you to set the template that is going to rendered. This allows you to have
146
- several simple_form instances, using different templates.
147
-
148
- ==== headers(hash)
149
-
150
- Additional headers to your e-mail.
151
-
152
- == I18n
153
-
154
- All models, attributes and messages in SimpleForm can be used with localized.
155
- Below is an I18n example file:
156
-
157
- simple_form:
158
- models:
159
- contact_form: "Your site contact form"
160
- attributes:
161
- email: "E-mail"
162
- telephone: "Telephone number"
163
- message: "Sent message"
164
- messages:
165
- blank: "can not be blank"
166
- invalid: "is not valid"
167
- telephone: "must have eight digits"
168
- request:
169
- title: "Technical information about the user"
170
- remote_ip: "IP Address"
171
- user_agent: "Browser"
172
-
173
- == Contributors
174
-
175
- * José Valim - http://github.com/josevalim
176
- * Carlos Antonio - http://github.com/carlosantoniodasilva
177
- * Andrew Timberlake - http://github.com/andrewtimberlake
178
-
179
- == Bugs and Feedback
180
-
181
- If you discover any bugs, please send an e-mail to contact@plataformatec.com.be
182
- If you just want to give some positive feedback or drop a line, that's fine too!
183
-
184
- Copyright (c) 2009 Plataforma Tec http://blog.plataformatec.com.br/
9
+ gem install mail_form --version=1.0
data/Rakefile CHANGED
@@ -1,35 +1,14 @@
1
- require 'rake'
2
- require 'rake/testtask'
3
- require 'rake/rdoctask'
4
- require File.join(File.dirname(__FILE__), "lib", "simple_form", "version")
5
-
6
- desc 'Run tests for SimpleForm.'
7
- Rake::TestTask.new(:test) do |t|
8
- t.pattern = 'test/**/*_test.rb'
9
- t.verbose = true
10
- end
11
-
12
- desc 'Generate documentation for SimpleForm.'
13
- Rake::RDocTask.new(:rdoc) do |rdoc|
14
- rdoc.rdoc_dir = 'rdoc'
15
- rdoc.title = 'SimpleForm'
16
- rdoc.options << '--line-numbers' << '--inline-source'
17
- rdoc.rdoc_files.include('README')
18
- rdoc.rdoc_files.include('MIT-LICENSE')
19
- rdoc.rdoc_files.include('lib/**/*.rb')
20
- end
21
-
22
1
  begin
23
2
  require 'jeweler'
24
3
  Jeweler::Tasks.new do |s|
25
4
  s.name = "simple_form"
26
- s.version = SimpleForm::VERSION
5
+ s.version = "0.5"
27
6
  s.summary = "Simple easy contact form for Rails with I18n, validations, attachments and request information."
28
7
  s.email = "contact@plataformatec.com.br"
29
8
  s.homepage = "http://github.com/josevalim/simple_form"
30
9
  s.description = "Simple easy contact form for Rails with I18n, validations, attachments and request information."
31
10
  s.authors = ['José Valim', 'Carlos Antônio']
32
- s.files = FileList["[A-Z]*", "{lib,views}/**/*"]
11
+ s.files = FileList["[A-Z]*", "init.rb", "install.rb", "{lib,views}/**/*"]
33
12
  end
34
13
 
35
14
  Jeweler::GemcutterTasks.new
@@ -1,33 +1 @@
1
- dir = File.dirname(__FILE__)
2
- require File.join(dir, 'simple_form', 'base')
3
- require File.join(dir, 'simple_form', 'dsl')
4
- require File.join(dir, 'simple_form', 'errors')
5
- require File.join(dir, 'simple_form', 'notifier')
6
-
7
- class SimpleForm
8
- extend SimpleForm::DSL
9
-
10
- ACCESSORS = [ :form_attributes, :form_validatable, :form_subject,
11
- :form_attachments, :form_recipients, :form_sender,
12
- :form_captcha, :form_headers, :form_template, :form_appendable ]
13
-
14
- DEFAULT_MESSAGES = { :blank => "can't be blank", :invalid => "is invalid" }
15
-
16
- class_inheritable_reader *ACCESSORS
17
- protected *ACCESSORS
18
-
19
- # Initialize arrays and hashes
20
- #
21
- write_inheritable_array :form_captcha, []
22
- write_inheritable_array :form_appendable, []
23
- write_inheritable_array :form_attributes, []
24
- write_inheritable_array :form_attachments, []
25
- write_inheritable_hash :form_validatable, {}
26
-
27
- headers({})
28
- sender {|c| c.email }
29
- subject{|c| c.class.human_name }
30
- template 'contact'
31
- end
32
-
33
- SimpleForm::Notifier.template_root = File.join(dir, '..', 'views')
1
+ raise RuntimeError, "\n\n" + File.read(File.expand_path("../README.rdoc", File.dirname(__FILE__)))
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simple_form
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: "0.5"
5
5
  platform: ruby
6
6
  authors:
7
7
  - "Jos\xC3\xA9 Valim"
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2009-11-10 00:00:00 -02:00
13
+ date: 2009-12-24 00:00:00 +01:00
14
14
  default_executable:
15
15
  dependencies: []
16
16
 
@@ -24,16 +24,9 @@ extra_rdoc_files:
24
24
  - README.rdoc
25
25
  files:
26
26
  - CHANGELOG
27
- - MIT-LICENSE
28
27
  - README.rdoc
29
28
  - Rakefile
30
29
  - lib/simple_form.rb
31
- - lib/simple_form/base.rb
32
- - lib/simple_form/dsl.rb
33
- - lib/simple_form/errors.rb
34
- - lib/simple_form/notifier.rb
35
- - lib/simple_form/version.rb
36
- - views/simple_form/notifier/contact.erb
37
30
  has_rdoc: true
38
31
  homepage: http://github.com/josevalim/simple_form
39
32
  licenses: []
@@ -62,8 +55,5 @@ rubygems_version: 1.3.5
62
55
  signing_key:
63
56
  specification_version: 3
64
57
  summary: Simple easy contact form for Rails with I18n, validations, attachments and request information.
65
- test_files:
66
- - test/base_test.rb
67
- - test/errors_test.rb
68
- - test/notifier_test.rb
69
- - test/test_helper.rb
58
+ test_files: []
59
+
@@ -1,20 +0,0 @@
1
- Copyright (c) 2009 Plataforma Tec http://blog.plataformatec.com.br/
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.
@@ -1,126 +0,0 @@
1
- class SimpleForm
2
- attr_accessor :request
3
-
4
- # Initialize assigning the parameters given as hash (just as in ActiveRecord).
5
- #
6
- # It also accepts the request object as second parameter which must be sent
7
- # whenever :append is called.
8
- #
9
- def initialize(params={}, request=nil)
10
- @request = request
11
- params.each_pair do |attr, value|
12
- self.send(:"#{attr}=", value)
13
- end unless params.blank?
14
- end
15
-
16
- # In development, raises an error if the captcha field is not blank. This is
17
- # is good to remember that the field should be hidden with CSS and shown only
18
- # to robots.
19
- #
20
- # In test and in production, it returns true if aall captcha field are blank,
21
- # returns false otherwise.
22
- #
23
- def spam?
24
- form_captcha.each do |field|
25
- next if send(field).blank?
26
-
27
- if RAILS_ENV == 'development'
28
- raise ScriptError, "The captcha field #{field} was supposed to be blank"
29
- else
30
- return true
31
- end
32
- end
33
-
34
- return false
35
- end
36
-
37
- def not_spam?
38
- !spam?
39
- end
40
-
41
- # To check if the form is valid, we run the validations.
42
- #
43
- # If the validation is true, we just check if the field is not blank. If it's
44
- # a regexp, we check if it is not blank AND if the Regexp matches.
45
- #
46
- # You can have totally custom validations by sending a symbol. Then the method
47
- # given as symbol will be called and then you cann hook your validations there.
48
- #
49
- def valid?
50
- return false unless errors.empty?
51
-
52
- form_validatable.each_pair do |field, validation|
53
- next unless validation
54
-
55
- if validation.is_a?(Symbol)
56
- send(validation)
57
- elsif send(field).blank?
58
- errors.add(field, :blank)
59
- elsif validation.is_a?(Regexp)
60
- errors.add(field, :invalid) unless send(field) =~ validation
61
- end
62
- end
63
-
64
- errors.empty?
65
- end
66
-
67
- def invalid?
68
- !valid?
69
- end
70
-
71
- # Always return true so when using form_for, the default method will be post.
72
- #
73
- def new_record?
74
- true
75
- end
76
-
77
- # Always return nil so when using form_for, the default method will be post.
78
- #
79
- def id
80
- nil
81
- end
82
-
83
- # If is not spam and the form is valid, we send the e-mail and returns true.
84
- # Otherwise returns false.
85
- #
86
- def deliver(run_validations=true)
87
- if !run_validations || (self.not_spam? && self.valid?)
88
- SimpleForm::Notifier.deliver_contact(self)
89
- return true
90
- else
91
- return false
92
- end
93
- end
94
- alias :save :deliver
95
-
96
- # Add a human attribute name interface on top of I18n. If email is received as
97
- # attribute, it will look for a translated name on:
98
- #
99
- # simple_form:
100
- # attributes:
101
- # email: E-mail
102
- #
103
- def self.human_attribute_name(attribute, options={})
104
- I18n.translate("attributes.#{attribute}", options.merge(:default => attribute.to_s.humanize, :scope => [:simple_form]))
105
- end
106
-
107
- # Add a human name interface on top of I18n. If you have a model named
108
- # SimpleForm, it will search for the localized name on:
109
- #
110
- # simple_form:
111
- # models:
112
- # contact_form: Contact form
113
- #
114
- def self.human_name(options={})
115
- underscored = self.name.demodulize.underscore
116
- I18n.translate("models.#{underscored}", options.merge(:default => underscored.humanize, :scope => [:simple_form]))
117
- end
118
-
119
- # Return the errors in this form. The object returned as the same API as the
120
- # ActiveRecord one.
121
- #
122
- def errors
123
- @errors ||= SimpleForm::Errors.new(self)
124
- end
125
-
126
- end
@@ -1,171 +0,0 @@
1
- class SimpleForm
2
- module DSL
3
-
4
- protected
5
-
6
- # Declare your form attributes. All attributes declared here will be appended
7
- # to the e-mail, except the ones captcha is true.
8
- #
9
- # == Options
10
- #
11
- # * <tt>:validate</tt> - When true, validates the attributes can't be blank.
12
- # When a regexp is given, check if the attribute matches is not blank and
13
- # then if it matches the regexp.
14
- #
15
- # Whenever :validate is a symbol, the method given as symbol will be
16
- # called. You can then add validations as you do in ActiveRecord (errors.add).
17
- #
18
- # * <tt>:attachment</tt> - When given, expects a file to be sent and attaches
19
- # it to the e-mail. Don't forget to set your form to multitype.
20
- #
21
- # * <tt>:captcha</tt> - When true, validates the attributes must be blank
22
- # This is a simple way to avoid spam
23
- #
24
- # == Examples
25
- #
26
- # class ContactForm < SimpleForm
27
- # attributes :name, :validate => true
28
- # attributes :email, :validate => /^([^@]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i
29
- # attributes :message
30
- # attributes :type
31
- # attributes :screenshot, :attachment => true, :validate => :interface_bug?
32
- # attributes :nickname, :captcha => true
33
- #
34
- # def interface_bug?
35
- # if type == 'Interface bug' && screenshot.nil?
36
- # self.errors.add(:screenshot, "can't be blank when you are reporting an interface bug")
37
- # end
38
- # end
39
- # end
40
- #
41
- def attribute(*accessors)
42
- options = accessors.extract_options!
43
-
44
- attr_accessor *accessors
45
-
46
- if options[:attachment]
47
- write_inheritable_array(:form_attachments, accessors)
48
- elsif options[:captcha]
49
- write_inheritable_array(:form_captcha, accessors)
50
- else
51
- write_inheritable_array(:form_attributes, accessors)
52
- end
53
-
54
- if options[:validate]
55
- validations = {}
56
- accessors.each{ |a| validations[a] = options[:validate] }
57
-
58
- write_inheritable_hash(:form_validatable, validations)
59
- end
60
- end
61
- alias :attributes :attribute
62
-
63
- # Declares contact email sender. It can be a string or a proc or a symbol.
64
- #
65
- # When a symbol is given, it will call a method on the form object with
66
- # the same name as the symbol. As a proc, it receives a simple form
67
- # instance. By default is the class human name.
68
- #
69
- # == Examples
70
- #
71
- # class ContactForm < SimpleForm
72
- # subject "My Contact Form"
73
- # end
74
- #
75
- def subject(duck=nil, &block)
76
- write_inheritable_attribute(:form_subject, duck || block)
77
- end
78
-
79
- # Declares contact email sender. It can be a string or a proc or a symbol.
80
- #
81
- # When a symbol is given, it will call a method on the form object with
82
- # the same name as the symbol. As a proc, it receives a simple form
83
- # instance. By default is:
84
- #
85
- # sender{ |c| c.email }
86
- #
87
- # This requires that your SimpleForm object have an email attribute.
88
- #
89
- # == Examples
90
- #
91
- # class ContactForm < SimpleForm
92
- # # Change sender to include also the name
93
- # sender { |c| %{"#{c.name}" <#{c.email}>} }
94
- # end
95
- #
96
- def sender(duck=nil, &block)
97
- write_inheritable_attribute(:form_sender, duck || block)
98
- end
99
- alias :from :sender
100
-
101
- # Who will receive the e-mail. Can be a string or array or a symbol or a proc.
102
- #
103
- # When a symbol is given, it will call a method on the form object with
104
- # the same name as the symbol. As a proc, it receives a simple form instance.
105
- #
106
- # Both the proc and the symbol must return a string or an array. By default
107
- # is nil.
108
- #
109
- # == Examples
110
- #
111
- # class ContactForm < SimpleForm
112
- # recipients [ "first.manager@domain.com", "second.manager@domain.com" ]
113
- # end
114
- #
115
- def recipients(duck=nil, &block)
116
- write_inheritable_attribute(:form_recipients, duck || block)
117
- end
118
- alias :to :recipients
119
-
120
- # Additional headers to your e-mail.
121
- #
122
- # == Examples
123
- #
124
- # class ContactForm < SimpleForm
125
- # headers { :content_type => 'text/html' }
126
- # end
127
- #
128
- def headers(hash)
129
- write_inheritable_hash(:form_headers, hash)
130
- end
131
-
132
- # Customized template for your e-mail, if you don't want to use default
133
- # 'contact' template or need more than one contact form with different
134
- # template layouts.
135
- #
136
- # When a symbol is given, it will call a method on the form object with
137
- # the same name as the symbol. As a proc, it receives a simple form
138
- # instance. Both method and proc must return a string with the template
139
- # name. Defaults to 'contact'.
140
- #
141
- # == Examples
142
- #
143
- # class ContactForm < SimpleForm
144
- # # look for a template in views/simple_form/notifier/my_template.erb
145
- # template 'my_template'
146
- # end
147
- #
148
- def template(new_template)
149
- write_inheritable_attribute(:form_template, new_template)
150
- end
151
-
152
- # Values from request object to be appended to the contact form.
153
- # Whenever used, you have to send the request object when initializing the object:
154
- #
155
- # @contact_form = ContactForm.new(params[:contact_form], request)
156
- #
157
- # You can get the values to be appended from the AbstractRequest
158
- # documentation (http://api.rubyonrails.org/classes/ActionController/AbstractRequest.html)
159
- #
160
- # == Examples
161
- #
162
- # class ContactForm < SimpleForm
163
- # append :remote_ip, :user_agent, :session, :cookies
164
- # end
165
- #
166
- def append(*values)
167
- write_inheritable_array(:form_appendable, values)
168
- end
169
-
170
- end
171
- end
@@ -1,59 +0,0 @@
1
- # Provides an Errors class similar with ActiveRecord ones.
2
- #
3
- # class ContactForm < SimpleForm
4
- # attributes :name, :validate => true
5
- # attributes :email, :validate => /^([^@]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i
6
- # attributes :message
7
- # attributes :nickname, :captcha => true
8
- # end
9
- #
10
- # When validating an attribute name as above, it will search for messages in
11
- # the following order:
12
- #
13
- # simple_form.messages.name
14
- # simple_form.messages.blank
15
- #
16
- # When validating email, it will search for:
17
- #
18
- # simple_form.messages.name
19
- # simple_form.messages.invalid
20
- #
21
- # If the message is not available, it will output: "can't be blank" in the first
22
- # case and "is invalid" in the second.
23
- #
24
- class SimpleForm
25
- class Errors < Hash
26
-
27
- def initialize(base, *args)
28
- @base = base
29
- super(*args)
30
- end
31
-
32
- alias :add :store
33
- alias :count :size
34
- alias :get :[]
35
-
36
- def on(attribute)
37
- attribute = attribute.to_sym
38
- return nil unless get(attribute)
39
-
40
- generate_message_for(attribute, get(attribute))
41
- end
42
- alias :[] :on
43
-
44
- def full_messages
45
- map do |attribute, message|
46
- next if message.nil?
47
- attribute = attribute.to_sym
48
- "#{@base.class.human_attribute_name(attribute)} #{generate_message_for(attribute, message)}"
49
- end.compact.reverse
50
- end
51
-
52
- protected
53
-
54
- def generate_message_for(attribute, message)
55
- I18n.t(attribute, :default => [ message, DEFAULT_MESSAGES[message] ], :scope => [:simple_form, :messages])
56
- end
57
-
58
- end
59
- end
@@ -1,48 +0,0 @@
1
- # This is the class responsable to send the e-mails.
2
- #
3
- class SimpleForm
4
- class Notifier < ActionMailer::Base
5
-
6
- def contact(form)
7
- @from = get_from_class_and_eval(form, :form_sender)
8
- @subject = get_from_class_and_eval(form, :form_subject)
9
- @recipients = get_from_class_and_eval(form, :form_recipients)
10
- @template = get_from_class_and_eval(form, :form_template)
11
-
12
- raise ScriptError, "You forgot to setup #{form.class.name} recipients" if @recipients.blank?
13
- raise ScriptError, "You set :append values but forgot to give me the request object" if form.request.nil? && !form.class.form_appendable.blank?
14
-
15
- @body['form'] = form
16
- @body['subject'] = @subject
17
-
18
- @sent_on = Time.now.utc
19
- @headers = form.class.form_headers
20
- @content_type = 'text/html'
21
-
22
- form.class.form_attachments.each do |attribute|
23
- value = form.send(attribute)
24
- if value.respond_to?(:read)
25
- attachment value.content_type.to_s do |att|
26
- att.filename = value.original_filename
27
- att.body = value.read
28
- end
29
- end
30
- end
31
- end
32
-
33
- protected
34
-
35
- def get_from_class_and_eval(form, method)
36
- duck = form.class.send(method)
37
-
38
- if duck.is_a?(Proc)
39
- duck.call(form)
40
- elsif duck.is_a?(Symbol)
41
- form.send(duck)
42
- else
43
- duck
44
- end
45
- end
46
-
47
- end
48
- end
@@ -1,3 +0,0 @@
1
- module SimpleForm
2
- VERSION = "0.4.0".freeze
3
- end
@@ -1,110 +0,0 @@
1
- require File.dirname(__FILE__) + '/test_helper'
2
-
3
- class SimpleFormBaseTest < ActiveSupport::TestCase
4
-
5
- def setup
6
- ActionMailer::Base.deliveries = []
7
- end
8
-
9
- def test_id_is_nil
10
- assert_equal nil, ContactForm.new.id
11
- end
12
-
13
- def test_is_always_a_new_record
14
- assert ContactForm.new.new_record?
15
- end
16
-
17
- def test_initialize_with_options
18
- form = ContactForm.new(:name => 'José', :email => 'jose@my.email.com')
19
- assert_equal 'José', form.name
20
- assert_equal 'jose@my.email.com', form.email
21
- end
22
-
23
- def test_spam_is_true_when_captcha_field_is_set
24
- form = ContactForm.new(:nickname => 'not_blank')
25
- assert form.spam?
26
- assert !form.not_spam?
27
- end
28
-
29
- def test_spam_is_false_when_captcha_field_is_not_set
30
- form = ContactForm.new
31
- assert !form.spam?
32
- assert form.not_spam?
33
- end
34
-
35
- def test_is_not_valid_when_validatable_attributes_are_blank
36
- form = ContactForm.new
37
- assert !form.valid?
38
- assert form.invalid?
39
-
40
- assert_equal(2, form.errors.count)
41
- assert_equal({:email=>:blank, :name=>:blank}, form.errors)
42
- end
43
-
44
- def test_is_not_valid_when_validatable_regexp_does_not_match
45
- form = ContactForm.new(:name => 'Jose', :email => 'not_valid')
46
- assert !form.valid?
47
- assert form.invalid?
48
-
49
- assert_equal(1, form.errors.count)
50
- assert_equal({:email=>:invalid}, form.errors)
51
- end
52
-
53
- def test_is_valid_when_validatable_attributes_are_valid
54
- form = ContactForm.new(:name => 'Jose', :email => 'is.valid@email.com')
55
- assert form.valid?
56
- assert !form.invalid?
57
- end
58
-
59
- def test_symbols_given_to_validate_are_called
60
- form = ContactForm.new
61
- assert form.instance_variable_get('@_callback_run').nil?
62
- form.valid?
63
- assert form.instance_variable_get('@_callback_run')
64
- end
65
-
66
- def test_deliver_is_false_when_is_a_spam
67
- form = ContactForm.new(:name => 'Jose', :email => 'is.valid@email.com', :nickname => 'not_blank')
68
- assert form.valid?
69
- assert form.spam?
70
- assert !form.deliver
71
- end
72
-
73
- def test_deliver_is_false_when_is_invalid
74
- form = ContactForm.new(:name => 'Jose', :email => 'is.com')
75
- assert form.invalid?
76
- assert form.not_spam?
77
- assert !form.deliver
78
- end
79
-
80
- def test_deliver_is_true_when_is_not_spam_and_valid
81
- form = ContactForm.new(:name => 'Jose', :email => 'is.valid@email.com')
82
- assert form.valid?
83
- assert form.not_spam?
84
- assert form.deliver
85
- assert_equal 1, ActionMailer::Base.deliveries.size
86
- end
87
-
88
- def test_human_name_returns_a_humanized_name
89
- assert_equal 'Contact form', ContactForm.human_name
90
- end
91
-
92
- def test_human_name_can_be_localized
93
- I18n.backend.store_translations(:en, :simple_form => { :models => { :contact_form => 'Formulário de contato' } })
94
- assert_equal 'Formulário de contato', ContactForm.human_name
95
- end
96
-
97
- def test_human_attribute_name_returns_a_humanized_attribute
98
- assert_equal 'Message', ContactForm.human_attribute_name(:message)
99
- end
100
-
101
- def test_human_attribute_name_can_be_localized
102
- I18n.backend.store_translations(:en, :simple_form => { :attributes => { :message => 'Mensagem' } })
103
- assert_equal 'Mensagem', ContactForm.human_attribute_name(:message)
104
- end
105
-
106
- def teardown
107
- I18n.reload!
108
- end
109
-
110
- end
@@ -1,85 +0,0 @@
1
- require File.dirname(__FILE__) + '/test_helper'
2
-
3
- class SimpleFormErrorsTest < ActiveSupport::TestCase
4
-
5
- def test_errors_respond_to_some_hash_methods
6
- assert ContactForm.new.errors.respond_to?(:each)
7
- assert ContactForm.new.errors.respond_to?(:each_pair)
8
- assert ContactForm.new.errors.respond_to?(:size)
9
- end
10
-
11
- def test_count_is_an_alias_to_size
12
- errors = ContactForm.new.errors
13
- assert_equal errors.size, errors.count
14
- end
15
-
16
- def test_on_returns_the_message_in_the_given_attribute
17
- form = ContactForm.new(:email => 'not_valid')
18
- form.valid?
19
- assert_equal "can't be blank", form.errors.on(:name)
20
- assert_equal "is invalid", form.errors.on(:email)
21
- assert_equal nil, form.errors.on(:message)
22
- end
23
-
24
- def test_on_returns_a_default_localized_message_in_the_given_attribute
25
- I18n.backend.store_translations(:en, :simple_form => { :messages => { :invalid => 'is not valid', :blank => 'should be filled' } })
26
-
27
- form = ContactForm.new(:email => 'not_valid')
28
- form.valid?
29
-
30
- assert_equal "should be filled", form.errors.on(:name)
31
- assert_equal "is not valid", form.errors.on(:email)
32
- assert_equal nil, form.errors.on(:message)
33
- end
34
-
35
- def test_on_returns_an_attribute_localized_message_in_the_given_attribute
36
- I18n.backend.store_translations(:en, :simple_form => { :messages => { :email => 'fill in the email', :name => 'fill in the name' } })
37
-
38
- form = ContactForm.new(:email => 'not_valid')
39
- form.valid?
40
-
41
- assert_equal "fill in the name", form.errors.on(:name)
42
- assert_equal "fill in the email", form.errors.on(:email)
43
- assert_equal nil, form.errors.on(:message)
44
- end
45
-
46
- def test_array_like_option_acts_as_an_alias_for_on
47
- form = ContactForm.new(:email => 'not_valid')
48
- form.valid?
49
- assert_equal "can't be blank", form.errors[:name]
50
- assert_equal form.errors.on(:name), form.errors[:name]
51
- assert_equal "is invalid", form.errors[:email]
52
- assert_equal form.errors.on(:email), form.errors[:email]
53
- assert_equal nil, form.errors[:message]
54
- end
55
-
56
- def test_get_returns_the_real_value_in_the_given_attribute
57
- form = ContactForm.new(:email => 'not_valid')
58
- form.valid?
59
- assert_equal :blank, form.errors.get(:name)
60
- assert_equal :invalid, form.errors.get(:email)
61
- assert_equal nil, form.errors.get(:message)
62
- end
63
-
64
- def test_full_messages
65
- form = ContactForm.new(:email => 'not_valid')
66
- form.valid?
67
-
68
- assert form.errors.full_messages.include?("Name can't be blank")
69
- assert form.errors.full_messages.include?("Email is invalid")
70
- end
71
-
72
- def test_full_localized_messages
73
- I18n.backend.store_translations(:en, :simple_form => { :messages => { :email => 'is not valid', :blank => 'should be filled' }, :attributes => { :email => 'E-mail' } })
74
-
75
- form = ContactForm.new(:email => 'not_valid')
76
- form.valid?
77
-
78
- assert form.errors.full_messages.include?("Name should be filled")
79
- assert form.errors.full_messages.include?("E-mail is not valid")
80
- end
81
-
82
- def teardown
83
- I18n.reload!
84
- end
85
- end
@@ -1,183 +0,0 @@
1
- require File.dirname(__FILE__) + '/test_helper'
2
-
3
- class SimpleFormNotifierTest < ActiveSupport::TestCase
4
-
5
- def setup
6
- @form = ContactForm.new(:name => 'José', :email => 'my.email@my.domain.com', :message => 'Cool')
7
-
8
- @request = ActionController::TestRequest.new
9
- @valid_attributes = { :name => 'José', :email => 'my.email@my.domain.com', :message => "Cool\nno?" }
10
- @advanced = AdvancedForm.new(@valid_attributes, @request)
11
-
12
- test_file = ActionController::TestUploadedFile.new(File.join(File.dirname(__FILE__), 'test_file.txt'))
13
- @with_file = FileForm.new(:name => 'José', :email => 'my.email@my.domain.com', :message => "Cool", :file => test_file)
14
-
15
- @template = TemplateForm.new(@valid_attributes)
16
-
17
- ActionMailer::Base.deliveries = []
18
- end
19
-
20
- def test_email_is_sent
21
- @form.deliver
22
- assert_equal 1, ActionMailer::Base.deliveries.size
23
- end
24
-
25
- def test_subject_defaults_to_class_human_name
26
- @form.deliver
27
- assert_equal 'Contact form', ActionMailer::Base.deliveries.first.subject
28
- end
29
-
30
- def test_subject_is_a_string
31
- @advanced.deliver
32
- assert_equal 'My Advanced Form', ActionMailer::Base.deliveries.first.subject
33
- end
34
-
35
- def test_sender_defaults_to_form_email
36
- @form.deliver
37
- assert_equal ['my.email@my.domain.com'], ActionMailer::Base.deliveries.first.from
38
- end
39
-
40
- def test_error_is_raised_when_recipients_is_nil
41
- assert_raise ScriptError do
42
- NullRecipient.new.deliver
43
- end
44
- end
45
-
46
- def test_recipients_is_a_string
47
- @form.deliver
48
- assert_equal ['my.email@my.domain.com'], ActionMailer::Base.deliveries.first.to
49
- end
50
-
51
- def test_recipients_is_an_array
52
- @advanced.deliver
53
- assert_equal ['my.first@email.com', 'my.second@email.com'], ActionMailer::Base.deliveries.first.to
54
- end
55
-
56
- def test_recipients_is_a_symbold
57
- @with_file.deliver
58
- assert_equal ['contact_file@my.domain.com'], ActionMailer::Base.deliveries.first.to
59
- end
60
-
61
- def test_headers_is_a_hash
62
- @advanced.deliver
63
- assert_equal '<mypath>', ActionMailer::Base.deliveries.first.header['return-path'].to_s
64
- end
65
-
66
- def test_body_contains_subject
67
- @form.deliver
68
- assert_match /Contact form/, ActionMailer::Base.deliveries.first.body
69
- end
70
-
71
- def test_body_contains_attributes_values
72
- @form.deliver
73
- assert_match /José/, ActionMailer::Base.deliveries.first.body
74
- assert_match /my.email@my.domain.com/, ActionMailer::Base.deliveries.first.body
75
- assert_match /Cool/, ActionMailer::Base.deliveries.first.body
76
- end
77
-
78
- def test_body_contains_attributes_names
79
- @form.deliver
80
- assert_match /Name:/, ActionMailer::Base.deliveries.first.body
81
- assert_match /Email:/, ActionMailer::Base.deliveries.first.body
82
- assert_match /Message:/, ActionMailer::Base.deliveries.first.body
83
- end
84
-
85
- def test_body_contains_localized_attributes_names
86
- I18n.backend.store_translations(:en, :simple_form => { :attributes => { :message => 'Sent message' } })
87
- @form.deliver
88
- assert_match /Sent message:/, ActionMailer::Base.deliveries.first.body
89
- assert_no_match /Message:/, ActionMailer::Base.deliveries.first.body
90
- end
91
-
92
- def test_body_simple_format_messages_with_break_line
93
- @form.deliver
94
- assert_no_match /<p>Cool/, ActionMailer::Base.deliveries.first.body
95
-
96
- @advanced.deliver
97
- assert_match /<p>Cool/, ActionMailer::Base.deliveries.last.body
98
- end
99
-
100
- def test_body_does_not_append_request_if_append_is_not_called
101
- @form.deliver
102
- assert_no_match /Request information/, ActionMailer::Base.deliveries.first.body
103
- end
104
-
105
- def test_body_does_append_request_if_append_is_called
106
- @advanced.deliver
107
- assert_match /Request information/, ActionMailer::Base.deliveries.last.body
108
- end
109
-
110
- def test_request_title_is_localized
111
- I18n.backend.store_translations(:en, :simple_form => { :request => { :title => 'Information about the request' } })
112
- @advanced.deliver
113
- assert_no_match /Request information/, ActionMailer::Base.deliveries.last.body
114
- assert_match /Information about the request/, ActionMailer::Base.deliveries.last.body
115
- end
116
-
117
- def test_request_info_attributes_are_printed
118
- @advanced.deliver
119
- assert_match /Remote ip/, ActionMailer::Base.deliveries.last.body
120
- assert_match /User agent/, ActionMailer::Base.deliveries.last.body
121
- end
122
-
123
- def test_request_info_attributes_are_localized
124
- I18n.backend.store_translations(:en, :simple_form => { :request => { :remote_ip => 'IP Address' } })
125
- @advanced.deliver
126
- assert_match /IP Address/, ActionMailer::Base.deliveries.last.body
127
- assert_no_match /Remote ip/, ActionMailer::Base.deliveries.last.body
128
- end
129
-
130
- def test_request_info_values_are_printed
131
- @advanced.deliver
132
- assert_match /0\.0\.0\.0/, ActionMailer::Base.deliveries.last.body
133
- assert_match /Rails Testing/, ActionMailer::Base.deliveries.last.body
134
- end
135
-
136
- def test_request_info_hashes_are_print_inside_lis
137
- @request.session = { :my => :session, :user => "data" }
138
- @advanced.deliver
139
- assert_match /<li>my: :session<\/li>/, ActionMailer::Base.deliveries.last.body
140
- assert_match /<li>user: &quot;data&quot;<\/li>/, ActionMailer::Base.deliveries.last.body
141
- end
142
-
143
- def test_error_is_raised_when_append_is_given_but_no_request_is_given
144
- assert_raise ScriptError do
145
- @advanced.request = nil
146
- @advanced.deliver
147
- end
148
- end
149
-
150
- def test_form_with_file_includes_an_attachment
151
- @with_file.deliver
152
-
153
- #For some reason I need to encode the mail before the attachments array returns values
154
- ActionMailer::Base.deliveries.first.to_s
155
- assert_equal 1, ActionMailer::Base.deliveries.first.attachments.size
156
- end
157
-
158
- def test_form_with_file_does_not_output_attachment_as_attribute
159
- @with_file.deliver
160
- assert_no_match /File/, ActionMailer::Base.deliveries.first.body
161
- end
162
-
163
- def test_form_with_customized_template_raise_missing_template_if_not_found
164
- assert_raise ActionView::MissingTemplate do
165
- @template.deliver
166
- end
167
- end
168
-
169
- def test_form_with_customized_template_render_correct_template
170
- begin
171
- default_template_root = SimpleForm::Notifier.template_root
172
- SimpleForm::Notifier.template_root = File.join(File.dirname(__FILE__), 'views')
173
- @template.deliver
174
- assert_match 'Hello from my cystom template!', ActionMailer::Base.deliveries.last.body
175
- ensure
176
- SimpleForm::Notifier.template_root = default_template_root
177
- end
178
- end
179
-
180
- def teardown
181
- I18n.reload!
182
- end
183
- end
@@ -1,64 +0,0 @@
1
- require 'test/unit'
2
- require 'rubygems'
3
-
4
- RAILS_ENV = ENV["RAILS_ENV"] = "test"
5
-
6
- require 'active_support'
7
- require 'active_support/test_case'
8
- require 'action_mailer'
9
- require 'action_controller/test_case'
10
-
11
- ActionMailer::Base.delivery_method = :test
12
-
13
- # Load respond_to before defining ApplicationController
14
- require File.dirname(__FILE__) + '/../lib/simple_form.rb'
15
-
16
- class ContactForm < SimpleForm
17
- recipients 'my.email@my.domain.com'
18
-
19
- attribute :name, :validate => true
20
- attribute :email, :validate => /[^@]+@[^\.]+\.[\w\.\-]+/
21
- attribute :nickname, :captcha => true
22
- attributes :tellphone, :message, :validate => :callback
23
-
24
- def callback
25
- @_callback_run = true
26
- end
27
- end
28
-
29
- class AdvancedForm < ContactForm
30
- append :remote_ip, :user_agent, :session
31
-
32
- recipients [ 'my.first@email.com', 'my.second@email.com' ]
33
- subject 'My Advanced Form'
34
- sender{|c| %{"#{c.name}" <#{c.email}>} }
35
- headers 'return-path' => 'mypath'
36
- end
37
-
38
- class FileForm < ContactForm
39
- attribute :file, :attachment => true, :validate => true
40
- recipients :set_recipient
41
-
42
- def set_recipient
43
- if file
44
- "contact_file@my.domain.com"
45
- else
46
- "contact@my.domain.com"
47
- end
48
- end
49
- end
50
-
51
- class NullRecipient < SimpleForm
52
- sender 'my.email@my.domain.com'
53
- end
54
-
55
- class TemplateForm < ContactForm
56
- template 'custom_template'
57
- end
58
-
59
- # Needed to correctly test an uploaded file
60
- class ActionController::TestUploadedFile
61
- def read
62
- @tempfile.read
63
- end
64
- end
@@ -1,30 +0,0 @@
1
- <h4 style="text-decoration:underline"><%=h @subject %></h4>
2
-
3
- <% @form.class.form_attributes.each do |attribute|
4
- value = @form.send(attribute)
5
- next if value.blank? %>
6
-
7
- <p><b><%= @form.class.human_attribute_name(attribute) %>:</b>
8
- <%= value.include?("\n") ? simple_format(h(value)) : h(value) %></p>
9
- <% end %>
10
-
11
- <% unless @form.class.form_appendable.blank? %>
12
- <br /><h4 style="text-decoration:underline"><%= I18n.t :title, :scope => [ :simple_form, :request ], :default => 'Request information' %></h4>
13
-
14
- <% @form.class.form_appendable.each do |attribute|
15
- value = @form.request.send(attribute)
16
-
17
- value = if value.is_a?(Hash) && !value.empty?
18
- content_tag(:ul, value.to_a.map{|k,v| content_tag(:li, h("#{k}: #{v.inspect}")) }.join("\n"), :style => "list-style:none;")
19
- elsif value.is_a?(String)
20
- h(value)
21
- else
22
- h(value.inspect)
23
- end
24
- %>
25
-
26
- <p><b><%= I18n.t attribute, :scope => [ :simple_form, :request ], :default => attribute.to_s.humanize %>:</b>
27
- <%= value.include?("\n") ? simple_format(value) : value %></p>
28
- <% end %>
29
- <br />
30
- <% end %>