chronicle-etl 0.2.4 → 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 (56) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +35 -0
  3. data/.gitignore +3 -0
  4. data/.rubocop.yml +31 -1
  5. data/Guardfile +7 -0
  6. data/README.md +21 -14
  7. data/Rakefile +4 -2
  8. data/chronicle-etl.gemspec +18 -10
  9. data/exe/chronicle-etl +1 -1
  10. data/lib/chronicle/etl/cli/connectors.rb +53 -7
  11. data/lib/chronicle/etl/cli/jobs.rb +59 -24
  12. data/lib/chronicle/etl/cli/main.rb +18 -16
  13. data/lib/chronicle/etl/cli/subcommand_base.rb +2 -2
  14. data/lib/chronicle/etl/cli.rb +7 -0
  15. data/lib/chronicle/etl/config.rb +1 -1
  16. data/lib/chronicle/etl/configurable.rb +150 -0
  17. data/lib/chronicle/etl/exceptions.rb +14 -1
  18. data/lib/chronicle/etl/extraction.rb +12 -0
  19. data/lib/chronicle/etl/extractors/csv_extractor.rb +32 -31
  20. data/lib/chronicle/etl/extractors/extractor.rb +25 -13
  21. data/lib/chronicle/etl/extractors/file_extractor.rb +17 -32
  22. data/lib/chronicle/etl/extractors/helpers/filesystem_reader.rb +104 -0
  23. data/lib/chronicle/etl/extractors/json_extractor.rb +37 -0
  24. data/lib/chronicle/etl/extractors/stdin_extractor.rb +6 -1
  25. data/lib/chronicle/etl/job.rb +30 -29
  26. data/lib/chronicle/etl/job_definition.rb +45 -7
  27. data/lib/chronicle/etl/job_log.rb +10 -0
  28. data/lib/chronicle/etl/job_logger.rb +23 -20
  29. data/lib/chronicle/etl/loaders/csv_loader.rb +5 -1
  30. data/lib/chronicle/etl/loaders/loader.rb +5 -2
  31. data/lib/chronicle/etl/loaders/rest_loader.rb +9 -5
  32. data/lib/chronicle/etl/loaders/stdout_loader.rb +6 -1
  33. data/lib/chronicle/etl/loaders/table_loader.rb +51 -7
  34. data/lib/chronicle/etl/logger.rb +48 -0
  35. data/lib/chronicle/etl/models/attachment.rb +14 -0
  36. data/lib/chronicle/etl/models/base.rb +23 -7
  37. data/lib/chronicle/etl/models/entity.rb +9 -3
  38. data/lib/chronicle/etl/registry/connector_registration.rb +62 -0
  39. data/lib/chronicle/etl/registry/registry.rb +52 -0
  40. data/lib/chronicle/etl/registry/self_registering.rb +25 -0
  41. data/lib/chronicle/etl/runner.rb +58 -7
  42. data/lib/chronicle/etl/serializers/jsonapi_serializer.rb +25 -0
  43. data/lib/chronicle/etl/serializers/serializer.rb +27 -0
  44. data/lib/chronicle/etl/transformers/image_file_transformer.rb +247 -0
  45. data/lib/chronicle/etl/transformers/null_transformer.rb +10 -1
  46. data/lib/chronicle/etl/transformers/transformer.rb +41 -10
  47. data/lib/chronicle/etl/utils/binary_attachments.rb +21 -0
  48. data/lib/chronicle/etl/utils/progress_bar.rb +3 -1
  49. data/lib/chronicle/etl/utils/text_recognition.rb +15 -0
  50. data/lib/chronicle/etl/version.rb +1 -1
  51. data/lib/chronicle/etl.rb +8 -2
  52. metadata +146 -34
  53. data/.ruby-version +0 -1
  54. data/Gemfile.lock +0 -91
  55. data/lib/chronicle/etl/catalog.rb +0 -108
  56. data/lib/chronicle/etl/utils/jsonapi.rb +0 -28
metadata CHANGED
@@ -1,29 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chronicle-etl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Louis
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-09-23 00:00:00.000000000 Z
11
+ date: 2022-02-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: thor
14
+ name: activesupport
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0.20'
19
+ version: '7.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0.20'
26
+ version: '7.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: chronic_duration
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.10.6
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.10.6
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: colorize
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -39,33 +53,61 @@ dependencies:
39
53
  - !ruby/object:Gem::Version
40
54
  version: 0.8.1
41
55
  - !ruby/object:Gem::Dependency
42
- name: tty-table
56
+ name: marcel
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
59
  - - "~>"
46
60
  - !ruby/object:Gem::Version
47
- version: '0.11'
61
+ version: 1.0.2
48
62
  type: :runtime
49
63
  prerelease: false
50
64
  version_requirements: !ruby/object:Gem::Requirement
51
65
  requirements:
52
66
  - - "~>"
53
67
  - !ruby/object:Gem::Version
54
- version: '0.11'
68
+ version: 1.0.2
55
69
  - !ruby/object:Gem::Dependency
56
- name: tty-progressbar
70
+ name: mini_exiftool
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
73
  - - "~>"
60
74
  - !ruby/object:Gem::Version
61
- version: '0.17'
75
+ version: '2.10'
62
76
  type: :runtime
63
77
  prerelease: false
64
78
  version_requirements: !ruby/object:Gem::Requirement
65
79
  requirements:
66
80
  - - "~>"
67
81
  - !ruby/object:Gem::Version
68
- version: '0.17'
82
+ version: '2.10'
83
+ - !ruby/object:Gem::Dependency
84
+ name: nokogiri
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.13'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.13'
97
+ - !ruby/object:Gem::Dependency
98
+ name: runcom
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '6.0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '6.0'
69
111
  - !ruby/object:Gem::Dependency
70
112
  name: sequel
71
113
  requirement: !ruby/object:Gem::Requirement
@@ -81,7 +123,21 @@ dependencies:
81
123
  - !ruby/object:Gem::Version
82
124
  version: '5.35'
83
125
  - !ruby/object:Gem::Dependency
84
- name: deep_merge
126
+ name: sqlite3
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '1.4'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '1.4'
139
+ - !ruby/object:Gem::Dependency
140
+ name: thor
85
141
  requirement: !ruby/object:Gem::Requirement
86
142
  requirements:
87
143
  - - "~>"
@@ -94,6 +150,34 @@ dependencies:
94
150
  - - "~>"
95
151
  - !ruby/object:Gem::Version
96
152
  version: '1.2'
153
+ - !ruby/object:Gem::Dependency
154
+ name: tty-progressbar
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '0.17'
160
+ type: :runtime
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '0.17'
167
+ - !ruby/object:Gem::Dependency
168
+ name: tty-table
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: '0.11'
174
+ type: :runtime
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: '0.11'
97
181
  - !ruby/object:Gem::Dependency
98
182
  name: bundler
99
183
  requirement: !ruby/object:Gem::Requirement
@@ -108,6 +192,20 @@ dependencies:
108
192
  - - "~>"
109
193
  - !ruby/object:Gem::Version
110
194
  version: '2.1'
195
+ - !ruby/object:Gem::Dependency
196
+ name: pry-byebug
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - "~>"
200
+ - !ruby/object:Gem::Version
201
+ version: '3.9'
202
+ type: :development
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - "~>"
207
+ - !ruby/object:Gem::Version
208
+ version: '3.9'
111
209
  - !ruby/object:Gem::Dependency
112
210
  name: rake
113
211
  requirement: !ruby/object:Gem::Requirement
@@ -137,61 +235,61 @@ dependencies:
137
235
  - !ruby/object:Gem::Version
138
236
  version: '3.9'
139
237
  - !ruby/object:Gem::Dependency
140
- name: pry-byebug
238
+ name: simplecov
141
239
  requirement: !ruby/object:Gem::Requirement
142
240
  requirements:
143
241
  - - "~>"
144
242
  - !ruby/object:Gem::Version
145
- version: '3.9'
243
+ version: '0.21'
146
244
  type: :development
147
245
  prerelease: false
148
246
  version_requirements: !ruby/object:Gem::Requirement
149
247
  requirements:
150
248
  - - "~>"
151
249
  - !ruby/object:Gem::Version
152
- version: '3.9'
250
+ version: '0.21'
153
251
  - !ruby/object:Gem::Dependency
154
- name: runcom
252
+ name: guard-rspec
155
253
  requirement: !ruby/object:Gem::Requirement
156
254
  requirements:
157
255
  - - "~>"
158
256
  - !ruby/object:Gem::Version
159
- version: '6.2'
257
+ version: 4.7.3
160
258
  type: :development
161
259
  prerelease: false
162
260
  version_requirements: !ruby/object:Gem::Requirement
163
261
  requirements:
164
262
  - - "~>"
165
263
  - !ruby/object:Gem::Version
166
- version: '6.2'
264
+ version: 4.7.3
167
265
  - !ruby/object:Gem::Dependency
168
- name: redcarpet
266
+ name: yard
169
267
  requirement: !ruby/object:Gem::Requirement
170
268
  requirements:
171
269
  - - "~>"
172
270
  - !ruby/object:Gem::Version
173
- version: '3.5'
271
+ version: 0.9.7
174
272
  type: :development
175
273
  prerelease: false
176
274
  version_requirements: !ruby/object:Gem::Requirement
177
275
  requirements:
178
276
  - - "~>"
179
277
  - !ruby/object:Gem::Version
180
- version: '3.5'
278
+ version: 0.9.7
181
279
  - !ruby/object:Gem::Dependency
182
- name: sqlite3
280
+ name: rubocop
183
281
  requirement: !ruby/object:Gem::Requirement
184
282
  requirements:
185
283
  - - "~>"
186
284
  - !ruby/object:Gem::Version
187
- version: '1.4'
285
+ version: 1.25.1
188
286
  type: :development
189
287
  prerelease: false
190
288
  version_requirements: !ruby/object:Gem::Requirement
191
289
  requirements:
192
290
  - - "~>"
193
291
  - !ruby/object:Gem::Version
194
- version: '1.4'
292
+ version: 1.25.1
195
293
  description: Chronicle-ETL allows you to extract personal data from a variety of services,
196
294
  transformer it, and load it.
197
295
  email:
@@ -201,15 +299,15 @@ executables:
201
299
  extensions: []
202
300
  extra_rdoc_files: []
203
301
  files:
302
+ - ".github/workflows/ruby.yml"
204
303
  - ".gitignore"
205
304
  - ".rspec"
206
305
  - ".rubocop.yml"
207
- - ".ruby-version"
208
306
  - ".travis.yml"
209
307
  - ".yardopts"
210
308
  - CODE_OF_CONDUCT.md
211
309
  - Gemfile
212
- - Gemfile.lock
310
+ - Guardfile
213
311
  - LICENSE.txt
214
312
  - README.md
215
313
  - Rakefile
@@ -218,16 +316,20 @@ files:
218
316
  - chronicle-etl.gemspec
219
317
  - exe/chronicle-etl
220
318
  - lib/chronicle/etl.rb
221
- - lib/chronicle/etl/catalog.rb
319
+ - lib/chronicle/etl/cli.rb
222
320
  - lib/chronicle/etl/cli/connectors.rb
223
321
  - lib/chronicle/etl/cli/jobs.rb
224
322
  - lib/chronicle/etl/cli/main.rb
225
323
  - lib/chronicle/etl/cli/subcommand_base.rb
226
324
  - lib/chronicle/etl/config.rb
325
+ - lib/chronicle/etl/configurable.rb
227
326
  - lib/chronicle/etl/exceptions.rb
327
+ - lib/chronicle/etl/extraction.rb
228
328
  - lib/chronicle/etl/extractors/csv_extractor.rb
229
329
  - lib/chronicle/etl/extractors/extractor.rb
230
330
  - lib/chronicle/etl/extractors/file_extractor.rb
331
+ - lib/chronicle/etl/extractors/helpers/filesystem_reader.rb
332
+ - lib/chronicle/etl/extractors/json_extractor.rb
231
333
  - lib/chronicle/etl/extractors/stdin_extractor.rb
232
334
  - lib/chronicle/etl/job.rb
233
335
  - lib/chronicle/etl/job_definition.rb
@@ -238,25 +340,35 @@ files:
238
340
  - lib/chronicle/etl/loaders/rest_loader.rb
239
341
  - lib/chronicle/etl/loaders/stdout_loader.rb
240
342
  - lib/chronicle/etl/loaders/table_loader.rb
343
+ - lib/chronicle/etl/logger.rb
241
344
  - lib/chronicle/etl/models/activity.rb
345
+ - lib/chronicle/etl/models/attachment.rb
242
346
  - lib/chronicle/etl/models/base.rb
243
347
  - lib/chronicle/etl/models/entity.rb
244
348
  - lib/chronicle/etl/models/generic.rb
349
+ - lib/chronicle/etl/registry/connector_registration.rb
350
+ - lib/chronicle/etl/registry/registry.rb
351
+ - lib/chronicle/etl/registry/self_registering.rb
245
352
  - lib/chronicle/etl/runner.rb
353
+ - lib/chronicle/etl/serializers/jsonapi_serializer.rb
354
+ - lib/chronicle/etl/serializers/serializer.rb
355
+ - lib/chronicle/etl/transformers/image_file_transformer.rb
246
356
  - lib/chronicle/etl/transformers/null_transformer.rb
247
357
  - lib/chronicle/etl/transformers/transformer.rb
358
+ - lib/chronicle/etl/utils/binary_attachments.rb
248
359
  - lib/chronicle/etl/utils/hash_utilities.rb
249
- - lib/chronicle/etl/utils/jsonapi.rb
250
360
  - lib/chronicle/etl/utils/progress_bar.rb
361
+ - lib/chronicle/etl/utils/text_recognition.rb
251
362
  - lib/chronicle/etl/version.rb
252
363
  homepage: https://github.com/chronicle-app
253
364
  licenses:
254
365
  - MIT
255
366
  metadata:
367
+ allowed_push_host: https://rubygems.org
256
368
  homepage_uri: https://github.com/chronicle-app
257
369
  source_code_uri: https://github.com/chronicle-app/chronicle-etl
258
- changelog_uri: https://github.com/chronicle-app/chronicle-etl/blob/master/CHANGELOG.md
259
- post_install_message:
370
+ changelog_uri: https://github.com/chronicle-app/chronicle-etl/releases
371
+ post_install_message:
260
372
  rdoc_options: []
261
373
  require_paths:
262
374
  - lib
@@ -264,15 +376,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
264
376
  requirements:
265
377
  - - ">="
266
378
  - !ruby/object:Gem::Version
267
- version: '0'
379
+ version: '2.7'
268
380
  required_rubygems_version: !ruby/object:Gem::Requirement
269
381
  requirements:
270
382
  - - ">="
271
383
  - !ruby/object:Gem::Version
272
384
  version: '0'
273
385
  requirements: []
274
- rubygems_version: 3.1.2
275
- signing_key:
386
+ rubygems_version: 3.1.6
387
+ signing_key:
276
388
  specification_version: 4
277
389
  summary: ETL tool for personal data
278
390
  test_files: []
data/.ruby-version DELETED
@@ -1 +0,0 @@
1
- 2.7.1
data/Gemfile.lock DELETED
@@ -1,91 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- chronicle-etl (0.2.4)
5
- colorize (~> 0.8.1)
6
- deep_merge (~> 1.2)
7
- sequel (~> 5.35)
8
- thor (~> 0.20)
9
- tty-progressbar (~> 0.17)
10
- tty-table (~> 0.11)
11
-
12
- GEM
13
- remote: https://rubygems.org/
14
- specs:
15
- byebug (11.1.3)
16
- coderay (1.1.3)
17
- colorize (0.8.1)
18
- deep_merge (1.2.1)
19
- diff-lcs (1.4.4)
20
- equatable (0.6.1)
21
- method_source (1.0.0)
22
- necromancer (0.6.0)
23
- pastel (0.7.4)
24
- equatable (~> 0.6)
25
- tty-color (~> 0.5)
26
- pry (0.13.1)
27
- coderay (~> 1.1)
28
- method_source (~> 1.0)
29
- pry-byebug (3.9.0)
30
- byebug (~> 11.0)
31
- pry (~> 0.13.0)
32
- rake (13.0.1)
33
- redcarpet (3.5.0)
34
- refinements (7.7.0)
35
- rspec (3.9.0)
36
- rspec-core (~> 3.9.0)
37
- rspec-expectations (~> 3.9.0)
38
- rspec-mocks (~> 3.9.0)
39
- rspec-core (3.9.2)
40
- rspec-support (~> 3.9.3)
41
- rspec-expectations (3.9.2)
42
- diff-lcs (>= 1.2.0, < 2.0)
43
- rspec-support (~> 3.9.0)
44
- rspec-mocks (3.9.1)
45
- diff-lcs (>= 1.2.0, < 2.0)
46
- rspec-support (~> 3.9.0)
47
- rspec-support (3.9.3)
48
- runcom (6.2.0)
49
- refinements (~> 7.4)
50
- xdg (~> 4.0)
51
- sequel (5.36.0)
52
- sqlite3 (1.4.2)
53
- strings (0.1.8)
54
- strings-ansi (~> 0.1)
55
- unicode-display_width (~> 1.5)
56
- unicode_utils (~> 1.4)
57
- strings-ansi (0.1.0)
58
- thor (0.20.3)
59
- tty-color (0.5.2)
60
- tty-cursor (0.7.1)
61
- tty-progressbar (0.17.0)
62
- strings-ansi (~> 0.1.0)
63
- tty-cursor (~> 0.7)
64
- tty-screen (~> 0.7)
65
- unicode-display_width (~> 1.6)
66
- tty-screen (0.8.1)
67
- tty-table (0.11.0)
68
- equatable (~> 0.6)
69
- necromancer (~> 0.5)
70
- pastel (~> 0.7.2)
71
- strings (~> 0.1.5)
72
- tty-screen (~> 0.7)
73
- unicode-display_width (1.7.0)
74
- unicode_utils (1.4.0)
75
- xdg (4.2.0)
76
-
77
- PLATFORMS
78
- ruby
79
-
80
- DEPENDENCIES
81
- bundler (~> 2.1)
82
- chronicle-etl!
83
- pry-byebug (~> 3.9)
84
- rake (~> 13.0)
85
- redcarpet (~> 3.5)
86
- rspec (~> 3.9)
87
- runcom (~> 6.2)
88
- sqlite3 (~> 1.4)
89
-
90
- BUNDLED WITH
91
- 2.1.4
@@ -1,108 +0,0 @@
1
- module Chronicle
2
- module ETL
3
- # Utility methods to catalogue which Extractor, Transformer, and
4
- # Loader connector classes are available to chronicle-etl
5
- module Catalog
6
- PHASES = [:extractor, :transformer, :loader]
7
- PLUGINS = ['email', 'bash']
8
- BUILTIN = {
9
- extractor: ['stdin', 'json', 'csv', 'file'],
10
- transformer: ['null'],
11
- loader: ['stdout', 'csv', 'table', 'rest']
12
- }.freeze
13
-
14
- # Return which ETL connectors are available, both built in and externally-defined
15
- def self.available_classes
16
- # TODO: have a registry of plugins
17
-
18
- # Attempt to load each chronicle plugin that we might know about so
19
- # that we can later search for subclasses to build our list of
20
- # available classes
21
- PLUGINS.each do |plugin|
22
- require "chronicle/#{plugin}"
23
- rescue LoadError
24
- # this will happen if the gem isn't available globally
25
- end
26
-
27
- parent_klasses = [
28
- ::Chronicle::ETL::Extractor,
29
- ::Chronicle::ETL::Transformer,
30
- ::Chronicle::ETL::Loader
31
- ]
32
- klasses = []
33
- parent_klasses.map do |parent|
34
- klasses += ::ObjectSpace.each_object(::Class).select { |klass| klass < parent }
35
- end
36
-
37
- klasses.map do |klass|
38
- {
39
- name: klass.name,
40
- built_in: klass.built_in?,
41
- provider: klass.provider,
42
- phase: klass.phase
43
- }
44
- end
45
- end
46
-
47
- # Take a phase (e, t, or l) and an identifier and return the right class
48
- def self.phase_and_identifier_to_klass(phase, identifier)
49
- Chronicle::ETL::Catalog.identifier_to_klass(phase: phase, identifier: identifier)
50
- end
51
-
52
- # For a given connector identifier, return the class (either builtin, or from a
53
- # external chronicle gem)
54
- def self.identifier_to_klass(identifier:, phase:)
55
- if BUILTIN[phase].include? identifier
56
- load_builtin_klass(name: identifier, phase: phase)
57
- else
58
- provider, name = identifier.split(':')
59
- name ||= ''
60
- load_provider_klass(provider: provider, name: name, phase: phase)
61
- end
62
- end
63
-
64
- # Returns whether a class is an Extractor, Transformer, or Loader
65
- def phase
66
- ancestors = self.ancestors
67
- return :extractor if ancestors.include? Chronicle::ETL::Extractor
68
- return :transformer if ancestors.include? Chronicle::ETL::Transformer
69
- return :loader if ancestors.include? Chronicle::ETL::Loader
70
- end
71
-
72
- # Returns which third-party provider this connector is associated wtih
73
- def provider
74
- # TODO: needs better convention for a gem reporting its provider name
75
- provider = to_s.split('::')[1].downcase
76
- provider == 'etl' ? 'chronicle' : provider
77
- end
78
-
79
- # Returns whether this connector is a built-in one
80
- def built_in?
81
- to_s.include? 'Chronicle::ETL'
82
- end
83
-
84
- private
85
-
86
- def self.load_builtin_klass(name:, phase:)
87
- klass_str = "Chronicle::ETL::#{name.capitalize}#{phase.capitalize}"
88
- begin
89
- Object.const_get(klass_str)
90
- rescue NameError => e
91
- raise ConnectorNotAvailableError.new("Connector not found", name: name)
92
- end
93
- end
94
-
95
- def self.load_provider_klass(name: '', phase:, provider:)
96
- begin
97
- require "chronicle/#{provider}"
98
- klass_str = "Chronicle::#{provider.capitalize}::#{name.capitalize}#{phase.capitalize}"
99
- Object.const_get(klass_str)
100
- rescue LoadError => e
101
- raise ProviderNotAvailableError.new("Provider '#{provider.capitalize}' could not be loaded", provider: provider)
102
- rescue NameError => e
103
- raise ProviderConnectorNotAvailableError.new("Connector '#{name}' in '#{provider}' could not be found", provider: provider, name: name)
104
- end
105
- end
106
- end
107
- end
108
- end
@@ -1,28 +0,0 @@
1
- module Chronicle
2
- module ETL
3
- module Utils
4
- module JSONAPI
5
- # For a given Chronicle::ETL::Model, serialize it as jsonapi
6
- def self.serialize(record)
7
- return unless record.is_a? Chronicle::ETL::Models::Base
8
-
9
- obj = record.identifier_hash
10
- obj[:attributes] = record.attributes
11
-
12
- relationships = Hash[record.associations.map do |k, v|
13
- if v.is_a?(Array)
14
- data = { data: v.map{ |association| serialize(association) } }
15
- else
16
- data = { data: serialize(v) }
17
- end
18
-
19
- [k, data]
20
- end]
21
-
22
- obj[:relationships] = relationships if relationships.any?
23
- obj
24
- end
25
- end
26
- end
27
- end
28
- end