sumo-search 0.1.1 → 1.0.2

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.
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