github-control 0.9.0 → 0.9.1

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.
@@ -1,14 +1,7 @@
1
1
  require 'yaml'
2
-
3
- begin
4
- require 'json'
5
- rescue LoadError
6
- require 'rubygems'
7
- require 'json'
8
- end
9
-
10
- require 'rest_client'
2
+ require 'json'
11
3
  require 'nokogiri'
4
+ require 'rack/client'
12
5
 
13
6
  module GithubControl
14
7
  class Error < StandardError; end
@@ -25,7 +18,6 @@ require 'github-control/user'
25
18
  require 'github-control/repository'
26
19
  require 'github-control/repositories'
27
20
  require 'github-control/collaborators'
28
- require 'github-control/post_receive_urls'
29
21
 
30
22
  require 'github-control/action'
31
23
  require 'github-control/actions/repositories'
@@ -1,5 +1,13 @@
1
1
  module GithubControl
2
2
  class Action
3
+ def self.register(name)
4
+ Action.set[name.to_s] = self
5
+ end
6
+
7
+ def self.set
8
+ @set ||= {}
9
+ end
10
+
3
11
  def initialize(cli)
4
12
  @cli = cli
5
13
  end
@@ -1,6 +1,8 @@
1
1
  module GithubControl
2
2
  module Actions
3
3
  class AddCollaborators < Action
4
+ register :add_collab
5
+
4
6
  def add_options(parser)
5
7
  parser.on("-R name", "--repository name", "The repository on Github") do |repository_name|
6
8
  options[:repository_name] = repository_name
@@ -17,13 +19,13 @@ module GithubControl
17
19
  if repository.collaborators.include?(user)
18
20
  puts "#{user.name} is already a collaborator"
19
21
  else
20
- repository.collaborators << user
22
+ repository.collaborators.create(user.name)
21
23
  puts "Done"
22
24
  end
23
25
  end
24
26
 
25
27
  def repository
26
- @cli.console.current_user.repo_for(options[:repository_name] || raise(ProblemWithOptions, "Please specify a repository"))
28
+ @cli.console.current_user.repositories.get(options[:repository_name] || raise(ProblemWithOptions, "Please specify a repository"))
27
29
  end
28
30
 
29
31
  def user
@@ -1,6 +1,8 @@
1
1
  module GithubControl
2
2
  module Actions
3
3
  class Collaborators < Action
4
+ register :collab
5
+
4
6
  def add_options(parser)
5
7
  parser.on("-R name", "--repository name", "The repository on Github") do |repository_name|
6
8
  options[:repository_name] = repository_name
@@ -20,11 +22,15 @@ module GithubControl
20
22
  end
21
23
 
22
24
  def repository
23
- user.repo_for(options[:repository_name] || raise(ProblemWithOptions, "Please specify a repository"))
25
+ user.repositories.get(options[:repository_name] || raise(ProblemWithOptions, "Please specify a repository"))
24
26
  end
25
27
 
26
28
  def user
27
- @cli.console.user_for(options[:user_name] || raise(ProblemWithOptions, "Please specify a user"))
29
+ if options[:user_name]
30
+ @cli.console.user_for(options[:user_name])
31
+ else
32
+ @cli.console.current_user
33
+ end
28
34
  end
29
35
  end
30
36
  end
@@ -1,6 +1,8 @@
1
1
  module GithubControl
2
2
  module Actions
3
3
  class RemoveCollaborators < Action
4
+ register :remove_collab
5
+
4
6
  def add_options(parser)
5
7
  parser.on("-R name", "--repository name", "The repository on Github") do |repository_name|
6
8
  options[:repository_name] = repository_name
@@ -17,13 +19,13 @@ module GithubControl
17
19
  unless repository.collaborators.include?(user)
18
20
  puts "#{user.name} is not a collaborator"
19
21
  else
20
- repository.collaborators.delete(user)
22
+ repository.collaborators.delete(user.name)
21
23
  puts "Done"
22
24
  end
23
25
  end
24
26
 
25
27
  def repository
26
- @cli.console.current_user.repo_for(options[:repository_name] || raise(ProblemWithOptions, "Please specify a repository"))
28
+ @cli.console.current_user.repositories.get(options[:repository_name] || raise(ProblemWithOptions, "Please specify a repository"))
27
29
  end
28
30
 
29
31
  def user
@@ -1,6 +1,8 @@
1
1
  module GithubControl
2
2
  module Actions
3
3
  class Repositories < Action
4
+ register :list
5
+
4
6
  def add_options(parser)
5
7
  parser.on("-U name", "--user name", "The user to list the repositories") do |user_name|
6
8
  options[:user_name] = user_name
@@ -3,6 +3,8 @@ require 'irb'
3
3
  module GithubControl
4
4
  module Actions
5
5
  class Shell < Action
6
+ register :shell
7
+
6
8
  def add_options(parser)
7
9
  end
8
10
 
@@ -15,8 +15,6 @@ module GithubControl
15
15
  option_parser.parse!(@args)
16
16
  current_action.call
17
17
  rescue ProblemWithOptions, OptionParser::ParseError => e
18
- puts e.backtrace
19
- $stderr.puts
20
18
  $stderr.puts e.message
21
19
  $stderr.puts
22
20
  $stderr.puts option_parser
@@ -28,46 +26,44 @@ module GithubControl
28
26
  end
29
27
 
30
28
  def create_action
31
- case action_name
32
- when "list"
33
- Actions::Repositories.new(self)
34
- when "shell"
35
- Actions::Shell.new(self)
36
- when "collab"
37
- Actions::Collaborators.new(self)
38
- when "add_collab"
39
- Actions::AddCollaborators.new(self)
40
- when "remove_collab"
41
- Actions::RemoveCollaborators.new(self)
29
+ if action = Action.set[action_name]
30
+ action.new(self)
42
31
  else
43
- raise ProblemWithOptions, "#{action_name} is not a valid action"
32
+ raise ProblemWithOptions, "#{action_name} is not a valid action\nChoose one of #{available_actions}"
44
33
  end
45
34
  end
46
35
 
47
36
  def action_name
48
- @action_name ||= @args.shift || raise(ProblemWithOptions, "Please provide an action to run")
37
+ @action_name ||= @args.shift || raise(ProblemWithOptions,
38
+ "Please provide an action to run\nChoose one of #{available_actions}")
39
+ end
40
+
41
+ def available_actions
42
+ Action.set.keys.join(", ")
49
43
  end
50
44
 
51
45
  def console
52
- @console ||= Console.new(user_config)
46
+ @console ||= Console.new(config)
53
47
  end
54
48
 
55
- def user_config
56
- config["user"] || raise(ProblemWithOptions, "You need to provide user data in the YAML file")
49
+ def environment
50
+ @env ||= options[:environment] || raise(ProblemWithOptions,
51
+ "Please provide an environment to use")
57
52
  end
58
53
 
59
54
  def config
60
- @config ||= YAML.load_file(config_filename)
55
+ @config ||= YAML.load_file(config_file)[environment]
61
56
  end
62
57
 
63
- def config_filename
64
- options[:config_filename] || raise(ProblemWithOptions, "You need to provide the path to the YAML filename")
58
+ def config_file
59
+ options[:config] || raise(ProblemWithOptions,
60
+ "You need to provide the path to the YAML filename")
65
61
  end
66
62
 
67
63
  def options
68
64
  @options ||= {
69
65
  :debug => false,
70
- :argv => @args,
66
+ :argv => @args,
71
67
  }
72
68
  end
73
69
 
@@ -86,7 +82,11 @@ module GithubControl
86
82
  }
87
83
 
88
84
  opts.on("-c filename", "--config filename", "Load the config from this YAML file") do |filename|
89
- options[:config_filename] = filename
85
+ options[:config] = filename
86
+ end
87
+
88
+ opts.on("-e ENV", "Access this environment") do |env|
89
+ options[:environment] = env
90
90
  end
91
91
 
92
92
  opts.on("-v", "--version", "Display the github version, and exit.") do
@@ -11,17 +11,33 @@ module GithubControl
11
11
  def create(user)
12
12
  @repository.owner.cli.post("/repos/collaborators/" \
13
13
  "#{@repository.name}/add/#{user}")
14
+ if loaded?
15
+ set << @repository.owner.cli.user_for(user)
16
+ else
17
+ set
18
+ end
14
19
  end
15
20
 
16
21
  def delete(user)
17
22
  @repository.owner.cli.post("/repos/collaborators/" \
18
23
  "#{@repository.name}/remove/#{user}")
24
+ if loaded?
25
+ set.delete_if { |u| u.name == user }
26
+ end
19
27
  end
20
28
 
21
29
  def each(&block)
22
30
  set.each(&block)
23
31
  end
24
32
 
33
+ def size
34
+ set.size
35
+ end
36
+
37
+ def loaded?
38
+ @set
39
+ end
40
+
25
41
  def set
26
42
  @set ||= json_data["collaborators"].map { |name|
27
43
  @repository.owner.cli.user_for(name)
@@ -15,32 +15,18 @@ module GithubControl
15
15
 
16
16
  def post(path, params={})
17
17
  params.merge!(:login => user_name, :token => user_token)
18
- data = JSON.parse(RestClient.post(url_for(path), params))
18
+ data = JSON.parse(Rack::Client.post(url_for(path), params).body)
19
19
  if error = data["error"]
20
- raise APIError, error.first["error"]
20
+ raise APIError, error.inspect
21
21
  else
22
22
  data
23
23
  end
24
24
  end
25
25
 
26
- def get(path, params={})
27
- RestClient.get(url_for(path), params)
28
- end
29
-
30
26
  def url_for(path)
31
27
  "http://github.com/api/v2/json#{path}"
32
28
  end
33
29
 
34
- def cookies
35
- @cookies ||= session_cookie
36
- end
37
-
38
- def session_cookie
39
- response = raw_post("/session", {:login => user_name,
40
- :password => user_password}, {}, :auto_redirect => false)
41
- response.headers[:set_cookie].split(";").first
42
- end
43
-
44
30
  def user_name
45
31
  @user_config["name"] ||
46
32
  raise(ProblemWithOptions, "You need to provide the user name in the YAML file")
@@ -18,6 +18,10 @@ module GithubControl
18
18
  end
19
19
 
20
20
  def [](name)
21
+ get(name)
22
+ end
23
+
24
+ def get(name)
21
25
  set.detect { |r| r.name == name }
22
26
  end
23
27
 
@@ -1,3 +1,3 @@
1
1
  module GithubControl
2
- VERSION = "0.9.0"
2
+ VERSION = "0.9.1"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: github-control
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 0.9.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tim Carey-Smith
@@ -9,28 +9,38 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-11-28 00:00:00 -08:00
12
+ date: 2009-12-29 00:00:00 +13:00
13
13
  default_executable: github-control
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
- name: rest-client
16
+ name: json
17
17
  type: :runtime
18
18
  version_requirement:
19
19
  version_requirements: !ruby/object:Gem::Requirement
20
20
  requirements:
21
21
  - - ">="
22
22
  - !ruby/object:Gem::Version
23
- version: 0.9.2
23
+ version: "0"
24
24
  version:
25
25
  - !ruby/object:Gem::Dependency
26
- name: json
26
+ name: nokogiri
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: "0"
34
+ version:
35
+ - !ruby/object:Gem::Dependency
36
+ name: rack-client
27
37
  type: :runtime
28
38
  version_requirement:
29
39
  version_requirements: !ruby/object:Gem::Requirement
30
40
  requirements:
31
41
  - - ">="
32
42
  - !ruby/object:Gem::Version
33
- version: 1.1.3
43
+ version: 0.2.2
34
44
  version:
35
45
  description: github-control allows you to interact with Github through a nice ruby interface
36
46
  email: tim@spork.in
@@ -51,16 +61,11 @@ files:
51
61
  - lib/github-control/cli.rb
52
62
  - lib/github-control/collaborators.rb
53
63
  - lib/github-control/console.rb
54
- - lib/github-control/post_receive_urls.rb
55
64
  - lib/github-control/repositories.rb
56
65
  - lib/github-control/repository.rb
57
66
  - lib/github-control/user.rb
58
67
  - lib/github-control/version.rb
59
68
  - lib/github-control.rb
60
- - spec/github_control_spec.rb
61
- - spec/models/post_receive_urls_spec.rb
62
- - spec/models/user_spec.rb
63
- - spec/spec_helper.rb
64
69
  has_rdoc: true
65
70
  homepage: http://github.com/halorgium/github-control
66
71
  licenses: []
@@ -1,54 +0,0 @@
1
- module GithubControl
2
- class PostReceiveUrls
3
- include Enumerable
4
-
5
- def initialize(repository)
6
- @repository = repository
7
- end
8
- attr_reader :repository
9
-
10
- def <<(url)
11
- update_with(set + [url])
12
- end
13
-
14
- def delete(url)
15
- update_with(set - [url])
16
- end
17
-
18
- def clear
19
- update_with([])
20
- end
21
-
22
- def update_with(urls)
23
- form_data = []
24
- urls.each do |url|
25
- value = URI.escape(url.to_s, Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))
26
- form_data << "urls[]=#{value}"
27
- end
28
- @repository.owner.cli.scrape_post("/#{@repository.owner.name}/#{@repository.name}/edit/postreceive_urls",
29
- form_data.join("&"), :accept => 'text/javascript')
30
- end
31
-
32
- def empty?
33
- set.empty?
34
- end
35
-
36
- def each(&block)
37
- set.each(&block)
38
- end
39
-
40
- def set
41
- set = []
42
- doc = Nokogiri::HTML(html_data)
43
- doc.search("fieldset#postreceive_urls.service-hook form p input[name='urls[]']").each do |input|
44
- set << input["value"] if input["value"]
45
- end
46
- set
47
- end
48
-
49
- def html_data
50
- @repository.owner.cli.scrape_get("/#{@repository.owner.name}/#{@repository.name}/edit/hooks")
51
- end
52
- end
53
- end
54
-
@@ -1,53 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe "Github Control" do
4
- def config
5
- @config ||= YAML.load_file("spec/config.yml")["user"]
6
- end
7
-
8
- def console
9
- @console ||= GithubControl::Console.new(config)
10
- end
11
-
12
- def current_user
13
- @user ||= console.current_user
14
- end
15
-
16
- before(:all) do
17
- RestClient.log = "restclient.log"
18
- end
19
-
20
- before(:each) do
21
- current_user.repositories.destroy
22
- end
23
-
24
- it "creates a public repository" do
25
- current_user.should have(:no).repositories
26
- current_user.repositories.create("public-repo", :public)
27
- current_user.should have(1).repositories
28
- current_user.repositories["public-repo"].should be_public
29
- end
30
-
31
- it "creates a private repository" do
32
- current_user.should have(:no).private_repositories
33
- current_user.repositories.create("private-repo", :private)
34
- current_user.should have(1).private_repositories
35
- current_user.repositories["private-repo"].should be_private
36
- end
37
-
38
- it "creates and destroys collaborators on a repository" do
39
- repo = current_user.repositories.create("test-repo", :public)
40
- repo.collaborators << GithubControl::User.new("atmos", console)
41
- repo.collaborators << GithubControl::User.new("tim", console)
42
- repo.collaborators << GithubControl::User.new("ben", console)
43
- repo.collaborators << GithubControl::User.new("sr", console)
44
-
45
- repo.should have(4).collaborators
46
-
47
- # sorry dude :(
48
- repo.collaborators.delete("atmos")
49
- repo.should have(3).collaborators
50
- end
51
-
52
- it "adds and remove post-receive urls"
53
- end
@@ -1,46 +0,0 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
2
-
3
- describe "Post-receive URLs" do
4
- describe "for a repository with a single URL" do
5
- before(:each) do
6
- @repo = @console.current_user.repo_for("with-one-post-receive-url")
7
- end
8
-
9
- it "can be fetched" do
10
- @repo.post_receive_urls.to_a.should == ["http://github-control.r.spork.in/post-receive"]
11
- end
12
- end
13
-
14
- describe "for a repository with no URLs" do
15
- before(:each) do
16
- @repo = @console.current_user.repo_for("with-no-post-receive-urls")
17
- @repo.post_receive_urls.clear
18
- end
19
-
20
- it "can be fetched" do
21
- @repo.post_receive_urls.should be_empty
22
- end
23
-
24
- it "adds a new URL" do
25
- @repo.post_receive_urls << "http://example.org"
26
- @repo.post_receive_urls.to_a.should == ["http://example.org"]
27
- end
28
- end
29
-
30
- describe "for a repository with 3 URLs" do
31
- before(:each) do
32
- @repo = @console.current_user.repo_for("with-three-post-receive-urls")
33
- urls = ["http://example.com/1", "http://example.com/2", "http://example.com/3"]
34
- @repo.post_receive_urls.update_with(urls)
35
- end
36
-
37
- it "can be fetched" do
38
- @repo.post_receive_urls.to_a.should == ["http://example.com/1", "http://example.com/2", "http://example.com/3"]
39
- end
40
-
41
- it "adds a new URL" do
42
- @repo.post_receive_urls.delete("http://example.com/1")
43
- @repo.post_receive_urls.to_a.should == ["http://example.com/2", "http://example.com/3"]
44
- end
45
- end
46
- end
File without changes
data/spec/spec_helper.rb DELETED
@@ -1,12 +0,0 @@
1
- require 'spec'
2
- require 'randexp'
3
- require "pp"
4
-
5
- require File.dirname(__FILE__) + '/../lib/github-control'
6
-
7
- Spec::Runner.configure do |config|
8
- config.mock_with(:rr)
9
- config.before(:all) do
10
- @console = GithubControl::Console.new(YAML.load_file(File.dirname(__FILE__) + '/config.yml')["user"])
11
- end
12
- end