dotfile_linker 0.0.2 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.rspec +1 -0
- data/.travis.yml +3 -0
- data/Gemfile +0 -3
- data/README.md +6 -6
- data/Rakefile +2 -0
- data/bin/dotfile_linker +6 -0
- data/dotfile_linker.gemspec +6 -7
- data/lib/dotfile_linker.rb +120 -45
- data/lib/dotfile_linker/version.rb +1 -1
- data/spec/dotfile_linker_spec.rb +157 -19
- data/spec/spec_helper.rb +1 -0
- metadata +33 -23
- data/bin/link_dotfiles +0 -6
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/.travis.yml
ADDED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,6 +1,7 @@
|
|
1
|
-
# DotfileLinker
|
1
|
+
# DotfileLinker [](http://travis-ci.org/dillonkearns/dotfile-linker?branch=master) [](https://gemnasium.com/dillonkearns/dotfile_linker) [](https://codeclimate.com/github/dillonkearns/dotfile-linker)
|
2
2
|
|
3
|
-
A simple
|
3
|
+
A simple command-line utility to help you symlink your dotfiles to your home directory. Just run `dotfile_linker` from
|
4
|
+
your dotfiles directory.
|
4
5
|
|
5
6
|
## Description
|
6
7
|
|
@@ -10,14 +11,13 @@ structure on how you manage your dotfiles.
|
|
10
11
|
|
11
12
|
## Installation
|
12
13
|
|
13
|
-
|
14
|
+
This gem is hosted on [rubygems.org](https://rubygems.org/gems/dotfile_linker), so simply install with:
|
14
15
|
|
15
|
-
$
|
16
|
-
$ rake install
|
16
|
+
$ gem install dotfile_linker
|
17
17
|
|
18
18
|
## Usage
|
19
19
|
|
20
|
-
Run `
|
20
|
+
Run `dotfile_linker` from your dotfiles directory. The script will then run through each file that isn't already
|
21
21
|
symlinked in your home directory and ask if you want to symlink it. The `-d` option cycles through existing symlinks in
|
22
22
|
your home directory and asks if you'd like to remove them.
|
23
23
|
|
data/Rakefile
CHANGED
data/bin/dotfile_linker
ADDED
data/dotfile_linker.gemspec
CHANGED
@@ -4,10 +4,8 @@ require File.expand_path('../lib/dotfile_linker/version', __FILE__)
|
|
4
4
|
Gem::Specification.new do |gem|
|
5
5
|
gem.authors = ["Dillon Kearns"]
|
6
6
|
gem.email = ["dillon@dillonkearns.com"]
|
7
|
-
gem.description = "
|
8
|
-
|
9
|
-
"directory clean. Similar tools exist, but tend to impose a structure on how you manage your dotfiles."
|
10
|
-
gem.summary = "A simple script to help you symlink your dotfiles to your home directory."
|
7
|
+
gem.description = "A simple command-line utility to help you symlink your dotfiles to your home directory. Just run `dotfile_linker` from your dotfiles directory."
|
8
|
+
gem.summary = gem.description
|
11
9
|
gem.homepage = "https://github.com/dillonkearns/dotfile-linker"
|
12
10
|
|
13
11
|
gem.files = `git ls-files`.split($\)
|
@@ -18,7 +16,8 @@ Gem::Specification.new do |gem|
|
|
18
16
|
gem.version = DotfileLinker::VERSION
|
19
17
|
|
20
18
|
gem.required_ruby_version = ">=1.8.7"
|
21
|
-
|
22
|
-
gem.
|
23
|
-
gem.add_development_dependency
|
19
|
+
|
20
|
+
gem.add_runtime_dependency "colorize", "~> 0.5.8"
|
21
|
+
gem.add_development_dependency "rake", "~> 0.9.2"
|
22
|
+
gem.add_development_dependency "rspec", "~> 2.11.0"
|
24
23
|
end
|
data/lib/dotfile_linker.rb
CHANGED
@@ -1,69 +1,144 @@
|
|
1
1
|
require 'dotfile_linker/version'
|
2
2
|
require 'optparse'
|
3
|
+
require 'fileutils'
|
3
4
|
require 'colorize'
|
4
5
|
|
5
6
|
class String
|
6
7
|
def human_filename
|
7
|
-
self.
|
8
|
+
self.sub(/^#{ ENV['HOME'] }/, '~')
|
8
9
|
end
|
9
10
|
end
|
10
11
|
|
11
12
|
module DotfileLinker
|
12
|
-
|
13
|
-
@@options = {}
|
13
|
+
class InvalidDotfilesDir < RuntimeError; end
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
15
|
+
class Linker
|
16
|
+
BLACKLIST = %w{ .git }
|
17
|
+
|
18
|
+
def initialize
|
19
|
+
@options = {}
|
20
20
|
end
|
21
|
-
optparse.parse!
|
22
|
-
end
|
23
21
|
|
24
|
-
|
25
|
-
|
26
|
-
|
22
|
+
def dotfiles_dir
|
23
|
+
@options[:path] || Dir.pwd
|
24
|
+
end
|
27
25
|
|
28
|
-
|
29
|
-
|
30
|
-
when /^y/i
|
31
|
-
true
|
32
|
-
when /^n/i
|
33
|
-
false
|
34
|
-
else
|
35
|
-
puts 'Exiting'
|
36
|
-
exit
|
26
|
+
def home_dir
|
27
|
+
ENV['HOME']
|
37
28
|
end
|
38
|
-
end
|
39
29
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
30
|
+
def ignore_file_name
|
31
|
+
File.expand_path("~/.dotfile_linker_ignore")
|
32
|
+
end
|
33
|
+
|
34
|
+
def raise_if_home_and_dotfiles_dir_match
|
35
|
+
if File.expand_path(home_dir) == File.expand_path(dotfiles_dir)
|
36
|
+
raise InvalidDotfilesDir, "Please specify your dotfiles directory by running `link_dotfiles` from that path, or providing a --path flag".red
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def user_response(message)
|
41
|
+
puts message
|
42
|
+
case gets.strip
|
43
|
+
when /^y/i
|
44
|
+
:yes
|
45
|
+
when /^n/i
|
46
|
+
:no
|
47
|
+
when /^i/i
|
48
|
+
:ignore
|
49
|
+
when /^q/i
|
50
|
+
:quit
|
49
51
|
else
|
50
|
-
|
51
|
-
|
52
|
-
|
52
|
+
user_response("Please enter a valid response")
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def user_response_or_exit(message)
|
57
|
+
response = user_response(message)
|
58
|
+
if response == :quit
|
59
|
+
puts "Exiting"
|
60
|
+
exit
|
61
|
+
end
|
62
|
+
response
|
63
|
+
end
|
64
|
+
|
65
|
+
def parse_options
|
66
|
+
optparse = OptionParser.new do |opts|
|
67
|
+
opts.on('-p', '--path PATH', String, 'Use [PATH] as dotfiles directory (instead of current directory)') { |path| @options[:path] = File.expand_path(path) }
|
68
|
+
opts.on_tail('-u', '--unlink', 'Unlink mode') { @options[:unlink_mode] = true }
|
69
|
+
opts.on_tail('-v', '--version', 'Show version') { puts VERSION; exit }
|
70
|
+
opts.on_tail('-h', '--help', 'Show this message') { puts opts; exit }
|
71
|
+
end
|
72
|
+
optparse.parse!
|
73
|
+
end
|
74
|
+
|
75
|
+
def ignore_list
|
76
|
+
@ignore_list ||=
|
77
|
+
begin
|
78
|
+
File.open(ignore_file_name, 'rb').lines.to_a.map(&:chomp)
|
79
|
+
rescue Errno::ENOENT
|
80
|
+
[]
|
53
81
|
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def ignore_file(filename)
|
85
|
+
File.open(ignore_file_name, 'a') do |f|
|
86
|
+
f.puts filename
|
54
87
|
end
|
55
88
|
end
|
56
|
-
end
|
57
89
|
|
58
|
-
|
59
|
-
|
60
|
-
|
90
|
+
def exclude_file?(filename)
|
91
|
+
filename =~ /^\.\.?$/ or BLACKLIST.include?(filename) or ignore_list.include?(filename)
|
92
|
+
end
|
93
|
+
|
94
|
+
def link_file(filename)
|
95
|
+
home_dir_file_path = File.expand_path("~/#{ filename }")
|
96
|
+
dotfiles_dir_file_path = File.expand_path("#{ dotfiles_dir }/#{ filename }")
|
97
|
+
unless File.symlink?(home_dir_file_path) || exclude_file?(filename)
|
98
|
+
case user_response_or_exit("move and link #{ home_dir_file_path.human_filename.magenta } -> #{ dotfiles_dir_file_path.human_filename.cyan }? (y/n/i[gnore])")
|
99
|
+
when :yes
|
100
|
+
FileUtils.mv(home_dir_file_path, dotfiles_dir_file_path, :verbose => true)
|
101
|
+
FileUtils.ln_s(dotfiles_dir_file_path, home_dir_file_path, :verbose => true)
|
102
|
+
when :ignore
|
103
|
+
ignore_file(filename)
|
104
|
+
puts "ignored #{filename.cyan}"
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def link_files
|
110
|
+
Dir.foreach(home_dir) { |filename| link_file(filename) }
|
111
|
+
end
|
112
|
+
|
113
|
+
def unlink_file(filename)
|
114
|
+
home_dir_symlink_path = File.expand_path("~/#{ filename }")
|
115
|
+
dotfiles_dir_file_path = File.expand_path("#{ dotfiles_dir }/#{ filename }")
|
116
|
+
if File.symlink?(home_dir_symlink_path)
|
117
|
+
case user_response_or_exit("unlink #{ home_dir_symlink_path.human_filename.magenta } and restore #{ dotfiles_dir_file_path.human_filename.cyan }? (y/n)")
|
118
|
+
when :yes
|
119
|
+
FileUtils.rm(home_dir_symlink_path, :verbose => true)
|
120
|
+
FileUtils.mv(dotfiles_dir_file_path, home_dir_symlink_path, :verbose => true)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
61
124
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
125
|
+
def unlink_files
|
126
|
+
Dir.foreach(dotfiles_dir) { |filename| unlink_file(filename) }
|
127
|
+
end
|
128
|
+
|
129
|
+
def start
|
130
|
+
raise_if_home_and_dotfiles_dir_match
|
131
|
+
parse_options
|
132
|
+
if @options[:unlink_mode]
|
133
|
+
unlink_files
|
134
|
+
else
|
135
|
+
link_files
|
136
|
+
end
|
137
|
+
puts 'Finished'
|
138
|
+
rescue Interrupt
|
139
|
+
# do nothing
|
140
|
+
rescue InvalidDotfilesDir => e
|
141
|
+
puts e.message
|
142
|
+
end
|
68
143
|
end
|
69
144
|
end
|
data/spec/dotfile_linker_spec.rb
CHANGED
@@ -1,42 +1,180 @@
|
|
1
|
-
require '
|
1
|
+
require 'spec_helper'
|
2
2
|
require 'dotfile_linker'
|
3
3
|
|
4
|
-
describe DotfileLinker do
|
5
|
-
|
4
|
+
describe DotfileLinker::Linker do
|
5
|
+
before(:each) do
|
6
|
+
@linker = DotfileLinker::Linker.new
|
7
|
+
@linker.stub(:user_response).and_return(:yes)
|
8
|
+
DotfileLinker::Linker.any_instance.stub(:puts)
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "#user_response" do
|
12
|
+
before do
|
13
|
+
@linker = DotfileLinker::Linker.new
|
14
|
+
end
|
15
|
+
|
16
|
+
it "returns expected symbols" do
|
17
|
+
values = { :yes => %w{y Y yes Yes},
|
18
|
+
:no => %w{n N no No},
|
19
|
+
:ignore => %w{i I ignore Ignore},
|
20
|
+
:quit => %w{q Q quit Quit} }
|
21
|
+
values.each do |k, v|
|
22
|
+
v.each do |response|
|
23
|
+
@linker.stub(:gets).and_return(response)
|
24
|
+
@linker.user_response('fake message').should == k
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "#exclude_file?" do
|
6
31
|
it "excludes files in blacklist" do
|
7
|
-
%w{ . .. .git }.each { |filename|
|
32
|
+
%w{ . .. .git }.each { |filename| @linker.exclude_file?(filename).should be }
|
8
33
|
end
|
9
34
|
|
10
35
|
it "doesn't exclude files prefixed with dot" do
|
11
|
-
%w{ .bash_profile .emacs .gitconfig .tmux.conf }.each { |filename|
|
36
|
+
%w{ .bash_profile .emacs .gitconfig .tmux.conf }.each { |filename| @linker.exclude_file?(filename).should_not be }
|
12
37
|
end
|
13
38
|
|
14
39
|
it "doesn't exclude files that aren't prefixed with dot" do
|
15
|
-
['my_script' 'sample.rb'].each { |filename|
|
40
|
+
['my_script' 'sample.rb'].each { |filename| @linker.exclude_file?(filename).should_not be }
|
41
|
+
end
|
42
|
+
|
43
|
+
it "excludes files in ignore list" do
|
44
|
+
@linker.stub(:ignore_list).and_return(%w{ignored_file .other_ignored_file})
|
45
|
+
@linker.exclude_file?('ignored_file').should be
|
46
|
+
@linker.exclude_file?('.other_ignored_file').should be
|
16
47
|
end
|
17
48
|
end
|
18
49
|
|
19
|
-
describe "
|
20
|
-
|
21
|
-
|
22
|
-
|
50
|
+
describe "#ignore_list" do
|
51
|
+
it "excludes files which are in the .dotfiles_ignore file" do
|
52
|
+
File.should_receive(:open).with(File.expand_path("~/.dotfile_linker_ignore"), kind_of(String)).and_return(".ignored_file1\n.ignored_file2\n.ignored_file3\n")
|
53
|
+
@linker.ignore_list.should == %w[.ignored_file1 .ignored_file2 .ignored_file3]
|
54
|
+
end
|
55
|
+
|
56
|
+
it "returns [] when file does not exist" do
|
57
|
+
File.should_receive(:open).with(File.expand_path("~/.dotfile_linker_ignore"), kind_of(String)).and_raise(Errno::ENOENT)
|
58
|
+
@linker.ignore_list.should == []
|
59
|
+
end
|
60
|
+
end
|
23
61
|
|
62
|
+
describe "#ignore_file" do
|
63
|
+
it "should write a new ignore entry" do
|
64
|
+
file = mock('file')
|
65
|
+
File.should_receive(:open).with(@linker.ignore_file_name, 'a').and_yield(file)
|
66
|
+
file.should_receive(:puts).with('some_file')
|
67
|
+
@linker.ignore_file('some_file')
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
describe "#raise_if_home_and_dotfiles_dir_match" do
|
72
|
+
it "raises exception when home dir and dotfiles dir are the same" do
|
73
|
+
@linker.stub(:dotfiles_dir).and_return(@linker.home_dir)
|
74
|
+
expect { @linker.raise_if_home_and_dotfiles_dir_match }.to raise_error(DotfileLinker::InvalidDotfilesDir)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
describe "#link_file" do
|
79
|
+
before do
|
24
80
|
@bad_filenames = %w{ . .. .git }
|
25
81
|
@good_filenames = %w{.bash_profile .bashrc .dotrc .emacs .gemrc .gitconfig .gitignore_global .irbrc .oh-my-zsh
|
26
82
|
.pryrc .rvmrc .ssh .tmux.conf .zshrc .zshrc.pre-oh-my-zsh}
|
27
83
|
end
|
28
84
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
85
|
+
describe "when the user ignores a file" do
|
86
|
+
before do
|
87
|
+
@linker.stub(:user_response).and_return(:ignore)
|
88
|
+
end
|
89
|
+
|
90
|
+
it "should call #ignore_file" do
|
91
|
+
@linker.should_receive(:ignore_file).with("file I want to ignore")
|
92
|
+
@linker.link_file("file I want to ignore")
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
describe "when file exists in ~/" do
|
97
|
+
before do
|
98
|
+
File.stub(:exist?).with(/^#{ ENV['HOME'] }/).and_return(true)
|
99
|
+
end
|
100
|
+
|
101
|
+
describe "and is a symlink" do
|
102
|
+
before do
|
103
|
+
File.stub(:symlink?).and_return(true)
|
104
|
+
end
|
105
|
+
|
106
|
+
it "doesn't attempt to move or symlink any files" do
|
107
|
+
FileUtils.should_not_receive(:ln_s)
|
108
|
+
FileUtils.should_not_receive(:mv)
|
109
|
+
|
110
|
+
@good_filenames.each do |filename|
|
111
|
+
@linker.link_file(filename)
|
112
|
+
end
|
113
|
+
|
114
|
+
@bad_filenames.each do |filename|
|
115
|
+
@linker.link_file(filename)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
describe "and is not a symlink" do
|
121
|
+
before do
|
122
|
+
File.stub(:symlink?).and_return(false)
|
123
|
+
end
|
124
|
+
|
125
|
+
it "should move then symlinks accepted files" do
|
126
|
+
@good_filenames.each do |filename|
|
127
|
+
home_dir_file_path = "#{ ENV['HOME'] }/#{ filename }"
|
128
|
+
dotfiles_dir_file_path = "#{ @linker.dotfiles_dir }/#{ filename }"
|
129
|
+
FileUtils.should_receive(:mv).with(home_dir_file_path, dotfiles_dir_file_path, { :verbose => true }).ordered
|
130
|
+
FileUtils.should_receive(:ln_s).with(dotfiles_dir_file_path, home_dir_file_path, { :verbose => true }).ordered
|
131
|
+
@linker.link_file(filename)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
it "shouldn't move or symlink blacklisted files" do
|
136
|
+
FileUtils.should_not_receive(:ln_s)
|
137
|
+
FileUtils.should_not_receive(:mv)
|
138
|
+
@bad_filenames.each do |filename|
|
139
|
+
@linker.link_file(filename)
|
140
|
+
end
|
141
|
+
end
|
33
142
|
end
|
34
143
|
end
|
144
|
+
end
|
145
|
+
|
146
|
+
describe "#unlink_file" do
|
147
|
+
[true, false].each do |home_dir_file_is_symlink|
|
148
|
+
describe "when symlink #{ "isn't" unless home_dir_file_is_symlink } in ~" do
|
149
|
+
it "should #{ "not" unless home_dir_file_is_symlink } remove symlink and move file" do
|
150
|
+
filename = "file_to_unlink"
|
151
|
+
home_dir_file_path = "#{ ENV['HOME'] }/#{ filename }"
|
152
|
+
dotfiles_dir_file_path = "#{ @linker.dotfiles_dir }/#{ filename }"
|
153
|
+
|
154
|
+
File.stub(:symlink?).with(home_dir_file_path).and_return(home_dir_file_is_symlink)
|
155
|
+
if home_dir_file_is_symlink
|
156
|
+
FileUtils.should_receive(:rm).with(home_dir_file_path, { :verbose => true }).ordered
|
157
|
+
FileUtils.should_receive(:mv).with(dotfiles_dir_file_path, home_dir_file_path, { :verbose => true }).ordered
|
158
|
+
else
|
159
|
+
FileUtils.should_not_receive(:rm)
|
160
|
+
FileUtils.should_not_receive(:mv)
|
161
|
+
end
|
162
|
+
@linker.unlink_file(filename)
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
describe "with negative response" do
|
168
|
+
before do
|
169
|
+
@linker.stub(:user_response).and_return(:no)
|
170
|
+
end
|
171
|
+
|
172
|
+
it "does not remove symlink or move file" do
|
173
|
+
File.stub(:symlink?).and_return(true)
|
174
|
+
FileUtils.should_not_receive(:rm)
|
175
|
+
FileUtils.should_not_receive(:mv)
|
35
176
|
|
36
|
-
|
37
|
-
@bad_filenames.each do |filename|
|
38
|
-
File.should_not_receive(:symlink)
|
39
|
-
DotfileLinker.link_file(filename)
|
177
|
+
@linker.unlink_file('some_file')
|
40
178
|
end
|
41
179
|
end
|
42
180
|
end
|
@@ -47,7 +185,7 @@ describe DotfileLinker do
|
|
47
185
|
end
|
48
186
|
|
49
187
|
it "replaces home dir for long path" do
|
50
|
-
File.expand_path("
|
188
|
+
File.expand_path("~/some/test/dir/.gitignore").human_filename.should == '~/some/test/dir/.gitignore'
|
51
189
|
end
|
52
190
|
end
|
53
191
|
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'rspec'
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dotfile_linker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
|
+
- 1
|
7
8
|
- 0
|
8
9
|
- 0
|
9
|
-
|
10
|
-
version: 0.0.2
|
10
|
+
version: 1.0.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Dillon Kearns
|
@@ -15,72 +15,81 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2012-
|
18
|
+
date: 2012-10-07 00:00:00 -07:00
|
19
|
+
default_executable:
|
19
20
|
dependencies:
|
20
21
|
- !ruby/object:Gem::Dependency
|
21
22
|
version_requirements: &id001 !ruby/object:Gem::Requirement
|
22
23
|
none: false
|
23
24
|
requirements:
|
24
|
-
- -
|
25
|
+
- - ~>
|
25
26
|
- !ruby/object:Gem::Version
|
26
|
-
hash:
|
27
|
+
hash: 27
|
27
28
|
segments:
|
28
29
|
- 0
|
29
|
-
|
30
|
+
- 5
|
31
|
+
- 8
|
32
|
+
version: 0.5.8
|
33
|
+
requirement: *id001
|
30
34
|
prerelease: false
|
31
|
-
type: :runtime
|
32
35
|
name: colorize
|
33
|
-
|
36
|
+
type: :runtime
|
34
37
|
- !ruby/object:Gem::Dependency
|
35
38
|
version_requirements: &id002 !ruby/object:Gem::Requirement
|
36
39
|
none: false
|
37
40
|
requirements:
|
38
41
|
- - ~>
|
39
42
|
- !ruby/object:Gem::Version
|
40
|
-
hash:
|
43
|
+
hash: 63
|
41
44
|
segments:
|
42
45
|
- 0
|
43
46
|
- 9
|
44
|
-
|
47
|
+
- 2
|
48
|
+
version: 0.9.2
|
49
|
+
requirement: *id002
|
45
50
|
prerelease: false
|
46
|
-
type: :development
|
47
51
|
name: rake
|
48
|
-
|
52
|
+
type: :development
|
49
53
|
- !ruby/object:Gem::Dependency
|
50
54
|
version_requirements: &id003 !ruby/object:Gem::Requirement
|
51
55
|
none: false
|
52
56
|
requirements:
|
53
57
|
- - ~>
|
54
58
|
- !ruby/object:Gem::Version
|
55
|
-
hash:
|
59
|
+
hash: 35
|
56
60
|
segments:
|
57
61
|
- 2
|
58
|
-
-
|
59
|
-
|
62
|
+
- 11
|
63
|
+
- 0
|
64
|
+
version: 2.11.0
|
65
|
+
requirement: *id003
|
60
66
|
prerelease: false
|
61
|
-
type: :development
|
62
67
|
name: rspec
|
63
|
-
|
64
|
-
description:
|
68
|
+
type: :development
|
69
|
+
description: A simple command-line utility to help you symlink your dotfiles to your home directory. Just run `dotfile_linker` from your dotfiles directory.
|
65
70
|
email:
|
66
71
|
- dillon@dillonkearns.com
|
67
72
|
executables:
|
68
|
-
-
|
73
|
+
- dotfile_linker
|
69
74
|
extensions: []
|
70
75
|
|
71
76
|
extra_rdoc_files: []
|
72
77
|
|
73
78
|
files:
|
74
79
|
- .gitignore
|
80
|
+
- .rspec
|
81
|
+
- .travis.yml
|
75
82
|
- Gemfile
|
76
83
|
- LICENSE
|
77
84
|
- README.md
|
78
85
|
- Rakefile
|
79
|
-
- bin/
|
86
|
+
- bin/dotfile_linker
|
80
87
|
- dotfile_linker.gemspec
|
81
88
|
- lib/dotfile_linker.rb
|
82
89
|
- lib/dotfile_linker/version.rb
|
83
90
|
- spec/dotfile_linker_spec.rb
|
91
|
+
- spec/spec_helper.rb
|
92
|
+
has_rdoc: true
|
84
93
|
homepage: https://github.com/dillonkearns/dotfile-linker
|
85
94
|
licenses: []
|
86
95
|
|
@@ -112,9 +121,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
112
121
|
requirements: []
|
113
122
|
|
114
123
|
rubyforge_project:
|
115
|
-
rubygems_version: 1.
|
124
|
+
rubygems_version: 1.5.3
|
116
125
|
signing_key:
|
117
126
|
specification_version: 3
|
118
|
-
summary: A simple
|
127
|
+
summary: A simple command-line utility to help you symlink your dotfiles to your home directory. Just run `dotfile_linker` from your dotfiles directory.
|
119
128
|
test_files:
|
120
129
|
- spec/dotfile_linker_spec.rb
|
130
|
+
- spec/spec_helper.rb
|