loggly-rb 0.0.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 253ff688f04d5118626f5d26cd13324f4fe7ee9b
4
+ data.tar.gz: 7eb4cf65f3b31914ea4a7e335ac454fe0421faa7
5
+ SHA512:
6
+ metadata.gz: b49f24af5c206911e101c4e62452cf3ba44e0a5cea7ac86c1a1b9b2e985bd1e43de708207d487014a18bcaa00234dcbb8c57c0d9264af37d7dfb9971c2595bd5
7
+ data.tar.gz: c3f01d63b025cbe0af036107cd7d2ee32b2b684fc0575fa657cc4562770c4849532e8478c2cc68b398e94d3a8a51adcbdc7148c3f9f88dd1bb24cbfd0f5a02ad
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in loggly.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Keith Larrimore
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,133 @@
1
+ # Loggly
2
+
3
+ [Loggly](www.loggly.com) API client for the Ruby programming language.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'loggly'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install loggly
18
+
19
+ # Usage
20
+
21
+ ## Connect
22
+
23
+ Simple connection method for Loggly authorization.
24
+
25
+ #### Required Connections Parameters:
26
+
27
+ params = { :uri => "http://<account>.loggly.com",
28
+ :username => <username>,
29
+ :password => <password> }
30
+
31
+ #### Connect:
32
+
33
+ Authorize the Loggly API with `Loggy.connect(params)`
34
+
35
+ ## Search
36
+
37
+ The Loggly API provides a simple interface to perform searches.
38
+
39
+ #### Single Field
40
+
41
+ The query `:q => { :'loggly.tag' => "bar" }` outputs to `loggly.tag:bar`
42
+
43
+ #### Multiple Fields
44
+
45
+ There are multiple methods for performing more complex searches.
46
+
47
+ ##### AND Method Only, for now
48
+
49
+ :q => {
50
+ :'loggly.tag' => "bar",
51
+ :'other.loggly.tag' => "baz"
52
+ }
53
+
54
+ outputs to `loggly.tags:bar AND other.loggly.tags:baz`
55
+
56
+
57
+ #### Interfacing with API:
58
+
59
+ `Loggly::Event.all(:q => { :'loggly.tags' => "bar" })` returns an array of events.
60
+
61
+ ### Search Endpoint Parameters:
62
+
63
+ * `:q` - optional - query string. Defaults to `"*"`.
64
+ * `:from` - optional - Start time for the search. Defaults to `-24h`.
65
+ * `:until` - optional - End time for the search. Defaults to `now`.
66
+ * `:order` - optional - Direction of results returned, either `asc` or `desc`. Defaults to `desc`.
67
+ * `:per_page` - optional - Number of rows returned by search. Defaults to `25`.
68
+
69
+ Check the official [Loggy documentation](https://www.loggly.com/docs/api-retrieving-data/) for more assistance.
70
+
71
+ ## Events
72
+
73
+ Each Event has a **Response** and **attributes** that match the Loggly fields.
74
+
75
+ ### Response
76
+
77
+ {:total_events=>3292470,
78
+ :page=>0,
79
+ :events=>
80
+ [{:tags=>["chipper", "frontend"],
81
+ :timestamp => 1377431712208,
82
+ :logmsg => "{\timestamp\: \13-08-25 11:55:12,208191\, \baremsg\: \Alert is due to run\}"",
83
+ :event=>
84
+ {:syslog=>
85
+ {:priority=>142,
86
+ :timestamp=>"2013-08-25T11:55:12.208596+00:00",
87
+ :host=>"frontend01",
88
+ :severity=>"Informational",
89
+ :facility=>"local use 1"
90
+ },
91
+ :json=>
92
+ {:timestamp=>13-08-25 11:55:12,208191,
93
+ :baremsg=>"is due to run",
94
+ :level=>"INFO"
95
+ }
96
+ },
97
+ :logtypes=>["syslog", "json"],
98
+ :id=>"c693c674-0d7d-11e3-80e9-20ae90200ddd"
99
+ }]
100
+ }
101
+
102
+
103
+ * `total_events` - Total number of matching events for the entire time range
104
+ * `page` - Which page of the result set
105
+ * `tags` - An Array of any tags associated with the event
106
+ * `timestamp` - See [timestamps](https://www.loggly.com/docs/timestamps/) to understand how a reference timestamps is derived.
107
+ * `logmsg` - The message portion of the log event. (Any headers aren't included.)
108
+ * `event` - Any parsed fields are included.
109
+ * `logtypes` - An array of [log types](https://www.loggly.com/docs/log-types/) that were detected.
110
+ * `id` - Loggly's event ID.
111
+
112
+ Try the following to get an array of all the event attributes:
113
+
114
+ events = Loggly::Event.all
115
+ events.collect {|event| event.attributes}
116
+
117
+ ## TODO
118
+
119
+ 1. Sending Data
120
+ 2. Retrieve Account Information
121
+ 3. Field Search
122
+ 4. `OR`, `NOT` and `TO` search functionality
123
+ 5. Filter Search by field
124
+ 6. Command Line Tools
125
+
126
+
127
+ ## Contributing
128
+
129
+ 1. Fork it ( http://github.com/<my-github-username>/loggly/fork )
130
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
131
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
132
+ 4. Push to the branch (`git push origin my-new-feature`)
133
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/bin/loggly ADDED
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'bundler/setup'
4
+ require 'pry'
5
+ require 'trollop'
6
+
7
+ require File.expand_path('../../lib/loggly', __FILE__)
8
+
9
+ opts = Trollop::options do
10
+ opt :uri, "Loggly URI", :type => :string
11
+ opt :username, "Loggly Client Username", :type => :string
12
+ opt :password, "Loggly Client Password", :type => :string
13
+ end
14
+
15
+ Loggly.connect(opts)
16
+
17
+ @events = begin
18
+ Loggly::Event.all
19
+ rescue Exception => e
20
+ Loggly.logger.debug e.message
21
+ Loggly.logger.debug e.backtrace.join("\n")
22
+ end
23
+
24
+ pry.binding
data/lib/loggly.rb ADDED
@@ -0,0 +1,51 @@
1
+ require 'pry'
2
+ require 'logger'
3
+ require 'faraday'
4
+ require 'ostruct'
5
+ require 'faraday_middleware'
6
+ require 'faraday_middleware/multi_json'
7
+ require 'multi_xml'
8
+ require 'active_support/core_ext/hash/indifferent_access'
9
+ require 'active_support/core_ext/object/blank'
10
+ require 'active_support/core_ext/module'
11
+ require 'active_support/inflector'
12
+ require 'active_support/notifications'
13
+ require 'loggly/version'
14
+ require 'loggly/exceptions'
15
+ require 'loggly/logging'
16
+ require 'loggly/connection'
17
+ require 'loggly/request'
18
+ require 'loggly/response'
19
+ require 'loggly/model'
20
+ require 'loggly/remote_model'
21
+ require 'loggly/middleware/loggly_response_middleware'
22
+
23
+ module Loggly
24
+ autoload :Event, 'loggly/models/event'
25
+ autoload :Search, 'loggly/models/search'
26
+
27
+ module ClassMethods
28
+ def connection
29
+ @connection ? @connection : (raise LogglyConnectionException)
30
+ end
31
+
32
+ def connect(config = {})
33
+ @connection = Connection.new(:uri => config[:uri], :username => config[:username], :password => config[:password])
34
+ end
35
+ end
36
+
37
+ extend ClassMethods
38
+ extend Logging
39
+
40
+ #MultiJson.use :yajl
41
+ #Faraday.default_adapter = :excon
42
+
43
+ Faraday::Response.register_middleware :loggly_response => lambda { LogglyResponseMiddleware }
44
+ end
45
+
46
+ ActiveSupport::Notifications.subscribe('request.faraday') do |name, start_time, end_time, _, env|
47
+ url = env[:url]
48
+ http_method = env[:method].to_s.upcase
49
+ duration = end_time - start_time
50
+ Loggly.logger.info '[%s] %s %s (%.3f s)' % [url.host, http_method, url.request_uri, duration]
51
+ end
@@ -0,0 +1,77 @@
1
+ module Loggly
2
+ class Connection
3
+
4
+ USER_AGENT = "loggly-client v#{Loggly::VERSION}"
5
+
6
+ attr_accessor :options, :faraday
7
+
8
+ def initialize(options = {})
9
+ @options = options
10
+ @faraday = self.create_faraday(@options[:uri], @options[:username], @options[:password]) if @options[:uri]
11
+ end
12
+
13
+ def create_faraday(uri, username = nil, password = nil)
14
+ @faraday = Faraday.new uri do |c|
15
+ c.headers['User-Agent'] = USER_AGENT
16
+
17
+ c.request :basic_auth, username, password unless (username.blank? || password.blank?)
18
+ c.request :multipart
19
+ c.request :url_encoded
20
+ c.request :multi_json
21
+
22
+ c.response :xml, :content_type => /\bxml$/
23
+ c.response :multi_json, symbolize_keys: true, :content_type => /\bjson$/
24
+ c.response :loggly_response
25
+ c.response :logger, Loggly.logger
26
+
27
+ c.use :instrumentation
28
+ c.adapter Faraday.default_adapter
29
+ end
30
+ end
31
+
32
+ def request(method, path, params, options, &callback)
33
+ sent_at = nil
34
+
35
+ response = @faraday.send(method) { |request|
36
+ sent_at = Time.now
37
+ request = config_request(request, method, path, params, options)
38
+ }.on_complete { |env|
39
+ env[:total_time] = Time.now.utc.to_f - sent_at.utc.to_f if sent_at
40
+ env[:request_params] = params
41
+ env[:request_options] = options
42
+ callback.call(env) if callback
43
+ }
44
+
45
+ response
46
+ end
47
+
48
+ def config_request(request, method, path, params, options)
49
+ case method.to_sym
50
+ when :delete, :get
51
+ request.url(path, params)
52
+ when :post, :put
53
+ request.path = path
54
+ request.body = params unless params.empty?
55
+ end
56
+
57
+ request
58
+ end
59
+
60
+ def get(path, params={}, options={}, &callback)
61
+ request(:get, path, params, options, &callback)
62
+ end
63
+
64
+ def delete(path, params={}, options={}, &callback)
65
+ request(:delete, path, params, options, &callback)
66
+ end
67
+
68
+ def post(path, params={}, options={}, &callback)
69
+ request(:post, path, params, options, &callback)
70
+ end
71
+
72
+ def put(path, params={}, options={}, &callback)
73
+ request(:put, path, params, options, &callback)
74
+ end
75
+
76
+ end
77
+ end
@@ -0,0 +1,8 @@
1
+ module Loggly
2
+ class LogglyException < StandardError; end
3
+ class UnexpectedHTTPException < LogglyException; end
4
+ class PermissionDeniedException < LogglyException; end
5
+ class NonExistentRecord < LogglyException; end
6
+ class LogglyConnectionException < LogglyException; end
7
+ class LogglyResponseException < LogglyException; end
8
+ end
@@ -0,0 +1,27 @@
1
+ module Loggly
2
+ module Logging
3
+ def logger=(logger)
4
+ @logger = logger
5
+ end
6
+
7
+ def logger
8
+ @logger ||= init_logger(STDOUT, :debug)
9
+ end
10
+
11
+ def init_logger(io, level)
12
+ logger = unless io
13
+ Logger.new(STDOUT)
14
+ else
15
+ Logger.new(io)
16
+ end
17
+
18
+ if level == :debug
19
+ logger.level = Logger::DEBUG
20
+ else
21
+ logger.level = Logger::INFO
22
+ end
23
+
24
+ logger
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,23 @@
1
+ module Loggly
2
+ class LogglyResponseMiddleware < Faraday::Response::Middleware
3
+ include Loggly::Logging
4
+
5
+ ERROR_STATUSES = (400...600)
6
+
7
+ def on_complete(env)
8
+ case env[:status]
9
+ when 401
10
+ raise PermissionDeniedException
11
+ when 404
12
+ raise NonExistentRecord
13
+ when 0
14
+ raise UnexpectedHTTPException, "recieved an unexpected HTTP response code #{env[:status]}"
15
+ when ERROR_STATUSES
16
+ raise UnexpectedHTTPException, "recieved an unexpected HTTP response code #{env[:status]}"
17
+ end
18
+
19
+ env
20
+ end
21
+
22
+ end
23
+ end
@@ -0,0 +1,41 @@
1
+ module Loggly
2
+ class Model
3
+ include Logging
4
+
5
+ METADATA_KEYS = {}
6
+
7
+ attr_accessor :attributes, :response
8
+
9
+ def initialize(attributes = {})
10
+ @attributes = OpenStruct.new(attributes)
11
+ @response = nil
12
+ end
13
+
14
+ def to_hash
15
+ @attributes.marshal_dump
16
+ end
17
+
18
+ def to_json(pretty = false)
19
+ MultiJson.dump(self.to_hash, :pretty => pretty)
20
+ end
21
+
22
+ def to_log(options = {})
23
+ self.to_json(true)
24
+ end
25
+
26
+ module ClassMethods
27
+
28
+ def from_hash(h)
29
+ new h
30
+ end
31
+
32
+ def from_json(s)
33
+ from_hash MultiJson.load(s, :symbolize_keys => true)
34
+ end
35
+
36
+ end
37
+
38
+ extend ClassMethods
39
+
40
+ end
41
+ end
@@ -0,0 +1,36 @@
1
+ module Loggly
2
+ class Event < RemoteModel
3
+
4
+ METADATA_KEYS = {
5
+ :total_count => :total_events,
6
+ :current_page => :page,
7
+ }
8
+
9
+ set_resource_attributes({
10
+ :path_base => 'apiv2/',
11
+ :collection_name => 'events',
12
+ :index_method => 'events',
13
+ :path_ext => '',
14
+ :request_options => {
15
+ }
16
+ })
17
+
18
+ def initialize(attributes = {})
19
+ super
20
+ end
21
+
22
+ def self.all(conditions = {}, options = {}, &callback)
23
+ conditions[:order] ||= "desc"
24
+ conditions[:from] ||= "-24h"
25
+ conditions[:until] ||= "now"
26
+
27
+ unless rsid = options[:rsid]
28
+ search = Search.create!(conditions, options)
29
+ rsid = search.attributes.id
30
+ end
31
+
32
+ super({:rsid => rsid}, options, &callback)
33
+ end
34
+
35
+ end
36
+ end
@@ -0,0 +1,33 @@
1
+ module Loggly
2
+ class Search < RemoteModel
3
+
4
+ set_resource_attributes({
5
+ :path_base => 'apiv2/',
6
+ :collection_name => 'rsid',
7
+ :index_method => 'search',
8
+ :path_ext => '',
9
+ :request_options => {
10
+ }
11
+ })
12
+
13
+ def initialize(attributes = {})
14
+ super
15
+ end
16
+
17
+ def self.create!(conditions = {}, options = {}, &callback)
18
+ options.merge!(:klass => self)
19
+ params = prepare_params(conditions)
20
+ params[:size] = (options[:per_page] ||= @resource_attributes[:per_page])
21
+ params[:page] = (options[:page] ||= 0)
22
+
23
+ response = Request.new(@resource_attributes, :get, [path_base, index_method], path_ext, params, options).execute(Loggly.connection)
24
+
25
+ model = response.to_model
26
+
27
+ callback.call(model) if callback
28
+
29
+ model
30
+ end
31
+
32
+ end
33
+ end
@@ -0,0 +1,80 @@
1
+ module Loggly
2
+ class RemoteModel < Model
3
+
4
+ DEFAULT_RESOURCE_ATTRIBUTES = {
5
+ :path_base => nil,
6
+ :path_ext => nil,
7
+ :index_method => nil,
8
+ :collection_name => '',
9
+ :per_page => 25,
10
+ :request_options => {}
11
+ }
12
+
13
+ @resource_attributes = DEFAULT_RESOURCE_ATTRIBUTES
14
+
15
+ module ClassMethods
16
+ attr_reader :resource_attributes
17
+
18
+ def path_ext;@resource_attributes[:path_ext];end
19
+ def index_method;@resource_attributes[:index_method];end
20
+ def collection_name;@resource_attributes[:collection_name];end
21
+
22
+ def set_resource_attributes(ra)
23
+ @resource_attributes = DEFAULT_RESOURCE_ATTRIBUTES.merge(ra)
24
+ end
25
+
26
+ def path_base(params = {})
27
+ pb = @resource_attributes[:path_base] || File.join('/', @resource_attributes[:collection_name])
28
+ params.each { |k,v| pb.gsub!(":#{k}", v) } unless params.blank?
29
+ pb
30
+ end
31
+
32
+ def all(conditions = {}, options = {}, &callback)
33
+ options = options.merge(:klass => self)
34
+ params = conditions
35
+ params[:size] = (options[:per_page] ||= @resource_attributes[:per_page])
36
+ params[:page] = (options[:page] ||= 0)
37
+
38
+ response = Request.new(@resource_attributes, :get, [path_base, index_method], path_ext, params, options).execute(Loggly.connection)
39
+ models = response.to_models
40
+
41
+ callback.call(models) if callback
42
+
43
+ models
44
+ end
45
+
46
+ def prepare_params(conditions = {}, options = {})
47
+ params = {}
48
+
49
+ params[:q] = if conditions[:q].kind_of?(Hash)
50
+ conditions[:q].map { |condition| condition.join(':') }.join(' AND ')
51
+ else
52
+ '*'
53
+ end
54
+
55
+ params
56
+ end
57
+
58
+ def where(conditions = {}, options = {}, &callback)
59
+ self.all(conditions, options, &callback)
60
+ end
61
+
62
+ def find(id, options = {}, &callback)
63
+ options.merge(:klass => self)
64
+
65
+ response = Request.new(@resource_attributes, :get, [path_base, id.to_s], path_ext, {}, options).execute(Loggly.connection)
66
+ model = response.to_model
67
+
68
+ callback.call(models) if callback
69
+
70
+ model
71
+ end
72
+
73
+ def create!(attributes = {}, options = {}, &callback)
74
+ raise NotImplementedError
75
+ end
76
+ end
77
+
78
+ extend ClassMethods
79
+ end
80
+ end
@@ -0,0 +1,28 @@
1
+ module Loggly
2
+ class Request
3
+
4
+ attr_accessor :resource_attributes, :method, :path_parts, :path_ext, :params, :klass, :options
5
+
6
+ def initialize(resource_attributes, method, path_parts, path_ext, params = {}, options = {})
7
+ @resource_attributes, @method, @path_parts, @path_ext, @params, @options = resource_attributes, method, path_parts, path_ext, params, options
8
+ @klass = @options[:klass]
9
+ end
10
+
11
+ def execute(connection)
12
+ self.build_params!
13
+ response = Response.new(self, connection.send(@method, self.build_path(@path_parts, @path_ext), @params, @options))
14
+ end
15
+
16
+ def build_params!
17
+ @params ||= {}
18
+ end
19
+
20
+ def build_path(parts = [], ext = '.json')
21
+ parts.compact!
22
+ parts.map!{ |p| p.to_s }
23
+
24
+ "#{File.join(parts)}#{ext}"
25
+ end
26
+
27
+ end
28
+ end
@@ -0,0 +1,127 @@
1
+ module Loggly
2
+ class Response
3
+
4
+ METADATA_KEYS = {
5
+ :total_count => :total_count,
6
+ :current_page => :current_page,
7
+ :per_page => :per_page,
8
+ :offset => :offset,
9
+ :total_pages => :total_pages
10
+ }
11
+
12
+ attr_accessor :request, :faraday_response, :metadata_keys
13
+
14
+ def initialize(request, faraday_response)
15
+ @request = request
16
+ @faraday_response = faraday_response
17
+ @metadata_keys = METADATA_KEYS
18
+ add_metadata_keys(@request.klass::METADATA_KEYS) if defined? @request.klass::METADATA_KEYS
19
+ end
20
+
21
+ def env
22
+ @faraday_response.env
23
+ end
24
+
25
+ def status
26
+ self.env[:status]
27
+ end
28
+
29
+ def error_status?
30
+ (400...600).include? self.status
31
+ end
32
+
33
+ def body
34
+ self.env[:body]
35
+ end
36
+
37
+ def add_metadata_keys(keys = {})
38
+ @metadata_keys.merge!(keys)
39
+ end
40
+
41
+ def metadata
42
+ return @metadata if defined?(@metadata)
43
+
44
+ if status == 200 && self.body.kind_of?(Hash)
45
+ @metadata = {}.with_indifferent_access
46
+
47
+ @metadata_keys.each do |k,v|
48
+ if self.body.has_key?(v)
49
+ @metadata[k] = self.body[v]
50
+ elsif self.request.options.has_key?(k)
51
+ @metadata[k] = self.request.options[v]
52
+ end
53
+ end
54
+
55
+ @metadata
56
+ end
57
+ end
58
+
59
+ def pages_left
60
+ if self.metadata && self.metadata[:current_page] && self.metadata[:total_pages]
61
+ self.metadata[:total_pages] - self.metadata[:current_page]
62
+ elsif self.metadata && self.metadata[:current_page] && self.metadata[:total_pages].nil?
63
+ self.total_pages - self.metadata[:current_page]
64
+ else
65
+ 0
66
+ end
67
+ end
68
+
69
+ def current_page
70
+ self.metadata[:current_page] if self.metadata
71
+ end
72
+
73
+ def total_pages
74
+ if self.metadata && !self.metadata[:total_pages].nil?
75
+ self.metadata[:total_pages]
76
+ else
77
+ self.metadata[:total_count] / self.metadata[:per_page]
78
+ end
79
+
80
+ end
81
+
82
+ def pages_left?
83
+ self.current_page && self.total_pages ? (self.current_page < self.total_pages) : false
84
+ end
85
+
86
+ def to_models(&blk)
87
+ self.build_models(@request.resource_attributes[:collection_name], @request.klass, &blk)
88
+ end
89
+
90
+ def to_model
91
+ self.build_model(@request.resource_attributes[:collection_name], @request.klass)
92
+ end
93
+
94
+ def build_models(collection_name, klass, &blk)
95
+ raise LogglyResponseException, 'could not create Models from Response' if self.error_status?
96
+
97
+ models = []
98
+
99
+ self.body[collection_name.to_sym].each do |h|
100
+ if r = h[collection_name.singularize.to_sym]
101
+ m = klass.send :from_hash, r
102
+ m.response = self
103
+ models << m
104
+ blk.call(m) if blk
105
+ else
106
+ next
107
+ end
108
+ end
109
+
110
+ models
111
+ end
112
+
113
+ def build_model(collection_name, klass)
114
+ raise LogglyResponseException, 'could not create Model from Response' if self.error_status?
115
+
116
+ model = nil
117
+
118
+ if r = self.body[collection_name.singularize.to_sym]
119
+ model = klass.send :from_hash, r
120
+ model.response = self
121
+ end
122
+
123
+ model
124
+ end
125
+
126
+ end
127
+ end
@@ -0,0 +1,3 @@
1
+ module Loggly
2
+ VERSION = '0.0.1'
3
+ end
data/loggly.gemspec ADDED
@@ -0,0 +1,37 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'loggly/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "loggly-rb"
8
+ spec.version = Loggly::VERSION
9
+ spec.authors = ["Keith Larrimore", "Brendon Harris"]
10
+ spec.email = ["klarrimore@icehook.com", "bharris@icehook.com"]
11
+ spec.summary = %q{Loggly Ruby Client Library}
12
+ spec.description = %q{Loggly Ruby Client Library}
13
+ spec.homepage = "https://github.com/icehook/loggly"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency 'rake'
22
+ spec.add_development_dependency 'bundler', '~> 1.5'
23
+ spec.add_development_dependency 'rspec', '>= 2.13.0'
24
+ spec.add_development_dependency 'ffaker', '~> 1.15.0'
25
+ spec.add_development_dependency 'machinist', '~> 2.0'
26
+ spec.add_development_dependency 'webmock', '~> 1.9.3'
27
+ spec.add_development_dependency 'guard-rspec', '~> 2.5.0'
28
+ spec.add_development_dependency 'rb-fsevent', '~> 0.9.3'
29
+ spec.add_development_dependency 'simplecov', '~> 0.7.1'
30
+ spec.add_runtime_dependency 'pry', '~> 0.9.12'
31
+ spec.add_runtime_dependency 'activesupport', '>= 3.2.15'
32
+ spec.add_runtime_dependency 'faraday', '~> 0.9.0'
33
+ spec.add_runtime_dependency 'faraday_middleware', '~> 0.9.1'
34
+ spec.add_runtime_dependency 'faraday_middleware-multi_json', '~> 0.0.6'
35
+ spec.add_runtime_dependency 'multi_xml', '~> 0.5.3'
36
+ spec.add_runtime_dependency 'trollop', '~> 2.0.0'
37
+ end
metadata ADDED
@@ -0,0 +1,290 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: loggly-rb
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Keith Larrimore
8
+ - Brendon Harris
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-06-24 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rake
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: '0'
21
+ type: :development
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: '0'
28
+ - !ruby/object:Gem::Dependency
29
+ name: bundler
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: '1.5'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: '1.5'
42
+ - !ruby/object:Gem::Dependency
43
+ name: rspec
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: 2.13.0
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: 2.13.0
56
+ - !ruby/object:Gem::Dependency
57
+ name: ffaker
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "~>"
61
+ - !ruby/object:Gem::Version
62
+ version: 1.15.0
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: 1.15.0
70
+ - !ruby/object:Gem::Dependency
71
+ name: machinist
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - "~>"
75
+ - !ruby/object:Gem::Version
76
+ version: '2.0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - "~>"
82
+ - !ruby/object:Gem::Version
83
+ version: '2.0'
84
+ - !ruby/object:Gem::Dependency
85
+ name: webmock
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - "~>"
89
+ - !ruby/object:Gem::Version
90
+ version: 1.9.3
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - "~>"
96
+ - !ruby/object:Gem::Version
97
+ version: 1.9.3
98
+ - !ruby/object:Gem::Dependency
99
+ name: guard-rspec
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - "~>"
103
+ - !ruby/object:Gem::Version
104
+ version: 2.5.0
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - "~>"
110
+ - !ruby/object:Gem::Version
111
+ version: 2.5.0
112
+ - !ruby/object:Gem::Dependency
113
+ name: rb-fsevent
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - "~>"
117
+ - !ruby/object:Gem::Version
118
+ version: 0.9.3
119
+ type: :development
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - "~>"
124
+ - !ruby/object:Gem::Version
125
+ version: 0.9.3
126
+ - !ruby/object:Gem::Dependency
127
+ name: simplecov
128
+ requirement: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - "~>"
131
+ - !ruby/object:Gem::Version
132
+ version: 0.7.1
133
+ type: :development
134
+ prerelease: false
135
+ version_requirements: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - "~>"
138
+ - !ruby/object:Gem::Version
139
+ version: 0.7.1
140
+ - !ruby/object:Gem::Dependency
141
+ name: pry
142
+ requirement: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - "~>"
145
+ - !ruby/object:Gem::Version
146
+ version: 0.9.12
147
+ type: :runtime
148
+ prerelease: false
149
+ version_requirements: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - "~>"
152
+ - !ruby/object:Gem::Version
153
+ version: 0.9.12
154
+ - !ruby/object:Gem::Dependency
155
+ name: activesupport
156
+ requirement: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - ">="
159
+ - !ruby/object:Gem::Version
160
+ version: 3.2.15
161
+ type: :runtime
162
+ prerelease: false
163
+ version_requirements: !ruby/object:Gem::Requirement
164
+ requirements:
165
+ - - ">="
166
+ - !ruby/object:Gem::Version
167
+ version: 3.2.15
168
+ - !ruby/object:Gem::Dependency
169
+ name: faraday
170
+ requirement: !ruby/object:Gem::Requirement
171
+ requirements:
172
+ - - "~>"
173
+ - !ruby/object:Gem::Version
174
+ version: 0.9.0
175
+ type: :runtime
176
+ prerelease: false
177
+ version_requirements: !ruby/object:Gem::Requirement
178
+ requirements:
179
+ - - "~>"
180
+ - !ruby/object:Gem::Version
181
+ version: 0.9.0
182
+ - !ruby/object:Gem::Dependency
183
+ name: faraday_middleware
184
+ requirement: !ruby/object:Gem::Requirement
185
+ requirements:
186
+ - - "~>"
187
+ - !ruby/object:Gem::Version
188
+ version: 0.9.1
189
+ type: :runtime
190
+ prerelease: false
191
+ version_requirements: !ruby/object:Gem::Requirement
192
+ requirements:
193
+ - - "~>"
194
+ - !ruby/object:Gem::Version
195
+ version: 0.9.1
196
+ - !ruby/object:Gem::Dependency
197
+ name: faraday_middleware-multi_json
198
+ requirement: !ruby/object:Gem::Requirement
199
+ requirements:
200
+ - - "~>"
201
+ - !ruby/object:Gem::Version
202
+ version: 0.0.6
203
+ type: :runtime
204
+ prerelease: false
205
+ version_requirements: !ruby/object:Gem::Requirement
206
+ requirements:
207
+ - - "~>"
208
+ - !ruby/object:Gem::Version
209
+ version: 0.0.6
210
+ - !ruby/object:Gem::Dependency
211
+ name: multi_xml
212
+ requirement: !ruby/object:Gem::Requirement
213
+ requirements:
214
+ - - "~>"
215
+ - !ruby/object:Gem::Version
216
+ version: 0.5.3
217
+ type: :runtime
218
+ prerelease: false
219
+ version_requirements: !ruby/object:Gem::Requirement
220
+ requirements:
221
+ - - "~>"
222
+ - !ruby/object:Gem::Version
223
+ version: 0.5.3
224
+ - !ruby/object:Gem::Dependency
225
+ name: trollop
226
+ requirement: !ruby/object:Gem::Requirement
227
+ requirements:
228
+ - - "~>"
229
+ - !ruby/object:Gem::Version
230
+ version: 2.0.0
231
+ type: :runtime
232
+ prerelease: false
233
+ version_requirements: !ruby/object:Gem::Requirement
234
+ requirements:
235
+ - - "~>"
236
+ - !ruby/object:Gem::Version
237
+ version: 2.0.0
238
+ description: Loggly Ruby Client Library
239
+ email:
240
+ - klarrimore@icehook.com
241
+ - bharris@icehook.com
242
+ executables:
243
+ - loggly
244
+ extensions: []
245
+ extra_rdoc_files: []
246
+ files:
247
+ - ".gitignore"
248
+ - Gemfile
249
+ - LICENSE.txt
250
+ - README.md
251
+ - Rakefile
252
+ - bin/loggly
253
+ - lib/loggly.rb
254
+ - lib/loggly/connection.rb
255
+ - lib/loggly/exceptions.rb
256
+ - lib/loggly/logging.rb
257
+ - lib/loggly/middleware/loggly_response_middleware.rb
258
+ - lib/loggly/model.rb
259
+ - lib/loggly/models/event.rb
260
+ - lib/loggly/models/search.rb
261
+ - lib/loggly/remote_model.rb
262
+ - lib/loggly/request.rb
263
+ - lib/loggly/response.rb
264
+ - lib/loggly/version.rb
265
+ - loggly.gemspec
266
+ homepage: https://github.com/icehook/loggly
267
+ licenses:
268
+ - MIT
269
+ metadata: {}
270
+ post_install_message:
271
+ rdoc_options: []
272
+ require_paths:
273
+ - lib
274
+ required_ruby_version: !ruby/object:Gem::Requirement
275
+ requirements:
276
+ - - ">="
277
+ - !ruby/object:Gem::Version
278
+ version: '0'
279
+ required_rubygems_version: !ruby/object:Gem::Requirement
280
+ requirements:
281
+ - - ">="
282
+ - !ruby/object:Gem::Version
283
+ version: '0'
284
+ requirements: []
285
+ rubyforge_project:
286
+ rubygems_version: 2.2.2
287
+ signing_key:
288
+ specification_version: 4
289
+ summary: Loggly Ruby Client Library
290
+ test_files: []