flydata 0.0.5.6 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,204 @@
1
+ require 'fluent_plugins_spec_helper'
2
+ require 'in_mysql_binlog_flydata'
3
+ require 'timecop'
4
+
5
+ module Fluent
6
+
7
+ TEST_TAG = "test_tag"
8
+ TEST_DB = "test_db"
9
+ TEST_TABLE = "test_table"
10
+ TEST_SEQUENCE_FILE = /positions\/#{TEST_TABLE}.pos$/
11
+ TEST_TABLES = "#{TEST_TABLE},test_table_1,test_table_2,test_table_3"
12
+ TEST_POSITION_FILE = "test_position.log"
13
+ TEST_TIMESTAMP = 1389214083
14
+ TEST_CONFIG = <<EOT
15
+ tag #{TEST_TAG}
16
+ database #{TEST_DB}
17
+ tables #{TEST_TABLES}
18
+ position_file #{TEST_POSITION_FILE}
19
+ EOT
20
+
21
+ # mysqlbinlog event
22
+ # http://dev.mysql.com/doc/refman/5.7/en/mysqlbinlog-hexdump.html
23
+
24
+ # Supported events
25
+ # - 17 WRITE_ROWS_EVENT
26
+ TEST_EVENT_INSERT=<<EOT
27
+ {"marker"=>0, "timestamp"=>#{TEST_TIMESTAMP}, "type_code"=>23, "server_id"=>1, "event_length"=>39, "next_position"=>667, "flags"=>1, "event_type"=>"Write_rows", "table_id"=>163, "db_name"=>"#{TEST_DB}", "table_name"=>"#{TEST_TABLE}", "columns"=>["LONG", "BLOB"], "columns_len"=>2, "null_bits_len"=>1, "raw_columns_before_image"=>[], "raw_used_columns"=>[255], "raw_row"=>[252, 3, 0, 0, 0, 3, 0, 102, 111, 111], "rows"=>[["1", "foo"],["2","var"],["3","hoge"]]}
28
+ EOT
29
+ # - 18 UPDATE_ROWS_EVENT
30
+ TEST_EVENT_UPDATE = <<EOT
31
+ {"marker"=>0, "timestamp"=>#{TEST_TIMESTAMP}, "type_code"=>24, "server_id"=>1, "event_length"=>78, "next_position"=>2606, "flags"=>1, "event_type"=>"Update_rows", "table_id"=>163, "db_name"=>"#{TEST_DB}", "table_name"=>"#{TEST_TABLE}", "columns"=>["LONG", "BLOB"], "columns_len"=>2, "null_bits_len"=>1, "raw_columns_before_image"=>[255], "raw_used_columns"=>[255], "raw_row"=>[252, 6, 0, 0, 0, 1, 0, 97, 252, 6, 0, 0, 0, 1, 0, 100, 252, 6, 0, 0, 0, 1, 0, 98, 252, 6, 0, 0, 0, 1, 0, 100, 252, 6, 0, 0, 0, 1, 0, 99, 252, 6, 0, 0, 0, 1, 0, 100], "rows"=>[[["1", "foo"], ["1", "wow"]],[["3", "hoge"], ["3", "fuga"]]]}
32
+ EOT
33
+ # - 19 DELETE_ROWS_EVENT
34
+ TEST_EVENT_DELETE = <<EOT
35
+ {"marker"=>0, "timestamp"=>#{TEST_TIMESTAMP}, "type_code"=>25, "server_id"=>1, "event_length"=>41, "next_position"=>5365, "flags"=>1, "event_type"=>"Delete_rows", "table_id"=>170, "db_name"=>"#{TEST_DB}", "table_name"=>"#{TEST_TABLE}", "columns"=>["LONG", "BLOB"], "columns_len"=>2, "null_bits_len"=>1, "raw_columns_before_image"=>[], "raw_used_columns"=>[255], "raw_row"=>[252, 2, 0, 0, 0, 5, 0, 104, 111, 104, 111, 103], "rows"=>[["2", "var"],["3","hoge"]]}
36
+ EOT
37
+ # Unsupported event
38
+ # - 02 QUERY_EVENT
39
+ # QUERY: BEGIN
40
+ TEST_EVENT_QUERY_BEGIN = <<EOT
41
+ {"marker"=>0, "timestamp"=>#{TEST_TIMESTAMP}, "type_code"=>2, "server_id"=>1, "event_length"=>73, "next_position"=>2472, "flags"=>8, "event_type"=>"Query", "thread_id"=>71, "exec_time"=>0, "error_code"=>0, "variables"=>[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 6, 3, 115, 116, 100, 4, 33, 0, 33, 0, 8, 0], "db_name"=>"#{TEST_DB}", "query"=>"BEGIN"}
42
+ EOT
43
+ # QUERY: create database
44
+ TEST_EVENT_QUERY_CREATE_DATABSE = <<EOT
45
+ {"marker"=>0, "timestamp"=>1389309478, "type_code"=>2, "server_id"=>1, "event_length"=>89, "next_position"=>196, "flags"=>8, "event_type"=>"Query", "thread_id"=>39, "exec_time"=>0, "error_code"=>0, "variables"=>[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 6, 3, 115, 116, 100, 4, 33, 0, 33, 0, 8, 0], "db_name"=>"test_db", "query"=>"create database test_db"}
46
+ EOT
47
+ # QUERY: create table
48
+ TEST_EVENT_QUERY_CREATE_TABLE = <<EOT
49
+ {"marker"=>0, "timestamp"=>1389309656, "type_code"=>2, "server_id"=>1, "event_length"=>121, "next_position"=>317, "flags"=>0, "event_type"=>"Query", "thread_id"=>42, "exec_time"=>0, "error_code"=>0, "variables"=>[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 6, 3, 115, 116, 100, 4, 33, 0, 33, 0, 8, 0], "db_name"=>"test_db", "query"=>"create table test_table(id int primary key, value text)"}
50
+ EOT
51
+ # QUERY: drop table
52
+ TEST_EVENT_QUERY_DROP_TABLE = <<EOT
53
+ {"marker"=>0, "timestamp"=>1389309995, "type_code"=>2, "server_id"=>1, "event_length"=>115, "next_position"=>568, "flags"=>0, "event_type"=>"Query", "thread_id"=>42, "exec_time"=>0, "error_code"=>0, "variables"=>[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 6, 3, 115, 116, 100, 4, 33, 0, 33, 0, 8, 0], "db_name"=>"test_db", "query"=>"DROP TABLE `test_table` /* generated by server */"}
54
+ EOT
55
+ # QUERY: alter table add column
56
+ TEST_EVENT_QUERY_ALTER_TABLE_ADD_COLUMN = <<EOT
57
+ {"marker"=>0, "timestamp"=>1389310404, "type_code"=>2, "server_id"=>1, "event_length"=>111, "next_position"=>800, "flags"=>0, "event_type"=>"Query", "thread_id"=>42, "exec_time"=>0, "error_code"=>0, "variables"=>[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 6, 3, 115, 116, 100, 4, 33, 0, 33, 0, 8, 0], "db_name"=>"test_db", "query"=>"alter table test_table add column sum integer"}
58
+ EOT
59
+ # QUERY: alter table drop column
60
+ TEST_EVENT_QUERY_ALTER_TABLE_DROP_COLUMN = <<EOT
61
+ {"marker"=>0, "timestamp"=>1389310533, "type_code"=>2, "server_id"=>1, "event_length"=>104, "next_position"=>904, "flags"=>0, "event_type"=>"Query", "thread_id"=>42, "exec_time"=>0, "error_code"=>0, "variables"=>[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 6, 3, 115, 116, 100, 4, 33, 0, 33, 0, 8, 0], "db_name"=>"test_db", "query"=>"alter table test_table drop column sum"}
62
+ EOT
63
+ # QUERY: alter table modify column
64
+ TEST_EVENT_QUERY_ALTER_TABLE_MODIFY_COLUMN = <<EOT
65
+ {"marker"=>0, "timestamp"=>1389310735, "type_code"=>2, "server_id"=>1, "event_length"=>112, "next_position"=>1352, "flags"=>0, "event_type"=>"Query", "thread_id"=>48, "exec_time"=>0, "error_code"=>0, "variables"=>[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 6, 3, 115, 116, 100, 4, 33, 0, 33, 0, 8, 0], "db_name"=>"test_db", "query"=>"alter table test_table modify column sum float"}
66
+ EOT
67
+ # - 03 STOP_EVENT
68
+ TEST_EVENT_STOP = <<EOT
69
+ {"marker"=>0, "timestamp"=>1389309286, "type_code"=>3, "server_id"=>1, "event_length"=>19, "next_position"=>2929, "flags"=>0, "event_type"=>"Stop"}
70
+ EOT
71
+ # - 04 ROTATE_EVENT
72
+ TEST_EVENT_ROTATE = <<EOT
73
+ {"marker"=>0, "timestamp"=>0, "type_code"=>4, "server_id"=>1, "event_length"=>43, "next_position"=>0, "flags"=>32, "event_type"=>"Rotate", "binlog_file"=>"mysql-bin.000048", "binlog_pos"=>2883}
74
+ EOT
75
+ # - 0f FORMAT_DESCRIPTION_EVENT
76
+ TEST_EVENT_FORMAT_DESC = <<EOT
77
+ {"marker"=>0, "timestamp"=>1389292075, "type_code"=>15, "server_id"=>1, "event_length"=>103, "next_position"=>0, "flags"=>0, "event_type"=>"Format_desc", "binlog_version"=>0, "created_ts"=>2560145104, "log_header_len"=>71}
78
+ EOT
79
+ # - 10 XID_EVENT
80
+ TEST_EVENT_XID = <<EOT
81
+ {"marker"=>0, "timestamp"=>#{TEST_TIMESTAMP}, "type_code"=>16, "server_id"=>1, "event_length"=>27, "next_position"=>2633, "flags"=>0, "event_type"=>"Xid", "xid_id"=>129345}
82
+ EOT
83
+
84
+ # - 13 TABLE_MAP_EVENT
85
+ TEST_EVENT_TABLE_MAP = <<EOT
86
+ {"marker"=>0, "timestamp"=>#{TEST_TIMESTAMP}, "type_code"=>19, "server_id"=>1, "event_length"=>56, "next_position"=>2528, "flags"=>1, "event_type"=>"Table_map", "table_id"=>163, "db_name"=>"#{TEST_DB}", "table_name"=>"#{TEST_TABLE}", "raw_columns"=>[3, 252], "columns"=>["LONG", "BLOB"], "metadata"=>[2], "null_bits"=>[3]}
87
+ EOT
88
+ # la
89
+ TEST_EVENT_INCIDENT = <<EOT
90
+ {"marker"=>0, "timestamp"=>0, "type_code"=>26, "server_id"=>1, "event_length"=>40, "next_position"=>2883, "flags"=>32, "event_type"=>"Incident", "incident_type"=>175, "message"=>"Operation canceled"}
91
+ EOT
92
+
93
+ describe MysqlBinlogFlydataInput do
94
+ def create_event(event_str)
95
+ event = eval(event_str)
96
+ allow(event).to receive(:event_type).and_return(event["event_type"])
97
+ event
98
+ end
99
+
100
+ def expect_emitted_records(event, records)
101
+ records = [records] unless records.kind_of?(Array)
102
+ records.each do |r|
103
+ expect(Engine).to receive(:emit).with(TEST_TAG, TEST_TIMESTAMP, r).ordered
104
+ end
105
+ plugin.event_listener(event)
106
+ end
107
+
108
+ def expect_no_emitted_record(event)
109
+ expect(Engine).to receive(:emit).never
110
+ plugin.event_listener(event)
111
+ end
112
+
113
+ def expect_emitted_records_with_rows(event, type, table, rows)
114
+ rows = [rows] unless rows.kind_of?(Array)
115
+ records = rows.collect do |row|
116
+ { "type"=>type, "table_name"=>table, "respect_order"=>true, "seq"=>2, "row"=>row }
117
+ end
118
+ expect_emitted_records(event, records)
119
+ end
120
+
121
+ let(:plugin) { MysqlBinlogFlydataInput.new }
122
+ let(:insert_event) { create_event(TEST_EVENT_INSERT) }
123
+ let(:delete_event) { create_event(TEST_EVENT_DELETE) }
124
+ let(:update_event) { create_event(TEST_EVENT_UPDATE) }
125
+
126
+ let(:query_event) { create_event(TEST_EVENT_QUERY_CREATE_DATABSE) }
127
+ let(:table_map_event) { create_event(TEST_EVENT_TABLE_MAP) }
128
+ let(:xid_event) { create_event(TEST_EVENT_XID) }
129
+
130
+ let(:now) { Time.now }
131
+
132
+ let(:table_seq_file) {
133
+ f = double('table_seq_file')
134
+ f.stub(:read).and_return('1')
135
+ f.stub(:rewind)
136
+ f.stub(:truncate)
137
+ f
138
+ }
139
+
140
+ before do
141
+ allow(MysqlBinlogInput::BinlogUtil).to receive(:to_hash) {|e| e}
142
+ allow(File).to receive(:open).with(TEST_POSITION_FILE).and_return('test_position')
143
+ allow(File).to receive(:exists?).with(TEST_POSITION_FILE).and_return(true)
144
+ allow(File).to receive(:open).with(TEST_SEQUENCE_FILE, "r+").and_yield(table_seq_file)
145
+ Timecop.freeze(now)
146
+ end
147
+
148
+ after do
149
+ Timecop.return
150
+ end
151
+
152
+ describe '#event_listener' do
153
+ before { Test.configure_plugin(plugin, TEST_CONFIG) }
154
+
155
+ context 'when received insert event' do
156
+ it do
157
+ table_seq_file.should_receive(:write).exactly(3).with(2)
158
+ expect_emitted_records_with_rows(insert_event, :insert, TEST_TABLE,
159
+ [{"1"=>"0SL00000001", "2"=>"foo"}, {"1"=>"0SL00000002", "2"=>"var"}, {"1"=>"0SL00000003", "2"=>"hoge"}])
160
+ end
161
+ end
162
+
163
+ context 'when received delete event' do
164
+ it do
165
+ table_seq_file.should_receive(:write).twice.with(2)
166
+ expect_emitted_records_with_rows(delete_event, :delete, TEST_TABLE,
167
+ [{"1"=>"0SL00000002", "2"=>"var"}, {"1"=>"0SL00000003", "2"=>"hoge"}])
168
+ end
169
+ end
170
+
171
+ context 'when received update event' do
172
+ it do
173
+ table_seq_file.should_receive(:write).twice.with(2)
174
+ expect_emitted_records_with_rows(update_event, :update, TEST_TABLE,
175
+ [{"1"=>"0SL00000001", "2"=>"wow"}, {"1"=>"0SL00000003", "2"=>"fuga"}])
176
+ end
177
+ end
178
+
179
+ context 'when received event with another database name' do
180
+ it do
181
+ event = insert_event
182
+ event['db_name'] = 'another_db'
183
+ expect_no_emitted_record(event)
184
+ end
185
+ end
186
+
187
+ context 'when received event with unsupported table name' do
188
+ it do
189
+ event = insert_event
190
+ event['table_name'] = 'another_table'
191
+ expect_no_emitted_record(event)
192
+ end
193
+ end
194
+
195
+ context 'when received unsupported event' do
196
+ it do
197
+ expect_no_emitted_record(query_event)
198
+ expect_no_emitted_record(table_map_event)
199
+ expect_no_emitted_record(xid_event)
200
+ end
201
+ end
202
+ end
203
+ end
204
+ end
@@ -0,0 +1,96 @@
1
+ require 'spec_helper'
2
+
3
+ module Flydata
4
+ module Util
5
+
6
+ describe Encryptor do
7
+ let(:default_key) { "test_key" }
8
+ let(:default_text) { "test_text" }
9
+
10
+ describe '.encrypt' do
11
+ context 'text is nil' do
12
+ it do
13
+ expect {
14
+ Flydata::Util::Encryptor.encrypt(nil, default_key)
15
+ }.to raise_error(ArgumentError)
16
+ end
17
+ end
18
+ context 'text is empty' do
19
+ it do
20
+ expect {
21
+ Flydata::Util::Encryptor.encrypt('', default_key)
22
+ }.to raise_error(ArgumentError)
23
+ end
24
+ end
25
+ context 'key is nil' do
26
+ it do
27
+ expect {
28
+ Flydata::Util::Encryptor.encrypt(default_text, nil)
29
+ }.to raise_error(ArgumentError)
30
+ end
31
+ end
32
+ context 'key is empty' do
33
+ it do
34
+ expect {
35
+ Flydata::Util::Encryptor.encrypt(default_text, '')
36
+ }.to raise_error(ArgumentError)
37
+ end
38
+ end
39
+ context 'text and key are valid' do
40
+ it do
41
+ e_t = Flydata::Util::Encryptor.encrypt(default_text, default_key)
42
+ expect(e_t).not_to eq(default_text)
43
+ expect(Flydata::Util::Encryptor.decrypt(e_t, default_key)).to eq(default_text)
44
+ end
45
+ end
46
+ end
47
+
48
+ describe '.decrypt' do
49
+ context 'text is invalid' do
50
+ it do
51
+ expect(Flydata::Util::Encryptor.decrypt('abcde', default_key)).to eq('abcde')
52
+ end
53
+ end
54
+ context 'text is valid' do
55
+ it do
56
+ e_t = Flydata::Util::Encryptor.encrypt(default_text, default_key)
57
+ expect(e_t).not_to eq(default_text)
58
+ expect(Flydata::Util::Encryptor.decrypt(e_t, default_key)).to eq(default_text)
59
+ end
60
+ end
61
+ end
62
+
63
+ describe '.decrypt!' do
64
+ context 'text is nil' do
65
+ it do
66
+ expect {
67
+ Flydata::Util::Encryptor.decrypt!(nil, default_key)
68
+ }.to raise_error(ArgumentError)
69
+ end
70
+ end
71
+ context 'text is empty' do
72
+ it do
73
+ expect {
74
+ Flydata::Util::Encryptor.decrypt!('', default_key)
75
+ }.to raise_error(ArgumentError)
76
+ end
77
+ end
78
+ context 'key is nil' do
79
+ it do
80
+ expect {
81
+ Flydata::Util::Encryptor.decrypt!(default_text, nil)
82
+ }.to raise_error(ArgumentError)
83
+ end
84
+ end
85
+ context 'key is empty' do
86
+ it do
87
+ expect {
88
+ Flydata::Util::Encryptor.decrypt!(default_text, '')
89
+ }.to raise_error(ArgumentError)
90
+ end
91
+ end
92
+ end
93
+
94
+ end
95
+ end
96
+ end
data/spec/spec_helper.rb CHANGED
@@ -2,6 +2,7 @@ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
2
  $LOAD_PATH.unshift(File.dirname(__FILE__))
3
3
  require 'rspec'
4
4
  require 'active_record' # for Flydata::Heroku
5
+ require 'protected_attributes'
5
6
  require 'flydata'
6
7
 
7
8
  # Requires supporting files with custom matchers and macros, etc,
@@ -0,0 +1,11 @@
1
+ # Custom configuration for flydata client
2
+ # This file is yaml format. http://www.yaml.org/
3
+ # Please remove '#' to enable custom option settings.
4
+ mysql_data_entry_preference:
5
+ #host: localhost
6
+ #port: 3306
7
+ #username: root
8
+ #password: abcd
9
+ #database: dev
10
+ #tables: users,country,rows
11
+ #mysqldump_dir: /mnt/dump
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flydata
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5.6
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-02-25 00:00:00.000000000 Z
12
+ date: 2014-04-18 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rest-client
@@ -107,6 +107,54 @@ dependencies:
107
107
  - - '='
108
108
  - !ruby/object:Gem::Version
109
109
  version: 0.10.35
110
+ - !ruby/object:Gem::Dependency
111
+ name: ruby-binlog
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: 1.0.0
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: 1.0.0
126
+ - !ruby/object:Gem::Dependency
127
+ name: fluent-plugin-mysql-binlog
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ~>
132
+ - !ruby/object:Gem::Version
133
+ version: 0.0.2
134
+ type: :runtime
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ~>
140
+ - !ruby/object:Gem::Version
141
+ version: 0.0.2
142
+ - !ruby/object:Gem::Dependency
143
+ name: mysql2
144
+ requirement: !ruby/object:Gem::Requirement
145
+ none: false
146
+ requirements:
147
+ - - ~>
148
+ - !ruby/object:Gem::Version
149
+ version: 0.3.11
150
+ type: :runtime
151
+ prerelease: false
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ~>
156
+ - !ruby/object:Gem::Version
157
+ version: 0.3.11
110
158
  - !ruby/object:Gem::Dependency
111
159
  name: bundler
112
160
  requirement: !ruby/object:Gem::Requirement
@@ -155,6 +203,22 @@ dependencies:
155
203
  - - ! '>='
156
204
  - !ruby/object:Gem::Version
157
205
  version: '0'
206
+ - !ruby/object:Gem::Dependency
207
+ name: timecop
208
+ requirement: !ruby/object:Gem::Requirement
209
+ none: false
210
+ requirements:
211
+ - - ! '>='
212
+ - !ruby/object:Gem::Version
213
+ version: '0'
214
+ type: :development
215
+ prerelease: false
216
+ version_requirements: !ruby/object:Gem::Requirement
217
+ none: false
218
+ requirements:
219
+ - - ! '>='
220
+ - !ruby/object:Gem::Version
221
+ version: '0'
158
222
  - !ruby/object:Gem::Dependency
159
223
  name: sqlite3
160
224
  requirement: !ruby/object:Gem::Requirement
@@ -171,9 +235,74 @@ dependencies:
171
235
  - - ! '>='
172
236
  - !ruby/object:Gem::Version
173
237
  version: '0'
238
+ - !ruby/object:Gem::Dependency
239
+ name: ruby-prof
240
+ requirement: !ruby/object:Gem::Requirement
241
+ none: false
242
+ requirements:
243
+ - - ! '>='
244
+ - !ruby/object:Gem::Version
245
+ version: '0'
246
+ type: :development
247
+ prerelease: false
248
+ version_requirements: !ruby/object:Gem::Requirement
249
+ none: false
250
+ requirements:
251
+ - - ! '>='
252
+ - !ruby/object:Gem::Version
253
+ version: '0'
254
+ - !ruby/object:Gem::Dependency
255
+ name: activemodel
256
+ requirement: !ruby/object:Gem::Requirement
257
+ none: false
258
+ requirements:
259
+ - - ~>
260
+ - !ruby/object:Gem::Version
261
+ version: 4.0.0
262
+ type: :development
263
+ prerelease: false
264
+ version_requirements: !ruby/object:Gem::Requirement
265
+ none: false
266
+ requirements:
267
+ - - ~>
268
+ - !ruby/object:Gem::Version
269
+ version: 4.0.0
270
+ - !ruby/object:Gem::Dependency
271
+ name: activerecord
272
+ requirement: !ruby/object:Gem::Requirement
273
+ none: false
274
+ requirements:
275
+ - - ~>
276
+ - !ruby/object:Gem::Version
277
+ version: 4.0.0
278
+ type: :development
279
+ prerelease: false
280
+ version_requirements: !ruby/object:Gem::Requirement
281
+ none: false
282
+ requirements:
283
+ - - ~>
284
+ - !ruby/object:Gem::Version
285
+ version: 4.0.0
286
+ - !ruby/object:Gem::Dependency
287
+ name: protected_attributes
288
+ requirement: !ruby/object:Gem::Requirement
289
+ none: false
290
+ requirements:
291
+ - - ! '>='
292
+ - !ruby/object:Gem::Version
293
+ version: '0'
294
+ type: :development
295
+ prerelease: false
296
+ version_requirements: !ruby/object:Gem::Requirement
297
+ none: false
298
+ requirements:
299
+ - - ! '>='
300
+ - !ruby/object:Gem::Version
301
+ version: '0'
174
302
  description: FlyData Command Line Interface
175
303
  email: sysadmin@flydata.co
176
304
  executables:
305
+ - fdmysqldump
177
306
  - flydata
178
307
  extensions: []
179
308
  extra_rdoc_files: []
@@ -184,6 +313,7 @@ files:
184
313
  - Gemfile.lock
185
314
  - Rakefile
186
315
  - VERSION
316
+ - bin/fdmysqldump
187
317
  - bin/flydata
188
318
  - flydata.gemspec
189
319
  - lib/fly_data_model.rb
@@ -191,10 +321,13 @@ files:
191
321
  - lib/flydata/api/base.rb
192
322
  - lib/flydata/api/data_entry.rb
193
323
  - lib/flydata/api/data_port.rb
324
+ - lib/flydata/api/redshift_cluster.rb
194
325
  - lib/flydata/api_client.rb
195
326
  - lib/flydata/cli.rb
196
327
  - lib/flydata/command/base.rb
328
+ - lib/flydata/command/conf.rb
197
329
  - lib/flydata/command/crontab.rb
330
+ - lib/flydata/command/encrypt.rb
198
331
  - lib/flydata/command/kill_all.rb
199
332
  - lib/flydata/command/login.rb
200
333
  - lib/flydata/command/restart.rb
@@ -204,21 +337,37 @@ files:
204
337
  - lib/flydata/command/setup.rb
205
338
  - lib/flydata/command/start.rb
206
339
  - lib/flydata/command/stop.rb
340
+ - lib/flydata/command/sync.rb
341
+ - lib/flydata/command/version.rb
207
342
  - lib/flydata/credentials.rb
208
343
  - lib/flydata/cron.rb
344
+ - lib/flydata/fluent-plugins/in_mysql_binlog_flydata.rb
345
+ - lib/flydata/fluent-plugins/out_forward_ssl.rb
346
+ - lib/flydata/fluent-plugins/preference.rb
209
347
  - lib/flydata/flydata_crontab.sh
210
348
  - lib/flydata/helpers.rb
211
349
  - lib/flydata/heroku.rb
212
350
  - lib/flydata/heroku/configuration_methods.rb
213
351
  - lib/flydata/heroku/instance_methods.rb
214
352
  - lib/flydata/log_monitor.rb
353
+ - lib/flydata/preference/data_entry_preference.rb
215
354
  - lib/flydata/proxy.rb
355
+ - lib/flydata/sync_file_manager.rb
356
+ - lib/flydata/table_def.rb
357
+ - lib/flydata/table_def/mysql_table_def.rb
358
+ - lib/flydata/table_def/redshift_table_def.rb
359
+ - lib/flydata/util/encryptor.rb
360
+ - spec/fluent_plugins_spec_helper.rb
216
361
  - spec/fly_data_model_spec.rb
217
362
  - spec/flydata/api/data_entry_spec.rb
218
363
  - spec/flydata/command/sender_spec.rb
364
+ - spec/flydata/command/sync_spec.rb
365
+ - spec/flydata/fluent-plugins/in_mysql_binlog_flydata_spec.rb
219
366
  - spec/flydata/heroku_spec.rb
367
+ - spec/flydata/util/encryptor_spec.rb
220
368
  - spec/flydata_spec.rb
221
369
  - spec/spec_helper.rb
370
+ - tmpl/redshift_mysql_data_entry.conf.tmpl
222
371
  homepage: http://flydata.co/
223
372
  licenses:
224
373
  - All right reserved.
@@ -234,7 +383,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
234
383
  version: '0'
235
384
  segments:
236
385
  - 0
237
- hash: -1502347262037926144
386
+ hash: 1795094757284592242
238
387
  required_rubygems_version: !ruby/object:Gem::Requirement
239
388
  none: false
240
389
  requirements:
@@ -243,7 +392,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
243
392
  version: '0'
244
393
  requirements: []
245
394
  rubyforge_project:
246
- rubygems_version: 1.8.28
395
+ rubygems_version: 1.8.24
247
396
  signing_key:
248
397
  specification_version: 3
249
398
  summary: FlyData CLI