forkreadme 0.0.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.
data/.gitignore ADDED
@@ -0,0 +1 @@
1
+ Gemfile.lock
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+ # vim: et ts=2 sw=2
3
+
4
+ source "https://rubygems.org"
5
+ gemspec
data/bin/forkreadme ADDED
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env ruby
2
+ # vim: et ts=2 sw=2
3
+
4
+ require "forkreadme"
5
+ require "thor"
6
+
7
+ module ForkReadme
8
+ class App < Thor
9
+
10
+ desc "generate [DIR]", "Generate a README for a GitHub fork repo"
11
+ method_option :path, :default=>"."
12
+ def generate path=""
13
+ begin
14
+ dir = File.expand_path path, Dir.pwd
15
+ puts Generator.new(dir).readme
16
+
17
+ rescue ForkReadme::Error => err
18
+ $stderr.puts err
19
+ exit false
20
+ end
21
+ end
22
+ end
23
+ end
24
+
25
+ ForkReadme::App.start
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env ruby
2
+ # vim: et ts=2 sw=2
3
+
4
+ require File.expand_path("../lib/forkreadme/version", __FILE__)
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "forkreadme"
8
+ gem.version = ForkReadme::VERSION
9
+
10
+ gem.authors = ["Adam Mckaig"]
11
+ gem.email = ["adam.mckaig@gmail.com"]
12
+ gem.summary = %q{Generate useful READMEs for GitHub forks}
13
+ gem.homepage = "https://github.com/adammck/forkreadme"
14
+
15
+ gem.add_dependency "thor", "~> 0.14.6"
16
+ gem.add_dependency "octokit", "~> 1.0.2"
17
+
18
+ gem.files = `git ls-files`.split($\)
19
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
20
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
21
+ gem.require_paths = ["lib"]
22
+ end
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+ # vim: et ts=2 sw=2
3
+
4
+ module ForkReadme
5
+ class Error < StandardError
6
+ end
7
+
8
+ class NotRepo < Error
9
+ end
10
+
11
+ class NotFork < Error
12
+ end
13
+ end
@@ -0,0 +1,119 @@
1
+ #!/usr/bin/env ruby
2
+ # vim: et ts=2 sw=2
3
+
4
+ require "uri"
5
+ require "octokit"
6
+
7
+ module ForkReadme
8
+ class Generator
9
+ include URI::REGEXP::PATTERN
10
+
11
+ def initialize dir
12
+ @dir = dir
13
+ end
14
+
15
+ def readme
16
+ repo_name = github_repo_name @dir
17
+
18
+ if repo_name.empty?
19
+ raise NotRepo.new "Not a GitHub repo: #{@dir}"
20
+ end
21
+
22
+ repo = octokit.repo repo_name
23
+
24
+ unless repo.fork
25
+ raise NotFork.new "Not a GitHub fork: #{repo_name}"
26
+ end
27
+
28
+ parent_name = full_name repo.parent
29
+ parent = octokit.repo parent_name
30
+
31
+ s = []
32
+ s << "This is a fork of [#{parent.name}] (#{parent.html_url}), with pull requests:"
33
+ s << ""
34
+
35
+ logins = collaborator_logins repo
36
+ my_pulls = pull_requests(parent).select do |pull|
37
+ pull.user and logins.include?(pull.user.login)
38
+ end
39
+
40
+ my_pulls.each do |short_pull|
41
+ pull = pull_request(parent, short_pull.number)
42
+ if repo_name == full_name(pull.head.repo)
43
+ s << " * [#{pull.title}] (#{pull.html_url})"
44
+ end
45
+ end
46
+
47
+ s.join "\n"
48
+ end
49
+
50
+
51
+ private
52
+
53
+ # Private: Returns an Array containing the logins of all collaborators for an
54
+ # Octokit repo.
55
+ def collaborator_logins repo
56
+ octokit.collabs(full_name repo).map do |user|
57
+ user.login
58
+ end
59
+ end
60
+
61
+ # Private: Returns all pull request summaries (as returned by the "List pull
62
+ # requests" API, and wrapped by Octokit) for an Octokit repo.
63
+ def pull_requests repo
64
+ name = full_name repo
65
+
66
+ %w[open closed].reduce([]) do |memo, state|
67
+ memo | octokit.pulls(name, state, :per_page=>100)
68
+ end
69
+ end
70
+
71
+ # Private: Return full pull request (as returned by the "Get a single pull
72
+ # request" API, and wrapped by Octokit) to an Octokit repo and pull number.
73
+ def pull_request repo, number
74
+ octokit.pull full_name(repo), number
75
+ end
76
+
77
+ # Private: Returns the full GitHub repo name of a Git working directory.
78
+ def github_repo_name path
79
+ clone_url = parse_url remote_url path
80
+ chop_extension clone_url.path
81
+ end
82
+
83
+ # Private: Returns the full GitHub repo name of an Octokit repo.
84
+ def full_name repo
85
+ "#{repo.owner.login}/#{repo.name}"
86
+ end
87
+
88
+ # Private: Returns a configured Octokit client.
89
+ def octokit
90
+ @ok ||= Octokit.new(:auto_traversal=>true)
91
+ end
92
+
93
+ # Private: Returns the remote url of a Git working directory.
94
+ def remote_url path
95
+ %x{git config --file #{path}/.git/config --get remote.origin.url}
96
+ end
97
+
98
+ # Private: Returns a parsed URL. Wraps `URI.parse` with support for Git's
99
+ # SCP-like syntax (look like: git@github.com:adammck/whatever.git).
100
+ def parse_url url
101
+ begin
102
+ URI.parse(url)
103
+
104
+ rescue URI::InvalidURIError
105
+ if m = url.match("^(#{USERINFO})@(#{HOST}):(#{REL_PATH})$")
106
+ URI::Generic.new "ssh", m[1], m[2], 22, nil, m[3], nil, nil, nil
107
+
108
+ else
109
+ raise
110
+ end
111
+ end
112
+ end
113
+
114
+ # Private: Returns a filename with the extension removed.
115
+ def chop_extension filename
116
+ filename.sub /\.\w+$/, ""
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ # vim: et ts=2 sw=2
3
+
4
+ module ForkReadme
5
+ VERSION = "0.0.1"
6
+ end
data/lib/forkreadme.rb ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+ # vim: et ts=2 sw=2
3
+
4
+ module ForkReadme
5
+ end
6
+
7
+ require "forkreadme/errors"
8
+ require "forkreadme/generator"
9
+ require "forkreadme/version"
metadata ADDED
@@ -0,0 +1,76 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: forkreadme
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Adam Mckaig
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-04-26 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: thor
16
+ requirement: &70204084253700 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 0.14.6
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70204084253700
25
+ - !ruby/object:Gem::Dependency
26
+ name: octokit
27
+ requirement: &70204084253100 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ~>
31
+ - !ruby/object:Gem::Version
32
+ version: 1.0.2
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *70204084253100
36
+ description:
37
+ email:
38
+ - adam.mckaig@gmail.com
39
+ executables:
40
+ - forkreadme
41
+ extensions: []
42
+ extra_rdoc_files: []
43
+ files:
44
+ - .gitignore
45
+ - Gemfile
46
+ - bin/forkreadme
47
+ - forkreadme.gemspec
48
+ - lib/forkreadme.rb
49
+ - lib/forkreadme/errors.rb
50
+ - lib/forkreadme/generator.rb
51
+ - lib/forkreadme/version.rb
52
+ homepage: https://github.com/adammck/forkreadme
53
+ licenses: []
54
+ post_install_message:
55
+ rdoc_options: []
56
+ require_paths:
57
+ - lib
58
+ required_ruby_version: !ruby/object:Gem::Requirement
59
+ none: false
60
+ requirements:
61
+ - - ! '>='
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
64
+ required_rubygems_version: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ requirements: []
71
+ rubyforge_project:
72
+ rubygems_version: 1.8.15
73
+ signing_key:
74
+ specification_version: 3
75
+ summary: Generate useful READMEs for GitHub forks
76
+ test_files: []