require "thor" require "open-uri" require 'bundler' class InvocaGems::Cli < Thor desc "graph", "show graph of gem dependencies" def graph InvocaGems::Presenter.with_presenter do |presenter| presenter.message "Generating Dependency Graph" bw = InvocaGems::Bundler.new `open #{bw.dependencies_yuml_url}` end end desc "edit GEM", "configure a gem for local editing" def edit(gem_name) InvocaGems::Presenter.with_presenter do |presenter| presenter.set_task "Configuring #{gem_name}" gem = InvocaGems::Gem.new(gem_name, presenter) gem.edit presenter.set_subtask("done") presenter.message("#{gem_name} is now available at #{gem.repo_directory}") end end desc "save GEM", "save gem changes" option :commit_message def save(gem_name) InvocaGems::Presenter.with_presenter do |presenter| presenter.set_task "Saving changes to #{gem_name}" gem = InvocaGems::Gem.new(gem_name, presenter) gem.save(options[:commit_message]) presenter.message "Done" end end desc "update GEM VERSION SHA", "updates a gem" def update(gem_name, version, sha) InvocaGems::Presenter.with_presenter do |presenter| gem = InvocaGems::Gem.new(gem_name, presenter) gem.update_version(version, sha) end end desc "has_unsaved_changes GEM", "reports if the gem has changes" def has_unsaved_changes(gem_name) InvocaGems::Presenter.with_presenter do |presenter| gem = InvocaGems::Gem.new(gem_name, presenter) if gem.git_repo.unsaved_changes? presenter.message "found unsaved changes" else presenter.message "no unsaved changes" end end end desc "show_changes", "show committed and pushed changes for the gem" def show_changes InvocaGems::Presenter.with_presenter do |presenter| bw = InvocaGems::Bundler.new bw.invoca_source_names.each do |gem_name| presenter.set_task("#{gem_name}") gem = InvocaGems::Gem.new(gem_name, presenter) if gem.repo_exists? && gem.git_repo.branch_exists?(gem.local_branch_name) # TODO - check for differences with master url = gem.uri.gsub("git@github.com:", "https://github.com/").gsub(".git","") + "/compare/#{gem.local_branch_name}" `open #{url}` presenter.set_subtask(url) else presenter.clear_task(keep: false) end end presenter.message("done") end end desc "list", "display the available invoca gems" def list InvocaGems::Presenter.with_presenter do |presenter| presenter.silence do format = " %-30s %10s %-60s" bw = InvocaGems::Bundler.new puts puts format % ["Name", "Version", "Status"] puts format % ["="*30, "="*10, "="*60] bw.invoca_source_names.each do |gem_name| gem = InvocaGems::Gem.new(gem_name, presenter) status = if gem.path presenter.using_mode( :green, "open for editing at #{gem.path}" ) else "#{gem.sha[0..6]} for #{gem.uri}" end puts format % [gem.name, gem.version, status] end puts end end end end