waves 0.8.2 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (166) hide show
  1. data/bin/waves +4 -3
  2. data/doc/VERSION +1 -1
  3. data/lib/waves.rb +52 -40
  4. data/lib/{caches → waves/caches}/file.rb +3 -1
  5. data/lib/waves/caches/memcached.rb +56 -0
  6. data/lib/{caches → waves/caches}/simple.rb +6 -7
  7. data/lib/{caches → waves/caches}/synchronized.rb +15 -1
  8. data/lib/{commands → waves/commands}/console.rb +4 -4
  9. data/lib/{commands → waves/commands}/generate.rb +6 -5
  10. data/lib/{commands → waves/commands}/help.rb +0 -0
  11. data/lib/{commands → waves/commands}/server.rb +1 -1
  12. data/lib/{dispatchers → waves/dispatchers}/base.rb +17 -31
  13. data/lib/waves/dispatchers/default.rb +19 -0
  14. data/lib/{ext → waves/ext}/float.rb +0 -0
  15. data/lib/{ext → waves/ext}/hash.rb +0 -0
  16. data/lib/{ext → waves/ext}/integer.rb +16 -1
  17. data/lib/{ext → waves/ext}/kernel.rb +3 -7
  18. data/lib/{ext → waves/ext}/module.rb +3 -3
  19. data/lib/{ext → waves/ext}/object.rb +2 -0
  20. data/lib/waves/ext/string.rb +73 -0
  21. data/lib/{ext → waves/ext}/symbol.rb +0 -1
  22. data/lib/{ext → waves/ext}/tempfile.rb +0 -0
  23. data/lib/waves/ext/time.rb +5 -0
  24. data/lib/{foundations → waves/foundations}/classic.rb +9 -21
  25. data/lib/{foundations → waves/foundations}/compact.rb +15 -20
  26. data/lib/waves/foundations/rest.rb +311 -0
  27. data/lib/waves/helpers/basic.rb +13 -0
  28. data/lib/{helpers → waves/helpers}/doc_type.rb +3 -0
  29. data/lib/waves/helpers/form.rb +94 -0
  30. data/lib/waves/helpers/formatting.rb +14 -0
  31. data/lib/waves/layers/mvc.rb +65 -0
  32. data/lib/{layers → waves/layers}/mvc/controllers.rb +0 -0
  33. data/lib/{layers → waves/layers}/mvc/extensions.rb +23 -11
  34. data/lib/{layers → waves/layers}/orm/migration.rb +0 -0
  35. data/lib/{layers → waves/layers}/orm/providers/active_record.rb +2 -5
  36. data/lib/{layers → waves/layers}/orm/providers/active_record/migrations/empty.rb.erb +0 -0
  37. data/lib/{layers → waves/layers}/orm/providers/active_record/tasks/generate.rb +1 -1
  38. data/lib/{layers → waves/layers}/orm/providers/active_record/tasks/schema.rb +1 -1
  39. data/lib/{layers → waves/layers}/orm/providers/data_mapper.rb +0 -0
  40. data/lib/{layers → waves/layers}/orm/providers/filebase.rb +0 -0
  41. data/lib/{layers → waves/layers}/orm/providers/sequel.rb +28 -29
  42. data/lib/{layers → waves/layers}/orm/providers/sequel/migrations/empty.rb.erb +0 -0
  43. data/lib/{layers → waves/layers}/orm/providers/sequel/tasks/generate.rb +1 -1
  44. data/lib/{layers → waves/layers}/orm/providers/sequel/tasks/schema.rb +2 -0
  45. data/lib/waves/layers/rack/rack_cache.rb +32 -0
  46. data/lib/waves/layers/renderers/erubis.rb +52 -0
  47. data/lib/waves/layers/renderers/haml.rb +67 -0
  48. data/lib/waves/layers/renderers/markaby.rb +41 -0
  49. data/lib/waves/layers/text/inflect/english.rb +42 -0
  50. data/lib/waves/matchers/accept.rb +47 -0
  51. data/lib/waves/matchers/ext.rb +27 -0
  52. data/lib/waves/matchers/path.rb +72 -0
  53. data/lib/waves/matchers/query.rb +43 -0
  54. data/lib/waves/matchers/request.rb +86 -0
  55. data/lib/waves/matchers/requested.rb +31 -0
  56. data/lib/{matchers → waves/matchers}/resource.rb +8 -1
  57. data/lib/waves/matchers/traits.rb +30 -0
  58. data/lib/waves/matchers/uri.rb +69 -0
  59. data/lib/waves/media/mime_types.rb +542 -0
  60. data/lib/waves/renderers/mixin.rb +9 -0
  61. data/lib/waves/request/accept.rb +92 -0
  62. data/lib/{runtime → waves/request}/request.rb +77 -61
  63. data/lib/waves/resources/file_mixin.rb +11 -0
  64. data/lib/{resources → waves/resources}/mixin.rb +42 -44
  65. data/lib/waves/resources/paths.rb +132 -0
  66. data/lib/waves/response/client_errors.rb +10 -0
  67. data/lib/waves/response/packaged.rb +19 -0
  68. data/lib/waves/response/redirects.rb +35 -0
  69. data/lib/{runtime → waves/response}/response.rb +29 -11
  70. data/lib/{runtime → waves/response}/response_mixin.rb +30 -17
  71. data/lib/waves/runtime/applications.rb +18 -0
  72. data/lib/{runtime → waves/runtime}/configuration.rb +31 -25
  73. data/lib/waves/runtime/console.rb +24 -0
  74. data/lib/{runtime → waves/runtime}/logger.rb +3 -3
  75. data/lib/{runtime → waves/runtime}/mocks.rb +2 -2
  76. data/lib/waves/runtime/rackup.rb +37 -0
  77. data/lib/waves/runtime/runtime.rb +48 -0
  78. data/lib/waves/runtime/server.rb +33 -0
  79. data/lib/{servers → waves/servers}/base.rb +0 -0
  80. data/lib/{servers → waves/servers}/mongrel.rb +0 -0
  81. data/lib/{servers → waves/servers}/webrick.rb +0 -0
  82. data/lib/{tasks → waves/tasks}/gem.rb +0 -0
  83. data/lib/{tasks → waves/tasks}/generate.rb +0 -0
  84. data/lib/waves/views/cassy.rb +173 -0
  85. data/lib/{views → waves/views}/errors.rb +8 -7
  86. data/lib/waves/views/mixin.rb +23 -0
  87. data/lib/waves/views/templated.rb +40 -0
  88. data/samples/basic/basic_startup.rb +70 -0
  89. data/samples/basic/config.ru +9 -0
  90. data/samples/blog/configurations/development.rb +17 -16
  91. data/samples/blog/configurations/production.rb +0 -11
  92. data/samples/blog/resources/entry.rb +3 -3
  93. data/samples/blog/resources/map.rb +10 -3
  94. data/samples/blog/startup.rb +4 -3
  95. data/templates/classic/Rakefile +28 -29
  96. data/templates/classic/configurations/default.rb.erb +8 -3
  97. data/templates/classic/configurations/development.rb.erb +1 -20
  98. data/templates/classic/configurations/production.rb.erb +2 -16
  99. data/templates/classic/public/images/favicon.ico +0 -0
  100. data/templates/classic/resources/server.rb.erb +9 -0
  101. data/templates/classic/startup.rb.erb +3 -3
  102. data/templates/classic/views/css.rb.erb +14 -0
  103. data/templates/classic/views/default.rb.erb +17 -0
  104. data/templates/classic/views/errors.rb.erb +10 -0
  105. data/templates/classic/views/pages.rb.erb +14 -0
  106. data/templates/compact/startup.rb.erb +8 -3
  107. data/test/ext/object.rb +55 -0
  108. data/test/ext/shortcuts.rb +73 -0
  109. data/test/helpers.rb +17 -0
  110. data/test/match/accept.rb +78 -0
  111. data/test/match/ext.rb +156 -0
  112. data/test/match/methods.rb +22 -0
  113. data/test/match/params.rb +33 -0
  114. data/test/match/path.rb +106 -0
  115. data/test/match/query.rb +60 -0
  116. data/test/match/request.rb +91 -0
  117. data/test/match/requested.rb +149 -0
  118. data/test/match/uri.rb +136 -0
  119. data/test/process/request.rb +75 -0
  120. data/test/process/resource.rb +53 -0
  121. data/test/resources/path.rb +166 -0
  122. data/test/runtime/configurations.rb +19 -0
  123. data/test/runtime/request.rb +63 -0
  124. data/test/runtime/response.rb +85 -0
  125. data/test/views/views.rb +40 -0
  126. metadata +243 -157
  127. data/lib/caches/memcached.rb +0 -40
  128. data/lib/dispatchers/default.rb +0 -25
  129. data/lib/ext/string.rb +0 -20
  130. data/lib/helpers/basic.rb +0 -11
  131. data/lib/helpers/extended.rb +0 -21
  132. data/lib/helpers/form.rb +0 -42
  133. data/lib/helpers/formatting.rb +0 -30
  134. data/lib/helpers/layouts.rb +0 -37
  135. data/lib/helpers/model.rb +0 -37
  136. data/lib/helpers/view.rb +0 -22
  137. data/lib/layers/inflect/english.rb +0 -67
  138. data/lib/layers/mvc.rb +0 -54
  139. data/lib/layers/renderers/erubis.rb +0 -60
  140. data/lib/layers/renderers/haml.rb +0 -47
  141. data/lib/layers/renderers/markaby.rb +0 -29
  142. data/lib/matchers/accept.rb +0 -21
  143. data/lib/matchers/base.rb +0 -30
  144. data/lib/matchers/content_type.rb +0 -17
  145. data/lib/matchers/path.rb +0 -67
  146. data/lib/matchers/query.rb +0 -21
  147. data/lib/matchers/request.rb +0 -27
  148. data/lib/matchers/traits.rb +0 -19
  149. data/lib/matchers/uri.rb +0 -20
  150. data/lib/renderers/mixin.rb +0 -36
  151. data/lib/resources/paths.rb +0 -34
  152. data/lib/runtime/console.rb +0 -23
  153. data/lib/runtime/mime_types.rb +0 -536
  154. data/lib/runtime/monitor.rb +0 -32
  155. data/lib/runtime/runtime.rb +0 -67
  156. data/lib/runtime/server.rb +0 -20
  157. data/lib/runtime/session.rb +0 -27
  158. data/lib/runtime/worker.rb +0 -86
  159. data/lib/views/mixin.rb +0 -62
  160. data/samples/blog/blog.db +0 -0
  161. data/samples/blog/log/waves.production +0 -3
  162. data/templates/classic/resources/map.rb.erb +0 -8
  163. data/templates/classic/templates/errors/not_found_404.mab +0 -7
  164. data/templates/classic/templates/errors/server_error_500.mab +0 -7
  165. data/templates/classic/templates/layouts/default.mab +0 -14
  166. data/templates/classic/tmp/sessions/.gitignore +0 -0
@@ -1,47 +0,0 @@
1
- require 'haml'
2
-
3
- module Waves
4
-
5
- module Renderers
6
-
7
- module Haml
8
-
9
- Extension = :haml
10
-
11
- extend Waves::Renderers::Mixin
12
-
13
- def self.render( path, assigns )
14
- engine = ::Haml::Engine.new( template( path ) )
15
- scope = Scope.new
16
- helper = helper( path )
17
- scope.meta_eval { include( helper ) }
18
- scope.instance_eval do
19
- assigns.each { |key,val| instance_variable_set("@#{key}",val) unless key == :request }
20
- end
21
- engine.render(scope, assigns)
22
- end
23
-
24
- class Scope
25
- include Waves::Helpers::DocType
26
- include Waves::Helpers::Layouts
27
- include Waves::Helpers::Model
28
- include Waves::Helpers::View
29
-
30
- def <<(s)
31
- eval("@haml_buffer", @binding).push_text s # add to rendered output
32
- end
33
-
34
- def capture(&block)
35
- capture_haml(nil, &block)
36
- end
37
-
38
- end
39
-
40
- end
41
-
42
- end
43
-
44
- end
45
-
46
-
47
-
@@ -1,29 +0,0 @@
1
- module Waves
2
-
3
- module Renderers
4
-
5
- module Markaby
6
-
7
- Extension = :mab
8
-
9
- extend Waves::Renderers::Mixin
10
-
11
- def self.included( app )
12
- require 'markaby'
13
- ::Markaby::Builder.set( :indent, 2 )
14
- super
15
- end
16
-
17
- def self.render( path, assigns )
18
- builder = ::Markaby::Builder.new( assigns )
19
- helper = helper( path )
20
- builder.meta_eval { include( helper ) }
21
- builder.instance_eval( template( path ) )
22
- builder.to_s
23
- end
24
-
25
- end
26
-
27
- end
28
-
29
- end
@@ -1,21 +0,0 @@
1
- module Waves
2
-
3
- module Matchers
4
-
5
- class Accept < Base
6
-
7
- def initialize( options )
8
- @constraints = {
9
- :accept => options[ :accept ],
10
- :lang => options[ :lang ],
11
- :charset => options[ :charset ]
12
- }
13
- end
14
-
15
- def call( request ) ; test( request ) ; end
16
-
17
- end
18
-
19
- end
20
-
21
- end
data/lib/matchers/base.rb DELETED
@@ -1,30 +0,0 @@
1
- module Waves
2
-
3
- module Matchers
4
-
5
- class Base
6
-
7
- attr_accessor :constraints
8
-
9
- def []( *args ) ; call( *args ) ; end
10
-
11
- # used to provide consisting matching logic across all matchers
12
- def test( request )
13
- constraints.all? do | key, val |
14
- if val.nil? or val == true
15
- true
16
- else
17
- if val.respond_to? :call
18
- val.call( request )
19
- else
20
- val == request.send( key ) or val === request.send( key ) or request.send( key ) === val
21
- end
22
- end
23
- end
24
- end
25
-
26
- end
27
-
28
- end
29
-
30
- end
@@ -1,17 +0,0 @@
1
- module Waves
2
-
3
- module Matchers
4
-
5
- class ContentType < Base
6
-
7
- def initialize( content_type ) ; @constraints = { :content_type => content_type } ; end
8
-
9
- # we could maybe do something more sophisticated here, matching against content type patterns
10
- # such */html or */xml, etc.; adapt from the matching done on accepts ... ?
11
- def call( request ) ; test( request ) ; end
12
-
13
- end
14
-
15
- end
16
-
17
- end
data/lib/matchers/path.rb DELETED
@@ -1,67 +0,0 @@
1
- module Waves
2
-
3
- module Matchers
4
-
5
- class Path < Base
6
-
7
- # Takes an array of pattern elements ... coming soon, support for formatted strings!
8
- def initialize( pattern ) ; @pattern = pattern ; end
9
-
10
- def call( request )
11
- return {} if @pattern == true or @pattern == false or @pattern.nil?
12
- path = extract_path( request ).reverse
13
- return {} if ( path.empty? and @pattern.empty? )
14
- capture = {}
15
- match = @pattern.all? do | want |
16
- case want
17
- when true # means 1..-1
18
- path = [] unless path.empty?
19
- when Range
20
- if want.end == -1
21
- path = [] if path.length >= want.begin
22
- else
23
- path = [] if want.include? path.length
24
- end
25
- when String then want == path.pop
26
- when Symbol then capture[ want ] = path.pop
27
- when Regexp then want === path.pop
28
- when Hash
29
- key, value = want.to_a.first
30
- case value
31
- when true
32
- ( capture[ key ], path = path.reverse, [] ) unless path.empty?
33
- when Range
34
- if value.end == -1
35
- ( capture[ key ], path = path.reverse, [] ) if path.length >= value.begin
36
- else
37
- ( capture[ key ], path = path.reverse, [] ) if value.include? path.length
38
- end
39
- when String, Symbol
40
- got = path.pop
41
- capture[ key ] = got ? got : value.to_s
42
- when Regexp then
43
- got = path.pop
44
- capture[ key ] = got if value === got
45
- end
46
- end
47
- end
48
- capture if match && path.empty?
49
- end
50
-
51
- private
52
-
53
- # just a little helper method
54
- def extract_path( request )
55
- path = request.traits.waves.path
56
- return path if path
57
- path = request.path.split('/')
58
- path.shift unless path.empty?
59
- request.traits.waves.path = path
60
- end
61
-
62
- end
63
-
64
-
65
- end
66
-
67
- end
@@ -1,21 +0,0 @@
1
- module Waves
2
-
3
- module Matchers
4
-
5
- class Query < Base
6
-
7
- def initialize( pattern ) ; @pattern = ( pattern or {} ) ; end
8
-
9
- def call( request )
10
- @pattern.all? do | key, val |
11
- key = key.to_s
12
- ( ( val.respond_to?(:call) and val.call( request.query[ key ] ) ) or
13
- ( request.query[ key ] and ( ( val == true ) or ( val === request.query[ key ] ) ) ) )
14
- end
15
- end
16
-
17
- end
18
-
19
- end
20
-
21
- end
@@ -1,27 +0,0 @@
1
- module Waves
2
-
3
- module Matchers
4
-
5
- class Request < Base
6
-
7
- def initialize( options )
8
- @uri = Matchers::URI.new( options )
9
- @constraints = {
10
- :content_type => Matchers::ContentType.new( options[ :content_type ] ),
11
- :accept => Matchers::Accept.new( options ),
12
- :query => Matchers::Query.new( options[:query] ),
13
- :traits => Matchers::Traits.new( options[:traits] )
14
- }
15
- end
16
-
17
- def call( request )
18
- if test( request ) and captured = @uri[ request ]
19
- request.traits.waves.captured = captured
20
- end
21
- end
22
-
23
- end
24
-
25
- end
26
-
27
- end
@@ -1,19 +0,0 @@
1
- module Waves
2
-
3
- module Matchers
4
-
5
- class Traits < Base
6
-
7
- def initialize( pattern ) ; @pattern = ( pattern or {} ) ; end
8
-
9
- def call( request )
10
- @pattern.all? do | key, val |
11
- ( val.is_a? Proc and val.call( request.traits[ key ] ) ) or val === request.traits[ key ]
12
- end
13
- end
14
-
15
- end
16
-
17
- end
18
-
19
- end
data/lib/matchers/uri.rb DELETED
@@ -1,20 +0,0 @@
1
- module Waves
2
-
3
- module Matchers
4
-
5
- class URI < Base
6
-
7
- def initialize( options )
8
- @path = Waves::Matchers::Path.new( options[ :path ] )
9
- @constraints = { :server => options[ :server ], :scheme => options[ :scheme ] }
10
- end
11
-
12
- def call( request )
13
- @path.call( request ) if test( request )
14
- end
15
-
16
- end
17
-
18
- end
19
-
20
- end
@@ -1,36 +0,0 @@
1
- module Waves
2
-
3
- module Renderers # :nodoc:
4
-
5
- # The renderers mixin provides a number of methods to simplify writing new renderers.
6
- # Just include this in your Renderer class and write your render method.
7
- module Mixin
8
-
9
- # Adds the following methods to the mod class:
10
- #
11
- # - filename: generate a filename for the template based on a logical path.
12
- # - template: read the template from the file corresponding to the given logical path.
13
- # - helper: return a helper module that corresponds to the given logical path.
14
- #
15
-
16
- def included( app )
17
- Waves::Views.renderers << self
18
- end
19
-
20
- def filename(path)
21
- "#{path}.#{self::Extension}"
22
- end
23
-
24
- def template( path )
25
- File.read( filename( path ) )
26
- end
27
-
28
- def helper( path )
29
- Waves.main[ :helpers ][ File.basename( File.dirname( path ) ).camel_case ]
30
- end
31
-
32
- end
33
-
34
- end
35
-
36
- end
@@ -1,34 +0,0 @@
1
- module Waves
2
-
3
- module Resources
4
-
5
- class Paths
6
-
7
- attr_accessor :request
8
-
9
- include Waves::ResponseMixin
10
-
11
- def initialize( request ) ; @request = request ; end
12
-
13
- def generate( template, args )
14
- return "/#{ args * '/' }" unless template.is_a?( Array ) and not template.empty?
15
- path = []
16
- ( "/#{ path * '/' }" ) if template.all? do | want |
17
- case want
18
- when true then path += args
19
- when String then path << want
20
- when Symbol then path << args.shift
21
- when Regexp then path << args.shift
22
- when Hash
23
- key, value = want.to_a.first
24
- case value
25
- when true then path += args
26
- when String, Symbol, RegExp then path << args.unshift
27
- end
28
- end
29
- end
30
- end
31
- end
32
- end
33
-
34
- end
@@ -1,23 +0,0 @@
1
- require 'runtime/mocks'
2
- module Waves
3
-
4
- class Console < Runtime
5
-
6
- class << self
7
-
8
- attr_reader :console
9
-
10
- def load( options={} )
11
- @console ||= Waves::Console.new( options )
12
- Kernel.load( options[:startup] || 'startup.rb' )
13
- Object.instance_eval { include Waves::Mocks }
14
- end
15
-
16
- # allow Waves::Console to act as The Console Instance
17
- def method_missing(*args); @console.send(*args); end
18
-
19
- end
20
-
21
- end
22
-
23
- end
@@ -1,536 +0,0 @@
1
- module Waves
2
-
3
- # Waves::MimeTypes defines an interface for adding MIME types used in mapping requests
4
- # to content types. Originally taken from Mongrel.
5
-
6
- module MimeTypes
7
-
8
- def self.[]( path )
9
- mapping[ File.extname( path ) ]
10
- end
11
-
12
- # TODO: This does not seem to be working.
13
- def self.<<( mapping )
14
- mapping.merge!( mapping )
15
- end
16
-
17
- def self.mapping
18
- @mapping ||= Waves::MIME_TYPES
19
- end
20
-
21
- end
22
-
23
- MIME_TYPES = {
24
- ".skd"=>"application/x-koan",
25
- ".el"=>"text/x-script.elisp",
26
- ".iges"=>"application/iges",
27
- ".iefs"=>"image/ief",
28
- ".omcr"=>"application/x-omcregerator",
29
- ".spc"=>"text/x-speech",
30
- ".mng"=>"video/x-mng",
31
- ".deb"=>"application/octet-stream",
32
- ".mzz"=>"application/x-vnd.audioexplosion.mzz",
33
- ".csh"=>"text/x-script.csh",
34
- ".pfx"=>"application/x-pkcs12",
35
- ".lhx"=>"application/octet-stream",
36
- ".xls"=>"application/excel",
37
- ".wsc"=>"text/scriplet",
38
- ".tsp"=>"audio/tsplayer",
39
- ".ccad"=>"application/clariscad",
40
- ".mpga"=>"audio/mpeg",
41
- ".pps"=>"application/mspowerpoint",
42
- ".htt"=>"text/webviewhtml",
43
- ".texinfo"=>"application/x-texinfo",
44
- ".p10"=>"application/x-pkcs10",
45
- ".xlt"=>"application/excel",
46
- ".ppt"=>"application/mspowerpoint",
47
- ".es"=>"application/x-esrehber",
48
- ".fdf"=>"application/vnd.fdf",
49
- ".def"=>"text/plain",
50
- ".p12"=>"application/x-pkcs12",
51
- ".pdb"=>"application/x-pilot",
52
- ".fpx"=>"image/vnd.net-fpx",
53
- ".xlv"=>"application/excel",
54
- ".tk"=>"application/x-tcl",
55
- ".msi"=>"application/octet-stream",
56
- ".xlw"=>"application/excel",
57
- ".xgz"=>"xgl/drawing",
58
- ".wsrc"=>"application/x-wais-source",
59
- ".vrt"=>"x-world/x-vrt",
60
- ".htx"=>"text/html",
61
- ".js"=>"text/javascript",
62
- ".fif"=>"image/fif",
63
- ".pic"=>"image/pict",
64
- ".doc"=>"application/msword",
65
- ".setpay"=>"application/set-payment-initiation",
66
- ".skm"=>"application/x-koan",
67
- ".tsv"=>"text/tab-separated-values",
68
- ".pdf"=>"application/pdf",
69
- ".txt"=>"text/plain",
70
- ".ppz"=>"application/mspowerpoint",
71
- ".spl"=>"application/futuresplash",
72
- ".msm"=>"application/octet-stream",
73
- ".rexx"=>"text/x-script.rexx",
74
- ".skp"=>"application/x-koan",
75
- ".rtx"=>"text/richtext",
76
- ".jpeg"=>"image/jpeg",
77
- ".tr"=>"application/x-troff",
78
- ".css"=>"text/css",
79
- ".lam"=>"audio/x-liveaudio",
80
- ".msp"=>"application/octet-stream",
81
- ".sv4cpio"=>"application/x-sv4cpio",
82
- ".cc"=>"text/plain",
83
- ".tbk"=>"application/x-tbook",
84
- ".class"=>"application/octet-stream",
85
- ".png"=>"image/png",
86
- ".acgi"=>"text/html",
87
- ".psd"=>"application/octet-stream",
88
- ".skt"=>"application/x-koan",
89
- ".spr"=>"application/x-sprite",
90
- ".idc"=>"text/plain",
91
- ".bas"=>"text/plain",
92
- ".gtar"=>"application/x-gtar",
93
- ".bcpio"=>"application/x-bcpio",
94
- ".xof"=>"x-world/x-vrml",
95
- ".der"=>"application/x-x509-ca-cert",
96
- ".mbd"=>"application/mbedlet",
97
- ".rmi"=>"audio/mid",
98
- ".turbot"=>"image/florian",
99
- ".mc"=>"application/x-magic-cap-package-1.0",
100
- ".ra"=>"audio/x-realaudio",
101
- ".xpix"=>"application/x-vnd.ls-xpix",
102
- ".wiz"=>"application/msword",
103
- ".cxx"=>"text/plain",
104
- ".me"=>"application/x-troff-me",
105
- ".lzh"=>"application/x-lzh",
106
- ".hh"=>"text/plain",
107
- ".arc"=>"application/octet-stream",
108
- ".rmm"=>"audio/x-pn-realaudio",
109
- ".pnm"=>"image/x-portable-anymap",
110
- ".zsh"=>"text/x-script.zsh",
111
- ".sid"=>"audio/x-psid",
112
- ".pfunk"=>"audio/make.my.funk",
113
- ".zip"=>"application/zip",
114
- ".wbmp"=>"image/vnd.wap.wbmp",
115
- ".rmp"=>"audio/x-pn-realaudio-plugin",
116
- ".iii"=>"application/x-iphone",
117
- ".snd"=>"audio/x-adpcm",
118
- ".rf"=>"image/vnd.rn-realflash",
119
- ".mvb"=>"application/x-msmediaview",
120
- ".qtc"=>"video/x-qtc",
121
- ".rast"=>"image/cmu-raster",
122
- ".arj"=>"application/octet-stream",
123
- ".ear"=>"application/java-archive",
124
- ".mm"=>"application/x-meme",
125
- ".funk"=>"audio/make",
126
- ".smil"=>"application/smil",
127
- ".f90"=>"text/x-fortran",
128
- ".vda"=>"application/vda",
129
- ".tgz"=>"application/x-compressed",
130
- ".clp"=>"application/x-msclip",
131
- ".word"=>"application/msword",
132
- ".rm"=>"audio/x-pn-realaudio",
133
- ".sdp"=>"application/x-sdp",
134
- ".uri"=>"text/uri-list",
135
- ".latex"=>"application/x-latex",
136
- ".mpeg"=>"video/mpeg",
137
- ".ssi"=>"text/x-server-parsed-html",
138
- ".qti"=>"image/x-quicktime",
139
- ".m3u"=>"audio/x-mpegurl",
140
- ".dhh"=>"application/david-heinemeier-hansson",
141
- ".sdr"=>"application/sounder",
142
- ".rp"=>"image/vnd.rn-realpix",
143
- ".ms"=>"application/x-troff-ms",
144
- ".dmg"=>"application/octet-stream",
145
- ".deepv"=>"application/x-deepv",
146
- ".iso"=>"application/octet-stream",
147
- ".eps"=>"application/postscript",
148
- ".jfif-tbnl"=>"image/jpeg",
149
- ".ssm"=>"application/streamingmedia",
150
- ".lzx"=>"application/x-lzx",
151
- ".isp"=>"application/x-internet-signup",
152
- ".wp"=>"application/wordperfect",
153
- ".ins"=>"application/x-internett-signup",
154
- ".art"=>"image/x-jg",
155
- ".mv"=>"video/x-sgi-movie",
156
- ".fli"=>"video/x-fli",
157
- ".sit"=>"application/x-stuffit",
158
- ".rt"=>"text/vnd.rn-realtext",
159
- ".movie"=>"video/x-sgi-movie",
160
- ".hpg"=>"application/vnd.hp-hpgl",
161
- ".htmls"=>"text/html",
162
- ".sprite"=>"application/x-sprite",
163
- ".ram"=>"audio/x-pn-realaudio",
164
- ".pbm"=>"image/x-portable-bitmap",
165
- ".ncm"=>"application/vnd.nokia.configuration-message",
166
- ".bin"=>"application/octet-stream",
167
- ".pm4"=>"application/x-pagemaker",
168
- ".bsh"=>"application/x-bsh",
169
- ".lsf"=>"video/x-la-asf",
170
- ".oda"=>"application/oda",
171
- ".rv"=>"video/vnd.rn-realvideo",
172
- ".pm5"=>"application/x-pagemaker",
173
- ".atom"=>"application/atom+xml",
174
- ".my"=>"audio/make",
175
- ".vsd"=>"application/x-visio",
176
- ".dwg"=>"image/x-dwg",
177
- ".dcr"=>"application/x-director",
178
- ".isu"=>"video/x-isvideo",
179
- ".xyz"=>"chemical/x-pdb",
180
- ".texi"=>"application/x-texinfo",
181
- ".part"=>"application/pro_eng",
182
- ".pgm"=>"image/x-portable-greymap",
183
- ".g3"=>"image/g3fax",
184
- ".ai"=>"application/postscript",
185
- ".flo"=>"image/florian",
186
- ".a"=>"application/octet-stream",
187
- ".xwd"=>"image/x-xwindowdump",
188
- ".vdo"=>"video/vdo",
189
- ".rar"=>"application/x-rar-compressed",
190
- ".sst"=>"application/vnd.ms-pkicertstore",
191
- ".wmlsc"=>"application/vnd.wap.wmlscriptc",
192
- ".web"=>"application/vnd.xara",
193
- ".uris"=>"text/uri-list",
194
- ".ras"=>"image/x-cmu-raster",
195
- ".c"=>"text/plain",
196
- ".cod"=>"image/cis-cod",
197
- ".qd3"=>"x-world/x-3dmf",
198
- ".flr"=>"x-world/x-vrml",
199
- ".xml"=>"text/xml",
200
- ".hpgl"=>"application/vnd.hp-hpgl",
201
- ".dms"=>"application/octet-stream",
202
- ".afl"=>"video/animaflex",
203
- ".rpm"=>"audio/x-pn-realaudio-plugin",
204
- ".mjf"=>"audio/x-vnd.audioexplosion.mjuicemediafile",
205
- ".f"=>"text/x-fortran",
206
- ".java"=>"text/x-java-source",
207
- ".mod"=>"audio/mod",
208
- ".jardiff"=>"application/x-java-archive-diff",
209
- ".g"=>"text/plain",
210
- ".wk1"=>"application/x-123",
211
- ".h"=>"text/plain",
212
- ".lsp"=>"text/x-script.lisp",
213
- ".sbk"=>"application/x-tbook",
214
- ".run"=>"application/x-makeself",
215
- ".mp2"=>"audio/mpeg",
216
- ".flv"=>"video/x-flv",
217
- ".wmlc"=>"application/vnd.wap.wmlc",
218
- ".s3m"=>"audio/s3m",
219
- ".mp3"=>"audio/mpeg",
220
- ".pot,"=>"application/vnd.ms-powerpoint",
221
- ".exe"=>"application/octet-stream",
222
- ".list"=>"text/plain",
223
- ".tex"=>"application/x-tex",
224
- ".flx"=>"text/vnd.fmi.flexstor",
225
- ".text"=>"text/plain",
226
- ".x-png"=>"image/png",
227
- ".viv"=>"video/vnd.vivo",
228
- ".niff"=>"image/x-niff",
229
- ".drw"=>"application/drafting",
230
- ".lst"=>"text/plain",
231
- ".kar"=>"music/x-karaoke",
232
- ".cer"=>"application/x-x509-ca-cert",
233
- ".m"=>"text/x-m",
234
- ".com"=>"text/plain",
235
- ".pl"=>"text/x-script.perl",
236
- ".uue"=>"text/x-uuencode",
237
- ".qcp"=>"audio/vnd.qcelp",
238
- ".au"=>"audio/x-au",
239
- ".plx"=>"application/x-pixclscript",
240
- ".nws"=>"message/rfc822",
241
- ".sgm"=>"text/x-sgml",
242
- ".hdf"=>"application/x-hdf",
243
- ".pm"=>"text/x-script.perl-module",
244
- ".wp5"=>"application/wordperfect",
245
- ".saveme"=>"application/octet-stream",
246
- ".svf"=>"image/x-dwg",
247
- ".wp6"=>"application/wordperfect",
248
- ".vst"=>"application/x-visio",
249
- ".svg"=>"image/svg+xml",
250
- ".o"=>"application/octet-stream",
251
- ".igs"=>"application/iges",
252
- ".pvu"=>"paleovu/x-pv",
253
- ".mhtml"=>"message/rfc822",
254
- ".p"=>"text/x-pascal",
255
- ".m1v"=>"video/mpeg",
256
- ".lsx"=>"video/x-la-asf",
257
- ".xaf"=>"x-world/x-vrml",
258
- ".f77"=>"text/x-fortran",
259
- ".xmz"=>"xgl/movie",
260
- ".vsw"=>"application/x-visio",
261
- ".book"=>"application/book",
262
- ".aps"=>"application/mime",
263
- ".cpio"=>"application/x-cpio",
264
- ".s"=>"text/x-asm",
265
- ".ps"=>"application/postscript",
266
- ".wtk"=>"application/x-wintalk",
267
- ".mjpg"=>"video/x-motion-jpeg",
268
- ".t"=>"application/x-troff",
269
- ".dump"=>"application/octet-stream",
270
- ".jcm"=>"application/x-java-commerce",
271
- ".env"=>"application/x-envoy",
272
- ".cha"=>"application/x-chat",
273
- ".w6w"=>"application/msword",
274
- ".sdml"=>"text/plain",
275
- ".tcl"=>"text/x-script.tcl",
276
- ".rng"=>"application/vnd.nokia.ringing-tone",
277
- ".ivr"=>"i-world/i-vrml",
278
- ".vqe"=>"audio/x-twinvq-plugin",
279
- ".uu"=>"text/x-uuencode",
280
- ".pem"=>"application/x-x509-ca-cert",
281
- ".nap"=>"image/naplps",
282
- ".qd3d"=>"x-world/x-3dmf",
283
- ".shar"=>"application/x-shar",
284
- ".vqf"=>"audio/x-twinvq",
285
- ".mov"=>"video/quicktime",
286
- ".pyc"=>"applicaiton/x-bytecode.python",
287
- ".py"=>"text/x-script.phyton",
288
- ".z"=>"application/x-compressed",
289
- ".wmls"=>"text/vnd.wap.wmlscript",
290
- ".sea"=>"application/x-sea",
291
- ".mcd"=>"application/x-mathcad",
292
- ".unis"=>"text/uri-list",
293
- ".svr"=>"x-world/x-svr",
294
- ".elc"=>"application/x-elc",
295
- ".ief"=>"image/ief",
296
- ".aif"=>"audio/aiff",
297
- ".xhtml"=>"application/xhtml+xml",
298
- ".gzip"=>"application/x-gzip",
299
- ".nc"=>"application/x-netcdf",
300
- ".mcf"=>"text/mcf",
301
- ".step"=>"application/step",
302
- ".xpi"=>"application/x-xpinstall",
303
- ".imap"=>"application/x-httpd-imap",
304
- ".mime"=>"www/mime",
305
- ".ivy"=>"application/x-livescreen",
306
- ".dl"=>"video/dl",
307
- ".for"=>"text/x-fortran",
308
- ".crd"=>"application/x-mscardfile",
309
- ".vql"=>"audio/x-twinvq-plugin",
310
- ".mme"=>"application/base64",
311
- ".jnlp"=>"application/x-java-jnlp-file",
312
- ".xpm"=>"image/xpm",
313
- ".trm"=>"application/x-msterminal",
314
- ".ani"=>"application/x-navi-animation",
315
- ".mrc"=>"application/marc",
316
- ".asf"=>"video/x-ms-asf",
317
- ".cco"=>"application/x-cocoa",
318
- ".zoo"=>"application/octet-stream",
319
- ".vrml"=>"x-world/x-vrml",
320
- ".dp"=>"application/commonground",
321
- ".html"=>"text/html",
322
- ".qtif"=>"image/x-quicktime",
323
- ".sh"=>"text/x-script.sh",
324
- ".wmf"=>"windows/metafile",
325
- ".pot"=>"application/vnd.ms-powerpoint",
326
- ".aip"=>"text/x-audiosoft-intra",
327
- ".wcm"=>"application/vnd.ms-works",
328
- ".ksh"=>"text/x-script.ksh",
329
- ".mcp"=>"application/netmc",
330
- ".ip"=>"application/x-ip2",
331
- ".sgml"=>"text/x-sgml",
332
- ".pov"=>"model/x-pov",
333
- ".rss"=>"text/xml",
334
- ".mml"=>"text/mathml",
335
- ".crl"=>"application/pkix-crl",
336
- ".uni"=>"text/uri-list",
337
- ".uil"=>"text/x-uil",
338
- ".rgb"=>"image/x-rgb",
339
- ".hlb"=>"text/x-script",
340
- ".asm"=>"text/x-asm",
341
- ".sl"=>"application/x-seelogo",
342
- ".rnx"=>"application/vnd.rn-realplayer",
343
- ".dif"=>"video/x-dv",
344
- ".dv"=>"video/x-dv",
345
- ".chat"=>"application/x-chat",
346
- ".inf"=>"application/inf",
347
- ".it"=>"audio/it",
348
- ".pma"=>"application/x-perfmon",
349
- ".xl"=>"application/excel",
350
- ".wri"=>"application/mswrite",
351
- ".wml"=>"text/vnd.wap.wml",
352
- ".sol"=>"application/solids",
353
- ".asp"=>"text/asp",
354
- ".xm"=>"audio/xm",
355
- ".jfif"=>"image/pjpeg",
356
- ".nif"=>"image/x-niff",
357
- ".fmf"=>"video/x-atomic3d-feature",
358
- ".iv"=>"application/x-inventor",
359
- ".pmc"=>"application/x-perfmon",
360
- ".mht"=>"message/rfc822",
361
- ".roff"=>"application/x-troff",
362
- ".stl"=>"application/x-navistyle",
363
- ".talk"=>"text/x-speech",
364
- ".asr"=>"video/x-ms-asf",
365
- ".set"=>"application/set",
366
- ".wrl"=>"application/x-world",
367
- ".jam"=>"audio/x-jam",
368
- ".abc"=>"text/vnd.abc",
369
- ".stm"=>"text/html",
370
- ".jpe"=>"image/jpeg",
371
- ".sv4crc"=>"application/x-sv4crc",
372
- ".voc"=>"audio/x-voc",
373
- ".prc"=>"application/x-pilot",
374
- ".m2a"=>"audio/mpeg",
375
- ".nsc"=>"application/x-conference",
376
- ".help"=>"application/x-helpfile",
377
- ".hgl"=>"application/vnd.hp-hpgl",
378
- ".crt"=>"application/x-x509-ca-cert",
379
- ".xif"=>"image/vnd.xiff",
380
- ".pcl"=>"application/x-pcl",
381
- ".log"=>"text/plain",
382
- ".jpg"=>"image/jpeg",
383
- ".ustar"=>"multipart/x-ustar",
384
- ".cmx"=>"image/x-cmx",
385
- ".pre"=>"application/x-freelance",
386
- ".axs"=>"application/olescript",
387
- ".bz2"=>"application/x-bzip2",
388
- ".mpv2"=>"video/mpeg",
389
- ".moov"=>"video/quicktime",
390
- ".prf"=>"application/pics-rules",
391
- ".dxf"=>"image/x-dwg",
392
- ".stp"=>"application/step",
393
- ".conf"=>"text/plain",
394
- ".asx"=>"video/x-ms-asf",
395
- ".la"=>"audio/x-nspaudio",
396
- ".jar"=>"application/java-archive",
397
- ".wmv"=>"video/x-ms-wmv",
398
- ".unv"=>"application/i-deas",
399
- ".boo"=>"application/book",
400
- ".ima"=>"application/x-ima",
401
- ".dir"=>"application/x-director",
402
- ".frl"=>"application/freeloader",
403
- ".wb1"=>"application/x-qpro",
404
- ".hlp"=>"application/hlp",
405
- ".tar"=>"application/x-tar",
406
- ".scd"=>"application/x-msschedule",
407
- ".pml"=>"application/x-perfmon",
408
- ".evy"=>"application/x-envoy",
409
- ".gif"=>"image/gif",
410
- ".jav"=>"text/x-java-source",
411
- ".pct"=>"image/x-pict",
412
- ".mpa"=>"audio/mpeg",
413
- ".xdr"=>"video/x-amt-demorun",
414
- ".bm"=>"image/bmp",
415
- ".mpc"=>"application/x-project",
416
- ".qif"=>"image/x-quicktime",
417
- ".gl"=>"video/x-gl",
418
- ".img"=>"application/octet-stream",
419
- ".gsd"=>"audio/x-gsm",
420
- ".xsl"=>"application/xslt+xml",
421
- ".pcx"=>"image/x-pcx",
422
- ".pmr"=>"application/x-perfmon",
423
- ".jps"=>"image/x-jps",
424
- ".mpe"=>"video/mpeg",
425
- ".src"=>"application/x-wais-source",
426
- ".man"=>"application/x-troff-man",
427
- ".wpd"=>"application/wordperfect",
428
- ".vew"=>"application/groupwise",
429
- ".dxr"=>"application/x-director",
430
- ".mpg"=>"video/mpeg",
431
- ".ico"=>"image/x-icon",
432
- ".wq1"=>"application/x-lotus",
433
- ".scm"=>"video/x-scm",
434
- ".map"=>"application/x-navimap",
435
- ".nix"=>"application/x-mix-transfer",
436
- ".vos"=>"video/vosaic",
437
- ".boz"=>"application/x-bzip2",
438
- ".jut"=>"image/jutvision",
439
- ".cat"=>"application/octet-stream",
440
- ".lha"=>"application/x-lha",
441
- ".p7a"=>"application/x-pkcs7-signature",
442
- ".avi"=>"video/avi",
443
- ".prt"=>"application/pro_eng",
444
- ".pmw"=>"application/x-perfmon",
445
- ".smi"=>"application/smil",
446
- ".p7b"=>"application/x-pkcs7-certificates",
447
- ".mar"=>"text/plain",
448
- ".xsr"=>"video/x-amt-showrun",
449
- ".tiff"=>"image/tiff",
450
- ".hqx"=>"application/binhex",
451
- ".p7c"=>"application/x-pkcs7-mime",
452
- ".lma"=>"audio/x-nspaudio",
453
- ".swf"=>"application/x-shockwave-flash",
454
- ".war"=>"application/java-archive",
455
- ".vcd"=>"application/x-cdlink",
456
- ".cpp"=>"text/x-c",
457
- ".gsm"=>"audio/x-gsm",
458
- ".vox"=>"audio/voxware",
459
- ".m2v"=>"video/mpeg",
460
- ".ltx"=>"application/x-latex",
461
- ".xla"=>"application/excel",
462
- ".vcf"=>"text/x-vcard",
463
- ".sct"=>"text/scriptlet",
464
- ".ppa"=>"application/vnd.ms-powerpoint",
465
- ".aifc"=>"audio/aiff",
466
- ".hta"=>"application/hta",
467
- ".bz"=>"application/x-bzip",
468
- ".omcd"=>"application/x-omcdatamaker",
469
- ".mpp"=>"application/vnd.ms-project",
470
- ".pict"=>"image/pict",
471
- ".gsp"=>"application/x-gsp",
472
- ".xlb"=>"application/excel",
473
- ".wav"=>"audio/x-wav",
474
- ".eot"=>"application/octet-stream",
475
- ".cpt"=>"application/x-cpt",
476
- ".naplps"=>"image/naplps",
477
- ".htc"=>"text/x-component",
478
- ".xlc"=>"application/excel",
479
- ".vmd"=>"application/vocaltec-media-desc",
480
- ".tif"=>"image/tiff",
481
- ".pkg"=>"application/x-newton-compatible-pkg",
482
- ".jng"=>"image/x-jng",
483
- ".qt"=>"video/quicktime",
484
- ".tcsh"=>"text/x-script.tcsh",
485
- ".aiff"=>"audio/aiff",
486
- ".xld"=>"application/excel",
487
- ".pub"=>"application/x-mspublisher",
488
- ".pwz"=>"application/vnd.ms-powerpoint",
489
- ".gss"=>"application/x-gss",
490
- ".avs"=>"video/avs-video",
491
- ".gz"=>"application/x-compressed",
492
- ".wks"=>"application/vnd.ms-works",
493
- ".uls"=>"text/iuls",
494
- ".dll"=>"application/octet-stream",
495
- ".vmf"=>"application/vocaltec-media-file",
496
- ".mdb"=>"application/x-msaccess",
497
- ".nvd"=>"application/x-navidoc",
498
- ".mpt"=>"application/x-project",
499
- ".p7m"=>"application/x-pkcs7-mime",
500
- ".xbm"=>"image/xbm",
501
- ".cdf"=>"application/cdf",
502
- ".wps"=>"application/vnd.ms-works",
503
- ".rtf"=>"text/richtext",
504
- ".mpv"=>"application/x-project",
505
- ".m13"=>"application/x-msmediaview",
506
- ".dvi"=>"application/x-dvi",
507
- ".shtml"=>"text/x-server-parsed-html",
508
- ".vivo"=>"video/vnd.vivo",
509
- ".setreg"=>"application/set-registration-initiation",
510
- ".etx"=>"text/x-setext",
511
- ".bmp"=>"image/bmp",
512
- ".m14"=>"application/x-msmediaview",
513
- ".wdb"=>"application/vnd.ms-works",
514
- ".mpx"=>"application/x-project",
515
- ".midi"=>"audio/x-midi",
516
- ".pas"=>"text/pascal",
517
- ".xlk"=>"application/excel",
518
- ".w60"=>"application/wordperfect6.0",
519
- ".tsi"=>"audio/tsp-audio",
520
- ".mid"=>"audio/x-midi",
521
- ".p7r"=>"application/x-pkcs7-certreqresp",
522
- ".xll"=>"application/excel",
523
- ".w61"=>"application/wordperfect6.1",
524
- ".ppm"=>"image/x-portable-pixmap",
525
- ".p7s"=>"application/x-pkcs7-signature",
526
- ".htm"=>"text/html",
527
- ".pko"=>"application/ynd.ms-pkipko",
528
- ".xlm"=>"application/excel",
529
- ".vcs"=>"text/x-vcalendar",
530
- ".omc"=>"application/x-omc",
531
- ".mif"=>"application/x-mif"
532
- }
533
-
534
-
535
- end
536
-