remi 0.0.1 → 0.2.2

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 (60) hide show
  1. checksums.yaml +4 -4
  2. data/.bundle/config +2 -0
  3. data/.gitignore +3 -2
  4. data/.rspec +2 -0
  5. data/.ruby-version +1 -0
  6. data/Gemfile +4 -0
  7. data/Gemfile.lock +123 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +94 -3
  10. data/bin/remi +8 -0
  11. data/doc/install-rbenv-os_x.md +47 -0
  12. data/lib/remi.rb +56 -9
  13. data/lib/remi/cli.rb +56 -0
  14. data/lib/remi/core/daru.rb +28 -0
  15. data/lib/remi/core/refinements.rb +21 -0
  16. data/lib/remi/core/string.rb +8 -0
  17. data/lib/remi/cucumber.rb +7 -0
  18. data/lib/remi/cucumber/business_rules.rb +504 -0
  19. data/lib/remi/cucumber/data_source.rb +63 -0
  20. data/lib/remi/data_source.rb +13 -0
  21. data/lib/remi/data_source/csv_file.rb +79 -0
  22. data/lib/remi/data_source/data_frame.rb +10 -0
  23. data/lib/remi/data_source/postgres.rb +58 -0
  24. data/lib/remi/data_source/salesforce.rb +78 -0
  25. data/lib/remi/data_subject.rb +25 -0
  26. data/lib/remi/data_target.rb +15 -0
  27. data/lib/remi/data_target/csv_file.rb +49 -0
  28. data/lib/remi/data_target/data_frame.rb +14 -0
  29. data/lib/remi/data_target/salesforce.rb +49 -0
  30. data/lib/remi/extractor/sftp_file.rb +84 -0
  31. data/lib/remi/field_symbolizers.rb +17 -0
  32. data/lib/remi/job.rb +200 -0
  33. data/lib/remi/lookup/regex_sieve.rb +55 -0
  34. data/lib/remi/project/features/examples.feature +24 -0
  35. data/lib/remi/project/features/formulas.feature +64 -0
  36. data/lib/remi/project/features/sample_job.feature +304 -0
  37. data/lib/remi/project/features/step_definitions/remi_step.rb +310 -0
  38. data/lib/remi/project/features/support/env.rb +10 -0
  39. data/lib/remi/project/features/support/env_app.rb +3 -0
  40. data/lib/remi/project/features/transforms/date_diff.feature +50 -0
  41. data/lib/remi/project/features/transforms/parse_date.feature +34 -0
  42. data/lib/remi/project/features/transforms/prefix.feature +15 -0
  43. data/lib/remi/project/jobs/all_jobs_shared.rb +25 -0
  44. data/lib/remi/project/jobs/copy_source_job.rb +12 -0
  45. data/lib/remi/project/jobs/sample_job.rb +164 -0
  46. data/lib/remi/project/jobs/transforms/date_diff_job.rb +17 -0
  47. data/lib/remi/project/jobs/transforms/parse_date_job.rb +18 -0
  48. data/lib/remi/project/jobs/transforms/prefix_job.rb +16 -0
  49. data/lib/remi/project/jobs/transforms/transform_jobs.rb +3 -0
  50. data/lib/remi/settings.rb +39 -0
  51. data/lib/remi/sf_bulk_helper.rb +265 -0
  52. data/lib/remi/source_to_target_map.rb +93 -0
  53. data/lib/remi/transform.rb +137 -0
  54. data/lib/remi/version.rb +3 -0
  55. data/remi.gemspec +25 -7
  56. data/workbooks/sample_workbook.ipynb +56 -0
  57. data/workbooks/workbook_helper.rb +1 -0
  58. metadata +234 -17
  59. data/lib/noodling.rb +0 -163
  60. data/test/test_NAME.rb +0 -19
@@ -0,0 +1,93 @@
1
+ module Remi
2
+ class SourceToTargetMap
3
+ def initialize(source_df, target_df=nil)
4
+ @source_df = source_df
5
+ @target_df = target_df || @source_df
6
+
7
+ reset_map
8
+ end
9
+
10
+ def self.apply(source_df, target_df=nil, &block)
11
+ target_df ||= source_df
12
+ Docile.dsl_eval(SourceToTargetMap.new(source_df, target_df), &block)
13
+ end
14
+
15
+ def source(*source_fields)
16
+ @source_fields = Array(source_fields)
17
+ self
18
+ end
19
+
20
+ def transform(*transforms)
21
+ @transforms += Array(transforms)
22
+ self
23
+ end
24
+
25
+ def target(*target_fields)
26
+ @target_fields = Array(target_fields)
27
+ self
28
+ end
29
+
30
+ def reset_map
31
+ @source_fields = []
32
+ @target_fields = []
33
+ @transforms = []
34
+ end
35
+
36
+ def map(*args)
37
+ case
38
+ when @source_fields.include?(nil)
39
+ do_map_generic
40
+ when @source_fields.size == 1 && @transforms.size == 0
41
+ do_map_direct_copy
42
+ when @source_fields.size == 1 && @target_fields.size == 1
43
+ do_map_single_source_and_target_field
44
+ else
45
+ do_map_generic
46
+ end
47
+
48
+ reset_map
49
+ end
50
+
51
+
52
+
53
+ private
54
+
55
+ def do_map_direct_copy
56
+ @target_fields.each do |target_field|
57
+ @target_df[target_field] = @source_df[@source_fields.first].dup
58
+ end
59
+ end
60
+
61
+ def do_map_single_source_and_target_field
62
+ @target_df[@target_fields.first] = @source_df[@source_fields.first].recode do |field_value|
63
+ @transforms.reduce(field_value) { |value, tform| tform.call(*(value || [nil])) }
64
+ end
65
+ end
66
+
67
+ def do_map_generic
68
+ work_vector = if @source_fields.size == 1 && @source_fields.first != nil
69
+ @source_df[@source_fields.first].dup
70
+ elsif @source_fields.size > 1
71
+ # It's faster to zip together several vectors and recode those than it is to
72
+ # recode a dataframe row by row!
73
+ Daru::Vector.new(@source_df[@source_fields.first].zip(*@source_fields[1..-1].map { |name| @source_df[name] }), index: @source_df.index)
74
+ else
75
+ Daru::Vector.new([], index: @source_df.index)
76
+ end
77
+
78
+ work_vector.recode! do |field_value|
79
+ @transforms.reduce(field_value) { |value, tform| tform.call(*(value || [nil])) }
80
+ end
81
+
82
+ @target_fields.each_with_index do |target_field, field_idx|
83
+ @target_df[target_field] = work_vector.recode do |field_value|
84
+ if field_value.is_a?(Array) then
85
+ field_value[field_idx]
86
+ else
87
+ field_value
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,137 @@
1
+ module Remi
2
+ module Transform
3
+ extend self
4
+
5
+ def [](meth)
6
+ method(meth)
7
+ end
8
+
9
+ # We need to memoize each lambda with its static arguments so it's not recreated each row.
10
+ # Inspired by parameter memoization in http://www.justinweiss.com/articles/4-simple-memoization-patterns-in-ruby-and-one-gem/
11
+ def memoize_as_lambda(func, *args, &block)
12
+ iv = instance_variable_get("@#{func}")
13
+ return iv[args] if iv
14
+
15
+ hash_memo = Hash.new do |h, margs|
16
+ h[margs] = lambda { |*largs| block.call(margs, *largs) }
17
+ end
18
+ instance_variable_set("@#{func}", hash_memo)[args]
19
+ end
20
+
21
+ def prefix(prefix)
22
+ memoize_as_lambda(__method__, prefix) do |(mprefix), larg|
23
+ "#{mprefix}#{larg}"
24
+ end
25
+ end
26
+
27
+ def postfix(postfix)
28
+ memoize_as_lambda(__method__, postfix) do |(mpostfix), larg|
29
+ "#{larg}#{mpostfix}"
30
+ end
31
+ end
32
+
33
+ def concatenate(delimiter="")
34
+ memoize_as_lambda(__method__, delimiter) do |(mdelimiter), *largs|
35
+ Array(largs).join(mdelimiter)
36
+ end
37
+ end
38
+
39
+ def lookup(h_lookup, missing: nil)
40
+ memoize_as_lambda(__method__, h_lookup, missing) do |(mh_lookup, mmissing), larg|
41
+ result = mh_lookup[larg]
42
+
43
+ if !result.nil?
44
+ result
45
+ elsif mmissing.class == Proc
46
+ mmissing.call(larg)
47
+ else
48
+ mmissing
49
+ end
50
+ end
51
+ end
52
+
53
+ def nvl
54
+ memoize_as_lambda(__method__) do |*largs|
55
+ Array(largs).find('') { |arg| !arg.blank? }
56
+ end
57
+ end
58
+
59
+ def ifblank(replace_with)
60
+ memoize_as_lambda(__method__, replace_with) do |(mreplace_with), larg|
61
+ larg.blank? ? mreplace_with : larg
62
+ end
63
+ end
64
+
65
+ def format_date(from_fmt: '%m/%d/%Y', to_fmt: '%Y-%m-%d')
66
+ memoize_as_lambda(__method__, from_fmt, to_fmt) do |(mfrom_fmt, mto_fmt), larg|
67
+ begin
68
+ if larg.blank? then
69
+ ''
70
+ elsif larg.respond_to? :strftime
71
+ larg.strftime(mto_fmt)
72
+ else
73
+ Date.strptime(larg, mfrom_fmt).strftime(mto_fmt)
74
+ end
75
+ rescue ArgumentError => err
76
+ puts "Error parsing date (#{larg.class}): '#{larg}'"
77
+ raise err
78
+ end
79
+ end
80
+ end
81
+
82
+
83
+ def parse_date(format: '%Y-%m-%d', if_blank: nil)
84
+ memoize_as_lambda(__method__, format, if_blank.try(:to_sym)) do |(mformat, mif_blank), larg|
85
+ begin
86
+ if larg.blank? then
87
+ if mif_blank == :low
88
+ Date.new(1900,01,01)
89
+ elsif mif_blank == :high
90
+ Date.new(2999,12,31)
91
+ else
92
+ mif_blank
93
+ end
94
+ else
95
+ Date.strptime(larg, mformat)
96
+ end
97
+ rescue ArgumentError => err
98
+ puts "Error parsing date (#{larg.class}): '#{larg}')"
99
+ raise err
100
+ end
101
+ end
102
+ end
103
+
104
+ def date_diff(measure = :days)
105
+ memoize_as_lambda(__method__, measure.to_sym) do |(mmeasure), *larg|
106
+ if mmeasure == :days
107
+ (larg.last - larg.first).to_i
108
+ elsif mmeasure == :months
109
+ (larg.last.year * 12 + larg.last.month) - (larg.first.year * 12 + larg.first.month)
110
+ elsif mmeasure == :years
111
+ larg.last.year - larg.first.year
112
+ else
113
+ raise "I don't know how to handle #{mmeasure} yet"
114
+ end
115
+ end
116
+ end
117
+
118
+ def constant(const)
119
+ memoize_as_lambda(__method__, const) do |(mconst), larg|
120
+ mconst
121
+ end
122
+ end
123
+
124
+ def replace(regex, replace_with)
125
+ memoize_as_lambda(__method__, regex, replace_with) do |(mregex, mreplace_with), larg|
126
+ larg.gsub(regex, replace_with)
127
+ end
128
+ end
129
+
130
+ def validate_email(substitute='')
131
+ memoize_as_lambda(__method__, substitute) do |(msubstitute), larg|
132
+ larg.match(/^.+@[a-z0-9\-\.]+$/i) ? larg : msubstitute
133
+ end
134
+ end
135
+
136
+ end
137
+ end
data/lib/remi/version.rb CHANGED
@@ -0,0 +1,3 @@
1
+ module Remi
2
+ VERSION = '0.2.2'
3
+ end
data/remi.gemspec CHANGED
@@ -1,18 +1,36 @@
1
- # -*- encoding: utf-8 -*-
1
+ # -*- encoding: utf-8 mode: ruby -*-
2
2
  $:.push File.expand_path("../lib", __FILE__)
3
3
  require "remi/version"
4
4
 
5
5
  Gem::Specification.new do |s|
6
6
  s.name = "remi"
7
- s.version = "0.0.1"
7
+ s.version = Remi::VERSION
8
8
  s.authors = ["Sterling Paramore"]
9
- s.email = ["gnilrets@gmail.com"]
10
- s.homepage = "https://github.com/gnilrets"
11
- s.license = "Apache-2.0"
12
- s.summary = "Remi (Ruby Extract Modify and Integrate)"
13
- s.description = "Data manipulation in Ruby"
9
+ s.email = ["sterling.paramore@insidetrack.com"]
10
+ s.homepage = "https://github.com/inside-track/remi"
11
+ s.license = "MIT"
12
+ s.summary = "Remi (Ruby Extract Map Integrate)"
13
+ s.description = "Data manipulation and ETL in Ruby"
14
14
 
15
15
  s.rubyforge_project = "Remi"
16
+ s.add_runtime_dependency "daru", ["~> 0.1"]
17
+
18
+ s.add_runtime_dependency 'bond', ['~> 0.5']
19
+ s.add_runtime_dependency 'docile', ['~> 1.1']
20
+ s.add_runtime_dependency 'net-sftp', ['~> 2.1']
21
+ s.add_runtime_dependency 'pg', ['~> 0.18']
22
+
23
+ s.add_runtime_dependency "cucumber", ["~> 2.1"]
24
+ s.add_runtime_dependency "rspec", ["~> 3.3"]
25
+ s.add_runtime_dependency "regexp-examples", ["~> 1.1"]
26
+
27
+ s.add_runtime_dependency "activesupport", ["~> 4.2"]
28
+
29
+ # Move these into separate package
30
+ s.add_runtime_dependency 'restforce', ['~> 2.1']
31
+ s.add_runtime_dependency 'salesforce_bulk_api', ['0.0.12']
32
+
33
+ s.add_development_dependency 'iruby', ['0.2.7']
16
34
 
17
35
  s.files = `git ls-files`.split("\n")
18
36
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
@@ -0,0 +1,56 @@
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": null,
6
+ "metadata": {
7
+ "collapsed": false
8
+ },
9
+ "outputs": [],
10
+ "source": [
11
+ "require_relative \"#{Dir.pwd}/workbook_helper\"\n",
12
+ "\n",
13
+ "require 'benchmark'"
14
+ ]
15
+ },
16
+ {
17
+ "cell_type": "code",
18
+ "execution_count": null,
19
+ "metadata": {
20
+ "collapsed": false
21
+ },
22
+ "outputs": [],
23
+ "source": [
24
+ "# Safest to delete and rebuild class when developing\n",
25
+ "Object.send(:remove_const, :SomeJob) if Object.constants.include?(:SomeJob)\n",
26
+ "\n",
27
+ "class SomeJob\n",
28
+ " include Remi::Job\n",
29
+ " define_target :my_lookup, Hash\n",
30
+ " define_transform :populate_lookup, targets: :my_lookup do\n",
31
+ " my_lookup[:happy] = \"bear\"\n",
32
+ " my_lookup[:smacks] = \"honey\"\n",
33
+ " end\n",
34
+ "end\n",
35
+ "\n",
36
+ "job = SomeJob.new.run\n",
37
+ "job.my_lookup"
38
+ ]
39
+ }
40
+ ],
41
+ "metadata": {
42
+ "kernelspec": {
43
+ "display_name": "Ruby 2.2.2",
44
+ "language": "ruby",
45
+ "name": "ruby"
46
+ },
47
+ "language_info": {
48
+ "file_extension": "rb",
49
+ "mimetype": "application/x-ruby",
50
+ "name": "ruby",
51
+ "version": "2.2.2"
52
+ }
53
+ },
54
+ "nbformat": 4,
55
+ "nbformat_minor": 0
56
+ }
@@ -0,0 +1 @@
1
+ require_relative '../lib/remi'
metadata CHANGED
@@ -1,32 +1,250 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: remi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sterling Paramore
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-01 00:00:00.000000000 Z
12
- dependencies: []
13
- description: Data manipulation in Ruby
11
+ date: 2016-01-21 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: daru
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.1'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bond
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.5'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.5'
41
+ - !ruby/object:Gem::Dependency
42
+ name: docile
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.1'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.1'
55
+ - !ruby/object:Gem::Dependency
56
+ name: net-sftp
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '2.1'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '2.1'
69
+ - !ruby/object:Gem::Dependency
70
+ name: pg
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.18'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.18'
83
+ - !ruby/object:Gem::Dependency
84
+ name: cucumber
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '2.1'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '2.1'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rspec
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '3.3'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '3.3'
111
+ - !ruby/object:Gem::Dependency
112
+ name: regexp-examples
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '1.1'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '1.1'
125
+ - !ruby/object:Gem::Dependency
126
+ name: activesupport
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '4.2'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '4.2'
139
+ - !ruby/object:Gem::Dependency
140
+ name: restforce
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '2.1'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '2.1'
153
+ - !ruby/object:Gem::Dependency
154
+ name: salesforce_bulk_api
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - '='
158
+ - !ruby/object:Gem::Version
159
+ version: 0.0.12
160
+ type: :runtime
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - '='
165
+ - !ruby/object:Gem::Version
166
+ version: 0.0.12
167
+ - !ruby/object:Gem::Dependency
168
+ name: iruby
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - '='
172
+ - !ruby/object:Gem::Version
173
+ version: 0.2.7
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - '='
179
+ - !ruby/object:Gem::Version
180
+ version: 0.2.7
181
+ description: Data manipulation and ETL in Ruby
14
182
  email:
15
- - gnilrets@gmail.com
16
- executables: []
183
+ - sterling.paramore@insidetrack.com
184
+ executables:
185
+ - remi
17
186
  extensions: []
18
187
  extra_rdoc_files: []
19
188
  files:
20
- - .gitignore
189
+ - ".bundle/config"
190
+ - ".gitignore"
191
+ - ".rspec"
192
+ - ".ruby-version"
193
+ - Gemfile
194
+ - Gemfile.lock
195
+ - LICENSE.txt
21
196
  - README.md
22
- - lib/noodling.rb
197
+ - bin/remi
198
+ - doc/install-rbenv-os_x.md
23
199
  - lib/remi.rb
200
+ - lib/remi/cli.rb
201
+ - lib/remi/core/daru.rb
202
+ - lib/remi/core/refinements.rb
203
+ - lib/remi/core/string.rb
204
+ - lib/remi/cucumber.rb
205
+ - lib/remi/cucumber/business_rules.rb
206
+ - lib/remi/cucumber/data_source.rb
207
+ - lib/remi/data_source.rb
208
+ - lib/remi/data_source/csv_file.rb
209
+ - lib/remi/data_source/data_frame.rb
210
+ - lib/remi/data_source/postgres.rb
211
+ - lib/remi/data_source/salesforce.rb
212
+ - lib/remi/data_subject.rb
213
+ - lib/remi/data_target.rb
214
+ - lib/remi/data_target/csv_file.rb
215
+ - lib/remi/data_target/data_frame.rb
216
+ - lib/remi/data_target/salesforce.rb
217
+ - lib/remi/extractor/sftp_file.rb
218
+ - lib/remi/field_symbolizers.rb
219
+ - lib/remi/job.rb
220
+ - lib/remi/lookup/regex_sieve.rb
221
+ - lib/remi/project/features/examples.feature
222
+ - lib/remi/project/features/formulas.feature
223
+ - lib/remi/project/features/sample_job.feature
224
+ - lib/remi/project/features/step_definitions/remi_step.rb
225
+ - lib/remi/project/features/support/env.rb
226
+ - lib/remi/project/features/support/env_app.rb
227
+ - lib/remi/project/features/transforms/date_diff.feature
228
+ - lib/remi/project/features/transforms/parse_date.feature
229
+ - lib/remi/project/features/transforms/prefix.feature
230
+ - lib/remi/project/jobs/all_jobs_shared.rb
231
+ - lib/remi/project/jobs/copy_source_job.rb
232
+ - lib/remi/project/jobs/sample_job.rb
233
+ - lib/remi/project/jobs/transforms/date_diff_job.rb
234
+ - lib/remi/project/jobs/transforms/parse_date_job.rb
235
+ - lib/remi/project/jobs/transforms/prefix_job.rb
236
+ - lib/remi/project/jobs/transforms/transform_jobs.rb
237
+ - lib/remi/settings.rb
238
+ - lib/remi/sf_bulk_helper.rb
239
+ - lib/remi/source_to_target_map.rb
240
+ - lib/remi/transform.rb
24
241
  - lib/remi/version.rb
25
242
  - remi.gemspec
26
- - test/test_NAME.rb
27
- homepage: https://github.com/gnilrets
243
+ - workbooks/sample_workbook.ipynb
244
+ - workbooks/workbook_helper.rb
245
+ homepage: https://github.com/inside-track/remi
28
246
  licenses:
29
- - Apache-2.0
247
+ - MIT
30
248
  metadata: {}
31
249
  post_install_message:
32
250
  rdoc_options: []
@@ -34,19 +252,18 @@ require_paths:
34
252
  - lib
35
253
  required_ruby_version: !ruby/object:Gem::Requirement
36
254
  requirements:
37
- - - '>='
255
+ - - ">="
38
256
  - !ruby/object:Gem::Version
39
257
  version: '0'
40
258
  required_rubygems_version: !ruby/object:Gem::Requirement
41
259
  requirements:
42
- - - '>='
260
+ - - ">="
43
261
  - !ruby/object:Gem::Version
44
262
  version: '0'
45
263
  requirements: []
46
264
  rubyforge_project: Remi
47
- rubygems_version: 2.2.1
265
+ rubygems_version: 2.4.5
48
266
  signing_key:
49
267
  specification_version: 4
50
- summary: Remi (Ruby Extract Modify and Integrate)
51
- test_files:
52
- - test/test_NAME.rb
268
+ summary: Remi (Ruby Extract Map Integrate)
269
+ test_files: []