cupid 0.0.6 → 0.0.7
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.
- data/Gemfile.lock +2 -2
- data/README.md +29 -0
- data/lib/cupid/configuration.rb +2 -1
- data/lib/cupid/methods/email.rb +40 -17
- data/lib/cupid/methods/list.rb +13 -0
- data/lib/cupid/methods/subscriber.rb +1 -0
- data/lib/cupid/session.rb +49 -33
- data/lib/cupid/version.rb +1 -1
- data/tmp/dancing_with_ET.rb +47 -11
- metadata +48 -77
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
cupid (0.0.
|
4
|
+
cupid (0.0.6)
|
5
5
|
builder (>= 2.1.2)
|
6
6
|
nokogiri (>= 1.4.1)
|
7
7
|
savon (>= 0.9.0)
|
@@ -18,7 +18,7 @@ GEM
|
|
18
18
|
rack
|
19
19
|
nokogiri (1.5.0)
|
20
20
|
nori (1.0.2)
|
21
|
-
rack (1.3.
|
21
|
+
rack (1.3.3)
|
22
22
|
savon (0.9.7)
|
23
23
|
akami (~> 1.0)
|
24
24
|
builder (>= 2.1.2)
|
data/README.md
CHANGED
@@ -6,7 +6,36 @@ Sponsored by Evil Martians <http://evilmartians.com>
|
|
6
6
|
|
7
7
|
## Usage
|
8
8
|
|
9
|
+
Add cupid initializer to your config/initializers and now there only two parameters to configure:
|
9
10
|
|
11
|
+
``` ruby
|
12
|
+
Cupid.configure do |config|
|
13
|
+
config.username = 'username'
|
14
|
+
config.password = 'password'
|
15
|
+
end
|
16
|
+
```
|
17
|
+
|
18
|
+
After that you can create Cupid::Session object and do some stuff through it:
|
19
|
+
|
20
|
+
``` ruby
|
21
|
+
# Creating session
|
22
|
+
et_translator = Cupid::Session.new
|
23
|
+
|
24
|
+
# Retrieving folders for not default account (your_account_id can be nil - default account on ET)
|
25
|
+
folders = et_translator.retrieve_email_folders(your_account_id)
|
26
|
+
|
27
|
+
# Creating new folder
|
28
|
+
# not required fields for folder: description, content_type, is_active, is_editable, allow_children
|
29
|
+
new_folder_id = et_translator.create_folder('title', :parent => parent_directory_id, :client_id => your_account_id)
|
30
|
+
|
31
|
+
# Creating new email
|
32
|
+
# not required fields for email: email_type, is_html_paste, character_set, name, description, category_id
|
33
|
+
new_email_id = et_translator.create_email('subject', 'body', :client_id => your_account_id, :category_id => new_folder_id)
|
34
|
+
|
35
|
+
# Creating new subscriber
|
36
|
+
# not required fields for subscriber: first_name, last_name, client_id
|
37
|
+
new_subscriber_id = et_translator.create_subscriber('email@email.com')
|
38
|
+
```
|
10
39
|
|
11
40
|
## Installation
|
12
41
|
|
data/lib/cupid/configuration.rb
CHANGED
data/lib/cupid/methods/email.rb
CHANGED
@@ -1,22 +1,15 @@
|
|
1
1
|
module Cupid
|
2
2
|
class Session
|
3
|
-
def retrieve_email_folders(account)
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
<Properties>ParentFolder.ID</Properties>
|
12
|
-
<Properties>ParentFolder.Name</Properties>
|
13
|
-
<Filter xsi:type="SimpleFilterPart">
|
14
|
-
<Property>ContentType</Property>
|
15
|
-
<SimpleOperator>like</SimpleOperator>
|
16
|
-
<Value>email</Value>
|
17
|
-
</Filter>
|
18
|
-
</RetrieveRequest>'
|
3
|
+
def retrieve_email_folders(account=nil, properties=nil)
|
4
|
+
account ||= @account
|
5
|
+
properties ||= ['ID', 'Name', 'ParentFolder.ID', 'ParentFolder.Name']
|
6
|
+
filters = 'Filter xsi:type="SimpleFilterPart"' => {
|
7
|
+
'Property' => 'ContentType',
|
8
|
+
'SimpleOperator' => 'like',
|
9
|
+
'Value' => 'email'
|
10
|
+
}
|
19
11
|
|
12
|
+
soap_body = build_retrieve(account.to_s, 'DataFolder', properties, filters)
|
20
13
|
response = build_request('Retrieve', 'RetrieveRequestMsg', soap_body)
|
21
14
|
response = Nokogiri::XML(response.http.body).remove_namespaces!
|
22
15
|
all_folders = response.css('Results').map{|f| {f.css('Name').to_a.map(&:text).join('/') => f.css('ID')[0].text}}
|
@@ -26,7 +19,8 @@ module Cupid
|
|
26
19
|
options = args.extract_options!
|
27
20
|
options[:subject] = CGI.escapeHTML subject.to_s
|
28
21
|
options[:body] = CGI.escapeHTML body.to_s
|
29
|
-
|
22
|
+
options[:client_id] ||= @account
|
23
|
+
|
30
24
|
options[:email_type] ||= 'HTML'
|
31
25
|
options[:is_html_paste] ||= 'true' # ??
|
32
26
|
options[:character_set] ||= 'utf-8'
|
@@ -44,6 +38,7 @@ module Cupid
|
|
44
38
|
options = args.extract_options!
|
45
39
|
options[:title] = CGI.escapeHTML title.to_s
|
46
40
|
options[:description] ||= 'description'
|
41
|
+
options[:client_id] ||= @account
|
47
42
|
|
48
43
|
options[:content_type] ||= 'email'
|
49
44
|
options[:is_active] ||= 'true'
|
@@ -59,6 +54,17 @@ module Cupid
|
|
59
54
|
created_folder_id = response.css('NewID').text
|
60
55
|
end
|
61
56
|
|
57
|
+
def send_email_to_list(email_id, list_id, account=nil)
|
58
|
+
account ||= @account
|
59
|
+
soap_body = '<Objects xsi:type="Send">' +
|
60
|
+
create_send_object(email_id, list_id, account) +
|
61
|
+
'</Objects>'
|
62
|
+
|
63
|
+
response = build_request('Create', 'CreateRequest', soap_body)
|
64
|
+
response = Nokogiri::XML(response.http.body).remove_namespaces!
|
65
|
+
created_send_id = response.css('NewID').text
|
66
|
+
end
|
67
|
+
|
62
68
|
def email_link(email_id)
|
63
69
|
"https://members.s4.exacttarget.com/Content/Email/EmailEdit.aspx?eid=" + email_id.to_s
|
64
70
|
end
|
@@ -101,5 +107,22 @@ module Cupid
|
|
101
107
|
</ParentFolder>'
|
102
108
|
end
|
103
109
|
end
|
110
|
+
|
111
|
+
def create_send_object(email_id, list_id, account)
|
112
|
+
send_object = '<PartnerKey xsi:nil="true"/>' +
|
113
|
+
'<ObjectID xsi:nil="true"/>' +
|
114
|
+
'<Client><ID>' + account.to_s + '</ID></Client>' +
|
115
|
+
'<Email>' +
|
116
|
+
'<PartnerKey xsi:nil="true"/>' +
|
117
|
+
'<ID>' + email_id.to_s + '</ID>' +
|
118
|
+
'<ObjectID xsi:nil="true"/>' +
|
119
|
+
'</Email>' +
|
120
|
+
'<List>' +
|
121
|
+
'<PartnerKey xsi:nil="true"/>' +
|
122
|
+
'<ObjectID xsi:nil="true"/>' +
|
123
|
+
'<ID>' + list_id.to_s + '</CustomerKey>' +
|
124
|
+
'</List>' +
|
125
|
+
'</Objects>'
|
126
|
+
end
|
104
127
|
end
|
105
128
|
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Cupid
|
2
|
+
class Session
|
3
|
+
def retrieve_lists(account=nil, properties=nil)
|
4
|
+
account ||= @account
|
5
|
+
properties ||= ['ID', 'CustomerKey']
|
6
|
+
|
7
|
+
soap_body = build_retrieve(account.to_s, 'List', properties)
|
8
|
+
response = build_request('Retrieve', 'RetrieveRequestMsg', soap_body)
|
9
|
+
response = Nokogiri::XML(response.http.body).remove_namespaces!
|
10
|
+
all_lists = response.css('Results').map{|f| {f.css('CustomerKey').to_a.map(&:text).join('/') => f.css('ID')[0].text}}
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
data/lib/cupid/session.rb
CHANGED
@@ -12,6 +12,7 @@ module Cupid
|
|
12
12
|
options = args.extract_options!
|
13
13
|
@username = options[:username] ||= Cupid.username
|
14
14
|
@password = options[:password] ||= Cupid.password
|
15
|
+
@account = options[:account] ||= Cupid.account
|
15
16
|
@headers = {"Content-Type" => "application/x-www-form-urlencoded", "Connection" => "close"}
|
16
17
|
|
17
18
|
@api_uri = @api_wsdl = DEFAULTS[:soap_s4_url]
|
@@ -23,39 +24,54 @@ module Cupid
|
|
23
24
|
end
|
24
25
|
|
25
26
|
private
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
27
|
+
|
28
|
+
def build_request(type, method, body)
|
29
|
+
client = Savon::Client.new(@api_wsdl)
|
30
|
+
client.wsse.username = @username
|
31
|
+
client.wsse.password = @password
|
32
|
+
client.wsse.created_at = Time.now.utc
|
33
|
+
client.wsse.expires_at = (Time.now + 120).utc
|
34
|
+
|
35
|
+
header = {
|
36
|
+
'a:Action' => type,
|
37
|
+
'a:MessageID' => 'urn:uuid:99e6822c-5436-4fec-a243-3126c14924f6',
|
38
|
+
'a:ReplyTo' => {
|
39
|
+
'a:Address' => 'http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous'
|
40
|
+
},
|
41
|
+
'VsDebuggerCausalityData' => 'uIDPo5GdUXRQCEBNrqnw0gOEloMAAAAAIAi4IHpPlUiMs1MZ2raBIhJnF/jqJLlAgZIny03R+tgACQAA',
|
42
|
+
'a:To' => @wsa_soap_s4_to
|
43
|
+
}
|
44
|
+
|
45
|
+
namespaces = {
|
46
|
+
'xmlns:s'=>"http://schemas.xmlsoap.org/soap/envelope/",
|
47
|
+
'xmlns:a'=>"http://schemas.xmlsoap.org/ws/2004/08/addressing",
|
48
|
+
'xmlns:u'=>"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd",
|
49
|
+
'xmlns:xsi'=>"http://www.w3.org/2001/XMLSchema-instance",
|
50
|
+
'xmlns:xsd'=>"http://www.w3.org/2001/XMLSchema",
|
51
|
+
'xmlns:o'=>"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
|
52
|
+
}
|
53
|
+
|
54
|
+
response = client.request type.downcase.to_sym do |soap|
|
55
|
+
soap.input = [method, { 'xmlns'=>"http://exacttarget.com/wsdl/partnerAPI"}]
|
56
|
+
soap.header = header
|
57
|
+
soap.env_namespace = :s
|
58
|
+
soap.namespaces = namespaces
|
59
|
+
soap.body = body
|
59
60
|
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def build_retrieve(id, object_type, properties, filters=nil)
|
64
|
+
body = {'RetrieveRequest' => {
|
65
|
+
'ClientIDs' => {
|
66
|
+
'ID' => id
|
67
|
+
},
|
68
|
+
'ObjectType' => object_type,
|
69
|
+
'Properties' => properties
|
70
|
+
}
|
71
|
+
}
|
72
|
+
body['RetrieveRequest'].merge! filters if filters
|
73
|
+
|
74
|
+
body
|
75
|
+
end
|
60
76
|
end
|
61
77
|
end
|
data/lib/cupid/version.rb
CHANGED
data/tmp/dancing_with_ET.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
# require 'ruby-debug'
|
3
|
+
require 'nokogiri'
|
3
4
|
require 'savon'
|
4
5
|
require 'cgi'
|
5
6
|
|
@@ -37,7 +38,7 @@ body = {
|
|
37
38
|
}
|
38
39
|
|
39
40
|
header = {
|
40
|
-
'a:Action' => '
|
41
|
+
'a:Action' => 'Create',
|
41
42
|
'a:MessageID' => 'urn:uuid:99e6822c-5436-4fec-a243-3126c14924f6',
|
42
43
|
'a:ReplyTo' => {
|
43
44
|
'a:Address' => 'http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous'
|
@@ -91,17 +92,52 @@ body = '<RetrieveRequest>
|
|
91
92
|
<ClientIDs>
|
92
93
|
<ID>1058484</ID>
|
93
94
|
</ClientIDs>
|
94
|
-
<ObjectType>
|
95
|
+
<ObjectType>List</ObjectType>
|
96
|
+
<Properties>CustomerKey</Properties>
|
95
97
|
<Properties>ID</Properties>
|
96
|
-
<Properties>Name</Properties>
|
97
|
-
<Properties>ParentFolder.ID</Properties>
|
98
|
-
<Properties>ParentFolder.Name</Properties>
|
99
|
-
<Filter xsi:type="SimpleFilterPart">
|
100
|
-
<Property>ContentType</Property>
|
101
|
-
<SimpleOperator>like</SimpleOperator>
|
102
|
-
<Value>email</Value>
|
103
|
-
</Filter>
|
104
98
|
</RetrieveRequest>'
|
99
|
+
|
100
|
+
body = {
|
101
|
+
'RetrieveRequest' => {
|
102
|
+
'ClientIDs' => {
|
103
|
+
'ID' => '1058484'
|
104
|
+
},
|
105
|
+
'ObjectType' => 'List',
|
106
|
+
'Properties' => ['CustomerKey', 'ID']
|
107
|
+
}
|
108
|
+
}
|
109
|
+
body_noko = Nokogiri::XML::Builder.new do |xml|
|
110
|
+
xml.retrieve_request {
|
111
|
+
xml.client_ids {
|
112
|
+
xml.id "1058484"
|
113
|
+
}
|
114
|
+
xml.object_type "List"
|
115
|
+
xml.properties "CustomerKey"
|
116
|
+
xml.properties "ID"
|
117
|
+
}
|
118
|
+
end
|
119
|
+
|
120
|
+
body = '<Objects xsi:type="Send">
|
121
|
+
<PartnerKey xsi:nil="true"/>
|
122
|
+
<Client><ID>1058484</ID></Client>
|
123
|
+
<ObjectID xsi:nil="true"/>
|
124
|
+
<Email>
|
125
|
+
<PartnerKey xsi:nil="true"/>
|
126
|
+
<ID>565</ID>
|
127
|
+
<ObjectID xsi:nil="true"/>
|
128
|
+
</Email>
|
129
|
+
<List>
|
130
|
+
<PartnerKey xsi:nil="true"/>
|
131
|
+
<ObjectID xsi:nil="true"/>
|
132
|
+
<ID>57</ID>
|
133
|
+
</List>
|
134
|
+
</Objects>'
|
135
|
+
#
|
136
|
+
# puts body
|
137
|
+
#
|
138
|
+
# puts '-============-'
|
139
|
+
#
|
140
|
+
# puts body_noko.text
|
105
141
|
|
106
142
|
# body = '<RetrieveRequest>
|
107
143
|
# <ClientIDs>
|
@@ -142,7 +178,7 @@ namespaces = {
|
|
142
178
|
}
|
143
179
|
#
|
144
180
|
response = client.request :retrieve do |soap|
|
145
|
-
soap.input = ['
|
181
|
+
soap.input = ['CreateRequest', { 'xmlns'=>"http://exacttarget.com/wsdl/partnerAPI"}]
|
146
182
|
soap.header = header
|
147
183
|
soap.env_namespace = :s
|
148
184
|
soap.namespaces = namespaces
|
metadata
CHANGED
@@ -1,80 +1,58 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: cupid
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.7
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 0
|
9
|
-
- 6
|
10
|
-
version: 0.0.6
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- gazay
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
dependencies:
|
20
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2011-09-22 00:00:00.000000000 %:z
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
21
16
|
name: builder
|
22
|
-
|
23
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
17
|
+
requirement: &2153805140 !ruby/object:Gem::Requirement
|
24
18
|
none: false
|
25
|
-
requirements:
|
26
|
-
- -
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
hash: 15
|
29
|
-
segments:
|
30
|
-
- 2
|
31
|
-
- 1
|
32
|
-
- 2
|
19
|
+
requirements:
|
20
|
+
- - ! '>='
|
21
|
+
- !ruby/object:Gem::Version
|
33
22
|
version: 2.1.2
|
34
23
|
type: :runtime
|
35
|
-
version_requirements: *id001
|
36
|
-
- !ruby/object:Gem::Dependency
|
37
|
-
name: nokogiri
|
38
24
|
prerelease: false
|
39
|
-
|
25
|
+
version_requirements: *2153805140
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: nokogiri
|
28
|
+
requirement: &2153804440 !ruby/object:Gem::Requirement
|
40
29
|
none: false
|
41
|
-
requirements:
|
42
|
-
- -
|
43
|
-
- !ruby/object:Gem::Version
|
44
|
-
hash: 5
|
45
|
-
segments:
|
46
|
-
- 1
|
47
|
-
- 4
|
48
|
-
- 1
|
30
|
+
requirements:
|
31
|
+
- - ! '>='
|
32
|
+
- !ruby/object:Gem::Version
|
49
33
|
version: 1.4.1
|
50
34
|
type: :runtime
|
51
|
-
version_requirements: *id002
|
52
|
-
- !ruby/object:Gem::Dependency
|
53
|
-
name: savon
|
54
35
|
prerelease: false
|
55
|
-
|
36
|
+
version_requirements: *2153804440
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: savon
|
39
|
+
requirement: &2153803980 !ruby/object:Gem::Requirement
|
56
40
|
none: false
|
57
|
-
requirements:
|
58
|
-
- -
|
59
|
-
- !ruby/object:Gem::Version
|
60
|
-
hash: 59
|
61
|
-
segments:
|
62
|
-
- 0
|
63
|
-
- 9
|
64
|
-
- 0
|
41
|
+
requirements:
|
42
|
+
- - ! '>='
|
43
|
+
- !ruby/object:Gem::Version
|
65
44
|
version: 0.9.0
|
66
45
|
type: :runtime
|
67
|
-
|
68
|
-
|
69
|
-
|
46
|
+
prerelease: false
|
47
|
+
version_requirements: *2153803980
|
48
|
+
description: Send love, not war. This version of cupid can only work with ET SOAP
|
49
|
+
API with s4.
|
50
|
+
email:
|
70
51
|
- gazay@evilmartians.com
|
71
52
|
executables: []
|
72
|
-
|
73
53
|
extensions: []
|
74
|
-
|
75
54
|
extra_rdoc_files: []
|
76
|
-
|
77
|
-
files:
|
55
|
+
files:
|
78
56
|
- Gemfile
|
79
57
|
- Gemfile.lock
|
80
58
|
- README.md
|
@@ -84,43 +62,36 @@ files:
|
|
84
62
|
- lib/cupid/configuration.rb
|
85
63
|
- lib/cupid/methods.rb
|
86
64
|
- lib/cupid/methods/email.rb
|
65
|
+
- lib/cupid/methods/list.rb
|
87
66
|
- lib/cupid/methods/subscriber.rb
|
88
67
|
- lib/cupid/session.rb
|
89
68
|
- lib/cupid/version.rb
|
90
69
|
- spec/cupid/cupid_spec.rb
|
91
70
|
- tmp/dancing_with_ET.rb
|
92
|
-
|
71
|
+
has_rdoc: true
|
72
|
+
homepage: ''
|
93
73
|
licenses: []
|
94
|
-
|
95
74
|
post_install_message:
|
96
75
|
rdoc_options: []
|
97
|
-
|
98
|
-
require_paths:
|
76
|
+
require_paths:
|
99
77
|
- lib
|
100
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
78
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
101
79
|
none: false
|
102
|
-
requirements:
|
103
|
-
- -
|
104
|
-
- !ruby/object:Gem::Version
|
105
|
-
|
106
|
-
|
107
|
-
- 0
|
108
|
-
version: "0"
|
109
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ! '>='
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0'
|
84
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
110
85
|
none: false
|
111
|
-
requirements:
|
112
|
-
- -
|
113
|
-
- !ruby/object:Gem::Version
|
114
|
-
|
115
|
-
segments:
|
116
|
-
- 0
|
117
|
-
version: "0"
|
86
|
+
requirements:
|
87
|
+
- - ! '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
118
90
|
requirements: []
|
119
|
-
|
120
91
|
rubyforge_project: cupid
|
121
|
-
rubygems_version: 1.
|
92
|
+
rubygems_version: 1.6.2
|
122
93
|
signing_key:
|
123
94
|
specification_version: 3
|
124
95
|
summary: Create, organize and send emails through Exact Target SOAP API
|
125
|
-
test_files:
|
96
|
+
test_files:
|
126
97
|
- spec/cupid/cupid_spec.rb
|