remi 0.2.27 → 0.2.28

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -0
  3. data/Gemfile.lock +34 -5
  4. data/features/metadata.feature +17 -0
  5. data/features/step_definitions/remi_step.rb +6 -6
  6. data/features/transforms/date_diff.feature +1 -0
  7. data/jobs/aggregate_job.rb +0 -1
  8. data/jobs/all_jobs_shared.rb +0 -2
  9. data/jobs/copy_source_job.rb +0 -1
  10. data/jobs/csv_file_target_job.rb +0 -1
  11. data/jobs/metadata_job.rb +60 -0
  12. data/jobs/parameters_job.rb +1 -1
  13. data/jobs/sample_job.rb +19 -20
  14. data/jobs/sftp_file_target_job.rb +0 -1
  15. data/jobs/transforms/date_diff_job.rb +1 -1
  16. data/jobs/transforms/nvl_job.rb +1 -1
  17. data/jobs/transforms/parse_date_job.rb +7 -4
  18. data/jobs/transforms/prefix_job.rb +1 -1
  19. data/jobs/transforms/truncate_job.rb +1 -1
  20. data/lib/remi.rb +10 -15
  21. data/lib/remi/cucumber/business_rules.rb +23 -23
  22. data/lib/remi/cucumber/data_source.rb +2 -1
  23. data/lib/remi/data_frame.rb +36 -0
  24. data/lib/remi/data_frame/daru.rb +67 -0
  25. data/lib/remi/data_subject.rb +71 -10
  26. data/lib/remi/data_subject/csv_file.rb +151 -0
  27. data/lib/remi/data_subject/data_frame.rb +53 -0
  28. data/lib/remi/data_subject/postgres.rb +136 -0
  29. data/lib/remi/data_subject/salesforce.rb +136 -0
  30. data/lib/remi/data_subject/sftp_file.rb +66 -0
  31. data/lib/remi/fields.rb +8 -0
  32. data/lib/remi/source_to_target_map.rb +56 -32
  33. data/lib/remi/transform.rb +426 -83
  34. data/lib/remi/version.rb +1 -1
  35. data/remi.gemspec +2 -1
  36. data/spec/metadata_spec.rb +62 -0
  37. metadata +15 -28
  38. data/lib/remi/data_source.rb +0 -13
  39. data/lib/remi/data_source/csv_file.rb +0 -101
  40. data/lib/remi/data_source/data_frame.rb +0 -16
  41. data/lib/remi/data_source/postgres.rb +0 -58
  42. data/lib/remi/data_source/salesforce.rb +0 -87
  43. data/lib/remi/data_target.rb +0 -15
  44. data/lib/remi/data_target/csv_file.rb +0 -42
  45. data/lib/remi/data_target/data_frame.rb +0 -14
  46. data/lib/remi/data_target/postgres.rb +0 -74
  47. data/lib/remi/data_target/salesforce.rb +0 -54
  48. data/lib/remi/data_target/sftp_file.rb +0 -54
  49. data/lib/remi/refinements/daru.rb +0 -85
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 699ffcfaee3db2ae6e0fc56d79458c55d2241405
4
- data.tar.gz: 70b17f181c0090eefb842da7f71a66882376475a
3
+ metadata.gz: dc30c0a301e3be2a32b11febab47f55037a2d621
4
+ data.tar.gz: 2474212de553dafd2fb51ab30643ba65d30ec908
5
5
  SHA512:
6
- metadata.gz: eea0b513471b2767dc4ac7053d8cb574bd747d5120b127f42d254952a166bf35e40ef52fa3861d8e4351ff95e1b967094f90f0860277174d0e52e235a819e606
7
- data.tar.gz: c9b8b111b7f3fddf7ff4fcd1310ca6102dd027acaaa1a90d15cfd80e65c7784c21396fe8c4bcfbe1b2177080479d445f81ee6ecf2ddec24aeeb5e3df7602b0c9
6
+ metadata.gz: 50dea06798dd136475c4a0401be65d8b19d1f0b8c82b2841e9551f95de6fc31897c55e4be5b58065e8cd792d2bfd9e37bd24a2001eddfbea8da44428bb32b1f2
7
+ data.tar.gz: ba9d970c2eecd2aba4bbd5467b25ae60bbc6827fcd36b1b89bbaacc301125d7e09af583874a0df0e9172dce1228934a7eff70aab641e53036909a06e38ee5e70
data/Gemfile CHANGED
@@ -2,3 +2,6 @@
2
2
  source 'https://rubygems.org'
3
3
 
4
4
  gemspec
5
+ gem 'daru', '0.1.2', git: 'git@github.com:inside-track/daru.git', branch: 'itk-master'
6
+ gem 'restforce', '~> 2.1'
7
+ gem 'salesforce_bulk_api', git: 'git@github.com:inside-track/salesforce_bulk_api.git', branch: 'master'
@@ -1,11 +1,28 @@
1
+ GIT
2
+ remote: git@github.com:inside-track/daru.git
3
+ revision: ad71b644c8e26789e3ab2258f046d5bc68b8df71
4
+ branch: itk-master
5
+ specs:
6
+ daru (0.1.2)
7
+ reportbuilder (~> 1.4)
8
+ spreadsheet (~> 1.1.1)
9
+
10
+ GIT
11
+ remote: git@github.com:inside-track/salesforce_bulk_api.git
12
+ revision: f597f06e5aa0cec3f9072b23fa09769676ec73da
13
+ branch: master
14
+ specs:
15
+ salesforce_bulk_api (0.0.12)
16
+ json
17
+ xml-simple
18
+
1
19
  PATH
2
20
  remote: .
3
21
  specs:
4
- remi (0.2.27)
22
+ remi (0.2.28)
5
23
  activesupport (~> 4.2)
6
24
  bond (~> 0.5)
7
25
  cucumber (~> 2.1)
8
- daru (= 0.1.2)
9
26
  docile (~> 1.1)
10
27
  faker (~> 1.6)
11
28
  net-sftp (~> 2.1)
@@ -37,14 +54,16 @@ GEM
37
54
  cucumber-core (1.4.0)
38
55
  gherkin (~> 3.2.0)
39
56
  cucumber-wire (0.0.1)
40
- daru (0.1.2)
41
- reportbuilder (~> 1.4)
42
- spreadsheet (~> 1.1.1)
43
57
  diff-lcs (1.2.5)
44
58
  docile (1.1.5)
45
59
  faker (1.6.3)
46
60
  i18n (~> 0.5)
61
+ faraday (0.9.2)
62
+ multipart-post (>= 1.2, < 3)
63
+ faraday_middleware (0.10.0)
64
+ faraday (>= 0.7.4, < 0.10)
47
65
  gherkin (3.2.0)
66
+ hashie (3.4.3)
48
67
  i18n (0.7.0)
49
68
  iruby (0.2.7)
50
69
  bond (~> 0.5)
@@ -56,6 +75,7 @@ GEM
56
75
  minitest (5.8.4)
57
76
  multi_json (1.11.2)
58
77
  multi_test (0.1.2)
78
+ multipart-post (2.0.0)
59
79
  net-sftp (2.1.2)
60
80
  net-ssh (>= 2.6.5)
61
81
  net-ssh (3.1.1)
@@ -77,6 +97,11 @@ GEM
77
97
  prawn (~> 0.8.4)
78
98
  prawn-svg (~> 0.9.1)
79
99
  text-table (~> 1.2)
100
+ restforce (2.2.0)
101
+ faraday (~> 0.9.0)
102
+ faraday_middleware (>= 0.8.8)
103
+ hashie (>= 1.2.0, < 4.0)
104
+ json (>= 1.7.5, < 1.9.0)
80
105
  rspec (3.4.0)
81
106
  rspec-core (~> 3.4.0)
82
107
  rspec-expectations (~> 3.4.0)
@@ -97,13 +122,17 @@ GEM
97
122
  thread_safe (0.3.5)
98
123
  tzinfo (1.2.2)
99
124
  thread_safe (~> 0.1)
125
+ xml-simple (1.1.5)
100
126
 
101
127
  PLATFORMS
102
128
  ruby
103
129
 
104
130
  DEPENDENCIES
131
+ daru (= 0.1.2)!
105
132
  iruby (= 0.2.7)
106
133
  remi!
134
+ restforce (~> 2.1)
135
+ salesforce_bulk_api!
107
136
 
108
137
  BUNDLED WITH
109
138
  1.11.2
@@ -0,0 +1,17 @@
1
+ Feature: This tests the application of metadata.
2
+ We need some additional tests to check for errors in parsing.
3
+
4
+
5
+ Background:
6
+ Given the job is 'Metadata'
7
+ And the job source 'Source Data'
8
+ And the job target 'Target Data'
9
+ And the source 'Source Data'
10
+ And the target 'Target Data'
11
+
12
+ And the following example record for 'Source Data':
13
+ | activity_id | student_id | student_dob | activity_type | activity_counter | activity_score | activity_cost | activity_date | source_filename |
14
+ | 1 | 1 | 3/3/1998 | A | 1 | 3.8 | 12.23 | 1/3/2016 03:22:36 | one.csv |
15
+
16
+ Scenario: Metadata is used to parse date fields
17
+ Then the target field 'student_dob' is set to the value "1998-03-03"
@@ -110,7 +110,7 @@ Given /^the (source|target) file contains at least the following headers in no p
110
110
  field = row.first
111
111
  step "the #{st} field '#{field}'"
112
112
  end
113
- expect(@brt.send(st.to_sym).data_obj.fields.keys).to include(*@brt.send(st.to_sym).fields.field_names)
113
+ expect(@brt.send(st.to_sym).data_subject.df.vectors.to_a).to include(*@brt.send(st.to_sym).fields.field_names)
114
114
  end
115
115
 
116
116
  Given /^the (source|target) file contains all of the following headers in this order:$/ do |st, table|
@@ -120,7 +120,7 @@ Given /^the (source|target) file contains all of the following headers in this o
120
120
  end
121
121
 
122
122
  @brt.run_transforms if st == 'target'
123
- expect(@brt.send(st.to_sym).data_obj.fields.keys).to eq @brt.send(st.to_sym).fields.field_names
123
+ expect(@brt.send(st.to_sym).data_subject.df.vectors.to_a).to eq @brt.send(st.to_sym).fields.field_names
124
124
  end
125
125
 
126
126
 
@@ -188,7 +188,7 @@ Given /^the source field '([^']+)' is parsed with the date format "([^"]*)"$/ do
188
188
  step "the source field '#{source_field}'"
189
189
 
190
190
  source_name, source_field_name = @brt.sources.parse_full_field(source_field)
191
- expect(@brt.sources[source_name].fields[source_field_name].metadata[:format]).to eq date_format
191
+ expect(@brt.sources[source_name].fields[source_field_name].metadata[:in_format]).to eq date_format
192
192
  end
193
193
 
194
194
  Given /^the source field is parsed with the date format "([^"]*)"$/ do |date_format|
@@ -452,8 +452,8 @@ Then /^the target field '([^']+)' is populated from the source field '([^']+)' u
452
452
  source_name, source_field_name = @brt.sources.parse_full_field(source_field)
453
453
  target_names, target_field_name = @brt.targets.parse_full_field(target_field, multi: true)
454
454
 
455
- source_format = @brt.sources[source_name].fields[source_field_name].metadata[:format]
456
- source_reformatted = Remi::Transform[:format_date].(from_fmt: source_format, to_fmt: target_format)
455
+ source_format = @brt.sources[source_name].fields[source_field_name].metadata[:in_format]
456
+ source_reformatted = Remi::Transform::FormatDate.new(in_format: source_format, out_format: target_format).to_proc
457
457
  .call(@brt.sources[source_name].fields[source_field_name].value)
458
458
 
459
459
  @brt.run_transforms
@@ -592,7 +592,7 @@ Then /^only the following fields should be present on the target:$/ do |table|
592
592
  end
593
593
 
594
594
  @brt.run_transforms
595
- expect(@brt.target.data_obj.fields.keys).to match_array @brt.target.fields.field_names
595
+ expect(@brt.target.data_subject.df.vectors.to_a).to match_array @brt.target.fields.field_names
596
596
  end
597
597
 
598
598
  ### Record-level expectations
@@ -8,6 +8,7 @@ Feature: Tests the date_diff transform
8
8
  And the source 'Source Data'
9
9
  And the target 'Target Data'
10
10
 
11
+
11
12
  Scenario Outline: Calculating date difference in days2.
12
13
  Given the job parameter 'measure' is "days"
13
14
  And the source field 'Date1' has the value "<Date1>"
@@ -2,7 +2,6 @@ require_relative 'all_jobs_shared'
2
2
 
3
3
  class AggregateJob
4
4
  include AllJobsShared
5
- using Remi::Refinements::Daru
6
5
 
7
6
  define_source :source_data, Remi::DataSource::DataFrame
8
7
  define_target :target_data, Remi::DataTarget::DataFrame
@@ -6,8 +6,6 @@ require 'remi'
6
6
 
7
7
  module AllJobsShared
8
8
  include Remi::Job
9
- include Remi::Refinements::Daru
10
- using Remi::Refinements::Daru
11
9
 
12
10
  define_param :sftp, {
13
11
  host: 'example.com',
@@ -2,7 +2,6 @@ require_relative 'all_jobs_shared'
2
2
 
3
3
  class CopySourceJob
4
4
  include AllJobsShared
5
- using Remi::Refinements::Daru
6
5
 
7
6
  define_source :source_data, Remi::DataSource::DataFrame,
8
7
  fields: {
@@ -2,7 +2,6 @@ require_relative 'all_jobs_shared'
2
2
 
3
3
  class CsvFileTargetJob
4
4
  include AllJobsShared
5
- using Remi::Refinements::Daru
6
5
 
7
6
  define_target :some_csv_file, Remi::DataTarget::CsvFile,
8
7
  path: "#{Remi::Settings.work_dir}/some_file.csv",
@@ -0,0 +1,60 @@
1
+ require_relative 'all_jobs_shared'
2
+
3
+ class MetadataJob
4
+ include AllJobsShared
5
+
6
+ define_source :source_data, Remi::DataSource::DataFrame,
7
+ fields: {
8
+ :activity_id => { from: 'in', in: true, cdc_type: 2 },
9
+ :student_id => { from: 'in', in: true, type: :string, cdc_type: 2 },
10
+ :student_dob => { from: 'in', in: true, type: :date, in_format: '%m/%d/%Y', out_format: '%Y-%m-%d', cdc_type: 2 },
11
+ :activity_type => { from: 'in', in: true, type: :string, valid_values: ['A', 'B', 'C'], cdc_type: 2 },
12
+ :activity_counter => { from: 'in', in: true, type: :integer, cdc_type: 2 },
13
+ :activity_score => { from: 'in', in: true, type: :float, cdc_type: 2 },
14
+ :activity_cost => { from: 'in', in: true, type: :decimal, precision: 16, scale: 2, cdc_type: 2 },
15
+ :activity_date => { from: 'in', in: true, type: :datetime, in_format: '%m/%d/%Y %H:%M:%S', out_format: '%Y-%m-%dT%H:%M:%S', cdc_type: 2 },
16
+ :source_filename => { from: 'in', in: true, type: :string, cdc_type: 1 }
17
+ }
18
+
19
+ define_target :target_data, Remi::DataTarget::CsvFile,
20
+ path: "#{Remi::Settings.work_dir}/target_data.csv",
21
+ fields: {
22
+ :activity_id => { from: 'out', out: true },
23
+ :student_id => { from: 'out', out: true, type: :string },
24
+ :student_dob => { from: 'out', out: true, type: :date, in_format: '%m/%d/%Y', out_format: '%Y-%m-%d' },
25
+ :activity_type => { from: 'out', out: true, type: :string, valid_values: ['A', 'B', 'C'] },
26
+ :activity_counter => { from: 'out', out: true, type: :integer },
27
+ :activity_score => { from: 'out', out: true, type: :float },
28
+ :activity_cost => { from: 'out', out: true, type: :decimal, precision: 16, scale: 2 },
29
+ :activity_date => { from: 'out', out: true, type: :datetime, in_format: '%m/%d/%Y %H:%M:%S', out_format: '%Y-%m-%dT%H:%M:%S' },
30
+ :source_filename => { from: 'out', out: true, type: :string, cdc_type: 1 }
31
+ }
32
+
33
+ define_transform :main do
34
+
35
+ =begin
36
+ source_data.df = Remi::DataFrame.daru([
37
+ ['1','1','3/3/1998','A','1','3.8','12.23','1/3/2016 03:22:36','one.csv'],
38
+ ['2','1','3/3/1998','B','3','4.2','10.53','1/3/2016 03:58:22','one.csv'],
39
+ ['2','1','','B','2','4.23','10.539','1/3/2016 03:58:22','one.csv']
40
+ ].transpose, order: [
41
+ :activity_id,
42
+ :student_id,
43
+ :student_dob,
44
+ :activity_type,
45
+ :activity_counter,
46
+ :activity_score,
47
+ :activity_cost,
48
+ :activity_date,
49
+ :source_filename
50
+ ])
51
+ =end
52
+
53
+ Remi::SourceToTargetMap.apply(source_data.df, target_data.df, source_metadata: source_data.fields) do
54
+ target_data.fields.keys.each do |field|
55
+ map source(field) .target(field)
56
+ .transform(Remi::Transform::EnforceType.new)
57
+ end
58
+ end
59
+ end
60
+ end
@@ -14,7 +14,7 @@ class ParametersJob
14
14
  define_transform :main do
15
15
  Remi::SourceToTargetMap.apply(source_data.df, target_data.df) do
16
16
  map source(nil) .target(:myparam)
17
- .transform(Remi::Transform[:constant].(params[:myparam]))
17
+ .transform(Remi::Transform::Constant.new(params[:myparam]))
18
18
  map source(:parameter_name) .target(:parameter_name)
19
19
  .transform(->(v) { params[v.to_sym] })
20
20
  end
@@ -1,10 +1,9 @@
1
1
  # This is an example Remi job that was auto-generated by Remi.
2
-
3
2
  require_relative 'all_jobs_shared'
3
+ require 'remi/data_subject/salesforce'
4
4
 
5
5
  class SampleJob
6
6
  include AllJobsShared
7
- using Remi::Refinements::Daru
8
7
 
9
8
  define_source :existing_contacts, Remi::DataSource::Salesforce,
10
9
  object: :Contact,
@@ -14,7 +13,7 @@ class SampleJob
14
13
  :Id => {},
15
14
  :External_ID__c => {},
16
15
  :IsActive => { type: :boolean },
17
- :CreatedDate => { type: :date, format: '%Y-%m-%d %H:%M:%S' }
16
+ :CreatedDate => { type: :date, in_format: '%Y-%m-%d %H:%M:%S' }
18
17
  },
19
18
  query: <<-EOQ
20
19
  SELECT
@@ -50,8 +49,8 @@ class SampleJob
50
49
  :mailing_city => {},
51
50
  :mailing_state => {},
52
51
  :mailing_postal_code => {},
53
- :birthdate => { type: :date, format: '%m/%d/%Y'},
54
- :applied_date => { type: :date, format: '%m/%d/%Y'}
52
+ :birthdate => { type: :date, in_format: '%m/%d/%Y'},
53
+ :applied_date => { type: :date, in_format: '%m/%d/%Y'}
55
54
  }
56
55
 
57
56
  define_target :all_contacts, Remi::DataTarget::DataFrame
@@ -83,7 +82,7 @@ class SampleJob
83
82
  all_contacts.df = sample_file.df.dup
84
83
  Remi::SourceToTargetMap.apply(all_contacts.df) do
85
84
  map source(:program) .target(:Major__c)
86
- .transform(Remi::Transform[:lookup][params[:program_name_lookup]])
85
+ .transform(Remi::Transform::Lookup.new(params[:program_name_lookup]))
87
86
  end
88
87
  all_contacts.df = all_contacts.df.where(all_contacts.df[:Major__c].not_eq(nil))
89
88
 
@@ -94,8 +93,8 @@ class SampleJob
94
93
 
95
94
  # Prefixes source id record and then looks up existing salesforce Id
96
95
  map source(:student_id) .target(:External_ID__c, :Id)
97
- .transform(Remi::Transform[:prefix]['SAMP'])
98
- .transform(->(v) { [v, Remi::Transform[:lookup][student_id_to_sf_id].call(v)] })
96
+ .transform(Remi::Transform::Prefix.new('SAMP'))
97
+ .transform(->(v) { [v, Remi::Transform::Lookup.new(student_id_to_sf_id).call(v)] })
99
98
  end
100
99
  end
101
100
 
@@ -108,36 +107,36 @@ class SampleJob
108
107
  map source(:school_id) .target(:School_ID__c)
109
108
  map source(:school_name) .target(:School_Name__c)
110
109
  map source(:first_name) .target(:FirstName)
111
- .transform(Remi::Transform[:ifblank].('Not Provided'))
110
+ .transform(Remi::Transform::IfBlank.new('Not Provided'))
112
111
  map source(:last_name) .target(:LastName)
113
- .transform(Remi::Transform[:ifblank].('Not Provided'))
112
+ .transform(Remi::Transform::IfBlank.new('Not Provided'))
114
113
  map source(:mailing_city) .target(:MailingCity)
115
114
  map source(:mailing_state) .target(:MailingState)
116
115
  map source(:mailing_postal_code) .target(:MailingPostalCode)
117
116
 
118
117
  map source(:birthdate) .target(:Birthdate)
119
- .transform(Remi::Transform[:format_date][from_fmt: sample_file.fields[:birthdate][:format]])
118
+ .transform(Remi::Transform::FormatDate.new(in_format: sample_file.fields[:birthdate][:in_format]))
120
119
 
121
120
  map source(:applied_date) .target(:Applied_Date__c)
122
- .transform(Remi::Transform[:ifblank].(Date.today.strftime(sample_file.fields[:applied_date][:format])))
123
- .transform(Remi::Transform[:format_date].(from_fmt: sample_file.fields[:applied_date][:format]))
121
+ .transform(Remi::Transform::IfBlank.new(Date.today.strftime(sample_file.fields[:applied_date][:in_format])))
122
+ .transform(Remi::Transform::FormatDate.new(in_format: sample_file.fields[:applied_date][:in_format]))
124
123
 
125
124
  map source(:mailing_address_line_1, :mailing_address_line_2) .target(:MailingStreet)
126
125
  .transform(->(line_1, line_2) {
127
- Remi::Transform[:ifblank].(nil).call(line_1).nil? ? [] : [line_1, line_2]
126
+ Remi::Transform::IfBlank.new(nil).call(line_1).nil? ? [] : [line_1, line_2]
128
127
  })
129
- .transform(Remi::Transform[:concatenate].(', '))
128
+ .transform(Remi::Transform::Concatenate.new(', '))
130
129
 
131
130
  map source(:school_id, :school_name) .target(:School__c)
132
131
  .transform(->(id, name) {[
133
- Remi::Transform[:ifblank]["Unknown"].call(id),
134
- Remi::Transform[:ifblank]["Unknown"].call(name)
132
+ Remi::Transform::IfBlank.new("Unknown").call(id),
133
+ Remi::Transform::IfBlank.new("Unknown").call(name)
135
134
  ]})
136
- .transform(Remi::Transform[:concatenate].('-'))
135
+ .transform(Remi::Transform::Concatenate.new('-'))
137
136
 
138
137
  map source(:current_email) .target(:Email)
139
- .transform(Remi::Transform[:replace].(/,/, '.'))
140
- .transform(Remi::Transform[:validate_email].call)
138
+ .transform(Remi::Transform::Replace.new(/,/, '.'))
139
+ .transform(Remi::Transform::ValidateEmail.new)
141
140
  end
142
141
 
143
142
  contact_creates.df = work_contact_creates[
@@ -2,7 +2,6 @@ require_relative 'all_jobs_shared'
2
2
 
3
3
  class SftpFileTargetJob
4
4
  include AllJobsShared
5
- using Remi::Refinements::Daru
6
5
 
7
6
 
8
7
  define_target :some_file, Remi::DataTarget::SftpFile,
@@ -15,7 +15,7 @@ class DateDiffJob
15
15
  Remi::SourceToTargetMap.apply(source_data.df, target_data.df) do
16
16
  map source(:date1, :date2) .target(:difference)
17
17
  .transform(->(d1,d2) { [Date.strptime(d1), Date.strptime(d2)] })
18
- .transform(Remi::Transform[:date_diff].(params[:measure]))
18
+ .transform(Remi::Transform::DateDiff.new(params[:measure]))
19
19
  end
20
20
  end
21
21
  end
@@ -15,7 +15,7 @@ class NvlJob
15
15
  define_transform :main, sources: :source_data, targets: :target_data do
16
16
  Remi::SourceToTargetMap.apply(source_data.df, target_data.df) do
17
17
  map source(:field1, :field2, :field3) .target(:result_field)
18
- .transform(Remi::Transform[:nvl].(params[:default]))
18
+ .transform(Remi::Transform::Nvl.new(params[:default]))
19
19
  end
20
20
  end
21
21
  end
@@ -7,19 +7,22 @@ class ParseDateJob
7
7
  define_param :if_blank, nil
8
8
  define_source :source_data, Remi::DataSource::DataFrame,
9
9
  fields: {
10
- :date_string => { type: :date, format: params[:format] },
11
- :stubbed_date => { type: :date, format: params[:format] }
10
+ :date_string => { type: :date, in_format: params[:format] },
11
+ :stubbed_date => { type: :date, in_format: params[:format] }
12
12
  }
13
13
  define_target :target_data, Remi::DataTarget::DataFrame
14
14
 
15
15
  define_transform :main, sources: :source_data, targets: :target_data do
16
16
 
17
+ # Only needed for testing, would be nice to make it testable without this
18
+ params[:if_blank] = ['high', 'low'].include?(params[:if_blank]) ? params[:if_blank].to_sym : params[:if_blank]
19
+
17
20
  Remi::SourceToTargetMap.apply(source_data.df, target_data.df) do
18
21
  map source(:date_string) .target(:parsed_date)
19
- .transform(Remi::Transform[:parse_date].(format: params[:format], if_blank: params[:if_blank]))
22
+ .transform(Remi::Transform::ParseDate.new(in_format: params[:format], if_blank: params[:if_blank]))
20
23
 
21
24
  map source(:stubbed_date) .target(:parsed_stubbed_date)
22
- .transform(Remi::Transform[:parse_date].(format: params[:format], if_blank: params[:if_blank]))
25
+ .transform(Remi::Transform::ParseDate.new(in_format: params[:format], if_blank: params[:if_blank]))
23
26
  end
24
27
  end
25
28
  end
@@ -13,7 +13,7 @@ class PrefixJob
13
13
  define_transform :main, sources: :source_data, targets: :target_data do
14
14
  Remi::SourceToTargetMap.apply(source_data.df, target_data.df) do
15
15
  map source(:my_field) .target(:prefixed_field)
16
- .transform(Remi::Transform[:prefix].(params[:prefix]))
16
+ .transform(Remi::Transform::Prefix.new(params[:prefix]))
17
17
  end
18
18
  end
19
19
  end