veye 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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