sumo-search 0.1.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/.cane +0 -0
  3. data/.gitignore +0 -2
  4. data/.travis.yml +7 -0
  5. data/README.md +54 -27
  6. data/Rakefile +8 -3
  7. data/bin/sumo +2 -69
  8. data/lib/sumo/cli.rb +43 -0
  9. data/lib/sumo/client.rb +82 -0
  10. data/lib/sumo/collection.rb +97 -0
  11. data/lib/sumo/config.rb +11 -14
  12. data/lib/sumo/error.rb +8 -11
  13. data/lib/sumo/search.rb +69 -0
  14. data/lib/sumo/version.rb +9 -2
  15. data/lib/sumo.rb +52 -18
  16. data/spec/fixtures/sumo-creds +1 -0
  17. data/spec/lib/sumo/client_spec.rb +136 -0
  18. data/spec/lib/sumo/config_spec.rb +55 -74
  19. data/spec/lib/sumo/search_spec.rb +106 -0
  20. data/spec/lib/sumo_spec.rb +0 -30
  21. data/spec/spec_helper.rb +5 -7
  22. data/spec/support/vcr.rb +41 -5
  23. data/spec/vcr/Sumo_Search/_create/sets_the_id_and_client.yml +42 -0
  24. data/spec/vcr/Sumo_Search/_delete_/deletes_the_search.yml +102 -0
  25. data/spec/vcr/Sumo_Search/_messages/returns_an_Enumerator_of_each_message_in_the_search.yml +2579 -0
  26. data/spec/vcr/Sumo_Search/_records/returns_an_Enumerator_of_each_record_in_the_search.yml +2348 -0
  27. data/spec/vcr/Sumo_Search/_status/returns_the_status_of_the_search.yml +71 -0
  28. data/sumo-search.gemspec +5 -6
  29. metadata +62 -57
  30. data/lib/sumo/formatter.rb +0 -21
  31. data/lib/sumo/query_builder.rb +0 -61
  32. data/spec/fixtures/sumo_creds +0 -1
  33. data/spec/lib/sumo/formatter_spec.rb +0 -51
  34. data/spec/lib/sumo/query_builder_spec.rb +0 -128
  35. data/spec/vcr/Sumo/_search/when_the_credentials_can_be_found/and_the_query_is_valid/parses_the_response.yml +0 -49
  36. data/spec/vcr/Sumo/_search/when_the_credentials_can_be_found/but_the_query_is_invalid/raises_an_error.yml +0 -43
  37. data/spec/vcr/Sumo_QueryBuilder/integration/when_the_request_is_invalid/raises_an_error.yml +0 -43
  38. data/spec/vcr/Sumo_QueryBuilder/integration/when_the_request_is_valid/compiles_and_sends_the_query_to_the_server.yml +0 -49
@@ -0,0 +1,71 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://api.sumologic.com/api/v1/search/jobs
6
+ body:
7
+ encoding: UTF-8
8
+ string: "{\"query\":\"| count _sourceCategory\",\"from\":\"2013-01-01T00:00:00\",\"to\":\"2014-03-01T00:00:00\",\"timeZone\":\"EST\"}"
9
+ headers:
10
+ User-Agent:
11
+ - excon/0.32.1
12
+ Content-Type:
13
+ - application/json
14
+ Accept:
15
+ - application/json
16
+ response:
17
+ status:
18
+ code: 202
19
+ message:
20
+ headers:
21
+ Content-Type:
22
+ - application/json
23
+ Date:
24
+ - Wed, 26 Mar 2014 13:49:41 GMT
25
+ Location:
26
+ - http://api.sumologic.com/api/v1/search/jobs/24997BFEE7AC89B5
27
+ Strict-Transport-Security:
28
+ - max-age=15552000
29
+ Content-Length:
30
+ - '117'
31
+ Connection:
32
+ - Close
33
+ body:
34
+ encoding: UTF-8
35
+ string: "{\"id\":\"24997BFEE7AC89B5\",\"link\":{\"rel\":\"filtered\",\"href\":\"filtered\"}}"
36
+ http_version:
37
+ recorded_at: Wed, 26 Mar 2014 13:49:43 GMT
38
+ - request:
39
+ method: get
40
+ uri: https://api.sumologic.com/api/v1/search/jobs/24997BFEE7AC89B5
41
+ body:
42
+ encoding: US-ASCII
43
+ string: ''
44
+ headers:
45
+ User-Agent:
46
+ - excon/0.32.1
47
+ Content-Type:
48
+ - application/json
49
+ Accept:
50
+ - application/json
51
+ response:
52
+ status:
53
+ code: 200
54
+ message:
55
+ headers:
56
+ Content-Type:
57
+ - application/json
58
+ Date:
59
+ - Wed, 26 Mar 2014 13:49:42 GMT
60
+ Strict-Transport-Security:
61
+ - max-age=15552000
62
+ Content-Length:
63
+ - '125'
64
+ Connection:
65
+ - Close
66
+ body:
67
+ encoding: UTF-8
68
+ string: "{\"state\":\"GATHERING RESULTS\",\"pendingWarnings\":[],\"pendingErrors\":[],\"histogramBuckets\":[],\"messageCount\":0,\"recordCount\":-1}"
69
+ http_version:
70
+ recorded_at: Wed, 26 Mar 2014 13:49:43 GMT
71
+ recorded_with: VCR 2.8.0
data/sumo-search.gemspec CHANGED
@@ -4,9 +4,9 @@ require File.expand_path('../lib/sumo/version', __FILE__)
4
4
  Gem::Specification.new do |gem|
5
5
  gem.authors = ["Swipely, Inc."]
6
6
  gem.email = %w{tomhulihan@swipely.com}
7
- gem.description = %q{A CLI for querying the Sumo Logic search API}
8
- gem.summary = %q{A CLI for querying the Sumo Logic search API}
9
- gem.homepage = 'https://github.com/swipely/sumo-search'
7
+ gem.description = %q{A simple REST client for the Sumo Search Job API}
8
+ gem.summary = %q{A simple REST client for the Sumo Search Job API}
9
+ gem.homepage = 'https://github.com/swipely/sumo-job'
10
10
  gem.license = 'MIT'
11
11
  gem.files = `git ls-files`.split($\)
12
12
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
@@ -14,13 +14,12 @@ Gem::Specification.new do |gem|
14
14
  gem.name = 'sumo-search'
15
15
  gem.require_paths = %w{lib}
16
16
  gem.version = Sumo::VERSION
17
- gem.required_ruby_version = '>= 2.0.0'
18
- gem.add_dependency 'excon', '>= 0.28'
17
+ gem.add_dependency 'excon', '>= 0.32'
18
+ gem.add_dependency 'clamp', '>= 0.6.3'
19
19
  gem.add_dependency 'json'
20
20
  gem.add_development_dependency 'rake'
21
21
  gem.add_development_dependency 'rspec'
22
22
  gem.add_development_dependency 'cane'
23
23
  gem.add_development_dependency 'pry'
24
24
  gem.add_development_dependency 'vcr', '>= 2.7.0'
25
- gem.add_development_dependency 'simplecov'
26
25
  end
metadata CHANGED
@@ -1,128 +1,128 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sumo-search
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Swipely, Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-01-08 00:00:00.000000000 Z
11
+ date: 2014-03-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: excon
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '0.28'
19
+ version: '0.32'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '0.28'
26
+ version: '0.32'
27
+ - !ruby/object:Gem::Dependency
28
+ name: clamp
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 0.6.3
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 0.6.3
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: json
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
- - - '>='
45
+ - - ">="
32
46
  - !ruby/object:Gem::Version
33
47
  version: '0'
34
48
  type: :runtime
35
49
  prerelease: false
36
50
  version_requirements: !ruby/object:Gem::Requirement
37
51
  requirements:
38
- - - '>='
52
+ - - ">="
39
53
  - !ruby/object:Gem::Version
40
54
  version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: rake
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
- - - '>='
59
+ - - ">="
46
60
  - !ruby/object:Gem::Version
47
61
  version: '0'
48
62
  type: :development
49
63
  prerelease: false
50
64
  version_requirements: !ruby/object:Gem::Requirement
51
65
  requirements:
52
- - - '>='
66
+ - - ">="
53
67
  - !ruby/object:Gem::Version
54
68
  version: '0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: rspec
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
- - - '>='
73
+ - - ">="
60
74
  - !ruby/object:Gem::Version
61
75
  version: '0'
62
76
  type: :development
63
77
  prerelease: false
64
78
  version_requirements: !ruby/object:Gem::Requirement
65
79
  requirements:
66
- - - '>='
80
+ - - ">="
67
81
  - !ruby/object:Gem::Version
68
82
  version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: cane
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
- - - '>='
87
+ - - ">="
74
88
  - !ruby/object:Gem::Version
75
89
  version: '0'
76
90
  type: :development
77
91
  prerelease: false
78
92
  version_requirements: !ruby/object:Gem::Requirement
79
93
  requirements:
80
- - - '>='
94
+ - - ">="
81
95
  - !ruby/object:Gem::Version
82
96
  version: '0'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: pry
85
99
  requirement: !ruby/object:Gem::Requirement
86
100
  requirements:
87
- - - '>='
101
+ - - ">="
88
102
  - !ruby/object:Gem::Version
89
103
  version: '0'
90
104
  type: :development
91
105
  prerelease: false
92
106
  version_requirements: !ruby/object:Gem::Requirement
93
107
  requirements:
94
- - - '>='
108
+ - - ">="
95
109
  - !ruby/object:Gem::Version
96
110
  version: '0'
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: vcr
99
113
  requirement: !ruby/object:Gem::Requirement
100
114
  requirements:
101
- - - '>='
115
+ - - ">="
102
116
  - !ruby/object:Gem::Version
103
117
  version: 2.7.0
104
118
  type: :development
105
119
  prerelease: false
106
120
  version_requirements: !ruby/object:Gem::Requirement
107
121
  requirements:
108
- - - '>='
122
+ - - ">="
109
123
  - !ruby/object:Gem::Version
110
124
  version: 2.7.0
111
- - !ruby/object:Gem::Dependency
112
- name: simplecov
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - '>='
116
- - !ruby/object:Gem::Version
117
- version: '0'
118
- type: :development
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - '>='
123
- - !ruby/object:Gem::Version
124
- version: '0'
125
- description: A CLI for querying the Sumo Logic search API
125
+ description: A simple REST client for the Sumo Search Job API
126
126
  email:
127
127
  - tomhulihan@swipely.com
128
128
  executables:
@@ -130,30 +130,35 @@ executables:
130
130
  extensions: []
131
131
  extra_rdoc_files: []
132
132
  files:
133
- - .gitignore
133
+ - ".cane"
134
+ - ".gitignore"
135
+ - ".travis.yml"
134
136
  - Gemfile
135
137
  - README.md
136
138
  - Rakefile
137
139
  - bin/sumo
138
140
  - lib/sumo.rb
141
+ - lib/sumo/cli.rb
142
+ - lib/sumo/client.rb
143
+ - lib/sumo/collection.rb
139
144
  - lib/sumo/config.rb
140
145
  - lib/sumo/error.rb
141
- - lib/sumo/formatter.rb
142
- - lib/sumo/query_builder.rb
146
+ - lib/sumo/search.rb
143
147
  - lib/sumo/version.rb
144
- - spec/fixtures/sumo_creds
148
+ - spec/fixtures/sumo-creds
149
+ - spec/lib/sumo/client_spec.rb
145
150
  - spec/lib/sumo/config_spec.rb
146
- - spec/lib/sumo/formatter_spec.rb
147
- - spec/lib/sumo/query_builder_spec.rb
151
+ - spec/lib/sumo/search_spec.rb
148
152
  - spec/lib/sumo_spec.rb
149
153
  - spec/spec_helper.rb
150
154
  - spec/support/vcr.rb
151
- - spec/vcr/Sumo/_search/when_the_credentials_can_be_found/and_the_query_is_valid/parses_the_response.yml
152
- - spec/vcr/Sumo/_search/when_the_credentials_can_be_found/but_the_query_is_invalid/raises_an_error.yml
153
- - spec/vcr/Sumo_QueryBuilder/integration/when_the_request_is_invalid/raises_an_error.yml
154
- - spec/vcr/Sumo_QueryBuilder/integration/when_the_request_is_valid/compiles_and_sends_the_query_to_the_server.yml
155
+ - spec/vcr/Sumo_Search/_create/sets_the_id_and_client.yml
156
+ - spec/vcr/Sumo_Search/_delete_/deletes_the_search.yml
157
+ - spec/vcr/Sumo_Search/_messages/returns_an_Enumerator_of_each_message_in_the_search.yml
158
+ - spec/vcr/Sumo_Search/_records/returns_an_Enumerator_of_each_record_in_the_search.yml
159
+ - spec/vcr/Sumo_Search/_status/returns_the_status_of_the_search.yml
155
160
  - sumo-search.gemspec
156
- homepage: https://github.com/swipely/sumo-search
161
+ homepage: https://github.com/swipely/sumo-job
157
162
  licenses:
158
163
  - MIT
159
164
  metadata: {}
@@ -163,30 +168,30 @@ require_paths:
163
168
  - lib
164
169
  required_ruby_version: !ruby/object:Gem::Requirement
165
170
  requirements:
166
- - - '>='
171
+ - - ">="
167
172
  - !ruby/object:Gem::Version
168
- version: 2.0.0
173
+ version: '0'
169
174
  required_rubygems_version: !ruby/object:Gem::Requirement
170
175
  requirements:
171
- - - '>='
176
+ - - ">="
172
177
  - !ruby/object:Gem::Version
173
178
  version: '0'
174
179
  requirements: []
175
180
  rubyforge_project:
176
- rubygems_version: 2.0.7
181
+ rubygems_version: 2.2.0
177
182
  signing_key:
178
183
  specification_version: 4
179
- summary: A CLI for querying the Sumo Logic search API
184
+ summary: A simple REST client for the Sumo Search Job API
180
185
  test_files:
181
- - spec/fixtures/sumo_creds
186
+ - spec/fixtures/sumo-creds
187
+ - spec/lib/sumo/client_spec.rb
182
188
  - spec/lib/sumo/config_spec.rb
183
- - spec/lib/sumo/formatter_spec.rb
184
- - spec/lib/sumo/query_builder_spec.rb
189
+ - spec/lib/sumo/search_spec.rb
185
190
  - spec/lib/sumo_spec.rb
186
191
  - spec/spec_helper.rb
187
192
  - spec/support/vcr.rb
188
- - spec/vcr/Sumo/_search/when_the_credentials_can_be_found/and_the_query_is_valid/parses_the_response.yml
189
- - spec/vcr/Sumo/_search/when_the_credentials_can_be_found/but_the_query_is_invalid/raises_an_error.yml
190
- - spec/vcr/Sumo_QueryBuilder/integration/when_the_request_is_invalid/raises_an_error.yml
191
- - spec/vcr/Sumo_QueryBuilder/integration/when_the_request_is_valid/compiles_and_sends_the_query_to_the_server.yml
192
- has_rdoc:
193
+ - spec/vcr/Sumo_Search/_create/sets_the_id_and_client.yml
194
+ - spec/vcr/Sumo_Search/_delete_/deletes_the_search.yml
195
+ - spec/vcr/Sumo_Search/_messages/returns_an_Enumerator_of_each_message_in_the_search.yml
196
+ - spec/vcr/Sumo_Search/_records/returns_an_Enumerator_of_each_record_in_the_search.yml
197
+ - spec/vcr/Sumo_Search/_status/returns_the_status_of_the_search.yml
@@ -1,21 +0,0 @@
1
- # This module contains formatting functions to help make text more readable.
2
- module Sumo::Formatter
3
- include Sumo::Error
4
-
5
- # Given a sumo response (string)
6
- def format_json(response)
7
- JSON.parse(response)
8
- .sort_by { |hash| hash['_messagetime'] }
9
- .map { |hash| hash['_raw'] }
10
- rescue
11
- raise ParseError, 'Could not parse the response.'
12
- end
13
-
14
- def extract_key(key, logs)
15
- logs.map { |log| JSON.parse(log)[key] }
16
- rescue
17
- raise ParseError, "Error extracting the #{key} from the hash."
18
- end
19
-
20
- module_function :format_json, :extract_key
21
- end
@@ -1,61 +0,0 @@
1
- # This class can be used to build and execute queries. For example, the
2
- # following code builds a query for 'error' in the last 15 minutes.
3
- #
4
- # q = Sumo::QueryBuilder.new('user@example.com:pass')
5
- # .query('error')
6
- # .from('-15m')
7
- # .to('now')
8
- #
9
- # Note that this class is immutable.
10
- class Sumo::QueryBuilder
11
- include Sumo::Error
12
-
13
- attr_reader :creds, :opts
14
-
15
- # Create a new QueryBuilder with the given credentials and query.
16
- def initialize(creds, opts = {})
17
- if creds.is_a?(String) && opts.is_a?(Hash)
18
- @creds = creds.freeze
19
- @opts = opts.freeze
20
- else
21
- raise TypeError, "Invalid initialization parameters to QueryBuilder."
22
- end
23
- end
24
-
25
- # Metaprogram the #query, #to, #from, #time_zone, and #format methods. Each
26
- # of these methods accepts one argument, and returns a new 'QueryBuilder' that
27
- # has the specified query parameter key set.
28
- def self.builder(name, key)
29
- klass = self
30
- define_method(name) { |arg| klass.new(creds, opts.merge(key => arg)) }
31
- end
32
- private_class_method :builder
33
-
34
- builder :to, 'to'
35
- builder :from, 'from'
36
- builder :query, 'q'
37
- builder :format, 'format'
38
- builder :time_zone, 'tz'
39
-
40
- # Send the API request to Sumo Logic.
41
- def execute
42
- encoded = Base64.encode64(creds)
43
- resp = connection.get(:path => '/api/v1/logs/search',
44
- :query => opts,
45
- :headers => { 'Authorization' => "Basic #{encoded}" })
46
- if resp.status >= 400
47
- if resp.body.nil? || resp.body.empty?
48
- raise RequestError, "An error occurred sending your request."
49
- else
50
- raise RequestError, JSON.parse(resp.body)['message']
51
- end
52
- end
53
- resp.body
54
- end
55
-
56
- # A memoized HTTP connection.
57
- def connection
58
- @connection ||= Excon.new('https://api.sumologic.com')
59
- end
60
- private :connection
61
- end
@@ -1 +0,0 @@
1
- fake_user@fake_site:fake_pass
@@ -1,51 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Sumo::Formatter do
4
- subject { Sumo::Formatter }
5
-
6
- describe '.format_json' do
7
- context 'when the input cannot be parsed' do
8
- it 'raises an error' do
9
- expect { subject.format_json('cannot parse this') }
10
- .to raise_error(Sumo::Error::ParseError)
11
- end
12
- end
13
-
14
- context 'when the input can be parsed' do
15
- let(:input) {
16
- [
17
- { '_messagetime' => 2, '_raw' => 'world' },
18
- { '_messagetime' => 1, '_raw' => 'hello' }
19
- ].to_json
20
- }
21
-
22
- it 'sorts the input by the _messagetime, returning a String' do
23
- subject.format_json(input).should == %w(hello world)
24
- end
25
- end
26
- end
27
-
28
- describe '.extract_key' do
29
- context 'when at least one element of the Array cannot be parsed' do
30
- let(:input) { [ { :a => 1 }.to_json, 'qwerty'] }
31
-
32
- it 'raises an error' do
33
- expect { subject.extract_key('anything', input) }
34
- .to raise_error(Sumo::Error::ParseError)
35
- end
36
- end
37
-
38
- context 'when the input is an Array of parseable values' do
39
- let(:input) {
40
- [
41
- { 'message' => 'rats', 'time' => 2 }.to_json,
42
- { 'message' => 'cats', 'time' => 1 }.to_json
43
- ]
44
- }
45
-
46
- it 'returns an Array with the specified key extracted' do
47
- subject.extract_key('message', input).should == %w(rats cats)
48
- end
49
- end
50
- end
51
- end