transcriptic 0.1.3 → 0.2.0
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 +7 -0
- data/bin/transcriptic +2 -4
- data/lib/thor/monkies.rb +3 -0
- data/lib/thor/monkies/shell.rb +3 -0
- data/lib/transcriptic.rb +86 -2
- data/lib/transcriptic/auth.rb +2 -63
- data/lib/transcriptic/base_generator.rb +25 -0
- data/lib/transcriptic/cli.rb +199 -8
- data/lib/transcriptic/client.rb +45 -38
- data/lib/transcriptic/commands/project.rb +37 -0
- data/lib/transcriptic/core_ext.rb +3 -0
- data/lib/transcriptic/core_ext/file.rb +7 -0
- data/lib/transcriptic/core_ext/file_utils.rb +15 -0
- data/lib/transcriptic/core_ext/pathname.rb +13 -0
- data/lib/transcriptic/core_ext/string.rb +8 -0
- data/lib/transcriptic/dependencies_generator.rb +13 -0
- data/lib/transcriptic/errors.rb +32 -0
- data/lib/transcriptic/labfile.rb +73 -0
- data/lib/transcriptic/project_generator.rb +56 -0
- data/lib/transcriptic/sbt.rb +58 -0
- data/lib/transcriptic/templates/LICENSE.erb +20 -0
- data/lib/transcriptic/templates/Labfile.erb +12 -0
- data/lib/transcriptic/templates/README.erb +3 -0
- data/lib/transcriptic/templates/app/Main.erb +11 -0
- data/lib/transcriptic/templates/project/Build.erb +59 -0
- data/lib/transcriptic/templates/project/Dependencies.erb +10 -0
- data/lib/transcriptic/templates/project/build.properties +1 -0
- data/lib/transcriptic/templates/project/plugins.sbt +5 -0
- data/lib/transcriptic/templates/sbt +1 -0
- data/lib/transcriptic/{helpers.rb → ui.rb} +124 -109
- data/lib/transcriptic/version.rb +2 -1
- data/lib/vendor/{transcriptic/okjson.rb → okjson.rb} +0 -0
- metadata +203 -46
- data/lib/transcriptic/command.rb +0 -233
- data/lib/transcriptic/command/base.rb +0 -157
- data/lib/transcriptic/command/console.rb +0 -10
- data/lib/transcriptic/command/data.rb +0 -29
- data/lib/transcriptic/command/help.rb +0 -124
- data/lib/transcriptic/command/login.rb +0 -35
- data/lib/transcriptic/command/run.rb +0 -108
@@ -1,157 +0,0 @@
|
|
1
|
-
require "fileutils"
|
2
|
-
require "transcriptic/auth"
|
3
|
-
require "transcriptic/command"
|
4
|
-
|
5
|
-
class Transcriptic::Command::Base
|
6
|
-
include Transcriptic::Helpers
|
7
|
-
|
8
|
-
def self.namespace
|
9
|
-
self.to_s.split("::").last.downcase
|
10
|
-
end
|
11
|
-
|
12
|
-
attr_reader :args
|
13
|
-
attr_reader :options
|
14
|
-
|
15
|
-
def initialize(args=[], options={})
|
16
|
-
@args = args
|
17
|
-
@options = options
|
18
|
-
end
|
19
|
-
|
20
|
-
def transcriptic
|
21
|
-
Transcriptic::Auth.client
|
22
|
-
end
|
23
|
-
|
24
|
-
protected
|
25
|
-
|
26
|
-
def self.inherited(klass)
|
27
|
-
unless klass == Transcriptic::Command::Base
|
28
|
-
help = extract_help_from_caller(caller.first)
|
29
|
-
|
30
|
-
Transcriptic::Command.register_namespace(
|
31
|
-
:name => klass.namespace,
|
32
|
-
:description => help.first
|
33
|
-
)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
def self.method_added(method)
|
38
|
-
return if self == Transcriptic::Command::Base
|
39
|
-
return if private_method_defined?(method)
|
40
|
-
return if protected_method_defined?(method)
|
41
|
-
|
42
|
-
help = extract_help_from_caller(caller.first)
|
43
|
-
resolved_method = (method.to_s == "index") ? nil : method.to_s
|
44
|
-
command = [ self.namespace, resolved_method ].compact.join(":")
|
45
|
-
banner = extract_banner(help) || command
|
46
|
-
|
47
|
-
Transcriptic::Command.register_command(
|
48
|
-
:klass => self,
|
49
|
-
:method => method,
|
50
|
-
:namespace => self.namespace,
|
51
|
-
:command => command,
|
52
|
-
:banner => banner.strip,
|
53
|
-
:help => help.join("\n"),
|
54
|
-
:summary => extract_summary(help),
|
55
|
-
:description => extract_description(help),
|
56
|
-
:options => extract_options(help)
|
57
|
-
)
|
58
|
-
end
|
59
|
-
|
60
|
-
def self.alias_command(new, old)
|
61
|
-
raise "no such command: #{old}" unless Transcriptic::Command.commands[old]
|
62
|
-
Transcriptic::Command.command_aliases[new] = old
|
63
|
-
end
|
64
|
-
|
65
|
-
def self.extract_help_from_caller(line)
|
66
|
-
# pull out of the caller the information for the file path and line number
|
67
|
-
if line =~ /^(.+?):(\d+)/
|
68
|
-
extract_help($1, $2)
|
69
|
-
else
|
70
|
-
raise("unable to extract help from caller: #{line}")
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
def self.extract_help(file, line_number)
|
75
|
-
buffer = []
|
76
|
-
lines = Transcriptic::Command.files[file]
|
77
|
-
|
78
|
-
(line_number.to_i-2).downto(0) do |i|
|
79
|
-
line = lines[i]
|
80
|
-
case line[0..0]
|
81
|
-
when ""
|
82
|
-
when "#"
|
83
|
-
buffer.unshift(line[1..-1])
|
84
|
-
else
|
85
|
-
break
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
buffer
|
90
|
-
end
|
91
|
-
|
92
|
-
def self.extract_command(help)
|
93
|
-
extract_banner(help).to_s.split(" ").first
|
94
|
-
end
|
95
|
-
|
96
|
-
def self.extract_banner(help)
|
97
|
-
help.first
|
98
|
-
end
|
99
|
-
|
100
|
-
def self.extract_summary(help)
|
101
|
-
extract_description(help).split("\n").first
|
102
|
-
end
|
103
|
-
|
104
|
-
def self.extract_description(help)
|
105
|
-
help.reject do |line|
|
106
|
-
line =~ /^\s+-(.+)#(.+)/
|
107
|
-
end.join("\n")
|
108
|
-
end
|
109
|
-
|
110
|
-
def self.extract_options(help)
|
111
|
-
help.select do |line|
|
112
|
-
line =~ /^\s+-(.+)#(.+)/
|
113
|
-
end.inject({}) do |hash, line|
|
114
|
-
description = line.split("#", 2).last
|
115
|
-
long = line.match(/--([A-Za-z\- ]+)/)[1].strip
|
116
|
-
short = line.match(/-([A-Za-z ])/)[1].strip
|
117
|
-
hash.update(long.split(" ").first => { :desc => description, :short => short, :long => long })
|
118
|
-
end
|
119
|
-
end
|
120
|
-
|
121
|
-
def current_command
|
122
|
-
Transcriptic::Command.current_command
|
123
|
-
end
|
124
|
-
|
125
|
-
def extract_option(name, default=true)
|
126
|
-
key = name.gsub("--", "").to_sym
|
127
|
-
return unless options[key]
|
128
|
-
value = options[key] || default
|
129
|
-
block_given? ? yield(value) : value
|
130
|
-
end
|
131
|
-
|
132
|
-
def invalid_arguments
|
133
|
-
Transcriptic::Command.invalid_arguments
|
134
|
-
end
|
135
|
-
|
136
|
-
def shift_argument
|
137
|
-
Transcriptic::Command.shift_argument
|
138
|
-
end
|
139
|
-
|
140
|
-
def validate_arguments!
|
141
|
-
Transcriptic::Command.validate_arguments!
|
142
|
-
end
|
143
|
-
|
144
|
-
def confirm_mismatch?
|
145
|
-
options[:confirm] && (options[:confirm] != options[:app])
|
146
|
-
end
|
147
|
-
|
148
|
-
def escape(value)
|
149
|
-
transcriptic.escape(value)
|
150
|
-
end
|
151
|
-
end
|
152
|
-
|
153
|
-
module Transcriptic::Command
|
154
|
-
unless const_defined?(:BaseWithApp)
|
155
|
-
BaseWithApp = Base
|
156
|
-
end
|
157
|
-
end
|
@@ -1,29 +0,0 @@
|
|
1
|
-
module Transcriptic::Command
|
2
|
-
|
3
|
-
# manage experimental data sets
|
4
|
-
#
|
5
|
-
class Data < Base
|
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
|
-
|
28
|
-
end
|
29
|
-
end
|
@@ -1,124 +0,0 @@
|
|
1
|
-
module Transcriptic::Command
|
2
|
-
|
3
|
-
# list commands and display help
|
4
|
-
#
|
5
|
-
class Help < Base
|
6
|
-
PRIMARY_NAMESPACES = %w(run data)
|
7
|
-
|
8
|
-
# help [COMMAND]
|
9
|
-
#
|
10
|
-
# list available commands or display help for a specific command
|
11
|
-
#
|
12
|
-
def index
|
13
|
-
if command = args.shift
|
14
|
-
help_for_command(command)
|
15
|
-
else
|
16
|
-
help_for_root
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
alias_command "-h", "help"
|
21
|
-
alias_command "--help", "help"
|
22
|
-
|
23
|
-
def self.usage_for_command(command)
|
24
|
-
command = new.send(:commands)[command]
|
25
|
-
"Usage: transcriptic #{command[:banner]}" if command
|
26
|
-
end
|
27
|
-
|
28
|
-
private
|
29
|
-
|
30
|
-
def commands_for_namespace(name)
|
31
|
-
Transcriptic::Command.commands.values.select do |command|
|
32
|
-
command[:namespace] == name && command[:command] != name
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
def namespaces
|
37
|
-
namespaces = Transcriptic::Command.namespaces
|
38
|
-
namespaces.delete("app")
|
39
|
-
namespaces
|
40
|
-
end
|
41
|
-
|
42
|
-
def commands
|
43
|
-
Transcriptic::Command.commands
|
44
|
-
end
|
45
|
-
|
46
|
-
def legacy_help_for_namespace(namespace)
|
47
|
-
instance = Transcriptic::Command::Help.groups.map do |group|
|
48
|
-
[ group.title, group.select { |c| c.first =~ /^#{namespace}/ }.length ]
|
49
|
-
end.sort_by { |l| l.last }.last
|
50
|
-
return nil unless instance
|
51
|
-
return nil if instance.last.zero?
|
52
|
-
instance.first
|
53
|
-
end
|
54
|
-
|
55
|
-
def primary_namespaces
|
56
|
-
PRIMARY_NAMESPACES.map { |name| namespaces[name] }.compact
|
57
|
-
end
|
58
|
-
|
59
|
-
def additional_namespaces
|
60
|
-
(namespaces.values - primary_namespaces)
|
61
|
-
end
|
62
|
-
|
63
|
-
def summary_for_namespaces(namespaces)
|
64
|
-
size = longest(namespaces.map { |n| n[:name] })
|
65
|
-
namespaces.sort_by {|namespace| namespace[:name]}.each do |namespace|
|
66
|
-
name = namespace[:name]
|
67
|
-
namespace[:description]
|
68
|
-
puts " %-#{size}s # %s" % [ name, namespace[:description] ]
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
def help_for_root
|
73
|
-
puts "Usage: transcriptic COMMAND [command-specific-options]"
|
74
|
-
puts
|
75
|
-
puts "Primary help topics, type \"transcriptic help TOPIC\" for more details:"
|
76
|
-
puts
|
77
|
-
summary_for_namespaces(primary_namespaces)
|
78
|
-
puts
|
79
|
-
puts "Additional topics:"
|
80
|
-
puts
|
81
|
-
summary_for_namespaces(additional_namespaces)
|
82
|
-
puts
|
83
|
-
end
|
84
|
-
|
85
|
-
def help_for_namespace(name)
|
86
|
-
namespace_commands = commands_for_namespace(name)
|
87
|
-
|
88
|
-
unless namespace_commands.empty?
|
89
|
-
size = longest(namespace_commands.map { |c| c[:banner] })
|
90
|
-
namespace_commands.sort_by { |c| c[:banner].to_s }.each do |command|
|
91
|
-
next if command[:help] =~ /DEPRECATED/
|
92
|
-
command[:summary]
|
93
|
-
puts " %-#{size}s # %s" % [ command[:banner], command[:summary] ]
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
def help_for_command(name)
|
99
|
-
if command_alias = Transcriptic::Command.command_aliases[name]
|
100
|
-
display("Alias: #{name} redirects to #{command_alias}")
|
101
|
-
name = command_alias
|
102
|
-
end
|
103
|
-
if command = commands[name]
|
104
|
-
puts "Usage: transcriptic #{command[:banner]}"
|
105
|
-
|
106
|
-
if command[:help].strip.length > 0
|
107
|
-
puts command[:help].split("\n")[1..-1].join("\n")
|
108
|
-
end
|
109
|
-
puts
|
110
|
-
end
|
111
|
-
|
112
|
-
if commands_for_namespace(name).size > 0
|
113
|
-
puts "Additional commands, type \"transcriptic help COMMAND\" for more details:"
|
114
|
-
puts
|
115
|
-
help_for_namespace(name)
|
116
|
-
puts
|
117
|
-
elsif command.nil?
|
118
|
-
error "#{name} is not a transcriptic command. See `transcriptic help`."
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
|
-
end
|
123
|
-
|
124
|
-
end
|
@@ -1,35 +0,0 @@
|
|
1
|
-
# login, logout, and view your api token
|
2
|
-
#
|
3
|
-
class Transcriptic::Command::Auth < Transcriptic::Command::Base
|
4
|
-
|
5
|
-
# auth:login
|
6
|
-
#
|
7
|
-
# log in with your transcriptic account
|
8
|
-
#
|
9
|
-
def login
|
10
|
-
Transcriptic::Auth.login
|
11
|
-
display "Authentication successful."
|
12
|
-
end
|
13
|
-
|
14
|
-
alias_command "login", "auth:login"
|
15
|
-
|
16
|
-
# auth:logout
|
17
|
-
#
|
18
|
-
# clear local authentication credentials
|
19
|
-
#
|
20
|
-
def logout
|
21
|
-
Transcriptic::Auth.logout
|
22
|
-
display "Local credentials cleared."
|
23
|
-
end
|
24
|
-
|
25
|
-
alias_command "logout", "auth:logout"
|
26
|
-
|
27
|
-
# auth:token
|
28
|
-
#
|
29
|
-
# display your api token
|
30
|
-
#
|
31
|
-
def token
|
32
|
-
display Transcriptic::Auth.api_key
|
33
|
-
end
|
34
|
-
|
35
|
-
end
|
@@ -1,108 +0,0 @@
|
|
1
|
-
require 'zipruby'
|
2
|
-
require 'net/http/post/multipart'
|
3
|
-
|
4
|
-
module Transcriptic::Command
|
5
|
-
|
6
|
-
# upload and run a protocol
|
7
|
-
#
|
8
|
-
class Run < Base
|
9
|
-
|
10
|
-
# run [FILENAME|DIRECTORY]
|
11
|
-
#
|
12
|
-
# upload FILENAME or DIRECTORY and launch it
|
13
|
-
#
|
14
|
-
def index
|
15
|
-
path = args.shift
|
16
|
-
fd = create_protocol_fd_for_path(path)
|
17
|
-
if 1 == fd
|
18
|
-
error "Couldn't create run!"
|
19
|
-
end
|
20
|
-
display "Uploading `#{path}` to Transcriptic..."
|
21
|
-
run_id = transcriptic.create_run(fd)["run_id"]
|
22
|
-
display "Run launched (#{run_id})"
|
23
|
-
end
|
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
|
76
|
-
def create_protocol_fd_for_path(path)
|
77
|
-
begin
|
78
|
-
stat = File.stat(path)
|
79
|
-
rescue
|
80
|
-
display "No such path: #{path}"
|
81
|
-
return 1
|
82
|
-
end
|
83
|
-
upfile = Tempfile.new('protocol')
|
84
|
-
if stat.directory?
|
85
|
-
files = Pathname.glob("#{path}/**/**")
|
86
|
-
file_count = files.reject(&:directory?).length
|
87
|
-
dir_count = files.reject(&:file?).length
|
88
|
-
display "Package detected, compressing #{file_count} files (#{dir_count} directories)..."
|
89
|
-
Zip::Archive.open(upfile.path, Zip::CREATE) do |ar|
|
90
|
-
ar.add_dir(path)
|
91
|
-
Dir.glob("#{path}/**/**").each do |path|
|
92
|
-
if File.directory?(path)
|
93
|
-
ar.add_dir(path)
|
94
|
-
else
|
95
|
-
ar.add_file(path, path)
|
96
|
-
end
|
97
|
-
end
|
98
|
-
end
|
99
|
-
else
|
100
|
-
Zip::Archive.open(upfile.path, Zip::CREATE) do |ar|
|
101
|
-
ar.add_file(path, path)
|
102
|
-
end
|
103
|
-
end
|
104
|
-
upfile
|
105
|
-
end
|
106
|
-
|
107
|
-
end
|
108
|
-
end
|