turbot 0.0.25 → 0.0.27

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.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ ZWYyNTZiNTliZWE4MjgyMWFjNDFjZDMxN2M5ZmQwNDFjYjRjYmE4NA==
5
+ data.tar.gz: !binary |-
6
+ OTFkZTQzZWRiZmM5NTI0OWVhYjlmMTQwMThlODk3OTY5MGQyNTRkZA==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ YjY4NWE3ZWU1ZjZjYzIwZmEzNDI2MzIzZjQwOGFlZjVmN2E3NzgwZWNmZTE1
10
+ ZTI0ODEyZmMwZTY5ZTI0N2E5N2Q4M2I0MWUyODJkNGExNjllYzMyNDlhNDAz
11
+ Yjg4ZmJkN2M3NjM1NjlhMjA3ZDZhNDI4MzQ3NTU5ZjQ5Yjk3MjM=
12
+ data.tar.gz: !binary |-
13
+ Njk0ZjEzZGExOTY3ZGYxY2Y4ZTJkMDkyZDQ0Y2IzMWEwNTMxMDViYjA0NjFj
14
+ OWU1NDdlZTc5MzQ0YTFjMTUwY2VlYWU4MGM0MjMyMWNkYjRjYWQ2ZDg5OTVm
15
+ ZDg0MDA1Y2ZmZDNiZDcyZmFhYTI4NTMyODkxMzU5MTAzNTg5ZTM=
data/README.md CHANGED
@@ -28,6 +28,10 @@ If you're working on the CLI and you can smoke-test your changes:
28
28
 
29
29
  $ bundle exec turbot
30
30
 
31
+ If you need to do this from a different folder, try:
32
+
33
+ alias tb="RBENV_GEMSETS=.gems TURBOT_HOST=http://localhost:3000 RBENV_VERSION=[version] BUNDLE_GEMFILE=/path/to/turbot-client/Gemfile bundle exec turbot"
34
+
31
35
  Meta
32
36
  ----
33
37
 
data/lib/turbot/auth.rb CHANGED
@@ -206,7 +206,7 @@ class Turbot::Auth
206
206
  delete_credentials
207
207
  raise e
208
208
  end
209
- check_for_associated_ssh_key unless Turbot::Command.current_command == "keys:add"
209
+ # check_for_associated_ssh_key unless Turbot::Command.current_command == "keys:add"
210
210
  @credentials
211
211
  end
212
212
 
@@ -6,6 +6,7 @@ require 'json-schema'
6
6
  require 'open3'
7
7
  require 'base64'
8
8
  require 'shellwords'
9
+ require 'turbot_runner'
9
10
 
10
11
  # manage bots (create, submit data and code)
11
12
  #
@@ -92,14 +93,17 @@ class Turbot::Command::Bots < Turbot::Command::Base
92
93
  # Created new bot template at my_amazing_bot!
93
94
 
94
95
  def generate
96
+ validate_arguments!
95
97
  response = api.show_bot(bot)
96
98
  if response.is_a? Turbot::API::SuccessResponse
97
- error("There's already a bot called #{bot}")
99
+ error("There's already a bot called #{bot} registered with Turbot. Bot names must be unique.")
98
100
  end
99
- validate_arguments!
101
+
100
102
  language = options[:language] || "ruby"
101
- manifest_template = File.expand_path("../../../../templates/manifest.json", __FILE__)
102
103
  scraper_template = File.expand_path("../../../../templates/#{language}", __FILE__)
104
+ error("unsupported language #{language}") if !File.exists?(scraper_template)
105
+
106
+ manifest_template = File.expand_path("../../../../templates/manifest.json", __FILE__)
103
107
  license_template = File.expand_path("../../../../templates/LICENSE.txt", __FILE__)
104
108
  manifest = open(manifest_template).read.sub("{{bot_id}}", bot)
105
109
  scraper_name = case language
@@ -112,6 +116,10 @@ class Turbot::Command::Bots < Turbot::Command::Base
112
116
  manifest = manifest.sub("{{scraper_name}}", scraper_name)
113
117
 
114
118
  # Language-specific stuff
119
+ # Language-specific stuff:
120
+ if File.exists? bot
121
+ error("There's already a folder called #{bot}; move it out the way or try a different name")
122
+ end
115
123
  FileUtils.mkdir(bot)
116
124
  FileUtils.cp_r(Dir["#{scraper_template}/*"], bot)
117
125
 
@@ -177,10 +185,10 @@ class Turbot::Command::Bots < Turbot::Command::Base
177
185
  #
178
186
  # Validate bot output against its schema
179
187
  #
180
- # $ heroku bots:validate
188
+ # $ turbot bots:validate
181
189
  # Validating example... done
182
190
 
183
- def validate(opts={})
191
+ def validate
184
192
  scraper_path = shift_argument || scraper_file(Dir.pwd)
185
193
  validate_arguments!
186
194
  config = parsed_manifest(Dir.pwd)
@@ -197,45 +205,29 @@ class Turbot::Command::Bots < Turbot::Command::Base
197
205
  error("No schema found for data_type: #{type}")
198
206
  end
199
207
 
200
- count = 0
201
-
202
- run_scraper_each_line("#{scraper_path} #{bot}") do |line|
203
- errors = JSON::Validator.fully_validate(
204
- schema,
205
- line,
206
- {:errors_as_objects => true})
207
-
208
- if !errors.empty?
209
- error("LINE WITH ERROR: #{line}\n\nERRORS: #{errors}")
210
- end
211
- puts line if opts[:dump]
212
- if JSON.parse(line).slice(*config['identifying_fields']).blank?
213
- error = "Couldn't find any of #{config['identifying_fields']}"
214
- error("LINE WITH ERROR: #{line}\n\nERRORS: #{error}")
215
- end
216
-
217
- count += 1
218
- end
219
- puts "Validated #{count} records successfully!" if !opts[:dump]
208
+ runner = ValidationRunner.new(Dir.pwd)
209
+ runner.run
220
210
  end
221
211
 
222
212
  # bots:dump
223
213
  #
224
214
  # Execute bot locally (writes to STDOUT)
225
215
  #
226
- # $ heroku bots:dump
216
+ # $ turbot bots:dump
227
217
  # {'foo': 'bar'}
228
218
  # {'foo2': 'bar2'}
229
219
 
230
220
  def dump
231
- validate(:dump => true)
221
+ validate_arguments!
222
+ runner = DumpRunner.new(Dir.pwd)
223
+ runner.run
232
224
  end
233
225
 
234
226
  # # bots:single
235
227
  # #
236
228
  # # Execute bot in same way as OpenCorporates single-record update
237
229
  # #
238
- # # $ heroku bots:single
230
+ # # $ turbot bots:single
239
231
  # # Enter argument (as JSON object):
240
232
  # # {"id": "frob123"}
241
233
  # # {"id": "frob123", "stuff": "updated-data-for-this-record"}
@@ -261,98 +253,23 @@ class Turbot::Command::Bots < Turbot::Command::Base
261
253
  #
262
254
  # Sending example to turbot... done
263
255
  def preview
264
- scraper_path = shift_argument || scraper_file(Dir.pwd)
265
256
  validate_arguments!
266
257
 
267
- batch = []
268
- count = 0
269
258
  config = parsed_manifest(Dir.pwd)
270
- puts "Sending to turbot... "
271
-
259
+ api.update_bot(bot, parsed_manifest(Dir.pwd))
272
260
  api.destroy_draft_data(bot)
261
+ puts "Sending to turbot... "
273
262
 
274
- type = config["data_type"]
275
- schema = get_schema(type)
276
-
277
- result = ""
278
- run_scraper_each_line("#{scraper_path} #{bot}") do |line|
279
- spinner(count)
280
-
281
- errors = JSON::Validator.fully_validate(
282
- schema,
283
- line,
284
- {:errors_as_objects => true})
285
-
286
- if errors.empty?
287
- batch << JSON.parse(line)
288
- if count % 20 == 0
289
- result = api.create_draft_data(bot, config, batch.to_json)
290
- batch = []
291
- end
292
- count += 1
293
- else
294
- puts "The following record was not sent to turbot because it didn't validate against the schema:"
295
- puts line
296
- puts "The validation error was:"
297
- puts errors
298
- end
299
-
300
- end
301
- if !batch.empty?
302
- result = api.create_draft_data(bot, config, batch.to_json)
303
- end
304
- puts "Sent #{count} records."
305
- puts "View your records at #{result.data[:url]}"
263
+ runner = PreviewRunner.new(bot, api)
264
+ runner.run
306
265
  end
307
266
 
308
267
  private
309
-
310
268
  def spinner(p)
311
269
  parts = "\|/-" * 2
312
270
  print parts[p % parts.length] + "\r"
313
271
  end
314
272
 
315
- def run_scraper_each_line(scraper_path, options={})
316
- case scraper_path
317
- when /scraper.rb /
318
- interpreter = "ruby"
319
- when /scraper.py /
320
- interpreter = "python"
321
- else
322
- raise "Unsupported file extension at #{scraper_path}"
323
- end
324
-
325
- command = "#{interpreter} #{scraper_path}"
326
- Open3::popen3(command, options) do |_, stdout, stderr, wait_thread|
327
- loop do
328
- check_output_with_timeout(stdout)
329
-
330
- begin
331
- result = stdout.readline.strip
332
- yield result unless result.empty?
333
- # add run id and bot name
334
- rescue EOFError
335
- break
336
- end
337
- end
338
- status = wait_thread.value.exitstatus
339
- if status > 0
340
- message = "Bot <#{command}> exited with status #{status}: #{stderr.read}"
341
- raise RuntimeError.new(message)
342
- end
343
- end
344
- end
345
-
346
- def check_output_with_timeout(stdout, initial_interval = 10, timeout = 21600)
347
- interval = initial_interval
348
- loop do
349
- reads, _, _ = IO.select([stdout], [], [], interval)
350
- break if !reads.nil?
351
- raise "Timeout! - could not read from external bot after #{timeout} seconds" if reads.nil? && interval > timeout
352
- interval *= 2
353
- end
354
- end
355
-
356
273
  def parsed_manifest(dir)
357
274
  begin
358
275
  JSON.parse(open(manifest_path).read)
@@ -374,3 +291,96 @@ class Turbot::Command::Bots < Turbot::Command::Base
374
291
  File.expand_path("../../../../schema/schemas/#{hyphenated_name}-schema.json", __FILE__)
375
292
  end
376
293
  end
294
+
295
+ class PreviewRunner < TurbotRunner::BaseRunner
296
+ def initialize(bot_name, api)
297
+ @bot_name = bot_name
298
+ @api = api
299
+ @batch = []
300
+ @count = 0
301
+ super(Dir.pwd)
302
+ end
303
+
304
+ def handle_valid_record(record, data_type)
305
+ #spinner(@count)
306
+ @count += 1
307
+ @batch << record
308
+
309
+ if @count % 20 == 0
310
+ result = submit_batch
311
+ end
312
+ end
313
+
314
+ def handle_invalid_record(record, data_type, errors)
315
+ puts
316
+ puts "The following record was not sent to turbot because it didn't validate against the schema:"
317
+ puts record.to_json
318
+ errors.each {|error| puts " * #{error}"}
319
+ puts
320
+ end
321
+
322
+ def handle_successful_run
323
+ result = submit_batch
324
+ puts "Sent #{@count} records."
325
+ puts "View your records at #{result.data[:url]}"
326
+ end
327
+
328
+ private
329
+ def submit_batch
330
+ result = @api.create_draft_data(@bot_name, @batch.to_json)
331
+ @batch = []
332
+ result
333
+ end
334
+ end
335
+
336
+ class DumpRunner < TurbotRunner::BaseRunner
337
+ def handle_valid_record(record, data_type)
338
+ puts record.to_json
339
+ end
340
+
341
+ def handle_invalid_record(record, data_type, errors)
342
+ puts
343
+ puts "The following record is invalid:"
344
+ puts record.to_json
345
+ errors.each {|error| puts " * #{error}"}
346
+ puts
347
+ end
348
+
349
+ def handle_failed_run(output)
350
+ puts "Bot did not run to completion:"
351
+ puts output
352
+ end
353
+ end
354
+
355
+ class ValidationRunner < TurbotRunner::BaseRunner
356
+ def initialize(*)
357
+ @count = 0
358
+ super
359
+ end
360
+
361
+ def handle_valid_record(record, data_type)
362
+ @count += 1
363
+ end
364
+
365
+ def handle_invalid_record(record, data_type, errors)
366
+ puts
367
+ puts "The following record is invalid:"
368
+ puts record.to_json
369
+ errors.each {|error| puts " * #{error}"}
370
+ puts
371
+ interrupt
372
+ end
373
+
374
+ def handle_failed_run(output)
375
+ puts "Bot did not run to completion:"
376
+ puts output
377
+ end
378
+
379
+ def handle_interrupted_run
380
+ puts "Validated #{@count} records before finding invalid record"
381
+ end
382
+
383
+ def handle_successful_run
384
+ puts "Validated #{@count} records"
385
+ end
386
+ end
@@ -1,3 +1,3 @@
1
1
  module Turbot
2
- VERSION = "0.0.25"
2
+ VERSION = "0.0.27"
3
3
  end
@@ -0,0 +1,50 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-04/schema#",
3
+ "title": "Simple Licence Schema",
4
+ "type": "object",
5
+ "properties": {
6
+ "source_url": {
7
+ "description": "Place where this fact can be verified",
8
+ "type": "string"
9
+ },
10
+ "sample_date": {
11
+ "description": "Date on which this fact was known to be true",
12
+ "type": "string"
13
+ },
14
+ "confidence": {
15
+ "description": "Confidence in accuracy of data",
16
+ "type": "string",
17
+ "enum": ["HIGH", "MEDIUM", "LOW"]
18
+ },
19
+ "company_name": {
20
+ "description": "Name of the company holding the licence",
21
+ "type": "string"
22
+ },
23
+ "company_jurisdiction": {
24
+ "description": "Jurisdiction where company is based",
25
+ "type": "string"
26
+ },
27
+ "licence_number": {
28
+ "description": "Licence number or code",
29
+ "type": "string"
30
+ },
31
+ "jurisdiction_classification": {
32
+ "description": "Description of how regulator classifies licence",
33
+ "type": "string"
34
+ },
35
+ "regulator": {
36
+ "description": "The regulating body that issued the licence",
37
+ "type": "string"
38
+ },
39
+ "licence_jurisdiction": {
40
+ "description": "Jurisdiction where licence is issued",
41
+ "type": "string"
42
+ },
43
+ "category": {
44
+ "description": "Category of licence",
45
+ "type": "string",
46
+ "enum": ["Financial"]
47
+ }
48
+ },
49
+ "required": ["source_url", "sample_date", "company_name", "company_jurisdiction"]
50
+ }
@@ -1,5 +1,6 @@
1
1
  {
2
2
  "bot_id": "{{bot_id}}",
3
+ "title": "My simple bot",
3
4
  "description": "This is a simple bot",
4
5
  "data_type": "primary data",
5
6
  "identifying_fields": ["number"],
@@ -6,4 +6,5 @@ for n in range(0,20):
6
6
  "message": "Hello %s" % n,
7
7
  "sample_date": datetime.datetime.now().isoformat(),
8
8
  "source_url": "http://somewhere.com/%s" % n}
9
+ # The Turbot specification simply requires us to output lines of JSON
9
10
  print json.dumps(data)
@@ -7,5 +7,6 @@ require 'json'
7
7
  sample_date: Time.now,
8
8
  source_url: "http://somewhere.com/#{n}"
9
9
  }
10
+ # The Turbot specification simply requires us to output lines of JSON
10
11
  puts JSON.dump(data)
11
12
  end
metadata CHANGED
@@ -1,20 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: turbot
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.25
5
- prerelease:
4
+ version: 0.0.27
6
5
  platform: ruby
7
6
  authors:
8
7
  - Turbot
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2014-06-16 00:00:00.000000000 Z
11
+ date: 2014-06-26 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: netrc
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
17
  - - ~>
20
18
  - !ruby/object:Gem::Version
@@ -22,7 +20,6 @@ dependencies:
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
24
  - - ~>
28
25
  - !ruby/object:Gem::Version
@@ -30,7 +27,6 @@ dependencies:
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: rest-client
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
31
  - - ~>
36
32
  - !ruby/object:Gem::Version
@@ -38,7 +34,6 @@ dependencies:
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
38
  - - ~>
44
39
  - !ruby/object:Gem::Version
@@ -46,7 +41,6 @@ dependencies:
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: launchy
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
45
  - - ! '>='
52
46
  - !ruby/object:Gem::Version
@@ -54,7 +48,6 @@ dependencies:
54
48
  type: :runtime
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
52
  - - ! '>='
60
53
  - !ruby/object:Gem::Version
@@ -62,7 +55,6 @@ dependencies:
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: rubyzip
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
59
  - - ! '>='
68
60
  - !ruby/object:Gem::Version
@@ -70,7 +62,6 @@ dependencies:
70
62
  type: :runtime
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
66
  - - ! '>='
76
67
  - !ruby/object:Gem::Version
@@ -78,7 +69,6 @@ dependencies:
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: json-schema
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
73
  - - ! '>='
84
74
  - !ruby/object:Gem::Version
@@ -86,7 +76,6 @@ dependencies:
86
76
  type: :runtime
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
80
  - - ! '>='
92
81
  - !ruby/object:Gem::Version
@@ -94,7 +83,6 @@ dependencies:
94
83
  - !ruby/object:Gem::Dependency
95
84
  name: activesupport
96
85
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
86
  requirements:
99
87
  - - '='
100
88
  - !ruby/object:Gem::Version
@@ -102,7 +90,6 @@ dependencies:
102
90
  type: :runtime
103
91
  prerelease: false
104
92
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
93
  requirements:
107
94
  - - '='
108
95
  - !ruby/object:Gem::Version
@@ -110,23 +97,34 @@ dependencies:
110
97
  - !ruby/object:Gem::Dependency
111
98
  name: turbot-api
112
99
  requirement: !ruby/object:Gem::Requirement
113
- none: false
114
100
  requirements:
115
101
  - - '='
116
102
  - !ruby/object:Gem::Version
117
- version: 0.0.8
103
+ version: 0.0.11
118
104
  type: :runtime
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
107
  requirements:
123
108
  - - '='
124
109
  - !ruby/object:Gem::Version
125
- version: 0.0.8
110
+ version: 0.0.11
111
+ - !ruby/object:Gem::Dependency
112
+ name: turbot-runner
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - '='
116
+ - !ruby/object:Gem::Version
117
+ version: 0.0.2
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - '='
123
+ - !ruby/object:Gem::Version
124
+ version: 0.0.2
126
125
  - !ruby/object:Gem::Dependency
127
126
  name: excon
128
127
  requirement: !ruby/object:Gem::Requirement
129
- none: false
130
128
  requirements:
131
129
  - - ! '>='
132
130
  - !ruby/object:Gem::Version
@@ -134,7 +132,6 @@ dependencies:
134
132
  type: :runtime
135
133
  prerelease: false
136
134
  version_requirements: !ruby/object:Gem::Requirement
137
- none: false
138
135
  requirements:
139
136
  - - ! '>='
140
137
  - !ruby/object:Gem::Version
@@ -178,6 +175,23 @@ files:
178
175
  - lib/turbot/updater.rb
179
176
  - lib/turbot/version.rb
180
177
  - lib/vendor/turbot/okjson.rb
178
+ - schema/schemas/company-schema.json
179
+ - schema/schemas/includes/address.json
180
+ - schema/schemas/includes/base-statement.json
181
+ - schema/schemas/includes/company.json
182
+ - schema/schemas/includes/filing.json
183
+ - schema/schemas/includes/license-data.json
184
+ - schema/schemas/includes/officer.json
185
+ - schema/schemas/includes/previous_name.json
186
+ - schema/schemas/includes/share-parcel-data.json
187
+ - schema/schemas/includes/share-parcel.json
188
+ - schema/schemas/includes/subsidiary-relationship-data.json
189
+ - schema/schemas/includes/total-shares.json
190
+ - schema/schemas/licence-schema.json
191
+ - schema/schemas/primary-data-schema.json
192
+ - schema/schemas/share-parcel-schema.json
193
+ - schema/schemas/simple-licence-schema.json
194
+ - schema/schemas/subsidiary-relationship-schema.json
181
195
  - spec/helper/legacy_help.rb
182
196
  - spec/helper/pg_dump_restore_spec.rb
183
197
  - spec/schemas/dummy_schema.json
@@ -211,45 +225,29 @@ files:
211
225
  - templates/manifest.json
212
226
  - templates/python/scraper.py
213
227
  - templates/ruby/scraper.rb
214
- - schema/schemas/company-schema.json
215
- - schema/schemas/includes/address.json
216
- - schema/schemas/includes/base-statement.json
217
- - schema/schemas/includes/company.json
218
- - schema/schemas/includes/filing.json
219
- - schema/schemas/includes/license-data.json
220
- - schema/schemas/includes/officer.json
221
- - schema/schemas/includes/previous_name.json
222
- - schema/schemas/includes/share-parcel-data.json
223
- - schema/schemas/includes/share-parcel.json
224
- - schema/schemas/includes/subsidiary-relationship-data.json
225
- - schema/schemas/includes/total-shares.json
226
- - schema/schemas/licence-schema.json
227
- - schema/schemas/primary-data-schema.json
228
- - schema/schemas/share-parcel-schema.json
229
- - schema/schemas/subsidiary-relationship-schema.json
230
228
  homepage: http://turbot.com/
231
229
  licenses:
232
230
  - MIT
231
+ metadata: {}
233
232
  post_install_message:
234
233
  rdoc_options: []
235
234
  require_paths:
236
235
  - lib
237
236
  required_ruby_version: !ruby/object:Gem::Requirement
238
- none: false
239
237
  requirements:
240
238
  - - ! '>='
241
239
  - !ruby/object:Gem::Version
242
240
  version: 1.9.2
243
241
  required_rubygems_version: !ruby/object:Gem::Requirement
244
- none: false
245
242
  requirements:
246
243
  - - ! '>='
247
244
  - !ruby/object:Gem::Version
248
245
  version: '0'
249
246
  requirements: []
250
247
  rubyforge_project:
251
- rubygems_version: 1.8.23.2
248
+ rubygems_version: 2.2.2
252
249
  signing_key:
253
- specification_version: 3
250
+ specification_version: 4
254
251
  summary: Client library and CLI to deploy apps on Turbot.
255
252
  test_files: []
253
+ has_rdoc: