mime-types-mini 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,13 +1,14 @@
1
-
2
- extern const struct MimeType MIME_TYPES[] = {
3
- <?r mime_types.each do |mime_type|
4
- content_type, encoding, extensions, registered = mime_type.values_at('content-type', 'encoding', 'extensions', 'registered')
5
- ?>
6
- {
7
- .content_type = #{content_type.inspect},
8
- .encoding = #{encoding.inspect},
9
- .extensions = #{extensions_struct(extensions)},
10
- .registered = #{registered == true ? 1 : 0},
11
- },
12
- <?r end ?>
1
+ %language=ANSI-C
2
+ %define slot-name content_type
3
+ %define hash-function-name mime_type_hash
4
+ %define lookup-function-name lookup_mime_type_by_content_type
5
+ %enum
6
+ %switch=4
7
+ struct MimeType {
8
+ const char * content_type;
9
+ const char * encoding;
10
+ const char * extensions;
13
11
  };
12
+ %%<?r mime_types.each do |mime_type|
13
+ content_type, encoding, extensions = mime_type.values_at('content-type', 'encoding', 'extensions') ?>
14
+ #{content_type}, #{encoding.inspect}, #{extensions_struct(extensions)}<?r end ?>
@@ -2,16 +2,17 @@
2
2
  #include "ruby.h"
3
3
 
4
4
  #include "Extensions.h"
5
+ #include "MimeTypes.h"
5
6
 
6
7
  VALUE MimeTypesMiniDatabase = Qnil;
7
8
 
8
9
  void Init_MimeTypesMiniDatabase();
9
10
 
10
11
  static VALUE method_content_type_for_extension(VALUE self, VALUE extension) {
11
- int len = RSTRING_LEN(extension);
12
+ long len = RSTRING_LEN(extension);
12
13
  char* str = RSTRING_PTR(extension);
13
14
 
14
- const struct ContentTypeExtension * result = lookup_content_type_by_extension(str, len);
15
+ const struct ContentTypeExtension * result = lookup_content_type_by_extension(str, (unsigned)len);
15
16
 
16
17
  if (result) {
17
18
  return rb_str_new_cstr(result->content_type);
@@ -20,12 +21,63 @@ static VALUE method_content_type_for_extension(VALUE self, VALUE extension) {
20
21
  }
21
22
  }
22
23
 
24
+ VALUE MimeType = Qnil;
25
+
26
+ static VALUE method_mime_type_for_content_type(VALUE self, VALUE content_type) {
27
+ long len = RSTRING_LEN(content_type);
28
+ char* str = RSTRING_PTR(content_type);
29
+
30
+ const struct MimeType * result = lookup_mime_type_by_content_type(str, (unsigned)len);
31
+
32
+ if (result) {
33
+ VALUE args[3] = {
34
+ rb_str_new_cstr(result->content_type),
35
+ rb_str_new_cstr(result->encoding),
36
+ Qnil,
37
+ };
38
+
39
+ if (result->extensions) {
40
+ args[2] = rb_str_split(
41
+ rb_str_new_cstr(result->extensions),
42
+ " "
43
+ );
44
+ }
45
+
46
+ return rb_class_new_instance(3, args, MimeType);
47
+ } else {
48
+ return Qnil;
49
+ }
50
+ }
51
+
52
+ static ID id_content_type, id_encoding, id_extensions;
53
+
54
+ static VALUE MimeType_initialize(VALUE self, VALUE content_type, VALUE encoding, VALUE extensions) {
55
+ rb_ivar_set(self, id_content_type, content_type);
56
+ rb_ivar_set(self, id_encoding, encoding);
57
+ rb_ivar_set(self, id_extensions, extensions);
58
+
59
+ return self;
60
+ }
61
+
23
62
  void Init_MimeTypesMiniDatabase() {
63
+ id_content_type = rb_intern("@content_type");
64
+ id_encoding = rb_intern("@encoding");
65
+ id_extensions = rb_intern("@extensions");
66
+
24
67
  VALUE Mime = rb_define_module("Mime");
68
+
69
+ MimeType = rb_define_class_under(Mime, "Type", rb_cObject);
70
+ rb_define_attr(MimeType, "content_type", 1, 0);
71
+ rb_define_attr(MimeType, "encoding", 1, 0);
72
+ rb_define_attr(MimeType, "extensions", 1, 0);
73
+ rb_define_method(MimeType, "initialize", MimeType_initialize, 3);
74
+
25
75
  VALUE MimeTypes = rb_define_module_under(Mime, "Types");
76
+
26
77
  VALUE MimeTypesMini = rb_define_module_under(MimeTypes, "Mini");
27
78
 
28
79
  MimeTypesMiniDatabase = rb_define_module_under(MimeTypesMini, "Database");
29
80
 
30
81
  rb_define_module_function(MimeTypesMiniDatabase, "content_type_for_extension", method_content_type_for_extension, 1);
82
+ rb_define_module_function(MimeTypesMiniDatabase, "mime_type_for_content_type", method_mime_type_for_content_type, 1);
31
83
  }
@@ -4,18 +4,6 @@ require 'trenni'
4
4
  require 'json'
5
5
  require 'ostruct'
6
6
 
7
- class TemplateState < Struct.new(:mime_types)
8
- NULL = 'NULL'
9
-
10
- def extensions_struct(extensions)
11
- if extensions
12
- '(const char*[]){' + (extensions.collect(&:inspect) + [0]).join(', ') + '}'
13
- else
14
- 0
15
- end
16
- end
17
- end
18
-
19
7
  task :load_mime_types do
20
8
  mime_types_json_path = File.join(MIME::Types::Data::PATH, "mime-types.json")
21
9
  @mime_types = JSON::load(File.open mime_types_json_path)
@@ -45,17 +33,28 @@ task :generate_extensions => :generate_extensions_hashtable do
45
33
  sh 'gperf', '-CD', '-t', 'Extensions.gperf', '--output-file', 'Extensions.h'
46
34
  end
47
35
 
48
- task :generate_code do
49
- mime_types_json_path = File.join(MIME::Types::Data::PATH, "mime-types.json")
50
- mime_types = JSON::load(File.open mime_types_json_path)
51
-
36
+ class TemplateState < Struct.new(:mime_types)
37
+ def extensions_struct(extensions)
38
+ if extensions
39
+ extensions.join(' ').inspect
40
+ else
41
+ 0
42
+ end
43
+ end
44
+ end
45
+
46
+ task :generate_mime_types_hashtable => :load_mime_types do
52
47
  template_path = File.expand_path("MimeTypes.trenni", __dir__)
53
48
  template = Trenni::Template.load_file(template_path)
54
49
 
55
- template_state = TemplateState.new(mime_types)
50
+ template_state = TemplateState.new(@mime_types)
56
51
  result = template.to_string(template_state)
57
52
 
58
- File.write("MimeTypes.c", result)
53
+ File.write("MimeTypes.gperf", result)
54
+ end
55
+
56
+ task :generate_mime_types => :generate_mime_types_hashtable do
57
+ sh 'gperf', '-C', '-t', 'MimeTypes.gperf', '--output-file', 'MimeTypes.h'
59
58
  end
60
59
 
61
- task :default => :generate_code
60
+ task :default => [:generate_extensions, :generate_mime_types]
@@ -0,0 +1,18 @@
1
+
2
+ module MIME
3
+ module Types
4
+ def self.type_for(filename)
5
+ # Return mime types
6
+ end
7
+
8
+ def self.[](content_type)
9
+ # Return mime types
10
+ end
11
+
12
+ def self.content_type_for(extension)
13
+ end
14
+
15
+ def self.extensions_for(content_type)
16
+ end
17
+ end
18
+ end
@@ -21,7 +21,7 @@
21
21
  module Mime
22
22
  module Types
23
23
  module Mini
24
- VERSION = "0.1.0"
24
+ VERSION = "0.2.0"
25
25
  end
26
26
  end
27
27
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mime-types-mini
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
@@ -62,13 +62,17 @@ extra_rdoc_files: []
62
62
  files:
63
63
  - Gemfile
64
64
  - Rakefile
65
+ - benchmark/content_type_lookup.rb
65
66
  - ext/MimeTypeMiniDatabase/Extensions.gperf
66
67
  - ext/MimeTypeMiniDatabase/Extensions.h
67
68
  - ext/MimeTypeMiniDatabase/Extensions.trenni
69
+ - ext/MimeTypeMiniDatabase/MimeTypes.gperf
70
+ - ext/MimeTypeMiniDatabase/MimeTypes.h
68
71
  - ext/MimeTypeMiniDatabase/MimeTypes.trenni
69
72
  - ext/MimeTypeMiniDatabase/MimeTypesMiniDatabase.c
70
73
  - ext/MimeTypeMiniDatabase/Rakefile
71
74
  - ext/MimeTypeMiniDatabase/extconf.rb
75
+ - lib/mime/types.rb
72
76
  - lib/mime/types/mini.rb
73
77
  - lib/mime/types/mini/version.rb
74
78
  - mime-types-mini.gemspec