td 0.10.99 → 0.11.1

Sign up to get free protection for your applications and to get access to all the features.
data/lib/td/updater.rb CHANGED
@@ -4,8 +4,11 @@ require "shellwords"
4
4
  require "zip/zip"
5
5
 
6
6
  module TreasureData
7
- # This architecture is based on Heroku command
8
7
  module Updater
8
+ #
9
+ # Toolbelt upgrade
10
+ #
11
+
9
12
  def self.raise_error(message)
10
13
  # TODO: Replace better Exception class
11
14
  raise RuntimeError.new(message)
@@ -53,13 +56,12 @@ module TreasureData
53
56
  return File.join(td_gem, "/lib/td/version.rb")
54
57
  end
55
58
  }
56
-
57
59
  nil
58
60
  end
59
61
 
60
62
  def self.client_version_from_path(path)
61
63
  if version_file = get_client_version_file(path)
62
- File.read(version_file).match(/VERSION = '([^']+)'/)[1]
64
+ File.read(version_file).match(/TOOLBELT_VERSION = '([^']+)'/)[1]
63
65
  else
64
66
  '0.0.0'
65
67
  end
@@ -95,7 +97,7 @@ module TreasureData
95
97
  end
96
98
 
97
99
  def self.package_category
98
- case
100
+ case
99
101
  when on_windows?
100
102
  'exe'
101
103
  when on_mac?
@@ -113,29 +115,35 @@ module TreasureData
113
115
  # Net::HTTP.get_response can't get response from HTTPS endpoint.
114
116
  # So we use following code to avoid above issues.
115
117
  u = URI(uri)
116
- response = if u.scheme == 'https'
117
- http = Net::HTTP.new(u.host, u.port)
118
- http.use_ssl = true
119
- http.verify_mode = OpenSSL::SSL::VERIFY_NONE
120
- http.request(Net::HTTP::Get.new(u.path))
121
- else
122
- Net::HTTP.get_response(u)
123
- end
118
+ response =
119
+ if u.scheme == 'https'
120
+ http = Net::HTTP.new(u.host, u.port)
121
+ http.use_ssl = true
122
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
123
+ http.request(Net::HTTP::Get.new(u.path))
124
+ else
125
+ Net::HTTP.get_response(u)
126
+ end
124
127
 
125
128
  case response
126
129
  when Net::HTTPSuccess then response.body
127
130
  when Net::HTTPRedirection then fetch(response['Location'])
128
131
  else
132
+ raise "An error occurred when fetching from '#{uri}'."
129
133
  response.error!
130
134
  end
131
135
  end
132
136
 
137
+ def self.endpoint_root
138
+ ENV['TD_TOOLBELT_UPDATE_ROOT'] || "http://toolbelt.treasuredata.com"
139
+ end
140
+
133
141
  def self.version_endpoint
134
- "http://toolbelt.treasure-data.com/version.#{package_category}"
142
+ "#{endpoint_root}/version.#{package_category}"
135
143
  end
136
144
 
137
145
  def self.update_package_endpoint
138
- "http://toolbelt.treasure-data.com/td-update-#{package_category}.zip"
146
+ "#{endpoint_root}/td-update-#{package_category}.zip"
139
147
  end
140
148
 
141
149
  def self.update(autoupdate = false)
@@ -149,10 +157,33 @@ module TreasureData
149
157
 
150
158
  if compare_versions(latest_version, latest_local_version) > 0
151
159
  Dir.mktmpdir do |download_dir|
160
+
161
+ # initialize the progress indicator
162
+ base_msg = "Downloading updated toolbelt package"
163
+ print base_msg + " " * 10
164
+ start_time = last_time = Time.new.to_i
165
+
166
+ # downloading the update compressed file
152
167
  File.open("#{download_dir}/td-update.zip", "wb") do |file|
153
- file.print fetch(update_package_endpoint)
168
+ endpoint = update_package_endpoint
169
+ puts "\npackage '#{endpoint}'... " unless ENV['TD_TOOLBELT_DEBUG'].nil?
170
+ stream_fetch(endpoint, file) {
171
+
172
+ # progress indicator
173
+ if (time = Time.now.to_i) - last_time > 2
174
+ msg = "\r" + base_msg + ": #{time - start_time}s elapsed"
175
+ # TODO parse 'time - start_time' with humanize_time from common.rb
176
+ # once this method is not static
177
+ print msg + " " * 10
178
+ last_time = time
179
+ end
180
+ }
154
181
  end
155
182
 
183
+ # clear progress indicator with this final message
184
+ puts "\r" + base_msg + "...done" + " " * 20
185
+
186
+ print "Unpacking updated toolbelt package..."
156
187
  Zip::ZipFile.open("#{download_dir}/td-update.zip") do |zip|
157
188
  zip.each do |entry|
158
189
  target = File.join(download_dir, entry.to_s)
@@ -160,6 +191,7 @@ module TreasureData
160
191
  zip.extract(entry, target) { true }
161
192
  end
162
193
  end
194
+ print "done\n"
163
195
 
164
196
  FileUtils.rm "#{download_dir}/td-update.zip"
165
197
 
@@ -200,16 +232,10 @@ module TreasureData
200
232
  load('td/updater.rb') # reload updated updater
201
233
  end
202
234
 
203
- background_update!
204
- end
205
-
206
- def self.last_autoupdate_path
207
- File.join(home_directory, ".td", "autoupdate.last")
208
- end
209
-
210
- def self.background_update!
211
- if File.exists?(last_autoupdate_path)
212
- return if (Time.now.to_i - File.mtime(last_autoupdate_path).to_i) < 60 * 60 * 1 # every 1 hours
235
+ # check every hour if the toolbelt can be updated.
236
+ # => If so, update in the background
237
+ if File.exists?(last_toolbelt_autoupdate_timestamp)
238
+ return if (Time.now.to_i - File.mtime(last_toolbelt_autoupdate_timestamp).to_i) < 60 * 60 * 1 # every 1 hours
213
239
  end
214
240
  log_path = File.join(home_directory, '.td', 'autoupdate.log')
215
241
  FileUtils.mkdir_p File.dirname(log_path)
@@ -223,8 +249,184 @@ module TreasureData
223
249
  spawn(td_binary, 'update', :err => log_file, :out => log_file)
224
250
  end
225
251
  Process.detach(pid)
226
- FileUtils.mkdir_p File.dirname(last_autoupdate_path)
227
- FileUtils.touch last_autoupdate_path
252
+ FileUtils.mkdir_p File.dirname(last_toolbelt_autoupdate_timestamp)
253
+ FileUtils.touch last_toolbelt_autoupdate_timestamp
254
+ end
255
+
256
+ def self.last_toolbelt_autoupdate_timestamp
257
+ File.join(home_directory, ".td", "autoupdate.last")
258
+ end
259
+
260
+ #
261
+ # td-import.jar upgrade
262
+ #
263
+
264
+ # locate the root of the td package which is 3 folders up from the location of this file
265
+ def jarfile_dest_path
266
+ File.join(Updater.home_directory, ".td", "java")
267
+ end
268
+
269
+ private
270
+ def self.stream_fetch(url, binfile, &progress)
271
+ require 'net/http'
272
+
273
+ uri = URI(url)
274
+ http = Net::HTTP.new(uri.host, uri.port)
275
+ if uri.scheme == 'https'
276
+ http.use_ssl = true
277
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
278
+ end
279
+ http.start
280
+ request = Net::HTTP::Get.new(uri.to_s)
281
+ http.request request do |response|
282
+ if response.class == Net::HTTPOK
283
+ # print a . every tick_period seconds
284
+ response.read_body do |chunk|
285
+ binfile.write chunk
286
+ progress.call #unless progress.nil?
287
+ end
288
+ return true
289
+ elsif response.class == Net::HTTPFound || \
290
+ response.class == Net::HTTPRedirection
291
+ puts "redirect '#{url}' to '#{response['Location']}'... " unless ENV['TD_TOOLBELT_DEBUG'].nil?
292
+ return stream_fetch(response['Location'], binfile, &progress)
293
+ else
294
+ raise "An error occurred when fetching from '#{uri}'."
295
+ return false
296
+ end
297
+ end
228
298
  end
229
- end
230
- end
299
+
300
+ private
301
+ def jar_update(hourly = false)
302
+ maven_repo = "http://maven.treasure-data.com/com/treasure_data/td-import"
303
+
304
+ require 'rexml/document'
305
+ require 'open-uri'
306
+ require 'fileutils'
307
+
308
+ doc = REXML::Document.new(open("#{maven_repo}/maven-metadata.xml") { |f| f.read })
309
+ updated = Time.strptime(REXML::XPath.match(doc, '/metadata/versioning/lastUpdated').first.text, "%Y%m%d%H%M%S")
310
+ version = REXML::XPath.match(doc, '/metadata/versioning/release').first.text
311
+
312
+ # Convert into UTF to compare time correctly
313
+ updated = (updated + updated.gmt_offset).utc unless updated.gmt?
314
+ last_updated = existent_jar_updated_time
315
+
316
+ if updated > last_updated
317
+ FileUtils.mkdir_p(jarfile_dest_path) unless File.exists?(jarfile_dest_path)
318
+ Dir.chdir jarfile_dest_path
319
+
320
+ File.open('VERSION', 'w') { |f| f.print "#{version} via import:jar_update" }
321
+ File.open('td-import-java.version', 'w') { |f| f.print "#{version} #{updated}" }
322
+
323
+ # initialize the progress indicator
324
+ base_msg = "Updating td-import.jar"
325
+ start_time = last_time = Time.new.to_i
326
+ print base_msg + " " * 10
327
+
328
+ binfile = File.open 'td-import.jar.new', 'wb'
329
+ status = Updater.stream_fetch("#{maven_repo}/#{version}/td-import-#{version}-jar-with-dependencies.jar", binfile) {
330
+
331
+ # progress indicator
332
+ if (time = Time.now.to_i) - last_time > 2
333
+ msg = "\r" + base_msg + ": #{humanize_time(time - start_time)} elapsed"
334
+ # TODO parse 'time - start_time' with humanize_time from common.rb
335
+ # once this method is not static
336
+ print msg + " " * 10
337
+ last_time = time
338
+ end
339
+ }
340
+ binfile.close
341
+
342
+ # clear progress indicator with this final message
343
+ puts "\r" + base_msg + "...done" + " " * 20
344
+
345
+ if status
346
+ puts "Installed td-import.jar v#{version} in '#{jarfile_dest_path}'.\n"
347
+ File.rename 'td-import.jar.new', 'td-import.jar'
348
+ else
349
+ puts "Update of td-import.jar failed." unless ENV['TD_TOOLBELT_DEBUG'].nil?
350
+ File.delete 'td-import.jar.new' if File.exists? 'td-import.jar.new'
351
+ end
352
+ else
353
+ puts 'Installed td-import.jar is already at the latest version.' unless hourly
354
+ end
355
+ end
356
+
357
+ def check_n_update_jar(hourly = false)
358
+ if hourly && \
359
+ File.exists?(last_jar_autoupdate_timestamp) && \
360
+ (Time.now - File.mtime(last_jar_autoupdate_timestamp)).to_i < (60 * 60 * 1) # every hour
361
+ return
362
+ end
363
+ jar_update(hourly)
364
+ FileUtils.touch File.join(jarfile_dest_path, "td-import-java.version")
365
+ end
366
+
367
+ private
368
+ def last_jar_autoupdate_timestamp
369
+ File.join(jarfile_dest_path, "td-import-java.version")
370
+ end
371
+
372
+ private
373
+ def existent_jar_updated_time
374
+ files = find_files("td-import-java.version", [jarfile_dest_path])
375
+ if files.empty?
376
+ return Time.at(0)
377
+ end
378
+ content = File.open(files.first).read
379
+ index = content.index(' ')
380
+ time = nil
381
+ if index.nil?
382
+ time = Time.at(0).utc
383
+ else
384
+ time = Time.parse(content[index+1..-1].strip).utc
385
+ end
386
+ time
387
+ end
388
+
389
+ #
390
+ # Helpers
391
+ #
392
+ def find_files(glob, locations)
393
+ files = []
394
+ locations.each {|loc|
395
+ files = Dir.glob("#{loc}/#{glob}")
396
+ break unless files.empty?
397
+ }
398
+ files
399
+ end
400
+
401
+ def find_version_file
402
+ version = find_files('VERSION', [jarfile_dest_path])
403
+ if version.empty?
404
+ $stderr.puts "Cannot find VERSION file in '#{jarfile_dest_path}'."
405
+ exit 10
406
+ end
407
+ version.first
408
+ end
409
+
410
+ def find_td_import_jar
411
+ jar = find_files('td-import.jar', [jarfile_dest_path])
412
+ if jar.empty?
413
+ $stderr.puts "Cannot find td-import.jar in '#{jarfile_dest_path}'."
414
+ exit 10
415
+ end
416
+ jar.first
417
+ end
418
+
419
+ def find_logging_property
420
+ installed_path = File.join(File.expand_path('../..', File.dirname(__FILE__)), 'java')
421
+
422
+ config = find_files("logging.properties", [installed_path])
423
+ if config.empty?
424
+ puts "Cannot find 'logging.properties' file in '#{installed_path}'." unless ENV['TD_TOOLBELT_DEBUG'].nil?
425
+ []
426
+ else
427
+ config.first
428
+ end
429
+ end
430
+
431
+ end # end of module Updater
432
+ end # end of module TreasureData
data/lib/td/version.rb CHANGED
@@ -1,5 +1,3 @@
1
1
  module TreasureData
2
-
3
- VERSION = '0.10.99'
4
-
2
+ TOOLBELT_VERSION = '0.11.1'
5
3
  end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+ require 'td/updater'
3
+
4
+ module TreasureData::Updater
5
+ describe 'without the TD_TOOLBELT_UPDATE_ROOT environment variable defined' do
6
+ describe 'endpoints methods' do
7
+ it 'use the default root path' do
8
+ TreasureData::Updater.endpoint_root.should == TreasureData::Updater::DEFAULT_TOOLBELT_URL
9
+ TreasureData::Updater.version_endpoint.should =~ Regexp.new(TreasureData::Updater::DEFAULT_TOOLBELT_URL)
10
+ TreasureData::Updater.update_package_endpoint.should =~ Regexp.new(TreasureData::Updater::DEFAULT_TOOLBELT_URL)
11
+ end
12
+ end
13
+ end
14
+ describe 'with the TD_TOOLBELT_UPDATE_ROOT environment variable defined' do
15
+ before do
16
+ ENV['TD_TOOLBELT_UPDATE_ROOT'] = 'https://0.0.0.0:5000/'
17
+ end
18
+ describe 'endpoints methods' do
19
+ it 'use the custom root path' do
20
+ TreasureData::Updater.endpoint_root.should == ENV['TD_TOOLBELT_UPDATE_ROOT']
21
+ TreasureData::Updater.version_endpoint.should =~ Regexp.new(ENV['TD_TOOLBELT_UPDATE_ROOT'])
22
+ TreasureData::Updater.update_package_endpoint.should =~ Regexp.new(ENV['TD_TOOLBELT_UPDATE_ROOT'])
23
+ end
24
+ end
25
+ after do
26
+ ENV.delete 'TD_TOOLBELT_UPDATE_ROOT'
27
+ end
28
+ end
29
+ end
@@ -6,7 +6,7 @@ module TreasureData::Command
6
6
  stderr, stdout = execute_td("--version")
7
7
  stderr.should == ""
8
8
  stdout.should == <<-STDOUT
9
- td #{TreasureData::VERSION}
9
+ #{TreasureData::TOOLBELT_VERSION}
10
10
  STDOUT
11
11
  end
12
12
  end
data/td.gemspec CHANGED
@@ -7,7 +7,7 @@ Gem::Specification.new do |gem|
7
7
  gem.description = "CLI to manage data on Treasure Data, the Hadoop-based cloud data warehousing"
8
8
  gem.homepage = "http://treasure-data.com/"
9
9
  gem.summary = "CLI to manage data on Treasure Data, the Hadoop-based cloud data warehousing"
10
- gem.version = TreasureData::VERSION
10
+ gem.version = TreasureData::TOOLBELT_VERSION
11
11
  gem.authors = ["Treasure Data, Inc."]
12
12
  gem.email = "support@treasure-data.com"
13
13
  gem.has_rdoc = false
@@ -20,7 +20,7 @@ Gem::Specification.new do |gem|
20
20
  gem.add_dependency "yajl-ruby", "~> 1.1.0"
21
21
  gem.add_dependency "hirb", ">= 0.4.5"
22
22
  gem.add_dependency "parallel", "~> 0.6.1"
23
- gem.add_dependency "td-client", "~> 0.8.57"
23
+ gem.add_dependency "td-client", "~> 0.8.60"
24
24
  gem.add_dependency "td-logger", "~> 0.3.21"
25
25
  gem.add_dependency "rubyzip", "~> 0.9.9"
26
26
  gem.add_development_dependency "rake", "~> 0.9"
metadata CHANGED
@@ -1,20 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: td
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.99
5
- prerelease:
4
+ version: 0.11.1
6
5
  platform: ruby
7
6
  authors:
8
7
  - Treasure Data, Inc.
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2014-03-01 00:00:00.000000000 Z
11
+ date: 2014-04-30 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: msgpack
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
17
  - - ! '>='
20
18
  - !ruby/object:Gem::Version
@@ -37,7 +35,6 @@ dependencies:
37
35
  type: :runtime
38
36
  prerelease: false
39
37
  version_requirements: !ruby/object:Gem::Requirement
40
- none: false
41
38
  requirements:
42
39
  - - ! '>='
43
40
  - !ruby/object:Gem::Version
@@ -60,7 +57,6 @@ dependencies:
60
57
  - !ruby/object:Gem::Dependency
61
58
  name: yajl-ruby
62
59
  requirement: !ruby/object:Gem::Requirement
63
- none: false
64
60
  requirements:
65
61
  - - ~>
66
62
  - !ruby/object:Gem::Version
@@ -68,7 +64,6 @@ dependencies:
68
64
  type: :runtime
69
65
  prerelease: false
70
66
  version_requirements: !ruby/object:Gem::Requirement
71
- none: false
72
67
  requirements:
73
68
  - - ~>
74
69
  - !ruby/object:Gem::Version
@@ -76,7 +71,6 @@ dependencies:
76
71
  - !ruby/object:Gem::Dependency
77
72
  name: hirb
78
73
  requirement: !ruby/object:Gem::Requirement
79
- none: false
80
74
  requirements:
81
75
  - - ! '>='
82
76
  - !ruby/object:Gem::Version
@@ -84,7 +78,6 @@ dependencies:
84
78
  type: :runtime
85
79
  prerelease: false
86
80
  version_requirements: !ruby/object:Gem::Requirement
87
- none: false
88
81
  requirements:
89
82
  - - ! '>='
90
83
  - !ruby/object:Gem::Version
@@ -92,7 +85,6 @@ dependencies:
92
85
  - !ruby/object:Gem::Dependency
93
86
  name: parallel
94
87
  requirement: !ruby/object:Gem::Requirement
95
- none: false
96
88
  requirements:
97
89
  - - ~>
98
90
  - !ruby/object:Gem::Version
@@ -100,7 +92,6 @@ dependencies:
100
92
  type: :runtime
101
93
  prerelease: false
102
94
  version_requirements: !ruby/object:Gem::Requirement
103
- none: false
104
95
  requirements:
105
96
  - - ~>
106
97
  - !ruby/object:Gem::Version
@@ -108,23 +99,20 @@ dependencies:
108
99
  - !ruby/object:Gem::Dependency
109
100
  name: td-client
110
101
  requirement: !ruby/object:Gem::Requirement
111
- none: false
112
102
  requirements:
113
103
  - - ~>
114
104
  - !ruby/object:Gem::Version
115
- version: 0.8.57
105
+ version: 0.8.60
116
106
  type: :runtime
117
107
  prerelease: false
118
108
  version_requirements: !ruby/object:Gem::Requirement
119
- none: false
120
109
  requirements:
121
110
  - - ~>
122
111
  - !ruby/object:Gem::Version
123
- version: 0.8.57
112
+ version: 0.8.60
124
113
  - !ruby/object:Gem::Dependency
125
114
  name: td-logger
126
115
  requirement: !ruby/object:Gem::Requirement
127
- none: false
128
116
  requirements:
129
117
  - - ~>
130
118
  - !ruby/object:Gem::Version
@@ -132,7 +120,6 @@ dependencies:
132
120
  type: :runtime
133
121
  prerelease: false
134
122
  version_requirements: !ruby/object:Gem::Requirement
135
- none: false
136
123
  requirements:
137
124
  - - ~>
138
125
  - !ruby/object:Gem::Version
@@ -140,7 +127,6 @@ dependencies:
140
127
  - !ruby/object:Gem::Dependency
141
128
  name: rubyzip
142
129
  requirement: !ruby/object:Gem::Requirement
143
- none: false
144
130
  requirements:
145
131
  - - ~>
146
132
  - !ruby/object:Gem::Version
@@ -148,7 +134,6 @@ dependencies:
148
134
  type: :runtime
149
135
  prerelease: false
150
136
  version_requirements: !ruby/object:Gem::Requirement
151
- none: false
152
137
  requirements:
153
138
  - - ~>
154
139
  - !ruby/object:Gem::Version
@@ -156,7 +141,6 @@ dependencies:
156
141
  - !ruby/object:Gem::Dependency
157
142
  name: rake
158
143
  requirement: !ruby/object:Gem::Requirement
159
- none: false
160
144
  requirements:
161
145
  - - ~>
162
146
  - !ruby/object:Gem::Version
@@ -164,7 +148,6 @@ dependencies:
164
148
  type: :development
165
149
  prerelease: false
166
150
  version_requirements: !ruby/object:Gem::Requirement
167
- none: false
168
151
  requirements:
169
152
  - - ~>
170
153
  - !ruby/object:Gem::Version
@@ -172,7 +155,6 @@ dependencies:
172
155
  - !ruby/object:Gem::Dependency
173
156
  name: rspec
174
157
  requirement: !ruby/object:Gem::Requirement
175
- none: false
176
158
  requirements:
177
159
  - - ~>
178
160
  - !ruby/object:Gem::Version
@@ -180,7 +162,6 @@ dependencies:
180
162
  type: :development
181
163
  prerelease: false
182
164
  version_requirements: !ruby/object:Gem::Requirement
183
- none: false
184
165
  requirements:
185
166
  - - ~>
186
167
  - !ruby/object:Gem::Version
@@ -188,7 +169,6 @@ dependencies:
188
169
  - !ruby/object:Gem::Dependency
189
170
  name: simplecov
190
171
  requirement: !ruby/object:Gem::Requirement
191
- none: false
192
172
  requirements:
193
173
  - - ~>
194
174
  - !ruby/object:Gem::Version
@@ -196,7 +176,6 @@ dependencies:
196
176
  type: :development
197
177
  prerelease: false
198
178
  version_requirements: !ruby/object:Gem::Requirement
199
- none: false
200
179
  requirements:
201
180
  - - ~>
202
181
  - !ruby/object:Gem::Version
@@ -214,9 +193,8 @@ files:
214
193
  - README.rdoc
215
194
  - Rakefile
216
195
  - bin/td
217
- - build/update-td-import-java.sh
218
196
  - contrib/completion/_td
219
- - contrib/completion/td-comletion.bash
197
+ - contrib/completion/td-completion.bash
220
198
  - data/sample_apache.json
221
199
  - data/sample_apache_gen.rb
222
200
  - dist/exe.rake
@@ -230,10 +208,7 @@ files:
230
208
  - dist/resources/pkg/postinstall
231
209
  - dist/resources/pkg/ruby-2.0.0-p0.pkg
232
210
  - dist/resources/pkg/td
233
- - java/VERSION
234
211
  - java/logging.properties
235
- - java/td-import-java.version
236
- - java/td-import.jar
237
212
  - lib/td.rb
238
213
  - lib/td/command/account.rb
239
214
  - lib/td/command/acl.rb
@@ -274,37 +249,31 @@ files:
274
249
  - spec/file_reader_spec.rb
275
250
  - spec/spec_helper.rb
276
251
  - spec/td/helpers_spec.rb
252
+ - spec/td/updater_spec.rb
277
253
  - spec/td/version_spec.rb
278
254
  - td.gemspec
279
255
  homepage: http://treasure-data.com/
280
256
  licenses: []
257
+ metadata: {}
281
258
  post_install_message:
282
259
  rdoc_options: []
283
260
  require_paths:
284
261
  - lib
285
262
  required_ruby_version: !ruby/object:Gem::Requirement
286
- none: false
287
263
  requirements:
288
264
  - - ! '>='
289
265
  - !ruby/object:Gem::Version
290
266
  version: '0'
291
- segments:
292
- - 0
293
- hash: 687370063067596647
294
267
  required_rubygems_version: !ruby/object:Gem::Requirement
295
- none: false
296
268
  requirements:
297
269
  - - ! '>='
298
270
  - !ruby/object:Gem::Version
299
271
  version: '0'
300
- segments:
301
- - 0
302
- hash: 687370063067596647
303
272
  requirements: []
304
273
  rubyforge_project:
305
- rubygems_version: 1.8.23
274
+ rubygems_version: 2.2.2
306
275
  signing_key:
307
- specification_version: 3
276
+ specification_version: 4
308
277
  summary: CLI to manage data on Treasure Data, the Hadoop-based cloud data warehousing
309
278
  test_files:
310
279
  - spec/file_reader/filter_spec.rb
@@ -315,4 +284,5 @@ test_files:
315
284
  - spec/file_reader_spec.rb
316
285
  - spec/spec_helper.rb
317
286
  - spec/td/helpers_spec.rb
287
+ - spec/td/updater_spec.rb
318
288
  - spec/td/version_spec.rb