gooddata_eloqua 0.0.5 → 0.1.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: dce7c75c7504f96b9124feb1a3f18eac14a6a4d7
4
- data.tar.gz: e1ad512ea7480ae7b92bd23d67c9c5e00bbf168c
3
+ metadata.gz: 3bfdd680536bdc65c7003fdc816748ebf2006d9e
4
+ data.tar.gz: 62904c80d1487d0bb8b8553c62aaa5d49f25a84f
5
5
  SHA512:
6
- metadata.gz: 701b92182ef8ab98a632b9105fdb7ed540f9312be7b25e494024da662e651e46bf2d95fdd8f886d3f19e4bbee423197c8e9dfde46d41bdaf8634cadc4d6c554c
7
- data.tar.gz: cb49375f087136a0b554200610800e6ffbd1b8b05fb3417f362543794182a6ba24757bb778e2ad25a5fef68a76212fba3cba1bf7fbe716b283a34f4a571b149c
6
+ metadata.gz: 1a8f3d93a69619c86c4b4c0dda011d72bb2d55be269e618ee170628ed76bbb19979d94d993fef30c44331eb17886a45bb8c5d718d2259f9c1e320683ef31b8f2
7
+ data.tar.gz: 9e3a548f9ce3b9940973ed8e5a044375c9b5e9e924512ba73a689a66f1160b30b2e84d9d1ba2b6980917e946064a39011eaf75614ce148ee4d90af7bf2021896
@@ -29,9 +29,9 @@ class GoodDataEloqua::Request
29
29
 
30
30
  end
31
31
 
32
- def write_all_ids_return_csv(file_name, config={})
33
-
32
+ def download_all_ids_return_csv(file_name, config={})
34
33
 
34
+ puts "#{Time.now} => Downloading IDs..."
35
35
  if file_name
36
36
  fd = IO.sysopen("./downloads/#{file_name}", 'w+')
37
37
  end
@@ -42,22 +42,47 @@ class GoodDataEloqua::Request
42
42
  pages = first_download['total'].to_i
43
43
  total = (pages/1000).round
44
44
 
45
- total = 1 if total == 0
45
+ total = 1 if total == 0 || total < 1
46
46
 
47
47
  if total == 1
48
48
 
49
+ count = 0
49
50
  first_download['elements'].each { |record|
51
+ count += 1
50
52
  csv << [record['id']]
51
53
  }
52
54
 
55
+ puts "#{Time.now} => #{count} IDs extracted."
56
+ puts "#{Time.now} => Flushing IO to \"./downloads/#{file_name}\"\n"
53
57
  csv.flush
54
58
 
55
- puts "\n#{Time.now} => Flushing IO (#{@session_csv}.id)..."
56
-
57
59
  else
58
60
 
59
- self.get_all_distributed total, csv
60
- puts "\n#{Time.now} => Flushing IO (#{@session_csv}.id)..."
61
+ iterations = []
62
+ total.times { |i| iterations << i }
63
+ iterations << total
64
+
65
+ puts "#{Time.now} => #{iterations.length} pages queued for download."
66
+ count = iterations.length
67
+ mutex = Mutex.new
68
+ iterations.pmap { |page|
69
+
70
+ response = self.get_all_by_page(page)
71
+ print "\r#{Time.now} => Extracting page: #{page} of #{count}\s\s\s"
72
+
73
+ mutex.synchronize {
74
+ count -= 1
75
+ response['elements'].each { |element|
76
+ csv << [element['id']]
77
+ }
78
+ }
79
+
80
+ }
81
+
82
+ csv.flush
83
+ puts "#{Time.now} => #{count} IDs extracted."
84
+
85
+ puts "\n#{Time.now} => Flushing IO to \"./downloads/#{file_name}\"\n"
61
86
 
62
87
  end
63
88
 
@@ -65,98 +90,197 @@ class GoodDataEloqua::Request
65
90
 
66
91
  end
67
92
 
68
- def ids_to_eloqua_return_csv(csv, config = {})
93
+ def get_complete_profile_from_ids_csv(csv, config = {})
94
+
95
+ return unless File.exists? "./downloads/#{csv}"
69
96
 
97
+ puts "#{Time.now} => Extracting complete profile from IDs..."
70
98
  if csv
71
99
  fd = IO.sysopen("./downloads/#{csv}", 'r')
72
100
  end
73
101
 
74
- started_method = Time.now
75
-
76
- write_path = "./downloads/#{@session_id}_complete.csv"
77
- write_fd = IO.sysopen(write_path, 'w+')
78
- csv = CSV.new(IO.new(write_fd))
79
- pool = Pool.new
80
-
102
+ file_name = "./downloads/#{@session_id}_complete_profile.csv"
103
+ write_fd = IO.sysopen(file_name, 'w+')
104
+ @csv = CSV.new(IO.new(write_fd))
105
+ mutex = Mutex.new
81
106
  CSV.open(fd) do |read_csv|
82
107
 
83
108
  ids = read_csv.map { |row|
84
109
  row[0]
85
110
  }
86
111
 
87
- puts "#{Time.now} => Extracted from CSV: #{ids.length}\n"
112
+ return if ids.empty?
88
113
 
89
- elapsed_times = []
114
+ headers = nil
115
+ rows = []
116
+ count = 0
90
117
 
91
- loop do
118
+ def process_batch_of_rows batch
92
119
 
93
- batch = ids.slice!(1..20)
120
+ batch.each { |row|
121
+ @csv << row
122
+ }
94
123
 
95
- started_batch = Time.now
124
+ end
96
125
 
97
- if elapsed_times.length > 5
98
- estimated_time = elapsed_times.inject{ |sum, el| sum + el }.to_f / elapsed_times.size
99
- else
100
- estimated_time = 0
126
+ ids.pmap { |id|
127
+ count += 1
128
+ response = self.get_one_by_id(id)
129
+
130
+ case response['type']
131
+ when "Contact"
132
+ keys = 'fieldValues'
133
+ when "Campaign"
134
+ keys = 'elements'
135
+ when "Email"
136
+ keys = 'htmlContent'
137
+ when "Form"
138
+ keys = 'elements'
139
+ else
140
+ keys = 'elements'
101
141
  end
102
142
 
103
- if (estimated_time/60) > 60 && estimated_time != 0
104
- time_readable = "#{((estimated_time/60)/60).round(2)} hours"
105
-
106
- elsif (estimated_time/60) < 60 && (estimated_time/60) > 1 && estimated_time != 0
107
- time_readable = "#{(estimated_time/60).round(2)} minutes"
143
+ if response.empty?
108
144
 
109
- elsif (estimated_time/60) > 0 && estimated_time != 0
110
- time_readable = "#{(estimated_time).round(2)} seconds"
145
+ payload = [[id]]
111
146
 
112
147
  else
113
- time_readable = 'Estimating...'
114
148
 
115
- end
149
+ if headers == nil
116
150
 
117
- break unless batch.length > 0 && pool.list.length
151
+ begin
152
+ unless response[keys].empty?
118
153
 
119
- #
120
- batch.each { |i|
121
- pool.thread {
122
- response = self.get_one_by_id(i)
123
- csv << response.values
124
- csv.flush
125
- print "\r#{Time.now} => IDs Remaing: #{ids.length} - Complete: #{time_readable} - Thread Pool: #{pool.active_threads} \s\s\s\s"
126
- }
127
- }
154
+ element_keys = response[keys][0].keys.map { |key|
155
+ "element_#{key}"
156
+ }
128
157
 
129
- ended_batch = Time.now
158
+ else
159
+ element_keys = []
160
+ end
130
161
 
131
- elapsed_time = ended_batch - started_batch
132
- number_of_estimated_chunks = ids.length/20
133
- estimated_batch_time = (elapsed_time*number_of_estimated_chunks).round
162
+ headers = response.keys + element_keys
163
+
164
+ rescue NoMethodError
165
+ headers = [id]
166
+ end
134
167
 
135
- if elapsed_times.length < 10
136
- elapsed_times << estimated_batch_time
137
- elsif elapsed_times.length > 50
138
- 40.times do
139
- elapsed_times.pop
140
168
  end
141
- end
142
169
 
170
+ if response[keys].is_a? Array
171
+ if response[keys].empty?
172
+ payload = [response.values]
173
+ else
174
+ payload = []
175
+
176
+ response[keys].each { |element|
177
+ payload << response.values + element.values
178
+ }
179
+ end
180
+ else
181
+ payload = [response]
182
+ end
143
183
 
144
- if pool.active_threads > 21
145
- sleep 3
146
184
  end
147
185
 
148
- break if ids.length == 0 && pool.list.length
186
+ rows << payload
187
+ print "\r#{Time.now} => IDs Remaining: #{ids.length-count} Pool: #{rows.length}-#{Thread.current}"
188
+ }
149
189
 
190
+ count = rows.length
191
+ rows.pmap { |row|
192
+ print "\r#{Time.now} => Dumping pool to CSV #{count}\s\s\s\s"
193
+ count -= 1
194
+ @csv << row
195
+ }
150
196
 
151
- end
197
+ @csv.flush
152
198
 
199
+ puts "\n#{Time.now} => Flushing IO to \"#{file_name}\"\n"
153
200
 
201
+ end
154
202
 
155
- puts "#{Time.now} => Complete. CSV written to \"./downloads/#{@session_id}_complete.csv\""
203
+ file_name
204
+
205
+ #
206
+ #
207
+ # CSV.open(fd) do |read_csv|
208
+ #
209
+ #
210
+ #
211
+ # puts "#{Time.now} => Extracted from CSV: #{ids.length}\n"
212
+ #
213
+ # elapsed_times = []
214
+ #
215
+ # loop do
216
+ #
217
+ # batch = ids.slice!(1..20)
218
+ #
219
+ # started_batch = Time.now
220
+ #
221
+ # if elapsed_times.length > 5
222
+ # estimated_time = elapsed_times.inject{ |sum, el| sum + el }.to_f / elapsed_times.size
223
+ # else
224
+ # estimated_time = 0
225
+ # end
226
+ #
227
+ # if (estimated_time/60) > 60 && estimated_time != 0
228
+ # time_readable = "#{((estimated_time/60)/60).round(2)} hours"
229
+ #
230
+ # elsif (estimated_time/60) < 60 && (estimated_time/60) > 1 && estimated_time != 0
231
+ # time_readable = "#{(estimated_time/60).round(2)} minutes"
232
+ #
233
+ # elsif (estimated_time/60) > 0 && estimated_time != 0
234
+ # time_readable = "#{(estimated_time).round(2)} seconds"
235
+ #
236
+ # else
237
+ # time_readable = 'Estimating...'
238
+ #
239
+ # end
240
+ #
241
+ # break unless batch.length > 0 && pool.list.length
242
+ #
243
+ # #
244
+ # batch.each { |i|
245
+ # pool.thread {
246
+ # response = self.get_one_by_id(i)
247
+ # csv << response.values
248
+ # csv.flush
249
+ # print "\r#{Time.now} => IDs Remaing: #{ids.length} - Complete: #{time_readable} - Thread Pool: #{pool.active_threads} \s\s\s\s"
250
+ # }
251
+ # }
252
+ #
253
+ # ended_batch = Time.now
254
+ #
255
+ # elapsed_time = ended_batch - started_batch
256
+ # number_of_estimated_chunks = ids.length/20
257
+ # estimated_batch_time = (elapsed_time*number_of_estimated_chunks).round
258
+ #
259
+ # if elapsed_times.length < 10
260
+ # elapsed_times << estimated_batch_time
261
+ # elsif elapsed_times.length > 50
262
+ # 40.times do
263
+ # elapsed_times.pop
264
+ # end
265
+ # end
266
+ #
267
+ #
268
+ # if pool.active_threads > 21
269
+ # sleep 3
270
+ # end
271
+ #
272
+ # break if ids.length == 0 && pool.list.length
273
+ #
274
+ #
275
+ # end
276
+ #
277
+ #
278
+ #
279
+ # puts "#{Time.now} => Complete. CSV written to \"./downloads/#{@session_id}_complete.csv\""
280
+ #
281
+ # end
156
282
 
157
- end
158
283
 
159
- write_path
160
284
 
161
285
  end
162
286
 
@@ -167,36 +291,49 @@ class GoodDataEloqua::Request
167
291
  num_iterations.times { |i| iterations << i }
168
292
  iterations << num_iterations
169
293
 
170
- pool = Pool.new
171
-
172
- while pool.running do
173
-
174
- batch = iterations.slice!(1..20)
294
+ mutex = Mutex.new
175
295
 
176
- break unless batch
177
-
178
- batch.each { |i|
179
- pool.thread {
180
- response = self.get_all_by_page(i)
181
- response['elements'].each { |element|
182
- csv << [element['id']]
183
- }
184
- csv.flush
185
- print "\r#{Time.now} => Pages #{iterations.length} of #{num_iterations} - Workers: #{pool.active_threads}\s"
296
+ iterations.pmap { |page|
297
+ response = self.get_all_by_page(page)
298
+ puts "#{Time.now} => Extracting page: #{page}"
299
+ mutex.synchronize {
300
+ response['elements'].each { |element|
301
+ csv << [element['id']]
186
302
  }
187
- }
188
303
 
189
- if pool.active_threads > 20
190
- sleep 2
191
- end
192
-
193
- if iterations.length == 0 && pool.active_threads == 0
194
- pool.running = false
195
- else
196
- next
197
- end
304
+ }
198
305
 
199
- end
306
+ }
307
+
308
+ csv.flush
309
+
310
+ # pool = Pool.new
311
+ #
312
+ # while pool.running do
313
+ #
314
+ # batch = iterations.slice!(1..20)
315
+ #
316
+ # break unless batch
317
+ #
318
+ # batch.each { |i|
319
+ # pool.thread {
320
+ #
321
+ #
322
+ # print "\r#{Time.now} => Pages #{iterations.length} of #{num_iterations} - Workers: #{pool.active_threads}\s"
323
+ # }
324
+ # }
325
+ #
326
+ # if pool.active_threads > 20
327
+ # sleep 2
328
+ # end
329
+ #
330
+ # if iterations.length == 0 && pool.active_threads == 0
331
+ # pool.running = false
332
+ # else
333
+ # next
334
+ # end
335
+ #
336
+ # end
200
337
 
201
338
  end
202
339
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gooddata_eloqua
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Patrick McConlogue
@@ -28,16 +28,16 @@ dependencies:
28
28
  name: gooddata_s3
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - '='
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: '0.1'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - '='
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
40
+ version: '0.1'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rest-client
43
43
  requirement: !ruby/object:Gem::Requirement