keen-cli 0.1.7 → 0.1.8
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.
- data/README.md +24 -18
- data/lib/keen-cli/batch_processor.rb +24 -9
- data/lib/keen-cli/events.rb +3 -9
- data/lib/keen-cli/version.rb +1 -1
- data/spec/fixtures/events-array.json +1 -0
- data/spec/keen-cli/batch_processor_spec.rb +15 -0
- data/spec/keen-cli/events_spec.rb +9 -1
- metadata +4 -2
data/README.md
CHANGED
@@ -118,34 +118,39 @@ Various examples:
|
|
118
118
|
|
119
119
|
``` shell
|
120
120
|
# add an empty event
|
121
|
-
$ keen events:add --collection
|
121
|
+
$ keen events:add --collection signups
|
122
122
|
|
123
123
|
# use the shorter form of collection
|
124
|
-
$ keen events:add -c
|
124
|
+
$ keen events:add -c signups
|
125
125
|
|
126
126
|
# add a blank event to a collection specified in a .env file:
|
127
|
-
# KEEN_COLLECTION_NAME=
|
127
|
+
# KEEN_COLLECTION_NAME=signups
|
128
128
|
$ keen events:add
|
129
129
|
|
130
130
|
# add an event from JSON using the --data parameter
|
131
|
-
$ keen events:add -c
|
131
|
+
$ keen events:add -c signups --data "{ \"username\" : \"dzello\", \"city\": \"San Francisco\" }"
|
132
132
|
|
133
133
|
# add an event from key value pairs
|
134
|
-
$ keen events:add -c
|
134
|
+
$ keen events:add -c signups -data "username=dzello&city=SF" --params
|
135
135
|
|
136
136
|
# pipe in events as JSON
|
137
|
-
$ echo "{ \"username\" : \"dzello\", \"
|
137
|
+
$ echo "{ \"username\" : \"dzello\", \"city\": \"San Francisco\" }" | keen events:add -c signups
|
138
138
|
|
139
|
-
# add events from a file that contains newline delimited json
|
140
|
-
# { "
|
141
|
-
# { "
|
142
|
-
# { "
|
139
|
+
# add events from a file that contains newline delimited json:
|
140
|
+
# { "username" : "dzello", "city" : "San Francisco" }
|
141
|
+
# { "username" : "KarlTheFog", "city" : "San Francisco" }
|
142
|
+
# { "username" : "polarvortex", "city" : "Chicago" }
|
143
143
|
$ keen events:add --file events.json
|
144
144
|
|
145
|
-
# add events from a file
|
146
|
-
#
|
147
|
-
|
148
|
-
|
145
|
+
# add events from a file that contains an array of JSON objects
|
146
|
+
# [{ "apple" : "sauce" }, { "banana" : "pudding" }, { "cherry" : "pie" }]
|
147
|
+
$ keen events:add --file events.json
|
148
|
+
|
149
|
+
# add events from a file in CSV format. the first row must be column names:
|
150
|
+
# username, city
|
151
|
+
# dzello, San Francisco
|
152
|
+
# KarlTheFog, San Francisco
|
153
|
+
# polarvortex, Chicago
|
149
154
|
$ keen events:add --file events.csv --csv
|
150
155
|
```
|
151
156
|
|
@@ -178,16 +183,16 @@ Some examples:
|
|
178
183
|
|
179
184
|
``` shell
|
180
185
|
# run a count
|
181
|
-
$ keen queries:run --collection
|
186
|
+
$ keen queries:run --collection signups --analysis-type count
|
182
187
|
1000
|
183
188
|
|
184
189
|
# run a count with collection name from .env
|
185
|
-
# KEEN_COLLECTION_NAME=
|
190
|
+
# KEEN_COLLECTION_NAME=signups
|
186
191
|
$ keen queries:run --analysis-type count
|
187
192
|
1000
|
188
193
|
|
189
194
|
# run a count with a group by
|
190
|
-
$ keen queries:run --collection
|
195
|
+
$ keen queries:run --collection signups --analysis-type count --group-by username
|
191
196
|
[
|
192
197
|
{
|
193
198
|
"username": "dzello",
|
@@ -196,7 +201,7 @@ $ keen queries:run --collection cli-tests --analysis-type count --group-by usern
|
|
196
201
|
]
|
197
202
|
|
198
203
|
# run a query with a timeframe, target property, group by, and interval
|
199
|
-
$ keen queries:run --collection
|
204
|
+
$ keen queries:run --collection signups --analysis-type count_unique --target-property age --group-by source --timeframe last_24_hours --interval hourly
|
200
205
|
|
201
206
|
{
|
202
207
|
"timeframe": {
|
@@ -261,6 +266,7 @@ Parameters that apply to most commands include:
|
|
261
266
|
|
262
267
|
### Changelog
|
263
268
|
|
269
|
+
+ 0.1.8 - Inputted lines can also be arrays of JSON objects. `--batch-size` param is now properly recognized.
|
264
270
|
+ 0.1.7 - Add docs command
|
265
271
|
+ 0.1.6 - Big refactoring to make importing events much cleaner and batching happen automatically. Also adds `queries:url`.
|
266
272
|
+ 0.1.5 – Support adding events from files with `--file`. Optionally add from CSV with `--csv`.
|
@@ -18,16 +18,18 @@ module KeenCli
|
|
18
18
|
# internal state tracking
|
19
19
|
attr_accessor :size
|
20
20
|
attr_accessor :events
|
21
|
+
attr_accessor :total_size
|
21
22
|
|
22
23
|
def initialize(collection, options={})
|
23
24
|
self.collection = collection
|
24
|
-
self.batch_size = options[:
|
25
|
+
self.batch_size = options[:'batch-size'] || DEFAULT_BATCH_SIZE
|
25
26
|
self.csv = options[:csv]
|
26
27
|
self.params = options[:params]
|
27
28
|
self.csv_options = DEFAULT_CSV_OPTIONS.merge(options[:csv_options] || {})
|
28
29
|
self.events = []
|
29
30
|
self.pretty = options[:pretty]
|
30
31
|
self.silent = options[:silent]
|
32
|
+
self.total_size = 0
|
31
33
|
self.reset
|
32
34
|
end
|
33
35
|
|
@@ -46,22 +48,28 @@ module KeenCli
|
|
46
48
|
csv_row = CSV.parse_line(line, self.csv_options)
|
47
49
|
raise "Could not parse! #{line}" unless csv_row
|
48
50
|
|
49
|
-
|
51
|
+
csv_event = row_to_hash(csv_row)
|
52
|
+
add_event_and_flush_if_necessary(csv_event)
|
50
53
|
|
51
54
|
elsif self.params
|
52
55
|
|
53
|
-
|
56
|
+
querystring_event = Utils.parse_data_as_querystring(line)
|
57
|
+
add_event_and_flush_if_necessary(querystring_event)
|
54
58
|
|
55
59
|
else
|
56
60
|
|
57
|
-
|
61
|
+
json_object = JSON.parse(line)
|
58
62
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
+
# if it's an array, lets iterate over and flush as necessary
|
64
|
+
if json_object.is_a?(Array)
|
65
|
+
json_object.each do |json_event|
|
66
|
+
add_event_and_flush_if_necessary(json_event)
|
67
|
+
end
|
68
|
+
else
|
69
|
+
add_event_and_flush_if_necessary(json_object)
|
70
|
+
end
|
63
71
|
|
64
|
-
|
72
|
+
end
|
65
73
|
|
66
74
|
end
|
67
75
|
|
@@ -77,6 +85,13 @@ module KeenCli
|
|
77
85
|
|
78
86
|
private
|
79
87
|
|
88
|
+
def add_event_and_flush_if_necessary(event)
|
89
|
+
self.events.push(event)
|
90
|
+
self.size += 1
|
91
|
+
self.total_size += 1
|
92
|
+
self.flush if self.size >= self.batch_size
|
93
|
+
end
|
94
|
+
|
80
95
|
def set_headers(line)
|
81
96
|
csv_row = CSV.parse_line(line, self.csv_options)
|
82
97
|
self.csv_options[:headers] = csv_row.to_a
|
data/lib/keen-cli/events.rb
CHANGED
@@ -7,7 +7,7 @@ module KeenCli
|
|
7
7
|
def self.events_options
|
8
8
|
option :csv
|
9
9
|
option :params
|
10
|
-
option :'batch-size'
|
10
|
+
option :'batch-size', type: :numeric
|
11
11
|
end
|
12
12
|
|
13
13
|
desc 'events:add', 'Add one or more events and print the result'
|
@@ -30,19 +30,15 @@ module KeenCli
|
|
30
30
|
:params => options[:params],
|
31
31
|
:pretty => options[:pretty],
|
32
32
|
:silent => options[:silent],
|
33
|
-
:
|
34
|
-
|
35
|
-
total_events = 0
|
33
|
+
:'batch-size' => options[:'batch-size'])
|
36
34
|
|
37
35
|
if data = options[:data]
|
38
36
|
batch_processor.add(data)
|
39
|
-
total_events += 1
|
40
37
|
end
|
41
38
|
|
42
39
|
if file = options[:file]
|
43
40
|
File.readlines(file).each do |line|
|
44
41
|
batch_processor.add(line)
|
45
|
-
total_events += 1
|
46
42
|
end
|
47
43
|
end
|
48
44
|
|
@@ -50,18 +46,16 @@ module KeenCli
|
|
50
46
|
ARGV.clear
|
51
47
|
ARGF.each_line do |line|
|
52
48
|
batch_processor.add(line)
|
53
|
-
total_events += 1
|
54
49
|
end
|
55
50
|
end
|
56
51
|
|
57
52
|
if $stdin.tty? && data.nil? && file.nil?
|
58
53
|
batch_processor.add("{}")
|
59
|
-
total_events += 1
|
60
54
|
end
|
61
55
|
|
62
56
|
batch_processor.flush
|
63
57
|
|
64
|
-
|
58
|
+
batch_processor.total_size
|
65
59
|
|
66
60
|
end
|
67
61
|
|
data/lib/keen-cli/version.rb
CHANGED
@@ -0,0 +1 @@
|
|
1
|
+
[{ "foo" : 1 }, { "foo" : 2 }, { "foo" : 3 }]
|
@@ -12,6 +12,10 @@ module KeenCli
|
|
12
12
|
expect(batch_processor.batch_size).to eq(1000)
|
13
13
|
end
|
14
14
|
|
15
|
+
it 'sets total size to 0' do
|
16
|
+
expect(batch_processor.total_size).to eq(0)
|
17
|
+
end
|
18
|
+
|
15
19
|
it 'sets the collection' do
|
16
20
|
expect(batch_processor.collection).to eq('signups')
|
17
21
|
end
|
@@ -47,6 +51,14 @@ module KeenCli
|
|
47
51
|
})
|
48
52
|
end
|
49
53
|
|
54
|
+
it 'converts a JSON array to a series of hashes' do
|
55
|
+
batch_processor.add('[{ "apple": "sauce", "banana": "pancakes" }]')
|
56
|
+
expect(batch_processor.events.first).to eq({
|
57
|
+
"apple" => "sauce",
|
58
|
+
"banana" => "pancakes"
|
59
|
+
})
|
60
|
+
end
|
61
|
+
|
50
62
|
it 'converts a param string to a hash' do
|
51
63
|
batch_processor.params = true
|
52
64
|
batch_processor.add('apple=sauce&banana=pancakes')
|
@@ -98,6 +110,7 @@ module KeenCli
|
|
98
110
|
it 'adds events to an array up to batch size and increments count' do
|
99
111
|
batch_processor.add('{ "apple": "sauce", "banana": "pancakes" }')
|
100
112
|
expect(batch_processor.size).to eq(1)
|
113
|
+
expect(batch_processor.total_size).to eq(1)
|
101
114
|
expect(batch_processor.events.first).to eq({
|
102
115
|
"apple" => "sauce",
|
103
116
|
"banana" => "pancakes"
|
@@ -111,8 +124,10 @@ module KeenCli
|
|
111
124
|
batch_processor.batch_size = 2
|
112
125
|
batch_processor.add('{ "apple": "sauce", "banana": "pancakes" }')
|
113
126
|
expect(batch_processor.size).to eq(1)
|
127
|
+
expect(batch_processor.total_size).to eq(1)
|
114
128
|
batch_processor.add('{ "apple": "sauce", "banana": "pancakes" }')
|
115
129
|
expect(batch_processor.size).to eq(0)
|
130
|
+
expect(batch_processor.total_size).to eq(2)
|
116
131
|
expect(batch_processor.events).to be_empty
|
117
132
|
end
|
118
133
|
|
@@ -28,12 +28,20 @@ describe KeenCli::CLI do
|
|
28
28
|
expect(_).to eq(3)
|
29
29
|
end
|
30
30
|
|
31
|
+
it 'accepts JSON events from a file param in array format' do
|
32
|
+
stub_request(:post, "https://api.keen.io/3.0/projects/#{Keen.project_id}/events").
|
33
|
+
with(:body => "{\"minecraft-deaths\":[{\"foo\":1},{\"foo\":2},{\"foo\":3}]}").
|
34
|
+
to_return(:body => { :created => true }.to_json)
|
35
|
+
_, options = start "events:add --collection minecraft-deaths --file #{File.expand_path('../../fixtures/events-array.json', __FILE__)}"
|
36
|
+
expect(_).to eq(3)
|
37
|
+
end
|
38
|
+
|
31
39
|
it 'accepts JSON events from a file param in CSV format' do
|
32
40
|
stub_request(:post, "https://api.keen.io/3.0/projects/#{Keen.project_id}/events").
|
33
41
|
with(:body => "{\"minecraft-deaths\":[{\"foo\":1},{\"foo\":2},{\"foo\":3}]}").
|
34
42
|
to_return(:body => { :created => true }.to_json)
|
35
43
|
_, options = start "events:add --collection minecraft-deaths --csv --file #{File.expand_path('../../fixtures/events.csv', __FILE__)}"
|
36
|
-
expect(_).to eq(
|
44
|
+
expect(_).to eq(3)
|
37
45
|
end
|
38
46
|
|
39
47
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: keen-cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.8
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-08-
|
12
|
+
date: 2014-08-12 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: keen
|
@@ -147,6 +147,7 @@ files:
|
|
147
147
|
- lib/keen-cli/shared.rb
|
148
148
|
- lib/keen-cli/utils.rb
|
149
149
|
- lib/keen-cli/version.rb
|
150
|
+
- spec/fixtures/events-array.json
|
150
151
|
- spec/fixtures/events.csv
|
151
152
|
- spec/fixtures/events.json
|
152
153
|
- spec/keen-cli/batch_processor_spec.rb
|
@@ -181,6 +182,7 @@ signing_key:
|
|
181
182
|
specification_version: 3
|
182
183
|
summary: Command line interface to Keen IO
|
183
184
|
test_files:
|
185
|
+
- spec/fixtures/events-array.json
|
184
186
|
- spec/fixtures/events.csv
|
185
187
|
- spec/fixtures/events.json
|
186
188
|
- spec/keen-cli/batch_processor_spec.rb
|