mailcannon 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +7 -4
- data/.ruby-version +1 -1
- data/.travis.yml +1 -1
- data/.yardopts +3 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +22 -0
- data/Rakefile +10 -0
- data/Readme.md +6 -2
- data/ReadmeContributors.md +20 -0
- data/lib/mailcannon/adapter.rb +4 -1
- data/lib/mailcannon/adapters/sendgrid_web.rb +111 -0
- data/lib/mailcannon/envelope.rb +33 -11
- data/lib/mailcannon/event.rb +1 -0
- data/lib/mailcannon/mail.rb +2 -1
- data/lib/mailcannon/stamp.rb +6 -2
- data/lib/mailcannon/version.rb +2 -1
- data/lib/mailcannon/workers/{single_barrel.rb → barrel.rb} +3 -2
- data/lib/mailcannon.rb +5 -9
- data/mailcannon.gemspec +2 -1
- data/spec/factories/envelope.rb +40 -3
- data/spec/factories/stamp.rb +0 -1
- data/spec/fixtures/cassettes/mailcannon_adapter_sendgrid.send.yml +1 -1
- data/spec/fixtures/cassettes/mailcannon_adapter_sendgrid_send.yml +1 -1
- data/spec/fixtures/cassettes/mailcannon_adapter_sendgrid_send_bulk.yml +36 -0
- data/spec/fixtures/cassettes/mailcannon_integration_1k.yml +36 -0
- data/spec/integration/1k_spec.rb +10 -0
- data/spec/mailcannon/adapters/sendgrid_spec.rb +10 -2
- data/spec/mailcannon/envelope_spec.rb +1 -1
- data/spec/spec_helper.rb +11 -2
- metadata +29 -9
- data/lib/mailcannon/adapters/sendgrid.rb +0 -44
- data/lib/mailcannon/workers/multi_barrel.rb +0 -11
- data/spec/factories/mail.rb +0 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 36ee9ad3e66d2643ea8c836320032d2c4bbcf9e1
|
4
|
+
data.tar.gz: ab5103437e1bfa9d43eec27014dfcc43590af0c4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 05c4f51be1809c2ce8c0960216c4392a3214d4dc0c8de368db77ec36482ca13f8ce91ac4779e6233d15eaf3181792a4bd8a77e659353a3584b177f1e5ac09b3b
|
7
|
+
data.tar.gz: ee3bc50462bcf0e27a8fabe9ee2c63f500f30b4063dcf997ac3551d5883a43140027945386e8a225b11531c0c342935460099d027ec1582fb4eb9cd39564df72
|
data/.gitignore
CHANGED
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
2.0.0-p353
|
data/.travis.yml
CHANGED
data/.yardopts
ADDED
data/Gemfile
CHANGED
@@ -4,14 +4,19 @@ gem 'redis'
|
|
4
4
|
gem 'mongoid'
|
5
5
|
gem 'sidekiq'
|
6
6
|
gem 'sendgrid_webapi'
|
7
|
+
#gem 'sendgrid_toolkit'
|
7
8
|
gem 'librato-metrics'
|
8
9
|
gem 'rubysl', platform: :rbx
|
9
10
|
gem 'jruby-openssl', platform: :jruby
|
11
|
+
#for SendgridWeb adapter
|
12
|
+
gem "yajl-ruby", :platforms=>[:rbx,:ruby]
|
13
|
+
gem "json-schema"
|
10
14
|
|
11
15
|
group :development do
|
12
16
|
gem 'rake'
|
13
17
|
gem 'pry'
|
14
18
|
gem 'pry-nav'
|
19
|
+
gem 'yard'
|
15
20
|
end
|
16
21
|
|
17
22
|
group :test do
|
@@ -22,4 +27,5 @@ group :test do
|
|
22
27
|
gem 'factory_girl'
|
23
28
|
gem 'vcr'
|
24
29
|
gem 'webmock', '>= 1.8.0', '< 1.16'
|
30
|
+
gem 'coveralls', platform: :ruby, require: false
|
25
31
|
end
|
data/Gemfile.lock
CHANGED
@@ -13,7 +13,14 @@ GEM
|
|
13
13
|
celluloid (0.15.2)
|
14
14
|
timers (~> 1.1.0)
|
15
15
|
coderay (1.0.9)
|
16
|
+
colorize (0.5.8)
|
16
17
|
connection_pool (1.2.0)
|
18
|
+
coveralls (0.6.7)
|
19
|
+
colorize
|
20
|
+
multi_json (~> 1.3)
|
21
|
+
rest-client
|
22
|
+
simplecov (>= 0.7)
|
23
|
+
thor
|
17
24
|
crack (0.4.1)
|
18
25
|
safe_yaml (~> 0.9.0)
|
19
26
|
database_cleaner (1.2.0)
|
@@ -25,11 +32,13 @@ GEM
|
|
25
32
|
ffi2-generators (0.1.1)
|
26
33
|
i18n (0.6.9)
|
27
34
|
json (1.8.1)
|
35
|
+
json-schema (2.1.8)
|
28
36
|
librato-metrics (1.3.0)
|
29
37
|
aggregate (~> 0.2.2)
|
30
38
|
faraday (~> 0.7)
|
31
39
|
multi_json
|
32
40
|
method_source (0.8.1)
|
41
|
+
mime-types (1.23)
|
33
42
|
mongoid (3.1.6)
|
34
43
|
activemodel (~> 3.2)
|
35
44
|
moped (~> 1.4)
|
@@ -49,6 +58,8 @@ GEM
|
|
49
58
|
redis (3.0.6)
|
50
59
|
redis-namespace (1.4.1)
|
51
60
|
redis (~> 3.0.4)
|
61
|
+
rest-client (1.6.7)
|
62
|
+
mime-types (>= 1.16)
|
52
63
|
rspec (2.13.0)
|
53
64
|
rspec-core (~> 2.13.0)
|
54
65
|
rspec-expectations (~> 2.13.0)
|
@@ -269,21 +280,30 @@ GEM
|
|
269
280
|
json
|
270
281
|
redis (>= 3.0.4)
|
271
282
|
redis-namespace (>= 1.3.1)
|
283
|
+
simplecov (0.7.1)
|
284
|
+
multi_json (~> 1.0)
|
285
|
+
simplecov-html (~> 0.7.1)
|
286
|
+
simplecov-html (0.7.1)
|
272
287
|
slop (3.4.5)
|
288
|
+
thor (0.18.1)
|
273
289
|
timers (1.1.0)
|
274
290
|
tzinfo (0.3.38)
|
275
291
|
vcr (2.8.0)
|
276
292
|
webmock (1.15.2)
|
277
293
|
addressable (>= 2.2.7)
|
278
294
|
crack (>= 0.3.2)
|
295
|
+
yajl-ruby (1.2.0)
|
296
|
+
yard (0.8.6.2)
|
279
297
|
|
280
298
|
PLATFORMS
|
281
299
|
ruby
|
282
300
|
|
283
301
|
DEPENDENCIES
|
302
|
+
coveralls
|
284
303
|
database_cleaner
|
285
304
|
factory_girl
|
286
305
|
jruby-openssl
|
306
|
+
json-schema
|
287
307
|
librato-metrics
|
288
308
|
mongoid
|
289
309
|
pry
|
@@ -298,3 +318,5 @@ DEPENDENCIES
|
|
298
318
|
sidekiq
|
299
319
|
vcr
|
300
320
|
webmock (>= 1.8.0, < 1.16)
|
321
|
+
yajl-ruby
|
322
|
+
yard
|
data/Rakefile
CHANGED
@@ -6,6 +6,16 @@ RSpec::Core::RakeTask.new
|
|
6
6
|
|
7
7
|
task :default => :travis
|
8
8
|
|
9
|
+
task :environment do
|
10
|
+
require './spec/spec_helper'
|
11
|
+
end
|
12
|
+
|
13
|
+
desc 'Opens a Pry/IRB session with the environment loaded'
|
14
|
+
task :console => :environment do
|
15
|
+
#gotcha!
|
16
|
+
binding.pry
|
17
|
+
end
|
18
|
+
|
9
19
|
task :travis do
|
10
20
|
["rake spec", "rake build"].each do |cmd|
|
11
21
|
puts "Starting to run #{cmd}..."
|
data/Readme.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
[![Gem version](https://badge.fury.io/rb/mailcannon.png)](http://rubygems.org/gems/mailcannon) [![Code Climate](https://codeclimate.com/github/lucasmartins/mailcannon.png)](https://codeclimate.com/github/lucasmartins/mailcannon) [![Build Status](https://travis-ci.org/lucasmartins/mailcannon.png?branch=master)](https://travis-ci.org/lucasmartins/mailcannon) [![Dependency Status](https://gemnasium.com/lucasmartins/mailcannon.png)](https://gemnasium.com/lucasmartins/mailcannon)
|
1
|
+
[![Gem version](https://badge.fury.io/rb/mailcannon.png)](http://rubygems.org/gems/mailcannon) [![Code Climate](https://codeclimate.com/github/lucasmartins/mailcannon.png)](https://codeclimate.com/github/lucasmartins/mailcannon) [![Build Status](https://travis-ci.org/lucasmartins/mailcannon.png?branch=master)](https://travis-ci.org/lucasmartins/mailcannon) [![Coverage Status](https://coveralls.io/repos/lucasmartins/mailcannon/badge.png)](https://coveralls.io/r/lucasmartins/mailcannon) [![Dependency Status](https://gemnasium.com/lucasmartins/mailcannon.png)](https://gemnasium.com/lucasmartins/mailcannon) [![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/lucasmartins/mailcannon/trend.png)](https://bitdeli.com/free "Bitdeli Badge")
|
2
2
|
|
3
3
|
MailCannon
|
4
4
|
==========
|
@@ -43,6 +43,10 @@ Edit the file to meet your environemnt needs.
|
|
43
43
|
|
44
44
|
Check the [specs](https://github.com/lucasmartins/mailcannon/tree/master/spec) to see the testing example, it will surely make it clearer.
|
45
45
|
|
46
|
+
Docs
|
47
|
+
====
|
48
|
+
You should check the [factories](https://github.com/lucasmartins/mailcannon/tree/master/spec/factories) to learn what you need to build your objects, and the [tests](https://github.com/lucasmartins/mailcannon/tree/master/spec/mailcannon) to learn how to use them. But hey, we have docs [right here](http://rdoc.info/github/lucasmartins/mailcannon/master/frames).
|
49
|
+
|
46
50
|
Contribute
|
47
51
|
==========
|
48
52
|
|
@@ -58,4 +62,4 @@ This is an opensource project so don't expect premium support, but don't be shy,
|
|
58
62
|
License
|
59
63
|
=======
|
60
64
|
|
61
|
-
MailCannon is free software under the [
|
65
|
+
MailCannon is free software under the [FreeBSD license](http://www.freebsd.org/copyright/freebsd-license.html).
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# Instructions for contributors
|
2
|
+
|
3
|
+
Prepare your dev env by setting the environment variables:
|
4
|
+
|
5
|
+
```
|
6
|
+
$ cp env.sample.sh env.sample
|
7
|
+
$ vim env.sh # change it to your needs
|
8
|
+
$ . ./env.sh # will load your dev env vars.
|
9
|
+
```
|
10
|
+
|
11
|
+
I miss Pry when I'm on [Rubinius](http://rubini.us/), so I do write the code on MRI and test on Rubinius once in a while. You will find that [Travis](https://travis-ci.org/) is your friend.
|
12
|
+
|
13
|
+
# Roadmap
|
14
|
+
|
15
|
+
- Rake task for creating all the indexes;
|
16
|
+
- Routing core;
|
17
|
+
- MapReduce for campaign deliverability statistics;
|
18
|
+
- Sidekiq recurrent job to run updates on MapReduce;
|
19
|
+
- Load testing;
|
20
|
+
- Stats Reports - (readonly) JSON HTTP API;
|
data/lib/mailcannon/adapter.rb
CHANGED
@@ -1,9 +1,12 @@
|
|
1
|
+
# Provides an Interface for implementing an Adapter. Adapters are supposed to handle communication with the email service (ie: Sendgrid) and to be included by MailCannon::Envelope. MailCannon::Envelope attributes should be accessed to figure out what to send to the email service.
|
1
2
|
module MailCannon::Adapter
|
2
|
-
|
3
3
|
module InstanceMethods
|
4
|
+
# Sends an Envelope with 1 recipient.
|
4
5
|
def send!
|
5
6
|
raise 'Not available for this adapter!'
|
6
7
|
end
|
8
|
+
|
9
|
+
# Sends an Envelope with multiple recipients.
|
7
10
|
def send_bulk!
|
8
11
|
raise 'Not available for this adapter!'
|
9
12
|
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
require 'json-schema'
|
2
|
+
# Provides the Sendgrid Web API Adapter, refer to http://sendgrid.com/docs/API_Reference/Web_API/mail.html
|
3
|
+
module MailCannon::Adapter::SendgridWeb
|
4
|
+
include MailCannon::Adapter
|
5
|
+
module InstanceMethods
|
6
|
+
def send!
|
7
|
+
validate_envelope!
|
8
|
+
if self.to.size>1
|
9
|
+
response = send_multiple_emails
|
10
|
+
else
|
11
|
+
response = send_single_email
|
12
|
+
end
|
13
|
+
self.after_sent(successfully_sent?(response))
|
14
|
+
return response
|
15
|
+
end
|
16
|
+
|
17
|
+
def send_bulk!
|
18
|
+
self.send! # send! does bulk too!
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.included(receiver)
|
23
|
+
receiver.send :include, InstanceMethods
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
def api_client
|
28
|
+
client = SendGridWebApi::Client.new(ENV['SENDGRID_USERNAME'], ENV['SENDGRID_PASSWORD'])
|
29
|
+
end
|
30
|
+
|
31
|
+
def validate_envelope!
|
32
|
+
raise "Invalid Document! #{self.errors.messages}" unless self.valid?
|
33
|
+
end
|
34
|
+
|
35
|
+
def prepare_xsmtpapi!
|
36
|
+
validate_envelope!
|
37
|
+
self.xsmtpapi = build_xsmtpapi({'to'=>self.to},{'sub'=>self.substitutions})
|
38
|
+
validate_xsmtpapi!
|
39
|
+
end
|
40
|
+
|
41
|
+
def build_xsmtpapi(recipients,subs)
|
42
|
+
xsmtpapi = {}
|
43
|
+
to = []
|
44
|
+
recipients['to'].each do |h|
|
45
|
+
to.push h[:email]
|
46
|
+
end
|
47
|
+
xsmtpapi.merge!({'to' => to})
|
48
|
+
xsmtpapi.merge!(subs) if subs!=nil && subs.is_a?(Hash)
|
49
|
+
return xsmtpapi
|
50
|
+
end
|
51
|
+
|
52
|
+
def validate_xsmtpapi!
|
53
|
+
return true
|
54
|
+
if self.to.size>1
|
55
|
+
if xsmtpapi['sub']
|
56
|
+
xsmtpapi['sub'].each do |sub|
|
57
|
+
raise 'sub[Array] must match to[Array] size!' unless sub.size==xsmtpapi['to'].size
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
=begin
|
62
|
+
schema = {
|
63
|
+
"type" => "object",
|
64
|
+
"required" => ["to"],
|
65
|
+
"properties" => {
|
66
|
+
"to" => {"type" => "array", "default" => [self.to.first]}
|
67
|
+
}
|
68
|
+
}
|
69
|
+
JSON::Validator.validate!(schema, self.xsmtpapi)
|
70
|
+
=end
|
71
|
+
end
|
72
|
+
|
73
|
+
def send_single_email
|
74
|
+
api_client.mail.send(
|
75
|
+
:to => self.to.first[:email],
|
76
|
+
:toname => self.to.first[:name],
|
77
|
+
:subject => self.subject,
|
78
|
+
:text => self.mail.text,
|
79
|
+
:html => self.mail.html,
|
80
|
+
:from => self.from,
|
81
|
+
:fromname => self.from_name,
|
82
|
+
:bcc => self.bcc,
|
83
|
+
:replyto => self.reply_to
|
84
|
+
)
|
85
|
+
end
|
86
|
+
|
87
|
+
def send_multiple_emails
|
88
|
+
prepare_xsmtpapi!
|
89
|
+
|
90
|
+
api_client.mail.send(
|
91
|
+
:to => self.from,
|
92
|
+
#:toname => self.to.first[:name],
|
93
|
+
:subject => self.subject,
|
94
|
+
:text => self.mail.text,
|
95
|
+
:html => self.mail.html,
|
96
|
+
:from => self.from,
|
97
|
+
:fromname => self.from_name,
|
98
|
+
:bcc => self.bcc,
|
99
|
+
:replyto => self.reply_to,
|
100
|
+
:"x-smtpapi" => self.xsmtpapi.to_json
|
101
|
+
)
|
102
|
+
end
|
103
|
+
|
104
|
+
def successfully_sent?(response)
|
105
|
+
if response['message']=='success'
|
106
|
+
true
|
107
|
+
else
|
108
|
+
false
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
data/lib/mailcannon/envelope.rb
CHANGED
@@ -1,34 +1,47 @@
|
|
1
|
+
# Where the magic happens, the Envelope is responsible for keeping the information necessary to send the email(s) and holding the Stamps related to mailing Events.
|
1
2
|
class MailCannon::Envelope
|
2
3
|
include Mongoid::Document
|
3
4
|
include Mongoid::Timestamps
|
4
|
-
include MailCannon::Adapter::
|
5
|
+
include MailCannon::Adapter::SendgridWeb
|
5
6
|
|
6
|
-
|
7
|
-
|
7
|
+
embeds_one :mail
|
8
|
+
embeds_many :stamps
|
8
9
|
|
10
|
+
field :group_id, type: Bignum # create sparse Index for this field, put this in RDoc
|
9
11
|
field :from, type: String
|
10
12
|
field :from_name, type: String
|
11
|
-
field :to, type:
|
12
|
-
field :to_name, type:
|
13
|
+
field :to, type: Array # of hashes
|
14
|
+
field :to_name, type: Array # strings
|
15
|
+
field :substitutions, type: Hash # of hashes
|
13
16
|
field :subject, type: String
|
14
17
|
field :bcc, type: String
|
15
18
|
field :reply_to, type: String
|
16
19
|
field :date, type: Date
|
17
|
-
field :xsmtpapi, type: Hash
|
20
|
+
field :xsmtpapi, type: Hash # this will mostly be used by MailCannon itself. http://sendgrid.com/docs/API_Reference/SMTP_API/index.html
|
18
21
|
|
19
22
|
validates :from, :to, :subject, :mail, presence: true
|
20
23
|
validates_associated :mail
|
21
24
|
|
22
|
-
after_create
|
23
|
-
|
24
|
-
|
25
|
+
after_create :post_envelope!
|
26
|
+
|
27
|
+
# Post this Envelope!
|
28
|
+
def post_envelope!
|
29
|
+
self.save if self.changed?
|
30
|
+
self.stamp! MailCannon::Event::New.stamp
|
31
|
+
if validate_xsmtpapi(self.xsmtpapi)
|
32
|
+
MailCannon::Barrel.perform_async(self.id)
|
33
|
+
else
|
34
|
+
raise 'Invalid xsmtpapi hash!'
|
35
|
+
end
|
25
36
|
end
|
26
|
-
|
37
|
+
|
38
|
+
# Stamp this Envelope with code.
|
27
39
|
def stamp!(code)
|
28
40
|
self.class.valid_code_kind?(code)
|
29
41
|
self.stamps << MailCannon::Stamp.from_code(code)
|
30
42
|
end
|
31
43
|
|
44
|
+
# Callback to be run after the Envelope has been processed.
|
32
45
|
def after_sent(response)
|
33
46
|
if response
|
34
47
|
stamp!(MailCannon::Event::Processed.stamp)
|
@@ -43,5 +56,14 @@ class MailCannon::Envelope
|
|
43
56
|
raise 'code must be an Integer, MailCannon::Event::*, or MailCannon::Stamp !'
|
44
57
|
end
|
45
58
|
end
|
59
|
+
|
60
|
+
def validate_xsmtpapi(xsmtpapi)
|
61
|
+
return true # TODO write tests for this method
|
62
|
+
if xsmtpapi['to'].is_a? Array
|
63
|
+
true
|
64
|
+
else
|
65
|
+
false
|
66
|
+
end
|
67
|
+
end
|
46
68
|
|
47
|
-
end
|
69
|
+
end
|
data/lib/mailcannon/event.rb
CHANGED
data/lib/mailcannon/mail.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
|
+
# Holds the content of the email, this will be destroyed once the Envelope has been processed.
|
1
2
|
class MailCannon::Mail
|
2
3
|
include Mongoid::Document
|
3
4
|
include Mongoid::Timestamps
|
4
5
|
|
5
|
-
|
6
|
+
embedded_in :envelope#, index: true
|
6
7
|
|
7
8
|
field :text, type: String
|
8
9
|
field :html, type: String
|
data/lib/mailcannon/stamp.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# Holds information about a recipient's email event, like deliveries and bounces.
|
1
2
|
class MailCannon::Stamp
|
2
3
|
include Mongoid::Document
|
3
4
|
include Mongoid::Timestamps
|
@@ -5,13 +6,16 @@ class MailCannon::Stamp
|
|
5
6
|
belongs_to :envelope, index: true
|
6
7
|
|
7
8
|
field :code, type: Integer, default: 0
|
9
|
+
field :recipient # email address for this "notification"
|
10
|
+
validates :code, :envelope, presence: true
|
8
11
|
|
9
|
-
|
10
|
-
|
12
|
+
# Returns the Event for this Stamp.
|
11
13
|
def event
|
12
14
|
MailCannon::Event.from_code(self.code)
|
13
15
|
end
|
14
16
|
|
17
|
+
# Creates a Stamp from an Event code.
|
18
|
+
# @param code Can be either an Integer, a MailCannon::Event or the MailCannon::Stamp itself.
|
15
19
|
def self.from_code(code)
|
16
20
|
if code.is_a? Fixnum
|
17
21
|
return MailCannon::Stamp.new({code: code})
|
data/lib/mailcannon/version.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
|
-
|
1
|
+
# This worker handles Envelopes dispatch
|
2
|
+
class MailCannon::Barrel
|
2
3
|
include Sidekiq::Worker
|
3
4
|
|
4
5
|
def perform(envelope_id)
|
5
6
|
aggregator = Librato::Metrics::Aggregator.new
|
6
|
-
aggregator.time 'mailcannon.
|
7
|
+
aggregator.time 'mailcannon.barrel.perform' do
|
7
8
|
envelope_id = envelope_id['$oid'] if envelope_id['$oid']
|
8
9
|
puts "sending MailCannon::Envelope.find('#{envelope_id}')"
|
9
10
|
|
data/lib/mailcannon.rb
CHANGED
@@ -14,25 +14,19 @@ end
|
|
14
14
|
Encoding.default_internal = "utf-8"
|
15
15
|
Encoding.default_external = "utf-8"
|
16
16
|
|
17
|
-
#Adds a way to retrieve Submodules of a Module, used for CustomContentParsers
|
18
|
-
class Module
|
19
|
-
def submodules
|
20
|
-
constants.collect {|const_name| const_get(const_name)}.select {|const| const.class == Module}
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
17
|
module MailCannon
|
25
18
|
require_relative 'mailcannon/adapter'
|
26
|
-
require_relative 'mailcannon/adapters/
|
19
|
+
require_relative 'mailcannon/adapters/sendgrid_web'
|
27
20
|
require_relative 'mailcannon/envelope'
|
28
21
|
require_relative 'mailcannon/mail'
|
29
22
|
require_relative 'mailcannon/stamp'
|
30
23
|
require_relative 'mailcannon/event'
|
31
|
-
require_relative 'mailcannon/workers/
|
24
|
+
require_relative 'mailcannon/workers/barrel'
|
32
25
|
require_relative 'mailcannon/version'
|
33
26
|
|
34
27
|
self.warmode if ENV['MAILCANNON_MODE']=='war'
|
35
28
|
|
29
|
+
# To be used with caution
|
36
30
|
def self.warmode
|
37
31
|
Bundler.require(:default)
|
38
32
|
Mongoid.load!("config/mongoid.yml", ENV['RACK_ENV']) # change to env URL
|
@@ -41,10 +35,12 @@ module MailCannon
|
|
41
35
|
$redis = Redis.new(host: redis_uri.host, port: redis_uri.port)
|
42
36
|
end
|
43
37
|
|
38
|
+
# Returns the config Hash
|
44
39
|
def self.config(root_dir=nil)
|
45
40
|
@config ||= load_config(root_dir)
|
46
41
|
end
|
47
42
|
|
43
|
+
# Loads the config Hash from the YAML
|
48
44
|
def self.load_config(root_dir=nil)
|
49
45
|
root_dir ||= Pathname.new(Dir.pwd)
|
50
46
|
|
data/mailcannon.gemspec
CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |s|
|
|
10
10
|
s.authors = ["Lucas Martins"]
|
11
11
|
s.email = ["lucasmartins@railsnapraia.com"]
|
12
12
|
s.homepage = "http://rubygems.org/gems/mailcannon"
|
13
|
-
s.summary = "
|
13
|
+
s.summary = "A mass mailing tool for real threads aficionados"
|
14
14
|
s.description = s.summary
|
15
15
|
s.license = "MIT"
|
16
16
|
|
@@ -29,5 +29,6 @@ Gem::Specification.new do |s|
|
|
29
29
|
s.add_development_dependency "rake"
|
30
30
|
s.add_development_dependency "pry"
|
31
31
|
s.add_development_dependency "pry-nav"
|
32
|
+
s.add_development_dependency "yard"
|
32
33
|
end
|
33
34
|
|
data/spec/factories/envelope.rb
CHANGED
@@ -1,8 +1,45 @@
|
|
1
1
|
FactoryGirl.define do
|
2
2
|
factory :envelope, class: MailCannon::Envelope do
|
3
|
-
from '
|
4
|
-
to '
|
3
|
+
from 'mailcannon@railsonthebeach.com'
|
4
|
+
to [{email: 'mailcannon@railsnapraia.com', name: 'Mail Cannon'}]
|
5
5
|
subject 'Test'
|
6
|
-
mail
|
6
|
+
mail MailCannon::Mail.new(text: "Hello %name%, If you can't read the HTML content, you're screwed!", html: "<html><body><p>%name%,<br/><br/>You should see what happens when your email client can't read HTML content.</p></body></html>")
|
7
|
+
|
8
|
+
factory :envelope_multi, class: MailCannon::Envelope do
|
9
|
+
from 'mailcannon@railsonthebeach.com'
|
10
|
+
to [
|
11
|
+
{email: 'mailcannon@railsnapraia.com', name: 'Mail Cannon'},
|
12
|
+
{email: 'lucasmartins@railsnapraia.com', name: 'Lucas Martins'},
|
13
|
+
{email: 'contact@railsonthebeach.com', name: 'Contact'}
|
14
|
+
]
|
15
|
+
hash = {"%name%"=>['Mail Cannon','Lucas Martins','Contact']}
|
16
|
+
substitutions hash
|
17
|
+
subject 'Test'
|
18
|
+
end
|
19
|
+
|
20
|
+
factory :envelope_multi_1k, class: MailCannon::Envelope do
|
21
|
+
mails = []
|
22
|
+
source = 'lucasmartins+#@railsnapraia.com'
|
23
|
+
1000.times.each do |i|
|
24
|
+
mails.push source.gsub('#',i.to_s)
|
25
|
+
end
|
26
|
+
|
27
|
+
names = []
|
28
|
+
source = 'Lucas Martins #'
|
29
|
+
1000.times.each do |i|
|
30
|
+
names.push source.gsub('#',i.to_s)
|
31
|
+
end
|
32
|
+
|
33
|
+
to_array = []
|
34
|
+
1000.times.each do |i|
|
35
|
+
to_array.push({name: names[i], email: mails[i]})
|
36
|
+
end
|
37
|
+
|
38
|
+
from 'mailcannon@railsonthebeach.com'
|
39
|
+
to to_array
|
40
|
+
hash = {"%name%"=>names}
|
41
|
+
substitutions hash
|
42
|
+
subject 'Test'
|
43
|
+
end
|
7
44
|
end
|
8
45
|
end
|
data/spec/factories/stamp.rb
CHANGED
@@ -5,7 +5,7 @@ http_interactions:
|
|
5
5
|
uri: https://sendgrid.com/api/mail.send.json
|
6
6
|
body:
|
7
7
|
encoding: US-ASCII
|
8
|
-
string: to=lucasmartins%40railsnapraia.com&toname&subject=Test&text=If+you+can%27t+read+the+HTML+content%2C+you%27re+screwed%21&html=%3Chtml%3E%3Cbody%3E%3Cp%3EYou+should+see+what+happens+when+your+email+client+can%27t+read+HTML+content.%3C%2Fp%3E%3C%2Fbody%3E%3C%2Fhtml%3E&from=test%40mailcannon.com&fromname&bcc&replyto
|
8
|
+
string: to=lucasmartins%40railsnapraia.com&toname&subject=Test&text=If+you+can%27t+read+the+HTML+content%2C+you%27re+screwed%21&html=%3Chtml%3E%3Cbody%3E%3Cp%3EYou+should+see+what+happens+when+your+email+client+can%27t+read+HTML+content.%3C%2Fp%3E%3C%2Fbody%3E%3C%2Fhtml%3E&from=test%40mailcannon.com&fromname&bcc&replyto
|
9
9
|
headers:
|
10
10
|
User-Agent:
|
11
11
|
- Faraday v0.8.8
|
@@ -5,7 +5,7 @@ http_interactions:
|
|
5
5
|
uri: https://sendgrid.com/api/mail.send.json
|
6
6
|
body:
|
7
7
|
encoding: US-ASCII
|
8
|
-
string: to=lucasmartins%40railsnapraia.com&toname&subject=Test&text=If+you+can%27t+read+the+HTML+content%2C+you%27re+screwed%21&html=%3Chtml%3E%3Cbody%3E%3Cp%3EYou+should+see+what+happens+when+your+email+client+can%27t+read+HTML+content.%3C%2Fp%3E%3C%2Fbody%3E%3C%2Fhtml%3E&from=test%40mailcannon.com&fromname&bcc&replyto
|
8
|
+
string: to=lucasmartins%40railsnapraia.com&toname&subject=Test&text=If+you+can%27t+read+the+HTML+content%2C+you%27re+screwed%21&html=%3Chtml%3E%3Cbody%3E%3Cp%3EYou+should+see+what+happens+when+your+email+client+can%27t+read+HTML+content.%3C%2Fp%3E%3C%2Fbody%3E%3C%2Fhtml%3E&from=test%40mailcannon.com&fromname&bcc&replyto
|
9
9
|
headers:
|
10
10
|
User-Agent:
|
11
11
|
- Faraday v0.8.8
|
@@ -0,0 +1,36 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: post
|
5
|
+
uri: https://sendgrid.com/api/mail.send.json
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: to=mailcannon%40railsonthebeach.com&subject=Test&text=Hello+%25name%25%2C+If+you+can%27t+read+the+HTML+content%2C+you%27re+screwed%21&html=%3Chtml%3E%3Cbody%3E%3Cp%3E%25name%25%2C%3Cbr%2F%3E%3Cbr%2F%3EYou+should+see+what+happens+when+your+email+client+can%27t+read+HTML+content.%3C%2Fp%3E%3C%2Fbody%3E%3C%2Fhtml%3E&from=mailcannon%40railsonthebeach.com&fromname&bcc&replyto&x-smtpapi=%7B%22to%22%3A%5B%22mailcannon%40railsnapraia.com%22%2C%22lucasmartins%40railsnapraia.com%22%2C%22contact%40railsonthebeach.com%22%5D%2C%22sub%22%3A%7B%22%25name%25%22%3A%5B%22Mail+Cannon%22%2C%22Lucas+Martins%22%2C%22Contact%22%5D%7D%7D
|
9
|
+
headers:
|
10
|
+
User-Agent:
|
11
|
+
- Faraday v0.8.8
|
12
|
+
Accept-Encoding:
|
13
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
14
|
+
Accept:
|
15
|
+
- '*/*'
|
16
|
+
response:
|
17
|
+
status:
|
18
|
+
code: 200
|
19
|
+
message: OK
|
20
|
+
headers:
|
21
|
+
Server:
|
22
|
+
- nginx/1.4.2
|
23
|
+
Date:
|
24
|
+
- Sat, 04 Jan 2014 17:10:46 GMT
|
25
|
+
Content-Type:
|
26
|
+
- application/json
|
27
|
+
Transfer-Encoding:
|
28
|
+
- chunked
|
29
|
+
Connection:
|
30
|
+
- keep-alive
|
31
|
+
body:
|
32
|
+
encoding: UTF-8
|
33
|
+
string: '{"message":"success"}'
|
34
|
+
http_version:
|
35
|
+
recorded_at: Sat, 04 Jan 2014 17:10:41 GMT
|
36
|
+
recorded_with: VCR 2.8.0
|
@@ -0,0 +1,36 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: post
|
5
|
+
uri: https://sendgrid.com/api/mail.send.json
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: to=mailcannon%40railsonthebeach.com&subject=Test&text=Hello+%25name%25%2C+If+you+can%27t+read+the+HTML+content%2C+you%27re+screwed%21&html=%3Chtml%3E%3Cbody%3E%3Cp%3E%25name%25%2C%3Cbr%2F%3E%3Cbr%2F%3EYou+should+see+what+happens+when+your+email+client+can%27t+read+HTML+content.%3C%2Fp%3E%3C%2Fbody%3E%3C%2Fhtml%3E&from=mailcannon%40railsonthebeach.com&fromname&bcc&replyto&x-smtpapi=%7B%22to%22%3A%5B%22lucasmartins%2B0%40railsnapraia.com%22%2C%22lucasmartins%2B1%40railsnapraia.com%22%2C%22lucasmartins%2B2%40railsnapraia.com%22%2C%22lucasmartins%2B3%40railsnapraia.com%22%2C%22lucasmartins%2B4%40railsnapraia.com%22%2C%22lucasmartins%2B5%40railsnapraia.com%22%2C%22lucasmartins%2B6%40railsnapraia.com%22%2C%22lucasmartins%2B7%40railsnapraia.com%22%2C%22lucasmartins%2B8%40railsnapraia.com%22%2C%22lucasmartins%2B9%40railsnapraia.com%22%2C%22lucasmartins%2B10%40railsnapraia.com%22%2C%22lucasmartins%2B11%40railsnapraia.com%22%2C%22lucasmartins%2B12%40railsnapraia.com%22%2C%22lucasmartins%2B13%40railsnapraia.com%22%2C%22lucasmartins%2B14%40railsnapraia.com%22%2C%22lucasmartins%2B15%40railsnapraia.com%22%2C%22lucasmartins%2B16%40railsnapraia.com%22%2C%22lucasmartins%2B17%40railsnapraia.com%22%2C%22lucasmartins%2B18%40railsnapraia.com%22%2C%22lucasmartins%2B19%40railsnapraia.com%22%2C%22lucasmartins%2B20%40railsnapraia.com%22%2C%22lucasmartins%2B21%40railsnapraia.com%22%2C%22lucasmartins%2B22%40railsnapraia.com%22%2C%22lucasmartins%2B23%40railsnapraia.com%22%2C%22lucasmartins%2B24%40railsnapraia.com%22%2C%22lucasmartins%2B25%40railsnapraia.com%22%2C%22lucasmartins%2B26%40railsnapraia.com%22%2C%22lucasmartins%2B27%40railsnapraia.com%22%2C%22lucasmartins%2B28%40railsnapraia.com%22%2C%22lucasmartins%2B29%40railsnapraia.com%22%2C%22lucasmartins%2B30%40railsnapraia.com%22%2C%22lucasmartins%2B31%40railsnapraia.com%22%2C%22lucasmartins%2B32%40railsnapraia.com%22%2C%22lucasmartins%2B33%40railsnapraia.com%22%2C%22lucasmartins%2B34%40railsnapraia.com%22%2C%22lucasmartins%2B35%40railsnapraia.com%22%2C%22lucasmartins%2B36%40railsnapraia.com%22%2C%22lucasmartins%2B37%40railsnapraia.com%22%2C%22lucasmartins%2B38%40railsnapraia.com%22%2C%22lucasmartins%2B39%40railsnapraia.com%22%2C%22lucasmartins%2B40%40railsnapraia.com%22%2C%22lucasmartins%2B41%40railsnapraia.com%22%2C%22lucasmartins%2B42%40railsnapraia.com%22%2C%22lucasmartins%2B43%40railsnapraia.com%22%2C%22lucasmartins%2B44%40railsnapraia.com%22%2C%22lucasmartins%2B45%40railsnapraia.com%22%2C%22lucasmartins%2B46%40railsnapraia.com%22%2C%22lucasmartins%2B47%40railsnapraia.com%22%2C%22lucasmartins%2B48%40railsnapraia.com%22%2C%22lucasmartins%2B49%40railsnapraia.com%22%2C%22lucasmartins%2B50%40railsnapraia.com%22%2C%22lucasmartins%2B51%40railsnapraia.com%22%2C%22lucasmartins%2B52%40railsnapraia.com%22%2C%22lucasmartins%2B53%40railsnapraia.com%22%2C%22lucasmartins%2B54%40railsnapraia.com%22%2C%22lucasmartins%2B55%40railsnapraia.com%22%2C%22lucasmartins%2B56%40railsnapraia.com%22%2C%22lucasmartins%2B57%40railsnapraia.com%22%2C%22lucasmartins%2B58%40railsnapraia.com%22%2C%22lucasmartins%2B59%40railsnapraia.com%22%2C%22lucasmartins%2B60%40railsnapraia.com%22%2C%22lucasmartins%2B61%40railsnapraia.com%22%2C%22lucasmartins%2B62%40railsnapraia.com%22%2C%22lucasmartins%2B63%40railsnapraia.com%22%2C%22lucasmartins%2B64%40railsnapraia.com%22%2C%22lucasmartins%2B65%40railsnapraia.com%22%2C%22lucasmartins%2B66%40railsnapraia.com%22%2C%22lucasmartins%2B67%40railsnapraia.com%22%2C%22lucasmartins%2B68%40railsnapraia.com%22%2C%22lucasmartins%2B69%40railsnapraia.com%22%2C%22lucasmartins%2B70%40railsnapraia.com%22%2C%22lucasmartins%2B71%40railsnapraia.com%22%2C%22lucasmartins%2B72%40railsnapraia.com%22%2C%22lucasmartins%2B73%40railsnapraia.com%22%2C%22lucasmartins%2B74%40railsnapraia.com%22%2C%22lucasmartins%2B75%40railsnapraia.com%22%2C%22lucasmartins%2B76%40railsnapraia.com%22%2C%22lucasmartins%2B77%40railsnapraia.com%22%2C%22lucasmartins%2B78%40railsnapraia.com%22%2C%22lucasmartins%2B79%40railsnapraia.com%22%2C%22lucasmartins%2B80%40railsnapraia.com%22%2C%22lucasmartins%2B81%40railsnapraia.com%22%2C%22lucasmartins%2B82%40railsnapraia.com%22%2C%22lucasmartins%2B83%40railsnapraia.com%22%2C%22lucasmartins%2B84%40railsnapraia.com%22%2C%22lucasmartins%2B85%40railsnapraia.com%22%2C%22lucasmartins%2B86%40railsnapraia.com%22%2C%22lucasmartins%2B87%40railsnapraia.com%22%2C%22lucasmartins%2B88%40railsnapraia.com%22%2C%22lucasmartins%2B89%40railsnapraia.com%22%2C%22lucasmartins%2B90%40railsnapraia.com%22%2C%22lucasmartins%2B91%40railsnapraia.com%22%2C%22lucasmartins%2B92%40railsnapraia.com%22%2C%22lucasmartins%2B93%40railsnapraia.com%22%2C%22lucasmartins%2B94%40railsnapraia.com%22%2C%22lucasmartins%2B95%40railsnapraia.com%22%2C%22lucasmartins%2B96%40railsnapraia.com%22%2C%22lucasmartins%2B97%40railsnapraia.com%22%2C%22lucasmartins%2B98%40railsnapraia.com%22%2C%22lucasmartins%2B99%40railsnapraia.com%22%2C%22lucasmartins%2B100%40railsnapraia.com%22%2C%22lucasmartins%2B101%40railsnapraia.com%22%2C%22lucasmartins%2B102%40railsnapraia.com%22%2C%22lucasmartins%2B103%40railsnapraia.com%22%2C%22lucasmartins%2B104%40railsnapraia.com%22%2C%22lucasmartins%2B105%40railsnapraia.com%22%2C%22lucasmartins%2B106%40railsnapraia.com%22%2C%22lucasmartins%2B107%40railsnapraia.com%22%2C%22lucasmartins%2B108%40railsnapraia.com%22%2C%22lucasmartins%2B109%40railsnapraia.com%22%2C%22lucasmartins%2B110%40railsnapraia.com%22%2C%22lucasmartins%2B111%40railsnapraia.com%22%2C%22lucasmartins%2B112%40railsnapraia.com%22%2C%22lucasmartins%2B113%40railsnapraia.com%22%2C%22lucasmartins%2B114%40railsnapraia.com%22%2C%22lucasmartins%2B115%40railsnapraia.com%22%2C%22lucasmartins%2B116%40railsnapraia.com%22%2C%22lucasmartins%2B117%40railsnapraia.com%22%2C%22lucasmartins%2B118%40railsnapraia.com%22%2C%22lucasmartins%2B119%40railsnapraia.com%22%2C%22lucasmartins%2B120%40railsnapraia.com%22%2C%22lucasmartins%2B121%40railsnapraia.com%22%2C%22lucasmartins%2B122%40railsnapraia.com%22%2C%22lucasmartins%2B123%40railsnapraia.com%22%2C%22lucasmartins%2B124%40railsnapraia.com%22%2C%22lucasmartins%2B125%40railsnapraia.com%22%2C%22lucasmartins%2B126%40railsnapraia.com%22%2C%22lucasmartins%2B127%40railsnapraia.com%22%2C%22lucasmartins%2B128%40railsnapraia.com%22%2C%22lucasmartins%2B129%40railsnapraia.com%22%2C%22lucasmartins%2B130%40railsnapraia.com%22%2C%22lucasmartins%2B131%40railsnapraia.com%22%2C%22lucasmartins%2B132%40railsnapraia.com%22%2C%22lucasmartins%2B133%40railsnapraia.com%22%2C%22lucasmartins%2B134%40railsnapraia.com%22%2C%22lucasmartins%2B135%40railsnapraia.com%22%2C%22lucasmartins%2B136%40railsnapraia.com%22%2C%22lucasmartins%2B137%40railsnapraia.com%22%2C%22lucasmartins%2B138%40railsnapraia.com%22%2C%22lucasmartins%2B139%40railsnapraia.com%22%2C%22lucasmartins%2B140%40railsnapraia.com%22%2C%22lucasmartins%2B141%40railsnapraia.com%22%2C%22lucasmartins%2B142%40railsnapraia.com%22%2C%22lucasmartins%2B143%40railsnapraia.com%22%2C%22lucasmartins%2B144%40railsnapraia.com%22%2C%22lucasmartins%2B145%40railsnapraia.com%22%2C%22lucasmartins%2B146%40railsnapraia.com%22%2C%22lucasmartins%2B147%40railsnapraia.com%22%2C%22lucasmartins%2B148%40railsnapraia.com%22%2C%22lucasmartins%2B149%40railsnapraia.com%22%2C%22lucasmartins%2B150%40railsnapraia.com%22%2C%22lucasmartins%2B151%40railsnapraia.com%22%2C%22lucasmartins%2B152%40railsnapraia.com%22%2C%22lucasmartins%2B153%40railsnapraia.com%22%2C%22lucasmartins%2B154%40railsnapraia.com%22%2C%22lucasmartins%2B155%40railsnapraia.com%22%2C%22lucasmartins%2B156%40railsnapraia.com%22%2C%22lucasmartins%2B157%40railsnapraia.com%22%2C%22lucasmartins%2B158%40railsnapraia.com%22%2C%22lucasmartins%2B159%40railsnapraia.com%22%2C%22lucasmartins%2B160%40railsnapraia.com%22%2C%22lucasmartins%2B161%40railsnapraia.com%22%2C%22lucasmartins%2B162%40railsnapraia.com%22%2C%22lucasmartins%2B163%40railsnapraia.com%22%2C%22lucasmartins%2B164%40railsnapraia.com%22%2C%22lucasmartins%2B165%40railsnapraia.com%22%2C%22lucasmartins%2B166%40railsnapraia.com%22%2C%22lucasmartins%2B167%40railsnapraia.com%22%2C%22lucasmartins%2B168%40railsnapraia.com%22%2C%22lucasmartins%2B169%40railsnapraia.com%22%2C%22lucasmartins%2B170%40railsnapraia.com%22%2C%22lucasmartins%2B171%40railsnapraia.com%22%2C%22lucasmartins%2B172%40railsnapraia.com%22%2C%22lucasmartins%2B173%40railsnapraia.com%22%2C%22lucasmartins%2B174%40railsnapraia.com%22%2C%22lucasmartins%2B175%40railsnapraia.com%22%2C%22lucasmartins%2B176%40railsnapraia.com%22%2C%22lucasmartins%2B177%40railsnapraia.com%22%2C%22lucasmartins%2B178%40railsnapraia.com%22%2C%22lucasmartins%2B179%40railsnapraia.com%22%2C%22lucasmartins%2B180%40railsnapraia.com%22%2C%22lucasmartins%2B181%40railsnapraia.com%22%2C%22lucasmartins%2B182%40railsnapraia.com%22%2C%22lucasmartins%2B183%40railsnapraia.com%22%2C%22lucasmartins%2B184%40railsnapraia.com%22%2C%22lucasmartins%2B185%40railsnapraia.com%22%2C%22lucasmartins%2B186%40railsnapraia.com%22%2C%22lucasmartins%2B187%40railsnapraia.com%22%2C%22lucasmartins%2B188%40railsnapraia.com%22%2C%22lucasmartins%2B189%40railsnapraia.com%22%2C%22lucasmartins%2B190%40railsnapraia.com%22%2C%22lucasmartins%2B191%40railsnapraia.com%22%2C%22lucasmartins%2B192%40railsnapraia.com%22%2C%22lucasmartins%2B193%40railsnapraia.com%22%2C%22lucasmartins%2B194%40railsnapraia.com%22%2C%22lucasmartins%2B195%40railsnapraia.com%22%2C%22lucasmartins%2B196%40railsnapraia.com%22%2C%22lucasmartins%2B197%40railsnapraia.com%22%2C%22lucasmartins%2B198%40railsnapraia.com%22%2C%22lucasmartins%2B199%40railsnapraia.com%22%2C%22lucasmartins%2B200%40railsnapraia.com%22%2C%22lucasmartins%2B201%40railsnapraia.com%22%2C%22lucasmartins%2B202%40railsnapraia.com%22%2C%22lucasmartins%2B203%40railsnapraia.com%22%2C%22lucasmartins%2B204%40railsnapraia.com%22%2C%22lucasmartins%2B205%40railsnapraia.com%22%2C%22lucasmartins%2B206%40railsnapraia.com%22%2C%22lucasmartins%2B207%40railsnapraia.com%22%2C%22lucasmartins%2B208%40railsnapraia.com%22%2C%22lucasmartins%2B209%40railsnapraia.com%22%2C%22lucasmartins%2B210%40railsnapraia.com%22%2C%22lucasmartins%2B211%40railsnapraia.com%22%2C%22lucasmartins%2B212%40railsnapraia.com%22%2C%22lucasmartins%2B213%40railsnapraia.com%22%2C%22lucasmartins%2B214%40railsnapraia.com%22%2C%22lucasmartins%2B215%40railsnapraia.com%22%2C%22lucasmartins%2B216%40railsnapraia.com%22%2C%22lucasmartins%2B217%40railsnapraia.com%22%2C%22lucasmartins%2B218%40railsnapraia.com%22%2C%22lucasmartins%2B219%40railsnapraia.com%22%2C%22lucasmartins%2B220%40railsnapraia.com%22%2C%22lucasmartins%2B221%40railsnapraia.com%22%2C%22lucasmartins%2B222%40railsnapraia.com%22%2C%22lucasmartins%2B223%40railsnapraia.com%22%2C%22lucasmartins%2B224%40railsnapraia.com%22%2C%22lucasmartins%2B225%40railsnapraia.com%22%2C%22lucasmartins%2B226%40railsnapraia.com%22%2C%22lucasmartins%2B227%40railsnapraia.com%22%2C%22lucasmartins%2B228%40railsnapraia.com%22%2C%22lucasmartins%2B229%40railsnapraia.com%22%2C%22lucasmartins%2B230%40railsnapraia.com%22%2C%22lucasmartins%2B231%40railsnapraia.com%22%2C%22lucasmartins%2B232%40railsnapraia.com%22%2C%22lucasmartins%2B233%40railsnapraia.com%22%2C%22lucasmartins%2B234%40railsnapraia.com%22%2C%22lucasmartins%2B235%40railsnapraia.com%22%2C%22lucasmartins%2B236%40railsnapraia.com%22%2C%22lucasmartins%2B237%40railsnapraia.com%22%2C%22lucasmartins%2B238%40railsnapraia.com%22%2C%22lucasmartins%2B239%40railsnapraia.com%22%2C%22lucasmartins%2B240%40railsnapraia.com%22%2C%22lucasmartins%2B241%40railsnapraia.com%22%2C%22lucasmartins%2B242%40railsnapraia.com%22%2C%22lucasmartins%2B243%40railsnapraia.com%22%2C%22lucasmartins%2B244%40railsnapraia.com%22%2C%22lucasmartins%2B245%40railsnapraia.com%22%2C%22lucasmartins%2B246%40railsnapraia.com%22%2C%22lucasmartins%2B247%40railsnapraia.com%22%2C%22lucasmartins%2B248%40railsnapraia.com%22%2C%22lucasmartins%2B249%40railsnapraia.com%22%2C%22lucasmartins%2B250%40railsnapraia.com%22%2C%22lucasmartins%2B251%40railsnapraia.com%22%2C%22lucasmartins%2B252%40railsnapraia.com%22%2C%22lucasmartins%2B253%40railsnapraia.com%22%2C%22lucasmartins%2B254%40railsnapraia.com%22%2C%22lucasmartins%2B255%40railsnapraia.com%22%2C%22lucasmartins%2B256%40railsnapraia.com%22%2C%22lucasmartins%2B257%40railsnapraia.com%22%2C%22lucasmartins%2B258%40railsnapraia.com%22%2C%22lucasmartins%2B259%40railsnapraia.com%22%2C%22lucasmartins%2B260%40railsnapraia.com%22%2C%22lucasmartins%2B261%40railsnapraia.com%22%2C%22lucasmartins%2B262%40railsnapraia.com%22%2C%22lucasmartins%2B263%40railsnapraia.com%22%2C%22lucasmartins%2B264%40railsnapraia.com%22%2C%22lucasmartins%2B265%40railsnapraia.com%22%2C%22lucasmartins%2B266%40railsnapraia.com%22%2C%22lucasmartins%2B267%40railsnapraia.com%22%2C%22lucasmartins%2B268%40railsnapraia.com%22%2C%22lucasmartins%2B269%40railsnapraia.com%22%2C%22lucasmartins%2B270%40railsnapraia.com%22%2C%22lucasmartins%2B271%40railsnapraia.com%22%2C%22lucasmartins%2B272%40railsnapraia.com%22%2C%22lucasmartins%2B273%40railsnapraia.com%22%2C%22lucasmartins%2B274%40railsnapraia.com%22%2C%22lucasmartins%2B275%40railsnapraia.com%22%2C%22lucasmartins%2B276%40railsnapraia.com%22%2C%22lucasmartins%2B277%40railsnapraia.com%22%2C%22lucasmartins%2B278%40railsnapraia.com%22%2C%22lucasmartins%2B279%40railsnapraia.com%22%2C%22lucasmartins%2B280%40railsnapraia.com%22%2C%22lucasmartins%2B281%40railsnapraia.com%22%2C%22lucasmartins%2B282%40railsnapraia.com%22%2C%22lucasmartins%2B283%40railsnapraia.com%22%2C%22lucasmartins%2B284%40railsnapraia.com%22%2C%22lucasmartins%2B285%40railsnapraia.com%22%2C%22lucasmartins%2B286%40railsnapraia.com%22%2C%22lucasmartins%2B287%40railsnapraia.com%22%2C%22lucasmartins%2B288%40railsnapraia.com%22%2C%22lucasmartins%2B289%40railsnapraia.com%22%2C%22lucasmartins%2B290%40railsnapraia.com%22%2C%22lucasmartins%2B291%40railsnapraia.com%22%2C%22lucasmartins%2B292%40railsnapraia.com%22%2C%22lucasmartins%2B293%40railsnapraia.com%22%2C%22lucasmartins%2B294%40railsnapraia.com%22%2C%22lucasmartins%2B295%40railsnapraia.com%22%2C%22lucasmartins%2B296%40railsnapraia.com%22%2C%22lucasmartins%2B297%40railsnapraia.com%22%2C%22lucasmartins%2B298%40railsnapraia.com%22%2C%22lucasmartins%2B299%40railsnapraia.com%22%2C%22lucasmartins%2B300%40railsnapraia.com%22%2C%22lucasmartins%2B301%40railsnapraia.com%22%2C%22lucasmartins%2B302%40railsnapraia.com%22%2C%22lucasmartins%2B303%40railsnapraia.com%22%2C%22lucasmartins%2B304%40railsnapraia.com%22%2C%22lucasmartins%2B305%40railsnapraia.com%22%2C%22lucasmartins%2B306%40railsnapraia.com%22%2C%22lucasmartins%2B307%40railsnapraia.com%22%2C%22lucasmartins%2B308%40railsnapraia.com%22%2C%22lucasmartins%2B309%40railsnapraia.com%22%2C%22lucasmartins%2B310%40railsnapraia.com%22%2C%22lucasmartins%2B311%40railsnapraia.com%22%2C%22lucasmartins%2B312%40railsnapraia.com%22%2C%22lucasmartins%2B313%40railsnapraia.com%22%2C%22lucasmartins%2B314%40railsnapraia.com%22%2C%22lucasmartins%2B315%40railsnapraia.com%22%2C%22lucasmartins%2B316%40railsnapraia.com%22%2C%22lucasmartins%2B317%40railsnapraia.com%22%2C%22lucasmartins%2B318%40railsnapraia.com%22%2C%22lucasmartins%2B319%40railsnapraia.com%22%2C%22lucasmartins%2B320%40railsnapraia.com%22%2C%22lucasmartins%2B321%40railsnapraia.com%22%2C%22lucasmartins%2B322%40railsnapraia.com%22%2C%22lucasmartins%2B323%40railsnapraia.com%22%2C%22lucasmartins%2B324%40railsnapraia.com%22%2C%22lucasmartins%2B325%40railsnapraia.com%22%2C%22lucasmartins%2B326%40railsnapraia.com%22%2C%22lucasmartins%2B327%40railsnapraia.com%22%2C%22lucasmartins%2B328%40railsnapraia.com%22%2C%22lucasmartins%2B329%40railsnapraia.com%22%2C%22lucasmartins%2B330%40railsnapraia.com%22%2C%22lucasmartins%2B331%40railsnapraia.com%22%2C%22lucasmartins%2B332%40railsnapraia.com%22%2C%22lucasmartins%2B333%40railsnapraia.com%22%2C%22lucasmartins%2B334%40railsnapraia.com%22%2C%22lucasmartins%2B335%40railsnapraia.com%22%2C%22lucasmartins%2B336%40railsnapraia.com%22%2C%22lucasmartins%2B337%40railsnapraia.com%22%2C%22lucasmartins%2B338%40railsnapraia.com%22%2C%22lucasmartins%2B339%40railsnapraia.com%22%2C%22lucasmartins%2B340%40railsnapraia.com%22%2C%22lucasmartins%2B341%40railsnapraia.com%22%2C%22lucasmartins%2B342%40railsnapraia.com%22%2C%22lucasmartins%2B343%40railsnapraia.com%22%2C%22lucasmartins%2B344%40railsnapraia.com%22%2C%22lucasmartins%2B345%40railsnapraia.com%22%2C%22lucasmartins%2B346%40railsnapraia.com%22%2C%22lucasmartins%2B347%40railsnapraia.com%22%2C%22lucasmartins%2B348%40railsnapraia.com%22%2C%22lucasmartins%2B349%40railsnapraia.com%22%2C%22lucasmartins%2B350%40railsnapraia.com%22%2C%22lucasmartins%2B351%40railsnapraia.com%22%2C%22lucasmartins%2B352%40railsnapraia.com%22%2C%22lucasmartins%2B353%40railsnapraia.com%22%2C%22lucasmartins%2B354%40railsnapraia.com%22%2C%22lucasmartins%2B355%40railsnapraia.com%22%2C%22lucasmartins%2B356%40railsnapraia.com%22%2C%22lucasmartins%2B357%40railsnapraia.com%22%2C%22lucasmartins%2B358%40railsnapraia.com%22%2C%22lucasmartins%2B359%40railsnapraia.com%22%2C%22lucasmartins%2B360%40railsnapraia.com%22%2C%22lucasmartins%2B361%40railsnapraia.com%22%2C%22lucasmartins%2B362%40railsnapraia.com%22%2C%22lucasmartins%2B363%40railsnapraia.com%22%2C%22lucasmartins%2B364%40railsnapraia.com%22%2C%22lucasmartins%2B365%40railsnapraia.com%22%2C%22lucasmartins%2B366%40railsnapraia.com%22%2C%22lucasmartins%2B367%40railsnapraia.com%22%2C%22lucasmartins%2B368%40railsnapraia.com%22%2C%22lucasmartins%2B369%40railsnapraia.com%22%2C%22lucasmartins%2B370%40railsnapraia.com%22%2C%22lucasmartins%2B371%40railsnapraia.com%22%2C%22lucasmartins%2B372%40railsnapraia.com%22%2C%22lucasmartins%2B373%40railsnapraia.com%22%2C%22lucasmartins%2B374%40railsnapraia.com%22%2C%22lucasmartins%2B375%40railsnapraia.com%22%2C%22lucasmartins%2B376%40railsnapraia.com%22%2C%22lucasmartins%2B377%40railsnapraia.com%22%2C%22lucasmartins%2B378%40railsnapraia.com%22%2C%22lucasmartins%2B379%40railsnapraia.com%22%2C%22lucasmartins%2B380%40railsnapraia.com%22%2C%22lucasmartins%2B381%40railsnapraia.com%22%2C%22lucasmartins%2B382%40railsnapraia.com%22%2C%22lucasmartins%2B383%40railsnapraia.com%22%2C%22lucasmartins%2B384%40railsnapraia.com%22%2C%22lucasmartins%2B385%40railsnapraia.com%22%2C%22lucasmartins%2B386%40railsnapraia.com%22%2C%22lucasmartins%2B387%40railsnapraia.com%22%2C%22lucasmartins%2B388%40railsnapraia.com%22%2C%22lucasmartins%2B389%40railsnapraia.com%22%2C%22lucasmartins%2B390%40railsnapraia.com%22%2C%22lucasmartins%2B391%40railsnapraia.com%22%2C%22lucasmartins%2B392%40railsnapraia.com%22%2C%22lucasmartins%2B393%40railsnapraia.com%22%2C%22lucasmartins%2B394%40railsnapraia.com%22%2C%22lucasmartins%2B395%40railsnapraia.com%22%2C%22lucasmartins%2B396%40railsnapraia.com%22%2C%22lucasmartins%2B397%40railsnapraia.com%22%2C%22lucasmartins%2B398%40railsnapraia.com%22%2C%22lucasmartins%2B399%40railsnapraia.com%22%2C%22lucasmartins%2B400%40railsnapraia.com%22%2C%22lucasmartins%2B401%40railsnapraia.com%22%2C%22lucasmartins%2B402%40railsnapraia.com%22%2C%22lucasmartins%2B403%40railsnapraia.com%22%2C%22lucasmartins%2B404%40railsnapraia.com%22%2C%22lucasmartins%2B405%40railsnapraia.com%22%2C%22lucasmartins%2B406%40railsnapraia.com%22%2C%22lucasmartins%2B407%40railsnapraia.com%22%2C%22lucasmartins%2B408%40railsnapraia.com%22%2C%22lucasmartins%2B409%40railsnapraia.com%22%2C%22lucasmartins%2B410%40railsnapraia.com%22%2C%22lucasmartins%2B411%40railsnapraia.com%22%2C%22lucasmartins%2B412%40railsnapraia.com%22%2C%22lucasmartins%2B413%40railsnapraia.com%22%2C%22lucasmartins%2B414%40railsnapraia.com%22%2C%22lucasmartins%2B415%40railsnapraia.com%22%2C%22lucasmartins%2B416%40railsnapraia.com%22%2C%22lucasmartins%2B417%40railsnapraia.com%22%2C%22lucasmartins%2B418%40railsnapraia.com%22%2C%22lucasmartins%2B419%40railsnapraia.com%22%2C%22lucasmartins%2B420%40railsnapraia.com%22%2C%22lucasmartins%2B421%40railsnapraia.com%22%2C%22lucasmartins%2B422%40railsnapraia.com%22%2C%22lucasmartins%2B423%40railsnapraia.com%22%2C%22lucasmartins%2B424%40railsnapraia.com%22%2C%22lucasmartins%2B425%40railsnapraia.com%22%2C%22lucasmartins%2B426%40railsnapraia.com%22%2C%22lucasmartins%2B427%40railsnapraia.com%22%2C%22lucasmartins%2B428%40railsnapraia.com%22%2C%22lucasmartins%2B429%40railsnapraia.com%22%2C%22lucasmartins%2B430%40railsnapraia.com%22%2C%22lucasmartins%2B431%40railsnapraia.com%22%2C%22lucasmartins%2B432%40railsnapraia.com%22%2C%22lucasmartins%2B433%40railsnapraia.com%22%2C%22lucasmartins%2B434%40railsnapraia.com%22%2C%22lucasmartins%2B435%40railsnapraia.com%22%2C%22lucasmartins%2B436%40railsnapraia.com%22%2C%22lucasmartins%2B437%40railsnapraia.com%22%2C%22lucasmartins%2B438%40railsnapraia.com%22%2C%22lucasmartins%2B439%40railsnapraia.com%22%2C%22lucasmartins%2B440%40railsnapraia.com%22%2C%22lucasmartins%2B441%40railsnapraia.com%22%2C%22lucasmartins%2B442%40railsnapraia.com%22%2C%22lucasmartins%2B443%40railsnapraia.com%22%2C%22lucasmartins%2B444%40railsnapraia.com%22%2C%22lucasmartins%2B445%40railsnapraia.com%22%2C%22lucasmartins%2B446%40railsnapraia.com%22%2C%22lucasmartins%2B447%40railsnapraia.com%22%2C%22lucasmartins%2B448%40railsnapraia.com%22%2C%22lucasmartins%2B449%40railsnapraia.com%22%2C%22lucasmartins%2B450%40railsnapraia.com%22%2C%22lucasmartins%2B451%40railsnapraia.com%22%2C%22lucasmartins%2B452%40railsnapraia.com%22%2C%22lucasmartins%2B453%40railsnapraia.com%22%2C%22lucasmartins%2B454%40railsnapraia.com%22%2C%22lucasmartins%2B455%40railsnapraia.com%22%2C%22lucasmartins%2B456%40railsnapraia.com%22%2C%22lucasmartins%2B457%40railsnapraia.com%22%2C%22lucasmartins%2B458%40railsnapraia.com%22%2C%22lucasmartins%2B459%40railsnapraia.com%22%2C%22lucasmartins%2B460%40railsnapraia.com%22%2C%22lucasmartins%2B461%40railsnapraia.com%22%2C%22lucasmartins%2B462%40railsnapraia.com%22%2C%22lucasmartins%2B463%40railsnapraia.com%22%2C%22lucasmartins%2B464%40railsnapraia.com%22%2C%22lucasmartins%2B465%40railsnapraia.com%22%2C%22lucasmartins%2B466%40railsnapraia.com%22%2C%22lucasmartins%2B467%40railsnapraia.com%22%2C%22lucasmartins%2B468%40railsnapraia.com%22%2C%22lucasmartins%2B469%40railsnapraia.com%22%2C%22lucasmartins%2B470%40railsnapraia.com%22%2C%22lucasmartins%2B471%40railsnapraia.com%22%2C%22lucasmartins%2B472%40railsnapraia.com%22%2C%22lucasmartins%2B473%40railsnapraia.com%22%2C%22lucasmartins%2B474%40railsnapraia.com%22%2C%22lucasmartins%2B475%40railsnapraia.com%22%2C%22lucasmartins%2B476%40railsnapraia.com%22%2C%22lucasmartins%2B477%40railsnapraia.com%22%2C%22lucasmartins%2B478%40railsnapraia.com%22%2C%22lucasmartins%2B479%40railsnapraia.com%22%2C%22lucasmartins%2B480%40railsnapraia.com%22%2C%22lucasmartins%2B481%40railsnapraia.com%22%2C%22lucasmartins%2B482%40railsnapraia.com%22%2C%22lucasmartins%2B483%40railsnapraia.com%22%2C%22lucasmartins%2B484%40railsnapraia.com%22%2C%22lucasmartins%2B485%40railsnapraia.com%22%2C%22lucasmartins%2B486%40railsnapraia.com%22%2C%22lucasmartins%2B487%40railsnapraia.com%22%2C%22lucasmartins%2B488%40railsnapraia.com%22%2C%22lucasmartins%2B489%40railsnapraia.com%22%2C%22lucasmartins%2B490%40railsnapraia.com%22%2C%22lucasmartins%2B491%40railsnapraia.com%22%2C%22lucasmartins%2B492%40railsnapraia.com%22%2C%22lucasmartins%2B493%40railsnapraia.com%22%2C%22lucasmartins%2B494%40railsnapraia.com%22%2C%22lucasmartins%2B495%40railsnapraia.com%22%2C%22lucasmartins%2B496%40railsnapraia.com%22%2C%22lucasmartins%2B497%40railsnapraia.com%22%2C%22lucasmartins%2B498%40railsnapraia.com%22%2C%22lucasmartins%2B499%40railsnapraia.com%22%2C%22lucasmartins%2B500%40railsnapraia.com%22%2C%22lucasmartins%2B501%40railsnapraia.com%22%2C%22lucasmartins%2B502%40railsnapraia.com%22%2C%22lucasmartins%2B503%40railsnapraia.com%22%2C%22lucasmartins%2B504%40railsnapraia.com%22%2C%22lucasmartins%2B505%40railsnapraia.com%22%2C%22lucasmartins%2B506%40railsnapraia.com%22%2C%22lucasmartins%2B507%40railsnapraia.com%22%2C%22lucasmartins%2B508%40railsnapraia.com%22%2C%22lucasmartins%2B509%40railsnapraia.com%22%2C%22lucasmartins%2B510%40railsnapraia.com%22%2C%22lucasmartins%2B511%40railsnapraia.com%22%2C%22lucasmartins%2B512%40railsnapraia.com%22%2C%22lucasmartins%2B513%40railsnapraia.com%22%2C%22lucasmartins%2B514%40railsnapraia.com%22%2C%22lucasmartins%2B515%40railsnapraia.com%22%2C%22lucasmartins%2B516%40railsnapraia.com%22%2C%22lucasmartins%2B517%40railsnapraia.com%22%2C%22lucasmartins%2B518%40railsnapraia.com%22%2C%22lucasmartins%2B519%40railsnapraia.com%22%2C%22lucasmartins%2B520%40railsnapraia.com%22%2C%22lucasmartins%2B521%40railsnapraia.com%22%2C%22lucasmartins%2B522%40railsnapraia.com%22%2C%22lucasmartins%2B523%40railsnapraia.com%22%2C%22lucasmartins%2B524%40railsnapraia.com%22%2C%22lucasmartins%2B525%40railsnapraia.com%22%2C%22lucasmartins%2B526%40railsnapraia.com%22%2C%22lucasmartins%2B527%40railsnapraia.com%22%2C%22lucasmartins%2B528%40railsnapraia.com%22%2C%22lucasmartins%2B529%40railsnapraia.com%22%2C%22lucasmartins%2B530%40railsnapraia.com%22%2C%22lucasmartins%2B531%40railsnapraia.com%22%2C%22lucasmartins%2B532%40railsnapraia.com%22%2C%22lucasmartins%2B533%40railsnapraia.com%22%2C%22lucasmartins%2B534%40railsnapraia.com%22%2C%22lucasmartins%2B535%40railsnapraia.com%22%2C%22lucasmartins%2B536%40railsnapraia.com%22%2C%22lucasmartins%2B537%40railsnapraia.com%22%2C%22lucasmartins%2B538%40railsnapraia.com%22%2C%22lucasmartins%2B539%40railsnapraia.com%22%2C%22lucasmartins%2B540%40railsnapraia.com%22%2C%22lucasmartins%2B541%40railsnapraia.com%22%2C%22lucasmartins%2B542%40railsnapraia.com%22%2C%22lucasmartins%2B543%40railsnapraia.com%22%2C%22lucasmartins%2B544%40railsnapraia.com%22%2C%22lucasmartins%2B545%40railsnapraia.com%22%2C%22lucasmartins%2B546%40railsnapraia.com%22%2C%22lucasmartins%2B547%40railsnapraia.com%22%2C%22lucasmartins%2B548%40railsnapraia.com%22%2C%22lucasmartins%2B549%40railsnapraia.com%22%2C%22lucasmartins%2B550%40railsnapraia.com%22%2C%22lucasmartins%2B551%40railsnapraia.com%22%2C%22lucasmartins%2B552%40railsnapraia.com%22%2C%22lucasmartins%2B553%40railsnapraia.com%22%2C%22lucasmartins%2B554%40railsnapraia.com%22%2C%22lucasmartins%2B555%40railsnapraia.com%22%2C%22lucasmartins%2B556%40railsnapraia.com%22%2C%22lucasmartins%2B557%40railsnapraia.com%22%2C%22lucasmartins%2B558%40railsnapraia.com%22%2C%22lucasmartins%2B559%40railsnapraia.com%22%2C%22lucasmartins%2B560%40railsnapraia.com%22%2C%22lucasmartins%2B561%40railsnapraia.com%22%2C%22lucasmartins%2B562%40railsnapraia.com%22%2C%22lucasmartins%2B563%40railsnapraia.com%22%2C%22lucasmartins%2B564%40railsnapraia.com%22%2C%22lucasmartins%2B565%40railsnapraia.com%22%2C%22lucasmartins%2B566%40railsnapraia.com%22%2C%22lucasmartins%2B567%40railsnapraia.com%22%2C%22lucasmartins%2B568%40railsnapraia.com%22%2C%22lucasmartins%2B569%40railsnapraia.com%22%2C%22lucasmartins%2B570%40railsnapraia.com%22%2C%22lucasmartins%2B571%40railsnapraia.com%22%2C%22lucasmartins%2B572%40railsnapraia.com%22%2C%22lucasmartins%2B573%40railsnapraia.com%22%2C%22lucasmartins%2B574%40railsnapraia.com%22%2C%22lucasmartins%2B575%40railsnapraia.com%22%2C%22lucasmartins%2B576%40railsnapraia.com%22%2C%22lucasmartins%2B577%40railsnapraia.com%22%2C%22lucasmartins%2B578%40railsnapraia.com%22%2C%22lucasmartins%2B579%40railsnapraia.com%22%2C%22lucasmartins%2B580%40railsnapraia.com%22%2C%22lucasmartins%2B581%40railsnapraia.com%22%2C%22lucasmartins%2B582%40railsnapraia.com%22%2C%22lucasmartins%2B583%40railsnapraia.com%22%2C%22lucasmartins%2B584%40railsnapraia.com%22%2C%22lucasmartins%2B585%40railsnapraia.com%22%2C%22lucasmartins%2B586%40railsnapraia.com%22%2C%22lucasmartins%2B587%40railsnapraia.com%22%2C%22lucasmartins%2B588%40railsnapraia.com%22%2C%22lucasmartins%2B589%40railsnapraia.com%22%2C%22lucasmartins%2B590%40railsnapraia.com%22%2C%22lucasmartins%2B591%40railsnapraia.com%22%2C%22lucasmartins%2B592%40railsnapraia.com%22%2C%22lucasmartins%2B593%40railsnapraia.com%22%2C%22lucasmartins%2B594%40railsnapraia.com%22%2C%22lucasmartins%2B595%40railsnapraia.com%22%2C%22lucasmartins%2B596%40railsnapraia.com%22%2C%22lucasmartins%2B597%40railsnapraia.com%22%2C%22lucasmartins%2B598%40railsnapraia.com%22%2C%22lucasmartins%2B599%40railsnapraia.com%22%2C%22lucasmartins%2B600%40railsnapraia.com%22%2C%22lucasmartins%2B601%40railsnapraia.com%22%2C%22lucasmartins%2B602%40railsnapraia.com%22%2C%22lucasmartins%2B603%40railsnapraia.com%22%2C%22lucasmartins%2B604%40railsnapraia.com%22%2C%22lucasmartins%2B605%40railsnapraia.com%22%2C%22lucasmartins%2B606%40railsnapraia.com%22%2C%22lucasmartins%2B607%40railsnapraia.com%22%2C%22lucasmartins%2B608%40railsnapraia.com%22%2C%22lucasmartins%2B609%40railsnapraia.com%22%2C%22lucasmartins%2B610%40railsnapraia.com%22%2C%22lucasmartins%2B611%40railsnapraia.com%22%2C%22lucasmartins%2B612%40railsnapraia.com%22%2C%22lucasmartins%2B613%40railsnapraia.com%22%2C%22lucasmartins%2B614%40railsnapraia.com%22%2C%22lucasmartins%2B615%40railsnapraia.com%22%2C%22lucasmartins%2B616%40railsnapraia.com%22%2C%22lucasmartins%2B617%40railsnapraia.com%22%2C%22lucasmartins%2B618%40railsnapraia.com%22%2C%22lucasmartins%2B619%40railsnapraia.com%22%2C%22lucasmartins%2B620%40railsnapraia.com%22%2C%22lucasmartins%2B621%40railsnapraia.com%22%2C%22lucasmartins%2B622%40railsnapraia.com%22%2C%22lucasmartins%2B623%40railsnapraia.com%22%2C%22lucasmartins%2B624%40railsnapraia.com%22%2C%22lucasmartins%2B625%40railsnapraia.com%22%2C%22lucasmartins%2B626%40railsnapraia.com%22%2C%22lucasmartins%2B627%40railsnapraia.com%22%2C%22lucasmartins%2B628%40railsnapraia.com%22%2C%22lucasmartins%2B629%40railsnapraia.com%22%2C%22lucasmartins%2B630%40railsnapraia.com%22%2C%22lucasmartins%2B631%40railsnapraia.com%22%2C%22lucasmartins%2B632%40railsnapraia.com%22%2C%22lucasmartins%2B633%40railsnapraia.com%22%2C%22lucasmartins%2B634%40railsnapraia.com%22%2C%22lucasmartins%2B635%40railsnapraia.com%22%2C%22lucasmartins%2B636%40railsnapraia.com%22%2C%22lucasmartins%2B637%40railsnapraia.com%22%2C%22lucasmartins%2B638%40railsnapraia.com%22%2C%22lucasmartins%2B639%40railsnapraia.com%22%2C%22lucasmartins%2B640%40railsnapraia.com%22%2C%22lucasmartins%2B641%40railsnapraia.com%22%2C%22lucasmartins%2B642%40railsnapraia.com%22%2C%22lucasmartins%2B643%40railsnapraia.com%22%2C%22lucasmartins%2B644%40railsnapraia.com%22%2C%22lucasmartins%2B645%40railsnapraia.com%22%2C%22lucasmartins%2B646%40railsnapraia.com%22%2C%22lucasmartins%2B647%40railsnapraia.com%22%2C%22lucasmartins%2B648%40railsnapraia.com%22%2C%22lucasmartins%2B649%40railsnapraia.com%22%2C%22lucasmartins%2B650%40railsnapraia.com%22%2C%22lucasmartins%2B651%40railsnapraia.com%22%2C%22lucasmartins%2B652%40railsnapraia.com%22%2C%22lucasmartins%2B653%40railsnapraia.com%22%2C%22lucasmartins%2B654%40railsnapraia.com%22%2C%22lucasmartins%2B655%40railsnapraia.com%22%2C%22lucasmartins%2B656%40railsnapraia.com%22%2C%22lucasmartins%2B657%40railsnapraia.com%22%2C%22lucasmartins%2B658%40railsnapraia.com%22%2C%22lucasmartins%2B659%40railsnapraia.com%22%2C%22lucasmartins%2B660%40railsnapraia.com%22%2C%22lucasmartins%2B661%40railsnapraia.com%22%2C%22lucasmartins%2B662%40railsnapraia.com%22%2C%22lucasmartins%2B663%40railsnapraia.com%22%2C%22lucasmartins%2B664%40railsnapraia.com%22%2C%22lucasmartins%2B665%40railsnapraia.com%22%2C%22lucasmartins%2B666%40railsnapraia.com%22%2C%22lucasmartins%2B667%40railsnapraia.com%22%2C%22lucasmartins%2B668%40railsnapraia.com%22%2C%22lucasmartins%2B669%40railsnapraia.com%22%2C%22lucasmartins%2B670%40railsnapraia.com%22%2C%22lucasmartins%2B671%40railsnapraia.com%22%2C%22lucasmartins%2B672%40railsnapraia.com%22%2C%22lucasmartins%2B673%40railsnapraia.com%22%2C%22lucasmartins%2B674%40railsnapraia.com%22%2C%22lucasmartins%2B675%40railsnapraia.com%22%2C%22lucasmartins%2B676%40railsnapraia.com%22%2C%22lucasmartins%2B677%40railsnapraia.com%22%2C%22lucasmartins%2B678%40railsnapraia.com%22%2C%22lucasmartins%2B679%40railsnapraia.com%22%2C%22lucasmartins%2B680%40railsnapraia.com%22%2C%22lucasmartins%2B681%40railsnapraia.com%22%2C%22lucasmartins%2B682%40railsnapraia.com%22%2C%22lucasmartins%2B683%40railsnapraia.com%22%2C%22lucasmartins%2B684%40railsnapraia.com%22%2C%22lucasmartins%2B685%40railsnapraia.com%22%2C%22lucasmartins%2B686%40railsnapraia.com%22%2C%22lucasmartins%2B687%40railsnapraia.com%22%2C%22lucasmartins%2B688%40railsnapraia.com%22%2C%22lucasmartins%2B689%40railsnapraia.com%22%2C%22lucasmartins%2B690%40railsnapraia.com%22%2C%22lucasmartins%2B691%40railsnapraia.com%22%2C%22lucasmartins%2B692%40railsnapraia.com%22%2C%22lucasmartins%2B693%40railsnapraia.com%22%2C%22lucasmartins%2B694%40railsnapraia.com%22%2C%22lucasmartins%2B695%40railsnapraia.com%22%2C%22lucasmartins%2B696%40railsnapraia.com%22%2C%22lucasmartins%2B697%40railsnapraia.com%22%2C%22lucasmartins%2B698%40railsnapraia.com%22%2C%22lucasmartins%2B699%40railsnapraia.com%22%2C%22lucasmartins%2B700%40railsnapraia.com%22%2C%22lucasmartins%2B701%40railsnapraia.com%22%2C%22lucasmartins%2B702%40railsnapraia.com%22%2C%22lucasmartins%2B703%40railsnapraia.com%22%2C%22lucasmartins%2B704%40railsnapraia.com%22%2C%22lucasmartins%2B705%40railsnapraia.com%22%2C%22lucasmartins%2B706%40railsnapraia.com%22%2C%22lucasmartins%2B707%40railsnapraia.com%22%2C%22lucasmartins%2B708%40railsnapraia.com%22%2C%22lucasmartins%2B709%40railsnapraia.com%22%2C%22lucasmartins%2B710%40railsnapraia.com%22%2C%22lucasmartins%2B711%40railsnapraia.com%22%2C%22lucasmartins%2B712%40railsnapraia.com%22%2C%22lucasmartins%2B713%40railsnapraia.com%22%2C%22lucasmartins%2B714%40railsnapraia.com%22%2C%22lucasmartins%2B715%40railsnapraia.com%22%2C%22lucasmartins%2B716%40railsnapraia.com%22%2C%22lucasmartins%2B717%40railsnapraia.com%22%2C%22lucasmartins%2B718%40railsnapraia.com%22%2C%22lucasmartins%2B719%40railsnapraia.com%22%2C%22lucasmartins%2B720%40railsnapraia.com%22%2C%22lucasmartins%2B721%40railsnapraia.com%22%2C%22lucasmartins%2B722%40railsnapraia.com%22%2C%22lucasmartins%2B723%40railsnapraia.com%22%2C%22lucasmartins%2B724%40railsnapraia.com%22%2C%22lucasmartins%2B725%40railsnapraia.com%22%2C%22lucasmartins%2B726%40railsnapraia.com%22%2C%22lucasmartins%2B727%40railsnapraia.com%22%2C%22lucasmartins%2B728%40railsnapraia.com%22%2C%22lucasmartins%2B729%40railsnapraia.com%22%2C%22lucasmartins%2B730%40railsnapraia.com%22%2C%22lucasmartins%2B731%40railsnapraia.com%22%2C%22lucasmartins%2B732%40railsnapraia.com%22%2C%22lucasmartins%2B733%40railsnapraia.com%22%2C%22lucasmartins%2B734%40railsnapraia.com%22%2C%22lucasmartins%2B735%40railsnapraia.com%22%2C%22lucasmartins%2B736%40railsnapraia.com%22%2C%22lucasmartins%2B737%40railsnapraia.com%22%2C%22lucasmartins%2B738%40railsnapraia.com%22%2C%22lucasmartins%2B739%40railsnapraia.com%22%2C%22lucasmartins%2B740%40railsnapraia.com%22%2C%22lucasmartins%2B741%40railsnapraia.com%22%2C%22lucasmartins%2B742%40railsnapraia.com%22%2C%22lucasmartins%2B743%40railsnapraia.com%22%2C%22lucasmartins%2B744%40railsnapraia.com%22%2C%22lucasmartins%2B745%40railsnapraia.com%22%2C%22lucasmartins%2B746%40railsnapraia.com%22%2C%22lucasmartins%2B747%40railsnapraia.com%22%2C%22lucasmartins%2B748%40railsnapraia.com%22%2C%22lucasmartins%2B749%40railsnapraia.com%22%2C%22lucasmartins%2B750%40railsnapraia.com%22%2C%22lucasmartins%2B751%40railsnapraia.com%22%2C%22lucasmartins%2B752%40railsnapraia.com%22%2C%22lucasmartins%2B753%40railsnapraia.com%22%2C%22lucasmartins%2B754%40railsnapraia.com%22%2C%22lucasmartins%2B755%40railsnapraia.com%22%2C%22lucasmartins%2B756%40railsnapraia.com%22%2C%22lucasmartins%2B757%40railsnapraia.com%22%2C%22lucasmartins%2B758%40railsnapraia.com%22%2C%22lucasmartins%2B759%40railsnapraia.com%22%2C%22lucasmartins%2B760%40railsnapraia.com%22%2C%22lucasmartins%2B761%40railsnapraia.com%22%2C%22lucasmartins%2B762%40railsnapraia.com%22%2C%22lucasmartins%2B763%40railsnapraia.com%22%2C%22lucasmartins%2B764%40railsnapraia.com%22%2C%22lucasmartins%2B765%40railsnapraia.com%22%2C%22lucasmartins%2B766%40railsnapraia.com%22%2C%22lucasmartins%2B767%40railsnapraia.com%22%2C%22lucasmartins%2B768%40railsnapraia.com%22%2C%22lucasmartins%2B769%40railsnapraia.com%22%2C%22lucasmartins%2B770%40railsnapraia.com%22%2C%22lucasmartins%2B771%40railsnapraia.com%22%2C%22lucasmartins%2B772%40railsnapraia.com%22%2C%22lucasmartins%2B773%40railsnapraia.com%22%2C%22lucasmartins%2B774%40railsnapraia.com%22%2C%22lucasmartins%2B775%40railsnapraia.com%22%2C%22lucasmartins%2B776%40railsnapraia.com%22%2C%22lucasmartins%2B777%40railsnapraia.com%22%2C%22lucasmartins%2B778%40railsnapraia.com%22%2C%22lucasmartins%2B779%40railsnapraia.com%22%2C%22lucasmartins%2B780%40railsnapraia.com%22%2C%22lucasmartins%2B781%40railsnapraia.com%22%2C%22lucasmartins%2B782%40railsnapraia.com%22%2C%22lucasmartins%2B783%40railsnapraia.com%22%2C%22lucasmartins%2B784%40railsnapraia.com%22%2C%22lucasmartins%2B785%40railsnapraia.com%22%2C%22lucasmartins%2B786%40railsnapraia.com%22%2C%22lucasmartins%2B787%40railsnapraia.com%22%2C%22lucasmartins%2B788%40railsnapraia.com%22%2C%22lucasmartins%2B789%40railsnapraia.com%22%2C%22lucasmartins%2B790%40railsnapraia.com%22%2C%22lucasmartins%2B791%40railsnapraia.com%22%2C%22lucasmartins%2B792%40railsnapraia.com%22%2C%22lucasmartins%2B793%40railsnapraia.com%22%2C%22lucasmartins%2B794%40railsnapraia.com%22%2C%22lucasmartins%2B795%40railsnapraia.com%22%2C%22lucasmartins%2B796%40railsnapraia.com%22%2C%22lucasmartins%2B797%40railsnapraia.com%22%2C%22lucasmartins%2B798%40railsnapraia.com%22%2C%22lucasmartins%2B799%40railsnapraia.com%22%2C%22lucasmartins%2B800%40railsnapraia.com%22%2C%22lucasmartins%2B801%40railsnapraia.com%22%2C%22lucasmartins%2B802%40railsnapraia.com%22%2C%22lucasmartins%2B803%40railsnapraia.com%22%2C%22lucasmartins%2B804%40railsnapraia.com%22%2C%22lucasmartins%2B805%40railsnapraia.com%22%2C%22lucasmartins%2B806%40railsnapraia.com%22%2C%22lucasmartins%2B807%40railsnapraia.com%22%2C%22lucasmartins%2B808%40railsnapraia.com%22%2C%22lucasmartins%2B809%40railsnapraia.com%22%2C%22lucasmartins%2B810%40railsnapraia.com%22%2C%22lucasmartins%2B811%40railsnapraia.com%22%2C%22lucasmartins%2B812%40railsnapraia.com%22%2C%22lucasmartins%2B813%40railsnapraia.com%22%2C%22lucasmartins%2B814%40railsnapraia.com%22%2C%22lucasmartins%2B815%40railsnapraia.com%22%2C%22lucasmartins%2B816%40railsnapraia.com%22%2C%22lucasmartins%2B817%40railsnapraia.com%22%2C%22lucasmartins%2B818%40railsnapraia.com%22%2C%22lucasmartins%2B819%40railsnapraia.com%22%2C%22lucasmartins%2B820%40railsnapraia.com%22%2C%22lucasmartins%2B821%40railsnapraia.com%22%2C%22lucasmartins%2B822%40railsnapraia.com%22%2C%22lucasmartins%2B823%40railsnapraia.com%22%2C%22lucasmartins%2B824%40railsnapraia.com%22%2C%22lucasmartins%2B825%40railsnapraia.com%22%2C%22lucasmartins%2B826%40railsnapraia.com%22%2C%22lucasmartins%2B827%40railsnapraia.com%22%2C%22lucasmartins%2B828%40railsnapraia.com%22%2C%22lucasmartins%2B829%40railsnapraia.com%22%2C%22lucasmartins%2B830%40railsnapraia.com%22%2C%22lucasmartins%2B831%40railsnapraia.com%22%2C%22lucasmartins%2B832%40railsnapraia.com%22%2C%22lucasmartins%2B833%40railsnapraia.com%22%2C%22lucasmartins%2B834%40railsnapraia.com%22%2C%22lucasmartins%2B835%40railsnapraia.com%22%2C%22lucasmartins%2B836%40railsnapraia.com%22%2C%22lucasmartins%2B837%40railsnapraia.com%22%2C%22lucasmartins%2B838%40railsnapraia.com%22%2C%22lucasmartins%2B839%40railsnapraia.com%22%2C%22lucasmartins%2B840%40railsnapraia.com%22%2C%22lucasmartins%2B841%40railsnapraia.com%22%2C%22lucasmartins%2B842%40railsnapraia.com%22%2C%22lucasmartins%2B843%40railsnapraia.com%22%2C%22lucasmartins%2B844%40railsnapraia.com%22%2C%22lucasmartins%2B845%40railsnapraia.com%22%2C%22lucasmartins%2B846%40railsnapraia.com%22%2C%22lucasmartins%2B847%40railsnapraia.com%22%2C%22lucasmartins%2B848%40railsnapraia.com%22%2C%22lucasmartins%2B849%40railsnapraia.com%22%2C%22lucasmartins%2B850%40railsnapraia.com%22%2C%22lucasmartins%2B851%40railsnapraia.com%22%2C%22lucasmartins%2B852%40railsnapraia.com%22%2C%22lucasmartins%2B853%40railsnapraia.com%22%2C%22lucasmartins%2B854%40railsnapraia.com%22%2C%22lucasmartins%2B855%40railsnapraia.com%22%2C%22lucasmartins%2B856%40railsnapraia.com%22%2C%22lucasmartins%2B857%40railsnapraia.com%22%2C%22lucasmartins%2B858%40railsnapraia.com%22%2C%22lucasmartins%2B859%40railsnapraia.com%22%2C%22lucasmartins%2B860%40railsnapraia.com%22%2C%22lucasmartins%2B861%40railsnapraia.com%22%2C%22lucasmartins%2B862%40railsnapraia.com%22%2C%22lucasmartins%2B863%40railsnapraia.com%22%2C%22lucasmartins%2B864%40railsnapraia.com%22%2C%22lucasmartins%2B865%40railsnapraia.com%22%2C%22lucasmartins%2B866%40railsnapraia.com%22%2C%22lucasmartins%2B867%40railsnapraia.com%22%2C%22lucasmartins%2B868%40railsnapraia.com%22%2C%22lucasmartins%2B869%40railsnapraia.com%22%2C%22lucasmartins%2B870%40railsnapraia.com%22%2C%22lucasmartins%2B871%40railsnapraia.com%22%2C%22lucasmartins%2B872%40railsnapraia.com%22%2C%22lucasmartins%2B873%40railsnapraia.com%22%2C%22lucasmartins%2B874%40railsnapraia.com%22%2C%22lucasmartins%2B875%40railsnapraia.com%22%2C%22lucasmartins%2B876%40railsnapraia.com%22%2C%22lucasmartins%2B877%40railsnapraia.com%22%2C%22lucasmartins%2B878%40railsnapraia.com%22%2C%22lucasmartins%2B879%40railsnapraia.com%22%2C%22lucasmartins%2B880%40railsnapraia.com%22%2C%22lucasmartins%2B881%40railsnapraia.com%22%2C%22lucasmartins%2B882%40railsnapraia.com%22%2C%22lucasmartins%2B883%40railsnapraia.com%22%2C%22lucasmartins%2B884%40railsnapraia.com%22%2C%22lucasmartins%2B885%40railsnapraia.com%22%2C%22lucasmartins%2B886%40railsnapraia.com%22%2C%22lucasmartins%2B887%40railsnapraia.com%22%2C%22lucasmartins%2B888%40railsnapraia.com%22%2C%22lucasmartins%2B889%40railsnapraia.com%22%2C%22lucasmartins%2B890%40railsnapraia.com%22%2C%22lucasmartins%2B891%40railsnapraia.com%22%2C%22lucasmartins%2B892%40railsnapraia.com%22%2C%22lucasmartins%2B893%40railsnapraia.com%22%2C%22lucasmartins%2B894%40railsnapraia.com%22%2C%22lucasmartins%2B895%40railsnapraia.com%22%2C%22lucasmartins%2B896%40railsnapraia.com%22%2C%22lucasmartins%2B897%40railsnapraia.com%22%2C%22lucasmartins%2B898%40railsnapraia.com%22%2C%22lucasmartins%2B899%40railsnapraia.com%22%2C%22lucasmartins%2B900%40railsnapraia.com%22%2C%22lucasmartins%2B901%40railsnapraia.com%22%2C%22lucasmartins%2B902%40railsnapraia.com%22%2C%22lucasmartins%2B903%40railsnapraia.com%22%2C%22lucasmartins%2B904%40railsnapraia.com%22%2C%22lucasmartins%2B905%40railsnapraia.com%22%2C%22lucasmartins%2B906%40railsnapraia.com%22%2C%22lucasmartins%2B907%40railsnapraia.com%22%2C%22lucasmartins%2B908%40railsnapraia.com%22%2C%22lucasmartins%2B909%40railsnapraia.com%22%2C%22lucasmartins%2B910%40railsnapraia.com%22%2C%22lucasmartins%2B911%40railsnapraia.com%22%2C%22lucasmartins%2B912%40railsnapraia.com%22%2C%22lucasmartins%2B913%40railsnapraia.com%22%2C%22lucasmartins%2B914%40railsnapraia.com%22%2C%22lucasmartins%2B915%40railsnapraia.com%22%2C%22lucasmartins%2B916%40railsnapraia.com%22%2C%22lucasmartins%2B917%40railsnapraia.com%22%2C%22lucasmartins%2B918%40railsnapraia.com%22%2C%22lucasmartins%2B919%40railsnapraia.com%22%2C%22lucasmartins%2B920%40railsnapraia.com%22%2C%22lucasmartins%2B921%40railsnapraia.com%22%2C%22lucasmartins%2B922%40railsnapraia.com%22%2C%22lucasmartins%2B923%40railsnapraia.com%22%2C%22lucasmartins%2B924%40railsnapraia.com%22%2C%22lucasmartins%2B925%40railsnapraia.com%22%2C%22lucasmartins%2B926%40railsnapraia.com%22%2C%22lucasmartins%2B927%40railsnapraia.com%22%2C%22lucasmartins%2B928%40railsnapraia.com%22%2C%22lucasmartins%2B929%40railsnapraia.com%22%2C%22lucasmartins%2B930%40railsnapraia.com%22%2C%22lucasmartins%2B931%40railsnapraia.com%22%2C%22lucasmartins%2B932%40railsnapraia.com%22%2C%22lucasmartins%2B933%40railsnapraia.com%22%2C%22lucasmartins%2B934%40railsnapraia.com%22%2C%22lucasmartins%2B935%40railsnapraia.com%22%2C%22lucasmartins%2B936%40railsnapraia.com%22%2C%22lucasmartins%2B937%40railsnapraia.com%22%2C%22lucasmartins%2B938%40railsnapraia.com%22%2C%22lucasmartins%2B939%40railsnapraia.com%22%2C%22lucasmartins%2B940%40railsnapraia.com%22%2C%22lucasmartins%2B941%40railsnapraia.com%22%2C%22lucasmartins%2B942%40railsnapraia.com%22%2C%22lucasmartins%2B943%40railsnapraia.com%22%2C%22lucasmartins%2B944%40railsnapraia.com%22%2C%22lucasmartins%2B945%40railsnapraia.com%22%2C%22lucasmartins%2B946%40railsnapraia.com%22%2C%22lucasmartins%2B947%40railsnapraia.com%22%2C%22lucasmartins%2B948%40railsnapraia.com%22%2C%22lucasmartins%2B949%40railsnapraia.com%22%2C%22lucasmartins%2B950%40railsnapraia.com%22%2C%22lucasmartins%2B951%40railsnapraia.com%22%2C%22lucasmartins%2B952%40railsnapraia.com%22%2C%22lucasmartins%2B953%40railsnapraia.com%22%2C%22lucasmartins%2B954%40railsnapraia.com%22%2C%22lucasmartins%2B955%40railsnapraia.com%22%2C%22lucasmartins%2B956%40railsnapraia.com%22%2C%22lucasmartins%2B957%40railsnapraia.com%22%2C%22lucasmartins%2B958%40railsnapraia.com%22%2C%22lucasmartins%2B959%40railsnapraia.com%22%2C%22lucasmartins%2B960%40railsnapraia.com%22%2C%22lucasmartins%2B961%40railsnapraia.com%22%2C%22lucasmartins%2B962%40railsnapraia.com%22%2C%22lucasmartins%2B963%40railsnapraia.com%22%2C%22lucasmartins%2B964%40railsnapraia.com%22%2C%22lucasmartins%2B965%40railsnapraia.com%22%2C%22lucasmartins%2B966%40railsnapraia.com%22%2C%22lucasmartins%2B967%40railsnapraia.com%22%2C%22lucasmartins%2B968%40railsnapraia.com%22%2C%22lucasmartins%2B969%40railsnapraia.com%22%2C%22lucasmartins%2B970%40railsnapraia.com%22%2C%22lucasmartins%2B971%40railsnapraia.com%22%2C%22lucasmartins%2B972%40railsnapraia.com%22%2C%22lucasmartins%2B973%40railsnapraia.com%22%2C%22lucasmartins%2B974%40railsnapraia.com%22%2C%22lucasmartins%2B975%40railsnapraia.com%22%2C%22lucasmartins%2B976%40railsnapraia.com%22%2C%22lucasmartins%2B977%40railsnapraia.com%22%2C%22lucasmartins%2B978%40railsnapraia.com%22%2C%22lucasmartins%2B979%40railsnapraia.com%22%2C%22lucasmartins%2B980%40railsnapraia.com%22%2C%22lucasmartins%2B981%40railsnapraia.com%22%2C%22lucasmartins%2B982%40railsnapraia.com%22%2C%22lucasmartins%2B983%40railsnapraia.com%22%2C%22lucasmartins%2B984%40railsnapraia.com%22%2C%22lucasmartins%2B985%40railsnapraia.com%22%2C%22lucasmartins%2B986%40railsnapraia.com%22%2C%22lucasmartins%2B987%40railsnapraia.com%22%2C%22lucasmartins%2B988%40railsnapraia.com%22%2C%22lucasmartins%2B989%40railsnapraia.com%22%2C%22lucasmartins%2B990%40railsnapraia.com%22%2C%22lucasmartins%2B991%40railsnapraia.com%22%2C%22lucasmartins%2B992%40railsnapraia.com%22%2C%22lucasmartins%2B993%40railsnapraia.com%22%2C%22lucasmartins%2B994%40railsnapraia.com%22%2C%22lucasmartins%2B995%40railsnapraia.com%22%2C%22lucasmartins%2B996%40railsnapraia.com%22%2C%22lucasmartins%2B997%40railsnapraia.com%22%2C%22lucasmartins%2B998%40railsnapraia.com%22%2C%22lucasmartins%2B999%40railsnapraia.com%22%5D%2C%22sub%22%3A%7B%22%25name%25%22%3A%5B%22Lucas+Martins+0%22%2C%22Lucas+Martins+1%22%2C%22Lucas+Martins+2%22%2C%22Lucas+Martins+3%22%2C%22Lucas+Martins+4%22%2C%22Lucas+Martins+5%22%2C%22Lucas+Martins+6%22%2C%22Lucas+Martins+7%22%2C%22Lucas+Martins+8%22%2C%22Lucas+Martins+9%22%2C%22Lucas+Martins+10%22%2C%22Lucas+Martins+11%22%2C%22Lucas+Martins+12%22%2C%22Lucas+Martins+13%22%2C%22Lucas+Martins+14%22%2C%22Lucas+Martins+15%22%2C%22Lucas+Martins+16%22%2C%22Lucas+Martins+17%22%2C%22Lucas+Martins+18%22%2C%22Lucas+Martins+19%22%2C%22Lucas+Martins+20%22%2C%22Lucas+Martins+21%22%2C%22Lucas+Martins+22%22%2C%22Lucas+Martins+23%22%2C%22Lucas+Martins+24%22%2C%22Lucas+Martins+25%22%2C%22Lucas+Martins+26%22%2C%22Lucas+Martins+27%22%2C%22Lucas+Martins+28%22%2C%22Lucas+Martins+29%22%2C%22Lucas+Martins+30%22%2C%22Lucas+Martins+31%22%2C%22Lucas+Martins+32%22%2C%22Lucas+Martins+33%22%2C%22Lucas+Martins+34%22%2C%22Lucas+Martins+35%22%2C%22Lucas+Martins+36%22%2C%22Lucas+Martins+37%22%2C%22Lucas+Martins+38%22%2C%22Lucas+Martins+39%22%2C%22Lucas+Martins+40%22%2C%22Lucas+Martins+41%22%2C%22Lucas+Martins+42%22%2C%22Lucas+Martins+43%22%2C%22Lucas+Martins+44%22%2C%22Lucas+Martins+45%22%2C%22Lucas+Martins+46%22%2C%22Lucas+Martins+47%22%2C%22Lucas+Martins+48%22%2C%22Lucas+Martins+49%22%2C%22Lucas+Martins+50%22%2C%22Lucas+Martins+51%22%2C%22Lucas+Martins+52%22%2C%22Lucas+Martins+53%22%2C%22Lucas+Martins+54%22%2C%22Lucas+Martins+55%22%2C%22Lucas+Martins+56%22%2C%22Lucas+Martins+57%22%2C%22Lucas+Martins+58%22%2C%22Lucas+Martins+59%22%2C%22Lucas+Martins+60%22%2C%22Lucas+Martins+61%22%2C%22Lucas+Martins+62%22%2C%22Lucas+Martins+63%22%2C%22Lucas+Martins+64%22%2C%22Lucas+Martins+65%22%2C%22Lucas+Martins+66%22%2C%22Lucas+Martins+67%22%2C%22Lucas+Martins+68%22%2C%22Lucas+Martins+69%22%2C%22Lucas+Martins+70%22%2C%22Lucas+Martins+71%22%2C%22Lucas+Martins+72%22%2C%22Lucas+Martins+73%22%2C%22Lucas+Martins+74%22%2C%22Lucas+Martins+75%22%2C%22Lucas+Martins+76%22%2C%22Lucas+Martins+77%22%2C%22Lucas+Martins+78%22%2C%22Lucas+Martins+79%22%2C%22Lucas+Martins+80%22%2C%22Lucas+Martins+81%22%2C%22Lucas+Martins+82%22%2C%22Lucas+Martins+83%22%2C%22Lucas+Martins+84%22%2C%22Lucas+Martins+85%22%2C%22Lucas+Martins+86%22%2C%22Lucas+Martins+87%22%2C%22Lucas+Martins+88%22%2C%22Lucas+Martins+89%22%2C%22Lucas+Martins+90%22%2C%22Lucas+Martins+91%22%2C%22Lucas+Martins+92%22%2C%22Lucas+Martins+93%22%2C%22Lucas+Martins+94%22%2C%22Lucas+Martins+95%22%2C%22Lucas+Martins+96%22%2C%22Lucas+Martins+97%22%2C%22Lucas+Martins+98%22%2C%22Lucas+Martins+99%22%2C%22Lucas+Martins+100%22%2C%22Lucas+Martins+101%22%2C%22Lucas+Martins+102%22%2C%22Lucas+Martins+103%22%2C%22Lucas+Martins+104%22%2C%22Lucas+Martins+105%22%2C%22Lucas+Martins+106%22%2C%22Lucas+Martins+107%22%2C%22Lucas+Martins+108%22%2C%22Lucas+Martins+109%22%2C%22Lucas+Martins+110%22%2C%22Lucas+Martins+111%22%2C%22Lucas+Martins+112%22%2C%22Lucas+Martins+113%22%2C%22Lucas+Martins+114%22%2C%22Lucas+Martins+115%22%2C%22Lucas+Martins+116%22%2C%22Lucas+Martins+117%22%2C%22Lucas+Martins+118%22%2C%22Lucas+Martins+119%22%2C%22Lucas+Martins+120%22%2C%22Lucas+Martins+121%22%2C%22Lucas+Martins+122%22%2C%22Lucas+Martins+123%22%2C%22Lucas+Martins+124%22%2C%22Lucas+Martins+125%22%2C%22Lucas+Martins+126%22%2C%22Lucas+Martins+127%22%2C%22Lucas+Martins+128%22%2C%22Lucas+Martins+129%22%2C%22Lucas+Martins+130%22%2C%22Lucas+Martins+131%22%2C%22Lucas+Martins+132%22%2C%22Lucas+Martins+133%22%2C%22Lucas+Martins+134%22%2C%22Lucas+Martins+135%22%2C%22Lucas+Martins+136%22%2C%22Lucas+Martins+137%22%2C%22Lucas+Martins+138%22%2C%22Lucas+Martins+139%22%2C%22Lucas+Martins+140%22%2C%22Lucas+Martins+141%22%2C%22Lucas+Martins+142%22%2C%22Lucas+Martins+143%22%2C%22Lucas+Martins+144%22%2C%22Lucas+Martins+145%22%2C%22Lucas+Martins+146%22%2C%22Lucas+Martins+147%22%2C%22Lucas+Martins+148%22%2C%22Lucas+Martins+149%22%2C%22Lucas+Martins+150%22%2C%22Lucas+Martins+151%22%2C%22Lucas+Martins+152%22%2C%22Lucas+Martins+153%22%2C%22Lucas+Martins+154%22%2C%22Lucas+Martins+155%22%2C%22Lucas+Martins+156%22%2C%22Lucas+Martins+157%22%2C%22Lucas+Martins+158%22%2C%22Lucas+Martins+159%22%2C%22Lucas+Martins+160%22%2C%22Lucas+Martins+161%22%2C%22Lucas+Martins+162%22%2C%22Lucas+Martins+163%22%2C%22Lucas+Martins+164%22%2C%22Lucas+Martins+165%22%2C%22Lucas+Martins+166%22%2C%22Lucas+Martins+167%22%2C%22Lucas+Martins+168%22%2C%22Lucas+Martins+169%22%2C%22Lucas+Martins+170%22%2C%22Lucas+Martins+171%22%2C%22Lucas+Martins+172%22%2C%22Lucas+Martins+173%22%2C%22Lucas+Martins+174%22%2C%22Lucas+Martins+175%22%2C%22Lucas+Martins+176%22%2C%22Lucas+Martins+177%22%2C%22Lucas+Martins+178%22%2C%22Lucas+Martins+179%22%2C%22Lucas+Martins+180%22%2C%22Lucas+Martins+181%22%2C%22Lucas+Martins+182%22%2C%22Lucas+Martins+183%22%2C%22Lucas+Martins+184%22%2C%22Lucas+Martins+185%22%2C%22Lucas+Martins+186%22%2C%22Lucas+Martins+187%22%2C%22Lucas+Martins+188%22%2C%22Lucas+Martins+189%22%2C%22Lucas+Martins+190%22%2C%22Lucas+Martins+191%22%2C%22Lucas+Martins+192%22%2C%22Lucas+Martins+193%22%2C%22Lucas+Martins+194%22%2C%22Lucas+Martins+195%22%2C%22Lucas+Martins+196%22%2C%22Lucas+Martins+197%22%2C%22Lucas+Martins+198%22%2C%22Lucas+Martins+199%22%2C%22Lucas+Martins+200%22%2C%22Lucas+Martins+201%22%2C%22Lucas+Martins+202%22%2C%22Lucas+Martins+203%22%2C%22Lucas+Martins+204%22%2C%22Lucas+Martins+205%22%2C%22Lucas+Martins+206%22%2C%22Lucas+Martins+207%22%2C%22Lucas+Martins+208%22%2C%22Lucas+Martins+209%22%2C%22Lucas+Martins+210%22%2C%22Lucas+Martins+211%22%2C%22Lucas+Martins+212%22%2C%22Lucas+Martins+213%22%2C%22Lucas+Martins+214%22%2C%22Lucas+Martins+215%22%2C%22Lucas+Martins+216%22%2C%22Lucas+Martins+217%22%2C%22Lucas+Martins+218%22%2C%22Lucas+Martins+219%22%2C%22Lucas+Martins+220%22%2C%22Lucas+Martins+221%22%2C%22Lucas+Martins+222%22%2C%22Lucas+Martins+223%22%2C%22Lucas+Martins+224%22%2C%22Lucas+Martins+225%22%2C%22Lucas+Martins+226%22%2C%22Lucas+Martins+227%22%2C%22Lucas+Martins+228%22%2C%22Lucas+Martins+229%22%2C%22Lucas+Martins+230%22%2C%22Lucas+Martins+231%22%2C%22Lucas+Martins+232%22%2C%22Lucas+Martins+233%22%2C%22Lucas+Martins+234%22%2C%22Lucas+Martins+235%22%2C%22Lucas+Martins+236%22%2C%22Lucas+Martins+237%22%2C%22Lucas+Martins+238%22%2C%22Lucas+Martins+239%22%2C%22Lucas+Martins+240%22%2C%22Lucas+Martins+241%22%2C%22Lucas+Martins+242%22%2C%22Lucas+Martins+243%22%2C%22Lucas+Martins+244%22%2C%22Lucas+Martins+245%22%2C%22Lucas+Martins+246%22%2C%22Lucas+Martins+247%22%2C%22Lucas+Martins+248%22%2C%22Lucas+Martins+249%22%2C%22Lucas+Martins+250%22%2C%22Lucas+Martins+251%22%2C%22Lucas+Martins+252%22%2C%22Lucas+Martins+253%22%2C%22Lucas+Martins+254%22%2C%22Lucas+Martins+255%22%2C%22Lucas+Martins+256%22%2C%22Lucas+Martins+257%22%2C%22Lucas+Martins+258%22%2C%22Lucas+Martins+259%22%2C%22Lucas+Martins+260%22%2C%22Lucas+Martins+261%22%2C%22Lucas+Martins+262%22%2C%22Lucas+Martins+263%22%2C%22Lucas+Martins+264%22%2C%22Lucas+Martins+265%22%2C%22Lucas+Martins+266%22%2C%22Lucas+Martins+267%22%2C%22Lucas+Martins+268%22%2C%22Lucas+Martins+269%22%2C%22Lucas+Martins+270%22%2C%22Lucas+Martins+271%22%2C%22Lucas+Martins+272%22%2C%22Lucas+Martins+273%22%2C%22Lucas+Martins+274%22%2C%22Lucas+Martins+275%22%2C%22Lucas+Martins+276%22%2C%22Lucas+Martins+277%22%2C%22Lucas+Martins+278%22%2C%22Lucas+Martins+279%22%2C%22Lucas+Martins+280%22%2C%22Lucas+Martins+281%22%2C%22Lucas+Martins+282%22%2C%22Lucas+Martins+283%22%2C%22Lucas+Martins+284%22%2C%22Lucas+Martins+285%22%2C%22Lucas+Martins+286%22%2C%22Lucas+Martins+287%22%2C%22Lucas+Martins+288%22%2C%22Lucas+Martins+289%22%2C%22Lucas+Martins+290%22%2C%22Lucas+Martins+291%22%2C%22Lucas+Martins+292%22%2C%22Lucas+Martins+293%22%2C%22Lucas+Martins+294%22%2C%22Lucas+Martins+295%22%2C%22Lucas+Martins+296%22%2C%22Lucas+Martins+297%22%2C%22Lucas+Martins+298%22%2C%22Lucas+Martins+299%22%2C%22Lucas+Martins+300%22%2C%22Lucas+Martins+301%22%2C%22Lucas+Martins+302%22%2C%22Lucas+Martins+303%22%2C%22Lucas+Martins+304%22%2C%22Lucas+Martins+305%22%2C%22Lucas+Martins+306%22%2C%22Lucas+Martins+307%22%2C%22Lucas+Martins+308%22%2C%22Lucas+Martins+309%22%2C%22Lucas+Martins+310%22%2C%22Lucas+Martins+311%22%2C%22Lucas+Martins+312%22%2C%22Lucas+Martins+313%22%2C%22Lucas+Martins+314%22%2C%22Lucas+Martins+315%22%2C%22Lucas+Martins+316%22%2C%22Lucas+Martins+317%22%2C%22Lucas+Martins+318%22%2C%22Lucas+Martins+319%22%2C%22Lucas+Martins+320%22%2C%22Lucas+Martins+321%22%2C%22Lucas+Martins+322%22%2C%22Lucas+Martins+323%22%2C%22Lucas+Martins+324%22%2C%22Lucas+Martins+325%22%2C%22Lucas+Martins+326%22%2C%22Lucas+Martins+327%22%2C%22Lucas+Martins+328%22%2C%22Lucas+Martins+329%22%2C%22Lucas+Martins+330%22%2C%22Lucas+Martins+331%22%2C%22Lucas+Martins+332%22%2C%22Lucas+Martins+333%22%2C%22Lucas+Martins+334%22%2C%22Lucas+Martins+335%22%2C%22Lucas+Martins+336%22%2C%22Lucas+Martins+337%22%2C%22Lucas+Martins+338%22%2C%22Lucas+Martins+339%22%2C%22Lucas+Martins+340%22%2C%22Lucas+Martins+341%22%2C%22Lucas+Martins+342%22%2C%22Lucas+Martins+343%22%2C%22Lucas+Martins+344%22%2C%22Lucas+Martins+345%22%2C%22Lucas+Martins+346%22%2C%22Lucas+Martins+347%22%2C%22Lucas+Martins+348%22%2C%22Lucas+Martins+349%22%2C%22Lucas+Martins+350%22%2C%22Lucas+Martins+351%22%2C%22Lucas+Martins+352%22%2C%22Lucas+Martins+353%22%2C%22Lucas+Martins+354%22%2C%22Lucas+Martins+355%22%2C%22Lucas+Martins+356%22%2C%22Lucas+Martins+357%22%2C%22Lucas+Martins+358%22%2C%22Lucas+Martins+359%22%2C%22Lucas+Martins+360%22%2C%22Lucas+Martins+361%22%2C%22Lucas+Martins+362%22%2C%22Lucas+Martins+363%22%2C%22Lucas+Martins+364%22%2C%22Lucas+Martins+365%22%2C%22Lucas+Martins+366%22%2C%22Lucas+Martins+367%22%2C%22Lucas+Martins+368%22%2C%22Lucas+Martins+369%22%2C%22Lucas+Martins+370%22%2C%22Lucas+Martins+371%22%2C%22Lucas+Martins+372%22%2C%22Lucas+Martins+373%22%2C%22Lucas+Martins+374%22%2C%22Lucas+Martins+375%22%2C%22Lucas+Martins+376%22%2C%22Lucas+Martins+377%22%2C%22Lucas+Martins+378%22%2C%22Lucas+Martins+379%22%2C%22Lucas+Martins+380%22%2C%22Lucas+Martins+381%22%2C%22Lucas+Martins+382%22%2C%22Lucas+Martins+383%22%2C%22Lucas+Martins+384%22%2C%22Lucas+Martins+385%22%2C%22Lucas+Martins+386%22%2C%22Lucas+Martins+387%22%2C%22Lucas+Martins+388%22%2C%22Lucas+Martins+389%22%2C%22Lucas+Martins+390%22%2C%22Lucas+Martins+391%22%2C%22Lucas+Martins+392%22%2C%22Lucas+Martins+393%22%2C%22Lucas+Martins+394%22%2C%22Lucas+Martins+395%22%2C%22Lucas+Martins+396%22%2C%22Lucas+Martins+397%22%2C%22Lucas+Martins+398%22%2C%22Lucas+Martins+399%22%2C%22Lucas+Martins+400%22%2C%22Lucas+Martins+401%22%2C%22Lucas+Martins+402%22%2C%22Lucas+Martins+403%22%2C%22Lucas+Martins+404%22%2C%22Lucas+Martins+405%22%2C%22Lucas+Martins+406%22%2C%22Lucas+Martins+407%22%2C%22Lucas+Martins+408%22%2C%22Lucas+Martins+409%22%2C%22Lucas+Martins+410%22%2C%22Lucas+Martins+411%22%2C%22Lucas+Martins+412%22%2C%22Lucas+Martins+413%22%2C%22Lucas+Martins+414%22%2C%22Lucas+Martins+415%22%2C%22Lucas+Martins+416%22%2C%22Lucas+Martins+417%22%2C%22Lucas+Martins+418%22%2C%22Lucas+Martins+419%22%2C%22Lucas+Martins+420%22%2C%22Lucas+Martins+421%22%2C%22Lucas+Martins+422%22%2C%22Lucas+Martins+423%22%2C%22Lucas+Martins+424%22%2C%22Lucas+Martins+425%22%2C%22Lucas+Martins+426%22%2C%22Lucas+Martins+427%22%2C%22Lucas+Martins+428%22%2C%22Lucas+Martins+429%22%2C%22Lucas+Martins+430%22%2C%22Lucas+Martins+431%22%2C%22Lucas+Martins+432%22%2C%22Lucas+Martins+433%22%2C%22Lucas+Martins+434%22%2C%22Lucas+Martins+435%22%2C%22Lucas+Martins+436%22%2C%22Lucas+Martins+437%22%2C%22Lucas+Martins+438%22%2C%22Lucas+Martins+439%22%2C%22Lucas+Martins+440%22%2C%22Lucas+Martins+441%22%2C%22Lucas+Martins+442%22%2C%22Lucas+Martins+443%22%2C%22Lucas+Martins+444%22%2C%22Lucas+Martins+445%22%2C%22Lucas+Martins+446%22%2C%22Lucas+Martins+447%22%2C%22Lucas+Martins+448%22%2C%22Lucas+Martins+449%22%2C%22Lucas+Martins+450%22%2C%22Lucas+Martins+451%22%2C%22Lucas+Martins+452%22%2C%22Lucas+Martins+453%22%2C%22Lucas+Martins+454%22%2C%22Lucas+Martins+455%22%2C%22Lucas+Martins+456%22%2C%22Lucas+Martins+457%22%2C%22Lucas+Martins+458%22%2C%22Lucas+Martins+459%22%2C%22Lucas+Martins+460%22%2C%22Lucas+Martins+461%22%2C%22Lucas+Martins+462%22%2C%22Lucas+Martins+463%22%2C%22Lucas+Martins+464%22%2C%22Lucas+Martins+465%22%2C%22Lucas+Martins+466%22%2C%22Lucas+Martins+467%22%2C%22Lucas+Martins+468%22%2C%22Lucas+Martins+469%22%2C%22Lucas+Martins+470%22%2C%22Lucas+Martins+471%22%2C%22Lucas+Martins+472%22%2C%22Lucas+Martins+473%22%2C%22Lucas+Martins+474%22%2C%22Lucas+Martins+475%22%2C%22Lucas+Martins+476%22%2C%22Lucas+Martins+477%22%2C%22Lucas+Martins+478%22%2C%22Lucas+Martins+479%22%2C%22Lucas+Martins+480%22%2C%22Lucas+Martins+481%22%2C%22Lucas+Martins+482%22%2C%22Lucas+Martins+483%22%2C%22Lucas+Martins+484%22%2C%22Lucas+Martins+485%22%2C%22Lucas+Martins+486%22%2C%22Lucas+Martins+487%22%2C%22Lucas+Martins+488%22%2C%22Lucas+Martins+489%22%2C%22Lucas+Martins+490%22%2C%22Lucas+Martins+491%22%2C%22Lucas+Martins+492%22%2C%22Lucas+Martins+493%22%2C%22Lucas+Martins+494%22%2C%22Lucas+Martins+495%22%2C%22Lucas+Martins+496%22%2C%22Lucas+Martins+497%22%2C%22Lucas+Martins+498%22%2C%22Lucas+Martins+499%22%2C%22Lucas+Martins+500%22%2C%22Lucas+Martins+501%22%2C%22Lucas+Martins+502%22%2C%22Lucas+Martins+503%22%2C%22Lucas+Martins+504%22%2C%22Lucas+Martins+505%22%2C%22Lucas+Martins+506%22%2C%22Lucas+Martins+507%22%2C%22Lucas+Martins+508%22%2C%22Lucas+Martins+509%22%2C%22Lucas+Martins+510%22%2C%22Lucas+Martins+511%22%2C%22Lucas+Martins+512%22%2C%22Lucas+Martins+513%22%2C%22Lucas+Martins+514%22%2C%22Lucas+Martins+515%22%2C%22Lucas+Martins+516%22%2C%22Lucas+Martins+517%22%2C%22Lucas+Martins+518%22%2C%22Lucas+Martins+519%22%2C%22Lucas+Martins+520%22%2C%22Lucas+Martins+521%22%2C%22Lucas+Martins+522%22%2C%22Lucas+Martins+523%22%2C%22Lucas+Martins+524%22%2C%22Lucas+Martins+525%22%2C%22Lucas+Martins+526%22%2C%22Lucas+Martins+527%22%2C%22Lucas+Martins+528%22%2C%22Lucas+Martins+529%22%2C%22Lucas+Martins+530%22%2C%22Lucas+Martins+531%22%2C%22Lucas+Martins+532%22%2C%22Lucas+Martins+533%22%2C%22Lucas+Martins+534%22%2C%22Lucas+Martins+535%22%2C%22Lucas+Martins+536%22%2C%22Lucas+Martins+537%22%2C%22Lucas+Martins+538%22%2C%22Lucas+Martins+539%22%2C%22Lucas+Martins+540%22%2C%22Lucas+Martins+541%22%2C%22Lucas+Martins+542%22%2C%22Lucas+Martins+543%22%2C%22Lucas+Martins+544%22%2C%22Lucas+Martins+545%22%2C%22Lucas+Martins+546%22%2C%22Lucas+Martins+547%22%2C%22Lucas+Martins+548%22%2C%22Lucas+Martins+549%22%2C%22Lucas+Martins+550%22%2C%22Lucas+Martins+551%22%2C%22Lucas+Martins+552%22%2C%22Lucas+Martins+553%22%2C%22Lucas+Martins+554%22%2C%22Lucas+Martins+555%22%2C%22Lucas+Martins+556%22%2C%22Lucas+Martins+557%22%2C%22Lucas+Martins+558%22%2C%22Lucas+Martins+559%22%2C%22Lucas+Martins+560%22%2C%22Lucas+Martins+561%22%2C%22Lucas+Martins+562%22%2C%22Lucas+Martins+563%22%2C%22Lucas+Martins+564%22%2C%22Lucas+Martins+565%22%2C%22Lucas+Martins+566%22%2C%22Lucas+Martins+567%22%2C%22Lucas+Martins+568%22%2C%22Lucas+Martins+569%22%2C%22Lucas+Martins+570%22%2C%22Lucas+Martins+571%22%2C%22Lucas+Martins+572%22%2C%22Lucas+Martins+573%22%2C%22Lucas+Martins+574%22%2C%22Lucas+Martins+575%22%2C%22Lucas+Martins+576%22%2C%22Lucas+Martins+577%22%2C%22Lucas+Martins+578%22%2C%22Lucas+Martins+579%22%2C%22Lucas+Martins+580%22%2C%22Lucas+Martins+581%22%2C%22Lucas+Martins+582%22%2C%22Lucas+Martins+583%22%2C%22Lucas+Martins+584%22%2C%22Lucas+Martins+585%22%2C%22Lucas+Martins+586%22%2C%22Lucas+Martins+587%22%2C%22Lucas+Martins+588%22%2C%22Lucas+Martins+589%22%2C%22Lucas+Martins+590%22%2C%22Lucas+Martins+591%22%2C%22Lucas+Martins+592%22%2C%22Lucas+Martins+593%22%2C%22Lucas+Martins+594%22%2C%22Lucas+Martins+595%22%2C%22Lucas+Martins+596%22%2C%22Lucas+Martins+597%22%2C%22Lucas+Martins+598%22%2C%22Lucas+Martins+599%22%2C%22Lucas+Martins+600%22%2C%22Lucas+Martins+601%22%2C%22Lucas+Martins+602%22%2C%22Lucas+Martins+603%22%2C%22Lucas+Martins+604%22%2C%22Lucas+Martins+605%22%2C%22Lucas+Martins+606%22%2C%22Lucas+Martins+607%22%2C%22Lucas+Martins+608%22%2C%22Lucas+Martins+609%22%2C%22Lucas+Martins+610%22%2C%22Lucas+Martins+611%22%2C%22Lucas+Martins+612%22%2C%22Lucas+Martins+613%22%2C%22Lucas+Martins+614%22%2C%22Lucas+Martins+615%22%2C%22Lucas+Martins+616%22%2C%22Lucas+Martins+617%22%2C%22Lucas+Martins+618%22%2C%22Lucas+Martins+619%22%2C%22Lucas+Martins+620%22%2C%22Lucas+Martins+621%22%2C%22Lucas+Martins+622%22%2C%22Lucas+Martins+623%22%2C%22Lucas+Martins+624%22%2C%22Lucas+Martins+625%22%2C%22Lucas+Martins+626%22%2C%22Lucas+Martins+627%22%2C%22Lucas+Martins+628%22%2C%22Lucas+Martins+629%22%2C%22Lucas+Martins+630%22%2C%22Lucas+Martins+631%22%2C%22Lucas+Martins+632%22%2C%22Lucas+Martins+633%22%2C%22Lucas+Martins+634%22%2C%22Lucas+Martins+635%22%2C%22Lucas+Martins+636%22%2C%22Lucas+Martins+637%22%2C%22Lucas+Martins+638%22%2C%22Lucas+Martins+639%22%2C%22Lucas+Martins+640%22%2C%22Lucas+Martins+641%22%2C%22Lucas+Martins+642%22%2C%22Lucas+Martins+643%22%2C%22Lucas+Martins+644%22%2C%22Lucas+Martins+645%22%2C%22Lucas+Martins+646%22%2C%22Lucas+Martins+647%22%2C%22Lucas+Martins+648%22%2C%22Lucas+Martins+649%22%2C%22Lucas+Martins+650%22%2C%22Lucas+Martins+651%22%2C%22Lucas+Martins+652%22%2C%22Lucas+Martins+653%22%2C%22Lucas+Martins+654%22%2C%22Lucas+Martins+655%22%2C%22Lucas+Martins+656%22%2C%22Lucas+Martins+657%22%2C%22Lucas+Martins+658%22%2C%22Lucas+Martins+659%22%2C%22Lucas+Martins+660%22%2C%22Lucas+Martins+661%22%2C%22Lucas+Martins+662%22%2C%22Lucas+Martins+663%22%2C%22Lucas+Martins+664%22%2C%22Lucas+Martins+665%22%2C%22Lucas+Martins+666%22%2C%22Lucas+Martins+667%22%2C%22Lucas+Martins+668%22%2C%22Lucas+Martins+669%22%2C%22Lucas+Martins+670%22%2C%22Lucas+Martins+671%22%2C%22Lucas+Martins+672%22%2C%22Lucas+Martins+673%22%2C%22Lucas+Martins+674%22%2C%22Lucas+Martins+675%22%2C%22Lucas+Martins+676%22%2C%22Lucas+Martins+677%22%2C%22Lucas+Martins+678%22%2C%22Lucas+Martins+679%22%2C%22Lucas+Martins+680%22%2C%22Lucas+Martins+681%22%2C%22Lucas+Martins+682%22%2C%22Lucas+Martins+683%22%2C%22Lucas+Martins+684%22%2C%22Lucas+Martins+685%22%2C%22Lucas+Martins+686%22%2C%22Lucas+Martins+687%22%2C%22Lucas+Martins+688%22%2C%22Lucas+Martins+689%22%2C%22Lucas+Martins+690%22%2C%22Lucas+Martins+691%22%2C%22Lucas+Martins+692%22%2C%22Lucas+Martins+693%22%2C%22Lucas+Martins+694%22%2C%22Lucas+Martins+695%22%2C%22Lucas+Martins+696%22%2C%22Lucas+Martins+697%22%2C%22Lucas+Martins+698%22%2C%22Lucas+Martins+699%22%2C%22Lucas+Martins+700%22%2C%22Lucas+Martins+701%22%2C%22Lucas+Martins+702%22%2C%22Lucas+Martins+703%22%2C%22Lucas+Martins+704%22%2C%22Lucas+Martins+705%22%2C%22Lucas+Martins+706%22%2C%22Lucas+Martins+707%22%2C%22Lucas+Martins+708%22%2C%22Lucas+Martins+709%22%2C%22Lucas+Martins+710%22%2C%22Lucas+Martins+711%22%2C%22Lucas+Martins+712%22%2C%22Lucas+Martins+713%22%2C%22Lucas+Martins+714%22%2C%22Lucas+Martins+715%22%2C%22Lucas+Martins+716%22%2C%22Lucas+Martins+717%22%2C%22Lucas+Martins+718%22%2C%22Lucas+Martins+719%22%2C%22Lucas+Martins+720%22%2C%22Lucas+Martins+721%22%2C%22Lucas+Martins+722%22%2C%22Lucas+Martins+723%22%2C%22Lucas+Martins+724%22%2C%22Lucas+Martins+725%22%2C%22Lucas+Martins+726%22%2C%22Lucas+Martins+727%22%2C%22Lucas+Martins+728%22%2C%22Lucas+Martins+729%22%2C%22Lucas+Martins+730%22%2C%22Lucas+Martins+731%22%2C%22Lucas+Martins+732%22%2C%22Lucas+Martins+733%22%2C%22Lucas+Martins+734%22%2C%22Lucas+Martins+735%22%2C%22Lucas+Martins+736%22%2C%22Lucas+Martins+737%22%2C%22Lucas+Martins+738%22%2C%22Lucas+Martins+739%22%2C%22Lucas+Martins+740%22%2C%22Lucas+Martins+741%22%2C%22Lucas+Martins+742%22%2C%22Lucas+Martins+743%22%2C%22Lucas+Martins+744%22%2C%22Lucas+Martins+745%22%2C%22Lucas+Martins+746%22%2C%22Lucas+Martins+747%22%2C%22Lucas+Martins+748%22%2C%22Lucas+Martins+749%22%2C%22Lucas+Martins+750%22%2C%22Lucas+Martins+751%22%2C%22Lucas+Martins+752%22%2C%22Lucas+Martins+753%22%2C%22Lucas+Martins+754%22%2C%22Lucas+Martins+755%22%2C%22Lucas+Martins+756%22%2C%22Lucas+Martins+757%22%2C%22Lucas+Martins+758%22%2C%22Lucas+Martins+759%22%2C%22Lucas+Martins+760%22%2C%22Lucas+Martins+761%22%2C%22Lucas+Martins+762%22%2C%22Lucas+Martins+763%22%2C%22Lucas+Martins+764%22%2C%22Lucas+Martins+765%22%2C%22Lucas+Martins+766%22%2C%22Lucas+Martins+767%22%2C%22Lucas+Martins+768%22%2C%22Lucas+Martins+769%22%2C%22Lucas+Martins+770%22%2C%22Lucas+Martins+771%22%2C%22Lucas+Martins+772%22%2C%22Lucas+Martins+773%22%2C%22Lucas+Martins+774%22%2C%22Lucas+Martins+775%22%2C%22Lucas+Martins+776%22%2C%22Lucas+Martins+777%22%2C%22Lucas+Martins+778%22%2C%22Lucas+Martins+779%22%2C%22Lucas+Martins+780%22%2C%22Lucas+Martins+781%22%2C%22Lucas+Martins+782%22%2C%22Lucas+Martins+783%22%2C%22Lucas+Martins+784%22%2C%22Lucas+Martins+785%22%2C%22Lucas+Martins+786%22%2C%22Lucas+Martins+787%22%2C%22Lucas+Martins+788%22%2C%22Lucas+Martins+789%22%2C%22Lucas+Martins+790%22%2C%22Lucas+Martins+791%22%2C%22Lucas+Martins+792%22%2C%22Lucas+Martins+793%22%2C%22Lucas+Martins+794%22%2C%22Lucas+Martins+795%22%2C%22Lucas+Martins+796%22%2C%22Lucas+Martins+797%22%2C%22Lucas+Martins+798%22%2C%22Lucas+Martins+799%22%2C%22Lucas+Martins+800%22%2C%22Lucas+Martins+801%22%2C%22Lucas+Martins+802%22%2C%22Lucas+Martins+803%22%2C%22Lucas+Martins+804%22%2C%22Lucas+Martins+805%22%2C%22Lucas+Martins+806%22%2C%22Lucas+Martins+807%22%2C%22Lucas+Martins+808%22%2C%22Lucas+Martins+809%22%2C%22Lucas+Martins+810%22%2C%22Lucas+Martins+811%22%2C%22Lucas+Martins+812%22%2C%22Lucas+Martins+813%22%2C%22Lucas+Martins+814%22%2C%22Lucas+Martins+815%22%2C%22Lucas+Martins+816%22%2C%22Lucas+Martins+817%22%2C%22Lucas+Martins+818%22%2C%22Lucas+Martins+819%22%2C%22Lucas+Martins+820%22%2C%22Lucas+Martins+821%22%2C%22Lucas+Martins+822%22%2C%22Lucas+Martins+823%22%2C%22Lucas+Martins+824%22%2C%22Lucas+Martins+825%22%2C%22Lucas+Martins+826%22%2C%22Lucas+Martins+827%22%2C%22Lucas+Martins+828%22%2C%22Lucas+Martins+829%22%2C%22Lucas+Martins+830%22%2C%22Lucas+Martins+831%22%2C%22Lucas+Martins+832%22%2C%22Lucas+Martins+833%22%2C%22Lucas+Martins+834%22%2C%22Lucas+Martins+835%22%2C%22Lucas+Martins+836%22%2C%22Lucas+Martins+837%22%2C%22Lucas+Martins+838%22%2C%22Lucas+Martins+839%22%2C%22Lucas+Martins+840%22%2C%22Lucas+Martins+841%22%2C%22Lucas+Martins+842%22%2C%22Lucas+Martins+843%22%2C%22Lucas+Martins+844%22%2C%22Lucas+Martins+845%22%2C%22Lucas+Martins+846%22%2C%22Lucas+Martins+847%22%2C%22Lucas+Martins+848%22%2C%22Lucas+Martins+849%22%2C%22Lucas+Martins+850%22%2C%22Lucas+Martins+851%22%2C%22Lucas+Martins+852%22%2C%22Lucas+Martins+853%22%2C%22Lucas+Martins+854%22%2C%22Lucas+Martins+855%22%2C%22Lucas+Martins+856%22%2C%22Lucas+Martins+857%22%2C%22Lucas+Martins+858%22%2C%22Lucas+Martins+859%22%2C%22Lucas+Martins+860%22%2C%22Lucas+Martins+861%22%2C%22Lucas+Martins+862%22%2C%22Lucas+Martins+863%22%2C%22Lucas+Martins+864%22%2C%22Lucas+Martins+865%22%2C%22Lucas+Martins+866%22%2C%22Lucas+Martins+867%22%2C%22Lucas+Martins+868%22%2C%22Lucas+Martins+869%22%2C%22Lucas+Martins+870%22%2C%22Lucas+Martins+871%22%2C%22Lucas+Martins+872%22%2C%22Lucas+Martins+873%22%2C%22Lucas+Martins+874%22%2C%22Lucas+Martins+875%22%2C%22Lucas+Martins+876%22%2C%22Lucas+Martins+877%22%2C%22Lucas+Martins+878%22%2C%22Lucas+Martins+879%22%2C%22Lucas+Martins+880%22%2C%22Lucas+Martins+881%22%2C%22Lucas+Martins+882%22%2C%22Lucas+Martins+883%22%2C%22Lucas+Martins+884%22%2C%22Lucas+Martins+885%22%2C%22Lucas+Martins+886%22%2C%22Lucas+Martins+887%22%2C%22Lucas+Martins+888%22%2C%22Lucas+Martins+889%22%2C%22Lucas+Martins+890%22%2C%22Lucas+Martins+891%22%2C%22Lucas+Martins+892%22%2C%22Lucas+Martins+893%22%2C%22Lucas+Martins+894%22%2C%22Lucas+Martins+895%22%2C%22Lucas+Martins+896%22%2C%22Lucas+Martins+897%22%2C%22Lucas+Martins+898%22%2C%22Lucas+Martins+899%22%2C%22Lucas+Martins+900%22%2C%22Lucas+Martins+901%22%2C%22Lucas+Martins+902%22%2C%22Lucas+Martins+903%22%2C%22Lucas+Martins+904%22%2C%22Lucas+Martins+905%22%2C%22Lucas+Martins+906%22%2C%22Lucas+Martins+907%22%2C%22Lucas+Martins+908%22%2C%22Lucas+Martins+909%22%2C%22Lucas+Martins+910%22%2C%22Lucas+Martins+911%22%2C%22Lucas+Martins+912%22%2C%22Lucas+Martins+913%22%2C%22Lucas+Martins+914%22%2C%22Lucas+Martins+915%22%2C%22Lucas+Martins+916%22%2C%22Lucas+Martins+917%22%2C%22Lucas+Martins+918%22%2C%22Lucas+Martins+919%22%2C%22Lucas+Martins+920%22%2C%22Lucas+Martins+921%22%2C%22Lucas+Martins+922%22%2C%22Lucas+Martins+923%22%2C%22Lucas+Martins+924%22%2C%22Lucas+Martins+925%22%2C%22Lucas+Martins+926%22%2C%22Lucas+Martins+927%22%2C%22Lucas+Martins+928%22%2C%22Lucas+Martins+929%22%2C%22Lucas+Martins+930%22%2C%22Lucas+Martins+931%22%2C%22Lucas+Martins+932%22%2C%22Lucas+Martins+933%22%2C%22Lucas+Martins+934%22%2C%22Lucas+Martins+935%22%2C%22Lucas+Martins+936%22%2C%22Lucas+Martins+937%22%2C%22Lucas+Martins+938%22%2C%22Lucas+Martins+939%22%2C%22Lucas+Martins+940%22%2C%22Lucas+Martins+941%22%2C%22Lucas+Martins+942%22%2C%22Lucas+Martins+943%22%2C%22Lucas+Martins+944%22%2C%22Lucas+Martins+945%22%2C%22Lucas+Martins+946%22%2C%22Lucas+Martins+947%22%2C%22Lucas+Martins+948%22%2C%22Lucas+Martins+949%22%2C%22Lucas+Martins+950%22%2C%22Lucas+Martins+951%22%2C%22Lucas+Martins+952%22%2C%22Lucas+Martins+953%22%2C%22Lucas+Martins+954%22%2C%22Lucas+Martins+955%22%2C%22Lucas+Martins+956%22%2C%22Lucas+Martins+957%22%2C%22Lucas+Martins+958%22%2C%22Lucas+Martins+959%22%2C%22Lucas+Martins+960%22%2C%22Lucas+Martins+961%22%2C%22Lucas+Martins+962%22%2C%22Lucas+Martins+963%22%2C%22Lucas+Martins+964%22%2C%22Lucas+Martins+965%22%2C%22Lucas+Martins+966%22%2C%22Lucas+Martins+967%22%2C%22Lucas+Martins+968%22%2C%22Lucas+Martins+969%22%2C%22Lucas+Martins+970%22%2C%22Lucas+Martins+971%22%2C%22Lucas+Martins+972%22%2C%22Lucas+Martins+973%22%2C%22Lucas+Martins+974%22%2C%22Lucas+Martins+975%22%2C%22Lucas+Martins+976%22%2C%22Lucas+Martins+977%22%2C%22Lucas+Martins+978%22%2C%22Lucas+Martins+979%22%2C%22Lucas+Martins+980%22%2C%22Lucas+Martins+981%22%2C%22Lucas+Martins+982%22%2C%22Lucas+Martins+983%22%2C%22Lucas+Martins+984%22%2C%22Lucas+Martins+985%22%2C%22Lucas+Martins+986%22%2C%22Lucas+Martins+987%22%2C%22Lucas+Martins+988%22%2C%22Lucas+Martins+989%22%2C%22Lucas+Martins+990%22%2C%22Lucas+Martins+991%22%2C%22Lucas+Martins+992%22%2C%22Lucas+Martins+993%22%2C%22Lucas+Martins+994%22%2C%22Lucas+Martins+995%22%2C%22Lucas+Martins+996%22%2C%22Lucas+Martins+997%22%2C%22Lucas+Martins+998%22%2C%22Lucas+Martins+999%22%5D%7D%7D
|
9
|
+
headers:
|
10
|
+
User-Agent:
|
11
|
+
- Faraday v0.8.8
|
12
|
+
Accept-Encoding:
|
13
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
14
|
+
Accept:
|
15
|
+
- '*/*'
|
16
|
+
response:
|
17
|
+
status:
|
18
|
+
code: 200
|
19
|
+
message: OK
|
20
|
+
headers:
|
21
|
+
Server:
|
22
|
+
- nginx/1.4.2
|
23
|
+
Date:
|
24
|
+
- Tue, 07 Jan 2014 16:17:43 GMT
|
25
|
+
Content-Type:
|
26
|
+
- application/json
|
27
|
+
Transfer-Encoding:
|
28
|
+
- chunked
|
29
|
+
Connection:
|
30
|
+
- keep-alive
|
31
|
+
body:
|
32
|
+
encoding: UTF-8
|
33
|
+
string: '{"message":"success"}'
|
34
|
+
http_version:
|
35
|
+
recorded_at: Tue, 07 Jan 2014 16:17:18 GMT
|
36
|
+
recorded_with: VCR 2.8.0
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe "shoot 1k emails!" do
|
4
|
+
let(:envelope) { build(:envelope_multi_1k) }
|
5
|
+
it "sends http request for Sendgrid web API" do
|
6
|
+
VCR.use_cassette('mailcannon_integration_1k') do
|
7
|
+
expect(envelope.send_bulk!).to eq({"message"=>"success"})
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
|
-
describe MailCannon::Adapter::
|
3
|
+
describe MailCannon::Adapter::SendgridWeb do
|
4
4
|
describe "#send!" do
|
5
5
|
let(:envelope) { build(:envelope) }
|
6
6
|
it "sends http request for Sendgrid web API" do
|
@@ -15,5 +15,13 @@ describe MailCannon::Adapter::Sendgrid do
|
|
15
15
|
end
|
16
16
|
end
|
17
17
|
end
|
18
|
-
end
|
19
18
|
|
19
|
+
describe "#send_bulk!" do
|
20
|
+
let(:envelope) { build(:envelope_multi) }
|
21
|
+
it "sends http request for Sendgrid web API" do
|
22
|
+
VCR.use_cassette('mailcannon_adapter_sendgrid_send_bulk') do
|
23
|
+
expect(envelope.send_bulk!).to eq({"message"=>"success"})
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -4,7 +4,7 @@ describe MailCannon::Envelope do
|
|
4
4
|
describe "initialize" do
|
5
5
|
let(:envelope) { build(:envelope) }
|
6
6
|
it "creates a new Stamp" do
|
7
|
-
expect{ envelope.save }.to change{
|
7
|
+
expect{ envelope.save }.to change{envelope.stamps.size}.by(1)
|
8
8
|
end
|
9
9
|
context "check for expected adapter behavior" do
|
10
10
|
it "implements send! behavior" do
|
data/spec/spec_helper.rb
CHANGED
@@ -11,6 +11,15 @@ require 'vcr'
|
|
11
11
|
require 'webmock'
|
12
12
|
require 'webmock/rspec'
|
13
13
|
|
14
|
+
if ENV['TRAVIS']==true
|
15
|
+
begin
|
16
|
+
require 'coveralls'
|
17
|
+
Coveralls.wear!
|
18
|
+
rescue Exception => e
|
19
|
+
puts "Coveralls not available!"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
14
23
|
SPECDIR = Pathname.new(File.dirname(__FILE__))
|
15
24
|
TMPDIR = SPECDIR.join("tmp")
|
16
25
|
|
@@ -42,7 +51,7 @@ end
|
|
42
51
|
VCR.configure do |c|
|
43
52
|
c.cassette_library_dir = 'spec/fixtures/cassettes'
|
44
53
|
c.hook_into :webmock
|
45
|
-
c.allow_http_connections_when_no_cassette =
|
54
|
+
c.allow_http_connections_when_no_cassette = true
|
46
55
|
end
|
47
56
|
|
48
|
-
Mongoid.load!("spec/support/mongoid.yml",
|
57
|
+
Mongoid.load!("spec/support/mongoid.yml", 'test')
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mailcannon
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lucas Martins
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-01-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: vcr
|
@@ -156,7 +156,21 @@ dependencies:
|
|
156
156
|
- - '>='
|
157
157
|
- !ruby/object:Gem::Version
|
158
158
|
version: '0'
|
159
|
-
|
159
|
+
- !ruby/object:Gem::Dependency
|
160
|
+
name: yard
|
161
|
+
requirement: !ruby/object:Gem::Requirement
|
162
|
+
requirements:
|
163
|
+
- - '>='
|
164
|
+
- !ruby/object:Gem::Version
|
165
|
+
version: '0'
|
166
|
+
type: :development
|
167
|
+
prerelease: false
|
168
|
+
version_requirements: !ruby/object:Gem::Requirement
|
169
|
+
requirements:
|
170
|
+
- - '>='
|
171
|
+
- !ruby/object:Gem::Version
|
172
|
+
version: '0'
|
173
|
+
description: A mass mailing tool for real threads aficionados
|
160
174
|
email:
|
161
175
|
- lucasmartins@railsnapraia.com
|
162
176
|
executables: []
|
@@ -167,10 +181,12 @@ files:
|
|
167
181
|
- .rspec
|
168
182
|
- .ruby-version
|
169
183
|
- .travis.yml
|
184
|
+
- .yardopts
|
170
185
|
- Gemfile
|
171
186
|
- Gemfile.lock
|
172
187
|
- Rakefile
|
173
188
|
- Readme.md
|
189
|
+
- ReadmeContributors.md
|
174
190
|
- config/locales/en.yml
|
175
191
|
- config/locales/pt-BR.yml
|
176
192
|
- env.sample.sh
|
@@ -178,20 +194,21 @@ files:
|
|
178
194
|
- lib/generators/highrise_mapper/config_generator.rb
|
179
195
|
- lib/mailcannon.rb
|
180
196
|
- lib/mailcannon/adapter.rb
|
181
|
-
- lib/mailcannon/adapters/
|
197
|
+
- lib/mailcannon/adapters/sendgrid_web.rb
|
182
198
|
- lib/mailcannon/envelope.rb
|
183
199
|
- lib/mailcannon/event.rb
|
184
200
|
- lib/mailcannon/mail.rb
|
185
201
|
- lib/mailcannon/stamp.rb
|
186
202
|
- lib/mailcannon/version.rb
|
187
|
-
- lib/mailcannon/workers/
|
188
|
-
- lib/mailcannon/workers/single_barrel.rb
|
203
|
+
- lib/mailcannon/workers/barrel.rb
|
189
204
|
- mailcannon.gemspec
|
190
205
|
- spec/factories/envelope.rb
|
191
|
-
- spec/factories/mail.rb
|
192
206
|
- spec/factories/stamp.rb
|
193
207
|
- spec/fixtures/cassettes/mailcannon_adapter_sendgrid.send.yml
|
194
208
|
- spec/fixtures/cassettes/mailcannon_adapter_sendgrid_send.yml
|
209
|
+
- spec/fixtures/cassettes/mailcannon_adapter_sendgrid_send_bulk.yml
|
210
|
+
- spec/fixtures/cassettes/mailcannon_integration_1k.yml
|
211
|
+
- spec/integration/1k_spec.rb
|
195
212
|
- spec/mailcannon/adapters/sendgrid_spec.rb
|
196
213
|
- spec/mailcannon/envelope_spec.rb
|
197
214
|
- spec/mailcannon/stamp_spec.rb
|
@@ -223,16 +240,19 @@ rubyforge_project:
|
|
223
240
|
rubygems_version: 2.0.14
|
224
241
|
signing_key:
|
225
242
|
specification_version: 4
|
226
|
-
summary:
|
243
|
+
summary: A mass mailing tool for real threads aficionados
|
227
244
|
test_files:
|
228
245
|
- spec/factories/envelope.rb
|
229
|
-
- spec/factories/mail.rb
|
230
246
|
- spec/factories/stamp.rb
|
231
247
|
- spec/fixtures/cassettes/mailcannon_adapter_sendgrid.send.yml
|
232
248
|
- spec/fixtures/cassettes/mailcannon_adapter_sendgrid_send.yml
|
249
|
+
- spec/fixtures/cassettes/mailcannon_adapter_sendgrid_send_bulk.yml
|
250
|
+
- spec/fixtures/cassettes/mailcannon_integration_1k.yml
|
251
|
+
- spec/integration/1k_spec.rb
|
233
252
|
- spec/mailcannon/adapters/sendgrid_spec.rb
|
234
253
|
- spec/mailcannon/envelope_spec.rb
|
235
254
|
- spec/mailcannon/stamp_spec.rb
|
236
255
|
- spec/mailcannon_spec.rb
|
237
256
|
- spec/spec_helper.rb
|
238
257
|
- spec/support/mongoid.yml
|
258
|
+
has_rdoc:
|
@@ -1,44 +0,0 @@
|
|
1
|
-
module MailCannon::Adapter
|
2
|
-
module Sendgrid
|
3
|
-
include MailCannon::Adapter
|
4
|
-
module InstanceMethods
|
5
|
-
def send!
|
6
|
-
raise 'Invalid Document!' unless self.valid?
|
7
|
-
response = send_single_email
|
8
|
-
self.after_sent(successfully_sent?(response))
|
9
|
-
return response
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
def self.included(receiver)
|
14
|
-
receiver.send :include, InstanceMethods
|
15
|
-
end
|
16
|
-
|
17
|
-
private
|
18
|
-
def api_client
|
19
|
-
client = SendGridWebApi::Client.new(ENV['SENDGRID_USERNAME'], ENV['SENDGRID_PASSWORD'])
|
20
|
-
end
|
21
|
-
|
22
|
-
def send_single_email
|
23
|
-
api_client.mail.send(
|
24
|
-
:to => self.to,
|
25
|
-
:toname => self.to_name,
|
26
|
-
:subject => self.subject,
|
27
|
-
:text => self.mail.text,
|
28
|
-
:html => self.mail.html,
|
29
|
-
:from => self.from,
|
30
|
-
:fromname => self.from_name,
|
31
|
-
:bcc => self.bcc,
|
32
|
-
:replyto => self.reply_to
|
33
|
-
)
|
34
|
-
end
|
35
|
-
|
36
|
-
def successfully_sent?(response)
|
37
|
-
if response['message']=='success'
|
38
|
-
true
|
39
|
-
else
|
40
|
-
false
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
data/spec/factories/mail.rb
DELETED