errlog 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: bbd26baa17726137322c3d5df046b9cbcdffd189
4
+ data.tar.gz: d4cc1c6f7e80b69c68b35c3f2b616588ca6cbc52
5
+ SHA512:
6
+ metadata.gz: 8ff796221f1b57d49247a1905a8ca00abb2e55119fe574a0fbeb38a771f331bf2c496de08c49557122fbcdfffe44c3b29a06a82141aeca5d6c04d585e30480e0
7
+ data.tar.gz: a74925cff35f45f5d496892413e64a2c28f83c04e91275e60b814d73a2c75c6b5270e2dd27aa55b5524ffca173dbfc9a41d982de05ce10c6ec19cbbe0fd478da
@@ -0,0 +1,20 @@
1
+ .DS_Store
2
+ *.gem
3
+ *.rbc
4
+ .bundle
5
+ .config
6
+ .yardoc
7
+ Gemfile.lock
8
+ InstalledFiles
9
+ _yardoc
10
+ coverage
11
+ doc/
12
+ lib/bundler/man
13
+ pkg
14
+ rdoc
15
+ spec/reports
16
+ test/tmp
17
+ test/version_tmp
18
+ tmp
19
+ .idea
20
+ .rbx
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
data/.rvmrc ADDED
@@ -0,0 +1,2 @@
1
+ rvm use 2.0.0
2
+ #rvm use 1.9.3
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in loggerr.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 sergeych
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.
@@ -0,0 +1,35 @@
1
+ # Errlog
2
+
3
+ *ATTENTION!*
4
+
5
+ This is a reporting tool tor errlog service, that is not yet open for public test.
6
+
7
+
8
+ The rest is a template for not to type it later on. Please ignore.
9
+
10
+
11
+ ## Installation
12
+
13
+ Add this line to your application's Gemfile:
14
+
15
+ gem 'errlog'
16
+
17
+ And then execute:
18
+
19
+ $ bundle
20
+
21
+ Or install it yourself as:
22
+
23
+ $ gem install errlog
24
+
25
+ ## Usage
26
+
27
+ TODO: Write usage instructions here
28
+
29
+ ## Contributing
30
+
31
+ 1. Fork it
32
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
33
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
34
+ 4. Push to the branch (`git push origin my-new-feature`)
35
+ 5. Create new Pull Request
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,122 @@
1
+ #!/usr/bin/env ruby
2
+ require 'errlog'
3
+ require 'yaml'
4
+ require 'ostruct'
5
+ require 'colorize'
6
+
7
+ def usage
8
+ puts <<End
9
+
10
+ Errlog reporting tool (visit http://errlog.com for details)
11
+
12
+ Usage:
13
+
14
+ errlog [params] "text to report"
15
+
16
+ Parameters
17
+
18
+ --warn, --trace
19
+ report as warning or trace, respectively (default is error)
20
+
21
+ -k <acc_key>
22
+ account key (should obtain it in http://logger.com)
23
+
24
+ -i <acc_id>
25
+ account id (should obtain it in http://logger.com)
26
+
27
+ -p platform
28
+ set the platform value
29
+
30
+ -a appname
31
+ set the application name
32
+
33
+ Some/all of there parameters might be set in the .errlog.yml file in the current path
34
+ or down the tree. Command-line parameters override these from configuration file.
35
+
36
+ Note that configuration file will not be used if both id and key are set in the command line
37
+ arguments!
38
+
39
+ exit status: 100 - error in arguments, 10 - failed to send, 0 - successfully sent
40
+ End
41
+ exit 100
42
+ end
43
+
44
+ def error text
45
+ STDOUT.puts "\n*** Error: #{text}".red
46
+ usage
47
+ end
48
+
49
+ usage if ARGV.length == 0
50
+
51
+ key, id, text, host, app, platform = nil, nil, '', nil, nil, nil
52
+ severity = 100
53
+
54
+ begin
55
+ n = 0
56
+ while n < ARGV.length do
57
+ arg = ARGV[n]
58
+ n += 1
59
+ case arg
60
+ when '-k'
61
+ key = ARGV[n]
62
+ n += 1
63
+ when '-i'
64
+ id = ARGV[n]
65
+ n += 1
66
+ when /^--local/
67
+ host = "http://localhost:3000"
68
+ when /^--warn/
69
+ severity = Errlog::WARNING
70
+ when /^--trace/
71
+ severity = Errlog::TRACE
72
+ when '-a'
73
+ app = ARGV[n]
74
+ n += 1
75
+ when '-p'
76
+ platform = ARGV[n]
77
+ n += 1
78
+ else
79
+ text = arg.strip
80
+ break
81
+ end
82
+ end
83
+ rescue
84
+ error "Error parsing arguments"
85
+ end
86
+
87
+ def search_down_the_tree(path, name)
88
+ n = File.join path, name
89
+ return n if File.exists?(n)
90
+ root = File::split(path)[0]
91
+ return nil if root == path
92
+ search_down_the_tree root, name
93
+ end
94
+
95
+ if !key || !id
96
+ unless (cfile = search_down_the_tree(Dir::pwd, '.errlog.yml'))
97
+ error "Neither id/key or configuration file was found"
98
+ usage
99
+ end
100
+ cfg = OpenStruct.new YAML::load_file(cfile)
101
+ id ||= cfg.account_id
102
+ key ||= cfg.account_key
103
+ app ||= cfg.application
104
+ platform ||= cfg.platform
105
+ end
106
+
107
+ if !key || !id || text==''
108
+ error "You must specify at least id, key and text"
109
+ usage
110
+ end
111
+
112
+ usage if !key || !id || text.length == 0
113
+
114
+ Errlog.configure id, key, {host: host}
115
+ Errlog.context.platform = platform
116
+ Errlog.context.application = app
117
+
118
+ Errlog.report text, severity do |error|
119
+ STDERR.puts "Error: #{error}".red if error
120
+ exit error ? 10 : 0
121
+ end
122
+ Errlog.wait
@@ -0,0 +1,28 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'errlog/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "errlog"
8
+ gem.version = Errlog::VERSION
9
+ gem.authors = ["sergeych"]
10
+ gem.email = ["real.sergeych@gmail.com"]
11
+ gem.description = %q{Logger and error reporter agent for errlog service}
12
+ gem.summary = %q{under development}
13
+ gem.homepage = ""
14
+
15
+ gem.files = `git ls-files`.split($/)
16
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
+ gem.require_paths = ["lib"]
19
+ gem.bindir = 'bin'
20
+
21
+ gem.required_ruby_version = '>= 1.9.2'
22
+
23
+ gem.add_dependency 'boss-protocol', '>= 0.1.3'
24
+ gem.add_dependency 'hashie', '>= 1.2.0'
25
+ gem.add_dependency 'httpclient', '>= 2.3'
26
+ gem.add_dependency 'colorize'
27
+ gem.add_development_dependency "rspec"
28
+ end
@@ -0,0 +1,120 @@
1
+ require 'errlog/version'
2
+ require 'errlog/packager'
3
+ require 'errlog/constants'
4
+ require 'errlog/chain_loggger'
5
+ require 'boss-protocol'
6
+ require 'errlog/context'
7
+ require 'hashie'
8
+ require 'thread'
9
+ require 'httpclient'
10
+ require 'weakref'
11
+
12
+ module Errlog
13
+
14
+ include Errlog::Constants
15
+
16
+ def self.severity_name code
17
+ case code
18
+ when TRACE...WARNING;
19
+ 'trace'
20
+ when WARNING...ERROR;
21
+ 'warning'
22
+ else
23
+ ; 'error'
24
+ end
25
+ end
26
+
27
+ def self.packager id, key
28
+ return Packager.new id, key
29
+ end
30
+
31
+ def self.configure id, key, opts={}
32
+ @@app_id, @@app_secret, @options = id, key, opts
33
+ @@app_name = opts[:app_name]
34
+ @@packager = packager @@app_id, @@app_secret
35
+ @@host = opts[:host] || "http://errlog.com"
36
+ @@client = HTTPClient.new
37
+ begin
38
+ Rails.env
39
+ @@rails = true
40
+ rescue
41
+ @@rails = false
42
+ end
43
+ end
44
+
45
+ def self.app_name
46
+ @@app_name #rescue nil
47
+ end
48
+
49
+ def self.configured?
50
+ @@app_id && @@app_secret
51
+ end
52
+
53
+ def self.default_platform
54
+ @@rails ? 'rails' : 'ruby'
55
+ end
56
+
57
+ def self.rails?
58
+ @@rails
59
+ end
60
+
61
+ def self.pack data
62
+ @@packager.pack(data)
63
+ end
64
+
65
+ def self.create_logger with_logger=nil
66
+ self.context.create_logger with_logger
67
+ end
68
+
69
+ def self.protect component_name=nil, options={}, &block
70
+ context.protect component_name, options, &block
71
+ end
72
+
73
+ def self.protect_rethrow component_name=nil, &block
74
+ context.protect_rethrow component_name, &block
75
+ end
76
+
77
+ def self.report_exception e, &block
78
+ self.context.report_exception e, &block
79
+ end
80
+
81
+ def self.report text, severity = Errlog::ERROR, &block
82
+ self.context.report text, severity, &block
83
+ end
84
+
85
+ def self.clear_context
86
+ ctx = Errlog::Context.new
87
+ Thread.current[:errlog_context] = ctx
88
+ ctx
89
+ end
90
+
91
+ def self.context
92
+ Thread.current[:errlog_context] || clear_context
93
+ end
94
+
95
+ private
96
+
97
+ def self.post src
98
+ data = pack(src)
99
+ @@send_threads ||= []
100
+
101
+ t = Thread.start {
102
+ #puts "sending to #{@@host}"
103
+ error = nil
104
+ begin
105
+ res = @@client.post "#{@@host}/reports/log", app_id: @@app_id, data: Base64::encode64(data)
106
+ error = "report refused: #{res.status}" if res.status != 200
107
+ rescue Exception => e
108
+ error = e
109
+ end
110
+ yield error if block_given?
111
+ }
112
+ @@send_threads << WeakRef.new(t)
113
+ end
114
+
115
+ def self.wait
116
+ @@send_threads.each { |t| t.weakref_alive? and t.join }
117
+ @@send_threads == []
118
+ end
119
+
120
+ end
@@ -0,0 +1,31 @@
1
+ require 'logger'
2
+
3
+ module Errlog
4
+
5
+ class ChainLogger < Logger
6
+
7
+ attr_reader :buffer, :prev_logger
8
+
9
+ def initialize prev
10
+ @buffer = []
11
+ @prev_logger = prev
12
+ super(nil)
13
+ end
14
+
15
+ def level= l
16
+ @prev_logger.level = l
17
+ end
18
+
19
+ def level
20
+ @prev_logger.level
21
+ end
22
+
23
+ def add severity, message = nil, progname = nil
24
+ message = yield if block_given?
25
+ @prev_logger and @prev_logger.add(severity, message, progname)
26
+ @buffer << [severity, Time.now, message, progname]
27
+ end
28
+
29
+ end
30
+ end
31
+
@@ -0,0 +1,21 @@
1
+ module Errlog
2
+ module Constants
3
+
4
+ ERROR = 100
5
+ WARNING = 50
6
+ NOT_FOUND = 50
7
+ TRACE = 1
8
+
9
+ def is_error?(code)
10
+ code >= ERROR
11
+ end
12
+
13
+ def is_warning? code
14
+ code >= WARNING && code < ERROR
15
+ end
16
+
17
+ def is_trace? code
18
+ code >= TRACE && code < WARNING
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,44 @@
1
+ require 'hashie'
2
+
3
+ module Errlog
4
+ class Context < Hashie::Mash
5
+
6
+ def protect component_name=nil, options={}
7
+ component_name and self.component_name = component_name
8
+ begin
9
+ yield self
10
+ rescue Exception => e
11
+ report_exception e
12
+ options[:retrhow] and raise
13
+ end
14
+ end
15
+
16
+ def protect_rethrow component_name=nil, &block
17
+ self.protect component_name, retrhow: true, &block
18
+ end
19
+
20
+ def report_exception e, &block
21
+ self.stack = e.backtrace
22
+ report "#{e.class.name}: #{e.to_s}", Errlog::ERROR
23
+ end
24
+
25
+ def report text, severity = Errlog::ERROR, &block
26
+ raise 'Errlog is not configured. Use Errlog.config' unless Errlog.configured?
27
+ !self.app_name and self.app_name = Errlog.app_name
28
+ self.time = Time.now
29
+ self.severity = severity
30
+ self.platform ||= Errlog.default_platform
31
+ self.stack ||= caller
32
+ self.text = text
33
+ @loggers and self.log = @loggers.reduce([]){ |all,x| all + x.buffer }.sort { |x,y| x[1] <=> y[1] }
34
+ Errlog.rails? and self.rails_root = Rails.root.to_s
35
+ Errlog.post(self.to_hash, &block)
36
+ end
37
+
38
+ def create_logger with_logger=nil
39
+ l = Errlog::ChainLogger.new(with_logger)
40
+ (@loggers ||= []) << l
41
+ l
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,49 @@
1
+ require 'base64'
2
+ require 'openssl'
3
+ require 'digest/md5'
4
+ require 'boss-protocol'
5
+
6
+ module Errlog
7
+
8
+ class Packager
9
+
10
+ # class InvalidPackage < Exception; end
11
+
12
+ def initialize app_id, app_key
13
+ @appid = app_id
14
+ @key = app_key.length == 16 ? app_key : Base64.decode64(app_key)
15
+ end
16
+
17
+ def encrypt data
18
+ cipher = OpenSSL::Cipher.new('AES-128-CBC')
19
+ cipher.encrypt
20
+ iv = cipher.random_iv
21
+ cipher.key = @key
22
+ iv + cipher.update(data) + cipher.update(Digest::MD5.digest(data)) + cipher.final
23
+ end
24
+
25
+ def decrypt ciphertext
26
+ cipher = OpenSSL::Cipher.new('AES-128-CBC')
27
+ cipher.decrypt
28
+ cipher.iv = ciphertext[0..15]
29
+ cipher.key = @key
30
+ data = cipher.update(ciphertext[16..-1]) + cipher.final
31
+ data, digest = data[0...-16], data[-16..-1]
32
+ digest == Digest::MD5.digest(data) ? data : nil
33
+ end
34
+
35
+ def pack payload
36
+ "\x00#{encrypt(Boss.dump @appid, payload)}"
37
+ end
38
+
39
+ def unpack block
40
+ block[0].to_i == 0 or return nil
41
+ id, payload = Boss.load_all(decrypt(block[1..-1]))
42
+ id == @appid ? payload : nil
43
+ rescue
44
+ nil
45
+ end
46
+
47
+ end
48
+
49
+ end
@@ -0,0 +1,3 @@
1
+ module Errlog
2
+ VERSION = "0.1.1"
3
+ end
@@ -0,0 +1,89 @@
1
+ # logger_spec.rb
2
+
3
+ require 'spec_helper.rb'
4
+ require 'hashie'
5
+ require 'errlog'
6
+ require 'stringio'
7
+
8
+ describe Errlog do
9
+
10
+ before :each do
11
+ Errlog.configure 'TheTestId', '1234567890123456'
12
+ @packager = Errlog.packager 'TheTestId', '1234567890123456'
13
+ end
14
+
15
+ it 'should have context' do
16
+ Errlog.context.value = 'test'
17
+ Errlog.context.value.should == 'test'
18
+ Errlog.clear_context
19
+ Errlog.context.value.should == nil
20
+ end
21
+
22
+ # This spec checks the whole chain - protect, report_exception, report, but does not check post
23
+ it 'should provide protection' do
24
+ Errlog.should_receive(:post).exactly(3).times do |payload|
25
+ payload = Hashie::Mash.new payload
26
+ payload.should_not be_nil
27
+ payload.stack[0].should =~ /errlog_spec/
28
+ payload.text.should == 'RuntimeError: TestError'
29
+ payload.time.should be_within(5000).of(Time.now)
30
+ payload.component_name.should == 'test'
31
+ payload.test.should == '123'
32
+ end
33
+
34
+ Errlog.protect 'test' do |ctx|
35
+ Errlog.clear_context
36
+ ctx.test = '123'
37
+ raise 'TestError'
38
+ end
39
+
40
+ -> {
41
+ Errlog.protect_rethrow 'test' do |ctx|
42
+ ctx.test = '123'
43
+ raise 'TestError'
44
+ end
45
+ }.should raise_error
46
+
47
+ Errlog.context.test = '123'
48
+ Errlog.report 'RuntimeError: TestError'
49
+ end
50
+
51
+ it 'should provide logs' do
52
+ Errlog.should_receive(:post).exactly(1).times do |payload|
53
+ payload = Hashie::Mash.new payload
54
+ payload.text.should == 'LogTest'
55
+ payload.log.length.should == 2
56
+ payload.log[0][3].should == 'test info'
57
+ payload.log[1][3].should == 'test warning'
58
+ end
59
+ sio = StringIO.new
60
+ l1 = Errlog.create_logger
61
+ l2 = Errlog.create_logger Logger.new(sio)
62
+ l1.info 'test info'
63
+ l2.warn 'test warning'
64
+ Errlog.report 'LogTest', Errlog::TRACE
65
+ sio.string.should match( /W, \[.*\] WARN -- : test warning/)
66
+ end
67
+
68
+ it 'should provide constants' do
69
+ extend Errlog::Constants
70
+
71
+ is_error?(Errlog::ERROR).should be_true
72
+ is_error?(Errlog::WARNING).should_not be_true
73
+ is_error?(Errlog::TRACE).should_not be_true
74
+
75
+
76
+ is_warning?(Errlog::ERROR).should_not be_true
77
+ is_warning?(Errlog::WARNING).should be_true
78
+ is_warning?(Errlog::TRACE).should_not be_true
79
+
80
+ is_trace?(Errlog::ERROR).should_not be_true
81
+ is_trace?(Errlog::WARNING).should_not be_true
82
+ is_trace?(Errlog::TRACE).should be_true
83
+
84
+ Errlog.severity_name(Errlog::ERROR).should == 'error'
85
+ Errlog.severity_name(Errlog::WARNING).should == 'warning'
86
+ Errlog.severity_name(Errlog::TRACE).should == 'trace'
87
+ end
88
+
89
+ end
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+ require 'errlog'
3
+
4
+ describe 'Packager' do
5
+
6
+ before do
7
+ @packager = Errlog.packager 'TheTestId', '1234567890123456'
8
+ end
9
+
10
+ it 'should properly cipher' do
11
+ data = 'The test data to encrypt/decrypt, just a test but long enough'
12
+ cdata = @packager.encrypt data
13
+ @packager.decrypt(cdata).should == data
14
+ end
15
+
16
+ it 'should accept base64-encoded keys too' do
17
+ p2 = Errlog.packager 'TheOtherId', Base64.encode64('1234567890123456')
18
+ data = 'The test data to encrypt/decrypt, just a test but long enough, and for another purpose'
19
+ cdata = @packager.encrypt data
20
+ p2.decrypt(cdata).should == data
21
+ end
22
+
23
+ it 'should create and parse the package' do
24
+ payload = { 'type' => 'log', 'payload' => 'The test payload' }
25
+ data = @packager.pack payload
26
+ @packager.unpack(data).should == payload
27
+ end
28
+
29
+ it 'should check that package is valid (signed)' do
30
+ payload = { 'type' => 'log', 'payload' => 'The test payload' }
31
+ data = @packager.pack payload
32
+ p2 = Errlog.packager 'TheOtherId', Base64.encode64('123456789012345678901234')
33
+ p2.unpack(data).should == nil
34
+ end
35
+
36
+ it 'should provide settings-driven packer' do
37
+ Errlog.configure 'TheTestId', '1234567890123456'
38
+ payload = { 'type' => 'log', 'payload' => 'The test payload again' }
39
+ @packager.unpack(Errlog.pack(payload)).should == payload
40
+ end
41
+ end
@@ -0,0 +1,17 @@
1
+ # This file was generated by the `rspec --init` command. Conventionally, all
2
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
3
+ # Require this file using `require "spec_helper"` to ensure that it is only
4
+ # loaded once.
5
+ #
6
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
7
+ RSpec.configure do |config|
8
+ config.treat_symbols_as_metadata_keys_with_true_values = true
9
+ config.run_all_when_everything_filtered = true
10
+ config.filter_run :focus
11
+
12
+ # Run specs in random order to surface order dependencies. If you find an
13
+ # order dependency and want to debug it, you can fix the order by providing
14
+ # the seed, which is printed after each run.
15
+ # --seed 1234
16
+ config.order = 'random'
17
+ end
metadata ADDED
@@ -0,0 +1,135 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: errlog
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - sergeych
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-03-31 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: boss-protocol
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: 0.1.3
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: 0.1.3
27
+ - !ruby/object:Gem::Dependency
28
+ name: hashie
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: 1.2.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: 1.2.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: httpclient
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '2.3'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '2.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: colorize
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: Logger and error reporter agent for errlog service
84
+ email:
85
+ - real.sergeych@gmail.com
86
+ executables:
87
+ - errlogr
88
+ extensions: []
89
+ extra_rdoc_files: []
90
+ files:
91
+ - .gitignore
92
+ - .rspec
93
+ - .rvmrc
94
+ - Gemfile
95
+ - LICENSE.txt
96
+ - README.md
97
+ - Rakefile
98
+ - bin/errlogr
99
+ - errlog.gemspec
100
+ - lib/errlog.rb
101
+ - lib/errlog/chain_loggger.rb
102
+ - lib/errlog/constants.rb
103
+ - lib/errlog/context.rb
104
+ - lib/errlog/packager.rb
105
+ - lib/errlog/version.rb
106
+ - spec/errlog_spec.rb
107
+ - spec/packager_spec.rb
108
+ - spec/spec_helper.rb
109
+ homepage: ''
110
+ licenses: []
111
+ metadata: {}
112
+ post_install_message:
113
+ rdoc_options: []
114
+ require_paths:
115
+ - lib
116
+ required_ruby_version: !ruby/object:Gem::Requirement
117
+ requirements:
118
+ - - '>='
119
+ - !ruby/object:Gem::Version
120
+ version: 1.9.2
121
+ required_rubygems_version: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ requirements: []
127
+ rubyforge_project:
128
+ rubygems_version: 2.0.3
129
+ signing_key:
130
+ specification_version: 4
131
+ summary: under development
132
+ test_files:
133
+ - spec/errlog_spec.rb
134
+ - spec/packager_spec.rb
135
+ - spec/spec_helper.rb