contributors 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
+ .rvmrc
data/CHANGELOG ADDED
@@ -0,0 +1,3 @@
1
+ = Version 0.1
2
+ * The actual library.
3
+ * Nake tasks for generating CONTRIBUTORS.
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 Jakub Stastny aka botanicus
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.textile ADDED
@@ -0,0 +1,42 @@
1
+ h1. About
2
+
3
+ The contributors gem is useful for getting informations about project contributors. It assumes that Git is used. In particular it can be used for generating CONTRIBUTORS file.
4
+
5
+ h1. Usage
6
+
7
+ Just install it through RubyGems:
8
+
9
+ <pre>
10
+ gem install contributors
11
+ </pre>
12
+
13
+ Use the API:
14
+
15
+ <pre>
16
+ require "contributors"
17
+ </pre>
18
+
19
+ Use the "Nake":https://github.com/botanicus/nake tasks:
20
+
21
+ <pre>
22
+ load "contributors.nake"
23
+
24
+ # OPTIONAL: Where the project is located. Defaults to Dir.pwd.
25
+ Task[:contributors].config[:path] = Dir.pwd
26
+
27
+ # OPTIONAL: Where the CONTRIBUTORS file is located.
28
+ # It can be either a string or a callable object. Defaults to:
29
+ # Proc.new { File.join(task.config[:path], "CONTRIBUTORS") }
30
+ Task[:contributors].config[:output_path] = Proc.new { File.join(task.config[:path], "CONTRIBUTORS") }
31
+
32
+ # OPTIONAL: How to sort results, options are :commits or :LOC, :LOC is default.
33
+ Task[:contributors].config[:sort_by] = :LOC
34
+
35
+ # OPTIONAL: An array of regular expressions which should be ignored.
36
+ # Defaults to Contributors::IGNORED_PATTERNS, which is [/^vendor\//, /^gems\//, /.+\.gem$/].
37
+ Task[:contributors].config[:ignore] = Contributors::IGNORED_PATTERNS
38
+
39
+ # OPTIONAL: How to format each line. E-mail is author's e-mail and in data
40
+ there are keys :name, :commits and :LOC. Commits and LOC are both integers.
41
+ Task[:contributors].config[:format] = -> { |email, data| "#{email}: #{data[:LOC]}" }
42
+ </pre>
@@ -0,0 +1,38 @@
1
+ #!/usr/bin/env gem build
2
+ # encoding: utf-8
3
+
4
+ require "base64"
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "contributors"
8
+ s.version = "0.1"
9
+ s.authors = ["Jakub Stastny aka botanicus"]
10
+ s.homepage = "http://github.com/botanicus/contributors"
11
+ s.summary = "API for getting info about contributors of a project which is in Git."
12
+ s.description = "The contributors gem is useful for getting informations about project contributors. It assumes that Git is used. In particular it can be used for generating CONTRIBUTORS file."
13
+ s.cert_chain = nil
14
+ s.email = Base64.decode64("c3Rhc3RueUAxMDFpZGVhcy5jeg==\n")
15
+ s.has_rdoc = true
16
+
17
+ # files
18
+ s.files = `git ls-files`.split("\n")
19
+
20
+ s.require_paths = ["lib"]
21
+
22
+ # Ruby version
23
+ # Current JRuby with --1.9 switch has RUBY_VERSION set to "1.9.2dev"
24
+ # and RubyGems don't play well with it, so we have to set minimal
25
+ # Ruby version to 1.9, even if it actually is 1.9.1
26
+ s.required_ruby_version = ::Gem::Requirement.new("~> 1.9")
27
+
28
+ begin
29
+ require "changelog"
30
+ rescue LoadError
31
+ warn "You have to have changelog gem installed for post install message"
32
+ else
33
+ s.post_install_message = CHANGELOG.new.version_changes
34
+ end
35
+
36
+ # RubyForge
37
+ s.rubyforge_project = "contributors"
38
+ end
@@ -0,0 +1,41 @@
1
+ # encoding: utf-8
2
+
3
+ Task.new(:contributors) do |task|
4
+ task.description = "Regenerate contributors file."
5
+
6
+ # Settings.
7
+ task.config[:path] = Dir.pwd
8
+ task.config[:output_path] = Proc.new { File.join(task.config[:path], "CONTRIBUTORS") }
9
+ task.config[:ignore] = nil
10
+ task.config[:sort_by] = :LOC
11
+ task.config[:format] = Proc.new { |email, data| "#{data[:name]}: #{data[:commits]} (#{data[:LOC]} LOC)" }
12
+
13
+ # Helpers.
14
+ def task.output_path
15
+ if self.config[:output_path].respond_to?(:call)
16
+ self.config[:output_path].call
17
+ else
18
+ self.config[:output_path]
19
+ end
20
+ end
21
+
22
+ def task.ignored_patterns
23
+ self.config[:ignore] || Contributors::IGNORED_PATTERNS
24
+ end
25
+
26
+ # Define the actual task.
27
+ task.define do
28
+ require "contributors"
29
+
30
+ Dir.chdir(task.config[:path]) do
31
+ contributors = Contributors.new(task.config[:path], task.ignored_patterns)
32
+
33
+ # Write the actual CONTRIBUTORS file.
34
+ File.open(task.output_path, "w") do |file|
35
+ contributors.results.each do |email, data|
36
+ file.puts(task.config[:format].call(email, data))
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,66 @@
1
+ # encoding: utf-8
2
+
3
+ # TODO: Use Grit or something rather than this black magic.
4
+ class Contributors
5
+ IGNORED_PATTERNS = [/^vendor\//, /^gems\//, /.+\.gem$/]
6
+
7
+ attr_reader :path, :ignored_patterns
8
+ def initialize(path = Dir.pwd, ignored_patterns = IGNORED_PATTERNS)
9
+ @path, @ignored_patterns = path, ignored_patterns
10
+ end
11
+
12
+ def list
13
+ repo do
14
+ authors = %x{git log | grep ^Author:}.split("\n")
15
+ results = authors.reduce(Hash.new) do |results, line|
16
+ line.match(/^Author: (.+) <(.+)>$/)
17
+ name, email = $1, $2
18
+ results[email] ||= Hash.new
19
+ results[email][:name] = name
20
+ results[email][:commits] ||= 0
21
+ results[email][:commits] += 1
22
+ results[email][:LOC] = loc[email]
23
+ p loc
24
+ results
25
+ end
26
+ end
27
+ end
28
+
29
+ def results(sort_by = :LOC)
30
+ unless [:commits, :LOC].include?(sort_by)
31
+ raise "Sort_by argument can be only :commits or :LOC!"
32
+ end
33
+
34
+ self.list.sort_by { |_, data| data[sort_by] }.reverse
35
+ end
36
+
37
+ private
38
+ def repo(&block)
39
+ Dir.chdir(@path, &block)
40
+ end
41
+
42
+ def files
43
+ files = %x{git ls-files}.split("\n")
44
+ files.select do |path|
45
+ self.ignored_patterns.any? do |pattern|
46
+ not path.match(pattern)
47
+ end
48
+ end
49
+ end
50
+
51
+ # TODO: At the moment this are any lines, not lines of code.
52
+ # {email_1 => LOC for email_1, email_2 => LOC for email_2}
53
+ def loc
54
+ @loc ||= begin
55
+ files.reduce(Hash.new) do |buffer, path|
56
+ emails = %x{git blame '#{path}' --show-email | awk '{ print $2 }' | ruby -pe '$_.sub!(/^.*<(.+)>.*$/, "\\\\1")'}
57
+ emails.split("\n").each do |email|
58
+ buffer[email] ||= 0
59
+ buffer[email] += 1
60
+ end
61
+
62
+ buffer
63
+ end
64
+ end
65
+ end
66
+ end
data/tasks.rb ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env nake
2
+ # encoding: utf-8
3
+
4
+ $LOAD_PATH.unshift(File.expand_path("../lib", __FILE__))
5
+
6
+ load "contributors.nake"
7
+
8
+ Task[:contributors].config[:format] = Proc.new { |email, data| "#{email}: #{data.inspect}" }
metadata ADDED
@@ -0,0 +1,63 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: contributors
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: "0.1"
6
+ platform: ruby
7
+ authors:
8
+ - Jakub Stastny aka botanicus
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain:
12
+ date: 2011-03-07 00:00:00 +00:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: The contributors gem is useful for getting informations about project contributors. It assumes that Git is used. In particular it can be used for generating CONTRIBUTORS file.
17
+ email: stastny@101ideas.cz
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files: []
23
+
24
+ files:
25
+ - .gitignore
26
+ - CHANGELOG
27
+ - LICENSE
28
+ - README.textile
29
+ - contributors.gemspec
30
+ - lib/contributors.nake
31
+ - lib/contributors.rb
32
+ - tasks.rb
33
+ has_rdoc: true
34
+ homepage: http://github.com/botanicus/contributors
35
+ licenses: []
36
+
37
+ post_install_message: "[\e[32mVersion 0.1\e[0m] The actual library.\n\
38
+ [\e[32mVersion 0.1\e[0m] Nake tasks for generating CONTRIBUTORS.\n"
39
+ rdoc_options: []
40
+
41
+ require_paths:
42
+ - lib
43
+ required_ruby_version: !ruby/object:Gem::Requirement
44
+ none: false
45
+ requirements:
46
+ - - ~>
47
+ - !ruby/object:Gem::Version
48
+ version: "1.9"
49
+ required_rubygems_version: !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: "0"
55
+ requirements: []
56
+
57
+ rubyforge_project: contributors
58
+ rubygems_version: 1.5.3
59
+ signing_key:
60
+ specification_version: 3
61
+ summary: API for getting info about contributors of a project which is in Git.
62
+ test_files: []
63
+