dtk-client 0.10.3 → 0.10.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: dd1abbc6f5062ad48d35ba88b53cfaf6486c0aa2
4
- data.tar.gz: df24b3e1f53d12977293b7622b52a2ed4f5db48a
3
+ metadata.gz: 43813c96b0c40e8459d6668ca71bd0b8db38958f
4
+ data.tar.gz: ab8249e25eb9242e7b09f45b68b834e5c059764c
5
5
  SHA512:
6
- metadata.gz: 28a5f3cf4bf0c1788abb74067e73335626d82df5077a2007bd0619b2195fc7145d6618c00702c68cdd6f9a1aa600219b94619a3add7357ddfcaa4a062b23103b
7
- data.tar.gz: 1b4369cfcca59952127f284185c190ab71543647ac46a73d6b119cf960a705554fc866676a2a8d40da4664dddcebc129c5bbbb8573b97fa55b12cb650f4075d4
6
+ metadata.gz: 4dbb96de07e1c8ca3f6721b15151196e91f52444b002aef643fedd7aad32e494d2db00d499a807abc474909d7374d1256861fe90b03e2d1ad8a63e9d665651ba
7
+ data.tar.gz: abc0b3255033efc1ad9ee47e99eab523e25f4226732ae837de6c36cb1b9bbe99dd696d021ee18f46aa4518392f09997cb83aa809c283eb3040d6ee4f629fba85
@@ -25,10 +25,9 @@ module DTK::Client
25
25
  sc.flag Token.version
26
26
  sc.action do |_global_options, options, args|
27
27
  module_name = args[0]
28
- module_ref = module_ref_in_options_or_context(:module_ref => module_name, :version => options[:version])
28
+ module_ref = module_ref_object_from_options_or_context(:module_ref => module_name, :version => options[:version])
29
29
  arg = {
30
30
  :module_ref => module_ref,
31
- :module_name => module_name,
32
31
  :target_directory => args[1]
33
32
  }
34
33
  Operation::Module.clone_module(arg)
@@ -25,7 +25,7 @@ module DTK::Client
25
25
  sc.switch Token.skip_prompt
26
26
 
27
27
  sc.action do |_global_options, options, args|
28
- module_ref = module_ref_in_options_or_context?(:module_ref => args[0], :version => options[:version])
28
+ module_ref = module_ref_object_from_options_or_context?(:module_ref => args[0], :version => options[:version])
29
29
  Operation::Module.delete_from_remote(:module_ref => module_ref, :skip_prompt => options[:skip_prompt])
30
30
  end
31
31
  end
@@ -37,7 +37,7 @@ module DTK::Client
37
37
  # in so doing installes depedent modules onto teh dtk server; this step though does not install main module onto
38
38
  # server (the later step Operation::Module.install does this)
39
39
  has_remote_repo = true
40
- module_ref = module_ref_in_options_or_context?(:module_ref => module_name, :version => version)
40
+ module_ref = module_ref_object_from_options_or_context?(:module_ref => module_name, :version => version)
41
41
  target_repo_dir = Operation::Module.install_from_catalog(:module_ref => module_ref, :version => options[:version], :directory_path => directory_path)
42
42
  end
43
43
 
@@ -48,7 +48,7 @@ module DTK::Client
48
48
  end
49
49
 
50
50
  install_opts = directory_path ? { :directory_path => directory_path, :version => (version || 'master') } : options
51
- module_ref = module_ref_in_options_or_context?(install_opts)
51
+ module_ref = module_ref_object_from_options_or_context?(install_opts)
52
52
  operation_args = {
53
53
  :module_ref => module_ref,
54
54
  :base_dsl_file_obj => @base_dsl_file_obj,
@@ -25,7 +25,7 @@ module DTK::Client
25
25
  sc.action do |_global_options, options, _args|
26
26
  opts = {}
27
27
  unless options[:all]
28
- if module_ref = module_ref_in_options_or_context?(options)
28
+ if module_ref = module_ref_object_from_options_or_context?(options)
29
29
  opts.merge!(:module_ref => module_ref)
30
30
  end
31
31
  end
@@ -22,7 +22,7 @@ module DTK::Client
22
22
  command_body c, 'publish', 'Publish module installed on server to the repo manager' do |sc|
23
23
  sc.flag Token.directory_path, :desc => 'Absolute or relative path to module directory containing updates to publish; not need if in the module directory'
24
24
  sc.action do |_global_options, options, _args|
25
- module_ref = module_ref_in_options_or_context(options)
25
+ module_ref = module_ref_object_from_options_or_context(options)
26
26
  Operation::Module.publish(:module_ref => module_ref, :directory_path => options[:directory_path])
27
27
  end
28
28
  end
@@ -22,9 +22,9 @@ module DTK::Client
22
22
  command_body c, 'pull-dtkn', 'Pull content from repo manager to client module directory and push to server' do |sc|
23
23
  sc.flag Token.directory_path, :desc => 'Absolute or relative path to module directory containing content to update; not need if in the module directory'
24
24
  sc.action do |_global_options, options, _args|
25
- module_ref = module_ref_in_options_or_context(options)
25
+ module_ref = module_ref_object_from_options_or_context(options)
26
26
  Operation::Module.pull_dtkn(:module_ref => module_ref, :base_dsl_file_obj => @base_dsl_file_obj)
27
- Operation::Module.push(:module_ref => module_ref, :base_dsl_file_obj => @base_dsl_file_obj, :directory_path => options[:directory_path])
27
+ Operation::Module.push(:module_ref => module_ref, :base_dsl_file_obj => @base_dsl_file_obj, :directory_path => options[:directory_path], :method => "pulled")
28
28
  end
29
29
  end
30
30
  end
@@ -22,7 +22,7 @@ module DTK::Client
22
22
  command_body c, :push, 'Push content from client module directory to server' do |sc|
23
23
  sc.flag Token.directory_path, :desc => 'Absolute or relative path to module directory containing updates to push; not need if in the module directory'
24
24
  sc.action do |_global_options, options, _args|
25
- module_ref = module_ref_in_options_or_context(options)
25
+ module_ref = module_ref_object_from_options_or_context(options)
26
26
  Operation::Module.push(:module_ref => module_ref, :base_dsl_file_obj => @base_dsl_file_obj)
27
27
  end
28
28
  end
@@ -22,7 +22,7 @@ module DTK::Client
22
22
  command_body c, 'push-dtkn', 'Push content from client module directory to repo manager' do |sc|
23
23
  sc.flag Token.directory_path, :desc => 'Absolute or relative path to module directory containing updates to push; not need if in the module directory'
24
24
  sc.action do |_global_options, options, _args|
25
- module_ref = module_ref_in_options_or_context(options)
25
+ module_ref = module_ref_object_from_options_or_context(options)
26
26
  Operation::Module.push_dtkn(:module_ref => module_ref, :base_dsl_file_obj => @base_dsl_file_obj, :directory_path => options[:directory_path])
27
27
  end
28
28
  end
@@ -30,7 +30,7 @@ module DTK::Client
30
30
  # sc.switch Token.purge, :desc => 'Overwrite any content that presently exists in the service instance directory to be created'
31
31
  # sc.flag Token.version
32
32
  sc.action do |_global_options, options, args|
33
- module_ref = module_ref_in_options_or_context(options)
33
+ module_ref = module_ref_object_from_options_or_context(options)
34
34
  assembly_name = args[0]
35
35
  version = options[:version] || module_ref.version
36
36
  service_name = options[:service_name]
@@ -32,9 +32,9 @@ module DTK::Client
32
32
  if options[:uninstall_name].nil?
33
33
  module_ref =
34
34
  if module_name = args[0]
35
- module_ref_in_options_or_context?({:module_ref => module_name, :version => (version || 'master')}, module_refs_opts)
35
+ module_ref_object_from_options_or_context?({:module_ref => module_name, :version => (version || 'master')}, module_refs_opts)
36
36
  else
37
- module_ref_in_options_or_context(options, module_refs_opts)
37
+ module_ref_object_from_options_or_context(options, module_refs_opts)
38
38
  end
39
39
  else
40
40
  module_name = options["name"]
@@ -30,7 +30,7 @@ module DTK::Client
30
30
  # sc.switch Token.purge, :desc => 'Overwrite any content that presently exists in the service instance directory to be created'
31
31
  # sc.flag Token.version
32
32
  sc.action do |_global_options, options, args|
33
- module_ref = module_ref_in_options_or_context(options)
33
+ module_ref = module_ref_object_from_options_or_context(options)
34
34
  assembly_name = args[0]
35
35
  version = options[:version] || module_ref.version
36
36
  service_name = options[:service_name]
data/lib/cli/context.rb CHANGED
@@ -161,11 +161,11 @@ module DTK::Client
161
161
  ::DTK::DSL::FileType::ServiceInstance::DSLFile::Top
162
162
  ]
163
163
 
164
- def module_ref_in_options_or_context(options, module_refs_opts = {})
165
- module_ref_in_options_or_context?(options, module_refs_opts) || raise_error_when_missing_context(:module_ref, options)
164
+ def module_ref_object_from_options_or_context(options, module_refs_opts = {})
165
+ module_ref_object_from_options_or_context?(options, module_refs_opts) || raise_error_when_missing_context(:module_ref, options)
166
166
  end
167
167
 
168
- def module_ref_in_options_or_context?(options, module_refs_opts = {})
168
+ def module_ref_object_from_options_or_context?(options, module_refs_opts = {})
169
169
  # using :ignore_parsing_errors to ret namespace, name and version from .yaml file even if there are parsing errors
170
170
  @options.merge!(:ignore_parsing_errors => module_refs_opts[:ignore_parsing_errors])
171
171
 
data/lib/cli/version.rb CHANGED
@@ -18,7 +18,7 @@
18
18
  module DTK
19
19
  module Client
20
20
  module CLI
21
- VERSION="0.10.3"
21
+ VERSION="0.10.4"
22
22
  end
23
23
  end
24
24
  end
@@ -42,9 +42,14 @@ module DTK::Client
42
42
  @client_dir_path = opts[:client_dir_path]
43
43
  end
44
44
 
45
+ def self.pretty_print(module_name, namespace, version = nil)
46
+ # TODO: update ::DTK::Common::PrettyPrintForm to insert 'master' when version is nil
47
+ ::DTK::Common::PrettyPrintForm.module_ref(module_name, :namespace => namespace, :version => version || 'master')
48
+ end
45
49
  def pretty_print
46
- ::DTK::Common::PrettyPrintForm.module_ref(@module_name, :namespace => @namespace, :version => @version)
50
+ self.class.pretty_print(@module_name, @namespace, @version)
47
51
  end
52
+
48
53
  # TODO: look at deprecating print_form
49
54
  def print_form
50
55
  NamespaceModuleName.print_form(@namespace, @module_name, :version => @version)
@@ -41,35 +41,47 @@ module DTK::Client
41
41
 
42
42
  private
43
43
 
44
+ # opts can have keys
45
+ # :remote_info - Boolean
46
+ # :type
47
+ # :rsa_pub_key
44
48
  def module_version_exists?(module_ref, opts = {})
45
49
  self.class.module_version_exists?(module_ref, opts)
46
50
  end
47
-
48
51
  def self.module_version_exists?(module_ref, opts = {})
49
52
  type = opts[:type] || :common_module
50
- query_string_hash = QueryStringHash.new(module_ref_hash(module_ref).merge(:module_type => type))
53
+ query_string_hash = module_ref_query_string_hash(module_ref, module_type: type)
51
54
 
52
55
  if ret_remote_info = opts[:remote_info]
53
- query_string_hash.merge!(:remote_info => ret_remote_info, :rsa_pub_key => opts[:rsa_pub_key])
56
+ query_string_hash = query_string_hash.merge(:remote_info => ret_remote_info, :rsa_pub_key => opts[:rsa_pub_key])
54
57
  end
55
58
 
56
59
  response = rest_get(BaseRoute, query_string_hash)
57
60
  response.data.empty? ? nil : response
58
61
  end
59
62
 
63
+ def self.module_ref_post_body(module_ref)
64
+ PostBody.new(module_ref_hash(module_ref))
65
+ end
66
+
67
+ # opts can have keys:
68
+ # :module_type
69
+ def self.module_ref_query_string_hash(module_ref, opts = {})
70
+ QueryStringHash.new(module_ref_hash(module_ref, opts))
71
+ end
72
+
73
+ # opts can have keys:
74
+ # :module_type
60
75
  # Can be used as input hash for QueryParams and PostBody
61
- def self.module_ref_hash(module_ref)
76
+ def self.module_ref_hash(module_ref, opts = {})
62
77
  {
63
- :namespace => module_ref.namespace,
64
- :module_name => module_ref.module_name,
65
- :version? => module_ref.version
78
+ :namespace => module_ref.namespace,
79
+ :module_name => module_ref.module_name,
80
+ :version? => module_ref.version,
81
+ :module_type? => opts[:module_type]
66
82
  }
67
83
  end
68
84
 
69
- def self.module_ref_query_string_hash(module_ref)
70
- QueryStringHash.new(module_ref_hash(module_ref))
71
- end
72
-
73
85
  end
74
86
  end
75
87
  end
@@ -18,32 +18,30 @@
18
18
  module DTK::Client
19
19
  class Operation::Module
20
20
  class CloneModule < self
21
- attr_reader :module_ref, :target_repo_dir, :module_name, :version
22
- def initialize(module_name, module_ref, target_directory)
23
- @module_name = module_name
21
+ attr_reader :target_repo_dir, :module_ref
22
+ def initialize(module_ref, target_directory)
24
23
  @module_ref = module_ref
25
- @target_repo_dir = target_directory || ClientModuleDir.ret_path_with_current_dir(module_name)
26
- @version = module_ref.version
24
+ @target_repo_dir = target_directory || ClientModuleDir.ret_path_with_current_dir(module_ref.module_name)
27
25
  end
28
26
  private :initialize
29
27
 
30
28
  def self.execute(args = Args.new)
31
29
  wrap_operation(args) do |args|
32
30
  module_ref = args.required(:module_ref)
33
- module_name = args.required(:module_name)
34
31
  target_directory = args[:target_directory]
35
- new(module_name, module_ref, target_directory).clone_module
32
+ new(module_ref, target_directory).clone_module
36
33
  end
37
34
  end
38
35
 
39
36
  def clone_module
40
- opts = {
41
- :namespace => module_ref.namespace,
42
- :version => version
43
- }
37
+ unless module_info = module_version_exists?(@module_ref, :type => :common_module, :remote_info => true, :rsa_pub_key => SSHUtil.rsa_pub_key_content)
38
+ raise Error::Usage, "DTK module '#{@module_ref.pretty_print}' does not exist on the DTK Server."
39
+ end
44
40
 
45
- unless module_info = module_version_exists?(module_ref, :type => :common_module, :remote_info => true, :rsa_pub_key => SSHUtil.rsa_pub_key_content)
46
- raise Error::Usage, "DTK module '#{DTK::Common::PrettyPrintForm.module_ref(module_ref.module_name, opts)}' does not exist on server."
41
+ # This handles state where a depenent module is just created as a component module and consequently we tell server
42
+ # to create the common_module tied to it
43
+ unless module_info.data(:repo)
44
+ module_info = create_module_repo_from_component_info
47
45
  end
48
46
 
49
47
  branch = module_info.required(:branch, :name)
@@ -54,8 +52,8 @@ module DTK::Client
54
52
  :module_type => :common_module,
55
53
  :repo_url => module_info.required(:repo, :url),
56
54
  :branch => module_info.required(:branch, :name),
57
- :module_name => module_name,
58
- :repo_dir => target_repo_dir
55
+ :module_name => @module_ref.module_name,
56
+ :repo_dir => @target_repo_dir
59
57
  }
60
58
 
61
59
  ret = ClientModuleDir::GitRepo.clone_module_repo(clone_args)
@@ -64,8 +62,23 @@ module DTK::Client
64
62
  LoadSource.fetch_from_remote(module_info, self)
65
63
  end
66
64
 
67
- OsUtil.print_info("DTK module '#{DTK::Common::PrettyPrintForm.module_ref(module_ref.module_name, opts)}' has been successfully cloned into '#{ret.required(:target_repo_dir)}'")
65
+ OsUtil.print_info("DTK module '#{@module_ref.pretty_print}' has been successfully cloned into '#{ret.required(:target_repo_dir)}'")
66
+ end
67
+
68
+ def version
69
+ @module_ref.version
70
+ end
71
+
72
+ private
73
+
74
+ def create_module_repo_from_component_info
75
+ rest_post("#{BaseRoute}/create_repo_from_component_info", module_ref_post_body)
68
76
  end
77
+
78
+ def module_ref_post_body
79
+ self.class.module_ref_post_body(@module_ref)
80
+ end
81
+
69
82
  end
70
83
  end
71
84
  end
@@ -31,7 +31,7 @@ module DTK::Client
31
31
  @base_module_ref = base_module_ref
32
32
  @component_module_refs = component_module_refs
33
33
  @print_helper = PrintHelper.new(:module_ref => @base_module_ref, :source => :remote)
34
- @prompt_helper = PromptHelper.new(:update_all => opts[:skip_prompt])
34
+ @prompt_helper = PromptHelper.new(:update_all => opts[:skip_prompt], :update_none => opts[:update_none])
35
35
  end
36
36
  private :initialize
37
37
 
@@ -83,14 +83,7 @@ module DTK::Client; class Operation::Module
83
83
  :version? => version
84
84
  }
85
85
 
86
- response = rest_post "#{BaseRoute}/install_component_module", PostBody.new(post_body)
87
-
88
- clone_args = {
89
- :module_type => :component_module,
90
- :repo_url => response.required(:repo_url),
91
- :branch => response.required(:workspace_branch),
92
- :module_name => response.required(:full_module_name)
93
- }
86
+ response = rest_post "#{BaseRoute}/install_component_info", PostBody.new(post_body)
94
87
 
95
88
  @print_helper.print_done_message
96
89
  response
@@ -21,6 +21,7 @@ module DTK::Client
21
21
  def self.execute(args = Args.new)
22
22
  wrap_operation(args) do |args|
23
23
  module_ref = args.required(:module_ref)
24
+ method = args[:method] || "pushed"
24
25
 
25
26
  unless client_dir_path = module_ref.client_dir_path
26
27
  raise Error, "Not implemented yet; need to make sure module_ref.client_dir_path is set when client_dir_path given"
@@ -52,22 +53,46 @@ module DTK::Client
52
53
  )
53
54
 
54
55
  response = rest_post("#{BaseRoute}/update_from_repo", post_body)
56
+
57
+ if missing_dependencies = response.data(:missing_dependencies)
58
+ unless missing_dependencies.empty?
59
+ dependent_modules = missing_dependencies.map { |dependency| Install::ModuleRef.new(:namespace => dependency['namespace_name'], :module_name => dependency['display_name'], :version => dependency['version_info']) }
60
+ begin
61
+ Install::DependentModules.install(module_ref, dependent_modules, :update_none => true)
62
+ rescue TerminateInstall
63
+ @print_helper.print_terminated_installation
64
+ return nil
65
+ end
66
+ end
67
+ response = rest_post("#{BaseRoute}/update_from_repo", post_body.merge(:skip_missing_check => true))
68
+ end
55
69
  # TODO: DTK-2786; uncomment out to see what diffs is returning for different examples of what is deleted, added or modified before push
56
70
  # pp [:debug_diffs, response.data(:diffs)]
57
- process_semantic_diffs(response.data(:diffs))
71
+ print = process_semantic_diffs(response.data(:diffs), method)
58
72
 
59
73
  # if diffs is nil then indicate no diffs, otherwise render diffs in yaml
60
- OsUtil.print_info("No Diffs to be pushed.") if response.data(:diffs).nil?
74
+ OsUtil.print_info("No Diffs to be #{method}.") if response.data(:diffs).nil? || !print
61
75
  nil
62
76
  end
63
77
  end
64
78
 
65
- def self.process_semantic_diffs(diffs)
79
+ def self.process_semantic_diffs(diffs, method)
66
80
  return if (diffs || {}).empty?
67
- OsUtil.print_info("\nDiffs that were pushed:")
81
+ print = false
82
+
83
+ diffs.each {|diff| print = true unless diff[1].nil?}
84
+
85
+ if print
86
+ OsUtil.print_info("\nDiffs that were #{method}:")
87
+
88
+ diffs.each { |v| diffs.delete(v[0]) if v[1].nil? }
89
+ OsUtil.print(hash_to_yaml(diffs).gsub("---\n", ""))
90
+ end
91
+
92
+ print
93
+ end
68
94
 
69
- diffs.each { |v| diffs.delete(v[0]) if v[1].nil? }
70
- OsUtil.print(hash_to_yaml(diffs).gsub("---\n", ""))
95
+ class TerminateInstall < ::Exception
71
96
  end
72
97
  end
73
98
  end
@@ -23,6 +23,7 @@ module DTK::Client
23
23
  module_ref = args.required(:module_ref)
24
24
  name = args.required(:name)
25
25
  version = args.required(:version)
26
+ versions = nil
26
27
 
27
28
  unless name.nil?
28
29
  query_string_hash = QueryStringHash.new(
@@ -57,23 +58,15 @@ module DTK::Client
57
58
 
58
59
  raise Error::Usage, "Invalid module name." if module_ref.nil?
59
60
 
60
- opts = {
61
- :namespace => module_ref.namespace,
62
- :version => module_ref.version
63
- }
64
-
65
61
  unless args[:skip_prompt]
66
- return false unless Console.prompt_yes_no("Are you sure you want to uninstall module '#{DTK::Common::PrettyPrintForm.module_ref(module_ref.module_name, opts)}' from the server?", :add_options => true)
62
+ return false unless Console.prompt_yes_no("Are you sure you want to uninstall module '#{module_ref.pretty_print}' from the DTK Server?", :add_options => true)
67
63
  end
68
64
 
69
- post_body = PostBody.new(
70
- :module_name => module_ref.module_name,
71
- :namespace => module_ref.namespace,
72
- :version? => module_ref.version
73
- )
65
+ post_body = module_ref_post_body(module_ref)
66
+ post_body.merge!(:versions => versions) if versions
74
67
 
75
68
  rest_post("#{BaseRoute}/delete", post_body)
76
- OsUtil.print_info("DTK module '#{DTK::Common::PrettyPrintForm.module_ref(module_ref.module_name, opts)}' has been deleted successfully.")
69
+ OsUtil.print_info("DTK module '#{module_ref.pretty_print}' has been uninstalled successfully.")
77
70
  nil
78
71
  end
79
72
  end
@@ -40,14 +40,15 @@ module DTK::Client
40
40
  post_body = PostBody.new(
41
41
  :task_params? => task_params
42
42
  )
43
- response = rest_post("#{BaseRoute}/#{service_instance}/#{action}", post_body)
43
+ encoded_action = URI.encode_www_form_component("#{action}")
44
+ response = rest_post("#{BaseRoute}/#{service_instance}/#{encoded_action}", post_body)
44
45
 
45
46
  if confirmation_message = response.data(:confirmation_message)
46
47
  unless Console.prompt_yes_no("Service instance has been stopped, do you want to start it?", :add_options => true)
47
48
  return Response::Ok.new(:empty_workflow => true)
48
49
  end
49
50
 
50
- response = rest_post("#{BaseRoute}/#{service_instance}/#{action}", post_body.merge!(:start_assembly => true, :skip_violations => true))
51
+ response = rest_post("#{BaseRoute}/#{service_instance}/#{encoded_action}", post_body.merge!(:start_assembly => true, :skip_violations => true))
51
52
  end
52
53
 
53
54
  if response.data(:empty_workflow)
@@ -54,7 +54,7 @@ module DTK::Client
54
54
  end
55
55
  end
56
56
 
57
- raise Error, errors unless errors.empty?
57
+ raise Error::Usage, errors unless errors.empty?
58
58
  end
59
59
 
60
60
  private
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dtk-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.3
4
+ version: 0.10.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Reactor8
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-01-19 00:00:00.000000000 Z
11
+ date: 2017-02-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dtk-common-core
@@ -380,7 +380,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
380
380
  version: '0'
381
381
  requirements: []
382
382
  rubyforge_project:
383
- rubygems_version: 2.4.6
383
+ rubygems_version: 2.5.1
384
384
  signing_key:
385
385
  specification_version: 4
386
386
  summary: DTK CLI client for DTK server interaction.