embulk-output-mailchimp 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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 45060c5aec8200c9d1806d466414c014834dec45
4
+ data.tar.gz: 975cf885d3d90f9de70c7b9a119a96a4753ecfe9
5
+ SHA512:
6
+ metadata.gz: ca60d58b8698b777e14df5ced2e3ff82543d4a42979c8a9ac2fff606852e6249131956d0b3c6f8f7b3c51d37c0b7a22da68de6cfd2be746f24c3b0cd04c0eb4b
7
+ data.tar.gz: 940b9ce3f294f45e3d5797b64df87a6003c8ff413c3441122a66f447dfd64869d5d066daef91e5a047425b1ee171de7577c1683d1acecae08699f9cae5789429
data/.coveralls.yml ADDED
@@ -0,0 +1 @@
1
+ service_name: travis-ci
data/.gitignore ADDED
@@ -0,0 +1,6 @@
1
+ *~
2
+ /pkg/
3
+ /tmp/
4
+ /.bundle/
5
+ /Gemfile.lock
6
+ /coverage/
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ jruby-9.0.0.0
data/.travis.yml ADDED
@@ -0,0 +1,9 @@
1
+ language: jruby
2
+ before_install:
3
+ - rvm get head --auto-dotfiles
4
+ - rvm install jruby-9.0.1.0
5
+ - gem install bundler
6
+ - gem update bundler
7
+ - bundle install
8
+ script:
9
+ - bundle exec rake cov
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source 'https://rubygems.org/'
2
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+
2
+ MIT License
3
+
4
+ Permission is hereby granted, free of charge, to any person obtaining
5
+ a copy of this software and associated documentation files (the
6
+ "Software"), to deal in the Software without restriction, including
7
+ without limitation the rights to use, copy, modify, merge, publish,
8
+ distribute, sublicense, and/or sell copies of the Software, and to
9
+ permit persons to whom the Software is furnished to do so, subject to
10
+ the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be
13
+ included in all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,45 @@
1
+ # Mailchimp output plugin for Embulk
2
+ [![Coverage Status](https://coveralls.io/repos/treasure-data/embulk-output-mailchimp/badge.svg?branch=master&service=github)](https://coveralls.io/github/treasure-data/embulk-output-mailchimp?branch=master)
3
+ [![Build Status](https://travis-ci.org/treasure-data/embulk-output-mailchimp.svg)](https://travis-ci.org/treasure-data/embulk-output-mailchimp?branch=master)
4
+
5
+ add e-mail to List in MailChimp.
6
+
7
+ ## Overview
8
+
9
+ * **Plugin type**: output
10
+ * **Load all or nothing**: no
11
+ * **Resume supported**: no
12
+ * **Cleanup supported**: no
13
+
14
+ ## Configuration
15
+
16
+ - **apikey**: Mailchimp API key (string, required)
17
+ - **list_id**: Mailchimp List id (string, required)
18
+ - **double_optin**: control whether to send an opt-in confirmation email (boolean, default: true)
19
+ - **update_existing**: control whether to update members that are already subscribed to the list or to return an error (boolean, default: false)
20
+ - **replace_interests**: determine whether we replace the interest groups with the updated groups provided, or we add the provided groups to the member's interest groups (boolean, default: true)
21
+ - **email_column**: column name for email (string, default: 'email')
22
+ - **fname_column**: column name for first name (string, default: 'fname')
23
+ - **lname_column**: column name for last name(string, default: 'lname')
24
+
25
+ ## Example
26
+
27
+ ```yaml
28
+ out:
29
+ type: mailchimp
30
+ apikey: 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-XXX'
31
+ list_id: 'XXXXXXXXXX'
32
+ double_optin: false
33
+ update_existing: false
34
+ replace_interests: true
35
+ email_column: 'e-mail'
36
+ fname_column: 'first name'
37
+ lname_column: 'lname'
38
+ ```
39
+
40
+
41
+ ## Build
42
+
43
+ ```
44
+ $ rake
45
+ ```
data/Rakefile ADDED
@@ -0,0 +1,29 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ task default: :build
4
+
5
+ task 'clean' do
6
+ Dir.glob("pkg/*.gem").each do |name|
7
+ sh "rm #{name}"
8
+ end
9
+ end
10
+
11
+ task 'reload' do
12
+ spec = Bundler::GemHelper.gemspec
13
+
14
+ sh "embulk gem uninstall #{spec.name}"
15
+ Rake::Task['clean'].execute
16
+ Rake::Task['build'].execute
17
+ sh "embulk gem install pkg/#{spec.name}-#{spec.version}.gem"
18
+ end
19
+
20
+ desc 'Run tests'
21
+ task :test do
22
+ ruby("test/run-test.rb", "--use-color=yes", "--collector=dir")
23
+ end
24
+
25
+ desc "Run tests with coverage"
26
+ task :cov do
27
+ ENV["COVERAGE"] = "1"
28
+ ruby("--debug", "test/run-test.rb", "--use-color=yes", "--collector=dir")
29
+ end
@@ -0,0 +1,27 @@
1
+
2
+ Gem::Specification.new do |spec|
3
+ spec.name = "embulk-output-mailchimp"
4
+ spec.version = "0.1.0"
5
+ spec.authors = ["takkanm"]
6
+ spec.summary = "Mailchimp output plugin for Embulk"
7
+ spec.description = "Dumps records to Mailchimp."
8
+ spec.email = ["takkanm@gmail.com"]
9
+ spec.licenses = ["MIT"]
10
+ # TODO set this: spec.homepage = "https://github.com/takkanm/embulk-output-mailchimp"
11
+
12
+ spec.files = `git ls-files`.split("\n") + Dir["classpath/*.jar"]
13
+ spec.test_files = spec.files.grep(%r{^(test|spec)/})
14
+ spec.require_paths = ["lib"]
15
+
16
+ #spec.add_dependency 'YOUR_GEM_DEPENDENCY', ['~> YOUR_GEM_DEPENDENCY_VERSION']
17
+ spec.add_dependency 'mailchimp-api', ['~> 2.0.6']
18
+ spec.add_dependency 'perfect_retry', "~> 0.3"
19
+
20
+ spec.add_development_dependency 'embulk', ['~> 0.7.9']
21
+ spec.add_development_dependency 'bundler', ['~> 1.0']
22
+ spec.add_development_dependency 'rake', ['>= 10.0']
23
+ spec.add_development_dependency 'test-unit'
24
+ spec.add_development_dependency 'test-unit-rr'
25
+ spec.add_development_dependency 'simplecov', ['>= 0.9']
26
+ spec.add_development_dependency 'coveralls'
27
+ end
@@ -0,0 +1,142 @@
1
+ require 'mailchimp'
2
+ require 'perfect_retry'
3
+
4
+ module Embulk
5
+ module Output
6
+
7
+ class Mailchimp < OutputPlugin
8
+ Plugin.register_output("mailchimp", self)
9
+
10
+ class Client
11
+ def initialize(apikey)
12
+ @client = ::Mailchimp::API.new(apikey)
13
+ rescue ::Mailchimp::InvalidApiKeyError => e
14
+ raise Embulk::ConfigError.new(e.message)
15
+ end
16
+
17
+ def batch_subscribe_list(list_id, subscribers, double_optin, update_existing, replace_interests)
18
+ @client.lists.batch_subscribe(list_id, subscribers, double_optin, update_existing, replace_interests)
19
+ rescue ::Mailchimp::UserUnderMaintenanceError, ::Mailchimp::TooManyConnectionsError => e
20
+ Embulk.logger.warn e.message
21
+ raise e
22
+ rescue ::Mailchimp::Error => e
23
+ raise Embulk::DataError.new(e.message)
24
+ end
25
+ end
26
+
27
+ MAX_EMAIL_COUNT = 1_000_000
28
+
29
+ def self.transaction(config, schema, count, &control)
30
+ task = {
31
+ apikey: config.param("apikey", :string),
32
+ list_id: config.param("list_id", :string),
33
+ double_optin: config.param("double_optin", :bool, default: true),
34
+ update_existing: config.param("update_existing", :bool, default: false),
35
+ replace_interests: config.param("replace_interests", :bool, default: true),
36
+ email_column: config.param("email_column", :string, default: "email"),
37
+ fname_column: config.param("fname_column", :string, default: "fname"),
38
+ lname_column: config.param("lname_column", :string, default: "lname"),
39
+ retry_limit: config.param("retry_limit", :integer, default: 5),
40
+ retry_initial_wait_sec: config.param("retry_initial_wait_sec", :integer, default: 1),
41
+ stop_on_invalid_record: config.param("stop_on_invalid_record", :bool, default: true),
42
+ }
43
+
44
+ Client.new(task[:apikey]) # NOTE for validate apikey
45
+ raise Embulk::ConfigError.new("schema has no '#{task[:email_column]}' column") if schema.none? {|s| s.name == task[:email_column] }
46
+
47
+ task_reports = yield(task)
48
+ next_config_diff = {}
49
+ return next_config_diff
50
+ end
51
+
52
+ def init
53
+ @client = Client.new(task[:apikey])
54
+ @list_id = task[:list_id]
55
+ @double_optin = task[:double_optin]
56
+ @update_existing = task[:update_existing]
57
+ @replace_interests = task[:replace_interests]
58
+ @email_column = task[:email_column]
59
+ @fname_column = task[:fname_column]
60
+ @lname_column = task[:lname_column]
61
+ @subscribers = []
62
+
63
+ @retry_manager = PerfectRetry.new do |config|
64
+ config.limit = task[:retry_limit]
65
+ config.sleep = lambda{|n| task[:retry_initial_wait_sec] * (2 ** (n - 1)) }
66
+ config.logger = Embulk.logger
67
+ config.log_level = nil
68
+ config.dont_rescues = [Embulk::ConfigError, Embulk::DataError]
69
+ end
70
+ @stop_on_invalid_record = task[:stop_on_invalid_record]
71
+ end
72
+
73
+ def close
74
+ end
75
+
76
+ def add(page)
77
+ # output code:
78
+ page.each do |record|
79
+ row = Hash[schema.names.zip(record)]
80
+ if row[@email_column]
81
+ add_subscriber row
82
+
83
+ flush_subscribers! unless @subscribers.size < MAX_EMAIL_COUNT
84
+ else
85
+ raise Embulk::DataError.new("#{@email_column} is empty") if @stop_on_invalid_record
86
+ end
87
+ end
88
+ end
89
+
90
+ def finish
91
+ flush_subscribers!
92
+ end
93
+
94
+ def abort
95
+ end
96
+
97
+ def commit
98
+ task_report = {}
99
+ return task_report
100
+ end
101
+
102
+ private
103
+
104
+ def add_subscriber(row)
105
+ return unless row[@email_column]
106
+
107
+ merge_columns = {fname: @fname_column, lname: @lname_column}
108
+
109
+ merge_vars = merge_columns.each_with_object({}) do |(key, col_name), m|
110
+ m[key] = row[col_name] if row[col_name]
111
+ end
112
+
113
+ @subscribers << {
114
+ EMAIL: {
115
+ email: row[@email_column]
116
+ },
117
+ merge_vars: merge_vars,
118
+ }
119
+ end
120
+
121
+ def flush_subscribers!
122
+ return if @subscribers.empty?
123
+
124
+ send_subscribers!
125
+ @subscribers = []
126
+ end
127
+
128
+ def send_subscribers!
129
+ @retry_manager.with_retry do
130
+ @client.batch_subscribe_list(
131
+ @list_id,
132
+ @subscribers,
133
+ @double_optin,
134
+ @update_existing,
135
+ @replace_interests
136
+ )
137
+ end
138
+ end
139
+ end
140
+
141
+ end
142
+ end
@@ -0,0 +1,165 @@
1
+ require "embulk"
2
+ Embulk.setup
3
+
4
+ require "embulk/output/mailchimp"
5
+ require "override_assert_raise"
6
+
7
+
8
+ module Embulk
9
+ module Output
10
+ class TestMailchimp < Test::Unit::TestCase
11
+ include OverrideAssertRaise
12
+
13
+ def apikey
14
+ 'XXXXXXXXXXXXXXXXXXXXXX'
15
+ end
16
+
17
+ def list_id
18
+ 'listlist'
19
+ end
20
+
21
+ class TestTransaction < self
22
+ def base_config
23
+ {
24
+ type: 'mailchimp',
25
+ apikey: apikey,
26
+ list_id: list_id,
27
+ }
28
+ end
29
+
30
+ class MailchimpAPIKeyIsValid < self
31
+ def setup
32
+ stub(Embulk::Output::Mailchimp::Client).new(apikey) { }
33
+ end
34
+
35
+ def test_call_finish_without_error
36
+ source = create_config(base_config)
37
+ schema = create_schema([{name: 'email', type: :string}])
38
+
39
+ Embulk::Output::Mailchimp.transaction(source, schema, 1) {}
40
+ end
41
+
42
+ def test_schema_has_no_email_column
43
+ source = create_config(base_config.merge(email_column: 'e_mail'))
44
+ schema = create_schema([{name: 'email', type: :string}])
45
+
46
+ assert_raise(Embulk::ConfigError) do
47
+ Embulk::Output::Mailchimp.transaction(source, schema, 1) {}
48
+ end
49
+ end
50
+ end
51
+
52
+ class MailchimpAPIKeyIsInvalid < self
53
+ def setup
54
+ stub(::Mailchimp::API).new(apikey) { raise ::Mailchimp::InvalidApiKeyError }
55
+ end
56
+
57
+ def test_call_finish_without_error
58
+ source = create_config(base_config)
59
+ schema = create_schema([{name: 'email', type: :string}])
60
+
61
+ assert_raise(Embulk::ConfigError) do
62
+ Embulk::Output::Mailchimp.transaction(source, schema, 1) {}
63
+ end
64
+ end
65
+ end
66
+ end
67
+
68
+ class TestAdd < self
69
+ setup do
70
+ stub(::Mailchimp::API).new(apikey) { }
71
+ end
72
+
73
+ def create_mailchimp(optional_task = {})
74
+ Mailchimp.new(
75
+ {apikey: apikey, list_id: list_id, email_column: 'email'}.merge(optional_task),
76
+ create_schema([
77
+ {name: 'email', type: :string},
78
+ {name: 'fname', type: :string},
79
+ {name: 'lname', type: :string},
80
+ ]),
81
+ 1
82
+ )
83
+ end
84
+
85
+ class MergeVars < self
86
+ def page
87
+ [['a@example.com', 'first', 'last']]
88
+ end
89
+
90
+ def test_stop_on_invalid_record_is_false
91
+ mailchimp = create_mailchimp(
92
+ lname_column: 'lname',
93
+ fname_column: 'fname'
94
+ )
95
+
96
+ mailchimp.add(page)
97
+ subscriber = mailchimp.instance_variable_get(:@subscribers)[0]
98
+
99
+ assert_equal(subscriber[:EMAIL][:email], 'a@example.com')
100
+ assert_equal(subscriber[:merge_vars][:fname], 'first')
101
+ assert_equal(subscriber[:merge_vars][:lname], 'last')
102
+ end
103
+ end
104
+
105
+ # NOTE skip until const mocking
106
+ class RecordeOverMaxEmailCount# < self
107
+ def page
108
+ [['@example.com']] * Mailchimp::MAX_EMAIL_COUNT
109
+ end
110
+
111
+ def test_flush_if_over_max_email_count
112
+ mailchimp = create_mailchimp
113
+ mock(mailchimp).send_subscribers!
114
+
115
+ mailchimp.add(page)
116
+ assert_equal(mailchimp.instance_variable_get(:@subscribers).size, 1)
117
+ end
118
+ end
119
+
120
+ class EmailColumnValueIsEmpty < self
121
+ def page
122
+ [
123
+ ['a@example.com'], [], ['c@example.com']
124
+ ]
125
+ end
126
+
127
+ def test_stop_on_invalid_record_is_false
128
+ mailchimp = create_mailchimp(stop_on_invalid_record: false)
129
+
130
+ mailchimp.add(page)
131
+ assert_equal(mailchimp.instance_variable_get(:@subscribers).size, 2)
132
+ end
133
+
134
+ def test_stop_on_invalid_record_is_true
135
+ mailchimp = create_mailchimp(stop_on_invalid_record: true)
136
+
137
+ assert_raise(Embulk::DataError) do
138
+ mailchimp.add(page)
139
+ end
140
+ end
141
+ end
142
+ end
143
+
144
+ private
145
+
146
+ def create_config(config)
147
+ Embulk::DataSource[*config.to_a.flatten(1)]
148
+ end
149
+
150
+ def create_schema(columns)
151
+ Embulk::Schema.new(columns.map {|c| Embulk::Column.new(c) })
152
+ end
153
+
154
+ def mute_logger
155
+ stub(Embulk).logger { Logger.new(File::NULL) }
156
+ end
157
+
158
+ def setup_plugin(specific_task = nil, specific_schema = nil)
159
+ @plugin = Mailchimp.new(specific_task || task, specific_schema || schema, 1)
160
+ stub(@plugin).task { specific_task || task }
161
+ @plugin.init
162
+ end
163
+ end
164
+ end
165
+ end
@@ -0,0 +1,18 @@
1
+ module OverrideAssertRaise
2
+ # NOTE: Embulk 0.7.1+ required to raise ConfigError to do as `ConfigError.new("message")`,
3
+ # original `assert_raise` method can't catch that, but `begin .. rescue` can.
4
+ # So we override assert_raise as below.
5
+ def assert_raise(expected_class = StandardError, &block)
6
+ begin
7
+ block.call
8
+ assert_equal expected_class, nil
9
+ rescue ::Test::Unit::AssertionFailedError => e
10
+ # failed assert raises this Error and that extends StandardError, so rescue it first
11
+ raise e
12
+ rescue expected_class
13
+ assert true # passed
14
+ rescue => e
15
+ assert_equal(expected_class, e.class) # not expected one raised
16
+ end
17
+ end
18
+ end
data/test/run-test.rb ADDED
@@ -0,0 +1,32 @@
1
+ base_dir = File.expand_path(File.join(File.dirname(__FILE__), ".."))
2
+ lib_dir = File.join(base_dir, "lib")
3
+ test_dir = File.join(base_dir, "test")
4
+
5
+ require "test-unit"
6
+ require "test/unit/rr"
7
+
8
+ $LOAD_PATH.unshift(lib_dir)
9
+ $LOAD_PATH.unshift(test_dir)
10
+
11
+ ENV["TEST_UNIT_MAX_DIFF_TARGET_STRING_SIZE"] ||= "5000"
12
+
13
+ if ENV['CI']
14
+ require 'simplecov'
15
+ require 'coveralls'
16
+ Coveralls.wear!
17
+
18
+ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[Coveralls::SimpleCov::Formatter]
19
+ SimpleCov.start 'test_frameworks'
20
+ end
21
+
22
+ if ENV["COVERAGE"]
23
+ require 'simplecov'
24
+ SimpleCov.start 'test_frameworks'
25
+
26
+ if ENV['CIRCLE_ARTIFACTS'] # https://circleci.com/docs/code-coverage
27
+ dir = File.join(ENV['CIRCLE_ARTIFACTS'], "coverage")
28
+ SimpleCov.coverage_dir(dir)
29
+ end
30
+ end
31
+
32
+ exit Test::Unit::AutoRunner.run(true, test_dir)
metadata ADDED
@@ -0,0 +1,186 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: embulk-output-mailchimp
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - takkanm
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-11-24 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: 2.0.6
19
+ name: mailchimp-api
20
+ prerelease: false
21
+ type: :runtime
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 2.0.6
27
+ - !ruby/object:Gem::Dependency
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '0.3'
33
+ name: perfect_retry
34
+ prerelease: false
35
+ type: :runtime
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.3'
41
+ - !ruby/object:Gem::Dependency
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: 0.7.9
47
+ name: embulk
48
+ prerelease: false
49
+ type: :development
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.7.9
55
+ - !ruby/object:Gem::Dependency
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '1.0'
61
+ name: bundler
62
+ prerelease: false
63
+ type: :development
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.0'
69
+ - !ruby/object:Gem::Dependency
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '10.0'
75
+ name: rake
76
+ prerelease: false
77
+ type: :development
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '10.0'
83
+ - !ruby/object:Gem::Dependency
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ name: test-unit
90
+ prerelease: false
91
+ type: :development
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ name: test-unit-rr
104
+ prerelease: false
105
+ type: :development
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ requirement: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '0.9'
117
+ name: simplecov
118
+ prerelease: false
119
+ type: :development
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0.9'
125
+ - !ruby/object:Gem::Dependency
126
+ requirement: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ name: coveralls
132
+ prerelease: false
133
+ type: :development
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ description: Dumps records to Mailchimp.
140
+ email:
141
+ - takkanm@gmail.com
142
+ executables: []
143
+ extensions: []
144
+ extra_rdoc_files: []
145
+ files:
146
+ - ".coveralls.yml"
147
+ - ".gitignore"
148
+ - ".ruby-version"
149
+ - ".travis.yml"
150
+ - Gemfile
151
+ - LICENSE.txt
152
+ - README.md
153
+ - Rakefile
154
+ - embulk-output-mailchimp.gemspec
155
+ - lib/embulk/output/mailchimp.rb
156
+ - test/embulk/output/test_mailchimp.rb
157
+ - test/override_assert_raise.rb
158
+ - test/run-test.rb
159
+ homepage:
160
+ licenses:
161
+ - MIT
162
+ metadata: {}
163
+ post_install_message:
164
+ rdoc_options: []
165
+ require_paths:
166
+ - lib
167
+ required_ruby_version: !ruby/object:Gem::Requirement
168
+ requirements:
169
+ - - ">="
170
+ - !ruby/object:Gem::Version
171
+ version: '0'
172
+ required_rubygems_version: !ruby/object:Gem::Requirement
173
+ requirements:
174
+ - - ">="
175
+ - !ruby/object:Gem::Version
176
+ version: '0'
177
+ requirements: []
178
+ rubyforge_project:
179
+ rubygems_version: 2.4.8
180
+ signing_key:
181
+ specification_version: 4
182
+ summary: Mailchimp output plugin for Embulk
183
+ test_files:
184
+ - test/embulk/output/test_mailchimp.rb
185
+ - test/override_assert_raise.rb
186
+ - test/run-test.rb