forkreadme 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -1,2 +1,8 @@
1
1
  Gemfile.lock
2
+ coverage
2
3
  *.gem
4
+ test/fixtures/empty
5
+ test/fixtures/git_repo
6
+ test/fixtures/github_repo
7
+ test/fixtures/github_fork
8
+ test/fixtures/cassettes
data/README.md CHANGED
@@ -1,34 +1,67 @@
1
- This is a command-line utility for generating READMEs for GitHub forks.
1
+ # ForkReadme
2
2
 
3
- I have quite a few forks of popular repos which contain no useful indication of
4
- why they exist. Mostly they're hanging around waiting for a pull request to be
5
- merged into or rejected from the upstream repo. And since my changes are tucked
6
- away in feature branches, it's not immediately obvious to visitors (or me) why I
7
- created the fork, what I changed, and whether those changes have been merged
8
- upstream.
3
+ This is a command-line utility for generating useful READMEs for GitHub forks.
9
4
 
10
- My solution is to replace the `README.md` in the master branch of my fork with a
11
- note detailing what and why.
12
- This tool does that automatically.
5
+ I have quite a few forks which contain no useful indication of why they exist.
6
+ Mostly they're hanging around waiting for a pull request to be merged into or
7
+ rejected from the upstream repo. And since my changes are tucked away in feature
8
+ branches, it's not immediately obvious to visitors (including myself, six months
9
+ later) why I created the fork, what I changed, and whether or not those changes
10
+ have been merged upstream.
13
11
 
12
+ My solution is to create an orphan branch containing a README explaining what's
13
+ going on, and make that the default branch on GitHub. This little tool does the
14
+ first part automatically.
14
15
 
15
- ## Usage
16
16
 
17
- ```bash
17
+ ## Installation
18
+
19
+ Get it via [RubyGems] [gem]:
20
+
21
+ ```
18
22
  $ gem install forkreadme
19
- $ forkreadme generate
20
23
  ```
21
24
 
22
- Here's an [example of the output] [example].
25
+
26
+ ## Usage
27
+
28
+ 1. Create an empty branch with no history:
29
+
30
+ ```
31
+ $ git checkout --orphan forkreadme
32
+ $ git rm -rf .
33
+ ```
34
+
35
+ The `git rm` part is a bit scary, but it's just clearing the working area.
36
+ Check out `git help checkout` and search for `--orphan` for more info.
37
+
38
+ 2. Generate the README:
39
+
40
+ ```
41
+ $ forkreadme > README.md
42
+ ```
43
+
44
+ Here's [an example] [example] of the output.
45
+
46
+ 3. Push it to GitHub:
47
+
48
+ ```
49
+ $ git add README.md
50
+ $ git commit -m "Add README.md"
51
+ $ git push origin forkreadme
52
+ ```
53
+
54
+ 4. [Change the default branch] [set-branch] on GitHub.
23
55
 
24
56
 
25
57
  ## License
26
58
 
27
- [Fork README] [repo] is available under the [MIT license] [license].
59
+ ForkReadme is available under the [MIT license] [license].
28
60
 
29
61
 
30
62
 
31
63
 
32
- [repo]: https://github.com/adammck/forkreadme
33
- [license]: https://raw.github.com/adammck/forkreadme/master/LICENSE
34
- [example]: https://github.com/adammck/grit
64
+ [gem]: https://rubygems.org/gems/forkreadme
65
+ [example]: https://github.com/adammck/grit#readme
66
+ [set-branch]: https://github.com/blog/421-pick-your-default-branch
67
+ [license]: https://raw.github.com/adammck/forkreadme/master/LICENSE
@@ -0,0 +1,58 @@
1
+ #!/usr/bin/env rake
2
+ # vim: et ts=2 sw=2
3
+
4
+ require "fileutils"
5
+ require "rake/testtask"
6
+
7
+ Rake::TestTask.new do |t|
8
+ t.pattern = "test/test_*.rb"
9
+ end
10
+
11
+ # Check fixtures before running tests.
12
+ task :test => "fixtures:check"
13
+
14
+
15
+ namespace :fixtures do
16
+ def fixture name
17
+ File.join File.dirname(__FILE__), "test", "fixtures", name
18
+ end
19
+
20
+ desc "Check for test fixtures"
21
+ task :check do
22
+ unless File.exists? fixture "empty"
23
+ puts "Fixtures have not been fetched yet."
24
+ puts "Run $(rake fixtures:fetch) first."
25
+ exit 1
26
+ end
27
+ end
28
+
29
+ desc "Fetch test fixtures"
30
+ task :fetch do
31
+ empty = fixture "empty"
32
+ unless File.exists? empty
33
+ %x[mkdir #{empty}]
34
+ end
35
+
36
+ git_repo = fixture "git_repo"
37
+ unless File.exists? git_repo
38
+ %x[git init #{git_repo}]
39
+ end
40
+
41
+ github_repo = fixture "github_repo"
42
+ unless File.exists? github_repo
43
+ %x[git clone git://github.com/forkreadme-test-user-1/test.git #{github_repo} &>/dev/null]
44
+ end
45
+
46
+ github_fork = fixture "github_fork"
47
+ unless File.exists? github_fork
48
+ %x[git clone git://github.com/forkreadme-test-user-2/test.git #{github_fork} &>/dev/null]
49
+ end
50
+ end
51
+
52
+ desc "Delete test fixtures"
53
+ task :flush do
54
+ %w[empty git_repo github_repo github_fork].each do |name|
55
+ FileUtils.rm_rf fixture name
56
+ end
57
+ end
58
+ end
@@ -22,7 +22,7 @@ path = ARGV.shift || "."
22
22
 
23
23
  begin
24
24
  dir = File.expand_path path, Dir.pwd
25
- puts ForkReadme::Generator.new(dir, opts[:pullstatus]).readme
25
+ puts ForkReadme::Generator.new(dir).readme(opts[:pullstatus])
26
26
 
27
27
  rescue ForkReadme::Error => err
28
28
  $stderr.puts err
@@ -16,6 +16,9 @@ Gem::Specification.new do |gem|
16
16
  gem.add_dependency "trollop", "~> 1.16.2"
17
17
  gem.add_dependency "octokit", "~> 1.0.2"
18
18
 
19
+ gem.add_development_dependency "simplecov", "~> 0.6.4"
20
+ gem.add_development_dependency "vcr", "~> 2.1.1"
21
+
19
22
  gem.files = `git ls-files`.split($\)
20
23
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
21
24
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
@@ -11,6 +11,6 @@ module ForkReadme
11
11
  class NotGitHubRepo < Error
12
12
  end
13
13
 
14
- class NotFork < Error
14
+ class NotGitHubFork < Error
15
15
  end
16
16
  end
@@ -8,17 +8,16 @@ module ForkReadme
8
8
  class Generator
9
9
  include URI::REGEXP::PATTERN
10
10
 
11
- def initialize path, with_images
11
+ def initialize path
12
12
  @path = path
13
- @with_images = with_images
14
13
 
15
14
  repo_name = github_repo_name @path
16
15
  @repo = octokit.repo repo_name
17
16
  @parent = parent_of @repo
18
17
  end
19
18
 
20
- def readme
21
- intro + "\n\n" + (links.join "\n")
19
+ def readme with_images=false
20
+ intro + "\n\n" + (links(with_images).join "\n")
22
21
  end
23
22
 
24
23
  # Public: Returns the introduction paragraph.
@@ -27,21 +26,30 @@ module ForkReadme
27
26
  "This is a fork of #{link}, with pull requests:"
28
27
  end
29
28
 
30
- # Public: Returns a paragraph summarizing the pull requests.
31
- def links
29
+ # Public: Generate a paragraph summarizing the pull requests.
30
+ #
31
+ # with_images - Include pullstat.us images?
32
+ #
33
+ # Returns the paragraph as Markdown.
34
+ def links with_images
32
35
  pull_requests(@parent).select do |pull|
33
- pull.head.repo.id == @repo.id
36
+ @repo.id == (pull.head.repo && pull.head.repo.id)
34
37
 
35
38
  end.map do |pull|
36
- "* " + line_for(pull, @with_images)
39
+ "* " + line_for(pull, with_images)
37
40
  end
38
41
  end
39
42
 
40
43
  private
41
44
 
42
- # Private: Returns a line of Markdown summarizing a pull request.
43
- def line_for pull_request, with_images
44
- img = if with_images
45
+ # Private: Generate a one-line summary of a pull request.
46
+ #
47
+ # pull_request - The Octokit pull request to be summarized.
48
+ # with_image - Include a pullstat.us image?
49
+ #
50
+ # Returns the line as Markdown.
51
+ def line_for pull_request, with_image
52
+ img = if with_image
45
53
  image "Status of ##{pull_request.number}", status_image(pull_request)
46
54
  end
47
55
 
@@ -50,14 +58,14 @@ module ForkReadme
50
58
  end
51
59
 
52
60
  # Private: Returns the parent repo (as an Octokit repo) of an Octokit repo,
53
- # or raises NotFork if the repo does not have a parent.
61
+ # or raises NotGitHubFork if the repo does not have a parent.
54
62
  def parent_of child_repo
55
63
  if child_repo.parent
56
64
  parent_repo_name = full_name child_repo.parent
57
65
  octokit.repo parent_repo_name
58
66
  else
59
67
  child_name = full_name child_repo
60
- raise NotFork.new "Not a GitHub fork: #{child_name}"
68
+ raise NotGitHubFork.new "Not a GitHub fork: #{child_name}"
61
69
  end
62
70
  end
63
71
 
@@ -71,14 +79,6 @@ module ForkReadme
71
79
  "!" + link_to(alt_text, href)
72
80
  end
73
81
 
74
- # Private: Returns an Array containing the logins of all collaborators for
75
- # an Octokit repo.
76
- def collaborator_logins repo
77
- octokit.collabs(full_name repo).map do |user|
78
- user.login
79
- end
80
- end
81
-
82
82
  # Private: Returns the URL of the status image (via pullstat.us) for an
83
83
  # Octokit pull request.
84
84
  def status_image pull_request
@@ -98,7 +98,13 @@ module ForkReadme
98
98
  # Private: Returns the full GitHub repo name (e.g. adammck/forkreadme) of a
99
99
  # Git working directory, or raises NotGitHubRepo.
100
100
  def github_repo_name path
101
- clone_url = parse_url remote_url path
101
+ origin = remote_origin_url path
102
+
103
+ if origin == ""
104
+ raise NotGitHubRepo.new "No remote origin URL: #{path}"
105
+ end
106
+
107
+ clone_url = parse_url origin
102
108
 
103
109
  if clone_url.host.downcase != "github.com"
104
110
  raise NotGitHubRepo.new "Not a GitHub repo: #{path}"
@@ -117,9 +123,9 @@ module ForkReadme
117
123
  @ok ||= Octokit.new(:auto_traversal=>true)
118
124
  end
119
125
 
120
- # Private: Returns the remote clone URL of a Git working directory, or
121
- # raises NotGitRepo.
122
- def remote_url path
126
+ # Private: Returns the remote origin URL of a Git working directory (which
127
+ # may be an empty string, if the repo has no origin) or raises NotGitRepo.
128
+ def remote_origin_url path
123
129
  unless is_working_dir path
124
130
  raise NotGitRepo.new "Not a Git repo: #{path}"
125
131
  end
@@ -150,12 +156,12 @@ module ForkReadme
150
156
 
151
157
  # Private: Returns a filename with the extension removed.
152
158
  def chop_extension filename
153
- filename.sub /\.\w+$/, ""
159
+ filename.sub %r{\.\w+$}, ""
154
160
  end
155
161
 
156
162
  # Private: Returns a filename with the leading slash removed.
157
163
  def chop_leading_slash filename
158
- filename.sub /^\//, ""
164
+ filename.sub %r{^/}, ""
159
165
  end
160
166
  end
161
167
  end
@@ -2,5 +2,5 @@
2
2
  # vim: et ts=2 sw=2
3
3
 
4
4
  module ForkReadme
5
- VERSION = "0.0.2"
5
+ VERSION = "0.0.3"
6
6
  end
@@ -0,0 +1,5 @@
1
+ This is a fork of [test] (https://github.com/forkreadme-test-user-1/test), with pull requests:
2
+
3
+ * [Add empty GAMMA file.] (https://github.com/forkreadme-test-user-1/test/pull/3) ![Status of #3] (https://pullstat.us/forkreadme-test-user-1/test/pull/3)
4
+ * [Add empty BETA file.] (https://github.com/forkreadme-test-user-1/test/pull/2) ![Status of #2] (https://pullstat.us/forkreadme-test-user-1/test/pull/2)
5
+ * [Add empty ALPHA file.] (https://github.com/forkreadme-test-user-1/test/pull/1) ![Status of #1] (https://pullstat.us/forkreadme-test-user-1/test/pull/1)
@@ -0,0 +1,5 @@
1
+ This is a fork of [test] (https://github.com/forkreadme-test-user-1/test), with pull requests:
2
+
3
+ * [Add empty GAMMA file.] (https://github.com/forkreadme-test-user-1/test/pull/3)
4
+ * [Add empty BETA file.] (https://github.com/forkreadme-test-user-1/test/pull/2)
5
+ * [Add empty ALPHA file.] (https://github.com/forkreadme-test-user-1/test/pull/1)
@@ -0,0 +1,44 @@
1
+ #!/usr/bin/env ruby
2
+ # vim: et ts=2 sw=2
3
+
4
+ require File.expand_path(File.dirname(__FILE__) + "/test_helper.rb")
5
+
6
+ describe Generator do
7
+ describe "Errors" do
8
+ it "rejects paths which are not git repos" do
9
+ assert_raises(NotGitRepo) do
10
+ Generator.new fixture("empty")
11
+ end
12
+ end
13
+
14
+ it "rejects repos which are not hosted on github" do
15
+ assert_raises(NotGitHubRepo) do
16
+ Generator.new fixture("git_repo")
17
+ end
18
+ end
19
+
20
+ it "rejects github repos which are not forks" do
21
+ VCR.use_cassette("github_repo") do
22
+ assert_raises(NotGitHubFork) do
23
+ Generator.new fixture("github_repo")
24
+ end
25
+ end
26
+ end
27
+ end
28
+
29
+ describe "README" do
30
+ it "generates a readme without images" do
31
+ VCR.use_cassette("github_fork") do
32
+ g = Generator.new fixture("github_fork")
33
+ assert_equal File.read(fixture("README_without_images.md")), g.readme
34
+ end
35
+ end
36
+
37
+ it "generates a readme with images" do
38
+ VCR.use_cassette("github_fork") do
39
+ g = Generator.new fixture("github_fork")
40
+ assert_equal File.read(fixture("README_with_images.md")), g.readme(true)
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env ruby
2
+ # vim: et ts=2 sw=2
3
+
4
+ require "simplecov"
5
+ SimpleCov.start
6
+
7
+ require "vcr"
8
+ require "minitest/autorun"
9
+
10
+ require "forkreadme"
11
+ include ForkReadme
12
+
13
+ VCR.configure do |c|
14
+ c.cassette_library_dir = "test/fixtures/cassettes"
15
+ c.hook_into :faraday
16
+ end
17
+
18
+ def fixture name
19
+ File.join File.dirname(__FILE__), "fixtures", name
20
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: forkreadme
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
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-05-16 00:00:00.000000000 Z
12
+ date: 2012-05-25 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: trollop
@@ -43,6 +43,38 @@ dependencies:
43
43
  - - ~>
44
44
  - !ruby/object:Gem::Version
45
45
  version: 1.0.2
46
+ - !ruby/object:Gem::Dependency
47
+ name: simplecov
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: 0.6.4
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 0.6.4
62
+ - !ruby/object:Gem::Dependency
63
+ name: vcr
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: 2.1.1
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: 2.1.1
46
78
  description:
47
79
  email:
48
80
  - adam.mckaig@gmail.com
@@ -55,12 +87,17 @@ files:
55
87
  - Gemfile
56
88
  - LICENSE
57
89
  - README.md
90
+ - Rakefile
58
91
  - bin/forkreadme
59
92
  - forkreadme.gemspec
60
93
  - lib/forkreadme.rb
61
94
  - lib/forkreadme/errors.rb
62
95
  - lib/forkreadme/generator.rb
63
96
  - lib/forkreadme/version.rb
97
+ - test/fixtures/README_with_images.md
98
+ - test/fixtures/README_without_images.md
99
+ - test/test_generator.rb
100
+ - test/test_helper.rb
64
101
  homepage: https://github.com/adammck/forkreadme
65
102
  licenses:
66
103
  - MIT
@@ -86,4 +123,8 @@ rubygems_version: 1.8.23
86
123
  signing_key:
87
124
  specification_version: 3
88
125
  summary: Generate useful READMEs for GitHub forks
89
- test_files: []
126
+ test_files:
127
+ - test/fixtures/README_with_images.md
128
+ - test/fixtures/README_without_images.md
129
+ - test/test_generator.rb
130
+ - test/test_helper.rb