email_vision 0.1.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.
data/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ spec/account.yml
2
+ example.php
data/Rakefile ADDED
@@ -0,0 +1,55 @@
1
+ task :default => :spec
2
+ require 'spec/rake/spectask'
3
+ Spec::Rake::SpecTask.new {|t| t.spec_opts = ['--color --backtrace']}
4
+
5
+ def account
6
+ YAML.load(File.read('spec/account.yml')) rescue {}
7
+ end
8
+
9
+ def email_vision
10
+ @email_vision ||= begin
11
+ $LOAD_PATH << 'lib'
12
+ require 'email_vision'
13
+ require 'yaml'
14
+ EmailVision.new(account)
15
+ end
16
+ end
17
+
18
+ desc 'possible actions'
19
+ task :actions do
20
+ unnecessary_actions = [:open_api_connection, :close_api_connection]
21
+ actions = email_vision.send(:connection).wsdl.soap_actions
22
+ puts (actions - unnecessary_actions).map{|x|" - #{x}"}.sort.join("\n")
23
+ end
24
+
25
+ desc 'test update here, since it takes forever to be processed'
26
+ task :test_update do
27
+ user = account[:changeable_user]
28
+ value = rand(1111111)
29
+ email_vision.update(user[:email], :firstname => value)
30
+ start = Time.now
31
+ loop do
32
+ sleep 5
33
+ puts (Time.now - start).to_i
34
+ data = email_vision.find(user[:email])
35
+ break if data[:firstname] == value.to_s
36
+ end
37
+ puts "SUCCESS!!!!!! #{(Time.now - start).to_i}"
38
+ end
39
+
40
+ begin
41
+ require 'jeweler'
42
+ project_name = 'email_vision'
43
+ Jeweler::Tasks.new do |gem|
44
+ gem.name = project_name
45
+ gem.summary = "Ruby SOAP Api Client for EmailVision / CampaignCommander"
46
+ gem.email = "grosser.michael@gmail.com"
47
+ gem.homepage = "http://github.com/grosser/#{project_name}"
48
+ gem.authors = ["Michael Grosser"]
49
+ gem.add_dependency 'savon'
50
+ end
51
+
52
+ Jeweler::GemcutterTasks.new
53
+ rescue LoadError
54
+ puts "Jeweler, or one of its dependencies, is not available. Install it with: sudo gem install jeweler"
55
+ end
data/Readme.md ADDED
@@ -0,0 +1,28 @@
1
+ EmailVision SOAP Api Client
2
+
3
+ gem install email_vision
4
+
5
+ Usage
6
+ =====
7
+
8
+ emv = EmailVision.new(:password => 'foo', :login => 'bar', :key => 'token')
9
+ emv.find 'me@host.com'
10
+ emv.create_or_update :email => 'me@host.com', :foo => 1
11
+
12
+ emv.create :email => 'me@host.com', :foo => 1
13
+ emv.update :email => 'me@host.com', :foo => 1
14
+ emv.change_email 'me@host.com', 'you@host.com'
15
+
16
+ emv.columns
17
+
18
+ emv.unjoin 'me@host.com'
19
+ emv.rejoin 'me@host.com'
20
+
21
+ # create, create_or_update, update, change_email return a job-id
22
+ emv.job_status job_id
23
+
24
+ Author
25
+ ======
26
+ [Michael Grosser](http://pragmatig.wordpress.com)
27
+ grosser.michael@gmail.com
28
+ Hereby placed under public domain, do what you want, just do not hold me accountable...
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
@@ -0,0 +1,46 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{email_vision}
8
+ s.version = "0.1.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Michael Grosser"]
12
+ s.date = %q{2010-07-31}
13
+ s.email = %q{grosser.michael@gmail.com}
14
+ s.files = [
15
+ ".gitignore",
16
+ "Rakefile",
17
+ "Readme.md",
18
+ "VERSION",
19
+ "email_vision.gemspec",
20
+ "lib/email_vision.rb",
21
+ "spec/account.yml.example",
22
+ "spec/email_vision_spec.rb"
23
+ ]
24
+ s.homepage = %q{http://github.com/grosser/email_vision}
25
+ s.rdoc_options = ["--charset=UTF-8"]
26
+ s.require_paths = ["lib"]
27
+ s.rubygems_version = %q{1.3.6}
28
+ s.summary = %q{Ruby SOAP Api Client for EmailVision / CampaignCommander}
29
+ s.test_files = [
30
+ "spec/email_vision_spec.rb"
31
+ ]
32
+
33
+ if s.respond_to? :specification_version then
34
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
35
+ s.specification_version = 3
36
+
37
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
38
+ s.add_runtime_dependency(%q<savon>, [">= 0"])
39
+ else
40
+ s.add_dependency(%q<savon>, [">= 0"])
41
+ end
42
+ else
43
+ s.add_dependency(%q<savon>, [">= 0"])
44
+ end
45
+ end
46
+
@@ -0,0 +1,109 @@
1
+ require 'savon'
2
+
3
+ class EmailVision
4
+ WSDL = "http://emvapi.emv3.com/apimember/services/MemberService?wsdl"
5
+ SESSION_TIMEOUT = 10*60
6
+ VERSION = File.read( File.join(File.dirname(__FILE__),'..','VERSION') ).strip
7
+ attr_accessor :options
8
+
9
+ def initialize(options)
10
+ self.options = options
11
+ end
12
+
13
+ def find(email_or_id)
14
+ result = execute_by_email_or_id(:get_member, email_or_id)
15
+ return unless result.is_a?(Hash)
16
+ result = convert_to_hash(result[:attributes][:entry], :key, :value)
17
+ result.reject{|k,v| v.nil? }
18
+ end
19
+
20
+ def unjoin(email_or_id)
21
+ execute_by_email_or_id(:unjoin_member, email_or_id)
22
+ end
23
+
24
+ def rejoin(email_or_id)
25
+ execute_by_email_or_id(:rejoin_member, email_or_id)
26
+ end
27
+
28
+ def update(attributes)
29
+ execute_by_obj(:update_member_by_obj, attributes)
30
+ end
31
+
32
+ def update_email(old, new)
33
+ execute(:update_member, :email => old, :field => :email, :value => new)
34
+ end
35
+
36
+ def create(attributes)
37
+ execute_by_obj(:insert_member_by_obj, attributes)
38
+ end
39
+
40
+ def create_or_update(attributes)
41
+ execute_by_obj(:insert_or_update_member_by_obj, attributes)
42
+ end
43
+
44
+ # should be one of: Insert, Processing, Processed, Error, Job_Done_Or_Does_Not_Exist
45
+ def job_status(job_id)
46
+ execute(:get_member_job_status, :synchro_id => job_id)[:status]
47
+ end
48
+
49
+ def columns
50
+ result = execute(:desc_member_table)
51
+ result = convert_to_hash(result[:fields], :name, :type)
52
+ result.each{|k,v| result[k] = to_ruby_style(v)}
53
+ result
54
+ end
55
+
56
+ private
57
+
58
+ def connection
59
+ unless connected?
60
+ response = client.open_api_connection{|r|
61
+ r.body = {
62
+ :login => options[:login],
63
+ :pwd => options[:password],
64
+ :key => options[:key]
65
+ }
66
+ }
67
+ @token = response.to_hash[:open_api_connection_response][:return]
68
+ @token_requested = Time.now.to_i
69
+ end
70
+ client
71
+ end
72
+
73
+ def client
74
+ @client ||= Savon::Client.new WSDL
75
+ end
76
+
77
+ def connected?
78
+ @token and @token_requested > (Time.now.to_i - SESSION_TIMEOUT)
79
+ end
80
+
81
+ def execute_by_email_or_id(method, email_or_id)
82
+ if email_or_id.to_s.include?('@')
83
+ execute("#{method}_by_email", :email => email_or_id)
84
+ else
85
+ execute("#{method}_by_id", :id => email_or_id)
86
+ end
87
+ end
88
+
89
+ def to_ruby_style(name)
90
+ name.downcase.to_sym
91
+ end
92
+
93
+ def execute_by_obj(method, attributes)
94
+ entries = attributes.map{|k,v| {:entry => {:key => k, :value => v}}}
95
+ execute(method, :member => {:email => attributes[:email], :dynContent => entries})
96
+ end
97
+
98
+ def execute(method, options={})
99
+ response = connection.send(method){|r| r.body = options.merge(:token => @token) }
100
+ response.to_hash["#{method}_response".to_sym][:return]
101
+ end
102
+
103
+ def convert_to_hash(entries, key, value)
104
+ entries.inject({}) do |hash, part|
105
+ hash[to_ruby_style(part[key])] = part[value]
106
+ hash
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,9 @@
1
+ :login: api_your_host
2
+ :password: your_password
3
+ :key: your_api_key
4
+ :test_user: # this must be the complete data of a user currently in email vision
5
+ :gender: "0"
6
+ :email: test@test.de
7
+ :datejoin: 2009-12-07T13:36:15+01:00
8
+ :firstname: Test
9
+ :member_id: "1014086935042"
@@ -0,0 +1,157 @@
1
+ $LOAD_PATH << 'lib'
2
+ require 'rubygems'
3
+ require 'email_vision'
4
+
5
+ describe "EmailVision" do
6
+ let(:email){"#{rand(1111111)}.foo@justatest.com"}
7
+ let(:random_value){rand(11111111111).to_s}
8
+ let(:expired_token){'Duy-M5FktALawBJ7dZN94s6hLEgLGKXC_j7cCqlDUMXRGw2shqHYbR9Zud_19EBtFkSCbJ0ZmrZ_d0ieBqgR'}
9
+
10
+ # updates need some time to finish on the server...
11
+ def wait_for_job_to_finish
12
+ job_id = yield
13
+ 20.times do
14
+ sleep 5
15
+ puts status = client.job_status(job_id)
16
+ return if status == 'Job_Done_Or_Does_Not_Exist'
17
+ end
18
+ raise "Job not finished in time!"
19
+ end
20
+
21
+ def reset_email
22
+ email = client.find(changeable_user[:member_id])[:email]
23
+ wait_for_job_to_finish do
24
+ client.update_email(email, changeable_user[:email])
25
+ end
26
+ email = client.find(changeable_user[:member_id])[:email]
27
+ email.should == changeable_user[:email]
28
+ end
29
+
30
+ let(:config){YAML.load(File.read('spec/account.yml'))}
31
+ let(:client){EmailVision.new(config)}
32
+ let(:findable_user) do
33
+ data = config[:findable_user]
34
+ data[:datejoin] = DateTime.parse(data[:datejoin].to_s)
35
+ data
36
+ end
37
+ let(:changeable_user){config[:changeable_user]}
38
+
39
+ it "has a VERSION" do
40
+ EmailVision::VERSION.should =~ /^\d+\.\d+\.\d+$/
41
+ end
42
+
43
+ it "can call more than one method" do
44
+ first = client.find(findable_user[:email])
45
+ first.should == client.find(findable_user[:email])
46
+ end
47
+
48
+ it "can reconnect when token is expired" do
49
+ client.instance_variable_set('@token', expired_token)
50
+ client.instance_variable_set('@token_requested', Time.now.to_i - EmailVision::SESSION_TIMEOUT - 10)
51
+ client.find(findable_user[:email])[:email].should == findable_user[:email]
52
+ end
53
+
54
+ describe :find do
55
+ it "can find by email" do
56
+ response = client.find(findable_user[:email])
57
+ response.should == findable_user
58
+ end
59
+
60
+ it "can find by id" do
61
+ response = client.find(findable_user[:member_id])
62
+ response.should == findable_user
63
+ end
64
+
65
+ it "is nil when nothing was found" do
66
+ client.find('foo@bar.baz').should == nil
67
+ end
68
+ end
69
+
70
+ describe :update do
71
+ it "can update a attribute" do
72
+ wait_for_job_to_finish do
73
+ client.update(:email => changeable_user[:email], :firstname => random_value)
74
+ end
75
+ puts data = client.find(changeable_user[:email])
76
+ data[:firstname].should == random_value
77
+
78
+ # it does not overwrite other attributes
79
+ data[:lastname].should == changeable_user[:lastname]
80
+ end
81
+
82
+ it "returns a job id" do
83
+ job_id = client.update(:email => changeable_user[:email], :firstname => random_value)
84
+ client.job_status(job_id).should == 'Insert'
85
+ end
86
+ end
87
+
88
+ describe :update_email do
89
+ after do
90
+ reset_email
91
+ end
92
+
93
+ it "updates the email" do
94
+ wait_for_job_to_finish do
95
+ client.update_email(changeable_user[:email], email)
96
+ end
97
+ client.find(email)[:email].should == email
98
+ end
99
+ end
100
+
101
+ describe :create_or_update do
102
+ it "can create a record" do
103
+ wait_for_job_to_finish do
104
+ client.create_or_update(:email => email, :firstname => 'first-name')
105
+ end
106
+ data = client.find(email)
107
+ data[:firstname].should == 'first-name'
108
+ end
109
+
110
+ it "can update a record" do
111
+ wait_for_job_to_finish do
112
+ client.create_or_update(:email => changeable_user[:email], :firstname => random_value)
113
+ end
114
+ data = client.find(changeable_user[:email])
115
+ data[:firstname].should == random_value
116
+ end
117
+ end
118
+
119
+ describe :create do
120
+ it "can create a record" do
121
+ wait_for_job_to_finish do
122
+ client.create(:email => email, :firstname => 'first-name')
123
+ end
124
+ data = client.find(email)
125
+ data[:firstname].should == 'first-name'
126
+ end
127
+ end
128
+
129
+ describe :columns do
130
+ it "can read them" do
131
+ data = client.columns
132
+ data[:dateunjoin].should == :date
133
+ end
134
+ end
135
+
136
+ describe :unjoin do
137
+ it "can unjoin a member" do
138
+ wait_for_job_to_finish do
139
+ client.unjoin(changeable_user[:email])
140
+ end
141
+ date = client.find(changeable_user[:email])[:dateunjoin]
142
+ date.is_a?(DateTime).should == true
143
+ Time.parse(date.to_s).should be_close(Time.now, 40)
144
+ end
145
+ end
146
+
147
+ describe :rejoin do
148
+ it "can rejoin a member" do
149
+ wait_for_job_to_finish do
150
+ client.rejoin(changeable_user[:email])
151
+ end
152
+ date = client.find(changeable_user[:email])[:datejoin]
153
+ date.is_a?(DateTime).should == true
154
+ Time.parse(date.to_s).should be_close(Time.now, 40)
155
+ end
156
+ end
157
+ end
metadata ADDED
@@ -0,0 +1,80 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: email_vision
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ - 0
9
+ version: 0.1.0
10
+ platform: ruby
11
+ authors:
12
+ - Michael Grosser
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-07-31 00:00:00 +02:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: savon
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ segments:
28
+ - 0
29
+ version: "0"
30
+ type: :runtime
31
+ version_requirements: *id001
32
+ description:
33
+ email: grosser.michael@gmail.com
34
+ executables: []
35
+
36
+ extensions: []
37
+
38
+ extra_rdoc_files: []
39
+
40
+ files:
41
+ - .gitignore
42
+ - Rakefile
43
+ - Readme.md
44
+ - VERSION
45
+ - email_vision.gemspec
46
+ - lib/email_vision.rb
47
+ - spec/account.yml.example
48
+ - spec/email_vision_spec.rb
49
+ has_rdoc: true
50
+ homepage: http://github.com/grosser/email_vision
51
+ licenses: []
52
+
53
+ post_install_message:
54
+ rdoc_options:
55
+ - --charset=UTF-8
56
+ require_paths:
57
+ - lib
58
+ required_ruby_version: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ segments:
63
+ - 0
64
+ version: "0"
65
+ required_rubygems_version: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ segments:
70
+ - 0
71
+ version: "0"
72
+ requirements: []
73
+
74
+ rubyforge_project:
75
+ rubygems_version: 1.3.6
76
+ signing_key:
77
+ specification_version: 3
78
+ summary: Ruby SOAP Api Client for EmailVision / CampaignCommander
79
+ test_files:
80
+ - spec/email_vision_spec.rb