s3_loggable 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,19 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ coverage
6
+ InstalledFiles
7
+ lib/bundler/man
8
+ pkg
9
+ rdoc
10
+ spec/reports
11
+ test/tmp
12
+ test/version_tmp
13
+ tmp
14
+ .ruby-version
15
+
16
+ # YARD artifacts
17
+ .yardoc
18
+ _yardoc
19
+ doc/
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source "https://rubygems.org"
2
+ gemspec
3
+
4
+ gem "rake"
5
+ gem "mocha", "~> 0.14"
6
+ gem "fog", "~> 1.12"
data/Gemfile.lock ADDED
@@ -0,0 +1,42 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ s3_loggable (0.0.3)
5
+ fog (~> 1.12)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ builder (3.2.2)
11
+ excon (0.23.0)
12
+ fog (1.12.1)
13
+ builder
14
+ excon (~> 0.23.0)
15
+ formatador (~> 0.2.0)
16
+ mime-types
17
+ multi_json (~> 1.0)
18
+ net-scp (~> 1.1)
19
+ net-ssh (>= 2.1.3)
20
+ nokogiri (~> 1.5.0)
21
+ ruby-hmac
22
+ formatador (0.2.4)
23
+ metaclass (0.0.1)
24
+ mime-types (1.23)
25
+ mocha (0.14.0)
26
+ metaclass (~> 0.0.1)
27
+ multi_json (1.7.7)
28
+ net-scp (1.1.1)
29
+ net-ssh (>= 2.6.5)
30
+ net-ssh (2.6.7)
31
+ nokogiri (1.5.10)
32
+ rake (10.1.0)
33
+ ruby-hmac (0.4.0)
34
+
35
+ PLATFORMS
36
+ ruby
37
+
38
+ DEPENDENCIES
39
+ fog (~> 1.12)
40
+ mocha (~> 0.14)
41
+ rake
42
+ s3_loggable!
data/README.md ADDED
@@ -0,0 +1,3 @@
1
+ S3Loggable
2
+ ==========
3
+ Documentation to come...
data/Rakefile ADDED
@@ -0,0 +1,8 @@
1
+ require 'rake/testtask'
2
+
3
+ Rake::TestTask.new do |t|
4
+ t.libs << 'test'
5
+ end
6
+
7
+ desc "Run tests"
8
+ task :default => :test
@@ -0,0 +1,3 @@
1
+ module S3Loggable
2
+ class ConfigurationError < StandardError; end
3
+ end
@@ -0,0 +1,58 @@
1
+ require "date"
2
+ require "zlib"
3
+
4
+ module S3Loggable
5
+ class Logger
6
+ attr_reader :bucket, :s3
7
+
8
+ def initialize(bucket_name)
9
+ @s3 = Fog::Storage.new({:provider => 'AWS'}) if S3Loggable.credentials?
10
+ set_s3_bucket(bucket_name)
11
+ end
12
+
13
+ def set_s3_bucket(bucket_name)
14
+ @bucket = @s3.directories.get(bucket_name)
15
+ @bucket = @s3.directories.create(:key => bucket_name) unless @bucket
16
+ end
17
+
18
+ def log_to_s3(message, folder, id, date_time = DateTime.now)
19
+ filename = "%s/%s/%04d/%02d/%02d%s" % [folder, id, date_time.year, date_time.month, date_time.day, ".rb.gz"]
20
+ temp_filename = "tmp/#{filename}"
21
+ file = get_log(filename)
22
+ file = create_log(filename, temp_filename) unless file
23
+ write_to_log(filename, message, date_time, file, temp_filename)
24
+ end
25
+
26
+ def write_to_log(filename, message, date_time, file, temp_filename)
27
+ local_file = File.open(temp_filename, 'w')
28
+ local_file.write(file.body)
29
+ local_file.close
30
+ File.open(temp_filename, "a+") do |file_gz_io|
31
+ Zlib::GzipWriter.wrap(file_gz_io) do |file_gz|
32
+ file_gz.puts date_time.to_s
33
+ file_gz.puts message.to_s
34
+ file_gz.puts
35
+ end
36
+ end
37
+ file.body = File.open(temp_filename)
38
+ file.save
39
+ File.delete(local_file)
40
+ file
41
+ end
42
+
43
+ def get_log(filename)
44
+ file = @bucket.files.get(filename)
45
+ file
46
+ end
47
+
48
+ def create_log(filename, temp_filename)
49
+ file = @bucket.files.create(:key => filename,
50
+ :content_type => "application/gzip")
51
+ FileUtils.mkdir_p(File.dirname(temp_filename))
52
+ temp_file = File.new(temp_filename, 'w')
53
+ temp_file.close
54
+ file
55
+ end
56
+
57
+ end
58
+ end
@@ -0,0 +1,3 @@
1
+ module S3Loggable
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,23 @@
1
+ require "fog"
2
+ require "s3_loggable/exceptions"
3
+ require "s3_loggable/logger"
4
+
5
+ module S3Loggable
6
+
7
+ RequiredCredentials = [:aws_access_key_id, :aws_secret_access_key]
8
+
9
+ def self.credentials?
10
+ set_credentials unless (Fog.credentials.keys & RequiredCredentials).count == RequiredCredentials.count
11
+ true
12
+ end
13
+
14
+ def self.set_credentials
15
+ if ENV["AWS_ACCESS_KEY_ID"] and ENV["AWS_SECRET_ACCESS_KEY"]
16
+ Fog.credentials[:aws_access_key_id] = ENV["AWS_ACCESS_KEY_ID"]
17
+ Fog.credentials[:aws_secret_access_key] = ENV["AWS_SECRET_ACCESS_KEY"]
18
+ else
19
+ raise ConfigurationError, "Set AWS access key id and secret access key"
20
+ end
21
+ end
22
+
23
+ end
@@ -0,0 +1,25 @@
1
+ #lib = File.expand_path('../lib', __FILE__)
2
+ # -*- encoding: utf-8 -*-
3
+ $:.push File.expand_path("../lib", __FILE__)
4
+ require "s3_loggable/version"
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "s3_loggable"
8
+ s.version = S3Loggable::VERSION
9
+ s.authors = ["Will Highducheck"]
10
+ s.email = ["will.highducheck@gmail.com"]
11
+ s.summary = "S3Loggable"
12
+ s.description = "Simple logging to S3"
13
+ s.homepage = "http://github.com/adaptly/s3_loggable"
14
+
15
+ s.add_development_dependency "rake"
16
+ s.add_development_dependency "mocha", "~> 0.14"
17
+
18
+ s.add_dependency "fog", "~> 1.12"
19
+
20
+ s.post_install_message = "Something clever about logs. Hahahaha..."
21
+
22
+ s.files = `git ls-files`.split("\n")
23
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
24
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
25
+ end
@@ -0,0 +1,21 @@
1
+ require "test/unit"
2
+ require "mocha/setup"
3
+ require "s3_loggable"
4
+
5
+ class TestS3Loggable < Test::Unit::TestCase
6
+
7
+ def test_credentials_is_false?
8
+ Fog.expects(:credentials).returns({})
9
+ ENV.expects(:[]).with("AWS_ACCESS_KEY_ID").returns(nil)
10
+ assert_raise(S3Loggable::ConfigurationError) do
11
+ S3Loggable.credentials?
12
+ end
13
+ end
14
+
15
+ def test_credentials_is_true?
16
+ Fog.expects(:credentials).returns({:aws_access_key_id => "ABC",
17
+ :aws_secret_access_key => "123"})
18
+ assert_equal(S3Loggable.credentials?, true)
19
+ end
20
+
21
+ end
@@ -0,0 +1,80 @@
1
+ require "test/unit"
2
+ require "mocha/setup"
3
+ require "s3_loggable"
4
+
5
+ class TestS3LoggableLogger < Test::Unit::TestCase
6
+
7
+ def test_initialize_existing_bucket
8
+ bucket_name = "test-bucket-name"
9
+ fog_storage = mock("fog_storage")
10
+ bucket = mock("bucket")
11
+ fog_storage_directories = mock("fog_storage_directories")
12
+
13
+ fog_storage.expects(:directories).returns(fog_storage_directories)
14
+ fog_storage_directories.expects(:get).with(bucket_name).returns(bucket)
15
+ Fog::Storage.expects(:new).with({:provider => 'AWS'}).returns(fog_storage)
16
+ S3Loggable.expects(:credentials?).returns(true)
17
+
18
+ logger = S3Loggable::Logger.new(bucket_name)
19
+
20
+ assert_equal(logger.s3, fog_storage)
21
+ assert_equal(logger.bucket, bucket)
22
+
23
+ logger
24
+ end
25
+
26
+ def test_initialize_new_bucket
27
+ bucket_name = "test-bucket-name"
28
+ fog_storage = mock("fog_storage")
29
+ bucket = mock("bucket")
30
+ fog_storage_directories = mock("fog_storage_directories")
31
+
32
+ fog_storage.expects(:directories).twice.returns(fog_storage_directories)
33
+ fog_storage_directories.expects(:get).with(bucket_name).returns(nil)
34
+ fog_storage_directories.expects(:create).with(:key => bucket_name).returns(bucket)
35
+ Fog::Storage.expects(:new).with({:provider => 'AWS'}).returns(fog_storage)
36
+ S3Loggable.expects(:credentials?).returns(true)
37
+
38
+ logger = S3Loggable::Logger.new(bucket_name)
39
+
40
+ assert_equal(logger.s3, fog_storage)
41
+ assert_equal(logger.bucket, bucket)
42
+
43
+ logger
44
+ end
45
+
46
+ def test_log_to_s3_new_log
47
+ logger = test_initialize_existing_bucket
48
+ message = {'foo' => 'bar'}
49
+ test_object = 'test-object'
50
+ id = 123
51
+ s3_file = mock('s3_file')
52
+ s3_files = mock('s3_files')
53
+
54
+ logger.bucket.expects(:files).twice.returns(s3_files)
55
+ s3_files.expects(:get).returns(nil)
56
+ s3_files.expects(:create).returns(s3_file)
57
+ s3_file.expects(:body)
58
+ s3_file.expects(:body=)
59
+ s3_file.expects(:save)
60
+ assert_equal(logger.log_to_s3(message, test_object, id), s3_file)
61
+ end
62
+
63
+ def test_log_to_s3_existing_log
64
+ logger = test_initialize_existing_bucket
65
+ message = {'foo' => 'bar'}
66
+ test_object = 'test-object'
67
+ id = 123
68
+ deflated_string = Zlib::Deflate.deflate(message.to_s)
69
+ s3_file = mock('s3_file')
70
+ s3_files = mock('s3_files')
71
+
72
+ logger.bucket.expects(:files).returns(s3_files)
73
+ s3_files.expects(:get).returns(s3_file)
74
+ s3_file.expects(:body).returns(deflated_string)
75
+ s3_file.expects(:body=)
76
+ s3_file.expects(:save)
77
+ assert_equal(logger.log_to_s3(message, test_object, id), s3_file)
78
+ end
79
+
80
+ end
metadata ADDED
@@ -0,0 +1,105 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: s3_loggable
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Will Highducheck
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-06-27 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rake
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: mocha
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: '0.14'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: '0.14'
46
+ - !ruby/object:Gem::Dependency
47
+ name: fog
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: '1.12'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '1.12'
62
+ description: Simple logging to S3
63
+ email:
64
+ - will.highducheck@gmail.com
65
+ executables: []
66
+ extensions: []
67
+ extra_rdoc_files: []
68
+ files:
69
+ - .gitignore
70
+ - Gemfile
71
+ - Gemfile.lock
72
+ - README.md
73
+ - Rakefile
74
+ - lib/s3_loggable.rb
75
+ - lib/s3_loggable/exceptions.rb
76
+ - lib/s3_loggable/logger.rb
77
+ - lib/s3_loggable/version.rb
78
+ - s3_loggable.gemspec
79
+ - test/test_s3_loggable.rb
80
+ - test/test_s3_loggable_logger.rb
81
+ homepage: http://github.com/adaptly/s3_loggable
82
+ licenses: []
83
+ post_install_message: Something clever about logs. Hahahaha...
84
+ rdoc_options: []
85
+ require_paths:
86
+ - lib
87
+ required_ruby_version: !ruby/object:Gem::Requirement
88
+ none: false
89
+ requirements:
90
+ - - ! '>='
91
+ - !ruby/object:Gem::Version
92
+ version: '0'
93
+ required_rubygems_version: !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ requirements: []
100
+ rubyforge_project:
101
+ rubygems_version: 1.8.23
102
+ signing_key:
103
+ specification_version: 3
104
+ summary: S3Loggable
105
+ test_files: []