Skip to content
This repository has been archived by the owner on Jun 21, 2022. It is now read-only.

Commit

Permalink
Added configuration generation
Browse files Browse the repository at this point in the history
Commands moved to classes
Changed localization class
  • Loading branch information
Strech (Sergey Fedorov) committed Aug 12, 2014
1 parent 24f7830 commit 62ec01c
Show file tree
Hide file tree
Showing 21 changed files with 737 additions and 416 deletions.
4 changes: 1 addition & 3 deletions abak-flow.gemspec
Expand Up @@ -20,15 +20,13 @@ Gem::Specification.new do |gem|
gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
gem.require_paths = ["lib"]

gem.add_runtime_dependency "octokit", "~> 1.19.0"
gem.add_runtime_dependency "octokit", "~> 3.1.0"
gem.add_runtime_dependency "git", "~> 1.2.5"
gem.add_runtime_dependency "commander", "~> 4.1.6"
gem.add_runtime_dependency "ruler", "~> 1.4.2"
gem.add_runtime_dependency "i18n", "~> 0.6.9"
gem.add_runtime_dependency "ansi", "~> 1.4.3"

gem.add_runtime_dependency "faraday", "= 0.8.9" # TODO : remove after octokit upgrade

gem.add_development_dependency "cane"
gem.add_development_dependency "simplecov"
gem.add_development_dependency "rspec", "~> 2.14"
Expand Down
32 changes: 18 additions & 14 deletions lib/abak-flow.rb
@@ -1,23 +1,27 @@
# coding: utf-8

require "ansi/code"
require "commander/blank"
require "commander/command"

module Abak
module Flow
end
end

require "abak-flow/version"
require "abak-flow/locale"
require "abak-flow/manager"
require "abak-flow/configuration"
require "abak-flow/repository"
require "abak-flow/branch"
require "abak-flow/pull_request"
require "abak-flow/visitor"
require "abak-flow/inspector"
require "abak-flow/errors_presenter"
require "abak-flow/commands/checkup"
require "abak-flow/commands/compare"
require "abak-flow/commands/configure"
require "abak-flow/commands/publish"
require "abak-flow/commands/done"


# Может пригодится
# module ::Faraday
# class Response::RaiseOctokitError < Response::Middleware
# def error_message_with_trace(response)
# message = (response[:body].errors || []).map {|error| "=> #{error.code}: #{error.message}" }.join("\n")

# [error_message_without_trace(response), message].reject { |m| m.empty? }.join("\n\nДополнительные сообщения:\n")
# end
# alias_method :error_message_without_trace, :error_message
# alias_method :error_message, :error_message_with_trace
# end
# end
Abak::Flow::Manager.locale
19 changes: 9 additions & 10 deletions lib/abak-flow/branch.rb
Expand Up @@ -20,9 +20,8 @@ class Branch
attr_reader :task

def initialize(branch)
@manager = Manager.instance
@branch = branch.is_a?(Git::Branch) ? branch
: @manager.git.branch(branch)
: Manager.git.branch(branch)

parse_branch_name
end
Expand All @@ -43,11 +42,11 @@ def to_s
end

def compare_link(branch)
diff = "#{@manager.repository.upstream.owner}:#{branch}...#{@branch}"
diff = "#{Manager.repository.upstream.owner}:#{branch}...#{@branch}"

File.join [
@manager.github.web_endpoint,
@manager.repository.origin.to_s,
Manager.github.web_endpoint,
Manager.repository.origin.to_s,
"compare", diff
]
end
Expand All @@ -72,13 +71,13 @@ def extract_body
end

def update
origin = @manager.repository.origin.repo
@manager.git.push(origin, @branch)
origin = Manager.repository.origin.repo
Manager.git.push(origin, @branch)
end

def delete_on_remote
origin = @manager.repository.origin.repo
@manager.git.push(origin, ":#{@branch}")
origin = Manager.repository.origin.repo
Manager.git.push(origin, ":#{@branch}")
end

def delete_on_local
Expand Down Expand Up @@ -114,7 +113,7 @@ def current?
end

def valid?
!@branch.name.empty?
!@branch.name.strip.empty?
end

private
Expand Down
25 changes: 11 additions & 14 deletions lib/abak-flow/commands/checkup.rb
@@ -1,27 +1,24 @@
# coding: utf-8
require "ansi/code"

module Abak::Flow
module Commands
class Checkup

def initialize
manager = Manager.instance

@configuration = manager.configuration
@repository = manager.repository
end
include ANSI::Code

def run(args, options)
process(args, options)
say ANSI.green { I18n.t("commands.checkup.success") }

say green { Manager.locale.success(self) }
end

def process(args, options)
Visitor.new(@configuration, @repository,
command: "checkup", call: :ready?, inspect: :errors)
.on_fail(exit: 1)
inspector = Inspector.new(call_method: :valid?, collect_attribute: :errors)
inspector.examine(Manager.configuration, Manager.repository).on_fail do |insp|
say red { Manager.locale.error(self) }
say yellow { insp.output }

exit 100
end
end
end # class Checkup
end # module Commands
end # module Abak::Flow
end # module Abak::Flow
38 changes: 14 additions & 24 deletions lib/abak-flow/commands/compare.rb
@@ -1,45 +1,35 @@
# coding: utf-8
require "commander/blank"
require "commander/command"
require "ansi/code"
# 101 exit code available

module Abak::Flow
module Commands
class Compare
# TODO : Быть может стоит сделать include ANSI

def initialize
manager = Manager.instance

@configuration = manager.configuration
@repository = manager.repository
@git = manager.git
end
include ANSI::Code

def run(args, options)
Checkup.new.process(
Array.new, ::Commander::Command::Options.new)
Checkup.new.process(Array.new, ::Commander::Command::Options.new)

current = @git.current_branch
current = Manager.git.current_branch
head = Branch.new(options.head || current)
base = Branch.new(options.base || head.extract_base_name)

if head.current?
say ANSI.white {
I18n.t("commands.compare.updating",
branch: ANSI.bold { head },
upstream: ANSI.bold { "#{@repository.origin}" }) }
say white {
Manager.locale.word(self, 'updating',
branch: bold { head },
upstream: bold { "#{Manager.repository.origin}" })
}

head.update
else
say ANSI.yellow {
I18n.t("commands.compare.diverging",
branch: ANSI.bold { head }) }
say yellow {
Manager.locale.word(self, 'diverging', branch: bold { head })
}
end

say ANSI.green { head.compare_link(base) }
say green { head.compare_link(base) }
end

end
end
end
end
108 changes: 108 additions & 0 deletions lib/abak-flow/commands/configure.rb
@@ -0,0 +1,108 @@
# coding: utf-8
require "octokit"

module Abak::Flow
module Commands
class Configure
include ANSI::Code

def run(args, options)
process(args, options)

puts
say green { Manager.locale.success(self) }
end

def process(args, options)
interview

password_hash = deffered do
client = Octokit::Client.new(login: @login, password: @password)
response = client.create_authorization(
scopes: ["repo"], note: "abak-flow",
note_url: "https://github.com/Strech/abak-flow",
headers: @headers)

response[:token]
end

Manager.configuration.rewrite(
login: @login, password: password_hash,
locale: @locale, http_proxy: @http_proxy)
end

private

def interview
@login = ask("#{Manager.locale.word(self, 'email')}: ")
@password = password("#{Manager.locale.word(self, 'password')}: ", nil)
@locale = choose("#{Manager.locale.word(self, 'locale')}:\n", :en, :ru)
@http_proxy = ask("#{Manager.locale.word(self, 'http_proxy')}: ")
@headers = {}
end

def otp_interview
@headers = {"X-GitHub-OTP" => ask("#{Manager.locale.word(self, 'sms_otp')}: ")}
end

# TODO : Refactor to object
def deffered(&block)
progressbar.show
thread = Thread.new do
Thread.current[:result] = suppress { block.call }
end

loop do
progressbar.increment
break if thread.status === false

if thread.status.nil?
progressbar.erase_line
say red { Manager.locale.error(self, 'execution_failed') }

exit 102
end

sleep 0.3
end

case thread[:result]
when Octokit::OneTimePasswordRequired
progressbar.erase_line
otp_interview

return deffered(&block)
when NilClass
progressbar.erase_line
say red { Manager.locale.error(self, 'empty_response') }

exit 103
when Exception
progressbar.erase_line
say red { thread[:result].message }

exit 104
else
# no-op
end

thread[:result]
end

def progressbar
@progressbar ||= Commander::UI::ProgressBar.new(100,
progress_str: ".", incomplete_str: " ", format: ":title:progress_bar",
complete_message: "", title: Manager.locale.word(self, 'configuring'))
end

def suppress(&block)
begin
block.call
rescue => error
error
end
end

end # class Configure
end # module Commands
end # module Abak::Flow

0 comments on commit 62ec01c

Please sign in to comment.