mail_safe 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
data/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ *.sw?
2
+ .DS_Store
3
+ coverage
4
+ rdoc
5
+ pkg
data/README.rdoc CHANGED
@@ -10,36 +10,45 @@ with a note stating where the email was originally intended to go.
10
10
 
11
11
  == Download
12
12
 
13
- Github: http://github.com/myronmarston/mail_safe/tree/master
13
+ Github: http://github.com/myronmarston/mail_safe
14
14
 
15
15
  Gem:
16
- gem install myronmarston-mail_safe --source http://gems.github.com
16
+ gem install mail_safe --source http://gemcutter.org
17
17
 
18
- == Usage
18
+ == Installation
19
19
 
20
20
  Load the gem in your non-production environments using Rails' 2.1+ gem support. For example, I'm loading this in
21
21
  config/environments/development.rb and config/environments/staging.rb:
22
22
 
23
- config.gem 'myronmarston-mail_safe', :lib => 'mail_safe', :source => 'http://gems.github.com'
23
+ config.gem 'mail_safe', :source => 'http://gemcutter.org'
24
24
 
25
- Be sure not to load this in your production or test environment, otherwise, your emails won't be sent to the proper
26
- recipients. (The Rails test environment ensures that no emails are ever sent.)
25
+ IMPORTANT: Be sure not to load this in your production environment, otherwise, your emails won't be sent to the proper
26
+ recipients. In your test environment, you probably won't want this, either--rails ensures that no emails are ever sent in the
27
+ test environment, and tests that check outbound email recipients may fail.
27
28
 
28
- Next, configure mail safe. Create a file at config/initializers/mail_safe.rb, similar to the following:
29
+ == Configuration
30
+
31
+ In many cases, no configuration is necessary. If you have git installed, and you've registered your email address
32
+ with it (check with "git config user.email" in your shell), mail safe will use this. All emails will be sent to this address.
33
+
34
+ Otherwise, you can configure mail safe's behavior. Create a file at config/initializers/mail_safe.rb, similar to the following:
29
35
 
30
36
  if defined?(MailSafe::Config)
31
37
  MailSafe::Config.internal_address_definition = /.*@my-domain\.com/i
32
38
  MailSafe::Config.replacement_address = 'me@my-domain.com'
33
39
  end
34
40
 
35
- The internal address definition determines which addresses will be ignored (i.e. sent normally) and which will be replaced. Email being sent to internal
36
- addresses will be sent normally; all other email addresses will be replaced by the replacement address.
41
+ The internal address definition determines which addresses will be ignored (i.e. sent normally) and which will be replaced. Email
42
+ being sent to internal addresses will be sent normally; all other email addresses will be replaced by the replacement address.
37
43
 
38
44
  These settings can also take procs if you need something more flexible:
39
45
 
40
46
  if defined?(MailSafe::Config)
41
- # Emails sent to addresses longer than 15 characters long will be sent to the replacement address instead.
42
- MailSafe::Config.internal_address_definition = lambda { |address| address.size <= 15 }
47
+ MailSafe::Config.internal_address_definition = lambda { |address|
48
+ address =~ /.*@domain1\.com/i ||
49
+ address =~ /.*@domain2\.com/i ||
50
+ address == 'full-address@domain.com'
51
+ }
43
52
 
44
53
  # Useful if your mail server allows + dynamic email addresses like gmail.
45
54
  MailSafe::Config.replacement_address = lambda { |address| "my-address+#{address.gsub(/[\w\-.]/, '_')}@gmail.com" }
data/Rakefile ADDED
@@ -0,0 +1,62 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "mail_safe"
8
+ gem.summary = %Q{Keep your ActionMailer emails from escaping into the wild during development.}
9
+ gem.email = "myron.marston@gmail.com"
10
+ gem.homepage = "http://github.com/myronmarston/mail_safe"
11
+ gem.authors = ["Myron Marston"]
12
+
13
+ gem.add_dependency 'activesupport'
14
+ gem.add_dependency 'actionmailer'
15
+
16
+ gem.add_development_dependency 'Shoulda'
17
+ gem.add_development_dependency 'mocha'
18
+
19
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
20
+ end
21
+ rescue LoadError
22
+ puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
23
+ end
24
+
25
+ require 'rake/testtask'
26
+ Rake::TestTask.new(:test) do |test|
27
+ test.libs << 'lib' << 'test'
28
+ test.pattern = 'test/**/*_test.rb'
29
+ test.verbose = false
30
+ end
31
+
32
+ begin
33
+ require 'rcov/rcovtask'
34
+ Rcov::RcovTask.new do |test|
35
+ test.libs << 'test'
36
+ test.pattern = 'test/**/*_test.rb'
37
+ test.verbose = true
38
+ end
39
+ rescue LoadError
40
+ task :rcov do
41
+ abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
42
+ end
43
+ end
44
+
45
+
46
+ task :default => :test
47
+
48
+ require 'rake/rdoctask'
49
+ Rake::RDocTask.new do |rdoc|
50
+ if File.exist?('VERSION.yml')
51
+ config = YAML.load(File.read('VERSION.yml'))
52
+ version = "#{config[:major]}.#{config[:minor]}.#{config[:patch]}"
53
+ else
54
+ version = ""
55
+ end
56
+
57
+ rdoc.rdoc_dir = 'rdoc'
58
+ rdoc.title = "mail_safe #{version}"
59
+ rdoc.rdoc_files.include('README*')
60
+ rdoc.rdoc_files.include('lib/**/*.rb')
61
+ end
62
+
data/VERSION.yml CHANGED
@@ -1,4 +1,5 @@
1
1
  ---
2
- :minor: 1
3
- :patch: 0
4
2
  :major: 0
3
+ :minor: 2
4
+ :patch: 0
5
+ :build:
@@ -8,7 +8,9 @@ module MailSafe
8
8
  case internal_address_definition
9
9
  when Regexp then address =~ internal_address_definition
10
10
  when Proc then internal_address_definition.call(address)
11
- else raise InvalidConfigSettingError.new("internal_address_definition must be a Regexp or Proc, but was: #{internal_address_definition.class.to_s}")
11
+ else
12
+ return address.downcase == developer_email_address.downcase if developer_email_address
13
+ raise InvalidConfigSettingError.new("internal_address_definition must be a Regexp or Proc, but was: #{internal_address_definition.class.to_s}")
12
14
  end
13
15
  end
14
16
 
@@ -18,8 +20,22 @@ module MailSafe
18
20
  case replacement_address
19
21
  when String then replacement_address
20
22
  when Proc then replacement_address.call(original_address)
21
- else raise InvalidConfigSettingError.new("replacement_address must be a String or Proc, but was: #{replacement_address.class.to_s}")
23
+ else
24
+ return developer_email_address if developer_email_address
25
+ raise InvalidConfigSettingError.new("replacement_address must be a String or Proc, but was: #{replacement_address.class.to_s}")
22
26
  end
23
27
  end
28
+
29
+ def self.developer_email_address
30
+ unless defined?(@@developer_email_address)
31
+ @@developer_email_address = begin
32
+ `git config user.email`.chomp
33
+ rescue
34
+ nil
35
+ end
36
+ end
37
+
38
+ @@developer_email_address
39
+ end
24
40
  end
25
41
  end
data/mail_safe.gemspec ADDED
@@ -0,0 +1,69 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{mail_safe}
8
+ s.version = "0.2.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Myron Marston"]
12
+ s.date = %q{2009-11-06}
13
+ s.email = %q{myron.marston@gmail.com}
14
+ s.extra_rdoc_files = [
15
+ "LICENSE",
16
+ "README.rdoc"
17
+ ]
18
+ s.files = [
19
+ ".document",
20
+ ".gitignore",
21
+ "LICENSE",
22
+ "README.rdoc",
23
+ "Rakefile",
24
+ "VERSION.yml",
25
+ "lib/mail_safe.rb",
26
+ "lib/mail_safe/action_mailer.rb",
27
+ "lib/mail_safe/address_replacer.rb",
28
+ "lib/mail_safe/config.rb",
29
+ "mail_safe.gemspec",
30
+ "test/config_test.rb",
31
+ "test/mailer_test.rb",
32
+ "test/mailers/test_mailer.rb",
33
+ "test/test_helper.rb"
34
+ ]
35
+ s.homepage = %q{http://github.com/myronmarston/mail_safe}
36
+ s.rdoc_options = ["--charset=UTF-8"]
37
+ s.require_paths = ["lib"]
38
+ s.rubygems_version = %q{1.3.5}
39
+ s.summary = %q{Keep your ActionMailer emails from escaping into the wild during development.}
40
+ s.test_files = [
41
+ "test/config_test.rb",
42
+ "test/mailer_test.rb",
43
+ "test/mailers/test_mailer.rb",
44
+ "test/test_helper.rb"
45
+ ]
46
+
47
+ if s.respond_to? :specification_version then
48
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
49
+ s.specification_version = 3
50
+
51
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
52
+ s.add_runtime_dependency(%q<activesupport>, [">= 0"])
53
+ s.add_runtime_dependency(%q<actionmailer>, [">= 0"])
54
+ s.add_development_dependency(%q<Shoulda>, [">= 0"])
55
+ s.add_development_dependency(%q<mocha>, [">= 0"])
56
+ else
57
+ s.add_dependency(%q<activesupport>, [">= 0"])
58
+ s.add_dependency(%q<actionmailer>, [">= 0"])
59
+ s.add_dependency(%q<Shoulda>, [">= 0"])
60
+ s.add_dependency(%q<mocha>, [">= 0"])
61
+ end
62
+ else
63
+ s.add_dependency(%q<activesupport>, [">= 0"])
64
+ s.add_dependency(%q<actionmailer>, [">= 0"])
65
+ s.add_dependency(%q<Shoulda>, [">= 0"])
66
+ s.add_dependency(%q<mocha>, [">= 0"])
67
+ end
68
+ end
69
+
data/test/config_test.rb CHANGED
@@ -1,74 +1,177 @@
1
1
  require 'test_helper'
2
2
 
3
3
  class ConfigTest < Test::Unit::TestCase
4
- context 'When internal_address_definition is set to a regexp, #is_internal_address?' do
5
- setup do
6
- MailSafe::Config.internal_address_definition = /.*@example\.com/
4
+ context '#developer_email_address' do
5
+ teardown do
6
+ # clear class variable caching...
7
+ MailSafe::Config.class_eval do
8
+ remove_class_variable(:@@developer_email_address)
9
+ end
7
10
  end
8
11
 
9
- should 'return true if the address matches the regexp' do
10
- assert MailSafe::Config.is_internal_address?('someone@example.com')
11
- end
12
+ context 'when git is installed' do
13
+ setup do
14
+ backtick_call_count = 0
15
+ # mock out the ` method. I can't find a simpler way to do this with mocha.
16
+ Kernel.class_eval do
17
+ define_method '`'.to_sym do |cmd|
18
+ backtick_call_count += 1
19
+ return "too many calls" if backtick_call_count > 1
20
+ if cmd == 'git config user.email'
21
+ "developer@domain.com\n"
22
+ end
23
+ end
24
+ end
25
+ end
12
26
 
13
- should 'return false if the address does not match the regexp' do
14
- assert !MailSafe::Config.is_internal_address?('someone@another-domain.com')
15
- end
16
- end
27
+ should "guess the developer's email address using git" do
28
+ assert_equal 'developer@domain.com', MailSafe::Config.developer_email_address
29
+ end
17
30
 
18
- context 'When internal_address_definition is set to a lambda, #is_internal_address?' do
19
- setup do
20
- MailSafe::Config.internal_address_definition = lambda { |address| address.size < 15 }
31
+ should "cache the developer's email address so multiple system calls aren't made" do
32
+ assert_equal MailSafe::Config.developer_email_address, MailSafe::Config.developer_email_address
33
+ end
21
34
  end
22
35
 
23
- should 'return true if the lambda returns true for the given address' do
24
- assert MailSafe::Config.is_internal_address?('abc@foo.com')
25
- end
36
+ context 'when git is not installed' do
37
+ setup do
38
+ backtick_call_count = 0
39
+ # mock out the ` method. I can't find a simpler way to do this with mocha.
40
+ Kernel.class_eval do
41
+ define_method '`'.to_sym do |cmd|
42
+ backtick_call_count += 1
43
+ return "too many calls" if backtick_call_count > 1
44
+ if cmd == 'git config user.email'
45
+ raise RuntimeError.new("Git is not installed")
46
+ end
47
+ end
48
+ end
49
+ end
50
+
51
+ should "return nil" do
52
+ assert_nil MailSafe::Config.developer_email_address
53
+ end
26
54
 
27
- should 'return false if the lambda returns false for the given address' do
28
- assert !MailSafe::Config.is_internal_address?('a-long-address@example.com')
55
+ should "cache the developer's email address so multiple system calls aren't made" do
56
+ assert_equal MailSafe::Config.developer_email_address, MailSafe::Config.developer_email_address
57
+ end
29
58
  end
30
59
  end
31
60
 
32
- context 'When internal_address_definition is not set, #is_internal_address?' do
33
- setup do
34
- MailSafe::Config.internal_address_definition = nil
35
- end
61
+ context '#is_internal_address?' do
62
+ context 'when internal_address_definition is not set' do
63
+ setup do
64
+ MailSafe::Config.internal_address_definition = nil
65
+ end
66
+
67
+ context 'and #developer_email_address has a value' do
68
+ setup do
69
+ @developer_address = 'developer@domain.com'
70
+ MailSafe::Config.expects(:developer_email_address).at_least_once.returns(@developer_address)
71
+ end
72
+
73
+ should 'return true when passed the developer email address' do
74
+ assert MailSafe::Config.is_internal_address?(@developer_address)
75
+ end
76
+
77
+ should 'return true when passed the developer email address with different casing' do
78
+ assert MailSafe::Config.is_internal_address?(@developer_address.upcase)
79
+ end
36
80
 
37
- should 'raise an error' do
38
- assert_raise MailSafe::InvalidConfigSettingError do
39
- MailSafe::Config.is_internal_address?('abc@foo.com')
81
+ should 'return false when passed another email address' do
82
+ assert !MailSafe::Config.is_internal_address?('another-address@domain.com')
83
+ end
84
+ end
85
+
86
+ context 'and #developer_email_address has no value' do
87
+ setup do
88
+ MailSafe::Config.expects(:developer_email_address).returns(nil)
89
+ end
90
+
91
+ should 'raise an error' do
92
+ assert_raise MailSafe::InvalidConfigSettingError do
93
+ MailSafe::Config.is_internal_address?('abc@foo.com')
94
+ end
95
+ end
40
96
  end
41
97
  end
42
- end
43
98
 
44
- context 'When replacement_address is set to a string, #get_replacement_address' do
45
- setup do
46
- MailSafe::Config.replacement_address = 'me@mydomain.com'
99
+ context 'when internal_address_definition is set to a regexp' do
100
+ setup do
101
+ MailSafe::Config.internal_address_definition = /.*@example\.com/
102
+ end
103
+
104
+ should 'return true if the address matches the regexp' do
105
+ assert MailSafe::Config.is_internal_address?('someone@example.com')
106
+ end
107
+
108
+ should 'return false if the address does not match the regexp' do
109
+ assert !MailSafe::Config.is_internal_address?('someone@another-domain.com')
110
+ end
47
111
  end
48
112
 
49
- should 'return the configured replacement address' do
50
- assert_equal 'me@mydomain.com', MailSafe::Config.get_replacement_address('you@example.com')
113
+ context 'When internal_address_definition is set to a lambda, #is_internal_address?' do
114
+ setup do
115
+ MailSafe::Config.internal_address_definition = lambda { |address| address.size < 15 }
116
+ end
117
+
118
+ should 'return true if the lambda returns true for the given address' do
119
+ assert MailSafe::Config.is_internal_address?('abc@foo.com')
120
+ end
121
+
122
+ should 'return false if the lambda returns false for the given address' do
123
+ assert !MailSafe::Config.is_internal_address?('a-long-address@example.com')
124
+ end
51
125
  end
52
126
  end
53
127
 
54
- context 'When replacement_address is set to a proc, #get_replacement_address' do
55
- setup do
56
- MailSafe::Config.replacement_address = lambda { |address| "me+#{address.split('@').first}@mydomain.com" }
57
- end
128
+ context '#get_replacement_address' do
129
+ context 'when replacement_address is set to a string' do
130
+ setup do
131
+ MailSafe::Config.replacement_address = 'me@mydomain.com'
132
+ end
58
133
 
59
- should 'return the configured replacement address' do
60
- assert_equal 'me+you@mydomain.com', MailSafe::Config.get_replacement_address('you@example.com')
134
+ should 'return the configured replacement address' do
135
+ assert_equal 'me@mydomain.com', MailSafe::Config.get_replacement_address('you@example.com')
136
+ end
61
137
  end
62
- end
63
138
 
64
- context 'When replacement_address is not set, #get_replacement_address' do
65
- setup do
66
- MailSafe::Config.replacement_address = nil
139
+ context 'when replacement_address is set to a proc' do
140
+ setup do
141
+ MailSafe::Config.replacement_address = lambda { |address| "me+#{address.split('@').first}@mydomain.com" }
142
+ end
143
+
144
+ should 'return the configured replacement address' do
145
+ assert_equal 'me+you@mydomain.com', MailSafe::Config.get_replacement_address('you@example.com')
146
+ end
67
147
  end
68
148
 
69
- should 'raise an error' do
70
- assert_raise MailSafe::InvalidConfigSettingError do
71
- MailSafe::Config.get_replacement_address('you@example.com')
149
+ context 'when replacement_address is not set' do
150
+ setup do
151
+ MailSafe::Config.replacement_address = nil
152
+ end
153
+
154
+ context 'and #developer_email_address has a value' do
155
+ setup do
156
+ @developer_address = 'developer@domain.com'
157
+ MailSafe::Config.expects(:developer_email_address).at_least_once.returns(@developer_address)
158
+ end
159
+
160
+ should 'return the developer address' do
161
+ assert_equal @developer_address, MailSafe::Config.get_replacement_address('you@example.com')
162
+ end
163
+ end
164
+
165
+ context 'and #developer_email_address has no value' do
166
+ setup do
167
+ MailSafe::Config.expects(:developer_email_address).returns(nil)
168
+ end
169
+
170
+ should 'raise an error' do
171
+ assert_raise MailSafe::InvalidConfigSettingError do
172
+ MailSafe::Config.get_replacement_address('you@example.com')
173
+ end
174
+ end
72
175
  end
73
176
  end
74
177
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mail_safe
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Myron Marston
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-08-28 00:00:00 -07:00
12
+ date: 2009-11-06 00:00:00 -08:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -59,27 +59,30 @@ executables: []
59
59
  extensions: []
60
60
 
61
61
  extra_rdoc_files:
62
- - README.rdoc
63
62
  - LICENSE
63
+ - README.rdoc
64
64
  files:
65
+ - .document
66
+ - .gitignore
67
+ - LICENSE
65
68
  - README.rdoc
69
+ - Rakefile
66
70
  - VERSION.yml
71
+ - lib/mail_safe.rb
67
72
  - lib/mail_safe/action_mailer.rb
68
73
  - lib/mail_safe/address_replacer.rb
69
74
  - lib/mail_safe/config.rb
70
- - lib/mail_safe.rb
75
+ - mail_safe.gemspec
71
76
  - test/config_test.rb
72
77
  - test/mailer_test.rb
73
78
  - test/mailers/test_mailer.rb
74
79
  - test/test_helper.rb
75
- - LICENSE
76
80
  has_rdoc: true
77
81
  homepage: http://github.com/myronmarston/mail_safe
78
82
  licenses: []
79
83
 
80
84
  post_install_message:
81
85
  rdoc_options:
82
- - --inline-source
83
86
  - --charset=UTF-8
84
87
  require_paths:
85
88
  - lib
@@ -100,7 +103,10 @@ requirements: []
100
103
  rubyforge_project:
101
104
  rubygems_version: 1.3.5
102
105
  signing_key:
103
- specification_version: 2
106
+ specification_version: 3
104
107
  summary: Keep your ActionMailer emails from escaping into the wild during development.
105
- test_files: []
106
-
108
+ test_files:
109
+ - test/config_test.rb
110
+ - test/mailer_test.rb
111
+ - test/mailers/test_mailer.rb
112
+ - test/test_helper.rb