td 0.10.99 → 0.11.1

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/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