flydata 0.0.5.6 → 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.
@@ -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