remi 0.0.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
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: []