s3_loggable 0.1.0

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.
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: []