foobara-remote-imports 1.1.0 → 1.2.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fc711d9de1d42988b5b7dc5728c209d9799824cb29af45e9de02249bf4ad043a
4
- data.tar.gz: 1acb351deca1c088a1b42cf71a53529163ae99b67ff2f3711af5fa6f7327c055
3
+ metadata.gz: f1748c91e76bfd28962f68cad11973d9e1b2a84a3f1c4910fadf43b121172db6
4
+ data.tar.gz: 75ae2b5d402baf94d46b51459958da14e1fd00136c4d3fd240a10ed4e9f447d0
5
5
  SHA512:
6
- metadata.gz: 8f0f8fe372ce418207057f4e011c9b3aba7c76d3c9b770a0c49685920e0c51f086d870f2491f4cdb9c083185d21e88e3f395d3c0089953f3e60017ceb7ec232f
7
- data.tar.gz: 7d15054b7ef96c7ba295cb02a32ee7b5362e58409e60550f376f6849e245cd4d1e6386453853ed050f411f3673d79622569679b976e8284384e514e1dcb82921
6
+ metadata.gz: 4ab8e8a5de0cf0557efabb6a1594659b35a51562db6cc51a719884c5211894833da24f2269967cc7b976aaba08b1cc9ed09c36fabd98eab8cb1a4699ce324130
7
+ data.tar.gz: 6e3753e48e483d6a36974275f8522de03bfb729f660f8fa17d2ecb5816efa376ed474e0d00b2bb15cdad5eed8e12bb16230092c913da5cf851398b276f3c2721
data/CHANGELOG.md CHANGED
@@ -1,3 +1,12 @@
1
+ ## [1.2.1] - 2026-10-10
2
+
3
+ - Fix an annoying deprecation warning
4
+
5
+ ## [1.2.0] - 2025-10-29
6
+
7
+ - Support auth to get the manifest itself when needed
8
+ - Strip entire path/query string from the manifest URL to get the API url base
9
+
1
10
  ## [1.1.0] - 2025-08-22
2
11
 
3
12
  - Handle new Foobara 0.1.0 type declarations
@@ -5,8 +5,8 @@ module Foobara
5
5
  class << self
6
6
  attr_accessor :auth_header_name, :auth_header_value
7
7
 
8
- def subclass(auth_header:, **opts)
9
- super(base: AuthenticatedRemoteCommand, **opts).tap do |klass|
8
+ def subclass(auth_header:, **)
9
+ super(base: AuthenticatedRemoteCommand, **).tap do |klass|
10
10
  klass.auth_header_name = auth_header[0]
11
11
  klass.auth_header_value = auth_header[1]
12
12
  end
@@ -58,9 +58,9 @@ module Foobara
58
58
  def cast_and_validate_inputs
59
59
  @inputs = if inputs_type.nil? && (raw_inputs.nil? || raw_inputs.empty?)
60
60
  # TODO: test this path
61
- # :nocov:
61
+ # simplecov:disable
62
62
  {}
63
- # :nocov:
63
+ # simplecov:enable
64
64
  else
65
65
  serializer_class = CommandConnectors::Serializers::EntitiesToPrimaryKeysSerializer
66
66
  serializer = serializer_class.new(detached_to_primary_key: true)
@@ -138,17 +138,17 @@ module Foobara
138
138
  path: error["path"]
139
139
  )
140
140
  else
141
- # :nocov:
141
+ # simplecov:disable
142
142
  raise "Bad error category: #{error["category"]}"
143
- # :nocov:
143
+ # simplecov:enable
144
144
  end
145
145
  end
146
146
 
147
147
  halt!
148
148
  else
149
- # :nocov:
149
+ # simplecov:disable
150
150
  raise UnexpectedError, "#{response.code} from #{url}: #{response.body}"
151
- # :nocov:
151
+ # simplecov:enable
152
152
  end
153
153
  end
154
154
  end
@@ -10,7 +10,7 @@ module Foobara
10
10
  end
11
11
 
12
12
  def to_key(manifest)
13
- [manifest.path.first.to_sym, manifest.reference.to_sym]
13
+ [manifest.manifest_path.first.to_sym, manifest.reference.to_sym]
14
14
  end
15
15
 
16
16
  def already_imported?(manifest)
@@ -96,21 +96,31 @@ module Foobara
96
96
  end
97
97
 
98
98
  def load_manifest_from_url
99
- url = URI.parse(manifest_url)
100
- response = Net::HTTP.get_response(url)
101
-
102
- manifest_json = if response.is_a?(Net::HTTPSuccess)
103
- response.body
104
- else
105
- # :nocov:
106
- raise "Could not get manifest from #{url}: " \
107
- "#{response.code} #{response.message}"
108
- # :nocov:
109
- end
99
+ uri = URI.parse(manifest_url)
100
+
101
+ net_http = Net::HTTP.new(uri.host, uri.port).tap do |http|
102
+ http.use_ssl = uri.scheme == "https"
103
+ http.read_timeout = ENV["FOOBARA_HTTP_MANIFEST_TIMEOUT"]&.to_i || 30
104
+ end
105
+
106
+ request = Net::HTTP::Get.new(uri.request_uri, load_manifest_headers)
107
+ response = net_http.request(request)
108
+
109
+ unless response.is_a?(Net::HTTPSuccess)
110
+ # simplecov:disable
111
+ raise "Could not get manifest from #{manifest_url}: " \
112
+ "#{response.code} #{response.message}"
113
+ # simplecov:enable
114
+ end
115
+ manifest_json = response.body
110
116
 
111
117
  JSON.parse(manifest_json)
112
118
  end
113
119
 
120
+ def load_manifest_headers
121
+ { "Content-Type" => "application/json" }
122
+ end
123
+
114
124
  # TODO: feels like a command smell to pass manifests here... reconsider algorithm
115
125
  def filter_manifests_to_import
116
126
  return if to_import.nil? || to_import.empty?
@@ -185,9 +195,9 @@ module Foobara
185
195
  end
186
196
 
187
197
  def find_manifests_to_import
188
- # :nocov:
198
+ # simplecov:disable
189
199
  raise "subclass responsibility"
190
- # :nocov:
200
+ # simplecov:enable
191
201
  end
192
202
 
193
203
  def import_objects_from_manifests
@@ -204,9 +214,9 @@ module Foobara
204
214
  end
205
215
 
206
216
  def import_object_from_manifest
207
- # :nocov:
217
+ # simplecov:disable
208
218
  raise "subclass responsibility"
209
- # :nocov:
219
+ # simplecov:enable
210
220
  end
211
221
 
212
222
  def imported_objects
@@ -13,10 +13,30 @@ module Foobara
13
13
  auth_header :tuple,
14
14
  element_type_declarations: [:string, :duck],
15
15
  description: "A header name, header value/proc pair."
16
+ manifest_requires_auth :boolean, default: false
16
17
  end
17
18
 
18
19
  depends_on ImportDomain, ImportType, ImportError
19
20
 
21
+ def load_manifest_headers
22
+ if manifest_requires_auth
23
+ key = auth_header.first
24
+ value = auth_header.last
25
+
26
+ if value.is_a?(Proc)
27
+ value = if value.lambda? && value.arity == 0
28
+ value.call
29
+ else
30
+ value.call(self)
31
+ end
32
+ end
33
+
34
+ super.merge(key => value)
35
+ else
36
+ super
37
+ end
38
+ end
39
+
20
40
  def find_manifests_to_import
21
41
  root_manifest.commands
22
42
  end
@@ -74,7 +94,11 @@ module Foobara
74
94
  end
75
95
 
76
96
  def build_command
77
- url_base = root_manifest.metadata["url"].gsub(/\/manifest$/, "")
97
+ url_base = root_manifest.metadata["url"]
98
+ url_base = URI.parse(url_base)
99
+ url_base = URI::Generic.new(url_base.scheme, url_base.userinfo, url_base.host, url_base.port,
100
+ nil, nil, nil, nil, nil)
101
+ url_base = url_base.to_s
78
102
 
79
103
  domain = Namespace.global.foobara_lookup_domain!(
80
104
  manifest_to_import.domain.scoped_full_path,
@@ -44,9 +44,9 @@ module Foobara
44
44
  base_error = if base_error_name
45
45
  Foobara.foobara_root_namespace.foobara_lookup_error!(base_error_name)
46
46
  else
47
- # :nocov:
47
+ # simplecov:disable
48
48
  Foobara::Error
49
- # :nocov:
49
+ # simplecov:enable
50
50
  end
51
51
 
52
52
  Foobara::Error.subclass(
@@ -72,9 +72,9 @@ module Foobara
72
72
 
73
73
  model_base_class = declaration_data["model_base_class"]
74
74
  unless model_base_class == "Foobara::Entity"
75
- # :nocov:
75
+ # simplecov:disable
76
76
  raise "Expected model base class to be Foobara::Entity, but was #{model_base_class}"
77
- # :nocov:
77
+ # simplecov:enable
78
78
  end
79
79
 
80
80
  declaration_data["model_base_class"] = "Foobara::DetachedEntity"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foobara-remote-imports
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Miles Georgi
@@ -15,7 +15,7 @@ dependencies:
15
15
  requirements:
16
16
  - - ">="
17
17
  - !ruby/object:Gem::Version
18
- version: 0.1.1
18
+ version: 0.7.2
19
19
  - - "<"
20
20
  - !ruby/object:Gem::Version
21
21
  version: 2.0.0
@@ -25,7 +25,7 @@ dependencies:
25
25
  requirements:
26
26
  - - ">="
27
27
  - !ruby/object:Gem::Version
28
- version: 0.1.1
28
+ version: 0.7.2
29
29
  - - "<"
30
30
  - !ruby/object:Gem::Version
31
31
  version: 2.0.0
@@ -71,7 +71,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
71
71
  - !ruby/object:Gem::Version
72
72
  version: '0'
73
73
  requirements: []
74
- rubygems_version: 3.6.9
74
+ rubygems_version: 4.0.20
75
75
  specification_version: 4
76
76
  summary: Used to import commands/entities/whatever from another system into this one.
77
77
  test_files: []