license_auto 0.1.1.2 → 0.1.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.gitmodules +3 -0
  4. data/.travis.yml +9 -2
  5. data/README.md +10 -8
  6. data/lib/license_auto/exceptions.rb +10 -0
  7. data/lib/license_auto/license/frequency.rb +1 -1
  8. data/lib/license_auto/license/readme.rb +21 -2
  9. data/lib/license_auto/license/similarity.rb +4 -3
  10. data/lib/license_auto/license_info_wrapper.rb +16 -0
  11. data/lib/license_auto/matcher.rb +14 -4
  12. data/lib/license_auto/package.rb +29 -15
  13. data/lib/license_auto/package_manager.rb +6 -2
  14. data/lib/license_auto/package_manager/bundler.rb +10 -6
  15. data/lib/license_auto/package_manager/gemfury.rb +2 -0
  16. data/lib/license_auto/package_manager/git_module.rb +73 -0
  17. data/lib/license_auto/package_manager/golang.rb +155 -0
  18. data/lib/license_auto/package_manager/gradle.rb +145 -0
  19. data/lib/license_auto/package_manager/maven.rb +133 -0
  20. data/lib/license_auto/package_manager/npm.rb +117 -1
  21. data/lib/license_auto/package_manager/pip.rb +8 -2
  22. data/lib/license_auto/repo.rb +51 -3
  23. data/lib/license_auto/source_code_server.rb +13 -0
  24. data/lib/license_auto/var/golang_std_libs.rb +160 -0
  25. data/lib/license_auto/version.rb +1 -1
  26. data/lib/license_auto/website.rb +1 -0
  27. data/lib/license_auto/website/cocoapods_org.rb +10 -0
  28. data/lib/license_auto/website/github_com.rb +43 -18
  29. data/lib/license_auto/website/homepage_spider.rb +56 -0
  30. data/lib/license_auto/website/maven_central_repository.rb +258 -0
  31. data/lib/license_auto/website/npm_registry.rb +178 -0
  32. data/lib/license_auto/website/ruby_gems_org.rb +119 -8
  33. data/license_auto.gemspec +1 -0
  34. data/package.json +30 -0
  35. metadata +25 -40
  36. data/lib/license_auto/package_manager/golang_stdlibs.rb +0 -161
  37. data/remove/api.rb +0 -60
  38. data/remove/api/bitbucket.rb +0 -142
  39. data/remove/api/code_google_com.rb +0 -66
  40. data/remove/api/excel_export.rb +0 -189
  41. data/remove/api/gem_data.rb +0 -30
  42. data/remove/api/git_kernel_org.rb +0 -59
  43. data/remove/api/github.rb +0 -376
  44. data/remove/api/go_pkg_in.rb +0 -41
  45. data/remove/api/golang_org.rb +0 -63
  46. data/remove/api/google_source_com.rb +0 -68
  47. data/remove/api/gradle2.rb +0 -41
  48. data/remove/api/helper.rb +0 -26
  49. data/remove/api/j_center.rb +0 -23
  50. data/remove/api/maven_central_repository.rb +0 -192
  51. data/remove/api/mq.rb +0 -30
  52. data/remove/api/npm_registry.rb +0 -169
  53. data/remove/api/pattern.rb +0 -33
  54. data/remove/api/remote_source_package.rb +0 -319
  55. data/remove/api/spider.rb +0 -47
  56. data/remove/cloner.rb +0 -154
  57. data/remove/db.rb +0 -267
  58. data/remove/license_auto +0 -4
  59. data/remove/misc.rb +0 -131
  60. data/remove/mq_pack.rb +0 -219
  61. data/remove/mq_repo.rb +0 -106
  62. data/remove/parser/gemfile_parser.rb +0 -221
  63. data/remove/parser/golang_parser.rb +0 -104
  64. data/remove/parser/gradle_parser.rb +0 -141
  65. data/remove/parser/manifest_parser.rb +0 -66
  66. data/remove/parser/maven_parser.rb +0 -91
  67. data/remove/parser/npm_parser.rb +0 -82
  68. data/remove/parser/pip_parser.rb +0 -1
  69. data/remove/parser/rebar_parser.rb +0 -61
  70. data/remove/recorder.rb +0 -184
  71. data/remove/script/apt-get.deps.sh +0 -37
  72. data/remove/script/debian_dpkg_list.sh +0 -2
  73. data/remove/script/rubygems.org.importdb.sh +0 -22
@@ -0,0 +1,73 @@
1
+ # https://git-scm.com/book/en/v2/Git-Tools-Submodules
2
+
3
+ require 'open3'
4
+ require 'license_auto/package_manager'
5
+
6
+ module LicenseAuto
7
+ class GitModule < LicenseAuto::PackageManager
8
+
9
+ LANGUAGE = 'GitModule'
10
+
11
+ def initialize(path)
12
+ super(path)
13
+ end
14
+
15
+ def dependency_file_pattern
16
+ /#{@path}\/\.gitmodules$/
17
+ end
18
+
19
+ def parse_dependencies
20
+ git_module_files = dependency_file_path_names
21
+ if git_module_files.empty?
22
+ LicenseAuto.logger.info("#{LANGUAGE}: #{dependency_file_pattern} file not exist")
23
+ []
24
+ elsif git_module_files.size == 1
25
+ dep_file = git_module_files.first
26
+ LicenseAuto.logger.debug(dep_file)
27
+ modules = parse_modules(dep_file)
28
+ LicenseAuto.logger.debug(modules)
29
+ [
30
+ {
31
+ dep_file: dep_file,
32
+ deps: modules
33
+ }
34
+ ]
35
+ end
36
+ # LicenseAuto.logger.debug(JSON.pretty_generate(dep_files))
37
+ end
38
+
39
+ def self.check_cli
40
+ cmd = 'git version'
41
+ stdout_str, stderr_str, _status = Open3.capture3(cmd)
42
+ if stdout_str.include?('git version')
43
+ true
44
+ else
45
+ LicenseAuto.logger.error("stdout_str: #{stdout_str}, stderr_str: #{stderr_str}")
46
+ false
47
+ end
48
+ end
49
+
50
+ private
51
+
52
+ def parse_modules(dep_file)
53
+ lines = File.readlines(dep_file)
54
+ module_pattern = /url\s=\s(?<url>.+)(\.git)?$/
55
+ lines.map {|line|
56
+ matched = module_pattern.match(line)
57
+ if matched
58
+ LicenseAuto.logger.debug("matched: #{matched}, .gitmodule line: #{line}")
59
+ clone_url = matched[:url].gsub(/\.git$/, '')
60
+ {
61
+ name: clone_url,
62
+ # TODO: fetch version infomation from .git/ dir is to complex
63
+ version: nil,
64
+ remote: clone_url
65
+ }
66
+ end
67
+ }.compact
68
+ end
69
+
70
+
71
+
72
+ end
73
+ end
@@ -0,0 +1,155 @@
1
+ require 'open3'
2
+ require 'set'
3
+ require 'license_auto/package_manager'
4
+ require 'license_auto/var/golang_std_libs'
5
+ require 'license_auto/matcher'
6
+
7
+ module LicenseAuto
8
+ class Golang < LicenseAuto::PackageManager
9
+
10
+ LANGUAGE = 'Golang'
11
+
12
+ def initialize(path)
13
+ super(path)
14
+ end
15
+
16
+ # Fake
17
+ def dependency_file_pattern
18
+ /#{@path}\/.*\.go$/
19
+ end
20
+
21
+ def parse_dependencies
22
+ content = list_content
23
+ if content.nil?
24
+ LicenseAuto.logger.info("Golang dependencies not exist")
25
+ return []
26
+ else
27
+ deps = filter_deps(content)
28
+ LicenseAuto.logger.debug(deps)
29
+ [
30
+ {
31
+ dep_file: nil,
32
+ deps: deps.map {|dep|
33
+ remote, latest_sha = fetch_remote_latest_sha(dep)
34
+ {
35
+ name: dep,
36
+ version: latest_sha,
37
+ remote: remote
38
+ }
39
+ }
40
+ }
41
+ ]
42
+ end
43
+ # LicenseAuto.logger.debug(JSON.pretty_generate(dep_files))
44
+ end
45
+
46
+ # @return [clone_url, latest_sha]
47
+ def fetch_remote_latest_sha(repo_url)
48
+ matcher = Matcher::SourceURL.new(repo_url)
49
+ github_matched = matcher.match_github_resource
50
+ if github_matched
51
+ github = GithubCom.new({}, github_matched[:owner], github_matched[:repo])
52
+ latest_sha = github.latest_commit.sha
53
+ # LicenseAuto.logger.debug(latest_sha)
54
+ [github.url, latest_sha]
55
+ else
56
+ [repo_url, nil]
57
+ end
58
+ end
59
+
60
+ def filter_deps(listed_content)
61
+
62
+ dep_keys = ['Deps', 'Imports', 'TestImports', 'XTestImports']
63
+ deps = dep_keys.map {|key|
64
+ listed_content[key]
65
+ }.flatten.compact
66
+
67
+ deps = Set.new(deps)
68
+ deps.reject {|dep|
69
+ bool = GOLANG_STD_LIBS.include?(dep)
70
+ # LicenseAuto.logger.debug("#{dep}, #{bool}")
71
+ bool
72
+ }.map {|dep|
73
+ host, owner, repo, _subdir = dep.split('/')
74
+ [host, owner, repo].join('/')
75
+ }
76
+ end
77
+
78
+ def uniform_url
79
+
80
+ end
81
+
82
+ # @return
83
+ # {
84
+ # "Dir": "/Users/mic/vm/test-branch",
85
+ # "ImportPath": "_/Users/mic/vm/test-branch",
86
+ # "Name": "main",
87
+ # "Stale": true,
88
+ # "GoFiles": [
89
+ # "main.go"
90
+ # ],
91
+ # "Imports": [
92
+ # "fmt",
93
+ # "github.com/astaxie/beego",
94
+ # "math/rand"
95
+ # ],
96
+ # "Deps": [
97
+ # "errors",
98
+ # "fmt",
99
+ # "github.com/astaxie/beego",
100
+ # "internal/race",
101
+ # "io",
102
+ # "math",
103
+ # "math/rand",
104
+ # "os",
105
+ # "reflect",
106
+ # "runtime",
107
+ # "runtime/internal/atomic",
108
+ # "runtime/internal/sys",
109
+ # "strconv",
110
+ # "sync",
111
+ # "sync/atomic",
112
+ # "syscall",
113
+ # "time",
114
+ # "unicode/utf8",
115
+ # "unsafe"
116
+ # ],
117
+ # "Incomplete": true,
118
+ # "DepsErrors": [
119
+ # {
120
+ # "ImportStack": [
121
+ # ".",
122
+ # "github.com/astaxie/beego"
123
+ # ],
124
+ # "Pos": "main.go:9:2",
125
+ # "Err": "cannot find package \"github.com/astaxie/beego\" in any of:\n\t/usr/local/Cellar/go/1.6/libexec/src/github.com/astaxie/beego (from $GOROOT)\n\t($GOPATH not set)"
126
+ # }
127
+ # ]
128
+ # }
129
+ def list_content
130
+ Dir.chdir(@path) do
131
+ cmd = 'go list -json ./...'
132
+ stdout_str, stderr_str, status = Open3.capture3(cmd)
133
+ Hashie::Mash.new(JSON.parse(stdout_str)) if stdout_str.length > 0
134
+ end
135
+ end
136
+
137
+ def self.check_cli
138
+ bash_cmd = "go version"
139
+ # LicenseAuto.logger.debug(bash_cmd)
140
+ stdout_str, stderr_str, _status = Open3.capture3(bash_cmd)
141
+ golang_version = /1\.6/
142
+
143
+ if not stderr_str.empty?
144
+ LicenseAuto.logger.error(stderr_str)
145
+ return false
146
+ elsif not stdout_str =~ golang_version
147
+ error = "Golang version: #{stdout_str} not satisfied: #{golang_version}"
148
+ LicenseAuto.logger.error(error)
149
+ return false
150
+ end
151
+
152
+ return true
153
+ end
154
+ end
155
+ end
@@ -0,0 +1,145 @@
1
+ require 'bundler'
2
+ require 'license_auto/package_manager'
3
+ # require 'license_auto/website/'
4
+
5
+ module LicenseAuto
6
+ class Gradle < LicenseAuto::PackageManager
7
+
8
+ LANGUAGE = 'Java'
9
+
10
+ DEPENDENCY_PATTERN = /\\---\s(?<group>.+):(?<name>.+):(?<version>.+)/
11
+
12
+ REMOTE = 'https://repo1.maven.org/maven2/'
13
+
14
+ def initialize(path)
15
+ super(path)
16
+ end
17
+
18
+ def dependency_file_pattern
19
+ /#{@path}\/build.gradle$/i
20
+ end
21
+
22
+ def parse_dependencies
23
+ build_files = dependency_file_path_names
24
+ if build_files.empty?
25
+ LicenseAuto.logger.info("#{LANGUAGE}: #{dependency_file_pattern} file not exist")
26
+ []
27
+ # TODO: check his sub dir has `build.gradle` or not
28
+ else
29
+ build_files.map {|dep_file|
30
+ LicenseAuto.logger.debug(dep_file)
31
+
32
+ {
33
+ dep_file: dep_file,
34
+ deps: collect_dependencies
35
+ }
36
+ }
37
+ end
38
+ # LicenseAuto.logger.debug(JSON.pretty_generate(dep_files))
39
+ end
40
+
41
+ def self.check_cli
42
+ cmd = 'gradle --version'
43
+ stdout_str, stderr_str, _status = Open3.capture3(cmd)
44
+ if stdout_str.include?('Gradle 2.8')
45
+ true
46
+ else
47
+ LicenseAuto.logger.error("stdout_str: #{stdout_str}, stderr_str: #{stderr_str}")
48
+ false
49
+ end
50
+ end
51
+
52
+ # Out put sample:
53
+ # ------------------------------------------------------------
54
+ # Root project
55
+ # ------------------------------------------------------------
56
+ #
57
+ # Root project 'maven-gradle-comparison-dependency-simplest'
58
+ # No sub-projects
59
+ def list_projects
60
+ cmd = "gradle -q project"
61
+ LicenseAuto.logger.debug(@path)
62
+ projects = []
63
+ Dir.chdir(@path) do
64
+ stdout_str, stderr_str, _status = Open3.capture3(cmd)
65
+ if stdout_str.length > 0
66
+ LicenseAuto.logger.debug(stdout_str)
67
+ stdout_str.split("\n").each {|line|
68
+ sub_project_pattern = /Project\s\'(:)?(?<project_name>.+)\'/
69
+ matched = sub_project_pattern.match(line)
70
+ if matched
71
+ projects.push(match_result[:project_name])
72
+ end
73
+ }
74
+ else
75
+ LicenseAuto.logger.error(stderr_str)
76
+ end
77
+ projects
78
+ end
79
+ end
80
+
81
+ def collect_dependencies
82
+ root_deps = list_dependencies
83
+ projects = list_projects
84
+ projects.each {|project_name|
85
+ deps = list_dependencies(project_name)
86
+ root_deps.merge(deps)
87
+ }
88
+ root_deps.map {|dep|
89
+ group, name, version_range = dep.split(':')
90
+ version = filter_version(version_range)
91
+ {
92
+ name: [group, name].join(':'),
93
+ version: version,
94
+ remote: REMOTE
95
+ }
96
+ }
97
+ end
98
+
99
+ def filter_version(version_range)
100
+ # 'junit:junit:3.8.2 -> 4.11'
101
+ range_arrow_pattern = /(?<min_ver>.*)\s->\s(?<max_ver>.*)/
102
+ matched = range_arrow_pattern.match(version_range)
103
+ if matched
104
+ version_range = matched[:max_ver]
105
+ end
106
+
107
+ # 'org.apache.ant:ant:1.8.3 (*)'
108
+ star_pattern = /\s\(\*\)/
109
+ version_range.gsub(star_pattern, '')
110
+ end
111
+
112
+ # @return sample:
113
+ # Set.new(["commons-beanutils:commons-beanutils:1.8.3", "commons-logging:commons-logging:1.1.1", "junit:junit:4.8.2"])
114
+ def list_dependencies(project_name=nil)
115
+ Dir.chdir(@path) do
116
+ deps = Set.new
117
+ cmd = if project_name
118
+ "gradle -q #{project_name}:dependencies"
119
+ else
120
+ "gradle -q dependencies"
121
+ end
122
+ LicenseAuto.logger.debug("cmd: #{cmd}")
123
+
124
+ stdout_str, stderr_str, _status = Open3.capture3(cmd)
125
+ if stdout_str.length > 0
126
+ LicenseAuto.logger.debug("stdout_str: #{stdout_str}")
127
+ stdout_str.split("\n").each {|line|
128
+ matched = DEPENDENCY_PATTERN.match(line)
129
+ # LicenseAuto.logger.debug("#{line}, matched: #{matched}")
130
+ if matched
131
+ group_name_version = matched.to_s.gsub(/\\---\s/, '')
132
+ # External dependencies
133
+ # DOC: https://docs.gradle.org/current/userguide/artifact_dependencies_tutorial.html#N105E1
134
+ deps.add(group_name_version)
135
+ end
136
+ }
137
+ else
138
+ LicenseAuto.logger.error("stderr_str: #{stderr_str}")
139
+ end
140
+ LicenseAuto.logger.debug(deps)
141
+ deps
142
+ end
143
+ end
144
+ end
145
+ end
@@ -0,0 +1,133 @@
1
+ # [Maven3](https://maven.apache.org/index.html)
2
+ # [Introduction to the Dependency Mechanism](https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html)
3
+
4
+ require 'bundler'
5
+ require 'license_auto/package_manager'
6
+
7
+ module LicenseAuto
8
+ class Maven < LicenseAuto::PackageManager
9
+
10
+ LANGUAGE = 'Java'
11
+
12
+ # DOC: https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Scope
13
+ scopes = ""
14
+ DEPENDENCY_PATTERN = /^\[INFO\]\s+(?<group>.+):(?<name>.+):(?<type>.+):(?<version>.+):(?<scope>(compile|provided|runtime|test|system|import))$/
15
+
16
+ def initialize(path)
17
+ super(path)
18
+ end
19
+
20
+ def dependency_file_pattern
21
+ /#{@path}\/pom\.xml$/i
22
+ end
23
+
24
+ def parse_dependencies
25
+ build_files = dependency_file_path_names
26
+ if build_files.empty?
27
+ LicenseAuto.logger.info("#{LANGUAGE}: #{dependency_file_pattern} file not exist")
28
+ []
29
+ else
30
+ build_files.map {|dep_file|
31
+ LicenseAuto.logger.debug(dep_file)
32
+
33
+ {
34
+ dep_file: dep_file,
35
+ deps: collect_dependencies
36
+ }
37
+ }
38
+ end
39
+ # LicenseAuto.logger.debug(JSON.pretty_generate(deps))
40
+ end
41
+
42
+ # @return example
43
+ # => Array: [{:name=>"junit:junit", :version=>"4.8", :remote=>nil}]
44
+ def collect_dependencies
45
+ deps =
46
+ if resolve_dependencies
47
+ list_dependencies.map {|dep|
48
+ group, name, type, version, scope = dep.split(':')
49
+ {
50
+ name: [group, name].join(':'),
51
+ version: version,
52
+ remote: nil
53
+ }
54
+ }
55
+ else
56
+ []
57
+ end
58
+ LicenseAuto.logger.debug(deps)
59
+ deps
60
+ end
61
+
62
+ def resolve_dependencies
63
+ bool = false
64
+ Dir.chdir(@path) do
65
+ cmd = 'mvn dependency:resolve'
66
+ stdout_str, stderr_str, _status = Open3.capture3(cmd)
67
+ if stdout_str.length > 0
68
+ # LicenseAuto.logger.debug("stdout_str: #{stdout_str}")
69
+ if stdout_str.include?("[INFO] BUILD SUCCESS")
70
+ bool = true
71
+ end
72
+ end
73
+ end
74
+ bool
75
+ end
76
+
77
+ # Command output sample:
78
+ # [INFO]
79
+ # [INFO] ------------------------------------------------------------------------
80
+ # [INFO] Building GitHub Maven Plugin Example 0.1-SNAPSHOT
81
+ # [INFO] ------------------------------------------------------------------------
82
+ # [INFO]
83
+ # [INFO] --- maven-dependency-plugin:2.8:list (default-cli) @ github-maven-example ---
84
+ # [INFO]
85
+ # [INFO] The following files have been resolved:
86
+ # [INFO] junit:junit:jar:4.8:test
87
+ # [INFO]
88
+ # [INFO] ------------------------------------------------------------------------
89
+ # [INFO] BUILD SUCCESS
90
+ # [INFO] ------------------------------------------------------------------------
91
+ # [INFO] Total time: 1.819 s
92
+ # [INFO] Finished at: 2016-04-18T15:26:58+08:00
93
+ # [INFO] Final Memory: 14M/155M
94
+ # [INFO] ------------------------------------------------------------------------
95
+ #
96
+ # @return sample:
97
+ # Set.new(["junit:junit:jar:4.8:test"])
98
+ def list_dependencies
99
+ if resolve_dependencies
100
+ deps = Set.new
101
+ Dir.chdir(@path) do
102
+ cmd = 'mvn dependency:list'
103
+ out, err, _st = Open3.capture3(cmd)
104
+ # LicenseAuto.logger.debug("#{out}")
105
+ if out.include?("The following files have been resolved:")
106
+ out.split("\n").each {|line|
107
+ matched = DEPENDENCY_PATTERN.match(line)
108
+ # LicenseAuto.logger.debug("#{line}, matched: #{matched}")
109
+ if matched
110
+ group_name_version = line.gsub!(/\[INFO\]/,'').strip!
111
+ deps.add(group_name_version)
112
+ end
113
+ }
114
+ else
115
+ LicenseAuto.logger.error("#{err}")
116
+ end
117
+ end
118
+ deps
119
+ end
120
+ end
121
+
122
+ def self.check_cli
123
+ cmd = 'mvn -v'
124
+ stdout_str, stderr_str, _status = Open3.capture3(cmd)
125
+ if stdout_str.include?('Apache Maven 3')
126
+ true
127
+ else
128
+ LicenseAuto.logger.error("stdout_str: #{stdout_str}, stderr_str: #{stderr_str}")
129
+ false
130
+ end
131
+ end
132
+ end
133
+ end