giteaucrat 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ YmY4NGEwNmU2Zjg2NmZjZmExOGYwMjViNjFjNWE3YWE4YjI3NGI4ZQ==
5
+ data.tar.gz: !binary |-
6
+ NDRlODhhZTQxNWU0OTI4ZWVlMzVmZGY0MjkzNmZhY2U1ZWZmMzZhMQ==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ ZjRlNWVjNjI4ZDlhZGE3MDEzZWZjMWM4NzY3YzA2OGJhODhiNzdhZmViYzE5
10
+ ODhlMjc3ZTUxY2JkM2RiZDc4OTViN2IzYTllMDQwNTM0YzNiNmMzYmMxYjkw
11
+ NmE0YTRjNjE4YmU0MzY1NzIyNGFjNmY3YjBjMzIxMmZiYzRlMTg=
12
+ data.tar.gz: !binary |-
13
+ NTZhYWE2MDgzYmZkZGUyNTQ2MTFkNjdlMGRmMjI0YmY2MzI4MGRhZmNjNThj
14
+ NTZiOTg5MjYzZGE0NWJhZDY5ZDI4YTkyYjExMGE0OTdkNmZjMzI2NWNlZmM3
15
+ MTM4OTY0MDcyNDAxODgxMTQzOGY5MWRiNjJjNzM0ZDhhZmMxMDY=
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in giteaucrat.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Alexander Semyonov
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # Giteaucrat. The Git Bureaucrat.
2
+
3
+ Giteaucrat provides you ability to automatically put copyright messages in all
4
+ your source code.
5
+
6
+ ## Installation
7
+
8
+ Add this line to your application's Gemfile:
9
+
10
+ gem install giteaucrat
11
+
12
+ ## Usage
13
+
14
+ Execute in your application directory:
15
+
16
+ # cd my_rails_application
17
+ $ giteaucrat copyrights
18
+
19
+ You can see all available options using:
20
+
21
+ $ giteaucrat help copyrights
22
+
23
+ ## Contributing
24
+
25
+ 1. Fork it
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
27
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
28
+ 4. Push to the branch (`git push origin my-new-feature`)
29
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require 'bundler/gem_tasks'
data/bin/giteaucrat ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'giteaucrat'
4
+ require 'giteaucrat/runner'
5
+
6
+ Giteaucrat::Runner.start
@@ -0,0 +1,5 @@
1
+ ---
2
+ commit_keyword: "#giteaucrat"
3
+ copyright_owner: Alexander Semyonov
4
+ copyright_format: "© %{owner}, %{years}"
5
+ include_encoding: true
@@ -0,0 +1,26 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'giteaucrat/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'giteaucrat'
8
+ spec.version = Giteaucrat::VERSION
9
+ spec.authors = ['Alexander Semyonov']
10
+ spec.email = %w(al@semyonov.us)
11
+ spec.description = %q{Automatically update copyright messages using git}
12
+ spec.summary = %q{The Git bureaucrat}
13
+ spec.homepage = 'http://github.com/alsemyonov/giteaucrat'
14
+ spec.license = 'MIT'
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = %w(lib)
20
+
21
+ spec.add_dependency 'thor'
22
+ spec.add_dependency 'grit'
23
+
24
+ spec.add_development_dependency 'bundler', '~> 1.3'
25
+ spec.add_development_dependency 'rake'
26
+ end
@@ -0,0 +1,36 @@
1
+ # coding: utf-8
2
+
3
+ require 'grit/blame'
4
+
5
+ module Grit
6
+ class Blame
7
+ def process_raw_blame(output)
8
+ lines, final = [], []
9
+ info, commits = {}, {}
10
+
11
+ # process the output
12
+ output.split("\n").each do |line|
13
+ if line[0, 1] == "\t"
14
+ lines << line[1, line.size]
15
+ elsif m = /^(\w{40}) (\d+) (\d+)/.match(line)
16
+ commit_id, old_lineno, lineno = m[1], m[2].to_i, m[3].to_i
17
+ commits[commit_id] = nil if !commits.key?(commit_id)
18
+ info[lineno] = [commit_id, old_lineno]
19
+ end
20
+ end
21
+
22
+ # load all commits in single call
23
+ @repo.batch(*(commits.keys - ['0'*40])).each do |commit|
24
+ commits[commit.id] = commit if commit
25
+ end
26
+
27
+ # get it together
28
+ info.sort.each do |lineno, (commit_id, old_lineno)|
29
+ commit = commits[commit_id]
30
+ final << BlameLine.new(lineno, old_lineno, commit, lines[lineno - 1])
31
+ end
32
+
33
+ @lines = final
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,144 @@
1
+ # coding: utf-8
2
+
3
+ ################################################
4
+ # © Alexander Semyonov, 2013—2013 #
5
+ # Author: Alexander Semyonov <al@semyonov.us> #
6
+ ################################################
7
+
8
+ require 'giteaucrat'
9
+ require 'set'
10
+
11
+ module Giteaucrat
12
+ class Author
13
+ include Common
14
+
15
+ # @param [Grit::Actor] grit_author
16
+ # @return [Author]
17
+ def self.find_by_git_person(grit_author)
18
+ name = grit_author.name.force_encoding('utf-8')
19
+ email = grit_author.email.force_encoding('utf-8')
20
+ author = all.find do |author|
21
+ author.has_name?(name) || author.has_email?(email)
22
+ end || new(name: name, email: email)
23
+ author.names << name
24
+ author.emails << email
25
+ author
26
+ end
27
+
28
+ def self.all
29
+ @all ||= Set.new
30
+ end
31
+
32
+ def self.new(attributes = {})
33
+ author = super(attributes)
34
+ all << author
35
+ author
36
+ end
37
+
38
+ def self.check_multiple_emails!
39
+ all.each do |_, author|
40
+ author && author.check_multiple_emails!
41
+ end
42
+ end
43
+
44
+ def self.to_yaml
45
+ all.map do |author|
46
+ author.to_hash
47
+ end.sort { |a, b| a[:name] <=> b[:name] }.to_yaml
48
+ end
49
+
50
+ # @return [Boolean]
51
+ attr_accessor :ignored
52
+
53
+ # @return [Boolean]
54
+ def ignored?
55
+ !!@ignored
56
+ end
57
+
58
+ def check_multiple_emails!
59
+ if emails.count > 1 && !instance_variable_defined?(:@email)
60
+ STDERR.puts "#{name} has multiple emails:\n#{emails.map {|e| "* #{e}"}.join("\n")}\nPlease set right one in your giteaucrat.yml\n"
61
+ end
62
+ end
63
+
64
+ # @return [Set<String>]
65
+ def names
66
+ @names ||= Set.new
67
+ end
68
+
69
+ # @param [<String>] names
70
+ # @return [Set<String>]
71
+ def names=(names)
72
+ names.each { |name| self.names << name.force_encoding('utf-8') }
73
+ self.names
74
+ end
75
+
76
+ # @return [String]
77
+ def name
78
+ @name || names.first
79
+ end
80
+
81
+ # @param [String] name
82
+ def name=(name)
83
+ name = name.force_encoding('utf-8')
84
+ names << name
85
+ @name = name
86
+ end
87
+
88
+ # @return [Boolean]
89
+ # @param [String] name
90
+ def has_name?(name)
91
+ names.include?(name.force_encoding('utf-8'))
92
+ end
93
+
94
+ # @return [Set<String>]
95
+ def emails
96
+ @emails ||= Set.new
97
+ end
98
+
99
+ # @param [<String>] emails
100
+ # @return [Set<String>]
101
+ def emails=(emails)
102
+ emails.each { |email| self.emails << email.force_encoding('utf-8') }
103
+ self.emails
104
+ end
105
+
106
+ # @return [String]
107
+ def email
108
+ @email || emails.first
109
+ end
110
+
111
+ # @param [String] email
112
+ # @return [String]
113
+ def email=(email)
114
+ email = email.force_encoding('utf-8')
115
+ emails << email
116
+ @email = email
117
+ end
118
+
119
+ # @return [Boolean]
120
+ # @param [String] email
121
+ def has_email?(email)
122
+ emails.include?(email.force_encoding('utf-8'))
123
+ end
124
+
125
+ # @return [String]
126
+ def identifier
127
+ %(#{name} <#{email}>).force_encoding('utf-8')
128
+ end
129
+
130
+ # @return [Hash]
131
+ def to_hash
132
+ hash = {'name' => name.to_s, 'email' => email.to_s}
133
+ hash['names'] = names.to_a - [name] if names.size > 1
134
+ hash['emails'] = emails.to_a - [email] if emails.size > 1
135
+ hash['ignored'] = true if ignored?
136
+ hash
137
+ end
138
+
139
+ # @return [String]
140
+ def to_s
141
+ identifier
142
+ end
143
+ end
144
+ end
@@ -0,0 +1,29 @@
1
+ # coding: utf-8
2
+
3
+ ################################################
4
+ # © Alexander Semyonov, 2013—2013 #
5
+ # Author: Alexander Semyonov <al@semyonov.us> #
6
+ ################################################
7
+
8
+ require 'giteaucrat'
9
+
10
+ module Giteaucrat
11
+ module Common
12
+ def initialize(attributes = {})
13
+ assign_attributes(attributes)
14
+ end
15
+
16
+ # @param [Hash] attributes
17
+ def assign_attributes(attributes)
18
+ attributes.each do |name, value|
19
+ writer = "#{name}="
20
+ value = value.force_encoding('utf-8') if value.respond_to?(:force_encoding)
21
+ if respond_to?(writer)
22
+ public_send(writer, value)
23
+ else
24
+ STDERR.puts("Unknown method #{self.class}##{writer}")
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,109 @@
1
+ # coding: utf-8
2
+
3
+ ################################################
4
+ # © Alexander Semyonov, 2013—2013 #
5
+ # Author: Alexander Semyonov <al@semyonov.us> #
6
+ ################################################
7
+
8
+ require 'giteaucrat'
9
+ require 'grit'
10
+ require 'core_ext/grit/blame'
11
+
12
+ module Giteaucrat
13
+ class File
14
+ include Common
15
+
16
+ # @return [String]
17
+ attr_accessor :name
18
+
19
+ # @return [Giteaucrat::Repo]
20
+ attr_accessor :repo
21
+
22
+ def authors
23
+ @authors ||= begin
24
+ blame = repo.git_repo.blame(name)
25
+ lines = blame.lines
26
+ commits = lines.map { |line| line.commit }.uniq.find_all do |commit|
27
+ !ignored_commit?(commit)
28
+ end
29
+ commits.inject(Set.new) do |authors, commit|
30
+ author = Author.find_by_git_person(commit.author)
31
+ authors << author unless author.ignored?
32
+ authors
33
+ end
34
+ end
35
+ end
36
+
37
+ def write_copyright!
38
+ first, middle, last = comment
39
+ first = Regexp.escape(first)
40
+ middle = Regexp.escape(middle)
41
+ last = Regexp.escape(last)
42
+ contents = ::File.read(name)
43
+ ruler = "(#{first}(#{middle})*#{last}\n)"
44
+ coding = "(#{first}\s*.*coding:\s*utf-8\s*\n+)?"
45
+ header = /#{coding}#{ruler}(#{first}.*#{last}\n)*\2\n*/m
46
+ if repo.include_encoding?
47
+ contents.sub!(header, "#{copyright}\n\n")
48
+ else
49
+ contents.sub!(/(#{coding})/, "\1#{copyright}\n\n")
50
+ end
51
+ ::File.write(name, contents)
52
+ end
53
+
54
+ def copyright
55
+ @copyright ||= begin
56
+ lines = []
57
+ lines << repo.copyright_label
58
+
59
+ if authors.size > 0
60
+ authors_label = (authors.size > 1) ? 'Authors: ' : 'Author: '
61
+ author_names = self.authors.map { |a| a.identifier }.sort
62
+ prepend = ' ' * authors_label.size
63
+ lines << "#{authors_label}#{author_names.shift}"
64
+ author_names.each do |author|
65
+ lines << "#{prepend}#{author}"
66
+ end
67
+ end
68
+
69
+ first, middle, last = self.comment
70
+
71
+ max_line_size = lines.max { |a, b| a.size <=> b.size }.size
72
+ max_line_size += 1 if max_line_size.odd?
73
+
74
+ width = first.size + 1 + max_line_size + 1 + last.size
75
+ ruler = "#{first}#{middle * ((width / middle.size - first.size - last.size))}#{last}"
76
+ lines = lines.map do |line|
77
+ blank = ' ' * (max_line_size - line.size) if line.size < max_line_size
78
+ "#{first} #{line}#{blank} #{last}"
79
+ end
80
+
81
+ lines.unshift(ruler)
82
+ lines << ruler
83
+ if repo.include_encoding?
84
+ lines.unshift("#{first} coding: utf-8\n")
85
+ end
86
+ lines.join("\n")
87
+ end
88
+ end
89
+
90
+ # @see Giteaucrat::Repo#ignored_commit?
91
+ def ignored_commit?(commit)
92
+ repo.ignored_commit?(commit)
93
+ end
94
+
95
+ # @return [<String, String, String>]
96
+ def comment
97
+ case ::File.extname(name)
98
+ when '.rb', '.coffee', '.sass'
99
+ %w(# # #)
100
+ when '.js', '.css', '.scss'
101
+ %w(/* * */)
102
+ when '.erl'
103
+ %w(% % %)
104
+ else
105
+ raise 'Unknown file type'
106
+ end
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,121 @@
1
+ # coding: utf-8
2
+
3
+ ################################################
4
+ # © Alexander Semyonov, 2013—2013 #
5
+ # Author: Alexander Semyonov <al@semyonov.us> #
6
+ ################################################
7
+
8
+ require 'giteaucrat'
9
+ require 'grit'
10
+
11
+ module Giteaucrat
12
+ class Repo
13
+ include Common
14
+
15
+ def self.defaults=(options = {})
16
+ if options[:git]
17
+ Grit::Git.git_binary = options[:git]
18
+ end
19
+ if options[:git_timeout]
20
+ Grit::Git.git_timeout = options[:git_timeout]
21
+ end
22
+ end
23
+
24
+ def git_repo
25
+ @git_repo ||= Grit::Repo.new(path)
26
+ end
27
+
28
+ # @return [String]
29
+ attr_accessor :path
30
+ attr_accessor :commit_keyword
31
+ attr_writer :copyright_year
32
+ attr_accessor :copyright_owner
33
+ attr_accessor :copyright_format
34
+ attr_accessor :license
35
+ attr_accessor :include_encoding
36
+ attr_writer :patterns
37
+
38
+ def commit!(message)
39
+ git_repo.commit_all(message)
40
+ end
41
+
42
+ def files
43
+ @files ||= begin
44
+ Dir.chdir(path) do
45
+ %w(app lib script spec).inject([]) do |files, path|
46
+ files + Dir[::File.join(path, '**/*.rb')]
47
+ end.map do |file_name|
48
+ File.new(name: file_name, repo: self)
49
+ end
50
+ end
51
+ end
52
+ end
53
+
54
+ def write_copyrights!
55
+ files.each do |file|
56
+ file.write_copyright!
57
+ end
58
+ end
59
+
60
+ def timeout
61
+ Grit::Git.git_timeout
62
+ end
63
+
64
+ def timeout=(timeout)
65
+ Grit::Git.git_timeout = timeout
66
+ end
67
+
68
+ def git
69
+ Grit::Git.git_binary
70
+ end
71
+
72
+ def git=(executable)
73
+ Grit::Git.git_binary = executable
74
+ end
75
+
76
+ def authors=(authors)
77
+ authors.each do |author_attributes|
78
+ Author.new(author_attributes)
79
+ end
80
+ end
81
+
82
+ def config=(*)
83
+ end
84
+
85
+ # @return [Number]
86
+ def copyright_year
87
+ @copyright_year || first_commit.authored_date.year
88
+ end
89
+
90
+ # @return [Grit::Commit]
91
+ def first_commit
92
+ @first_commit ||= begin
93
+ count = git_repo.commit_count
94
+ git_repo.commits(git_repo.head.name, 1, count - 1).first
95
+ end
96
+ end
97
+
98
+ # @return [String]
99
+ def copyright_label
100
+ @copyright_label ||= copyright_format.
101
+ gsub('%{years}', [copyright_year, Time.now.year].compact.join('—')).
102
+ gsub('%{owner}', copyright_owner).
103
+ gsub('%{license}', license || '')
104
+ end
105
+
106
+ # @return [Regexp]
107
+ def ignored_commit_message
108
+ @ignored_commit_message ||= /^#{Regexp.escape(commit_keyword)}/
109
+ end
110
+
111
+ # @param [Grit::Commit] commit
112
+ # @return [Boolean]
113
+ def ignored_commit?(commit)
114
+ !commit || commit.message.match(ignored_commit_message)
115
+ end
116
+
117
+ def include_encoding?
118
+ !!include_encoding
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,105 @@
1
+ # coding: utf-8
2
+
3
+ ################################################
4
+ # © Alexander Semyonov, 2013—2013 #
5
+ # Author: Alexander Semyonov <al@semyonov.us> #
6
+ ################################################
7
+
8
+ require 'giteaucrat'
9
+ require 'thor'
10
+ require 'yaml'
11
+
12
+ module Giteaucrat
13
+ class Runner < Thor
14
+ class_option :git, group: :git
15
+ class_option :timeout, default: 30, group: :git
16
+ class_option :path, default: Dir.pwd, desc: 'Path to project that needs some bureaucracy.'
17
+ class_option :config,
18
+ default: ::File.join(Dir.pwd, 'config', 'giteaucrat.yml'),
19
+ desc: 'Giteaucrat configuration',
20
+ group: :giteaucrat
21
+ class_option :commit_keyword,
22
+ aliases: %w(-i),
23
+ default: '#giteaucrat',
24
+ desc: 'Commit keyword to prepend giteaucrat commits (to ignore authorship of this commit)',
25
+ group: :giteaucrat
26
+ class_option :copyright_owner,
27
+ aliases: %w(-o),
28
+ default: `git config user.name`.chomp,
29
+ desc: 'Company or owner name to put in copyright header',
30
+ group: :giteaucrat
31
+ class_option :copyright_year,
32
+ aliases: %w(-y),
33
+ type: :numeric,
34
+ desc: 'Start year of copyright',
35
+ group: :giteaucrat
36
+ class_option :copyright_format,
37
+ aliases: %w(-f),
38
+ default: '© %{owner}, %{years}',
39
+ desc: 'Start year of copyright',
40
+ group: :giteaucrat
41
+ class_option :license,
42
+ aliases: %w(-l),
43
+ desc: 'License to put in copyright footer'
44
+ class_option :include_encoding,
45
+ type: :boolean,
46
+ default: true,
47
+ aliases: %w(-e),
48
+ desc: 'Put encoding in copyright footer',
49
+ group: :giteaucrat
50
+ class_option :commit,
51
+ type: :boolean,
52
+ aliases: %w(-c),
53
+ desc: 'Commit updated copyrights',
54
+ group: :giteaucrat
55
+
56
+ desc 'copyrights', 'Update copyright information in files'
57
+
58
+ def copyrights
59
+ repo.write_copyrights!
60
+ repo.commit("#{defaults[:commit_keyword]}: Update copyrights in source code") if options[:commit]
61
+ FileUtils.mkdir_p(::File.join(path, 'tmp'))
62
+ ::File.write(::File.join(path, 'tmp', 'giteaucrat_authors.yml'), Author.to_yaml)
63
+ end
64
+
65
+ private
66
+
67
+ def defaults
68
+ @defaults ||= begin
69
+ YAML::ENGINE.yamler = 'syck'
70
+ Encoding.default_external = 'utf-8'
71
+ Encoding.default_internal = 'utf-8'
72
+
73
+ options = Thor::CoreExt::HashWithIndifferentAccess.new(self.options.dup)
74
+ options[:config] = ::File.join(options[:path], 'config', 'giteaucrat.yml')
75
+
76
+ if ::File.file?(options[:config])
77
+ config = YAML.load_file(options[:config]) || {}
78
+ options.merge!(config)
79
+ end
80
+
81
+ config = options.inject({}) do |config, (key, value)|
82
+ config[key] = value unless %w(config git path timeout).include?(key); config
83
+ end.to_yaml
84
+
85
+ unless ::File.file?(options[:config])
86
+ FileUtils.mkdir_p(::File.dirname(options[:config]))
87
+ ::File.write(options[:config], config)
88
+ end
89
+
90
+ Dir.chdir(path)
91
+ Repo.defaults = {git: options[:git], git_timeout: options[:timeout]}
92
+ options
93
+ end
94
+ end
95
+
96
+ def path
97
+ options[:path]
98
+ end
99
+
100
+ # @return [Giteaucrat::Repo]
101
+ def repo
102
+ @repo ||= Repo.new(defaults)
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,10 @@
1
+ # coding: utf-8
2
+
3
+ ################################################
4
+ # © Alexander Semyonov, 2013—2013 #
5
+ # Author: Alexander Semyonov <al@semyonov.us> #
6
+ ################################################
7
+
8
+ module Giteaucrat
9
+ VERSION = '0.0.1'
10
+ end
data/lib/giteaucrat.rb ADDED
@@ -0,0 +1,16 @@
1
+ # coding: utf-8
2
+
3
+ ################################################
4
+ # © Alexander Semyonov, 2013—2013 #
5
+ # Author: Alexander Semyonov <al@semyonov.us> #
6
+ ################################################
7
+
8
+ require 'giteaucrat/version'
9
+
10
+ module Giteaucrat
11
+ autoload :Author, 'giteaucrat/author'
12
+ autoload :Common, 'giteaucrat/common'
13
+ autoload :File, 'giteaucrat/file'
14
+ autoload :Repo, 'giteaucrat/repo'
15
+ autoload :Runner, 'giteaucrat/runner'
16
+ end
metadata ADDED
@@ -0,0 +1,117 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: giteaucrat
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Alexander Semyonov
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-08-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: thor
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ! '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ! '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: grit
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '1.3'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '1.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ! '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: Automatically update copyright messages using git
70
+ email:
71
+ - al@semyonov.us
72
+ executables:
73
+ - giteaucrat
74
+ extensions: []
75
+ extra_rdoc_files: []
76
+ files:
77
+ - .gitignore
78
+ - Gemfile
79
+ - LICENSE.txt
80
+ - README.md
81
+ - Rakefile
82
+ - bin/giteaucrat
83
+ - config/giteaucrat.yml
84
+ - giteaucrat.gemspec
85
+ - lib/core_ext/grit/blame.rb
86
+ - lib/giteaucrat.rb
87
+ - lib/giteaucrat/author.rb
88
+ - lib/giteaucrat/common.rb
89
+ - lib/giteaucrat/file.rb
90
+ - lib/giteaucrat/repo.rb
91
+ - lib/giteaucrat/runner.rb
92
+ - lib/giteaucrat/version.rb
93
+ homepage: http://github.com/alsemyonov/giteaucrat
94
+ licenses:
95
+ - MIT
96
+ metadata: {}
97
+ post_install_message:
98
+ rdoc_options: []
99
+ require_paths:
100
+ - lib
101
+ required_ruby_version: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - ! '>='
104
+ - !ruby/object:Gem::Version
105
+ version: '0'
106
+ required_rubygems_version: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ! '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ requirements: []
112
+ rubyforge_project:
113
+ rubygems_version: 2.0.6
114
+ signing_key:
115
+ specification_version: 4
116
+ summary: The Git bureaucrat
117
+ test_files: []