veye 0.2.1 → 0.3.0

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.
Files changed (95) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +48 -41
  3. data/README.md +36 -17
  4. data/bin/veye +176 -47
  5. data/bundle +0 -0
  6. data/changelogs.md +19 -0
  7. data/lib/veye/api/package.rb +16 -2
  8. data/lib/veye/api/project.rb +41 -6
  9. data/lib/veye/base_executor.rb +81 -16
  10. data/lib/veye/github/delete.rb +2 -4
  11. data/lib/veye/github/import.rb +3 -4
  12. data/lib/veye/package/follow.rb +9 -9
  13. data/lib/veye/package/info.rb +4 -4
  14. data/lib/veye/package/references.rb +4 -6
  15. data/lib/veye/package/search.rb +2 -1
  16. data/lib/veye/package/versions.rb +37 -0
  17. data/lib/veye/package.rb +2 -0
  18. data/lib/veye/project/check.rb +19 -9
  19. data/lib/veye/project.rb +86 -2
  20. data/lib/veye/version.rb +1 -1
  21. data/lib/veye/views/base_csv.rb +1 -1
  22. data/lib/veye/views/github/info_csv.rb +1 -1
  23. data/lib/veye/views/github/info_pretty.rb +1 -1
  24. data/lib/veye/views/github/info_table.rb +2 -2
  25. data/lib/veye/views/package/info_csv.rb +4 -3
  26. data/lib/veye/views/package/info_pretty.rb +4 -2
  27. data/lib/veye/views/package/info_table.rb +4 -1
  28. data/lib/veye/views/package/versions_csv.rb +24 -0
  29. data/lib/veye/views/package/versions_json.rb +15 -0
  30. data/lib/veye/views/package/versions_pretty.rb +23 -0
  31. data/lib/veye/views/package/versions_table.rb +27 -0
  32. data/lib/veye/views/package.rb +4 -0
  33. data/lib/veye/views/project/dependency_csv.rb +18 -10
  34. data/lib/veye/views/project/dependency_pretty.rb +13 -2
  35. data/lib/veye/views/project/dependency_table.rb +8 -2
  36. data/lib/veye/views/project/info_csv.rb +9 -3
  37. data/lib/veye/views/project/info_markdown.rb +7 -2
  38. data/lib/veye/views/project/info_pretty.rb +6 -1
  39. data/lib/veye/views/project/info_table.rb +8 -3
  40. data/lib/veye.rb +26 -3
  41. data/test/api/package_test.rb +15 -0
  42. data/test/api/project_test.rb +83 -19
  43. data/test/base/base_executor_test.rb +87 -0
  44. data/test/fixtures/vcr_cassettes/github_delete.yml +7 -7
  45. data/test/fixtures/vcr_cassettes/github_import.yml +11 -13
  46. data/test/fixtures/vcr_cassettes/github_info.yml +10 -10
  47. data/test/fixtures/vcr_cassettes/github_list.yml +12 -12
  48. data/test/fixtures/vcr_cassettes/github_sync.yml +7 -7
  49. data/test/fixtures/vcr_cassettes/package_follow.yml +10 -10
  50. data/test/fixtures/vcr_cassettes/package_follow_status.yml +7 -7
  51. data/test/fixtures/vcr_cassettes/package_info.yml +17 -18
  52. data/test/fixtures/vcr_cassettes/package_info_default.yml +54 -0
  53. data/test/fixtures/vcr_cassettes/package_info_versioned.yml +54 -0
  54. data/test/fixtures/vcr_cassettes/package_reference.yml +8 -8
  55. data/test/fixtures/vcr_cassettes/package_search.yml +8 -8
  56. data/test/fixtures/vcr_cassettes/package_unfollow.yml +7 -7
  57. data/test/fixtures/vcr_cassettes/package_versions.yml +44 -0
  58. data/test/fixtures/vcr_cassettes/project_check_new.yml +33 -30
  59. data/test/fixtures/vcr_cassettes/project_check_update.yml +29 -30
  60. data/test/fixtures/vcr_cassettes/project_delete.yml +8 -8
  61. data/test/fixtures/vcr_cassettes/project_delete_for_licenses.yml +48 -0
  62. data/test/fixtures/vcr_cassettes/project_delete_for_update.yml +46 -0
  63. data/test/fixtures/vcr_cassettes/project_delete_merge_child.yml +46 -0
  64. data/test/fixtures/vcr_cassettes/project_delete_merge_parent.yml +46 -0
  65. data/test/fixtures/vcr_cassettes/project_get.yml +11 -12
  66. data/test/fixtures/vcr_cassettes/project_license.yml +11 -12
  67. data/test/fixtures/vcr_cassettes/project_license_command.yml +49 -0
  68. data/test/fixtures/vcr_cassettes/project_list.yml +14 -14
  69. data/test/fixtures/vcr_cassettes/project_merge.yml +46 -0
  70. data/test/fixtures/vcr_cassettes/project_unmerge.yml +46 -0
  71. data/test/fixtures/vcr_cassettes/project_update.yml +15 -16
  72. data/test/fixtures/vcr_cassettes/project_upload.yml +17 -16
  73. data/test/fixtures/vcr_cassettes/project_upload_for_licenses.yml +107 -0
  74. data/test/fixtures/vcr_cassettes/project_upload_for_update.yml +105 -0
  75. data/test/fixtures/vcr_cassettes/project_upload_merge_child.yml +65 -0
  76. data/test/fixtures/vcr_cassettes/project_upload_merge_parent.yml +104 -0
  77. data/test/fixtures/vcr_cassettes/project_upload_with_args.yml +106 -0
  78. data/test/fixtures/vcr_cassettes/services_ping.yml +6 -8
  79. data/test/fixtures/vcr_cassettes/user_get_favorites.yml +10 -10
  80. data/test/fixtures/vcr_cassettes/user_get_profile.yml +10 -10
  81. data/test/github_delete_test.rb +5 -3
  82. data/test/github_import_test.rb +8 -15
  83. data/test/github_info_test.rb +2 -2
  84. data/test/package_follow_test.rb +3 -3
  85. data/test/package_info_test.rb +16 -15
  86. data/test/package_reference_test.rb +4 -4
  87. data/test/package_search_test.rb +4 -4
  88. data/test/package_versions_test.rb +73 -0
  89. data/test/project_check_test.rb +107 -79
  90. data/test/project_license_test.rb +29 -11
  91. data/test/project_test.rb +59 -0
  92. data/test/user_me_test.rb +4 -4
  93. data/veye.gemspec +10 -8
  94. data/veye.log +11 -0
  95. metadata +73 -20
@@ -17,11 +17,14 @@ module Veye
17
17
  end
18
18
 
19
19
  # returns package information
20
- def self.get_package(api_key, prod_key, language)
20
+ def self.get_package(api_key, prod_key, language, version = nil)
21
21
  lang = encode_language(language)
22
22
  safe_prod_key = encode_prod_key(prod_key)
23
+
23
24
  qparams = {}
24
25
  qparams[:api_key] = api_key if api_key.to_s.size > 0
26
+ qparams[:prod_version] = version.to_s.strip unless version.to_s.empty?
27
+
25
28
  product_api = Resource.new "#{RESOURCE_PATH}/#{lang}/#{safe_prod_key}"
26
29
  product_api.resource.get({params: qparams}) do |response, request, result|
27
30
  JSONResponse.new(request, result, response)
@@ -46,6 +49,17 @@ module Veye
46
49
  end
47
50
  end
48
51
 
52
+ def self.get_version_list(api_key, prod_key, language)
53
+ lang = encode_language(language)
54
+ safe_prod_key = encode_prod_key(prod_key)
55
+
56
+ qparams = {api_key: api_key}
57
+ product_api = Resource.new "#{RESOURCE_PATH}/#{lang}/#{safe_prod_key}/versions"
58
+ product_api.resource.get({params: qparams}) do |response, request, result|
59
+ JSONResponse.new(request, result, response)
60
+ end
61
+ end
62
+
49
63
  def self.get_follow_status(api_key, prod_key, language)
50
64
  product_api = Resource.new(RESOURCE_PATH)
51
65
  qparams = {api_key: api_key}
@@ -53,7 +67,7 @@ module Veye
53
67
  safe_prod_key = encode_prod_key(prod_key)
54
68
  path = "#{lang}/#{safe_prod_key}/follow.json"
55
69
  product_api.resource[path].get({params: qparams}) do |response, request, result|
56
- Veye::API::JSONResponse.new(request, result, response)
70
+ JSONResponse.new(request, result, response)
57
71
  end
58
72
  end
59
73
 
@@ -24,15 +24,19 @@ module Veye
24
24
  file_path
25
25
  end
26
26
 
27
- def self.get_list(api_key)
27
+ def self.get_list(api_key, org_name, team_name = nil)
28
28
  project_api = Resource.new(RESOURCE_PATH)
29
- qparams = {:params => {:api_key => api_key}}
30
- project_api.resource.get(qparams) do |response, request, result|
29
+ qparams = {:api_key => api_key}
30
+ qparams[:orga_name] = org_name.to_s.strip unless org_name.to_s.empty?
31
+ qparams[:team_name] = team_name.to_s.strip unless team_name.to_s.empty?
32
+
33
+ project_api.resource.get({:params => qparams}) do |response, request, result|
31
34
  JSONResponse.new(request, result, response)
32
35
  end
33
36
  end
34
37
 
35
- def self.upload(api_key, filename)
38
+ def self.upload(api_key, filename, org_name = nil, team_name = nil, temporary = false, public =true, name = nil)
39
+ Veye.logger.info("Uploading `#{filename}` under #{org_name}, temporary? #{temporary}, organization? #{public} ")
36
40
  project_api = Resource.new(RESOURCE_PATH)
37
41
  file_path = check_file(filename)
38
42
  return if file_path.nil?
@@ -42,14 +46,19 @@ module Veye
42
46
  :upload => file_obj,
43
47
  :api_key => api_key
44
48
  }
49
+ upload_data[:orga_name] = org_name.to_s.strip unless org_name.to_s.empty?
50
+ upload_data[:team_name] = team_name.to_s.strip unless team_name.to_s.empty?
51
+ upload_data[:temporary] = temporary
52
+ upload_data[:visibility] = (public == true ? 'public' : 'private')
53
+ upload_data[:name] = name.to_s.strip unless name.to_s.strip.empty?
45
54
 
46
55
  project_api.resource.post(upload_data) do |response, request, result, &block|
47
56
  JSONResponse.new(request, result, response)
48
57
  end
49
58
  end
50
59
 
51
- def self.update(api_key, project_key, filename)
52
- project_api = Resource.new("#{RESOURCE_PATH}/#{project_key}")
60
+ def self.update(api_key, project_id, filename)
61
+ project_api = Resource.new("#{RESOURCE_PATH}/#{project_id}")
53
62
  file_path = check_file(filename)
54
63
  return if file_path.nil?
55
64
 
@@ -102,6 +111,32 @@ module Veye
102
111
  end
103
112
  end
104
113
 
114
+
115
+ def self.merge(api_key, parent_id, child_id)
116
+ if parent_id.to_s.empty? or child_id.to_s.empty?
117
+ printf("api.project.merge: neither ParentID or ChildId can not be empty")
118
+ return
119
+ end
120
+
121
+ project_api = Resource.new("#{RESOURCE_PATH}/#{parent_id}/merge/#{child_id}")
122
+ qparams = {params: {api_key: api_key}}
123
+ project_api.resource.get(qparams) do |response, request, result|
124
+ JSONResponse.new(request, result, response)
125
+ end
126
+ end
127
+
128
+ def self.unmerge(api_key, parent_id, child_id)
129
+ if parent_id.to_s.empty? or child_id.to_s.empty?
130
+ printf("api.project.unmerge: neither ParentID or ChildID can not be empty")
131
+ return
132
+ end
133
+
134
+ project_api = Resource.new("#{RESOURCE_PATH}/#{parent_id}/unmerge/#{child_id}")
135
+ qparams = {params: {api_key: api_key}}
136
+ project_api.resource.get(qparams) do |response, request, result|
137
+ JSONResponse.new(request, result, response)
138
+ end
139
+ end
105
140
  end
106
141
  end
107
142
  end
@@ -9,13 +9,20 @@ class BaseExecutor
9
9
  return if formatter.nil?
10
10
 
11
11
  formatter.before
12
- formatter.format(results)
12
+
13
+ #if command uses s.o windowed output aka show only part of the items list
14
+ if options.has_key?(:n) or options.has_key?(:from)
15
+ formatter.format(results, options[:n].to_i, options[:from].to_i)
16
+ else
17
+ formatter.format(results)
18
+ end
13
19
  formatter.after(paging, options[:pagination])
14
20
  end
15
21
 
16
22
  def self.valid_response?(response, msg)
17
23
  if response.nil? || response.success != true
18
24
  printf "#{msg.to_s.color(:red)}: #{response.data}\n"
25
+ Veye.logger.error "API returned error - #{response.code}, #{response.data}"
19
26
  return false
20
27
  end
21
28
 
@@ -27,23 +34,14 @@ class BaseExecutor
27
34
  valid_response?(response, msg)
28
35
  end
29
36
 
30
- def self.filter_dependencies(results, options)
31
-
32
- if options[:all]
33
- results['dependencies'].to_a.sort_by {|x| x['outdated'] ? -1 : 0}
34
- else
35
- results['dependencies'].to_a.keep_if {|x| x['outdated']}
36
- end
37
- end
38
-
39
- def self.show_dependencies(output_formats, results, options)
37
+ def self.show_dependencies(output_formats, proj_deps, options)
40
38
  formatter = get_formatter(output_formats, options)
41
39
  return if formatter.nil?
42
40
 
43
- deps = filter_dependencies(results, options)
44
-
41
+ sorted_deps = process_dependencies(proj_deps.to_a, options)
42
+
45
43
  formatter.before
46
- formatter.format deps
44
+ formatter.format sorted_deps.to_a
47
45
  formatter.after
48
46
  end
49
47
 
@@ -52,12 +50,79 @@ class BaseExecutor
52
50
  return if formatter.nil?
53
51
 
54
52
  formatter.before
55
- results.each do |filename, deps|
56
- formatter.format filter_dependencies(deps, options), filename
53
+ results.each do |filename, project|
54
+ sorted_deps = process_dependencies(project['dependencies'].to_a, options)
55
+
56
+ formatter.format(sorted_deps.to_a, filename)
57
57
  end
58
58
 
59
59
  formatter.after
60
60
  end
61
+
62
+ def self.sort_dependencies_by_upgrade_complexity(deps)
63
+ deps.to_a.sort {|a, b| b[:upgrade][:dv_score] <=> a[:upgrade][:dv_score]}
64
+ end
65
+
66
+ def self.filter_dependencies(deps, options = {})
67
+ return deps if ( options[:all] == true )
68
+
69
+ deps.keep_if {|d| d['outdated'] == true}
70
+
71
+ #if any of filter flags are not selected then return only outdated deps
72
+
73
+ if (options[:major] or options[:minor] or options[:patch]) == false
74
+ return deps
75
+ end
76
+
77
+ filtered_deps = []
78
+ if options.fetch(:major, false) == true
79
+ deps.each {|d| filtered_deps << d if d[:upgrade][:dv_major] > 0}
80
+ end
81
+
82
+ #add only package which has minor change and may have patch changes
83
+ if options.fetch(:minor, false) == true
84
+ deps.each do |d|
85
+ if d[:upgrade][:dv_minor] > 0 and d[:upgrade][:dv_major] == 0
86
+ filtered_deps << d
87
+ end
88
+ end
89
+ end
90
+
91
+ #add only packages which has only patches, and skip all the minor and major changes
92
+ if options.fetch(:patch, false) == true
93
+ deps.each do |d|
94
+ if d[:upgrade][:dv_patch] > 0 and d[:upgrade][:dv_minor] == 0 and d[:upgrade][:dv_major] == 0
95
+ filtered_deps << d
96
+ end
97
+ end
98
+ end
99
+
100
+ #remove duplicates if user attached multiple filter flags
101
+ already_seen_keys = Set.new
102
+ filtered_deps.reduce([]) do |acc, dep|
103
+ next unless dep.has_key?('prod_key')
104
+
105
+ unless already_seen_keys.include?(dep['prod_key'])
106
+ acc << dep
107
+ already_seen_keys << dep['prod_key']
108
+ end
109
+
110
+ acc
111
+ end
112
+ end
113
+
114
+ def self.process_dependencies(proj_deps, options)
115
+ proj_deps.to_a.map do |dep|
116
+ dep[:upgrade] = Veye::Project.calc_upgrade_heuristics(dep['version_requested'], dep['version_current'])
117
+ dep
118
+ end
119
+
120
+ proj_deps = filter_dependencies(proj_deps, options)
121
+ proj_deps = sort_dependencies_by_upgrade_complexity(proj_deps)
122
+
123
+ proj_deps.to_a
124
+ end
125
+
61
126
 
62
127
  def self.show_message(results, success_msg, fail_msg)
63
128
  if results.success
@@ -4,10 +4,8 @@ module Veye
4
4
  module Github
5
5
  # Delete class include methods to cleanup projects imported from Github
6
6
  class Delete < BaseExecutor
7
- def self.delete_repo(api_key, repo_name, options)
8
- response = Veye::API::Github.delete_repo(
9
- api_key, repo_name, options[:branch]
10
- )
7
+ def self.delete_repo(api_key, repo_name, branch = 'master', options = {})
8
+ response = Veye::API::Github.delete_repo(api_key, repo_name, branch)
11
9
  show_result(response)
12
10
  end
13
11
 
@@ -13,10 +13,9 @@ module Veye
13
13
  'table' => Github::InfoTable.new
14
14
  }
15
15
 
16
- def self.import_repo(api_key, repo_name, options)
17
- results = Veye::API::Github.import_repo(
18
- api_key, repo_name, options[:branch], options[:file]
19
- )
16
+ def self.import_repo(api_key, repo_name, branch = 'master', filename = 'Gemfile', options = {})
17
+ results = Veye::API::Github.import_repo( api_key, repo_name, branch, filename)
18
+
20
19
  catch_request_error(results, "Can not find repository `#{repo_name}`")
21
20
  show_results(@output_formats, results.data, options, nil)
22
21
  end
@@ -14,26 +14,26 @@ module Veye
14
14
  )
15
15
  end
16
16
 
17
- def self.get_follow_status(api_key, package_key)
18
- prod_key, lang = Package.parse_key(package_key)
17
+ def self.get_follow_status(api_key, prod_key, lang)
19
18
  results = Veye::API::Package.get_follow_status(api_key, prod_key, lang)
20
- if valid_response?(results, 'Didnt get any response.')
19
+
20
+ if valid_response?(results, "Failed to follow #{lang} package #{prod_key}.")
21
21
  show_result(results)
22
22
  end
23
23
  end
24
24
 
25
- def self.follow(api_key, package_key)
26
- prod_key, lang = Package.parse_key(package_key)
25
+ def self.follow(api_key, prod_key, lang)
27
26
  results = Veye::API::Package.follow(api_key, prod_key, lang)
28
- if valid_response?(results, 'Cant follow.')
27
+
28
+ if valid_response?(results, "Cant follow #{lang} package #{prod_key}.")
29
29
  show_result(results)
30
30
  end
31
31
  end
32
32
 
33
- def self.unfollow(api_key, package_key)
34
- prod_key, lang = Package.parse_key(package_key)
33
+ def self.unfollow(api_key, prod_key, lang)
35
34
  results = Veye::API::Package.unfollow(api_key, prod_key, lang)
36
- if valid_response?(results, 'Cant unfollow.')
35
+
36
+ if valid_response?(results, "Cant unfollow #{lang} package #{prod_key} .")
37
37
  show_result(results)
38
38
  end
39
39
  end
@@ -12,10 +12,10 @@ module Veye
12
12
  'table' => Package::InfoTable.new
13
13
  }
14
14
 
15
- def self.get_package(api_key, package_key, options = {})
16
- prod_key, lang = Package.parse_key(package_key)
17
- results = Veye::API::Package.get_package(api_key, prod_key, lang)
18
- err_msg = "Didnt find any package with product_key: `#{package_key}`"
15
+ def self.get_package(api_key, prod_key, lang = 'ruby', version = nil, options = {})
16
+ results = Veye::API::Package.get_package(api_key, prod_key, lang, version)
17
+ err_msg = "Didnt find any #{lang} package with product_key: `#{prod_key}`"
18
+
19
19
  if valid_response?(results, err_msg)
20
20
  paging = results.data['paging']
21
21
  show_results(@output_formats, results.data, options, paging)
@@ -12,12 +12,10 @@ module Veye
12
12
  'table' => Package::ReferencesTable.new
13
13
  }
14
14
 
15
- def self.get_references(api_key, package_key, options = {})
16
- prod_key, lang = Package.parse_key(package_key)
17
- results = Veye::API::Package.get_references(
18
- api_key, prod_key, lang, options[:page]
19
- )
20
- if valid_response?(results, "No references for: `#{package_key}`")
15
+ def self.get_references(api_key, prod_key, language='ruby', options = {})
16
+ results = Veye::API::Package.get_references(api_key, prod_key, language, options[:page])
17
+
18
+ if valid_response?(results, "No references for: `#{prod_key}`, language: #{language}")
21
19
  paging = results.data['paging']
22
20
  show_results(@output_formats, results.data, options, paging)
23
21
  end
@@ -12,7 +12,8 @@ module Veye
12
12
  'pretty' => Package::SearchPretty.new,
13
13
  'table' => Package::SearchTable.new
14
14
  }
15
-
15
+
16
+ #TODO: remove options param and extraxt option map in the bin/veye command
16
17
  def self.search(api_key, search_term, options)
17
18
  results = Veye::API::Package.search(
18
19
  api_key, search_term, options[:language],
@@ -0,0 +1,37 @@
1
+ require 'naturalsorter'
2
+
3
+ require_relative '../views/package.rb'
4
+ require_relative '../base_executor.rb'
5
+
6
+ module Veye
7
+ module Package
8
+ class Versions < BaseExecutor
9
+ @output_formats = {
10
+ 'csv' => Package::VersionsCSV.new,
11
+ 'json' => Package::VersionsJSON.new,
12
+ 'pretty' => Package::VersionsPretty.new,
13
+ 'table' => Package::VersionsTable.new
14
+ }
15
+
16
+ def self.get_list(api_key, prod_key, lang = 'ruby', n = 10, from = 0, options = {})
17
+ results = Veye::API::Package.get_version_list(api_key, prod_key, lang)
18
+ err_msg = "Found no versions for #{lang} package `#{prod_key}`"
19
+
20
+ if valid_response?(results, err_msg)
21
+ sorted_items = results.data['versions'].to_a.sort do |a, b|
22
+ Naturalsorter::Sorter.bigger?(a['version'], b['version']) ? -1 : 1
23
+ end
24
+
25
+ filtered_items = if options.has_key?('all') and options['all'] == true
26
+ sorted_items
27
+ else
28
+ sorted_items.to_a.drop(from).take(n)
29
+ end
30
+ results.data['versions'] = filtered_items
31
+
32
+ show_results(@output_formats, results.data, options)
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
data/lib/veye/package.rb CHANGED
@@ -2,6 +2,7 @@ require_relative 'package/info.rb'
2
2
  require_relative 'package/search.rb'
3
3
  require_relative 'package/follow.rb'
4
4
  require_relative 'package/references.rb'
5
+ require_relative 'package/versions.rb'
5
6
 
6
7
  # -- define module constants here
7
8
  module Veye
@@ -12,6 +13,7 @@ module Veye
12
13
  Set.new ["Clojure", "Java", "Javascript", "Node.JS", "PHP", "Python", "Ruby", "R"]
13
14
  end
14
15
 
16
+ #TODO remove it
15
17
  def self.parse_key(package_key)
16
18
  tokens = package_key.to_s.split('/')
17
19
  lang = tokens.first
@@ -23,8 +23,9 @@ module Veye
23
23
  'md' => Project::DependencyMarkdown.new
24
24
  }
25
25
 
26
- def self.get_list(api_key, options)
27
- results = Veye::API::Project.get_list(api_key)
26
+ def self.get_list(api_key, org_name = 'private', team_name = nil, options)
27
+ Veye.logger.info "Fetching a list of project for #{org_name}, team:#{team_name}"
28
+ results = Veye::API::Project.get_list(api_key, org_name, team_name)
28
29
  valid_response?(results, 'Can not read list of projects.')
29
30
  show_results(@output_formats, results.data, options)
30
31
  end
@@ -33,18 +34,24 @@ module Veye
33
34
  results = Veye::API::Project.get_project(api_key, project_key)
34
35
  err_msg = "No data for the project: `#{project_key}`"
35
36
  valid_response?(results, err_msg)
36
- show_results(@output_formats, results.data, options)
37
+
38
+ proj_dt = results.data
39
+ show_results(@output_formats, proj_dt, options)
37
40
  if options[:format] != 'json'
38
- show_dependencies(@dependency_output_formats, results.data, options)
41
+ show_dependencies(@dependency_output_formats, proj_dt['dependencies'], options)
39
42
  end
40
43
  end
41
44
 
42
- def self.upload(api_key, filename, options)
43
- results = Veye::API::Project.upload(api_key, filename)
45
+ def self.upload(api_key, filename, org_name = 'private', team_name = nil, options)
46
+
47
+ results = Veye::API::Project.upload(
48
+ api_key, filename, org_name, team_name, options[:temporary], options[:public], options[:name]
49
+ )
50
+
44
51
  valid_response?(results, 'Upload failed.')
45
52
  show_results(@output_formats, results.data, options)
46
53
  if options[:format] != 'json'
47
- show_dependencies(@dependency_output_formats, results.data, options)
54
+ show_dependencies(@dependency_output_formats, results.data['dependencies'], options)
48
55
  end
49
56
  end
50
57
 
@@ -53,7 +60,7 @@ module Veye
53
60
  valid_response?(results, 'Re-upload failed.')
54
61
  show_results(@output_formats, results.data, options)
55
62
  if options[:format] != 'json'
56
- show_dependencies(@dependency_output_formats, results.data, options)
63
+ show_dependencies(@dependency_output_formats, results.data['dependencies'], options)
57
64
  end
58
65
  end
59
66
 
@@ -78,10 +85,12 @@ module Veye
78
85
  project_settings['projects'].each do |filename, project_id|
79
86
  filepath = "#{path}/#{filename}"
80
87
  results = if project_id.to_s.empty?
81
- Veye::API::Project.upload(api_key, filepath)
88
+ Veye::API::Project.upload(api_key, filepath, options[:org], options[:team],
89
+ options[:temporary], options[:public], options[:name])
82
90
  else
83
91
  Veye::API::Project.update(api_key, project_id, filepath)
84
92
  end
93
+
85
94
  error_msg = "Failed to check dependencies for `#{filename.to_s.color(:red)}`"
86
95
  if valid_response?(results, error_msg)
87
96
  deps[filename] = results.data
@@ -97,6 +106,7 @@ module Veye
97
106
  files.to_a.join(', ').to_s.color(:green),
98
107
  "veye.json".color(:yellow)
99
108
  )
109
+ options[:all] = true #hack
100
110
  show_bulk_dependencies(@dependency_output_formats, deps, options)
101
111
  end
102
112
 
data/lib/veye/project.rb CHANGED
@@ -1,3 +1,5 @@
1
+ require 'semverly'
2
+
1
3
  require_relative 'project/check.rb'
2
4
  require_relative 'project/license.rb'
3
5
 
@@ -6,11 +8,48 @@ module Veye
6
8
  # projects on VersionEye and presenting results
7
9
  # on command line.
8
10
  module Project
11
+
12
+ #source: https://raw.githubusercontent.com/versioneye/versioneye-core/master/lib/versioneye/services/project_service.rb
9
13
  @supported_files = [
10
- 'project\.clj', 'bower\.json', 'project\.json', 'gemfile',
11
- 'gemfile\.lock', '*\.gradle', '*\.sbt', '*\.pom\.xml', 'podfile'
14
+ 'project\.clj\z', 'bower\.json\z', 'project\.json\z', 'gemfile\z',
15
+ 'gemfile\.lock\z', '*\.gradle\z', '*\.sbt\z', '*\.pom\.xml\z', 'podfile\z',
16
+ '*\.podspec\z', 'Podfile\.lock\z', 'composer\.lock\z', 'composer\.json\z',
17
+ 'project\.json\z', 'packages\.config\z', 'packages\.json\z', 'requirements\.txt\z',
18
+ 'biicode\.conf\z', 'Berksfile\.lock\z', 'Berksfile\z', 'cpanfile\z', '*\.nuspec\z',
19
+ 'setup\.py\z', '*\.pom\z', 'external_dependencies.xml\z'
12
20
  ]
13
21
 
22
+ @default_upgrade_heuristics = {
23
+ difficulty: 'unknown',
24
+ is_semver: false,
25
+ dv_major: 0.0, #absolute major version difference between 2 semver
26
+ dv_minor: 0.0,
27
+ dv_patch: 0.0,
28
+ dv_score: 0.0 # total dv score on logarithmic scale
29
+ }
30
+
31
+ #-- project commands
32
+ def self.merge(api_key, parent_id, child_id)
33
+ if parent_id.to_s.empty? or child_id.to_s.empty?
34
+ printf("%s\n", "parent_id or child_id was unspecified".color(:red))
35
+ return
36
+ end
37
+
38
+ res = Veye::API::Project.merge(api_key, parent_id, child_id)
39
+ printf("success: %s\n", res.data.fetch('success', false))
40
+ end
41
+
42
+ def self.unmerge(api_key, parent_id, child_id)
43
+ if parent_id.to_s.empty? or child_id.to_s.empty?
44
+ printf("%s\n", "parent_id or child_id was unspecified".color(:red))
45
+ return
46
+ end
47
+
48
+ res = Veye::API::Project.unmerge(api_key, parent_id, child_id)
49
+ printf("success: %s\n", res.data.fetch('success', false) )
50
+ end
51
+
52
+ #-- helper functions
14
53
  def self.supported_files
15
54
  @supported_files
16
55
  end
@@ -32,5 +71,50 @@ module Veye
32
71
 
33
72
  files
34
73
  end
74
+
75
+ #estimates how difficult it would be to upgrade to current version
76
+ def self.calc_upgrade_heuristics(version_requested, version_current)
77
+ scores = @default_upgrade_heuristics
78
+
79
+ semver_A = SemVer.parse(version_requested)
80
+ semver_B = SemVer.parse(version_current)
81
+
82
+ #if any of versions are not semver, then shortcut execution
83
+ if ( semver_A.nil? or semver_B.nil? )
84
+ #hack: float unknown outdated semvers top of up-to-date packages
85
+ scores[:dv_score] = 0.01 if version_requested != version_current
86
+ return scores
87
+ end
88
+
89
+ scores = {
90
+ :is_semver => true,
91
+ :dv_major => (semver_A.major - semver_B.major).abs,
92
+ :dv_minor => (semver_A.minor - semver_B.minor).abs,
93
+ :dv_patch => (semver_A.patch - semver_B.patch).abs
94
+ }
95
+
96
+ dv_score = Math.log10(scores[:dv_major] * 1e3 + scores[:dv_minor] * 1e2 + scores[:dv_patch] + 1)
97
+ scores[:dv_score] = dv_score.round(3)
98
+
99
+ scores[:difficulty] = humanize_dv_score(scores[:dv_score], scores[:is_semver])
100
+
101
+ scores
102
+ end
103
+
104
+ def self.humanize_dv_score(the_score, is_semver)
105
+ if is_semver == false
106
+ 'unknown'
107
+ elsif the_score == 0
108
+ 'up-to-date'
109
+ elsif the_score < 1
110
+ 'low'
111
+ elsif the_score >= 1 and the_score < 3
112
+ 'medium'
113
+ elsif the_score >= 3
114
+ 'high'
115
+ else
116
+ 'unknown'
117
+ end
118
+ end
35
119
  end
36
120
  end
data/lib/veye/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Veye
2
- VERSION = '0.2.1'
2
+ VERSION = '0.3.0'
3
3
  BIGEYE = %q{
4
4
 
5
5
  _ __ _ ______
@@ -19,7 +19,7 @@ class BaseCSV
19
19
  end
20
20
  end
21
21
 
22
- def format(results)
22
+ def format(results, n = 0, from = 0)
23
23
  raise NotImplementedError
24
24
  end
25
25
  end
@@ -11,7 +11,7 @@ module Veye
11
11
  return nil if results.nil?
12
12
  repo = results['repo']
13
13
  imported_projects = results['imported_projects']
14
- imported_project_names = imported_projects.map {|p| p['project_key']}
14
+ imported_project_names = imported_projects.map {|p| p['id']}
15
15
  printf(
16
16
  "%s,%s,%s,%s,%s,%s,%s,%s,%s\n",
17
17
  repo['fullname'],
@@ -9,7 +9,7 @@ module Veye
9
9
  repo = result['repo']
10
10
  projects = result['imported_projects']
11
11
  if projects
12
- project_names = projects.map {|x| x['project_key']}
12
+ project_names = projects.map {|x| x['id']}
13
13
  else
14
14
  project_names = []
15
15
  end
@@ -19,7 +19,7 @@ module Veye
19
19
 
20
20
  projects = result['imported_projects']
21
21
  if projects
22
- project_names = projects.map {|x| x['project_key']}
22
+ project_names = projects.map {|x| x['id']}
23
23
  else
24
24
  project_names = []
25
25
  end
@@ -38,4 +38,4 @@ module Veye
38
38
  end
39
39
  end
40
40
  end
41
- end
41
+ end
@@ -4,14 +4,15 @@ module Veye
4
4
  module Package
5
5
  class InfoCSV < BaseCSV
6
6
  def initialize
7
- headers = "name,version,language,prod_key,licence,prod_type,description,link"
7
+ headers = "name,version,language,prod_key,licence,prod_type,description,link,cves"
8
8
  super(headers)
9
9
  end
10
10
  def format(result)
11
- printf("%s,%s,%s,%s,%s,%s,%s,%s\n",
11
+ vulns = result['security_vulnerabilities'].to_a.map {|x| x['name_id']}.join(';')
12
+ printf("%s,%s,%s,%s,%s,%s,%s,'%s',%s\n",
12
13
  result["name"], result["version"], result["language"],
13
14
  result["prod_key"], result["license"], result["prod_type"],
14
- result["link"], result["description"])
15
+ result["link"], result["description"], vulns)
15
16
  end
16
17
  end
17
18
  end