rack-mogilefs 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md ADDED
@@ -0,0 +1,63 @@
1
+ # Rack middleware/endpoint for serving MogileFS files
2
+
3
+ ## Getting Started:
4
+
5
+ First install the gem:
6
+
7
+ gem install rack-mogilefs
8
+
9
+ There are a variety of ways to use it:
10
+
11
+ ### Rack middleware
12
+ # (config.ru)
13
+ use Rack::MogileFS, :path => %r{^/system/*}
14
+
15
+ ### Rails 3:
16
+
17
+ # (config/routes.rb)
18
+ match "/system/*" => Rack::MogileFS::Endpoint.new
19
+
20
+ ### Rails 2:
21
+
22
+ # (app/metal/mogilefs.rb)
23
+ class MogileFSMetal
24
+ def self.call(env)
25
+ if env["PATH_INFO"] =~ %r{^/system/*}
26
+ Rack::MogileFS::Endpoint.new.call(env)
27
+ else
28
+ [ 404, { "Content-Type" => "text/html" }, ["Not Found"] ]
29
+ end
30
+ end
31
+ end
32
+
33
+ ## File Lookup
34
+
35
+ `Rack::MogileFS` uses the request path (`PATH_INFO`) for the MogileFS key. The
36
+ content type of the file is detected by the extension, using the `mime-types`
37
+ gem.
38
+
39
+ ## Configuration
40
+
41
+ By default will look for a yaml config in `config/mogilefs.yml` that looks
42
+ like this:
43
+
44
+ development:
45
+ connection:
46
+ domain: "development.myapp.com"
47
+ hosts:
48
+ - 127.0.0.1:7001
49
+ - 127.0.0.1:7001
50
+ class: "file"
51
+ staging:
52
+ ...
53
+
54
+
55
+ and initialize a mogilefs client like this:
56
+
57
+ config = YAML.load_file( Rails.root.join("config/mogilefs.yml") )[Rails.env]
58
+ MogileFS::MogileFS.new( config["connection"].symbolize_keys )
59
+
60
+ You can override this by passing in a MogileFS client of your own:
61
+
62
+ Rack::MogileFS::Endpoint.new :client => MyMogileFSClient.new
63
+
data/Rakefile ADDED
@@ -0,0 +1,12 @@
1
+ require 'rake/clean'
2
+ require 'rake/testtask'
3
+
4
+ task :default => [:test]
5
+
6
+ task :test do
7
+ Rake::TestTask.new do |t|
8
+ t.libs << "test"
9
+ t.pattern = 'test/*_test.rb'
10
+ t.verbose = true
11
+ end
12
+ end
@@ -0,0 +1,53 @@
1
+ module Rack
2
+ class MogileFS
3
+ class Endpoint
4
+
5
+ def initialize(options={})
6
+ @options = {
7
+ :client => nil,
8
+ :default_content_type => "image/png"
9
+ }.merge(options)
10
+
11
+ @options[:client] ||= default_client
12
+ end
13
+
14
+ def call(env)
15
+ data = client.get_file_data(env['PATH_INFO'])
16
+ [ 200, { "Content-Type" => content_type(env['PATH_INFO']) }, [ data ] ]
17
+ rescue ::MogileFS::Backend::UnknownKeyError
18
+ [ 404, { "Content-Type" => "text/html" }, ["Not Found"] ]
19
+ rescue ::MogileFS::UnreachableBackendError => e
20
+ [ 503, { "Content-Type" => "text/html" }, [e.message] ]
21
+ rescue ::MogileFS::Error => e
22
+ [ 500, { "Content-Type" => "text/html" }, [e.message] ]
23
+ end
24
+
25
+ protected
26
+
27
+ def content_type(path_info)
28
+ ext = path_info.split(".").last
29
+ MIME::Types.type_for(ext).first.content_type
30
+ rescue
31
+ @options[:default_content_type]
32
+ end
33
+
34
+ def client
35
+ @options[:client]
36
+ end
37
+
38
+ def default_client
39
+ ::MogileFS::MogileFS.new(config)
40
+ end
41
+
42
+ def config
43
+ if defined?(Rails)
44
+ yml = YAML.load_file( Rails.root.join("config/mogilefs.yml") )
45
+ yml[Rails.env]["connection"].symbolize_keys
46
+ else
47
+ { :domain => "default", :hosts => ["127.0.0.1:7001"] }
48
+ end
49
+ end
50
+
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,20 @@
1
+ require 'mogilefs'
2
+ require 'mime/types'
3
+
4
+ module Rack
5
+ class MogileFS
6
+ autoload :Endpoint, "rack/mogilefs/endpoint"
7
+
8
+ def initialize(app, options={})
9
+ @app, @options = app, options
10
+ end
11
+
12
+ def call(env)
13
+ if env['PATH_INFO'] =~ @options[:path]
14
+ Endpoint.new(@options).call(env)
15
+ else
16
+ @app.call(env)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1 @@
1
+ require 'rack/mogilefs'
@@ -0,0 +1,42 @@
1
+ require 'test_helper'
2
+
3
+ class TestMiddleWare < Test::Unit::TestCase
4
+ class MockMogileFsClient
5
+ def get_file_data(key)
6
+ "Mock Data"
7
+ end
8
+ end
9
+
10
+ def test_middleware_with_path
11
+ app = Rack::Builder.new do
12
+ use Rack::Lint
13
+ use Rack::MogileFS, :path => %r{^/system/*}
14
+ use Rack::Lint
15
+ run lambda { |env| [200, {'Content-Type' => 'text/plain'}, "Hello, World!"] }
16
+ end
17
+
18
+ response = Rack::MockRequest.new(app).get('/')
19
+ assert_equal "Hello, World!", response.body
20
+
21
+ response = Rack::MockRequest.new(app).get('/system/unreachable.txt')
22
+ assert_equal "couldn't connect to mogilefsd backend", response.body
23
+ assert_equal 503, response.status
24
+ end
25
+
26
+ def test_middleware_with_mock_mogile_client
27
+ app = Rack::Builder.new do
28
+ use Rack::Lint
29
+ use Rack::MogileFS, :path => %r{^/system/*}, :client => MockMogileFsClient.new
30
+ use Rack::Lint
31
+ run lambda { |env| [200, {'Content-Type' => 'text/plain'}, "Hello, World!"] }
32
+ end
33
+
34
+ response = Rack::MockRequest.new(app).get('/')
35
+ assert_equal "Hello, World!", response.body
36
+
37
+ response = Rack::MockRequest.new(app).get('/system/mocked.txt')
38
+ assert_equal "Mock Data", response.body
39
+ assert_equal 200, response.status
40
+ assert_equal "text/plain", response.headers['Content-Type']
41
+ end
42
+ end
@@ -0,0 +1,6 @@
1
+ require "rubygems"
2
+ require "test/unit"
3
+ require "rack"
4
+ require "rack/mock"
5
+ require "mocha"
6
+ require "rack/mogilefs"
metadata ADDED
@@ -0,0 +1,116 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rack-mogilefs
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 0
10
+ version: 0.1.0
11
+ platform: ruby
12
+ authors:
13
+ - Ben Marini
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-09-08 00:00:00 -07:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: mime-types
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - "="
28
+ - !ruby/object:Gem::Version
29
+ hash: 47
30
+ segments:
31
+ - 1
32
+ - 16
33
+ version: "1.16"
34
+ type: :runtime
35
+ version_requirements: *id001
36
+ - !ruby/object:Gem::Dependency
37
+ name: rack
38
+ prerelease: false
39
+ requirement: &id002 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ hash: 3
45
+ segments:
46
+ - 0
47
+ version: "0"
48
+ type: :development
49
+ version_requirements: *id002
50
+ - !ruby/object:Gem::Dependency
51
+ name: mocha
52
+ prerelease: false
53
+ requirement: &id003 !ruby/object:Gem::Requirement
54
+ none: false
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ hash: 3
59
+ segments:
60
+ - 0
61
+ version: "0"
62
+ type: :development
63
+ version_requirements: *id003
64
+ description: A rack middleware and/or endpoint to serve up files from MogileFS
65
+ email: bmarini@gmail.com
66
+ executables: []
67
+
68
+ extensions: []
69
+
70
+ extra_rdoc_files: []
71
+
72
+ files:
73
+ - lib/rack/mogilefs/endpoint.rb
74
+ - lib/rack/mogilefs.rb
75
+ - lib/rack-mogilefs.rb
76
+ - README.md
77
+ - Rakefile
78
+ - test/mogilefs_test.rb
79
+ - test/test_helper.rb
80
+ has_rdoc: true
81
+ homepage: http://github.com/bmarini/rack-mogilefs
82
+ licenses: []
83
+
84
+ post_install_message:
85
+ rdoc_options: []
86
+
87
+ require_paths:
88
+ - lib
89
+ required_ruby_version: !ruby/object:Gem::Requirement
90
+ none: false
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ hash: 3
95
+ segments:
96
+ - 0
97
+ version: "0"
98
+ required_rubygems_version: !ruby/object:Gem::Requirement
99
+ none: false
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ hash: 3
104
+ segments:
105
+ - 0
106
+ version: "0"
107
+ requirements: []
108
+
109
+ rubyforge_project:
110
+ rubygems_version: 1.3.7
111
+ signing_key:
112
+ specification_version: 3
113
+ summary: A rack middleware and/or endpoint to serve up files from MogileFS
114
+ test_files:
115
+ - test/mogilefs_test.rb
116
+ - test/test_helper.rb