chronicle-etl 0.2.4 → 0.3.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/.gitignore +3 -0
- data/.rubocop.yml +3 -0
- data/README.md +20 -13
- data/chronicle-etl.gemspec +11 -8
- data/lib/chronicle/etl/cli/connectors.rb +19 -7
- data/lib/chronicle/etl/cli/jobs.rb +24 -18
- data/lib/chronicle/etl/cli/main.rb +10 -2
- data/lib/chronicle/etl/config.rb +1 -1
- data/lib/chronicle/etl/exceptions.rb +12 -1
- data/lib/chronicle/etl/extraction.rb +12 -0
- data/lib/chronicle/etl/extractors/csv_extractor.rb +43 -36
- data/lib/chronicle/etl/extractors/extractor.rb +9 -1
- data/lib/chronicle/etl/extractors/file_extractor.rb +15 -33
- data/lib/chronicle/etl/extractors/helpers/filesystem_reader.rb +104 -0
- data/lib/chronicle/etl/extractors/json_extractor.rb +45 -0
- data/lib/chronicle/etl/extractors/stdin_extractor.rb +6 -1
- data/lib/chronicle/etl/job.rb +30 -29
- data/lib/chronicle/etl/job_definition.rb +45 -7
- data/lib/chronicle/etl/job_log.rb +10 -0
- data/lib/chronicle/etl/job_logger.rb +23 -20
- data/lib/chronicle/etl/loaders/csv_loader.rb +4 -0
- data/lib/chronicle/etl/loaders/loader.rb +1 -1
- data/lib/chronicle/etl/loaders/rest_loader.rb +5 -1
- data/lib/chronicle/etl/loaders/stdout_loader.rb +6 -1
- data/lib/chronicle/etl/loaders/table_loader.rb +57 -7
- data/lib/chronicle/etl/logger.rb +48 -0
- data/lib/chronicle/etl/models/attachment.rb +14 -0
- data/lib/chronicle/etl/models/base.rb +23 -7
- data/lib/chronicle/etl/models/entity.rb +9 -3
- data/lib/chronicle/etl/registry/connector_registration.rb +61 -0
- data/lib/chronicle/etl/registry/registry.rb +52 -0
- data/lib/chronicle/etl/registry/self_registering.rb +25 -0
- data/lib/chronicle/etl/runner.rb +57 -7
- data/lib/chronicle/etl/serializers/jsonapi_serializer.rb +25 -0
- data/lib/chronicle/etl/serializers/serializer.rb +27 -0
- data/lib/chronicle/etl/transformers/image_file_transformer.rb +253 -0
- data/lib/chronicle/etl/transformers/null_transformer.rb +10 -1
- data/lib/chronicle/etl/transformers/transformer.rb +39 -9
- data/lib/chronicle/etl/utils/binary_attachments.rb +21 -0
- data/lib/chronicle/etl/utils/progress_bar.rb +3 -1
- data/lib/chronicle/etl/utils/text_recognition.rb +15 -0
- data/lib/chronicle/etl/version.rb +1 -1
- data/lib/chronicle/etl.rb +7 -2
- metadata +96 -44
- data/Gemfile.lock +0 -91
- data/lib/chronicle/etl/catalog.rb +0 -108
- 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.
|
4
|
+
version: 0.3.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:
|
11
|
+
date: 2022-02-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: activesupport
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: chronic_duration
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
16
30
|
requirements:
|
17
31
|
- - "~>"
|
18
32
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
33
|
+
version: 0.10.6
|
20
34
|
type: :runtime
|
21
35
|
prerelease: false
|
22
36
|
version_requirements: !ruby/object:Gem::Requirement
|
23
37
|
requirements:
|
24
38
|
- - "~>"
|
25
39
|
- !ruby/object:Gem::Version
|
26
|
-
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:
|
56
|
+
name: marcel
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
44
58
|
requirements:
|
45
59
|
- - "~>"
|
46
60
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
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:
|
68
|
+
version: 1.0.2
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
70
|
+
name: mini_exiftool
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
58
72
|
requirements:
|
59
73
|
- - "~>"
|
60
74
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
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: '
|
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.2'
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '6.2'
|
69
111
|
- !ruby/object:Gem::Dependency
|
70
112
|
name: sequel
|
71
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -81,117 +123,117 @@ dependencies:
|
|
81
123
|
- !ruby/object:Gem::Version
|
82
124
|
version: '5.35'
|
83
125
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
126
|
+
name: sqlite3
|
85
127
|
requirement: !ruby/object:Gem::Requirement
|
86
128
|
requirements:
|
87
129
|
- - "~>"
|
88
130
|
- !ruby/object:Gem::Version
|
89
|
-
version: '1.
|
131
|
+
version: '1.4'
|
90
132
|
type: :runtime
|
91
133
|
prerelease: false
|
92
134
|
version_requirements: !ruby/object:Gem::Requirement
|
93
135
|
requirements:
|
94
136
|
- - "~>"
|
95
137
|
- !ruby/object:Gem::Version
|
96
|
-
version: '1.
|
138
|
+
version: '1.4'
|
97
139
|
- !ruby/object:Gem::Dependency
|
98
|
-
name:
|
140
|
+
name: thor
|
99
141
|
requirement: !ruby/object:Gem::Requirement
|
100
142
|
requirements:
|
101
143
|
- - "~>"
|
102
144
|
- !ruby/object:Gem::Version
|
103
|
-
version: '
|
104
|
-
type: :
|
145
|
+
version: '0.20'
|
146
|
+
type: :runtime
|
105
147
|
prerelease: false
|
106
148
|
version_requirements: !ruby/object:Gem::Requirement
|
107
149
|
requirements:
|
108
150
|
- - "~>"
|
109
151
|
- !ruby/object:Gem::Version
|
110
|
-
version: '
|
152
|
+
version: '0.20'
|
111
153
|
- !ruby/object:Gem::Dependency
|
112
|
-
name:
|
154
|
+
name: tty-progressbar
|
113
155
|
requirement: !ruby/object:Gem::Requirement
|
114
156
|
requirements:
|
115
157
|
- - "~>"
|
116
158
|
- !ruby/object:Gem::Version
|
117
|
-
version: '
|
118
|
-
type: :
|
159
|
+
version: '0.17'
|
160
|
+
type: :runtime
|
119
161
|
prerelease: false
|
120
162
|
version_requirements: !ruby/object:Gem::Requirement
|
121
163
|
requirements:
|
122
164
|
- - "~>"
|
123
165
|
- !ruby/object:Gem::Version
|
124
|
-
version: '
|
166
|
+
version: '0.17'
|
125
167
|
- !ruby/object:Gem::Dependency
|
126
|
-
name:
|
168
|
+
name: tty-table
|
127
169
|
requirement: !ruby/object:Gem::Requirement
|
128
170
|
requirements:
|
129
171
|
- - "~>"
|
130
172
|
- !ruby/object:Gem::Version
|
131
|
-
version: '
|
132
|
-
type: :
|
173
|
+
version: '0.11'
|
174
|
+
type: :runtime
|
133
175
|
prerelease: false
|
134
176
|
version_requirements: !ruby/object:Gem::Requirement
|
135
177
|
requirements:
|
136
178
|
- - "~>"
|
137
179
|
- !ruby/object:Gem::Version
|
138
|
-
version: '
|
180
|
+
version: '0.11'
|
139
181
|
- !ruby/object:Gem::Dependency
|
140
|
-
name:
|
182
|
+
name: bundler
|
141
183
|
requirement: !ruby/object:Gem::Requirement
|
142
184
|
requirements:
|
143
185
|
- - "~>"
|
144
186
|
- !ruby/object:Gem::Version
|
145
|
-
version: '
|
187
|
+
version: '2.1'
|
146
188
|
type: :development
|
147
189
|
prerelease: false
|
148
190
|
version_requirements: !ruby/object:Gem::Requirement
|
149
191
|
requirements:
|
150
192
|
- - "~>"
|
151
193
|
- !ruby/object:Gem::Version
|
152
|
-
version: '
|
194
|
+
version: '2.1'
|
153
195
|
- !ruby/object:Gem::Dependency
|
154
|
-
name:
|
196
|
+
name: pry-byebug
|
155
197
|
requirement: !ruby/object:Gem::Requirement
|
156
198
|
requirements:
|
157
199
|
- - "~>"
|
158
200
|
- !ruby/object:Gem::Version
|
159
|
-
version: '
|
201
|
+
version: '3.9'
|
160
202
|
type: :development
|
161
203
|
prerelease: false
|
162
204
|
version_requirements: !ruby/object:Gem::Requirement
|
163
205
|
requirements:
|
164
206
|
- - "~>"
|
165
207
|
- !ruby/object:Gem::Version
|
166
|
-
version: '
|
208
|
+
version: '3.9'
|
167
209
|
- !ruby/object:Gem::Dependency
|
168
|
-
name:
|
210
|
+
name: rake
|
169
211
|
requirement: !ruby/object:Gem::Requirement
|
170
212
|
requirements:
|
171
213
|
- - "~>"
|
172
214
|
- !ruby/object:Gem::Version
|
173
|
-
version: '
|
215
|
+
version: '13.0'
|
174
216
|
type: :development
|
175
217
|
prerelease: false
|
176
218
|
version_requirements: !ruby/object:Gem::Requirement
|
177
219
|
requirements:
|
178
220
|
- - "~>"
|
179
221
|
- !ruby/object:Gem::Version
|
180
|
-
version: '
|
222
|
+
version: '13.0'
|
181
223
|
- !ruby/object:Gem::Dependency
|
182
|
-
name:
|
224
|
+
name: rspec
|
183
225
|
requirement: !ruby/object:Gem::Requirement
|
184
226
|
requirements:
|
185
227
|
- - "~>"
|
186
228
|
- !ruby/object:Gem::Version
|
187
|
-
version: '
|
229
|
+
version: '3.9'
|
188
230
|
type: :development
|
189
231
|
prerelease: false
|
190
232
|
version_requirements: !ruby/object:Gem::Requirement
|
191
233
|
requirements:
|
192
234
|
- - "~>"
|
193
235
|
- !ruby/object:Gem::Version
|
194
|
-
version: '
|
236
|
+
version: '3.9'
|
195
237
|
description: Chronicle-ETL allows you to extract personal data from a variety of services,
|
196
238
|
transformer it, and load it.
|
197
239
|
email:
|
@@ -209,7 +251,6 @@ files:
|
|
209
251
|
- ".yardopts"
|
210
252
|
- CODE_OF_CONDUCT.md
|
211
253
|
- Gemfile
|
212
|
-
- Gemfile.lock
|
213
254
|
- LICENSE.txt
|
214
255
|
- README.md
|
215
256
|
- Rakefile
|
@@ -218,16 +259,18 @@ files:
|
|
218
259
|
- chronicle-etl.gemspec
|
219
260
|
- exe/chronicle-etl
|
220
261
|
- lib/chronicle/etl.rb
|
221
|
-
- lib/chronicle/etl/catalog.rb
|
222
262
|
- lib/chronicle/etl/cli/connectors.rb
|
223
263
|
- lib/chronicle/etl/cli/jobs.rb
|
224
264
|
- lib/chronicle/etl/cli/main.rb
|
225
265
|
- lib/chronicle/etl/cli/subcommand_base.rb
|
226
266
|
- lib/chronicle/etl/config.rb
|
227
267
|
- lib/chronicle/etl/exceptions.rb
|
268
|
+
- lib/chronicle/etl/extraction.rb
|
228
269
|
- lib/chronicle/etl/extractors/csv_extractor.rb
|
229
270
|
- lib/chronicle/etl/extractors/extractor.rb
|
230
271
|
- lib/chronicle/etl/extractors/file_extractor.rb
|
272
|
+
- lib/chronicle/etl/extractors/helpers/filesystem_reader.rb
|
273
|
+
- lib/chronicle/etl/extractors/json_extractor.rb
|
231
274
|
- lib/chronicle/etl/extractors/stdin_extractor.rb
|
232
275
|
- lib/chronicle/etl/job.rb
|
233
276
|
- lib/chronicle/etl/job_definition.rb
|
@@ -238,16 +281,25 @@ files:
|
|
238
281
|
- lib/chronicle/etl/loaders/rest_loader.rb
|
239
282
|
- lib/chronicle/etl/loaders/stdout_loader.rb
|
240
283
|
- lib/chronicle/etl/loaders/table_loader.rb
|
284
|
+
- lib/chronicle/etl/logger.rb
|
241
285
|
- lib/chronicle/etl/models/activity.rb
|
286
|
+
- lib/chronicle/etl/models/attachment.rb
|
242
287
|
- lib/chronicle/etl/models/base.rb
|
243
288
|
- lib/chronicle/etl/models/entity.rb
|
244
289
|
- lib/chronicle/etl/models/generic.rb
|
290
|
+
- lib/chronicle/etl/registry/connector_registration.rb
|
291
|
+
- lib/chronicle/etl/registry/registry.rb
|
292
|
+
- lib/chronicle/etl/registry/self_registering.rb
|
245
293
|
- lib/chronicle/etl/runner.rb
|
294
|
+
- lib/chronicle/etl/serializers/jsonapi_serializer.rb
|
295
|
+
- lib/chronicle/etl/serializers/serializer.rb
|
296
|
+
- lib/chronicle/etl/transformers/image_file_transformer.rb
|
246
297
|
- lib/chronicle/etl/transformers/null_transformer.rb
|
247
298
|
- lib/chronicle/etl/transformers/transformer.rb
|
299
|
+
- lib/chronicle/etl/utils/binary_attachments.rb
|
248
300
|
- lib/chronicle/etl/utils/hash_utilities.rb
|
249
|
-
- lib/chronicle/etl/utils/jsonapi.rb
|
250
301
|
- lib/chronicle/etl/utils/progress_bar.rb
|
302
|
+
- lib/chronicle/etl/utils/text_recognition.rb
|
251
303
|
- lib/chronicle/etl/version.rb
|
252
304
|
homepage: https://github.com/chronicle-app
|
253
305
|
licenses:
|
@@ -256,7 +308,7 @@ metadata:
|
|
256
308
|
homepage_uri: https://github.com/chronicle-app
|
257
309
|
source_code_uri: https://github.com/chronicle-app/chronicle-etl
|
258
310
|
changelog_uri: https://github.com/chronicle-app/chronicle-etl/blob/master/CHANGELOG.md
|
259
|
-
post_install_message:
|
311
|
+
post_install_message:
|
260
312
|
rdoc_options: []
|
261
313
|
require_paths:
|
262
314
|
- lib
|
@@ -272,7 +324,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
272
324
|
version: '0'
|
273
325
|
requirements: []
|
274
326
|
rubygems_version: 3.1.2
|
275
|
-
signing_key:
|
327
|
+
signing_key:
|
276
328
|
specification_version: 4
|
277
329
|
summary: ETL tool for personal data
|
278
330
|
test_files: []
|
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
|