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 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
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format documentation
data/.travis.yml ADDED
@@ -0,0 +1,9 @@
1
+ language: ruby
2
+ env:
3
+ - TRAVIS=true
4
+ rvm:
5
+ - 1.9.3
6
+ - 2.0.0
7
+ branches:
8
+ only:
9
+ - master
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in freezing_email.gemspec
4
+ gemspec
5
+
6
+ gem 'pry'
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
+ [![Build Status](https://travis-ci.org/kaize/freezing_email.png?branch=master)](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,7 @@
1
+ require 'aruba/cucumber'
2
+
3
+ PROJECT_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..', '..')).freeze
4
+
5
+ Before do
6
+ @aruba_timeout_seconds = 3600
7
+ 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,3 @@
1
+ module FreezingEmail
2
+ VERSION = "0.0.2"
3
+ 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,iVBORw0KGgoAAAANSUhEUgAAADwAAABaCAYAAADkUTU1AAAQMUlEQVR4XnXcaZIkuQ2E0V6vpG0kjf5ovf9tepOBlo/2FTq6zMayKjKCBAGHu5OZPe//8/c///j+/fu79+/fv5vXjx8/vvv27du7+Zlrnz59Or/PtQ8fPrz7+vXruT7/zd+emevzrLHOQ6/n5vrcOz9z3/zM3z9+/Dj3zxwz3vw9/4nFWPO++b16dsaZ8b98+XLGEZ9x5j3jzbPv//23P/14mkxQFjEDz6DzMwPPgP2ZweZePyZxn3H2YiV23p9gZ54mQxLmvs+fP5/hO/fMM3NLXONw31noK6Hv//nbH86CTdKJm02Buc/Aqi67XmV2kiTQ+V2ljbPHs6AZf1d24pRUFWzlIU/Fm7y5f/4+C56AJkN+QFV2VXQGLCwlaiojONearFbeomXf68QgiTPeXBeX2LTXjLEXLta7sFdF51kLP5X+3z9+O9g0scHnJgEIfu4DnQ1v9/Q5sJZIVSkXgPjcW37onFDgHuPhBv1rcS1MEXfGnwU367BeAmr/mkRGkdYE0QSpUPtt7vUcsuk45QTVRIYWa7x53wIlRz+XaEuKp8LD0jLeCgh+rukJmetrKwPWntkEIkCIAsu5LnF+LzEqQtsEdD1X1LQ99f28TmFPD8M4SBXiFlG5cj9kIDoLrQSVD1xvQtpzgq+MqFblrqpifJWsxGqXovBCGpOqwskGKn/pbhOhV/ci6KNFCQSx7fbxPjLcpAcFU13wL8nO9fkbOvf4M672PMkYSINl2bjX9OfOop6xeM8LApm4T8Kqs4JXVXBssi0GkvT6bjHFmvuq3zjoypLBBYIQEMS5UQ+8tBB0Kl1Y/Cl4lStpGVOAEjLzkx6Lgpz5e0PatYmJfoulvX3WMRVmJZW+LKfH9EoH2hnGARJU1mUpBVcCMk7bRODt3Va/hsV82ggimlzFO6QF59yUbPpbn/b9Lg6EVch7NQcNEBG2RYoiiarT0hZYtxIHkU2S5NQan/j/9dc//qic0E++VvaRCiEvyemdzbIWRJ4EWdmYcWo5VQlvtFo2GZwYFla9ee0GQoFmvktss2DZxaRg2wqBVmFnAZ63cEEWEYLyTIOtnFk8VGFn9+vfSmH7WkXrHcoDp8JPgXFCZWh97D0bg0JYO5SJK1H11eUDcNTr2xIiNq8MigQUedugqPwp2mwPEVOFWgCyU1NSMtowwsbuBye6XkUgF5WR7rokpFoLPdvFtW3q4Arrg8Tx0vr1eM3XVhGdN6N0tuZCL8/AFqW6xtIOzTz4I8zyQHmDdNlNSTa0bWZu78/vevf6bSwt83sB3SwIhKFQAbqL8PRhyammpO7pSSFqXCpx5LMyVqeGWGtUSBOkHR2WtTJi9Q/hCM59M3GPdsgSmajmSmjHMK5FQRhiK9kY0wL36QhUqXBRVo66xmMqizB+xZqCrgGwSMEJuosFxy6w2g3OtaIWjY2xb8eohM3vdVniEqsCXpaeAYk7SdA/+hh0NzNuBJjYq4Vct/M6MGySqrET7DYT4Kxt5u8aFwusnNH4HhScBT8xZ6FXr9s+0hc9kqGbJm6PIY5KytyHrUEbOkqEVQPWV0GMYR1UZ15BXxyHpTU2WRLYZbZXRWpQGJCyoMSQiCayxqOy0cW1h9vXlcHyTc/RSlTItE7vpwVrbBWy4S+8SwgWrI8mk3iguy29061n2b3zkbvawyf0ISSV3OTYv5u407b//f0vl6V/5XZUp71c2BRKFmPx+5naz5JO+xlR0XFttPWd05NUxKV3kaXnzuLHaQmynrgSQ3qe5AjEsCodr9NCGu7tWXUdnPl7IjrjQhvOqDL0XjLZ9+2t7+aB03KTN9oH4A4q1UlJ6NlTWdoiVQ1PeG73KiUw3tyPeKBKG0CAMZEcF9a4r5Q64rHgJ09aEmr29JydCbbUzxKDFEtQtazdaKjmPoQgR8a6uvr6cMAYTfbW8JOAqfCWi3nYImQJkZSdq41lSQtucBboeT27UVOtVu22V3mGdygCIEqVzXfnnR6uVuoZWsnhyHwJapsVumgRZdM+X49dphVkUdbTkRm3hGZMi1SUvei2yfXS1WIib3GS0KPWGbQyVM1ue2ytbB9yV61qTzMktH0smRCCayDM3K2w5898Pnkg+ha+9asb87otOi0ZpEFbYHhEI/uqJfvtQXOLRXsxLB2jbVP9bzv0cODIUi2inp1JSUZhhUwkAEMKWIY3C9dOgrQz6Xl2y4vENXDJNWf1GYnReXPsPfw5tdSndUOgBdbEvBKwzce2khap2gz/3GeuQrCwrAOjr90x1RNU+ub3oglaLr/M5gFU9EW3ZvW31dxmkjwVOtCBD7pvrn4yIU5L9K2D+EJdr/ebAK4VUYpVtbmObxY8N8se2IA0iGPyai9Y18pZwNzXvgY5LEtX67Se+KMnJaxi/blEdlcknp/gPJ9ajJfWJyWusvD8XsbcCJAkTI0hQb4yZK6ybS0hvgBF1XIdYvRvvXpRVxTNdfp9DwCaDX1axiXcKj4DyLhWMKgFWrAEtMogaxx96DxMwF1EibTEhwdaCHzi9TL7VJjQ0zSTFM4llCan7Ow5k5Q8mAQVqR0tElSw0lP9V+kSWF1giVQBxH7ax7d4mhFGo1UFa0xrQtltgHU2TZrxjK+6kKSvm3jjd48MMWX6GhFcUEXBLQfSMwC4VNz1Ce1FWCpZ61h5aS8jpfa1JLSfnzYL5EsyjWtBXpkYkC6b9wOAw0MD6bohD7cvBGggC92Mi/R2tsvwM1bZHVwFW4LbrQOiPRQsbGmweAv768Gx9NzUA3Y7HoMgnKIBBDe7t5qSVEg2gd3xuMc1i9cC3XZi+X7FgbxifUxfnrkftSCVQqtyU/iBmAWzhfRPhXlbpDjXW6UZRxXZS+wseIVokvo1CW0m7lpMKIXa015TYcxWuCEx2UYs1c8+x2g0MJXu50Ky3vGQVNHTtpAE5qLvKUrd1ROfQMlZMEia2AQGFhzWK0RAfle1hFbZ0c94w5xleYmCqqf3IEDLQNEmX9xwx/T5MH0zeLNkoeBSWBZeWLTEY7wZ/4kjyJy9NR2uppekjF3nVw5pG87cWtX1ewBQNwRa/TS+max3ngAuXNaHa63Qk0GRjDqokptxLb52sg6tG5VtcLTg3f31A/Fmp5vuQt4Alaj2LWh5BV1up5DrPVvTFcACunF42ujXQnb3J+mSdTcP7VM9d2Hw+kZeF4NhQZ+NfMOIrzOoPidREofEuv92zSI2B0iwVpPM7s6MX5t8Cucg3uLau6X4smGZet9vQXpRcBt2zIdFIUokVsdHVytjSJKT0h7mVVHxnfOs2R6OlwaRNngfaMZ5Uu+DXuVGpgVqw4DsCj8sr0rITQKQlOv9+KQVtbASZgn1Mr1v06J5md/7XwH07Ek1IKFwVSHaWa31nuD0Gcm6/ZZPLfW+KnNdEiUuzIwTKq13t8Tt0Kx5yDGKxbRXy4SVrMKx/eeeee3JhIULujzSY5ynxEIU1KigRBSJRdTp4UpS/azBvP6qp7cbsxDPlakhiZwJVOXaKhJVkzLB9/thOKIJ6GbF2iT1/jOe7YAwo4oIVLYRF8mSDLuSbtTbBk8Vaf9KRKFoTD2pdco5WhE5lZ3f7AbnIN6EhScY1JqBdYPRf7ZiW5YkiJPCBd2N1QdLfFm3SlB2705Lz5Y77pYw//zneulZtAzKTvt3+2dJ4obKkpza3EOO5hrrKTnljOpmE992mTG4P9WdOUhR+9cY5gL9+23a9kVPDgVZQ6/CzEaNwUwgMFs28oQcu+k3rorWK1sMD9BCSHC3hZi88e9Wux+1lDFRe79SsI0HkiD8slyJKqSq15JoQWXx/q5Xuym55PP6iiSIFxV7I6K6Jzb/UAs5GVwVVUtvkhbvl6QKqXmO4VBR8N6sXobWw02chatmz6ncXxR1k7F9wz211MO0sB63lL8tX9m8/rj9C2IW0UPB6mfdVY9e557ujjzDoytClQQiu54zv1NLA+7MIhsB9LXBdrIJvMGU8fWo75Js+TBmPXb7FOsj0fZoFQUqwPnaWh+XekMvgCwWrm0sRFUYiehl11UajEFPIlVVwjqPBTQWvr8LNXf7ufLIf58YfCDeD8HAQLbL0IU6CMt6oVp9Nl49dOWkvFEHtltJVWt29nmZJFEE7XAT6evD7cVWo4lQneoeYgJVveN6TcNPBLK+ZCqorfmSB307gdBZVi/pIstzn+0hugcVryazPcO+glf9/c07rVBjUp8882HYbv7fSMjr4KFIk+z2smS37zePQMX9Ni152Wyt8npuC76JBeo+ZNSEzTXkWFiac65JNLdWYpzfOSxStj9QVxgOS0Euan1Pq5Voz9aUtz/0hgX3o1PZtdhqcuFY57QD3K5Kq0gs/oDMIk5iQLzO7s1uSe8YrNuysiKS6UCg1lZgPVVLhVWJDa1FFawFeg8CxVhSahIVS7t43rj3k4ftj2vPmn33cWZlUj0E1tVwrFxD0CpuRu5eHGL6sUydoS0h+Gs7aFCY49B8ubQQ6T4TjMuEnBMNLbwxKWYso7cH51kypp9rfgS/9faST/5tc62kxErS3kMfHS5ReECg+9BOrzc4E6oAEyHoBiH7qqsH93XMe7/2+5Iw7N6trPnEoXjQ6P17pgVmZTT7TlUhHT0E73vVvRnnyY2VuVUAIuoDMHAlEpPjlXoCn4Qgx21k3iTCp4e1kLLOD3cAv7unSdoMrEoWVaf1RC5NSGPo0aw5ah0lqO/VESrMSaB/MN2eahZLBJsouh0UgMphyXnec6BNEwvjoqXvS1p3aThjrvV4FsqMu789eJLoC+I0y2DdnrWfVaa7JvCS6QliH634uz1bN2QMzF5lkPTqOvRJpsX3lGWeQ7pXLh3TVm56To2dQb4TFAmVnboo47Znn9Ak4XV0uKX92mtNkqrimC2zEHIrLBPIY/7eXzyTMbIkyG4UZHKzr0C3g1JJzCpZlTcGBbzpfe8turSHJFjTianf4lFNEFJB1a0md7GFzv48h9PZLF75k9z2JlUgS4LuOVv5pcnYO7jed52WRRXasrbPpFSP8WD6KyftxRJZGVXV93maZ4u2IqF8A22qWUsKJSp+nFY/EC/5zE3s5e6l7liwcxm3/bg3/bwwebOQ7X3bJn1GsiuLjfuJ7N4803+ZpvT6sIRV19LqqQ4GJSkmIRtl6SKniZUoMOanQV18El5i4qeNgSs8Ay1vvk3b71uZZPfGpfecVpRw3E++qo3Q0CS4b284jFkDUrNRv082uztjfTlG4735/2lt11SWK0O32iW2ni4WZj0NKXrqrKCpNrAWtXralqqnru3FSTMGX3Dm6BfTZKhE0C1eJUUw87ohbu9axpYA78l4yQaEC0vwl3Dz4gZc4Nmak3kG218e8n9MM3D7xgOOTbirpwzv/Sup0eMqRFNnUU5TsD02r3noAUCtKagbH0K8VvYK/zfbQ8xI2PVjTUQra1GVCRneVcK0ZWXzWPBm6lbLAjxjnKLR8zx+k8I93v9jmiw0i80WTQNrxLOrg1ho81OPlUEL4/YvxOk/LcH9WUwdIb1t1fGStfwfLCucCAbuttsAAAAASUVORK5CYII=)
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