km-export-processor 0.1.0 → 0.2.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: 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: