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.
Files changed (168) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +62 -1
  3. data/README.md +63 -386
  4. data/ROADMAP.md +89 -0
  5. data/app/assets/javascripts/data_porter/stimulus.min.js +2 -0
  6. data/app/assets/javascripts/data_porter/turbo.min.js +29 -0
  7. data/app/assets/stylesheets/data_porter/alerts.css +25 -0
  8. data/app/assets/stylesheets/data_porter/application.css +12 -646
  9. data/app/assets/stylesheets/data_porter/badges.css +73 -0
  10. data/app/assets/stylesheets/data_porter/base.css +56 -0
  11. data/app/assets/stylesheets/data_porter/cards.css +60 -0
  12. data/app/assets/stylesheets/data_porter/layout.css +128 -0
  13. data/app/assets/stylesheets/data_porter/mapping.css +79 -0
  14. data/app/assets/stylesheets/data_porter/modal.css +49 -0
  15. data/app/assets/stylesheets/data_porter/preview.css +24 -0
  16. data/app/assets/stylesheets/data_porter/progress.css +37 -0
  17. data/app/assets/stylesheets/data_porter/table.css +45 -0
  18. data/app/controllers/data_porter/imports_controller.rb +74 -10
  19. data/app/controllers/data_porter/mapping_templates_controller.rb +85 -0
  20. data/app/javascript/data_porter/mapping_controller.js +86 -0
  21. data/app/javascript/data_porter/progress_controller.js +1 -1
  22. data/app/javascript/data_porter/template_form_controller.js +46 -0
  23. data/app/jobs/data_porter/extract_headers_job.rb +12 -0
  24. data/app/models/data_porter/data_import.rb +8 -2
  25. data/app/models/data_porter/mapping_template.rb +15 -0
  26. data/app/views/data_porter/imports/index.html.erb +9 -8
  27. data/app/views/data_porter/imports/new.html.erb +10 -4
  28. data/app/views/data_porter/imports/show.html.erb +41 -13
  29. data/app/views/data_porter/mapping_templates/_form.html.erb +40 -0
  30. data/app/views/data_porter/mapping_templates/edit.html.erb +11 -0
  31. data/app/views/data_porter/mapping_templates/index.html.erb +42 -0
  32. data/app/views/data_porter/mapping_templates/new.html.erb +11 -0
  33. data/app/views/layouts/data_porter/application.html.erb +162 -0
  34. data/config/routes.rb +3 -0
  35. data/docs/CONFIGURATION.md +81 -0
  36. data/docs/MAPPING.md +44 -0
  37. data/docs/SOURCES.md +94 -0
  38. data/docs/TARGETS.md +176 -0
  39. data/docs/screenshots/mapping.jpg +0 -0
  40. data/lib/data_porter/components/mapping/column_row.rb +52 -0
  41. data/lib/data_porter/components/mapping/form.rb +127 -0
  42. data/lib/data_porter/components/mapping/template_select.rb +35 -0
  43. data/lib/data_porter/components/preview/results_summary.rb +21 -0
  44. data/lib/data_porter/components/preview/summary_cards.rb +32 -0
  45. data/lib/data_porter/components/preview/table.rb +56 -0
  46. data/lib/data_porter/components/progress/bar.rb +35 -0
  47. data/lib/data_porter/components/shared/failure_alert.rb +22 -0
  48. data/lib/data_porter/components/shared/status_badge.rb +18 -0
  49. data/lib/data_porter/components.rb +9 -6
  50. data/lib/data_porter/configuration.rb +1 -1
  51. data/lib/data_porter/engine.rb +7 -1
  52. data/lib/data_porter/orchestrator.rb +21 -1
  53. data/lib/data_porter/sources/base.rb +18 -3
  54. data/lib/data_porter/sources/csv.rb +5 -0
  55. data/lib/data_porter/sources/xlsx.rb +76 -0
  56. data/lib/data_porter/sources.rb +3 -1
  57. data/lib/data_porter/version.rb +1 -1
  58. data/lib/generators/data_porter/install/install_generator.rb +4 -0
  59. data/lib/generators/data_porter/install/templates/create_data_porter_mapping_templates.rb.erb +16 -0
  60. data/lib/generators/data_porter/install/templates/initializer.rb +1 -1
  61. metadata +72 -135
  62. data/.claude/commands/blog-status.md +0 -10
  63. data/.claude/commands/blog.md +0 -109
  64. data/.claude/commands/task-done.md +0 -27
  65. data/.claude/commands/tm/add-dependency.md +0 -58
  66. data/.claude/commands/tm/add-subtask.md +0 -79
  67. data/.claude/commands/tm/add-task.md +0 -81
  68. data/.claude/commands/tm/analyze-complexity.md +0 -124
  69. data/.claude/commands/tm/analyze-project.md +0 -100
  70. data/.claude/commands/tm/auto-implement-tasks.md +0 -100
  71. data/.claude/commands/tm/command-pipeline.md +0 -80
  72. data/.claude/commands/tm/complexity-report.md +0 -120
  73. data/.claude/commands/tm/convert-task-to-subtask.md +0 -74
  74. data/.claude/commands/tm/expand-all-tasks.md +0 -52
  75. data/.claude/commands/tm/expand-task.md +0 -52
  76. data/.claude/commands/tm/fix-dependencies.md +0 -82
  77. data/.claude/commands/tm/help.md +0 -101
  78. data/.claude/commands/tm/init-project-quick.md +0 -49
  79. data/.claude/commands/tm/init-project.md +0 -53
  80. data/.claude/commands/tm/install-taskmaster.md +0 -118
  81. data/.claude/commands/tm/learn.md +0 -106
  82. data/.claude/commands/tm/list-tasks-by-status.md +0 -42
  83. data/.claude/commands/tm/list-tasks-with-subtasks.md +0 -30
  84. data/.claude/commands/tm/list-tasks.md +0 -46
  85. data/.claude/commands/tm/next-task.md +0 -69
  86. data/.claude/commands/tm/parse-prd-with-research.md +0 -51
  87. data/.claude/commands/tm/parse-prd.md +0 -52
  88. data/.claude/commands/tm/project-status.md +0 -67
  89. data/.claude/commands/tm/quick-install-taskmaster.md +0 -23
  90. data/.claude/commands/tm/remove-all-subtasks.md +0 -94
  91. data/.claude/commands/tm/remove-dependency.md +0 -65
  92. data/.claude/commands/tm/remove-subtask.md +0 -87
  93. data/.claude/commands/tm/remove-subtasks.md +0 -89
  94. data/.claude/commands/tm/remove-task.md +0 -110
  95. data/.claude/commands/tm/setup-models.md +0 -52
  96. data/.claude/commands/tm/show-task.md +0 -85
  97. data/.claude/commands/tm/smart-workflow.md +0 -58
  98. data/.claude/commands/tm/sync-readme.md +0 -120
  99. data/.claude/commands/tm/tm-main.md +0 -147
  100. data/.claude/commands/tm/to-cancelled.md +0 -58
  101. data/.claude/commands/tm/to-deferred.md +0 -50
  102. data/.claude/commands/tm/to-done.md +0 -47
  103. data/.claude/commands/tm/to-in-progress.md +0 -39
  104. data/.claude/commands/tm/to-pending.md +0 -35
  105. data/.claude/commands/tm/to-review.md +0 -43
  106. data/.claude/commands/tm/update-single-task.md +0 -122
  107. data/.claude/commands/tm/update-task.md +0 -75
  108. data/.claude/commands/tm/update-tasks-from-id.md +0 -111
  109. data/.claude/commands/tm/validate-dependencies.md +0 -72
  110. data/.claude/commands/tm/view-models.md +0 -52
  111. data/.env.example +0 -12
  112. data/.mcp.json +0 -24
  113. data/.taskmaster/CLAUDE.md +0 -435
  114. data/.taskmaster/config.json +0 -44
  115. data/.taskmaster/docs/prd.txt +0 -2044
  116. data/.taskmaster/state.json +0 -6
  117. data/.taskmaster/tasks/task_001.md +0 -19
  118. data/.taskmaster/tasks/task_002.md +0 -19
  119. data/.taskmaster/tasks/task_003.md +0 -19
  120. data/.taskmaster/tasks/task_004.md +0 -19
  121. data/.taskmaster/tasks/task_005.md +0 -19
  122. data/.taskmaster/tasks/task_006.md +0 -19
  123. data/.taskmaster/tasks/task_007.md +0 -19
  124. data/.taskmaster/tasks/task_008.md +0 -19
  125. data/.taskmaster/tasks/task_009.md +0 -19
  126. data/.taskmaster/tasks/task_010.md +0 -19
  127. data/.taskmaster/tasks/task_011.md +0 -19
  128. data/.taskmaster/tasks/task_012.md +0 -19
  129. data/.taskmaster/tasks/task_013.md +0 -19
  130. data/.taskmaster/tasks/task_014.md +0 -19
  131. data/.taskmaster/tasks/task_015.md +0 -19
  132. data/.taskmaster/tasks/task_016.md +0 -19
  133. data/.taskmaster/tasks/task_017.md +0 -19
  134. data/.taskmaster/tasks/task_018.md +0 -19
  135. data/.taskmaster/tasks/task_019.md +0 -19
  136. data/.taskmaster/tasks/task_020.md +0 -19
  137. data/.taskmaster/tasks/tasks.json +0 -299
  138. data/.taskmaster/templates/example_prd.txt +0 -47
  139. data/.taskmaster/templates/example_prd_rpg.txt +0 -511
  140. data/CLAUDE.md +0 -65
  141. data/config/database.yml +0 -3
  142. data/docs/SPEC.md +0 -2012
  143. data/docs/UI.md +0 -32
  144. data/docs/blog/001-why-build-a-data-import-engine.md +0 -166
  145. data/docs/blog/002-scaffolding-a-rails-engine.md +0 -188
  146. data/docs/blog/003-configuration-dsl.md +0 -222
  147. data/docs/blog/004-store-model-jsonb.md +0 -237
  148. data/docs/blog/005-target-dsl.md +0 -284
  149. data/docs/blog/006-parsing-csv-sources.md +0 -300
  150. data/docs/blog/007-orchestrator.md +0 -247
  151. data/docs/blog/008-actioncable-stimulus.md +0 -376
  152. data/docs/blog/009-phlex-ui-components.md +0 -446
  153. data/docs/blog/010-controllers-routing.md +0 -374
  154. data/docs/blog/011-generators.md +0 -364
  155. data/docs/blog/012-json-api-sources.md +0 -323
  156. data/docs/blog/013-testing-rails-engine.md +0 -618
  157. data/docs/blog/014-dry-run.md +0 -307
  158. data/docs/blog/015-publishing-retro.md +0 -264
  159. data/docs/blog/016-erb-view-templates.md +0 -431
  160. data/docs/blog/017-showcase-final-retro.md +0 -220
  161. data/docs/blog/BACKLOG.md +0 -8
  162. data/docs/blog/SERIES.md +0 -154
  163. data/lib/data_porter/components/failure_alert.rb +0 -20
  164. data/lib/data_porter/components/preview_table.rb +0 -54
  165. data/lib/data_porter/components/progress_bar.rb +0 -33
  166. data/lib/data_porter/components/results_summary.rb +0 -19
  167. data/lib/data_porter/components/status_badge.rb +0 -16
  168. 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.1.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: csv
13
+ name: creek
14
14
  requirement: !ruby/object:Gem::Requirement
15
15
  requirements:
16
- - - ">="
16
+ - - "~>"
17
17
  - !ruby/object:Gem::Version
18
- version: '0'
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: '0'
25
+ version: '2.6'
26
26
  - !ruby/object:Gem::Dependency
27
- name: phlex
27
+ name: csv
28
28
  requirement: !ruby/object:Gem::Requirement
29
29
  requirements:
30
- - - ">="
30
+ - - "~>"
31
31
  - !ruby/object:Gem::Version
32
- version: '1.0'
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: '1.0'
39
+ version: '3.0'
40
40
  - !ruby/object:Gem::Dependency
41
- name: rails
41
+ name: phlex
42
42
  requirement: !ruby/object:Gem::Requirement
43
43
  requirements:
44
- - - ">="
44
+ - - "~>"
45
45
  - !ruby/object:Gem::Version
46
- version: '7.0'
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: '7.0'
53
+ version: '2.0'
54
54
  - !ruby/object:Gem::Dependency
55
- name: store_model
55
+ name: rails
56
56
  requirement: !ruby/object:Gem::Requirement
57
57
  requirements:
58
58
  - - ">="
59
59
  - !ruby/object:Gem::Version
60
- version: '2.0'
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: '2.0'
70
+ version: '7.0'
71
+ - - "<"
72
+ - !ruby/object:Gem::Version
73
+ version: '9.0'
68
74
  - !ruby/object:Gem::Dependency
69
- name: turbo-rails
75
+ name: store_model
70
76
  requirement: !ruby/object:Gem::Requirement
71
77
  requirements:
72
- - - ">="
78
+ - - "~>"
73
79
  - !ruby/object:Gem::Version
74
- version: '1.0'
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: '1.0'
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, and API
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
- - config/database.yml
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/SPEC.md
190
- - docs/UI.md
191
- - docs/blog/001-why-build-a-data-import-engine.md
192
- - docs/blog/002-scaffolding-a-rails-engine.md
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/failure_alert.rb
219
- - lib/data_porter/components/preview_table.rb
220
- - lib/data_porter/components/progress_bar.rb
221
- - lib/data_porter/components/results_summary.rb
222
- - lib/data_porter/components/status_badge.rb
223
- - lib/data_porter/components/summary_cards.rb
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/master/CHANGELOG.md
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.
@@ -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.