diff --git a/install.rb b/install.rb index 4d7cad6..a6ce82d 100644 --- a/install.rb +++ b/install.rb @@ -1,52 +1,57 @@ +# coding: utf-8 require "net/http" require "uri" -require "yaml" require 'fileutils' -sentry_uri = URI.parse("https://raw.githubusercontent.com/samueleaton/sentry/master/src/sentry.cr") -response = Net::HTTP.get_response(sentry_uri) - -if response.code.to_i > 299 - puts "HTTP request error" - puts response.msg - exit 1 -end - -sentry_code = response.body - -sentry_cli_uri = URI.parse("https://raw.githubusercontent.com/samueleaton/sentry/master/src/sentry_cli.cr") -response = Net::HTTP.get_response(sentry_cli_uri) - -if response.code.to_i > 299 - puts "HTTP request error" - puts response.msg - exit 1 +USER = "samueleaton" +BRANCH = "master" + +DEST_DIR = "./dev" +MAIN_FILE = "sentry_cli.cr" +BIN = "./sentry" + +REMOTE_SOURCES = [ + "https://raw.githubusercontent.com/#{USER}/sentry/#{BRANCH}/src/sentry.cr", + "https://raw.githubusercontent.com/#{USER}/sentry/#{BRANCH}/src/sentry_cli.cr", + "https://raw.githubusercontent.com/#{USER}/sentry/#{BRANCH}/src/sentry_command.cr" +] + +sources = {} + +STDOUT.write "Getting sources : " + +REMOTE_SOURCES.each do |source_uri| + uri = URI.parse source_uri + response = Net::HTTP.get_response uri + if response.code.to_i > 299 + STDERR.puts "HTTP request error for #{File.basename source_uri}" + STDERR.puts "URL : #{source_uri}" + STDERR.puts "Error message : #{response.msg}" + exit 1 + else + STDOUT.write '.' + sources[File.basename source_uri] = response.body + end end +puts -sentry_cli_code = response.body +FileUtils.mkdir_p DEST_DIR -begin - shard_yml = YAML.load(File.read "./shard.yml") - raise "missing key in shard.yml: name" unless shard_yml.has_key? "name" -rescue => e - puts "Error with shard.yml" - puts e - exit 1 +sources.each do |filename, content| + File.write "#{DEST_DIR}/#{filename}", content end -process_name = shard_yml["name"] -sentry_code.gsub!(/\[process_name\]/, process_name) -sentry_cli_code.gsub!(/\[process_name\]/, process_name) - -FileUtils.mkdir_p "./dev" -File.write "./dev/sentry.cr", sentry_code -File.write "./dev/sentry_cli.cr", sentry_cli_code puts "Compiling sentry..." -system "crystal build --release ./dev/sentry_cli.cr -o ./sentry" +system "crystal build --release #{DEST_DIR}/#{MAIN_FILE} -o #{BIN}" puts "🤖 sentry installed!" -puts "\nTo run, do (from your app's root directory): - ./sentry\n" -puts "\nTo see options: - ./sentry --help\n\n" +puts " +To run, do (from your app's root directory): + #{BIN} +" +puts " +To see options: + #{BIN} --help + +" diff --git a/shard.yml b/shard.yml index 11fbe4b..3ede2ae 100644 --- a/shard.yml +++ b/shard.yml @@ -5,3 +5,8 @@ authors: - Sam Eaton license: ISC + +dependencies: + cli: + github: mosop/cli + branch: master diff --git a/src/sentry_cli.cr b/src/sentry_cli.cr index 43af183..f5f11fe 100644 --- a/src/sentry_cli.cr +++ b/src/sentry_cli.cr @@ -1,85 +1,3 @@ -require "option_parser" -require "./sentry" +require "./sentry_command" -process_name = "[process_name]" -build_command = "crystal build ./src/[process_name].cr" -build_args = [] of String -run_command = "./[process_name]" -run_args = [] of String -files = ["./src/**/*.cr", "./src/**/*.ecr"] -files_cleared = false -show_help = false -should_build = true - -OptionParser.parse! do |parser| - parser.banner = "Usage: ./sentry [options]" - parser.on( - "-n NAME", - "--name=NAME", - "Sets the name of the app process (current name: #{process_name})") { |name| process_name = name } - parser.on( - "-b COMMAND", - "--build=COMMAND", - "Overrides the default build command") { |command| build_command = command } - parser.on( - "--build-args=ARGS", - "Specifies arguments for the build command") do |args| - args_arr = args.strip.split(" ") - build_args = args_arr if args_arr.size > 0 - end - parser.on( - "--no-build", - "Skips the build step") { should_build = false } - parser.on( - "-r COMMAND", - "--run=COMMAND", - "Overrides the default run command") { |command| run_command = command } - parser.on( - "--run-args=ARGS", - "Specifies arguments for the run command") do |args| - args_arr = args.strip.split(" ") - run_args = args_arr if args_arr.size > 0 - end - parser.on( - "-w FILE", - "--watch=FILE", - "Overrides default files and appends to list of watched files") do |file| - unless files_cleared - files.clear - files_cleared = true - end - files << file - end - parser.on( - "-i", - "--info", - "Shows the values for build/run commands, build/run args, and watched files") do - puts " - name: #{process_name} - build: #{build_command} - build args: #{build_args} - run: #{run_command} - run args: #{run_args} - files: #{files} - " - end - parser.on( - "-h", - "--help", - "Show this help") do - puts parser - exit 0 - end -end - -process_runner = Sentry::ProcessRunner.new( - process_name: process_name, - build_command: build_command, - run_command: run_command, - build_args: build_args, - run_args: run_args, - should_build: should_build, - files: files -) - -process_runner.run +Sentry::SentryCommand.run ARGV diff --git a/src/sentry_command.cr b/src/sentry_command.cr new file mode 100644 index 0000000..4b85dae --- /dev/null +++ b/src/sentry_command.cr @@ -0,0 +1,103 @@ +require "yaml" +require "cli" + +require "./sentry" + +module Sentry + + class SentryCommand < Cli::Command + + command_name "sentry" + + SHARD_YML = "shard.yml" + DEFAULT_NAME = "[process_name]" + + class Options + + def self.defaults + name = Options.get_name + { + name: name, + process_name: "./#{name}", + build: "crystal build ./src/#{name}.cr", + watch: ["./src/**/*.cr", "./src/**/*.ecr"] + } + end + + def self.get_name + if File.exists?(SHARD_YML) && + (yaml = YAML.parse(File.read SHARD_YML)) && + (name = yaml["name"]?) + name.as_s + else + DEFAULT_NAME + end + end + + string %w(-n --name), desc: "Sets the name of the app process", + default: Options.defaults[:name] + + string %w(-b --build), desc: "Overrides the default build command", + default: Options.defaults[:build] + + string "--build-args", desc: "Specifies arguments for the build command" + + bool "--no-build", desc: "Skips the build step", default: false + + string %w(-r --run), desc: "Overrides the default run command", + default: Options.defaults[:process_name] + + string "--run-args", desc: "Specifies arguments for the run command" + + array %w(-w --watch), + desc: "Overrides default files and appends to list of watched files", + default: Options.defaults[:watch] + + bool %w(-i --info), + desc: "Shows the values for build/run commands, build/run args, and watched files", + default: false + + help + + end + + def run + + if options.info? + puts " + name: #{options.name?} + build: #{options.build?} + build args: #{options.build_args?} + run: #{options.run?} + run args: #{options.run_args?} + files: #{options.watch?} + " + exit! code: 0 + end + + build_args = if ba = options.build_args? + ba.split " " + else + [] of String + end + run_args = if ra = options.run_args? + ra.split " " + else + [] of String + end + + process_runner = Sentry::ProcessRunner.new( + process_name: options.name, + build_command: options.build, + run_command: options.run, + build_args: build_args, + run_args: run_args, + should_build: !options.no_build?, + files: options.watch + ) + + process_runner.run + + end + end +end