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.
- 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
|