homer 0.1.2 → 0.2.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/Gemfile +1 -0
- data/Gemfile.lock +2 -0
- data/README.md +4 -1
- data/VERSION +1 -1
- data/bin/homer +2 -3
- data/homer.gemspec +5 -2
- data/lib/homer/file_layer.rb +24 -29
- data/lib/homer/github_layer.rb +23 -14
- data/lib/homer/symlink.rb +5 -0
- data/lib/homer.rb +6 -0
- data/spec/file_layer_spec.rb +1 -15
- data/spec/github_layer_spec.rb +0 -41
- data/spec/homer_spec.rb +1 -2
- metadata +19 -3
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -12,6 +12,7 @@ GEM
|
|
12
12
|
nokogiri (~> 1.5.2)
|
13
13
|
oauth2
|
14
14
|
hashie (1.2.0)
|
15
|
+
highline (1.6.15)
|
15
16
|
httpauth (0.1)
|
16
17
|
jeweler (1.8.4)
|
17
18
|
bundler (~> 1.0)
|
@@ -44,6 +45,7 @@ PLATFORMS
|
|
44
45
|
DEPENDENCIES
|
45
46
|
bundler
|
46
47
|
github_api
|
48
|
+
highline
|
47
49
|
jeweler (~> 1.8.4)
|
48
50
|
rdoc (~> 3.12)
|
49
51
|
rspec
|
data/README.md
CHANGED
@@ -29,4 +29,7 @@ Need to pair program at co-worker's hostile box .
|
|
29
29
|
homer hi <github login>
|
30
30
|
- When friend complains after your display of awesomeness
|
31
31
|
|
32
|
-
homer bye
|
32
|
+
homer bye
|
33
|
+
|
34
|
+
## Wishlist
|
35
|
+
- Use a table for listing tracked files and Symlinks ( Use [terminal table](https://github.com/visionmedia/terminal-table) ? )
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
data/bin/homer
CHANGED
@@ -7,7 +7,7 @@ class HomerRunner < Thor
|
|
7
7
|
|
8
8
|
default_task :help
|
9
9
|
|
10
|
-
desc "wipe", "Removes ~/.homer folder. WARNING : THIS IS DANGEROUS
|
10
|
+
desc "wipe", "Removes ~/.homer folder. WARNING : THIS IS DANGEROUS"
|
11
11
|
def wipe
|
12
12
|
Homer.wipe
|
13
13
|
rescue Exception => e
|
@@ -38,8 +38,7 @@ class HomerRunner < Thor
|
|
38
38
|
|
39
39
|
desc "push", "Pushes your dotfiles to GitHub"
|
40
40
|
def push
|
41
|
-
|
42
|
-
GitHubLayer.push
|
41
|
+
Homer.push
|
43
42
|
rescue Exception => e
|
44
43
|
puts "Error: #{e.message}"
|
45
44
|
end
|
data/homer.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "homer"
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.2.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Emil Soman"]
|
12
|
-
s.date = "2012-10-
|
12
|
+
s.date = "2012-10-20"
|
13
13
|
s.description = "Homer makes tracking your Unix dotfiles easay peasay - UNDER DEVELOPMENT"
|
14
14
|
s.email = "emil.soman@gmail.com"
|
15
15
|
s.executables = ["homer"]
|
@@ -51,6 +51,7 @@ Gem::Specification.new do |s|
|
|
51
51
|
|
52
52
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
53
53
|
s.add_runtime_dependency(%q<github_api>, [">= 0"])
|
54
|
+
s.add_runtime_dependency(%q<highline>, [">= 0"])
|
54
55
|
s.add_development_dependency(%q<rspec>, [">= 0"])
|
55
56
|
s.add_development_dependency(%q<rdoc>, ["~> 3.12"])
|
56
57
|
s.add_development_dependency(%q<bundler>, [">= 0"])
|
@@ -58,6 +59,7 @@ Gem::Specification.new do |s|
|
|
58
59
|
s.add_development_dependency(%q<jeweler>, ["~> 1.8.4"])
|
59
60
|
else
|
60
61
|
s.add_dependency(%q<github_api>, [">= 0"])
|
62
|
+
s.add_dependency(%q<highline>, [">= 0"])
|
61
63
|
s.add_dependency(%q<rspec>, [">= 0"])
|
62
64
|
s.add_dependency(%q<rdoc>, ["~> 3.12"])
|
63
65
|
s.add_dependency(%q<bundler>, [">= 0"])
|
@@ -66,6 +68,7 @@ Gem::Specification.new do |s|
|
|
66
68
|
end
|
67
69
|
else
|
68
70
|
s.add_dependency(%q<github_api>, [">= 0"])
|
71
|
+
s.add_dependency(%q<highline>, [">= 0"])
|
69
72
|
s.add_dependency(%q<rspec>, [">= 0"])
|
70
73
|
s.add_dependency(%q<rdoc>, ["~> 3.12"])
|
71
74
|
s.add_dependency(%q<bundler>, [">= 0"])
|
data/lib/homer/file_layer.rb
CHANGED
@@ -5,64 +5,59 @@ require 'yaml'
|
|
5
5
|
class FileLayer
|
6
6
|
class << self
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
f.close
|
12
|
-
rescue Exception => e
|
13
|
-
raise "GitHub token could not be saved : Error : #{e.message}"
|
14
|
-
end
|
15
|
-
|
8
|
+
#Creates the homer root directory if it does not exist already
|
9
|
+
#Creates the dotfiles directory if it does not exist already
|
10
|
+
#Creates a dotfiles list YML file if it does not exist already
|
16
11
|
def prepare_homer_folder
|
17
|
-
Dir.mkdir(
|
18
|
-
Dir.mkdir(
|
12
|
+
Dir.mkdir(root_path) unless Dir.exists?(root_path)
|
13
|
+
Dir.mkdir(dotfiles_directory_path) unless Dir.exists?(dotfiles_directory_path)
|
19
14
|
File.new(dotfiles_path , "w") unless File.exists?(dotfiles_path)
|
20
15
|
rescue Exception => e
|
21
16
|
raise "~/.homer cannot be created : #{e.message}"
|
22
17
|
end
|
23
18
|
|
19
|
+
#Deletes the homer root
|
24
20
|
def delete_homer_folder
|
25
|
-
FileUtils.rm_rf(
|
21
|
+
FileUtils.rm_rf(root_path)
|
26
22
|
end
|
27
23
|
|
28
|
-
|
29
|
-
dotfile = File.expand_path(dotfile)
|
30
|
-
f = File.open(dotfiles_path, "a")
|
31
|
-
raise "#{dotfile} does not exist." unless File.exists?(dotfile)
|
32
|
-
f.puts dotfile
|
33
|
-
f.close
|
34
|
-
end
|
35
|
-
|
24
|
+
#Reads and returns the contents of the dotfiles list YML file
|
36
25
|
def read_symlink_file
|
37
26
|
return {} if !File.exists?(dotfiles_path) or File.zero?(dotfiles_path)
|
38
27
|
YAML.load_file(dotfiles_path)
|
39
28
|
end
|
40
29
|
|
30
|
+
#Writes contents to dotfiles list YML file
|
41
31
|
def save_symlink_file(symlinks)
|
42
32
|
File.open(dotfiles_path,"w") do |out|
|
43
33
|
YAML.dump(symlinks,out)
|
44
34
|
end
|
45
35
|
end
|
46
36
|
|
37
|
+
#Moves the file to dotfiles directory and creates a symlink at original location
|
47
38
|
def create_symlink(filename,file_path)
|
48
|
-
|
49
|
-
|
39
|
+
file_in_dotfiles_folder = File.join(dotfiles_directory_path, filename)
|
40
|
+
FileUtils.mv(file_path, file_in_dotfiles_folder)
|
41
|
+
File.symlink(file_in_dotfiles_folder, file_path)
|
50
42
|
end
|
51
43
|
|
52
|
-
|
53
|
-
File.join(Dir.home, ".homer", "dotfiles", "/")
|
54
|
-
end
|
44
|
+
#HOMER PATHS
|
55
45
|
|
46
|
+
#This is the dotfiles list YML file .
|
47
|
+
#This is where a mapping of files in dotfiles folder
|
48
|
+
#to actual location in filesystem exists
|
56
49
|
def dotfiles_path
|
57
|
-
return File.join(
|
50
|
+
return File.join(dotfiles_directory_path, "dotfiles_list.yml")
|
58
51
|
end
|
59
52
|
|
60
|
-
|
61
|
-
|
53
|
+
#This is the directory to which the dotfiles will be moved
|
54
|
+
def dotfiles_directory_path
|
55
|
+
return File.join(root_path, "dotfiles/")
|
62
56
|
end
|
63
57
|
|
64
|
-
|
65
|
-
|
58
|
+
#This is where homer
|
59
|
+
def root_path
|
60
|
+
return File.join(Dir.home, ".homer")
|
66
61
|
end
|
67
62
|
|
68
63
|
def get_generic_home_relative_path(filepath)
|
data/lib/homer/github_layer.rb
CHANGED
@@ -1,29 +1,38 @@
|
|
1
1
|
require 'github_api'
|
2
2
|
require 'homer/file_layer'
|
3
|
-
|
3
|
+
require 'highline/import'
|
4
4
|
|
5
5
|
class GitHubLayer
|
6
|
+
REPO_NAME = 'dotfiles'
|
6
7
|
class << self
|
7
8
|
|
8
|
-
def push
|
9
|
+
def push(directory)
|
10
|
+
create_repo_if_repo_does_not_exist(directory)
|
11
|
+
%x{git pull origin master}
|
12
|
+
%x{git add .}
|
13
|
+
%x{git commit -m "Homer push"}
|
14
|
+
%x{git push origin master}
|
9
15
|
end
|
10
16
|
|
11
|
-
def
|
17
|
+
def create_repo_if_repo_does_not_exist(directory)
|
18
|
+
Dir.chdir(directory)
|
19
|
+
return if origin_added_as_remote?
|
20
|
+
puts "I need your GitHub login to create a '#{REPO_NAME}' repo if it doesn't exist already"
|
21
|
+
login = ask("Login: ")
|
22
|
+
password = ask("Password: ") { |q| q.echo = false }
|
12
23
|
github = Github.new(login: login, password: password)
|
13
|
-
authorization = github.oauth.create(scopes: ['public_repo'], note: 'Homer')
|
14
|
-
FileLayer.save_authorization_token(authorization.token)
|
15
|
-
rescue Github::Error::Unauthorized
|
16
|
-
raise "Invalid GitHub Login/Password"
|
17
|
-
end
|
18
|
-
|
19
|
-
def create_repo_if_repo_does_not_exist(repo_name)
|
20
|
-
token = FileLayer.read_authorization_token
|
21
|
-
github = Github.new(oauth_token: token)
|
22
24
|
begin
|
23
|
-
github.repos.get(github.login,
|
25
|
+
github.repos.get(github.login, REPO_NAME)
|
24
26
|
rescue Github::Error::NotFound
|
25
|
-
github.repos.create(name:
|
27
|
+
github.repos.create(name: REPO_NAME)
|
26
28
|
end
|
29
|
+
%x{git init .}
|
30
|
+
%x{git remote add origin git@github.com:#{login}/#{REPO_NAME}.git}
|
31
|
+
end
|
32
|
+
|
33
|
+
def origin_added_as_remote?
|
34
|
+
remotes = %x{git remote -v}
|
35
|
+
return remotes.include?("origin\t")
|
27
36
|
end
|
28
37
|
|
29
38
|
end
|
data/lib/homer/symlink.rb
CHANGED
@@ -1,10 +1,13 @@
|
|
1
1
|
class SymLink
|
2
2
|
|
3
|
+
#Returns all files in dotfiles_list
|
3
4
|
def self.filenames
|
4
5
|
symlinks = FileLayer.read_symlink_file
|
5
6
|
symlinks.keys
|
6
7
|
end
|
7
8
|
|
9
|
+
#Adds file to dotfiles_list , moves the file to dotfiles folder
|
10
|
+
#and creates a symlink with original filepath
|
8
11
|
def self.add(dotfile)
|
9
12
|
dotfile = File.expand_path(dotfile)
|
10
13
|
raise "#{dotfile} does not exist." unless File.exists?(dotfile)
|
@@ -17,6 +20,8 @@ class SymLink
|
|
17
20
|
end
|
18
21
|
|
19
22
|
private
|
23
|
+
|
24
|
+
#Gets the next unused filename by adding an integer suffix to filename
|
20
25
|
def self.get_unused_filename(filename, existing_filenames)
|
21
26
|
filename_to_store = filename
|
22
27
|
count = 1
|
data/lib/homer.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'homer/file_layer'
|
2
|
+
require 'homer/github_layer'
|
2
3
|
require 'homer/symlink'
|
3
4
|
|
4
5
|
class Homer
|
@@ -22,6 +23,11 @@ class Homer
|
|
22
23
|
SymLink.filenames
|
23
24
|
end
|
24
25
|
|
26
|
+
def push
|
27
|
+
dotfiles_dir = FileLayer.dotfiles_directory_path
|
28
|
+
GitHubLayer.push(dotfiles_dir)
|
29
|
+
end
|
30
|
+
|
25
31
|
end
|
26
32
|
|
27
33
|
end
|
data/spec/file_layer_spec.rb
CHANGED
@@ -16,13 +16,7 @@ describe FileLayer do
|
|
16
16
|
|
17
17
|
describe ".dotfiles_path" do
|
18
18
|
it "should return the path to dotfiles_list" do
|
19
|
-
FileLayer.dotfiles_path.should == File.join(Dir.home, ".homer", "dotfiles", "dotfiles_list")
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
describe ".token_path" do
|
24
|
-
it "should return the path to file where GitHub token is saved" do
|
25
|
-
FileLayer.token_path.should == File.join(Dir.home, ".homer", "token")
|
19
|
+
FileLayer.dotfiles_path.should == File.join(Dir.home, ".homer", "dotfiles", "dotfiles_list.yml")
|
26
20
|
end
|
27
21
|
end
|
28
22
|
|
@@ -32,12 +26,4 @@ describe FileLayer do
|
|
32
26
|
end
|
33
27
|
end
|
34
28
|
|
35
|
-
describe ".save_authorization_token" do
|
36
|
-
it "should store token into token file" do
|
37
|
-
Homer.init
|
38
|
-
FileLayer.save_authorization_token("abc")
|
39
|
-
Homer.wipe
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
29
|
end
|
data/spec/github_layer_spec.rb
CHANGED
@@ -2,46 +2,5 @@ require 'spec_helper'
|
|
2
2
|
require 'homer/github_layer'
|
3
3
|
|
4
4
|
describe GitHubLayer do
|
5
|
-
|
6
|
-
describe "create_token" do
|
7
|
-
context "invalid credentials" do
|
8
|
-
it "should raise exception" do
|
9
|
-
github = double('GitHub')
|
10
|
-
Github.should_receive(:new).with(login: "login",password: "password").and_return(github)
|
11
|
-
github.should_receive(:oauth).and_raise(Github::Error::Unauthorized.new({}))
|
12
|
-
expect { GitHubLayer.login("login","password") }.to raise_error "Invalid GitHub Login/Password"
|
13
|
-
end
|
14
|
-
end
|
15
|
-
context "valid credentials" do
|
16
|
-
it "should save the authorization token" do
|
17
|
-
github = double('GitHub').as_null_object
|
18
|
-
Github.should_receive(:new).with(login: "login", password: "password").and_return(github)
|
19
|
-
github.stub_chain(:oauth, :create).and_return Hashie::Mash.new({"token" => "received_token" })
|
20
|
-
FileLayer.should_receive(:save_authorization_token).with("received_token")
|
21
|
-
GitHubLayer.login("login","password")
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
describe "create_repo" do
|
27
|
-
it "should create a repository"
|
28
|
-
end
|
29
|
-
|
30
|
-
describe "initialization" do
|
31
|
-
it "should log in to github account with login and password"
|
32
|
-
describe "handling dotfiles repo" do
|
33
|
-
context "when dotfiles repo already exists" do
|
34
|
-
context "when homer folder does not exist inside the dotfiles repo" do
|
35
|
-
it "should create the directory"
|
36
|
-
end
|
37
|
-
context "when homer folder does not exist inside the dotfiles repo" do
|
38
|
-
it "should ask the user what to do"
|
39
|
-
end
|
40
|
-
end
|
41
|
-
context "when dotfiles repo does not exist" do
|
42
|
-
it "should create the repo"
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
5
|
|
47
6
|
end
|
data/spec/homer_spec.rb
CHANGED
@@ -13,7 +13,7 @@ describe Homer do
|
|
13
13
|
Dir.exists?(File.join(Dir.home,'.homer/dotfiles')).should be_true
|
14
14
|
end
|
15
15
|
it "should create an empty dotfiles file in ~/.homer" do
|
16
|
-
File.zero?(File.join(Dir.home,'.homer/dotfiles/dotfiles_list')).should be_true
|
16
|
+
File.zero?(File.join(Dir.home,'.homer/dotfiles/dotfiles_list.yml')).should be_true
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
@@ -23,7 +23,6 @@ describe Homer do
|
|
23
23
|
expect do
|
24
24
|
Homer.add('~/.file_that_does_not_exist')
|
25
25
|
end.to raise_error("#{ENV['HOME']}/.file_that_does_not_exist does not exist.")
|
26
|
-
#File.read(Homer.dotfiles_path).should include(File.join(Dir.home, ".file_that_does_not_exist"))
|
27
26
|
end
|
28
27
|
end
|
29
28
|
context "when dotfile exists" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: homer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-10-
|
12
|
+
date: 2012-10-20 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: github_api
|
@@ -27,6 +27,22 @@ dependencies:
|
|
27
27
|
- - ! '>='
|
28
28
|
- !ruby/object:Gem::Version
|
29
29
|
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: highline
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
30
46
|
- !ruby/object:Gem::Dependency
|
31
47
|
name: rspec
|
32
48
|
requirement: !ruby/object:Gem::Requirement
|
@@ -152,7 +168,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
152
168
|
version: '0'
|
153
169
|
segments:
|
154
170
|
- 0
|
155
|
-
hash:
|
171
|
+
hash: 792016573
|
156
172
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
157
173
|
none: false
|
158
174
|
requirements:
|