airmail 0.6.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 53bc23d7faeb939dbe4979a1ca3c2b1f8472ced5
4
- data.tar.gz: efac7aba3d82be84e5279a1a2935d30d9c5eab27
3
+ metadata.gz: cdd792430f9a00732079cd493f2a36f91b0a7ac6
4
+ data.tar.gz: cff786668cbd05ed53cdfe821e7a8c0e8d88c45e
5
5
  SHA512:
6
- metadata.gz: f8071018a6fe158054fcfaef1335bcb81274b3059834d6ee49e0b4345b3e56386876bdb11bc3f87db2223065319ebcc563c677a7361042528177f942128b9068
7
- data.tar.gz: 2fb20facaacc7a09de459ec4c4e87cbb2551003d3cffdcb4e1e1d5496d96459b15146e171beb5ffbe90131b925a69b6cb5d5664e233ba2c395531f213edd217d
6
+ metadata.gz: 6340064f2424c696cf68b90ed3ddcf5caeca80f7c68899bc78340a6105b06aaee70e88b058be1d94a7bc0f0395efafa4ba5e0eabb126bf50115ac01b9caddafe
7
+ data.tar.gz: 5c192b71365b16237938421e5081f547636ec77ac30045ddd3b567dd3e3cd0961fbee5e11ee2db561fde4cf7d5af59dc52b984baf3060a3698cf1af455a5c262
@@ -1,20 +1,31 @@
1
+ require 'active_support'
1
2
  require 'mail'
3
+ require 'action_mailer'
4
+
2
5
 
3
6
  module Airmail
4
7
  class << self
5
8
  def receive( original )
6
9
  raise RoutesNotDefined unless defined? @@route
7
10
 
8
- mail = Mail.new( original )
11
+ mail = self.parse( original )
9
12
  MailProcessor.new(mail, @@route, original).receive
10
13
 
11
14
  mail
12
15
  end
13
16
 
17
+ def parse(msg)
18
+ Mail.new(msg)
19
+ end
20
+
14
21
  def route(&route)
15
22
  @@route = route
16
23
  end
17
24
 
25
+ def get_route
26
+ @@route
27
+ end
28
+
18
29
  def logger= logr
19
30
  @@logger = logr
20
31
  end
@@ -27,7 +27,7 @@ class MailProcessor
27
27
 
28
28
  #poor mans sentiment analyzer
29
29
  def sentiment *phrase
30
- analizer = Sentiment.new(phrase)
30
+ analizer = Airmail::Sentiment.new(phrase)
31
31
  !!analizer.analyze(@mail.body.raw_source)
32
32
  end
33
33
 
@@ -1,4 +1,3 @@
1
- require 'mail'
2
1
  class MailRouter
3
2
 
4
3
  def initialize(mail)
@@ -43,7 +42,7 @@ class MailRouter
43
42
  class << self
44
43
 
45
44
  def receive( original )
46
- mail = Mail.new( original )
45
+ mail = Mail::Message.new( original )
47
46
 
48
47
  record(mail, original)
49
48
  self.new(mail).route
@@ -1,18 +1,21 @@
1
- class Sentiment
2
- def initialize(*pattern)
3
- @pattern = /#{"(" + pattern.map{|a| or_regex(a) }.join(').*(') + ")"}/
4
- end
1
+ module Airmail
5
2
 
6
- def analyze(phrase)
7
- sentiments = @pattern.match phrase
8
- !!sentiments
9
- end
3
+ class Sentiment
4
+ def initialize(*pattern)
5
+ @pattern = /#{"(" + pattern.map{|a| or_regex(a) }.join(').*?(') + ")"}/
6
+ end
7
+
8
+ def analyze(phrase)
9
+ sentiments = @pattern.match phrase
10
+ end
11
+
12
+ private
10
13
 
11
- private
14
+ def or_regex(phrase)
15
+ return "#{phrase.join("|")}" if phrase.is_a? Array
16
+ phrase
17
+ end
12
18
 
13
- def or_regex(phrase)
14
- return "#{phrase.join("|")}" if phrase.is_a? Array
15
- phrase
16
19
  end
17
20
 
18
21
  end
@@ -0,0 +1,3 @@
1
+ module Airmail
2
+ VERSION = 0.0.2
3
+ end
@@ -0,0 +1,21 @@
1
+ require 'spec_helper'
2
+
3
+ describe Airmail do
4
+
5
+ let(:mail) { :garbage }
6
+
7
+ it 'gets TO address' do
8
+ msg = Airmail.parse( email_fixture() )
9
+
10
+ expect(msg.to).to eql(['trevor@trevorgrayson.com'])
11
+ expect(msg.from).to eql(['service@paypal.com'])
12
+ expect(msg.subject).to eql('Receipt for Your Payment to Yukaholics, Inc.')
13
+ expect(msg.body).to be_a(Mail::Body)
14
+ end
15
+
16
+
17
+ def email_fixture()
18
+ File.read('spec/fixtures/email.eml')
19
+ end
20
+
21
+ end
data/spec/airmail_spec.rb CHANGED
@@ -76,30 +76,3 @@ describe Airmail do
76
76
  end
77
77
 
78
78
  end
79
-
80
- class CountController < Airmail::Controller
81
- def receive
82
- Counter.inc
83
- end
84
- end
85
-
86
- class BlankController < Airmail::Controller
87
- def receive
88
- end
89
- end
90
-
91
- class Counter
92
- @@val = 0
93
-
94
- def self.reset
95
- @@val = 0
96
- end
97
-
98
- def self.inc
99
- @@val += 1
100
- end
101
-
102
- def self.count
103
- @@val
104
- end
105
- end
@@ -0,0 +1,63 @@
1
+ Delivered-To: rovertus@gmail.com
2
+ Received: by 10.79.138.196 with SMTP id m187csp883915ivd;
3
+ Sat, 1 Oct 2016 09:53:24 -0700 (PDT)
4
+ X-Received: by 10.28.92.71 with SMTP id q68mr2644068wmb.85.1475340804141;
5
+ Sat, 01 Oct 2016 09:53:24 -0700 (PDT)
6
+ Return-Path: <trevor+caf_=rovertus=gmail.com@trevorgrayson.com>
7
+ Received: from mail-wm0-x233.google.com (mail-wm0-x233.google.com. [2a00:1450:400c:c09::233])
8
+ by mx.google.com with ESMTPS id h88si4915435wmi.137.2016.10.01.09.53.23
9
+ for <rovertus@gmail.com>
10
+ (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
11
+ Sat, 01 Oct 2016 09:53:24 -0700 (PDT)
12
+ Received-SPF: neutral (google.com: 2a00:1450:400c:c09::233 is neither permitted nor denied by best guess record for domain of trevor+caf_=rovertus=gmail.com@trevorgrayson.com) client-ip=2a00:1450:400c:c09::233;
13
+ Authentication-Results: mx.google.com;
14
+ dkim=pass header.i=@paypal.com;
15
+ spf=neutral (google.com: 2a00:1450:400c:c09::233 is neither permitted nor denied by best guess record for domain of trevor+caf_=rovertus=gmail.com@trevorgrayson.com) smtp.mailfrom=trevor+caf_=rovertus=gmail.com@trevorgrayson.com;
16
+ dmarc=pass (p=REJECT dis=NONE) header.from=paypal.com
17
+ Received: by mail-wm0-x233.google.com with SMTP id p138so28291501wmb.1
18
+ for <rovertus@gmail.com>; Sat, 01 Oct 2016 09:53:23 -0700 (PDT)
19
+ X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
20
+ d=1e100.net; s=20130820;
21
+ h=x-gm-message-state:delivered-to:dkim-signature:date:message-id
22
+ :amq-delivery-message-id:pp-correlation-id:subject:to:from
23
+ :mime-version;
24
+ bh=QUauXO7cvk7J90sDu+23Mepq6ifLLZjUj+cFpZqh6OM=;
25
+ b=EbPbYORqek10ksH5k4SJgnpUayiocTVDryXpSB4U6Eg1P+KbUjwhp+4Nvb+04cQC8h
26
+ XpkfOhwxJIDiGstJ0/HqdjBUuGzyEPgOth1tPgV6iwbKEPsop+JXZyPeuAPPf5gsmvCl
27
+ wSnbBy2NcogaXLzbrr9diKgdTe1aDRKBRYwMb0IyrEst89xzegk1O2BW2ep2nC8LQ3fv
28
+ K/i/VSaw/EuVVh0e8isnDjJIkUAryPwg5PU1ESlCUpTPjeeWau0o/DNdKemeW2s+FCXd
29
+ 2T53ttuz4t95SK/yHi4H4KxFkJ4D3Gg/9rEegTIVMIzbkTMdJDyUbSIvepZvGUDFqPOn
30
+ Secg==
31
+ X-Gm-Message-State: AA6/9RmQTlbDNSr35QjSBG0PDscVZFGairlfizu2xmOQFP4eGv4oyktVSgNlnudxtpFyyHbrskFzSOhYIWpyD49HX0OGft8=
32
+ X-Received: by 10.28.23.18 with SMTP id 18mr2680718wmx.100.1475340803642;
33
+ Sat, 01 Oct 2016 09:53:23 -0700 (PDT)
34
+ X-Forwarded-To: rovertus@gmail.com
35
+ X-Forwarded-For: trevor@trevorgrayson.com rovertus@gmail.com
36
+ Delivered-To: trevor@trevorgrayson.com
37
+ Received: by 10.28.221.70 with SMTP id u67csp715650wmg;
38
+ Sat, 1 Oct 2016 09:53:22 -0700 (PDT)
39
+ X-Received: by 10.66.49.39 with SMTP id r7mr22504256pan.100.1475340802526;
40
+ Sat, 01 Oct 2016 09:53:22 -0700 (PDT)
41
+ Return-Path: <service@paypal.com>
42
+ Received: from mx0.slc.paypal.com (mx2.slc.paypal.com. [173.0.84.227])
43
+ by mx.google.com with ESMTPS id 4si16734948paj.264.2016.10.01.09.53.21
44
+ for <trevor@trevorgrayson.com>
45
+ (version=TLS1 cipher=AES128-SHA bits=128/128);
46
+ Sat, 01 Oct 2016 09:53:22 -0700 (PDT)
47
+ Received-SPF: pass (google.com: domain of service@paypal.com designates 173.0.84.227 as permitted sender) client-ip=173.0.84.227;
48
+ DKIM-Signature: v=1; a=rsa-sha256; d=paypal.com; s=pp-dkim1; c=relaxed/relaxed; q=dns/txt; i=@paypal.com; t=1475340801; h=From:From:Subject:Date:To:MIME-Version:Content-Type; bh=QUauXO7cvk7J90sDu+23Mepq6ifLLZjUj+cFpZqh6OM=; b=J31r2YJbKsHGQQzt3sFvqELSsue/qlvwPLqxEXl96VC7ohLISxXzv2pShqC5qClc 9+S8rMEqAs7nt8mRAx4ru4jbOoy7ChM55lw1KvuobL3cHdKKJWPlSu5xQv0I9S5d h+feRsMrI6lfQ+G64VE7GRij/djwYo31pvydj+IBQ8Xfc5K13YOIK0Qm7f3eNmR8 JcAuZqhGvEr7a8P7RNMakc3qyruZ0924iLzt6Mlh4lPd6BiQoifIe2sYYk1UNV74 pW7pDmIq6gbK3TksF/QtmOqp0xUhfrchgYF567oouO0ts/mvxlxUwo9ZIo4qrEbj vgbKGosdgzKcjOKygtmYfg==;
49
+ Received: (qmail 27756 invoked by uid 993); 1 Oct 2016 16:53:21 -0000
50
+ Date: Sat, 01 Oct 2016 09:53:21 -0700
51
+ Message-Id: <1475340801.27756@paypal.com>
52
+ AMQ-Delivery-Message-Id: EMAILDELIVERY-Notification_EmailDeliveryEvent-15-1475340795802-3489539719
53
+ X-PP-Email-transmission-Id: 8bef3ede-87f7-11e6-8d07-8cdcd4b6ee30
54
+ PP-Correlation-Id: ee84b5202279c
55
+ Subject: Receipt for Your Payment to Yukaholics, Inc.
56
+ X-MaxCode-Template: xpt/xclick/ReceiptXClickPayment
57
+ To: Trevor Grayson <trevor@trevorgrayson.com>
58
+ From: "service@paypal.com" <service@paypal.com>
59
+ X-Email-Type-Id: PP120 - ee84b5202279c
60
+ X-XPT-XSL-Name: email_pimp/default/en_US/xclick/ReceiptXClickPayment.xsl
61
+ Content-Type: multipart/alternative; boundary=--NextPart_048F8BC8A2197DE2036A
62
+ MIME-Version: 1.0
63
+ :
@@ -0,0 +1,26 @@
1
+ class CountController < Airmail::Controller
2
+ def receive
3
+ Counter.inc
4
+ end
5
+ end
6
+
7
+ class BlankController < Airmail::Controller
8
+ def receive
9
+ end
10
+ end
11
+
12
+ class Counter
13
+ @@val = 0
14
+
15
+ def self.reset
16
+ @@val = 0
17
+ end
18
+
19
+ def self.inc
20
+ @@val += 1
21
+ end
22
+
23
+ def self.count
24
+ @@val
25
+ end
26
+ end
@@ -0,0 +1,54 @@
1
+ require 'spec_helper'
2
+
3
+ describe Airmail do
4
+ context 'multiple controllers' do
5
+
6
+ let(:mail) { Mail.new(body: "include bob@thomas.com") }
7
+ let(:subscribe_mail) { Mail.new(body: "subscribe bob@thomas.com") }
8
+
9
+ it 'matches sentiment' do
10
+ Counter.reset
11
+
12
+ Airmail.route do
13
+ if sentiment "include", Airmail::EMAIL_PATTERN
14
+ deliver CountController
15
+ end
16
+ end
17
+
18
+ Airmail.receive(mail)
19
+ expect(Counter.count).to eq(1)
20
+ end
21
+
22
+ it 'matches word bag sentiment' do
23
+
24
+ Counter.reset
25
+
26
+ Airmail.route do
27
+ if sentiment ["include", "subscribe"], Airmail::EMAIL_PATTERN
28
+ deliver CountController
29
+ end
30
+ end
31
+
32
+ Airmail.receive(mail)
33
+ expect(Counter.count).to eq(1)
34
+
35
+ Airmail.receive(subscribe_mail)
36
+ expect(Counter.count).to eq(2)
37
+ end
38
+
39
+ it 'rejects mismatched sentiment' do
40
+ Counter.reset
41
+
42
+ Airmail.route do
43
+ if sentiment "alksfdlaklsdfjslf"
44
+ deliver CountController
45
+ end
46
+ end
47
+
48
+ Airmail.receive(mail)
49
+ expect(Counter.count).to eq(0)
50
+ end
51
+
52
+ end
53
+
54
+ end
@@ -1,82 +1,23 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Airmail do
3
+ describe Airmail::Sentiment do
4
4
 
5
- context 'multiple controllers' do
6
-
7
- let(:mail) { Mail.new(body: "include bob@thomas.com") }
8
- let(:subscribe_mail) { Mail.new(body: "subscribe bob@thomas.com") }
9
-
10
- it 'matches sentiment' do
11
- Counter.reset
12
-
13
- Airmail.route do
14
- if sentiment "include", Airmail::EMAIL_PATTERN
15
- deliver CountController
16
- end
17
- end
18
-
19
- Airmail.receive(mail)
20
- expect(Counter.count).to eq(1)
21
- end
22
-
23
- it 'matches word bag sentiment' do
24
-
25
- Counter.reset
26
-
27
- Airmail.route do
28
- if sentiment ["include", "subscribe"], Airmail::EMAIL_PATTERN
29
- deliver CountController
30
- end
31
- end
32
-
33
- Airmail.receive(mail)
34
- expect(Counter.count).to eq(1)
35
-
36
- Airmail.receive(subscribe_mail)
37
- expect(Counter.count).to eq(2)
38
- end
39
-
40
- it 'rejects mismatched sentiment' do
41
- Counter.reset
42
-
43
- Airmail.route do
44
- if sentiment "alksfdlaklsdfjslf"
45
- deliver CountController
46
- end
47
- end
48
-
49
- Airmail.receive(mail)
50
- expect(Counter.count).to eq(0)
51
- end
5
+ let(:email) { 'bob@thomas.com' }
6
+ let(:body) { "action #{email}" }
7
+ let(:subj) { subject.class.new('action', Airmail::EMAIL_PATTERN) }
52
8
 
9
+ it 'responds true' do
10
+ expect( subj.analyze(body) ).to be_truthy
53
11
  end
54
12
 
55
- end
56
-
57
- class CountController < Airmail::Controller
58
- def receive
59
- Counter.inc
13
+ it 'responds false' do
14
+ expect( subj.analyze('garbage') ).to be_nil #eq(falsy)
60
15
  end
61
- end
62
16
 
63
- class BlankController < Airmail::Controller
64
- def receive
17
+ it 'returns matches' do
18
+ sentiments = subj.analyze(body)
19
+ expect(sentiments[2]).to eq(email)
65
20
  end
66
- end
67
-
68
- class Counter
69
- @@val = 0
70
21
 
71
- def self.reset
72
- @@val = 0
73
- end
74
-
75
- def self.inc
76
- @@val += 1
77
- end
78
-
79
- def self.count
80
- @@val
81
- end
82
22
  end
23
+
data/spec/spec_helper.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require File.expand_path('../../lib/airmail', __FILE__)
2
+ require File.expand_path('../fixtures/mail_controllers', __FILE__)
2
3
 
3
4
  RSpec.configure do |config|
4
5
  config.expect_with :rspec do |expectations|
metadata CHANGED
@@ -1,17 +1,31 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: airmail
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Trevor Grayson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-02-06 00:00:00.000000000 Z
11
+ date: 2016-10-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: mail
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: actionmailer
15
29
  requirement: !ruby/object:Gem::Requirement
16
30
  requirements:
17
31
  - - ">="
@@ -53,7 +67,12 @@ files:
53
67
  - lib/airmail/mail_router.rb
54
68
  - lib/airmail/patterns.rb
55
69
  - lib/airmail/sentiment.rb
70
+ - lib/airmail/version.rb
71
+ - spec/airmail/airmail_spec.rb
56
72
  - spec/airmail_spec.rb
73
+ - spec/fixtures/email.eml
74
+ - spec/fixtures/mail_controllers.rb
75
+ - spec/sentiment_controller_spec.rb
57
76
  - spec/sentiment_spec.rb
58
77
  - spec/spec_helper.rb
59
78
  homepage: https://rubygems.org/gems/airmail
@@ -76,7 +95,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
76
95
  version: '0'
77
96
  requirements: []
78
97
  rubyforge_project:
79
- rubygems_version: 2.5.1
98
+ rubygems_version: 2.4.5.1
80
99
  signing_key:
81
100
  specification_version: 4
82
101
  summary: Incoming Email Router