freezing_email 0.0.2
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.
- checksums.yaml +15 -0
- data/.coveralls.yml +1 -0
- data/.gitignore +17 -0
- data/.rspec +2 -0
- data/.travis.yml +9 -0
- data/Gemfile +6 -0
- data/LICENSE.txt +22 -0
- data/README.md +61 -0
- data/Rakefile +15 -0
- data/features/rspec_integration.feature +37 -0
- data/features/step_definitions/rails_steps.rb +13 -0
- data/features/support/env.rb +7 -0
- data/features/web_face.feature +19 -0
- data/freezed_emails/password_resets +1 -0
- data/freezing_email.gemspec +32 -0
- data/lib/freezing_email/config.rb +31 -0
- data/lib/freezing_email/mail.rb +16 -0
- data/lib/freezing_email/rspec.rb +22 -0
- data/lib/freezing_email/storage.rb +52 -0
- data/lib/freezing_email/version.rb +3 -0
- data/lib/freezing_email/web.rb +168 -0
- data/lib/freezing_email.rb +19 -0
- data/spec/fixtures/password_resets.yml +886 -0
- data/spec/lib/freezing_email/config_spec.rb +13 -0
- data/spec/lib/freezing_email/rspec_spec.rb +4 -0
- data/spec/lib/freezing_email/storage_spec.rb +58 -0
- data/spec/lib/freezing_email/web_spec.rb +32 -0
- data/spec/lib/freezing_email.rb +4 -0
- data/spec/spec_helper.rb +13 -0
- metadata +223 -0
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
YjMyYzY5ODc3OWM5NWQwZjk5YmViMWZkNDJmYmU4MDRjMjNhMDUyNQ==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
MWEzMzkzOWFmYWM2ODllOWEyMGM3NmFjMWVjZTA1MzZjZmFlNTkwOQ==
|
7
|
+
!binary "U0hBNTEy":
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
MTBkZDk5OTBkMTkyMGRkODg5N2MyZWE5N2Q5OTYzODBmMmJlNzVlMDQ4MmQ0
|
10
|
+
YzgxNzgzZDQzNzg4MTBiNzYxM2RhOWUzNGM3NmI5OTc2ODI1NDUzMTMyNmZm
|
11
|
+
ZGMwMWQxMDc1YzgwZDgyZDVmNmExYTM1ZDE4YTNmMGNjMTVmMTc=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
MDcyZGJhYzU4NjI2Yzg4NDgzMjljOGY0MDMyMmI1YTBlYzg3MGMzZWUyM2Fi
|
14
|
+
ZDJmZmM0YjM5NGZjNTlkNDViNTBlZDE1Mjk1NGE4ZDAzOGFlZjEzZGI1OWZl
|
15
|
+
ZTk1MjdmMDI1ODUyODVhZTMyN2Q2MjgwODU0ZDU2ZjBjYzM5MTU=
|
data/.coveralls.yml
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
service_name: travis-ci
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Andrew8xx8
|
2
|
+
|
3
|
+
MIT License
|
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
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
# FreezingEmail
|
2
|
+
[](https://travis-ci.org/kaize/freezing_email)
|
3
|
+
|
4
|
+
Saving email messages from your Rails app and view it later
|
5
|
+
|
6
|
+
## Installation
|
7
|
+
|
8
|
+
Add this line to your application's Gemfile:
|
9
|
+
|
10
|
+
```ruby
|
11
|
+
gem 'freezing_email'
|
12
|
+
```
|
13
|
+
|
14
|
+
And then execute:
|
15
|
+
|
16
|
+
```
|
17
|
+
$ bundle
|
18
|
+
```
|
19
|
+
|
20
|
+
## Usage
|
21
|
+
|
22
|
+
*Now supported only rspec integration*
|
23
|
+
|
24
|
+
### Rspec integration
|
25
|
+
|
26
|
+
Include `FreezingEmail::Rspec` in your rspec test in wich your want to
|
27
|
+
save email messages. Looks like this:
|
28
|
+
|
29
|
+
```ruby
|
30
|
+
describe UserMailer do
|
31
|
+
describe "password_reset" do
|
32
|
+
include FreezingEmail::Rspec
|
33
|
+
end
|
34
|
+
end
|
35
|
+
```
|
36
|
+
|
37
|
+
Then on each test FreezingEmail will save generated deliveres in it's
|
38
|
+
store folder.
|
39
|
+
|
40
|
+
### Configure store path
|
41
|
+
|
42
|
+
```ruby
|
43
|
+
FreezingEmail::Config[:store_path] = "your_sexy_dir"
|
44
|
+
```
|
45
|
+
|
46
|
+
### Viewing saved emails
|
47
|
+
|
48
|
+
To view saved emails, include this lines in your `routes.rb`:
|
49
|
+
|
50
|
+
```ruby
|
51
|
+
mount FreezingEmail::Web, at: "/freezed_emails", as: :freezing_email
|
52
|
+
```
|
53
|
+
|
54
|
+
|
55
|
+
## Contributing
|
56
|
+
|
57
|
+
1. Fork it
|
58
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
59
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
60
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
61
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
2
|
+
|
3
|
+
require 'rspec/core/rake_task'
|
4
|
+
require 'cucumber/rake/task'
|
5
|
+
|
6
|
+
RSpec::Core::RakeTask.new(:spec)
|
7
|
+
|
8
|
+
Cucumber::Rake::Task.new(:cucumber) do |t|
|
9
|
+
t.fork = true
|
10
|
+
t.cucumber_opts = ['--format', (ENV['CUCUMBER_FORMAT'] || 'progress')]
|
11
|
+
end
|
12
|
+
|
13
|
+
task test_suite: [:spec, :cucumber]
|
14
|
+
|
15
|
+
task default: :test_suite
|
@@ -0,0 +1,37 @@
|
|
1
|
+
Feature: Capture and save emails generated in rspec test
|
2
|
+
Background:
|
3
|
+
Given I successfully run `bundle exec rails new testapp --skip-bundle --skip-sprockets --skip-javascript`
|
4
|
+
And I cd to "testapp"
|
5
|
+
And I add "rspec-rails" as a dependency
|
6
|
+
And I add "factory_girl_rails" as a dependency
|
7
|
+
And I add "freezing_email" from this project as a dependency
|
8
|
+
And I successfully run `bundle install`
|
9
|
+
And I successfully run `bundle exec rails g rspec:install`
|
10
|
+
And I successfully run `bundle exec rails g controller password_resets new --no-test-framework`
|
11
|
+
And I successfully run `bundle exec rails g mailer user_mailer password_reset`
|
12
|
+
And I successfully run `bundle exec rails g model user email:string password_hash:string password_salt:string password_reset_token:string password_reset_sent_at:date`
|
13
|
+
And I successfully run `bundle exec rake db:migrate RAILS_ENV=test`
|
14
|
+
|
15
|
+
@disable-bundler
|
16
|
+
Scenario: Unsng FreezingEmail to capture emails in rspec test
|
17
|
+
When I write to "spec/mailers/user_mailer_spec.rb" with:
|
18
|
+
"""
|
19
|
+
require 'spec_helper'
|
20
|
+
|
21
|
+
describe UserMailer do
|
22
|
+
describe "password_reset" do
|
23
|
+
include FreezingEmail::Rspec
|
24
|
+
|
25
|
+
let(:user) { FactoryGirl.create(:user, :password_reset_token => "anything") }
|
26
|
+
let(:mail) { UserMailer.password_reset }
|
27
|
+
|
28
|
+
it "send user password reset url" do
|
29
|
+
mail.subject.should eq("Password reset")
|
30
|
+
mail.deliver
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
"""
|
35
|
+
When I successfully run `bundle exec rspec`
|
36
|
+
Then the output should contain "2 examples, 0 failures, 1 pending"
|
37
|
+
Then a file named "freezed_emails/password_resets.yml" should exist
|
@@ -0,0 +1,13 @@
|
|
1
|
+
When /^I add "([^"]+)" from this project as a dependency$/ do |gem_name|
|
2
|
+
append_to_file('Gemfile', %{gem "#{gem_name}", :path => "#{PROJECT_ROOT}"\n})
|
3
|
+
end
|
4
|
+
|
5
|
+
When /^I add "([^"]+)" as a dependency$/ do |gem_name|
|
6
|
+
append_to_file('Gemfile', %{gem "#{gem_name}"\n})
|
7
|
+
end
|
8
|
+
|
9
|
+
And /^I have allready freezed emails in 'freezed_emails' folder$/ do
|
10
|
+
create_dir("#{PROJECT_ROOT}/freezed_emails/")
|
11
|
+
|
12
|
+
write_file("#{PROJECT_ROOT}/freezed_emails/password_resets", File.expand_path("../../fixtures/password_resets", __FILE__))
|
13
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
Feature: Web face
|
2
|
+
Background:
|
3
|
+
Given I successfully run `bundle exec rails new testapp --skip-bundle --skip-sprockets --skip-javascript`
|
4
|
+
And I cd to "testapp"
|
5
|
+
And I add "freezing_email" from this project as a dependency
|
6
|
+
And I successfully run `bundle install`
|
7
|
+
And I have allready freezed emails in 'freezed_emails' folder
|
8
|
+
|
9
|
+
@disable-bundler
|
10
|
+
Scenario: Integrate FreezingEmail web face to Rails
|
11
|
+
When I write to "config/routes.rb" with:
|
12
|
+
"""
|
13
|
+
Testapp::Application.routes.draw do
|
14
|
+
mount FreezingEmail::Web, at: "/freezed_emails", as: :freezing_email
|
15
|
+
end
|
16
|
+
"""
|
17
|
+
When I successfully run `bundle exec rake routes`
|
18
|
+
Then the output should contain "/freezed_emails"
|
19
|
+
Then the output should contain "freezing_email"
|
@@ -0,0 +1 @@
|
|
1
|
+
/Users/8xx8/projects/freezing_email/features/fixtures/password_resets
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'freezing_email/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "freezing_email"
|
8
|
+
spec.version = FreezingEmail::VERSION
|
9
|
+
spec.authors = ["Andrew8xx8"]
|
10
|
+
spec.email = ["avk@8xx8.ru"]
|
11
|
+
spec.description = %q{Saving email messages from your Rails app and view it later}
|
12
|
+
spec.summary = %q{Saving email messages from your Rails app and view it later}
|
13
|
+
spec.homepage = "https://github.com/kaize/freezing_email"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_runtime_dependency "rails", "~> 3.2.0"
|
22
|
+
spec.add_runtime_dependency 'mail'
|
23
|
+
spec.add_runtime_dependency "sinatra"
|
24
|
+
spec.add_runtime_dependency "haml"
|
25
|
+
|
26
|
+
spec.add_development_dependency "rack"
|
27
|
+
spec.add_development_dependency "rake"
|
28
|
+
spec.add_development_dependency "rspec", "~> 2.6"
|
29
|
+
spec.add_development_dependency "cucumber", "~> 1.0.0"
|
30
|
+
spec.add_development_dependency "aruba"
|
31
|
+
spec.add_development_dependency "coveralls"
|
32
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
class FreezingEmail::Config
|
2
|
+
class << self
|
3
|
+
@@defaults = {
|
4
|
+
store_path: "freezed_emails"
|
5
|
+
}
|
6
|
+
|
7
|
+
def [](key)
|
8
|
+
raise FreezingEmail::ConfigEntryNotFound unless key_exists?(key) || defaults_exists?(key)
|
9
|
+
|
10
|
+
if key_exists?(key)
|
11
|
+
@config[key]
|
12
|
+
else
|
13
|
+
@@defaults[key]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def key_exists?(key)
|
18
|
+
@config && @config.has_key?(key)
|
19
|
+
end
|
20
|
+
|
21
|
+
def defaults_exists?(key)
|
22
|
+
@@defaults.has_key?(key)
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
def []=(key, value)
|
27
|
+
@config ||= {}
|
28
|
+
@config[key] = value
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class FreezingEmail::Mail
|
2
|
+
attr_reader :delivery_handler, :subject, :body, :from, :to, :generated_in
|
3
|
+
|
4
|
+
def initialize(mail, params)
|
5
|
+
@subject = mail.subject
|
6
|
+
@body = mail.body
|
7
|
+
@to = mail.to
|
8
|
+
@from = mail.from
|
9
|
+
@delivery_handler = mail.delivery_handler.to_s
|
10
|
+
@generated_in = params[:generated_in] if params.has_key?(:generated_in)
|
11
|
+
end
|
12
|
+
|
13
|
+
def name
|
14
|
+
@name ||= "#{@subject.parameterize.tableize}"
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module FreezingEmail::Rspec
|
2
|
+
extend ActiveSupport::Concern
|
3
|
+
|
4
|
+
included do
|
5
|
+
before(:all) do
|
6
|
+
FreezingEmail::Storage.cleanup
|
7
|
+
end
|
8
|
+
|
9
|
+
after(:each) do |example_group|
|
10
|
+
dir = FreezingEmail::Config[:store_path]
|
11
|
+
|
12
|
+
ActionMailer::Base.deliveries.each do |mail|
|
13
|
+
freezing_mail = FreezingEmail::Mail.new(mail, {
|
14
|
+
generated_in: example_group.example.description.to_s
|
15
|
+
})
|
16
|
+
|
17
|
+
FreezingEmail::Storage.save(freezing_mail.name, freezing_mail)
|
18
|
+
puts "FreezingEmail: Saved email #{freezing_mail.name}"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
class FreezingEmail::Storage
|
2
|
+
class << self
|
3
|
+
def cleanup(mask = "")
|
4
|
+
FileUtils.rm_rf(files_list(mask))
|
5
|
+
end
|
6
|
+
|
7
|
+
def index
|
8
|
+
emails = []
|
9
|
+
|
10
|
+
files_list.each do |file|
|
11
|
+
emails << load(file)
|
12
|
+
end
|
13
|
+
|
14
|
+
emails
|
15
|
+
end
|
16
|
+
|
17
|
+
def save(name, object)
|
18
|
+
File.open(expand_name(name), 'w') { |f| f.puts YAML::dump(object) }
|
19
|
+
end
|
20
|
+
|
21
|
+
def load(name)
|
22
|
+
file_name = expand_name(name)
|
23
|
+
if File.exists?(file_name)
|
24
|
+
YAML::load(IO.read(file_name))
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def dir
|
29
|
+
dir = FreezingEmail::Config[:store_path]
|
30
|
+
|
31
|
+
if defined?(Rails)
|
32
|
+
dir = Rails.root.join(dir)
|
33
|
+
end
|
34
|
+
|
35
|
+
Dir.mkdir(dir) unless Dir.exists?(dir)
|
36
|
+
|
37
|
+
dir
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def files_list(mask = "")
|
43
|
+
Dir.glob(File.join(dir, "#{mask}*.yml"))
|
44
|
+
end
|
45
|
+
|
46
|
+
def expand_name(name)
|
47
|
+
name = File.join(dir, "#{File.basename(name)}")
|
48
|
+
name = "#{name}.yml" unless File.extname(name) == ".yml"
|
49
|
+
name
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,168 @@
|
|
1
|
+
require 'sinatra/base'
|
2
|
+
|
3
|
+
require 'freezing_email'
|
4
|
+
|
5
|
+
module FreezingEmail
|
6
|
+
class Web < Sinatra::Base
|
7
|
+
enable :inline_templates
|
8
|
+
enable :reload_templates
|
9
|
+
|
10
|
+
helpers do
|
11
|
+
def root_path
|
12
|
+
"#{env['SCRIPT_NAME']}/"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
get '/' do
|
17
|
+
emails = FreezingEmail::Storage.index
|
18
|
+
haml :index, layout: :layout, locals: { emails: emails }
|
19
|
+
end
|
20
|
+
|
21
|
+
get '/:email_name/source' do
|
22
|
+
email = FreezingEmail::Storage.load(params[:email_name])
|
23
|
+
email.body.to_s
|
24
|
+
end
|
25
|
+
|
26
|
+
get '/:email_name/view' do
|
27
|
+
email = FreezingEmail::Storage.load(params[:email_name])
|
28
|
+
haml :email, layout: :layout, locals: { email: email }
|
29
|
+
end
|
30
|
+
|
31
|
+
run! if app_file == File.expand_path($0)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
__END__
|
36
|
+
|
37
|
+
@@ layout
|
38
|
+
%html
|
39
|
+
%head
|
40
|
+
%title
|
41
|
+
FreezingEmail - save emails for latter usage
|
42
|
+
%style
|
43
|
+
:plain
|
44
|
+
body {
|
45
|
+
background: url(data:image/png;base64,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)
|
46
|
+
}
|
47
|
+
.header-wrapper {
|
48
|
+
width: 100%;
|
49
|
+
height: 160px;
|
50
|
+
float: left;
|
51
|
+
clear: both;
|
52
|
+
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAACgCAYAAAAIJ5xTAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpGNzdGMTE3NDA3MjA2ODExQTg2OUEzMjZFRDRENTNBRCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoyMDNGRUM4MDYyMDMxMUUwQkIwN0YxNDMzRjIzRkEzOSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoyMDNGRUM3RjYyMDMxMUUwQkIwN0YxNDMzRjIzRkEzOSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjA1ODAxMTc0MDcyMDY4MTFBNjY3QUEwQTQ0NkUyQTY2IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkY3N0YxMTc0MDcyMDY4MTFBODY5QTMyNkVENEQ1M0FEIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+3i8uWwAAASNJREFUeNrs281KxDAUhuGJ3RSbhSjOzhtwaToK7XX1Anstrl1Ii3Qj8ZySinQmSR2cle+BjxDaPBzSn12M9353ibraXaiAgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgf8nbIyxXdftczeO4zgnV2qpqR0Xfd/fy1j9QaNVsAqdXEse27atvfeVHuM4lWEY5sSu61o11ArmvM+3kqemaQ4xPANXulaNYH0/O239TuJieAJeUBeMYr0/STwCZ9EsfgLejCbxFWx/i8Zw+wO2B6lz0CO8rutnQfca59zLFtRswG8kD2VZKuSnaXqT8VXyLvk8F15wfeHt8nVLPlLoVnj9w/IhyTKcxAI+qi8BBgDMnwnTi//sKgAAAABJRU5ErkJggg==) center top repeat-x;
|
53
|
+
}
|
54
|
+
.header {
|
55
|
+
width: 880px;
|
56
|
+
height: 160px;
|
57
|
+
margin: 0 auto;
|
58
|
+
position: relative;
|
59
|
+
text-align: center;
|
60
|
+
}
|
61
|
+
.header a, .header a:visited {
|
62
|
+
display: inline-block;
|
63
|
+
position: relative;
|
64
|
+
color: #fff;
|
65
|
+
text-shadow: 1px 1px 2px black, 0 0 11em;
|
66
|
+
text-decoration: none;
|
67
|
+
}
|
68
|
+
.header h1 {
|
69
|
+
font-size: 52px;
|
70
|
+
position: relative;
|
71
|
+
color: #fff;
|
72
|
+
}
|
73
|
+
.main-wrapper {
|
74
|
+
width: 100%;
|
75
|
+
height: 160px;
|
76
|
+
float: left;
|
77
|
+
clear: both;
|
78
|
+
}
|
79
|
+
.container, .email-meta {
|
80
|
+
font-family: arial;
|
81
|
+
-webkit-border-radius: 5px;
|
82
|
+
border-radius: 5px;
|
83
|
+
-webkit-box-shadow: inset 1px 1px 3px 1px rgba(0, 0, 0, 0.5);
|
84
|
+
box-shadow: inset 1px 1px 3px 1px rgba(0, 0, 0, 0.5);
|
85
|
+
width: 820px;
|
86
|
+
margin: 20px auto;
|
87
|
+
padding: 5px
|
88
|
+
}
|
89
|
+
.container-big {
|
90
|
+
margin: 30px auto;
|
91
|
+
min-height: 20px;
|
92
|
+
background: #FFF;
|
93
|
+
width: 100%
|
94
|
+
}
|
95
|
+
.email-list {
|
96
|
+
font-family: arial;
|
97
|
+
margin: 0;
|
98
|
+
padding: 0;
|
99
|
+
}
|
100
|
+
.email-list-item {
|
101
|
+
border-bottom: 1px solid rgb(57, 49, 45);
|
102
|
+
padding: 0;
|
103
|
+
margin: 0;
|
104
|
+
list-style: none;
|
105
|
+
}
|
106
|
+
.email-list-item a {
|
107
|
+
padding: 10px;
|
108
|
+
display: block;
|
109
|
+
color: #fff;
|
110
|
+
text-decoration: none
|
111
|
+
}
|
112
|
+
.email-list-item a:hover {
|
113
|
+
background: rgb(57, 49, 45);
|
114
|
+
}
|
115
|
+
.email-meta {
|
116
|
+
width: 500px;
|
117
|
+
margin: 10px auto;
|
118
|
+
color :#fff;
|
119
|
+
}
|
120
|
+
.email-meta th {
|
121
|
+
text-align: left;
|
122
|
+
}
|
123
|
+
.email-meta th, .email-meta td {
|
124
|
+
color :#fff;
|
125
|
+
font-family: arial;
|
126
|
+
margin: 1px;
|
127
|
+
padding: 2px 4px;
|
128
|
+
}
|
129
|
+
%body
|
130
|
+
.header-wrapper
|
131
|
+
%header.header
|
132
|
+
%a.logo{ href: root_path }
|
133
|
+
%h1
|
134
|
+
FreezingEmail's
|
135
|
+
.main-wrapper
|
136
|
+
= yield
|
137
|
+
|
138
|
+
@@ index
|
139
|
+
.container
|
140
|
+
%ul.email-list
|
141
|
+
- emails.each do |email|
|
142
|
+
%li.email-list-item
|
143
|
+
%a{ href: "#{root_path}#{email.name}/view" }
|
144
|
+
.email-head
|
145
|
+
= email.to
|
146
|
+
.email-subject
|
147
|
+
= email.subject.to_s
|
148
|
+
@@ email
|
149
|
+
.email-meta
|
150
|
+
%table{ cellpadding: "2px"}
|
151
|
+
%tr
|
152
|
+
%td
|
153
|
+
Subject
|
154
|
+
%td
|
155
|
+
= email.subject.to_s
|
156
|
+
%tr
|
157
|
+
%td
|
158
|
+
From
|
159
|
+
%td
|
160
|
+
= email.from
|
161
|
+
%tr
|
162
|
+
%td
|
163
|
+
To
|
164
|
+
%td
|
165
|
+
= email.to
|
166
|
+
|
167
|
+
.container-big
|
168
|
+
!= email.body.to_s
|