veye 0.2.1 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +48 -41
- data/README.md +36 -17
- data/bin/veye +176 -47
- data/bundle +0 -0
- data/changelogs.md +19 -0
- data/lib/veye/api/package.rb +16 -2
- data/lib/veye/api/project.rb +41 -6
- data/lib/veye/base_executor.rb +81 -16
- data/lib/veye/github/delete.rb +2 -4
- data/lib/veye/github/import.rb +3 -4
- data/lib/veye/package/follow.rb +9 -9
- data/lib/veye/package/info.rb +4 -4
- data/lib/veye/package/references.rb +4 -6
- data/lib/veye/package/search.rb +2 -1
- data/lib/veye/package/versions.rb +37 -0
- data/lib/veye/package.rb +2 -0
- data/lib/veye/project/check.rb +19 -9
- data/lib/veye/project.rb +86 -2
- data/lib/veye/version.rb +1 -1
- data/lib/veye/views/base_csv.rb +1 -1
- data/lib/veye/views/github/info_csv.rb +1 -1
- data/lib/veye/views/github/info_pretty.rb +1 -1
- data/lib/veye/views/github/info_table.rb +2 -2
- data/lib/veye/views/package/info_csv.rb +4 -3
- data/lib/veye/views/package/info_pretty.rb +4 -2
- data/lib/veye/views/package/info_table.rb +4 -1
- data/lib/veye/views/package/versions_csv.rb +24 -0
- data/lib/veye/views/package/versions_json.rb +15 -0
- data/lib/veye/views/package/versions_pretty.rb +23 -0
- data/lib/veye/views/package/versions_table.rb +27 -0
- data/lib/veye/views/package.rb +4 -0
- data/lib/veye/views/project/dependency_csv.rb +18 -10
- data/lib/veye/views/project/dependency_pretty.rb +13 -2
- data/lib/veye/views/project/dependency_table.rb +8 -2
- data/lib/veye/views/project/info_csv.rb +9 -3
- data/lib/veye/views/project/info_markdown.rb +7 -2
- data/lib/veye/views/project/info_pretty.rb +6 -1
- data/lib/veye/views/project/info_table.rb +8 -3
- data/lib/veye.rb +26 -3
- data/test/api/package_test.rb +15 -0
- data/test/api/project_test.rb +83 -19
- data/test/base/base_executor_test.rb +87 -0
- data/test/fixtures/vcr_cassettes/github_delete.yml +7 -7
- data/test/fixtures/vcr_cassettes/github_import.yml +11 -13
- data/test/fixtures/vcr_cassettes/github_info.yml +10 -10
- data/test/fixtures/vcr_cassettes/github_list.yml +12 -12
- data/test/fixtures/vcr_cassettes/github_sync.yml +7 -7
- data/test/fixtures/vcr_cassettes/package_follow.yml +10 -10
- data/test/fixtures/vcr_cassettes/package_follow_status.yml +7 -7
- data/test/fixtures/vcr_cassettes/package_info.yml +17 -18
- data/test/fixtures/vcr_cassettes/package_info_default.yml +54 -0
- data/test/fixtures/vcr_cassettes/package_info_versioned.yml +54 -0
- data/test/fixtures/vcr_cassettes/package_reference.yml +8 -8
- data/test/fixtures/vcr_cassettes/package_search.yml +8 -8
- data/test/fixtures/vcr_cassettes/package_unfollow.yml +7 -7
- data/test/fixtures/vcr_cassettes/package_versions.yml +44 -0
- data/test/fixtures/vcr_cassettes/project_check_new.yml +33 -30
- data/test/fixtures/vcr_cassettes/project_check_update.yml +29 -30
- data/test/fixtures/vcr_cassettes/project_delete.yml +8 -8
- data/test/fixtures/vcr_cassettes/project_delete_for_licenses.yml +48 -0
- data/test/fixtures/vcr_cassettes/project_delete_for_update.yml +46 -0
- data/test/fixtures/vcr_cassettes/project_delete_merge_child.yml +46 -0
- data/test/fixtures/vcr_cassettes/project_delete_merge_parent.yml +46 -0
- data/test/fixtures/vcr_cassettes/project_get.yml +11 -12
- data/test/fixtures/vcr_cassettes/project_license.yml +11 -12
- data/test/fixtures/vcr_cassettes/project_license_command.yml +49 -0
- data/test/fixtures/vcr_cassettes/project_list.yml +14 -14
- data/test/fixtures/vcr_cassettes/project_merge.yml +46 -0
- data/test/fixtures/vcr_cassettes/project_unmerge.yml +46 -0
- data/test/fixtures/vcr_cassettes/project_update.yml +15 -16
- data/test/fixtures/vcr_cassettes/project_upload.yml +17 -16
- data/test/fixtures/vcr_cassettes/project_upload_for_licenses.yml +107 -0
- data/test/fixtures/vcr_cassettes/project_upload_for_update.yml +105 -0
- data/test/fixtures/vcr_cassettes/project_upload_merge_child.yml +65 -0
- data/test/fixtures/vcr_cassettes/project_upload_merge_parent.yml +104 -0
- data/test/fixtures/vcr_cassettes/project_upload_with_args.yml +106 -0
- data/test/fixtures/vcr_cassettes/services_ping.yml +6 -8
- data/test/fixtures/vcr_cassettes/user_get_favorites.yml +10 -10
- data/test/fixtures/vcr_cassettes/user_get_profile.yml +10 -10
- data/test/github_delete_test.rb +5 -3
- data/test/github_import_test.rb +8 -15
- data/test/github_info_test.rb +2 -2
- data/test/package_follow_test.rb +3 -3
- data/test/package_info_test.rb +16 -15
- data/test/package_reference_test.rb +4 -4
- data/test/package_search_test.rb +4 -4
- data/test/package_versions_test.rb +73 -0
- data/test/project_check_test.rb +107 -79
- data/test/project_license_test.rb +29 -11
- data/test/project_test.rb +59 -0
- data/test/user_me_test.rb +4 -4
- data/veye.gemspec +10 -8
- data/veye.log +11 -0
- metadata +73 -20
data/lib/veye/api/package.rb
CHANGED
@@ -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
|
-
|
70
|
+
JSONResponse.new(request, result, response)
|
57
71
|
end
|
58
72
|
end
|
59
73
|
|
data/lib/veye/api/project.rb
CHANGED
@@ -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 = {:
|
30
|
-
|
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,
|
52
|
-
project_api = Resource.new("#{RESOURCE_PATH}/#{
|
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
|
data/lib/veye/base_executor.rb
CHANGED
@@ -9,13 +9,20 @@ class BaseExecutor
|
|
9
9
|
return if formatter.nil?
|
10
10
|
|
11
11
|
formatter.before
|
12
|
-
|
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.
|
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
|
-
|
44
|
-
|
41
|
+
sorted_deps = process_dependencies(proj_deps.to_a, options)
|
42
|
+
|
45
43
|
formatter.before
|
46
|
-
formatter.format
|
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,
|
56
|
-
|
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
|
data/lib/veye/github/delete.rb
CHANGED
@@ -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
|
|
data/lib/veye/github/import.rb
CHANGED
@@ -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
|
-
|
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
|
data/lib/veye/package/follow.rb
CHANGED
@@ -14,26 +14,26 @@ module Veye
|
|
14
14
|
)
|
15
15
|
end
|
16
16
|
|
17
|
-
def self.get_follow_status(api_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
|
-
|
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,
|
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
|
-
|
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,
|
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
|
-
|
35
|
+
|
36
|
+
if valid_response?(results, "Cant unfollow #{lang} package #{prod_key} .")
|
37
37
|
show_result(results)
|
38
38
|
end
|
39
39
|
end
|
data/lib/veye/package/info.rb
CHANGED
@@ -12,10 +12,10 @@ module Veye
|
|
12
12
|
'table' => Package::InfoTable.new
|
13
13
|
}
|
14
14
|
|
15
|
-
def self.get_package(api_key,
|
16
|
-
|
17
|
-
|
18
|
-
|
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,
|
16
|
-
|
17
|
-
|
18
|
-
|
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
|
data/lib/veye/package/search.rb
CHANGED
@@ -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
|
data/lib/veye/project/check.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
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,
|
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
|
-
|
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
data/lib/veye/views/base_csv.rb
CHANGED
@@ -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['
|
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'],
|
@@ -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['
|
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
|
-
|
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
|