license_auto 0.1.1.1 → 0.1.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (79) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -2
  3. data/Gemfile +9 -1
  4. data/Gemfile.lock +27 -0
  5. data/README.md +14 -18
  6. data/Rakefile +5 -5
  7. data/examples/get_license_files_of_bundler.rb +1 -1
  8. data/lib/license_auto/config/config.rb +37 -51
  9. data/lib/license_auto/config/sample.config.yml +20 -0
  10. data/lib/license_auto/exceptions.rb +32 -0
  11. data/lib/license_auto/license/frequency.rb +1 -1
  12. data/lib/license_auto/license/readme.rb +43 -0
  13. data/lib/license_auto/license/similarity.rb +43 -231
  14. data/lib/license_auto/license/templates/PerlArtistic.txt +1 -0
  15. data/lib/license_auto/license_info_wrapper.rb +28 -0
  16. data/lib/license_auto/logger.rb +27 -0
  17. data/lib/license_auto/{errors.rb → misc.rb} +0 -0
  18. data/lib/license_auto/module.rb +17 -0
  19. data/lib/license_auto/package.rb +65 -10
  20. data/lib/license_auto/package_manager/apt.rb +2 -0
  21. data/lib/license_auto/package_manager/bower.rb +2 -0
  22. data/lib/license_auto/package_manager/bundler.rb +87 -0
  23. data/lib/license_auto/package_manager/gemfury.rb +39 -0
  24. data/lib/license_auto/{parser → package_manager}/golang.rb +0 -0
  25. data/lib/{parser/enums.rb → license_auto/package_manager/golang_stdlibs.rb} +1 -1
  26. data/lib/license_auto/{parser → package_manager}/gradle.rb +0 -0
  27. data/lib/license_auto/package_manager/ivy.rb +1 -0
  28. data/lib/license_auto/{parser/gemfile.rb → package_manager/license_header.rb} +0 -0
  29. data/lib/license_auto/package_manager/maven.rb +0 -0
  30. data/lib/license_auto/package_manager/npm.rb +2 -0
  31. data/lib/license_auto/package_manager/phar.rb +3 -0
  32. data/lib/license_auto/package_manager/pip.rb +2 -0
  33. data/lib/license_auto/package_manager/yum.rb +2 -0
  34. data/lib/license_auto/package_manager.rb +41 -0
  35. data/lib/license_auto/repo.rb +79 -0
  36. data/lib/license_auto/version.rb +1 -1
  37. data/lib/license_auto/website/gemfury_com.rb +10 -0
  38. data/lib/license_auto/website/github_com.rb +179 -0
  39. data/lib/license_auto/website/ruby_gems_org.rb +17 -4
  40. data/lib/license_auto.rb +6 -11
  41. data/license_auto.gemspec +7 -2
  42. data/{lib → remove}/api/bitbucket.rb +0 -0
  43. data/{lib → remove}/api/code_google_com.rb +0 -0
  44. data/{lib → remove}/api/excel_export.rb +0 -0
  45. data/{lib → remove}/api/gem_data.rb +0 -0
  46. data/{lib → remove}/api/git_kernel_org.rb +0 -0
  47. data/{lib → remove}/api/github.rb +0 -0
  48. data/{lib → remove}/api/go_pkg_in.rb +0 -0
  49. data/{lib → remove}/api/golang_org.rb +0 -0
  50. data/{lib → remove}/api/google_source_com.rb +0 -0
  51. data/{lib → remove}/api/gradle2.rb +0 -0
  52. data/{lib → remove}/api/helper.rb +0 -0
  53. data/{lib → remove}/api/j_center.rb +0 -0
  54. data/{lib → remove}/api/maven_central_repository.rb +0 -0
  55. data/{lib → remove}/api/mq.rb +0 -0
  56. data/{lib → remove}/api/npm_registry.rb +0 -0
  57. data/{lib → remove}/api/pattern.rb +0 -0
  58. data/{lib → remove}/api/remote_source_package.rb +0 -0
  59. data/{lib → remove}/api/spider.rb +0 -0
  60. data/{lib → remove}/api.rb +0 -0
  61. data/{lib → remove}/cloner.rb +1 -1
  62. data/{lib → remove}/db.rb +0 -0
  63. data/{lib → remove}/misc.rb +0 -0
  64. data/{lib → remove}/parser/gemfile_parser.rb +0 -0
  65. data/{lib → remove}/parser/golang_parser.rb +1 -1
  66. data/{lib → remove}/parser/gradle_parser.rb +0 -0
  67. data/{lib → remove}/parser/manifest_parser.rb +0 -0
  68. data/{lib → remove}/parser/maven_parser.rb +0 -0
  69. data/{lib → remove}/parser/npm_parser.rb +0 -0
  70. data/{lib → remove}/parser/pip_parser.rb +0 -0
  71. data/{lib → remove}/parser/rebar_parser.rb +0 -0
  72. data/{lib → remove}/recorder.rb +0 -0
  73. data/{lib → remove}/script/apt-get.deps.sh +0 -0
  74. data/{lib → remove}/script/debian_dpkg_list.sh +0 -0
  75. data/{lib → remove}/script/rubygems.org.importdb.sh +0 -0
  76. metadata +103 -52
  77. data/lib/license_auto/license_info.rb +0 -12
  78. data/lib/license_auto/website/github.rb +0 -49
  79. data/lib/message.rb +0 -5
@@ -0,0 +1,41 @@
1
+ require 'open-uri'
2
+ require 'find'
3
+ require 'license_auto/logger'
4
+ require 'license_auto/module'
5
+
6
+ module LicenseAuto
7
+ class VirtualPackageManager
8
+
9
+ virtual :initialize,
10
+ :parse_dependencies,
11
+ :dependency_file_pattern
12
+
13
+ # def self.package_managers
14
+ # [Bundler, NPM, Pip, Bower, Maven, Gradle, CocoaPods, Rebar, Nuget]
15
+ # end
16
+
17
+ # @uri:
18
+ # ./filepath/name.txt
19
+ # /some/absolute/file/path/name
20
+ # http://somesite.com/foo/bar/baz.file
21
+ def initialize(path)
22
+ @path = path
23
+ end
24
+
25
+ # @return Array[Dependency]
26
+ def parse_dependencies; end
27
+
28
+ # @return Array[Regexp]
29
+ def dependency_file_pattern; end
30
+
31
+ def dependency_file_path_names(pattern=dependency_file_pattern)
32
+ if FileTest.directory?(@path)
33
+ Find.find(@path).select do |filename|
34
+ FileTest.file?(filename) && filename =~ pattern
35
+ end
36
+ else
37
+ LicenseAuto.logger.fatal("The repo path: #{@path} does not exist!")
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,79 @@
1
+ require 'hashie/mash'
2
+ require 'license_auto/website/github_com'
3
+ require 'license_auto/package_manager/bundler'
4
+
5
+ module LicenseAuto
6
+ class Repo < Hashie::Mash
7
+
8
+ # hash example:
9
+ # {
10
+ # "clone_url": "https://github.com/mineworks/license_auto.git",
11
+ # "ref": "readme",
12
+ # "access_token": "40 chars token"
13
+ # }
14
+ def initialize(hash)
15
+ super(hash)
16
+ @server = chose_repo_server
17
+ raise("#{hash} is not a Github Repo") unless @server
18
+ end
19
+
20
+ def self.package_managers
21
+ [Bundler]
22
+ end
23
+
24
+ # @return:
25
+ # {
26
+ # "LicenseAuto::Bundler": [
27
+ # {
28
+ # "dep_file": "/tmp/license_auto/cache/github.com/mineworks/license_auto.git/Gemfile.lock",
29
+ # "deps": [
30
+ # {
31
+ # "name": "addressable",
32
+ # "version": "2.4.0",
33
+ # "remote": "https://rubygems.org/"
34
+ # },
35
+ # {
36
+ # "name": "anemone",
37
+ # "version": "0.7.2",
38
+ # "remote": "https://rubygems.org/"
39
+ # },
40
+ # {
41
+ # "name": "ast",
42
+ # "version": "2.2.0",
43
+ # "remote": "https://rubygems.org/"
44
+ # }
45
+ # ]
46
+ # }
47
+ # ]
48
+ # }
49
+ def find_dependencies
50
+ repo_dir = @server.clone
51
+ deps = {}
52
+ Repo.package_managers.each {|pm|
53
+ # LicenseAuto.logger.debug(pm)
54
+ items = pm.new(repo_dir).parse_dependencies
55
+ unless items.empty?
56
+ deps[pm.to_s] = items
57
+ end
58
+ }
59
+ LicenseAuto.logger.debug(JSON.pretty_generate(deps))
60
+ deps
61
+ end
62
+
63
+ # def get_ref()
64
+ # @server.get_ref(self.ref)
65
+ # end
66
+
67
+ private
68
+
69
+ def chose_repo_server
70
+ source_code_matcher = LicenseAuto::Matcher::SourceURL.new(clone_url)
71
+ github_matched = source_code_matcher.match_github_resource
72
+ if github_matched
73
+ # TODO: pass argument: ref
74
+
75
+ @server = GithubCom.new({}, github_matched[:owner], github_matched[:repo], ref=self.ref)
76
+ end
77
+ end
78
+ end
79
+ end
@@ -8,7 +8,7 @@ module LicenseAuto
8
8
  MAJOR = 0
9
9
  MINOR = 1
10
10
  TINY = 1
11
- PRE = '1'
11
+ PRE = '2'
12
12
 
13
13
  STRING =
14
14
  if PRE.empty?
@@ -0,0 +1,10 @@
1
+ ##
2
+ # [Gemfury](https://gemfury.com/) is a hosted repository for your public and private packages,
3
+ # where they are safe and within reach.
4
+ #
5
+ # [Install RubyGems with a Gemfile](https://gemfury.com/help/install-gems#_ga=1.159224378.125260097.1457687192)
6
+
7
+ class GemfuryCom
8
+ # TODO:
9
+
10
+ end
@@ -0,0 +1,179 @@
1
+ require 'base64'
2
+
3
+ require 'fileutils'
4
+ require 'github_api'
5
+ require 'git'
6
+
7
+
8
+ require 'license_auto/config/config'
9
+ require 'license_auto/license/similarity'
10
+ require 'license_auto/license/readme'
11
+
12
+ class GithubCom < Website
13
+
14
+ HOST = 'github.com'
15
+ LANGUAGE = nil
16
+
17
+ GIT_HASH_LENGTH = 40
18
+
19
+ ##
20
+ # package: Hashie::Mash
21
+ # user: string
22
+ # repo: string
23
+ # ref: string
24
+ def initialize(package, user, repo, ref=nil)
25
+ super(package)
26
+ @ref = ref
27
+
28
+ LicenseAuto.logger.debug("#{user}/#{repo}, #{@ref}")
29
+
30
+ @server =
31
+ begin
32
+ eval('WebMock')
33
+ LicenseAuto.logger.debug("LicenseAuto under RSpec mode")
34
+ Github.new(user: user, repo: repo)
35
+ rescue NameError => e
36
+ LicenseAuto.logger.debug("LicenseAuto under running mode")
37
+ basic_auth = "#{LUTO_CONF.github.username}:#{LUTO_CONF.github.access_token}"
38
+ Github.new(user: user, repo: repo, basic_auth: basic_auth)
39
+ end
40
+ end
41
+
42
+ ##
43
+ # @return LicenseInfoWrapper
44
+
45
+ def get_license_info()
46
+ possible_ref = @ref || match_versioned_ref
47
+ # If possible_ref is nil, the Github API server will return the default branch contents
48
+ contents = @server.repos.contents.get(path: '/', ref: possible_ref)
49
+
50
+ license_files = []
51
+ readme_files = []
52
+ notice_files = []
53
+ contents.each {|obj|
54
+ if obj.type == 'file'
55
+ filename_matcher = LicenseAuto::Matcher::FilepathName.new(obj.name)
56
+ license_files.push(obj) if filename_matcher.match_license_file
57
+ readme_files.push(obj) if filename_matcher.match_readme_file
58
+ notice_files.push(obj) if filename_matcher.match_notice_file
59
+ end
60
+ }
61
+
62
+ license_files = license_files.map {|obj|
63
+ license_content = get_blobs(obj['sha'])
64
+ license_name, sim_ratio = LicenseAuto::Similarity.new(license_content).most_license_sim
65
+ _hash = {
66
+ name: license_name,
67
+ sim_ratio: sim_ratio,
68
+ html_url: obj['html_url'],
69
+ download_url: obj['download_url'],
70
+ text: license_content
71
+ }
72
+ LicenseAuto::LicenseWrapper.new(_hash)
73
+ }
74
+
75
+ readme_files = readme_files.map {|obj|
76
+ readme_content = get_blobs(obj['sha'])
77
+ license_content = LicenseAuto::Readme.new(obj['download_url'], readme_content).license_content
78
+ LicenseAuto.logger.debug(license_content)
79
+ if license_content.nil?
80
+ next
81
+ else
82
+ license_name, sim_ratio = LicenseAuto::Similarity.new(license_content).most_license_sim
83
+ _hash = {
84
+ name: license_name,
85
+ sim_ratio: sim_ratio,
86
+ html_url: obj['html_url'],
87
+ download_url: obj['download_url'],
88
+ text: license_content
89
+ }
90
+ LicenseAuto::LicenseWrapper.new(_hash)
91
+ end
92
+ }.compact!
93
+
94
+ LicenseAuto::LicenseInfoWrapper.new(licenses: license_files, readmes: readme_files, notices: notice_files)
95
+ end
96
+
97
+ def get_ref(ref)
98
+ @server.git_data.references.get(ref: ref)
99
+ end
100
+
101
+ def match_versioned_ref()
102
+ possible_ref = nil
103
+ # If provided a Git SHA, use it directly
104
+ if @package.version.size >= GIT_HASH_LENGTH
105
+ possible_ref = @package.version
106
+ else
107
+ matcher = LicenseAuto::Matcher::FilepathName.new(@package.version)
108
+ @server.repos.tags do |tag|
109
+ matched = matcher.match_the_ref(tag.name)
110
+ if matched
111
+ possible_ref = tag.name
112
+ break
113
+ end
114
+ end
115
+ end
116
+ possible_ref
117
+ end
118
+
119
+ def list_languages
120
+ langs = @server.repos.languages
121
+ LicenseAuto.logger.debug("All languaegs: #{langs}")
122
+ langs
123
+ end
124
+
125
+ def clone
126
+ info = repo_info
127
+
128
+ clone_url = info.body.fetch('clone_url')
129
+ LicenseAuto.logger.debug(clone_url)
130
+
131
+ trimmed_url = clone_url.gsub(/^http[s]?:\/\//, '')
132
+ clone_dir = "#{LUTO_CACHE_DIR}/#{trimmed_url}"
133
+ LicenseAuto.logger.debug(clone_dir)
134
+
135
+ if Dir.exists?(clone_dir)
136
+ git = Git.open(clone_dir, :log => LicenseAuto.logger)
137
+ local_branch = git.branches.local[0].full
138
+ if local_branch == @ref
139
+ git.pull(remote='origin', branch=local_branch)
140
+ else
141
+ FileUtils::rm_rf(clone_dir)
142
+ do_clone(clone_url, clone_dir)
143
+ end
144
+ else
145
+ do_clone(clone_url, clone_dir)
146
+ end
147
+ clone_dir
148
+ end
149
+
150
+ def do_clone(clone_url, clone_dir)
151
+ LicenseAuto.logger.debug(@ref)
152
+ clone_opts = {
153
+ :depth => 1, # Only last commit history for fast
154
+ :branch => @ref
155
+ }
156
+ LicenseAuto.logger.debug(clone_url)
157
+ cloned_repo = Git.clone(clone_url, clone_dir, clone_opts)
158
+ end
159
+
160
+ def repo_info
161
+ @server.repos.get
162
+ end
163
+
164
+ def filter_gitmodules
165
+ end
166
+
167
+ # http://www.rubydoc.info/github/piotrmurach/github/master/Github/Client/GitData/Blobs#get-instance_method
168
+ def get_blobs(sha)
169
+ response_wrapper = @server.git_data.blobs.get(@server.user, @server.repo, sha)
170
+ LicenseAuto.logger.debug(response_wrapper)
171
+ content = response_wrapper.body.content
172
+ encoding = response_wrapper.body.encoding
173
+ if encoding == 'base64'
174
+ Base64.decode64(content)
175
+ else
176
+ LicenseAuto.logger.error("Unknown encoding: #{encoding}")
177
+ end
178
+ end
179
+ end
@@ -1,11 +1,15 @@
1
1
  require 'gems'
2
2
  require 'hashie'
3
3
 
4
- require 'license_auto/website/github'
4
+ require 'license_auto/website/github_com'
5
+ require 'license_auto/exceptions'
5
6
 
6
7
 
7
8
  class RubyGemsOrg < Website
8
9
 
10
+ URI = 'https://rubygems.org/'
11
+ HOST = 'rubygems.org'
12
+ LANGUAGE = 'Ruby'
9
13
 
10
14
  GEM_NOT_FOUND = "This rubygem could not be found."
11
15
 
@@ -26,13 +30,16 @@ class RubyGemsOrg < Website
26
30
  end
27
31
 
28
32
  gem_info = get_gem_info
29
- gem_info = Hashie::Mash.new(gem_info)
33
+
34
+ raise LicenseAuto::PackageNotFound if gem_info.nil?
30
35
 
31
36
  source_code_matcher = LicenseAuto::Matcher::SourceURL.new(gem_info.source_code_uri)
32
37
 
33
38
  github_matched = source_code_matcher.match_github_resource
34
39
  if github_matched
35
- license_info = LicenseAuto::github_get_license_info(github_matched[:owner], github_matched[:repo], @package.version)
40
+ license_info = GithubCom.new(@package, github_matched[:owner], github_matched[:repo]).get_license_info
41
+ elsif false
42
+
36
43
  end
37
44
 
38
45
  # bitbucket_matched = source_code_matcher.match_bitbucket_resource()
@@ -43,7 +50,13 @@ class RubyGemsOrg < Website
43
50
 
44
51
  def get_gem_info()
45
52
  # TODO: Gems.info(@package.name, @package.version)
46
- Gems.info(@package.name)
53
+ gem_info = Gems.info(@package.name)
54
+ gem_info =
55
+ if gem_info == GEM_NOT_FOUND
56
+ nil
57
+ else
58
+ Hashie::Mash.new(gem_info)
59
+ end
47
60
  end
48
61
 
49
62
  # TODO: switch to https://github.com/rubygems/gems/issues/32#issuecomment-195180422
data/lib/license_auto.rb CHANGED
@@ -1,20 +1,15 @@
1
1
  require 'pathname'
2
-
3
- module LicenseAuto
4
-
5
- end
6
-
2
+ require 'license_auto/config/config'
3
+ require 'license_auto/logger'
7
4
 
8
5
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'license_auto'))
9
6
  $LOAD_PATH.unshift(File.dirname(__FILE__))
10
7
 
11
- # puts $LOAD_PATH
12
- # puts Pathname.new(__FILE__).dirname.join("license_finder")
13
-
14
- # require 'license_auto/config/config'
15
-
16
8
  require 'license_auto/website'
17
9
  require 'license_auto/matcher'
18
10
  require 'license_auto/package'
19
- require 'license_auto/license_info'
11
+ require 'license_auto/repo'
12
+ require 'license_auto/license/similarity'
13
+ require 'license_auto/license_info_wrapper'
14
+ require 'license_auto/exceptions'
20
15
 
data/license_auto.gemspec CHANGED
@@ -34,11 +34,16 @@ Gem::Specification.new do |spec|
34
34
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
35
35
  spec.require_paths = ["lib"]
36
36
 
37
+ spec.add_runtime_dependency 'bundler', '~> 1.10', '>= 0'
37
38
  spec.add_runtime_dependency "hashie"
39
+ spec.add_runtime_dependency "log4r"
38
40
  spec.add_runtime_dependency "json"
39
41
  spec.add_runtime_dependency "gems"
40
42
  spec.add_runtime_dependency "github_api"
41
-
42
- spec.add_development_dependency "bundler", "~> 1.10"
43
+ spec.add_runtime_dependency "tf-idf-similarity"
44
+ # spec.add_runtime_dependency "github-markup"
45
+ # spec.add_runtime_dependency "redcarpet"
46
+ # spec.add_runtime_dependency "rdoc"
47
+
43
48
  spec.add_development_dependency "rake", "~> 10.0"
44
49
  end
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -10,7 +10,7 @@ module Cloner
10
10
  def self.make_path(repo)
11
11
  # todo: If repo is a git@github.com:xxx/yyy
12
12
  $plog.debug(repo)
13
- repo = repo.gsub(/(https:\/\/|http:\/\/|git@)/,'')
13
+ repo = repo.gsub(/(https:\/\/|http:\/\/|git@)/, '')
14
14
  path = "#{AUTO_ROOT}/#{repo}"
15
15
  end
16
16
 
File without changes
File without changes
File without changes
@@ -5,7 +5,7 @@ require 'json'
5
5
  require 'open3'
6
6
  require 'set'
7
7
  require_relative '../../lib/cloner'
8
- require_relative '../../enums'
8
+ require_relative '../../golang'
9
9
  require_relative '../../config/config'
10
10
  require_relative '../recorder'
11
11
 
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes