etna 0.1.45 → 0.1.46

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
  SHA256:
3
- metadata.gz: 217bba41b5188f5d0e2349ba31dcb6f84477a3dcb36d04fd598977e814190ae8
4
- data.tar.gz: 758215abeb4ce074eb9dc6dd0313a3d271f2875f4071314cc7db30e9c4f19ad6
3
+ metadata.gz: bf5d46399bfc782d537d246013aeb1cc16bf3b56c8040f84baa92a36c5949fda
4
+ data.tar.gz: 32fabdd9b634b7a0026b8277a55635c16be52e30a60cd7568e8c68938d44d221
5
5
  SHA512:
6
- metadata.gz: 52f1098ebc84e4fef32e8230246c09415adaf010bc748231fbcb3062f66aa7b43d2a34e78c99f43d3186f4d856d2f80447da72f15ccd47b0445936c5658f4d77
7
- data.tar.gz: 9c3feccc37d002e3493052aee8eccf3c6fedcfbf79a7251eda1a68d1324f4e05908e4dfc5d7c20996be34c448c739706e0e6a38fbc5a582918ebf0e4ea7859fc
6
+ metadata.gz: f7b48496c8b36afe4aa6f08ef911913bfee6233b3ce50f17e723b38aef03f3aa2b7c9ee6beab94748fa42ff67bfcf68bb73145962ce102d79593055025c439d4
7
+ data.tar.gz: 4f074e556b455f2e6a2e36b30212b781316f198acfa99879059c803d2254ae701bd784adf515e1fb3427734a299546d42a182f08908645ff340ae5a9581dcb91
@@ -22,6 +22,7 @@ module Etna
22
22
  :new_attribute_name,
23
23
  :attribute_type,
24
24
  :link_model_name,
25
+ :link_attribute_name,
25
26
  :description,
26
27
  :display_name,
27
28
  :format_hint,
@@ -114,7 +115,10 @@ module Etna
114
115
  if attribute.attribute_type == Etna::Clients::Magma::AttributeType::IDENTIFIER
115
116
  # Identifiers for models whose parent link type ends up being a table are non configurable, so we don't
116
117
  # want to include them in the CSV.
117
- if models.find_reciprocal(model: model, link_attribute_name: model.template.parent)&.attribute_type == Etna::Clients::Magma::AttributeType::TABLE
118
+ if models.find_reciprocal(
119
+ model: model,
120
+ link_attribute_name: model.name,
121
+ link_model: models.model(model.template.parent))&.attribute_type == Etna::Clients::Magma::AttributeType::TABLE
118
122
  return
119
123
  end
120
124
  else
@@ -137,6 +141,7 @@ module Etna
137
141
  attribute_name: attribute.name,
138
142
  attribute_type: attribute.attribute_type,
139
143
  link_model_name: attribute.link_model_name,
144
+ link_attribute_name: attribute.link_attribute_name,
140
145
  reciprocal_link_type: models.find_reciprocal(model: model, attribute: attribute)&.attribute_type,
141
146
  description: attribute.description,
142
147
  display_name: attribute.display_name,
@@ -175,7 +180,7 @@ module Etna
175
180
  # This should line up with the attribute names _on the model itself_.
176
181
  ATTRIBUTE_ROW_ENTRIES = [
177
182
  :attribute_type,
178
- :link_model_name, :description,
183
+ :link_model_name, :link_attribute_name, :description,
179
184
  :display_name, :format_hint,
180
185
  :restricted, :read_only,
181
186
  :validation, :attribute_group,
@@ -223,6 +228,7 @@ module Etna
223
228
  end
224
229
  rescue ImportError => e
225
230
  validation_err_block.call(e.message)
231
+ raise e
226
232
  end
227
233
 
228
234
 
@@ -255,7 +261,11 @@ module Etna
255
261
  end
256
262
 
257
263
  row_processor.process(:parent_link_type, :model_name, :parent_model_name) do |parent_link_type, template|
258
- reciprocal = models.find_reciprocal(model_name: template.name, link_attribute_name: template.parent)
264
+ reciprocal = models.find_reciprocal(
265
+ model_name: template.name,
266
+ link_attribute_name: template.name,
267
+ link_model: models.model(template.parent)
268
+ )
259
269
  if reciprocal && reciprocal.attribute_type.to_s != parent_link_type
260
270
  raise ImportError.new("Model #{template.name} was provided multiple parent_link_types: #{reciprocal.attribute_type} and #{parent_link_type}")
261
271
  end
@@ -333,7 +343,7 @@ module Etna
333
343
  att.send(:"#{prop_name}=", value)
334
344
 
335
345
  if att.attribute_type && att.link_model_name
336
- if att.attribute_type == Etna::Clients::Magma::AttributeType::LINK && models.find_reciprocal(model_name: template.name, attribute: att).nil?
346
+ if att.attribute_type == Etna::Clients::Magma::AttributeType::LINK && models.find_reciprocal(model_name: template.name, attribute: att, link_attribute_name: att.link_attribute_name).nil?
337
347
  models.build_model(att.link_model_name).build_template.build_attributes.build_attribute(template.name).tap do |rec_att|
338
348
  rec_att.attribute_name = rec_att.name = template.name
339
349
  rec_att.display_name = prettify(template.name)
@@ -239,6 +239,9 @@ module Etna
239
239
  link_model: self.model(attribute&.link_model_name)
240
240
  )
241
241
  return nil if model.nil? || model.name.nil?
242
+
243
+ return link_model&.template&.attributes&.all&.find { |a| a.name == link_attribute_name } if link_attribute_name
244
+
242
245
  link_model&.template&.attributes&.all&.find { |a| a.link_model_name == model.name }
243
246
  end
244
247
 
@@ -457,7 +460,7 @@ module Etna
457
460
  def is_edited?(other)
458
461
  # Don't just override == in case need to do a full comparison.
459
462
  editable_attribute_names = Attribute::EDITABLE_ATTRIBUTE_ATTRIBUTES.map(&:to_s)
460
-
463
+
461
464
  self_editable = raw.slice(*editable_attribute_names)
462
465
  other_editable = other.raw.slice(*editable_attribute_names)
463
466
 
@@ -505,6 +508,14 @@ module Etna
505
508
  @raw['attribute_type'] = val
506
509
  end
507
510
 
511
+ def link_attribute_name
512
+ @raw['link_attribute_name']
513
+ end
514
+
515
+ def link_attribute_name=(val)
516
+ @raw['link_attribute_name'] = val
517
+ end
518
+
508
519
  def link_model_name
509
520
  @raw['link_model_name']
510
521
  end
@@ -113,7 +113,11 @@ module Etna
113
113
  end
114
114
 
115
115
  def parent_reciprocal_attribute
116
- @models.find_reciprocal(model: @model, link_attribute_name: @model.template.parent)
116
+ @models.find_reciprocal(
117
+ model: @model,
118
+ link_attribute_name: @model.name,
119
+ link_model: @models.model(@model.template.parent)
120
+ )
117
121
  end
118
122
 
119
123
  def name
@@ -131,7 +131,7 @@ module Etna
131
131
  unless attribute.attribute_type == AttributeType::PARENT
132
132
  if attribute.link_model_name
133
133
  ensure_model(attribute.link_model_name)
134
- ensure_model_link(model_name, attribute.link_model_name, attribute.attribute_name)
134
+ ensure_model_link(model_name, attribute.link_model_name, attribute.attribute_name, attribute.link_attribute_name)
135
135
  else
136
136
  ensure_model_attribute(model_name, attribute.attribute_name)
137
137
  end
@@ -144,26 +144,26 @@ module Etna
144
144
  end
145
145
  end
146
146
 
147
- def ensure_model_link(model_name, link_model_name, attribute_name)
147
+ def ensure_model_link(model_name, link_model_name, attribute_name, link_attribute_name)
148
148
  return unless (model = source_models.model(model_name))
149
149
  return unless (source_attribute = model.template.attributes.attribute(attribute_name))
150
150
 
151
151
  return unless (link_model = source_models.model(link_model_name))
152
- link_model_attributes = link_model.template.attributes
153
- reciprocal = link_model_attributes.all.find do |attr|
154
- attr.link_model_name == model_name
155
- end
152
+ return unless (reciprocal = link_model.template.attributes.attribute(link_attribute_name))
156
153
 
157
154
  target_model_name = target_of_source(model_name)
158
155
  target_link_model_name = target_of_source(link_model_name)
159
156
 
160
157
  target_attributes = target_models.model(target_model_name).template.attributes
161
158
  return if target_attributes.attribute_keys.include?(target_link_model_name)
159
+ return if target_attributes.attribute_keys.include?(reciprocal.attribute_name)
160
+
161
+ # skip non-links for circular references so they don't get added twice
162
+ return if link_model_name == model_name && reciprocal.attribute_type != 'link'
162
163
 
163
164
  add_link = AddLinkAction.new
164
165
  add_link.links << AddLinkDefinition.new(model_name: target_model_name, attribute_name: attribute_name, type: source_attribute.attribute_type)
165
166
  add_link.links << AddLinkDefinition.new(model_name: target_link_model_name, attribute_name: reciprocal.attribute_name, type: reciprocal.attribute_type)
166
-
167
167
  queue_update(add_link)
168
168
  end
169
169
 
@@ -6,6 +6,8 @@ module Etna
6
6
  module Clients
7
7
  class Metis
8
8
  class SyncMetisDataWorkflow < Struct.new(:metis_client, :filesystem, :project_name, :bucket_name, :logger, keyword_init: true)
9
+ DOWNLOAD_REGEX = /^https:\/\/[^\/]*\/(?<project_name>.*)\/download\/(?<bucket_name>.*)\/(?<file_path>[^\?]*).*$/
10
+
9
11
  def copy_directory(src, dest, root = dest)
10
12
  response = metis_client.list_folder(ListFolderRequest.new(project_name: project_name, bucket_name: bucket_name, folder_path: src))
11
13
 
@@ -20,6 +22,27 @@ module Etna
20
22
  end
21
23
 
22
24
  def copy_file(dest:, url:, stub: false)
25
+ # This does not work due to the magma bucket's restrictions, but if it did work, it'd be super sweet.
26
+ # url_match = DOWNLOAD_REGEX.match(url)
27
+ #
28
+ # if filesystem.instance_of?(Etna::Filesystem::Metis) && !url_match.nil?
29
+ # bucket_name = url_match[:bucket_name]
30
+ # project_name = url_match[:project_name]
31
+ # file_path = url_match[:file_path]
32
+ #
33
+ # metis_client.copy_files(
34
+ # Etna::Clients::Metis::CopyFilesRequest.new(
35
+ # project_name: project_name,
36
+ # revisions: [
37
+ # Etna::Clients::Metis::CopyRevision.new(
38
+ # source: "metis://#{project_name}/#{bucket_name}/#{file_path}",
39
+ # dest: "metis://#{filesystem.project_name}/#{filesystem.bucket_name}#{dest}",
40
+ # )
41
+ # ]
42
+ # )
43
+ # )
44
+ # end
45
+
23
46
  metadata = metis_client.file_metadata(url)
24
47
  size = metadata[:size]
25
48
 
@@ -251,6 +251,8 @@ module Etna
251
251
  end
252
252
 
253
253
  class Metis < Filesystem
254
+ attr_reader :project_name, :bucket_name
255
+
254
256
  def initialize(metis_client:, project_name:, bucket_name:, root: '/', uuid: SecureRandom.uuid)
255
257
  @metis_client = metis_client
256
258
  @project_name = project_name
data/lib/etna/route.rb CHANGED
@@ -38,11 +38,11 @@ module Etna
38
38
 
39
39
  UNSAFE=/[^\-_.!~*'()a-zA-Z\d;\/?:@&=+$,]/
40
40
 
41
- def self.path(route, params=nil)
41
+ def self.path(route, params=nil, &block)
42
42
  if params
43
43
  PARAM_TYPES.reduce(route) do |path,pat|
44
44
  path.gsub(pat) do
45
- params[$1.to_sym].split('/').map { |c| URI.encode_www_form_component(c) }.join('/')
45
+ params[$1.to_sym].split('/').map { |c| block_given? ? yield(c) : URI.encode_www_form_component(c) }.join('/')
46
46
  end
47
47
  end
48
48
  else
@@ -50,8 +50,8 @@ module Etna
50
50
  end
51
51
  end
52
52
 
53
- def path(params=nil)
54
- self.class.path(@route, params)
53
+ def path(params=nil, &block)
54
+ self.class.path(@route, params, &block)
55
55
  end
56
56
 
57
57
  def parts
data/lib/etna/server.rb CHANGED
@@ -3,7 +3,19 @@ module Etna
3
3
  class Server
4
4
  class << self
5
5
  def route(method, path, options={}, &block)
6
- @routes ||= []
6
+ # For healthchecks, set up servers
7
+ # with an OPTIONS route on /, with noauth
8
+ @routes ||= [
9
+ Etna::Route.new(
10
+ 'OPTIONS',
11
+ '/',
12
+ {
13
+ auth: {
14
+ noauth: true
15
+ }
16
+ }
17
+ )
18
+ ]
7
19
 
8
20
  @routes << Etna::Route.new(
9
21
  method,
@@ -54,6 +54,9 @@ module Etna
54
54
 
55
55
  return false unless token
56
56
 
57
+ # Useful for testing certain behavior
58
+ params = request.env["rack.request.params"]
59
+
57
60
  # Here we simply base64-encode our user hash and pass it through
58
61
  # In order to behave more like "real" tokens, we expect the user hash to be
59
62
  # in index 1 after splitting by ".".
@@ -63,7 +66,7 @@ module Etna
63
66
  request.env['etna.user'] = Etna::User.new(
64
67
  update_payload(payload, token, request),
65
68
  token
66
- )
69
+ ) unless !!params[:do_not_set_user]
67
70
  end
68
71
 
69
72
  def approve_hmac(request)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: etna
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.45
4
+ version: 0.1.46
5
5
  platform: ruby
6
6
  authors:
7
7
  - Saurabh Asthana
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-06-29 00:00:00.000000000 Z
11
+ date: 2022-08-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack