dtk-network-client 1.0.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 +7 -0
- data/.gitignore +5 -0
- data/Gemfile +2 -0
- data/LICENSE +201 -0
- data/README.md +2 -0
- data/dtk-network-client.gemspec +24 -0
- data/lib/client/args.rb +19 -0
- data/lib/client/client_args.rb +23 -0
- data/lib/client/command/add_to_group.rb +20 -0
- data/lib/client/command/chmod.rb +21 -0
- data/lib/client/command/create_namespace.rb +19 -0
- data/lib/client/command/delete.rb +25 -0
- data/lib/client/command/delete_namespace.rb +19 -0
- data/lib/client/command/info.rb +32 -0
- data/lib/client/command/install/installer.rb +9 -0
- data/lib/client/command/install.rb +190 -0
- data/lib/client/command/list.rb +13 -0
- data/lib/client/command/list_namespaces.rb +10 -0
- data/lib/client/command/publish.rb +120 -0
- data/lib/client/command/pull.rb +53 -0
- data/lib/client/command/push.rb +63 -0
- data/lib/client/command/remove_from_group.rb +20 -0
- data/lib/client/command/unpublish.rb +27 -0
- data/lib/client/command/update.rb +18 -0
- data/lib/client/command.rb +31 -0
- data/lib/client/config.rb +54 -0
- data/lib/client/conn.rb +132 -0
- data/lib/client/dependency_tree/activated.rb +35 -0
- data/lib/client/dependency_tree/cache.rb +28 -0
- data/lib/client/dependency_tree/candidates.rb +19 -0
- data/lib/client/dependency_tree/resolver.rb +16 -0
- data/lib/client/dependency_tree.rb +272 -0
- data/lib/client/error.rb +22 -0
- data/lib/client/file_helper.rb +8 -0
- data/lib/client/git_adapter/git_gem.rb +246 -0
- data/lib/client/git_client.rb +136 -0
- data/lib/client/git_repo.rb +221 -0
- data/lib/client/module_dir.rb +38 -0
- data/lib/client/module_ref/dependency/local.rb +47 -0
- data/lib/client/module_ref/dependency/remote.rb +18 -0
- data/lib/client/module_ref/dependency.rb +21 -0
- data/lib/client/module_ref/version/source.rb +18 -0
- data/lib/client/module_ref/version.rb +87 -0
- data/lib/client/module_ref.rb +21 -0
- data/lib/client/response/response_types.rb +42 -0
- data/lib/client/response.rb +27 -0
- data/lib/client/rest_wrapper.rb +43 -0
- data/lib/client/s3_helper.rb +23 -0
- data/lib/client/session.rb +54 -0
- data/lib/client/storage/adapters/s3.rb +25 -0
- data/lib/client/storage.rb +29 -0
- data/lib/client/util/os_util.rb +77 -0
- data/lib/client/util/permissions_util.rb +12 -0
- data/lib/client/util/tar.rb +104 -0
- data/lib/client/util.rb +7 -0
- data/lib/client/version.rb +8 -0
- data/lib/dtk_network_client.rb +27 -0
- metadata +183 -0
@@ -0,0 +1,221 @@
|
|
1
|
+
module DTK::Network::Client
|
2
|
+
class GitRepo
|
3
|
+
def self.add_remote_and_publish(git_args)
|
4
|
+
Command.wrap_command(git_args) do |git_args|
|
5
|
+
repo_dir = git_args.required(:repo_dir)
|
6
|
+
remote_url = git_args.required(:remote_url)
|
7
|
+
local_branch = git_args[:branch] || 'master'
|
8
|
+
remote_branch = git_args[:remote_branch] || local_branch
|
9
|
+
remote = git_args[:remote] || 'origin'
|
10
|
+
|
11
|
+
repo = git_repo.new(repo_dir, :branch => local_branch)
|
12
|
+
create_if_missing = local_branch_exist?(repo, local_branch) ? false : true
|
13
|
+
|
14
|
+
repo.checkout(local_branch, new_branch: create_if_missing)
|
15
|
+
repo.add_all
|
16
|
+
repo.commit("Publish from dtk client", :allow_empty => true)
|
17
|
+
add_remote_and_push(repo, remote, remote_url, remote_branch)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.push_to_remote(git_args)
|
22
|
+
Command.wrap_command(git_args) do |git_args|
|
23
|
+
repo_dir = git_args.required(:repo_dir)
|
24
|
+
remote_url = git_args.required(:remote_url)
|
25
|
+
local_branch = git_args[:branch] || 'master'
|
26
|
+
remote_branch = git_args[:remote_branch] || local_branch
|
27
|
+
remote = git_args[:remote] || 'origin'
|
28
|
+
commit_msg = git_args[:commit_msg] || "Push from dtkn client"
|
29
|
+
|
30
|
+
repo = git_repo.new(repo_dir, :branch => local_branch)
|
31
|
+
create_if_missing = local_branch_exist?(repo, local_branch) ? false : git_args[:create_if_missing]
|
32
|
+
|
33
|
+
repo.checkout(local_branch, new_branch: create_if_missing)
|
34
|
+
repo.add_all
|
35
|
+
repo.commit(commit_msg, :allow_empty => true)
|
36
|
+
|
37
|
+
if repo.is_there_remote?(remote)
|
38
|
+
push_when_there_is_remote(repo, remote, remote_url, remote_branch)
|
39
|
+
else
|
40
|
+
add_remote_and_push(repo, remote, remote_url, remote_branch)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.pull_from_remote(git_args)
|
46
|
+
Command.wrap_command(git_args) do |git_args|
|
47
|
+
repo_dir = git_args.required(:repo_dir)
|
48
|
+
remote_url = git_args.required(:remote_url)
|
49
|
+
local_branch = git_args[:branch] || 'master'
|
50
|
+
remote_branch = git_args[:remote_branch] || local_branch
|
51
|
+
remote = git_args[:remote] || 'origin'
|
52
|
+
|
53
|
+
repo = git_repo.new(repo_dir, :branch => local_branch)
|
54
|
+
repo.checkout(local_branch)
|
55
|
+
|
56
|
+
if repo.is_there_remote?(remote)
|
57
|
+
pull_when_there_is_remote(repo, remote, remote_url, remote_branch)
|
58
|
+
else
|
59
|
+
add_remote_and_pull(repo, remote, remote_url, remote_branch)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
# opts can have keys
|
65
|
+
# :branch
|
66
|
+
# returns object of type DTK::Client::GitRepo
|
67
|
+
def self.create_empty_git_repo?(repo_dir, opts = {})
|
68
|
+
git_repo.new(repo_dir, :branch => opts[:branch])
|
69
|
+
end
|
70
|
+
|
71
|
+
# returns head_sha
|
72
|
+
def self.empty_commit(repo, commit_msg = nil)
|
73
|
+
repo.empty_commit(commit_msg)
|
74
|
+
repo.head_commit_sha
|
75
|
+
end
|
76
|
+
|
77
|
+
def self.add_remote(repo, remote_name, remote_url)
|
78
|
+
repo.add_remote(remote_name, remote_url)
|
79
|
+
remote_name
|
80
|
+
end
|
81
|
+
|
82
|
+
def self.fetch(repo, remote_name)
|
83
|
+
repo.fetch(remote_name)
|
84
|
+
end
|
85
|
+
|
86
|
+
def self.push_when_there_is_remote(repo, remote, remote_url, remote_branch)
|
87
|
+
repo.remove_remote(remote)
|
88
|
+
add_remote_and_push(repo, remote, remote_url, remote_branch)
|
89
|
+
end
|
90
|
+
|
91
|
+
def self.pull_when_there_is_remote(repo, remote, remote_url, remote_branch)
|
92
|
+
repo.remove_remote(remote)
|
93
|
+
add_remote_and_pull(repo, remote, remote_url, remote_branch)
|
94
|
+
end
|
95
|
+
|
96
|
+
def self.add_remote_and_push(repo, remote, remote_url, remote_branch)
|
97
|
+
repo.add_remote(remote, remote_url)
|
98
|
+
repo.push(remote, remote_branch)
|
99
|
+
end
|
100
|
+
|
101
|
+
def self.add_remote_and_pull(repo, remote, remote_url, remote_branch)
|
102
|
+
repo.add_remote(remote, remote_url)
|
103
|
+
repo.pull(remote, remote_branch)
|
104
|
+
end
|
105
|
+
|
106
|
+
def self.local_branch_exist?(repo, branch)
|
107
|
+
local_branches = branch.is_a?(String) ? repo.all_branches.local.map { |branch| branch.name } : (repo.all_branches.local || [])
|
108
|
+
local_branches.include?(branch)
|
109
|
+
end
|
110
|
+
|
111
|
+
# opts can have keys
|
112
|
+
# :no_commit
|
113
|
+
def self.merge(repo, merge_from_ref, opts = {})
|
114
|
+
base_sha = repo.head_commit_sha
|
115
|
+
repo.merge(merge_from_ref, :use_theirs => opts[:use_theirs])
|
116
|
+
# the git gem does not take no_commit as merge argument; so doing it with soft reset
|
117
|
+
repo.reset_soft(base_sha) if opts[:no_commit]
|
118
|
+
repo.head_commit_sha
|
119
|
+
end
|
120
|
+
|
121
|
+
def self.local_ahead?(repo, merge_from_ref, opts = {})
|
122
|
+
base_sha = repo.head_commit_sha
|
123
|
+
remote_branch = repo.all_branches.remote.find { |r| "#{r.remote}/#{r.name}" == merge_from_ref }
|
124
|
+
remote_sha = remote_branch.gcommit.sha
|
125
|
+
repo.local_ahead(base_sha, remote_sha)
|
126
|
+
end
|
127
|
+
|
128
|
+
# opts can have keys:
|
129
|
+
# :commit_msg
|
130
|
+
# returns head_sha
|
131
|
+
def self.stage_and_commit(repo_dir,local_branch_type, opts = {})
|
132
|
+
local_branch = branch_from_local_branch_type(local_branch_type)
|
133
|
+
repo = create_empty_git_repo?(repo_dir, :branch => local_branch)
|
134
|
+
repo.stage_and_commit(opts[:commit_msg])
|
135
|
+
repo.head_commit_sha
|
136
|
+
end
|
137
|
+
|
138
|
+
# TODO: DTK-2765: see what this does and subsume by create_add_remote_and_push
|
139
|
+
# For this and other methods in Internal that use Dtk_Server::GIT_REMOTE
|
140
|
+
# put a version in Internal taht takes remote_name as param and then have
|
141
|
+
# # method with same name in Dtk, that calss this with appropriate remote name
|
142
|
+
# def self.init_and_push_from_existing_repo(repo_dir, repo_url, remote_branch)
|
143
|
+
# repo = git_repo.new(repo_dir)
|
144
|
+
|
145
|
+
# if repo.is_there_remote?(Dtk_Server::GIT_REMOTE)
|
146
|
+
# push_when_there_is_dtk_remote(repo, repo_dir, repo_url, remote_branch)
|
147
|
+
# else
|
148
|
+
# add_remote_and_push(repo, repo_url, remote_branch)
|
149
|
+
# end
|
150
|
+
|
151
|
+
# repo.head_commit_sha
|
152
|
+
# end
|
153
|
+
|
154
|
+
def self.pull_from_remote(args)
|
155
|
+
repo_url = args.required(:repo_url)
|
156
|
+
remote_branch = args.required(:branch)
|
157
|
+
repo_dir = args.required(:repo_dir)
|
158
|
+
|
159
|
+
repo = git_repo.new(repo_dir, :branch => remote_branch)
|
160
|
+
repo.pull(repo.remotes.first, remote_branch)
|
161
|
+
end
|
162
|
+
|
163
|
+
# def self.push_when_there_is_dtk_remote(repo, repo_dir, repo_url, remote_branch)
|
164
|
+
# # if there is only one remote and it is dtk-server; remove .git and initialize and push as new repo to dtk-server remote
|
165
|
+
# # else if multiple remotes and dtk-server being one of them; remove dtk-server; add new dtk-server remote and push
|
166
|
+
# if repo.remotes.size == 1
|
167
|
+
# git_repo.unlink_local_clone?(repo_dir)
|
168
|
+
# create_repo_from_remote_and_push(repo_dir, repo_url, remote_branch)
|
169
|
+
# else
|
170
|
+
# repo.remove_remote(Dtk_Server::GIT_REMOTE)
|
171
|
+
# add_remote_and_push(repo, repo_url, remote_branch)
|
172
|
+
# end
|
173
|
+
# end
|
174
|
+
|
175
|
+
# def self.create_repo_from_server_remote(repo_dir, repo_url, remote_branch)
|
176
|
+
# repo = git_repo.new(repo_dir, :branch => Dtkn::LOCAL_BRANCH)
|
177
|
+
# repo.checkout(Dtkn::LOCAL_BRANCH, :new_branch => true)
|
178
|
+
# repo.add_remote(Dtk_Server::GIT_REMOTE, repo_url)
|
179
|
+
# repo
|
180
|
+
# end
|
181
|
+
|
182
|
+
# def self.create_repo_from_remote_and_push(repo_dir, repo_url, remote_branch)
|
183
|
+
# repo = create_repo_from_server_remote(repo_dir, repo_url, remote_branch)
|
184
|
+
# # repo = git_repo.new(repo_dir, :branch => Dtkn::LOCAL_BRANCH)
|
185
|
+
# # repo.checkout(Dtkn::LOCAL_BRANCH, :new_branch => true)
|
186
|
+
# # repo.add_remote(Dtk_Server::GIT_REMOTE, repo_url)
|
187
|
+
# repo.stage_and_commit
|
188
|
+
# repo.push(Dtk_Server::GIT_REMOTE, remote_branch, { :force => true })
|
189
|
+
# repo.head_commit_sha
|
190
|
+
# end
|
191
|
+
|
192
|
+
# def self.add_remote_and_push(repo, repo_url, remote_branch)
|
193
|
+
# repo.add_remote(Dtk_Server::GIT_REMOTE, repo_url)
|
194
|
+
# repo.stage_and_commit
|
195
|
+
# repo.push(Dtk_Server::GIT_REMOTE, remote_branch, { :force => true })
|
196
|
+
# end
|
197
|
+
|
198
|
+
def self.all_branches(args)
|
199
|
+
repo_url = args.required(:path)
|
200
|
+
repo = git_repo.new(repo_url)
|
201
|
+
repo.all_branches
|
202
|
+
end
|
203
|
+
|
204
|
+
def self.current_branch(args)
|
205
|
+
repo_url = args.required(:path)
|
206
|
+
repo = git_repo.new(repo_url)
|
207
|
+
repo.current_branch.name
|
208
|
+
end
|
209
|
+
|
210
|
+
def self.git_repo
|
211
|
+
GitClient
|
212
|
+
end
|
213
|
+
|
214
|
+
def self.reset_hard(repo, merge_from_ref)
|
215
|
+
repo.reset_hard(merge_from_ref)
|
216
|
+
repo.head_commit_sha
|
217
|
+
end
|
218
|
+
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
3
|
+
module DTK::Network::Client
|
4
|
+
# Operations for managing module folders
|
5
|
+
class ModuleDir
|
6
|
+
extend DTK::Network::Client::Util::Tar
|
7
|
+
|
8
|
+
def self.ret_path_with_current_dir(name)
|
9
|
+
"#{Dir.getwd}/#{name.gsub(':','/')}"
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.rm_f(path)
|
13
|
+
FileUtils.rm_rf(path)
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.delete_directory_content(path)
|
17
|
+
FileUtils.rm_rf(Dir.glob("#{path}/*"))
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.create_file_with_content(file_path, content)
|
21
|
+
FileUtils.mkdir_p(File.dirname(file_path))
|
22
|
+
File.open(file_path, 'w') { |f| f << content }
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.create_and_ret_tar_gz(source_dir, opts = {})
|
26
|
+
raise Error.new("Directory '#{source_dir}' does not exist!") unless Dir.exist?(source_dir)
|
27
|
+
gzip(tar(source_dir, opts))
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.ungzip_and_untar(file, target_dir)
|
31
|
+
raise Error.new("File '#{file}' does not exist!") unless File.exist?(file)
|
32
|
+
FileUtils.mkdir_p(target_dir)
|
33
|
+
untar(ungzip(File.open(file, "rb")), target_dir)
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module DTK::Network::Client
|
2
|
+
class ModuleRef
|
3
|
+
class Dependency
|
4
|
+
class Local < self
|
5
|
+
MODULE_FILE = 'dtk.module.yaml'
|
6
|
+
|
7
|
+
attr_reader :version, :source
|
8
|
+
def initialize(module_info)
|
9
|
+
super(name: module_info[:name] || module_info['module'], namespace: module_info[:namespace] || module_info['namespace'])
|
10
|
+
version_hash = module_info[:version] || module_info['version']
|
11
|
+
version_str = version_hash[:version] || version_hash['version']
|
12
|
+
version_source = version_hash[:source] || version_hash['source']
|
13
|
+
|
14
|
+
@version = ModuleRef::Version.new(version_str)
|
15
|
+
@source = find_source(version_source)
|
16
|
+
end
|
17
|
+
|
18
|
+
def dtkn_versions_with_dependencies
|
19
|
+
require 'dtk_dsl'
|
20
|
+
file_type = DTK::DSL::FileType::CommonModule::DSLFile::Top
|
21
|
+
file_obj = DTK::DSL::FileObj.new(file_type, @source, { content: FileHelper.get_content?("#{@source}/#{MODULE_FILE}") })
|
22
|
+
parsed_module = file_obj.parse_content(:common_module_summary)
|
23
|
+
dependent_modules = parsed_module.val(:DependentModules) || []
|
24
|
+
|
25
|
+
dependencies = dependent_modules.map { |dep| { 'namespace' => dep[:namespace], 'module' => dep[:module_name], 'version' => dep[:version] }}
|
26
|
+
[
|
27
|
+
{
|
28
|
+
'name' => self.version.str_version,
|
29
|
+
'version' => self.version.str_version,
|
30
|
+
'dependencies' => dependencies
|
31
|
+
}
|
32
|
+
]
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def find_source(version_source)
|
38
|
+
if matching_source = version_source.match(/(file:)(.*)/)
|
39
|
+
matching_source[2]
|
40
|
+
else
|
41
|
+
fail "Unsuppored source format: #{version_source}!"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module DTK::Network::Client
|
2
|
+
class ModuleRef
|
3
|
+
class Dependency
|
4
|
+
class Remote < self
|
5
|
+
def initialize(module_info)
|
6
|
+
super(name: module_info[:name] || module_info['module'], namespace: module_info[:namespace] || module_info['namespace'])
|
7
|
+
version_str = module_info[:version]||module_info['version']
|
8
|
+
@version = ModuleRef::Version.new(version_str)
|
9
|
+
end
|
10
|
+
|
11
|
+
def dtkn_versions_with_dependencies
|
12
|
+
response = rest_get("modules/get_versions_with_dependencies", { name: self.name, namespace: self.namespace })
|
13
|
+
response['versions']
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module DTK::Network::Client
|
2
|
+
class ModuleRef
|
3
|
+
class Dependency < self
|
4
|
+
require_relative('dependency/local')
|
5
|
+
require_relative('dependency/remote')
|
6
|
+
|
7
|
+
include RestWrapper
|
8
|
+
extend RestWrapper
|
9
|
+
|
10
|
+
def self.create_local_or_remote(module_info)
|
11
|
+
version = module_info[:version] || module_info['version']
|
12
|
+
is_local?(version) ? Local.new(module_info) : Remote.new(module_info)
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.is_local?(version)
|
16
|
+
return unless version.is_a?(Hash)
|
17
|
+
!!(version[:source] || version['source'])
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module DTK::Network::Client
|
2
|
+
class ModuleRef
|
3
|
+
class Version
|
4
|
+
class Source
|
5
|
+
attr_reader :location
|
6
|
+
def initialize(source)
|
7
|
+
# right now we only support file as source, later we can introduce other sources
|
8
|
+
if matching_source = source.match(/(file:)(.*)/)
|
9
|
+
@location = matching_source[2]
|
10
|
+
else
|
11
|
+
fail "Unsuppored source format: #{source}!"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
@@ -0,0 +1,87 @@
|
|
1
|
+
module DTK::Network::Client
|
2
|
+
class ModuleRef
|
3
|
+
class Version
|
4
|
+
attr_reader :full_version, :requirement, :semantic_version, :str_version
|
5
|
+
|
6
|
+
def initialize(version = '')
|
7
|
+
@full_version = version.strip
|
8
|
+
@str_version = ''
|
9
|
+
@requirement = '='
|
10
|
+
@semantic_version = nil
|
11
|
+
parse
|
12
|
+
end
|
13
|
+
|
14
|
+
def versions_in_range(versions)
|
15
|
+
v_in_range = []
|
16
|
+
versions = [versions] unless versions.is_a?(Array)
|
17
|
+
|
18
|
+
versions.each do |version|
|
19
|
+
if satisfied_by?(version)
|
20
|
+
v_in_range << version
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
v_in_range
|
25
|
+
end
|
26
|
+
|
27
|
+
def satisfied_by?(version = nil)
|
28
|
+
return unless version
|
29
|
+
match_requirement?(version)
|
30
|
+
end
|
31
|
+
|
32
|
+
def is_semantic_version?
|
33
|
+
!!@semantic_version
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.is_semantic_version?(version)
|
37
|
+
SemVer.parse(version)
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def match_requirement?(version)
|
43
|
+
case @requirement
|
44
|
+
when '='
|
45
|
+
version == @str_version
|
46
|
+
when '<'
|
47
|
+
version < @str_version
|
48
|
+
when '>'
|
49
|
+
version > @str_version
|
50
|
+
when '<='
|
51
|
+
version <= @str_version
|
52
|
+
when '>='
|
53
|
+
version >= @str_version
|
54
|
+
when '~>'
|
55
|
+
top_version = nil
|
56
|
+
|
57
|
+
if patch = @semantic_version.patch
|
58
|
+
top_version = "#{@semantic_version.major}.#{@semantic_version.minor + 1}.0"
|
59
|
+
elsif minor = @semantic_version.minor
|
60
|
+
top_version = "#{@semantic_version.major + 1}.0.0"
|
61
|
+
end
|
62
|
+
|
63
|
+
return false unless top_version
|
64
|
+
|
65
|
+
(version < top_version) && (version >= @str_version)
|
66
|
+
else
|
67
|
+
false
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def parse
|
72
|
+
parsed = @full_version.split(' ')
|
73
|
+
raise "Invalid version #{@full_version}!" if parsed.empty? || parsed.size > 2
|
74
|
+
|
75
|
+
if parsed.size == 1
|
76
|
+
@str_version = parsed.first
|
77
|
+
@semantic_version = SemVer.parse(@str_version)
|
78
|
+
else
|
79
|
+
@requirement = parsed.first
|
80
|
+
@str_version = parsed.last
|
81
|
+
@semantic_version = SemVer.parse(@str_version)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module DTK::Network
|
2
|
+
module Client
|
3
|
+
class ModuleRef
|
4
|
+
require_relative('module_ref/dependency')
|
5
|
+
require_relative('module_ref/version')
|
6
|
+
|
7
|
+
attr_reader :name, :namespace, :version, :repo_dir, :full_name, :explicit_path
|
8
|
+
|
9
|
+
def initialize(module_info)
|
10
|
+
@name = module_info[:name]
|
11
|
+
@namespace = module_info[:namespace]
|
12
|
+
mod_info_version = module_info[:version] || module_info['version']
|
13
|
+
@version = mod_info_version ? Version.new(mod_info_version) : nil
|
14
|
+
@repo_dir = module_info[:repo_dir]
|
15
|
+
@explicit_path = module_info[:explicit_path]
|
16
|
+
@full_name = "#{@namespace}/#{@name}"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module DTK::Network::Client
|
2
|
+
class Response
|
3
|
+
class Ok < self
|
4
|
+
def initialize(data = {})
|
5
|
+
super('data'=> data, 'status' => 'ok')
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
class NotOk < self
|
10
|
+
def initialize(data = {})
|
11
|
+
super('data'=> data, 'status' => 'notok')
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class NoOp < self
|
16
|
+
def render_data
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class ErrorResponse < self
|
21
|
+
include ::DTK::Common::Response::ErrorMixin
|
22
|
+
def initialize(hash = {})
|
23
|
+
super('errors' => [hash])
|
24
|
+
end
|
25
|
+
private :initialize
|
26
|
+
|
27
|
+
class Usage < self
|
28
|
+
def initialize(hash_or_string = {})
|
29
|
+
hash = (hash_or_string.kind_of?(String) ? {'message' => hash_or_string} : hash_or_string)
|
30
|
+
super({'code' => 'error'}.merge(hash))
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
class Internal < self
|
35
|
+
def initialize(hash = {})
|
36
|
+
super({'code' => 'error'}.merge(hash).merge('internal' => true))
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'dtk_common_core'
|
2
|
+
|
3
|
+
module DTK::Network::Client
|
4
|
+
class Response < ::DTK::Common::Response
|
5
|
+
require_relative('response/response_types')
|
6
|
+
|
7
|
+
def initialize(hash = {})
|
8
|
+
super(hash)
|
9
|
+
end
|
10
|
+
|
11
|
+
def notok?
|
12
|
+
kind_of?(NotOk)
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.wrap_as_response(data = {}, &block)
|
16
|
+
results = (block ? yield : data)
|
17
|
+
if results.nil?
|
18
|
+
NoOp.new
|
19
|
+
elsif results.kind_of?(Response)
|
20
|
+
results
|
21
|
+
else
|
22
|
+
Ok.new(results)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module DTK::Network::Client
|
2
|
+
module RestWrapper
|
3
|
+
def rest_get(url, params = {})
|
4
|
+
raise_error_if_notok_response do
|
5
|
+
Session.rest_get(url, params)
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
def rest_post(url, post_body = {})
|
10
|
+
raise_error_if_notok_response do
|
11
|
+
Session.rest_post(url, post_body)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def rest_delete(url, post_body = {})
|
16
|
+
raise_error_if_notok_response do
|
17
|
+
Session.rest_delete(url, post_body)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def raise_error_if_notok_response(&block)
|
24
|
+
response = block.call
|
25
|
+
if response
|
26
|
+
if response.is_a?(Hash)
|
27
|
+
status = response['status']
|
28
|
+
if status
|
29
|
+
raise Error.new(response) if status.eql?('notok')
|
30
|
+
# response
|
31
|
+
# else
|
32
|
+
# Response::Ok.new(response)
|
33
|
+
end
|
34
|
+
response
|
35
|
+
else
|
36
|
+
response
|
37
|
+
end
|
38
|
+
else
|
39
|
+
raise Error.new(response)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module DTK::Network::Client
|
2
|
+
class S3Helper
|
3
|
+
def self.ret_s3_bucket_info(response)
|
4
|
+
branch = response['branch'] || {}
|
5
|
+
bucket = nil
|
6
|
+
object_name = nil
|
7
|
+
|
8
|
+
if meta = branch['meta']
|
9
|
+
catalog_uri = meta['catalog_uri']
|
10
|
+
if match = catalog_uri.match(/.*amazonaws.com\/([^\/]*)\/(.*.gz)/)
|
11
|
+
bucket = match[1]
|
12
|
+
object_name = match[2]
|
13
|
+
end
|
14
|
+
else
|
15
|
+
raise "Unexpected that publish response does not contain branch metadata!"
|
16
|
+
end
|
17
|
+
|
18
|
+
raise "Unable to extract bucket and/or object name data from catalog_uri!" if bucket.nil? || object_name.nil?
|
19
|
+
|
20
|
+
return [bucket, object_name]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
|
3
|
+
module DTK::Network
|
4
|
+
module Client
|
5
|
+
class Session
|
6
|
+
include Singleton
|
7
|
+
|
8
|
+
attr_accessor :conn
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
@conn = Conn.new
|
12
|
+
end
|
13
|
+
|
14
|
+
# opts can have keys
|
15
|
+
# :reset
|
16
|
+
def self.get_connection(opts = {})
|
17
|
+
instance.conn = Conn.new if opts[:reset]
|
18
|
+
instance.conn
|
19
|
+
end
|
20
|
+
|
21
|
+
# def self.connection_username
|
22
|
+
# instance.conn.get_username
|
23
|
+
# end
|
24
|
+
|
25
|
+
def self.re_initialize
|
26
|
+
instance.conn = nil
|
27
|
+
instance.conn = Conn.new
|
28
|
+
instance.conn.cookies
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.logout
|
32
|
+
# from this point @conn is not valid, since there are no cookies set
|
33
|
+
instance.conn.logout
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.rest_post(route, post_body = {})
|
37
|
+
instance.conn.post(route, post_body)
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.rest_get(route, opts = {})
|
41
|
+
instance.conn.get(route, opts)
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.rest_delete(route, delete_body = {})
|
45
|
+
instance.conn.delete(route, delete_body)
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.get_codecommit_data
|
49
|
+
instance.conn.codecommit
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module DTK::Network::Client
|
2
|
+
class Storage
|
3
|
+
module Adapter
|
4
|
+
class S3
|
5
|
+
require 'aws-sdk'
|
6
|
+
|
7
|
+
def initialize(data_hash)
|
8
|
+
@s3 = Aws::S3::Client.new(data_hash)
|
9
|
+
end
|
10
|
+
|
11
|
+
def upload(data_hash)
|
12
|
+
@s3.put_object(data_hash)
|
13
|
+
end
|
14
|
+
|
15
|
+
def download(data_hash, opts = {})
|
16
|
+
@s3.get_object(data_hash, opts)
|
17
|
+
end
|
18
|
+
|
19
|
+
def delete(data_hash, opts = {})
|
20
|
+
@s3.delete_object(data_hash, opts)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|