Merge pull request #41 from muratayusuke/feature/rubocop

Feature/rubocop
This commit is contained in:
Yusuke Murata
2013-06-20 16:44:12 -07:00
8 changed files with 154 additions and 140 deletions

View File

@@ -12,4 +12,7 @@ group :development do
gem "rcov", :platforms => :mri_18
gem "simplecov", :platforms => :mri_19
gem "test-construct"
if RUBY_VERSION >= '1.9.2'
gem "rubocop"
end
end

View File

@@ -1,6 +1,7 @@
GEM
remote: https://rubygems.org/
specs:
ast (1.1.0)
diff-lcs (1.2.4)
git (1.2.5)
jeweler (1.8.4)
@@ -10,6 +11,10 @@ GEM
rdoc
json (1.8.0)
multi_json (1.7.3)
parser (2.0.0.beta5)
ast (~> 1.0)
slop (~> 3.4)
rainbow (1.1.4)
rake (10.0.4)
rcov (1.0.0)
rdoc (4.0.1)
@@ -22,10 +27,14 @@ GEM
rspec-expectations (2.13.0)
diff-lcs (>= 1.1.3, < 2.0)
rspec-mocks (2.13.1)
rubocop (0.8.3)
parser (= 2.0.0.beta5)
rainbow (>= 1.1.4)
simplecov (0.7.1)
multi_json (~> 1.0)
simplecov-html (~> 0.7.1)
simplecov-html (0.7.1)
slop (3.4.5)
test-construct (1.2.0)
thor (0.18.1)
@@ -37,6 +46,7 @@ DEPENDENCIES
rake (>= 0.8.7)
rcov
rspec (~> 2.10)
rubocop
simplecov
test-construct
thor (>= 0.14.0)

View File

@@ -41,8 +41,18 @@ RSpec::Core::RakeTask.new(:rcov) do |spec|
spec.rcov = true
end
task :rubocop do
if RUBY_VERSION >= '1.9.2'
system('rubocop')
end
end
task :default => :spec
task :test do
Rake::Task['spec'].execute
Rake::Task['rubocop'].execute
end
task :default => :test
require 'rdoc/task'
Rake::RDocTask.new do |rdoc|

View File

@@ -2,7 +2,7 @@
require 'pathname'
lib = Pathname.new(__FILE__).dirname.join('..', 'lib').expand_path
$LOAD_PATH.unshift lib.to_s
$LOAD_PATH.unshift lib.to_s
require 'homesick'

View File

@@ -10,14 +10,14 @@ class Homesick < Thor
add_runtime_options!
GITHUB_NAME_REPO_PATTERN = /\A([A-Za-z_-]+\/[A-Za-z_-]+)\Z/
SUBDIR_FILENAME = ".homesick_subdir"
SUBDIR_FILENAME = '.homesick_subdir'
def initialize(args=[], options={}, config={})
def initialize(args = [], options = {}, config = {})
super
self.shell = Homesick::Shell.new
end
desc "clone URI", "Clone +uri+ as a castle for homesick"
desc 'clone URI', 'Clone +uri+ as a castle for homesick'
def clone(uri)
inside repos_dir do
destination = nil
@@ -33,7 +33,7 @@ class Homesick < Thor
elsif uri =~ GITHUB_NAME_REPO_PATTERN
destination = Pathname.new($1)
git_clone "git://github.com/#{$1}.git", :destination => destination
elsif uri =~ /\/([^\/]*?)(\.git)?\Z/
elsif uri =~ /%r([^%r]*?)(\.git)?\Z/
destination = Pathname.new($1)
git_clone uri
elsif uri =~ /[^:]+:([^:]+)(\.git)?\Z/
@@ -54,20 +54,20 @@ class Homesick < Thor
if homesickrc.exist?
proceed = shell.yes?("#{uri} has a .homesickrc. Proceed with evaling it? (This could be destructive)")
if proceed
shell.say_status "eval", homesickrc
shell.say_status 'eval', homesickrc
inside destination do
eval homesickrc.read, binding, homesickrc.expand_path
end
else
shell.say_status "eval skip", "not evaling #{homesickrc}, #{destination} may need manual configuration", :blue
shell.say_status 'eval skip', "not evaling #{homesickrc}, #{destination} may need manual configuration", :blue
end
end
end
end
desc "pull CASTLE", "Update the specified castle"
method_option :all, :type => :boolean, :default => false, :required => false, :desc => "Update all cloned castles"
def pull(name="")
desc 'pull CASTLE', 'Update the specified castle'
method_option :all, :type => :boolean, :default => false, :required => false, :desc => 'Update all cloned castles'
def pull(name = '')
if options[:all]
inside_each_castle do |castle|
shell.say castle.to_s.gsub(repos_dir.to_s + '/', '') + ':'
@@ -79,22 +79,22 @@ class Homesick < Thor
end
desc "commit CASTLE", "Commit the specified castle's changes"
desc 'commit CASTLE', "Commit the specified castle's changes"
def commit(name)
commit_castle name
end
desc "push CASTLE", "Push the specified castle"
desc 'push CASTLE', 'Push the specified castle'
def push(name)
push_castle name
end
desc "symlink CASTLE", "Symlinks all dotfiles from the specified castle"
method_option :force, :default => false, :desc => "Overwrite existing conflicting symlinks without prompting."
desc 'symlink CASTLE', 'Symlinks all dotfiles from the specified castle'
method_option :force, :default => false, :desc => 'Overwrite existing conflicting symlinks without prompting.'
def symlink(name)
check_castle_existance(name, "symlink")
check_castle_existance(name, 'symlink')
inside castle_dir(name) do
subdirs = subdirs(name)
@@ -109,7 +109,7 @@ class Homesick < Thor
end
end
desc "track FILE CASTLE", "add a file to a castle"
desc 'track FILE CASTLE', 'add a file to a castle'
def track(file, castle)
castle = Pathname.new(castle)
file = Pathname.new(file.chomp('/'))
@@ -149,24 +149,22 @@ class Homesick < Thor
end
# are we tracking something nested? Add the parent dir to the manifest
unless relative_dir.eql?(Pathname.new('.'))
subdir_add(castle, relative_dir)
end
subdir_add(castle, relative_dir) unless relative_dir.eql?(Pathname.new('.'))
end
desc "list", "List cloned castles"
desc 'list', 'List cloned castles'
def list
inside_each_castle do |castle|
say_status castle.relative_path_from(repos_dir).to_s, `git config remote.origin.url`.chomp, :cyan
end
end
desc "generate PATH", "generate a homesick-ready git repo at PATH"
desc 'generate PATH', 'generate a homesick-ready git repo at PATH'
def generate(castle)
castle = Pathname.new(castle).expand_path
github_user = `git config github.user`.chomp
github_user = nil if github_user == ""
github_user = nil if github_user == ''
github_repo = castle.basename
empty_directory castle
@@ -177,7 +175,7 @@ class Homesick < Thor
git_remote_add 'origin', url
end
empty_directory "home"
empty_directory 'home'
end
end
@@ -208,7 +206,9 @@ class Homesick < Thor
dirs = Pathname.glob("#{repos_dir}/**/.git", File::FNM_DOTMATCH)
# reject paths that lie inside another castle, like git submodules
return dirs.reject do |dir|
dirs.any? {|other| dir != other && dir.fnmatch(other.parent.join('*').to_s) }
dirs.any? do |other|
dir != other && dir.fnmatch(other.parent.join('*').to_s)
end
end
end
@@ -222,7 +222,7 @@ class Homesick < Thor
end
def update_castle(castle)
check_castle_existance(castle, "pull")
check_castle_existance(castle, 'pull')
inside repos_dir.join(castle) do
git_pull
git_submodule_init
@@ -231,14 +231,14 @@ class Homesick < Thor
end
def commit_castle(castle)
check_castle_existance(castle, "commit")
check_castle_existance(castle, 'commit')
inside repos_dir.join(castle) do
git_commit_all
end
end
def push_castle(castle)
check_castle_existance(castle, "push")
check_castle_existance(castle, 'push')
inside repos_dir.join(castle) do
git_push
end
@@ -262,7 +262,9 @@ class Homesick < Thor
def subdir_add(castle, path)
subdir_filepath = subdir_file(castle)
File.open(subdir_filepath, 'a+') do |subdir|
subdir.puts path unless subdir.readlines.inject(false) { |memo, line| line.eql?("#{path.to_s}\n") || memo }
subdir.puts path unless subdir.readlines.reduce(false) do |memo, line|
line.eql?("#{path.to_s}\n") || memo
end
end
inside castle_dir(castle) do
@@ -308,7 +310,7 @@ class Homesick < Thor
def symlink_each(castle, basedir, subdirs)
absolute_basedir = Pathname.new(basedir).expand_path
inside basedir do
files = Pathname.glob('{.*,*}').reject{|a| [".", ".."].include?(a.to_s)}
files = Pathname.glob('{.*,*}').reject{ |a| ['.', '..'].include?(a.to_s) }
files.each do |path|
absolute_path = path.expand_path
castle_home = castle_dir(castle)

View File

@@ -16,13 +16,13 @@ class Homesick
end
end
def git_init(path = ".")
def git_init(path = '.')
path = Pathname.new(path)
inside path do
unless path.join('.git').exist?
if !path.join('.git').exist?
say_status 'git init', '' unless options[:quiet]
system "git init >/dev/null" unless options[:pretend]
system 'git init >/dev/null' unless options[:pretend]
else
say_status 'git init', 'already initialized', :blue unless options[:quiet]
end
@@ -33,7 +33,7 @@ class Homesick
existing_remote = `git config remote.#{name}.url`.chomp
existing_remote = nil if existing_remote == ''
unless existing_remote
if !existing_remote
say_status 'git remote', "add #{name} #{url}" unless options[:quiet]
system "git remote add #{name} #{url}" unless options[:pretend]
else
@@ -43,27 +43,27 @@ class Homesick
def git_submodule_init(config = {})
say_status 'git submodule', 'init', :green unless options[:quiet]
system "git submodule --quiet init" unless options[:pretend]
system 'git submodule --quiet init' unless options[:pretend]
end
def git_submodule_update(config = {})
say_status 'git submodule', 'update', :green unless options[:quiet]
system "git submodule --quiet update --init --recursive >/dev/null 2>&1" unless options[:pretend]
system 'git submodule --quiet update --init --recursive >/dev/null 2>&1' unless options[:pretend]
end
def git_pull(config = {})
say_status 'git pull', '', :green unless options[:quiet]
system "git pull --quiet" unless options[:pretend]
system 'git pull --quiet' unless options[:pretend]
end
def git_push(config = {})
say_status 'git push', '', :green unless options[:quiet]
system "git push" unless options[:pretend]
system 'git push' unless options[:pretend]
end
def git_commit_all(config = {})
say_status 'git commit all', '', :green unless options[:quiet]
system "git commit -v -a" unless options[:pretend]
system 'git commit -v -a' unless options[:pretend]
end
def git_add(file, config = {})

View File

@@ -1,236 +1,225 @@
require 'spec_helper'
require 'spec_helper'
describe "homesick" do
describe 'homesick' do
let(:home) { create_construct }
after { home.destroy! }
let(:castles) { home.directory(".homesick/repos") }
let(:castles) { home.directory('.homesick/repos') }
let(:homesick) { Homesick.new }
before { homesick.stub!(:repos_dir).and_return(castles) }
describe "clone" do
context "of a file" do
it "should symlink existing directories" do
describe 'clone' do
context 'of a file' do
it 'should symlink existing directories' do
somewhere = create_construct
local_repo = somewhere.directory('wtf')
homesick.clone local_repo
castles.join("wtf").readlink.should == local_repo
castles.join('wtf').readlink.should == local_repo
end
context "when it exists in a repo directory" do
context 'when it exists in a repo directory' do
before do
existing_castle = given_castle("existing_castle")
existing_castle = given_castle('existing_castle')
@existing_dir = existing_castle.parent
end
it "should not symlink" do
it 'should raise an error' do
homesick.should_not_receive(:git_clone)
homesick.clone @existing_dir.to_s rescue nil
end
it "should raise an error" do
expect { homesick.clone @existing_dir.to_s }.to raise_error(/already cloned/i)
end
end
end
it "should clone git repo like file:///path/to.git" do
bare_repo = File.join(create_construct.to_s, "dotfiles.git")
it 'should clone git repo like file:///path/to.git' do
bare_repo = File.join(create_construct.to_s, 'dotfiles.git')
system "git init --bare #{bare_repo} >/dev/null 2>&1"
homesick.clone "file://#{bare_repo}"
File.directory?(File.join(home.to_s, '.homesick/repos/dotfiles')).should be_true
end
it "should clone git repo like git://host/path/to.git" do
it 'should clone git repo like git://host/path/to.git' do
homesick.should_receive(:git_clone).with('git://github.com/technicalpickles/pickled-vim.git')
homesick.clone "git://github.com/technicalpickles/pickled-vim.git"
homesick.clone 'git://github.com/technicalpickles/pickled-vim.git'
end
it "should clone git repo like git@host:path/to.git" do
it 'should clone git repo like git@host:path/to.git' do
homesick.should_receive(:git_clone).with('git@github.com:technicalpickles/pickled-vim.git')
homesick.clone 'git@github.com:technicalpickles/pickled-vim.git'
end
it "should clone git repo like http://host/path/to.git" do
it 'should clone git repo like http://host/path/to.git' do
homesick.should_receive(:git_clone).with('http://github.com/technicalpickles/pickled-vim.git')
homesick.clone 'http://github.com/technicalpickles/pickled-vim.git'
end
it "should clone git repo like http://host/path/to" do
it 'should clone git repo like http://host/path/to' do
homesick.should_receive(:git_clone).with('http://github.com/technicalpickles/pickled-vim')
homesick.clone 'http://github.com/technicalpickles/pickled-vim'
end
it "should clone git repo like host-alias:repos.git" do
it 'should clone git repo like host-alias:repos.git' do
homesick.should_receive(:git_clone).with('gitolite:pickled-vim.git')
homesick.clone 'gitolite:pickled-vim.git'
end
it "should not try to clone a malformed uri like malformed" do
it 'should throw an exception when trying to clone a malformed uri like malformed' do
homesick.should_not_receive(:git_clone)
homesick.clone 'malformed' rescue nil
end
it "should throw an exception when trying to clone a malformed uri like malformed" do
expect { homesick.clone 'malformed' }.to raise_error
end
it "should clone a github repo" do
it 'should clone a github repo' do
homesick.should_receive(:git_clone).with('git://github.com/wfarr/dotfiles.git', :destination => Pathname.new('wfarr/dotfiles'))
homesick.clone "wfarr/dotfiles"
homesick.clone 'wfarr/dotfiles'
end
end
describe "symlink" do
let(:castle) { given_castle("glencairn") }
describe 'symlink' do
let(:castle) { given_castle('glencairn') }
it "links dotfiles from a castle to the home folder" do
dotfile = castle.file(".some_dotfile")
it 'links dotfiles from a castle to the home folder' do
dotfile = castle.file('.some_dotfile')
homesick.symlink("glencairn")
homesick.symlink('glencairn')
home.join(".some_dotfile").readlink.should == dotfile
home.join('.some_dotfile').readlink.should == dotfile
end
it "links non-dotfiles from a castle to the home folder" do
dotfile = castle.file("bin")
it 'links non-dotfiles from a castle to the home folder' do
dotfile = castle.file('bin')
homesick.symlink("glencairn")
homesick.symlink('glencairn')
home.join("bin").readlink.should == dotfile
home.join('bin').readlink.should == dotfile
end
context "when forced" do
context 'when forced' do
let(:homesick) { Homesick.new [], :force => true }
it "can override symlinks to directories" do
it 'can override symlinks to directories' do
somewhere_else = create_construct
existing_dotdir_link = home.join(".vim")
existing_dotdir_link = home.join('.vim')
FileUtils.ln_s somewhere_else, existing_dotdir_link
dotdir = castle.directory(".vim")
dotdir = castle.directory('.vim')
homesick.symlink("glencairn")
homesick.symlink('glencairn')
existing_dotdir_link.readlink.should == dotdir
end
it "can override existing directory" do
somewhere_else = create_construct
existing_dotdir = home.directory(".vim")
it 'can override existing directory' do
existing_dotdir = home.directory('.vim')
dotdir = castle.directory(".vim")
dotdir = castle.directory('.vim')
homesick.symlink("glencairn")
homesick.symlink('glencairn')
existing_dotdir.readlink.should == dotdir
end
end
context "with '.config' in .homesick_subdir" do
let(:castle) { given_castle("glencairn", [".config"]) }
it "can symlink in sub directory" do
dotdir = castle.directory(".config")
dotfile = dotdir.file(".some_dotfile")
let(:castle) { given_castle('glencairn', ['.config']) }
it 'can symlink in sub directory' do
dotdir = castle.directory('.config')
dotfile = dotdir.file('.some_dotfile')
homesick.symlink("glencairn")
homesick.symlink('glencairn')
home_dotdir = home.join(".config")
home_dotdir.symlink?.should == false
home_dotdir.join(".some_dotfile").readlink.should == dotfile
home_dotdir = home.join('.config')
home_dotdir.symlink?.should be == false
home_dotdir.join('.some_dotfile').readlink.should == dotfile
end
end
context "with '.config/appA' in .homesick_subdir" do
let(:castle) { given_castle("glencairn", [".config/appA"]) }
it "can symlink in nested sub directory" do
dotdir = castle.directory(".config").directory("appA")
dotfile = dotdir.file(".some_dotfile")
let(:castle) { given_castle('glencairn', ['.config/appA']) }
it 'can symlink in nested sub directory' do
dotdir = castle.directory('.config').directory('appA')
dotfile = dotdir.file('.some_dotfile')
homesick.symlink("glencairn")
homesick.symlink('glencairn')
home_dotdir = home.join(".config").join("appA")
home_dotdir.symlink?.should == false
home_dotdir.join(".some_dotfile").readlink.should == dotfile
home_dotdir = home.join('.config').join('appA')
home_dotdir.symlink?.should be == false
home_dotdir.join('.some_dotfile').readlink.should == dotfile
end
end
context "with '.config' and '.config/appA' in .homesick_subdir" do
let(:castle) { given_castle("glencairn", [".config", ".config/appA"]) }
it "can symlink under both of .config and .config/appA" do
config_dir = castle.directory(".config")
config_dotfile = config_dir.file(".some_dotfile")
appA_dir = config_dir.directory("appA")
appA_dotfile = appA_dir.file(".some_appfile")
context "with '.config' and '.config/someapp' in .homesick_subdir" do
let(:castle) { given_castle('glencairn', ['.config', '.config/someapp']) }
it 'can symlink under both of .config and .config/someapp' do
config_dir = castle.directory('.config')
config_dotfile = config_dir.file('.some_dotfile')
someapp_dir = config_dir.directory('someapp')
someapp_dotfile = someapp_dir.file('.some_appfile')
homesick.symlink("glencairn")
homesick.symlink('glencairn')
home_config_dir = home.join(".config")
home_appA_dir = home_config_dir.join("appA")
home_config_dir.symlink?.should == false
home_config_dir.join(".some_dotfile").readlink.should == config_dotfile
home_appA_dir.symlink?.should == false
home_appA_dir.join(".some_appfile").readlink.should == appA_dotfile
home_config_dir = home.join('.config')
home_someapp_dir = home_config_dir.join('someapp')
home_config_dir.symlink?.should be == false
home_config_dir.join('.some_dotfile').readlink.should be == config_dotfile
home_someapp_dir.symlink?.should be == false
home_someapp_dir.join('.some_appfile').readlink.should == someapp_dotfile
end
end
end
describe "list" do
it "should say each castle in the castle directory" do
describe 'list' do
it 'should say each castle in the castle directory' do
given_castle('zomg')
given_castle('wtf/zomg')
homesick.should_receive(:say_status).with("zomg", "git://github.com/technicalpickles/zomg.git", :cyan)
homesick.should_receive(:say_status).with("wtf/zomg", "git://github.com/technicalpickles/zomg.git", :cyan)
homesick.should_receive(:say_status).with('zomg', 'git://github.com/technicalpickles/zomg.git', :cyan)
homesick.should_receive(:say_status).with('wtf/zomg', 'git://github.com/technicalpickles/zomg.git', :cyan)
homesick.list
end
end
describe "pull" do
describe 'pull' do
xit "needs testing"
xit 'needs testing'
describe "--all" do
xit "needs testing"
describe '--all' do
xit 'needs testing'
end
end
describe "commit" do
describe 'commit' do
xit "needs testing"
xit 'needs testing'
end
describe "push" do
describe 'push' do
xit "needs testing"
xit 'needs testing'
end
describe "track" do
it "should move the tracked file into the castle" do
describe 'track' do
it 'should move the tracked file into the castle' do
castle = given_castle('castle_repo')
some_rc_file = home.file '.some_rc_file'
homesick.track(some_rc_file.to_s, 'castle_repo')
tracked_file = castle.join(".some_rc_file")
tracked_file = castle.join('.some_rc_file')
tracked_file.should exist
some_rc_file.readlink.should == tracked_file
@@ -258,7 +247,7 @@ describe "homesick" do
some_nested_dir.realpath.should == tracked_file.realpath
end
describe "subdir_file" do
describe 'subdir_file' do
it 'should add the nested files parent to the subdir_file' do
castle = given_castle('castle_repo')

View File

@@ -16,19 +16,19 @@ RSpec.configure do |config|
homesick.stub(:say_status)
end
def given_castle(path, subdirs=[])
def given_castle(path, subdirs = [])
name = Pathname.new(path).basename
castles.directory(path) do |castle|
Dir.chdir(castle) do
system "git init >/dev/null 2>&1"
system 'git init >/dev/null 2>&1'
system "git remote add origin git://github.com/technicalpickles/#{name}.git >/dev/null 2>&1"
if subdirs then
if subdirs
subdir_file = castle.join(Homesick::SUBDIR_FILENAME)
subdirs.each do |subdir|
system "echo #{subdir} >> #{subdir_file}"
end
end
return castle.directory("home")
return castle.directory('home')
end
end
end