data_porter 2.9.0 → 2.9.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 +4 -4
- data/CHANGELOG.md +7 -0
- data/app/views/data_porter/imports/show.html.erb +8 -2
- data/lib/data_porter/column_transformer.rb +2 -4
- data/lib/data_porter/components/preview/table.rb +1 -1
- data/lib/data_porter/orchestrator/record_builder.rb +1 -1
- data/lib/data_porter/record_revalidator.rb +3 -2
- data/lib/data_porter/record_updater.rb +1 -4
- data/lib/data_porter/record_validator.rb +1 -1
- data/lib/data_porter/sources/api.rb +1 -1
- data/lib/data_porter/sources/base.rb +3 -3
- data/lib/data_porter/sources/json.rb +1 -1
- data/lib/data_porter/store_models/import_record.rb +6 -2
- data/lib/data_porter/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: a04398e443f704b747eff3f3b585e05f839cabd2f92ecf7871874811a079f15c
|
|
4
|
+
data.tar.gz: ade55b5a550d628acaf5f8d0e8cc0652fabcb2c7505b59bd14367e7ab56557cf
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 9647861c80be730b057a74854c91569bbc2e6e7d922cff5bffd28d7d4268f2a55e83bc08247b4ea93b2c9991e1ac2da1da3f4e71970b71225d9c08e5440ca7d6
|
|
7
|
+
data.tar.gz: b96e83067441054e1a0140c7b826043984d7fcc0d6c7b7f7ee7fe2a09d416365670a7bce7ed1eeb703d6949ee9dd24d7c791b06978d12d8c52929fa17b4553c6
|
data/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [2.9.1] - 2026-03-11
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
|
|
14
|
+
- **Record data keys normalized to strings** -- `record.data` now uses `HashWithIndifferentAccess`, so both `record.data["key"]` and `record.data[:key]` work consistently. Sources, RecordBuilder, ColumnTransformer, and RecordValidator all produce string keys. No breaking change for existing Targets
|
|
15
|
+
- **Delete on mapping and preview** -- Imports in `mapping` and `previewing` status now show a Delete button with confirmation. Previously only `completed` and `failed` imports could be deleted. The preview Cancel button (which set status to `failed` without deleting) is replaced by Delete
|
|
16
|
+
|
|
10
17
|
## [2.9.0] - 2026-03-11
|
|
11
18
|
|
|
12
19
|
### Added
|
|
@@ -42,6 +42,11 @@
|
|
|
42
42
|
templates: @templates,
|
|
43
43
|
default_mapping: @default_mapping
|
|
44
44
|
).call %>
|
|
45
|
+
<div class="dp-actions">
|
|
46
|
+
<%= button_to t("data_porter.imports.delete"), import_path(@import),
|
|
47
|
+
method: :delete, class: "dp-btn dp-btn--danger",
|
|
48
|
+
data: { turbo_confirm: t("data_porter.imports.delete_confirm") } %>
|
|
49
|
+
</div>
|
|
45
50
|
<% end %>
|
|
46
51
|
|
|
47
52
|
<% if @import.previewing? %>
|
|
@@ -71,8 +76,9 @@
|
|
|
71
76
|
<%= button_to t("data_porter.imports.back_to_mapping"), back_to_mapping_import_path(@import),
|
|
72
77
|
method: :post, class: "dp-btn dp-btn--secondary" %>
|
|
73
78
|
<% end %>
|
|
74
|
-
<%= button_to t("data_porter.imports.
|
|
75
|
-
method: :
|
|
79
|
+
<%= button_to t("data_porter.imports.delete"), import_path(@import),
|
|
80
|
+
method: :delete, class: "dp-btn dp-btn--danger",
|
|
81
|
+
data: { turbo_confirm: t("data_porter.imports.delete_confirm") } %>
|
|
76
82
|
</div>
|
|
77
83
|
<% end %>
|
|
78
84
|
|
|
@@ -24,9 +24,10 @@ module DataPorter
|
|
|
24
24
|
def normalize_keys(record)
|
|
25
25
|
@columns.each do |col|
|
|
26
26
|
string_key = col.name.to_s
|
|
27
|
-
next
|
|
27
|
+
next if record.data.key?(string_key)
|
|
28
|
+
next unless record.data.key?(col.name)
|
|
28
29
|
|
|
29
|
-
record.data[
|
|
30
|
+
record.data[string_key] = record.data.delete(col.name)
|
|
30
31
|
end
|
|
31
32
|
end
|
|
32
33
|
end
|
|
@@ -32,18 +32,18 @@ module DataPorter
|
|
|
32
32
|
|
|
33
33
|
def user_map(row)
|
|
34
34
|
user_mapping.each_with_object({}) do |(header, column), hash|
|
|
35
|
-
hash[column.
|
|
35
|
+
hash[column.to_s] = row[header]
|
|
36
36
|
end
|
|
37
37
|
end
|
|
38
38
|
|
|
39
39
|
def explicit_map(row, mappings)
|
|
40
40
|
mappings.each_with_object({}) do |(header, column), hash|
|
|
41
|
-
hash[column] = row[header]
|
|
41
|
+
hash[column.to_s] = row[header]
|
|
42
42
|
end
|
|
43
43
|
end
|
|
44
44
|
|
|
45
45
|
def auto_map(row)
|
|
46
|
-
row.to_h.transform_keys { |k| k.parameterize(separator: "_")
|
|
46
|
+
row.to_h.transform_keys { |k| k.parameterize(separator: "_") }
|
|
47
47
|
end
|
|
48
48
|
|
|
49
49
|
def header_row_index
|
|
@@ -10,8 +10,12 @@ module DataPorter
|
|
|
10
10
|
|
|
11
11
|
attribute :line_number, :integer
|
|
12
12
|
attribute :status, :string, default: "pending"
|
|
13
|
-
attribute :data, default: -> {
|
|
13
|
+
attribute :data, default: -> { HashWithIndifferentAccess.new }
|
|
14
14
|
attribute :errors_list, Error.to_array_type, default: -> { [] }
|
|
15
|
+
|
|
16
|
+
def data=(value)
|
|
17
|
+
super(value.is_a?(Hash) ? value.with_indifferent_access : value)
|
|
18
|
+
end
|
|
15
19
|
attribute :warnings, Error.to_array_type, default: -> { [] }
|
|
16
20
|
attribute :target_id, :integer
|
|
17
21
|
attribute :dry_run_passed, :boolean, default: false
|
|
@@ -29,7 +33,7 @@ module DataPorter
|
|
|
29
33
|
end
|
|
30
34
|
|
|
31
35
|
def attributes
|
|
32
|
-
data.
|
|
36
|
+
data.stringify_keys.compact.with_indifferent_access
|
|
33
37
|
end
|
|
34
38
|
|
|
35
39
|
def determine_status!
|
data/lib/data_porter/version.rb
CHANGED