lib/morph-cli.rb in morph-cli-0.0.1 vs lib/morph-cli.rb in morph-cli-0.0.2
- old
+ new
@@ -1,5 +1,93 @@
require "morph-cli/version"
module MorphCLI
- # Your code goes here...
+ def self.execute(directory, development, env_config)
+ puts "Uploading and running..."
+ file = MorphCLI.create_tar(directory, MorphCLI.all_paths(directory))
+ result = RestClient.post("#{env_config[:base_url]}/run", :api_key => env_config[:api_key], :code => file)
+ # Interpret each line separately as json
+ result.split("\n").each do |line|
+ a = JSON.parse(line)
+ if a["stream"] == "stdout"
+ s = $stdout
+ elsif a["stream"] == "stderr"
+ s = $stderr
+ else
+ raise "Unknown stream"
+ end
+ s.puts a["text"]
+ end
+ end
+
+ def self.config_path
+ File.join(Dir.home, ".morph")
+ end
+
+ def self.save_config(config)
+ File.open(config_path, "w") {|f| f.write config.to_yaml}
+ File.chmod(0600, config_path)
+ end
+
+ DEFAULT_CONFIG = {
+ development: {
+ base_url: "http://127.0.0.1:3000"
+ },
+ production: {
+ base_url: "https://morph.io"
+ }
+ }
+
+ def self.load_config
+ if File.exists?(config_path)
+ YAML.load(File.read(config_path))
+ else
+ DEFAULT_CONFIG
+ end
+ end
+
+ def self.in_directory(directory)
+ cwd = FileUtils.pwd
+ FileUtils.cd(directory)
+ yield
+ ensure
+ FileUtils.cd(cwd)
+ end
+
+ def self.create_tar(directory, paths)
+ tempfile = File.new('/tmp/out', 'wb')
+
+ in_directory(directory) do
+ begin
+ tar = Archive::Tar::Minitar::Output.new("/tmp/out")
+ paths.each do |entry|
+ Archive::Tar::Minitar.pack_file(entry, tar)
+ end
+ ensure
+ tar.close
+ end
+ end
+ File.new('/tmp/out', 'r')
+ end
+
+ # Relative paths to all the files in the given directory (recursive)
+ # (except for anything below a directory starting with ".")
+ def self.all_paths(directory)
+ result = []
+ Find.find(directory) do |path|
+ if FileTest.directory?(path)
+ if File.basename(path)[0] == ?.
+ Find.prune
+ end
+ else
+ result << Pathname.new(path).relative_path_from(Pathname.new(directory)).to_s
+ end
+ end
+ result
+ end
+
+ # Relative path of database file (if it exists)
+ def self.database_path(directory)
+ path = "data.sqlite"
+ path if File.exists?(File.join(directory, path))
+ end
end