offline 0.0.2 → 0.0.3

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/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ rvm:
2
+ - 1.8.7 # (current default)
3
+ - 1.9.2
4
+ - ree
5
+ script: "bundle exec rspec spec"
data/bin/offline CHANGED
@@ -3,63 +3,6 @@ $:.unshift File.join(File.dirname(__FILE__), *%w[.. lib])
3
3
 
4
4
  require "rubygems" # ruby1.9 doesn't "require" it though
5
5
  require "bundler/setup"
6
- require "thor"
7
6
  require 'offline'
8
7
 
9
- class OfflineApp < Thor
10
- include Offline::Helpers
11
-
12
- desc "mirror GITHUB_USER", "mirror the repositories of a given github user"
13
- method_option :only, :type => :array, :required => false
14
- method_option :without, :type => :array, :required => false
15
- method_option :password, :type => :string, :required => false, :aliases => '-p'
16
- method_option :output, :type => :string, :default => 'mirror', :required => false, :aliases => '-o'
17
- def mirror(user)
18
- mirror_directory = "#{options[:output]}/#{user}"
19
- Pathname.new(mirror_directory).mkpath
20
- reaper = Offline::Github.new(user, options[:password])
21
- all_repos = reaper.repositories.map {|r| r["name"] }
22
- repos = all_repos & (options[:only] || all_repos) # TODO: Might be a better way of doing this
23
- repos = (repos) - Array(options[:without])
24
- reaper.repositories.each do |repo|
25
- next unless repos.include?(repo["name"])
26
- puts "Mirroring: #{repo["name"]}"
27
- target_directory = Pathname.new("#{mirror_directory}/#{repo["name"]}.git")
28
- if target_directory.exist?
29
- run("cd #{target_directory} && git fetch")
30
- else
31
- run("git clone --mirror git@github.com:#{repo["owner"]}/#{repo["name"]}.git #{target_directory}")
32
- end
33
- puts "" # blank line
34
- end
35
- end
36
-
37
- # TODO: Dry up
38
- # Yes I did just copy and paste
39
- desc "clone GITHUB_USER", "clone the repositories of a given github user"
40
- method_option :only, :type => :array, :required => false
41
- method_option :without, :type => :array, :required => false
42
- method_option :password, :type => :string, :required => false, :aliases => '-p'
43
- method_option :output, :type => :string, :default => 'clone', :required => false, :aliases => '-o'
44
- def clone(user)
45
- clone_directory = "#{options[:output]}/#{user}"
46
- Pathname.new(clone_directory).mkpath
47
- reaper = Offline::Github.new(user, options[:password])
48
- all_repos = reaper.repositories.map {|r| r["name"] }
49
- repos = all_repos & (options[:only] || all_repos) # TODO: Might be a better way of doing this
50
- repos = (repos) - Array(options[:without])
51
- reaper.repositories.each do |repo|
52
- next unless repos.include?(repo["name"])
53
- puts "Cloning: #{repo["name"]}"
54
- target_directory = Pathname.new("#{clone_directory}/#{repo["name"]}")
55
- if target_directory.exist?
56
- run("cd #{target_directory} && git fetch")
57
- else
58
- run("git clone git@github.com:#{repo["owner"]}/#{repo["name"]}.git #{target_directory}")
59
- end
60
- puts "" # blank line
61
- end
62
- end
63
- end
64
-
65
- OfflineApp.start
8
+ Offline::App.start
data/lib/offline.rb CHANGED
@@ -2,9 +2,11 @@ require 'rubygems'
2
2
  require 'pathname'
3
3
  require 'bundler/setup'
4
4
 
5
+ require "thor"
5
6
  require 'httparty'
6
7
 
7
8
  require 'offline/helpers'
9
+ require 'offline/app'
8
10
  require 'offline/github'
9
11
 
10
12
  module Offline
@@ -0,0 +1,51 @@
1
+ module Offline
2
+ class App < Thor
3
+ include Offline::Helpers
4
+
5
+ desc "mirror GITHUB_REPOSITORY_OWNER", "mirror the repositories of a given github user"
6
+ method_option :only, :type => :array, :required => false
7
+ method_option :without, :type => :array, :required => false
8
+ method_option :"private-only", :type => :boolean, :aliases => '-P'
9
+ method_option :username, :type => :string, :required => false, :aliases => '-u'
10
+ method_option :password, :type => :string, :required => false, :aliases => '-p'
11
+ method_option :output, :type => :string, :default => 'mirror', :required => false, :aliases => '-o'
12
+ def mirror(owner)
13
+ do_clone(owner, :mirror, options)
14
+ end
15
+
16
+ desc "clone GITHUB_REPOSITORY_OWNER", "clones the repositories of a given github user"
17
+ method_option :only, :type => :array, :required => false
18
+ method_option :without, :type => :array, :required => false
19
+ method_option :"private-only", :type => :boolean, :aliases => '-P'
20
+ method_option :username, :type => :string, :required => false, :aliases => '-u'
21
+ method_option :password, :type => :string, :required => false, :aliases => '-p'
22
+ method_option :output, :type => :string, :default => 'clone', :required => false, :aliases => '-o'
23
+ def mirror(owner)
24
+ do_clone(owner, :clone, options)
25
+ end
26
+
27
+ private
28
+ def do_clone(owner, clone_type, options)
29
+ privacy = options["private-only"] ? :"private-only" : :all
30
+ mirror_directory = "#{options[:output]}/#{owner}"
31
+ Pathname.new(mirror_directory).mkpath
32
+ user = options[:username] || owner
33
+ reaper = Offline::Github.new(user, options[:password])
34
+ all_repos = reaper.repositories(owner, privacy).map {|r| r["name"] }
35
+ repos = all_repos & (options[:only] || all_repos) # TODO: Might be a better way of doing this
36
+ repos = (repos) - Array(options[:without])
37
+
38
+ reaper.repositories(owner, privacy).each do |repo|
39
+ next unless repos.include?(repo["name"])
40
+ puts "#{clone_type}: #{repo["name"]}"
41
+ target_directory = Pathname.new("#{mirror_directory}/#{repo["name"]}.git")
42
+ if target_directory.exist?
43
+ run("cd #{target_directory} && git fetch")
44
+ else
45
+ run("git clone #{"--mirror" if clone_type==:mirror} git@github.com:#{repo["owner"]}/#{repo["name"]}.git #{target_directory}")
46
+ end
47
+ puts "" # blank line
48
+ end
49
+ end
50
+ end
51
+ end
@@ -9,11 +9,19 @@ module Offline
9
9
  @username = user
10
10
  if pass
11
11
  self.class.basic_auth user, pass
12
+ if self.class.get("/user/show").parsed_response["error"]=="not authorized"
13
+ raise Exception.new({"error"=>"not authorized"})
14
+ end
12
15
  end
13
16
  end
14
17
 
15
- def repositories
16
- self.class.get("/repos/show/#{@username}").parsed_response["repositories"]
18
+ def repositories(owner=nil, privacy=:all)
19
+ owner ||= @username
20
+ repos = self.class.get("/repos/show/#{owner}").parsed_response["repositories"]
21
+ if privacy==:"private-only"
22
+ repos = repos.select {|r| r["private"]==true }
23
+ end
24
+ repos
17
25
  end
18
26
  end
19
27
  end
@@ -0,0 +1,16 @@
1
+ module Offline
2
+ module Github
3
+ class Base
4
+ include Offline::Helpers
5
+
6
+ def initialize(user, options)
7
+
8
+ end
9
+
10
+ private
11
+ def clone(source, target="", mirror=false)
12
+ run("git clone #{"--mirror" if mirror} #{source} #{target}")
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,6 @@
1
+ module Offline
2
+ module Github
3
+ class Clone < Base
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ module Offline
2
+ module Github
3
+ class Mirror < Base
4
+ end
5
+ end
6
+ end
@@ -1,3 +1,3 @@
1
1
  module Offline
2
- VERSION = '0.0.2'
2
+ VERSION = '0.0.3'
3
3
  end
data/offline.gemspec CHANGED
@@ -17,6 +17,7 @@ Gem::Specification.new do |s|
17
17
  s.add_dependency("httparty")
18
18
  s.add_dependency('thor')
19
19
 
20
+ s.add_development_dependency('rake')
20
21
  s.add_development_dependency('rspec')
21
22
 
22
23
  s.files = `git ls-files`.split("\n")
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ describe Offline::App do
4
+ context "Thor" do
5
+ it "should respond to start" do
6
+ Offline::App.should respond_to(:start)
7
+ end
8
+ end
9
+
10
+ context "#mirror" do
11
+ it "should respond to start" do
12
+ Offline::App.should respond_to(:start)
13
+ end
14
+ end
15
+ end
@@ -5,14 +5,28 @@ describe Offline::Github do
5
5
  Offline::Github.new('test').username.should == 'test'
6
6
  end
7
7
 
8
- context "#repositories" do
9
- before :each do
10
- response = mock("response", :parsed_response => {"repositories" => []})
11
- Offline::Github.should_receive(:get).with("/repos/show/test").and_return(response)
8
+ context "authenticated user" do
9
+ it "should fail if I give the wrong password" do
10
+ expect { Offline::Github.new('vertis', 'password') }.should raise_error
12
11
  end
13
-
12
+ end
13
+
14
+ describe "#repositories" do
14
15
  it "should return a list of repositories" do
16
+ user_response = mock("response", :parsed_response => {})
17
+ response = mock("response", :parsed_response => {"repositories" => []})
18
+ Offline::Github.should_receive(:get).with("/repos/show/test").and_return(response)
15
19
  Offline::Github.new('test').repositories.should == []
16
20
  end
21
+
22
+ it "should return only private repositories if requested" do
23
+ user_response = mock("response", :parsed_response => {})
24
+ response = mock("response", :parsed_response => {"repositories" => [{"name" => 'public_repo', "private"=>false}, {"name" => 'private_repo', "private"=>true}]})
25
+ Offline::Github.should_receive(:get).with("/user/show").and_return(user_response)
26
+ Offline::Github.should_receive(:get).with("/repos/show/test").and_return(response)
27
+ repos = Offline::Github.new('test', 'password').repositories('test', :"private-only")
28
+ repos.count.should == 1
29
+ repos.should == [{"name" => 'private_repo', "private"=>true}]
30
+ end
17
31
  end
18
32
  end
metadata CHANGED
@@ -1,101 +1,113 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: offline
3
- version: !ruby/object:Gem::Version
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.3
4
5
  prerelease:
5
- version: 0.0.2
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - Luke Chadwick
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
-
13
- date: 2011-06-09 00:00:00 Z
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
12
+ date: 2011-09-16 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
16
15
  name: httparty
17
- prerelease: false
18
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: &70275019162960 !ruby/object:Gem::Requirement
19
17
  none: false
20
- requirements:
21
- - - ">="
22
- - !ruby/object:Gem::Version
23
- version: "0"
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
24
22
  type: :runtime
25
- version_requirements: *id001
26
- - !ruby/object:Gem::Dependency
27
- name: thor
28
23
  prerelease: false
29
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: *70275019162960
25
+ - !ruby/object:Gem::Dependency
26
+ name: thor
27
+ requirement: &70275019162540 !ruby/object:Gem::Requirement
30
28
  none: false
31
- requirements:
32
- - - ">="
33
- - !ruby/object:Gem::Version
34
- version: "0"
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
35
33
  type: :runtime
36
- version_requirements: *id002
37
- - !ruby/object:Gem::Dependency
38
- name: rspec
39
34
  prerelease: false
40
- requirement: &id003 !ruby/object:Gem::Requirement
35
+ version_requirements: *70275019162540
36
+ - !ruby/object:Gem::Dependency
37
+ name: rake
38
+ requirement: &70275019162120 !ruby/object:Gem::Requirement
41
39
  none: false
42
- requirements:
43
- - - ">="
44
- - !ruby/object:Gem::Version
45
- version: "0"
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
46
44
  type: :development
47
- version_requirements: *id003
45
+ prerelease: false
46
+ version_requirements: *70275019162120
47
+ - !ruby/object:Gem::Dependency
48
+ name: rspec
49
+ requirement: &70275019161700 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: *70275019161700
48
58
  description: Tools for working with github
49
- email:
59
+ email:
50
60
  - luke.a.chadwick@gmail.com
51
- executables:
61
+ executables:
52
62
  - offline
53
63
  extensions: []
54
-
55
64
  extra_rdoc_files: []
56
-
57
- files:
65
+ files:
58
66
  - .gitignore
59
67
  - .rvmrc
68
+ - .travis.yml
60
69
  - Gemfile
61
70
  - LICENSE
62
71
  - README.md
63
72
  - Rakefile
64
73
  - bin/offline
65
74
  - lib/offline.rb
75
+ - lib/offline/app.rb
66
76
  - lib/offline/github.rb
77
+ - lib/offline/github/base.rb
78
+ - lib/offline/github/clone.rb
79
+ - lib/offline/github/mirror.rb
67
80
  - lib/offline/helpers.rb
68
81
  - lib/offline/version.rb
69
82
  - offline.gemspec
83
+ - spec/offline/app_spec.rb
70
84
  - spec/offline/github_spec.rb
71
85
  - spec/spec_helper.rb
72
86
  homepage: https://github.com/vertis/offline
73
87
  licenses: []
74
-
75
88
  post_install_message:
76
89
  rdoc_options: []
77
-
78
- require_paths:
90
+ require_paths:
79
91
  - lib
80
- required_ruby_version: !ruby/object:Gem::Requirement
92
+ required_ruby_version: !ruby/object:Gem::Requirement
81
93
  none: false
82
- requirements:
83
- - - ">="
84
- - !ruby/object:Gem::Version
85
- version: "0"
86
- required_rubygems_version: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ! '>='
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ required_rubygems_version: !ruby/object:Gem::Requirement
87
99
  none: false
88
- requirements:
89
- - - ">="
90
- - !ruby/object:Gem::Version
91
- version: "0"
100
+ requirements:
101
+ - - ! '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
92
104
  requirements: []
93
-
94
105
  rubyforge_project: offline
95
- rubygems_version: 1.7.2
106
+ rubygems_version: 1.8.10
96
107
  signing_key:
97
108
  specification_version: 3
98
109
  summary: Tools for working with github
99
- test_files:
110
+ test_files:
111
+ - spec/offline/app_spec.rb
100
112
  - spec/offline/github_spec.rb
101
113
  - spec/spec_helper.rb