data_porter 0.1.0 → 0.4.0
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 +62 -1
- data/README.md +63 -386
- data/ROADMAP.md +89 -0
- data/app/assets/javascripts/data_porter/stimulus.min.js +2 -0
- data/app/assets/javascripts/data_porter/turbo.min.js +29 -0
- data/app/assets/stylesheets/data_porter/alerts.css +25 -0
- data/app/assets/stylesheets/data_porter/application.css +12 -646
- data/app/assets/stylesheets/data_porter/badges.css +73 -0
- data/app/assets/stylesheets/data_porter/base.css +56 -0
- data/app/assets/stylesheets/data_porter/cards.css +60 -0
- data/app/assets/stylesheets/data_porter/layout.css +128 -0
- data/app/assets/stylesheets/data_porter/mapping.css +79 -0
- data/app/assets/stylesheets/data_porter/modal.css +49 -0
- data/app/assets/stylesheets/data_porter/preview.css +24 -0
- data/app/assets/stylesheets/data_porter/progress.css +37 -0
- data/app/assets/stylesheets/data_porter/table.css +45 -0
- data/app/controllers/data_porter/imports_controller.rb +74 -10
- data/app/controllers/data_porter/mapping_templates_controller.rb +85 -0
- data/app/javascript/data_porter/mapping_controller.js +86 -0
- data/app/javascript/data_porter/progress_controller.js +1 -1
- data/app/javascript/data_porter/template_form_controller.js +46 -0
- data/app/jobs/data_porter/extract_headers_job.rb +12 -0
- data/app/models/data_porter/data_import.rb +8 -2
- data/app/models/data_porter/mapping_template.rb +15 -0
- data/app/views/data_porter/imports/index.html.erb +9 -8
- data/app/views/data_porter/imports/new.html.erb +10 -4
- data/app/views/data_porter/imports/show.html.erb +41 -13
- data/app/views/data_porter/mapping_templates/_form.html.erb +40 -0
- data/app/views/data_porter/mapping_templates/edit.html.erb +11 -0
- data/app/views/data_porter/mapping_templates/index.html.erb +42 -0
- data/app/views/data_porter/mapping_templates/new.html.erb +11 -0
- data/app/views/layouts/data_porter/application.html.erb +162 -0
- data/config/routes.rb +3 -0
- data/docs/CONFIGURATION.md +81 -0
- data/docs/MAPPING.md +44 -0
- data/docs/SOURCES.md +94 -0
- data/docs/TARGETS.md +176 -0
- data/docs/screenshots/mapping.jpg +0 -0
- data/lib/data_porter/components/mapping/column_row.rb +52 -0
- data/lib/data_porter/components/mapping/form.rb +127 -0
- data/lib/data_porter/components/mapping/template_select.rb +35 -0
- data/lib/data_porter/components/preview/results_summary.rb +21 -0
- data/lib/data_porter/components/preview/summary_cards.rb +32 -0
- data/lib/data_porter/components/preview/table.rb +56 -0
- data/lib/data_porter/components/progress/bar.rb +35 -0
- data/lib/data_porter/components/shared/failure_alert.rb +22 -0
- data/lib/data_porter/components/shared/status_badge.rb +18 -0
- data/lib/data_porter/components.rb +9 -6
- data/lib/data_porter/configuration.rb +1 -1
- data/lib/data_porter/engine.rb +7 -1
- data/lib/data_porter/orchestrator.rb +21 -1
- data/lib/data_porter/sources/base.rb +18 -3
- data/lib/data_porter/sources/csv.rb +5 -0
- data/lib/data_porter/sources/xlsx.rb +76 -0
- data/lib/data_porter/sources.rb +3 -1
- data/lib/data_porter/version.rb +1 -1
- data/lib/generators/data_porter/install/install_generator.rb +4 -0
- data/lib/generators/data_porter/install/templates/create_data_porter_mapping_templates.rb.erb +16 -0
- data/lib/generators/data_porter/install/templates/initializer.rb +1 -1
- metadata +72 -135
- data/.claude/commands/blog-status.md +0 -10
- data/.claude/commands/blog.md +0 -109
- data/.claude/commands/task-done.md +0 -27
- data/.claude/commands/tm/add-dependency.md +0 -58
- data/.claude/commands/tm/add-subtask.md +0 -79
- data/.claude/commands/tm/add-task.md +0 -81
- data/.claude/commands/tm/analyze-complexity.md +0 -124
- data/.claude/commands/tm/analyze-project.md +0 -100
- data/.claude/commands/tm/auto-implement-tasks.md +0 -100
- data/.claude/commands/tm/command-pipeline.md +0 -80
- data/.claude/commands/tm/complexity-report.md +0 -120
- data/.claude/commands/tm/convert-task-to-subtask.md +0 -74
- data/.claude/commands/tm/expand-all-tasks.md +0 -52
- data/.claude/commands/tm/expand-task.md +0 -52
- data/.claude/commands/tm/fix-dependencies.md +0 -82
- data/.claude/commands/tm/help.md +0 -101
- data/.claude/commands/tm/init-project-quick.md +0 -49
- data/.claude/commands/tm/init-project.md +0 -53
- data/.claude/commands/tm/install-taskmaster.md +0 -118
- data/.claude/commands/tm/learn.md +0 -106
- data/.claude/commands/tm/list-tasks-by-status.md +0 -42
- data/.claude/commands/tm/list-tasks-with-subtasks.md +0 -30
- data/.claude/commands/tm/list-tasks.md +0 -46
- data/.claude/commands/tm/next-task.md +0 -69
- data/.claude/commands/tm/parse-prd-with-research.md +0 -51
- data/.claude/commands/tm/parse-prd.md +0 -52
- data/.claude/commands/tm/project-status.md +0 -67
- data/.claude/commands/tm/quick-install-taskmaster.md +0 -23
- data/.claude/commands/tm/remove-all-subtasks.md +0 -94
- data/.claude/commands/tm/remove-dependency.md +0 -65
- data/.claude/commands/tm/remove-subtask.md +0 -87
- data/.claude/commands/tm/remove-subtasks.md +0 -89
- data/.claude/commands/tm/remove-task.md +0 -110
- data/.claude/commands/tm/setup-models.md +0 -52
- data/.claude/commands/tm/show-task.md +0 -85
- data/.claude/commands/tm/smart-workflow.md +0 -58
- data/.claude/commands/tm/sync-readme.md +0 -120
- data/.claude/commands/tm/tm-main.md +0 -147
- data/.claude/commands/tm/to-cancelled.md +0 -58
- data/.claude/commands/tm/to-deferred.md +0 -50
- data/.claude/commands/tm/to-done.md +0 -47
- data/.claude/commands/tm/to-in-progress.md +0 -39
- data/.claude/commands/tm/to-pending.md +0 -35
- data/.claude/commands/tm/to-review.md +0 -43
- data/.claude/commands/tm/update-single-task.md +0 -122
- data/.claude/commands/tm/update-task.md +0 -75
- data/.claude/commands/tm/update-tasks-from-id.md +0 -111
- data/.claude/commands/tm/validate-dependencies.md +0 -72
- data/.claude/commands/tm/view-models.md +0 -52
- data/.env.example +0 -12
- data/.mcp.json +0 -24
- data/.taskmaster/CLAUDE.md +0 -435
- data/.taskmaster/config.json +0 -44
- data/.taskmaster/docs/prd.txt +0 -2044
- data/.taskmaster/state.json +0 -6
- data/.taskmaster/tasks/task_001.md +0 -19
- data/.taskmaster/tasks/task_002.md +0 -19
- data/.taskmaster/tasks/task_003.md +0 -19
- data/.taskmaster/tasks/task_004.md +0 -19
- data/.taskmaster/tasks/task_005.md +0 -19
- data/.taskmaster/tasks/task_006.md +0 -19
- data/.taskmaster/tasks/task_007.md +0 -19
- data/.taskmaster/tasks/task_008.md +0 -19
- data/.taskmaster/tasks/task_009.md +0 -19
- data/.taskmaster/tasks/task_010.md +0 -19
- data/.taskmaster/tasks/task_011.md +0 -19
- data/.taskmaster/tasks/task_012.md +0 -19
- data/.taskmaster/tasks/task_013.md +0 -19
- data/.taskmaster/tasks/task_014.md +0 -19
- data/.taskmaster/tasks/task_015.md +0 -19
- data/.taskmaster/tasks/task_016.md +0 -19
- data/.taskmaster/tasks/task_017.md +0 -19
- data/.taskmaster/tasks/task_018.md +0 -19
- data/.taskmaster/tasks/task_019.md +0 -19
- data/.taskmaster/tasks/task_020.md +0 -19
- data/.taskmaster/tasks/tasks.json +0 -299
- data/.taskmaster/templates/example_prd.txt +0 -47
- data/.taskmaster/templates/example_prd_rpg.txt +0 -511
- data/CLAUDE.md +0 -65
- data/config/database.yml +0 -3
- data/docs/SPEC.md +0 -2012
- data/docs/UI.md +0 -32
- data/docs/blog/001-why-build-a-data-import-engine.md +0 -166
- data/docs/blog/002-scaffolding-a-rails-engine.md +0 -188
- data/docs/blog/003-configuration-dsl.md +0 -222
- data/docs/blog/004-store-model-jsonb.md +0 -237
- data/docs/blog/005-target-dsl.md +0 -284
- data/docs/blog/006-parsing-csv-sources.md +0 -300
- data/docs/blog/007-orchestrator.md +0 -247
- data/docs/blog/008-actioncable-stimulus.md +0 -376
- data/docs/blog/009-phlex-ui-components.md +0 -446
- data/docs/blog/010-controllers-routing.md +0 -374
- data/docs/blog/011-generators.md +0 -364
- data/docs/blog/012-json-api-sources.md +0 -323
- data/docs/blog/013-testing-rails-engine.md +0 -618
- data/docs/blog/014-dry-run.md +0 -307
- data/docs/blog/015-publishing-retro.md +0 -264
- data/docs/blog/016-erb-view-templates.md +0 -431
- data/docs/blog/017-showcase-final-retro.md +0 -220
- data/docs/blog/BACKLOG.md +0 -8
- data/docs/blog/SERIES.md +0 -154
- data/lib/data_porter/components/failure_alert.rb +0 -20
- data/lib/data_porter/components/preview_table.rb +0 -54
- data/lib/data_porter/components/progress_bar.rb +0 -33
- data/lib/data_porter/components/results_summary.rb +0 -19
- data/lib/data_porter/components/status_badge.rb +0 -16
- data/lib/data_porter/components/summary_cards.rb +0 -30
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: data_porter
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.4.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Seryl Lounis
|
|
@@ -10,217 +10,153 @@ cert_chain: []
|
|
|
10
10
|
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
11
|
dependencies:
|
|
12
12
|
- !ruby/object:Gem::Dependency
|
|
13
|
-
name:
|
|
13
|
+
name: creek
|
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|
|
15
15
|
requirements:
|
|
16
|
-
- - "
|
|
16
|
+
- - "~>"
|
|
17
17
|
- !ruby/object:Gem::Version
|
|
18
|
-
version: '
|
|
18
|
+
version: '2.6'
|
|
19
19
|
type: :runtime
|
|
20
20
|
prerelease: false
|
|
21
21
|
version_requirements: !ruby/object:Gem::Requirement
|
|
22
22
|
requirements:
|
|
23
|
-
- - "
|
|
23
|
+
- - "~>"
|
|
24
24
|
- !ruby/object:Gem::Version
|
|
25
|
-
version: '
|
|
25
|
+
version: '2.6'
|
|
26
26
|
- !ruby/object:Gem::Dependency
|
|
27
|
-
name:
|
|
27
|
+
name: csv
|
|
28
28
|
requirement: !ruby/object:Gem::Requirement
|
|
29
29
|
requirements:
|
|
30
|
-
- - "
|
|
30
|
+
- - "~>"
|
|
31
31
|
- !ruby/object:Gem::Version
|
|
32
|
-
version: '
|
|
32
|
+
version: '3.0'
|
|
33
33
|
type: :runtime
|
|
34
34
|
prerelease: false
|
|
35
35
|
version_requirements: !ruby/object:Gem::Requirement
|
|
36
36
|
requirements:
|
|
37
|
-
- - "
|
|
37
|
+
- - "~>"
|
|
38
38
|
- !ruby/object:Gem::Version
|
|
39
|
-
version: '
|
|
39
|
+
version: '3.0'
|
|
40
40
|
- !ruby/object:Gem::Dependency
|
|
41
|
-
name:
|
|
41
|
+
name: phlex
|
|
42
42
|
requirement: !ruby/object:Gem::Requirement
|
|
43
43
|
requirements:
|
|
44
|
-
- - "
|
|
44
|
+
- - "~>"
|
|
45
45
|
- !ruby/object:Gem::Version
|
|
46
|
-
version: '
|
|
46
|
+
version: '2.0'
|
|
47
47
|
type: :runtime
|
|
48
48
|
prerelease: false
|
|
49
49
|
version_requirements: !ruby/object:Gem::Requirement
|
|
50
50
|
requirements:
|
|
51
|
-
- - "
|
|
51
|
+
- - "~>"
|
|
52
52
|
- !ruby/object:Gem::Version
|
|
53
|
-
version: '
|
|
53
|
+
version: '2.0'
|
|
54
54
|
- !ruby/object:Gem::Dependency
|
|
55
|
-
name:
|
|
55
|
+
name: rails
|
|
56
56
|
requirement: !ruby/object:Gem::Requirement
|
|
57
57
|
requirements:
|
|
58
58
|
- - ">="
|
|
59
59
|
- !ruby/object:Gem::Version
|
|
60
|
-
version: '
|
|
60
|
+
version: '7.0'
|
|
61
|
+
- - "<"
|
|
62
|
+
- !ruby/object:Gem::Version
|
|
63
|
+
version: '9.0'
|
|
61
64
|
type: :runtime
|
|
62
65
|
prerelease: false
|
|
63
66
|
version_requirements: !ruby/object:Gem::Requirement
|
|
64
67
|
requirements:
|
|
65
68
|
- - ">="
|
|
66
69
|
- !ruby/object:Gem::Version
|
|
67
|
-
version: '
|
|
70
|
+
version: '7.0'
|
|
71
|
+
- - "<"
|
|
72
|
+
- !ruby/object:Gem::Version
|
|
73
|
+
version: '9.0'
|
|
68
74
|
- !ruby/object:Gem::Dependency
|
|
69
|
-
name:
|
|
75
|
+
name: store_model
|
|
70
76
|
requirement: !ruby/object:Gem::Requirement
|
|
71
77
|
requirements:
|
|
72
|
-
- - "
|
|
78
|
+
- - "~>"
|
|
73
79
|
- !ruby/object:Gem::Version
|
|
74
|
-
version: '
|
|
80
|
+
version: '4.0'
|
|
75
81
|
type: :runtime
|
|
76
82
|
prerelease: false
|
|
77
83
|
version_requirements: !ruby/object:Gem::Requirement
|
|
78
84
|
requirements:
|
|
79
|
-
- - "
|
|
85
|
+
- - "~>"
|
|
80
86
|
- !ruby/object:Gem::Version
|
|
81
|
-
version: '
|
|
87
|
+
version: '4.0'
|
|
82
88
|
description: 'A mountable Rails engine providing a complete data import workflow:
|
|
83
|
-
upload/configure, preview with validation, and import. Supports CSV, JSON,
|
|
84
|
-
sources with a simple DSL for defining import targets.'
|
|
89
|
+
upload/configure, preview with validation, and import. Supports CSV, JSON, XLSX,
|
|
90
|
+
and API sources with a simple DSL for defining import targets.'
|
|
85
91
|
email:
|
|
86
92
|
- seryllounis@outlook.fr
|
|
87
93
|
executables: []
|
|
88
94
|
extensions: []
|
|
89
95
|
extra_rdoc_files: []
|
|
90
96
|
files:
|
|
91
|
-
- ".claude/commands/blog-status.md"
|
|
92
|
-
- ".claude/commands/blog.md"
|
|
93
|
-
- ".claude/commands/task-done.md"
|
|
94
|
-
- ".claude/commands/tm/add-dependency.md"
|
|
95
|
-
- ".claude/commands/tm/add-subtask.md"
|
|
96
|
-
- ".claude/commands/tm/add-task.md"
|
|
97
|
-
- ".claude/commands/tm/analyze-complexity.md"
|
|
98
|
-
- ".claude/commands/tm/analyze-project.md"
|
|
99
|
-
- ".claude/commands/tm/auto-implement-tasks.md"
|
|
100
|
-
- ".claude/commands/tm/command-pipeline.md"
|
|
101
|
-
- ".claude/commands/tm/complexity-report.md"
|
|
102
|
-
- ".claude/commands/tm/convert-task-to-subtask.md"
|
|
103
|
-
- ".claude/commands/tm/expand-all-tasks.md"
|
|
104
|
-
- ".claude/commands/tm/expand-task.md"
|
|
105
|
-
- ".claude/commands/tm/fix-dependencies.md"
|
|
106
|
-
- ".claude/commands/tm/help.md"
|
|
107
|
-
- ".claude/commands/tm/init-project-quick.md"
|
|
108
|
-
- ".claude/commands/tm/init-project.md"
|
|
109
|
-
- ".claude/commands/tm/install-taskmaster.md"
|
|
110
|
-
- ".claude/commands/tm/learn.md"
|
|
111
|
-
- ".claude/commands/tm/list-tasks-by-status.md"
|
|
112
|
-
- ".claude/commands/tm/list-tasks-with-subtasks.md"
|
|
113
|
-
- ".claude/commands/tm/list-tasks.md"
|
|
114
|
-
- ".claude/commands/tm/next-task.md"
|
|
115
|
-
- ".claude/commands/tm/parse-prd-with-research.md"
|
|
116
|
-
- ".claude/commands/tm/parse-prd.md"
|
|
117
|
-
- ".claude/commands/tm/project-status.md"
|
|
118
|
-
- ".claude/commands/tm/quick-install-taskmaster.md"
|
|
119
|
-
- ".claude/commands/tm/remove-all-subtasks.md"
|
|
120
|
-
- ".claude/commands/tm/remove-dependency.md"
|
|
121
|
-
- ".claude/commands/tm/remove-subtask.md"
|
|
122
|
-
- ".claude/commands/tm/remove-subtasks.md"
|
|
123
|
-
- ".claude/commands/tm/remove-task.md"
|
|
124
|
-
- ".claude/commands/tm/setup-models.md"
|
|
125
|
-
- ".claude/commands/tm/show-task.md"
|
|
126
|
-
- ".claude/commands/tm/smart-workflow.md"
|
|
127
|
-
- ".claude/commands/tm/sync-readme.md"
|
|
128
|
-
- ".claude/commands/tm/tm-main.md"
|
|
129
|
-
- ".claude/commands/tm/to-cancelled.md"
|
|
130
|
-
- ".claude/commands/tm/to-deferred.md"
|
|
131
|
-
- ".claude/commands/tm/to-done.md"
|
|
132
|
-
- ".claude/commands/tm/to-in-progress.md"
|
|
133
|
-
- ".claude/commands/tm/to-pending.md"
|
|
134
|
-
- ".claude/commands/tm/to-review.md"
|
|
135
|
-
- ".claude/commands/tm/update-single-task.md"
|
|
136
|
-
- ".claude/commands/tm/update-task.md"
|
|
137
|
-
- ".claude/commands/tm/update-tasks-from-id.md"
|
|
138
|
-
- ".claude/commands/tm/validate-dependencies.md"
|
|
139
|
-
- ".claude/commands/tm/view-models.md"
|
|
140
|
-
- ".env.example"
|
|
141
|
-
- ".mcp.json"
|
|
142
|
-
- ".taskmaster/CLAUDE.md"
|
|
143
|
-
- ".taskmaster/config.json"
|
|
144
|
-
- ".taskmaster/docs/prd.txt"
|
|
145
|
-
- ".taskmaster/state.json"
|
|
146
|
-
- ".taskmaster/tasks/task_001.md"
|
|
147
|
-
- ".taskmaster/tasks/task_002.md"
|
|
148
|
-
- ".taskmaster/tasks/task_003.md"
|
|
149
|
-
- ".taskmaster/tasks/task_004.md"
|
|
150
|
-
- ".taskmaster/tasks/task_005.md"
|
|
151
|
-
- ".taskmaster/tasks/task_006.md"
|
|
152
|
-
- ".taskmaster/tasks/task_007.md"
|
|
153
|
-
- ".taskmaster/tasks/task_008.md"
|
|
154
|
-
- ".taskmaster/tasks/task_009.md"
|
|
155
|
-
- ".taskmaster/tasks/task_010.md"
|
|
156
|
-
- ".taskmaster/tasks/task_011.md"
|
|
157
|
-
- ".taskmaster/tasks/task_012.md"
|
|
158
|
-
- ".taskmaster/tasks/task_013.md"
|
|
159
|
-
- ".taskmaster/tasks/task_014.md"
|
|
160
|
-
- ".taskmaster/tasks/task_015.md"
|
|
161
|
-
- ".taskmaster/tasks/task_016.md"
|
|
162
|
-
- ".taskmaster/tasks/task_017.md"
|
|
163
|
-
- ".taskmaster/tasks/task_018.md"
|
|
164
|
-
- ".taskmaster/tasks/task_019.md"
|
|
165
|
-
- ".taskmaster/tasks/task_020.md"
|
|
166
|
-
- ".taskmaster/tasks/tasks.json"
|
|
167
|
-
- ".taskmaster/templates/example_prd.txt"
|
|
168
|
-
- ".taskmaster/templates/example_prd_rpg.txt"
|
|
169
97
|
- CHANGELOG.md
|
|
170
|
-
- CLAUDE.md
|
|
171
98
|
- CODE_OF_CONDUCT.md
|
|
172
99
|
- CONTRIBUTING.md
|
|
173
100
|
- LICENSE
|
|
174
101
|
- README.md
|
|
102
|
+
- ROADMAP.md
|
|
175
103
|
- Rakefile
|
|
104
|
+
- app/assets/javascripts/data_porter/stimulus.min.js
|
|
105
|
+
- app/assets/javascripts/data_porter/turbo.min.js
|
|
106
|
+
- app/assets/stylesheets/data_porter/alerts.css
|
|
176
107
|
- app/assets/stylesheets/data_porter/application.css
|
|
108
|
+
- app/assets/stylesheets/data_porter/badges.css
|
|
109
|
+
- app/assets/stylesheets/data_porter/base.css
|
|
110
|
+
- app/assets/stylesheets/data_porter/cards.css
|
|
111
|
+
- app/assets/stylesheets/data_porter/layout.css
|
|
112
|
+
- app/assets/stylesheets/data_porter/mapping.css
|
|
113
|
+
- app/assets/stylesheets/data_porter/modal.css
|
|
114
|
+
- app/assets/stylesheets/data_porter/preview.css
|
|
115
|
+
- app/assets/stylesheets/data_porter/progress.css
|
|
116
|
+
- app/assets/stylesheets/data_porter/table.css
|
|
177
117
|
- app/channels/data_porter/import_channel.rb
|
|
178
118
|
- app/controllers/data_porter/imports_controller.rb
|
|
119
|
+
- app/controllers/data_porter/mapping_templates_controller.rb
|
|
120
|
+
- app/javascript/data_porter/mapping_controller.js
|
|
179
121
|
- app/javascript/data_porter/progress_controller.js
|
|
122
|
+
- app/javascript/data_porter/template_form_controller.js
|
|
180
123
|
- app/jobs/data_porter/dry_run_job.rb
|
|
124
|
+
- app/jobs/data_porter/extract_headers_job.rb
|
|
181
125
|
- app/jobs/data_porter/import_job.rb
|
|
182
126
|
- app/jobs/data_porter/parse_job.rb
|
|
183
127
|
- app/models/data_porter/data_import.rb
|
|
128
|
+
- app/models/data_porter/mapping_template.rb
|
|
184
129
|
- app/views/data_porter/imports/index.html.erb
|
|
185
130
|
- app/views/data_porter/imports/new.html.erb
|
|
186
131
|
- app/views/data_porter/imports/show.html.erb
|
|
187
|
-
-
|
|
132
|
+
- app/views/data_porter/mapping_templates/_form.html.erb
|
|
133
|
+
- app/views/data_porter/mapping_templates/edit.html.erb
|
|
134
|
+
- app/views/data_porter/mapping_templates/index.html.erb
|
|
135
|
+
- app/views/data_porter/mapping_templates/new.html.erb
|
|
136
|
+
- app/views/layouts/data_porter/application.html.erb
|
|
188
137
|
- config/routes.rb
|
|
189
|
-
- docs/
|
|
190
|
-
- docs/
|
|
191
|
-
- docs/
|
|
192
|
-
- docs/
|
|
193
|
-
- docs/blog/003-configuration-dsl.md
|
|
194
|
-
- docs/blog/004-store-model-jsonb.md
|
|
195
|
-
- docs/blog/005-target-dsl.md
|
|
196
|
-
- docs/blog/006-parsing-csv-sources.md
|
|
197
|
-
- docs/blog/007-orchestrator.md
|
|
198
|
-
- docs/blog/008-actioncable-stimulus.md
|
|
199
|
-
- docs/blog/009-phlex-ui-components.md
|
|
200
|
-
- docs/blog/010-controllers-routing.md
|
|
201
|
-
- docs/blog/011-generators.md
|
|
202
|
-
- docs/blog/012-json-api-sources.md
|
|
203
|
-
- docs/blog/013-testing-rails-engine.md
|
|
204
|
-
- docs/blog/014-dry-run.md
|
|
205
|
-
- docs/blog/015-publishing-retro.md
|
|
206
|
-
- docs/blog/016-erb-view-templates.md
|
|
207
|
-
- docs/blog/017-showcase-final-retro.md
|
|
208
|
-
- docs/blog/BACKLOG.md
|
|
209
|
-
- docs/blog/SERIES.md
|
|
138
|
+
- docs/CONFIGURATION.md
|
|
139
|
+
- docs/MAPPING.md
|
|
140
|
+
- docs/SOURCES.md
|
|
141
|
+
- docs/TARGETS.md
|
|
210
142
|
- docs/screenshots/index-with-previewing.jpg
|
|
211
143
|
- docs/screenshots/index.jpg
|
|
144
|
+
- docs/screenshots/mapping.jpg
|
|
212
145
|
- docs/screenshots/modal-new-import.jpg
|
|
213
146
|
- docs/screenshots/preview.jpg
|
|
214
147
|
- lib/data_porter.rb
|
|
215
148
|
- lib/data_porter/broadcaster.rb
|
|
216
149
|
- lib/data_porter/components.rb
|
|
217
150
|
- lib/data_porter/components/base.rb
|
|
218
|
-
- lib/data_porter/components/
|
|
219
|
-
- lib/data_porter/components/
|
|
220
|
-
- lib/data_porter/components/
|
|
221
|
-
- lib/data_porter/components/results_summary.rb
|
|
222
|
-
- lib/data_porter/components/
|
|
223
|
-
- lib/data_porter/components/
|
|
151
|
+
- lib/data_porter/components/mapping/column_row.rb
|
|
152
|
+
- lib/data_porter/components/mapping/form.rb
|
|
153
|
+
- lib/data_porter/components/mapping/template_select.rb
|
|
154
|
+
- lib/data_porter/components/preview/results_summary.rb
|
|
155
|
+
- lib/data_porter/components/preview/summary_cards.rb
|
|
156
|
+
- lib/data_porter/components/preview/table.rb
|
|
157
|
+
- lib/data_porter/components/progress/bar.rb
|
|
158
|
+
- lib/data_porter/components/shared/failure_alert.rb
|
|
159
|
+
- lib/data_porter/components/shared/status_badge.rb
|
|
224
160
|
- lib/data_porter/configuration.rb
|
|
225
161
|
- lib/data_porter/dsl/api_config.rb
|
|
226
162
|
- lib/data_porter/dsl/column.rb
|
|
@@ -233,6 +169,7 @@ files:
|
|
|
233
169
|
- lib/data_porter/sources/base.rb
|
|
234
170
|
- lib/data_porter/sources/csv.rb
|
|
235
171
|
- lib/data_porter/sources/json.rb
|
|
172
|
+
- lib/data_porter/sources/xlsx.rb
|
|
236
173
|
- lib/data_porter/store_models/error.rb
|
|
237
174
|
- lib/data_porter/store_models/import_record.rb
|
|
238
175
|
- lib/data_porter/store_models/report.rb
|
|
@@ -241,6 +178,7 @@ files:
|
|
|
241
178
|
- lib/data_porter/version.rb
|
|
242
179
|
- lib/generators/data_porter/install/install_generator.rb
|
|
243
180
|
- lib/generators/data_porter/install/templates/create_data_porter_imports.rb.erb
|
|
181
|
+
- lib/generators/data_porter/install/templates/create_data_porter_mapping_templates.rb.erb
|
|
244
182
|
- lib/generators/data_porter/install/templates/initializer.rb
|
|
245
183
|
- lib/generators/data_porter/target/target_generator.rb
|
|
246
184
|
- lib/generators/data_porter/target/templates/target.rb.tt
|
|
@@ -249,9 +187,8 @@ homepage: https://github.com/SerylLns/data_porter
|
|
|
249
187
|
licenses:
|
|
250
188
|
- MIT
|
|
251
189
|
metadata:
|
|
252
|
-
homepage_uri: https://github.com/SerylLns/data_porter
|
|
253
190
|
source_code_uri: https://github.com/SerylLns/data_porter
|
|
254
|
-
changelog_uri: https://github.com/SerylLns/data_porter/blob/
|
|
191
|
+
changelog_uri: https://github.com/SerylLns/data_porter/blob/main/CHANGELOG.md
|
|
255
192
|
rubygems_mcp_server_uri: https://rubygems.org/gems/data_porter
|
|
256
193
|
rubygems_mfa_required: 'true'
|
|
257
194
|
rdoc_options: []
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
Show the status of the DataPorter blog article series.
|
|
2
|
-
|
|
3
|
-
1. List all existing articles in `docs/blog/` with their title, part number, and published status
|
|
4
|
-
2. Check `task-master list` for completed tasks since the last article
|
|
5
|
-
3. Suggest 2-3 potential next article topics based on:
|
|
6
|
-
- Recently completed tasks not yet covered
|
|
7
|
-
- The natural progression of the series
|
|
8
|
-
- Topics that would be interesting for the Ruby/Rails community
|
|
9
|
-
|
|
10
|
-
Format the output as a clear dashboard.
|
data/.claude/commands/blog.md
DELETED
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
Write the next blog article for the DataPorter series.
|
|
2
|
-
|
|
3
|
-
Topic/title hint: $ARGUMENTS
|
|
4
|
-
|
|
5
|
-
## Process
|
|
6
|
-
|
|
7
|
-
1. **Read the series plan** at `docs/blog/SERIES.md` to identify which part this is and what it should cover.
|
|
8
|
-
|
|
9
|
-
2. **Gather context:**
|
|
10
|
-
- `task-master list` to see completed tasks
|
|
11
|
-
- `git log --oneline -20` for recent commits
|
|
12
|
-
- Read the source files listed in the series plan for this part
|
|
13
|
-
- Read any previous articles in `docs/blog/` to maintain continuity
|
|
14
|
-
|
|
15
|
-
3. **Write the article** in `docs/blog/NNN-slug.md` (NNN = part number, zero-padded).
|
|
16
|
-
|
|
17
|
-
4. **Mandatory article structure:**
|
|
18
|
-
|
|
19
|
-
```markdown
|
|
20
|
-
---
|
|
21
|
-
title: "Building DataPorter #N — <Title>"
|
|
22
|
-
series: "Building DataPorter - A Data Import Engine for Rails"
|
|
23
|
-
part: N
|
|
24
|
-
tags: [ruby, rails, rails-engine, gem-development, <2-3 topic tags>]
|
|
25
|
-
published: false
|
|
26
|
-
---
|
|
27
|
-
|
|
28
|
-
# <Title>
|
|
29
|
-
|
|
30
|
-
> One-line summary of what the reader will learn.
|
|
31
|
-
|
|
32
|
-
## Context
|
|
33
|
-
|
|
34
|
-
Where we are in the series (1-2 sentences). Link to previous article.
|
|
35
|
-
What we'll build in this article (clear scope).
|
|
36
|
-
|
|
37
|
-
## The problem
|
|
38
|
-
|
|
39
|
-
Why do we need this? Real-world scenario. Keep it short (3-5 sentences).
|
|
40
|
-
|
|
41
|
-
## What we're building
|
|
42
|
-
|
|
43
|
-
Show the end result first: a code snippet, a diagram, or a usage example.
|
|
44
|
-
The reader should immediately understand where we're going.
|
|
45
|
-
|
|
46
|
-
## Implementation
|
|
47
|
-
|
|
48
|
-
### Step 1 — <Name>
|
|
49
|
-
|
|
50
|
-
Explain the WHY, then show the code.
|
|
51
|
-
|
|
52
|
-
\`\`\`ruby
|
|
53
|
-
# path/to/file.rb
|
|
54
|
-
<focused snippet, not full file>
|
|
55
|
-
\`\`\`
|
|
56
|
-
|
|
57
|
-
Brief explanation of what this does and why we chose this approach.
|
|
58
|
-
|
|
59
|
-
### Step 2 — <Name>
|
|
60
|
-
|
|
61
|
-
(repeat pattern: WHY -> code -> explain)
|
|
62
|
-
|
|
63
|
-
### Step 3 — <Name>
|
|
64
|
-
|
|
65
|
-
(repeat)
|
|
66
|
-
|
|
67
|
-
## Decisions & tradeoffs
|
|
68
|
-
|
|
69
|
-
| Decision | We chose | Over | Because |
|
|
70
|
-
|----------|----------|------|---------|
|
|
71
|
-
| ... | ... | ... | ... |
|
|
72
|
-
|
|
73
|
-
## Testing it
|
|
74
|
-
|
|
75
|
-
Show how to verify this works (spec snippet or console output).
|
|
76
|
-
|
|
77
|
-
\`\`\`ruby
|
|
78
|
-
# spec/...
|
|
79
|
-
\`\`\`
|
|
80
|
-
|
|
81
|
-
## Recap
|
|
82
|
-
|
|
83
|
-
3-4 bullet points: what we built, what we learned.
|
|
84
|
-
|
|
85
|
-
## Next up
|
|
86
|
-
|
|
87
|
-
One paragraph teasing the next article in the series. End with a hook.
|
|
88
|
-
|
|
89
|
-
---
|
|
90
|
-
|
|
91
|
-
*This is part N of the series "Building DataPorter". [Previous: ...](#) | [Next: ...](#)*
|
|
92
|
-
*Code: [GitHub repo link]*
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
5. **Writing rules:**
|
|
96
|
-
- 5-8 minute read (~1000-1500 words)
|
|
97
|
-
- Max 3-4 implementation steps per article
|
|
98
|
-
- Code snippets: focused, 5-25 lines each (never full file dumps)
|
|
99
|
-
- Every snippet has a file path comment on line 1
|
|
100
|
-
- Explain decisions as "We chose X over Y because Z"
|
|
101
|
-
- Use the actual code from the codebase (not made-up examples)
|
|
102
|
-
- Conversational but technical tone: "Let's...", "Here's why..."
|
|
103
|
-
- English only
|
|
104
|
-
- No emojis in prose (OK in front matter tags)
|
|
105
|
-
|
|
106
|
-
6. **After writing:**
|
|
107
|
-
- Update the article status in `docs/blog/SERIES.md` to `draft`
|
|
108
|
-
- Show: title, word count, reading time, and the decisions table
|
|
109
|
-
- Suggest 2-3 improvements or missing points
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
Mark a Taskmaster task as done and check if a blog article should be generated.
|
|
2
|
-
|
|
3
|
-
Task ID: $ARGUMENTS
|
|
4
|
-
|
|
5
|
-
## Process
|
|
6
|
-
|
|
7
|
-
1. **Complete the task:**
|
|
8
|
-
```
|
|
9
|
-
task-master set-status --id=$ARGUMENTS --status=done
|
|
10
|
-
```
|
|
11
|
-
|
|
12
|
-
2. **Check blog series:** Read `docs/blog/SERIES.md` and find which blog part includes this task.
|
|
13
|
-
|
|
14
|
-
3. **Check if all tasks for that part are done:**
|
|
15
|
-
- Run `task-master show <id>` for each task in the blog part
|
|
16
|
-
- If ALL tasks for the part have status `done`, proceed to step 4
|
|
17
|
-
- If some tasks are still pending/in-progress, report progress ("Part N: 2/3 tasks done")
|
|
18
|
-
|
|
19
|
-
4. **If part is ready, generate the article:**
|
|
20
|
-
- Follow the `/blog` command process
|
|
21
|
-
- Write the draft in `docs/blog/NNN-slug.md`
|
|
22
|
-
- Update SERIES.md status to `draft`
|
|
23
|
-
|
|
24
|
-
5. **Show summary:**
|
|
25
|
-
- Task completed
|
|
26
|
-
- Blog part progress (e.g., "Part 5: 2/2 tasks done — article draft generated")
|
|
27
|
-
- Next task suggestion via `task-master next`
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
Add Dependency
|
|
2
|
-
|
|
3
|
-
Arguments: $ARGUMENTS
|
|
4
|
-
Add a dependency between tasks.
|
|
5
|
-
|
|
6
|
-
Arguments: $ARGUMENTS
|
|
7
|
-
|
|
8
|
-
Parse the task IDs to establish dependency relationship.
|
|
9
|
-
|
|
10
|
-
## Adding Dependencies
|
|
11
|
-
|
|
12
|
-
Creates a dependency where one task must be completed before another can start.
|
|
13
|
-
|
|
14
|
-
## Argument Parsing
|
|
15
|
-
|
|
16
|
-
Parse natural language or IDs:
|
|
17
|
-
- "make 5 depend on 3" → task 5 depends on task 3
|
|
18
|
-
- "5 needs 3" → task 5 depends on task 3
|
|
19
|
-
- "5 3" → task 5 depends on task 3
|
|
20
|
-
- "5 after 3" → task 5 depends on task 3
|
|
21
|
-
|
|
22
|
-
## Execution
|
|
23
|
-
|
|
24
|
-
```bash
|
|
25
|
-
task-master add-dependency --id=<task-id> --depends-on=<dependency-id>
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
## Validation
|
|
29
|
-
|
|
30
|
-
Before adding:
|
|
31
|
-
1. **Verify both tasks exist**
|
|
32
|
-
2. **Check for circular dependencies**
|
|
33
|
-
3. **Ensure dependency makes logical sense**
|
|
34
|
-
4. **Warn if creating complex chains**
|
|
35
|
-
|
|
36
|
-
## Smart Features
|
|
37
|
-
|
|
38
|
-
- Detect if dependency already exists
|
|
39
|
-
- Suggest related dependencies
|
|
40
|
-
- Show impact on task flow
|
|
41
|
-
- Update task priorities if needed
|
|
42
|
-
|
|
43
|
-
## Post-Addition
|
|
44
|
-
|
|
45
|
-
After adding dependency:
|
|
46
|
-
1. Show updated dependency graph
|
|
47
|
-
2. Identify any newly blocked tasks
|
|
48
|
-
3. Suggest task order changes
|
|
49
|
-
4. Update project timeline
|
|
50
|
-
|
|
51
|
-
## Example Flows
|
|
52
|
-
|
|
53
|
-
```
|
|
54
|
-
/taskmaster:add-dependency 5 needs 3
|
|
55
|
-
→ Task #5 now depends on Task #3
|
|
56
|
-
→ Task #5 is now blocked until #3 completes
|
|
57
|
-
→ Suggested: Also consider if #5 needs #4
|
|
58
|
-
```
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
Add Subtask
|
|
2
|
-
|
|
3
|
-
Arguments: $ARGUMENTS
|
|
4
|
-
Add a subtask to a parent task.
|
|
5
|
-
|
|
6
|
-
Arguments: $ARGUMENTS
|
|
7
|
-
|
|
8
|
-
Parse arguments to create a new subtask or convert existing task.
|
|
9
|
-
|
|
10
|
-
## Adding Subtasks
|
|
11
|
-
|
|
12
|
-
Creates subtasks to break down complex parent tasks into manageable pieces.
|
|
13
|
-
|
|
14
|
-
## Argument Parsing
|
|
15
|
-
|
|
16
|
-
Flexible natural language:
|
|
17
|
-
- "add subtask to 5: implement login form"
|
|
18
|
-
- "break down 5 with: setup, implement, test"
|
|
19
|
-
- "subtask for 5: handle edge cases"
|
|
20
|
-
- "5: validate user input" → adds subtask to task 5
|
|
21
|
-
|
|
22
|
-
## Execution Modes
|
|
23
|
-
|
|
24
|
-
### 1. Create New Subtask
|
|
25
|
-
```bash
|
|
26
|
-
task-master add-subtask --parent=<id> --title="<title>" --description="<desc>"
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
### 2. Convert Existing Task
|
|
30
|
-
```bash
|
|
31
|
-
task-master add-subtask --parent=<id> --task-id=<existing-id>
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
## Smart Features
|
|
35
|
-
|
|
36
|
-
1. **Automatic Subtask Generation**
|
|
37
|
-
- If title contains "and" or commas, create multiple
|
|
38
|
-
- Suggest common subtask patterns
|
|
39
|
-
- Inherit parent's context
|
|
40
|
-
|
|
41
|
-
2. **Intelligent Defaults**
|
|
42
|
-
- Priority based on parent
|
|
43
|
-
- Appropriate time estimates
|
|
44
|
-
- Logical dependencies between subtasks
|
|
45
|
-
|
|
46
|
-
3. **Validation**
|
|
47
|
-
- Check parent task complexity
|
|
48
|
-
- Warn if too many subtasks
|
|
49
|
-
- Ensure subtask makes sense
|
|
50
|
-
|
|
51
|
-
## Creation Process
|
|
52
|
-
|
|
53
|
-
1. Parse parent task context
|
|
54
|
-
2. Generate subtask with ID like "5.1"
|
|
55
|
-
3. Set appropriate defaults
|
|
56
|
-
4. Link to parent task
|
|
57
|
-
5. Update parent's time estimate
|
|
58
|
-
|
|
59
|
-
## Example Flows
|
|
60
|
-
|
|
61
|
-
```
|
|
62
|
-
/taskmaster:add-subtask to 5: implement user authentication
|
|
63
|
-
→ Created subtask #5.1: "implement user authentication"
|
|
64
|
-
→ Parent task #5 now has 1 subtask
|
|
65
|
-
→ Suggested next subtasks: tests, documentation
|
|
66
|
-
|
|
67
|
-
/taskmaster:add-subtask 5: setup, implement, test
|
|
68
|
-
→ Created 3 subtasks:
|
|
69
|
-
#5.1: setup
|
|
70
|
-
#5.2: implement
|
|
71
|
-
#5.3: test
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
## Post-Creation
|
|
75
|
-
|
|
76
|
-
- Show updated task hierarchy
|
|
77
|
-
- Suggest logical next subtasks
|
|
78
|
-
- Update complexity estimates
|
|
79
|
-
- Recommend subtask order
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
Add Task
|
|
2
|
-
|
|
3
|
-
Arguments: $ARGUMENTS
|
|
4
|
-
Add new tasks with intelligent parsing and context awareness.
|
|
5
|
-
|
|
6
|
-
Arguments: $ARGUMENTS
|
|
7
|
-
|
|
8
|
-
## Smart Task Addition
|
|
9
|
-
|
|
10
|
-
Parse natural language to create well-structured tasks.
|
|
11
|
-
|
|
12
|
-
### 1. **Input Understanding**
|
|
13
|
-
|
|
14
|
-
I'll intelligently parse your request:
|
|
15
|
-
- Natural language → Structured task
|
|
16
|
-
- Detect priority from keywords (urgent, ASAP, important)
|
|
17
|
-
- Infer dependencies from context
|
|
18
|
-
- Suggest complexity based on description
|
|
19
|
-
- Determine task type (feature, bug, refactor, test, docs)
|
|
20
|
-
|
|
21
|
-
### 2. **Smart Parsing Examples**
|
|
22
|
-
|
|
23
|
-
**"Add urgent task to fix login bug"**
|
|
24
|
-
→ Title: Fix login bug
|
|
25
|
-
→ Priority: high
|
|
26
|
-
→ Type: bug
|
|
27
|
-
→ Suggested complexity: medium
|
|
28
|
-
|
|
29
|
-
**"Create task for API documentation after task 23 is done"**
|
|
30
|
-
→ Title: API documentation
|
|
31
|
-
→ Dependencies: [23]
|
|
32
|
-
→ Type: documentation
|
|
33
|
-
→ Priority: medium
|
|
34
|
-
|
|
35
|
-
**"Need to refactor auth module - depends on 12 and 15, high complexity"**
|
|
36
|
-
→ Title: Refactor auth module
|
|
37
|
-
→ Dependencies: [12, 15]
|
|
38
|
-
→ Complexity: high
|
|
39
|
-
→ Type: refactor
|
|
40
|
-
|
|
41
|
-
### 3. **Context Enhancement**
|
|
42
|
-
|
|
43
|
-
Based on current project state:
|
|
44
|
-
- Suggest related existing tasks
|
|
45
|
-
- Warn about potential conflicts
|
|
46
|
-
- Recommend dependencies
|
|
47
|
-
- Propose subtasks if complex
|
|
48
|
-
|
|
49
|
-
### 4. **Interactive Refinement**
|
|
50
|
-
|
|
51
|
-
```yaml
|
|
52
|
-
Task Preview:
|
|
53
|
-
─────────────
|
|
54
|
-
Title: [Extracted title]
|
|
55
|
-
Priority: [Inferred priority]
|
|
56
|
-
Dependencies: [Detected dependencies]
|
|
57
|
-
Complexity: [Estimated complexity]
|
|
58
|
-
|
|
59
|
-
Suggestions:
|
|
60
|
-
- Similar task #34 exists, consider as dependency?
|
|
61
|
-
- This seems complex, break into subtasks?
|
|
62
|
-
- Tasks #45-47 work on same module
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
### 5. **Validation & Creation**
|
|
66
|
-
|
|
67
|
-
Before creating:
|
|
68
|
-
- Validate dependencies exist
|
|
69
|
-
- Check for duplicates
|
|
70
|
-
- Ensure logical ordering
|
|
71
|
-
- Verify task completeness
|
|
72
|
-
|
|
73
|
-
### 6. **Smart Defaults**
|
|
74
|
-
|
|
75
|
-
Intelligent defaults based on:
|
|
76
|
-
- Task type patterns
|
|
77
|
-
- Team conventions
|
|
78
|
-
- Historical data
|
|
79
|
-
- Current sprint/phase
|
|
80
|
-
|
|
81
|
-
Result: High-quality tasks from minimal input.
|