km-export-processor 0.1.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 22bdc26538542d7771c79800ade24fe795a4a7a8
4
- data.tar.gz: ea7099b19ff77405b98c0a4c6f96d743ce190176
3
+ metadata.gz: 0d3ac999d514d6a7934b57f20d9b0348cbf53511
4
+ data.tar.gz: ef204f4103e100e7be136c9ab076432e5c8652d2
5
5
  SHA512:
6
- metadata.gz: 24daf8ac6bc1499676824342f3037353855f82a5a661d3669ac96f4837f3809ae29aa832efd786659d19d95665042f75cb5bafce6fea30c6fe6208cec2c68d0e
7
- data.tar.gz: d32efbd85938438b6d19821e8e010a5d57685b2dbc1ba6ae44cf3192c6157cb01f4cac90982518171996b3df281fb47a5b9dfd7e1f10226ef6f4d082ddbc7403
6
+ metadata.gz: 480ffa22ca733b1fc31fdb447a729d3bb3c6431e171c66f8c9d680153d81b849a4cea05a58a4e4e7b119861b72a381f8f65724f8c1ff03dafba472bdcd4b132c
7
+ data.tar.gz: 5c2d7b3705625808e4a70fbc9f254494beb6e750814548aa1eb371005d6c1f2e348c3d4b51b18bbe4cabee179733ee7f2363a1f70be0678c4689f854bd3417df
@@ -26,8 +26,7 @@ class CLI < Thor
26
26
  def reimport(jsonfile, apikey)
27
27
  puts "Sending data from #{jsonfile} to KISSmetrics product with key: #{apikey}"
28
28
  reimporter = KMExport::Reimporter.new
29
- file = File.open(jsonfile)
30
- reimporter.send_to_KM(file.read, apikey)
29
+ reimporter.send_to_KM(jsonfile, apikey)
31
30
  end
32
31
  end
33
32
 
@@ -16,5 +16,7 @@ module KMExport
16
16
  new_file = File.open(jsonfile, "w+")
17
17
  new_file.write(JSON.pretty_generate(data))
18
18
  alias_file.write(JSON.pretty_generate(aliases))
19
+ new_file.close
20
+ alias_file.close
19
21
  end
20
22
  end
@@ -14,5 +14,6 @@ module KMExport
14
14
  output = File.open(Time.now.to_i.to_s + "_result.json", "w+")
15
15
 
16
16
  output.write(JSON.pretty_generate(result))
17
+ output.close
17
18
  end
18
19
  end
@@ -1,6 +1,7 @@
1
1
  require 'json'
2
2
  require 'csv'
3
3
  require 'kmts'
4
+ require 'thread'
4
5
 
5
6
  module KMExport
6
7
  end
@@ -1,16 +1,41 @@
1
+ class JSONQueue < Queue
2
+ def initialize(opts)
3
+ super()
4
+ @file = opts[:file]
5
+ @counter = opts[:counter]
6
+ end
7
+
8
+ def add_to_queue
9
+ json = JSON.parse(File.read(@file))
10
+ json.each do |line|
11
+ self << line
12
+ end
13
+ end
14
+ end
15
+
1
16
  module KMExport
2
17
  class Reimporter
3
18
  def send_to_KM(json, key)
4
- KMTS.init(key,
5
- :use_cron => false,
6
- :to_stderr => true)
7
-
8
- logs = JSON.parse(json)
9
- logs.each do |line|
10
- send_line_to_KM(line)
11
- STDOUT.print('.')
19
+ pool = 10
20
+ threads = []
21
+ queue = JSONQueue.new({file: json, counter: 0})
22
+
23
+ queue.add_to_queue
24
+
25
+ pool.times do
26
+ threads << Thread.new do
27
+ KMTS.init(key,
28
+ :use_cron => false,
29
+ :to_stderr => true)
30
+ until queue.empty?
31
+ work_unit = queue.pop(true) rescue nil
32
+ send_line_to_KM(work_unit)
33
+ end
34
+ end
12
35
  end
13
36
 
37
+ threads.each { |t| t.join }
38
+
14
39
  STDOUT.print('Reimportation process completed.')
15
40
  end
16
41
 
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+
3
+ describe "alias_parser" do
4
+ before :all do
5
+ @aliasfilename = Time.now.to_i.to_s + "_test_alias.json"
6
+ testfile = File.open(@aliasfilename, "w+")
7
+ json = JSON.pretty_generate(
8
+ [
9
+ {_p2: "test", _p: "test1"},
10
+ {test2: "test2"},
11
+ {_p2: "test", _p: "test2"},
12
+ {test: "test"},
13
+ {_p2: "test", _p: "test3"},
14
+ {test3: "test3", test: "test3"}
15
+ ]
16
+ )
17
+ testfile.write(json)
18
+ testfile.close
19
+ KMExport.alias_parser(@aliasfilename)
20
+ end
21
+
22
+ it "removes aliases from JSON file" do
23
+ file = File.open(@aliasfilename)
24
+ json = JSON.parse(file.read)
25
+ json.select { |row| row["_p2"] }.length.should eq 0
26
+ end
27
+
28
+ it "creates new JSON file with aliases" do
29
+ file = File.open(Dir["*aliases.json"].first)
30
+ json = JSON.parse(file.read)
31
+ json.length.should eq 3
32
+ end
33
+
34
+ after :all do
35
+ File.delete(@aliasfilename)
36
+ File.delete(Dir["*aliases.json"].first)
37
+ end
38
+ end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ describe "json_to_csv" do
4
+ before :all do
5
+ @testfilename = Time.now.to_i.to_s + "_test.json"
6
+ testfile = File.open(@testfilename, "w+")
7
+ json = JSON.pretty_generate(
8
+ [
9
+ {test: "test"},
10
+ {test2: "test2"},
11
+ {test3: "test3", test: "test3"},
12
+ {test: "test"},
13
+ {test2: "test2"},
14
+ {test3: "test3", test: "test3"}
15
+ ]
16
+ )
17
+ testfile.write(json)
18
+ testfile.close
19
+ KMExport.json_to_csv(@testfilename)
20
+ @csv_files = Dir["*converter_result.csv"]
21
+ end
22
+
23
+ it "correctly converts JSON file to a CSV file" do
24
+ @csv_files.length == 1
25
+ end
26
+
27
+ it "uses the correct CSV format" do
28
+ csv = CSV.table(@csv_files.first)
29
+ csv.headers.length.should eq 3
30
+ end
31
+
32
+ after :all do
33
+ File.delete(@testfilename)
34
+ File.delete(@csv_files.first)
35
+ end
36
+ end
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+
3
+ describe "json_to_json" do
4
+ before :all do
5
+ @testfilename1 = Time.now.to_i.to_s + "_test.json"
6
+ @testfilename2 = Time.now.to_i.to_s + "_test2.json"
7
+ @testfilename3 = Time.now.to_i.to_s + "_test3.json"
8
+ testfile = File.open(@testfilename1, "w+")
9
+ testfile2 = File.open(@testfilename2, "w+")
10
+ testfile3 = File.open(@testfilename3, "w+")
11
+ json = JSON.generate({test: "test"})
12
+ json2 = JSON.generate({test2: "test"})
13
+ json3 = JSON.generate({test3: "test"})
14
+ testfile.write(json)
15
+ testfile2.write(json2)
16
+ testfile3.write(json3)
17
+ testfile.close
18
+ testfile2.close
19
+ testfile3.close
20
+ KMExport.json_to_json
21
+ @json_files = Dir["*result.json"]
22
+ end
23
+
24
+ it "creates one JSON file from many" do
25
+ @json_files.length.should eq 1
26
+ end
27
+
28
+ it "creates a JSON file that contains the combined data" do
29
+ file = File.open(@json_files.first)
30
+ json = JSON.parse(file.read)
31
+ json.include?({"test" => "test"}) && json.include?({"test3" => "test"})
32
+ end
33
+
34
+ after :all do
35
+ File.delete(@testfilename1)
36
+ File.delete(@testfilename2)
37
+ File.delete(@testfilename3)
38
+ File.delete(@json_files.first)
39
+ end
40
+ end
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+
3
+ describe "reimporter" do
4
+ before do
5
+ @reimporter = KMExport::Reimporter.new
6
+ @json = JSON.pretty_generate(
7
+ [
8
+ {returning: "1", _p: "testuser", _t: 1384294380 },
9
+ {referrer: "Direct", _p: "testuser", _t: 1384275438, _n: "visited site" },
10
+ {_p2: "testuser2", _p: "testuser", _t: 1387799043 },
11
+ {returning: "1", _p: "testuser1", _t: 1384294380 },
12
+ {referrer: "Direct", _p: "testuser1", _t: 1384275438, _n: "visited site" },
13
+ {_p2: "testuser2", _p: "testuser1", _t: 1387799043 }
14
+ ]
15
+ )
16
+
17
+ @property_url = "http://trk.kissmetrics.com/s"
18
+ @event_url = "http://trk.kissmetrics.com/e"
19
+ @alias_url = "http://trk.kissmetrics.com/a"
20
+
21
+ WebMock.disable_net_connect!
22
+
23
+ stub_request(:get, @property_url).with(:query => hash_including({"returning" => "1"}))
24
+ stub_request(:get, @event_url).with(:query => hash_including({"_n" => "visited site"}))
25
+ stub_request(:get, @alias_url).with(:query => hash_including({"_n" => "testuser2"}))
26
+
27
+ @reimporter.send_to_KM(@json, "1234")
28
+ end
29
+
30
+ it "succesfully sends a request for an event" do
31
+ a_request(:get, @event_url).with(:query => hash_including({"_n" => "visited site"})).should have_been_made.times(2)
32
+ end
33
+
34
+ it "succesfully sends a request for a property" do
35
+ a_request(:get, @property_url).with(:query => hash_including({"returning" => "1"})).should have_been_made.times(2)
36
+ end
37
+
38
+ it "succesfully sends a request for an alias" do
39
+ a_request(:get, @alias_url).with(:query => hash_including({"_n" => "testuser2"})).should have_been_made.times(2)
40
+ end
41
+ end
@@ -0,0 +1,3 @@
1
+ require 'rspec'
2
+ require 'km-export-processor'
3
+ require 'webmock/rspec'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: km-export-processor
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Clay Whitley
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-01-07 00:00:00.000000000 Z
11
+ date: 2014-03-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: kmts
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - ~>
81
81
  - !ruby/object:Gem::Version
82
82
  version: '10.1'
83
+ - !ruby/object:Gem::Dependency
84
+ name: webmock
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ~>
88
+ - !ruby/object:Gem::Version
89
+ version: '1.16'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ~>
95
+ - !ruby/object:Gem::Version
96
+ version: '1.16'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: yard
85
99
  requirement: !ruby/object:Gem::Requirement
@@ -121,6 +135,11 @@ files:
121
135
  - lib/converters/json_to_json.rb
122
136
  - lib/km-export-processor.rb
123
137
  - lib/reimporter.rb
138
+ - spec/features/alias_parser_spec.rb
139
+ - spec/features/json_to_csv_spec.rb
140
+ - spec/features/json_to_json_spec.rb
141
+ - spec/features/reimporter_spec.rb
142
+ - spec/spec_helper.rb
124
143
  - bin/km-export-processor
125
144
  homepage: https://github.com/kissmetrics/km-export-processor
126
145
  licenses: []
@@ -145,5 +164,10 @@ rubygems_version: 2.0.3
145
164
  signing_key:
146
165
  specification_version: 4
147
166
  summary: A gem for processing KM exports
148
- test_files: []
167
+ test_files:
168
+ - spec/features/alias_parser_spec.rb
169
+ - spec/features/json_to_csv_spec.rb
170
+ - spec/features/json_to_json_spec.rb
171
+ - spec/features/reimporter_spec.rb
172
+ - spec/spec_helper.rb
149
173
  has_rdoc: