codelines 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.
- checksums.yaml +7 -0
- data/bin/codelines +61 -0
- data/lib/codelines/adapter.rb +28 -0
- data/lib/codelines/adapters/github.rb +64 -0
- data/lib/codelines/codelines.rb +26 -0
- data/lib/codelines/version.rb +15 -0
- data/lib/codelines.rb +12 -0
- data/test/codelines_spec.rb +5 -0
- data/test/github_spec.rb +12 -0
- metadata +97 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 787e27202ae5a1e7083ad43a7e776376181778d5
|
4
|
+
data.tar.gz: ef4fcc6d782e63ed203ec97d5958b94339cb8bf0
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 57b6ec1dd7f3b1b0f61f1f5eb92faa5d1962ea2998893995756dfa2ff1e9ae2d053e8f3f4395506501407d28eefcc2c797b77b5ac2b258c68d89ae6f98f399a0
|
7
|
+
data.tar.gz: bf928cc509c99bebbe83356e9787ffe3d5c8fcbbdbc653df8b9756c71c214b86e61a8db7a375506bb201908dc1cf16a026426623b137c98c97362ced8a37e337
|
data/bin/codelines
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
#--
|
3
|
+
# DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
4
|
+
# Version 2, December 2004
|
5
|
+
#
|
6
|
+
# DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
7
|
+
# TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
8
|
+
#
|
9
|
+
# 0. You just DO WHAT THE FUCK YOU WANT TO.
|
10
|
+
#++
|
11
|
+
require 'codelines'
|
12
|
+
require 'optparse'
|
13
|
+
|
14
|
+
options = {}
|
15
|
+
|
16
|
+
OptionParser.new do |o|
|
17
|
+
o.on '-l', '--list', 'Show available adapters' do
|
18
|
+
abort 'Available adapters:'.tap { |s|
|
19
|
+
CodeLines.adapters.sort { |a, b| a <=> b }.each { |p| s << "\n" + (' ' * 3) + p }
|
20
|
+
}
|
21
|
+
end
|
22
|
+
|
23
|
+
o.on '-a', '--adapter ADAPTER', 'The adapter to use' do |adapter|
|
24
|
+
options[:adapter ] = adapter.downcase
|
25
|
+
end
|
26
|
+
|
27
|
+
o.on '-p', '--profile PROFILE' do |profile|
|
28
|
+
options[:profile ] = profile
|
29
|
+
end
|
30
|
+
|
31
|
+
o.on '-r', '--repository REPOSITORY' do |repository|
|
32
|
+
options[:repository ] = repository
|
33
|
+
end
|
34
|
+
|
35
|
+
o.on '-b', '--branch BRANCH', 'Select a branch different from `master\'' do |branch|
|
36
|
+
options[:branch ] = branch
|
37
|
+
end
|
38
|
+
|
39
|
+
o.on '-c', '--no-comments', 'Ignore comments' do |branch|
|
40
|
+
options[:ignore_comments] = true
|
41
|
+
end
|
42
|
+
|
43
|
+
o.on '-s', '--authenticate USERNAME:PASSWORD', 'Perform the sign in' do |data|
|
44
|
+
data = data.split ?:
|
45
|
+
options[:username] = data.shift
|
46
|
+
options[:password] = data.pop
|
47
|
+
end
|
48
|
+
end.parse!
|
49
|
+
|
50
|
+
abort 'You must select an adapter, a profile and a repository.' if !options[:adapter] || !options[:profile] || !options[:repository]
|
51
|
+
|
52
|
+
require "codelines/adapters/#{options[:adapter]}"
|
53
|
+
|
54
|
+
adapter = CodeLines.constants.map { |p|
|
55
|
+
"CodeLines::#{p}".split('::').inject(Object) { |o, c| o.const_get c }
|
56
|
+
}.select { |c| c.to_s.split('::').last.downcase == options[:adapter] }.first
|
57
|
+
|
58
|
+
github = CodeLines::GitHub.new options[:profile]
|
59
|
+
github.authenticate options[:username], options[:password] if options[:username] && options[:password]
|
60
|
+
|
61
|
+
puts github.count repository: [ { name: options[:repository], branch: options[:branch] } ], ignore_comments: options[:ignore_comments]
|
@@ -0,0 +1,28 @@
|
|
1
|
+
#--
|
2
|
+
# DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
3
|
+
# Version 2, December 2004
|
4
|
+
#
|
5
|
+
# DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
6
|
+
# TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
7
|
+
#
|
8
|
+
# 0. You just DO WHAT THE FUCK YOU WANT TO.
|
9
|
+
#++
|
10
|
+
|
11
|
+
module CodeLines
|
12
|
+
|
13
|
+
class Adapter
|
14
|
+
def authenticate(*args, &block)
|
15
|
+
raise NotImplementedError, 'authenticate has been not implemented'
|
16
|
+
end
|
17
|
+
|
18
|
+
def count(*args, &block)
|
19
|
+
raise NotImplementedError, 'count has been not implemented'
|
20
|
+
end
|
21
|
+
|
22
|
+
protected
|
23
|
+
def comment?(what)
|
24
|
+
[ ?;, ?#, '//' ].include? what.gsub(/\s+/, '')[0]
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
#--
|
2
|
+
# DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
3
|
+
# Version 2, December 2004
|
4
|
+
#
|
5
|
+
# DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
6
|
+
# TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
7
|
+
#
|
8
|
+
# 0. You just DO WHAT THE FUCK YOU WANT TO.
|
9
|
+
#++
|
10
|
+
require 'github_api'
|
11
|
+
require 'base64'
|
12
|
+
|
13
|
+
module CodeLines
|
14
|
+
|
15
|
+
class GitHub < Adapter
|
16
|
+
def initialize(profile)
|
17
|
+
@profile = profile
|
18
|
+
@github = Github.new
|
19
|
+
@repositories = {}
|
20
|
+
end
|
21
|
+
|
22
|
+
def authenticate(username, password)
|
23
|
+
@github = Github.new basic_auth: "#{username}:#{password}"
|
24
|
+
end
|
25
|
+
alias_method :login, :authenticate
|
26
|
+
|
27
|
+
def count(options = {}, &block)
|
28
|
+
repos = options[:repository ] || []
|
29
|
+
ignore_comments = options[:ignore_comments] || false
|
30
|
+
reload = options[:reload] || false
|
31
|
+
|
32
|
+
lines = 0
|
33
|
+
repos.each { |name|
|
34
|
+
@repositories[name] = fetch(name) if reload || !@repositories.include?(name)
|
35
|
+
|
36
|
+
@repositories[name].each { |github|
|
37
|
+
source = Base64.decode64 github.content
|
38
|
+
source.gsub!(/\r\n?/m, "\n")
|
39
|
+
source.gsub!(/\/\*![^*]*\*+(?:[^*\/][^*]*\*+)*\//m, '') if ignore_comments
|
40
|
+
|
41
|
+
source.each_line { |line|
|
42
|
+
lines += 1 if ignore_comments == false || !comment?(line)
|
43
|
+
}
|
44
|
+
|
45
|
+
yield github if block_given?
|
46
|
+
}
|
47
|
+
}
|
48
|
+
lines
|
49
|
+
end
|
50
|
+
|
51
|
+
protected
|
52
|
+
def fetch(repository)
|
53
|
+
[].tap { |results|
|
54
|
+
@github.git_data.trees.get @profile, repository[:name], repository[:branch] || :master, recursive: true do |f|
|
55
|
+
next if f.type != 'blob'
|
56
|
+
|
57
|
+
file = @github.repos.contents.get user: @profile, repo: repository[:name], path: URI.escape(f.path)
|
58
|
+
results << file
|
59
|
+
end
|
60
|
+
}
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
#--
|
2
|
+
# DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
3
|
+
# Version 2, December 2004
|
4
|
+
#
|
5
|
+
# DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
6
|
+
# TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
7
|
+
#
|
8
|
+
# 0. You just DO WHAT THE FUCK YOU WANT TO.
|
9
|
+
#++
|
10
|
+
|
11
|
+
module CodeLines
|
12
|
+
|
13
|
+
class << self
|
14
|
+
attr_reader :adapter
|
15
|
+
|
16
|
+
def setup(adapter, profile)
|
17
|
+
@adapter = adapter.new self, profile
|
18
|
+
end
|
19
|
+
|
20
|
+
def count(*args, &block)
|
21
|
+
raise LoadError, 'adapter not found' unless @adapter
|
22
|
+
@adapter.count *args, &block
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
#--
|
2
|
+
# DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
3
|
+
# Version 2, December 2004
|
4
|
+
#
|
5
|
+
# DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
6
|
+
# TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
7
|
+
#
|
8
|
+
# 0. You just DO WHAT THE FUCK YOU WANT TO.
|
9
|
+
#++
|
10
|
+
|
11
|
+
module CodeLines
|
12
|
+
|
13
|
+
VERSION = '0.1'
|
14
|
+
|
15
|
+
end
|
data/lib/codelines.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
#--
|
2
|
+
# DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
3
|
+
# Version 2, December 2004
|
4
|
+
#
|
5
|
+
# DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
6
|
+
# TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
7
|
+
#
|
8
|
+
# 0. You just DO WHAT THE FUCK YOU WANT TO.
|
9
|
+
#++
|
10
|
+
require 'codelines/adapter'
|
11
|
+
require 'codelines/codelines'
|
12
|
+
require 'codelines/version'
|
data/test/github_spec.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
require 'codelines'
|
3
|
+
require 'codelines/adapters/github'
|
4
|
+
|
5
|
+
describe CodeLines::GitHub do
|
6
|
+
it 'counts the lines of code contained in a GitHub repository' do
|
7
|
+
github = CodeLines::GitHub.new 'RoxasShadow'
|
8
|
+
|
9
|
+
github.count(repository: [ { name: :codelines } ], ignore_comments: true ).should be > 100
|
10
|
+
github.count(repository: [ { name: :codelines } ], ignore_comments: false).should be > 100
|
11
|
+
end
|
12
|
+
end
|
metadata
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: codelines
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '0.1'
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Giovanni Capuano
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-03-02 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: github_api
|
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: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
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: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
description: Count the number of lines of code contained in one or more repositories
|
56
|
+
hosted on GitHub, Bitbucket, etc.
|
57
|
+
email: webmaster@giovannicapuano.net
|
58
|
+
executables:
|
59
|
+
- codelines
|
60
|
+
extensions: []
|
61
|
+
extra_rdoc_files: []
|
62
|
+
files:
|
63
|
+
- lib/codelines/adapter.rb
|
64
|
+
- lib/codelines/adapters/github.rb
|
65
|
+
- lib/codelines/codelines.rb
|
66
|
+
- lib/codelines/version.rb
|
67
|
+
- lib/codelines.rb
|
68
|
+
- test/codelines_spec.rb
|
69
|
+
- test/github_spec.rb
|
70
|
+
- bin/codelines
|
71
|
+
homepage: https://github.com/RoxasShadow
|
72
|
+
licenses:
|
73
|
+
- WTFPL
|
74
|
+
metadata: {}
|
75
|
+
post_install_message:
|
76
|
+
rdoc_options: []
|
77
|
+
require_paths:
|
78
|
+
- lib
|
79
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0'
|
84
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '0'
|
89
|
+
requirements: []
|
90
|
+
rubyforge_project:
|
91
|
+
rubygems_version: 2.0.3
|
92
|
+
signing_key:
|
93
|
+
specification_version: 4
|
94
|
+
summary: Count how many lines of code are contained in your repositories
|
95
|
+
test_files:
|
96
|
+
- test/codelines_spec.rb
|
97
|
+
- test/github_spec.rb
|