td 0.10.39 → 0.10.40

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/ChangeLog CHANGED
@@ -1,4 +1,11 @@
1
1
 
2
+ == 2012-08-07 version 0.10.40
3
+
4
+ * Added bulk_import:delete_parts
5
+ * Hide obsoleted bulk_import:upload_part and :delete_part subcommands
6
+ * bulk_import:upload_parts supports --auto-perform option
7
+
8
+
2
9
  == 2012-08-07 version 0.10.39
3
10
 
4
11
  * Added bulk_import:prepare_parts and bulk_import:upload_parts subcommands
@@ -84,6 +84,7 @@ module Command
84
84
  }
85
85
  end
86
86
 
87
+ # obsoleted
87
88
  def bulk_import_upload_part(op)
88
89
  retry_limit = 10
89
90
  retry_wait = 1
@@ -102,6 +103,7 @@ module Command
102
103
  retry_wait = 1
103
104
  suffix_count = 0
104
105
  part_prefix = ""
106
+ auto_perform = false
105
107
 
106
108
  op.on('-P', '--prefix NAME', 'add prefix to parts name') {|s|
107
109
  part_prefix = s
@@ -109,6 +111,9 @@ module Command
109
111
  op.on('-s', '--use-suffix COUNT', 'use COUNT number of . (dots) in the source file name to the parts name', Integer) {|i|
110
112
  suffix_count = i
111
113
  }
114
+ op.on('--auto-perform', 'perform bulk import job automatically', TrueClass) {|b|
115
+ auto_perform = b
116
+ }
112
117
 
113
118
  name, *files = op.cmd_parse
114
119
 
@@ -125,8 +130,17 @@ module Command
125
130
  }
126
131
 
127
132
  $stderr.puts "done."
133
+
134
+ if auto_perform
135
+ client = get_client
136
+ job = client.perform_bulk_import(name)
137
+
138
+ $stderr.puts "Job #{job.job_id} is queued."
139
+ $stderr.puts "Use '#{$prog} job:show [-w] #{job.job_id}' to show the status."
140
+ end
128
141
  end
129
142
 
143
+ # obsoleted
130
144
  def bulk_import_delete_part(op)
131
145
  name, part_name = op.cmd_parse
132
146
 
@@ -137,6 +151,27 @@ module Command
137
151
  $stderr.puts "Part '#{part_name}' is deleted."
138
152
  end
139
153
 
154
+ def bulk_import_delete_parts(op)
155
+ part_prefix = ""
156
+
157
+ op.on('-P', '--prefix NAME', 'add prefix to parts name') {|s|
158
+ part_prefix = s
159
+ }
160
+
161
+ name, *part_names = op.cmd_parse
162
+
163
+ client = get_client
164
+
165
+ part_names.each {|part_name|
166
+ part_name = part_prefix + part_name
167
+
168
+ $stderr.puts "Deleting '#{part_name}'..."
169
+ client.bulk_import_delete_part(name, part_name)
170
+ }
171
+
172
+ $stderr.puts "done."
173
+ end
174
+
140
175
  def bulk_import_perform(op)
141
176
  wait = false
142
177
  force = false
@@ -172,7 +207,7 @@ module Command
172
207
  job = client.perform_bulk_import(name)
173
208
 
174
209
  $stderr.puts "Job #{job.job_id} is queued."
175
- $stderr.puts "Use '#{$prog} job:show #{job.job_id}' to show the status."
210
+ $stderr.puts "Use '#{$prog} job:show [-w] #{job.job_id}' to show the status."
176
211
 
177
212
  if wait
178
213
  require 'td/command/job' # wait_job
@@ -237,7 +272,7 @@ module Command
237
272
 
238
273
  PART_SPLIT_SIZE = 16*1024*1024
239
274
 
240
- def bulk_import_prepare_part(op)
275
+ def bulk_import_prepare_parts(op)
241
276
  outdir = nil
242
277
  split_size_kb = PART_SPLIT_SIZE / 1024 # kb
243
278
 
@@ -128,6 +128,7 @@ module List
128
128
  COMMAND = {}
129
129
  GUESS = {}
130
130
  HELP_EXCLUDE = [/^help/, /^account/, /^aggr/]
131
+ USAGE_EXCLUDE = [/bulk_import:upload_part\z/, /bulk_import:delete_part\z/]
131
132
 
132
133
  def self.add_list(name, args, description, *examples)
133
134
  LIST << COMMAND[name] = CommandOption.new(name, args, description, examples)
@@ -201,7 +202,9 @@ module List
201
202
 
202
203
  msg = %[Additional commands, type "#{File.basename($0)} help COMMAND" for more details:\n\n]
203
204
  ops.each {|op|
204
- msg << %[ #{op.usage}\n]
205
+ unless USAGE_EXCLUDE.any? {|pattern| pattern =~ op.name }
206
+ msg << %[ #{op.usage}\n]
207
+ end
205
208
  }
206
209
  msg << %[\n]
207
210
  c.override_message = msg
@@ -228,10 +231,11 @@ module List
228
231
  add_list 'bulk_import:list', %w[], 'List bulk import sessions', 'bulk_import:list'
229
232
  add_list 'bulk_import:show', %w[name], 'Show list of uploaded parts', 'bulk_import:show'
230
233
  add_list 'bulk_import:create', %w[name db table], 'Create a new bulk import session to the the table', 'bulk_import:create logs_201201 example_db event_logs'
231
- add_list 'bulk_import:prepare_part', %w[files_], 'Convert files into part file format', 'bulk_import:prepare_part logs/*.csv --format csv --columns time,uid,price,count --time-column "time" -o parts/'
234
+ add_list 'bulk_import:prepare_parts', %w[files_], 'Convert files into part file format', 'bulk_import:prepare_parts logs/*.csv --format csv --columns time,uid,price,count --time-column "time" -o parts/'
232
235
  add_list 'bulk_import:upload_part', %w[name id path.msgpack.gz], 'Upload or re-upload a file into a bulk import session', 'bulk_import:upload_part logs_201201 01h data-201201-01.msgpack.gz'
233
236
  add_list 'bulk_import:upload_parts', %w[name files_], 'Upload or re-upload files into a bulk import session', 'bulk_import:upload_parts parts/* --prefix logs_'
234
237
  add_list 'bulk_import:delete_part', %w[name id], 'Delete a uploaded file from a bulk import session', 'bulk_import:delete_part logs_201201 01h'
238
+ add_list 'bulk_import:delete_parts', %w[name ids_], 'Delete uploaded files from a bulk import session', 'bulk_import:delete_parts logs_201201 01h 02h 03h'
235
239
  add_list 'bulk_import:perform', %w[name], 'Start to validate and convert uploaded files', 'bulk_import:perform logs_201201'
236
240
  add_list 'bulk_import:error_records', %w[name], 'Show records which did not pass validations', 'bulk_import:error_records logs_201201'
237
241
  add_list 'bulk_import:commit', %w[name], 'Start to commit a performed bulk import session', 'bulk_import:commit logs_201201'
@@ -35,9 +35,6 @@ module TreasureData
35
35
  @reader = reader
36
36
  @delimiter_expr = opts[:delimiter_expr]
37
37
  @null_expr = opts[:null_expr]
38
- # TODO
39
- #@escape_char = opts[:escape_char]
40
- #@quote_char = opts[:quote_char]
41
38
  end
42
39
 
43
40
  def next
@@ -49,6 +46,21 @@ module TreasureData
49
46
  end
50
47
  end
51
48
 
49
+ # TODO
50
+ #class QuotedDelimiterParsingReader
51
+ # def initialize(io, error, opts)
52
+ # require 'strscan'
53
+ # @io = io
54
+ # @error = error
55
+ # @delimiter_expr = opts[:delimiter_expr]
56
+ # @quote_char = opts[:quote_char]
57
+ # @escape_char = opts[:escape_char]
58
+ # end
59
+
60
+ # def next
61
+ # end
62
+ #end
63
+
52
64
  class JSONParser
53
65
  def initialize(reader, error, opts)
54
66
  @reader = reader
@@ -68,6 +80,7 @@ module TreasureData
68
80
  end
69
81
  end
70
82
 
83
+ # TODO
71
84
  #class ApacheParser
72
85
  # REGEXP = /^([^ ]*) [^ ]* ([^ ]*) \[([^\]]*)\] "(\S+)(?: +([^ ]*) +\S*)?" ([^ ]*) ([^ ]*)(?: "([^\"]*)" "([^\"]*)")?$/
73
86
  #
@@ -119,7 +132,6 @@ module TreasureData
119
132
 
120
133
  def next
121
134
  array = @parser.next
122
- # FIXME error handling
123
135
  Hash[@columns.zip(array)]
124
136
  end
125
137
  end
@@ -190,22 +202,22 @@ module TreasureData
190
202
  attr_accessor :parser_class
191
203
 
192
204
  def init_optparse(op)
193
- op.on('-f', '--format NAME', "source file format") {|s|
205
+ op.on('-f', '--format NAME', "source file format [csv, tsv, msgpack, json]") {|s|
194
206
  set_format_template(s)
195
207
  }
196
- op.on('-h', '--columns NAME,NAME,...', 'column names') {|s|
208
+ op.on('-h', '--columns NAME,NAME,...', 'column names (use --column-header instead if the first line has column names)') {|s|
197
209
  @opts[:column_names] = s.split(',')
198
210
  }
199
211
  op.on('-H', '--column-header', 'first line includes column names', TrueClass) {|b|
200
212
  @opts[:column_header] = b
201
213
  }
202
- op.on('-d', '--delimiter REGEX', "delimiter between columns (default: #{@default_opts[:delimiter_expr].inspect[1..-2]}") {|s|
214
+ op.on('-d', '--delimiter REGEX', "delimiter between columns (default: #{@default_opts[:delimiter_expr].inspect[1..-2]})") {|s|
203
215
  @opts[:delimiter_expr] = Regexp.new(s)
204
216
  }
205
217
  #op.on('-D', '--line-delimiter REGEX', "delimiter between rows (default: #{@default_opts[:line_delimiter_expr].inspect[1..-2]})") {|s|
206
218
  # @opts[:line_delimiter_expr] = Regexp.new(s)
207
219
  #}
208
- op.on('-N', '--null REGEX', "null expression (default: #{@default_opts[:null_expr].inspect[1..-2]}") {|s|
220
+ op.on('-N', '--null REGEX', "null expression (default: #{@default_opts[:null_expr].inspect[1..-2]})") {|s|
209
221
  @opts[:null_expr] = Regexp.new(s)
210
222
  }
211
223
  # TODO
data/lib/td/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module TreasureData
2
2
 
3
- VERSION = '0.10.39'
3
+ VERSION = '0.10.40'
4
4
 
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: td
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.39
4
+ version: 0.10.40
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: