bibliothecary 4.0.4 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +25 -0
  3. data/.github/CONTRIBUTING.md +165 -0
  4. data/.github/ISSUE_TEMPLATE.md +18 -0
  5. data/.github/PULL_REQUEST_TEMPLATE.md +10 -0
  6. data/.rubocop.yml +1156 -0
  7. data/.travis.yml +4 -1
  8. data/Gemfile +5 -0
  9. data/README.md +7 -1
  10. data/bibliothecary.gemspec +1 -1
  11. data/lib/bibliothecary.rb +16 -2
  12. data/lib/bibliothecary/analyser.rb +28 -4
  13. data/lib/bibliothecary/parsers/bower.rb +7 -10
  14. data/lib/bibliothecary/parsers/cargo.rb +9 -31
  15. data/lib/bibliothecary/parsers/carthage.rb +13 -34
  16. data/lib/bibliothecary/parsers/clojars.rb +4 -7
  17. data/lib/bibliothecary/parsers/cocoapods.rb +19 -30
  18. data/lib/bibliothecary/parsers/cpan.rb +10 -15
  19. data/lib/bibliothecary/parsers/cran.rb +7 -10
  20. data/lib/bibliothecary/parsers/dub.rb +7 -12
  21. data/lib/bibliothecary/parsers/elm.rb +7 -47
  22. data/lib/bibliothecary/parsers/go.rb +47 -52
  23. data/lib/bibliothecary/parsers/hex.rb +5 -14
  24. data/lib/bibliothecary/parsers/julia.rb +4 -7
  25. data/lib/bibliothecary/parsers/maven.rb +12 -18
  26. data/lib/bibliothecary/parsers/meteor.rb +6 -9
  27. data/lib/bibliothecary/parsers/npm.rb +15 -14
  28. data/lib/bibliothecary/parsers/nuget.rb +18 -28
  29. data/lib/bibliothecary/parsers/packagist.rb +9 -14
  30. data/lib/bibliothecary/parsers/pub.rb +9 -14
  31. data/lib/bibliothecary/parsers/pypi.rb +8 -10
  32. data/lib/bibliothecary/parsers/rubygems.rb +16 -23
  33. data/lib/bibliothecary/parsers/shard.rb +9 -14
  34. data/lib/bibliothecary/parsers/swift_pm.rb +4 -7
  35. data/lib/bibliothecary/version.rb +1 -1
  36. data/lib/sdl_parser.rb +0 -4
  37. metadata +9 -5
  38. data/CONTRIBUTING.md +0 -10
@@ -5,60 +5,20 @@ module Bibliothecary
5
5
  class Elm
6
6
  include Bibliothecary::Analyser
7
7
 
8
- def self.parse(filename, path)
9
- if filename.match(/^elm-package\.json$|^elm_dependencies\.json$/)
10
- file_contents = File.open(path).read
11
- json = JSON.parse file_contents
12
- parse_json_manifest(json)
13
- elsif filename.match(/^elm-stuff\/exact-dependencies\.json$/)
14
- file_contents = File.open(path).read
15
- json = JSON.parse file_contents
16
- parse_json_lock(json)
17
- else
18
- []
19
- end
20
- end
21
-
22
- def self.analyse(folder_path, file_list)
23
- [analyse_json(folder_path, file_list),
24
- analyse_json_lock(folder_path, file_list)]
25
- end
26
-
27
- def self.analyse_json(folder_path, file_list)
28
- path = file_list.find{|path| path.gsub(folder_path, '').gsub(/^\//, '').match(/^elm-package\.json$|^elm_dependencies\.json$/) }
29
- return unless path
30
-
31
- manifest = JSON.parse File.open(path).read
32
-
33
- {
34
- platform: PLATFORM_NAME,
35
- path: path,
36
- dependencies: parse_json_manifest(manifest)
37
- }
38
- rescue
39
- []
40
- end
41
-
42
- def self.analyse_json_lock(folder_path, file_list)
43
- path = file_list.find{|path| path.gsub(folder_path, '').gsub(/^\//, '').match(/^elm-stuff\/exact-dependencies\.json$/) }
44
- return unless path
45
-
46
- manifest = JSON.parse File.open(path).read
47
-
8
+ def self.mapping
48
9
  {
49
- platform: PLATFORM_NAME,
50
- path: path,
51
- dependencies: parse_json_lock(manifest)
10
+ /^elm-package\.json$|^elm_dependencies\.json$/ => :parse_json_manifest,
11
+ /^elm-stuff\/exact-dependencies\.json$/ => :parse_json_lock
52
12
  }
53
- rescue
54
- []
55
13
  end
56
14
 
57
- def self.parse_json_manifest(manifest)
15
+ def self.parse_json_manifest(file_contents)
16
+ manifest = JSON.parse file_contents
58
17
  map_dependencies(manifest, 'dependencies', 'runtime')
59
18
  end
60
19
 
61
- def self.parse_json_lock(manifest)
20
+ def self.parse_json_lock(file_contents)
21
+ manifest = JSON.parse file_contents
62
22
  manifest.map do |name, requirement|
63
23
  {
64
24
  name: name,
@@ -6,70 +6,65 @@ module Bibliothecary
6
6
  class Go
7
7
  include Bibliothecary::Analyser
8
8
 
9
- def self.parse(filename, path)
10
- if filename.match(/^glide\.yaml$/)
11
- file_contents = File.open(path).read
12
- yaml = YAML.load file_contents
13
- parse_glide_yaml(yaml)
14
- elsif filename.match(/^glide\.lock$/)
15
- file_contents = File.open(path).read
16
- yaml = YAML.load file_contents
17
- parse_glide_lockfile(yaml)
18
- elsif filename.match(/^Godeps\/Godeps\.json$/)
19
- file_contents = File.open(path).read
20
- json = JSON.parse file_contents
21
- parse_godep_json(json)
22
- elsif filename.match(/^vendor\/manifest$/)
23
- file_contents = File.open(path).read
24
- json = JSON.parse file_contents
25
- parse_gb_manifest(json)
26
- else
27
- []
28
- end
9
+ GPM_REGEXP = /^(.+)\s+(.+)$/
10
+
11
+ def self.mapping
12
+ {
13
+ /^glide\.yaml$/ => :parse_glide_yaml,
14
+ /^glide\.lock$/ => :parse_glide_lockfile,
15
+ /^Godeps\/Godeps\.json$/ => :parse_godep_json,
16
+ /^Godeps$/i => :parse_gpm,
17
+ /^vendor\/manifest$/ => :parse_gb_manifest,
18
+ /^vendor\/vendor.json$/ => :parse_govendor
19
+ }
29
20
  end
30
21
 
31
- def self.parse_godep_json(manifest)
32
- manifest.fetch('Deps',[]).map do |dependency|
33
- {
34
- name: dependency['ImportPath'],
35
- requirement: dependency['Rev'],
36
- type: 'runtime'
37
- }
38
- end
22
+ def self.parse_godep_json(file_contents)
23
+ manifest = JSON.parse file_contents
24
+ map_dependencies(manifest, 'Deps', 'ImportPath', 'Rev', 'runtime')
39
25
  end
40
26
 
41
- def self.parse_glide_yaml(manifest)
42
- manifest.fetch('import',[]).map do |dependency|
43
- {
44
- name: dependency['package'],
45
- requirement: dependency['version'] || '*',
27
+ def self.parse_gpm(file_contents)
28
+ deps = []
29
+ file_contents.split("\n").each do |line|
30
+ match = line.gsub(/(\#(.*))/, '').match(GPM_REGEXP)
31
+ next unless match
32
+ deps << {
33
+ name: match[1].strip,
34
+ requirement: match[2].strip || '*',
46
35
  type: 'runtime'
47
36
  }
48
- end + manifest.fetch('devImports',[]).map do |dependency|
49
- {
50
- name: dependency['package'],
51
- requirement: dependency['version'] || '*',
52
- type: 'development'
53
- }
54
37
  end
38
+ deps
55
39
  end
56
40
 
57
- def self.parse_glide_lockfile(manifest)
58
- manifest.fetch('imports',[]).map do |dependency|
59
- {
60
- name: dependency['name'],
61
- requirement: dependency['version'] || '*',
62
- type: 'runtime'
63
- }
64
- end
41
+ def self.parse_govendor(file_contents)
42
+ manifest = JSON.load file_contents
43
+ map_dependencies(manifest, 'package', 'path', 'revision', 'runtime')
44
+ end
45
+
46
+ def self.parse_glide_yaml(file_contents)
47
+ manifest = YAML.load file_contents
48
+ map_dependencies(manifest, 'import', 'package', 'version', 'runtime') +
49
+ map_dependencies(manifest, 'devImports', 'package', 'version', 'development')
65
50
  end
66
51
 
67
- def self.parse_gb_manifest(manifest)
68
- manifest.fetch('dependencies',[]).map do |dependency|
52
+ def self.parse_glide_lockfile(file_contents)
53
+ manifest = YAML.load file_contents
54
+ map_dependencies(manifest, 'imports', 'name', 'version', 'runtime')
55
+ end
56
+
57
+ def self.parse_gb_manifest(file_contents)
58
+ manifest = JSON.parse file_contents
59
+ map_dependencies(manifest, 'dependencies', 'importpath', 'revision', 'runtime')
60
+ end
61
+
62
+ def self.map_dependencies(manifest, attr_name, dep_attr_name, version_attr_name, type)
63
+ manifest.fetch(attr_name,[]).map do |dependency|
69
64
  {
70
- name: dependency['importpath'],
71
- requirement: dependency['revision'],
72
- type: 'runtime'
65
+ name: dependency[dep_attr_name],
66
+ requirement: dependency[version_attr_name] || '*',
67
+ type: type
73
68
  }
74
69
  end
75
70
  end
@@ -5,16 +5,11 @@ module Bibliothecary
5
5
  class Hex
6
6
  include Bibliothecary::Analyser
7
7
 
8
- def self.parse(filename, path)
9
- if filename.match(/^mix\.exs$/)
10
- file_contents = File.open(path).read
11
- parse_mix(file_contents)
12
- elsif filename.match(/^mix\.lock$/)
13
- file_contents = File.open(path).read
14
- parse_mix_lock(file_contents)
15
- else
16
- []
17
- end
8
+ def self.mapping
9
+ {
10
+ /^mix\.exs$/ => :parse_mix,
11
+ /^mix\.lock$/ => :parse_mix_lock
12
+ }
18
13
  end
19
14
 
20
15
  def self.parse_mix(manifest)
@@ -28,8 +23,6 @@ module Bibliothecary
28
23
  type: "runtime"
29
24
  }
30
25
  end
31
- rescue
32
- []
33
26
  end
34
27
 
35
28
  def self.parse_mix_lock(manifest)
@@ -43,8 +36,6 @@ module Bibliothecary
43
36
  type: "runtime"
44
37
  }
45
38
  end
46
- rescue
47
- []
48
39
  end
49
40
  end
50
41
  end
@@ -3,13 +3,10 @@ module Bibliothecary
3
3
  class Julia
4
4
  include Bibliothecary::Analyser
5
5
 
6
- def self.parse(filename, path)
7
- if filename.match(/^REQUIRE$/i)
8
- file_contents = File.open(path).read
9
- parse_require(file_contents)
10
- else
11
- []
12
- end
6
+ def self.mapping
7
+ {
8
+ /^REQUIRE$/i => :parse_require
9
+ }
13
10
  end
14
11
 
15
12
  def self.parse_require(manifest)
@@ -5,24 +5,16 @@ module Bibliothecary
5
5
  class Maven
6
6
  include Bibliothecary::Analyser
7
7
 
8
- def self.parse(filename, path)
9
- if filename.match(/ivy\.xml$/i)
10
- file_contents = File.open(path).read
11
- xml = Ox.parse file_contents
12
- parse_ivy_manifest(xml)
13
- elsif filename.match(/pom\.xml$/i)
14
- file_contents = File.open(path).read
15
- xml = Ox.parse file_contents
16
- parse_pom_manifest(xml)
17
- elsif filename.match(/build.gradle$/i)
18
- file_contents = File.open(path).read
19
- parse_gradle(file_contents)
20
- else
21
- []
22
- end
8
+ def self.mapping
9
+ {
10
+ /ivy\.xml$/i => :parse_ivy_manifest,
11
+ /pom\.xml$/i => :parse_pom_manifest,
12
+ /build.gradle$/i => :parse_gradle
13
+ }
23
14
  end
24
15
 
25
- def self.parse_ivy_manifest(manifest)
16
+ def self.parse_ivy_manifest(file_contents)
17
+ manifest = Ox.parse file_contents
26
18
  manifest.dependencies.locate('dependency').map do |dependency|
27
19
  attrs = dependency.attributes
28
20
  {
@@ -33,7 +25,8 @@ module Bibliothecary
33
25
  end
34
26
  end
35
27
 
36
- def self.parse_pom_manifest(manifest)
28
+ def self.parse_pom_manifest(file_contents)
29
+ manifest = Ox.parse file_contents
37
30
  if manifest.respond_to?('project')
38
31
  xml = manifest.project
39
32
  else
@@ -70,7 +63,8 @@ module Bibliothecary
70
63
  field = dependency.locate(name).first
71
64
  return nil if field.nil?
72
65
  value = field.nodes.first
73
- if match = value.match(/^\$\{(.+)\}/)
66
+ match = value.match(/^\$\{(.+)\}/)
67
+ if match
74
68
  prop_field = xml.properties.locate(match[1]).first
75
69
  if prop_field
76
70
  return prop_field.nodes.first
@@ -5,17 +5,14 @@ module Bibliothecary
5
5
  class Meteor
6
6
  include Bibliothecary::Analyser
7
7
 
8
- def self.parse(filename, path)
9
- if filename.match(/^versions\.json$/)
10
- file_contents = File.open(path).read
11
- json = JSON.parse(file_contents)
12
- parse_manifest(json)
13
- else
14
- []
15
- end
8
+ def self.mapping
9
+ {
10
+ /^versions\.json$/ => :parse_manifest
11
+ }
16
12
  end
17
13
 
18
- def self.parse_manifest(manifest)
14
+ def self.parse_manifest(file_contents)
15
+ manifest = JSON.parse(file_contents)
19
16
  map_dependencies(manifest, 'dependencies', 'runtime')
20
17
  end
21
18
 
@@ -5,21 +5,16 @@ module Bibliothecary
5
5
  class NPM
6
6
  include Bibliothecary::Analyser
7
7
 
8
- def self.parse(filename, path)
9
- if filename.match(/package\.json$/)
10
- file_contents = File.open(path).read
11
- json = JSON.parse(file_contents)
12
- parse_manifest(json)
13
- elsif filename.match(/npm-shrinkwrap\.json$/)
14
- file_contents = File.open(path).read
15
- json = JSON.parse(file_contents)
16
- parse_shrinkwrap(json)
17
- else
18
- []
19
- end
8
+ def self.mapping
9
+ {
10
+ /^package\.json$/ => :parse_manifest,
11
+ /^npm-shrinkwrap\.json$/ => :parse_shrinkwrap,
12
+ /^yarn\.lock$/ => :parse_yarn_lock
13
+ }
20
14
  end
21
15
 
22
- def self.parse_shrinkwrap(manifest)
16
+ def self.parse_shrinkwrap(file_contents)
17
+ manifest = JSON.parse(file_contents)
23
18
  manifest.fetch('dependencies',[]).map do |name, requirement|
24
19
  {
25
20
  name: name,
@@ -29,11 +24,17 @@ module Bibliothecary
29
24
  end
30
25
  end
31
26
 
32
- def self.parse_manifest(manifest)
27
+ def self.parse_manifest(file_contents)
28
+ manifest = JSON.parse(file_contents)
33
29
  map_dependencies(manifest, 'dependencies', 'runtime') +
34
30
  map_dependencies(manifest, 'devDependencies', 'development')
35
31
  end
36
32
 
33
+ def self.parse_yarn_lock(file_contents)
34
+ response = Typhoeus.post("https://yarn-parser.herokuapp.com/parse", body: file_contents)
35
+ JSON.parse(response.body)
36
+ end
37
+
37
38
  def self.map_dependencies(hash, key, type)
38
39
  hash.fetch(key,[]).map do |name, requirement|
39
40
  {
@@ -6,32 +6,18 @@ module Bibliothecary
6
6
  class Nuget
7
7
  include Bibliothecary::Analyser
8
8
 
9
- def self.parse(filename, path)
10
- if filename.match(/Project\.json$/)
11
- file_contents = File.open(path).read
12
- json = JSON.parse file_contents
13
- parse_project_json(json)
14
- elsif filename.match(/Project\.lock\.json$/)
15
- file_contents = File.open(path).read
16
- json = JSON.parse file_contents
17
- parse_project_lock_json(json)
18
- elsif filename.match(/packages\.config$/)
19
- file_contents = File.open(path).read
20
- xml = Ox.parse file_contents
21
- parse_packages_config(xml)
22
- elsif filename.match(/^[A-Za-z0-9_-]+\.nuspec$/)
23
- file_contents = File.open(path).read
24
- xml = Ox.parse file_contents
25
- parse_nuspec(xml)
26
- elsif filename.match(/paket\.lock$/)
27
- file_contents = File.open(path).read
28
- parse_paket_lock(file_contents.split("\n"))
29
- else
30
- []
31
- end
9
+ def self.mapping
10
+ {
11
+ /Project\.json$/ => :parse_project_json,
12
+ /Project\.lock\.json$/ => :parse_project_lock_json,
13
+ /packages\.config$/ => :parse_packages_config,
14
+ /^[A-Za-z0-9_-]+\.nuspec$/ => :parse_nuspec,
15
+ /paket\.lock$/ => :parse_paket_lock
16
+ }
32
17
  end
33
18
 
34
- def self.parse_project_json(manifest)
19
+ def self.parse_project_json(file_contents)
20
+ manifest = JSON.parse file_contents
35
21
  manifest.fetch('dependencies',[]).map do |name, requirement|
36
22
  {
37
23
  name: name,
@@ -41,7 +27,8 @@ module Bibliothecary
41
27
  end
42
28
  end
43
29
 
44
- def self.parse_project_lock_json(manifest)
30
+ def self.parse_project_lock_json(file_contents)
31
+ manifest = JSON.parse file_contents
45
32
  manifest.fetch('libraries',[]).map do |name, _requirement|
46
33
  dep = name.split('/')
47
34
  {
@@ -52,7 +39,8 @@ module Bibliothecary
52
39
  end
53
40
  end
54
41
 
55
- def self.parse_packages_config(manifest)
42
+ def self.parse_packages_config(file_contents)
43
+ manifest = Ox.parse file_contents
56
44
  manifest.packages.locate('package').map do |dependency|
57
45
  {
58
46
  name: dependency.id,
@@ -62,7 +50,8 @@ module Bibliothecary
62
50
  end
63
51
  end
64
52
 
65
- def self.parse_nuspec(manifest)
53
+ def self.parse_nuspec(file_contents)
54
+ manifest = Ox.parse file_contents
66
55
  manifest.package.metadata.dependencies.locate('dependency').map do |dependency|
67
56
  {
68
57
  name: dependency.id,
@@ -72,7 +61,8 @@ module Bibliothecary
72
61
  end
73
62
  end
74
63
 
75
- def self.parse_paket_lock(lines)
64
+ def self.parse_paket_lock(file_contents)
65
+ lines = file_contents.split("\n")
76
66
  package_version_re = /\s+(?<name>\S+)\s\((?<version>\d+\.\d+[\.\d+[\.\d+]*]*)\)/
77
67
  packages = lines.select { |line| package_version_re.match(line) }.map { |line| package_version_re.match(line) }.map do |match|
78
68
  {