maileon 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,85 @@
1
+ # Maileon [![Build Status](http://travis-ci.org/interactive-pioneers/maileon.svg?branch=master)](https://travis-ci.org/interactive-pioneers/maileon)
2
+
3
+ Ruby wrapper for Maileon email marketing software API.
4
+
5
+ - Supported Ruby versions:
6
+ - 2.2.1 (strongly recommended)
7
+ - 2.1.0
8
+ - 2.0.0
9
+
10
+ ## Installation
11
+
12
+ Add this line to your application's Gemfile:
13
+
14
+ ```ruby
15
+ gem 'maileon'
16
+ ```
17
+
18
+ And then execute:
19
+
20
+ $ bundle
21
+
22
+ Or install it yourself as:
23
+
24
+ $ gem install maileon
25
+
26
+ ## Usage
27
+
28
+ Below API requests are currently supported by the gem:
29
+
30
+ ### Ping
31
+
32
+ ``` ruby
33
+ api_key = "e30994fg0fig6t049u42j3gblgsr59043"
34
+ maileon = Maileon::API.new(api_key, true)
35
+ maileon.ping
36
+ ```
37
+
38
+ ### Subscribe
39
+
40
+ ``` ruby
41
+ api_key = "e30994fg0fig6t049u42j3gblgsr59043"
42
+ maileon = Maileon::API.new(api_key, true)
43
+ attribs = {
44
+ :email => "subscriber@email.com"
45
+ }
46
+ body = {
47
+ :email => "subscriber@email.com",
48
+ :custom_fields => {
49
+ :CUSTOM_FIELD_DEFINED_AT_MAILEON => "1"
50
+ },
51
+ :standard_fields => {
52
+ :SALUTATION => "Herr",
53
+ :GENDER => "m",
54
+ :FIRSTNAME => "Max",
55
+ :LASTNAME => "Mustermann",
56
+ :LOCALE => "de_DE",
57
+ :CITY => "Hamburg",
58
+ :COUNTRY => "Germany",
59
+ :ZIP => "22675",
60
+ :ADDRESS => "Friedensallee",
61
+ :HNR => "9"
62
+ }
63
+ }
64
+ maileon.create_contact(attribs, body)
65
+ ```
66
+
67
+ ### Unsubscribe
68
+
69
+ ``` ruby
70
+ api_key = "e30994fg0fig6t049u42j3gblgsr59043"
71
+ maileon = Maileon::API.new(api_key, true)
72
+ attribs = {
73
+ :email => "subscriber@email.com"
74
+ }
75
+ maileon.delete_contact(attribs)
76
+ ```
77
+
78
+ ## Contributing
79
+
80
+ 1. Fork it ( https://github.com/[my-github-username]/maileon/fork )
81
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
82
+ 3. Develop your feature by concepts of test-driven development. Run `guard` in parallel to automatically run your tests
83
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
84
+ 4. Push to the branch (`git push origin my-new-feature`)
85
+ 5. Create a new Pull Request
@@ -0,0 +1,10 @@
1
+ require 'bundler/gem_tasks'
2
+
3
+ begin
4
+ require 'rspec/core/rake_task'
5
+ RSpec::Core::RakeTask.new(:spec)
6
+ rescue LoadError
7
+ end
8
+
9
+ task :default => :spec
10
+ task :test => :spec
@@ -0,0 +1,7 @@
1
+ require 'base64'
2
+ require 'excon'
3
+ require 'json'
4
+
5
+ require "maileon/version"
6
+ require "maileon/errors"
7
+ require "maileon/api"
@@ -0,0 +1,61 @@
1
+ module Maileon
2
+ class API
3
+
4
+ attr_accessor :host, :path, :apikey, :debug, :session
5
+
6
+ def initialize(apikey=nil, debug=false)
7
+ @host = 'https://api.maileon.com'
8
+ @path = '/1.0/'
9
+
10
+ unless apikey
11
+ apikey = ENV['MAILEON_APIKEY']
12
+ end
13
+
14
+ raise 'You must provide Maileon API key' unless apikey
15
+
16
+ @apikey = Base64.encode64(apikey).strip
17
+ @debug = debug
18
+ @session = Excon.new @host, :debug => debug
19
+ end
20
+
21
+ def ping
22
+ @session.get(:path => "#{@path}/ping", :headers => get_headers)
23
+ end
24
+
25
+ def create_contact(params, body={})
26
+ raise ArgumentError.new("No parameters.") if params.empty?
27
+ raise ArgumentError.new("Email is mandatory.") if params[:email].nil?
28
+ raise Maileon::Errors::ValidationError.new("Invalid email format.") unless is_valid_email(params[:email])
29
+ email = URI::escape(params[:email])
30
+ permission = params[:permission] ||= 1
31
+ sync_mode = params[:sync_mode] ||= 2
32
+ doi = params[:doi] ||= true
33
+ doiplus = params[:doiplus] ||= true
34
+ url = "contacts/#{email}?permission=#{permission}&sync_mode=#{sync_mode}&doi=#{doi}&doiplus=#{doiplus}"
35
+ @session.post(:path => "#{@path}#{url}", :headers => get_headers, :body => body.to_json)
36
+ end
37
+
38
+ def delete_contact(params)
39
+ raise ArgumentError.new("No parameters.") if params.empty?
40
+ raise ArgumentError.new("Email is mandatory.") if params[:email].nil?
41
+ raise Maileon::Errors::ValidationError.new("Invalid email format.") unless is_valid_email(params[:email])
42
+ email = URI::escape(params[:email])
43
+ url = "contacts/#{email}"
44
+ @session.delete(:path => "#{@path}#{url}", :headers => get_headers('xml'))
45
+ end
46
+
47
+ private
48
+
49
+ def get_headers(type='json')
50
+ {
51
+ "Content-Type" => "application/vnd.maileon.api+#{type}; charset=utf-8",
52
+ "Authorization" => "Basic #{@apikey}"
53
+ }
54
+ end
55
+
56
+ def is_valid_email(email)
57
+ !/\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/.match(email).nil?
58
+ end
59
+
60
+ end
61
+ end
@@ -0,0 +1,7 @@
1
+ module Maileon
2
+ module Errors
3
+
4
+ class ValidationError < StandardError; end
5
+
6
+ end
7
+ end
@@ -0,0 +1,3 @@
1
+ module Maileon
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,34 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'maileon/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "maileon"
8
+ spec.version = Maileon::VERSION
9
+ spec.authors = ["Ain Tohvri"]
10
+ spec.email = ["at@interactive-pioneers.de"]
11
+ spec.summary = %q{Ruby wrapper for Maileon API.}
12
+ spec.description = %q{Ruby wrapper for Maileon email marketing software API.}
13
+ spec.homepage = "https://github.com/interactive-pioneers/maileon"
14
+ spec.license = "GPL-3.0"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_runtime_dependency "excon", "~> 0.44.4"
22
+ spec.add_runtime_dependency "json", "~> 1.8"
23
+ spec.add_development_dependency "bundler", "~> 1.6"
24
+ spec.add_development_dependency "rake", "~> 10.0"
25
+ spec.add_development_dependency "rspec", "~> 3.2"
26
+ spec.add_development_dependency "rspec-nc", "~> 0.2"
27
+ spec.add_development_dependency "guard", "~> 2.2"
28
+ spec.add_development_dependency "guard-rspec", "~> 4.5"
29
+ spec.add_development_dependency "pry", "~> 0.10"
30
+ spec.add_development_dependency "pry-remote", "~> 0.1"
31
+ spec.add_development_dependency "pry-nav", "~> 0.2"
32
+ spec.add_development_dependency "webmock", "~> 1.20"
33
+ spec.add_development_dependency "sinatra", "~> 1.4"
34
+ end
@@ -0,0 +1,113 @@
1
+ require 'spec_helper'
2
+ require 'excon'
3
+ require 'support/mock_maileon'
4
+
5
+ describe Maileon::API do
6
+
7
+ describe '.initialize' do
8
+ context 'without API key' do
9
+ it { expect { Maileon::API.new }.to raise_error }
10
+ end
11
+ context 'with API key' do
12
+ it { expect(Maileon::API.new('2iaodsfi4u83943uruqf')).to be_an_instance_of Maileon::API }
13
+ end
14
+ context 'with environment-based API key' do
15
+ it {
16
+ ENV['MAILEON_APIKEY'] = 'adsfadsi4292r0vajsfdafldkaf'
17
+ is_expected.to be_an_instance_of Maileon::API
18
+ }
19
+ end
20
+ end
21
+
22
+ describe Maileon::API.new('asdfasdfasdfa') do
23
+ context 'when initiliased' do
24
+ it { is_expected.to have_attributes(:host => a_string_starting_with("https://")) }
25
+ it { is_expected.to have_attributes(:path => a_string_starting_with("/")) }
26
+ it { is_expected.to have_attributes(:apikey => Base64.encode64('asdfasdfasdfa').strip) }
27
+ it { is_expected.to have_attributes(:debug => false) }
28
+ it { is_expected.to have_attributes(:session => be) }
29
+ end
30
+ end
31
+
32
+ describe '.ping' do
33
+ context 'with invalid API key' do
34
+ it {
35
+ @maileon = Maileon::API.new('9320293t90gaksdf5900434')
36
+ expect(@maileon.ping.status).to eq 401
37
+ }
38
+ end
39
+ context 'with valid API key' do
40
+ it {
41
+ @maileon = Maileon::API.new(MockMaileon::API_KEY)
42
+ expect(@maileon.ping.status).to eq 200
43
+ }
44
+ end
45
+ end
46
+
47
+ describe '.create_contact' do
48
+ before(:all) do
49
+ @maileon = Maileon::API.new(MockMaileon::API_KEY)
50
+ end
51
+ context 'without parameters' do
52
+ it { expect { @maileon.create_contact() }.to raise_error(ArgumentError) }
53
+ end
54
+ context 'with empty parameters' do
55
+ it { expect { @maileon.create_contact({}) }.to raise_error(ArgumentError, "No parameters.") }
56
+ end
57
+ context 'without email' do
58
+ it { expect { @maileon.create_contact({:permission => 1}) }.to raise_error(ArgumentError, "Email is mandatory.") }
59
+ end
60
+ context 'with invalid email' do
61
+ it { expect { @maileon.create_contact({ :email => 'dummy@email' }) }.to raise_error(Maileon::Errors::ValidationError, "Invalid email format.") }
62
+ it { expect { @maileon.create_contact({ :email => 'dummy@email.2' }) }.to raise_error(Maileon::Errors::ValidationError, "Invalid email format.") }
63
+ it { expect { @maileon.create_contact({ :email => 'dummy@.2' }) }.to raise_error(Maileon::Errors::ValidationError, "Invalid email format.") }
64
+ it { expect { @maileon.create_contact({ :email => '@dummy.de' }) }.to raise_error(Maileon::Errors::ValidationError, "Invalid email format.") }
65
+ end
66
+ context 'with valid email' do
67
+ it { expect { @maileon.create_contact({ :email => 'dummy@email.com' }) }.not_to raise_error }
68
+ it { expect { @maileon.create_contact({ :email => 'dummy@some.email.de' }) }.not_to raise_error }
69
+ it { expect { @maileon.create_contact({ :email => 'dummy.some+filter@email.some-tld.de' }) }.not_to raise_error }
70
+ it { expect(@maileon.create_contact({ :email => 'dummy@tld.de' }).status).to eq 200 }
71
+ end
72
+ context 'with invalid API key' do
73
+ it {
74
+ @maileon = Maileon::API.new('219049tigadkv9f095t03tk2')
75
+ expect(@maileon.create_contact({ :email => 'dummy@tld.de' }).status).to eq 401
76
+ }
77
+ end
78
+ end
79
+
80
+ describe '.delete_contact' do
81
+ before(:all) do
82
+ @maileon = Maileon::API.new(MockMaileon::API_KEY)
83
+ end
84
+ context 'without parameters' do
85
+ it { expect { @maileon.delete_contact() }.to raise_error(ArgumentError) }
86
+ end
87
+ context 'with empty parameters' do
88
+ it { expect { @maileon.delete_contact({}) }.to raise_error(ArgumentError, "No parameters.") }
89
+ end
90
+ context 'without email' do
91
+ it { expect { @maileon.delete_contact({:permission => 1}) }.to raise_error(ArgumentError, "Email is mandatory.") }
92
+ end
93
+ context 'with invalid email' do
94
+ it { expect { @maileon.delete_contact({ :email => 'dummy@email' }) }.to raise_error(Maileon::Errors::ValidationError, "Invalid email format.") }
95
+ it { expect { @maileon.delete_contact({ :email => 'dummy@email.2' }) }.to raise_error(Maileon::Errors::ValidationError, "Invalid email format.") }
96
+ it { expect { @maileon.delete_contact({ :email => 'dummy@.2' }) }.to raise_error(Maileon::Errors::ValidationError, "Invalid email format.") }
97
+ it { expect { @maileon.delete_contact({ :email => '@dummy.de' }) }.to raise_error(Maileon::Errors::ValidationError, "Invalid email format.") }
98
+ end
99
+ context 'with valid email' do
100
+ it { expect { @maileon.delete_contact({ :email => 'dummy@email.com' }) }.not_to raise_error }
101
+ it { expect { @maileon.delete_contact({ :email => 'dummy@some.email.de' }) }.not_to raise_error }
102
+ it { expect { @maileon.delete_contact({ :email => 'dummy.some+filter@email.some-tld.de' }) }.not_to raise_error }
103
+ it { expect(@maileon.delete_contact({ :email => 'dummy@tld.de' }).status).to eq 200 }
104
+ end
105
+ context 'with invalid API key' do
106
+ it {
107
+ @maileon = Maileon::API.new('219049tigadkv9f095t03tk2')
108
+ expect(@maileon.delete_contact({ :email => 'dummy@tld.de' }).status).to eq 401
109
+ }
110
+ end
111
+ end
112
+
113
+ end
@@ -0,0 +1,14 @@
1
+ require 'pry'
2
+ require 'maileon'
3
+ require 'webmock/rspec'
4
+ require 'support/mock_maileon'
5
+
6
+ # Do not allow external calls to API
7
+ WebMock.disable_net_connect!(allow_localhost: true)
8
+
9
+ # Stub all external API calls for WebMock
10
+ RSpec.configure do |config|
11
+ config.before(:each) do
12
+ stub_request(:any, /api.maileon.com/).to_rack(MockMaileon)
13
+ end
14
+ end
File without changes
@@ -0,0 +1,31 @@
1
+ require 'sinatra/base'
2
+
3
+ class MockMaileon < Sinatra::Base
4
+
5
+ API_KEY = 'adsfadsi4292r0vajsfdafldkaf'
6
+
7
+ post '/1.0/contacts/:email' do
8
+ json_response is_valid_api_key? ? 200 : 401, 'create_contact.json'
9
+ end
10
+
11
+ delete '/1.0/contacts/:email' do
12
+ json_response is_valid_api_key? ? 200 : 401, 'delete_contact.json'
13
+ end
14
+
15
+ get '/1.0/ping' do
16
+ json_response is_valid_api_key? ? 200 : 401, 'ping.json'
17
+ end
18
+
19
+ private
20
+
21
+ def is_valid_api_key?
22
+ key = request.env['HTTP_AUTHORIZATION'].split(' ').last
23
+ Base64.encode64(API_KEY).strip == key
24
+ end
25
+
26
+ def json_response(response_code, file_name)
27
+ content_type :json
28
+ status response_code
29
+ File.open(File.dirname(__FILE__) + '/fixtures/' + file_name, 'rb').read
30
+ end
31
+ end
metadata ADDED
@@ -0,0 +1,251 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: maileon
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Ain Tohvri
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-03-04 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: excon
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.44.4
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.44.4
27
+ - !ruby/object:Gem::Dependency
28
+ name: json
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.8'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.8'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.6'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.6'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '10.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '10.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.2'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.2'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec-nc
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0.2'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '0.2'
97
+ - !ruby/object:Gem::Dependency
98
+ name: guard
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '2.2'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '2.2'
111
+ - !ruby/object:Gem::Dependency
112
+ name: guard-rspec
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '4.5'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '4.5'
125
+ - !ruby/object:Gem::Dependency
126
+ name: pry
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '0.10'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '0.10'
139
+ - !ruby/object:Gem::Dependency
140
+ name: pry-remote
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '0.1'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '0.1'
153
+ - !ruby/object:Gem::Dependency
154
+ name: pry-nav
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '0.2'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '0.2'
167
+ - !ruby/object:Gem::Dependency
168
+ name: webmock
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: '1.20'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: '1.20'
181
+ - !ruby/object:Gem::Dependency
182
+ name: sinatra
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - "~>"
186
+ - !ruby/object:Gem::Version
187
+ version: '1.4'
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - "~>"
193
+ - !ruby/object:Gem::Version
194
+ version: '1.4'
195
+ description: Ruby wrapper for Maileon email marketing software API.
196
+ email:
197
+ - at@interactive-pioneers.de
198
+ executables: []
199
+ extensions: []
200
+ extra_rdoc_files: []
201
+ files:
202
+ - ".gitignore"
203
+ - ".rspec"
204
+ - ".travis.yml"
205
+ - Gemfile
206
+ - Guardfile
207
+ - LICENSE
208
+ - README.md
209
+ - Rakefile
210
+ - lib/maileon.rb
211
+ - lib/maileon/api.rb
212
+ - lib/maileon/errors.rb
213
+ - lib/maileon/version.rb
214
+ - maileon.gemspec
215
+ - spec/lib/api_spec.rb
216
+ - spec/spec_helper.rb
217
+ - spec/support/fixtures/create_contact.json
218
+ - spec/support/fixtures/delete_contact.json
219
+ - spec/support/fixtures/ping.json
220
+ - spec/support/mock_maileon.rb
221
+ homepage: https://github.com/interactive-pioneers/maileon
222
+ licenses:
223
+ - GPL-3.0
224
+ metadata: {}
225
+ post_install_message:
226
+ rdoc_options: []
227
+ require_paths:
228
+ - lib
229
+ required_ruby_version: !ruby/object:Gem::Requirement
230
+ requirements:
231
+ - - ">="
232
+ - !ruby/object:Gem::Version
233
+ version: '0'
234
+ required_rubygems_version: !ruby/object:Gem::Requirement
235
+ requirements:
236
+ - - ">="
237
+ - !ruby/object:Gem::Version
238
+ version: '0'
239
+ requirements: []
240
+ rubyforge_project:
241
+ rubygems_version: 2.4.6
242
+ signing_key:
243
+ specification_version: 4
244
+ summary: Ruby wrapper for Maileon API.
245
+ test_files:
246
+ - spec/lib/api_spec.rb
247
+ - spec/spec_helper.rb
248
+ - spec/support/fixtures/create_contact.json
249
+ - spec/support/fixtures/delete_contact.json
250
+ - spec/support/fixtures/ping.json
251
+ - spec/support/mock_maileon.rb