aspera-cli 4.26.0 → 4.26.2

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.
Files changed (99) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +36 -4
  4. data/CONTRIBUTING.md +2 -5
  5. data/bin/ascli +2 -2
  6. data/lib/aspera/agent/direct.rb +1 -1
  7. data/lib/aspera/agent/factory.rb +4 -0
  8. data/lib/aspera/agent/httpgw.rb +1 -1
  9. data/lib/aspera/agent/node.rb +2 -2
  10. data/lib/aspera/api/aoc.rb +45 -37
  11. data/lib/aspera/api/cos_node.rb +1 -1
  12. data/lib/aspera/api/faspex.rb +7 -6
  13. data/lib/aspera/api/node.rb +9 -9
  14. data/lib/aspera/ascmd.rb +4 -4
  15. data/lib/aspera/ascp/installation.rb +13 -6
  16. data/lib/aspera/assert.rb +17 -13
  17. data/lib/aspera/cli/context.rb +58 -0
  18. data/lib/aspera/cli/extended_value.rb +9 -4
  19. data/lib/aspera/cli/formatter.rb +91 -187
  20. data/lib/aspera/cli/http.rb +167 -0
  21. data/lib/aspera/cli/manager.rb +132 -77
  22. data/lib/aspera/cli/options.schema.yaml +82 -0
  23. data/lib/aspera/cli/plugins/alee.rb +2 -2
  24. data/lib/aspera/cli/plugins/aoc.rb +113 -77
  25. data/lib/aspera/cli/plugins/ats.rb +16 -16
  26. data/lib/aspera/cli/plugins/base.rb +64 -49
  27. data/lib/aspera/cli/plugins/config.rb +172 -444
  28. data/lib/aspera/cli/plugins/console.rb +7 -7
  29. data/lib/aspera/cli/plugins/cos.rb +2 -2
  30. data/lib/aspera/cli/plugins/factory.rb +3 -0
  31. data/lib/aspera/cli/plugins/faspex.rb +22 -22
  32. data/lib/aspera/cli/plugins/faspex5.rb +68 -49
  33. data/lib/aspera/cli/plugins/faspio.rb +1 -1
  34. data/lib/aspera/cli/plugins/httpgw.rb +2 -2
  35. data/lib/aspera/cli/plugins/node.rb +80 -80
  36. data/lib/aspera/cli/plugins/orchestrator.rb +21 -26
  37. data/lib/aspera/cli/plugins/preview.rb +9 -9
  38. data/lib/aspera/cli/plugins/server.rb +7 -7
  39. data/lib/aspera/cli/plugins/shares.rb +2 -2
  40. data/lib/aspera/cli/preset_manager.rb +235 -0
  41. data/lib/aspera/cli/result.rb +310 -0
  42. data/lib/aspera/cli/{main.rb → runner.rb} +48 -130
  43. data/lib/aspera/cli/sync_actions.rb +15 -11
  44. data/lib/aspera/cli/terminal_formatter.rb +65 -0
  45. data/lib/aspera/cli/transfer_agent.rb +17 -15
  46. data/lib/aspera/cli/transfer_progress.rb +6 -6
  47. data/lib/aspera/cli/version.rb +1 -1
  48. data/lib/aspera/cli/wizard.rb +5 -6
  49. data/lib/aspera/command_line_builder.rb +22 -18
  50. data/lib/aspera/data_repository.rb +4 -0
  51. data/lib/aspera/dot_container.rb +1 -1
  52. data/lib/aspera/environment.rb +25 -6
  53. data/lib/aspera/faspex_gw.rb +1 -1
  54. data/lib/aspera/formatter_interface.rb +14 -0
  55. data/lib/aspera/hash_ext.rb +6 -0
  56. data/lib/aspera/json_rpc.rb +6 -5
  57. data/lib/aspera/keychain/base.rb +1 -1
  58. data/lib/aspera/keychain/encrypted_hash.rb +1 -1
  59. data/lib/aspera/keychain/factory.rb +1 -1
  60. data/lib/aspera/keychain/macos_security.rb +1 -1
  61. data/lib/aspera/log.rb +10 -5
  62. data/lib/aspera/markdown.rb +4 -1
  63. data/lib/aspera/nagios.rb +2 -2
  64. data/lib/aspera/oauth/base.rb +5 -5
  65. data/lib/aspera/oauth/boot.rb +43 -0
  66. data/lib/aspera/oauth/factory.rb +38 -14
  67. data/lib/aspera/oauth/web.rb +2 -2
  68. data/lib/aspera/oauth.rb +1 -0
  69. data/lib/aspera/persistency_action_once.rb +2 -2
  70. data/lib/aspera/preview/file_types.rb +4 -0
  71. data/lib/aspera/products/connect.rb +3 -0
  72. data/lib/aspera/products/transferd.rb +2 -2
  73. data/lib/aspera/proxy_auto_config.rb +6 -3
  74. data/lib/aspera/rest.rb +9 -5
  75. data/lib/aspera/rest_error_analyzer.rb +4 -0
  76. data/lib/aspera/rest_list.rb +10 -3
  77. data/lib/aspera/schema/IBM Aspera Faspex API-5.0-enhanced.yaml +62811 -0
  78. data/lib/aspera/schema/IBM Aspera on Cloud API-0.2.6-enhanced.yaml +9637 -0
  79. data/lib/aspera/schema/async_tables.yaml +361 -0
  80. data/lib/aspera/schema/documentation.rb +107 -0
  81. data/lib/aspera/schema/reader.rb +75 -0
  82. data/lib/aspera/schema/registry.rb +70 -0
  83. data/lib/aspera/secret_hider.rb +4 -0
  84. data/lib/aspera/sync/conf.schema.yaml +0 -26
  85. data/lib/aspera/sync/database.rb +14 -10
  86. data/lib/aspera/sync/operations.rb +14 -10
  87. data/lib/aspera/temp_file_manager.rb +4 -0
  88. data/lib/aspera/transfer/faux_file.rb +1 -1
  89. data/lib/aspera/transfer/parameters.rb +4 -4
  90. data/lib/aspera/transfer/resumer.rb +2 -2
  91. data/lib/aspera/transfer/spec.rb +3 -3
  92. data/lib/aspera/transfer/spec.schema.yaml +18 -9
  93. data/lib/aspera/transfer/uri.rb +1 -1
  94. data/lib/aspera/uri_reader.rb +1 -1
  95. data/lib/aspera/yaml.rb +4 -2
  96. data.tar.gz.sig +0 -0
  97. metadata +28 -15
  98. metadata.gz.sig +1 -1
  99. data/lib/aspera/transfer/spec_doc.rb +0 -76
@@ -5,6 +5,9 @@ require 'singleton'
5
5
 
6
6
  module Aspera
7
7
  module Products
8
+ # @!method self.instance
9
+ # Returns the singleton instance of Connect
10
+ # @return [Connect] the singleton instance
8
11
  class Connect
9
12
  include Singleton
10
13
 
@@ -29,7 +29,7 @@ module Aspera
29
29
 
30
30
  # @return the path to folder where SDK is or should be installed
31
31
  def sdk_directory
32
- Aspera.assert(!@sdk_dir.nil?){'SDK path was not initialized'}
32
+ Aspera.assert(!@sdk_dir.nil?, 'SDK path was not initialized')
33
33
  @sdk_dir
34
34
  end
35
35
 
@@ -52,7 +52,7 @@ module Aspera
52
52
  end
53
53
  end
54
54
  end
55
- Aspera.assert(!result.nil?){'Port not found in daemon logs'}
55
+ Aspera.assert(!result.nil?, 'Port not found in daemon logs')
56
56
  Log.log.debug{"Got port #{result} from log"}
57
57
  return result
58
58
  end
@@ -10,8 +10,11 @@ module URI
10
10
  # save original method that finds proxy in URI::Generic, it uses env var http_proxy
11
11
  alias_method :find_proxy_orig, :find_proxy
12
12
  class << self
13
+ # Register a custom proxy finder block
14
+ # @yieldparam url [String] The URL to find proxy for
15
+ # @yieldreturn [String, nil] Proxy URL or nil to fallback to original method
13
16
  def register_proxy_finder
14
- Aspera.assert(block_given?)
17
+ Aspera.assert(block_given?, 'block required for register_proxy_finder')
15
18
  # overload the method in URI : call user's provided block and fallback to original method
16
19
  define_method(:find_proxy){ |env_vars = ENV| yield(to_s) || find_proxy_orig(env_vars)}
17
20
  end
@@ -113,12 +116,12 @@ END_OF_JAVASCRIPT
113
116
  parts = item.strip.split
114
117
  case parts.shift
115
118
  when 'DIRECT'
116
- Aspera.assert(parts.empty?){'DIRECT has no param'}
119
+ Aspera.assert(parts.empty?, 'DIRECT has no param')
117
120
  Log.log.debug('ignoring proxy DIRECT')
118
121
  when 'PROXY'
119
122
  addr_port = parts.shift
120
123
  Aspera.assert_type(addr_port, String)
121
- Aspera.assert(parts.empty?){'PROXY shall have one param'}
124
+ Aspera.assert(parts.empty?, 'PROXY shall have one param')
122
125
  begin
123
126
  # PAC proxy addresses are <host>:<port>
124
127
  if /:[0-9]+$/.match?(addr_port)
data/lib/aspera/rest.rb CHANGED
@@ -30,6 +30,10 @@ module Aspera
30
30
  # @param download_partial_suffix [String] suffix for partial download
31
31
  # @param session_cb [lambda] lambda called on new HTTP session. Takes the Net::HTTP as arg. Used to change parameters on creation.
32
32
  # @param progress_bar [Object] progress bar object called for file transfer
33
+ #
34
+ # @!method self.instance
35
+ # Returns the singleton instance of RestParameters
36
+ # @return [RestParameters] the singleton instance
33
37
  class RestParameters
34
38
  include Singleton
35
39
 
@@ -102,7 +106,7 @@ module Aspera
102
106
  when Hash
103
107
  URI.encode_www_form(h_to_query_array(query))
104
108
  when Array
105
- Aspera.assert(query.all?{ |i| i.is_a?(Array) && i.length.eql?(2)}){'Query must be array of arrays of 2 elements'}
109
+ Aspera.assert(query.all?{ |i| i.is_a?(Array) && i.length.eql?(2)}, 'Query must be array of arrays of 2 elements')
106
110
  URI.encode_www_form(query) # remove nil values
107
111
  else Aspera.error_unexpected_value(query.class){'query type'}
108
112
  end.gsub('%5B%5D=', '[]=')
@@ -166,7 +170,7 @@ module Aspera
166
170
  next unless url_match
167
171
  url = url_match[1]
168
172
  # Extract parameters after the URL
169
- params_str = link_part[url_match.end(0)..-1]
173
+ params_str = link_part[url_match.end(0)..]
170
174
  # Check if this link has the specified rel (with or without quotes, case insensitive)
171
175
  next unless /;\s*rel\s*=\s*"?#{Regexp.escape(rel)}"?/i.match?(params_str)
172
176
  return url
@@ -316,7 +320,7 @@ module Aspera
316
320
  # default is no auth
317
321
  @auth_params = auth
318
322
  Aspera.assert_type(@auth_params, Hash)
319
- Aspera.assert(@auth_params.key?(:type)){'no auth type defined'}
323
+ Aspera.assert(@auth_params.key?(:type), 'no auth type defined')
320
324
  @not_auth_codes = not_auth_codes
321
325
  Aspera.assert_type(@not_auth_codes, Array)
322
326
  # persistent session
@@ -333,7 +337,7 @@ module Aspera
333
337
  # @return the OAuth object (create, or cached if already created)
334
338
  def oauth
335
339
  if @oauth.nil?
336
- Aspera.assert(@auth_params[:type].eql?(:oauth2)){'no OAuth defined'}
340
+ Aspera.assert(@auth_params[:type].eql?(:oauth2), 'no OAuth defined')
337
341
  oauth_parameters = @auth_params.reject{ |k, _v| k.eql?(:type)}
338
342
  Log.dump(:oauth_parameters, oauth_parameters)
339
343
  @oauth = OAuth::Factory.instance.create(**oauth_parameters)
@@ -374,7 +378,7 @@ module Aspera
374
378
  Log.dump(:headers, headers, level: :trace1)
375
379
  Aspera.assert_type(subpath, String)
376
380
  # We must have a way to check return code
377
- Aspera.assert(exception || !ret.eql?(:data))
381
+ Aspera.assert(exception || !ret.eql?(:data), 'ret: :data requires exception handler')
378
382
  if headers.nil?
379
383
  headers = @headers.clone
380
384
  else
@@ -7,6 +7,10 @@ require 'net/http'
7
7
 
8
8
  module Aspera
9
9
  # analyze error codes returned by REST calls and raise ruby exception
10
+ #
11
+ # @!method self.instance
12
+ # Returns the singleton instance of RestErrorAnalyzer
13
+ # @return [RestErrorAnalyzer] the singleton instance
10
14
  class RestErrorAnalyzer
11
15
  include Singleton
12
16
 
@@ -50,6 +50,7 @@ module Aspera
50
50
  # @return [Array<(Array<Hash>, Integer)>] items, total_count
51
51
  def list_entities_limit_offset_total_count(
52
52
  entity:,
53
+ operation: 'GET',
53
54
  items_key: nil,
54
55
  query: nil
55
56
  )
@@ -67,9 +68,15 @@ module Aspera
67
68
  # Merge default parameters, by default 100 per page
68
69
  query = {'limit'=> PER_PAGE_DEFAULT}.merge(query)
69
70
  total_count = nil
71
+ call_args = {
72
+ operation: operation,
73
+ subpath: entity,
74
+ query: query,
75
+ headers: {'Accept' => Mime::JSON}
76
+ }
70
77
  loop do
71
78
  query['offset'] = offset
72
- page_result = read(entity, query)
79
+ page_result = call(**call_args)
73
80
  Aspera.assert_type(page_result[items_key], Array)
74
81
  result.concat(page_result[items_key])
75
82
  # Reach the limit set by user ?
@@ -97,7 +104,7 @@ module Aspera
97
104
  # @param query [Hash] Additional query parameters (Default: `:default`)
98
105
  def lookup_entity_by_field(entity:, value:, field: 'name', items_key: nil, query: :default)
99
106
  if query.eql?(:default)
100
- Aspera.assert(field.eql?('name')){'Default query is on name only'}
107
+ Aspera.assert_values(field, ['name']){'Default query field'}
101
108
  query = {'q'=> value}
102
109
  end
103
110
  lookup_entity_generic(entity: entity, field: field, value: value){list_entities_limit_offset_total_count(entity: entity, items_key: items_key, query: query).first}
@@ -113,7 +120,7 @@ module Aspera
113
120
  # @return [Hash] The unique matching object.
114
121
  # @raise [Cli::BadIdentifier] If 0 or >1 matches are found.
115
122
  def lookup_entity_generic(entity:, value:, field: 'name')
116
- Aspera.assert(block_given?)
123
+ Aspera.assert(block_given?, 'block required for lookup_entity_generic')
117
124
  found = yield
118
125
  Aspera.assert_array_all(found, Hash)
119
126
  found = found.select{ |i| i[field].eql?(value)}