gitrob 0.0.6 → 1.0.0

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.
Files changed (145) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +30 -7
  3. data/.rspec +0 -1
  4. data/.rubocop.yml +55 -0
  5. data/.travis.yml +4 -0
  6. data/CHANGELOG.md +42 -0
  7. data/CONTRIBUTING.md +137 -9
  8. data/Gemfile +11 -1
  9. data/Guardfile +42 -0
  10. data/LICENSE.txt +17 -18
  11. data/README.md +79 -29
  12. data/Rakefile +6 -0
  13. data/bin/console +34 -0
  14. data/bin/setup +7 -0
  15. data/db/migrations/001_create_assessments.rb +19 -0
  16. data/db/migrations/002_create_github_access_tokens.rb +11 -0
  17. data/db/migrations/003_create_owners.rb +24 -0
  18. data/db/migrations/004_create_repositories.rb +23 -0
  19. data/db/migrations/005_create_blobs.rb +16 -0
  20. data/db/migrations/006_create_flags.rb +13 -0
  21. data/db/migrations/007_create_comparisons.rb +17 -0
  22. data/db/migrations/008_create_blobs_comparisons.rb +8 -0
  23. data/db/migrations/009_create_comparisons_repositories.rb +8 -0
  24. data/db/migrations/010_create_comparisons_owners.rb +8 -0
  25. data/exe/gitrob +6 -0
  26. data/gitrob.gemspec +25 -18
  27. data/lib/gitrob/blob_observer.rb +103 -0
  28. data/lib/gitrob/cli/command.rb +58 -0
  29. data/lib/gitrob/cli/commands/accept_terms_of_use.rb +61 -0
  30. data/lib/gitrob/cli/commands/analyze/analysis.rb +75 -0
  31. data/lib/gitrob/cli/commands/analyze/gathering.rb +101 -0
  32. data/lib/gitrob/cli/commands/analyze.rb +63 -0
  33. data/lib/gitrob/cli/commands/banner.rb +25 -0
  34. data/lib/gitrob/cli/commands/configure.rb +123 -0
  35. data/lib/gitrob/cli/commands/server.rb +21 -0
  36. data/lib/gitrob/cli/progress_bar.rb +47 -0
  37. data/lib/gitrob/cli.rb +213 -0
  38. data/lib/gitrob/github/client_manager.rb +46 -0
  39. data/lib/gitrob/github/data_manager.rb +121 -0
  40. data/lib/gitrob/jobs/assessment.rb +12 -0
  41. data/lib/gitrob/jobs/comparison.rb +55 -0
  42. data/lib/gitrob/models/assessment.rb +96 -0
  43. data/lib/gitrob/models/blob.rb +50 -0
  44. data/lib/gitrob/models/comparison.rb +15 -0
  45. data/lib/gitrob/models/flag.rb +15 -0
  46. data/lib/gitrob/models/github_access_token.rb +17 -0
  47. data/lib/gitrob/models/owner.rb +23 -0
  48. data/lib/gitrob/models/repository.rb +20 -0
  49. data/lib/gitrob/utils.rb +19 -0
  50. data/lib/gitrob/version.rb +1 -1
  51. data/lib/gitrob/web_app.rb +292 -0
  52. data/lib/gitrob.rb +30 -113
  53. data/public/css/bootstrap.min.css +11 -0
  54. data/public/css/main.css +130 -0
  55. data/public/css/tomorrow-night.css +75 -0
  56. data/public/fonts/glyphicons-halflings-regular.eot +0 -0
  57. data/public/fonts/glyphicons-halflings-regular.svg +273 -214
  58. data/public/fonts/glyphicons-halflings-regular.ttf +0 -0
  59. data/public/fonts/glyphicons-halflings-regular.woff +0 -0
  60. data/public/fonts/glyphicons-halflings-regular.woff2 +0 -0
  61. data/public/images/blob_spinner.gif +0 -0
  62. data/public/images/gear_spinner.gif +0 -0
  63. data/public/js/bootstrap.min.js +7 -0
  64. data/public/js/highlight.pack.js +2 -0
  65. data/public/js/highlight.worker.js +13 -0
  66. data/public/js/jquery-2.1.4.min.js +4 -0
  67. data/public/js/main.js +239 -0
  68. data/public/robots.txt +2 -0
  69. data/signatures.json +541 -0
  70. data/views/assessments/_assessments.erb +57 -0
  71. data/views/assessments/_comparable_assessments.erb +38 -0
  72. data/views/assessments/_comparisons.erb +111 -0
  73. data/views/assessments/compare.erb +22 -0
  74. data/views/assessments/findings.erb +55 -0
  75. data/views/assessments/repositories.erb +35 -0
  76. data/views/assessments/show.erb +1 -0
  77. data/views/assessments/users.erb +46 -0
  78. data/views/blobs/show.erb +37 -0
  79. data/views/comparisons/show.erb +125 -0
  80. data/views/errors/internal_server_error.erb +9 -0
  81. data/views/errors/not_found.erb +5 -0
  82. data/views/index.erb +43 -28
  83. data/views/layout.erb +38 -12
  84. data/views/repositories/show.erb +49 -0
  85. data/views/users/show.erb +54 -0
  86. metadata +217 -106
  87. data/bin/gitrob +0 -260
  88. data/lib/gitrob/github/blob.rb +0 -41
  89. data/lib/gitrob/github/http_client.rb +0 -127
  90. data/lib/gitrob/github/organization.rb +0 -99
  91. data/lib/gitrob/github/repository.rb +0 -72
  92. data/lib/gitrob/github/user.rb +0 -84
  93. data/lib/gitrob/observers/sensitive_files.rb +0 -83
  94. data/lib/gitrob/progressbar.rb +0 -52
  95. data/lib/gitrob/util.rb +0 -11
  96. data/lib/gitrob/webapp.rb +0 -76
  97. data/models/blob.rb +0 -35
  98. data/models/finding.rb +0 -14
  99. data/models/organization.rb +0 -32
  100. data/models/repo.rb +0 -22
  101. data/models/user.rb +0 -28
  102. data/patterns.json +0 -394
  103. data/public/javascripts/bootstrap.min.js +0 -7
  104. data/public/javascripts/gitrob.js +0 -75
  105. data/public/javascripts/jquery-2.1.1.min.js +0 -4
  106. data/public/javascripts/lang-apollo.js +0 -2
  107. data/public/javascripts/lang-basic.js +0 -3
  108. data/public/javascripts/lang-clj.js +0 -18
  109. data/public/javascripts/lang-css.js +0 -2
  110. data/public/javascripts/lang-dart.js +0 -3
  111. data/public/javascripts/lang-erlang.js +0 -2
  112. data/public/javascripts/lang-go.js +0 -1
  113. data/public/javascripts/lang-hs.js +0 -2
  114. data/public/javascripts/lang-lisp.js +0 -3
  115. data/public/javascripts/lang-llvm.js +0 -1
  116. data/public/javascripts/lang-lua.js +0 -2
  117. data/public/javascripts/lang-matlab.js +0 -6
  118. data/public/javascripts/lang-ml.js +0 -2
  119. data/public/javascripts/lang-mumps.js +0 -2
  120. data/public/javascripts/lang-n.js +0 -4
  121. data/public/javascripts/lang-pascal.js +0 -3
  122. data/public/javascripts/lang-proto.js +0 -1
  123. data/public/javascripts/lang-r.js +0 -2
  124. data/public/javascripts/lang-rd.js +0 -1
  125. data/public/javascripts/lang-scala.js +0 -2
  126. data/public/javascripts/lang-sql.js +0 -2
  127. data/public/javascripts/lang-tcl.js +0 -3
  128. data/public/javascripts/lang-tex.js +0 -1
  129. data/public/javascripts/lang-vb.js +0 -2
  130. data/public/javascripts/lang-vhdl.js +0 -3
  131. data/public/javascripts/lang-wiki.js +0 -2
  132. data/public/javascripts/lang-xq.js +0 -3
  133. data/public/javascripts/lang-yaml.js +0 -2
  134. data/public/javascripts/prettify.js +0 -30
  135. data/public/javascripts/run_prettify.js +0 -34
  136. data/public/stylesheets/bootstrap.min.css +0 -7
  137. data/public/stylesheets/bootstrap.min.css.vanilla +0 -5
  138. data/public/stylesheets/gitrob.css +0 -88
  139. data/public/stylesheets/prettify.css +0 -51
  140. data/spec/lib/gitrob/observers/sensitive_files_spec.rb +0 -691
  141. data/spec/spec_helper.rb +0 -127
  142. data/views/blob.erb +0 -22
  143. data/views/organization.erb +0 -126
  144. data/views/repository.erb +0 -51
  145. data/views/user.erb +0 -51
@@ -1,83 +0,0 @@
1
- module Gitrob
2
- module Observers
3
- class SensitiveFiles
4
-
5
- class InvalidPatternFileError < StandardError; end
6
- class InvalidPatternError < StandardError; end
7
-
8
- VALID_KEYS = %w(part type pattern caption description)
9
- VALID_PARTS = %w(path filename extension)
10
- VALID_TYPES = %w(match regex)
11
-
12
- def self.observe(blob)
13
- return if !blob.size || blob.size.zero?
14
- patterns.each do |pattern|
15
- check_blob(blob, pattern)
16
- end
17
- end
18
-
19
- def self.load_patterns!
20
- patterns = read_pattern_file!
21
- validate_patterns!(patterns)
22
- @patterns = patterns
23
- end
24
-
25
- def self.patterns
26
- @patterns
27
- end
28
-
29
- private
30
-
31
- def self.read_pattern_file!
32
- JSON.parse(File.read("#{File.dirname(__FILE__)}/../../../patterns.json"))
33
- rescue JSON::ParserError => e
34
- raise InvalidPatternFileError.new("Cannot parse pattern file: #{e.message}")
35
- end
36
-
37
- def self.validate_patterns!(patterns)
38
- if !patterns.is_a?(Array) || patterns.empty?
39
- raise InvalidPatternFileError.new("Pattern file contains no patterns")
40
- end
41
- patterns.each do |pattern|
42
- validate_pattern!(pattern)
43
- end
44
- end
45
-
46
- def self.validate_pattern!(pattern)
47
- pattern.keys.each do |key|
48
- if !VALID_KEYS.include?(key)
49
- raise InvalidPatternError.new("Pattern contains unknown key: #{key}")
50
- end
51
- end
52
-
53
- if !VALID_PARTS.include?(pattern['part'])
54
- raise InvalidPatternError.new("Pattern has unknown part: #{pattern['part']}")
55
- end
56
-
57
- if !VALID_TYPES.include?(pattern['type'])
58
- raise InvalidPatternError.new("Pattern has unknown type: #{pattern['type']}")
59
- end
60
- end
61
-
62
- def self.check_blob(blob, pattern)
63
- haystack = blob.send(pattern['part'].to_sym)
64
- if pattern['type'] == 'match'
65
- if haystack == pattern['pattern']
66
- blob.findings.new(
67
- :caption => pattern['caption'],
68
- :description => pattern['description']
69
- )
70
- end
71
- else
72
- regex = Regexp.new(pattern['pattern'], Regexp::IGNORECASE)
73
- if !regex.match(haystack).nil?
74
- blob.findings.new(
75
- :caption => pattern['caption'],
76
- :description => pattern['description']
77
- )
78
- end
79
- end
80
- end
81
- end
82
- end
83
- end
@@ -1,52 +0,0 @@
1
- # coding: utf-8
2
-
3
- module Gitrob
4
- class ProgressBar
5
- TITLE_MAX_LENGTH = 25
6
-
7
- def initialize(message, options)
8
- @options = {
9
- :format => " #{Paint['[*]', :bright, :blue]} %c/%C %B %j% %e",
10
- :progress_mark => Paint['▓', :bright, :blue],
11
- :remainder_mark => '░',
12
- }.merge(options)
13
- Gitrob::status(message)
14
- @mutex = Mutex.new
15
- @progress_bar = ::ProgressBar::Base.new(@options)
16
- end
17
-
18
- def finish!
19
- @mutex.synchronize { @progress_bar.finish }
20
- end
21
-
22
- def log(message)
23
- @mutex.synchronize do
24
- @progress_bar.log(" #{Paint['[>]', :bright, :blue]} #{message}")
25
- end
26
- end
27
-
28
- def log_error(message)
29
- @mutex.synchronize do
30
- @progress_bar.log(" #{Paint['[!]', :bright, :red]} #{message}")
31
- end
32
- end
33
-
34
- def method_missing(method, *args, &block)
35
- if @progress_bar.respond_to?(method)
36
- @mutex.synchronize { @progress_bar.send(method, *args, &block) }
37
- else
38
- super
39
- end
40
- end
41
-
42
- private
43
-
44
- def make_title(t)
45
- t = t.to_s
46
- if t.size > TITLE_MAX_LENGTH
47
- t = "#{t[0, (TITLE_MAX_LENGTH-3)]}..."
48
- end
49
- " #{Paint['[>]', :bright, :blue]} #{Paint[t.rjust(TITLE_MAX_LENGTH), :bright, :blue]}"
50
- end
51
- end
52
- end
data/lib/gitrob/util.rb DELETED
@@ -1,11 +0,0 @@
1
- module Gitrob
2
- module Util
3
- def self.pluralize(count, singular, plural)
4
- if count.to_i == 1
5
- "#{count} #{singular}"
6
- else
7
- "#{count} #{plural}"
8
- end
9
- end
10
- end
11
- end
data/lib/gitrob/webapp.rb DELETED
@@ -1,76 +0,0 @@
1
- module Gitrob
2
- class WebApp < Sinatra::Base
3
- set :logging, false
4
- set :sessions, false
5
- set :app_file, __FILE__
6
- set :root, File.expand_path("#{File.dirname(__FILE__)}/../../")
7
- set :public_folder, Proc.new { File.join(root, "public") }
8
- set :views, Proc.new { File.join(root, "views") }
9
- set :run, Proc.new { false }
10
-
11
- helpers do
12
- HUMAN_PREFIXES = %W(TB GB MB KB B).freeze
13
-
14
- alias_method :h, :escape_html
15
-
16
- def number_to_human_size(number)
17
- s = number.to_f
18
- i = HUMAN_PREFIXES.length - 1
19
- while s > 512 && i > 0
20
- i -= 1
21
- s /= 1024
22
- end
23
- ((s > 9 || s.modulo(1) < 0.1 ? '%d' : '%.1f') % s) + ' ' + HUMAN_PREFIXES[i]
24
- end
25
-
26
- def format_path(path)
27
- dirname = File.dirname(path)
28
- basename = File.basename(path)
29
- if dirname == '.'
30
- "<strong>#{h basename}</strong>"
31
- else
32
- "#{h dirname}/<strong>#{h basename}</strong>"
33
- end
34
- end
35
- end
36
-
37
- before do
38
- response.headers['Content-Security-Policy'] = "default-src *; script-src 'self'; style-src 'self' 'unsafe-inline'; font-src 'self'; connect-src 'self'"
39
- response.headers['X-Content-Security-Policy'] = "default-src *; script-src 'self'; style-src 'self' 'unsafe-inline'; font-src 'self'; connect-src 'self'"
40
- response.headers['X-WebKit-CSP'] = "default-src *; script-src 'self'; style-src 'self' 'unsafe-inline'; font-src 'self'; connect-src 'self'"
41
- end
42
-
43
- get '/' do
44
- @orgs = Gitrob::Organization.all(:order => [:created_at.desc])
45
- erb :index
46
- end
47
-
48
- get '/orgs/:id' do
49
- @org = Gitrob::Organization.get(params['id'])
50
- @blobs_with_findings = @org.blobs.all(:findings_count.gt => 0)
51
- @repos = @org.repos.all(:order => [:owner_name, :name])
52
- erb :organization
53
- end
54
-
55
- get '/repos/:id' do
56
- @repo = Gitrob::Repo.get(params['id'])
57
- erb :repository
58
- end
59
-
60
- get '/ajax/users/:username' do
61
- if params['type'] == 'org'
62
- @user = Gitrob::Organization.first(:name => params['username'])
63
- @repos = @user.repos.all(:user => nil)
64
- else
65
- @user = Gitrob::User.first(:username => params['username'])
66
- @repos = @user.repos.all
67
- end
68
- erb :user, :layout => false
69
- end
70
-
71
- get '/ajax/blobs/:id' do
72
- @blob = Gitrob::Blob.get(params['id'])
73
- erb :blob, :layout => false
74
- end
75
- end
76
- end
data/models/blob.rb DELETED
@@ -1,35 +0,0 @@
1
- module Gitrob
2
- class Blob
3
- include DataMapper::Resource
4
-
5
- property :id, Serial
6
- property :path, String, :length => 1024, :index => true
7
- property :filename, String, :length => 255, :index => true
8
- property :extension, String, :length => 255, :index => true
9
- property :size, Integer, :index => true
10
- property :findings_count, Integer, :index => true, :default => 0
11
- property :created_at, DateTime
12
-
13
- has n, :findings, :constraint => :destroy
14
- belongs_to :repo
15
- belongs_to :organization
16
-
17
- def url
18
- "https://github.com/#{URI.escape(owner_name)}/#{URI.escape(repo.name)}/blob/master/#{URI.escape(path)}"
19
- end
20
-
21
- def owner_name
22
- repo.user.nil? ? repo.organization.login : repo.user.username
23
- end
24
-
25
- def content
26
- @content ||= fetch_content
27
- end
28
-
29
- private
30
-
31
- def fetch_content
32
- HTTParty.get("https://raw.githubusercontent.com/#{URI.escape(owner_name)}/#{URI.escape(repo.name)}/master/#{URI.escape(path)}").body
33
- end
34
- end
35
- end
data/models/finding.rb DELETED
@@ -1,14 +0,0 @@
1
- module Gitrob
2
- class Finding
3
- include DataMapper::Resource
4
-
5
- property :id, Serial
6
- property :caption, String, :length => 255
7
- property :description, Text
8
-
9
- belongs_to :blob
10
- belongs_to :repo
11
- belongs_to :user, :required => false
12
- belongs_to :organization
13
- end
14
- end
@@ -1,32 +0,0 @@
1
- module Gitrob
2
- class Organization
3
- include DataMapper::Resource
4
-
5
- property :id, Serial
6
- property :name, String, :length => 255, :index => true
7
- property :login, String, :length => 255, :index => true
8
- property :website, String, :length => 255
9
- property :location, String, :length => 255
10
- property :email, String, :length => 255
11
- property :avatar_url, String, :length => 255
12
- property :url, String, :length => 255
13
- property :created_at, DateTime
14
-
15
- has n, :repos, :constraint => :destroy
16
- has n, :users, :constraint => :destroy
17
- has n, :blobs, :constraint => :destroy
18
- has n, :findings, :constraint => :destroy
19
-
20
- def username
21
- @login
22
- end
23
-
24
- def bio
25
- nil
26
- end
27
-
28
- def name
29
- @name.to_s.empty? ? @login : @name
30
- end
31
- end
32
- end
data/models/repo.rb DELETED
@@ -1,22 +0,0 @@
1
- module Gitrob
2
- class Repo
3
- include DataMapper::Resource
4
-
5
- property :id, Serial
6
- property :name, String, :index => true, :length => 255
7
- property :owner_name, String, :index => true
8
- property :description, String, :length => 1024
9
- property :website, String, :length => 255
10
- property :url, String, :length => 255
11
- property :created_at, DateTime
12
-
13
- has n, :blobs, :constraint => :destroy
14
- has n, :findings, :constraint => :destroy
15
- belongs_to :user, :required => false
16
- belongs_to :organization
17
-
18
- def full_name
19
- [owner_name, name].join('/')
20
- end
21
- end
22
- end
data/models/user.rb DELETED
@@ -1,28 +0,0 @@
1
- module Gitrob
2
- class User
3
- include DataMapper::Resource
4
-
5
- property :id, Serial
6
- property :username, String, :index => true
7
- property :name, String, :index => true, :length => 255
8
- property :website, String, :length => 255
9
- property :location, String, :length => 512
10
- property :email, String, :length => 255
11
- property :avatar_url, String, :length => 255
12
- property :url, String, :length => 255
13
- property :bio, String, :length => 1024
14
- property :created_at, DateTime
15
-
16
- has n, :repos, :constraint => :destroy
17
- has n, :blobs, :constraint => :destroy, :through => :repos
18
- has n, :findings, :constraint => :destroy
19
- belongs_to :organization, :required => false
20
-
21
- def name
22
- if @name.empty?
23
- return @username
24
- end
25
- super
26
- end
27
- end
28
- end