keen-cli 0.1.5 → 0.1.6

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.
@@ -0,0 +1,51 @@
1
+ module KeenCli
2
+
3
+ class CLI < Thor
4
+
5
+ desc 'projects:describe', 'Print information about a project'
6
+ map 'projects:describe' => :projects_describe
7
+ shared_options
8
+
9
+ def projects_describe
10
+ Utils.process_options!(options)
11
+ Keen.project_info.tap do |info|
12
+ Utils.out_json(info, options)
13
+ end
14
+ end
15
+
16
+ desc 'projects:collections', 'Print information about a project\'s collections'
17
+ map 'projects:collections' => :projects_collections
18
+ shared_options
19
+
20
+ def projects_collections
21
+ Utils.process_options!(options)
22
+ Keen.event_collections.tap do |collections|
23
+ Utils.out_json(collections, options)
24
+ end
25
+ end
26
+
27
+ desc 'projects:open', 'Open a project\'s overview page in a browser'
28
+ map 'projects:open' => :projects_open
29
+ shared_options
30
+
31
+ def projects_open
32
+ Utils.process_options!(options)
33
+ "https://keen.io/project/#{Keen.project_id}".tap do |projects_url|
34
+ `open #{projects_url}`
35
+ end
36
+ end
37
+
38
+ desc 'projects:workbench', 'Open a project\'s workbench page in a browser'
39
+ map 'projects:workbench' => :projects_workbench
40
+ shared_options
41
+
42
+ def projects_workbench
43
+ Utils.process_options!(options)
44
+ "https://keen.io/project/#{Keen.project_id}/workbench".tap do |project_url|
45
+ `open #{project_url}`
46
+ end
47
+ end
48
+
49
+ end
50
+
51
+ end
@@ -0,0 +1,138 @@
1
+ module KeenCli
2
+
3
+ class CLI < Thor
4
+
5
+ def self.query_options
6
+ self.collection_options
7
+ option :"analysis-type", :aliases => ['-a']
8
+ option :"group-by", :aliases => ['-g']
9
+ option :"target-property", :aliases => ['-y']
10
+ option :interval, :aliases => ['-i']
11
+ option :timeframe, :aliases => ['-t']
12
+ option :filters, :aliases => ['-f']
13
+ option :percentile
14
+ option :"property-names"
15
+ option :latest
16
+ option :email
17
+ option :start, :aliases => ['s']
18
+ option :end, :aliases => ['e']
19
+ end
20
+
21
+ desc 'queries:run', 'Run a query and print the result'
22
+ map 'queries:run' => :queries_run
23
+ shared_options
24
+ query_options
25
+ data_options
26
+ def queries_run(analysis_type=nil)
27
+
28
+ Utils.process_options!(options)
29
+
30
+ collection = Utils.get_collection_name(options)
31
+ raise "No collection given!" unless collection
32
+
33
+ analysis_type = analysis_type || options[:"analysis-type"]
34
+ raise "No analysis type given!" unless analysis_type
35
+
36
+ query_options = to_query_options(options)
37
+
38
+ Keen.query(analysis_type, collection, query_options).tap do |result|
39
+ if result.is_a?(Hash) || result.is_a?(Array)
40
+ Utils.out_json(result, options)
41
+ else
42
+ Utils.out(result, options)
43
+ end
44
+ end
45
+ end
46
+
47
+ desc 'queries:url', 'Print the URL for a query'
48
+ map 'queries:url' => :queries_url
49
+ shared_options
50
+ query_options
51
+ data_options
52
+ option :'exclude-api-key'
53
+
54
+ def queries_url
55
+
56
+ Utils.process_options!(options)
57
+
58
+ collection = Utils.get_collection_name(options)
59
+ raise "No collection given!" unless collection
60
+
61
+ analysis_type = options[:"analysis-type"]
62
+ raise "No analysis type given!" unless analysis_type
63
+
64
+ query_options = to_query_options(options)
65
+
66
+ Keen.query_url(analysis_type, collection, query_options,
67
+ { :exclude_api_key => options[:'exclude-api-key']}).tap do |url|
68
+ Utils.out(url, options)
69
+ end
70
+ end
71
+
72
+ ANALYSIS_TYPES = %w(average count count-unique extraction median minimum maximum sum percentile select-unique)
73
+
74
+ ANALYSIS_TYPES.each do |analysis_type|
75
+ underscored_analysis_type = analysis_type.sub('-', '_')
76
+ desc analysis_type, "Alias for queries:run -a #{underscored_analysis_type}"
77
+ map analysis_type => method_name = "queries_run_#{underscored_analysis_type}"
78
+ shared_options
79
+ query_options
80
+ data_options
81
+ self.send(:define_method, method_name) { queries_run(underscored_analysis_type) }
82
+ end
83
+
84
+ private
85
+
86
+ def to_query_options(options)
87
+
88
+ data = nil
89
+
90
+ if $stdin.tty?
91
+ data = options[:data]
92
+ else
93
+ ARGV.clear
94
+ ARGF.each_line do |line|
95
+ data += line
96
+ end
97
+ end
98
+
99
+ # setup a holder for query options
100
+ q_options = {}
101
+
102
+ # if data is provided, parse it and merge it
103
+ unless data.nil?
104
+ data_options = JSON.parse(data)
105
+ q_options.merge!(data_options)
106
+ end
107
+
108
+ # copy query options in intelligently
109
+ q_options[:group_by] = options[:"group-by"]
110
+ q_options[:target_property] = options[:"target-property"]
111
+ q_options[:interval] = options[:interval]
112
+ q_options[:timeframe] = options[:timeframe]
113
+ q_options[:filters] = options[:filters]
114
+ q_options[:percentile] = options[:percentile]
115
+ q_options[:latest] = options[:latest]
116
+ q_options[:email] = options[:email]
117
+
118
+ if property_names = options[:"property-names"]
119
+ q_options[:property_names] = property_names.split(",")
120
+ end
121
+
122
+ if start_time = options[:start]
123
+ q_options[:timeframe] = { :start => start_time }
124
+ end
125
+
126
+ if end_time = options[:end]
127
+ q_options[:timeframe] = q_options[:timeframe] || {}
128
+ q_options[:timeframe][:end] = end_time
129
+ end
130
+
131
+ q_options.delete_if { |k, v| v.nil? }
132
+
133
+ q_options
134
+ end
135
+
136
+ end
137
+
138
+ end
@@ -0,0 +1,28 @@
1
+ module KeenCli
2
+
3
+ class CLI < Thor
4
+
5
+ def self.shared_options
6
+ option :project, :aliases => ['-p']
7
+ option :"master-key", :aliases => ['-k']
8
+ option :"read-key", :aliases => ['-r']
9
+ option :"write-key", :aliases => ['-w']
10
+ option :pretty, :type => :boolean, :default => true
11
+ option :silent, :type => :boolean, :default => false
12
+ end
13
+
14
+ def self.collection_options
15
+ option :collection, :aliases => ['-c']
16
+ end
17
+
18
+ def self.data_options
19
+ option :data, :aliases => ['-d']
20
+ end
21
+
22
+ def self.file_options
23
+ option :file, :aliases => ['-f']
24
+ end
25
+
26
+ end
27
+
28
+ end
@@ -24,6 +24,24 @@ module KeenCli
24
24
 
25
25
  end
26
26
 
27
+ def out_json(hash, options)
28
+ if options[:silent]
29
+ # do nothing
30
+ elsif options[:pretty]
31
+ puts JSON.pretty_generate(hash)
32
+ else
33
+ puts JSON.generate(hash)
34
+ end
35
+ end
36
+
37
+ def out(str, options)
38
+ if options[:silent]
39
+ # do nothing
40
+ else
41
+ puts str
42
+ end
43
+ end
44
+
27
45
  def get_collection_name(options)
28
46
  options["collection"] || options["event_collection"] || ENV['KEEN_COLLECTION_NAME']
29
47
  end
@@ -1,3 +1,3 @@
1
1
  module KeenCli
2
- VERSION = "0.1.5"
2
+ VERSION = "0.1.6"
3
3
  end
data/lib/keen-cli.rb CHANGED
@@ -8,3 +8,19 @@ Dotenv.load
8
8
  module KeenCli
9
9
 
10
10
  end
11
+
12
+ class Hash
13
+
14
+ def deep_merge(hash)
15
+ target = dup
16
+ hash.keys.each do |key|
17
+ if hash[key].is_a? Hash and self[key].is_a? Hash
18
+ target[key] = target[key].deep_merge(hash[key])
19
+ next
20
+ end
21
+ target[key] = hash[key]
22
+ end
23
+ target
24
+ end
25
+
26
+ end
@@ -0,0 +1,134 @@
1
+ require 'spec_helper'
2
+
3
+ module KeenCli
4
+
5
+ describe BatchProcessor do
6
+
7
+ let(:batch_processor) { BatchProcessor.new('signups') }
8
+
9
+ describe 'new' do
10
+
11
+ it 'defaults batch size to 1000' do
12
+ expect(batch_processor.batch_size).to eq(1000)
13
+ end
14
+
15
+ it 'sets the collection' do
16
+ expect(batch_processor.collection).to eq('signups')
17
+ end
18
+
19
+ it 'sets the pretty output' do
20
+ batch_processor = BatchProcessor.new('signups', :pretty => true)
21
+ expect(batch_processor.pretty).to eq(true)
22
+ end
23
+
24
+ it 'sets the silent output' do
25
+ batch_processor = BatchProcessor.new('signups', :silent => true)
26
+ expect(batch_processor.silent).to eq(true)
27
+ end
28
+
29
+ it 'sets csv and merges csv options with defaults' do
30
+ csv_processor = BatchProcessor.new('signups', :csv => true, :csv_options => { :headers => ['foo'] })
31
+ expect(csv_processor.csv).to eq(true)
32
+ expect(csv_processor.csv_options).to eq(
33
+ :headers => ['foo'], :converters => :all)
34
+ end
35
+
36
+ end
37
+
38
+ describe 'conversion' do
39
+
40
+ let(:batch_processor) { BatchProcessor.new('signups') }
41
+
42
+ it 'converts a JSON string to a hash' do
43
+ batch_processor.add('{ "apple": "sauce", "banana": "pancakes" }')
44
+ expect(batch_processor.events.first).to eq({
45
+ "apple" => "sauce",
46
+ "banana" => "pancakes"
47
+ })
48
+ end
49
+
50
+ it 'converts a param string to a hash' do
51
+ batch_processor.params = true
52
+ batch_processor.add('apple=sauce&banana=pancakes')
53
+ expect(batch_processor.events.first).to eq({
54
+ "apple" => "sauce",
55
+ "banana" => "pancakes"
56
+ })
57
+ end
58
+
59
+ it 'converts a csv line to a hash' do
60
+ batch_processor.csv = true
61
+ batch_processor.csv_options[:headers] = ['apple', 'banana']
62
+ batch_processor.add('sauce,pancakes')
63
+ expect(batch_processor.events.first).to eq({
64
+ "apple" => "sauce",
65
+ "banana" => "pancakes"
66
+ })
67
+ end
68
+
69
+ it 'converts a csv line with dotted properties to nested hashes' do
70
+ batch_processor.csv = true
71
+ batch_processor.csv_options[:headers] = ['keen.timestamp', 'apple.date', 'apple.banana.cherry', 'apple.banana.walnut']
72
+ batch_processor.add('2012-08-09,pudding,smoothie,butter')
73
+ expect(batch_processor.events.first).to eq({
74
+ "apple" => {
75
+ "date" => "pudding",
76
+ "banana" => {
77
+ "cherry" => "smoothie",
78
+ "walnut" => "butter"
79
+ }
80
+ },
81
+ "keen" => {
82
+ "timestamp" => "2012-08-09"
83
+ }
84
+ })
85
+ end
86
+
87
+ end
88
+
89
+ describe 'add' do
90
+
91
+ let(:batch_processor) { BatchProcessor.new('signups', :silent => true) }
92
+
93
+ it 'starts empty' do
94
+ expect(batch_processor.size).to eq(0)
95
+ expect(batch_processor.events).to be_empty
96
+ end
97
+
98
+ it 'adds events to an array up to batch size and increments count' do
99
+ batch_processor.add('{ "apple": "sauce", "banana": "pancakes" }')
100
+ expect(batch_processor.size).to eq(1)
101
+ expect(batch_processor.events.first).to eq({
102
+ "apple" => "sauce",
103
+ "banana" => "pancakes"
104
+ })
105
+ end
106
+
107
+ it 'flushes at the batch size' do
108
+ stub_request(:post, "https://api.keen.io/3.0/projects/#{Keen.project_id}/events").
109
+ with(:body => "{\"signups\":[{\"apple\":\"sauce\",\"banana\":\"pancakes\"},{\"apple\":\"sauce\",\"banana\":\"pancakes\"}]}").
110
+ to_return(:status => 200, :body => { "signups" => [{ "created" => true }] }.to_json)
111
+ batch_processor.batch_size = 2
112
+ batch_processor.add('{ "apple": "sauce", "banana": "pancakes" }')
113
+ expect(batch_processor.size).to eq(1)
114
+ batch_processor.add('{ "apple": "sauce", "banana": "pancakes" }')
115
+ expect(batch_processor.size).to eq(0)
116
+ expect(batch_processor.events).to be_empty
117
+ end
118
+
119
+ end
120
+
121
+ describe 'flush' do
122
+
123
+ let(:batch_processor) { BatchProcessor.new('signups') }
124
+
125
+ it 'does not flush if there are no events' do
126
+ batch_processor.size = 0
127
+ batch_processor.flush
128
+ end
129
+
130
+ end
131
+
132
+ end
133
+
134
+ end
@@ -2,171 +2,14 @@ require 'spec_helper'
2
2
 
3
3
  describe KeenCli::CLI do
4
4
 
5
- let(:project_id) { 'AAAAAAA' }
6
- let(:master_key) { 'DDDDDD' }
7
- let(:read_key) { 'BBBBBB' }
8
- let(:write_key) { 'CCCCCC' }
9
-
10
- def start(str=nil)
11
- KeenCli::CLI.start(str ? str.split(" ") : [])
12
- end
13
-
14
- before do
15
- Keen.project_id = project_id
16
- Keen.read_key = read_key
17
- Keen.write_key = write_key
18
- Keen.master_key = master_key
19
- end
20
-
21
- it 'prints help by default' do
22
- _, options = start
23
- expect(_).to be_empty
24
- end
5
+ let(:project_id) { Keen.project_id }
6
+ let(:master_key) { Keen.master_key }
7
+ let(:read_key) { Keen.read_key }
8
+ let(:write_key) { Keen.write_key }
25
9
 
26
10
  it 'prints version info if -v is used' do
27
11
  _, options = start "-v"
28
12
  expect(_).to match /version/
29
13
  end
30
14
 
31
- describe 'project:describe' do
32
- it 'gets the project' do
33
- url = "https://api.keen.io/3.0/projects/#{project_id}"
34
- stub_request(:get, url).to_return(:body => { :fake => "response" }.to_json)
35
- _, options = start 'project:describe'
36
- expect(_).to eq("fake" => "response")
37
- end
38
-
39
- it 'uses the project id param if present' do
40
- url = "https://api.keen.io/3.0/projects/GGGG"
41
- stub_request(:get, url).to_return(:body => { :fake => "response" }.to_json)
42
- _, options = start 'project:describe --project GGGG'
43
- expect(_).to eq("fake" => "response")
44
- end
45
- end
46
-
47
- describe 'project:collections' do
48
- it 'prints the project\'s collections' do
49
- url = "https://api.keen.io/3.0/projects/#{project_id}/events"
50
- stub_request(:get, url).to_return(:body => { :fake => "response" }.to_json)
51
- _, options = start 'project:collections'
52
- expect(_).to eq("fake" => "response")
53
- end
54
-
55
- it 'uses the project id param if present' do
56
- url = "https://api.keen.io/3.0/projects/GGGG/events"
57
- stub_request(:get, url).to_return(:body => { :fake => "response" }.to_json)
58
- _, options = start 'project:collections --project GGGG'
59
- expect(_).to eq("fake" => "response")
60
- end
61
- end
62
-
63
- describe 'queries:run' do
64
- it 'runs the query using certain params' do
65
- url = "https://api.keen.io/3.0/projects/#{project_id}/queries/count?event_collection=minecraft-deaths"
66
- stub_request(:get, url).to_return(:body => { :result => 10 }.to_json)
67
- _, options = start 'queries:run --analysis-type count --collection minecraft-deaths'
68
- expect(_).to eq(10)
69
- end
70
-
71
- it 'runs the query using aliased params' do
72
- url = "https://api.keen.io/3.0/projects/#{project_id}/queries/count?event_collection=minecraft-deaths"
73
- stub_request(:get, url).to_return(:body => { :result => 10 }.to_json)
74
- _, options = start 'queries:run -a count -c minecraft-deaths'
75
- expect(_).to eq(10)
76
- end
77
-
78
- it 'converts dashes to underscores for certain properties' do
79
- url = "https://api.keen.io/3.0/projects/#{project_id}/queries/count?event_collection=minecraft-deaths&group_by=foo&target_property=bar"
80
- stub_request(:get, url).to_return(:body => { :result => 10 }.to_json)
81
- _, options = start 'queries:run --analysis-type count --collection minecraft-deaths --group-by foo --target-property bar'
82
- expect(_).to eq(10)
83
- end
84
-
85
- it 'accepts extraction-specific properties' do
86
- url = "https://api.keen.io/3.0/projects/#{project_id}/queries/extraction?event_collection=minecraft-deaths&property_names=%5B%22foo%22,%22bar%22%5D&latest=1&email=bob@bob.io"
87
- stub_request(:get, url).to_return(:body => { :result => 10 }.to_json)
88
- _, options = start 'queries:run --analysis-type extraction --collection minecraft-deaths --property-names foo,bar --latest 1 --email bob@bob.io'
89
- expect(_).to eq(10)
90
- end
91
-
92
- it 'converts comma-delimited property names to an array' do
93
- url = "https://api.keen.io/3.0/projects/#{project_id}/queries/extraction?event_collection=minecraft-deaths&property_names=%5B%22foo%22,%22bar%22%5D"
94
- stub_request(:get, url).to_return(:body => { :result => 10 }.to_json)
95
- _, options = start 'queries:run --analysis-type extraction --collection minecraft-deaths --property-names foo,bar'
96
- expect(_).to eq(10)
97
- end
98
-
99
-
100
- it 'uses a data option to take in query JSON' do
101
- url = "https://api.keen.io/3.0/projects/#{project_id}/queries/count?event_collection=minecraft-deaths"
102
- stub_request(:get, url).to_return(:body => { :result => 10 }.to_json)
103
- _, options = start 'queries:run --analysis-type count --data {"event_collection":"minecraft-deaths"}'
104
- expect(_).to eq(10)
105
- end
106
-
107
- it 'converts a start parameter into an absolute timeframe' do
108
- url = "https://api.keen.io/3.0/projects/#{project_id}/queries/count?event_collection=minecraft-deaths&timeframe=%7B%22start%22:%222014-07-06T12:00:00Z%22%7D"
109
- stub_request(:get, url).to_return(:body => { :result => 10 }.to_json)
110
- _, options = start 'queries:run --collection minecraft-deaths --analysis-type count --start 2014-07-06T12:00:00Z'
111
- expect(_).to eq(10)
112
- end
113
-
114
- it 'converts an end parameter into an absolute timeframe' do
115
- url = "https://api.keen.io/3.0/projects/#{project_id}/queries/count?event_collection=minecraft-deaths&timeframe=%7B%22end%22:%222014-07-06T12:00:00Z%22%7D"
116
- stub_request(:get, url).to_return(:body => { :result => 10 }.to_json)
117
- _, options = start 'queries:run --collection minecraft-deaths --analysis-type count --end 2014-07-06T12:00:00Z'
118
- expect(_).to eq(10)
119
- end
120
-
121
- it 'converts start and end parameters into an absolute timeframe' do
122
- url = "https://api.keen.io/3.0/projects/#{project_id}/queries/count?event_collection=minecraft-deaths&timeframe=%7B%22start%22:%222014-07-06T12:00:00Z%22,%22end%22:%222014-07-08T12:00:00Z%22%7D"
123
- stub_request(:get, url).to_return(:body => { :result => 10 }.to_json)
124
- _, options = start 'queries:run --collection minecraft-deaths --analysis-type count --start 2014-07-06T12:00:00Z --end 2014-07-08T12:00:00Z'
125
- expect(_).to eq(10)
126
- end
127
-
128
- end
129
-
130
- describe "queries:run aliases" do
131
- KeenCli::CLI::ANALYSIS_TYPES.each do |analysis_type|
132
- describe analysis_type do
133
- it "aliases to queries run, passing along the #{analysis_type} analysis type" do
134
- underscored_analysis_type = analysis_type.sub('-', '_')
135
- url = "https://api.keen.io/3.0/projects/#{project_id}/queries/#{underscored_analysis_type}?event_collection=minecraft-deaths"
136
- stub_request(:get, url).to_return(:body => { :result => 10 }.to_json)
137
- _, options = start "#{analysis_type} --collection minecraft-deaths"
138
- expect(_).to eq(10)
139
- end
140
- end
141
- end
142
- end
143
-
144
- describe 'events:add' do
145
- it 'should accept JSON events from a data param' do
146
- url = "https://api.keen.io/3.0/projects/#{project_id}/events/minecraft-deaths"
147
- stub_request(:post, url).
148
- with(:body => { "foo" => 1 }).
149
- to_return(:body => { :created => true }.to_json)
150
- _, options = start 'events:add --collection minecraft-deaths --data {"foo":1}'
151
- expect(_).to eq("created" => true)
152
- end
153
-
154
- it 'should accept JSON events from a file param' do
155
- url = "https://api.keen.io/3.0/projects/#{project_id}/events/minecraft-deaths"
156
- stub_request(:post, "https://api.keen.io/3.0/projects/AAAAAAA/events").
157
- with(:body => "{\"minecraft-deaths\":[{\"foo\":1},{\"foo\":2},{\"foo\":3}]}").
158
- to_return(:body => { :created => true }.to_json)
159
- _, options = start "events:add --collection minecraft-deaths --file #{File.expand_path('../../fixtures/events.json', __FILE__)}"
160
- expect(_).to eq("created" => true)
161
- end
162
-
163
- it 'should accept JSON events from a file param in CSV format' do
164
- url = "https://api.keen.io/3.0/projects/#{project_id}/events/minecraft-deaths"
165
- stub_request(:post, "https://api.keen.io/3.0/projects/AAAAAAA/events").
166
- with(:body => "{\"minecraft-deaths\":[{\"foo\":1},{\"foo\":2},{\"foo\":3}]}").
167
- to_return(:body => { :created => true }.to_json)
168
- _, options = start "events:add --collection minecraft-deaths --csv --file #{File.expand_path('../../fixtures/events.csv', __FILE__)}"
169
- expect(_).to eq("created" => true)
170
- end
171
- end
172
15
  end
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+
3
+ describe KeenCli::CLI do
4
+
5
+ describe 'events:add' do
6
+
7
+ it 'adds a blank event' do
8
+ stub_request(:post, "https://api.keen.io/3.0/projects/#{Keen.project_id}/events").
9
+ with(:body => "{\"minecraft-deaths\":[{}]}").
10
+ to_return(:body => { :created => true }.to_json)
11
+ _, options = start 'events:add --collection minecraft-deaths'
12
+ expect(_).to eq(1)
13
+ end
14
+
15
+ it 'accepts JSON events from a data param' do
16
+ stub_request(:post, "https://api.keen.io/3.0/projects/#{Keen.project_id}/events").
17
+ with(:body => "{\"minecraft-deaths\":[{\"foo\":1}]}").
18
+ to_return(:body => { :created => true }.to_json)
19
+ _, options = start 'events:add --collection minecraft-deaths --data {"foo":1}'
20
+ expect(_).to eq(1)
21
+ end
22
+
23
+ it 'accepts JSON events from a file param' do
24
+ stub_request(:post, "https://api.keen.io/3.0/projects/#{Keen.project_id}/events").
25
+ with(:body => "{\"minecraft-deaths\":[{\"foo\":1},{\"foo\":2},{\"foo\":3}]}").
26
+ to_return(:body => { :created => true }.to_json)
27
+ _, options = start "events:add --collection minecraft-deaths --file #{File.expand_path('../../fixtures/events.json', __FILE__)}"
28
+ expect(_).to eq(3)
29
+ end
30
+
31
+ it 'accepts JSON events from a file param in CSV 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 --csv --file #{File.expand_path('../../fixtures/events.csv', __FILE__)}"
36
+ expect(_).to eq(4)
37
+ end
38
+
39
+ end
40
+
41
+ end
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+
3
+ describe KeenCli::CLI do
4
+
5
+ let(:project_id) { Keen.project_id }
6
+ let(:master_key) { Keen.master_key }
7
+ let(:read_key) { Keen.read_key }
8
+ let(:write_key) { Keen.write_key }
9
+
10
+ describe 'projects:describe' do
11
+ it 'gets the project' do
12
+ url = "https://api.keen.io/3.0/projects/#{project_id}"
13
+ stub_request(:get, url).to_return(:body => { :fake => "response" }.to_json)
14
+ _, options = start 'projects:describe'
15
+ expect(_).to eq("fake" => "response")
16
+ end
17
+
18
+ it 'uses the project id param if present' do
19
+ url = "https://api.keen.io/3.0/projects/GGGG"
20
+ stub_request(:get, url).to_return(:body => { :fake => "response" }.to_json)
21
+ _, options = start 'projects:describe --project GGGG'
22
+ expect(_).to eq("fake" => "response")
23
+ end
24
+ end
25
+
26
+ describe 'projects:collections' do
27
+ it 'prints the project\'s collections' do
28
+ url = "https://api.keen.io/3.0/projects/#{project_id}/events"
29
+ stub_request(:get, url).to_return(:body => { :fake => "response" }.to_json)
30
+ _, options = start 'projects:collections'
31
+ expect(_).to eq("fake" => "response")
32
+ end
33
+
34
+ it 'uses the project id param if present' do
35
+ url = "https://api.keen.io/3.0/projects/GGGG/events"
36
+ stub_request(:get, url).to_return(:body => { :fake => "response" }.to_json)
37
+ _, options = start 'projects:collections --project GGGG'
38
+ expect(_).to eq("fake" => "response")
39
+ end
40
+ end
41
+
42
+ end