transcriptic 0.1.2 → 0.1.3

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.
@@ -1,8 +1,12 @@
1
+ require "base64"
2
+ require "excon"
3
+ require "securerandom"
4
+ require "uri"
5
+ require "zlib"
6
+
1
7
  require "transcriptic/api/errors"
2
8
  require "transcriptic/api/version"
3
9
 
4
- require "transcriptic/api/sequences"
5
-
6
10
  srand
7
11
 
8
12
  module Transcriptic
@@ -14,17 +18,18 @@ module Transcriptic
14
18
  options = {
15
19
  :headers => {},
16
20
  :host => 'transcriptic.com',
21
+ :nonblock => false,
17
22
  :scheme => 'https'
18
23
  }.merge(options)
19
24
  options[:headers] = {
20
- 'Accept' => 'application/json',
21
- 'Accept-Encoding' => 'gzip',
22
- 'Accept-Language' => 'en-US, en;q=0.8',
23
- 'Authorization' => "Token token=\"#{@api_key}\"",
24
- 'User-Agent' => "transcriptic-cli/#{Transcriptic::API::VERSION}",
25
- 'X-Transcriptic-API-Version' => '3',
26
- 'X-Ruby-Version' => RUBY_VERSION,
27
- 'X-Ruby-Platform' => RUBY_PLATFORM
25
+ 'Accept' => 'application/json',
26
+ 'Accept-Encoding' => 'gzip',
27
+ 'Accept-Language' => 'en-US, en;q=0.8',
28
+ 'Authorization' => "Token token=\"#{@api_key}\"",
29
+ 'User-Agent' => "transcriptic-cli/#{Transcriptic::API::VERSION}",
30
+ 'X-Transcriptic-API-Version' => '1',
31
+ 'X-Ruby-Version' => RUBY_VERSION,
32
+ 'X-Ruby-Platform' => RUBY_PLATFORM
28
33
  }.merge(options[:headers])
29
34
  @connection = Excon.new("#{options[:scheme]}://#{options[:host]}", options)
30
35
  end
@@ -69,5 +74,9 @@ module Transcriptic
69
74
  response
70
75
  end
71
76
 
77
+ def escape(string)
78
+ CGI.escape(string).gsub('.', '%2E')
79
+ end
80
+
72
81
  end
73
82
  end
@@ -41,25 +41,6 @@ class Transcriptic::Client
41
41
  @host = host
42
42
  end
43
43
 
44
- def get_keys
45
- json_decode get("/api/keys").to_s
46
- end
47
-
48
- # Add an ssh public key to the current user.
49
- def add_key(key)
50
- json_decode post("/api/keys", key, { 'Content-Type' => 'text/ssh-authkey' }).to_s
51
- end
52
-
53
- # Remove an existing ssh public key from the current user.
54
- def remove_key(key)
55
- json_decode delete("/api/keys/#{escape(key)}").to_s
56
- end
57
-
58
- # Clear all keys on the current user.
59
- def remove_all_keys
60
- json_decode delete("/api/keys").to_s
61
- end
62
-
63
44
  # Get a list of stacks available to the app, with the current one marked.
64
45
  def list_stacks(app_name, options={})
65
46
  include_deprecated = options.delete(:include_deprecated) || false
@@ -86,16 +67,6 @@ class Transcriptic::Client
86
67
  json_decode resource("/organizations").get(:accept => 'application/json').to_s
87
68
  end
88
69
 
89
- # Add an ssh public key to the current user.
90
- def add_sequence(organization, sequence)
91
- post("/#{organization}/sequences", sequence, { 'Content-Type' => 'text/ssh-authkey' }).to_s
92
- end
93
-
94
- # Remove an existing ssh public key from the current user.
95
- def remove_sequence(organization, sequence)
96
- delete("/#{organization}/sequences/#{escape(key)}").to_s
97
- end
98
-
99
70
  class Protocol
100
71
  attr_accessor :attached, :upid
101
72
 
@@ -163,7 +134,7 @@ class Transcriptic::Client
163
134
  end
164
135
 
165
136
  def status(run_id)
166
- json_decode resource("/runs/#{run_id}/status").get(:accept => 'application/json').to_s
137
+ json_decode get("/api/runs/#{run_id}").to_s
167
138
  end
168
139
 
169
140
  def create_run(fd)
@@ -177,7 +148,7 @@ class Transcriptic::Client
177
148
 
178
149
  def read_logs(run_id, options=[])
179
150
  query = "&" + options.join("&") unless options.empty?
180
- url = get("/runs/#{run_id}/logs?#{query}").to_s
151
+ url = get("/api/runs/#{run_id}/logs?#{query}").to_s
181
152
  uri = URI.parse(url);
182
153
  http = Net::HTTP.new(uri.host, uri.port)
183
154
 
@@ -305,7 +276,7 @@ class Transcriptic::Client
305
276
  def default_resource_options_for_uri(uri)
306
277
  if ENV["TRANSCRIPTIC_SSL_VERIFY"] == "disable"
307
278
  {}
308
- elsif realize_full_uri(uri) =~ %r|^https://transcriptic.com|
279
+ elsif realize_full_uri(uri) =~ %r|^https://www.transcriptic.com|
309
280
  # OpenSSL::SSL::VERIFY_PEER
310
281
  { }
311
282
  #{ :verify_ssl => OpenSSL::SSL::VERIFY_NONE, :ssl_ca_file => local_ca_file }
@@ -3,6 +3,27 @@ module Transcriptic::Command
3
3
  # manage experimental data sets
4
4
  #
5
5
  class Data < Base
6
- def index; end
6
+
7
+ # data RUNID
8
+ #
9
+ # list available datasets for RUNID
10
+ #
11
+ def index
12
+ end
13
+
14
+ # transcriptic data:download DATASETID
15
+ #
16
+ # download the dataset identified by DATASETID
17
+ #
18
+ def download
19
+ end
20
+
21
+ # transcriptic data:delete DATASETID
22
+ #
23
+ # delete the dataset identified by DATASETID
24
+ #
25
+ def delete
26
+ end
27
+
7
28
  end
8
29
  end
@@ -3,7 +3,7 @@ module Transcriptic::Command
3
3
  # list commands and display help
4
4
  #
5
5
  class Help < Base
6
- PRIMARY_NAMESPACES = %w( analyze data history run status sequences)
6
+ PRIMARY_NAMESPACES = %w(run data)
7
7
 
8
8
  # help [COMMAND]
9
9
  #
@@ -7,24 +7,78 @@ module Transcriptic::Command
7
7
  #
8
8
  class Run < Base
9
9
 
10
- # transcriptic run [FILENAME|DIRECTORY]
10
+ # run [FILENAME|DIRECTORY]
11
11
  #
12
12
  # upload FILENAME or DIRECTORY and launch it
13
13
  #
14
14
  def index
15
15
  path = args.shift
16
16
  fd = create_protocol_fd_for_path(path)
17
+ if 1 == fd
18
+ error "Couldn't create run!"
19
+ end
17
20
  display "Uploading `#{path}` to Transcriptic..."
18
21
  run_id = transcriptic.create_run(fd)["run_id"]
19
22
  display "Run launched (#{run_id})"
20
23
  end
21
24
 
25
+ # transcriptic run:analyze [FILENAME|DIRECTORY]
26
+ #
27
+ # upload FILENAME or DIRECTORY and analyze it
28
+ #
29
+ def analyze
30
+ path = args.shift
31
+ end
32
+
33
+ # transcriptic run:status [RUNID]
34
+ #
35
+ # show details of RUNID
36
+ #
37
+ def status
38
+ run_id = args.shift
39
+ if run_id.nil?
40
+ error("Usage: transcriptic status RUNID\nMust specify RUNID to get run status.")
41
+ end
42
+ ret = transcriptic.status(run_id)
43
+ if ret.nil?
44
+ error("#{run_id} not found for #{transcriptic.user}")
45
+ return
46
+ end
47
+ display(ret.inspect)
48
+ end
49
+
50
+ # transcriptic run:list
51
+ #
52
+ # list active runs
53
+ #
54
+ def list
55
+ ret = transcriptic.list
56
+ if ret.empty?
57
+ error("No runs for #{transcriptic.user}")
58
+ return
59
+ end
60
+ display("Runs:")
61
+ ret.each do |run|
62
+ display " #{run.name}"
63
+ end
64
+ end
65
+
66
+ # transcriptic run:logs RUNID
67
+ #
68
+ # get log data for RUNID
69
+ #
70
+ def logs
71
+ run_id = args.shift
72
+ transcriptic.read_logs(run_id)
73
+ end
74
+
75
+ private
22
76
  def create_protocol_fd_for_path(path)
23
77
  begin
24
78
  stat = File.stat(path)
25
79
  rescue
26
80
  display "No such path: #{path}"
27
- return
81
+ return 1
28
82
  end
29
83
  upfile = Tempfile.new('protocol')
30
84
  if stat.directory?
@@ -32,6 +32,16 @@ module Transcriptic
32
32
  display
33
33
  end
34
34
 
35
+ def format_with_bang(message)
36
+ return '' if message.to_s.strip == ""
37
+ " ! " + message.split("\n").join("\n ! ")
38
+ end
39
+
40
+ def output_with_bang(message="", new_line=true)
41
+ return if message.to_s.strip == ""
42
+ display(format_with_bang(message), new_line)
43
+ end
44
+
35
45
  def error(msg)
36
46
  STDERR.puts(msg)
37
47
  exit 1
@@ -275,6 +285,61 @@ module Transcriptic
275
285
  end
276
286
  end
277
287
  end
288
+
289
+ def string_distance(first, last)
290
+ distances = [] # 0x0s
291
+ 0.upto(first.length) do |index|
292
+ distances << [index] + [0] * last.length
293
+ end
294
+ distances[0] = 0.upto(last.length).to_a
295
+ 1.upto(last.length) do |last_index|
296
+ 1.upto(first.length) do |first_index|
297
+ first_char = first[first_index - 1, 1]
298
+ last_char = last[last_index - 1, 1]
299
+ if first_char == last_char
300
+ distances[first_index][last_index] = distances[first_index - 1][last_index - 1] # noop
301
+ else
302
+ distances[first_index][last_index] = [
303
+ distances[first_index - 1][last_index], # deletion
304
+ distances[first_index][last_index - 1], # insertion
305
+ distances[first_index - 1][last_index - 1] # substitution
306
+ ].min + 1 # cost
307
+ if first_index > 1 && last_index > 1
308
+ first_previous_char = first[first_index - 2, 1]
309
+ last_previous_char = last[last_index - 2, 1]
310
+ if first_char == last_previous_char && first_previous_char == last_char
311
+ distances[first_index][last_index] = [
312
+ distances[first_index][last_index],
313
+ distances[first_index - 2][last_index - 2] + 1 # transposition
314
+ ].min
315
+ end
316
+ end
317
+ end
318
+ end
319
+ end
320
+ distances[first.length][last.length]
321
+ end
322
+
323
+ def suggestion(actual, possibilities)
324
+ distances = Hash.new {|hash,key| hash[key] = []}
325
+
326
+ possibilities.each do |suggestion|
327
+ distances[string_distance(actual, suggestion)] << suggestion
328
+ end
329
+
330
+ minimum_distance = distances.keys.min
331
+ if minimum_distance < 4
332
+ suggestions = distances[minimum_distance].sort
333
+ if suggestions.length == 1
334
+ "Perhaps you meant `#{suggestions.first}`."
335
+ else
336
+ "Perhaps you meant #{suggestions[0...-1].map {|suggestion| "`#{suggestion}`"}.join(', ')} or `#{suggestions.last}`."
337
+ end
338
+ else
339
+ nil
340
+ end
341
+ end
342
+
278
343
  end
279
344
  end
280
345
 
@@ -1,3 +1,3 @@
1
1
  module Transcriptic
2
- VERSION = "0.1.2"
2
+ VERSION = "0.1.3"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: transcriptic
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-24 00:00:00.000000000Z
12
+ date: 2012-10-29 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: thrift
16
- requirement: &70219859440740 !ruby/object:Gem::Requirement
16
+ requirement: &70351850156680 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0.8'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70219859440740
24
+ version_requirements: *70351850156680
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: netrc
27
- requirement: &70219859440240 !ruby/object:Gem::Requirement
27
+ requirement: &70351850156180 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 0.7.7
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70219859440240
35
+ version_requirements: *70351850156180
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rest-client
38
- requirement: &70219859439780 !ruby/object:Gem::Requirement
38
+ requirement: &70351850155720 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 1.6.1
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70219859439780
46
+ version_requirements: *70351850155720
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: launchy
49
- requirement: &70219859439320 !ruby/object:Gem::Requirement
49
+ requirement: &70351850155260 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 0.3.2
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *70219859439320
57
+ version_requirements: *70351850155260
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: zipruby
60
- requirement: &70219859438940 !ruby/object:Gem::Requirement
60
+ requirement: &70351850154880 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '0'
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *70219859438940
68
+ version_requirements: *70351850154880
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: multipart-post
71
- requirement: &70219859438480 !ruby/object:Gem::Requirement
71
+ requirement: &70351850154420 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,7 +76,7 @@ dependencies:
76
76
  version: '0'
77
77
  type: :runtime
78
78
  prerelease: false
79
- version_requirements: *70219859438480
79
+ version_requirements: *70351850154420
80
80
  description: Client library and command-line tool to work with Transcriptic Platform.
81
81
  email: support@transcriptic.com
82
82
  executables:
@@ -87,23 +87,17 @@ files:
87
87
  - lib/transcriptic.rb
88
88
  - lib/transcriptic/api.rb
89
89
  - lib/transcriptic/api/errors.rb
90
- - lib/transcriptic/api/sequences.rb
91
90
  - lib/transcriptic/api/version.rb
92
91
  - lib/transcriptic/auth.rb
93
92
  - lib/transcriptic/cli.rb
94
93
  - lib/transcriptic/client.rb
95
94
  - lib/transcriptic/command.rb
96
- - lib/transcriptic/command/analyze.rb
97
95
  - lib/transcriptic/command/base.rb
98
96
  - lib/transcriptic/command/console.rb
99
97
  - lib/transcriptic/command/data.rb
100
98
  - lib/transcriptic/command/help.rb
101
- - lib/transcriptic/command/history.rb
102
- - lib/transcriptic/command/keys.rb
103
99
  - lib/transcriptic/command/login.rb
104
100
  - lib/transcriptic/command/run.rb
105
- - lib/transcriptic/command/sequences.rb
106
- - lib/transcriptic/command/status.rb
107
101
  - lib/transcriptic/helpers.rb
108
102
  - lib/transcriptic/version.rb
109
103
  - lib/vendor/transcriptic/okjson.rb
@@ -1,33 +0,0 @@
1
- module Transcriptic
2
- class API
3
-
4
- # DELETE /:organization/sequences/:sequence
5
- def delete_sequence(organization, sequence)
6
- request(
7
- :expects => 200,
8
- :method => :delete,
9
- :path => "/#{organization}/sequences/#{sequence}"
10
- )
11
- end
12
-
13
- # GET /:organization/sequences
14
- def get_sequences(organization)
15
- request(
16
- :expects => 200,
17
- :method => :get,
18
- :path => "/#{organization}/sequences"
19
- )
20
- end
21
-
22
- # POST /:organization/sequences
23
- def post_domain(organization, sequence)
24
- request(
25
- :expects => 201,
26
- :method => :post,
27
- :path => "/#{organization}/sequences",
28
- :query => {'sequence' => sequence}
29
- )
30
- end
31
-
32
- end
33
- end
@@ -1,12 +0,0 @@
1
- require "transcriptic/command/base"
2
-
3
- module Transcriptic::Command
4
-
5
- # analyze an autoprotocol script or project
6
- #
7
- class Analyze < Base
8
-
9
- def index; end
10
-
11
- end
12
- end
@@ -1,8 +0,0 @@
1
- module Transcriptic::Command
2
-
3
- # show the history (audit trail) for a run
4
- #
5
- class History < Base
6
- def index; end
7
- end
8
- end
@@ -1,115 +0,0 @@
1
- require "transcriptic/command/base"
2
-
3
- module Transcriptic::Command
4
-
5
- # manage authentication keys
6
- #
7
- class Keys < Base
8
-
9
- # keys
10
- #
11
- # display keys for the current user
12
- #
13
- # -l, --long # display extended information for each key
14
- #
15
- #Examples:
16
- #
17
- # $ transcriptic keys
18
- # === email@example.com Keys
19
- # ssh-rsa ABCDEFGHIJK...OPQRSTUV== email@example.com
20
- #
21
- # $ transcriptic keys --long
22
- # === email@example.com Keys
23
- # ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAp9AJD5QABmOcrkHm6SINuQkDefaR0MUrfgZ1Pxir3a4fM1fwa00dsUwbUaRuR7FEFD8n1E9WwDf8SwQTHtyZsJg09G9myNqUzkYXCmydN7oGr5IdVhRyv5ixcdiE0hj7dRnOJg2poSQ3Qi+Ka8SVJzF7nIw1YhuicHPSbNIFKi5s0D5a+nZb/E6MNGvhxoFCQX2IcNxaJMqhzy1ESwlixz45aT72mXYq0LIxTTpoTqma1HuKdRY8HxoREiivjmMQulYP+CxXFcMyV9kxTKIUZ/FXqlC6G5vSm3J4YScSatPOj9ID5HowpdlIx8F6y4p1/28r2tTl4CY40FFyoke4MQ== email@example.com
24
- #
25
- def index
26
- validate_arguments!
27
- keys = transcriptic.get_keys
28
- if keys.length > 0
29
- display("#{Transcriptic::Auth.user} Keys")
30
- keys = if options[:long]
31
- keys.map {|key| key["contents"].strip}
32
- else
33
- keys.map {|key| format_key_for_display(key["contents"])}
34
- end
35
- styled_array(keys)
36
- else
37
- display("You have no keys.")
38
- end
39
- end
40
-
41
- # keys:add [KEY]
42
- #
43
- # add a key for the current user
44
- #
45
- # if no KEY is specified, will try to find ~/.ssh/id_[rd]sa.pub
46
- #
47
- #Examples:
48
- #
49
- # $ transcriptic keys:add
50
- # Could not find an existing public key.
51
- # Would you like to generate one? [Yn] y
52
- # Generating new SSH public key.
53
- # Uploading SSH public key /.ssh/id_rsa.pub... done
54
- #
55
- # $ transcriptic keys:add /my/key.pub
56
- # Uploading SSH public key /my/key.pub... done
57
- #
58
- def add
59
- keyfile = shift_argument
60
- validate_arguments!
61
-
62
- if keyfile
63
- Transcriptic::Auth.associate_key(keyfile)
64
- else
65
- # make sure we have credentials
66
- Transcriptic::Auth.get_credentials
67
- Transcriptic::Auth.associate_or_generate_ssh_key
68
- end
69
- end
70
-
71
- # keys:remove KEY
72
- #
73
- # remove a key from the current user
74
- #
75
- #Examples:
76
- #
77
- # $ transcriptic keys:remove email@example.com
78
- # Removing email@example.com SSH key... done
79
- #
80
- def remove
81
- key = shift_argument
82
- if key.nil? || key.empty?
83
- error("Usage: transcriptic keys:remove KEY\nMust specify KEY to remove.")
84
- end
85
- validate_arguments!
86
-
87
- action("Removing #{key} SSH key") do
88
- api.delete_key(key)
89
- end
90
- end
91
-
92
- # keys:clear
93
- #
94
- # remove all authentication keys from the current user
95
- #
96
- #Examples:
97
- #
98
- # $ transcriptic keys:cleare
99
- # Removing all SSH keys... done
100
- #
101
- def clear
102
- validate_arguments!
103
-
104
- action("Removing all SSH keys") do
105
- api.delete_keys
106
- end
107
- end
108
-
109
- protected
110
- def format_key_for_display(key)
111
- type, hex, local = key.strip.split(/\s/)
112
- [type, hex[0,10] + '...' + hex[-10,10], local].join(' ')
113
- end
114
- end
115
- end
@@ -1,45 +0,0 @@
1
- module Transcriptic::Command
2
-
3
- # manage sequence data
4
- #
5
- class Sequences < Base
6
-
7
- # sequences
8
- #
9
- # list all sequence entries
10
- #
11
- #Examples:
12
- #
13
- # $ transcriptic sequences
14
- # ...
15
- #
16
- def index
17
- validate_arguments!
18
- end
19
-
20
- # sequences:add FILENAME.EXT
21
- #
22
- # upload new sequence data file. EXT must be .gb or .fasta
23
- #
24
- #Examples:
25
- #
26
- # $ transcriptic sequences:add myvector.fasta
27
- # ...
28
- #
29
- def add
30
- end
31
-
32
- # sequences:delete NAME
33
- #
34
- # delete sequence by name NAME
35
- #
36
- #Examples:
37
- #
38
- # $ transcriptic sequences:delete myvector20110204
39
- # ...
40
- #
41
- def remove
42
- end
43
-
44
- end
45
- end
@@ -1,20 +0,0 @@
1
- module Transcriptic::Command
2
-
3
- # view the status of your runs
4
- #
5
- class Status < Base
6
-
7
- # transcriptic status [RUNID]
8
- #
9
- # list active runs, or if RUNID supplied, show details of that run
10
- #
11
- def index
12
- run_id = args.shift
13
- if run_id.nil?
14
- error("Usage: transcriptic status RUNID\nMust specify RUNID to get run status.")
15
- end
16
- puts run_id
17
- end
18
-
19
- end
20
- end