nod 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.
data/lib/Nod.rb ADDED
@@ -0,0 +1,79 @@
1
+ require 'rubygems'
2
+ require 'nod/gem_savvy'
3
+ require 'nod/git_cloner'
4
+ require 'nod/license_hunch'
5
+ require 'nod/bundle_parser'
6
+ require 'fileutils'
7
+
8
+ class Nod
9
+
10
+ def initialize()
11
+ @basedir = './tmp/git_repos'
12
+ @git_cloner = GitCloner.new('./tmp/filling-in')
13
+ @gem_savvy = GemSavvy.new
14
+ end
15
+
16
+ def get_license_report_for_gem(name)
17
+ # puts "processing gem #{name}"
18
+ url = @gem_savvy.git_clone_url name
19
+ report = {}
20
+
21
+ if !url.nil?
22
+ tmp_dir = "#{@basedir}/#{name}"
23
+ successful_clone = @git_cloner.clone_url url, tmp_dir
24
+ if successful_clone && File.exists?(tmp_dir)
25
+ files_in_repo = Dir.entries(tmp_dir)
26
+ licenses = files_in_repo.select { |file_name| file_name if file_name =~ /license/i }
27
+ # puts "licenses is #{licenses}"
28
+ if !licenses.nil? && licenses.size > 0
29
+ license_type = LicenseHunch.determine_license_from_file licenses[0], File.expand_path(File.dirname(__FILE__) + "/../#{tmp_dir}")
30
+ report = {:gem_name => name, :gem_home_page => @gem_savvy.gem_home(name), :gem_source_url => url, :gem_license => license_type}
31
+ else
32
+ # puts "no license found for #{@gem_savvy.info_for(name)}"
33
+ readme = files_in_repo.select { |file_name| file_name if file_name =~ /readme/i }
34
+ if !readme.nil? && readme.size > 0
35
+ # puts "\n\ngoing readme route with #{readme}"
36
+ license_type = LicenseHunch.determine_license_from_file readme[0], File.expand_path(File.dirname(__FILE__) + "/../#{tmp_dir}")
37
+ # puts "got? #{license_type}"
38
+ report = {:gem_name => name, :gem_home_page => @gem_savvy.gem_home(name), :gem_source_url => url, :gem_license => license_type}
39
+ end
40
+ end
41
+ else
42
+ # TODO handle this
43
+ puts "in else? file didn't exist? gem is #{name}"
44
+ end #file exists
45
+ else
46
+ info = @gem_savvy.info_for(name)
47
+ # puts "info for #{name} is #{info}"
48
+ report = {:gem_name => name, :gem_home_page => info['homepage_uri'], :gem_source_url => info['source_code_uri'], :gem_license => 'Cannot determine'}
49
+ end
50
+ # puts "returning report for gem #{name} -> #{report}"
51
+ return report
52
+ end
53
+
54
+ def get_licenses_for(gemfile_path)
55
+ parser = BundleParser.new(gemfile_path)
56
+ all_names = parser.gem_names
57
+ report = []
58
+
59
+ all_names.each { | name | report << get_license_report_for_gem(name) }
60
+ return report
61
+ end
62
+ # parse gemfile
63
+ # for each gem
64
+ # get source url
65
+ # if url is git hub
66
+ # clone
67
+ # find license file
68
+ # determine MIT, Apache, etc
69
+ # if not source URL
70
+ # check description
71
+ # if not in description
72
+ # get home page for rubyforge
73
+ # parse home page and look for license
74
+
75
+
76
+ # return a report -- it is an [] full of {}s
77
+ # { :name => 'gem name', :url => 'url', :license => 'MIT|Apache|unknown' }
78
+
79
+ end
@@ -0,0 +1,18 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+
4
+ class BundleParser
5
+
6
+ def initialize(gemfile_path)
7
+ @lockfile = Bundler::LockfileParser.new(Bundler.read_file(gemfile_path))
8
+ end
9
+
10
+ def gem_names
11
+ names = []
12
+ @lockfile.specs.each do |s|
13
+ names << s.name
14
+ end
15
+ names
16
+ end
17
+
18
+ end
@@ -0,0 +1,48 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ require 'gems'
4
+ # see https://gist.github.com/1722530
5
+
6
+ class GemSavvy
7
+
8
+ # def initialize(gemfile_path)
9
+ # @lockfile = Bundler::LockfileParser.new(Bundler.read_file(gemfile_path))
10
+ # end
11
+ #
12
+ # def names
13
+ # names = []
14
+ # @lockfile.specs.each do |s|
15
+ # names << s.name
16
+ # end
17
+ # names
18
+ # end
19
+
20
+ def info_for(gem_name)
21
+ Gems.info gem_name
22
+ end
23
+
24
+ def gem_home(gem_name)
25
+ info = info_for gem_name
26
+ info['homepage_uri']
27
+ end
28
+
29
+ def gem_source_home(gem_name)
30
+ info = info_for gem_name
31
+ info['source_code_uri']
32
+ end
33
+
34
+ def git_clone_url(gem_name)
35
+ http_url = gem_home gem_name
36
+ if !http_url.nil? && http_url.include?('github.com')
37
+ "#{http_url.gsub('http://', 'git://')}.git"
38
+ else
39
+ http_url = gem_source_home gem_name
40
+ if !http_url.nil? && http_url.include?('github.com')
41
+ "#{http_url.gsub('http://', 'git://')}.git"
42
+ else
43
+ nil
44
+ end
45
+ end
46
+ end
47
+
48
+ end
@@ -0,0 +1,21 @@
1
+ require 'rubygems'
2
+ require 'grit'
3
+
4
+ class GitCloner
5
+
6
+ def initialize(tmp_dir)
7
+ @tmp_dir = tmp_dir
8
+ @gritty = Grit::Git.new(tmp_dir)
9
+ end
10
+
11
+ def clone_url(url, to_url)
12
+ begin
13
+ @gritty.clone({:quiet => false, :verbose => true, :progress => true}, url, to_url)
14
+ true
15
+ rescue
16
+ puts "couldn't clone #{url}"
17
+ false
18
+ end
19
+ end
20
+
21
+ end
@@ -0,0 +1,30 @@
1
+ require 'rubygems'
2
+
3
+ class LicenseHunch
4
+
5
+ def self.determine_license_from_file(license_name, base_path)
6
+
7
+ if license_name.downcase.include?('mit')
8
+ return 'MIT'
9
+ end
10
+
11
+ file_path = "#{base_path}/#{license_name}"
12
+ is_mit_lic = false
13
+ File.open(file_path, 'r').each_line do | line |
14
+ return 'MIT' if line =~ /MIT License/i
15
+ end
16
+
17
+ all_text = File.open(file_path).read.gsub(/\n/,' ')
18
+
19
+ phrase_1 = "to deal in the Software without restriction"
20
+ phrase_2 = "Permission is hereby granted, free of charge, to any person obtaining"
21
+ phrase_3 = "use, copy, modify, merge, publish"
22
+ phrase_4 = "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY"
23
+ phrase_5 = "distribute, sublicense"
24
+ return 'MIT' if (all_text =~ /#{phrase_1}/i && all_text =~ /#{phrase_2}/i && all_text =~ /#{phrase_3}/i && all_text =~ /#{phrase_4}/ && all_text =~ /#{phrase_5}/ )
25
+
26
+ return 'Unknown'
27
+
28
+ end
29
+
30
+ end
metadata ADDED
@@ -0,0 +1,112 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: nod
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.0.1
6
+ platform: ruby
7
+ authors:
8
+ - Andrew Glover
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2012-08-28 00:00:00 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: bundler
17
+ prerelease: false
18
+ requirement: &id001 !ruby/object:Gem::Requirement
19
+ none: false
20
+ requirements:
21
+ - - ~>
22
+ - !ruby/object:Gem::Version
23
+ version: 1.0.21
24
+ type: :runtime
25
+ version_requirements: *id001
26
+ - !ruby/object:Gem::Dependency
27
+ name: gems
28
+ prerelease: false
29
+ requirement: &id002 !ruby/object:Gem::Requirement
30
+ none: false
31
+ requirements:
32
+ - - ~>
33
+ - !ruby/object:Gem::Version
34
+ version: 0.7.0
35
+ type: :runtime
36
+ version_requirements: *id002
37
+ - !ruby/object:Gem::Dependency
38
+ name: grit
39
+ prerelease: false
40
+ requirement: &id003 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 2.5.0
46
+ type: :runtime
47
+ version_requirements: *id003
48
+ - !ruby/object:Gem::Dependency
49
+ name: rake
50
+ prerelease: false
51
+ requirement: &id004 !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ~>
55
+ - !ruby/object:Gem::Version
56
+ version: 0.9.2
57
+ type: :development
58
+ version_requirements: *id004
59
+ - !ruby/object:Gem::Dependency
60
+ name: nokogiri
61
+ prerelease: false
62
+ requirement: &id005 !ruby/object:Gem::Requirement
63
+ none: false
64
+ requirements:
65
+ - - ~>
66
+ - !ruby/object:Gem::Version
67
+ version: 1.5.5
68
+ type: :runtime
69
+ version_requirements: *id005
70
+ description: Gem reports on gemfile licenses
71
+ email: ajglover@gmail.com
72
+ executables: []
73
+
74
+ extensions: []
75
+
76
+ extra_rdoc_files: []
77
+
78
+ files:
79
+ - lib/Nod.rb
80
+ - lib/nod/gem_savvy.rb
81
+ - lib/nod/git_cloner.rb
82
+ - lib/nod/license_hunch.rb
83
+ - lib/nod/bundle_parser.rb
84
+ homepage: https://github.com/aglover/green_light
85
+ licenses: []
86
+
87
+ post_install_message:
88
+ rdoc_options: []
89
+
90
+ require_paths:
91
+ - lib
92
+ required_ruby_version: !ruby/object:Gem::Requirement
93
+ none: false
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: "0"
98
+ required_rubygems_version: !ruby/object:Gem::Requirement
99
+ none: false
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: "0"
104
+ requirements: []
105
+
106
+ rubyforge_project:
107
+ rubygems_version: 1.8.15
108
+ signing_key:
109
+ specification_version: 3
110
+ summary: Green Light OSS baby
111
+ test_files: []
112
+