lint_report 0.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.
@@ -0,0 +1,2 @@
1
+ v0.0.1 (21st December 2010)
2
+ * initial release
data/README ADDED
@@ -0,0 +1,23 @@
1
+ = LintReport
2
+
3
+ Runs the GemLint suite of checks against the latest version of all rubygems
4
+ available on rubygems.org.
5
+
6
+ Operates in a two stage process:
7
+
8
+ * stage one downloads the latest version of all gems and generate a machine
9
+ parsable text file with failure data
10
+ * stage two parses the output from stage one and generates reports.
11
+
12
+ Only stage one is implemented, so second stage analysis is limited to grepping
13
+ the output log.
14
+
15
+ == Usage
16
+
17
+ gem install lint_report
18
+ lint_report --cachedir ~/gems --output data.log
19
+ lint_website --data data.log --site ~/site
20
+
21
+ == Status
22
+
23
+ This is still a work in progress, proceed with caution.
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+ # coding: utf-8
3
+
4
+ $:.unshift(File.dirname(__FILE__) + "/../lib/")
5
+
6
+ require 'lint_report'
7
+
8
+ LintReport::App.run
@@ -0,0 +1,3 @@
1
+ # coding: utf-8
2
+
3
+ require "lint_report/app"
@@ -0,0 +1,132 @@
1
+ # coding: utf-8
2
+
3
+ require "singleton"
4
+ require "open-uri"
5
+ require "trollop"
6
+ require "zlib"
7
+ require "fileutils"
8
+ require "ostruct"
9
+ require "thread"
10
+ require "gem_lint"
11
+
12
+ module LintReport
13
+ class App
14
+ include Singleton
15
+
16
+ def self.run
17
+ self.instance.run
18
+ end
19
+
20
+ def run
21
+ verify_options
22
+ start_workers
23
+ download_new_gems
24
+ while download_queue.size > 0
25
+ sleep 0.5
26
+ end
27
+ remove_old_gems
28
+ analyse_gems
29
+ end
30
+
31
+ private
32
+
33
+ def verify_options
34
+ if options[:output].nil?
35
+ $stderr.puts "--output must be provided"
36
+ exit 1
37
+ end
38
+ if options[:cachedir].nil?
39
+ $stderr.puts "--cachedir must be provided"
40
+ exit 1
41
+ end
42
+ end
43
+
44
+ def download_queue
45
+ @download_queue ||= SizedQueue.new(100)
46
+ end
47
+
48
+ def start_workers
49
+ download_queue
50
+
51
+ 10.times do
52
+ Thread.new do
53
+ while item = download_queue.pop
54
+ `wget -O #{item.path} #{item.url} > /dev/null 2>&1`
55
+ end
56
+ end
57
+ end
58
+ end
59
+
60
+ def download_new_gems
61
+ FileUtils.mkdir_p(cachedir)
62
+ urls.each do |filename, url|
63
+ path = File.join(cachedir, filename)
64
+ if !File.file?(path) || File.size(path) == 0
65
+ download_queue.push(OpenStruct.new(:url => url, :path => path))
66
+ end
67
+ end
68
+ 10.times do
69
+ download_queue.push(:finished)
70
+ end
71
+ end
72
+
73
+ def remove_old_gems
74
+ FileUtils.mkdir_p(cachedir)
75
+ Dir.entries(cachedir).each do |basename|
76
+ if basename[0,1] != "." && !filenames.include?(basename)
77
+ path = File.join(cachedir, basename)
78
+ FileUtils.rm(path)
79
+ end
80
+ end
81
+ end
82
+
83
+ def analyse_gems
84
+ File.open(output_file, "w") do |f|
85
+ Dir.entries(cachedir).sort.each do |basename|
86
+ if basename[0,1] != "."
87
+ path = File.join(cachedir, basename)
88
+ f.write(GemLint::Runner.new(path).to_s(:detailed) + "\n")
89
+ f.flush
90
+ end
91
+ end
92
+ end
93
+ end
94
+
95
+ def index
96
+ data = Zlib::GzipReader.new(open("http://rubygems.org/latest_specs.4.8.gz")).read
97
+ Marshal.load(data)
98
+ end
99
+
100
+ def filenames
101
+ @filenames ||= index.map { |row|
102
+ if row[2] == "ruby"
103
+ "#{row[0]}-#{row[1]}.gem"
104
+ else
105
+ "#{row[0]}-#{row[1]}-#{row[2]}.gem"
106
+ end
107
+ }
108
+ end
109
+
110
+ def urls
111
+ @urls ||= Hash[
112
+ *filenames.zip(filenames.map { |f| "http://rubygems.org/downloads/#{f}"}).flatten
113
+ ]
114
+ end
115
+
116
+ def cachedir
117
+ @cachedir ||= File.expand_path(options[:cachedir])
118
+ end
119
+
120
+ def output_file
121
+ @output_file ||= File.expand_path(options[:output])
122
+ end
123
+
124
+ def options
125
+ @options ||= opts = Trollop::options do
126
+ opt :output, "Output filename", :type => :string
127
+ opt :cachedir, "Directory to cache downloaded gems", :type => :string
128
+ end
129
+ end
130
+
131
+ end
132
+ end
metadata ADDED
@@ -0,0 +1,134 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lint_report
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - James Healy
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-12-21 00:00:00 +11:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: gem_lint
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 23
30
+ segments:
31
+ - 0
32
+ - 0
33
+ - 4
34
+ version: 0.0.4
35
+ type: :runtime
36
+ version_requirements: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ name: rake
39
+ prerelease: false
40
+ requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ hash: 3
46
+ segments:
47
+ - 0
48
+ version: "0"
49
+ type: :development
50
+ version_requirements: *id002
51
+ - !ruby/object:Gem::Dependency
52
+ name: roodi
53
+ prerelease: false
54
+ requirement: &id003 !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ hash: 3
60
+ segments:
61
+ - 0
62
+ version: "0"
63
+ type: :development
64
+ version_requirements: *id003
65
+ - !ruby/object:Gem::Dependency
66
+ name: rspec
67
+ prerelease: false
68
+ requirement: &id004 !ruby/object:Gem::Requirement
69
+ none: false
70
+ requirements:
71
+ - - ~>
72
+ - !ruby/object:Gem::Version
73
+ hash: 3
74
+ segments:
75
+ - 2
76
+ - 0
77
+ version: "2.0"
78
+ type: :development
79
+ version_requirements: *id004
80
+ description: collates the output generated by running gem_lint against the most recent version of every public gem.
81
+ email:
82
+ - james@yob.id.au
83
+ executables:
84
+ - lint_report
85
+ extensions: []
86
+
87
+ extra_rdoc_files: []
88
+
89
+ files:
90
+ - lib/lint_report/app.rb
91
+ - lib/lint_report.rb
92
+ - bin/lint_report
93
+ - README
94
+ - CHANGELOG
95
+ has_rdoc: true
96
+ homepage: http://github.com/yob/lint_report
97
+ licenses: []
98
+
99
+ post_install_message:
100
+ rdoc_options:
101
+ - --title
102
+ - Lint Report
103
+ - --line-numbers
104
+ require_paths:
105
+ - lib
106
+ required_ruby_version: !ruby/object:Gem::Requirement
107
+ none: false
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ hash: 3
112
+ segments:
113
+ - 0
114
+ version: "0"
115
+ required_rubygems_version: !ruby/object:Gem::Requirement
116
+ none: false
117
+ requirements:
118
+ - - ">="
119
+ - !ruby/object:Gem::Version
120
+ hash: 31
121
+ segments:
122
+ - 1
123
+ - 3
124
+ - 2
125
+ version: 1.3.2
126
+ requirements: []
127
+
128
+ rubyforge_project:
129
+ rubygems_version: 1.3.7
130
+ signing_key:
131
+ specification_version: 3
132
+ summary: Run gem_lint against the complete rubygems archive
133
+ test_files: []
134
+